Ticket #2784: gajim-02-remote.patch
| File gajim-02-remote.patch, 5.1 kB (added by simon.mcvittie@…, 2 years ago) |
|---|
-
src/remote_control.py
only in patch2: unchanged:
40 40 DBUS_STRING = dbus.String 41 41 42 42 # general type (for use in dicts, where all values should have the same type) 43 DBUS_VARIANT = dbus.Variant44 43 DBUS_BOOLEAN = dbus.Boolean 45 44 DBUS_DOUBLE = dbus.Double 46 45 DBUS_INT32 = dbus.Int32 … … 48 47 DBUS_DICT_SV = lambda : dbus.Dictionary({}, signature="sv") 49 48 # dictionary with string key and value 50 49 DBUS_DICT_SS = lambda : dbus.Dictionary({}, signature="ss") 51 # empty type 52 DBUS_NONE = lambda : dbus.Variant(0) 50 # empty type (there is no equivalent of None on D-Bus, but historically gajim 51 # used 0 instead) 52 DBUS_NONE = lambda : dbus.Int32(0) 53 53 54 54 def get_dbus_struct(obj): 55 55 ''' recursively go through all the items and replace … … 66 66 if isinstance(obj, bool): 67 67 return DBUS_BOOLEAN(obj) 68 68 if isinstance(obj, (list, tuple)): 69 result = [DBUS_VARIANT(get_dbus_struct(i)) for i in obj] 69 result = dbus.Array([get_dbus_struct(i)) for i in obj], 70 signature='v') 70 71 if result == []: 71 72 return DBUS_NONE() 72 73 return result 73 74 if isinstance(obj, dict): 74 75 result = DBUS_DICT_SV() 75 76 for key, value in obj.items(): 76 result[DBUS_STRING(key)] = DBUS_VARIANT(get_dbus_struct( 77 value)) 77 result[DBUS_STRING(key)] = get_dbus_struct(value) 78 78 if result == {}: 79 79 return DBUS_NONE() 80 80 return result … … 91 91 92 92 def raise_signal(self, signal, arg): 93 93 if self.signal_object: 94 self.signal_object.raise_signal(signal, 95 get_dbus_struct(arg)) 94 self.signal_object.getattr(signal)(get_dbus_struct(arg)) 96 95 97 96 98 97 class SignalObject(dbus.service.Object): … … 106 105 # register our dbus API 107 106 dbus.service.Object.__init__(self, service, OBJ_PATH) 108 107 108 # FIXME: what are the signatures for these signals? 109 110 @dbus.service.signal(INTERFACE) 111 def Roster(self, account_and_data): 112 pass 113 114 @dbus.service.signal(INTERFACE) 115 def AccountPresence(self, status_and_account): 116 pass 117 118 @dbus.service.signal(INTERFACE) 119 def ContactPresence(self, account_and_array): 120 pass 121 122 @dbus.service.signal(INTERFACE) 123 def ContactAbsence(self, account_and_array): 124 pass 125 126 @dbus.service.signal(INTERFACE) 127 def NewMessage(self, account_and_array): 128 pass 129 130 @dbus.service.signal(INTERFACE) 131 def Subscribe(self, account_and_array): 132 pass 133 134 @dbus.service.signal(INTERFACE) 135 def Subscribed(self, account_and_array): 136 pass 137 138 @dbus.service.signal(INTERFACE) 139 def Unsubscribed(self, account_and_jid): 140 pass 141 142 @dbus.service.signal(INTERFACE) 143 def NewAccount(self, account_and_array): 144 pass 145 146 @dbus.service.signal(INTERFACE) 147 def VcardInfo(self, account_and_vcard): 148 pass 149 150 @dbus.service.signal(INTERFACE) 151 def LastStatusTime(self, account_and_array): 152 pass 153 154 @dbus.service.signal(INTERFACE) 155 def OsInfo(self, account_and_array): 156 pass 157 158 @dbus.service.signal(INTERFACE) 159 def GCPresence(self, account_and_array): 160 pass 161 162 @dbus.service.signal(INTERFACE) 163 def GCMessage(self, account_and_array): 164 pass 165 166 @dbus.service.signal(INTERFACE) 167 def RosterInfo(self, account_and_array): 168 pass 169 170 @dbus.service.signal(INTERFACE) 171 def NewGmail(self, account_and_array): 172 pass 173 109 174 def raise_signal(self, signal, arg): 110 '''raise a signal, with a single string message''' 111 from dbus import dbus_bindings 112 message = dbus_bindings.Signal(OBJ_PATH, INTERFACE, signal) 113 i = message.get_iter(True) 114 i.append(arg) 115 self._connection.send(message) 175 '''raise a signal, with a single argument of unspecified type 116 176 177 Instead of obj.raise_signal("Foo", bar), use obj.Foo(bar).''' 178 getattr(self, signal)(arg) 179 180 # FIXME: can't specify any introspect signature for any of these 181 # since they take a variable number of arguments (this is not 182 # recommended in a D-Bus interface) 183 117 184 @dbus.service.method(INTERFACE) 118 185 def get_status(self, *args): 119 186 '''get_status(account = None) … … 526 593 if prim_contact == None or contact.priority > prim_contact.priority: 527 594 prim_contact = contact 528 595 contact_dict = DBUS_DICT_SV() 529 contact_dict['name'] = DBUS_ VARIANT(DBUS_STRING(prim_contact.name))530 contact_dict['show'] = DBUS_ VARIANT(DBUS_STRING(prim_contact.show))531 contact_dict['jid'] = DBUS_ VARIANT(DBUS_STRING(prim_contact.jid))596 contact_dict['name'] = DBUS_STRING(prim_contact.name) 597 contact_dict['show'] = DBUS_STRING(prim_contact.show) 598 contact_dict['jid'] = DBUS_STRING(prim_contact.jid) 532 599 if prim_contact.keyID: 533 600 keyID = None 534 601 if len(prim_contact.keyID) == 8: … … 537 604 keyID = prim_contact.keyID[8:] 538 605 if keyID: 539 606 contact_dict['openpgp'] = keyID 540 contact_dict['resources'] = []607 contact_dict['resources'] = dbus.Array([], signature='(sis)') 541 608 for contact in contacts: 542 resource_props = [DBUS_STRING(contact.resource), contact.priority, DBUS_STRING(contact.status)] 543 contact_dict['resources'].append(tuple(resource_props)) 544 contact_dict['resources'] = DBUS_VARIANT(contact_dict['resources']) 609 resource_props = dbus.Struct((DBUS_STRING(contact.resource), contact.priority, DBUS_STRING(contact.status)), signature='sis') 610 contact_dict['resources'].append(resource_props) 545 611 return contact_dict 546 612 547 613 @dbus.service.method(INTERFACE)
