#ifndef PRIVILEGE_H_INCLUDED #define PRIVILEGE_H_INCLUDED #include #include "zstring.h" #include "file_error.h" #include //includes "windows.h" namespace zen { #ifdef FFS_WIN class Privileges { public: static Privileges& getInstance(); void ensureActive(LPCTSTR privilege) //throw (FileError) { if (activePrivileges.find(privilege) != activePrivileges.end()) return; //privilege already active if (privilegeIsActive(privilege)) //privilege was already active before starting this tool activePrivileges.insert(std::make_pair(privilege, false)); else { setPrivilege(privilege, true); activePrivileges.insert(std::make_pair(privilege, true)); } } private: Privileges() {} Privileges(Privileges&); void operator=(Privileges&); ~Privileges() //clean up: deactivate all privileges that have been activated by this application { for (PrivBuffType::const_iterator i = activePrivileges.begin(); i != activePrivileges.end(); ++i) try { if (i->second) Privileges::setPrivilege(i->first.c_str(), false); } catch(...) {} } static bool privilegeIsActive(LPCTSTR privilege); //throw FileError static void setPrivilege(LPCTSTR privilege, bool enable); //throw FileError typedef std::map PrivBuffType; //bool: enabled by this application PrivBuffType activePrivileges; }; #endif } #endif // PRIVILEGE_H_INCLUDED