//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1994 // // File: classf.cxx // // Contents: Class factory for standard Filter Object class // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- #include #pragma hdrstop #include "docname.hxx" #include "classf.hxx" #include "filterob.hxx" #include #include // // We keep count of the number of filter objects that we've created // to let OLE know when this DLL is finally free. // extern long gulcInstances; // {aa205a4d-681F-11d0-A243-08002B36FCA4} extern "C" const GUID guidStorageFilterObject = { 0xaa205a4d, 0x681f, 0x11d0, { 0xa2, 0x43, 0x8, 0x0, 0x2b, 0x36, 0xfc, 0xa4 } }; extern "C" const GUID guidStorageDocStoreLocatorObject = CLSID_StorageDocStoreLocator; //+--------------------------------------------------------------------------- // // Construction and destruction // //---------------------------------------------------------------------------- //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::CStorageFilterObjectCF // // Synopsis: Storage Filter Object class factory constructor // // History: 6-Jan-1997 MarkZ Created // //+------------------------------------------------------------------------- CStorageFilterObjectCF::CStorageFilterObjectCF() : _RefCount( 1 ) { InterlockedIncrement( &gulcInstances ); } //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::~CStorageFilterObjectCF // // Synopsis: Storage Filter Object class factory destructor // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- CStorageFilterObjectCF::~CStorageFilterObjectCF() { Win4Assert( _RefCount == 0); Win4Assert( gulcInstances != 0 ); InterlockedDecrement( &gulcInstances ); } //+--------------------------------------------------------------------------- // // IUnknown method implementations // //---------------------------------------------------------------------------- //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::AddRef // // Synopsis: Increments refcount // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CStorageFilterObjectCF::AddRef() { return InterlockedIncrement( &_RefCount ); } //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::Release // // Synopsis: Decrement refcount. Delete if necessary. // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CStorageFilterObjectCF::Release() { Win4Assert( _RefCount != 0 ); LONG RefCount = InterlockedDecrement( &_RefCount ); if ( RefCount <= 0 ) delete this; return (ULONG) RefCount; } // Release //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::QueryInterface // // Synopsis: Rebind to other interface // // Arguments: [riid] -- IID of new interface // [ppvObject] -- New interface * returned here // // Returns: S_OK if bind succeeded, E_NOINTERFACE if bind failed // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- STDMETHODIMP CStorageFilterObjectCF::QueryInterface( REFIID riid, PVOID* ppvObject ) { Win4Assert( 0 != ppvObject ); if ( IID_IClassFactory == riid) *ppvObject = (PVOID) ((IClassFactory *) this ); else if ( IID_IUnknown == riid ) *ppvObject = (PVOID) ((IUnknown *) this ); else { *ppvObject = 0; return E_NOINTERFACE; } AddRef(); return S_OK; } //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::CreateInstance // // Synopsis: Create new CStorageFilterObject instance // // Arguments: [pUnkOuter] -- 'Outer' IUnknown; IGNORED // [riid] -- Interface to bind // [ppvObject] -- Interface returned here // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- STDMETHODIMP CStorageFilterObjectCF::CreateInstance( IUnknown * pUnkOuter, REFIID riid, PVOID * ppvObject ) { CStorageFilterObject * pFilterObject = 0; SCODE sc = S_OK; TRANSLATE_EXCEPTIONS; TRY { // // Create the new object // pFilterObject = new CStorageFilterObject; // // Obtain the new interface // sc = pFilterObject->QueryInterface( riid , ppvObject ); // // Regardless of whether the QueryInterface succeeded, we // release the object. // pFilterObject->Release(); } CATCH(CException, e) { Win4Assert( 0 == pFilterObject ); switch( e.GetErrorCode() ) { case E_OUTOFMEMORY: sc = (E_OUTOFMEMORY); break; default: sc = (E_UNEXPECTED); } } END_CATCH; UNTRANSLATE_EXCEPTIONS; return (sc); } //+------------------------------------------------------------------------- // // Method: CStorageFilterObjectCF::LockServer // // Synopsis: Force class factory to remain loaded // // Arguments: [fLock] -- TRUE if locking, FALSE if unlocking // // Returns: S_OK // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- STDMETHODIMP CStorageFilterObjectCF::LockServer( BOOL fLock ) { if (fLock) InterlockedIncrement( &gulcInstances ); else InterlockedDecrement( &gulcInstances ); return(S_OK); } // // ======================== DocStoreLocator Class Factory ================== // //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::CStorageDocStoreLocatorObjectCF // // Synopsis: Storage Filter Object class factory constructor // // History: 6-Jan-1997 MarkZ Created // //+------------------------------------------------------------------------- CStorageDocStoreLocatorObjectCF::CStorageDocStoreLocatorObjectCF() : _RefCount( 1 ) { InterlockedIncrement( &gulcInstances ); } //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::~CStorageDocStoreLocatorObjectCF // // Synopsis: Storage Filter Object class factory destructor // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- CStorageDocStoreLocatorObjectCF::~CStorageDocStoreLocatorObjectCF() { Win4Assert( _RefCount == 0); Win4Assert( gulcInstances != 0 ); InterlockedDecrement( &gulcInstances ); } //+--------------------------------------------------------------------------- // // IUnknown method implementations // //---------------------------------------------------------------------------- //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::AddRef // // Synopsis: Increments refcount // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CStorageDocStoreLocatorObjectCF::AddRef() { return InterlockedIncrement( &_RefCount ); } //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::Release // // Synopsis: Decrement refcount. Delete if necessary. // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CStorageDocStoreLocatorObjectCF::Release() { Win4Assert( _RefCount != 0 ); LONG RefCount = InterlockedDecrement( &_RefCount ); if ( RefCount <= 0 ) delete this; return (ULONG) RefCount; } // Release //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::QueryInterface // // Synopsis: Rebind to other interface // // Arguments: [riid] -- IID of new interface // [ppvObject] -- New interface * returned here // // Returns: S_OK if bind succeeded, E_NOINTERFACE if bind failed // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- STDMETHODIMP CStorageDocStoreLocatorObjectCF::QueryInterface( REFIID riid, PVOID* ppvObject ) { Win4Assert( 0 != ppvObject ); if ( IID_IClassFactory == riid) *ppvObject = (PVOID) ((IClassFactory *) this ); else if ( IID_IUnknown == riid ) *ppvObject = (PVOID) ((IUnknown *) this ); else { *ppvObject = 0; return E_NOINTERFACE; } AddRef(); return S_OK; } //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::CreateInstance // // Synopsis: Create new CStorageFilterObject instance // // Arguments: [pUnkOuter] -- 'Outer' IUnknown; IGNORED // [riid] -- Interface to bind // [ppvObject] -- Interface returned here // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- STDMETHODIMP CStorageDocStoreLocatorObjectCF::CreateInstance( IUnknown * pUnkOuter, REFIID riid, PVOID * ppvObject ) { CClientDocStoreLocator * pObject = 0; SCODE sc = S_OK; TRANSLATE_EXCEPTIONS; TRY { // // Create the new object // pObject = new CClientDocStoreLocator; // // Obtain the new interface // sc = pObject->QueryInterface( riid , ppvObject ); // // Regardless of whether the QueryInterface succeeded, we // release the object. // pObject->Release(); } CATCH(CException, e) { Win4Assert( 0 == pObject ); switch( e.GetErrorCode() ) { case E_OUTOFMEMORY: sc = (E_OUTOFMEMORY); break; default: sc = (E_UNEXPECTED); } } END_CATCH; UNTRANSLATE_EXCEPTIONS; return (sc); } //+------------------------------------------------------------------------- // // Method: CStorageDocStoreLocatorObjectCF::LockServer // // Synopsis: Force class factory to remain loaded // // Arguments: [fLock] -- TRUE if locking, FALSE if unlocking // // Returns: S_OK // // History: 6-Jan-1997 MarkZ Created // //-------------------------------------------------------------------------- STDMETHODIMP CStorageDocStoreLocatorObjectCF::LockServer( BOOL fLock ) { if (fLock) InterlockedIncrement( &gulcInstances ); else InterlockedDecrement( &gulcInstances ); return(S_OK); }