|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved
Module Name:
RmsLocat.cpp
Abstract:
Implementation of CRmsLocator
Author:
Brian Dodd [brian] 15-Nov-1996
Revision History:
--*/
#include "stdafx.h"
#include "RmsLocat.h"
///////////////////////////////////////////////////////////////////////////////
//
CRmsLocator::CRmsLocator( void ) /*++
Routine Description:
CRmsLocator constructor
Arguments:
None
Return Value:
None
--*/ { // Initialize values
m_type = RmsElementUnknown;
m_libraryId = GUID_NULL;
m_mediaSetId = GUID_NULL;
m_position = 0;
m_alternate1 = 0;
m_alternate2 = 0;
m_alternate3 = 0;
m_invert = FALSE; }
HRESULT CRmsLocator::CompareTo( IN IUnknown *pCollectable, OUT SHORT *pResult ) /*++
Implements:
CRmsLocator::CompareTo
--*/ { HRESULT hr = E_FAIL; SHORT result = 1;
WsbTraceIn( OLESTR("CRmsLocator::CompareTo"), OLESTR("") );
try {
// Validate arguments - Okay if pResult is NULL
WsbAssertPointer( pCollectable );
CRmsLocator pLocator; RmsElement type; GUID libraryId; GUID mediaSetId; LONG position; LONG alternate1; LONG alternate2; LONG alternate3; BOOL invert;
// Get Locator to check
GetLocation((LONG *) &type, &libraryId, &mediaSetId, &position, &alternate1, &alternate2, &alternate3, &invert);
// See if we have the location requested
if ( (m_type == type ) && (m_libraryId == libraryId ) && (m_mediaSetId == mediaSetId ) && (m_position == position ) && (m_alternate1 == alternate1 ) && (m_alternate2 == alternate2 ) && (m_alternate3 == alternate3 ) && (m_invert == invert ) ) {
// Locators match
hr = S_OK; result = 0;
} else { hr = S_FALSE; result = 1; }
} WsbCatch( hr );
if ( SUCCEEDED(hr) && (0 != pResult) ){ *pResult = result; }
WsbTraceOut( OLESTR("CRmsLocator::CompareTo"), OLESTR("hr = <%ls>, result = <%ls>"), WsbHrAsString( hr ), WsbPtrToShortAsString( pResult ) );
return hr; }
HRESULT CRmsLocator::GetSizeMax( OUT ULARGE_INTEGER* pcbSize ) /*++
Implements:
IPersistStream::GetSizeMax
--*/ { HRESULT hr = E_NOTIMPL;
WsbTraceIn(OLESTR("CRmsLocator::GetSizeMax"), OLESTR(""));
// try {
// WsbAssert(0 != pcbSize, E_POINTER);
// // Get max size
// pcbSize->QuadPart = WsbPersistSizeOf(LONG) + // m_type
// WsbPersistSizeOf(GUID) + // m_libraryId
// WsbPersistSizeOf(GUID) + // m_mediaSetId
// WsbPersistSizeOf(LONG) + // m_position
// WsbPersistSizeOf(LONG) + // m_alternate1
// WsbPersistSizeOf(LONG) + // m_alternate2
// WsbPersistSizeOf(LONG) + // m_alternate3
// WsbPersistSizeOf(BOOL); // m_invert
// } WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsLocator::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pcbSize));
return(hr); }
HRESULT CRmsLocator::Load( IN IStream* pStream ) /*++
Implements:
IPersistStream::Load
--*/ { HRESULT hr = S_OK; ULONG ulBytes = 0;
WsbTraceIn(OLESTR("CRmsLocator::Load"), OLESTR(""));
try { ULONG temp;
WsbAssert(0 != pStream, E_POINTER);
// Read value
WsbAffirmHr(WsbLoadFromStream(pStream, &temp)); m_type = (RmsElement)temp;
WsbAffirmHr(WsbLoadFromStream(pStream, &m_libraryId));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_mediaSetId));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_position));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_alternate1));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_alternate2));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_alternate3));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_invert));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsLocator::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CRmsLocator::Save( IN IStream* pStream, IN BOOL clearDirty ) /*++
Implements:
IPersistStream::Save
--*/ { HRESULT hr = S_OK; ULONG ulBytes = 0;
WsbTraceIn(OLESTR("CRmsLocator::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty));
try { WsbAssert(0 != pStream, E_POINTER);
// Write value
WsbAffirmHr(WsbSaveToStream(pStream, (ULONG) m_type));
WsbAffirmHr(WsbSaveToStream(pStream, m_libraryId));
WsbAffirmHr(WsbSaveToStream(pStream, m_mediaSetId));
WsbAffirmHr(WsbSaveToStream(pStream, m_position));
WsbAffirmHr(WsbSaveToStream(pStream, m_alternate1));
WsbAffirmHr(WsbSaveToStream(pStream, m_alternate2));
WsbAffirmHr(WsbSaveToStream(pStream, m_alternate3));
WsbAffirmHr(WsbSaveToStream(pStream, m_invert));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsLocator::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CRmsLocator::Test( OUT USHORT *pPassed, OUT USHORT *pFailed ) /*++
Implements:
IWsbTestable::Test
--*/ { HRESULT hr = S_OK;
CComPtr<IRmsMediaSet> pMediaSet1; CComPtr<IRmsMediaSet> pMediaSet2;
CComPtr<IPersistFile> pFile1; CComPtr<IPersistFile> pFile2;
LONG i;
GUID guidVal1 = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}; GUID guidVal2 = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
GUID guidWork1; GUID guidWork2;
LONG longVal1 = 11111111; LONG longVal2 = 22222222; LONG longVal3 = 33333333; LONG longVal4 = 44444444;
LONG longWork0; LONG longWork1; LONG longWork2; LONG longWork3; LONG longWork4;
BOOL boolWork1; BOOL boolWork2;
WsbTraceIn(OLESTR("CRmsLocator::Test"), OLESTR(""));
try { // Get the MediaSet interface.
hr = S_OK; try { WsbAssertHr(((IUnknown*) (IRmsMediaSet*) this)->QueryInterface(IID_IRmsMediaSet, (void**) &pMediaSet1));
boolWork1 = FALSE;
// Test SetLocation & GetLocation
for(i = RmsElementUnknown; i < RmsElementIEPort; i++){ SetLocation(i, guidVal1, guidVal2, longVal1, longVal2, longVal3, longVal4, boolWork1);
GetLocation(&longWork0, &guidWork1, &guidWork2, &longWork1, &longWork2, &longWork3, &longWork4, &boolWork2);
if((i == longWork0) && (guidVal1 == guidWork1) && (guidVal2 == guidWork2) && (longVal1 == longWork1) && (longVal2 == longWork2) && (longVal3 == longWork3) && (longVal4 == longWork4) && (boolWork1 == boolWork2)){ (*pPassed)++; } else { (*pFailed)++; }
if(boolWork1 == TRUE){ boolWork1 = FALSE; } else { boolWork1 = TRUE; } }
} WsbCatch(hr);
// Tally up the results
hr = S_OK;
if (*pFailed) { hr = S_FALSE; }
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsLocator::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr); }
STDMETHODIMP CRmsLocator::GetLocation( LONG *pType, GUID *pLibId, GUID *pMediaSetId, LONG *pPos, LONG *pAlt1, LONG *pAlt2, LONG *pAlt3, BOOL *pInvert) /*++
Routine Description:
Get location values.
Arguments:
pType - pointer to cartridge type pLibId - pointer to library id pMediaSetId - pointer to media set id pPos - pointer to current position pAlt1 - pointer to alternate data field 1 pAlt2 - pointer to alternate data field 2 pAlt3 - pointer to alternate data field 3 pInvert - pointer to invert flag
Return Value:
S_OK - successful
--*/ { if (pType) { *pType = m_type; } if (pLibId) { *pLibId = m_libraryId; } if (pMediaSetId) { *pMediaSetId = m_mediaSetId; } if (pPos) { *pPos = m_position; } if (pAlt1) { *pAlt1 = m_alternate1; } if (pAlt2) { *pAlt2 = m_alternate2; } if (pAlt3) { *pAlt3 = m_alternate3; } if (pInvert) { *pInvert = m_invert; }
return S_OK; }
STDMETHODIMP CRmsLocator::SetLocation( LONG type, GUID libId, GUID mediaSetId, LONG pos, LONG alt1, LONG alt2, LONG alt3, BOOL invert ) /*++
Routine Description:
Set location values.
Arguments:
type - new value of cartridge type libId - new value of library id mediaSetId - new value of media set id pos - new value of current position alt1 - new value of alternate data field 1 alt2 - new value of alternate data field 2 alt3 - new value of alternate data field 3 invert - new value of invert flag
Return Value:
S_OK - successful
--*/ { m_type = (RmsElement) type; m_libraryId = libId; m_mediaSetId = mediaSetId; m_position = pos; m_alternate1 = alt1; m_alternate2 = alt2; m_alternate3 = alt3; m_invert = invert;
// m_isDirty = TRUE;
return S_OK; }
|