Annotation of embedaddon/php/ext/xmlrpc/libxmlrpc/system_methods.c, revision 1.1

1.1     ! misho       1: /*
        !             2:   This file is part of libXMLRPC - a C library for xml-encoded function calls.
        !             3: 
        !             4:   Author: Dan Libby (dan@libby.com)
        !             5:   Epinions.com may be contacted at feedback@epinions-inc.com
        !             6: */
        !             7: 
        !             8: /*  
        !             9:   Copyright 2001 Epinions, Inc. 
        !            10: 
        !            11:   Subject to the following 3 conditions, Epinions, Inc.  permits you, free 
        !            12:   of charge, to (a) use, copy, distribute, modify, perform and display this 
        !            13:   software and associated documentation files (the "Software"), and (b) 
        !            14:   permit others to whom the Software is furnished to do so as well.  
        !            15: 
        !            16:   1) The above copyright notice and this permission notice shall be included 
        !            17:   without modification in all copies or substantial portions of the 
        !            18:   Software.  
        !            19: 
        !            20:   2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF 
        !            21:   ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY 
        !            22:   IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR 
        !            23:   PURPOSE OR NONINFRINGEMENT.  
        !            24: 
        !            25:   3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, 
        !            26:   SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT 
        !            27:   OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING 
        !            28:   NEGLIGENCE), EVEN IF EPINIONS, INC.  IS AWARE OF THE POSSIBILITY OF SUCH 
        !            29:   DAMAGES.    
        !            30: 
        !            31: */
        !            32: 
        !            33: 
        !            34: /****h* ABOUT/system_methods
        !            35:  * AUTHOR
        !            36:  *   Dan Libby, aka danda  (dan@libby.com)
        !            37:  * HISTORY
        !            38:  *   $Log$
        !            39:  *   Revision 1.7  2001/09/29 21:58:05  danda
        !            40:  *   adding cvs log to history section
        !            41:  *
        !            42:  *   4/28/2001 -- danda -- adding system.multicall and separating out system methods.
        !            43:  * TODO
        !            44:  * NOTES
        !            45:  *******/
        !            46: 
        !            47: 
        !            48: #include "queue.h"
        !            49: #include "xmlrpc.h"
        !            50: #include "xmlrpc_private.h"
        !            51: #include "xmlrpc_introspection_private.h"
        !            52: #include "system_methods_private.h"
        !            53: #include <string.h>
        !            54: #include <stdlib.h>
        !            55: #include <stdarg.h>
        !            56: 
        !            57: 
        !            58: static const char* xsm_introspection_xml =
        !            59: "<?xml version='1.0' ?>"
        !            60: 
        !            61: "<introspection version='1.0'>"
        !            62:  "<typeList>"
        !            63: 
        !            64:  "<typeDescription name='system.value' basetype='struct' desc='description of a value'>"
        !            65:    "<value type='string' name='name' optional='yes'>value identifier</value>"
        !            66:    "<value type='string' name='type'>value&apos;s xmlrpc or user-defined type</value>"
        !            67:    "<value type='string' name='description'>value&apos;s textual description</value> "
        !            68:    "<value type='boolean' name='optional'>true if value is optional, else it is required</value> "
        !            69:    "<value type='any' name='member' optional='yes'>a child of this element. n/a for scalar types</value> "
        !            70:  "</typeDescription>"
        !            71: 
        !            72:  "<typeDescription name='system.valueList' basetype='array' desc='list of value descriptions'>"
        !            73:    "<value type='system.value'/>"
        !            74:  "</typeDescription>"
        !            75: 
        !            76:  "<typeDescription name='system.stringList' basetype='array' desc='list of strings'>"
        !            77:    "<value type='string'/>"
        !            78:  "</typeDescription>"
        !            79: 
        !            80: 
        !            81:  "</typeList>"
        !            82: 
        !            83:  "<methodList>"
        !            84: 
        !            85:  "<!-- system.describeMethods -->"
        !            86:  "<methodDescription name='system.describeMethods'>"
        !            87:   "<author>Dan Libby</author>"
        !            88:   "<purpose>fully describes the methods and types implemented by this XML-RPC server.</purpose>"
        !            89:   "<version>1.1</version>"
        !            90:   "<signatures>"
        !            91:    "<signature>"
        !            92:     "<params>"
        !            93:      "<value type='array' name='methodList' optional='yes' desc='a list of methods to be described. if omitted, all are described.'>"
        !            94:       "<value type='string'>a valid method name</value>"
        !            95:      "</value>"
        !            96:     "</params>"
        !            97:     "<returns>"
        !            98:      "<value type='struct' desc='contains methods list and types list'>"
        !            99:       "<value type='array' name='methodList' desc='a list of methods'>"
        !           100:        "<value type='struct' desc='representation of a single method'>"
        !           101:         "<value type='string' name='name'>method name</value>"
        !           102:         "<value type='string' name='version' optional='yes'>method version</value>"
        !           103:         "<value type='string' name='author' optional='yes'>method author</value>"
        !           104:         "<value type='string' name='purpose' optional='yes'>method purpose</value>"
        !           105:         "<value type='array' name='signatures' desc='list of method signatures'>"
        !           106:          "<value type='struct' desc='representation of a single signature'>"
        !           107:           "<value type='system.valueList' name='params' optional='yes'>parameter list</value>"
        !           108:           "<value type='system.valueList' name='returns' optional='yes'>return value list</value>"
        !           109:          "</value>"
        !           110:         "</value>"
        !           111:         "<value type='system.stringList' name='bugs' optional='yes'>list of known bugs</value>"
        !           112:         "<value type='system.stringList' name='errors' optional='yes'>list of possible errors and error codes</value>"
        !           113:         "<value type='system.stringList' name='examples' optional='yes'>list of examples</value>"
        !           114:         "<value type='system.stringList' name='history' optional='yes'>list of modifications</value>"
        !           115:         "<value type='system.stringList' name='notes' optional='yes'>list of notes</value>"
        !           116:         "<value type='system.stringList' name='see' optional='yes'>see also.  list of related methods</value>"
        !           117:         "<value type='system.stringList' name='todo' optional='yes'>list of unimplemented features</value>"
        !           118:        "</value>"
        !           119:       "</value>"
        !           120:       "<value type='array' name='typeList' desc='a list of type descriptions. Typically used for referencing complex types'>"
        !           121:        "<value type='system.value'>a type description</value>"
        !           122:       "</value>"
        !           123:      "</value>"
        !           124:     "</returns>"
        !           125:    "</signature>"
        !           126:   "</signatures>"
        !           127:   "<see>"
        !           128:    "<item name='system.listMethods' />"
        !           129:    "<item name='system.methodSignature' />"
        !           130:    "<item name='system.methodHelp' />"
        !           131:   "</see>"
        !           132:   "<example/>"
        !           133:   "<error/>"
        !           134:   "<note/>"
        !           135:   "<bug/>"
        !           136:   "<todo/>"
        !           137:  "</methodDescription>"
        !           138: 
        !           139:  "<!-- system.listMethods -->"
        !           140:  "<methodDescription name='system.listMethods'>"
        !           141:   "<author>Dan Libby</author>"
        !           142:   "<purpose>enumerates the methods implemented by this XML-RPC server.</purpose>"
        !           143:   "<version>1.0</version>"
        !           144:   "<signatures>"
        !           145:    "<signature>"
        !           146:     "<returns>"
        !           147:      "<value type='array' desc='an array of strings'>"
        !           148:       "<value type='string'>name of a method implemented by the server.</value>"
        !           149:      "</value>"
        !           150:     "</returns>"
        !           151:    "</signature>"
        !           152:   "</signatures>"
        !           153:   "<see>"
        !           154:    "<item name='system.describeMethods' />"
        !           155:    "<item name='system.methodSignature' />"
        !           156:    "<item name='system.methodHelp' />"
        !           157:   "</see>"
        !           158:   "<example/>"
        !           159:   "<error/>"
        !           160:   "<note/>"
        !           161:   "<bug/>"
        !           162:   "<todo/>"
        !           163:  "</methodDescription>"
        !           164: 
        !           165:  "<!-- system.methodHelp -->"
        !           166:  "<methodDescription name='system.methodHelp'>"
        !           167:   "<author>Dan Libby</author>"
        !           168:   "<purpose>provides documentation string for a single method</purpose>"
        !           169:   "<version>1.0</version>"
        !           170:   "<signatures>"
        !           171:    "<signature>"
        !           172:     "<params>"
        !           173:      "<value type='string' name='methodName'>name of the method for which documentation is desired</value>"
        !           174:     "</params>"
        !           175:     "<returns>"
        !           176:      "<value type='string'>help text if defined for the method passed, otherwise an empty string</value>"
        !           177:     "</returns>"
        !           178:    "</signature>"
        !           179:   "</signatures>"
        !           180:   "<see>"
        !           181:    "<item name='system.listMethods' />"
        !           182:    "<item name='system.methodSignature' />"
        !           183:    "<item name='system.methodHelp' />"
        !           184:   "</see>"
        !           185:   "<example/>"
        !           186:   "<error/>"
        !           187:   "<note/>"
        !           188:   "<bug/>"
        !           189:   "<todo/>"
        !           190:  "</methodDescription>"
        !           191: 
        !           192:  "<!-- system.methodSignature -->"
        !           193:  "<methodDescription name='system.methodSignature'>"
        !           194:   "<author>Dan Libby</author>"
        !           195:   "<purpose>provides 1 or more signatures for a single method</purpose>"
        !           196:   "<version>1.0</version>"
        !           197:   "<signatures>"
        !           198:    "<signature>"
        !           199:     "<params>"
        !           200:      "<value type='string' name='methodName'>name of the method for which documentation is desired</value>"
        !           201:     "</params>"
        !           202:     "<returns>"
        !           203:      "<value type='array' desc='a list of arrays, each representing a signature'>"
        !           204:       "<value type='array' desc='a list of strings. the first element represents the method return value. subsequent elements represent parameters.'>"
        !           205:        "<value type='string'>a string indicating the xmlrpc type of a value. one of: string, int, double, base64, datetime, array, struct</value>"
        !           206:       "</value>"
        !           207:      "</value>"
        !           208:     "</returns>"
        !           209:    "</signature>"
        !           210:   "</signatures>"
        !           211:   "<see>"
        !           212:    "<item name='system.listMethods' />"
        !           213:    "<item name='system.methodHelp' />"
        !           214:    "<item name='system.describeMethods' />"
        !           215:   "</see>"
        !           216:   "<example/>"
        !           217:   "<error/>"
        !           218:   "<note/>"
        !           219:   "<bug/>"
        !           220:   "<todo/>"
        !           221:  "</methodDescription>"
        !           222: 
        !           223:  "<!-- system.multiCall -->"
        !           224:  "<methodDescription name='system.multiCall'>"
        !           225:   "<author>Dan Libby</author>"
        !           226:   "<purpose>executes multiple methods in sequence and returns the results</purpose>"
        !           227:   "<version>1.0</version>"
        !           228:   "<signatures>"
        !           229:    "<signature>"
        !           230:     "<params>"
        !           231:      "<value type='array' name='methodList' desc='an array of method call structs'>"
        !           232:       "<value type='struct' desc='a struct representing a single method call'>"
        !           233:        "<value type='string' name='methodName' desc='name of the method to be executed'/>"
        !           234:        "<value type='array' name='params' desc='an array representing the params to a method. sub-elements should match method signature'/>"
        !           235:       "</value>"
        !           236:      "</value>"
        !           237:     "</params>"
        !           238:     "<returns>"
        !           239:      "<value type='array' desc='an array of method responses'>"
        !           240:       "<value type='array' desc='an array containing a single value, which is the method&apos;s response'/>"
        !           241:      "</value>"
        !           242:     "</returns>"
        !           243:    "</signature>"
        !           244:   "</signatures>"
        !           245:   "<see>"
        !           246:    "<item name='system.listMethods' />"
        !           247:    "<item name='system.methodHelp' />"
        !           248:    "<item name='system.describeMethods' />"
        !           249:   "</see>"
        !           250:   "<example/>"
        !           251:   "<error/>"
        !           252:   "<note/>"
        !           253:   "<bug/>"
        !           254:   "<todo/>"
        !           255:  "</methodDescription>"
        !           256: 
        !           257:  "<!-- system.getCapabilities -->"
        !           258:  "<methodDescription name='system.getCapabilities'>"
        !           259:   "<author>Dan Libby</author>"
        !           260:   "<purpose>returns a list of capabilities supported by this server</purpose>"
        !           261:   "<version>1.0</version>"
        !           262:   "<notes><item>spec url: http://groups.yahoo.com/group/xml-rpc/message/2897</item></notes>"
        !           263:   "<signatures>"
        !           264:    "<signature>"
        !           265:     "<returns>"
        !           266:      "<value type='struct' desc='list of capabilities, each with a unique key defined by the capability&apos;s spec'>"
        !           267:       "<value type='struct' desc='definition of a single capability'>"
        !           268:        "<value type='string' name='specURL'>www address of the specification defining this capability</value>"
        !           269:        "<value type='int' name='specVersion'>version of the spec that this server's implementation conforms to</value>"
        !           270:       "</value>"
        !           271:      "</value>"
        !           272:     "</returns>"
        !           273:    "</signature>"
        !           274:   "</signatures>"
        !           275:   "<see>"
        !           276:    "<item name='system.listMethods' />"
        !           277:    "<item name='system.methodHelp' />"
        !           278:    "<item name='system.describeMethods' />"
        !           279:   "</see>"
        !           280:   "<example/>"
        !           281:   "<error/>"
        !           282:   "<note/>"
        !           283:   "<bug/>"
        !           284:   "<todo/>"
        !           285:  "</methodDescription>"
        !           286: 
        !           287:  "</methodList>"
        !           288: "</introspection>";
        !           289: 
        !           290: 
        !           291: /* forward declarations for static (non public, non api) funcs */
        !           292: static XMLRPC_VALUE xsm_system_multicall_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData);
        !           293: static XMLRPC_VALUE xsm_system_get_capabilities_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData);
        !           294: 
        !           295: /*-*******************
        !           296: * System Methods API *
        !           297: *********************/
        !           298: 
        !           299: static void xsm_lazy_doc_methods_cb(XMLRPC_SERVER server, void* userData) {
        !           300:    XMLRPC_VALUE xDesc = XMLRPC_IntrospectionCreateDescription(xsm_introspection_xml, NULL);
        !           301:    XMLRPC_ServerAddIntrospectionData(server, xDesc);
        !           302:    XMLRPC_CleanupValue(xDesc);
        !           303: }
        !           304: 
        !           305: void xsm_register(XMLRPC_SERVER server) {
        !           306:    xi_register_system_methods(server);
        !           307: 
        !           308:    XMLRPC_ServerRegisterMethod(server, xsm_token_system_multicall, xsm_system_multicall_cb);
        !           309:    XMLRPC_ServerRegisterMethod(server, xsm_token_system_get_capabilities, xsm_system_get_capabilities_cb);
        !           310: 
        !           311:    /* callback for documentation generation should it be requested */
        !           312:    XMLRPC_ServerRegisterIntrospectionCallback(server, xsm_lazy_doc_methods_cb);
        !           313: }
        !           314: 
        !           315: XMLRPC_VALUE xsm_system_multicall_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) {
        !           316:    XMLRPC_VALUE xArray = XMLRPC_VectorRewind(XMLRPC_RequestGetData(input));
        !           317:    XMLRPC_VALUE xReturn = XMLRPC_CreateVector(0, xmlrpc_vector_array);
        !           318: 
        !           319:    if (xArray) {
        !           320:       XMLRPC_VALUE xMethodIter = XMLRPC_VectorRewind(xArray);
        !           321: 
        !           322:       while (xMethodIter) {
        !           323:          XMLRPC_REQUEST request = XMLRPC_RequestNew();
        !           324:          if(request) {
        !           325:             const char* methodName = XMLRPC_VectorGetStringWithID(xMethodIter, "methodName");
        !           326:             XMLRPC_VALUE params = XMLRPC_VectorGetValueWithID(xMethodIter, "params");
        !           327: 
        !           328:             if(methodName && params) {
        !           329:                XMLRPC_VALUE xRandomArray = XMLRPC_CreateVector(0, xmlrpc_vector_array);
        !           330:                XMLRPC_RequestSetMethodName(request, methodName);
        !           331:                XMLRPC_RequestSetData(request, params);
        !           332:                XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);
        !           333: 
        !           334:                XMLRPC_AddValueToVector(xRandomArray, 
        !           335:                                        XMLRPC_ServerCallMethod(server, request, userData));
        !           336: 
        !           337:                XMLRPC_AddValueToVector(xReturn, xRandomArray);
        !           338:             }
        !           339:             XMLRPC_RequestFree(request, 1);
        !           340:          }
        !           341:          xMethodIter = XMLRPC_VectorNext(xArray);
        !           342:       }
        !           343:    }
        !           344:    return xReturn;
        !           345: }
        !           346: 
        !           347: 
        !           348: XMLRPC_VALUE xsm_system_get_capabilities_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) {
        !           349:    XMLRPC_VALUE xReturn = XMLRPC_CreateVector(0, xmlrpc_vector_struct);
        !           350:    XMLRPC_VALUE xFaults = XMLRPC_CreateVector("faults_interop", xmlrpc_vector_struct);
        !           351:    XMLRPC_VALUE xIntro = XMLRPC_CreateVector("introspection", xmlrpc_vector_struct);
        !           352: 
        !           353:    /* support for fault spec */
        !           354:    XMLRPC_VectorAppendString(xFaults, "specURL", "http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php", 0);
        !           355:    XMLRPC_VectorAppendInt(xFaults, "specVersion", 20010516);
        !           356: 
        !           357:    /* support for introspection spec */
        !           358:    XMLRPC_VectorAppendString(xIntro, "specURL", "http://xmlrpc-epi.sourceforge.net/specs/rfc.introspection.php", 0);
        !           359:    XMLRPC_VectorAppendInt(xIntro, "specVersion", 20010516);
        !           360: 
        !           361:    XMLRPC_AddValuesToVector(xReturn,
        !           362:                             xFaults,
        !           363:                             xIntro,
        !           364:                             NULL);
        !           365: 
        !           366:    return xReturn;
        !           367:                             
        !           368: }
        !           369: 
        !           370: /*-***********************
        !           371: * End System Methods API *
        !           372: *************************/
        !           373: 
        !           374: 
        !           375: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>