Switching to callback numbers being able to be set on either account creation or...
authorEd Page <eopage@byu.net>
Mon, 18 Jan 2010 13:41:59 +0000 (07:41 -0600)
committerEd Page <eopage@byu.net>
Mon, 18 Jan 2010 13:41:59 +0000 (07:41 -0600)
src/aliasing.py
src/connection.py
src/gvoice/backend.py
src/util/misc.py
support/theonering.manager

index a1f43e5..936ff70 100644 (file)
@@ -91,9 +91,6 @@ def make_pretty(phonenumber):
 
 class AliasingMixin(tp.ConnectionInterfaceAliasing):
 
-       USER_ALIAS_ACCOUNT = "account"
-       USER_ALIAS_CALLBACK = "callback"
-
        def __init__(self):
                tp.ConnectionInterfaceAliasing.__init__(self)
 
@@ -104,13 +101,6 @@ class AliasingMixin(tp.ConnectionInterfaceAliasing):
                """
                raise NotImplementedError("Abstract property called")
 
-       @property
-       def userAliasType(self):
-               """
-               @abstract
-               """
-               raise NotImplementedError("Abstract property called")
-
        def handle(self, handleType, handleId):
                """
                @abstract
@@ -139,39 +129,33 @@ class AliasingMixin(tp.ConnectionInterfaceAliasing):
        @gtk_toolbox.log_exception(_moduleLogger)
        def SetAliases(self, aliases):
                _moduleLogger.debug("Called SetAliases")
-               if self.userAliasType == self.USER_ALIAS_ACCOUNT:
-                       raise telepathy.errors.PermissionDenied("No user customizable aliases")
-               elif self.userAliasType != self.USER_ALIAS_CALLBACK:
-                       raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
-
                # first validate that no other handle types are included
-               userHandleAndAlias = None
                for handleId, alias in aliases.iteritems():
                        h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
-                       if not isinstance(h, handle.ConnectionHandle):
-                               raise telepathy.errors.PermissionDenied("No user customizable aliases")
-                       userHandleAndAlias = h, alias
-               if userHandleAndAlias is None:
-                       _moduleLogger.debug("No user handle")
-                       return
+                       if isinstance(h, handle.ConnectionHandle):
+                               break
+               else:
+                       raise telepathy.errors.PermissionDenied("No user customizable aliases")
+
+               if len(alias) == 0:
+                       # Reset to the original from login if one was provided
+                       alias = self.callbackNumberParameter
+               if not util_misc.is_valid_number(alias):
+                       raise telepathy.errors.InvalidArgument("Invalid phone number %r" % (alias, ))
 
                # Update callback
-               uglyNumber = util_misc.normalize_number(userHandleAndAlias[1])
+               uglyNumber = util_misc.normalize_number(alias)
                self.session.backend.set_callback_number(uglyNumber)
 
                # Inform of change
-               changedAliases = (userHandleAndAlias, )
+               userAlias = make_pretty(alias)
+               changedAliases = ((handleId, userAlias), )
                self.AliasesChanged(changedAliases)
 
        def _get_alias(self, handleId):
                h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
                if isinstance(h, handle.ConnectionHandle):
-                       if self.userAliasType == self.USER_ALIAS_CALLBACK:
-                               aliasNumber = self.session.backend.get_callback_number()
-                       elif self.userAliasType == self.USER_ALIAS_ACCOUNT:
-                               aliasNumber = self.session.backend.get_account_number()
-                       else:
-                               raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
+                       aliasNumber = self.session.backend.get_callback_number()
                        userAlias = make_pretty(aliasNumber)
                        return userAlias
                else:
index 18cfc7b..cc98363 100644 (file)
@@ -23,6 +23,7 @@ except (ImportError, OSError):
 import constants
 import tp
 import util.coroutines as coroutines
+import util.misc as util_misc
 import gtk_toolbox
 
 import gvoice
@@ -56,12 +57,13 @@ class TheOneRingConnection(
        _mandatory_parameters = {
                'account' : 's',
                'password' : 's',
-               'forward' : 's',
        }
        # Overriding a base class variable
        _optional_parameters = {
+               'forward' : 's',
        }
        _parameter_defaults = {
+               'forward' : '',
        }
 
        @gtk_toolbox.log_exception(_moduleLogger)
@@ -70,9 +72,9 @@ class TheOneRingConnection(
                account = unicode(parameters['account'])
                encodedAccount = parameters['account'].encode('utf-8')
                encodedPassword = parameters['password'].encode('utf-8')
-               encodedCallback = parameters['forward'].encode('utf-8')
-               if not encodedCallback:
-                       raise telepathy.errors.InvalidArgument("User must specify what number GV forwards calls to")
+               encodedCallback = util_misc.normalize_number(parameters['forward'].encode('utf-8'))
+               if encodedCallback and not util_misc.is_valid_number(encodedCallback):
+                       raise telepathy.errors.InvalidArgument("Invalid forwarding number")
 
                # Connection init must come first
                tp.Connection.__init__(
@@ -93,7 +95,7 @@ class TheOneRingConnection(
                        encodedAccount,
                        encodedPassword,
                )
-               self.__callbackNumber = encodedCallback
+               self.__callbackNumberParameter = encodedCallback
                self.__channelManager = channel_manager.ChannelManager(self)
 
                self.__session = gvoice.session.Session(None)
@@ -128,8 +130,8 @@ class TheOneRingConnection(
                return self.__credentials[0]
 
        @property
-       def userAliasType(self):
-               return self.USER_ALIAS_ACCOUNT
+       def callbackNumberParameter(self):
+               return self.__callbackNumberParameter
 
        def get_handle_by_name(self, handleType, handleName):
                requestedHandleName = handleName.encode('utf-8')
@@ -185,7 +187,12 @@ class TheOneRingConnection(
                                self.__callback
                        )
                        self.session.login(*self.__credentials)
-                       self.session.backend.set_callback_number(self.__callbackNumber)
+                       if not self.__callbackNumberParameter:
+                               callback = gvoice.backend.get_sane_callback(
+                                       self.session.backend
+                               )
+                               self.__callbackNumberParameter = util_misc.normalize_number(callback)
+                       self.session.backend.set_callback_number(self.__callbackNumberParameter)
                except gvoice.backend.NetworkError, e:
                        _moduleLogger.exception("Connection Failed")
                        self.StatusChanged(
index 3b1d568..2457af5 100755 (executable)
@@ -807,7 +807,7 @@ def guess_phone_type(number):
                return GVoiceBackend.PHONE_TYPE_MOBILE
 
 
-def set_sane_callback(backend):
+def get_sane_callback(backend):
        """
        Try to set a sane default callback number on these preferences
        1) 1747 numbers ( Gizmo )
@@ -831,8 +831,19 @@ def set_sane_callback(backend):
                                continue
                        if descriptionCriteria is not None and re.compile(descriptionCriteria).match(description) is None:
                                continue
-                       backend.set_callback_number(number)
-                       return
+                       return number
+
+
+def set_sane_callback(backend):
+       """
+       Try to set a sane default callback number on these preferences
+       1) 1747 numbers ( Gizmo )
+       2) anything with gizmo in the name
+       3) anything with computer in the name
+       4) the first value
+       """
+       number = get_sane_callback(backend)
+       backend.set_callback_number(number)
 
 
 def _is_not_special(name):
index fba0abf..54d46e6 100644 (file)
@@ -665,3 +665,13 @@ def normalize_number(prettynumber):
        #assert validateRe.match(uglynumber) is not None
 
        return uglynumber
+
+
+_VALIDATE_RE = re.compile("^\+?[0-9]{10,}$")
+
+
+def is_valid_number(number):
+       """
+       @returns If This number be called ( syntax validation only )
+       """
+       return _VALIDATE_RE.match(number) is not None
index fdf9f03..33af764 100644 (file)
@@ -6,4 +6,5 @@ ObjectPath = /org/freedesktop/Telepathy/ConnectionManager/theonering
 [Protocol sip]
 param-account = s required
 param-password = s required secret
-param-forward = s required
+param-forward = s
+default-forward =