_moduleLogger = logging.getLogger("browser_emu")
-socket.setdefaulttimeout(10)
+socket.setdefaulttimeout(20)
class MozillaEmulator(object):
def __init__(self, trycount = 1):
"""Create a new MozillaEmulator object.
- @param trycount: The download() method will retry the operation if it fails. You can specify -1 for infinite retrying.
- A value of 0 means no retrying. A value of 1 means one retry. etc."""
+ @param trycount: The download() method will retry the operation if it
+ fails. You can specify -1 for infinite retrying. A value of 0 means no
+ retrying. A value of 1 means one retry. etc."""
self.debug = False
self.trycount = trycount
self._cookies = cookielib.LWPCookieJar()
@return: The raw HTML page data
"""
- _moduleLogger.info("Performing download of %s" % url)
+ _moduleLogger.debug("Performing download of %s" % url)
if extraheaders is None:
extraheaders = {}
return openerdirector
return self._read(openerdirector, trycount)
- except urllib2.URLError:
+ except urllib2.URLError, e:
+ _moduleLogger.debug("%s: %s" % (e, url))
cnt += 1
if (-1 < trycount) and (trycount < cnt):
raise
# Retry :-)
- _moduleLogger.info("MozillaEmulator: urllib2.URLError, retryting %d" % cnt)
+ _moduleLogger.debug("MozillaEmulator: urllib2.URLError, retrying %d" % cnt)
def _build_opener(self, url, postdata = None, extraheaders = None, forbidRedirect = False):
if extraheaders is None:
)
u.addheaders = [(
'User-Agent',
- 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4'
+ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729)'
)]
if not postdata is None:
req.add_data(postdata)
class Conversation(object):
TYPE_VOICEMAIL = "Voicemail"
- TYPE_SMS = "Texts"
+ TYPE_SMS = "SMS"
def __init__(self):
self.type = None
if contactId != "0":
yield contactId, contactDetails
- def get_conversations(self):
+ def get_voicemails(self):
voicemailPage = self._get_page(self._XML_VOICEMAIL_URL)
voicemailHtml = self._grab_html(voicemailPage)
voicemailJson = self._grab_json(voicemailPage)
parsedVoicemail = self._parse_voicemail(voicemailHtml)
voicemails = self._merge_conversation_sources(parsedVoicemail, voicemailJson)
+ return voicemails
+ def get_texts(self):
smsPage = self._get_page(self._XML_SMS_URL)
smsHtml = self._grab_html(smsPage)
smsJson = self._grab_json(smsPage)
parsedSms = self._parse_sms(smsHtml)
smss = self._merge_conversation_sources(parsedSms, smsJson)
-
- allConversations = itertools.chain(voicemails, smss)
- return allConversations
+ return smss
def mark_message(self, messageId, asRead):
postData = {
raise ValueError('Number is not valid: "%s"' % number)
elif not self.is_authed():
raise RuntimeError("Not Authenticated")
-
- if len(number) == 11 and number[0] == 1:
- # Strip leading 1 from 11 digit dialing
- number = number[1:]
return number
def _parse_history(self, historyHtml):
def guess_phone_type(number):
- if number.startswith("747") or number.startswith("1747"):
+ if number.startswith("747") or number.startswith("1747") or number.startswith("+1747"):
return GVoiceBackend.PHONE_TYPE_GIZMO
else:
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 )
numbers = backend.get_callback_numbers()
priorityOrderedCriteria = [
+ ("\+1747", None),
("1747", None),
+ ("747", None),
(None, "gizmo"),
(None, "computer"),
(None, "sip"),
]
for numberCriteria, descriptionCriteria in priorityOrderedCriteria:
+ numberMatcher = None
+ descriptionMatcher = None
+ if numberCriteria is not None:
+ numberMatcher = re.compile(numberCriteria)
+ elif descriptionCriteria is not None:
+ descriptionMatcher = re.compile(descriptionCriteria, re.I)
+
for number, description in numbers.iteritems():
- if numberCriteria is not None and re.compile(numberCriteria).match(number) is None:
+ if numberMatcher is not None and numberMatcher.match(number) is None:
continue
- if descriptionCriteria is not None and re.compile(descriptionCriteria).match(description) is None:
+ if descriptionMatcher is not None and descriptionMatcher.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):