* More debug info printed when users have issues
authorepage <eopage@byu.net>
Thu, 19 Mar 2009 02:54:09 +0000 (02:54 +0000)
committerepage <eopage@byu.net>
Thu, 19 Mar 2009 02:54:09 +0000 (02:54 +0000)
* Bringing the two backends code bases more inline with eachother
* Minor bug fixes

git-svn-id: file:///svnroot/gc-dialer/trunk@225 c39d3808-3fe2-4d86-a59f-b7f623ee9f21

src/dialer.py
src/gc_backend.py
src/gc_views.py
src/gv_backend.py
src/maemo_backend.py

index 3e20e36..b58676e 100755 (executable)
@@ -27,6 +27,7 @@ import gc
 import os
 import threading
 import warnings
+import traceback
 
 import gtk
 import gtk.glade
@@ -171,11 +172,12 @@ class Dialcentral(object):
                        (gv_backend.GVDialer, os.path.join(self._data_path, "gv_cookies.txt")),
                        (gc_backend.GCDialer, os.path.join(self._data_path, "gc_cookies.txt")),
                ]
+               backendFactory, cookieFile = None, None
                for backendFactory, cookieFile in self._phoneBackends:
                        if os.path.exists(cookieFile):
                                break
                else:
-                       backendFactory, cookiFile = self._phoneBackends[0]
+                       backendFactory, cookieFile = self._phoneBackends[0]
                self._phoneBackend = backendFactory(cookieFile)
                gtk.gdk.threads_enter()
                try:
@@ -262,6 +264,7 @@ class Dialcentral(object):
                                        if loggedIn:
                                                break
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        gtk.gdk.threads_enter()
                        try:
                                self._errorDisplay.push_message(e.message)
@@ -398,6 +401,7 @@ class Dialcentral(object):
                try:
                        loggedIn = self._phoneBackend.is_authed()
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        loggedIn = False
                        self._errorDisplay.push_message(e.message)
                        return
@@ -414,8 +418,10 @@ class Dialcentral(object):
                        self._phoneBackend.dial(number)
                        dialed = True
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        self._errorDisplay.push_message(e.message)
                except ValueError, e:
+                       warnings.warn(traceback.format_exc())
                        self._errorDisplay.push_message(e.message)
 
                if dialed:
index e1573db..7afcde5 100644 (file)
@@ -28,6 +28,7 @@ import urllib
 import urllib2
 import time
 import warnings
+import traceback
 
 from browser_emu import MozillaEmulator
 
@@ -90,17 +91,18 @@ class GCDialer(object):
                        return True
 
                try:
-                       forwardSelectionPage = self._browser.download(GCDialer._forwardselectURL)
+                       forwardSelectionPage = self._browser.download(self._forwardselectURL)
                except urllib2.URLError, e:
-                       raise RuntimeError("%s is not accesible" % GCDialer._forwardselectURL)
+                       warnings.warn(traceback.format_exc())
+                       raise RuntimeError("%s is not accesible" % self._forwardselectURL)
 
                self._browser.cookies.save()
-               if GCDialer._isLoginPageRe.search(forwardSelectionPage) is None:
-                       self._grab_token(forwardSelectionPage)
-                       self._lastAuthed = time.time()
-                       return True
+               if self._isLoginPageRe.search(forwardSelectionPage) is not None:
+                       return False
 
-               return False
+               self._grab_token(forwardSelectionPage)
+               self._lastAuthed = time.time()
+               return True
 
        def login(self, username, password):
                """
@@ -113,9 +115,10 @@ class GCDialer(object):
                loginPostData = urllib.urlencode( {'username' : username , 'password' : password } )
 
                try:
-                       loginSuccessOrFailurePage = self._browser.download(GCDialer._loginURL, loginPostData)
+                       loginSuccessOrFailurePage = self._browser.download(self._loginURL, loginPostData)
                except urllib2.URLError, e:
-                       raise RuntimeError("%s is not accesible" % GCDialer._loginURL)
+                       warnings.warn(traceback.format_exc())
+                       raise RuntimeError("%s is not accesible" % self._loginURL)
 
                return self.is_authed()
 
@@ -130,28 +133,26 @@ class GCDialer(object):
                """
                This is the main function responsible for initating the callback
                """
-               # If the number is not valid throw exception
                if not self.is_valid_syntax(number):
-                       raise ValueError('number is not valid')
-
-               # No point if we don't have the magic cookie
-               if not self.is_authed():
+                       raise ValueError('Number is not valid: "%s"' % number)
+               elif not self.is_authed():
                        raise RuntimeError("Not Authenticated")
 
-               # Strip leading 1 from 11 digit dialing
                if len(number) == 11 and number[0] == 1:
+                       # Strip leading 1 from 11 digit dialing
                        number = number[1:]
 
                try:
                        callSuccessPage = self._browser.download(
-                               GCDialer._clicktocallURL % (self._accessToken, number),
+                               self._clicktocallURL % (self._accessToken, number),
                                None,
                                {'Referer' : 'http://www.grandcentral.com/mobile/messages'}
                        )
                except urllib2.URLError, e:
-                       raise RuntimeError("%s is not accesible" % GCDialer._clicktocallURL)
+                       warnings.warn(traceback.format_exc())
+                       raise RuntimeError("%s is not accesible" % self._clicktocallURL)
 
-               if GCDialer._gcDialingStrRe.search(callSuccessPage) is None:
+               if self._gcDialingStrRe.search(callSuccessPage) is None:
                        raise RuntimeError("Grand Central returned an error")
 
                return True
@@ -182,17 +183,17 @@ class GCDialer(object):
                numbers = self.get_callback_numbers()
 
                for number, description in numbers.iteritems():
-                       if not re.compile(r"""1747""").match(number) is None:
+                       if re.compile(r"""1747""").match(number) is not None:
                                self.set_callback_number(number)
                                return
 
                for number, description in numbers.iteritems():
-                       if not re.compile(r"""gizmo""", re.I).search(description) is None:
+                       if re.compile(r"""gizmo""", re.I).search(description) is not None:
                                self.set_callback_number(number)
                                return
 
                for number, description in numbers.iteritems():
-                       if not re.compile(r"""computer""", re.I).search(description) is None:
+                       if re.compile(r"""computer""", re.I).search(description) is not None:
                                self.set_callback_number(number)
                                return
 
@@ -220,9 +221,10 @@ class GCDialer(object):
                        'default_number': callbacknumber
                })
                try:
-                       callbackSetPage = self._browser.download(GCDialer._setforwardURL, callbackPostData)
+                       callbackSetPage = self._browser.download(self._setforwardURL, callbackPostData)
                except urllib2.URLError, e:
-                       raise RuntimeError("%s is not accesible" % GCDialer._setforwardURL)
+                       warnings.warn(traceback.format_exc())
+                       raise RuntimeError("%s is not accesible" % self._setforwardURL)
 
                self._browser.cookies.save()
                return True
@@ -241,9 +243,10 @@ class GCDialer(object):
                @returns Iterable of (personsName, phoneNumber, date, action)
                """
                try:
-                       recentCallsPage = self._browser.download(GCDialer._inboxallURL)
+                       recentCallsPage = self._browser.download(self._inboxallURL)
                except urllib2.URLError, e:
-                       raise RuntimeError("%s is not accesible" % GCDialer._inboxallURL)
+                       warnings.warn(traceback.format_exc())
+                       raise RuntimeError("%s is not accesible" % self._inboxallURL)
 
                for match in self._inboxRe.finditer(recentCallsPage):
                        phoneNumber = match.group(4)
@@ -276,11 +279,12 @@ class GCDialer(object):
                if self.__contacts is None:
                        self.__contacts = []
 
-                       contactsPagesUrls = [GCDialer._contactsURL]
+                       contactsPagesUrls = [self._contactsURL]
                        for contactsPageUrl in contactsPagesUrls:
                                try:
                                        contactsPage = self._browser.download(contactsPageUrl)
                                except urllib2.URLError, e:
+                                       warnings.warn(traceback.format_exc())
                                        raise RuntimeError("%s is not accesible" % contactsPageUrl)
                                for contact_match in self._contactsRe.finditer(contactsPage):
                                        contactId = contact_match.group(1)
@@ -302,9 +306,10 @@ class GCDialer(object):
                @returns Iterable of (Phone Type, Phone Number)
                """
                try:
-                       detailPage = self._browser.download(GCDialer._contactDetailURL + '/' + contactId)
+                       detailPage = self._browser.download(self._contactDetailURL + '/' + contactId)
                except urllib2.URLError, e:
-                       raise RuntimeError("%s is not accesible" % GCDialer._contactDetailURL)
+                       warnings.warn(traceback.format_exc())
+                       raise RuntimeError("%s is not accesible" % self._contactDetailURL)
 
                for detail_match in self._contactDetailPhoneRe.finditer(detailPage):
                        phoneType = detail_match.group(1)
@@ -313,12 +318,33 @@ class GCDialer(object):
 
        def _grab_token(self, data):
                "Pull the magic cookie from the datastream"
-               atGroup = GCDialer._accessTokenRe.search(data)
+               atGroup = self._accessTokenRe.search(data)
                self._accessToken = atGroup.group(1)
 
-               anGroup = GCDialer._accountNumRe.search(data)
+               anGroup = self._accountNumRe.search(data)
                self._accountNum = anGroup.group(1)
 
                self._callbackNumbers = {}
-               for match in GCDialer._callbackRe.finditer(data):
+               for match in self._callbackRe.finditer(data):
                        self._callbackNumbers[match.group(1)] = match.group(2)
+
+
+def test_backend(username, password):
+       import pprint
+       backend = GCDialer()
+       print "Authenticated: ", backend.is_authed()
+       print "Login?: ", backend.login(username, password)
+       print "Authenticated: ", backend.is_authed()
+       print "Token: ", backend._token
+       print "Account: ", backend.get_account_number()
+       print "Callback: ", backend.get_callback_number()
+       # print "All Callback: ",
+       # pprint.pprint(backend.get_callback_numbers())
+       # print "Recent: ",
+       # pprint.pprint(list(backend.get_recent()))
+       # print "Contacts: ",
+       # for contact in backend.get_contacts():
+       #       print contact
+       #       pprint.pprint(list(backend.get_contact_details(contact[0])))
+
+       return backend
index c0074ce..f605e1e 100644 (file)
@@ -20,6 +20,7 @@
 import threading
 import time
 import warnings
+import traceback
 
 import gobject
 import gtk
@@ -64,6 +65,8 @@ def make_pretty(phonenumber):
        if phonenumber is None or phonenumber is "":
                return ""
 
+       phonenumber = make_ugly(phonenumber)
+
        if len(phonenumber) < 3:
                return phonenumber
 
@@ -398,6 +401,7 @@ class Dialpad(object):
                        self._prettynumber = make_pretty(self._phonenumber)
                        self._numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % (self._prettynumber))
                except TypeError, e:
+                       warnings.warn(traceback.format_exc())
                        self._errorDisplay.push_message(e.message)
 
        def clear(self):
@@ -473,6 +477,7 @@ class AccountInfo(object):
                try:
                        callbackNumbers = self._backend.get_callback_numbers()
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        self._errorDisplay.push_message(e.message)
                        return
 
@@ -484,6 +489,7 @@ class AccountInfo(object):
                try:
                        callbackNumber = self._backend.get_callback_number()
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        self._errorDisplay.push_message(e.message)
                        return
                self._callbackCombo.get_child().set_text(make_pretty(callbackNumber))
@@ -501,6 +507,7 @@ class AccountInfo(object):
                        else:
                                self._backend.set_callback_number(text)
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        self._errorDisplay.push_message(e.message)
 
 
@@ -558,6 +565,7 @@ class RecentCallsView(object):
                try:
                        recentItems = self._backend.get_recent()
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        gtk.gdk.threads_enter()
                        try:
                                self._errorDisplay.push_message(e.message)
@@ -565,6 +573,7 @@ class RecentCallsView(object):
                                gtk.gdk.threads_leave()
                        self._recenttime = 0.0
                        recentItems = []
+
                for personsName, phoneNumber, date, action in recentItems:
                        description = "%s on %s from/to %s - %s" % (action.capitalize(), date, personsName, phoneNumber)
                        item = (phoneNumber, description)
@@ -712,6 +721,7 @@ class ContactsView(object):
                try:
                        contacts = addressBook.get_contacts()
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        contacts = []
                        self._contactstime = 0.0
                        gtk.gdk.threads_enter()
@@ -745,6 +755,7 @@ class ContactsView(object):
                try:
                        contactDetails = self._addressBook.get_contact_details(contactId)
                except RuntimeError, e:
+                       warnings.warn(traceback.format_exc())
                        contactDetails = []
                        self._contactstime = 0.0
                        self._errorDisplay.push_message(e.message)
index 4d974c7..a6efd77 100644 (file)
@@ -1,3 +1,15 @@
+#!/usr/bin/python
+
+# DialCentral - Front end for Google's Grand Central service.
+# Copyright (C) 2008  Eric Warnke ericew AT gmail DOT com
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # Lesser General Public License for more details.
 # 
@@ -20,6 +32,7 @@ import urllib
 import urllib2
 import time
 import warnings
+import traceback
 
 from xml.etree import ElementTree
 
@@ -50,7 +63,7 @@ if simplejson is None:
                return safe_eval(flattened)
 else:
        def parse_json(flattened):
-               return simplejson.loads(json)
+               return simplejson.loads(flattened)
 
 
 class GVDialer(object):
@@ -115,12 +128,14 @@ class GVDialer(object):
                try:
                        inboxPage = self._browser.download(self._inboxURL)
                except urllib2.URLError, e:
+                       warnings.warn(traceback.format_exc())
                        raise RuntimeError("%s is not accesible" % self._inboxURL)
 
                self._browser.cookies.save()
                if self._isNotLoginPageRe.search(inboxPage) is not None:
                        return False
 
+               self._grab_account_info()
                self._lastAuthed = time.time()
                return True
 
@@ -129,8 +144,8 @@ class GVDialer(object):
                Attempt to login to grandcentral
                @returns Whether login was successful or not
                """
-               #if self.is_authed():
-               #       return True
+               if self.is_authed():
+                       return True
 
                loginPostData = urllib.urlencode({
                        'Email' : username,
@@ -141,10 +156,9 @@ class GVDialer(object):
                try:
                        loginSuccessOrFailurePage = self._browser.download(self._loginURL, loginPostData)
                except urllib2.URLError, e:
+                       warnings.warn(traceback.format_exc())
                        raise RuntimeError("%s is not accesible" % self._loginURL)
 
-               #self._grab_account_info(loginSuccessOrFailurePage)
-               self._grab_account_info()
                return self.is_authed()
 
        def logout(self):
@@ -178,6 +192,7 @@ class GVDialer(object):
                        }
                        callSuccessPage = self._browser.download(self._clicktocallURL, clickToCallData, None, otherData)
                except urllib2.URLError, e:
+                       warnings.warn(traceback.format_exc())
                        raise RuntimeError("%s is not accesible" % self._clicktocallURL)
 
                if self._gvDialingStrRe.search(callSuccessPage) is None:
@@ -252,6 +267,7 @@ class GVDialer(object):
                try:
                        callbackSetPage = self._browser.download(self._setforwardURL, callbackPostData)
                except urllib2.URLError, e:
+                       warnings.warn(traceback.format_exc())
                        raise RuntimeError("%s is not accesible" % self._setforwardURL)
 
                self._browser.cookies.save()
@@ -275,6 +291,7 @@ class GVDialer(object):
                        try:
                                allRecentData = self._grab_json(url)
                        except urllib2.URLError, e:
+                               warnings.warn(traceback.format_exc())
                                raise RuntimeError("%s is not accesible" % self._clicktocallURL)
 
                        for recentCallData in allRecentData["messages"].itervalues():
@@ -316,6 +333,7 @@ class GVDialer(object):
                                try:
                                        contactsPage = self._browser.download(contactsPageUrl)
                                except urllib2.URLError, e:
+                                       warnings.warn(traceback.format_exc())
                                        raise RuntimeError("%s is not accesible" % self._clicktocallURL)
                                for contact_match in self._contactsRe.finditer(contactsPage):
                                        contactId = contact_match.group(1)
@@ -339,6 +357,7 @@ class GVDialer(object):
                try:
                        detailPage = self._browser.download(self._contactDetailURL + '/' + contactId)
                except urllib2.URLError, e:
+                       warnings.warn(traceback.format_exc())
                        raise RuntimeError("%s is not accesible" % self._clicktocallURL)
 
                for detail_match in self._contactDetailPhoneRe.finditer(detailPage):
@@ -370,6 +389,7 @@ class GVDialer(object):
                self._callbackNumbers = {}
                for match in self._callbackRe.finditer(callbackPage):
                        self._callbackNumbers[match.group(2)] = match.group(1)
+
                if len(self._callbackNumber) == 0:
                        self.set_sane_callback()
 
index 6413826..3b04356 100644 (file)
@@ -44,10 +44,10 @@ class MaemoAddressBook(object):
        def __init__(self, contextName, context):
                if not self.is_supported():
                        return
-               
+
                abook.init_with_name(contextName, context)
                self._book = abook.all_group_get()
-       
+
        @classmethod
        def is_supported(cls):
                return abook is not None and ebook is not None
@@ -60,7 +60,7 @@ class MaemoAddressBook(object):
                        return
 
                yield self, "", ""
-       
+
        def open_addressbook(self, bookId):
                return self
 
@@ -79,7 +79,7 @@ class MaemoAddressBook(object):
                if not self.is_supported():
                        return
                pass
-       
+
        def get_contact_details(self, contactId):
                """
                @returns Iterable of (Phone Type, Phone Number)