/* * classes.cxx */ #include "server.hxx" #include "classes.hxx" // // MyObject implementation. // MyObject::MyObject( int ActType ) : Refs(0), ActivationType(ActType), PersistFileObj(this), PersistStorageObj(this), GooberObj(this) { } MyObject::~MyObject() { } // // MyObject IUnknown. // HRESULT STDMETHODCALLTYPE MyObject::QueryInterface ( REFIID iid, void ** ppv ) { HRESULT hr = E_NOINTERFACE; *ppv = 0; if ( memcmp(&iid, &IID_IUnknown, sizeof(IID)) == 0 ) *ppv = this; else if ( (memcmp(&iid, &IID_IPersist, sizeof(IID)) == 0) || (memcmp(&iid, &IID_IPersistFile, sizeof(IID)) == 0) ) *ppv = &PersistFileObj; else if ( memcmp(&iid, &IID_IPersistStorage, sizeof(IID)) == 0 ) *ppv = &PersistStorageObj; else if ( memcmp(&iid, &IID_IGoober, sizeof(IID)) == 0 ) *ppv = &GooberObj; else return E_NOINTERFACE; ((IUnknown *)(*ppv))->AddRef(); return S_OK; } ULONG STDMETHODCALLTYPE MyObject::AddRef() { Refs++; return Refs; } ULONG STDMETHODCALLTYPE MyObject::Release() { unsigned long Count; Count = --Refs; if ( Count == 0 ) { delete this; // Decrement the object count. if ( --ObjectCount == 0 ) ShutDown(); } return Count; } // // PersistFile implementation. // PersistFile::PersistFile( MyObject * pObj ) : pObject(pObj) { } // // PersistFile IUnknown. // IUnknownMETHODS( PersistFile ) // // PersistFile IPersist. // HRESULT STDMETHODCALLTYPE PersistFile::GetClassID( CLSID * pClassID ) { if ( pObject->GetActivationType() == LOCAL ) memcpy( pClassID, &CLSID_ActLocal, sizeof(IID) ); else if ( pObject->GetActivationType() == REMOTE ) memcpy( pClassID, &CLSID_ActRemote, sizeof(IID) ); else if (pObject->GetActivationType() == ATBITS ) memcpy( pClassID, &CLSID_ActAtStorage, sizeof(IID) ); else if (pObject->GetActivationType() == INPROC ) memcpy( pClassID, &CLSID_ActInproc, sizeof(IID) ); return S_OK; } // // PersistFile IPersistFile // HRESULT STDMETHODCALLTYPE PersistFile::IsDirty() { return S_FALSE; } HRESULT STDMETHODCALLTYPE PersistFile::Load( LPCOLESTR pszFileName, DWORD dwMode ) { /** Doesn't work until we have security stuff... HANDLE hFile; // // Verify that we can open the file. // hFile = CreateFile( pszFileName, dwMode, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ( hFile == INVALID_HANDLE_VALUE ) return HRESULT_FROM_WIN32( GetLastError() ); CloseHandle( hFile ); **/ return S_OK; } HRESULT STDMETHODCALLTYPE PersistFile::Save( LPCOLESTR pszFileName, BOOL fRemember ) { return S_OK; } HRESULT STDMETHODCALLTYPE PersistFile::SaveCompleted( LPCOLESTR pszFileName ) { return S_OK; } HRESULT STDMETHODCALLTYPE PersistFile::GetCurFile( LPOLESTR * ppszFileName ) { *ppszFileName = 0; return S_OK; } // // PersistStorage implementation. // PersistStorage::PersistStorage( MyObject * pObj ) : pObject(pObj) { } // // PersistStorage IUnknown. // IUnknownMETHODS( PersistStorage ) // // PersistStorage IPersist. // HRESULT STDMETHODCALLTYPE PersistStorage::GetClassID( CLSID * pClassID ) { if ( pObject->GetActivationType() == LOCAL ) memcpy( pClassID, &CLSID_ActLocal, sizeof(IID) ); else if ( pObject->GetActivationType() == REMOTE ) memcpy( pClassID, &CLSID_ActRemote, sizeof(IID) ); else if (pObject->GetActivationType() == ATBITS ) memcpy( pClassID, &CLSID_ActAtStorage, sizeof(IID) ); else if (pObject->GetActivationType() == INPROC ) memcpy( pClassID, &CLSID_ActInproc, sizeof(IID) ); return S_OK; } // // PersistStorage IPersistStorage // HRESULT STDMETHODCALLTYPE PersistStorage::IsDirty() { return S_FALSE; } HRESULT STDMETHODCALLTYPE PersistStorage::InitNew( IStorage * pStg ) { return S_OK; } HRESULT STDMETHODCALLTYPE PersistStorage::Load( IStorage * pStg ) { return S_OK; } HRESULT STDMETHODCALLTYPE PersistStorage::Save( IStorage * pStgSave, BOOL fSameAsLoad ) { return S_OK; } HRESULT STDMETHODCALLTYPE PersistStorage::SaveCompleted( IStorage * pStgNew ) { return S_OK; } HRESULT STDMETHODCALLTYPE PersistStorage::HandsOffStorage() { return S_OK; } // // Goober implementation // Goober::Goober( MyObject * pObj ) : pObject(pObj) { } // // Goober IUnknown. // IUnknownMETHODS( Goober ) // // Goober IGoober. // HRESULT STDMETHODCALLTYPE Goober::Ping() { return S_OK; }