windows-nt/Source/XPSP1/NT/base/fs/hsm/rms/server/rmscelmt.cpp
2020-09-26 16:20:57 +08:00

1052 lines
21 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
© 1998 Seagate Software, Inc. All rights reserved
Module Name:
RmsCElmt.cpp
Abstract:
Implementation of CRmsChangerElement
Author:
Brian Dodd [brian] 15-Nov-1996
Revision History:
--*/
#include "stdafx.h"
#include "RmsCElmt.h"
#include "RmsServr.h"
/////////////////////////////////////////////////////////////////////////////
//
// CRmsChangerElement methods
//
CRmsChangerElement::CRmsChangerElement(
void
)
/*++
Routine Description:
CRmsChangerElement constructor
Arguments:
None
Return Value:
None
--*/
{
m_elementNo = 0;
m_location.SetLocation(RmsElementUnknown, GUID_NULL, GUID_NULL,
0, 0, 0, 0, FALSE);
m_mediaSupported = RmsMediaUnknown;
m_isStorage = FALSE;
m_isOccupied = FALSE;
m_pCartridge = NULL;
m_ownerClassId = CLSID_NULL;
m_getCounter = 0;
m_putCounter = 0;
m_resetCounterTimestamp = 0;
m_lastGetTimestamp = 0;
m_lastPutTimestamp = 0;
m_x1 = 0;
m_x2 = 0;
m_x3 = 0;
}
HRESULT
CRmsChangerElement::CompareTo(
IN IUnknown *pCollectable,
OUT SHORT *pResult
)
/*++
Implements:
CRmsChangerElement::CompareTo
--*/
{
HRESULT hr = E_FAIL;
SHORT result = 1;
WsbTraceIn( OLESTR("CRmsChangerElement::CompareTo"), OLESTR("") );
try {
// Validate arguments - Okay if pResult is NULL
WsbAssertPointer( pCollectable );
CComQIPtr<IRmsChangerElement, &IID_IRmsChangerElement> pElmt = pCollectable;
WsbAssertPointer( pElmt );
switch ( m_findBy ) {
case RmsFindByElementNumber:
{
LONG elementNo;
WsbAffirmHr( pElmt->GetElementNo( &elementNo ) );
if( m_elementNo == elementNo ) {
// Element numbers match
hr = S_OK;
result = 0;
}
else {
hr = S_FALSE;
result = 1;
}
}
break;
case RmsFindByMediaSupported:
{
RmsMedia mediaSupported;
WsbAffirmHr( pElmt->GetMediaSupported( (LONG*) &mediaSupported ) );
if( m_mediaSupported == mediaSupported ) {
// media types supported match
hr = S_OK;
result = 0;
}
else {
hr = S_FALSE;
result = 1;
}
}
break;
default:
// What default makes sense?
WsbAssertHr( E_UNEXPECTED );
break;
}
}
WsbCatch( hr );
if ( SUCCEEDED(hr) && (0 != pResult) ) {
*pResult = result;
}
WsbTraceOut( OLESTR("CRmsChangerElement::CompareTo"),
OLESTR("hr = <%ls>, result = <%ls>"),
WsbHrAsString( hr ), WsbPtrToShortAsString( pResult ) );
return hr;
}
HRESULT
CRmsChangerElement::GetSizeMax(
OUT ULARGE_INTEGER* /*pcbSize*/
)
/*++
Implements:
IPersistStream::GetSizeMax
--*/
{
HRESULT hr = E_NOTIMPL;
// ULARGE_INTEGER cartridgeLen;
// ULARGE_INTEGER locationLen;
// WsbTraceIn(OLESTR("CRmsChangerElement::GetSizeMax"), OLESTR(""));
// try {
// WsbAssert(0 != pcbSize, E_POINTER);
// // We need the IRmsCartridge interface to get the value of the object.
// CComQIPtr<IPersistStream, &IID_IPersistStream> pPersistCartridge = m_pCartridge;
// WsbAssertPointer( pPersistCartridge );
// pPersistCartridge->GetSizeMax(&cartridgeLen);
// m_location.GetSizeMax(&locationLen);
// // Get max size
// pcbSize->QuadPart = WsbPersistSizeOf(LONG) + // m_elementNo
// locationLen.QuadPart + // m_location
// WsbPersistSizeOf(LONG) + // m_mediaSupported
// WsbPersistSizeOf(BOOL) + // m_isStorage
// WsbPersistSizeOf(BOOL) + // m_isOccupied
// cartridgeLen.QuadPart + // m_pCartridge
// WsbPersistSizeOf(CLSID) + // m_ownerClassId
// WsbPersistSizeOf(LONG) + // m_getCounter
// WsbPersistSizeOf(LONG) + // m_putCounter
// sizeof(DATE) + // m_resetCounterTimestamp
// sizeof(DATE) + // m_lastGetTimestamp
// sizeof(DATE) + // m_lastPutTimestamp
// WsbPersistSizeOf(LONG) + // m_x1
// WsbPersistSizeOf(LONG) + // m_x2
// WsbPersistSizeOf(LONG); // m_x3
// } WsbCatch(hr);
// WsbTraceOut(OLESTR("CRmsChangerElement::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pcbSize));
return(hr);
}
HRESULT
CRmsChangerElement::Load(
IN IStream* pStream
)
/*++
Implements:
IPersistStream::Load
--*/
{
HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CRmsChangerElement::Load"), OLESTR(""));
try {
CComQIPtr<IRmsServer, &IID_IRmsServer> pServer = g_pServer;
ULONG temp;
WsbAssert(0 != pStream, E_POINTER);
WsbAssertPointer(pServer);
WsbAffirmHr(CRmsComObject::Load(pStream));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_elementNo));
WsbAffirmHr(m_location.Load(pStream));
WsbAffirmHr(WsbLoadFromStream(pStream, &temp));
m_mediaSupported = (RmsMedia)temp;
WsbAffirmHr(WsbLoadFromStream(pStream, &m_isStorage));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_isOccupied));
GUID cartId;
WsbAffirmHr(WsbLoadFromStream(pStream, &cartId));
if (0 != memcmp(&GUID_NULL, &cartId, sizeof(GUID))) {
hr = pServer->FindCartridgeById(cartId, &m_pCartridge);
if (S_OK == hr) {
CComQIPtr<IRmsDrive, &IID_IRmsDrive> pDrive = (IRmsChangerElement*)this;
if (pDrive) {
WsbAffirmHr(m_pCartridge->SetDrive(pDrive));
}
} else if (RMS_E_NOT_FOUND == hr) {
// TODO ???
} else {
WsbThrow(hr);
}
}
WsbAffirmHr(WsbLoadFromStream(pStream, &m_ownerClassId));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_getCounter));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_putCounter));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_x1));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_x2));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_x3));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsChangerElement::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr);
}
HRESULT
CRmsChangerElement::Save(
IN IStream* pStream,
IN BOOL clearDirty
)
/*++
Implements:
IPersistStream::Save
--*/
{
HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CRmsChangerElement::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty));
try {
WsbAssert(0 != pStream, E_POINTER);
WsbAffirmHr(CRmsComObject::Save(pStream, clearDirty));
WsbAffirmHr(WsbSaveToStream(pStream, m_elementNo));
WsbAffirmHr(m_location.Save(pStream, clearDirty));
WsbAffirmHr(WsbSaveToStream(pStream, (ULONG) m_mediaSupported));
WsbAffirmHr(WsbSaveToStream(pStream, m_isStorage));
WsbAffirmHr(WsbSaveToStream(pStream, m_isOccupied));
// Save the ID (GUID) for the cartridge
GUID cartId;
if (!m_pCartridge) {
cartId = GUID_NULL;
} else {
WsbAffirmHr(m_pCartridge->GetCartridgeId(&cartId));
}
WsbAffirmHr(WsbSaveToStream(pStream, cartId));
WsbAffirmHr(WsbSaveToStream(pStream, m_ownerClassId));
WsbAffirmHr(WsbSaveToStream(pStream, m_getCounter));
WsbAffirmHr(WsbSaveToStream(pStream, m_putCounter));
WsbAffirmHr(WsbSaveToStream(pStream, m_x1));
WsbAffirmHr(WsbSaveToStream(pStream, m_x2));
WsbAffirmHr(WsbSaveToStream(pStream, m_x3));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsChangerElement::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr);
}
HRESULT
CRmsChangerElement::Test(
OUT USHORT *pPassed,
OUT USHORT *pFailed
)
/*++
Implements:
IWsbTestable::Test
--*/
{
HRESULT hr = S_OK;
CComPtr<IRmsLibrary> pLibrary1;
CComPtr<IRmsLibrary> pLibrary2;
CComPtr<IPersistFile> pFile1;
CComPtr<IPersistFile> pFile2;
LONG i;
LONG longVal1 = 11111111;
LONG longWork1;
LONG longVal2 = 22222222;
LONG longWork2;
LONG longVal3 = 33333333;
LONG longWork3;
// DATE dateVal1;
// DATE dateWork1;
CLSID clsidVal1 = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
CLSID clsidWork1;
// CRmsLocator Fields
LONG locVal1 = 11111111;
GUID locVal2 = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
GUID locVal3 = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
LONG locVal4 = 44444444;
LONG locVal5 = 55555555;
LONG locVal6 = 66666666;
LONG locVal7 = 77777777;
BOOL locVal8 = TRUE;
LONG locWork1;
GUID locWork2;
GUID locWork3;
LONG locWork4;
LONG locWork5;
LONG locWork6;
LONG locWork7;
BOOL locWork8;
LONG mediaTable [RMSMAXMEDIATYPES] = { RmsMediaUnknown,
RmsMedia8mm,
RmsMedia4mm,
RmsMediaDLT,
RmsMediaOptical,
RmsMediaMO35,
RmsMediaWORM,
RmsMediaCDR,
RmsMediaDVD,
RmsMediaDisk,
RmsMediaFixed,
RmsMediaTape };
WsbTraceIn(OLESTR("CRmsChangerElement::Test"), OLESTR(""));
try {
// Get the Library interface.
hr = S_OK;
try {
WsbAssertHr(((IUnknown*) (IRmsLibrary*) this)->QueryInterface(IID_IRmsLibrary, (void**) &pLibrary1));
// Test GetElementNo
m_elementNo = longVal1;
GetElementNo(&longWork1);
if(longVal1 == longWork1){
(*pPassed)++;
} else {
(*pFailed)++;
}
// Test SetLocation & GetLocation
SetLocation( locVal1, locVal2, locVal3, locVal4,
locVal5, locVal6, locVal7, locVal8);
GetLocation( &locWork1, &locWork2, &locWork3, &locWork4,
&locWork5, &locWork6, &locWork7, &locWork8);
if((locVal1 == locWork1) &&
(locVal2 == locWork2) &&
(locVal3 == locWork3) &&
(locVal4 == locWork4) &&
(locVal5 == locWork5) &&
(locVal6 == locWork6) &&
(locVal7 == locWork7) &&
(locVal8 == locWork8)){
(*pPassed)++;
} else {
(*pFailed)++;
}
// Test SetMediaSupported & GetMediaSupported
for (i = 0; i < RMSMAXMEDIATYPES; i++){
longWork1 = mediaTable[i];
SetMediaSupported (longWork1);
GetMediaSupported (&longWork2);
if (longWork1 == longWork2){
(*pPassed)++;
} else {
(*pFailed)++;
}
}
// Test SetIsStorage & IsStorage to TRUE
hr = S_OK;
try{
WsbAffirmHr(SetIsStorage (TRUE));
WsbAffirmHr(IsStorage ());
} WsbCatch (hr);
if (hr == S_OK){
(*pPassed)++;
} else {
(*pFailed)++;
}
// Test SetIsStorage & IsStorage to FALSE
hr = S_OK;
try{
WsbAffirmHr(SetIsStorage (FALSE));
WsbAffirmHr(IsStorage ());
} WsbCatch (hr);
if (hr == S_OK){
(*pFailed)++;
} else {
(*pPassed)++;
}
// Test SetIsOccupied & IsOccupied to TRUE
hr = S_OK;
try{
WsbAffirmHr(SetIsOccupied (TRUE));
WsbAffirmHr(IsOccupied ());
} WsbCatch (hr);
if (hr == S_OK){
(*pPassed)++;
} else {
(*pFailed)++;
}
// Test SetIsOccupied & IsOccupied to FALSE
hr = S_OK;
try{
WsbAffirmHr(SetIsOccupied (FALSE));
WsbAffirmHr(IsOccupied ());
} WsbCatch (hr);
if (hr == S_OK){
(*pFailed)++;
} else {
(*pPassed)++;
}
// Test SetCartridge & GetCartridge
// Test SetOwnerClassId & GetOwnerClassId
SetOwnerClassId(clsidVal1);
GetOwnerClassId(&clsidWork1);
if(clsidVal1 == clsidWork1){
(*pPassed)++;
} else {
(*pFailed)++;
}
// Test SetAccessCounters & GetAccessCounters & ResetAccessCounters
m_getCounter = longVal1;
m_putCounter = longVal2;
GetAccessCounters(&longWork1, &longWork2);
if((longVal1 == longWork1) &&
(longVal2 == longWork2)){
(*pPassed)++;
} else {
(*pFailed)++;
}
ResetAccessCounters();
GetAccessCounters(&longWork1, &longWork2);
if((0 == longWork1) &&
(0 == longWork2)){
(*pPassed)++;
} else {
(*pFailed)++;
}
// Test GetResetCounterTimestamp
// Test GetLastGetTimestamp
// Test GetLastPutTimestamp
// Test SetCoordinates & GetCoordinates
SetCoordinates(longVal1, longVal2, longVal3);
GetCoordinates(&longWork1, &longWork2, &longWork3);
if((longVal1 == longWork1) &&
(longVal2 == longWork2) &&
(longVal3 == longWork3)){
(*pPassed)++;
} else {
(*pFailed)++;
}
} WsbCatch(hr);
// Tally up the results
hr = S_OK;
if (*pFailed) {
hr = S_FALSE;
}
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsChangerElement::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr);
}
CRmsChangerElement::~CRmsChangerElement(
void
)
/*++
Routine Description:
This is the destructor for the changer element class.
Arguments:
None.
Return Value:
None.
--*/
{
m_pCartridge = NULL;
}
/////////////////////////////////////////////////////////////////////////////
//
// IRmsChangerElement implementation
//
STDMETHODIMP
CRmsChangerElement::GetElementNo(
LONG *pElementNo
)
/*++
Implements:
IRmsChangerElement::GetElementNo
--*/
{
*pElementNo = m_elementNo;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetLocation(
LONG *pType,
GUID *pLibId,
GUID *pMediaSetId,
LONG *pPos,
LONG *pAlt1,
LONG *pAlt2,
LONG *pAlt3,
BOOL *pInvert)
/*++
Implements:
IRmsChangerElement::GetLocation
--*/
{
return m_location.GetLocation(pType, pLibId, pMediaSetId, pPos, pAlt1, pAlt2, pAlt3, pInvert);;
}
STDMETHODIMP
CRmsChangerElement::SetLocation(
LONG type,
GUID libId,
GUID mediaSetId,
LONG pos,
LONG alt1,
LONG alt2,
LONG alt3,
BOOL invert)
/*++
Implements:
IRmsChangerElement::SetLocation
--*/
{
m_location.SetLocation( type, libId, mediaSetId, pos,
alt1, alt2, alt3, invert );
// TODO: clean this up: pos, or m_elementNo, not both.
m_elementNo = pos;
// m_isDirty = TRUE;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetMediaSupported(
LONG *pType
)
/*++
Implements:
IRmsChangerElement::GetMediaSupported
--*/
{
*pType = m_mediaSupported;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::SetMediaSupported(
LONG type
)
/*++
Implements:
IRmsChangerElement::SetMediaSupported
--*/
{
m_mediaSupported = (RmsMedia) type;
// m_isDirty = TRUE;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::SetIsStorage(
BOOL flag
)
/*++
Implements:
IRmsChangerElement::SetIsStorage
--*/
{
m_isStorage = flag;
// m_isDirty = TRUE;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::IsStorage(
void
)
/*++
Implements:
IRmsChangerElement::IsStorage
--*/
{
HRESULT hr = S_FALSE;
if (m_isStorage){
hr = S_OK;
}
return (hr);
}
STDMETHODIMP
CRmsChangerElement::SetIsOccupied(
BOOL flag
)
/*++
Implements:
IRmsChangerElement::SetIsOccupied
--*/
{
m_isOccupied = flag;
if ( FALSE == m_isOccupied ) {
m_pCartridge = 0;
}
// m_isDirty = TRUE;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::IsOccupied(
void
)
/*++
Implements:
IRmsChangerElement::IsOccupied
--*/
{
HRESULT hr = S_FALSE;
if (m_isOccupied){
hr = S_OK;
}
return (hr);
}
STDMETHODIMP
CRmsChangerElement::GetCartridge(
IRmsCartridge **ptr)
/*++
Implements:
IRmsChangerElement::GetCartridge
--*/
{
HRESULT hr = S_OK;
try {
WsbAssertPointer(ptr);
*ptr = m_pCartridge;
m_pCartridge->AddRef();
} WsbCatch(hr);
return(hr);
}
STDMETHODIMP
CRmsChangerElement::SetCartridge(
IRmsCartridge *ptr)
/*++
Implements:
IRmsChangerElement::SetCartridge
--*/
{
HRESULT hr = S_OK;
try {
WsbAssertPointer(ptr);
m_pCartridge = ptr;
m_isOccupied = TRUE;
} WsbCatch(hr);
return(hr);
}
STDMETHODIMP
CRmsChangerElement::GetOwnerClassId(
CLSID *pClassId
)
/*++
Implements:
IRmsChangerElement::GetOwnerClassId
--*/
{
*pClassId = m_ownerClassId;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::SetOwnerClassId(
CLSID classId
)
/*++
Implements:
IRmsChangerElement::SetOwnerClassId
--*/
{
m_ownerClassId = classId;
// m_isDirty = TRUE;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetAccessCounters(
LONG *pGets,
LONG *pPuts
)
/*++
Implements:
IRmsChangerElement::GetAccessCounters
--*/
{
*pGets = m_getCounter;
*pPuts = m_putCounter;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::ResetAccessCounters(
void
)
/*++
Implements:
IRmsChangerElement::ResetAccessCounters
--*/
{
m_getCounter = 0;
m_putCounter = 0;
// m_resetCounterTimestamp = COleDatetime::GetCurrentTime();
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetResetCounterTimestamp(
DATE *pDate
)
/*++
Implements:
IRmsChangerElement::GetResetCounterTimestamp
--*/
{
*pDate = m_resetCounterTimestamp;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetLastGetTimestamp(
DATE *pDate
)
/*++
Implements:
IRmsChangerElement::GetLastGetTimestamp
--*/
{
*pDate = m_lastGetTimestamp;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetLastPutTimestamp(
DATE *pDate
)
/*++
Implements:
IRmsChangerElement::GetLastPutTimestamp
--*/
{
*pDate = m_lastPutTimestamp;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::GetCoordinates(
LONG *pX1,
LONG *pX2,
LONG *pX3
)
/*++
Implements:
IRmsChangerElement::GetCoordinates
--*/
{
*pX1 = m_x1;
*pX2 = m_x2;
*pX3 = m_x3;
return S_OK;
}
STDMETHODIMP
CRmsChangerElement::SetCoordinates(
LONG x1,
LONG x2,
LONG x3
)
/*++
Implements:
IRmsChangerElement::SetCoordinates
--*/
{
m_x1 = x1;
m_x2 = x2;
m_x3 = x3;
// m_isDirty = TRUE;
return S_OK;
}