/*++ © 1998 Seagate Software, Inc. All rights reserved. Module Name: hsmcln.cpp Abstract: This component is an provides helper functions to access to the collections maintained by the HSM engine. Author: Cat Brant [cbrant] 09-Jan-1997 Revision History: --*/ #include "stdafx.h" #include "wsb.h" #include "HsmEng.h" #include "HsmServ.h" #include "HsmConn.h" #include "job.h" #include "metalib.h" #define WSB_TRACE_IS WSB_TRACE_BIT_HSMENG // Local functions static HRESULT LoadCollection(IStream* pStream, IWsbIndexedCollection* pIWC); static HRESULT StoreCollection(IStream* pStream, IWsbIndexedCollection* pIWC); HRESULT CHsmServer::LoadJobs( IStream* pStream ) /*++ Routine Description: Loads the persistent data for Jobs Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::LoadJobs"),OLESTR("")); try { WsbAffirmHr(LoadCollection(pStream, m_pJobs)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadJobs"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreJobs( IStream* pStream ) /*++ Routine Description: Saves the persistent data for Jobs. Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::StoreJobs"),OLESTR("")); // // Make sure we have a valid collection pointer // try { WsbAffirmHr(StoreCollection(pStream, m_pJobs)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreJobs"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::LoadJobDefs( IStream* pStream ) /*++ Routine Description: Loads the persistent data for Job Definitions Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::LoadJobDefs"),OLESTR("")); try { WsbAffirmHr(LoadCollection(pStream, m_pJobDefs)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadJobDefs"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreJobDefs( IStream* pStream ) /*++ Routine Description: Saves the persistent data for Job Definitons Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::StoreJobDefs"),OLESTR("")); // try { WsbAffirmHr(StoreCollection(pStream, m_pJobDefs)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreJobDefs"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::LoadPolicies( IStream* pStream ) /*++ Routine Description: Loads the persistent data for policies Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::LoadPolicies"),OLESTR("")); try { WsbAffirmHr(LoadCollection(pStream, m_pPolicies)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadPolicies"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StorePolicies( IStream* pStream ) /*++ Routine Description: Saves the persistent data for policies. Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::StorePolicies"),OLESTR("")); // // Make sure we have a valid collection pointer // try { WsbAffirmHr(StoreCollection(pStream, m_pPolicies)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StorePolicies"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::LoadManagedResources( IStream* pStream ) /*++ Routine Description: Loads the persistent data for managed resources Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::LoadManagedResources"),OLESTR("")); try { WsbAffirmHr(LoadCollection(pStream, m_pManagedResources)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadManagedResources"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreManagedResources( IStream* pStream ) /*++ Routine Description: Saves the persistent data for managed resources. Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::StoreManagedResources"),OLESTR("")); // // Make sure we have a valid collection pointer // try { WsbAffirmHr(StoreCollection(pStream, m_pManagedResources)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreManagedResources"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::LoadStoragePools( IStream* pStream ) /*++ Routine Description: Loads the persistent data for storage pools Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::LoadStoragePools"),OLESTR("")); try { WsbAffirmHr(LoadCollection(pStream, m_pStoragePools)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadStoragePools"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreStoragePools( IStream* pStream ) /*++ Routine Description: Saves the persistent data for managed resources. Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::StoreStoragePools"),OLESTR("")); // // Make sure we have a valid collection pointer // try { WsbAffirmHr(StoreCollection(pStream, m_pStoragePools)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreStoragePools"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::LoadSegmentInformation( void ) /*++ Routine Description: Loads the persistent data for the segment information Arguments: None Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; CWsbStringPtr tmpString; WsbTraceIn(OLESTR("CHsmServer::LoadSegmentInformation"),OLESTR("")); try { BOOL CreateFlag = FALSE; CComPtr l_pSegmentDatabase; // Determine if we should try to create the DB or just open it. // If the persistence file was just created we're probably starting // for the first time so creating the DB is correct. Also, if // the media count is still zero, then even if there was an old // DB that got deleted, it probably didn't have any useful information // in it anyway so creating a new one is OK. if (m_persistWasCreated || 0 == m_mediaCount) { CreateFlag = TRUE; } // Initialize the Engine database // WsbAffirmHr(CoCreateInstance( CLSID_CSegDb, 0, CLSCTX_SERVER, IID_ISegDb, (void **)&l_pSegmentDatabase )); WsbAffirmHr(GetIDbPath(&tmpString, 0)); WsbAffirmHr(l_pSegmentDatabase->Initialize(tmpString, m_pDbSys, &CreateFlag)); WsbAffirmHr(l_pSegmentDatabase->QueryInterface(IID_IWsbDb, (void**) &m_pSegmentDatabase)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadSegmentInformation"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreSegmentInformation( void ) /*++ Routine Description: Saves the persistent data for the segment information. Arguments: None Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; // CWsbStringPtr tmpString; WsbTraceIn(OLESTR("CHsmServer::StoreSegmentInformation"),OLESTR("")); // // Make sure we have a valid collection pointer // try { WsbAssert(m_pSegmentDatabase != 0, E_POINTER); // This should not be necessary for a real DB // WsbAffirmHr(m_pSegmentDatabase->Close()); // WsbAffirmHr(m_pSegmentDatabase->Open()); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreSegmentInformation"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreSegmentInformationFinal( void ) /*++ Routine Description: Saves the segment information Arguments: None Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; CWsbStringPtr tmpString; WsbTraceIn(OLESTR("CHsmServer::StoreSegmentInformationFinal"),OLESTR("")); try { WsbAssert(m_pSegmentDatabase.p != 0, E_POINTER); // This should not be necessary for a real DB // WsbAffirmHr(m_pSegmentDatabase->Close()); m_pSegmentDatabase = 0; } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreSegmentInformationFinal"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::LoadMessages( IStream* pStream ) /*++ Routine Description: Loads the persistent data for messages Arguments: pStream - Data stream. Return Value: S_OK: The collection was loaded OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::LoadMessages"),OLESTR("")); try { WsbAffirmHr(LoadCollection(pStream, m_pMessages)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::LoadMessages"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } HRESULT CHsmServer::StoreMessages( IStream* pStream ) /*++ Routine Description: Saves the persistent data for messages. Arguments: pStream - Data stream. Return Value: S_OK: The collection was saved OK. --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmServer::StoreMessages"),OLESTR("")); // // Make sure we have a valid collection pointer // try { WsbAffirmHr(StoreCollection(pStream, m_pMessages)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmServer::StoreMessages"), OLESTR("hr = <%ls>"),WsbHrAsString(hr)); return(hr); } // LoadCollection - load a collection from the given stream static HRESULT LoadCollection(IStream* pStream, IWsbIndexedCollection* pIWC) { HRESULT hr = S_OK; try { CComPtr pIStream; WsbAffirm(0 != pStream, E_POINTER); WsbAffirm(0 != pIWC, E_POINTER); // Load the ordered collection from the persistent file WsbAffirmHr(pIWC->QueryInterface(IID_IPersistStream, (void**)&pIStream)); WsbAffirmHr(pIStream->Load(pStream)); } WsbCatch(hr); return(hr); } // StoreCollection - store a collection to the given stream static HRESULT StoreCollection(IStream* pStream, IWsbIndexedCollection* pIWC) { HRESULT hr = S_OK; try { CComPtr pIStream; // Get the IPersistStream interface for the collection WsbAffirm(0 != pStream, E_POINTER); WsbAffirm(0 != pIWC, E_POINTER); WsbAffirmHr(pIWC->QueryInterface(IID_IPersistStream, (void**)&pIStream)); // Store the ordered collection to the persistent file WsbAffirmHr(pIStream->Save(pStream, TRUE)); } WsbCatch(hr); return(hr); }