from __future__ import division

import getpass

from twisted.internet.defer import deferredGenerator as dg, waitForDeferred as wfd
from twisted.internet import protocol, reactor
from twisted.mail import pop3

class ProgressReporterFile(file):
    def __init__(self, size, *a, **kw):
        self.written = 0
        self.size = size
        file.__init__(self, *a, **kw)
    
    def writeOneLine(self, line):
        self.written += len(line) + 1
        file.write(self, line + '\n')
        print 'File %d%% complete' % (self.written / self.size * 100)


class POP3ProgressBar(pop3.AdvancedPOP3Client):
    def connectionMade(self):
        d = wfd(self.login(raw_input("Username: "), getpass.getpass("Password: ")))
        yield d
        d.getResult()

        d = wfd(self.listSize())
        yield d
        sizes = d.getResult()
        
        for (index, size) in enumerate(sizes):
            f = ProgressReporterFile(size, 'pop3.%s' % (index,), 'w')
            d = wfd(self.retrieve(index, f.writeOneLine))
            yield d
            d.getResult()
            
            f.close()
    connectionMade = dg(connectionMade)

    def connectionLost(self, reason):
        print reason
        reactor.stop()


def main():
    f = protocol.ClientFactory()
    f.protocol = POP3ProgressBar
    reactor.connectTCP(raw_input('Hostname: '), 110, f)
    reactor.run()

if __name__ == '__main__':
    main()
