iro/view/xmlrpc.py
branchdevel
changeset 92 f479738b4879
child 93 ee10253258ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/view/xmlrpc.py	Thu Dec 22 03:13:34 2011 +0100
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+#Copyright (C) 2009  Sandro Knauß <bugs@sandroknauss.de>
+
+#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 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 <http://www.gnu.org/licenses/>.
+from twisted.web import soap, xmlrpc, resource, server
+from twisted.internet import reactor
+
+import logging
+
+
+from controller.viewinterface import Interface
+
+
+class TwistedInterface(Interface):
+    
+    def __init__(self):
+        Interface.__init__(self)
+    
+
+    def listMethods(self):
+        """Since we override lookupProcedure, its suggested to override
+        listProcedures too.
+        """
+        return self.listProcedures()
+  
+
+    def listProcedures(self):
+        """Since we override lookupProcedure, its suggested to override
+        listProcedures too.
+        """
+        return ['listMethods','status','stop','sms','fax','mail','routes','defaultRoute','statistic']
+
+
+class XMLRPCInterface(TwistedInterface,xmlrpc.XMLRPC): 
+    def __init__(self):
+        xmlrpc.XMLRPC.__init__(self) 
+        TwistedInterface.__init__(self)
+    
+    def lookupProcedure(self, procedurePath):
+        logging.debug("lookupProcedure('%s')"%procedurePath)
+        if procedurePath not in self.listProcedures():
+            raise xmlrpc.NoSuchFunction(self.NOT_FOUND,
+                        "procedure %s not found" % procedurePath)
+        try:
+            return getattr(self,procedurePath)
+        except KeyError:
+            raise xmlrpc.NoSuchFunction(self.NOT_FOUND,
+                        "procedure %s not found" % procedurePath)
+
+class SOAPInterface(TwistedInterface,soap.SOAPPublisher): 
+    def __init__(self):
+        soap.SOAPPublisher.__init__(self) 
+        TwistedInterface.__init__(self)
+        
+    def lookupFunction(self, functionName):
+        """Lookup published SOAP function.
+
+        Override in subclasses. Default behaviour - publish methods
+        starting with soap_, if they have true attribute useKeywords
+        they are expected to accept keywords.
+        
+        @return: tuple (callable, useKeywords), or (None, None) if not found.
+        """
+        if functionName in self.listProcedures():
+            function = getattr(self, functionName, None)
+            if function:
+                return function, getattr(function, "useKeywords", False)
+            return None
+        else:
+            return None
+
+def getResource():
+    root = resource.Resource()
+    root.putChild('RPC2', XMLRPCInterface())
+    root.putChild('SOAP', SOAPInterface())
+    return root
+
+def main():
+    reactor.listenTCP(7080, server.Site(getResource()))
+    reactor.run()
+
+if __name__ == '__main__':
+    main()