def delete_list_item(self, section, key, item): variant = self.get_variant(section, key) if variant == None: printerrr('%s:%s does not exist' % (section, key)) return if section == 'romaji-typing-rule' or \ section == 'kana-typing-rule' or \ section == 'thumb-typing-rule': (method, keymap_key) = item variant_dict = GLib.VariantDict(variant) keymap = variant_dict.lookup_value(method, None) keymap_dict = GLib.VariantDict(keymap) keymap_dict.remove(keymap_key) keymap = keymap_dict.end() variant_dict.insert_value(method, keymap) self.set_variant(section, key, variant_dict.end()) return if section == 'dict' and key == 'files': variant_dict = GLib.VariantDict(variant) variant_dict.remove(item) self.set_variant(section, key, variant_dict.end()) return if section == 'dict' and key == 'list': array = [] for v in variant: dict_item = DictItem(*v) if dict_item.id == item: continue else: array.append( GLib.Variant.new_variant( DictItem.serialize(dict_item))) varray = GLib.Variant.new_array(GLib.VariantType('v'), array) self.set_variant(section, key, varray) return
def get_dbus_struct(obj): """ Recursively go through all the items and replace them with their casted dbus equivalents """ if obj is None: return None if isinstance(obj, str): return GLib.Variant('s', obj) if isinstance(obj, int): return GLib.Variant('i', obj) if isinstance(obj, float): return GLib.Variant('d', obj) if isinstance(obj, bool): return GLib.Variant('b', obj) if isinstance(obj, (list, tuple)): lst = [get_dbus_struct(i) for i in obj if i is not None] result = GLib.Variant('av', lst) return result if isinstance(obj, dict): result = GLib.VariantDict() for key, value in obj.items(): result.insert_value(key, get_dbus_struct(value)) return result.end() # unknown type return GLib.Variant('s', str(obj))
def variant_dict(d): """ Converts a dictionary to a dictionary of GLib.Variant """ if not isinstance(d, dict): raise TypeError("Only dictionaries are supported for mappings") vdict = GLib.VariantDict() for k, v in d.items(): if v is None: v = "" vdict.insert_value(k, ModulemdUtil.python_to_variant(v)) return vdict.end()
def set_list_item(self, section, key, item, values): variant = self.get_variant(section, key) if variant == None: printerrr('%s:%s does not exist' % (section, key)) return if section == 'shortcut': variant_dict = GLib.VariantDict(variant) array = [] for value in values: array.append(GLib.Variant.new_string(value)) varray = GLib.Variant.new_array(GLib.VariantType('s'), array) variant_dict.insert_value(item, varray) # GVariantDict uses GHashTable internally and # GVariantDict.end() does not support the order. self.set_variant(section, key, variant_dict.end()) return if section == 'romaji-typing-rule' or \ section == 'kana-typing-rule' or \ section == 'thumb-typing-rule': (method, keymap_key) = item variant_dict = GLib.VariantDict(variant) keymap = variant_dict.lookup_value(method, None) keymap_dict = GLib.VariantDict(keymap) if section == 'thumb-typing-rule': array = [] for value in values: array.append(GLib.Variant.new_string(value)) vvalue = GLib.Variant.new_array(GLib.VariantType('s'), array) else: vvalue = GLib.Variant.new_string(values) keymap_dict.insert_value(keymap_key, vvalue) keymap = keymap_dict.end() variant_dict.insert_value(method, keymap) self.set_variant(section, key, variant_dict.end()) return if section == 'dict' and key == 'files': variant_dict = GLib.VariantDict(variant) array = [] for value in values: array.append(GLib.Variant.new_string(value)) varray = GLib.Variant.new_array(GLib.VariantType('s'), array) variant_dict.insert_value(item, varray) self.set_variant(section, key, variant_dict.end()) return if section == 'dict' and key == 'list': array = [] has_item = False for v in variant: dict_item = DictItem(*v) if dict_item.id == values.id: array.append( GLib.Variant.new_variant(DictItem.serialize(values))) has_item = True else: array.append( GLib.Variant.new_variant( DictItem.serialize(dict_item))) if not has_item: array.append( GLib.Variant.new_variant(DictItem.serialize(values))) varray = GLib.Variant.new_array(GLib.VariantType('v'), array) self.set_variant(section, key, varray) return