~ubuntu-branches/ubuntu/oneiric/emesene/oneiric-proposed

« back to all changes in this revision

Viewing changes to plugins_base/Dbus.py

  • Committer: Bazaar Package Importer
  • Author(s): Devid Antonio Filoni
  • Date: 2010-04-14 01:33:51 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20100414013351-r2icbt5gs4ai71j8
Tags: 1.6.1-0ubuntu1
* New upstream release (LP: #562646).
* Fix missing-debian-source-format lintian warning.
* Refresh 20_dont_build_own_libmimic.patch patch.
* Bump Standards-Version to 3.8.4.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
18
 
19
19
import os
20
 
 
 
20
import gtk
21
21
from AvatarHistory import getLastCachedAvatar
22
22
import Plugin
 
23
 
23
24
try:
24
 
    import dbus
 
25
    import dbus, dbus.service
25
26
    dbusError = ''
26
27
    if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
27
28
        import dbus.glib
28
 
        import dbus.service
 
29
    if getattr(dbus, 'version', (0,0,0)) >= (0,80,0):
 
30
        import _dbus_bindings as dbus_bindings
 
31
        from dbus.mainloop.glib import DBusGMainLoop
 
32
        DBusGMainLoop(set_as_default=True)
 
33
        NEW_DBUS = True
 
34
    else:
29
35
        import dbus.mainloop.glib
 
36
        import dbus.dbus_bindings as dbus_bindings  
 
37
        NEW_DBUS = False
30
38
except Exception, e:
31
39
    dbusError = e
32
40
 
33
41
BUS_NAME = 'org.emesene.dbus'
34
42
OBJECT_PATH = '/org/emesene/dbus'
35
43
 
 
44
PLUGIN_DESCRIPTION = _('With this plugin you can interact via D-Bus with emesene')
 
45
PLUGIN_AUTHORS = {'Roger Duran' : 'RogerDuran at gmail dot com'}
 
46
PLUGIN_WEBSITE = 'http://www.rogerpc.com.ar'
 
47
PLUGIN_DISPLAY_NAME = 'D-Bus'
 
48
PLUGIN_NAME = 'D-Bus'
 
49
 
36
50
class MainClass(Plugin.Plugin):
37
51
    '''Main plugin class'''
38
 
    description = _('With this plugin you can interact via Dbus with emesene')
39
 
    authors = {'Roger Duran' : 'RogerDuran at gmail dot com'}
40
 
    website = 'http://www.rogerpc.com.ar'
41
 
    displayName = _('Dbus')
42
 
    name = 'Dbus'
 
52
    description = PLUGIN_DESCRIPTION
 
53
    authors = PLUGIN_AUTHORS
 
54
    website = PLUGIN_WEBSITE
 
55
    displayName = PLUGIN_DISPLAY_NAME
 
56
    name = PLUGIN_NAME
43
57
 
44
58
    def __init__(self, controller, msn):
45
59
        '''Contructor'''
47
61
        Plugin.Plugin.__init__(self, controller, msn)
48
62
        self.theme = controller.theme
49
63
 
50
 
        self.description = _('With this plugin you can interact via Dbus with emesene')
51
 
        self.authors = {'Roger Duran' : 'RogerDuran at gmail dot com'}
52
 
        self.website = 'http://www.rogerpc.com.ar'
53
 
        self.displayName = _('Dbus')
54
 
        self.name = 'Dbus'
 
64
        self.description = PLUGIN_DESCRIPTION
 
65
        self.authors = PLUGIN_AUTHORS
 
66
        self.website = PLUGIN_WEBSITE
 
67
        self.displayName = PLUGIN_DISPLAY_NAME
 
68
        self.name = PLUGIN_NAME
55
69
 
56
70
        #callback ids
57
71
        self.user_connect_id = None
58
72
        self.user_offline_id = None
59
73
        self.self_nick_changed_id = None
60
74
        self.psm_changed_id = None
 
75
        self.status_changed_id = None
 
76
        self.new_message_id = None
 
77
        self.message_read_id = None
 
78
        
 
79
        self.unread_message_count = None
61
80
 
62
81
        self.dbus_object = None
63
82
 
71
90
                                                  self.self_nick_changed)
72
91
        self.psm_changed_id = self.connect('personal-message-changed',
73
92
                                            self.psm_changed)
 
93
        self.status_changed_id = self.connect('self-status-changed',
 
94
                                            self.status_changed)
 
95
        self.new_message_id = self.connect('switchboard::message', self.new_message)
 
96
        self.message_read_id = self.controller.connect('message-read', self.message_read)
 
97
        
 
98
        self.unread_message_count = 0
74
99
 
75
100
        self.enabled = True
76
101
 
80
105
        self.disconnect( self.user_offline_id )
81
106
        self.disconnect( self.self_nick_changed_id )
82
107
        self.disconnect( self.psm_changed_id )
 
108
        self.disconnect( self.status_changed_id )
 
109
        self.disconnect( self.new_message_id )
 
110
        self.disconnect( self.message_read_id )
83
111
 
84
112
        self.destroy_dbus_session()
85
113
 
110
138
 
111
139
    def destroy_dbus_session(self):
112
140
        '''Destroy current dbus session'''
 
141
        
113
142
        if self.dbus_object:
114
143
            try:
115
144
                dbus.service.Object.remove_from_connection(self.dbus_object)
117
146
                pass
118
147
            self.dbus_object = None
119
148
 
 
149
    ''' The tests on each function are there in case the internet connection dropped,
 
150
        and dbus is restarted.  When this happens, dbus_object can fail to
 
151
        instantiate, which can cause headaches.
 
152
    '''
120
153
 
121
154
    def user_connect(self, msnp, user, oldStatus):
122
 
        if(oldStatus=='FLN'):
 
155
        if self.dbus_object == None:
 
156
            self.start_dbus()
 
157
            
 
158
        if oldStatus == 'FLN':
123
159
            self.dbus_object.user_connect(user)
124
160
 
 
161
    def status_changed(self, msnp, status):
 
162
        if self.dbus_object == None:
 
163
            self.start_dbus()
 
164
            
 
165
        newstatus = self.msn.status
 
166
        self.dbus_object.status_changed('', newstatus)
 
167
 
125
168
    def user_offline(self, msnp, user):
 
169
        if self.dbus_object == None:
 
170
            self.start_dbus()
 
171
            
126
172
        self.dbus_object.user_offline(user)
127
173
 
128
174
    def self_nick_changed(self, msnp, old, nick):
 
175
        if self.dbus_object == None:
 
176
            self.start_dbus()
 
177
            
129
178
        self.dbus_object.self_changed_nick(nick)
130
179
 
131
180
    def psm_changed(self, msnp, email, pm):
 
181
        if self.dbus_object == None:
 
182
            self.start_dbus()
 
183
            
132
184
        self.dbus_object.psm_changed(email, pm)
 
185
        
 
186
    def new_message(self, msn, switchboard, signal, args, stamp=None):
 
187
        if self.dbus_object == None:
 
188
            self.start_dbus()
 
189
            
 
190
        count = self.unread_message_count
 
191
        count = count + 1
 
192
        self.unread_message_count = count
 
193
        self.dbus_object.set_message_count(count)
 
194
        self.dbus_object.unread_messages(count)
 
195
        
 
196
    def message_read(self, arg1):
 
197
        if self.dbus_object == None:
 
198
            self.start_dbus()
 
199
            
 
200
        self.unread_message_count = 0
 
201
        self.dbus_object.set_message_count(0)
 
202
        self.dbus_object.unread_messages(0)
133
203
 
134
204
try:
135
205
    class EmeseneObject(dbus.service.Object):
136
206
        def __init__(self, bus_name, object_path, main):
137
 
            dbus.service.Object.__init__(self, bus_name, object_path)
 
207
            ''' Try to create a new service object.  This will only fail if emesene already has a signal
 
208
                service running in dbus, where the plugin was brought down due to a loss of connection.
 
209
                If it does fail, it doesn't matter, it will just reconnect with the service again.
 
210
            '''
 
211
            try:
 
212
                dbus.service.Object.__init__(self, bus_name, object_path)
 
213
            except Exception, ex:
 
214
                print 'dbus.py: ERROR: %s' % str(ex)
 
215
                
138
216
            self.main = main
139
217
            self.msn = main.msn
140
218
            self.controller = main.controller
141
219
            self.contact_manager = self.controller.contacts
 
220
            self.msg_count = 0
142
221
 
143
222
        #Methods
144
223
        @dbus.service.method(BUS_NAME)
 
224
        def get_status(self):
 
225
            return self.msn.status
 
226
 
 
227
        @dbus.service.method(BUS_NAME)
 
228
        def show(self):
 
229
            # Show main window
 
230
            mainWindow = self.controller.mainWindow           
 
231
            if mainWindow != None:
 
232
                flags = mainWindow.flags()
 
233
                if not (flags & gtk.MAPPED):
 
234
                    mainWindow.deiconify()
 
235
                mainWindow.show()
 
236
            
 
237
            # Also show all open converstations           
 
238
            manager = self.controller.conversationManager
 
239
            if manager != None:
 
240
                for win, conv in manager.conversations:
 
241
                    win.present()
 
242
 
 
243
            # call map again so dialogs will refresh their contents
 
244
            if mainWindow != None:
 
245
                mainWindow.emit('map')
 
246
 
 
247
        @dbus.service.method(BUS_NAME)
145
248
        def set_psm(self, text):
146
249
            self.contact_manager.set_message(text)
147
250
            return 'Psm Changed'
169
272
                return True
170
273
            return False
171
274
 
172
 
 
173
275
        @dbus.service.method(BUS_NAME)
174
276
        def open_conversation(self, email='', weStarted=False):
175
277
            try:
249
351
        @dbus.service.method(BUS_NAME)
250
352
        def get_psm(self, email):
251
353
            return self.contact_manager.get_message(email)
 
354
            
 
355
        @dbus.service.method(BUS_NAME)
 
356
        def get_message_count(self):
 
357
            return self.msg_count
 
358
        
 
359
        @dbus.service.method(BUS_NAME)
 
360
        def set_message_count(self, count):
 
361
            self.msg_count = count
 
362
            return 'Message count changed'
252
363
 
253
364
 
254
365
        #Signals
267
378
        @dbus.service.signal(BUS_NAME)
268
379
        def psm_changed(self, email, pm):
269
380
            pass
 
381
 
 
382
        @dbus.service.signal(BUS_NAME)
 
383
        def status_changed(self, email, status):
 
384
            pass
 
385
            
 
386
        @dbus.service.signal(BUS_NAME)
 
387
        def unread_messages(self, count):
 
388
            pass
 
389
 
270
390
except Exception, e:
271
391
    dbusError = e