mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1049 lines
20 KiB
1049 lines
20 KiB
/*++
|
|
|
|
© 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;
|
|
|
|
}
|