# about:python, originally by Alex Badea
from xpcom import components, verbose
import sys, os
import platform
def getAbout():
    # Generate it each time so its always up-to-date.
    # Sort to keep things purdy
    mod_names = sys.modules.keys()
    mod_names.sort()
    env = os.environ.items()
    env.sort()
    return """
  about:python
about:python
 
Python %(version)s on %(platform)s
resources
Visit the pyxpcom wiki.
sys.path
%(path)s
 
environment
%(environment)s
 
modules
%(modules)s
 
""" % {
    'version': sys.version,
    'platform': platform.platform(),
    'path': "
".join(sys.path),
    'environment': "
".join(["%s=%s" % (n,v) for n, v in env]),
    'modules': ", ".join(mod_names),
}
class AboutPython:
    _com_interfaces_ = components.interfaces.nsIAboutModule
    _reg_contractid_ = '@mozilla.org/network/protocol/about;1?what=python'
    _reg_clsid_ = '{6d5d462e-6de7-4bca-bbc6-c488d481351b}'
    _reg_desc_ = "about:python handler"
    def __init__(self):
        pass
    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;