/*++ © 1998 Seagate Software, Inc. All rights reserved. Module Name: hsmpolcy.cpp Abstract: This component represents a job's policy. Author: Chuck Bardeen [cbardeen] 29-Oct-1996 Revision History: --*/ #include "stdafx.h" #include "wsb.h" #include "job.h" #include "hsmpolcy.h" #define WSB_TRACE_IS WSB_TRACE_BIT_JOB HRESULT CHsmPolicy::CompareTo( IN IUnknown* pUnknown, OUT SHORT* pResult ) /*++ Implements: IWsbCollectable::CompareTo(). --*/ { HRESULT hr = S_OK; CComPtr pPolicy; WsbTraceIn(OLESTR("CHsmPolicy::CompareTo"), OLESTR("")); try { // Did they give us a valid item to compare to? WsbAssert(0 != pUnknown, E_POINTER); // We need the IWsbBool interface to get the value of the object. WsbAffirmHr(pUnknown->QueryInterface(IID_IHsmPolicy, (void**) &pPolicy)); // Compare the rules. hr = CompareToIPolicy(pPolicy, pResult); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::CompareTo"), OLESTR("hr = <%ls>, result = <%ls>"), WsbHrAsString(hr), WsbPtrToShortAsString(pResult)); return(hr); } HRESULT CHsmPolicy::CompareToIPolicy( IN IHsmPolicy* pPolicy, OUT SHORT* pResult ) /*++ Implements: IHsmPolicy::CompareToIPolicy(). --*/ { HRESULT hr = S_OK; GUID id; WsbTraceIn(OLESTR("CHsmPolicy::CompareToIPolicy"), OLESTR("")); try { // Did they give us a valid item to compare to? WsbAssert(0 != pPolicy, E_POINTER); // Get the path and name. WsbAffirmHr(pPolicy->GetIdentifier(&id)); // Compare to the path and name. hr = CompareToIdentifier(id, pResult); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::CompareToIPolicy"), OLESTR("hr = <%ls>, result = <%ls>"), WsbHrAsString(hr), WsbPtrToShortAsString(pResult)); return(hr); } HRESULT CHsmPolicy::CompareToIdentifier( IN GUID id, OUT SHORT* pResult ) /*++ Implements: IHsmPolicy::CompareToIdentifier(). --*/ { HRESULT hr = S_OK; SHORT aResult = 0; WsbTraceIn(OLESTR("CHsmPolicy::CompareToIdentifier"), OLESTR("id = <%ls>"), WsbGuidAsString(id)); try { // Compare the guids. aResult = WsbSign( memcmp(&m_id, &id, sizeof(GUID)) ); if (0 != aResult) { hr = S_FALSE; } if (0 != pResult) { *pResult = aResult; } } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::CompareToIdentifier"), OLESTR("hr = <%ls>, result = <%d>"), WsbHrAsString(hr), aResult); return(hr); } HRESULT CHsmPolicy::EnumRules( OUT IWsbEnum** ppEnum ) /*++ Implements: IHsmPolicy::EnumRules(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != ppEnum, E_POINTER); WsbAffirmHr(m_pRules->Enum(ppEnum)); } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::FinalConstruct( void ) /*++ Implements: CComObjectRoot::FinalConstruct(). --*/ { HRESULT hr = S_OK; try { WsbAffirmHr(CWsbObject::FinalConstruct()); m_scale = 1000; m_usesDefaultRules = FALSE; //Create the criteria collection. WsbAffirmHr(CoCreateInstance(CLSID_CWsbOrderedCollection, NULL, CLSCTX_ALL, IID_IWsbCollection, (void**) &m_pRules)); // Each instance should have its own unique identifier. WsbAffirmHr(CoCreateGuid(&m_id)); } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::GetAction( OUT IHsmAction** ppAction ) /*++ Implements: IHsmPolicy::GetAction(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != ppAction, E_POINTER); *ppAction = m_pAction; m_pAction.p->AddRef(); } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::GetClassID( OUT CLSID* pClsid ) /*++ Implements: IPersist::GetClassID(). --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CHsmPolicy::GetClassID"), OLESTR("")); try { WsbAssert(0 != pClsid, E_POINTER); *pClsid = CLSID_CHsmPolicy; } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::GetClassID"), OLESTR("hr = <%ls>, CLSID = <%ls>"), WsbHrAsString(hr), WsbGuidAsString(*pClsid)); return(hr); } HRESULT CHsmPolicy::GetIdentifier( OUT GUID* pId ) /*++ Implements: IHsmPolicy::GetIdentifier(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != pId, E_POINTER); *pId = m_id; } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::GetName( OUT OLECHAR** pName, IN ULONG bufferSize ) /*++ Implements: IHsmPolicy::GetName(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != pName, E_POINTER); WsbAffirmHr(m_name.CopyTo(pName, bufferSize)); } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::GetScale( OUT USHORT* pScale ) /*++ Implements: IHsmPolicy::GetScale(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != pScale, E_POINTER); *pScale = m_scale; } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::GetSizeMax( OUT ULARGE_INTEGER* pSize ) /*++ Implements: IPersistStream::GetSizeMax(). --*/ { HRESULT hr = S_OK; CComPtr pPersistStream; ULARGE_INTEGER entrySize; WsbTraceIn(OLESTR("CHsmPolicy::GetSizeMax"), OLESTR("")); try { WsbAssert(0 != pSize, E_POINTER); // Determine the size for a rule with no criteria. pSize->QuadPart = WsbPersistSize((wcslen(m_name) + 1) * sizeof(OLECHAR)) + WsbPersistSizeOf(GUID) + WsbPersistSizeOf(USHORT) + 2 * WsbPersistSizeOf(BOOL); // If there is an action, how big is it? if (m_pAction != 0) { WsbAffirmHr(m_pAction->QueryInterface(IID_IPersistStream, (void**) &pPersistStream)); WsbAffirmHr(pPersistStream->GetSizeMax(&entrySize)); pSize->QuadPart += entrySize.QuadPart; pPersistStream = 0; } // Now allocate space for the rules (assume they are all the // same size). WsbAffirmHr(m_pRules->QueryInterface(IID_IPersistStream, (void**) &pPersistStream)); WsbAffirmHr(pPersistStream->GetSizeMax(&entrySize)); pSize->QuadPart += entrySize.QuadPart; } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pSize)); return(hr); } HRESULT CHsmPolicy::Load( IN IStream* pStream ) /*++ Implements: IPersistStream::Load(). --*/ { HRESULT hr = S_OK; CComPtr pPersistStream; BOOL hasAction; WsbTraceIn(OLESTR("CHsmPolicy::Load"), OLESTR("")); try { WsbAssert(0 != pStream, E_POINTER); // Do the easy stuff, but make sure that this order matches the order // in the save method. WsbAffirmHr(WsbLoadFromStream(pStream, &m_id)); WsbAffirmHr(WsbLoadFromStream(pStream, &m_name, 0)); WsbAffirmHr(WsbLoadFromStream(pStream, &m_scale)); WsbAffirmHr(WsbLoadFromStream(pStream, &m_usesDefaultRules)); // Is there an action? WsbAffirmHr(WsbLoadFromStream(pStream, &hasAction)); if (hasAction) { WsbAffirmHr(OleLoadFromStream(pStream, IID_IHsmAction, (void**) &m_pAction)); } WsbAffirmHr(m_pRules->QueryInterface(IID_IPersistStream, (void**) &pPersistStream)); WsbAffirmHr(pPersistStream->Load(pStream)); } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmPolicy::Rules( OUT IWsbCollection** ppRules ) /*++ Implements: IHsmPolicy::Rules(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != ppRules, E_POINTER); *ppRules = m_pRules; m_pRules.p->AddRef(); } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::Save( IN IStream* pStream, IN BOOL clearDirty ) /*++ Implements: IPersistStream::Save(). --*/ { HRESULT hr = S_OK; CComPtr pEnum; CComPtr pPersistStream; BOOL hasAction = FALSE; WsbTraceIn(OLESTR("CHsmPolicy::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty)); try { WsbAssert(0 != pStream, E_POINTER); // Do the easy stuff, but make sure that this order matches the order // in the save method. WsbAffirmHr(WsbSaveToStream(pStream, m_id)); WsbAffirmHr(WsbSaveToStream(pStream, m_name)); WsbAffirmHr(WsbSaveToStream(pStream, m_scale)); WsbAffirmHr(WsbSaveToStream(pStream, m_usesDefaultRules)); // Is there an action? if (m_pAction != 0) { hasAction = TRUE; WsbAffirmHr(WsbSaveToStream(pStream, hasAction)); WsbAffirmHr(m_pAction->QueryInterface(IID_IPersistStream, (void**) &pPersistStream)); WsbAffirmHr(OleSaveToStream(pPersistStream, pStream)); pPersistStream = 0; } else { hasAction = FALSE; WsbAffirmHr(WsbSaveToStream(pStream, hasAction)); } WsbAffirmHr(m_pRules->QueryInterface(IID_IPersistStream, (void**) &pPersistStream)); WsbAffirmHr(pPersistStream->Save(pStream, clearDirty)); // The loop should terminate with a not found error. WsbAffirm(hr == WSB_E_NOTFOUND, hr); hr = S_OK; // If we got it saved and we were asked to clear the dirty bit, then // do so now. if (clearDirty) { m_isDirty = FALSE; } } WsbCatch(hr); WsbTraceOut(OLESTR("CHsmPolicy::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } HRESULT CHsmPolicy::SetAction( IN IHsmAction* pAction ) /*++ Implements: IHsmPolicy::SetAction(). --*/ { HRESULT hr = S_OK; try { m_pAction = pAction; m_isDirty = TRUE; } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::SetName( IN OLECHAR* name ) /*++ Implements: IHsmPolicy::SetName(). --*/ { HRESULT hr = S_OK; try { m_name = name; m_isDirty = TRUE; } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::SetScale( IN USHORT scale ) /*++ Implements: IHsmPolicy::SetScale(). --*/ { HRESULT hr = S_OK; try { m_scale = scale; m_isDirty = TRUE; } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::SetUsesDefaultRules( IN BOOL usesDefaultRules ) /*++ Implements: IHsmPolicy::SetUsesDefaultRules(). --*/ { m_usesDefaultRules = usesDefaultRules; m_isDirty = TRUE; return(S_OK); } HRESULT CHsmPolicy::Test( USHORT* passed, USHORT* failed ) /*++ Implements: IWsbTestable::Test(). --*/ { HRESULT hr = S_OK; try { WsbAssert(0 != passed, E_POINTER); WsbAssert(0 != failed, E_POINTER); *passed = 0; *failed = 0; } WsbCatch(hr); return(hr); } HRESULT CHsmPolicy::UsesDefaultRules( void ) /*++ Implements: IHsmPolicy::UsesDefaultRules(). --*/ { HRESULT hr = S_OK; if (!m_usesDefaultRules) { hr = S_FALSE; } return(hr); }