360 lines
9.2 KiB
C++
360 lines
9.2 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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_
|