490 lines
10 KiB
C++
490 lines
10 KiB
C++
/*++
|
||
|
||
© 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;
|
||
}
|