Esempio n. 1
0
    def stop(self):
        # deactivate
        command = Command('stop')
        self._command_channel.send(command)
        command.wait()
        self._stopped = True

        notification_center = NotificationCenter()
        notification_center.remove_observer(self, name='SystemIPAddressDidChange')
        notification_center.remove_observer(self, name='SystemDidWakeUpFromSleep')
        self._select_proc.kill()
        self._command_channel.send_exception(api.GreenletExit)
Esempio n. 2
0
 def stop(self):
     if not self.started:
         return
     self.started = False
     self.active = False
     notification_center = NotificationCenter()
     notification_center.remove_observer(self, name='CFGSettingsObjectDidChange', sender=self.account)
     notification_center.remove_observer(self, name='CFGSettingsObjectDidChange', sender=SIPSimpleSettings())
     notification_center.remove_observer(self, name='NetworkConditionsDidChange')
     command = Command('terminate')
     self._command_channel.send(command)
     command.wait()
     self._command_proc = None
 def stop(self):
     if not self.started:
         return
     self.started = False
     self.active = False
     notification_center = NotificationCenter()
     notification_center.add_observer(self, sender=self)
     notification_center.post_notification(self.__class__.__name__ + 'WillEnd', sender=self)
     notification_center.remove_observer(self, name='NetworkConditionsDidChange')
     command = Command('terminate')
     self._command_channel.send(command)
     command.wait()
     self._command_proc = None
     notification_center.post_notification(self.__class__.__name__ + 'DidDeactivate', sender=self)
     notification_center.post_notification(self.__class__.__name__ + 'DidEnd', sender=self)
     notification_center.remove_observer(self, sender=self)
Esempio n. 4
0
 def _CH_probe_dns(self, command):
     if self._timer is not None and self._timer.active():
         self._timer.cancel()
     self._timer = None
     resolver = InternalResolver()
     self.domain = resolver.domain
     self.search = resolver.search
     local_nameservers = resolver.nameservers
     # probe local resolver
     resolver.timeout = 1
     resolver.lifetime = 3
     try:
         answer = resolver.query(self.probed_domain, rdatatype.NAPTR)
         if not any(record.rdtype == rdatatype.NAPTR
                    for record in answer.rrset):
             raise exception.DNSException("No NAPTR records found")
         answer = resolver.query("_sip._udp.%s" % self.probed_domain,
                                 rdatatype.SRV)
         if not any(record.rdtype == rdatatype.SRV
                    for record in answer.rrset):
             raise exception.DNSException("No SRV records found")
     except (dns.resolver.Timeout, exception.DNSException):
         pass
     else:
         self.nameservers = resolver.nameservers
         return
     # local resolver failed. probe google resolver
     resolver.nameservers = self.google_nameservers
     resolver.timeout = 2
     resolver.lifetime = 4
     try:
         answer = resolver.query(self.probed_domain, rdatatype.NAPTR)
         if not any(record.rdtype == rdatatype.NAPTR
                    for record in answer.rrset):
             raise exception.DNSException("No NAPTR records found")
     except (dns.resolver.Timeout, exception.DNSException):
         pass
     else:
         self.nameservers = resolver.nameservers
         return
     # google resolver failed. fallback to local resolver and schedule another probe for later
     self.nameservers = local_nameservers
     self._timer = reactor.callLater(15, self._channel.send,
                                     Command('probe_dns'))
Esempio n. 5
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(
             'BonjourServiceRegistrationDidSucceed',
             sender=self,
             data=NotificationData(name=name, transport=file.transport))
     else:
         error = _bonjour.BonjourError(error_code)
         notification_center.post_notification(
             'BonjourServiceRegistrationDidFail',
             sender=self,
             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(
                 1, self._command_channel.send, Command('register'))
Esempio n. 6
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()
     
     if len(missing_transports) > 1 and 'udp' in missing_transports:
         missing_transports.remove('udp')
 
     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, 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
             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) as 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)
     if added_transports:
         self._select_proc.kill(RestartSelect)
     if added_transports != missing_transports:
         self._register_timer = reactor.callLater(10, self._command_channel.send, Command('register', command.event))
     else:
         command.signal()
Esempio n. 7
0
 def _CH_discover(self, command):
     notification_center = NotificationCenter()
     settings = SIPSimpleSettings()
     if self._discover_timer is not None and self._discover_timer.active():
         self._discover_timer.cancel()
     self._discover_timer = None
     account = BonjourAccount()
     supported_transports = set(transport for transport in settings.sip.transport_list if transport!='tls' or account.tls.certificate is not None)
     discoverable_transports = set('tcp' if transport=='tls' else transport for transport in supported_transports)
     old_files = []
     for file in (f for f in self._files[:] if isinstance(f, (BonjourDiscoveryFile, BonjourResolutionFile)) and f.transport not in discoverable_transports):
         old_files.append(file)
         self._files.remove(file)
     self._select_proc.kill(RestartSelect)
     for file in old_files:
         file.close()
     for service_description in [service for service, description in self._servers.items() if description.uri.transport not in supported_transports]:
         del self._servers[service_description]
         notification_center.post_notification('BonjourConferenceServicesDidRemoveServer', sender=self, data=NotificationData(server=service_description))
     discovered_transports = set(file.transport for file in self._files if isinstance(file, BonjourDiscoveryFile))
     missing_transports = discoverable_transports - discovered_transports
     added_transports = set()
     for transport in missing_transports:
         notification_center.post_notification('BonjourConferenceServicesWillInitiateDiscovery', sender=self, data=NotificationData(transport=transport))
         try:
             file = _bonjour.DNSServiceBrowse(regtype="_sipfocus._%s" % transport, callBack=self._browse_cb)
         except _bonjour.BonjourError as e:
             notification_center.post_notification('BonjourConferenceServicesDiscoveryDidFail', sender=self, data=NotificationData(reason=str(e), transport=transport))
         else:
             self._files.append(BonjourDiscoveryFile(file, transport))
             added_transports.add(transport)
     if added_transports:
         self._select_proc.kill(RestartSelect)
     if added_transports != missing_transports:
         self._discover_timer = reactor.callLater(1, self._command_channel.send, Command('discover', command.event))
     else:
         command.signal()
Esempio n. 8
0
                                                callBack=self._browse_cb)
            except bonjour.BonjourError, e:
                notification_center.post_notification(
                    'BonjourConferenceServicesDiscoveryDidFail',
                    sender=self,
                    data=TimestampedNotificationData(reason=str(e),
                                                     transport=transport))
            else:
                self._files.append(BonjourDiscoveryFile(file, transport))
                added_transports.add(transport)
        if added_transports:
            self._select_proc.kill(RestartSelect)
        if added_transports != missing_transports:
            self._discover_timer = reactor.callLater(
                1, self._command_channel.send,
                Command('discover', command.event))
        else:
            command.signal()

    def _CH_process_results(self, command):
        for file in (f for f in command.files if not f.closed):
            try:
                bonjour.DNSServiceProcessResult(file.file)
            except Exception:
                pass
        for file in command.files:
            file.active = False
        self._files = [f for f in self._files if not f.closed]
        self._select_proc.kill(RestartSelect)

    def _CH_stop(self, command):
Esempio n. 9
0
 def _NH_SystemIPAddressDidChange(self, notification):
     self._proc.kill(InterruptCommand)
     self._channel.send(Command('probe_dns'))
Esempio n. 10
0
from application.notification import IObserver, NotificationCenter, NotificationData
from application.python import Null, limit
from eventlib import coros, proc
from twisted.internet import reactor
from zope.interface import implements

from sipsimple.core import ContactHeader, FromHeader, Header, RouteHeader, SIPURI, Subscription, ToHeader, SIPCoreError, NoGRUU
from sipsimple.configuration.settings import SIPSimpleSettings
from sipsimple.lookup import DNSLookup, DNSLookupError
from sipsimple.threading import run_in_twisted_thread
from sipsimple.threading.green import Command, run_in_green_thread



Command.register_defaults('subscribe', refresh_interval=None)


class SIPSubscriptionDidFail(Exception):
    def __init__(self, data):
        self.data = data

class SubscriptionError(Exception):
    def __init__(self, error, retry_after, refresh_interval=None):
        self.error = error
        self.retry_after = retry_after
        self.refresh_interval = refresh_interval

class InterruptSubscription(Exception): pass
class TerminateSubscription(Exception): pass
Esempio n. 11
0
 def stop(self):
     if self._state != 'started':
         return
     self._channel.send(Command('stop'))
Esempio n. 12
0
 def handle_notification(self, notification):
     if self._channel is not None:
         self._channel.send(Command('reschedule'))
Esempio n. 13
0
 def reregister(self):
     if self.active:
         self._command_channel.send(Command('unregister'))
         self._command_channel.send(Command('register'))
Esempio n. 14
0
 def _NH_NetworkConditionsDidChange(self, notification):
     if self.active:
         self._command_channel.send(Command('unregister'))
         self._command_channel.send(Command('register'))
Esempio n. 15
0
    def _subscription_handler(self, command):
        notification_center = NotificationCenter()
        settings = SIPSimpleSettings()

        subscription_uri = self.subscription_uri
        refresh_interval = command.refresh_interval or self.account.sip.subscribe_interval
        valid_transports = self.__transports__.intersection(
            settings.sip.transport_list)

        try:
            if Host.default_ip is None:
                raise SubscriptionError('No IP address', retry_after=60)

            # Lookup routes
            if self.account.sip.outbound_proxy is not None and self.account.sip.outbound_proxy.transport in valid_transports:
                uri = SIPURI(host=self.account.sip.outbound_proxy.host,
                             port=self.account.sip.outbound_proxy.port,
                             parameters={
                                 'transport':
                                 self.account.sip.outbound_proxy.transport
                             })
            elif self.account.sip.always_use_my_proxy:
                uri = SIPURI(host=self.account.id.domain)
            else:
                uri = SIPURI(host=subscription_uri.domain)

            lookup = DNSLookup()
            try:
                routes = lookup.lookup_sip_proxy(
                    uri, valid_transports,
                    tls_name=self.account.sip.tls_name).wait()
            except DNSLookupError as e:
                raise SubscriptionError('DNS lookup failed: %s' % e,
                                        retry_after=random.uniform(15, 30))

            subscription_uri = SIPURI(user=subscription_uri.username,
                                      host=subscription_uri.domain)
            content = self.content

            timeout = time() + 30
            for route in routes:
                if Host.default_ip is None:
                    raise SubscriptionError('No IP address', retry_after=60)

                remaining_time = timeout - time()
                if remaining_time > 0:
                    try:
                        contact_uri = self.account.contact[NoGRUU, route]
                    except KeyError:
                        continue
                    subscription = Subscription(
                        subscription_uri,
                        FromHeader(self.account.uri,
                                   self.account.display_name),
                        ToHeader(subscription_uri),
                        ContactHeader(contact_uri),
                        self.event.encode(),
                        RouteHeader(route.uri),
                        credentials=self.account.credentials,
                        refresh=refresh_interval)
                    notification_center.add_observer(self, sender=subscription)
                    try:
                        subscription.subscribe(
                            body=content.body,
                            content_type=content.type,
                            extra_headers=self.extra_headers,
                            timeout=limit(remaining_time, min=1, max=5))
                    except SIPCoreError:
                        notification_center.remove_observer(
                            self, sender=subscription)
                        raise SubscriptionError('Internal error',
                                                retry_after=5)
                    self._subscription = subscription
                    try:
                        while True:
                            notification = self._data_channel.wait()
                            if notification.name == 'SIPSubscriptionDidStart':
                                break
                    except SIPSubscriptionDidFail as e:
                        notification_center.remove_observer(
                            self, sender=subscription)
                        self._subscription = None
                        if e.data.code == 407:
                            # Authentication failed, so retry the subscription in some time
                            raise SubscriptionError('Authentication failed',
                                                    retry_after=random.uniform(
                                                        60, 120))
                        elif e.data.code == 423:
                            # Get the value of the Min-Expires header
                            if e.data.min_expires is not None and e.data.min_expires > self.account.sip.subscribe_interval:
                                refresh_interval = e.data.min_expires
                            else:
                                refresh_interval = None
                            raise SubscriptionError(
                                'Interval too short',
                                retry_after=random.uniform(60, 120),
                                refresh_interval=refresh_interval)
                        elif e.data.code in (405, 406, 489):
                            raise SubscriptionError(
                                'Method or event not supported',
                                retry_after=3600)
                        elif e.data.code == 1400:
                            raise SubscriptionError(e.data.reason,
                                                    retry_after=3600)
                        else:
                            # Otherwise just try the next route
                            continue
                    else:
                        self.subscribed = True
                        command.signal()
                        break
            else:
                # There are no more routes to try, reschedule the subscription
                raise SubscriptionError('No more routes to try',
                                        retry_after=random.uniform(60, 180))
            # At this point it is subscribed. Handle notifications and ending/failures.
            notification_center.post_notification(self.__nickname__ +
                                                  'SubscriptionDidStart',
                                                  sender=self)
            try:
                while True:
                    notification = self._data_channel.wait()
                    if notification.name == 'SIPSubscriptionGotNotify':
                        notification_center.post_notification(
                            self.__nickname__ + 'SubscriptionGotNotify',
                            sender=self,
                            data=notification.data)
                    elif notification.name == 'SIPSubscriptionDidEnd':
                        notification_center.post_notification(
                            self.__nickname__ + 'SubscriptionDidEnd',
                            sender=self,
                            data=NotificationData(originator='remote'))
                        if self.active:
                            self._command_channel.send(Command('subscribe'))
                        break
            except SIPSubscriptionDidFail:
                notification_center.post_notification(self.__nickname__ +
                                                      'SubscriptionDidFail',
                                                      sender=self)
                if self.active:
                    self._command_channel.send(Command('subscribe'))
            notification_center.remove_observer(self,
                                                sender=self._subscription)
        except InterruptSubscription as e:
            if not self.subscribed:
                command.signal(e)
            if self._subscription is not None:
                notification_center.remove_observer(self,
                                                    sender=self._subscription)
                try:
                    self._subscription.end(timeout=2)
                except SIPCoreError:
                    pass
                finally:
                    notification_center.post_notification(
                        self.__nickname__ + 'SubscriptionDidEnd',
                        sender=self,
                        data=NotificationData(originator='local'))
        except TerminateSubscription as e:
            if not self.subscribed:
                command.signal(e)
            if self._subscription is not None:
                try:
                    self._subscription.end(timeout=2)
                except SIPCoreError:
                    pass
                else:
                    try:
                        while True:
                            notification = self._data_channel.wait()
                            if notification.name == 'SIPSubscriptionDidEnd':
                                break
                    except SIPSubscriptionDidFail:
                        pass
                finally:
                    notification_center.remove_observer(
                        self, sender=self._subscription)
                    notification_center.post_notification(
                        self.__nickname__ + 'SubscriptionDidEnd',
                        sender=self,
                        data=NotificationData(originator='local'))
        except SubscriptionError as e:

            def subscribe(e):
                if self.active:
                    self._command_channel.send(
                        Command('subscribe',
                                command.event,
                                refresh_interval=e.refresh_interval))
                self._subscription_timer = None

            self._subscription_timer = reactor.callLater(
                e.retry_after, subscribe, e)
            notification_center.post_notification(self.__nickname__ +
                                                  'SubscriptionDidFail',
                                                  sender=self)
        finally:
            self.subscribed = False
            self._subscription = None
            self._subscription_proc = None
Esempio n. 16
0
 def _NH_NetworkConditionsDidChange(self, notification):
     if self.active:
         self._command_channel.send(Command('subscribe'))
Esempio n. 17
0
from time import time

from application.notification import IObserver, NotificationCenter, NotificationData
from application.python import Null, limit
from application.system import host as Host
from eventlib import coros, proc
from twisted.internet import reactor
from zope.interface import implementer

from sipsimple.core import ContactHeader, FromHeader, Header, RouteHeader, SIPURI, Subscription, ToHeader, SIPCoreError, NoGRUU
from sipsimple.configuration.settings import SIPSimpleSettings
from sipsimple.lookup import DNSLookup, DNSLookupError
from sipsimple.threading import run_in_twisted_thread
from sipsimple.threading.green import Command, run_in_green_thread

Command.register_defaults('subscribe', refresh_interval=None)


class SIPSubscriptionDidFail(Exception):
    def __init__(self, data):
        self.data = data


class SubscriptionError(Exception):
    def __init__(self, error, retry_after, refresh_interval=None):
        self.error = error
        self.retry_after = retry_after
        self.refresh_interval = refresh_interval


class InterruptSubscription(Exception):
Esempio n. 18
0
 def resubscribe(self):
     if self.active:
         self._command_channel.send(Command('subscribe'))
Esempio n. 19
0
from application.python.types import MarkerType
from eventlib import coros, proc
from twisted.internet import reactor
from zope.interface import implements

from sipsimple.core import FromHeader, Publication, PublicationETagError, RouteHeader, SIPURI, SIPCoreError
from sipsimple.configuration.settings import SIPSimpleSettings
from sipsimple.lookup import DNSLookup, DNSLookupError
from sipsimple.payloads.dialoginfo import DialogInfoDocument
from sipsimple.payloads.pidf import PIDFDocument
from sipsimple.threading import run_in_twisted_thread
from sipsimple.threading.green import Command, run_in_green_thread



Command.register_defaults('publish', refresh_interval=None)


class SameState: __metaclass__ = MarkerType


class SIPPublicationDidFail(Exception):
    def __init__(self, data):
        self.data = data


class SIPPublicationDidNotEnd(Exception):
    def __init__(self, data):
        self.data = data

Esempio n. 20
0
 def _deactivate(self):
     command = Command('stop')
     self._command_channel.send(command)
     command.wait()
     self._stopped = True
Esempio n. 21
0
 def deactivate(self):
     command = Command('stop')
     self._command_channel.send(command)
     command.wait()
     self._started = False
Esempio n. 22
0
 def restart_discovery(self):
     self._command_channel.send(Command('discover'))
Esempio n. 23
0
 def activate(self):
     self._started = True
     self._command_channel.send(Command('register'))
     self._command_channel.send(Command('discover'))
Esempio n. 24
0
from time import time

from application.notification import IObserver, NotificationCenter, NotificationData
from application.python import Null, limit
from eventlib import coros, proc
from twisted.internet import reactor
from zope.interface import implementer

from sipsimple.core import ContactHeader, FromHeader, Header, Registration, RouteHeader, SIPURI, SIPCoreError, NoGRUU
from sipsimple.configuration.settings import SIPSimpleSettings
from sipsimple.lookup import DNSLookup, DNSLookupError
from sipsimple.threading import run_in_twisted_thread
from sipsimple.threading.green import Command, run_in_green_thread

Command.register_defaults('register', refresh_interval=None)


class SIPRegistrationDidFail(Exception):
    def __init__(self, data):
        self.data = data


class SIPRegistrationDidNotEnd(Exception):
    def __init__(self, data):
        self.data = data


class RegistrationError(Exception):
    def __init__(self, error, retry_after, refresh_interval=None):
        self.error = error
Esempio n. 25
0
 def deactivate(self):
     command = Command('stop')
     self._command_channel.send(command)
     command.wait()
     self._started = False
Esempio n. 26
0
 def _NH_SIPRegistrationWillExpire(self, notification):
     if self.active:
         self._command_channel.send(Command('register'))
Esempio n. 27
0
 def restart_registration(self):
     self._command_channel.send(Command('unregister'))
     self._command_channel.send(Command('register'))
Esempio n. 28
0
 def deactivate(self):
     if not self.started:
         raise RuntimeError("not started")
     self.active = False
     self._command_channel.send(Command('unregister'))
Esempio n. 29
0
from application.system import host as Host
from eventlib import coros, proc
from twisted.internet import reactor
from zope.interface import implementer

from sipsimple.core import FromHeader, Publication, PublicationETagError, RouteHeader, SIPURI, SIPCoreError
from sipsimple.configuration.settings import SIPSimpleSettings
from sipsimple.lookup import DNSLookup, DNSLookupError
from sipsimple.payloads.dialoginfo import DialogInfoDocument
from sipsimple.payloads.pidf import PIDFDocument
from sipsimple.threading import run_in_twisted_thread
from sipsimple.threading.green import Command, run_in_green_thread



Command.register_defaults('publish', refresh_interval=None)


class SameState(metaclass=MarkerType): pass


class SIPPublicationDidFail(Exception):
    def __init__(self, data):
        self.data = data


class SIPPublicationDidNotEnd(Exception):
    def __init__(self, data):
        self.data = data

Esempio n. 30
0
 def _run(self):
     notification_center = NotificationCenter()
     try:
         while True:
             command = self._channel.wait()
             if command.name == 'play':
                 self._wave_file = WaveFile(self.mixer, self.filename)
                 notification_center.add_observer(
                     self,
                     sender=self._wave_file,
                     name='WaveFileDidFinishPlaying')
                 self._wave_file.volume = self.volume
                 try:
                     self._wave_file.start()
                 except SIPCoreError, e:
                     notification_center.post_notification(
                         'WavePlayerDidFail',
                         sender=self,
                         data=NotificationData(error=e))
                     raise WavePlayerError(e)
                 else:
                     if self._current_loop == 0:
                         notification_center.post_notification(
                             'WavePlayerDidStart', sender=self)
                     notification_center.post_notification(
                         'AudioPortDidChangeSlots',
                         sender=self,
                         data=NotificationData(
                             consumer_slot_changed=False,
                             producer_slot_changed=True,
                             old_producer_slot=None,
                             new_producer_slot=self._wave_file.slot))
             elif command.name == 'reschedule':
                 self._current_loop += 1
                 notification_center.remove_observer(
                     self,
                     sender=self._wave_file,
                     name='WaveFileDidFinishPlaying')
                 self._wave_file = None
                 notification_center.post_notification(
                     'AudioPortDidChangeSlots',
                     sender=self,
                     data=NotificationData(consumer_slot_changed=False,
                                           producer_slot_changed=True,
                                           old_producer_slot=None,
                                           new_producer_slot=None))
                 if self.loop_count == 0 or self._current_loop < self.loop_count:
                     reactor.callLater(self.pause_time, self._channel.send,
                                       Command('play'))
                 else:
                     notification_center.post_notification(
                         'WavePlayerDidEnd', sender=self)
                     break
             elif command.name == 'stop':
                 if self._wave_file is not None:
                     notification_center.remove_observer(
                         self,
                         sender=self._wave_file,
                         name='WaveFileDidFinishPlaying')
                     self._wave_file.stop()
                     self._wave_file = None
                     notification_center.post_notification(
                         'AudioPortDidChangeSlots',
                         sender=self,
                         data=NotificationData(consumer_slot_changed=False,
                                               producer_slot_changed=True,
                                               old_producer_slot=None,
                                               new_producer_slot=None))
                     notification_center.post_notification(
                         'WavePlayerDidEnd', sender=self)
                 break
Esempio n. 31
0
 def _NH_NetworkConditionsDidChange(self, notification):
     if self.active:
         self._command_channel.send(Command('unpublish'))
         self._command_channel.send(Command('publish', state=self.state))
Esempio n. 32
0
 def start(self):
     self._proc = proc.spawn(self._run)
     self._channel.send(Command('probe_dns'))
Esempio n. 33
0
 def _unsubscribe_sip(self):
     command = Command("unsubscribe")
     self._command_channel.send(command)
     command.wait()
     self._command_proc.kill()
     self._command_proc = None
Esempio n. 34
0
 def wakeup_action():
     self._proc.kill(InterruptCommand)
     self._channel.send(Command('probe_dns'))
     self._wakeup_timer = None
Esempio n. 35
0
 def _deactivate(self):
     command = Command('stop')
     self._command_channel.send(command)
     command.wait()
     self._stopped = True
Esempio n. 36
0
 def publish(e):
     if self.active:
         self._command_channel.send(Command('publish', event=command.event, state=self.state, refresh_interval=e.refresh_interval))
     else:
         command.signal()
     self._publication_timer = None
Esempio n. 37
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(5, self._command_channel.send, Command('discover'))
         return
     if reply_domain != 'local.':
         return
     if flags & _bonjour.kDNSServiceFlagsAdd:
         try:
             resolution_file = next((f for f in self._files if isinstance(f, BonjourResolutionFile) and f.discovery_file==file and f.service_description==service_description))
         except StopIteration:
             try:
                 resolution_file = _bonjour.DNSServiceResolve(0, interface_index, service_name, regtype, reply_domain, self._resolve_cb)
             except _bonjour.BonjourError as 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)
     else:
         try:
             resolution_file = next((f for f in self._files if isinstance(f, BonjourResolutionFile) and f.discovery_file==file and f.service_description==service_description))
         except StopIteration:
             pass
         else:
             self._files.remove(resolution_file)
             self._select_proc.kill(RestartSelect)
             resolution_file.close()
             service_description = resolution_file.service_description
             if 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))
Esempio n. 38
0
 def update_registrations(self):
     self._command_channel.send(Command('update_registrations'))
Esempio n. 39
0
from application.notification import IObserver, NotificationCenter, NotificationData
from application.python import Null, limit
from eventlib import coros, proc
from twisted.internet import reactor
from zope.interface import implements

from sipsimple.core import ContactHeader, FromHeader, Header, Registration, RouteHeader, SIPURI, SIPCoreError, NoGRUU
from sipsimple.configuration.settings import SIPSimpleSettings
from sipsimple.lookup import DNSLookup, DNSLookupError
from sipsimple.threading import run_in_twisted_thread
from sipsimple.threading.green import Command, run_in_green_thread



Command.register_defaults('register', refresh_interval=None)


class SIPRegistrationDidFail(Exception):
    def __init__(self, data):
        self.data = data

class SIPRegistrationDidNotEnd(Exception):
    def __init__(self, data):
        self.data = data

class RegistrationError(Exception):
    def __init__(self, error, retry_after, refresh_interval=None):
        self.error = error
        self.retry_after = retry_after
        self.refresh_interval = refresh_interval