From cf5ad66259c7aaacf5438093d69ea34882ae4ef4 Mon Sep 17 00:00:00 2001 From: Stefan Bethge Date: Tue, 30 May 2006 23:13:36 +0000 Subject: [PATCH] added callback that put a jid in _data of Roster (though something is wrong with it) --- src/common/connection_handlers_zeroconf.py | 30 +++------------------- src/common/connection_zeroconf.py | 14 ++++++++-- src/common/roster_zeroconf.py | 6 +++++ src/common/zeroconf.py | 22 ++++++++++------ 4 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/common/connection_handlers_zeroconf.py b/src/common/connection_handlers_zeroconf.py index a912a0846..6eaf9dd05 100644 --- a/src/common/connection_handlers_zeroconf.py +++ b/src/common/connection_handlers_zeroconf.py @@ -228,7 +228,7 @@ class ConnectionHandlersZeroconf(ConnectionVcard): idle.init() except: HAS_IDLE = False - + ''' def build_http_auth_answer(self, iq_obj, answer): if answer == 'yes': iq = iq_obj.buildReply('result') @@ -236,6 +236,7 @@ class ConnectionHandlersZeroconf(ConnectionVcard): iq = iq_obj.buildReply('error') iq.setError('not-authorized', 401) self.connection.send(iq) + ''' def parse_data_form(self, node): dic = {} @@ -294,29 +295,4 @@ class ConnectionHandlersZeroconf(ConnectionVcard): dic[i]['values'] = [dic[i]['options'][0]['values'][0]] i += 1 return dic - - - def _on_roster_set(self, roster): - raw_roster = roster.getRaw() - roster = {} - our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name)) - for jid in raw_roster: - try: - j = helpers.parse_jid(jid) - except: - print >> sys.stderr, _('JID %s is not RFC compliant. It will not be added to your roster. Use roster management tools such as http://jru.jabberstudio.org/ to remove it') % jid - else: - infos = raw_roster[jid] - - if jid != our_jid and (not infos['subscription'] or infos['subscription'] == \ - 'none') and (not infos['ask'] or infos['ask'] == 'none') and not infos['name'] \ - and not infos['groups']: - # remove this useless item, it won't be shown in roster anyway - #self.connection.getRoster().delItem(jid) - pass - elif jid != our_jid: # don't add our jid - roster[j] = raw_roster[jid] - - - self.dispatch('ROSTER', roster) -# self.dispatch('SIGNED_IN', ()) + diff --git a/src/common/connection_zeroconf.py b/src/common/connection_zeroconf.py index e5728793c..69a57431e 100644 --- a/src/common/connection_zeroconf.py +++ b/src/common/connection_zeroconf.py @@ -52,7 +52,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def __init__(self, name): ConnectionHandlersZeroconf.__init__(self) self.name = name - self.zeroconf = zeroconf.Zeroconf() + self.zeroconf = zeroconf.Zeroconf(self._on_new_service, self._on_remove_service) self.connected = 0 # offline self.connection = None # dummy connection variable # this property is used to prevent double connections @@ -187,13 +187,23 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): if self.connected < 2: self.dispatch('BAD_PASSPHRASE', ()) return signed - + + def _on_new_service(self,jid): + self.roster.setItem(jid) + self.dispatch('ROSTER', self.roster) + + def _on_remove_service(self,jid): + # roster.delItem(jid) + # self.dispatch('ROSTER', roster) + pass + def connect(self, data = None, show = 'online'): if self.connection: return self.connection, '' self.zeroconf.connect() self.connection = client_zeroconf.ClientZeroconf(self.zeroconf) + self.roster = self.connection.getRoster() self.connected = STATUS_LIST.index(show) def connect_and_init(self, show, msg, signed): diff --git a/src/common/roster_zeroconf.py b/src/common/roster_zeroconf.py index 10a230bda..95880e643 100644 --- a/src/common/roster_zeroconf.py +++ b/src/common/roster_zeroconf.py @@ -15,6 +15,12 @@ class Roster: if self._data.has_key(jid): return self._data[jid] + def setItem(self, item): + print 'setItem in Roster: jid: %s' % item + # data is maybe not already resolved + # what data is expected here? + self._data[item] = self.zeroconf.get_contact(item) + def __getitem__(self,item): print '__getitem__ in Roster' return self._data[item] diff --git a/src/common/zeroconf.py b/src/common/zeroconf.py index c6b442430..c0051b395 100755 --- a/src/common/zeroconf.py +++ b/src/common/zeroconf.py @@ -14,18 +14,19 @@ except ImportError, e: pass class Zeroconf: - def __init__(self): + def __init__(self, new_serviceCB, remove_serviceCB): self.domain = None # specific domain to browse self.stype = '_presence._tcp' - self.port = 5298 # listening port that gets announced - - self.name = getpass.getuser()+'@'+socket.gethostname() # service name / username - + self.port = 5298 # listening port that gets announced + self.name = getpass.getuser()+'@'+socket.gethostname() # service name self.txt = {} # service data + self.new_serviceCB = new_serviceCB + self.remove_serviceCB = remove_serviceCB + self.service_browsers = {} self.contacts = {} # all current local contacts with data - self.entrygroup = '' + self.entrygroup = None ## handlers for dbus callbacks @@ -40,10 +41,12 @@ class Zeroconf: self.server.ResolveService( int(interface), int(protocol), name, stype, \ domain, avahi.PROTO_UNSPEC, dbus.UInt32(0), \ reply_handler=self.service_resolved_callback, error_handler=self.print_error_callback) + self.new_serviceCB(name) def remove_service_callback(self, interface, protocol, name, stype, domain, flags): print "Service '%s' in domain '%s' on %i.%i disappeared." % (name, domain, interface, protocol) del self.contacts[name] + self.remove_serviceCB(name) def new_service_type(self, interface, protocol, stype, domain, flags): # Are we already browsing this domain for this type? @@ -129,7 +132,7 @@ class Zeroconf: return show def create_service(self): - if self.entrygroup == '': + if not self.entrygroup: # create an EntryGroup for publishing self.entrygroup = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, self.server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP) self.entrygroup.connect_to_signal('StateChanged', self.entrygroup_state_changed_callback) @@ -155,7 +158,7 @@ class Zeroconf: def remove_announce(self): self.entrygroup.Reset() self.entrygroup.Free() - self.entrygroup = '' + self.entrygroup = None def browse_domain(self, interface, protocol, domain): self.new_service_type(interface, protocol, self.stype, domain, '') @@ -199,6 +202,9 @@ class Zeroconf: self.resolve_all() return self.contacts + def get_contact(self, jid): + return self.contacts[jid] + def update_txt(self, txt): # update only given keys for key in txt.keys():