|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved
Module Name:
RmsMdSet.cpp
Abstract:
Implementation of CRmsMediaSet
Author:
Brian Dodd [brian] 15-Nov-1996
Revision History:
--*/
#include "stdafx.h"
#include "RmsServr.h"
#include "RmsMdSet.h"
////////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CRmsMediaSet::CompareTo( IN IUnknown *pCollectable, OUT SHORT *pResult) /*++
Implements:
IWsbCollectable::CompareTo
--*/ { HRESULT hr = E_FAIL; SHORT result = 1;
WsbTraceIn( OLESTR("CRmsMediaSet::CompareTo"), OLESTR("") );
try {
// Validate arguments - Okay if pResult is NULL
WsbAssertPointer( pCollectable );
// We need the IRmsMediaSet interface to get the value of the object.
CComQIPtr<IRmsMediaSet, &IID_IRmsMediaSet> pMediaSet = pCollectable; WsbAssertPointer( pMediaSet );
CComQIPtr<IRmsComObject, &IID_IRmsComObject> pObject = pCollectable; WsbAssertPointer( pObject );
switch ( m_findBy ) {
case RmsFindByName: {
CWsbBstrPtr name;
WsbAffirmHr( pMediaSet->GetName( &name ) );
// Compare the names
result = (SHORT)wcscmp( m_Name, name ); hr = ( 0 == result ) ? S_OK : S_FALSE;
} break;
case RmsFindByMediaSupported: {
RmsMedia mediaSupported;
WsbAffirmHr(pMediaSet->GetMediaSupported( (LONG*) &mediaSupported ) );
if ( m_MediaSupported == mediaSupported ) {
// media types supported match
hr = S_OK; result = 0;
} else { hr = S_FALSE; result = 1; }
} break;
case RmsFindByMediaSetId: default:
// Do CompareTo for object
hr = CRmsComObject::CompareTo( pCollectable, &result ); break;
}
} WsbCatch( hr );
if ( SUCCEEDED(hr) && (0 != pResult) ){ *pResult = result; }
WsbTraceOut( OLESTR("CRmsMediaSet::CompareTo"), OLESTR("hr = <%ls>, result = <%ls>"), WsbHrAsString( hr ), WsbPtrToShortAsString( pResult ) );
return hr; }
HRESULT CRmsMediaSet::FinalConstruct(void) /*++
Implements:
CComObjectRoot::FinalConstruct
--*/ { HRESULT hr = S_OK;
try {
WsbAssertHr(CWsbObject::FinalConstruct());
// Initialize values
m_Name = RMS_UNDEFINED_STRING;
m_MediaSupported = RmsMediaUnknown;
m_SizeOfInfo = 0;
memset(m_Info, 0, MaxInfo);
m_OwnerId = CLSID_NULL;
m_MediaSetType = RmsMediaSetUnknown;
m_MaxCartridges = 0;
m_Occupancy = 0;
m_IsMediaCopySupported = FALSE;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::GetClassID( OUT CLSID* pClsid) /*++
Implements:
IPersist::GetClassID
--*/ { HRESULT hr = S_OK; WsbTraceIn(OLESTR("CRmsMediaSet::GetClassID"), OLESTR(""));
try {
WsbAssertPointer(pClsid);
*pClsid = CLSID_CRmsMediaSet;
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsMediaSet::GetClassID"), OLESTR("hr = <%ls>, CLSID = <%ls>"), WsbHrAsString(hr), WsbGuidAsString(*pClsid));
return hr; }
STDMETHODIMP CRmsMediaSet::GetSizeMax( OUT ULARGE_INTEGER* pcbSize) /*++
Implements:
IPersistStream::GetSizeMax
--*/ { HRESULT hr = E_NOTIMPL;
// ULONG nameLen;
WsbTraceIn(OLESTR("CRmsMediaSet::GetSizeMax"), OLESTR(""));
// try {
// WsbAssert(0 != pcbSize, E_POINTER);
// nameLen = SysStringByteLen(m_name);
// // Get max size
// pcbSize->QuadPart = WsbPersistSizeOf(LONG) + // m_objectId
// WsbPersistSizeOf(LONG) + // length of m_name
// nameLen + // m_name
// WsbPersistSizeOf(LONG) + // m_mediaSupported
// WsbPersistSizeOf(SHORT) + // m_sizeofInfo
// MaxInfo + // m_info
// WsbPersistSizeOf(CLSID) + // m_ownerId
// WsbPersistSizeOf(LONG) + // m_mediaSetType
// WsbPersistSizeOf(LONG) + // m_maxCartridges
// WsbPersistSizeOf(LONG); // m_occupancy
// } WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsMediaSet::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pcbSize));
return hr; }
STDMETHODIMP CRmsMediaSet::Load( IN IStream* pStream) /*++
Implements:
IPersistStream::Load
--*/ { HRESULT hr = S_OK; ULONG ulBytes = 0;
WsbTraceIn(OLESTR("CRmsMediaSet::Load"), OLESTR(""));
try { ULONG temp;
WsbAssertPointer(pStream);
WsbAffirmHr(CRmsStorageInfo::Load(pStream));
// Read value
WsbAffirmHr(WsbLoadFromStream(pStream, &m_objectId));
WsbAffirmHr(WsbLoadFromStream(pStream, &temp)); m_MediaSupported = (RmsMedia)temp;
WsbAffirmHr(WsbLoadFromStream(pStream, &m_SizeOfInfo));
WsbAffirmHr(WsbLoadFromStream(pStream, &(m_Info [0]), MaxInfo));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_OwnerId));
WsbAffirmHr(WsbLoadFromStream(pStream, &temp)); m_MediaSetType = (RmsMediaSet)temp;
WsbAffirmHr(WsbLoadFromStream(pStream, &m_MaxCartridges));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_Occupancy));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_IsMediaCopySupported));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsMediaSet::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return hr; }
STDMETHODIMP CRmsMediaSet::Save( IN IStream* pStream, IN BOOL clearDirty) /*++
Implements:
IPersistStream::Save
--*/ { HRESULT hr = S_OK; ULONG ulBytes = 0;
WsbTraceIn(OLESTR("CRmsMediaSet::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty));
try { WsbAssertPointer(pStream);
WsbAffirmHr(CRmsStorageInfo::Save(pStream, clearDirty));
// Write value
WsbAffirmHr(WsbSaveToStream(pStream, m_objectId));
WsbAffirmHr(WsbSaveToStream(pStream, (ULONG) m_MediaSupported));
WsbAffirmHr(WsbSaveToStream(pStream, m_SizeOfInfo));
WsbAffirmHr(WsbSaveToStream(pStream, &(m_Info [0]), MaxInfo));
WsbAffirmHr(WsbSaveToStream(pStream, m_OwnerId));
WsbAffirmHr(WsbSaveToStream(pStream, (ULONG) m_MediaSetType));
WsbAffirmHr(WsbSaveToStream(pStream, m_MaxCartridges));
WsbAffirmHr(WsbSaveToStream(pStream, m_Occupancy));
WsbAffirmHr(WsbSaveToStream(pStream, m_IsMediaCopySupported));
// Do we need to clear the dirty bit?
if (clearDirty) { m_isDirty = FALSE; } } WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsMediaSet::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return hr; }
STDMETHODIMP CRmsMediaSet::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;
GUID guidVal1 = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
GUID guidWork1; GUID guidWork2;
CLSID clsidWork1; CLSID clsidWork2;
LONG i; LONG longWork1; LONG longWork2;
CWsbBstrPtr bstrVal1 = OLESTR("5A5A5A");
CWsbBstrPtr bstrWork1; CWsbBstrPtr bstrWork2;
LONG mediaTable [RMSMAXMEDIATYPES] = { RmsMediaUnknown, RmsMedia8mm, RmsMedia4mm, RmsMediaDLT, RmsMediaOptical, RmsMediaMO35, RmsMediaWORM, RmsMediaCDR, RmsMediaDVD, RmsMediaDisk, RmsMediaFixed, RmsMediaTape };
WsbTraceIn(OLESTR("CRmsMediaSet::Test"), OLESTR(""));
try { // Get the MediaSet interface.
hr = S_OK; try { WsbAssertHr(((IUnknown*) (IRmsMediaSet*) this)->QueryInterface(IID_IRmsMediaSet, (void**) &pMediaSet1));
// Test SetMediaSetId & GetMediaSetId
m_objectId = guidVal1;
guidWork1 = m_objectId;
GetMediaSetId(&guidWork2);
if(guidWork1 == guidWork2){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetName & GetName interface
bstrWork1 = bstrVal1;
SetName(bstrWork1);
GetName(&bstrWork2);
if (bstrWork1 == bstrWork2){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetMediaSupported & GetMediaSupported
for (i = RmsMediaUnknown; i < RMSMAXMEDIATYPES; i++){
longWork1 = mediaTable[i];
SetMediaSupported (longWork1);
GetMediaSupported (&longWork2);
if (longWork1 == longWork2){ (*pPassed)++; } else { (*pFailed)++; } }
// Test SetInfo & GetInfo
// Test SetOwnerClassId & GetOwnerClassId
clsidWork1 = CLSID_NULL;
SetOwnerClassId(clsidWork1);
GetOwnerClassId(&clsidWork2);
if(clsidWork1 == clsidWork2){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetMediaSetType & GetMediaSetType
for (i = RmsMediaSetUnknown; i < RmsMediaSetNTMS; i++){
longWork1 = i;
SetMediaSetType (longWork1);
GetMediaSetType (&longWork2);
if (longWork1 == longWork2){ (*pPassed)++; } else { (*pFailed)++; } }
// Test SetMaxCartridges & GetMaxCartridges
longWork1 = 99;
SetMaxCartridges(longWork1);
GetMaxCartridges(&longWork2);
if(longWork1 == longWork2){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetOccupancy & GetOccupancy
longWork1 = 99;
SetOccupancy(longWork1);
GetOccupancy(&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("CRmsMediaSet::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return hr; }
STDMETHODIMP CRmsMediaSet::GetMediaSetId( OUT GUID *pMediaSetId) /*++
Implements:
IRmsMediaSet::GetMediaSetId
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pMediaSetId);
*pMediaSetId = m_objectId;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::GetName( OUT BSTR *pName) /*++
Implements:
IRmsMediaSet::GetName
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pName);
m_Name. CopyToBstr (pName);
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetName( IN BSTR name) /*++
Implements:
IRmsMediaSet::SetName
--*/ { m_Name = name; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::GetMediaSupported( OUT LONG *pType) /*++
Implements:
IRmsMediaSet::GetMediaSupported
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pType);
*pType = m_MediaSupported;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetMediaSupported( IN LONG type) /*++
Implements:
IRmsMediaSet::SetMediaSupported
--*/ { m_MediaSupported = (RmsMedia) type; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::GetInfo( OUT UCHAR *pInfo, OUT SHORT *pSize) /*++
Implements:
IRmsMediaSet::GetInfo
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pInfo); WsbAssertPointer (pSize);
memmove (pInfo, m_Info, m_SizeOfInfo ); *pSize = m_SizeOfInfo;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetInfo( IN UCHAR *pInfo, IN SHORT size) /*++
Implements:
IRmsMediaSet::SetInfo
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pInfo);
memmove (m_Info, pInfo, size); m_SizeOfInfo = size; m_isDirty = TRUE;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::GetOwnerClassId( OUT CLSID *pClassId) /*++
Implements:
IRmsMediaSet::GetOwnerClassId
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pClassId);
*pClassId = m_OwnerId;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetOwnerClassId( IN CLSID classId) /*++
Implements:
IRmsMediaSet::SetOwnerClassId
--*/ { m_OwnerId = classId; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::GetMediaSetType( OUT LONG *pType) /*++
Implements:
IRmsMediaSet::GetMediaSetType
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pType);
*pType = m_MediaSetType;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetMediaSetType( IN LONG type) /*++
Implements:
IRmsMediaSet::SetMediaSetType
--*/ { m_MediaSetType = (RmsMediaSet) type; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::GetMaxCartridges( OUT LONG *pNum) /*++
Implements:
IRmsMediaSet::GetMaxCartridges
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pNum);
*pNum = m_MaxCartridges;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetMaxCartridges( IN LONG num) /*++
Implements:
IRmsMediaSet::SetMaxCartridges
--*/ { m_MaxCartridges = num; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::GetOccupancy( OUT LONG *pNum) /*++
Implements:
IRmsMediaSet::GetOccupancy
--*/ { HRESULT hr = S_OK;
try { WsbAssertPointer (pNum);
*pNum = m_Occupancy;
} WsbCatch(hr);
return hr; }
STDMETHODIMP CRmsMediaSet::SetOccupancy( IN LONG num) /*++
Implements:
IRmsMediaSet::SetOccupancy
--*/ { m_Occupancy = num; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::IsMediaCopySupported(void) /*++
Implements:
IRmsMediaSet::IsMediaCopySupported
--*/ { HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CRmsMediaSet::IsMediaCopySupported"), OLESTR(""));
try {
if (RmsMediaSetNTMS == m_MediaSetType) {
CComQIPtr<IRmsServer, &IID_IRmsServer> pServer = g_pServer; CComPtr<IRmsNTMS> pNtms; WsbAffirmHr(pServer->GetNTMS(&pNtms)); WsbAffirmPointer(pNtms);
m_IsMediaCopySupported = (S_OK == pNtms->IsMediaCopySupported(m_objectId)) ? TRUE : FALSE; }
hr = ( m_IsMediaCopySupported ) ? S_OK : S_FALSE;
} WsbCatch(hr)
WsbTraceOut(OLESTR("CRmsMediaSet::IsMediaCopySupported"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return hr; }
STDMETHODIMP CRmsMediaSet::SetIsMediaCopySupported( IN BOOL flag) /*++
Implements:
IRmsMediaSet::SetIsMediaCopySupported
--*/ { m_IsMediaCopySupported = flag; m_isDirty = TRUE; return S_OK; }
STDMETHODIMP CRmsMediaSet::Allocate( IN REFGUID prevSideId, IN OUT LONGLONG *pFreeSpace, IN BSTR displayName, IN DWORD dwOptions, OUT IRmsCartridge **ppCart) /*++
Implements:
IRmsMediaSet::Allocate
--*/ {
HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CRmsMediaSet::Allocate"), OLESTR("<%ls> <%ls> <0x%08x>"), WsbQuickString(WsbPtrToStringAsString((WCHAR **)&displayName)), WsbQuickString(WsbPtrToLonglongAsString(pFreeSpace)), dwOptions );
try { WsbAssertPointer(ppCart);
CComQIPtr<IRmsServer, &IID_IRmsServer> pServer = g_pServer;
switch (m_MediaSetType) { case RmsMediaSetLibrary: { CComPtr<IWsbIndexedCollection> pCarts; CComPtr<IRmsCartridge> pFindCart;
// Get the cartridge collection
WsbAffirmHr(pServer->GetCartridges(&pCarts));
// Create a cartridge template
WsbAffirmHr(CoCreateInstance(CLSID_CRmsCartridge, 0, CLSCTX_SERVER, IID_IRmsCartridge, (void **)&pFindCart));
// Fill in the find template
// Using FindByScratchMediaCriteria
CComQIPtr<IRmsComObject, &IID_IRmsComObject> pObject = pFindCart; WsbAssertHr(pObject->SetFindBy(RmsFindByScratchMediaCriteria));
// Scratch selection criteria
WsbAssertHr(pFindCart->SetStatus(RmsStatusScratch)); WsbAssertHr(pFindCart->SetLocation(RmsElementUnknown, GUID_NULL, m_objectId, 0, 0, 0, 0, FALSE));
// Now find the cartridge
hr = pCarts->Find(pFindCart, IID_IRmsCartridge, (void **)ppCart); if (WSB_E_NOTFOUND == hr) { WsbThrow(RMS_E_SCRATCH_NOT_FOUND_FINAL); } WsbAffirmHr(hr);
// Set media name and description to display name
WsbAffirmPointer(*ppCart); WsbAffirmHr((*ppCart)->SetName(displayName)); WsbAffirmHr((*ppCart)->SetDescription(displayName)); } break; case RmsMediaSetNTMS: { CComPtr<IRmsNTMS> pNtms; WsbAffirmHr(pServer->GetNTMS(&pNtms)); WsbAffirmHr(pNtms->Allocate(m_objectId, prevSideId, pFreeSpace, displayName, dwOptions, ppCart)); } break; case RmsMediaSetShelf: case RmsMediaSetOffSite: case RmsMediaSetFolder: case RmsMediaSetUnknown: default: WsbThrow(E_UNEXPECTED); break; }
(void) InterlockedIncrement(&m_Occupancy);
} WsbCatch(hr)
WsbTraceOut(OLESTR("CRmsMediaSet::Allocate"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return hr;
}
STDMETHODIMP CRmsMediaSet::Deallocate( IN IRmsCartridge *pCart) /*++
Implements:
IRmsMediaSet::Deallocate
--*/ {
HRESULT hr = S_OK;
WsbTraceIn(OLESTR("CRmsMediaSet::Deallocate"), OLESTR(""));
try { WsbAssertPointer (pCart);
CComQIPtr<IRmsServer, &IID_IRmsServer> pServer = g_pServer;
switch (m_MediaSetType) { case RmsMediaSetLibrary: { WsbAffirmHr(pCart->SetStatus(RmsStatusScratch)); } break; case RmsMediaSetNTMS: { CComPtr<IRmsNTMS> pNtms; WsbAffirmHr(pServer->GetNTMS(&pNtms)); WsbAffirmHr(pNtms->Deallocate(pCart)); } break; case RmsMediaSetShelf: case RmsMediaSetOffSite: case RmsMediaSetFolder: case RmsMediaSetUnknown: default: WsbThrow(E_UNEXPECTED); break; }
(void) InterlockedDecrement(&m_Occupancy);
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsMediaSet::Deallocate"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return hr;
}
|