566 lines
13 KiB
C++
566 lines
13 KiB
C++
/*++
|
||
|
||
© 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<IHsmManagedResource> pHsmResource;
|
||
CComPtr<IUnknown> pResourceUnknown;
|
||
CComPtr<IFsaResource> pFsaResource;
|
||
CComPtr<IHsmServer> 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<IHsmManagedResource> pHsmResource;
|
||
CComPtr<IUnknown> pResourceUnknown;
|
||
CComPtr<IFsaResource> pFsaResource;
|
||
CComPtr<IHsmServer> 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<IWsbCollectable> pCollectable;
|
||
CComPtr<IWsbEnum> 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<IPersistStream> 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<IPersistStream> 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<IPersistStream> 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<IWsbLong> pLong1;
|
||
CComPtr<IWsbLong> pLong2;
|
||
CComPtr<IWsbLong> pLong3;
|
||
CComPtr<IWsbLong> 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<IWsbEnum> pEnum;
|
||
CComPtr<IWsbLong> 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<IPersistFile> pFile;
|
||
CComPtr<IWsbCollection> 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);
|
||
}
|
||
|
||
|