Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

176 lines
5.2 KiB

/*
**++
**
** Copyright (c) 2002 Microsoft Corporation
**
**
** Module Name:
**
** utility.h
**
**
** Abstract:
**
** declare functions and variable used by the Test writer
**
** Author:
**
** Reuven Lax [reuvenl] 04-June-2002
**
**
**
** Revision History:
**
**--
*/
#ifndef _UTILITY_H_
#define _UTILITY_H_
////////////////////////////////////////////////////////////////////////
// Includes
#include <functional>
#include <string>
#include <sstream>
#include "vs_xml.hxx"
////////////////////////////////////////////////////////////////////////
// Declarations
using std::wstring;
namespace Utility {
enum Events {
Identify = 0,
PrepareForBackup = Identify+1,
PrepareForSnapshot = PrepareForBackup+1,
Freeze = PrepareForSnapshot+1,
Thaw = Freeze+1,
PostSnapshot = Thaw+1,
Abort = PostSnapshot+1,
BackupComplete = Abort+1,
BackupShutdown = BackupComplete+1,
PreRestore = BackupShutdown+1,
PostRestore = PreRestore+1,
NumEvents = PostRestore+1
};
enum Verbosity {
low = 0,
medium = low+1,
high = medium+1
};
class TestWriterException : public std::exception {
private:
std::string m_what;
public:
TestWriterException(const wstring& what) : m_what("unexpected exception") {
char* buffer = new char[what.size() + 1];
if (buffer == NULL)
return;
if (::WideCharToMultiByte(CP_ACP, 0, what.c_str(), -1, buffer, (int)what.size() + 1,
NULL, NULL))
m_what = buffer;
delete [] buffer;
}
TestWriterException(HRESULT hr, wstring function = L"") :
m_what("Unexpected error") {
std::wstringstream msg;
msg << L"An error code of 0x" << std::hex << hr << L" was encountered";
if (!function.empty())
msg << L" by " << function;
char* buffer = new char[msg.str().size() + 1];
if (buffer == NULL)
return;
if (::WideCharToMultiByte(CP_ACP, 0, msg.str().c_str(), -1, buffer, (int)msg.str().size() + 1,
NULL, NULL))
m_what = buffer;
delete [] buffer;
}
TestWriterException(const TestWriterException& other) : m_what(other.m_what)
{}
virtual const char* what() const { return m_what.c_str(); }
};
// generic class that automatically releases in destructor. Useful for pointers and handles.
template <class ValueType, ValueType invalid, class CloseType, CloseType closeFunction>
class AutoValue {
private:
ValueType m_value;
public:
AutoValue(ValueType v) : m_value(v) {}
~AutoValue() {
if (m_value != invalid)
closeFunction(m_value);
}
operator ValueType() { return m_value; }
};
typedef BOOL(*CloseType)(HANDLE);
typedef AutoValue<HANDLE, INVALID_HANDLE_VALUE, CloseType, ::FindClose> AutoFindFileHandle;
typedef AutoValue<HANDLE, INVALID_HANDLE_VALUE, CloseType, ::FindVolumeMountPointClose>
AutoFindMountHandle;
// little class to automatically acquire and release a critical section
struct AutoCS {
CComAutoCriticalSection& m_section;
AutoCS(CComAutoCriticalSection& section) : m_section(section) { m_section.Lock(); }
~AutoCS() { m_section.Unlock(); }
};
// function object to compute the logical and of two function objects
template<class Inner1, class Inner2>
struct unary_and : public std::unary_function<typename Inner1::argument_type, bool> {
protected:
Inner1 m_inner1;
Inner2 m_inner2;
public:
unary_and();
unary_and(const Inner1& inner1, const Inner2& inner2) : m_inner1(inner1), m_inner2(inner2)
{}
bool operator()(const typename Inner2::argument_type& argument) const {
return m_inner1(argument) && m_inner2(argument);
}
};
template<class Inner1, class Inner2>
inline unary_and<Inner1, Inner2> and1(const Inner1& inner1, const Inner2& inner2) {
return unary_and<Inner1, Inner2>(inner1, inner2);
}
void missingAttribute(const wchar_t* name);
void missingElement(const wchar_t* name);
void checkReturn(HRESULT returnCode, wstring function);
void warnReturn(HRESULT returnCode, wstring function);
void parseError(const CXMLDocument& doc);
void printStatus(const wstring& status, Verbosity level = medium);
void printStatus(const std::string& status, Verbosity level = medium);
bool toBoolean(const wchar_t* name);
VSS_USAGE_TYPE toUsage(const wchar_t* name);
VSS_RESTOREMETHOD_ENUM toMethod(const wchar_t* name);
VSS_WRITERRESTORE_ENUM toWriterRestore(const wchar_t* name);
VSS_COMPONENT_TYPE toComponentType(const wchar_t* name);
VSS_RESTORE_TARGET toRestoreTarget(const wchar_t* name);
Events toWriterEvent(const wchar_t* name);
Verbosity toVerbosity(const wchar_t* name);
long toLong(const wchar_t* name);
wstring toString(VSS_USAGE_TYPE usage);
wstring toString(VSS_RESTOREMETHOD_ENUM method);
wstring toString(VSS_WRITERRESTORE_ENUM writerRestore);
wstring toString(VSS_COMPONENT_TYPE type);
wstring toString(VSS_RESTORE_TARGET target);
wstring toString(Events event);
wstring toString(Verbosity verbosity);
wstring toString(bool value);
}
#endif