When removing the async calls I ended up wiping information on a callback, so moving...
[theonering] / src / aliasing.py
1 import logging
2
3 import telepathy
4
5 import gtk_toolbox
6 import util.misc as util_misc
7 import handle
8
9
10 _moduleLogger = logging.getLogger('aliasing')
11
12
13 def make_pretty(phonenumber):
14         """
15         Function to take a phone number and return the pretty version
16         pretty numbers:
17                 if phonenumber begins with 0:
18                         ...-(...)-...-....
19                 if phonenumber begins with 1: ( for gizmo callback numbers )
20                         1 (...)-...-....
21                 if phonenumber is 13 digits:
22                         (...)-...-....
23                 if phonenumber is 10 digits:
24                         ...-....
25         >>> make_pretty("12")
26         '12'
27         >>> make_pretty("1234567")
28         '123-4567'
29         >>> make_pretty("2345678901")
30         '(234)-567-8901'
31         >>> make_pretty("12345678901")
32         '1 (234)-567-8901'
33         >>> make_pretty("01234567890")
34         '+012-(345)-678-90'
35         """
36         if phonenumber is None or phonenumber is "":
37                 return ""
38
39         phonenumber = util_misc.strip_number(phonenumber)
40
41         if len(phonenumber) < 3:
42                 return phonenumber
43
44         if phonenumber[0] == "0":
45                 prettynumber = ""
46                 prettynumber += "+%s" % phonenumber[0:3]
47                 if 3 < len(phonenumber):
48                         prettynumber += "-(%s)" % phonenumber[3:6]
49                         if 6 < len(phonenumber):
50                                 prettynumber += "-%s" % phonenumber[6:9]
51                                 if 9 < len(phonenumber):
52                                         prettynumber += "-%s" % phonenumber[9:]
53                 return prettynumber
54         elif len(phonenumber) <= 7:
55                 prettynumber = "%s-%s" % (phonenumber[0:3], phonenumber[3:])
56         elif len(phonenumber) > 8 and phonenumber[0] == "1":
57                 prettynumber = "1 (%s)-%s-%s" % (phonenumber[1:4], phonenumber[4:7], phonenumber[7:])
58         elif len(phonenumber) > 7:
59                 prettynumber = "(%s)-%s-%s" % (phonenumber[0:3], phonenumber[3:6], phonenumber[6:])
60         return prettynumber
61
62
63 class AliasingMixin(telepathy.server.ConnectionInterfaceAliasing):
64
65         USER_ALIAS_ACCOUNT = "account"
66         USER_ALIAS_CALLBACK = "callback"
67
68         def __init__(self):
69                 telepathy.server.ConnectionInterfaceAliasing.__init__(self)
70
71         @property
72         def session(self):
73                 """
74                 @abstract
75                 """
76                 raise NotImplementedError("Abstract property called")
77
78         @property
79         def userAliasType(self):
80                 """
81                 @abstract
82                 """
83                 raise NotImplementedError("Abstract property called")
84
85         def handle(self, handleType, handleId):
86                 """
87                 @abstract
88                 """
89                 raise NotImplementedError("Abstract function called")
90
91         @gtk_toolbox.log_exception(_moduleLogger)
92         def GetAliasFlags(self):
93                 return 0
94
95         @gtk_toolbox.log_exception(_moduleLogger)
96         def RequestAliases(self, contactHandleIds):
97                 _moduleLogger.debug("Called RequestAliases")
98                 return [self._get_alias(handleId) for handleId in contactHandleIds]
99
100         @gtk_toolbox.log_exception(_moduleLogger)
101         def GetAliases(self, contactHandleIds):
102                 _moduleLogger.debug("Called GetAliases")
103
104                 idToAlias = dict(
105                         (handleId, self._get_alias(handleId))
106                         for handleId in contactHandleIds
107                 )
108                 return idToAlias
109
110         @gtk_toolbox.log_exception(_moduleLogger)
111         def SetAliases(self, aliases):
112                 _moduleLogger.debug("Called SetAliases")
113                 if self.userAliasType == self.USER_ALIAS_ACCOUNT:
114                         raise telepathy.errors.PermissionDenied("No user customizable aliases")
115                 elif self.userAliasType != self.USER_ALIAS_CALLBACK:
116                         raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
117
118                 # first validate that no other handle types are included
119                 userHandleAndAlias = None
120                 for handleId, alias in aliases.iteritems():
121                         h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
122                         if not isinstance(h, handle.ConnectionHandle):
123                                 raise telepathy.errors.PermissionDenied("No user customizable aliases")
124                         userHandleAndAlias = h, alias
125                 if userHandleAndAlias is None:
126                         _moduleLogger.debug("No user handle")
127                         return
128
129                 # Update callback
130                 uglyNumber = util_misc.strip_number(userHandleAndAlias[1])
131                 self.session.backend.set_callback_number(uglyNumber)
132
133                 # Inform of change
134                 changedAliases = (userHandleAndAlias, )
135                 self.AliasesChanged(changedAliases)
136
137         def _get_alias(self, handleId):
138                 h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId)
139                 if isinstance(h, handle.ConnectionHandle):
140                         if self.userAliasType == self.USER_ALIAS_CALLBACK:
141                                 aliasNumber = self.session.backend.get_callback_number()
142                         elif self.userAliasType == self.USER_ALIAS_ACCOUNT:
143                                 aliasNumber = self.session.backend.get_account_number()
144                         else:
145                                 raise RuntimeError("Invalid alias type: %r" % self.userAliasType)
146                         userAlias = make_pretty(aliasNumber)
147                         return userAlias
148                 else:
149                         contactId = h.contactID
150                         if contactId:
151                                 contactAlias = self.session.addressbook.get_contact_name(contactId)
152                         else:
153                                 contactAlias = make_pretty(h.phoneNumber)
154                         return contactAlias