//+--------------------------------------------------------------------------- // // 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 #pragma hdrstop #include #include //+--------------------------------------------------------------------------- // // 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 )); } }