mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-06-05 01:43:16 +03:00
config.py: win32 Config class cleanup
This commit is contained in:
parent
854c79c070
commit
b7f41796c9
140
config.py
140
config.py
@ -175,7 +175,7 @@ class Config(object):
|
|||||||
self.set('outdir', NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0])
|
self.set('outdir', NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0])
|
||||||
|
|
||||||
def get(self, key: str) -> Union[None, list, str]:
|
def get(self, key: str) -> Union[None, list, str]:
|
||||||
"""Look up a non-int configuration value."""
|
"""Look up a string configuration value."""
|
||||||
val = self.settings.get(key)
|
val = self.settings.get(key)
|
||||||
if val is None:
|
if val is None:
|
||||||
return None
|
return None
|
||||||
@ -187,7 +187,7 @@ class Config(object):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def getint(self, key: str) -> int:
|
def getint(self, key: str) -> int:
|
||||||
"""Look up an integer configuraiton value."""
|
"""Look up an integer configuration value."""
|
||||||
try:
|
try:
|
||||||
return int(self.settings.get(key, 0)) # should already be int, but check by casting
|
return int(self.settings.get(key, 0)) # should already be int, but check by casting
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -212,26 +212,9 @@ class Config(object):
|
|||||||
self.save()
|
self.save()
|
||||||
self.defaults = None
|
self.defaults = None
|
||||||
|
|
||||||
def set_shutdown(self):
|
|
||||||
self.__in_shutdown = True
|
|
||||||
|
|
||||||
@property
|
|
||||||
def shutting_down(self) -> bool:
|
|
||||||
return self.__in_shutdown
|
|
||||||
|
|
||||||
def set_auth_force_localserver(self):
|
|
||||||
self.__auth_force_localserver = True
|
|
||||||
|
|
||||||
@property
|
|
||||||
def auth_force_localserver(self) -> bool:
|
|
||||||
return self.__auth_force_localserver
|
|
||||||
|
|
||||||
elif platform == 'win32':
|
elif platform == 'win32':
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.__in_shutdown = False # Is the application currently shutting down ?
|
|
||||||
self.__auth_force_localserver = False # Should we use localhost for auth callback ?
|
|
||||||
|
|
||||||
self.app_dir = join(known_folder_path(FOLDERID_LocalAppData), appname)
|
self.app_dir = join(known_folder_path(FOLDERID_LocalAppData), appname)
|
||||||
if not isdir(self.app_dir):
|
if not isdir(self.app_dir):
|
||||||
mkdir(self.app_dir)
|
mkdir(self.app_dir)
|
||||||
@ -240,33 +223,71 @@ class Config(object):
|
|||||||
if not isdir(self.plugin_dir):
|
if not isdir(self.plugin_dir):
|
||||||
mkdir(self.plugin_dir)
|
mkdir(self.plugin_dir)
|
||||||
|
|
||||||
self.internal_plugin_dir = join(dirname(getattr(sys, 'frozen', False) and sys.executable or __file__), u'plugins')
|
if getattr(sys, 'frozen', False):
|
||||||
|
self.internal_plugin_dir = join(dirname(sys.executable), 'plugins')
|
||||||
|
self.respath = dirname(sys.executable)
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.internal_plugin_dir = join(dirname(__file__), 'plugins')
|
||||||
|
self.respath = dirname(__file__)
|
||||||
|
|
||||||
# expanduser in Python 2 on Windows doesn't handle non-ASCII - http://bugs.python.org/issue13207
|
# expanduser in Python 2 on Windows doesn't handle non-ASCII - http://bugs.python.org/issue13207
|
||||||
self.home = known_folder_path(FOLDERID_Profile) or u'\\'
|
self.home = known_folder_path(FOLDERID_Profile) or r'\\'
|
||||||
|
|
||||||
journaldir = known_folder_path(FOLDERID_SavedGames)
|
journaldir = known_folder_path(FOLDERID_SavedGames)
|
||||||
self.default_journal_dir = journaldir and join(journaldir, 'Frontier Developments', 'Elite Dangerous') or None
|
if journaldir:
|
||||||
|
self.default_journal_dir = join(journaldir, 'Frontier Developments', 'Elite Dangerous')
|
||||||
|
|
||||||
self.respath = dirname(getattr(sys, 'frozen', False) and sys.executable or __file__)
|
else:
|
||||||
|
self.default_journal_dir = None
|
||||||
|
|
||||||
self.identifier = applongname
|
self.identifier = applongname
|
||||||
|
|
||||||
self.hkey = HKEY()
|
self.hkey = HKEY()
|
||||||
disposition = DWORD()
|
disposition = DWORD()
|
||||||
if RegCreateKeyEx(HKEY_CURRENT_USER, r'Software\Marginal\EDMarketConnector', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(self.hkey), ctypes.byref(disposition)):
|
if RegCreateKeyEx(
|
||||||
|
HKEY_CURRENT_USER,
|
||||||
|
r'Software\Marginal\EDMarketConnector',
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
KEY_ALL_ACCESS,
|
||||||
|
None,
|
||||||
|
ctypes.byref(self.hkey),
|
||||||
|
ctypes.byref(disposition)
|
||||||
|
):
|
||||||
raise Exception()
|
raise Exception()
|
||||||
|
|
||||||
# set WinSparkle defaults - https://github.com/vslavik/winsparkle/wiki/Registry-Settings
|
# set WinSparkle defaults - https://github.com/vslavik/winsparkle/wiki/Registry-Settings
|
||||||
edcdhkey = HKEY()
|
edcdhkey = HKEY()
|
||||||
if RegCreateKeyEx(HKEY_CURRENT_USER, r'Software\EDCD\EDMarketConnector', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(edcdhkey), ctypes.byref(disposition)):
|
if RegCreateKeyEx(
|
||||||
|
HKEY_CURRENT_USER,
|
||||||
|
r'Software\EDCD\EDMarketConnector',
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
KEY_ALL_ACCESS,
|
||||||
|
None,
|
||||||
|
ctypes.byref(edcdhkey),
|
||||||
|
ctypes.byref(disposition)
|
||||||
|
):
|
||||||
raise Exception()
|
raise Exception()
|
||||||
|
|
||||||
sparklekey = HKEY()
|
sparklekey = HKEY()
|
||||||
if not RegCreateKeyEx(edcdhkey, 'WinSparkle', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(sparklekey), ctypes.byref(disposition)):
|
if not RegCreateKeyEx(
|
||||||
|
edcdhkey,
|
||||||
|
'WinSparkle',
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
KEY_ALL_ACCESS,
|
||||||
|
None,
|
||||||
|
ctypes.byref(sparklekey),
|
||||||
|
ctypes.byref(disposition)
|
||||||
|
):
|
||||||
if disposition.value == REG_CREATED_NEW_KEY:
|
if disposition.value == REG_CREATED_NEW_KEY:
|
||||||
buf = ctypes.create_unicode_buffer('1')
|
buf = ctypes.create_unicode_buffer('1')
|
||||||
RegSetValueEx(sparklekey, 'CheckForUpdates', 0, 1, buf, len(buf) * 2)
|
RegSetValueEx(sparklekey, 'CheckForUpdates', 0, 1, buf, len(buf) * 2)
|
||||||
|
|
||||||
buf = ctypes.create_unicode_buffer(str(update_interval))
|
buf = ctypes.create_unicode_buffer(str(update_interval))
|
||||||
RegSetValueEx(sparklekey, 'UpdateInterval', 0, 1, buf, len(buf) * 2)
|
RegSetValueEx(sparklekey, 'UpdateInterval', 0, 1, buf, len(buf) * 2)
|
||||||
RegCloseKey(sparklekey)
|
RegCloseKey(sparklekey)
|
||||||
@ -275,47 +296,82 @@ class Config(object):
|
|||||||
self.set('outdir', known_folder_path(FOLDERID_Documents) or self.home)
|
self.set('outdir', known_folder_path(FOLDERID_Documents) or self.home)
|
||||||
|
|
||||||
def get(self, key):
|
def get(self, key):
|
||||||
typ = DWORD()
|
"""Look up a string configuration value."""
|
||||||
size = DWORD()
|
key_type = DWORD()
|
||||||
if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), None, ctypes.byref(size)) or typ.value not in [REG_SZ, REG_MULTI_SZ]:
|
key_size = DWORD()
|
||||||
|
# Only strings are handled here.
|
||||||
|
if (
|
||||||
|
key_type.value not in [REG_SZ, REG_MULTI_SZ]
|
||||||
|
or RegQueryValueEx(
|
||||||
|
self.hkey,
|
||||||
|
key,
|
||||||
|
0,
|
||||||
|
ctypes.byref(key_type),
|
||||||
|
None,
|
||||||
|
ctypes.byref(key_size)
|
||||||
|
)
|
||||||
|
):
|
||||||
return None
|
return None
|
||||||
buf = ctypes.create_unicode_buffer(int(size.value / 2))
|
|
||||||
if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), buf, ctypes.byref(size)):
|
buf = ctypes.create_unicode_buffer(int(key_size.value / 2))
|
||||||
|
if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(key_type), buf, ctypes.byref(key_size)):
|
||||||
return None
|
return None
|
||||||
elif typ.value == REG_MULTI_SZ:
|
|
||||||
return [x for x in ctypes.wstring_at(buf, len(buf)-2).split(u'\x00')]
|
elif key_type.value == REG_MULTI_SZ:
|
||||||
|
return list(ctypes.wstring_at(buf, len(buf)-2).split(u'\x00'))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return str(buf.value)
|
return str(buf.value)
|
||||||
|
|
||||||
def getint(self, key):
|
def getint(self, key):
|
||||||
typ = DWORD()
|
"""Look up an integer configuration value."""
|
||||||
size = DWORD(4)
|
key_type = DWORD()
|
||||||
val = DWORD()
|
key_size = DWORD(4)
|
||||||
if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), ctypes.byref(val), ctypes.byref(size)) or typ.value != REG_DWORD:
|
key_val = DWORD()
|
||||||
|
if (
|
||||||
|
key_type.value != REG_DWORD
|
||||||
|
or RegQueryValueEx(
|
||||||
|
self.hkey,
|
||||||
|
key,
|
||||||
|
0,
|
||||||
|
ctypes.byref(key_type),
|
||||||
|
ctypes.byref(key_val),
|
||||||
|
ctypes.byref(key_size)
|
||||||
|
)
|
||||||
|
):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return val.value
|
return key_val.value
|
||||||
|
|
||||||
def set(self, key, val):
|
def set(self, key, val):
|
||||||
|
"""Set value on the specified configuration key."""
|
||||||
if isinstance(val, str):
|
if isinstance(val, str):
|
||||||
buf = ctypes.create_unicode_buffer(val)
|
buf = ctypes.create_unicode_buffer(val)
|
||||||
RegSetValueEx(self.hkey, key, 0, REG_SZ, buf, len(buf)*2)
|
RegSetValueEx(self.hkey, key, 0, REG_SZ, buf, len(buf)*2)
|
||||||
|
|
||||||
elif isinstance(val, numbers.Integral):
|
elif isinstance(val, numbers.Integral):
|
||||||
RegSetValueEx(self.hkey, key, 0, REG_DWORD, ctypes.byref(DWORD(val)), 4)
|
RegSetValueEx(self.hkey, key, 0, REG_DWORD, ctypes.byref(DWORD(val)), 4)
|
||||||
elif hasattr(val, '__iter__'): # iterable
|
|
||||||
stringval = u'\x00'.join([str(x) or u' ' for x in val] + [u'']) # null terminated non-empty strings
|
elif hasattr(val, '__iter__'):
|
||||||
buf = ctypes.create_unicode_buffer(stringval)
|
# null terminated non-empty strings
|
||||||
|
string_val = u'\x00'.join([str(x) or u' ' for x in val] + [u''])
|
||||||
|
buf = ctypes.create_unicode_buffer(string_val)
|
||||||
RegSetValueEx(self.hkey, key, 0, REG_MULTI_SZ, buf, len(buf)*2)
|
RegSetValueEx(self.hkey, key, 0, REG_MULTI_SZ, buf, len(buf)*2)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def delete(self, key):
|
def delete(self, key):
|
||||||
|
"""Delete the specified configuration key."""
|
||||||
RegDeleteValue(self.hkey, key)
|
RegDeleteValue(self.hkey, key)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
"""Save current configuration to disk."""
|
||||||
pass # Redundant since registry keys are written immediately
|
pass # Redundant since registry keys are written immediately
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
"""Close the configuration."""
|
||||||
RegCloseKey(self.hkey)
|
RegCloseKey(self.hkey)
|
||||||
self.hkey = None
|
self.hkey = None
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user