|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000
//
// File: Util.h
//
// Contents: Generic utility functions and classes for dscmd
//
// History: 01-Oct-2000 JeffJon Created
//
//--------------------------------------------------------------------------
#ifndef _UTIL_H_
#define _UTIL_H_
#ifdef DBG
//+--------------------------------------------------------------------------
//
// Class: CDebugSpew
//
// Purpose: Signifies whether to spew debug output on checked builds or not
//
// History: 01-Oct-2000 JeffJon Created
//
//---------------------------------------------------------------------------
class CDebugSpew { public: //
// Constructor/Destructor
//
CDebugSpew() : m_nDebugLevel(0), m_nIndent(0) {}
~CDebugSpew() {}
//
// Public data accessors
//
void SetDebugLevel(UINT nDebugLevel) { m_nDebugLevel = nDebugLevel; } UINT GetDebugLevel() { return m_nDebugLevel; } bool IsDebugEnabled() const { return (m_nDebugLevel > 0); }
void SpewHeader();
void EnterFunction(UINT nLevel, PCWSTR pszFunction); void LeaveFunction(UINT nLevel, PCWSTR pszFunction); void LeaveFunctionHr(UINT nLevel, PCWSTR pszFunction, HRESULT hr); void Output(UINT nLevel, PCWSTR pszOutput, ...);
private: //
// Private data accessors
//
void Indent() { m_nIndent += TAB; } void Outdent() { (m_nIndent >= TAB) ? m_nIndent -= TAB : m_nIndent = 0; } UINT GetIndent() { return m_nIndent; }
//
// Private data
//
//
// This should always be in the range of 0 - 10 where zero is no debug output
// and 10 is complete output
//
UINT m_nDebugLevel; UINT m_nIndent;
static const UINT TAB = 3; };
//
// Globals
//
extern CDebugSpew DebugSpew;
//+--------------------------------------------------------------------------
//
// Class: CFunctionSpew
//
// Purpose: Object which outputs the "Enter function" debug spew on creation
// and outputs the "Leave function" debug spew on destruction
//
// History: 07-Dec-2000 JeffJon Created
//
//---------------------------------------------------------------------------
class CFunctionSpew { public: //
// Constructor/Destructor
//
CFunctionSpew(UINT nDebugLevel, PCWSTR pszFunctionName) : m_nDebugLevel(nDebugLevel), m_pszFunctionName(pszFunctionName), m_bLeaveAlreadyWritten(false) { ASSERT(pszFunctionName); DebugSpew.EnterFunction(nDebugLevel, pszFunctionName); }
virtual ~CFunctionSpew() { if (!IsLeaveAlreadyWritten()) { DebugSpew.LeaveFunction(GetDebugLevel(), GetFunctionName()); } }
protected: PCWSTR GetFunctionName() { return m_pszFunctionName; } UINT GetDebugLevel() { return m_nDebugLevel; } bool IsLeaveAlreadyWritten() { return m_bLeaveAlreadyWritten; } void SetLeaveAlreadyWritten(){ m_bLeaveAlreadyWritten = true; }
private: PCWSTR m_pszFunctionName; UINT m_nDebugLevel; bool m_bLeaveAlreadyWritten; };
//+--------------------------------------------------------------------------
//
// Class: CFunctionSpewHR
//
// Purpose: Object which outputs the "Enter function" debug spew on creation
// and outputs the "Leave function" with the HRESULT return value
// on destruction
//
// History: 07-Dec-2000 JeffJon Created
//
//---------------------------------------------------------------------------
class CFunctionSpewHR : public CFunctionSpew { public: //
// Constructor/Destructor
//
CFunctionSpewHR(UINT nDebugLevel, PCWSTR pszFunctionName, HRESULT& refHR) : m_refHR(refHR), CFunctionSpew(nDebugLevel, pszFunctionName) { }
virtual ~CFunctionSpewHR() { DebugSpew.LeaveFunctionHr(GetDebugLevel(), GetFunctionName(), m_refHR); SetLeaveAlreadyWritten(); }
private: HRESULT& m_refHR; };
//
// Helper macros for use with CDebugSpew
//
#define ENABLE_DEBUG_OUTPUT(level) DebugSpew.SetDebugLevel((level)); \
DebugSpew.SpewHeader(); #define DISABLE_DEBUG_OUTPUT() DebugSpew.SetDebugLevel(0);
#define ENTER_FUNCTION(level, func) CFunctionSpew functionSpewObject((level), TEXT(#func));
#define ENTER_FUNCTION_HR(level, func, hr) HRESULT (hr) = S_OK; \
CFunctionSpewHR functionSpewObject((level), TEXT(#func), (hr)); #define LEAVE_FUNCTION(level, func) DebugSpew.LeaveFunction((level), TEXT(#func));
#define LEAVE_FUNCTION_HR(level, func, hr) DebugSpew.LeaveFunctionHr((level), TEXT(#func), (hr));
#define DEBUG_OUTPUT DebugSpew.Output
#else
#define ENABLE_DEBUG_OUTPUT(level)
#define DISABLE_DEBUG_OUTPUT()
#define ENTER_FUNCTION(level, func)
#define ENTER_FUNCTION_HR(level, func, hr) HRESULT (hr) = S_OK;
#define LEAVE_FUNCTION(level, func)
#define LEAVE_FUNCTION_HR(level, func, hr)
#define DEBUG_OUTPUT
#endif // DBG
//
// Debug log levels - NOTE these can be given more meaningful names as needed
//
enum { NO_DEBUG_LOGGING = 0, MINIMAL_LOGGING, LEVEL2_LOGGING, LEVEL3_LOGGING, LEVEL4_LOGGING, LEVEL5_LOGGING, LEVEL6_LOGGING, LEVEL7_LOGGING, LEVEL8_LOGGING, LEVEL9_LOGGING, FULL_LOGGING };
//+--------------------------------------------------------------------------
//
// Function: _UnicodeToOemConvert
//
// Synopsis: takes the passed in string (pszUnicode) and converts it to
// the OEM code page
//
// Arguments: [pszUnicode - IN] : the string to be converted
// [sbstrOemUnicode - OUT] : the converted string
//
// Returns:
//
// History: 04-Oct-2000 JeffJon Created
//
//---------------------------------------------------------------------------
void _UnicodeToOemConvert(PCWSTR pszUnicode, CComBSTR& sbstrOemUnicode);
//+--------------------------------------------------------------------------
//
// Function: SpewAttrs(ADS_ATTR_INFO* pCreateAttrs, DWORD dwNumAttrs);
//
// Synopsis: Uses the DEBUG_OUTPUT macro to output the attributes and the
// values specified
//
// Arguments: [pAttrs - IN] : The ADS_ATTR_INFO
// [dwNumAttrs - IN] : The number of attributes in pAttrs
//
// Returns:
//
// History: 04-Oct-2000 JeffJon Created
//
//---------------------------------------------------------------------------
#ifdef DBG
void SpewAttrs(ADS_ATTR_INFO* pAttrs, DWORD dwNumAttrs); #endif // DBG
//+--------------------------------------------------------------------------
//
// Function: litow
//
// Synopsis:
//
// Arguments: [li - IN] : reference to large integer to be converted to string
// [sResult - OUT] : Gets the output string
// Returns: void
//
// History: 25-Sep-2000 hiteshr Created
// Copied from dsadmin code base, changed work with CComBSTR
//---------------------------------------------------------------------------
void litow(LARGE_INTEGER& li, CComBSTR& sResult);
//+--------------------------------------------------------------------------
//
// Class: CManagedStringEntry
//
// Synopsis: My own string list entry since we are not using MFC
//
// History: 25-Oct-2000 JeffJon Created
//
//---------------------------------------------------------------------------
class CManagedStringEntry { public: //
// Constructor
//
CManagedStringEntry(PCWSTR pszValue) : pNext(NULL), sbstrValue(pszValue) {}
CComBSTR sbstrValue; CManagedStringEntry* pNext; };
//+--------------------------------------------------------------------------
//
// Class: CManagedStringList
//
// Synopsis: My own string list since we are not using MFC
//
// History: 25-Oct-2000 JeffJon Created
//
//---------------------------------------------------------------------------
class CManagedStringList { public: //
// Constructor
//
CManagedStringList() : m_pHead(NULL), m_pTail(NULL), m_nCount(0) {}
//
// Destructor
//
~CManagedStringList() { DeleteAll(); }
void DeleteAll() { CManagedStringEntry* pEntry = m_pHead; while (pEntry != NULL) { CManagedStringEntry* pTempEntry = pEntry; pEntry = pEntry->pNext; delete pTempEntry; } m_nCount = 0; }
void Add(PCWSTR pszValue) { if (!m_pHead) { m_pHead = new CManagedStringEntry(pszValue); m_pTail = m_pHead; m_nCount++; } else { ASSERT(m_pTail); m_pTail->pNext = new CManagedStringEntry(pszValue); if (m_pTail->pNext) { m_pTail = m_pTail->pNext; m_nCount++; } } }
bool Contains(PCWSTR pszValue) { bool bRet = false; for (CManagedStringEntry* pEntry = m_pHead; pEntry; pEntry = pEntry->pNext) { if (_wcsicmp(pEntry->sbstrValue, pszValue) == 0) { bRet = true; break; } } return bRet; }
private: CManagedStringEntry* m_pHead; CManagedStringEntry* m_pTail;
UINT m_nCount; };
#endif // _UTIL_H_
|