X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Faliasing.py;h=ef12c7cd9e7737d2a70bb8d89a518d3a0d3ca409;hp=f25c06fd78562b1b7b40037f0c4067325685990c;hb=0c5b4724b922bbcb9fc5d4258d78df1ee1b634a3;hpb=a6c0f50697d566c1adbbdf42fc1a428517e74733 diff --git a/src/aliasing.py b/src/aliasing.py index f25c06f..ef12c7c 100644 --- a/src/aliasing.py +++ b/src/aliasing.py @@ -1,16 +1,17 @@ import logging +import dbus import telepathy -import gtk_toolbox -import util.misc as util_misc +import tp +import util.misc as misc_utils import handle -_moduleLogger = logging.getLogger('aliasing') +_moduleLogger = logging.getLogger(__name__) -def _make_pretty_with_areacodde(phonenumber): +def _make_pretty_with_areacode(phonenumber): prettynumber = "(%s)" % (phonenumber[0:3], ) if 3 < len(phonenumber): prettynumber += " %s" % (phonenumber[3:6], ) @@ -27,13 +28,14 @@ def _make_pretty_local(phonenumber): def _make_pretty_international(phonenumber): + prettynumber = phonenumber if phonenumber.startswith("0"): prettynumber = "+%s " % (phonenumber[0:3], ) if 3 < len(phonenumber): - prettynumber += _make_pretty_with_areacodde(phonenumber[3:]) - if phonenumber.startswith("1"): + prettynumber += _make_pretty_with_areacode(phonenumber[3:]) + elif phonenumber.startswith("1"): prettynumber = "1 " - prettynumber += _make_pretty_with_areacodde(phonenumber[1:]) + prettynumber += _make_pretty_with_areacode(phonenumber[1:]) return prettynumber @@ -54,9 +56,9 @@ def make_pretty(phonenumber): >>> make_pretty("1234567") '123-4567' >>> make_pretty("2345678901") - '(234) 567-8901' + '+1 (234) 567-8901' >>> make_pretty("12345678901") - '1 (234) 567-8901' + '+1 (234) 567-8901' >>> make_pretty("01234567890") '+012 (345) 678-90' >>> make_pretty("+01234567890") @@ -68,19 +70,21 @@ def make_pretty(phonenumber): >>> make_pretty("+1234") '+1 (234)' """ - if phonenumber is None or phonenumber is "": + if phonenumber is None or phonenumber == "": return "" - phonenumber = util_misc.strip_number(phonenumber) + phonenumber = misc_utils.normalize_number(phonenumber) - if phonenumber[0] == "+": + if phonenumber == "": + return "" + elif phonenumber[0] == "+": prettynumber = _make_pretty_international(phonenumber[1:]) if not prettynumber.startswith("+"): prettynumber = "+"+prettynumber elif 8 < len(phonenumber) and phonenumber[0] in ("0", "1"): prettynumber = _make_pretty_international(phonenumber) elif 7 < len(phonenumber): - prettynumber = _make_pretty_with_areacodde(phonenumber) + prettynumber = _make_pretty_with_areacode(phonenumber) elif 3 < len(phonenumber): prettynumber = _make_pretty_local(phonenumber) else: @@ -88,13 +92,10 @@ def make_pretty(phonenumber): return prettynumber.strip() -class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing): - - USER_ALIAS_ACCOUNT = "account" - USER_ALIAS_CALLBACK = "callback" +class AliasingMixin(tp.ConnectionInterfaceAliasing): def __init__(self): - telepathy.server.ConnectionInterfaceAliasing.__init__(self) + tp.ConnectionInterfaceAliasing.__init__(self) @property def session(self): @@ -104,79 +105,77 @@ class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing): raise NotImplementedError("Abstract property called") @property - def userAliasType(self): + def callbackNumberParameter(self): """ @abstract """ raise NotImplementedError("Abstract property called") - def handle(self, handleType, handleId): + def get_handle_by_id(self, handleType, handleId): """ @abstract """ raise NotImplementedError("Abstract function called") - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def GetAliasFlags(self): return 0 - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def RequestAliases(self, contactHandleIds): _moduleLogger.debug("Called RequestAliases") return [self._get_alias(handleId) for handleId in contactHandleIds] - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def GetAliases(self, contactHandleIds): _moduleLogger.debug("Called GetAliases") - idToAlias = dict( - (handleId, self._get_alias(handleId)) - for handleId in contactHandleIds + idToAlias = dbus.Dictionary( + ( + (handleId, self._get_alias(handleId)) + for handleId in contactHandleIds + ), + signature="us", ) return idToAlias - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.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 + handleId, alias = None, None for handleId, alias in aliases.iteritems(): - h = self.handle(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 + h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId) + if isinstance(h, handle.ConnectionHandle): + break + else: + raise telepathy.errors.PermissionDenied("No user customizable aliases") + + uglyNumber = misc_utils.normalize_number(alias) + if len(uglyNumber) == 0: + # Reset to the original from login if one was provided + uglyNumber = self.callbackNumberParameter + if not misc_utils.is_valid_number(uglyNumber): + raise telepathy.errors.InvalidArgument("Invalid phone number %r" % (uglyNumber, )) # Update callback - uglyNumber = util_misc.strip_number(userHandleAndAlias[1]) self.session.backend.set_callback_number(uglyNumber) # Inform of change - changedAliases = (userHandleAndAlias, ) + userAlias = make_pretty(uglyNumber) + changedAliases = ((handleId, userAlias), ) self.AliasesChanged(changedAliases) def _get_alias(self, handleId): - h = self.handle(telepathy.HANDLE_TYPE_CONTACT, 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: - contactId = h.contactID - if contactId: - contactAlias = self.session.addressbook.get_contact_name(contactId) - else: - contactAlias = make_pretty(h.phoneNumber) + number = h.phoneNumber + try: + contactAlias = self.session.addressbook.get_contact_name(number) + except KeyError: + contactAlias = make_pretty(number) return contactAlias