Example #1
0
 def _CH_update_registrations(self, command):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     if self._update_timer is not None and self._update_timer.active():
         self._update_timer.cancel()
     self._update_timer = None
     available_transports = settings.sip.transport_list
     old_files = []
     for file in (f for f in self._files[:] if isinstance(f, BonjourRegistrationFile) and f.transport not in available_transports):
         old_files.append(file)
         self._files.remove(file)
     self._select_proc.kill(RestartSelect)
     for file in old_files:
         file.close()
     update_failure = False
     for file in (f for f in self._files if isinstance(f, BonjourRegistrationFile)):
         try:
             contact = self.account.contact[NoGRUU, file.transport]
             instance_id = str(uuid.UUID(settings.instance_id))
             txtdata = dict(txtvers=1, name=self.account.display_name, contact="<%s>" % str(contact), instance_id=instance_id)
             state = self.account.presence_state
             if self.account.presence.enabled and state is not None:
                 txtdata['state'] = state.state
                 txtdata['note'] = state.note
             _bonjour.DNSServiceUpdateRecord(file.file, None, flags=0, rdata=_bonjour.TXTRecord(items=txtdata), ttl=0)
         except (_bonjour.BonjourError, KeyError) as e:
             notification_center.post_notification('BonjourAccountRegistrationUpdateDidFail', sender=self.account, data=NotificationData(reason=str(e), transport=file.transport))
             update_failure = True
     self._command_channel.send(Command('register'))
     if update_failure:
         self._update_timer = reactor.callLater(1, self._command_channel.send, Command('update_registrations', command.event))
     else:
         command.signal()
Example #2
0
 def _CH_register(self, command):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     if self._register_timer is not None and self._register_timer.active():
         self._register_timer.cancel()
     self._register_timer = None
     supported_transports = set(transport for transport in settings.sip.transport_list if transport!='tls' or self.account.tls.certificate is not None)
     registered_transports = set(file.transport for file in self._files if isinstance(file, BonjourRegistrationFile))
     missing_transports = supported_transports - registered_transports
     added_transports = set()
     for transport in missing_transports:
         notification_center.post_notification('BonjourAccountWillRegister', sender=self.account, data=NotificationData(transport=transport))
         try:
             contact = self.account.contact[NoGRUU, transport]
             instance_id = str(uuid.UUID(settings.instance_id))
             txtdata = dict(txtvers=1, name=self.account.display_name.encode('utf-8'), contact="<%s>" % str(contact), instance_id=instance_id)
             state = self.account.presence_state
             if self.account.presence.enabled and state is not None:
                 txtdata['state'] = state.state
                 txtdata['note'] = state.note.encode('utf-8')
             file = _bonjour.DNSServiceRegister(name=str(contact),
                                                regtype="_sipuri._%s" % (transport if transport == 'udp' else 'tcp'),
                                                port=contact.port,
                                                callBack=self._register_cb,
                                                txtRecord=_bonjour.TXTRecord(items=txtdata))
         except (_bonjour.BonjourError, KeyError), e:
             notification_center.post_notification('BonjourAccountRegistrationDidFail', sender=self.account, data=NotificationData(reason=str(e), transport=transport))
         else:
             self._files.append(BonjourRegistrationFile(file, transport))
             added_transports.add(transport)
Example #3
0
 def _CH_register(self, command):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     if self._register_timer is not None and self._register_timer.active():
         self._register_timer.cancel()
     self._register_timer = None
     supported_transports = set(
         transport for transport in settings.sip.transport_list
         if transport != 'tls' or self.account.tls.certificate is not None)
     registered_transports = set(
         file.transport for file in self._files
         if isinstance(file, BonjourRegistrationFile))
     missing_transports = supported_transports - registered_transports
     added_transports = set()
     for transport in missing_transports:
         notification_center.post_notification(
             'BonjourServiceWillRegister',
             sender=self,
             data=NotificationData(transport=transport))
         try:
             contact_uri = self.account.contact[transport]
             contact_uri.user = self.uri_user
             if self.is_focus:
                 contact_uri.parameters['isfocus'] = None
             txtdata = dict(txtvers=1,
                            name=self.name,
                            contact="<%s>" % str(contact_uri),
                            instance_id=self.id)
             state = self.presence_state
             if state is not None:
                 txtdata['state'] = state.state
                 txtdata['note'] = state.note.encode('utf-8')
             file = _bonjour.DNSServiceRegister(
                 name=str(contact_uri),
                 regtype="_%s._%s" %
                 (self.service, transport if transport == 'udp' else 'tcp'),
                 port=contact_uri.port,
                 callBack=self._register_cb,
                 txtRecord=_bonjour.TXTRecord(items=txtdata))
         except (_bonjour.BonjourError, KeyError) as e:
             notification_center.post_notification(
                 'BonjourServiceRegistrationDidFail',
                 sender=self,
                 data=NotificationData(reason=str(e), transport=transport))
         else:
             self._files.append(BonjourRegistrationFile(file, transport))
             added_transports.add(transport)
     if added_transports:
         self._select_proc.kill(RestartSelect)
     if added_transports != missing_transports:
         self._register_timer = reactor.callLater(
             1, self._command_channel.send,
             Command('register', command.event))
     else:
         command.signal()
Example #4
0
 def _CH_update_registrations(self, command):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     if self._update_timer is not None and self._update_timer.active():
         self._update_timer.cancel()
     self._update_timer = None
     available_transports = settings.sip.transport_list
     old_files = []
     for file in (f for f in self._files[:]
                  if isinstance(f, BonjourRegistrationFile)
                  and f.transport not in available_transports):
         old_files.append(file)
         self._files.remove(file)
     self._select_proc.kill(RestartSelect)
     for file in old_files:
         file.close()
     update_failure = False
     for file in (f for f in self._files
                  if isinstance(f, BonjourRegistrationFile)):
         try:
             contact_uri = self.account.contact[file.transport]
             contact_uri.user = self.uri_user
             if self.is_focus:
                 contact_uri.parameters['isfocus'] = None
             txtdata = dict(txtvers=1,
                            name=self.name,
                            contact="<%s>" % str(contact_uri),
                            instance_id=self.id)
             state = self.presence_state
             if state is not None:
                 txtdata['state'] = state.state
                 txtdata['note'] = state.note.encode('utf-8')
             _bonjour.DNSServiceUpdateRecord(
                 file.file,
                 None,
                 flags=0,
                 rdata=_bonjour.TXTRecord(items=txtdata),
                 ttl=0)
         except (_bonjour.BonjourError, KeyError), e:
             notification_center.post_notification(
                 'BonjourServiceRegistrationUpdateDidFail',
                 sender=self,
                 data=NotificationData(reason=str(e),
                                       transport=file.transport))
             update_failure = True