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

    >>> import feedmesh
    >>> for update in feedmesh.connect('sandbox.pubsub.com'):
    ...     print update['url']
    http://hollywoodfashiontrends.com/blogs/actors/default.aspx
    http://blog.evilikea.name/blog
    http://afzr.info
    [...and so on...]
"""
__author__ = "Aaron Swartz <http://www.aaronsw.com/>"
__version__ = "1.1"
__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):
        self.results = []
        
    def startElement(self, name, attr):
        if name == 'weblogUpdates':
            self.mode = 'weblogUpdates'
            
        elif name == 'weblog':
            self.results.append(dict(attr))
    
def connect(host, port=9999):
    s = Streamer()
    p = make_parser()
    p.setContentHandler(s)
    c = socket.socket()
    c.connect((host, port))
    for line in iter(lambda: c.recv(100), None):
        p.feed(line)
        while s.results: yield s.results.pop(0)
