Validator.cpp
Go to the documentation of this file.
00001 // Validator.cpp : XMLRPC server based on the compliancy test at validator.xmlrpc.com.
00002 //
00003 #include "XmlRpc.h"
00004 using namespace XmlRpc;
00005 
00006 #include <iostream>
00007 
00008 
00009 XmlRpcServer s;
00010 
00011 
00012 // One argument is passed, an array of structs, each with a member named curly with 
00013 // an integer value. Return the sum of those values.
00014 
00015 class ArrayOfStructsTest : public XmlRpcServerMethod
00016 {
00017 public:
00018   ArrayOfStructsTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.arrayOfStructsTest", s) {}
00019 
00020   void execute(XmlRpcValue& params, XmlRpcValue& result)
00021   {
00022     std::cerr << "ArrayOfStructsTest\n";
00023     XmlRpcValue& arg1 = params[0];
00024     int n = arg1.size(), sum = 0;
00025     for (int i=0; i<n; ++i) 
00026       sum += int(arg1[i]["curly"]);
00027 
00028     result = sum;
00029   }
00030 } arrayOfStructsTest(&s);
00031 
00032 
00033 // This handler takes a single parameter, a string, that contains any number of predefined 
00034 // entities, namely <, >, &, ' and ".
00035 // The handler must return a struct that contains five fields, all numbers: ctLeftAngleBrackets, 
00036 // ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes. 
00037 // To validate, the numbers must be correct.
00038 
00039 class CountTheEntities : public XmlRpcServerMethod
00040 {
00041 public:
00042   CountTheEntities(XmlRpcServer* s) : XmlRpcServerMethod("validator1.countTheEntities", s) {}
00043 
00044   void execute(XmlRpcValue& params, XmlRpcValue& result)
00045   {
00046     std::cerr << "CountTheEntities\n";
00047     std::string& arg = params[0];
00048     int ctLeftAngleBrackets = 0;
00049     int ctRightAngleBrackets = 0;
00050     int ctAmpersands = 0;
00051     int ctApostrophes = 0;
00052     int ctQuotes = 0;
00053 
00054     int n = int(arg.length());
00055     for (int i=0; i<n; ++i)
00056       switch (arg[i])
00057       {
00058         case '<': ++ctLeftAngleBrackets; break;
00059         case '>': ++ctRightAngleBrackets; break;
00060         case '&': ++ctAmpersands; break;
00061         case '\'': ++ctApostrophes; break;
00062         case '\"': ++ctQuotes; break;
00063       }
00064 
00065     result["ctLeftAngleBrackets"] = ctLeftAngleBrackets;
00066     result["ctRightAngleBrackets"] = ctRightAngleBrackets;
00067     result["ctAmpersands"] = ctAmpersands;
00068     result["ctApostrophes"] = ctApostrophes;
00069     result["ctQuotes"] = ctQuotes;
00070   }
00071 } countTheEntities(&s);
00072 
00073 
00074 
00075 // This handler takes a single parameter, a struct, containing at least three elements 
00076 // named moe, larry and curly, all <i4>s. Your handler must add the three numbers and 
00077 // return the result.
00078 
00079 class EasyStructTest : public XmlRpcServerMethod
00080 {
00081 public:
00082   EasyStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.easyStructTest", s) {}
00083 
00084   void execute(XmlRpcValue& params, XmlRpcValue& result)
00085   {
00086     std::cerr << "EasyStructTest\n";
00087     XmlRpcValue& arg1 = params[0];
00088     int sum = int(arg1["moe"]) + int(arg1["larry"]) + int(arg1["curly"]);
00089     result = sum;
00090   }
00091 } easyStructTest(&s);
00092 
00093 
00094 // This handler takes a single parameter, a struct. Your handler must return the struct.
00095 
00096 class EchoStructTest : public XmlRpcServerMethod
00097 {
00098 public:
00099   EchoStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.echoStructTest", s) {}
00100 
00101   void execute(XmlRpcValue& params, XmlRpcValue& result)
00102   {
00103     std::cerr << "EchoStructTest\n";
00104     result = params[0];
00105   }
00106 } echoStructTest(&s);
00107 
00108 
00109 
00110 // This handler takes six parameters, and returns an array containing all the parameters.
00111 
00112 class ManyTypesTest : public XmlRpcServerMethod
00113 {
00114 public:
00115   ManyTypesTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.manyTypesTest", s) {}
00116 
00117   void execute(XmlRpcValue& params, XmlRpcValue& result)
00118   {
00119     std::cerr << "ManyTypesTest\n";
00120     result = params;
00121   }
00122 } manyTypesTest(&s);
00123 
00124 
00125 
00126 // This handler takes a single parameter, which is an array containing between 100 and 
00127 // 200 elements. Each of the items is a string, your handler must return a string 
00128 // containing the concatenated text of the first and last elements.
00129 
00130 
00131 class ModerateSizeArrayCheck : public XmlRpcServerMethod
00132 {
00133 public:
00134   ModerateSizeArrayCheck(XmlRpcServer* s) : XmlRpcServerMethod("validator1.moderateSizeArrayCheck", s) {}
00135 
00136   void execute(XmlRpcValue& params, XmlRpcValue& result)
00137   {
00138     std::cerr << "ModerateSizeArrayCheck\n";
00139     std::string s = params[0][0];
00140     s += std::string(params[0][params[0].size()-1]);
00141     result = s;
00142   }
00143 } moderateSizeArrayCheck(&s);
00144 
00145 
00146 // This handler takes a single parameter, a struct, that models a daily calendar.
00147 // At the top level, there is one struct for each year. Each year is broken down
00148 // into months, and months into days. Most of the days are empty in the struct
00149 // you receive, but the entry for April 1, 2000 contains a least three elements
00150 // named moe, larry and curly, all <i4>s. Your handler must add the three numbers
00151 // and return the result.
00152 
00153 class NestedStructTest : public XmlRpcServerMethod
00154 {
00155 public:
00156   NestedStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.nestedStructTest", s) {}
00157 
00158   void execute(XmlRpcValue& params, XmlRpcValue& result)
00159   {
00160     std::cerr << "NestedStructTest\n";
00161     XmlRpcValue& dayStruct = params[0]["2000"]["04"]["01"];
00162     int sum = int(dayStruct["moe"]) + int(dayStruct["larry"]) + int(dayStruct["curly"]);
00163     result = sum;
00164   }
00165 } nestedStructTest(&s);
00166 
00167 
00168 
00169 // This handler takes one parameter, and returns a struct containing three elements, 
00170 // times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.
00171 
00172 class SimpleStructReturnTest : public XmlRpcServerMethod
00173 {
00174 public:
00175   SimpleStructReturnTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.simpleStructReturnTest", s) {}
00176 
00177   void execute(XmlRpcValue& params, XmlRpcValue& result)
00178   {
00179     std::cerr << "SimpleStructReturnTest\n";
00180     int n = params[0];
00181     result["times10"] = n * 10;
00182     result["times100"] = n * 100;
00183     result["times1000"] = n * 1000;
00184   }
00185 } simpleStructReturnTest(&s);
00186 
00187 
00188 
00189 int main(int argc, char* argv[])
00190 {
00191   if (argc != 2) {
00192     std::cerr << "Usage: Validator port\n";
00193     return -1;
00194   }
00195   int port = atoi(argv[1]);
00196 
00197   XmlRpc::setVerbosity(5);
00198 
00199   // Create the server socket on the specified port
00200   s.bindAndListen(port);
00201 
00202   // Wait for requests indefinitely
00203   s.work(-1.0);
00204 
00205   return 0;
00206 }
00207 


xmlrpcpp
Author(s): Chris Morley, Konstantin Pilipchuk, Morgan Quigley
autogenerated on Fri Aug 28 2015 12:33:06