""" FeedDataRouter.py
Module for routing feed data from the poller
"""
__copyright__ = "Copyright (c) 2002-2005 Free Software Foundation, Inc."
__license__ = """
Straw is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
Straw 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 General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. """
import Event
import ImageCache
class FeedDataRouter(object):
def __init__(self, feed):
ImageCache.cache.signal_connect(Event.ImageUpdatedSignal,
self.image_updated)
self._feed = feed
self._stopper = None
# stuff we are potentially waiting for
self._wait_data = 0
self._wait_images = {}
# public parts
def start_polling(self):
self._wait_data = 1
self.update_process_status()
def route_no_data(self):
self._wait_data = 0
self._feed.error = None
self._stopper = None
self.update_process_status()
def route_all(self, header, parsed):
needed_loading = self._feed.load_contents()
self.route_data(header, parsed)
self.route_extras()
if needed_loading:
self._feed.unload_contents()
def route_data(self, header, parsed):
if header:
etag = header.getheader('etag', None)
if etag:
etag = etag.strip()
self._feed.previous_etag = etag
self._feed.channel_title = parsed.title
self._feed.channel_description = parsed.description
self._feed.channel_copyright = parsed.copyright
self._feed.channel_link = parsed.link
self._feed.channel_creator = parsed.creator
if len(parsed.items):
parsed.items.reverse()
self._feed.add_items(parsed.items)
self._feed.error = None
self._wait_data = 0
self._feed.poll_done()
def route_extras(self):
try:
for i in self._feed.items:
for name in i.image_keys():
image = i.get_image(name)
if image.status == image.WAITING:
self._wait_images[image.url] = 1
except Exception, ex:
# if we don't get the images, we can probably still show
# the text
pass
self.update_process_status()
def set_error(self, err):
self._wait_data = 0
self._feed.error = err
self.update_process_status()
return
def set_stopper(self, stopper):
self._stopper = stopper
stopper.signal_connect(Event.PollingStoppedSignal,
self._polling_stopped)
def get_stopper(self): return self._stopper
stopper = property(get_stopper, set_stopper)
def poll_done(self):
self._feed.poll_done()
self._stopper = None
def stop_polling(self):
if self._stopper:
self._stopper.stop()
self._stopper = None
for image in self._wait_images.keys():
ImageCache.cache.stop_transfer(image)
del self._wait_images[image]
self.update_process_status()
self._feed.poll_done()
def _polling_stopped(self, signal):
self.poll_done()
# private parts
def image_updated(self, signal):
if signal.url in self._wait_images:
del self._wait_images[signal.url]
self.update_process_status()
def update_process_status(self):
length_images = len(self._wait_images)
if self._wait_data or length_images:
self._feed.process_status = self._feed.STATUS_POLLING
else:
self._feed.process_status = self._feed.STATUS_IDLE
syntax highlighted by Code2HTML, v. 0.9.1