+ QWidget.__init__(self, parent=parent)
+
+ self.reader = XmlrpcReader()
+
+ labelCalls = QLabel("Calls: (from most recent to least recent)")
+
+ self.callTable = QTableWidget(self)
+ self.callTable.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.callTable.setSelectionMode(QAbstractItemView.SingleSelection)
+ self.callTable.setMaximumHeight(140)
+
+ labelArgs = QLabel("Params:")
+
+ self.argsTable = QTableWidget(self)
+ self.argsTable.setMaximumHeight(140)
+
+ labelXml = QLabel("XMLRPC Contents")
+ self.xmlView = XmlView(self)
+
+ self.delegate = XmlDelegate(self)
+ self.delegate.insertNodeDelegate('element', ElemNodeDelegate())
+ self.delegate.insertNodeDelegate('text', TextNodeDelegate())
+ self.delegate.insertNodeDelegate('comment', CommentNodeDelegate())
+ self.xmlView.setItemDelegate(self.delegate)
+
+ exportButton = QPushButton("&Export Call")
+ layoutButtons = QHBoxLayout()
+ layoutButtons.addWidget(exportButton)
+ layoutButtons.addStretch()
+
+ self.layout = QVBoxLayout()
+ self.layout.addWidget(labelCalls)
+ self.layout.addWidget(self.callTable)
+ self.layout.addWidget(labelArgs)
+ self.layout.addWidget(self.argsTable)
+ self.layout.addWidget(labelXml)
+ self.layout.addWidget(self.xmlView)
+ self.layout.addLayout(layoutButtons)
+
+ self.setLayout(self.layout)
+
+ self.connect(self.callTable, SIGNAL("itemSelectionChanged ()"), self.onCallSelect)
+ self.connect(exportButton, SIGNAL("clicked()"), self.onExportClicked)
+
+ def getAndPrint(self, rawOutput):
+ self.reader.store(rawOutput)
+ self.reader.extractXml()
+ self.updateCallTable()
+
+ def updateCallTable(self):
+ self.callTable.clear()
+ self.callTable.setColumnCount(3)
+ self.callTable.setHorizontalHeaderLabels(["name", "status", "faultString"])
+ self.callTable.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
+
+ calls = self.reader.calls
+ self.callTable.setRowCount(len(calls))
+
+ row = 0
+ reverse_calls = list(enumerate(calls))
+ reverse_calls.reverse()
+ for (index,call) in reverse_calls:
+ item = QTableWidgetItem(call.get("methodName", "unknown"))
+ item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
+ item.setData(Qt.UserRole, index)
+ self.callTable.setItem(row, 0, item)
+
+ item = QTableWidgetItem(call.get("kind", "unknown"))
+ item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
+ item.setData(Qt.UserRole, index)
+ self.callTable.setItem(row, 1, item)
+
+ item = QTableWidgetItem(call.get("faultString", ""))
+ item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
+ item.setData(Qt.UserRole, index)
+ self.callTable.setItem(row, 2, item)
+
+ row = row + 1
+
+ self.callTable.resizeColumnsToContents()
+
+ def updateArgsTable(self, args):
+ self.argsTable.clear()
+ self.argsTable.setColumnCount(1)
+ self.argsTable.setHorizontalHeaderLabels(["param"])
+ self.argsTable.horizontalHeader().hide()
+ self.argsTable.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
+
+ self.argsTable.setRowCount(len(args))
+
+ row = 0
+ for arg in args:
+ if len(arg)>255:
+ arg = arg[:255] + "..."
+
+ item = QTableWidgetItem(arg)
+ item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
+ self.argsTable.setItem(row, 0, item)
+
+ row = row + 1
+
+ self.argsTable.resizeColumnsToContents()
+
+ def getSelectedCall(self):
+ selItems = self.callTable.selectedItems()
+ if (len(selItems) <= 0):
+ return None
+
+ row = selItems[0].data(Qt.UserRole).toInt()[0]
+
+ calls = self.reader.calls
+ if len(calls)<=row:
+ return None
+
+ call = calls[row]
+
+ return call
+
+ def onCallSelect(self):
+ call = self.getSelectedCall()
+
+ if not call:
+ return
+
+ xml = "<debug>" + call.get("request","") + call.get("reply", "") + "</debug>"
+ #xml = call.get("request","") + call.get("reply", "")
+
+ self.displayXml(xml)
+
+ self.updateArgsTable(call.get("args",[]))
+
+ def onExportClicked(self):
+ call = self.getSelectedCall()
+
+ if not call:
+ return
+
+ filename = QFileDialog.getSaveFileName(self, 'Save File', '.')
+
+ f = open(filename, "w")
+ f.write(call.get("request","") + "\n")
+ f.write(call.get("reply","") + "\n")
+ f.close()
+
+
+ def displayXml(self, xml):
+ self.document = QDomDocument("XMLRPC Tracker")
+ self.document.setContent(xml)
+ self.model = DomModel(self.document, self)
+ self.xmlView.setModel(self.model)
+
+
+# There's one global tracker for XMLRPCs. Use init_tracker() to create it, and
+# get_tracker() to get it.
+
+glo_tracker = None
+
+def init_tracker(parent):
+ global glo_tracker
+
+ glo_tracker = XmlrpcTracker(parent)
+
+ return glo_tracker
+
+def get_tracker():
+ global glo_tracker