diff --git a/src/plugins/plugin_misc_xmllog.py b/src/plugins/plugin_misc_xmllog.py
new file mode 100755
index 00000000..1d8c9148
--- /dev/null
+++ b/src/plugins/plugin_misc_xmllog.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""
+SàT plugin for managing raw XML log
+Copyright (C) 2011 Jérôme Poisson (goffi@goffi.org)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+"""
+
+from logging import debug, info, error
+from twisted.words.protocols.jabber.xmlstream import XmlStream
+from twisted.words.xish import domish
+
+PLUGIN_INFO = {
+"name": "Raw XML log Plugin",
+"import_name": "XmlLog",
+"type": "Misc",
+"protocols": [],
+"dependencies": [],
+"main": "XmlLog",
+"handler": "no",
+"description": _("""Send raw XML logs to bridge""")
+}
+
+class LoggingXmlStream(XmlStream):
+ """This class send the raw XML to the Bridge, for logging purpose"""
+
+ def send(self, obj):
+ if isinstance(obj,basestring):
+ log=unicode(obj)
+ elif isinstance(obj, domish.Element):
+ log=obj.toXml()
+ else:
+ error(_('INTERNAL ERROR: Unmanaged XML type'))
+ info('OUT data for %s: %s' % (self._profile, log))
+ self._host.bridge.XmlLog("OUT", log, self._profile)
+ return XmlStream.send(self, obj)
+
+ def dataReceived(self, data):
+ info('IN data for %s: %s' % (self._profile, data.decode('utf-8')))
+ self._host.bridge.XmlLog("IN", data.decode('utf-8'), self._profile)
+ return XmlStream.dataReceived(self, data)
+
+
+class XmlLog():
+
+ params = """
+
+
+
+
+
+
+
+ """ % {"label_xmllog": _("Activate XML log")}
+
+ def __init__(self, host):
+ info(_("Plugin XML Log initialization"))
+ self.host = host
+
+ #parameters
+ host.memory.importParams(self.params)
+
+ #bridge
+ host.bridge.addSignal("XmlLog", ".communication", signature='sss') #args: direction("IN" or "OUT"), xml_data, profile
+
+ do_log = bool(self.host.memory.getParamA("Xml log", "Debug"))
+ if do_log:
+ info(_("XML log activated"))
+ host.trigger.add("XML Initialized", self.logXml)
+
+ def logXml(self, xmlstream, profile):
+ xmlstream.__class__ = LoggingXmlStream
+ xmlstream._profile = profile
+ xmlstream._host = self.host
+ return True
diff --git a/src/sat.tac b/src/sat.tac
index 1427d961..39958ee9 100644
--- a/src/sat.tac
+++ b/src/sat.tac
@@ -88,10 +88,13 @@ class SatXMPPClient(client.XMPPClient):
info (_("********** [%s] CONNECTED **********") % self.profile)
self.streamInitialized()
self.host_app.bridge.connected(self.profile) #we send the signal to the clients
+
def streamInitialized(self):
"""Called after _authd"""
debug (_("XML stream is initialized"))
+ if not self.host_app.trigger.point("XML Initialized", self.xmlstream, self.profile):
+ return
self.keep_alife = task.LoopingCall(self.xmlstream.send, " ") #Needed to avoid disconnection (specially with openfire)
self.keep_alife.start(180)