import sys, string
import traceback
from win32com.axdebug import axdebug
from win32com.client.util import Enumerator
import pythoncom

def DumpDebugApplicationNode(node, level = 0):
    # Recursive dump of a DebugApplicationNode
    spacer = " " * level
    for desc, attr in [("Node Name", axdebug.DOCUMENTNAMETYPE_APPNODE),
                       ("Title", axdebug.DOCUMENTNAMETYPE_TITLE),
                       ("Filename", axdebug.DOCUMENTNAMETYPE_FILE_TAIL),
                       ("URL", axdebug.DOCUMENTNAMETYPE_URL),
                       ]:
        try:
            info = node.GetName(attr)
        except pythoncom.com_error:
            info = "<N/A>"
        print "%s%s: %s" % (spacer, desc, info)
    try:
        doc = node.GetDocument()
    except pythoncom.com_error:
        doc = None
    if doc:
        doctext = doc.QueryInterface(axdebug.IID_IDebugDocumentText)
        numLines, numChars = doctext.GetSize()
#                       text, attr = doctext.GetText(0, 20, 1)
        text, attr = doctext.GetText(0, numChars, 1)
        print "%sText is %s, %d bytes long" % (spacer, repr(text[:40]+"..."), len(text))
    else:
        print "%s%s" % (spacer, "<No document available>")

    for child in Enumerator(node.EnumChildren()):
        DumpDebugApplicationNode(child, level+1)

def dumpall():
    dm=pythoncom.CoCreateInstance(axdebug.CLSID_MachineDebugManager,None,pythoncom.CLSCTX_ALL, axdebug.IID_IMachineDebugManager)
    e=Enumerator(dm.EnumApplications())
    for app in e:
        print "Application: %s" % app.GetName()
        node = app.GetRootNode() # of type PyIDebugApplicationNode->PyIDebugDocumentProvider->PyIDebugDocumentInfo
        DumpDebugApplicationNode(node)

if __name__=='__main__':
    try:
        dumpall()
    except:
        traceback.print_exc()
