diff -r 191c2c1d6e53 -r f479738b4879 iro/view/xmlrpc.py --- /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ß + +#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 . +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()