class AliasingMixin(tp.ConnectionInterfaceAliasing):
- USER_ALIAS_ACCOUNT = "account"
- USER_ALIAS_CALLBACK = "callback"
-
def __init__(self):
tp.ConnectionInterfaceAliasing.__init__(self)
"""
raise NotImplementedError("Abstract property called")
- @property
- def userAliasType(self):
- """
- @abstract
- """
- raise NotImplementedError("Abstract property called")
-
def handle(self, handleType, handleId):
"""
@abstract
@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:
import constants
import tp
import util.coroutines as coroutines
+import util.misc as util_misc
import gtk_toolbox
import gvoice
_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)
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__(
encodedAccount,
encodedPassword,
)
- self.__callbackNumber = encodedCallback
+ self.__callbackNumberParameter = encodedCallback
self.__channelManager = channel_manager.ChannelManager(self)
self.__session = gvoice.session.Session(None)
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')
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(
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 )
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):
#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
[Protocol sip]
param-account = s required
param-password = s required secret
-param-forward = s required
+param-forward = s
+default-forward =