class EL_WINDOWS_REGISTRY_ROUTINES
Windows registry routines
note
description: "Windows registry routines"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2024-01-07 11:19:46 GMT (Sunday 7th January 2024)"
revision: "10"
class
EL_WINDOWS_REGISTRY_ROUTINES
inherit
EL_MEMORY_ROUTINES
feature -- Access
string (key_path: DIR_PATH; key_name: ZSTRING): ZSTRING
do
Result := string_32 (key_path, key_name)
end
string_8 (key_path: DIR_PATH; key_name: ZSTRING): STRING
do
Result := string_32 (key_path, key_name)
end
string_32 (key_path: DIR_PATH; key_name: ZSTRING): STRING_32
do
if attached {WEL_REGISTRY_KEY_VALUE} key_value (key_path, key_name) as value
then
Result := value.string_value
else
create Result.make_empty
end
end
string_list (key_path: DIR_PATH): EL_REGISTRY_STRING_VALUES_ITERABLE
do
create Result.make (key_path)
end
integer (key_path: DIR_PATH; key_name: ZSTRING): INTEGER
do
if attached {WEL_REGISTRY_KEY_VALUE} key_value (key_path, key_name) as value then
Result := value.dword_value
end
end
integer_list (key_path: DIR_PATH): EL_REGISTRY_INTEGER_VALUES_ITERABLE
do
create Result.make (key_path)
end
data (key_path: DIR_PATH; key_name: ZSTRING): MANAGED_POINTER
do
if attached {WEL_REGISTRY_KEY_VALUE} key_value (key_path, key_name) as value then
Result := value.data
else
create Result.make (0)
end
end
data_list (key_path: DIR_PATH): EL_REGISTRY_RAW_DATA_VALUES_ITERABLE
do
create Result.make (key_path)
end
key_names (key_path: DIR_PATH): EL_REGISTRY_KEYS_ITERABLE
-- list of keys under key_path
do
create Result.make (key_path)
end
value_names (key_path: DIR_PATH): EL_REGISTRY_VALUE_NAMES_ITERABLE
-- list of value names under key_path
do
create Result.make (key_path)
end
feature -- Element change
set_string (key_path: DIR_PATH; name, value: ZSTRING)
local
registry_value: WEL_REGISTRY_KEY_VALUE
do
create registry_value.make ({WEL_REGISTRY_KEY_VALUE_TYPE}.Reg_sz, value.to_unicode)
set_value (key_path, name, registry_value)
end
set_integer (key_path: DIR_PATH; name: ZSTRING; value: INTEGER)
do
set_value (key_path, name, create {WEL_REGISTRY_KEY_VALUE}.make_with_dword_value (value))
end
set_binary_data (key_path: DIR_PATH; name: ZSTRING; value: MANAGED_POINTER)
local
registry_value: WEL_REGISTRY_KEY_VALUE
do
create registry_value.make_with_data ({WEL_REGISTRY_KEY_VALUE_TYPE}.Reg_binary, value)
set_value (key_path, name, registry_value)
end
set_value (key_path: DIR_PATH; name: ZSTRING; value: WEL_REGISTRY_KEY_VALUE)
do
registry.save_key_value (key_path, name.to_unicode, value)
end
feature -- Removal
remove_key_value (key_path: DIR_PATH; value_name: ZSTRING)
local
node_ptr: POINTER;
l_registry: like registry
do
l_registry := registry
node_ptr := l_registry.open_key_with_access (key_path, {WEL_REGISTRY_ACCESS_MODE}.Key_set_value)
if is_attached (node_ptr) then
l_registry.delete_value (node_ptr, value_name)
end
end
remove_key (parent_path: DIR_PATH; key_name: ZSTRING)
local
node_ptr: POINTER
l_registry: like registry
do
l_registry := registry
node_ptr := l_registry.open_key_with_access (parent_path, {WEL_REGISTRY_ACCESS_MODE}.Key_set_value)
if is_attached (node_ptr) then
l_registry.delete_key (node_ptr, key_name)
end
end
feature -- Status query
has_key (parent_path: DIR_PATH): BOOLEAN
local
node_ptr: POINTER
do
node_ptr := registry.open_key_with_access (parent_path, {WEL_REGISTRY_ACCESS_MODE}.Key_read)
Result := is_attached (node_ptr)
end
feature {NONE} -- Implementation
key_value (key_path: DIR_PATH; key_name: ZSTRING): detachable WEL_REGISTRY_KEY_VALUE
do
Result := registry.open_key_value (key_path, key_name)
end
registry: WEL_REGISTRY
-- Do not use 'once'. Weird shit starts happening when using a shared instance
do
create Result
end
end