"""
feedmesh: a more efficient way to get feed updates
http://www.aaronsw.com/2002/atomstream/

    >>> import feedmesh
    >>> def callback(f):
    ...     u = f['url']
    ...     if not u.startswith('http://spaces.msn.com/'):
    ...         print u
    ... 
    >>> feedmesh.connect(callback, ('sandbox.pubsub.com', 9999))
    http://hollywoodfashiontrends.com/blogs/actors/default.aspx
    http://blog.evilikea.name/blog
    http://afzr.info
    [...and so on...]

callback receives a dictionary with the information sent by the server.
"""
__author__ = "Aaron Swartz <http://www.aaronsw.com/>"
__version__ = "1.0"
__license__ = "public domain"

import urllib, logging, socket
from xml.sax.handler import EntityResolver, DTDHandler, ContentHandler, ErrorHandler
from xml.sax.saxutils import XMLGenerator
from xml.sax import make_parser
from StringIO import StringIO

import feedparser

class Streamer(EntityResolver, DTDHandler, ContentHandler, ErrorHandler):
    def __init__(self, callback):
        self.callback = callback
        
    def startElement(self, name, attr):
        if name == 'weblogUpdates':
            self.mode = 'weblogUpdates'
            
        elif name == 'weblog':
            self.callback(dict(attr))
    
def connect(callback, server):
    s = Streamer(callback)
    p = make_parser()
    p.setContentHandler(s)
    s = socket.socket()
    s.connect(server)
    for line in iter(lambda: s.recv(100), None):
        p.feed(line)
