/*++ © 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 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 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 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 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 pLibrary1; CComPtr pLibrary2; CComPtr pFile1; CComPtr 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; }