/*++ © 1998 Seagate Software, Inc. All rights reserved. Module Name: hsmmgdrc.cpp Abstract: Implementation of CHsmManagedResourceCollection Author: Cat Brant [cbrant] 24-Jan-1997 Revision History: --*/ #include "stdafx.h" #include "resource.h" #include "wsb.h" #include "HsmEng.h" #include "hsmserv.h" #include "hsmmgdrc.h" #include "fsa.h" #include "hsmconn.h" #define WSB_TRACE_IS WSB_TRACE_BIT_HSMENG HRESULT CHsmManagedResourceCollection::Add( IUnknown* pCollectable ) /*++ Implements: IWsbCollection::Add --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::Add"), OLESTR("")); try { CComPtr pHsmResource; CComPtr pResourceUnknown; CComPtr pFsaResource; CComPtr pHsmServer; GUID hsmId; ULONG level; // // Contact the FSA Resource to tell it // that it is managed. // WsbAffirmHr(pCollectable->QueryInterface(IID_IHsmManagedResource, (void**)&pHsmResource)); WsbAffirmHr(pHsmResource->GetFsaResource(&pResourceUnknown)); WsbAffirmHr(pResourceUnknown->QueryInterface(IID_IFsaResource, (void**)&pFsaResource)); WsbAffirmHr(pFsaResource->GetHsmLevel(&level)); // this may have to change if HsmConn starts using the service id (second parameter) WsbAssertHr(HsmConnectFromId(HSMCONN_TYPE_HSM, GUID_NULL, IID_IHsmServer, (void**) &pHsmServer)); WsbAffirmHr(pHsmServer->GetID(&hsmId)); WsbAffirmHr(pFsaResource->ManagedBy(hsmId, level, FALSE)); // // If FSA added OK add it to the engine // WsbAffirmHr(m_icoll->Add(pCollectable)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::Add"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::DeleteAllAndRelease( void ) /*++ Implements: IWsbCollection::DeleteAllAndRelease(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::DeleteAllAndRelease"), OLESTR("")); Lock(); try { // Release the resources without unmanaging them if (m_coll) { WsbAffirmHr(m_coll->RemoveAllAndRelease()); } } WsbCatch(hr); Unlock(); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::DeleteAllAndRelease"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::Remove( IUnknown* pCollectable, REFIID riid, void** ppElement ) /*++ Implements: IWsbCollection::Remove --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::Remove"), OLESTR("")); try { CComPtr pHsmResource; CComPtr pResourceUnknown; CComPtr pFsaResource; CComPtr pHsmServer; GUID hsmId; ULONG level; // Contact the FSA Resource to tell it that it is no longer // managed. // WsbAffirmHr(pCollectable->QueryInterface(IID_IHsmManagedResource, (void**)&pHsmResource)); WsbAffirmHr(pHsmResource->GetFsaResource(&pResourceUnknown)); WsbAffirmHr(pResourceUnknown->QueryInterface(IID_IFsaResource, (void**)&pFsaResource)); WsbAffirmHr(pFsaResource->GetHsmLevel(&level)); // this may have to change if HsmConn starts using the service id (second parameter) WsbAssertHr(HsmConnectFromId(HSMCONN_TYPE_HSM, GUID_NULL, IID_IHsmServer, (void**) &pHsmServer)); WsbAffirmHr(pHsmServer->GetID(&hsmId)); // // We don't care if the resource complains that we // don't have it. Just tell the resource and // then delete it from our collection // (void)pFsaResource->ManagedBy(hsmId, level, TRUE); WsbAffirmHr(m_icoll->Remove(pCollectable, riid, ppElement)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::Remove"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::RemoveAndRelease( IN IUnknown* pCollectable ) /*++ Implements: IHsmManagedResourceCollection::RemoveAndRelease(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::RemoveAndRelease"), OLESTR("")); try { WsbAssert(0 != pCollectable, E_POINTER); WsbAffirmHr(Remove(pCollectable, IID_IWsbCollectable, NULL)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::RemoveAndRelease"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::RemoveAllAndRelease( void ) /*++ Implements: IWsbCollection::RemoveAllAndRelease(). --*/ { CComPtr pCollectable; CComPtr pEnum; HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::RemoveAllAndRelease"), OLESTR("")); Lock(); try { // Get an enumerator WsbAffirmHr(Enum(&pEnum)); // Start at the end of the list, and keep removing from the // back. For some types of collections, this may not be the most // efficient way to remove all the elements. for (hr = pEnum->Last(IID_IWsbCollectable, (void**) &pCollectable); SUCCEEDED(hr); hr = pEnum->Last(IID_IWsbCollectable, (void**) &pCollectable)) { hr = RemoveAndRelease(pCollectable); pCollectable = 0; } // We should have emptied the list. if (hr == WSB_E_NOTFOUND) { hr = S_OK; } } WsbCatch(hr); Unlock(); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::RemoveAllAndRelease"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::FinalConstruct( void ) /*++ Implements: CComObjectRoot::FinalConstruct(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::FinalConstruct"), OLESTR("")); try { WsbAffirmHr(CWsbPersistStream::FinalConstruct()); WsbAssertHr(CoCreateInstance(CLSID_CWsbOrderedCollection, NULL, CLSCTX_ALL, IID_IWsbIndexedCollection, (void**) &m_icoll)); WsbAssertHr(m_icoll->QueryInterface(IID_IWsbCollection, (void**)&m_coll)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::FinalConstruct"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } void CHsmManagedResourceCollection::FinalRelease( ) { WsbTraceIn(OLESTR("CHsmManagedResourceCollection::FinalRelease"), OLESTR("")); // Force a release of the resources if (m_coll) { m_coll->RemoveAllAndRelease(); } // Let the parent class do his thing. CWsbPersistStream::FinalRelease(); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::FinalRelease"), OLESTR("")); } HRESULT CHsmManagedResourceCollection::GetClassID( OUT CLSID* pClsid ) /*++ Implements: IPersist::GetClassID(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::GetClassID"), OLESTR("")); try { WsbAssert(0 != pClsid, E_POINTER); *pClsid = CLSID_CHsmManagedResourceCollection; } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::GetClassID"), OLESTR("hr = <%ls>, CLSID = <%ls>"), WsbHrAsString(hr), WsbGuidAsString(*pClsid)); return(hr); } HRESULT CHsmManagedResourceCollection::GetSizeMax( OUT ULARGE_INTEGER* pSize ) /*++ Implements: IPersistStream::GetSizeMax(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::GetSizeMax"), OLESTR("")); try { CComPtr pPStream; WsbAffirmHr(m_icoll->QueryInterface(IID_IPersistStream, (void**)&pPStream)); WsbAffirmHr(pPStream->GetSizeMax(pSize)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pSize)); return(hr); } HRESULT CHsmManagedResourceCollection::Load( IN IStream* pStream ) /*++ Implements: IPersistStream::Load(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::Load"), OLESTR("")); try { CComPtr pPStream; WsbAffirmHr(m_icoll->QueryInterface(IID_IPersistStream, (void**)&pPStream)); WsbAffirmHr(pPStream->Load(pStream)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::Save( IN IStream* pStream, IN BOOL clearDirty ) /*++ Implements: IPersistStream::Save(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmManagedResourceCollection::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty)); try { CComPtr pPStream; WsbAffirmHr(m_icoll->QueryInterface(IID_IPersistStream, (void**)&pPStream)); WsbAffirmHr(pPStream->Save(pStream, clearDirty)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmManagedResourceCollection::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmManagedResourceCollection::Test( OUT USHORT* passed, OUT USHORT* failed ) /*++ Implements: IWsbTestable::Test(). --*/ { *passed = 0; *failed = 0; HRESULT hr = S_OK; #if defined(_DEBUG) WsbTraceIn(OLESTR("CHsmManagedResourceCollection::Test"), OLESTR("")); try { ULONG entries; CComPtr pLong1; CComPtr pLong2; CComPtr pLong3; CComPtr pLong4; hr = S_OK; // Check that collection is empty try { WsbAssertHr(GetEntries(&entries)); WsbAssert(entries == 0, E_FAIL); } WsbCatch(hr); if (hr == S_OK) { (*passed)++; } else { (*failed)++; } // Add some elements to the collection WsbAssertHr(CoCreateInstance(CLSID_CWsbLong, NULL, CLSCTX_ALL, IID_IWsbLong, (void**) &pLong1)); WsbAssertHr(CoCreateInstance(CLSID_CWsbLong, NULL, CLSCTX_ALL, IID_IWsbLong, (void**) &pLong2)); WsbAssertHr(CoCreateInstance(CLSID_CWsbLong, NULL, CLSCTX_ALL, IID_IWsbLong, (void**) &pLong3)); WsbAssertHr(CoCreateInstance(CLSID_CWsbLong, NULL, CLSCTX_ALL, IID_IWsbLong, (void**) &pLong4)); WsbAssertHr(pLong1->SetLong(57)); WsbAssertHr(pLong2->SetLong(-48)); WsbAssertHr(pLong3->SetLong(23)); WsbAssertHr(pLong4->SetLong(187)); try { WsbAssertHr(Add(pLong1)); WsbAssertHr(Add(pLong2)); WsbAssertHr(Add(pLong3)); WsbAssertHr(Add(pLong4)); WsbAssertHr(GetEntries(&entries)); WsbAssert(entries == 4, E_FAIL); } WsbCatch(hr); if (hr == S_OK) { (*passed)++; } else { (*failed)++; } // Check the order /* try { ULONG fetched; int i; CComPtr pEnum; CComPtr pLong[5]; LONG value[4]; WsbAssertHr(Enum(&pEnum)); WsbAssertHr(pEnum->First(5, IID_IWsbLong, (void**)&pLong, &fetched)); WsbAssert(fetched == 4, E_FAIL); for (i = 0; i < 4; i++) { WsbAssertHr(pLong[i]->GetLong(&value[i])); } for (i = 0; i < 3; i++) { WsbAssert(value[i] < value[i+1], E_FAIL); } } WsbCatch(hr); */ if (hr == S_OK) { (*passed)++; } else { (*failed)++; } // Save/load try { CComPtr pFile; CComPtr pSorted2; WsbAssertHr(((IUnknown*)(IWsbPersistStream*)this)->QueryInterface(IID_IPersistFile, (void**) &pFile)); WsbAssertHr(pFile->Save(OLESTR("c:\\WsbTests\\WsbSorted.tst"), TRUE)); pFile = 0; WsbAssertHr(CoCreateInstance(CLSID_CHsmManagedResourceCollection, NULL, CLSCTX_ALL, IID_IPersistFile, (void**) &pFile)); WsbAssertHr(pFile->Load(OLESTR("c:\\WsbTests\\WsbSorted.tst"), 0)); WsbAssertHr(pFile->QueryInterface(IID_IWsbCollection, (void**) &pSorted2)); WsbAssertHr(pSorted2->GetEntries(&entries)); WsbAssert(entries == 4, E_FAIL); } WsbCatch(hr); if (hr == S_OK) { (*passed)++; } else { (*failed)++; } } WsbCatch(hr); // Tally up the results if (*failed) { hr = S_FALSE; } else { hr = S_OK; } WsbTraceOut(OLESTR("CHsmManagedResourceCollection::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); #endif // _DEBUG return(hr); }