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:
     
    4040DBUS_STRING = dbus.String 
    4141 
    4242# general type (for use in dicts, where all values should have the same type) 
    43 DBUS_VARIANT = dbus.Variant 
    4443DBUS_BOOLEAN = dbus.Boolean 
    4544DBUS_DOUBLE = dbus.Double 
    4645DBUS_INT32 = dbus.Int32 
     
    4847DBUS_DICT_SV = lambda : dbus.Dictionary({}, signature="sv") 
    4948# dictionary with string key and value 
    5049DBUS_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) 
     52DBUS_NONE = lambda : dbus.Int32(0) 
    5353 
    5454def get_dbus_struct(obj): 
    5555        ''' recursively go through all the items and replace 
     
    6666        if isinstance(obj, bool): 
    6767                return DBUS_BOOLEAN(obj) 
    6868        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') 
    7071                if result == []: 
    7172                        return DBUS_NONE() 
    7273                return result 
    7374        if isinstance(obj, dict): 
    7475                result = DBUS_DICT_SV() 
    7576                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) 
    7878                if result == {}: 
    7979                        return DBUS_NONE() 
    8080                return result 
     
    9191 
    9292        def raise_signal(self, signal, arg): 
    9393                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)) 
    9695 
    9796 
    9897class SignalObject(dbus.service.Object): 
     
    106105                # register our dbus API 
    107106                dbus.service.Object.__init__(self, service, OBJ_PATH) 
    108107 
     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 
    109174        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 
    116176 
     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 
    117184        @dbus.service.method(INTERFACE) 
    118185        def get_status(self, *args): 
    119186                '''get_status(account = None) 
     
    526593                        if prim_contact == None or contact.priority > prim_contact.priority: 
    527594                                prim_contact = contact 
    528595                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) 
    532599                if prim_contact.keyID: 
    533600                        keyID = None 
    534601                        if len(prim_contact.keyID) == 8: 
     
    537604                                keyID = prim_contact.keyID[8:] 
    538605                        if keyID: 
    539606                                contact_dict['openpgp'] = keyID 
    540                 contact_dict['resources'] = [] 
     607                contact_dict['resources'] = dbus.Array([], signature='(sis)') 
    541608                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) 
    545611                return contact_dict 
    546612 
    547613        @dbus.service.method(INTERFACE)