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
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
|
|
|