diff options
Diffstat (limited to 'python/settings.py')
| -rw-r--r-- | python/settings.py | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/python/settings.py b/python/settings.py new file mode 100644 index 00000000..ce7c140a --- /dev/null +++ b/python/settings.py @@ -0,0 +1,174 @@ +# Copyright (c) 2015-2018 Vector 35 LLC +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +import ctypes + +# Binary Ninja components +from binaryninja import _binaryninjacore as core + +# 2-3 compatibility +from binaryninja import range +from binaryninja import pyNativeStr +from binaryninja.enums import SettingsScope + + +class Settings(object): + def __init__(self, registry_id = "default"): + self.registry_id = registry_id + + def register_group(self, group, title): + """ + ``register_group`` registers a group for use with this Settings registry. Groups provide a simple way to organize settings. + + :param str group: a unique identifier + :param str title: a user friendly name appropriate for UI presentation + :return: True on success, False on falure. + :rtype: bool + :Example: + + >>> Settings().register_group("solver", "Solver") + True + >>> + """ + return core.BNSettingsRegisterGroup(self.registry_id, group, title) + + def register_setting(self, id, properties): + """ + ``register_setting`` registers a new setting with this Settings registry. + + :param str id: a unique setting identifier in the form <group>.<id> + :param str properties: a JSON string describes the setting schema + :return: True on success, False on falure. + :rtype: bool + :Example: + + >>> Settings().register_group("solver", "Solver") + True + >>> Settings().register_setting("solver.basicBlockSlicing", '{"description" : "Enable the basic block slicing in the solver.", "title" : "Basic Block Slicing", "default" : true, "type" : "boolean", "id" : "basicBlockSlicing"}') + True + """ + return core.BNSettingsRegisterSetting(self.registry_id, id, properties) + + def update_property(self, id, setting_property): + return core.BNSettingsUpdateProperty(self.registry_id, tr(), id, setting_property) + + def get_schema(self): + return core.BNSettingsGetSchema(self.registry_id); + + def reset(self, id, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + return core.BNSettingsReset(self.registry_id, id, view, scope) + + def reset_all(self, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + return core.BNSettingsResetAll(self.registry_id, view, scope) + + def get_bool(self, id, view = None): + if view is not None: + view = view.handle + return core.BNSettingsGetBool(self.registry_id, id, view, None) + + def get_double(self, id, view = None): + if view is not None: + view = view.handle + return core.BNSettingsGetDouble(self.registry_id, id, view, None) + + def get_integer(self, id, view = None): + if view is not None: + view = view.handle + return core.BNSettingsGetUInt64(self.registry_id, id, view, None) + + def get_string(self, id, view = None): + if view is not None: + view = view.handle + return core.BNSettingsGetString(self.registry_id, id, view, None) + + def get_string_list(self, id, view = None): + if view is not None: + view = view.handle + length = ctypes.c_ulonglong() + result = core.BNSettingsGetStringList(self.registry_id, id, view, None, ctypes.byref(length)) + out_list = [] + for i in range(length.value): + out_list.append(pyNativeStr(result[i])) + core.BNFreeStringList(result, length) + return out_list + + def get_bool_with_scope(self, id, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + c_scope = core.SettingsScopeEnum(scope) + result = core.BNSettingsGetBool(self.registry_id, id, view, ctypes.byref(c_scope)) + return (result, SettingsScope(c_scope.value)) + + def get_double_with_scope(self, id, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + c_scope = core.SettingsScopeEnum(scope) + result = core.BNSettingsGetDouble(self.registry_id, id, view, ctypes.byref(c_scope)) + return (result, SettingsScope(c_scope.value)) + + def get_integer_with_scope(self, id, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + c_scope = core.SettingsScopeEnum(scope) + result = core.BNSettingsGetUInt64(self.registry_id, id, view, ctypes.byref(c_scope)) + return (result, SettingsScope(c_scope.value)) + + def get_string_with_scope(self, id, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + c_scope = core.SettingsScopeEnum(scope) + result = core.BNSettingsGetString(self.registry_id, id, view, ctypes.byref(c_scope)) + return (result, SettingsScope(c_scope.value)) + + def get_string_list_with_scope(self, id, view = None, scope = SettingsScope.SettingsAutoScope): + if view is not None: + view = view.handle + c_scope = core.SettingsScopeEnum(scope) + length = ctypes.c_ulonglong() + result = core.BNSettingsGetStringList(self.registry_id, id, view, ctypes.byref(c_scope), ctypes.byref(length)) + out_list = [] + for i in range(length.value): + out_list.append(pyNativeStr(result[i])) + core.BNFreeStringList(result, length) + return (out_list, SettingsScope(c_scope.value)) + + def set_bool(self, id, value, view = None, scope = SettingsScope.SettingsAutoScope): + return core.BNSettingsSetBool(self.registry_id, view, scope, id, value) + + def set_double(self, id, value, view = None, scope = SettingsScope.SettingsAutoScope): + return core.BNSettingsSetDouble(self.registry_id, view, scope, id, value) + + def set_integer(self, id, value, view = None, scope = SettingsScope.SettingsAutoScope): + return core.BNSettingsSetUInt64(self.registry_id, view, scope, id, value) + + def set_string(self, id, value, view = None, scope = SettingsScope.SettingsAutoScope): + return core.BNSettingsSetString(self.registry_id, view, scope, id, value) + + def set_string_list(self, id, value, view = None, scope = SettingsScope.SettingsAutoScope): + length = ctypes.c_ulonglong() + length.value = len(value) + string_list = (ctypes.c_char_p * len(value))() + for i in range(len(value)): + string_list[i] = value[i].encode('charmap') + return core.BNSettingsSetStringList(self.registry_id, view, scope, id, string_list, length) |
