diff --git a/src/common/connection.py b/src/common/connection.py index e22c935fd9c46529d291283e27d536657fcfd7f3..6821551ad6aa864d84de475867a9c22897180c3b 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -490,6 +490,16 @@ class Connection: errcode = iq_obj.getErrorCode() self.dispatch('MSGERROR', (jid, errcode, errmsg)) + def _getRosterCB(self, con, iq_obj): + roster = self.connection.getRoster().getRaw() + if not roster : + roster = {} + name = gajim.config.get_per('accounts', self.name, 'name') + hostname = gajim.config.get_per('accounts', self.name, 'hostname') + if roster.has_key(name + '@' + hostname): + del roster[name + '@' + hostname] + self.dispatch('ROSTER', roster) + def connect(self): """Connect and authentificate to the Jabber server""" name = gajim.config.get_per('accounts', self.name, 'name') @@ -508,7 +518,7 @@ class Connection: else: proxy = None if gajim.config.get('verbose'): - con = common.xmpp.Client(hostname)#, debug = []) + con = common.xmpp.Client(hostname) else: con = common.xmpp.Client(hostname, debug = []) #debug = [common.jabber.DBG_ALWAYS], log = sys.stderr, \ @@ -544,16 +554,13 @@ class Connection: common.xmpp.NS_VERSION) con.RegisterHandler('iq', self._MucOwnerCB, 'result',\ common.xmpp.NS_MUC_OWNER) + con.RegisterHandler('iq', self._getRosterCB, 'result',\ + common.xmpp.NS_ROSTER) gajim.log.debug('Connected to server') if con.auth(name, self.password, resource): #FIXME: blocking - roster = con.getRoster().getRaw() #FIXME: blocking - if not roster : - roster = {} - if roster.has_key(name + '@' + hostname): - del roster[name + '@' + hostname] - self.dispatch('ROSTER', roster) + con.initRoster() self.connected = 2 return con else: diff --git a/src/common/xmpp/client.py b/src/common/xmpp/client.py index 803c42cb43faccc3e2382b22d99358df06af8ae2..993acdb254fd7121d0c6ce19b6e585ce0bd17adb 100644 --- a/src/common/xmpp/client.py +++ b/src/common/xmpp/client.py @@ -205,10 +205,14 @@ class Client(CommonClient): self.connected+='+sasl' return 'sasl' + def initRoster(self): + """ Plug in the roster. """ + if not self.__dict__.has_key('Roster'): roster.Roster().PlugIn(self) + def getRoster(self): """ Return the Roster instance, previously plugging it in and requesting roster from server if needed. """ - if not self.__dict__.has_key('Roster'): roster.Roster().PlugIn(self) + self.initRoster() return self.Roster.getRoster() def sendInitPresence(self,requestRoster=1): diff --git a/src/common/xmpp/dispatcher.py b/src/common/xmpp/dispatcher.py index b21f9dfa6ea07d84b76817e9c65a5cb776d86653..3ca0d7c74fda714e74149f4a2cd2ed18d82f0d6d 100644 --- a/src/common/xmpp/dispatcher.py +++ b/src/common/xmpp/dispatcher.py @@ -170,7 +170,7 @@ class Dispatcher(PlugIn): if not self.handlers.has_key(xmlns): self.RegisterNamespace(xmlns,'warn') if not self.handlers[xmlns].has_key(name): self.RegisterProtocol(name,Protocol,xmlns,'warn') if not self.handlers[xmlns][name].has_key(typ+ns): self.handlers[xmlns][name][typ+ns]=[] - if makefirst: self.handlers[xmlns][name][typ+ns].insert({'func':handler,'system':system}) + if makefirst: self.handlers[xmlns][name][typ+ns].insert(0,{'func':handler,'system':system}) else: self.handlers[xmlns][name][typ+ns].append({'func':handler,'system':system}) def RegisterHandlerOnce(self,name,handler,typ='',ns='',xmlns=None,makefirst=0, system=0): diff --git a/src/common/xmpp/roster.py b/src/common/xmpp/roster.py index 0ceef00a1179f3d4fffe2e91872cebceabbd47cb..7e1b252543411092ac0fe578e0831d11b3ca25d6 100644 --- a/src/common/xmpp/roster.py +++ b/src/common/xmpp/roster.py @@ -42,7 +42,7 @@ class Roster(PlugIn): """ Register presence and subscription trackers in the owner's dispatcher. Also request roster from server if the 'request' argument is set. Used internally.""" - self._owner.RegisterHandler('iq',self.RosterIqHandler,'result',NS_ROSTER) + self._owner.RegisterHandler('iq',self.RosterIqHandler,'result',NS_ROSTER,makefirst=1) self._owner.RegisterHandler('iq',self.RosterIqHandler,'set',NS_ROSTER) self._owner.RegisterHandler('presence',self.PresenceHandler) if request: self.Request()