/*++ © 1998 Seagate Software, Inc. All rights reserved Module Name: RmsPartn.cpp Abstract: Implementation of CRmsPartition Author: Brian Dodd [brian] 19-Nov-1996 Revision History: --*/ #include "stdafx.h" #include "RmsPartn.h" //////////////////////////////////////////////////////////////////////////////// // STDMETHODIMP CRmsPartition::CompareTo( IN IUnknown *pCollectable, OUT SHORT *pResult ) /*++ Implements: IWsbCollectable::CompareTo --*/ { HRESULT hr = E_FAIL; SHORT result = 1; WsbTraceIn( OLESTR("CRmsPartition::CompareTo"), OLESTR("") ); try { // Validate arguments - Okay if pResult is NULL WsbAssertPointer( pCollectable ); // We need the IRmsPartition interface to get the value of the object. CComQIPtr pPartition = pCollectable; WsbAssertPointer( pPartition ); CComQIPtr pObject = pCollectable; WsbAssertPointer( pObject ); switch ( m_findBy ) { case RmsFindByPartitionNumber: { LONG partNo; WsbAffirmHr( pPartition->GetPartNo( &partNo ) ); if( m_partNo == partNo ) { // partition numbers match hr = S_OK; result = 0; } else { hr = S_FALSE; result = 1; } break; } default: // Do CompareTo for object hr = CRmsComObject::CompareTo( pCollectable, &result ); break; } } WsbCatch( hr ); if ( SUCCEEDED(hr) && (0 != pResult) ){ *pResult = result; } WsbTraceOut( OLESTR("CRmsPartition::CompareTo"), OLESTR("hr = <%ls>, result = <%ls>"), WsbHrAsString( hr ), WsbPtrToShortAsString( pResult ) ); return hr; } HRESULT CRmsPartition::FinalConstruct( void ) /*++ Implements: CComObjectRoot::FinalConstruct --*/ { HRESULT hr = S_OK; try { WsbAssertHr(CWsbObject::FinalConstruct()); // Initialize values m_partNo = 0; m_attributes = RmsAttributesUnknown; m_sizeofIdentifier = 0; } WsbCatch(hr); return(hr); } STDMETHODIMP CRmsPartition::GetClassID( OUT CLSID* pClsid ) /*++ Implements: IPersist::GetClassID --*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CRmsPartition::GetClassID"), OLESTR("")); try { WsbAssert(0 != pClsid, E_POINTER); *pClsid = CLSID_CRmsPartition; } WsbCatch(hr); WsbTraceOut(OLESTR("CRmsPartition::GetClassID"), OLESTR("hr = <%ls>, CLSID = <%ls>"), WsbHrAsString(hr), WsbGuidAsString(*pClsid)); return(hr); } STDMETHODIMP CRmsPartition::GetSizeMax( OUT ULARGE_INTEGER* pcbSize ) /*++ Implements: IPersistStream::GetSizeMax --*/ { HRESULT hr = E_NOTIMPL; WsbTraceIn(OLESTR("CRmsPartition::GetSizeMax"), OLESTR("")); // try { // WsbAssert(0 != pcbSize, E_POINTER); // // Get max size // pcbSize->QuadPart = WsbPersistSizeOf(LONG) + // m_partNo // WsbPersistSizeOf(LONG) + // m_attributes // WsbPersistSizeOf(SHORT); // m_sizeofIdentifier //// MaxId; // m_pIdentifier // } WsbCatch(hr); WsbTraceOut(OLESTR("CRmsPartition::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pcbSize)); return(hr); } STDMETHODIMP CRmsPartition::Load( IN IStream* pStream ) /*++ Implements: IPersistStream::Load --*/ { HRESULT hr = S_OK; ULONG ulBytes = 0; WsbTraceIn(OLESTR("CRmsPartition::Load"), OLESTR("")); try { ULONG temp; WsbAssert(0 != pStream, E_POINTER); WsbAffirmHr(CRmsStorageInfo::Load(pStream)); // Read value WsbAffirmHr(WsbLoadFromStream(pStream, &m_partNo)); WsbAffirmHr(WsbLoadFromStream(pStream, &temp)); m_attributes = (RmsAttribute)temp; WsbAffirmHr(WsbLoadFromStream(pStream, &m_sizeofIdentifier)); } WsbCatch(hr); WsbTraceOut(OLESTR("CRmsPartition::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } STDMETHODIMP CRmsPartition::Save( IN IStream* pStream, IN BOOL clearDirty ) /*++ Implements: IPersistStream::Save --*/ { HRESULT hr = S_OK; ULONG ulBytes = 0; WsbTraceIn(OLESTR("CRmsPartition::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty)); try { WsbAssert(0 != pStream, E_POINTER); WsbAffirmHr(CRmsStorageInfo::Save(pStream, clearDirty)); // Write value WsbAffirmHr(WsbSaveToStream(pStream, m_partNo)); WsbAffirmHr(WsbSaveToStream(pStream, (ULONG) m_attributes)); WsbAffirmHr(WsbSaveToStream(pStream, m_sizeofIdentifier)); // Do we need to clear the dirty bit? if (clearDirty) { m_isDirty = FALSE; } } WsbCatch(hr); WsbTraceOut(OLESTR("CRmsPartition::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } STDMETHODIMP CRmsPartition::Test( OUT USHORT *pPassed, OUT USHORT *pFailed ) /*++ Implements: IWsbTestable::Test --*/ { HRESULT hr = S_OK; CComPtr pPartition1; CComPtr pPartition2; CComPtr pFile1; CComPtr pFile2; LONG i; LONG longWork1; LONG longWork2; WsbTraceIn(OLESTR("CRmsPartition::Test"), OLESTR("")); try { // Get the Partition interface. hr = S_OK; try { WsbAssertHr(((IUnknown*) (IRmsPartition*) this)->QueryInterface(IID_IRmsPartition, (void**) &pPartition1)); // Test SetAttributes & GetAttributes for (i = RmsAttributesUnknown; i < RmsAttributesVerify; i++){ longWork1 = i; SetAttributes(longWork1); GetAttributes(&longWork2); if (longWork1 == longWork2){ (*pPassed)++; } else { (*pFailed)++; } } } WsbCatch(hr); // Tally up the results hr = S_OK; if (*pFailed) { hr = S_FALSE; } } WsbCatch(hr); WsbTraceOut(OLESTR("CRmsPartition::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr)); return(hr); } STDMETHODIMP CRmsPartition::GetPartNo( LONG *pPartNo ) /*++ Implements: IRmsPartition::GetPartNo --*/ { *pPartNo = m_partNo; return S_OK; } STDMETHODIMP CRmsPartition::GetAttributes ( LONG *pAttr ) /*++ Implements: IRmsPartition::GetAttributes --*/ { *pAttr = (LONG) m_attributes; return S_OK; } STDMETHODIMP CRmsPartition::SetAttributes ( LONG attr ) /*++ Implements: IRmsPartition::SetAttributes --*/ { m_attributes = (RmsAttribute) attr; m_isDirty = TRUE; return S_OK; } STDMETHODIMP CRmsPartition::GetIdentifier ( UCHAR *pIdent, SHORT *pSize ) /*++ Implements: IRmsPartition::GetIdentifier --*/ { *pSize = m_sizeofIdentifier; memmove (pIdent, m_pIdentifier, m_sizeofIdentifier); return S_OK; } STDMETHODIMP CRmsPartition::SetIdentifier ( UCHAR *pIdent, SHORT size ) /*++ Implements: IRmsPartition::SetIdentifier --*/ { m_sizeofIdentifier = size; memmove (m_pIdentifier, pIdent, size); m_isDirty = TRUE; return S_OK; } STDMETHODIMP CRmsPartition::GetStorageInfo( IRmsStorageInfo** /*ptr*/ ) /*++ Implements: IRmsPartition::GetStorageInfo --*/ { return S_OK; } STDMETHODIMP CRmsPartition::VerifyIdentifier( void ) /*++ Implements: IRmsPartition::VerifyIdentifier --*/ { return S_OK; } STDMETHODIMP CRmsPartition::ReadOnMediaId( UCHAR* /*pid*/, LONG* /*pSize*/ ) /*++ Implements: IRmsPartition::ReadOnMediaId --*/ { return S_OK; }