#!/usr/bin/python

from mailbox import *
import sys

class MyAddressList(rfc822.AddressList):
    """ fix a bug in the rfc822 class """
    def __getitem__(self, index):
        return self.addresslist[index]

def msgIdToURI(mid):
    return "mid:" + mid[1:-1]

def writeAsRDF(stream, namehash, msghash):
    stream.write("""<?xml version='1.0'?>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
         xmlns:m='http://edd.oreillynet.com/mailbox/'>
""")
    for addr in namehash.keys():
        names=namehash[addr]
        stream.write("<rdf:Description about='mailto:")
        stream.write(addr)
        stream.write("'>\n")
        for alias in names:
            stream.write("<m:realName>")
            stream.write(alias)
            stream.write("</m:realName>\n")
        stream.write("</rdf:Description>\n\n")

    for addr in msghash.keys():
        for (msgid, msgdate, msgsubj) in msghash[addr]:
            stream.write("<rdf:Description about='")
            stream.write(msgIdToURI(msgid))
            stream.write("'>\n")
            if msgsubj!=None:
                stream.write("<m:subject>")
                stream.write(msgsubj)
                stream.write("</m:subject>\n")
            stream.write("<m:timestamp>")
            stream.write(msgdate)
            stream.write("</m:timestamp>\n");
            stream.write("<m:author rdf:resource='mailto:")
            stream.write(addr)
            stream.write("' />\n")
            stream.write("</rdf:Description>\n\n")
        
    stream.write("</rdf:RDF>\n")

if __name__ == "__main__":
    box=UnixMailbox(sys.stdin)
    msg=box.next()

    realnames={}
    wrote={}
    
    while msg != None:
        # first, split out names
        adlist=MyAddressList(msg.getheader('From'))
        (fname, emailaddr)=adlist[0]
        if fname!='':
            if realnames.has_key(emailaddr):
                if realnames[emailaddr].count(fname)==0:
                    realnames[emailaddr].append(fname)
            else:
                realnames[emailaddr]=[fname]

        # next, record what each person wrote
        if not wrote.has_key(emailaddr):
            wrote[emailaddr]=[]
        wrote[emailaddr].append((msg.getheader('Message-ID'),
                                 msg.getheader('Date'),
                                 msg.getheader('Subject')))
        msg=box.next()

    # data extracted, time to serialize as RDF
    writeAsRDF(sys.stdout, realnames, wrote)
