|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved
Module Name:
RmsSInfo.cpp
Abstract:
Implementation of CRmsStorageInfo
Author:
Brian Dodd [brian] 15-Nov-1996
Revision History:
--*/
#include "stdafx.h"
#include "RmsSInfo.h"
extern IUnknown *g_pServer;
/////////////////////////////////////////////////////////////////////////////
//
// IRmsStorageInfo implementation
//
CRmsStorageInfo::CRmsStorageInfo( void ) /*++
Routine Description:
CRmsStorageInfo constructor
Arguments:
None
Return Value:
None
--*/ { // Initialize values
m_readMountCounter = 0;
m_writeMountCounter = 0;
m_bytesWrittenCounter = 0;
m_bytesReadCounter = 0;
m_capacity = 0;
m_usedSpace = 0;
m_largestFreeSpace = -1;
m_resetCounterTimestamp = 0;
m_lastReadTimestamp = 0;
m_lastWriteTimestamp = 0;
m_createdTimestamp = 0; }
HRESULT CRmsStorageInfo::CompareTo( IN IUnknown *pCollectable, OUT SHORT *pResult ) /*++
Implements:
CRmsStorageInfo::CompareTo
--*/ { HRESULT hr = E_FAIL; SHORT result = 1;
WsbTraceIn( OLESTR("CRmsStorageInfo::CompareTo"), OLESTR("") );
try {
// Validate arguments - Okay if pResult is NULL
WsbAssertPointer( pCollectable );
CComQIPtr<IRmsComObject, &IID_IRmsComObject> pObject = pCollectable; WsbAssertPointer( pObject );
switch ( m_findBy ) {
case RmsFindByUnknown: default:
// What default makes sense?
WsbAssertHr( E_UNEXPECTED ); break;
}
} WsbCatch(hr);
if ( 0 != pResult ) { *pResult = result; }
WsbTraceOut(OLESTR("CRmsStorageInfo::CompareTo"), OLESTR("hr = <%ls>, result = <%ls>"), WsbHrAsString(hr), WsbPtrToShortAsString(pResult));
return(hr); }
HRESULT CRmsStorageInfo::GetSizeMax( OUT ULARGE_INTEGER* pcbSize ) /*++
Implements:
IPersistStream::GetSizeMax
--*/ { HRESULT hr = E_NOTIMPL;
WsbTraceIn(OLESTR("CRmsStorageInfo::GetSizeMax"), OLESTR(""));
// try {
// WsbAssert(0 != pcbSize, E_POINTER);
// // Get max size
// pcbSize->QuadPart = WsbPersistSizeOf(LONG) + // m_readMountCounter
// WsbPersistSizeOf(LONG) + // m_writeMountCounter
// WsbPersistSizeOf(LONGLONG) + // m_bytesWrittenCounter
// WsbPersistSizeOf(LONGLONG) + // m_bytesReadCounter
// WsbPersistSizeOf(LONGLONG) + // m_capacity
// WsbPersistSizeOf(LONGLONG) + // m_usedSpace
// WsbPersistSizeOf(LONGLONG) + // m_largestFreeSpace
// WsbPersistSizeOf(DATE) + // m_resetCounterTimestamp
// WsbPersistSizeOf(DATE) + // m_lastReadTimestamp
// WsbPersistSizeOf(DATE) + // m_lastWriteTimestamp
// WsbPersistSizeOf(DATE); // m_createdTimestamp
// } WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsStorageInfo::GetSizeMax"), OLESTR("hr = <%ls>, Size = <%ls>"), WsbHrAsString(hr), WsbPtrToUliAsString(pcbSize));
return(hr); }
HRESULT CRmsStorageInfo::Load( IN IStream* pStream ) /*++
Implements:
IPersistStream::Load
--*/ { HRESULT hr = S_OK; ULONG ulBytes = 0;
WsbTraceIn(OLESTR("CRmsStorageInfo::Load"), OLESTR(""));
try {
WsbAssert(0 != pStream, E_POINTER);
WsbAffirmHr(CRmsComObject::Load(pStream));
// Read value
WsbAffirmHr(WsbLoadFromStream(pStream, &m_readMountCounter));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_writeMountCounter));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_bytesWrittenCounter));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_bytesReadCounter));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_capacity));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_usedSpace));
WsbAffirmHr(WsbLoadFromStream(pStream, &m_largestFreeSpace));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsStorageInfo::Load"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CRmsStorageInfo::Save( IN IStream* pStream, IN BOOL clearDirty ) /*++
Implements:
IPersistStream::Save
--*/ { HRESULT hr = S_OK; ULONG ulBytes = 0;
WsbTraceIn(OLESTR("CRmsStorageInfo::Save"), OLESTR("clearDirty = <%ls>"), WsbBoolAsString(clearDirty));
try { WsbAssert(0 != pStream, E_POINTER);
WsbAffirmHr(CRmsComObject::Save(pStream, clearDirty));
// Write value
WsbAffirmHr(WsbSaveToStream(pStream, m_readMountCounter)); WsbAffirmHr(WsbSaveToStream(pStream, m_writeMountCounter));
WsbAffirmHr(WsbSaveToStream(pStream, m_bytesWrittenCounter));
WsbAffirmHr(WsbSaveToStream(pStream, m_bytesReadCounter));
WsbAffirmHr(WsbSaveToStream(pStream, m_capacity));
WsbAffirmHr(WsbSaveToStream(pStream, m_usedSpace));
WsbAffirmHr(WsbSaveToStream(pStream, m_largestFreeSpace));
// WsbAffirmHr(WsbSaveToStream(pStream, m_resetCounterTimestamp));
// WsbAffirmHr(WsbSaveToStream(pStream, m_lastReadTimestamp));
// WsbAffirmHr(WsbSaveToStream(pStream, m_lastWriteTimestamp));
// WsbAffirmHr(WsbSaveToStream(pStream, m_createdTimestamp));
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsStorageInfo::Save"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr); }
HRESULT CRmsStorageInfo::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;
LONG longHiVal1 = 12345; LONG longLoVal1 = 67890;
LONG longHiWork1; LONG longLoWork1;
LONG longVal1 = 11111111; LONG longWork1;
LONG longVal2 = 22222222; LONG longWork2;
LONGLONG longLongVal1 = 1111111111111111; LONGLONG longLongWork1;
LONG cntBase = 100000; LONG cntIncr = 25;
// DATE dateVal1 = today;
DATE dateVal1 = 0; // DATE dateWork1;
WsbTraceIn(OLESTR("CRmsStorageInfo::Test"), OLESTR(""));
try { // Get the MediaSet interface.
hr = S_OK; try { WsbAssertHr(((IUnknown*) (IRmsMediaSet*) this)->QueryInterface(IID_IRmsMediaSet, (void**) &pMediaSet1));
// Test GetMountCounters
ResetCounters();
GetMountCounters(&longWork1, &longWork2);
if((longVal1 == 0) && (longVal2 == 0)){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetBytesRead & GetBytesRead
SetBytesRead(longLongVal1);
GetBytesRead(&longLongWork1);
if((longLongVal1 == longLongWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetBytesRead2 & GetBytesRead2
SetBytesRead2(longHiVal1, longLoVal1);
GetBytesRead2(&longHiWork1, &longLoWork1);
if((longHiVal1 == longHiWork1) && (longLoVal1 == longLoWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test IncrementBytesRead
for(i = 0; i < 500; i += cntIncr){ SetBytesRead(cntBase + i);
IncrementBytesRead(cntIncr);
GetBytesRead(&longLongWork1);
if (longLongWork1 == (cntBase + i + cntIncr)){ (*pPassed)++; } else { (*pFailed)++; } }
// Test SetBytesWritten & GetBytesWritten
SetBytesWritten(longLongVal1);
GetBytesWritten(&longLongWork1);
if((longLongVal1 == longLongWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test SetBytesWritten2 & GetBytesWritten2
SetBytesWritten2(longHiVal1, longLoVal1);
GetBytesWritten2(&longHiWork1, &longLoWork1);
if((longHiVal1 == longHiWork1) && (longLoVal1 == longLoWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test IncrementBytesWritten
for(i = 0; i < 500; i += cntIncr){ SetBytesWritten(cntBase + i);
IncrementBytesWritten(cntIncr);
GetBytesWritten(&longLongWork1);
if (longLongWork1 == (cntBase + i + cntIncr)){ (*pPassed)++; } else { (*pFailed)++; } }
// Test GetCapacity
m_capacity = longLongVal1;
GetCapacity(&longLongWork1);
if((longLongVal1 == longLongWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test GetCapacity2
m_capacity = (LONGLONG) (longHiVal1 << 32) + longLoVal1;
GetCapacity2(&longHiWork1, &longLoWork1);
if((longHiVal1 == longHiWork1) && (longLoVal1 == longLoWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test GetUsedSpace
m_usedSpace = longLongVal1;
GetUsedSpace(&longLongWork1);
if((longLongVal1 == longLongWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test GetUsedSpace2
m_usedSpace = (LONGLONG) (longHiVal1 << 32) + longLoVal1;
GetUsedSpace2(&longHiWork1, &longLoWork1);
if((longHiVal1 == longHiWork1) && (longLoVal1 == longLoWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test GetLargestFreeSpace
m_largestFreeSpace = longLongVal1;
GetLargestFreeSpace(&longLongWork1);
if((longLongVal1 == longLongWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Test GetLargestFreeSpace2
m_largestFreeSpace = (LONGLONG) (longHiVal1 << 32) + longLoVal1;
GetLargestFreeSpace2(&longHiWork1, &longLoWork1);
if((longHiVal1 == longHiWork1) && (longLoVal1 == longLoWork1)){ (*pPassed)++; } else { (*pFailed)++; }
// Handle all date stamp values
} WsbCatch(hr);
// Tally up the results
hr = S_OK;
if (*pFailed) { hr = S_FALSE; }
} WsbCatch(hr);
WsbTraceOut(OLESTR("CRmsStorageInfo::Test"), OLESTR("hr = <%ls>"), WsbHrAsString(hr));
return(hr); }
STDMETHODIMP CRmsStorageInfo::GetMountCounters( LONG *pReads, LONG *pWrites ) /*++
Implements:
IRmsStorageInfo::GetMountcounters
--*/ { *pReads = m_readMountCounter; *pWrites = m_writeMountCounter; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetBytesRead2( LONG *pReadHi, LONG *pReadLo ) /*++
Implements:
IRmsStorageInfo::GetBytesRead2
--*/ { *pReadHi = (LONG) (m_bytesReadCounter >> 32); *pReadLo = (LONG) (m_bytesReadCounter & 0x00000000FFFFFFFF); return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetBytesRead( LONGLONG *pRead ) /*++
Implements:
IRmsStorageInfo::GetBytesRead
--*/ { *pRead = m_bytesReadCounter; return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetBytesRead2( LONG readHi, LONG readLo ) /*++
Implements:
IRmsStorageInfo::SetBytesRead2
--*/ { m_bytesReadCounter = (LONGLONG) (readHi << 32) + (readLo); // m_isDirty = TRUE;
return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetBytesRead( LONGLONG read ) /*++
Implements:
IRmsStorageInfo::SetBytesRead
--*/ { m_bytesReadCounter = read; // m_isDirty = TRUE;
return S_OK; }
STDMETHODIMP CRmsStorageInfo::IncrementBytesRead( LONG val ) /*++
Implements:
IRmsStorageInfo::IncrementBytesRead
--*/ { m_bytesReadCounter += val; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetBytesWritten2( LONG *pWriteHi, LONG *pWriteLo ) /*++
Implements:
IRmsStorageInfo::GetBytesWritten2
--*/ { *pWriteHi = (LONG) (m_bytesWrittenCounter >> 32); *pWriteLo = (LONG) (m_bytesWrittenCounter & 0x00000000FFFFFFFF); return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetBytesWritten( LONGLONG *pWritten ) /*++
Implements:
IRmsStorageInfo::GetBytesWritten
--*/ { *pWritten = m_bytesWrittenCounter; return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetBytesWritten2( LONG writeHi, LONG writeLo ) /*++
Implements:
IRmsStorageInfo::SetBytesWritten2
--*/ { m_bytesWrittenCounter = (LONGLONG) (writeHi << 32) + (writeLo); // m_isDirty = TRUE;
return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetBytesWritten( LONGLONG written ) /*++
Implements:
IRmsStorageInfo::SetBytesWritten
--*/ { m_bytesWrittenCounter = written; // m_isDirty = TRUE;
return S_OK; }
STDMETHODIMP CRmsStorageInfo::IncrementBytesWritten( LONG val ) /*++
Implements:
IRmsStorageInfo::IncrementBytesWritten
--*/ { //WsbTraceIn( OLESTR("CRmsStorageInfo::IncrementBytesWritten"), OLESTR("<%d>"), val );
m_bytesWrittenCounter += val; m_usedSpace +=val;
if (m_largestFreeSpace > 0) { // Decrement written bytes from free space
m_largestFreeSpace -= val; if (m_largestFreeSpace < 0) { // Indicates inaccurate calulation of free space...
WsbTraceAlways(OLESTR("CRmsStorageInfo::IncrementBytesWritten: Negative free space decrementing %ld bytes\n"), val); m_largestFreeSpace = 0; }
} else { if (m_largestFreeSpace < 0) { // Not expected - somebody is trying to start counting free space
// without setting an appropriate initial value
WsbTraceAlways(OLESTR("CRmsStorageInfo::IncrementBytesWritten: Was called before setting initial free space !!\n"), val); m_largestFreeSpace = 0; } }
/*** // Decrement the free space acordingly.
m_largestFreeSpace *= (m_largestFreeSpace > 0) ? 1 : -1; // Absolute value
m_largestFreeSpace -= val;
// if we go negative here, we simply set the free space to zero;
// otherwise we set the value negative to indicate an
// approximation.
m_largestFreeSpace *= (m_largestFreeSpace > 0) ? -1 : 0; ***/
//WsbTrace( OLESTR("FreeSpace=%I64d, UsedSpace=%I64d, BytesWritten=%I64d\n"), m_largestFreeSpace, m_usedSpace, m_bytesWrittenCounter);
//WsbTraceOut(OLESTR("CRmsStorageInfo::IncrementBytesWritten"), OLESTR("hr = <%ls>"), WsbHrAsString(S_OK));
return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetCapacity2( LONG *pCapHi, LONG *pCapLo ) /*++
Implements:
IRmsStorageInfo::GetCapacity2
--*/ { *pCapHi = (LONG) (m_capacity >> 32); *pCapLo = (LONG) (m_capacity & 0x00000000FFFFFFFF); return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetCapacity( LONGLONG *pCap ) /*++
Implements:
IRmsStorageInfo::GetCapacity
--*/ { *pCap = m_capacity; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetUsedSpace2( LONG *pFreeHi, LONG *pFreeLo ) /*++
Implements:
IRmsStorageInfo::GetUsedSpace2
--*/ { *pFreeHi = (LONG) (m_usedSpace >> 32); *pFreeLo = (LONG) (m_usedSpace & 0x00000000FFFFFFFF); return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetUsedSpace( LONGLONG *pFree ) /*++
Implements:
IRmsStorageInfo::GetUsedSpace
--*/ { *pFree = m_usedSpace; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetLargestFreeSpace2( LONG *pFreeHi, LONG *pFreeLo ) /*++
Implements:
IRmsStorageInfo::GetLargestFreeSpace2
--*/ { // Negative numbers indicate last known value for free space.
*pFreeHi = (LONG) (m_largestFreeSpace >> 32); *pFreeLo = (LONG) (m_largestFreeSpace & 0x00000000FFFFFFFF); return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetLargestFreeSpace( LONGLONG *pFree ) /*++
Implements:
IRmsStorageInfo::GetLargestFreeSpace
--*/ { // Negative numbers indicate last known value for free space.
*pFree = m_largestFreeSpace; return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetCapacity( IN LONGLONG cap) /*++
Implements:
IRmsStorageInfo::SetCapacity
--*/ { m_capacity = cap; return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetUsedSpace( IN LONGLONG used) /*++
Implements:
IRmsStorageInfo::SetUsedSpace
--*/ { m_usedSpace = used; return S_OK; }
STDMETHODIMP CRmsStorageInfo::SetFreeSpace( IN LONGLONG free) /*++
Implements:
IRmsStorageInfo::SetFreeSpace
--*/ { m_largestFreeSpace = free;
return S_OK; }
STDMETHODIMP CRmsStorageInfo::ResetCounters( void ) /*++
Implements:
IRmsStorageInfo::ResetCounters
--*/ { m_readMountCounter = 0; m_writeMountCounter = 0; m_bytesWrittenCounter = 0; m_bytesReadCounter = 0;
// m_resetCounterTimestamp = COleDateTime::GetCurrentTime();
// m_isDirty = TRUE;
return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetResetCounterTimestamp( DATE *pDate ) /*++
Implements:
IRmsStorageInfo::GetResetCounterTimestamp
--*/ { *pDate = m_resetCounterTimestamp; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetLastReadTimestamp( DATE *pDate ) /*++
Implements:
IRmsStorageInfo::GetLastReadTimestamp
--*/ { *pDate = m_lastReadTimestamp; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetLastWriteTimestamp( DATE *pDate ) /*++
Implements:
IRmsStorageInfo::GetLastWriteTimestamp
--*/ { *pDate = m_lastWriteTimestamp; return S_OK; }
STDMETHODIMP CRmsStorageInfo::GetCreatedTimestamp( DATE *pDate ) /*++
Implements:
IRmsStorageInfo::GetCreatedTimestamp
--*/ { *pDate = m_createdTimestamp; return S_OK; }
|