diff sat/plugins/plugin_misc_xmllog.py @ 2691:1ecceac3df96

plugin XEP-0198: Stream Management implementation: - hooks can now be set in stream onElement and send methods - xmllog refactored to use new hooks - client.isConnected now uses transport.connected method - fixed reconnection, SàT will now try to reconnect indefinitely until it success, unresolvable failure happen (e.g. invalid certificate), or explicit disconnection is requested (or a plugin change this behaviour) - new triggers: "stream_hooks", "disconnecting", "disconnected", and "xml_init" (replace "XML Initialized")
author Goffi <goffi@goffi.org>
date Sun, 18 Nov 2018 15:49:46 +0100
parents 56f94936df1e
children ab2696e34d29
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_xmllog.py	Sat Nov 10 10:16:38 2018 +0100
+++ b/sat/plugins/plugin_misc_xmllog.py	Sun Nov 18 15:49:46 2018 +0100
@@ -23,7 +23,7 @@
 
 log = getLogger(__name__)
 from twisted.words.xish import domish
-from twisted.words.xish import xmlstream
+from functools import partial
 
 PLUGIN_INFO = {
     C.PI_NAME: "Raw XML log Plugin",
@@ -36,26 +36,6 @@
     C.PI_DESCRIPTION: _(u"""Send raw XML logs to bridge"""),
 }
 
-host = None
-
-
-def send(self, obj):
-    global host
-    if isinstance(obj, basestring):
-        log = unicode(obj)
-    elif isinstance(obj, domish.Element):
-        log = obj.toXml()
-    else:
-        log.error(_(u"INTERNAL ERROR: Unmanaged XML type"))
-    host.bridge.xmlLog("OUT", log, self._profile)
-    return self._original_send(obj)
-
-
-def onElement(self, element):
-    global host
-    host.bridge.xmlLog("IN", element.toXml(), self._profile)
-    return self._original_onElement(element)
-
 
 class XmlLog(object):
 
@@ -71,30 +51,32 @@
         "label_xmllog": _("Activate XML log")
     }
 
-    def __init__(self, host_):
+    def __init__(self, host):
         log.info(_("Plugin XML Log initialization"))
-        global host
-        host = host_
-
-        # parameters
+        self.host = host
         host.memory.updateParams(self.params)
-
-        # bridge
         host.bridge.addSignal(
             "xmlLog", ".plugin", signature="sss"
         )  # args: direction("IN" or "OUT"), xml_data, profile
 
-        self.do_log = host.memory.getParamA("Xml log", "Debug")
+        host.trigger.add("stream_hooks", self.addHooks)
+
+    def addHooks(self, client, receive_hooks, send_hooks):
+        self.do_log = self.host.memory.getParamA("Xml log", "Debug")
         if self.do_log:
-            XmlStream = xmlstream.XmlStream
-            XmlStream._original_send = XmlStream.send
-            XmlStream._original_onElement = XmlStream.onElement
-            XmlStream.send = send
-            XmlStream.onElement = onElement
-            XmlStream._profile = ""
-            host.trigger.add("XML Initialized", self.setProfile)
+            receive_hooks.append(partial(self.onReceive, client=client))
+            send_hooks.append(partial(self.onSend, client=client))
             log.info(_(u"XML log activated"))
+        return True
 
-    def setProfile(self, xmlstream, profile):
-        xmlstream._profile = profile
-        return True
+    def onReceive(self, element, client):
+        self.host.bridge.xmlLog("IN", element.toXml(), client.profile)
+
+    def onSend(self, obj, client):
+        if isinstance(obj, basestring):
+            log = unicode(obj)
+        elif isinstance(obj, domish.Element):
+            log = obj.toXml()
+        else:
+            log.error(_(u"INTERNAL ERROR: Unmanaged XML type"))
+        self.host.bridge.xmlLog("OUT", log, client.profile)