from xpcom import components, verbose
import sys, os
import logging
import platform

_ensoStarted = False

def getAbout():
    global _ensoStarted

    import enso
    if not _ensoStarted:
        logging.info("Launching Enso.")
        _ensoStarted = True
        enso.run()
    return "Enso is running."

class ShutdownObserver:
    _com_interfaces_ = components.interfaces.nsIObserver

    def observe(self, subject, topic, data):
        print "quit-application received; calling sys.exitfunc()."
        sys.exitfunc()

class AboutPython:
    _com_interfaces_ = components.interfaces.nsIAboutModule
    _reg_contractid_ = '@mozilla.org/network/protocol/about;1?what=enso'
    _reg_clsid_ = '{6d5d462e-6de7-4bca-bbc6-c488d481351c}'
    _reg_desc_ = "about:enso handler"

    def __init__(self):
        logging.basicConfig( level=logging.INFO )
        logging.info("Setting shutdown observer.")
        observerService = components.classes["@mozilla.org/observer-service;1"].getService(components.interfaces.nsIObserverService)
        observerService.addObserver(ShutdownObserver(), "quit-application", False)

    def newChannel(self, aURI):
        ioService = components.classes["@mozilla.org/network/io-service;1"] \
            .getService();

        istream = components.classes["@mozilla.org/io/string-input-stream;1"] \
            .createInstance()

        about = getAbout()
        istream.setData(about, len(about))

        channel = components.classes["@mozilla.org/network/input-stream-channel;1"] \
            .createInstance(components.interfaces.nsIInputStreamChannel)

        channel.setURI(aURI)
        #channel.contentType = "text/html"
        channel.contentStream = istream
        return channel

    def getURIFlags(self, aURI):
        return 0;
