4
5
#include "xmlrpc-c/oldcppwrapper.hpp"
5
6
#include "DataType.hpp"
6
7
#include "XmlRpcFunction.hpp"
8
using std::domain_error;
12
//=========================================================================
13
// class XmlRpcFunction
14
//=========================================================================
15
// Contains everything we know about a given server function, and knows
16
// how to print local bindings.
18
XmlRpcFunction::XmlRpcFunction(const string& function_name,
19
const string& method_name,
22
: mFunctionName(function_name), mMethodName(method_name),
23
mHelp(help), mSynopsis(synopsis)
27
XmlRpcFunction::XmlRpcFunction (const XmlRpcFunction& f)
28
: mFunctionName(f.mFunctionName), mMethodName(f.mMethodName),
29
mHelp(f.mHelp), mSynopsis(f.mSynopsis)
33
XmlRpcFunction& XmlRpcFunction::operator= (const XmlRpcFunction& f) {
36
mFunctionName = f.mFunctionName;
37
mMethodName = f.mMethodName;
39
mSynopsis = f.mSynopsis;
12
XmlRpcFunction::XmlRpcFunction(string const& functionName,
13
string const& methodName,
15
XmlRpcValue const signatureList) :
16
mFunctionName(functionName),
17
mMethodName(methodName),
19
mSynopsis(signatureList) {}
23
XmlRpcFunction::XmlRpcFunction(XmlRpcFunction const& f) :
24
mFunctionName(f.mFunctionName),
25
mMethodName(f.mMethodName),
27
mSynopsis(f.mSynopsis) {}
32
XmlRpcFunction::operator= (XmlRpcFunction const& f) {
35
this->mFunctionName = f.mFunctionName;
36
this->mMethodName = f.mMethodName;
37
this->mHelp = f.mHelp;
38
this->mSynopsis = f.mSynopsis;
43
void XmlRpcFunction::printDeclarations (ostream& out) {
45
// XXX - Do a sloppy job of printing documentation.
46
out << endl << " /* " << mHelp << " */" << endl;
48
// Print each declaration.
49
size_t end = mSynopsis.arraySize();
50
for (size_t i = 0; i < end; i++)
51
printDeclaration(out, i);
54
void XmlRpcFunction::printDefinitions (ostream& out, const string& className) {
55
size_t end = mSynopsis.arraySize();
56
for (size_t i = 0; i < end; i++) {
58
printDefinition(out, className, i);
62
// Print the parameter declarations.
63
void XmlRpcFunction::printParameters (ostream& out, size_t synopsis_index) {
64
size_t end = parameterCount(synopsis_index);
66
for (size_t i = 0; i < end; i++) {
72
const DataType& ptype (parameterType(synopsis_index, i));
73
string basename = ptype.defaultParameterBaseName(i + 1);
74
out << ptype.parameterFragment(basename);
78
void XmlRpcFunction::printDeclaration (ostream& out, size_t synopsis_index) {
79
const DataType& rtype (returnType(synopsis_index));
80
out << " " << rtype.returnTypeFragment() << " "
81
<< mFunctionName << " (";
82
printParameters(out, synopsis_index);
86
void XmlRpcFunction::printDefinition (ostream& out,
87
const string& className,
88
size_t synopsis_index)
90
const DataType& rtype (returnType(synopsis_index));
46
XmlRpcFunction::printDeclarations(ostream & out) const {
49
// Print the method help as a comment
51
out << endl << " /* " << mHelp << " */" << endl;
56
end = mSynopsis.arraySize();
57
} catch (XmlRpcFault const& fault) {
58
throw(logic_error("Failed to get size of signature array for "
59
"method " + this->mFunctionName + ". " +
60
fault.getFaultString()));
62
// Print the declarations for all the signatures of this
65
for (size_t i = 0; i < end; ++i)
66
printDeclaration(out, i);
68
} catch (exception const& e) {
69
throw(logic_error("Failed to generate declarations for method " +
70
this->mFunctionName + ". " + e.what()));
77
XmlRpcFunction::printDefinitions(ostream & out,
78
string const& className) const {
81
size_t const end(mSynopsis.arraySize());
83
for (size_t i = 0; i < end; ++i) {
85
printDefinition(out, className, i);
87
} catch (XmlRpcFault const& fault) {
88
throw(logic_error("Failed to generate definitions for class " +
89
this->mFunctionName + ". " +
90
fault.getFaultString()));
97
XmlRpcFunction::printParameters(ostream & out,
98
size_t const synopsisIndex) const {
99
/*----------------------------------------------------------------------------
100
Print the parameter declarations.
101
-----------------------------------------------------------------------------*/
102
size_t const end(parameterCount(synopsisIndex));
108
for (size_t i = 0; i < end; ++i) {
112
DataType const& ptype(parameterType(synopsisIndex, i));
113
string const basename(ptype.defaultParameterBaseName(i + 1));
114
out << ptype.parameterFragment(basename);
123
XmlRpcFunction::printDeclaration(ostream & out,
124
size_t const synopsisIndex) const {
127
DataType const& rtype(returnType(synopsisIndex));
129
out << " " << rtype.returnTypeFragment() << " "
130
<< mFunctionName << " (";
132
printParameters(out, synopsisIndex);
135
} catch (XmlRpcFault const& fault) {
138
msg << "Failed to generate header for signature "
141
<< fault.getFaultString();
143
throw(logic_error(msg.str()));
150
XmlRpcFunction::printDefinition(ostream & out,
151
string const& className,
152
size_t const synopsisIndex) const {
154
DataType const& rtype(returnType(synopsisIndex));
91
156
out << rtype.returnTypeFragment() << " "
92
<< className << "::" << mFunctionName << " (";
93
printParameters(out, synopsis_index);
157
<< className << "::" << mFunctionName << " (";
159
printParameters(out, synopsisIndex);
94
161
out << ") {" << endl;
95
out << " XmlRpcValue params = XmlRpcValue::makeArray();" << endl;
162
out << " XmlRpcValue params(XmlRpcValue::makeArray());" << endl;
97
164
/* Emit code to convert the parameters into an array of XML-RPC objects. */
98
size_t end = parameterCount(synopsis_index);
99
for (size_t i = 0; i < end; i++) {
100
const DataType& ptype (parameterType(synopsis_index, i));
101
string basename = ptype.defaultParameterBaseName(i + 1);
102
out << " params.arrayAppendItem("
103
<< ptype.inputConversionFragment(basename) << ");" << endl;
165
size_t const end(parameterCount(synopsisIndex));
166
for (size_t i = 0; i < end; ++i) {
167
DataType const& ptype(parameterType(synopsisIndex, i));
168
string const basename(ptype.defaultParameterBaseName(i + 1));
169
out << " params.arrayAppendItem("
170
<< ptype.inputConversionFragment(basename) << ");" << endl;
106
173
/* Emit the function call.*/
107
out << " XmlRpcValue result = this->mClient.call(\""
108
<< mMethodName << "\", params);" << endl;
174
out << " XmlRpcValue result(this->mClient.call(\""
175
<< mMethodName << "\", params));" << endl;
110
177
/* Emit the return statement. */
111
178
out << " return " << rtype.outputConversionFragment("result")
113
180
out << "}" << endl;
116
const DataType& XmlRpcFunction::returnType (size_t synopsis_index) {
117
XmlRpcValue func_synop = mSynopsis.arrayGetItem(synopsis_index);
118
return findDataType(func_synop.arrayGetItem(0).getString());
186
XmlRpcFunction::returnType(size_t const synopsisIndex) const {
188
XmlRpcValue const funcSynop(mSynopsis.arrayGetItem(synopsisIndex));
190
return findDataType(funcSynop.arrayGetItem(0).getString());
121
size_t XmlRpcFunction::parameterCount (size_t synopsis_index) {
122
XmlRpcValue func_synop = mSynopsis.arrayGetItem(synopsis_index);
123
size_t size = func_synop.arraySize();
196
XmlRpcFunction::parameterCount(size_t const synopsisIndex) const {
198
XmlRpcValue const funcSynop(mSynopsis.arrayGetItem(synopsisIndex));
199
size_t const size(funcSynop.arraySize());
125
throw domain_error("Synopsis contained no items");
202
throw domain_error("Synopsis contained no items");
129
const DataType& XmlRpcFunction::parameterType (size_t synopsis_index,
130
size_t parameter_index)
132
XmlRpcValue func_synop = mSynopsis.arrayGetItem(synopsis_index);
133
XmlRpcValue param = func_synop.arrayGetItem(parameter_index + 1);
209
XmlRpcFunction::parameterType(size_t const synopsisIndex,
210
size_t const parameterIndex) const {
212
XmlRpcValue const funcSynop(mSynopsis.arrayGetItem(synopsisIndex));
213
XmlRpcValue const param(funcSynop.arrayGetItem(parameterIndex + 1));
134
215
return findDataType(param.getString());