refactoring on the way. Need some more debug
[sface.git] / sface / xmlrpcwindow.py
diff --git a/sface/xmlrpcwindow.py b/sface/xmlrpcwindow.py
new file mode 100644 (file)
index 0000000..483d443
--- /dev/null
@@ -0,0 +1,56 @@
+import re
+from PyQt4.QtXml import QDomDocument
+from sface.xmlwidget import XmlWindow, DomModel
+
+class XmlrpcTracker():
+    def __init__(self):
+        self.xmlrpcWindow = XmlrpcWindow()
+
+    def getAndPrint(self, rawOutput):
+        self.store(rawOutput)
+        self.extractXml()
+        self.xmlrpcWindow.setData(self.xml)
+        self.showXmlrpc()
+
+    def showXmlrpc(self):
+        self.xmlrpcWindow.show()
+        self.xmlrpcWindow.resize(500, 640)
+        self.xmlrpcWindow.raise_()
+        self.xmlrpcWindow.activateWindow()
+
+    def store(self, rawOutput):
+        self.rawOutput = rawOutput
+
+    def extractXml(self):
+        pttrnAsk = '<methodCall>.*?</methodCall>'
+        pttrnAns = '<methodResponse>.*?</methodResponse>'
+        answers = re.compile(pttrnAsk, re.DOTALL).findall(self.rawOutput)
+        replies = re.compile(pttrnAns, re.DOTALL).findall(self.rawOutput)
+        # cleaning
+        answers = map(lambda x: x.replace('\\n','\n'), answers)
+        replies = map(lambda x: x.replace('\\n','\n').replace("'\nbody: '", ''), replies)
+        replies.reverse() # so that I use pop() as popleft
+        # A well-formed XML document must have one, and only one, top-level element
+        self.xml = '<debug>'
+        for ans in answers:
+            self.xml += ans + replies.pop()
+        self.xml += '</debug>'
+
+    def stats(self):
+        # statistics: round-trip time, size of the com
+        pass
+
+class XmlrpcWindow(XmlWindow):
+    def __init__(self, parent=None):
+        # super __init__() calls updateView,
+        # which assumes you have some data
+        self.data = '<debug/>'
+        XmlWindow.__init__(self, parent, 'XMLRPC window')
+
+    def setData(self, XmlrpcCom):
+        self.data = XmlrpcCom
+
+    def updateView(self):
+        XmlWindow.updateView(self)
+
+        self.document.setContent(self.data)