/* **++ ** ** 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 #include #include #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 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 AutoFindFileHandle; typedef AutoValue 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 struct unary_and : public std::unary_function { 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 inline unary_and and1(const Inner1& inner1, const Inner2& inner2) { return unary_and(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