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

988 lines
18 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:
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;
}