Validator.cpp
Go to the documentation of this file.
1 // Validator.cpp : XMLRPC server based on the compliancy test at validator.xmlrpc.com.
2 //
3 #include "xmlrpcpp/XmlRpc.h"
4 using namespace XmlRpc;
5 
6 #include <iostream>
7 
8 
10 
11 
12 // One argument is passed, an array of structs, each with a member named curly with
13 // an integer value. Return the sum of those values.
14 
16 {
17 public:
18  ArrayOfStructsTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.arrayOfStructsTest", s) {}
19 
20  void execute(XmlRpcValue& params, XmlRpcValue& result)
21  {
22  std::cerr << "ArrayOfStructsTest\n";
23  XmlRpcValue& arg1 = params[0];
24  int n = arg1.size(), sum = 0;
25  for (int i=0; i<n; ++i)
26  sum += int(arg1[i]["curly"]);
27 
28  result = sum;
29  }
30 } arrayOfStructsTest(&s);
31 
32 
33 // This handler takes a single parameter, a string, that contains any number of predefined
34 // entities, namely <, >, &, ' and ".
35 // The handler must return a struct that contains five fields, all numbers: ctLeftAngleBrackets,
36 // ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes.
37 // To validate, the numbers must be correct.
38 
40 {
41 public:
42  CountTheEntities(XmlRpcServer* s) : XmlRpcServerMethod("validator1.countTheEntities", s) {}
43 
44  void execute(XmlRpcValue& params, XmlRpcValue& result)
45  {
46  std::cerr << "CountTheEntities\n";
47  std::string& arg = params[0];
48  int ctLeftAngleBrackets = 0;
49  int ctRightAngleBrackets = 0;
50  int ctAmpersands = 0;
51  int ctApostrophes = 0;
52  int ctQuotes = 0;
53 
54  int n = int(arg.length());
55  for (int i=0; i<n; ++i)
56  switch (arg[i])
57  {
58  case '<': ++ctLeftAngleBrackets; break;
59  case '>': ++ctRightAngleBrackets; break;
60  case '&': ++ctAmpersands; break;
61  case '\'': ++ctApostrophes; break;
62  case '\"': ++ctQuotes; break;
63  }
64 
65  result["ctLeftAngleBrackets"] = ctLeftAngleBrackets;
66  result["ctRightAngleBrackets"] = ctRightAngleBrackets;
67  result["ctAmpersands"] = ctAmpersands;
68  result["ctApostrophes"] = ctApostrophes;
69  result["ctQuotes"] = ctQuotes;
70  }
71 } countTheEntities(&s);
72 
73 
74 
75 // This handler takes a single parameter, a struct, containing at least three elements
76 // named moe, larry and curly, all <i4>s. Your handler must add the three numbers and
77 // return the result.
78 
80 {
81 public:
82  EasyStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.easyStructTest", s) {}
83 
84  void execute(XmlRpcValue& params, XmlRpcValue& result)
85  {
86  std::cerr << "EasyStructTest\n";
87  XmlRpcValue& arg1 = params[0];
88  int sum = int(arg1["moe"]) + int(arg1["larry"]) + int(arg1["curly"]);
89  result = sum;
90  }
91 } easyStructTest(&s);
92 
93 
94 // This handler takes a single parameter, a struct. Your handler must return the struct.
95 
97 {
98 public:
99  EchoStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.echoStructTest", s) {}
100 
101  void execute(XmlRpcValue& params, XmlRpcValue& result)
102  {
103  std::cerr << "EchoStructTest\n";
104  result = params[0];
105  }
106 } echoStructTest(&s);
107 
108 
109 
110 // This handler takes six parameters, and returns an array containing all the parameters.
111 
113 {
114 public:
115  ManyTypesTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.manyTypesTest", s) {}
116 
117  void execute(XmlRpcValue& params, XmlRpcValue& result)
118  {
119  std::cerr << "ManyTypesTest\n";
120  result = params;
121  }
122 } manyTypesTest(&s);
123 
124 
125 
126 // This handler takes a single parameter, which is an array containing between 100 and
127 // 200 elements. Each of the items is a string, your handler must return a string
128 // containing the concatenated text of the first and last elements.
129 
130 
132 {
133 public:
134  ModerateSizeArrayCheck(XmlRpcServer* s) : XmlRpcServerMethod("validator1.moderateSizeArrayCheck", s) {}
135 
136  void execute(XmlRpcValue& params, XmlRpcValue& result)
137  {
138  std::cerr << "ModerateSizeArrayCheck\n";
139  std::string s = params[0][0];
140  s += std::string(params[0][params[0].size()-1]);
141  result = s;
142  }
143 } moderateSizeArrayCheck(&s);
144 
145 
146 // This handler takes a single parameter, a struct, that models a daily calendar.
147 // At the top level, there is one struct for each year. Each year is broken down
148 // into months, and months into days. Most of the days are empty in the struct
149 // you receive, but the entry for April 1, 2000 contains a least three elements
150 // named moe, larry and curly, all <i4>s. Your handler must add the three numbers
151 // and return the result.
152 
154 {
155 public:
156  NestedStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.nestedStructTest", s) {}
157 
158  void execute(XmlRpcValue& params, XmlRpcValue& result)
159  {
160  std::cerr << "NestedStructTest\n";
161  XmlRpcValue& dayStruct = params[0]["2000"]["04"]["01"];
162  int sum = int(dayStruct["moe"]) + int(dayStruct["larry"]) + int(dayStruct["curly"]);
163  result = sum;
164  }
165 } nestedStructTest(&s);
166 
167 
168 
169 // This handler takes one parameter, and returns a struct containing three elements,
170 // times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.
171 
173 {
174 public:
175  SimpleStructReturnTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.simpleStructReturnTest", s) {}
176 
177  void execute(XmlRpcValue& params, XmlRpcValue& result)
178  {
179  std::cerr << "SimpleStructReturnTest\n";
180  int n = params[0];
181  result["times10"] = n * 10;
182  result["times100"] = n * 100;
183  result["times1000"] = n * 1000;
184  }
185 } simpleStructReturnTest(&s);
186 
187 
188 
189 int main(int argc, char* argv[])
190 {
191  if (argc != 2) {
192  std::cerr << "Usage: Validator port\n";
193  return -1;
194  }
195  int port = atoi(argv[1]);
196 
198 
199  // Create the server socket on the specified port
200  s.bindAndListen(port);
201 
202  // Wait for requests indefinitely
203  s.work(-1.0);
204 
205  return 0;
206 }
207 
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:136
Definition: XmlRpc.h:39
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:158
RPC method arguments and results are represented by Values.
Definition: XmlRpcValue.h:24
XmlRpcServer s
Definition: Validator.cpp:9
int size() const
Return the size for string, base64, array, and struct values.
void work(double msTime)
Process client requests for the specified time.
bool bindAndListen(int port, int backlog=5)
ArrayOfStructsTest(XmlRpcServer *s)
Definition: Validator.cpp:18
EchoStructTest(XmlRpcServer *s)
Definition: Validator.cpp:99
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:84
Abstract class representing a single RPC method.
CountTheEntities(XmlRpcServer *s)
Definition: Validator.cpp:42
void setVerbosity(int level)
Sets log message verbosity. This is short for XmlRpcLogHandler::setVerbosity(level) ...
Definition: XmlRpcUtil.cpp:76
NestedStructTest(XmlRpcServer *s)
Definition: Validator.cpp:156
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:117
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:44
A class to handle XML RPC requests.
Definition: XmlRpcServer.h:37
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:20
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:177
EasyStructTest(XmlRpcServer *s)
Definition: Validator.cpp:82
int main(int argc, char *argv[])
Definition: Validator.cpp:189
ManyTypesTest(XmlRpcServer *s)
Definition: Validator.cpp:115
void execute(XmlRpcValue &params, XmlRpcValue &result)
Execute the method. Subclasses must provide a definition for this method.
Definition: Validator.cpp:101
SimpleStructReturnTest(XmlRpcServer *s)
Definition: Validator.cpp:175
ModerateSizeArrayCheck(XmlRpcServer *s)
Definition: Validator.cpp:134


xmlrpcpp
Author(s): Chris Morley, Konstantin Pilipchuk, Morgan Quigley, Austin Hendrix, Dirk Thomas
autogenerated on Mon Nov 2 2020 03:52:24