if phonenumber[0] == "0":
prettynumber = ""
- prettynumber += "+" + phonenumber[0:3]
+ prettynumber += "+%s" % phonenumber[0:3]
if 3 < len(phonenumber):
- prettynumber += "-(" + phonenumber[3:6] + ")"
+ prettynumber += "-(%s)" % phonenumber[3:6]
if 6 < len(phonenumber):
- prettynumber += "-" + phonenumber[6:9]
+ prettynumber += "-%s" % phonenumber[6:9]
if 9 < len(phonenumber):
- prettynumber += "-" + phonenumber[9:]
+ prettynumber += "-%s" % phonenumber[9:]
return prettynumber
elif len(phonenumber) <= 7:
prettynumber = "%s-%s" % (phonenumber[0:3], phonenumber[3:])
if os.path.isfile(path):
self.wTree.add_from_file(path)
break
+ else:
+ self.ErrPopUp("Cannot find gc_dialer.xml")
+ sys.exit(1)#@todo Is this the best way to force a quit on error?
self.window = self.wTree.get_object("Dialpad")
#Get the buffer associated with the number display
except:
print "No hildon"
- if (self.window):
+ if self.window:
self.window.connect("destroy", gtk.main_quit)
self.window.show_all()
- dic = {
+ callbackMapping = {
# Process signals from buttons
"on_digit_clicked" : self.on_digit_clicked,
"on_dial_clicked" : self.on_dial_clicked,
"on_recentview_row_activated" : self.on_recentview_row_activated,
"on_back_clicked" : self.Backspace
}
- self.wTree.connect_signals(dic)
+ self.wTree.connect_signals(callbackMapping)
self.attemptLogin(3)
if self.gcd.getCallbackNumber() is None:
self.callbacklist = gtk.ListStore(gobject.TYPE_STRING)
combobox.set_model(self.callbacklist)
combobox.set_text_column(0)
- for k, v in self.gcd.getCallbackNumbers().iteritems():
- self.callbacklist.append([makepretty(k)] )
+ for number, description in self.gcd.getCallbackNumbers().iteritems():
+ self.callbacklist.append([makepretty(number)] )
self.wTree.get_object("callbackentry").set_text(makepretty(self.gcd.getCallbackNumber()))
else:
dialog = self.wTree.get_object("login_dialog")
- while ( (times > 0) and (self.gcd.isAuthed() is False) ):
- if dialog.run() == gtk.RESPONSE_OK:
- if self.isHildon:
- username = dialog.get_username()
- password = dialog.get_password()
- else:
- username = self.wTree.get_object("usernameentry").get_text()
- password = self.wTree.get_object("passwordentry").get_text()
- self.wTree.get_object("passwordentry").set_text("")
- self.gcd.login(username, password)
- dialog.hide()
- times = times - 1
- else:
+ while (0 < times) and not self.gcd.isAuthed():
+ if dialog.run() != gtk.RESPONSE_OK:
times = 0
+ continue
+
+ if self.isHildon:
+ username = dialog.get_username()
+ password = dialog.get_password()
+ else:
+ username = self.wTree.get_object("usernameentry").get_text()
+ password = self.wTree.get_object("passwordentry").get_text()
+ self.wTree.get_object("passwordentry").set_text("")
+ print "Attempting login"
+ self.gcd.login(username, password)
+ dialog.hide()
+ times -= 1
if self.isHildon:
dialog.destroy()
the functions include login, setting up a callback number, and initalting a callback
"""
- _wgetOKstrRe = re.compile("This may take a few seconds", re.M) # string from Grandcentral.com on successful dial
+ _gcDialingStrRe = re.compile("This may take a few seconds", re.M) # string from Grandcentral.com on successful dial
_validateRe = re.compile("^[0-9]{10,}$")
_accessTokenRe = re.compile(r"""<input type="hidden" name="a_t" [^>]*value="(.*)"/>""")
_isLoginPageRe = re.compile(r"""<form method="post" action="https://www.grandcentral.com/mobile/account/login">""")
def __init__(self, cookieFile = None):
# Important items in this function are the setup of the browser emulation and cookie file
-
self._msg = ""
- if cookieFile == None:
+ if cookieFile is None:
cookieFile = os.path.join(os.path.expanduser("~"), ".gc_dialer_cookies.txt")
self._browser = MozillaEmulator(None, 0)
self._browser.cookies.filename = cookieFile
self._accountNum = None
def grabToken(self, data):
- # Pull the magic cookie from the datastream
-
+ "Pull the magic cookie from the datastream"
atGroup = GCDialer._accessTokenRe.search(data)
try:
self._accessToken = atGroup.group(1)
Attempts to detect a current session and pull the
auth token ( a_t ) from the page
"""
-
self._lastData = self._browser.download(GCDialer._forwardselectURL)
self._browser.cookies.save()
if GCDialer._isLoginPageRe.search(self._lastData) is None:
"""
Attempt to login to grandcentral
"""
-
if self.isAuthed():
return
3) anything with computer in the name
4) the first value
"""
-
numbers = self.getCallbackNumbers()
- for k, v in numbers.iteritems():
- if not re.compile(r"""1747""").match(k) is None:
- self.setCallbackNumber(k)
+ for number, description in numbers.iteritems():
+ if not re.compile(r"""1747""").match(number) is None:
+ self.setCallbackNumber(number)
return
- for k, v in numbers.iteritems():
- if not re.compile(r"""gizmo""", re.I).search(v) is None:
- self.setCallbackNumber(k)
+ for number, description in numbers.iteritems():
+ if not re.compile(r"""gizmo""", re.I).search(description) is None:
+ self.setCallbackNumber(number)
return
- for k, v in numbers.iteritems():
- if not re.compile(r"""computer""", re.I).search(v) is None:
- self.setCallbackNumber(k)
+ for number, description in numbers.iteritems():
+ if not re.compile(r"""computer""", re.I).search(description) is None:
+ self.setCallbackNumber(number)
return
- for k, v in numbers.iteritems():
- self.setCallbackNumber(k)
+ for number, description in numbers.iteritems():
+ self.setCallbackNumber(number)
return
def getCallbackNumbers(self):
+ """
+ @returns a dictionary mapping call back numbers to descriptions
+ """
retval = {}
self._lastData = self._browser.download(GCDialer._forwardselectURL)
set the number that grandcental calls
this should be a proper 10 digit number
"""
-
callbackPostData = urllib.urlencode({'a_t' : self._accessToken, 'default_number' : callbacknumber })
self._lastData = self._browser.download(GCDialer._setforwardURL, callbackPostData)
self._browser.cookies.save()
"""
Can this number be called ( syntax validation only )
"""
-
return GCDialer._validateRe.match(number) is not None
def dial(self, number):
"""
This is the main function responsible for initating the callback
"""
-
# If the number is not valid throw exception
if self.validate(number) is False:
raise ValueError('number is not valid')
self._lastData = self._browser.download(
GCDialer._clicktocallURL % (self._accessToken, number),
- None, {'Referer' : 'http://www.grandcentral.com/mobile/messages'} )
+ None, {'Referer' : 'http://www.grandcentral.com/mobile/messages'}
+ )
- if GCDialer._wgetOKstrRe.search(self._lastData) != None:
+ if GCDialer._gcDialingStrRe.search(self._lastData) is not None:
return True
else:
return False
def get_recent(self):
- retval = []
self._lastData = self._browser.download(GCDialer._inboxallURL)
for match in self._inboxRe.finditer(self._lastData):
#print "type: %s date: %s person: %s number: %s" % (match.group(1), match.group(2), match.group(3), match.group(4))
- retval.append([match.group(4), "%s on %s from/to %s - %s" % (match.group(1).capitalize(), match.group(2), match.group(3), match.group(4))])
- return retval
+ yield (match.group(4), "%s on %s from/to %s - %s" % (match.group(1).capitalize(), match.group(2), match.group(3), match.group(4)))