/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2015 Danny Robson */ #include "registry.hpp" #include "../cast.hpp" #include "../debug.hpp" #include "except.hpp" #include #include using cruft::win32::key; /////////////////////////////////////////////////////////////////////////////// typedef uint64_t QWORD; //----------------------------------------------------------------------------- template constexpr DWORD type_to_id (void); template <> constexpr DWORD type_to_id (void) { return REG_DWORD; } template <> constexpr DWORD type_to_id (void) { return REG_QWORD; } template <> constexpr DWORD type_to_id (void) { return REG_NONE; } template <> constexpr DWORD type_to_id (void) { return REG_SZ; } //----------------------------------------------------------------------------- template constexpr DWORD restrict_to_id (void); template <> constexpr DWORD restrict_to_id (void) { return RRF_RT_DWORD; } template <> constexpr DWORD restrict_to_id (void) { return RRF_RT_QWORD; } template <> constexpr DWORD restrict_to_id (void) { return RRF_RT_REG_NONE; } template <> constexpr DWORD restrict_to_id (void) { return RRF_RT_REG_SZ; } /////////////////////////////////////////////////////////////////////////////// key::key (HKEY root, const char *child, REGSAM rights) { auto err = RegOpenKeyEx (root, child, 0, rights, &m_handle); win32::error::try_code (err); } //----------------------------------------------------------------------------- key::~key () { auto err = RegCloseKey (m_handle); win32::error::try_code (err); } /////////////////////////////////////////////////////////////////////////////// template T key::data (const char *name) const { T value; DWORD type; DWORD size = sizeof (value); auto err = RegGetValue (m_handle, name, &value, restrict_to_id (), &type, &value, &size); win32::error::try_code (err); return value; } //----------------------------------------------------------------------------- std::set key::values (void) const { std::set all; for (DWORD i = 0; ; ++i) { std::string name (255, '\0'); DWORD size = cruft::cast::narrow (name.size ()); auto err = RegEnumValue (m_handle, i, &name[0], &size, nullptr, nullptr, nullptr, nullptr); if (ERROR_NO_MORE_ITEMS == err) return all; if (ERROR_SUCCESS != err) win32::error::throw_code (err); CHECK_GT (size, 0u); name.resize (size - 1); all.insert (std::move (name)); } }