예제 #1
0
 def _resolve_cb(self, file, flags, interface_index, error_code, fullname, host_target, port, txtrecord):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     file = BonjourResolutionFile.find_by_file(file)
     if error_code == _bonjour.kDNSServiceErr_NoError:
         service_description = file.service_description
         try:
             record = BonjourNeighbourRecord(service_description, host_target, _bonjour.TXTRecord.parse(txtrecord))
         except SIPCoreError:
             pass
         else:
             transport = record.uri.transport
             supported_transport = transport in settings.sip.transport_list and (transport!='tls' or self.account.tls.certificate is not None)
             if not supported_transport and service_description in self._neighbours:
                 record = self._neighbours.pop(service_description)
                 notification_center.post_notification('BonjourAccountDidRemoveNeighbour', sender=self.account, data=NotificationData(neighbour=service_description, record=record))
             elif supported_transport:
                 try:
                     our_contact_uri = self.account.contact[NoGRUU, transport]
                 except KeyError:
                     return
                 if str(record.uri) != str(our_contact_uri):
                     had_neighbour = service_description in self._neighbours
                     self._neighbours[service_description] = record
                     notification_name = 'BonjourAccountDidUpdateNeighbour' if had_neighbour else 'BonjourAccountDidAddNeighbour'
                     notification_data = NotificationData(neighbour=service_description, record=record)
                     notification_center.post_notification(notification_name, sender=self.account, data=notification_data)
     else:
         self._files.remove(file)
         self._select_proc.kill(RestartSelect)
         file.close()
         error = _bonjour.BonjourError(error_code)
         notification_center.post_notification('BonjourAccountDiscoveryFailure', sender=self.account, data=NotificationData(error=str(error), transport=file.transport))
예제 #2
0
 def _browse_cb(self, file, flags, interface_index, error_code, service_name, regtype, reply_domain):
     notification_center = NotificationCenter()
     file = BonjourDiscoveryFile.find_by_file(file)
     service_description = BonjourServiceDescription(service_name, regtype, reply_domain)
     if error_code != _bonjour.kDNSServiceErr_NoError:
         error = _bonjour.BonjourError(error_code)
         notification_center.post_notification('BonjourAccountDiscoveryDidFail', sender=self.account, data=NotificationData(reason=str(error), transport=file.transport))
         removed_files = [file] + [f for f in self._files if isinstance(f, BonjourResolutionFile) and f.discovery_file==file]
         for f in removed_files:
             self._files.remove(f)
         self._select_proc.kill(RestartSelect)
         for f in removed_files:
             f.close()
         if self._discover_timer is None:
             self._discover_timer = reactor.callLater(1, self._command_channel.send, Command('discover'))
         return
     if reply_domain != 'local.':
         return
     if flags & _bonjour.kDNSServiceFlagsAdd:
         try:
             resolution_file = (f for f in self._files if isinstance(f, BonjourResolutionFile) and f.discovery_file==file and f.service_description==service_description).next()
         except StopIteration:
             try:
                 resolution_file = _bonjour.DNSServiceResolve(0, interface_index, service_name, regtype, reply_domain, self._resolve_cb)
             except _bonjour.BonjourError, e:
                 notification_center.post_notification('BonjourAccountDiscoveryFailure', sender=self.account, data=NotificationData(error=str(e), transport=file.transport))
             else:
                 resolution_file = BonjourResolutionFile(resolution_file, discovery_file=file, service_description=service_description)
                 self._files.append(resolution_file)
                 self._select_proc.kill(RestartSelect)
예제 #3
0
 def _register_cb(self, file, flags, error_code, name, regtype, domain):
     notification_center = NotificationCenter()
     file = BonjourRegistrationFile.find_by_file(file)
     if error_code == _bonjour.kDNSServiceErr_NoError:
         notification_center.post_notification('BonjourAccountRegistrationDidSucceed', sender=self.account, data=NotificationData(name=name, transport=file.transport))
     else:
         error = _bonjour.BonjourError(error_code)
         notification_center.post_notification('BonjourAccountRegistrationDidFail', sender=self.account, data=NotificationData(reason=str(error), transport=file.transport))
         self._files.remove(file)
         self._select_proc.kill(RestartSelect)
         file.close()
         if self._register_timer is None:
             self._register_timer = reactor.callLater(10, self._command_channel.send, Command('register'))
예제 #4
0
 def _resolve_cb(self, file, flags, interface_index, error_code, fullname, host_target, port, txtrecord):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     file = BonjourResolutionFile.find_by_file(file)
     if error_code == _bonjour.kDNSServiceErr_NoError:
         txt = _bonjour.TXTRecord.parse(txtrecord)
         name = txt['name'].decode('utf-8') if 'name' in txt else None
         host = re.match(r'^(.*?)(\.local)?\.?$', host_target).group(1)
         contact = txt.get('contact', file.service_description.name).split(None, 1)[0].strip('<>')
         try:
             uri = FrozenSIPURI.parse(contact)
         except SIPCoreError:
             pass
         else:
             account = BonjourAccount()
             service_description = file.service_description
             transport = uri.transport
             supported_transport = transport in settings.sip.transport_list and (transport!='tls' or account.tls.certificate is not None)
             if not supported_transport and service_description in self._servers:
                 del self._servers[service_description]
                 notification_center.post_notification('BonjourConferenceServicesDidRemoveServer', sender=self, data=NotificationData(server=service_description))
             elif supported_transport:
                 try:
                     contact_uri = account.contact[transport]
                 except KeyError:
                     return
                 if uri != contact_uri:
                     notification_name = 'BonjourConferenceServicesDidUpdateServer' if service_description in self._servers else 'BonjourConferenceServicesDidAddServer'
                     notification_data = NotificationData(server=service_description, name=name, host=host, uri=uri)
                     server_description = BonjourConferenceServerDescription(uri, host, name)
                     self._servers[service_description] = server_description
                     notification_center.post_notification(notification_name, sender=self, data=notification_data)
     else:
         self._files.remove(file)
         self._select_proc.kill(RestartSelect)
         file.close()
         error = _bonjour.BonjourError(error_code)
         notification_center.post_notification('BonjourConferenceServicesDiscoveryFailure', sender=self, data=NotificationData(error=str(error), transport=file.transport))