diff --git a/src/common/connection_zeroconf.py b/src/common/connection_zeroconf.py index 69a57431e..921792af4 100644 --- a/src/common/connection_zeroconf.py +++ b/src/common/connection_zeroconf.py @@ -190,12 +190,12 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def _on_new_service(self,jid): self.roster.setItem(jid) - self.dispatch('ROSTER', self.roster) - + #self.dispatch('ROSTER', self.roster) + self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), '', 'Gajim', 0, None, 0)) + def _on_remove_service(self,jid): - # roster.delItem(jid) - # self.dispatch('ROSTER', roster) - pass + self.roster.delItem(jid) + #self.dispatch('NOTIFY', self, ) def connect(self, data = None, show = 'online'): if self.connection: @@ -204,6 +204,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.zeroconf.connect() self.connection = client_zeroconf.ClientZeroconf(self.zeroconf) self.roster = self.connection.getRoster() + self.dispatch('ROSTER', self.roster) self.connected = STATUS_LIST.index(show) def connect_and_init(self, show, msg, signed): @@ -254,25 +255,9 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.zeroconf.update_txt(txt) self.dispatch('STATUS', show) - ''' - def _on_disconnected(self): - self.dispatch('STATUS', 'offline') - self.disconnect() - ''' - def get_status(self): return STATUS_LIST[self.connected] - def send_motd(self, jid, subject = '', msg = ''): - ''' - if not self.connection: - return - msg_iq = common.xmpp.Message(to = jid, body = msg, subject = subject) - self.connection.send(msg_iq) - ''' - - pass - def send_message(self, jid, msg, keyID, type = 'chat', subject='', chatstate = None, msg_id = None, composing_jep = None, resource = None): ''' @@ -455,13 +440,10 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.connection.getRoster().delItem(agent) ''' - def update_contact(self, jid, name, groups): - ''' - # update roster item on jabber server + def update_contact(self, jid, name, groups): if self.connection: self.connection.getRoster().setItem(jid = jid, name = name, groups = groups) - ''' def new_account(self, name, config, sync = False): ''' @@ -567,9 +549,8 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): ''' pass - ''' def get_metacontacts(self): - + ''' # Get metacontacts list from storage as described in JEP 0049 if not self.connection: return @@ -577,7 +558,9 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): iq2 = iq.addChild(name='query', namespace='jabber:iq:private') iq2.addChild(name='storage', namespace='storage:metacontacts') self.connection.send(iq) - ''' + ''' + pass + ''' def store_metacontacts(self, tags_list): # Send meta contacts to the storage namespace diff --git a/src/common/roster_zeroconf.py b/src/common/roster_zeroconf.py index 95880e643..480afbe76 100644 --- a/src/common/roster_zeroconf.py +++ b/src/common/roster_zeroconf.py @@ -15,27 +15,91 @@ 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 setItem(self, jid, name = '', groups = ''): + print 'setItem %s in Roster' % jid + (service_jid, domain, interface, protocol, host, address, port, txt) \ + = self.zeroconf.get_contact(jid) + + self._data[jid]={} + self._data[jid]['name']=jid[:jid.find('@')] + self._data[jid]['ask'] = 'no' #? + self._data[jid]['subscription'] = 'both' + self._data[jid]['groups'] = [] + self._data[jid]['resources'] = {} + self._data[jid]['address'] = address + self._data[jid]['host'] = host + self._data[jid]['port'] = port + self._data[jid]['txt'] = txt + txt_dict = self.zeroconf.txt_array_to_dict(txt) + if txt_dict.has_key('status'): + status = txt_dict['status'] + else: + status = '' + if status == 'avail': status = 'online' + self._data[jid]['status'] = status + self._data[jid]['show'] = status + print self._data[jid] + + def delItem(self, jid): + print 'delItem %s in Roster' % jid + if self._data.has_key(jid): + del self._data[jid] - def __getitem__(self,item): + def __getitem__(self,jid): print '__getitem__ in Roster' - return self._data[item] - + return self._data[jid] + + def getItems(self): + print 'getItems in Roster' + # Return list of all [bare] JIDs that the roster is currently tracks. + return self._data.keys() + + def keys(self): + print 'keys in Roster' + return self._data.keys() + def getRaw(self): print 'getRaw in Roster' return self._data def getResources(self, jid): print 'getResources(%s) in Roster' % jid -# return self + return {} + + def getStatus(self, jid): + print 'getStatus %s in Roster' % jid + txt = self._data[jid]['txt'] + txt_dict = self.zeroconf.txt_array_to_dict(txt) + if txt_dict.has_key('status'): + status = txt_dict['status'] + else: + status = '' - ''' - delItem(jid) - getStatus(jid) - getPriority(jid) - getShow(jid) - ''' + if status == 'avail' or status == '': + return 'online' + else: + return status + + def getShow(self, jid): + print 'getShow in Roster' + return getStatus(jid) + + + def getPriority(jid): + return 5 + + def getSubscription(self,jid): + print 'getSubscription in Roster' + return 'both' + + def Subscribe(self,jid): + pass + + def Unsubscribe(self,jid): + pass + + def Authorize(self,jid): + pass + + def Unauthorize(self,jid): + pass diff --git a/src/common/zeroconf.py b/src/common/zeroconf.py index c0051b395..518491f80 100755 --- a/src/common/zeroconf.py +++ b/src/common/zeroconf.py @@ -41,7 +41,6 @@ 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) @@ -76,21 +75,16 @@ class Zeroconf: l[str[:poseq]] = str[poseq+1:] return l - def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): - print "Service data for service '%s' in domain '%s' on %i.%i:" % (name, domain, interface, protocol) - print "\tHost %s (%s), port %i, TXT data: %s" % (host, address, port, str(avahi.txt_array_to_string_array(txt))) - - ''' - # add domain to stay unique - if domain != 'local': - add_domain = '.'+domain - else: - add_domain = '' - - self.contacts[name'@'+host+add_domain] = (name, stype, domain, interface, protocol, host, address, port, txt) - ''' + def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): + self.contacts[name] = (name, domain, interface, protocol, host, address, port, txt) + self.new_serviceCB(name) - self.contacts[name] = (name, stype, domain, interface, protocol, host, address, port, txt) + # different handler when resolving all contacts + def service_resolved_all_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): + print "Service data for service '%s' in domain '%s' on %i.%i:" % (name, domain, interface, protocol) + print "\tHost %s (%s), port %i, TXT data: %s" % (host, address, port, str(avahi.txt_array_to_string_array(txt))) + + self.contacts[name] = (name, domain, interface, protocol, host, address, port, txt) def service_added_callback(self): print 'Service successfully added' @@ -150,6 +144,9 @@ class Zeroconf: self.entrygroup.Commit(reply_handler=self.service_committed_callback, error_handler=self.print_error_callback) def announce(self): + #for testing + #self.contacts['stefan@munin'] = ('stefan@munin', 'local', '8', '0', 'munin', '192.168.1.29', '5121',avahi.string_array_to_txt_array(['status','avail'])) + #self.new_serviceCB('stefan@munin') state = self.server.GetState() if state == avahi.SERVER_RUNNING: @@ -193,10 +190,10 @@ class Zeroconf: # refresh data manually - really ok or too much traffic? def resolve_all(self): for val in self.contacts.values(): - #val:(name, stype, domain, interface, protocol, host, address, port, txt) - self.server.ResolveService( int(val[3]), int(val[4]), val[0], \ - self.stype, val[2], avahi.PROTO_UNSPEC, dbus.UInt32(0),\ - reply_handler=self.service_resolved_callback, error_handler=self.print_error_callback) + #val:(name, domain, interface, protocol, host, address, port, txt) + self.server.ResolveService( int(val[2]), int(val[3]), val[0], \ + self.stype, val[1], avahi.PROTO_UNSPEC, dbus.UInt32(0),\ + reply_handler=self.service_resolved_all_callback, error_handler=self.print_error_callback) def get_contacts(self): self.resolve_all()