Windows2003-3790/inetsrv/query/cifrmcom/frmutils.cxx
2020-09-30 16:53:55 +02:00

269 lines
7.3 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1998.
//
// File: frmutils.cxx
//
// Contents: Utility classes and functions for the frame work and
// client code.
//
// History: 12-09-96 srikants Created
// 20-Nov-98 KLam Removed CDiskFreeStatus::GetDiskSpace
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <frmutils.hxx>
#include <sstream.hxx>
//+---------------------------------------------------------------------------
//
// Member: CDiskFreeStatus::UpdateDiskLowInfo
//
// Synopsis: Updates disk low state information by checking the
// disk free space situation.
//
// History: 12-09-96 srikants Created
// 20-Nov-98 KLam Call disk info GetDiskSpace
//
//----------------------------------------------------------------------------
void CDiskFreeStatus::UpdateDiskLowInfo()
{
__int64 diskTotal, diskRemaining;
_driveInfo.GetDiskSpace( diskTotal, diskRemaining );
BOOL fLowOnDisk = FALSE;
if ( !_fIsLow )
{
fLowOnDisk = diskRemaining < lowDiskWaterMark;
}
else
{
fLowOnDisk = diskRemaining < highDiskWaterMark;
}
//
// It is okay to read it without mutex as it is only a heuristic.
//
if ( fLowOnDisk && !_fIsLow )
{
ciDebugOut(( DEB_WARN, "****YOU ARE RUNNING LOW ON DISK SPACE****\n"));
ciDebugOut(( DEB_WARN, "****PLEASE FREE UP SOME SPACE ****\n"));
}
else if ( _fIsLow && !fLowOnDisk )
{
ciDebugOut(( DEB_WARN, "****DISK SPACE FREED UP ****\n"));
}
_fIsLow = fLowOnDisk;
}
//+---------------------------------------------------------------------------
//
// Function: AllocHeapAndCopy
//
// Synopsis: Allocates memory from heap and copies the source string into
// the destination buffer. The destination buffer ownership
// is given to the caller.
//
// Arguments: [pSrc] - [in] source string.
// [cc] - [out] Number of characters in the string, excluding the
// terminating NULL.
//
// History: 12-11-96 srikants Created
//
//----------------------------------------------------------------------------
WCHAR * AllocHeapAndCopy( WCHAR const * pSrc, ULONG & cc )
{
WCHAR * pDst = 0;
if ( 0 != pSrc )
{
cc = wcslen( pSrc );
pDst = new WCHAR [cc+1];
RtlCopyMemory( pDst, pSrc, (cc+1)*sizeof(WCHAR) );
}
else
{
cc = 0;
}
return pDst;
}
//+---------------------------------------------------------------------------
//
// Function: PutWString
//
// Synopsis: Serializes the given WCHAR string into the serializer.
//
// Arguments: [stm] - Serializer
// [pwszStr] - String to serialize.
//
// History: 12-11-96 srikants Created
//
//----------------------------------------------------------------------------
void PutWString( PSerStream & stm, WCHAR const * pwszStr )
{
ULONG cwc = (0 != pwszStr) ? wcslen( pwszStr ) : 0;
stm.PutULong( cwc );
if (cwc)
stm.PutWChar( pwszStr, cwc );
}
//+---------------------------------------------------------------------------
//
// Function: AllocHeapAndGetWString
//
// Synopsis: DeSerizlizes a WCHAR string from the deserializer, allocates
// memory and copies the string into it.
//
// Arguments: [stm] - DeSerializer Stream
//
// Returns: NULL if there was no string
//
// History: 12-11-96 srikants Created
//
//----------------------------------------------------------------------------
WCHAR * AllocHeapAndGetWString( PDeSerStream & stm )
{
ULONG cwc = stm.GetULong();
// Guard against attack
if ( 0 == cwc || cwc > 65536 )
{
return 0;
}
WCHAR * pwszStr = new WCHAR [cwc+1];
stm.GetWChar( pwszStr, cwc );
pwszStr[cwc] = L'\0';
return pwszStr;
}
//+---------------------------------------------------------------------------
//
// Function : CFwPerfTime::CFwPerfTime
//
// Purpose : Constructor
//
// Arguments : [SizeDivisor] -- Raw (byte) size divided by this.
// [TimeMultiplier] -- Raw (millisecond) time multiplied by this.
//
// History : 23-Mar-94 t-joshh Created
// 31-Jan-95 KyleP Added unit adjustment
// 06-Jan-97 Srikants Adapted to framework
//
//----------------------------------------------------------------------------
CFwPerfTime::CFwPerfTime ( ICiCAdviseStatus * pAdviseStatus,
CI_PERF_COUNTER_NAME name,
int SizeDivisor, int TimeMultiplier )
: _llSizeDivisor( SizeDivisor ),
_llTimeMultiplier( TimeMultiplier ),
_counterVal(0),
_name(name),
_pAdviseStatus(pAdviseStatus)
{
_liStartTime.QuadPart = 0;
Win4Assert( _llSizeDivisor > 0 );
Win4Assert( _llTimeMultiplier > 0 );
}
//+---------------------------------------------------------------------------
//
// Function : CFwPerfTime::TStart
//
// Purpose : Start counting the time
//
// Arguments : none
//
// History : 23-March-94 t-joshh Created
//
//----------------------------------------------------------------------------
void CFwPerfTime::TStart ()
{
_liStartTime.LowPart = GetTickCount();
}
//+---------------------------------------------------------------------------
//
// Function : CFwPerfTime::TStop
//
// Purpose : Stop counting the time and evaluate the result
//
// Arguments : [dwValue]
//
// History : 23-March-94 t-joshh Created
//
//----------------------------------------------------------------------------
void CFwPerfTime::TStop( DWORD dwValue )
{
LARGE_INTEGER liStop;
liStop.LowPart = GetTickCount();
ULONG ulDiff = liStop.LowPart - _liStartTime.LowPart;
LARGE_INTEGER liVal;
//
// If the time difference is negative, then use the value from
// the perfmon data.
//
if ( ulDiff <= 0 )
{
SCODE sc = _pAdviseStatus->GetPerfCounterValue( _name, &_counterVal );
if ( FAILED(sc) )
{
ciDebugOut(( DEB_ERROR, "GetPerfCounterValue failed (0x%X)\n",
sc ));
return;
}
}
if ( dwValue > 0 )
{
if ( ulDiff > 0 )
liVal.QuadPart = dwValue / ulDiff;
else
liVal.QuadPart = _counterVal * _llSizeDivisor / _llTimeMultiplier;
}
else
{
if ( ulDiff > 0 )
liVal.QuadPart = ulDiff;
else
liVal.QuadPart = _counterVal * _llSizeDivisor / _llTimeMultiplier;
}
liVal.QuadPart = liVal.QuadPart * _llTimeMultiplier / _llSizeDivisor;
Win4Assert( liVal.HighPart == 0 );
_counterVal = liVal.LowPart;
SCODE sc = _pAdviseStatus->SetPerfCounterValue( _name, _counterVal );
if ( FAILED(sc) )
{
ciDebugOut(( DEB_ERROR, "SetPerfCounterValue failed (0x%X)\n",
sc ));
}
}