/*++ Copyright (c) 2000 Microsoft Corporation Module Name: FaxDeviceProviders.h Abstract: Declaration of the CFaxDeviceProviders Class. Author: Iv Garber (IvG) Jun, 2000 Revision History: --*/ #ifndef __FAXDEVICEPROVIDERS_H_ #define __FAXDEVICEPROVIDERS_H_ #include "resource.h" // main symbols #include "FaxCommon.h" #include #include "VCUE_Copy.h" #include "FaxDeviceProvider.h" namespace DeviceProvidersNamespace { // // Device Provider Objects are stored in Vector of STL. // When initialized, they got ALL their data. // They never call Fax Server. // They do not depend neither on Fax Server nor on Device Providers Collection // after they are created and initialized. // So, they implemented as usual COM Objects. // The Collection stores Ptrs to them, and makes ONE AddRef(). // Each time User asks for an Object from the Collection, an additional AddRef() happens. // When killed, Collection calls Release() on all its Device Provider Objects. // Those that are not asked by User, dies. // Those, that have User's AddRef() - remains alive, untill User free its Reference on them. // The Device Provider Object can continue to live after all objects are freed, // including Fax Server and all its Descendants. // THIS IS BECAUSE Device Provider Object and their Collection is Snap-Shot // of the situation on the Server. They are not updatable, but a read-only objects. // To get the updated data, User must ask new Collection from the Server. // typedef std::vector ContainerType; // Use IEnumVARIANT as the enumerator for VB compatibility typedef VARIANT EnumExposedType; typedef IEnumVARIANT EnumIfc; // Copy Classes typedef VCUE::CopyIfc2Variant EnumCopyType; typedef VCUE::CopyIfc CollectionCopyType; // Enumeration Type, shortcut for next typedef typedef CComEnumOnSTL< EnumIfc, &__uuidof(EnumIfc), EnumExposedType, EnumCopyType, ContainerType > EnumType; // Collection Type, real ancestor of the DeviceProvider Collection typedef ICollectionOnSTLImpl< IFaxDeviceProviders, ContainerType, ContainerType::value_type, CollectionCopyType, EnumType > CollectionType; }; using namespace DeviceProvidersNamespace; // //==================== FAX DEVICE PROVIDERS =========================================== // class ATL_NO_VTABLE CFaxDeviceProviders : public CComObjectRootEx, public ISupportErrorInfo, public IDispatchImpl, public CFaxInitInner { public: CFaxDeviceProviders() : CFaxInitInner(_T("FAX DEVICE PROVIDERS")) {} ~CFaxDeviceProviders() { CCollectionKiller CKiller; CKiller.EmptyObjectCollection(&m_coll); } DECLARE_REGISTRY_RESOURCEID(IDR_FAXDEVICEPROVIDERS) DECLARE_NOT_AGGREGATABLE(CFaxDeviceProviders) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CFaxDeviceProviders) COM_INTERFACE_ENTRY(IFaxDeviceProviders) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY(IFaxInitInner) END_COM_MAP() // Interfaces STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); STDMETHOD(get_Item)(/*[in]*/ VARIANT vIndex, /*[out, retval]*/ IFaxDeviceProvider **ppDeviceProvider); // Internal Use STDMETHOD(Init)(IFaxServerInner *pServerInner); static HRESULT Create(IFaxDeviceProviders **ppDeviceProviders); }; #endif //__FAXDEVICEPROVIDERS_H_