3 |
import straw |
import straw |
4 |
import time |
import time |
5 |
import gtk |
import gtk |
|
from error import log, logtb |
|
|
from urllib import quote as urlquote |
|
|
import traceback |
|
6 |
import socket |
import socket |
7 |
|
|
8 |
class PollManager: |
class PollManager: |
11 |
gtk.timeout_add(10000, self.maybe_poll) |
gtk.timeout_add(10000, self.maybe_poll) |
12 |
|
|
13 |
def maybe_poll(self): |
def maybe_poll(self): |
14 |
|
self.poll_network() |
15 |
|
|
16 |
time_diff = int(time.time()) - straw.config.last_poll |
time_diff = int(time.time()) - straw.config.last_poll |
17 |
try: |
|
18 |
assert straw.config.poll_frequency > 0, "Polling Frequency is set to 0" |
if not straw.config.offline and time_diff > straw.config.poll_frequency: |
19 |
if not straw.config.offline and time_diff > straw.config.poll_frequency: |
self.poll() |
20 |
self.poll() |
|
21 |
except AssertionError: |
gtk.timeout_add(straw.NetworkConstants.POLL_INTERVAL, self.maybe_poll) |
|
pass |
|
|
gtk.timeout_add(10000, self.maybe_poll) |
|
22 |
|
|
23 |
def poll(self, feed = None): |
def poll(self, feed = None): |
|
# FIXME: notify when offline key has changed |
|
24 |
if straw.config.offline: |
if straw.config.offline: |
|
e_title = "Unable to Poll Feeds" |
|
|
e_body = "You are currently offline. You have to be online to be able to poll feeds." |
|
25 |
if feed is not None: |
if feed is not None: |
26 |
|
e_title = _("Unable to Poll %s") % feed.title |
27 |
|
e_body = _("You are currently offline. You have to be online to be able to poll this feed.") |
28 |
straw.hig_alert.reportOfflineStatus(e_title, e_body, feed) |
straw.hig_alert.reportOfflineStatus(e_title, e_body, feed) |
|
return |
|
29 |
else: |
else: |
30 |
|
e_title = "Unable to Poll Feeds" |
31 |
|
e_body = "You are currently offline. You have to be online to be able to poll feeds." |
32 |
straw.hig_alert.reportOfflineStatus(e_title, e_body) |
straw.hig_alert.reportOfflineStatus(e_title, e_body) |
|
return |
|
33 |
|
|
34 |
straw.main.display_status_message(_("Starting polling")) |
return 0 |
35 |
|
|
36 |
if feed: |
if feed: |
37 |
feeds = [feed] |
feeds = [feed] |
38 |
else: |
else: |
39 |
feeds = straw.config.feeds |
feeds = straw.config.feeds |
40 |
straw.config.last_poll = int(time.time()) |
straw.config.last_poll = int(time.time()) |
41 |
|
|
42 |
|
straw.main.display_status_message(_("Polling Feeds...")) |
43 |
|
|
44 |
for f in feeds: |
for f in feeds: |
45 |
if f not in self.pollers: |
self.pollers.append(f) |
46 |
straw.main.display_status_message( |
p = Poller(f, self) |
47 |
_("Polling %s...") % f.title) |
p.poll() |
48 |
self.pollers.append(f) |
|
49 |
p = Poller(f, self) |
def poll_network(self): |
50 |
p.poll() |
try: |
51 |
|
straw.URLFetch.connection_manager.poll(straw.NetworkConstants.POLL_TIMEOUT) |
52 |
|
except socket.error: |
53 |
|
straw.config.offline = not straw.config.offline |
54 |
|
straw.hig_alert.reportOfflineStatus("Offline", "Poll Error") |
55 |
|
|
56 |
def poller_finished(self, feed): |
def poller_finished(self, feed): |
57 |
self.pollers.remove(feed) |
self.pollers.remove(feed) |
58 |
|
|
59 |
class Poller: |
class Poller: |
|
_parser = straw.SummaryParser() |
|
60 |
_parsermp = straw.SummaryParserMP() |
_parsermp = straw.SummaryParserMP() |
61 |
|
|
62 |
def __init__(self, feed, pm): |
def __init__(self, feed, pm): |
70 |
return 0 |
return 0 |
71 |
|
|
72 |
headers = {} |
headers = {} |
73 |
if self._feed.previous_etag is not None: |
if self._feed.previous_etag is not None or self._feed.previous_etag != "": |
74 |
headers['If-None-Match'] = self._feed.previous_etag |
headers['If-None-Match'] = self._feed.previous_etag |
75 |
try: |
try: |
76 |
pc = straw.URLFetch.connection_manager.request( |
pc = straw.URLFetch.connection_manager.request( |
94 |
def update_feed(self, status, header, data): |
def update_feed(self, status, header, data): |
95 |
straw.main.display_status_message( |
straw.main.display_status_message( |
96 |
_("Parsing data for feed %s...") % self._feed.title) |
_("Parsing data for feed %s...") % self._feed.title) |
97 |
|
|
98 |
if status[1] == 304: |
if status[1] == 304: |
99 |
self._feed.router.route_no_data() |
self._feed.router.route_no_data() |
100 |
return 1 |
return 1 |
104 |
elif status[1] != 200 and status[1] > 299: |
elif status[1] != 200 and status[1] > 299: |
105 |
self._feed.router.set_error(_("Polling feed resulted in abnormal status '%s' (code %d)") % (status[2], status[1])) |
self._feed.router.set_error(_("Polling feed resulted in abnormal status '%s' (code %d)") % (status[2], status[1])) |
106 |
return 0 |
return 0 |
107 |
|
|
108 |
parsed = "" |
parsed = "" |
109 |
|
|
110 |
try: |
try: |
|
parsed = self._parser.parse(data, self._feed) |
|
|
except straw.RSSParseException, e: |
|
111 |
parsed = self._parsermp.parse(data, self._feed) |
parsed = self._parsermp.parse(data, self._feed) |
|
parsed.invalid_rss = 1 |
|
112 |
except Exception, e: |
except Exception, e: |
113 |
self._feed.error = _( |
self._feed.error = _("Unknown exception when parsing RSS: %s") % str(e) |
|
"Unknown exception when parsing RSS: %s") % str(e) |
|
114 |
return 0 |
return 0 |
115 |
|
|
116 |
self._feed.router.route_all(header, parsed) |
self._feed.router.route_all(header, parsed) |
117 |
return 1 |
return 1 |
118 |
|
|
131 |
(oldloc, u, p) = self._feed.access_info |
(oldloc, u, p) = self._feed.access_info |
132 |
self._feed.access_info = (location, u, p) |
self._feed.access_info = (location, u, p) |
133 |
|
|
|
class RSSParseException(Exception): |
|
|
pass |
|