hiep sua file
This commit is contained in:
@@ -1,207 +1,414 @@
|
||||
// Validator.cpp : XMLRPC server based on the compliancy test at validator.xmlrpc.com.
|
||||
|
||||
//
|
||||
|
||||
#include "XmlRpc.h"
|
||||
|
||||
using namespace XmlRpc;
|
||||
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
XmlRpcServer s;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// One argument is passed, an array of structs, each with a member named curly with
|
||||
|
||||
// an integer value. Return the sum of those values.
|
||||
|
||||
|
||||
|
||||
class ArrayOfStructsTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
ArrayOfStructsTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.arrayOfStructsTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "ArrayOfStructsTest\n";
|
||||
|
||||
XmlRpcValue& arg1 = params[0];
|
||||
|
||||
int n = arg1.size(), sum = 0;
|
||||
|
||||
for (int i=0; i<n; ++i)
|
||||
|
||||
sum += int(arg1[i]["curly"]);
|
||||
|
||||
|
||||
|
||||
result = sum;
|
||||
|
||||
}
|
||||
|
||||
} arrayOfStructsTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a string, that contains any number of predefined
|
||||
|
||||
// entities, namely <, >, &, ' and ".
|
||||
|
||||
// The handler must return a struct that contains five fields, all numbers: ctLeftAngleBrackets,
|
||||
|
||||
// ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes.
|
||||
|
||||
// To validate, the numbers must be correct.
|
||||
|
||||
|
||||
|
||||
class CountTheEntities : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
CountTheEntities(XmlRpcServer* s) : XmlRpcServerMethod("validator1.countTheEntities", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "CountTheEntities\n";
|
||||
|
||||
std::string& arg = params[0];
|
||||
|
||||
int ctLeftAngleBrackets = 0;
|
||||
|
||||
int ctRightAngleBrackets = 0;
|
||||
|
||||
int ctAmpersands = 0;
|
||||
|
||||
int ctApostrophes = 0;
|
||||
|
||||
int ctQuotes = 0;
|
||||
|
||||
|
||||
|
||||
int n = int(arg.length());
|
||||
|
||||
for (int i=0; i<n; ++i)
|
||||
|
||||
switch (arg[i])
|
||||
|
||||
{
|
||||
|
||||
case '<': ++ctLeftAngleBrackets; break;
|
||||
|
||||
case '>': ++ctRightAngleBrackets; break;
|
||||
|
||||
case '&': ++ctAmpersands; break;
|
||||
|
||||
case '\'': ++ctApostrophes; break;
|
||||
|
||||
case '\"': ++ctQuotes; break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
result["ctLeftAngleBrackets"] = ctLeftAngleBrackets;
|
||||
|
||||
result["ctRightAngleBrackets"] = ctRightAngleBrackets;
|
||||
|
||||
result["ctAmpersands"] = ctAmpersands;
|
||||
|
||||
result["ctApostrophes"] = ctApostrophes;
|
||||
|
||||
result["ctQuotes"] = ctQuotes;
|
||||
|
||||
}
|
||||
|
||||
} countTheEntities(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a struct, containing at least three elements
|
||||
|
||||
// named moe, larry and curly, all <i4>s. Your handler must add the three numbers and
|
||||
|
||||
// return the result.
|
||||
|
||||
|
||||
|
||||
class EasyStructTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
EasyStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.easyStructTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "EasyStructTest\n";
|
||||
|
||||
XmlRpcValue& arg1 = params[0];
|
||||
|
||||
int sum = int(arg1["moe"]) + int(arg1["larry"]) + int(arg1["curly"]);
|
||||
|
||||
result = sum;
|
||||
|
||||
}
|
||||
|
||||
} easyStructTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a struct. Your handler must return the struct.
|
||||
|
||||
|
||||
|
||||
class EchoStructTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
EchoStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.echoStructTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "EchoStructTest\n";
|
||||
|
||||
result = params[0];
|
||||
// Validator.cpp : XMLRPC server based on the compliancy test at validator.xmlrpc.com.
|
||||
|
||||
//
|
||||
|
||||
#include "XmlRpc.h"
|
||||
|
||||
using namespace robot::XmlRpc;
|
||||
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
XmlRpcServer s;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// One argument is passed, an array of structs, each with a member named curly with
|
||||
|
||||
// an integer value. Return the sum of those values.
|
||||
|
||||
|
||||
|
||||
class ArrayOfStructsTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
ArrayOfStructsTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.arrayOfStructsTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "ArrayOfStructsTest\n";
|
||||
|
||||
XmlRpcValue& arg1 = params[0];
|
||||
|
||||
int n = arg1.size(), sum = 0;
|
||||
|
||||
for (int i=0; i<n; ++i)
|
||||
|
||||
sum += int(arg1[i]["curly"]);
|
||||
|
||||
|
||||
|
||||
result = sum;
|
||||
|
||||
}
|
||||
|
||||
} arrayOfStructsTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a string, that contains any number of predefined
|
||||
|
||||
// entities, namely <, >, &, ' and ".
|
||||
|
||||
// The handler must return a struct that contains five fields, all numbers: ctLeftAngleBrackets,
|
||||
|
||||
// ctRightAngleBrackets, ctAmpersands, ctApostrophes, ctQuotes.
|
||||
|
||||
// To validate, the numbers must be correct.
|
||||
|
||||
|
||||
|
||||
class CountTheEntities : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
CountTheEntities(XmlRpcServer* s) : XmlRpcServerMethod("validator1.countTheEntities", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "CountTheEntities\n";
|
||||
|
||||
std::string& arg = params[0];
|
||||
|
||||
int ctLeftAngleBrackets = 0;
|
||||
|
||||
int ctRightAngleBrackets = 0;
|
||||
|
||||
int ctAmpersands = 0;
|
||||
|
||||
int ctApostrophes = 0;
|
||||
|
||||
int ctQuotes = 0;
|
||||
|
||||
|
||||
|
||||
int n = int(arg.length());
|
||||
|
||||
for (int i=0; i<n; ++i)
|
||||
|
||||
switch (arg[i])
|
||||
|
||||
{
|
||||
|
||||
case '<': ++ctLeftAngleBrackets; break;
|
||||
|
||||
case '>': ++ctRightAngleBrackets; break;
|
||||
|
||||
case '&': ++ctAmpersands; break;
|
||||
|
||||
case '\'': ++ctApostrophes; break;
|
||||
|
||||
case '\"': ++ctQuotes; break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
result["ctLeftAngleBrackets"] = ctLeftAngleBrackets;
|
||||
|
||||
result["ctRightAngleBrackets"] = ctRightAngleBrackets;
|
||||
|
||||
result["ctAmpersands"] = ctAmpersands;
|
||||
|
||||
result["ctApostrophes"] = ctApostrophes;
|
||||
|
||||
result["ctQuotes"] = ctQuotes;
|
||||
|
||||
}
|
||||
|
||||
} countTheEntities(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a struct, containing at least three elements
|
||||
|
||||
// named moe, larry and curly, all <i4>s. Your handler must add the three numbers and
|
||||
|
||||
// return the result.
|
||||
|
||||
|
||||
|
||||
class EasyStructTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
EasyStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.easyStructTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "EasyStructTest\n";
|
||||
|
||||
XmlRpcValue& arg1 = params[0];
|
||||
|
||||
int sum = int(arg1["moe"]) + int(arg1["larry"]) + int(arg1["curly"]);
|
||||
|
||||
result = sum;
|
||||
|
||||
}
|
||||
|
||||
} easyStructTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a struct. Your handler must return the struct.
|
||||
|
||||
|
||||
|
||||
class EchoStructTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
EchoStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.echoStructTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "EchoStructTest\n";
|
||||
|
||||
result = params[0];
|
||||
|
||||
}
|
||||
|
||||
} echoStructTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes six parameters, and returns an array containing all the parameters.
|
||||
|
||||
|
||||
|
||||
class ManyTypesTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
ManyTypesTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.manyTypesTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "ManyTypesTest\n";
|
||||
|
||||
result = params;
|
||||
|
||||
}
|
||||
|
||||
} manyTypesTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, which is an array containing between 100 and
|
||||
|
||||
// 200 elements. Each of the items is a string, your handler must return a string
|
||||
|
||||
// containing the concatenated text of the first and last elements.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class ModerateSizeArrayCheck : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
ModerateSizeArrayCheck(XmlRpcServer* s) : XmlRpcServerMethod("validator1.moderateSizeArrayCheck", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "ModerateSizeArrayCheck\n";
|
||||
|
||||
std::string s = params[0][0];
|
||||
|
||||
s += params[0][params[0].size()-1];
|
||||
|
||||
result = s;
|
||||
|
||||
}
|
||||
|
||||
} moderateSizeArrayCheck(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes a single parameter, a struct, that models a daily calendar.
|
||||
|
||||
// At the top level, there is one struct for each year. Each year is broken down
|
||||
|
||||
// into months, and months into days. Most of the days are empty in the struct
|
||||
|
||||
// you receive, but the entry for April 1, 2000 contains a least three elements
|
||||
|
||||
// named moe, larry and curly, all <i4>s. Your handler must add the three numbers
|
||||
|
||||
// and return the result.
|
||||
|
||||
|
||||
|
||||
class NestedStructTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
NestedStructTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.nestedStructTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "NestedStructTest\n";
|
||||
|
||||
XmlRpcValue& dayStruct = params[0]["2000"]["04"]["01"];
|
||||
|
||||
int sum = int(dayStruct["moe"]) + int(dayStruct["larry"]) + int(dayStruct["curly"]);
|
||||
|
||||
result = sum;
|
||||
|
||||
}
|
||||
|
||||
} nestedStructTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// This handler takes one parameter, and returns a struct containing three elements,
|
||||
|
||||
// times10, times100 and times1000, the result of multiplying the number by 10, 100 and 1000.
|
||||
|
||||
|
||||
|
||||
class SimpleStructReturnTest : public XmlRpcServerMethod
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
SimpleStructReturnTest(XmlRpcServer* s) : XmlRpcServerMethod("validator1.simpleStructReturnTest", s) {}
|
||||
|
||||
|
||||
|
||||
void execute(XmlRpcValue& params, XmlRpcValue& result)
|
||||
|
||||
{
|
||||
|
||||
std::cerr << "SimpleStructReturnTest\n";
|
||||
|
||||
int n = params[0];
|
||||
|
||||
result["times10"] = n * 10;
|
||||
|
||||
result["times100"] = n * 100;
|
||||
|
||||
result["times1000"] = n * 1000;
|
||||
|
||||
}
|
||||
|
||||
} simpleStructReturnTest(&s);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
|
||||
{
|
||||
|
||||
if (argc != 2) {
|
||||
|
||||
std::cerr << "Usage: Validator port\n";
|
||||
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
int port = atoi(argv[1]);
|
||||
|
||||
|
||||
|
||||
robot::XmlRpc::setVerbosity(5);
|
||||
|
||||
|
||||
|
||||
// Create the server socket on the specified port
|
||||
|
||||
s.bindAndListen(port);
|
||||
|
||||
|
||||
|
||||
// Wait for requests indefinitely
|
||||
|
||||
s.work(-1.0);
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user