6 #include "xmlrpc-c/girerr.hpp"
8 #include "xmlrpc-c/base.h"
9 #include "xmlrpc-c/base.hpp"
12 using namespace xmlrpc_c;
17 paramList::paramList(unsigned int const paramCount) {
19 this->paramVector.reserve(paramCount);
25 paramList::add(xmlrpc_c::value const param) {
27 this->paramVector.push_back(param);
33 paramList::size() const {
34 return this->paramVector.size();
40 paramList::operator[](unsigned int const subscript) const {
42 if (subscript >= this->paramVector.size())
44 "Subscript of xmlrpc_c::paramList out of bounds"));
46 return this->paramVector[subscript];
52 paramList::getInt(unsigned int const paramNumber,
54 int const maximum) const {
56 if (paramNumber >= this->paramVector.size())
57 throw(fault("Not enough parameters", fault::CODE_TYPE));
59 if (this->paramVector[paramNumber].type() != value::TYPE_INT)
60 throw(fault("Parameter that is supposed to be integer is not",
63 int const intvalue(static_cast<int>(
64 value_int(this->paramVector[paramNumber])));
66 if (intvalue < minimum)
67 throw(fault("Integer parameter too low", fault::CODE_TYPE));
69 if (intvalue > maximum)
70 throw(fault("Integer parameter too high", fault::CODE_TYPE));
78 paramList::getBoolean(unsigned int const paramNumber) const {
80 if (paramNumber >= this->paramVector.size())
81 throw(fault("Not enough parameters", fault::CODE_TYPE));
83 if (this->paramVector[paramNumber].type() != value::TYPE_BOOLEAN)
84 throw(fault("Parameter that is supposed to be boolean is not",
87 return static_cast<bool>(value_boolean(this->paramVector[paramNumber]));
93 paramList::getDouble(unsigned int const paramNumber,
95 double const maximum) const {
97 if (paramNumber >= this->paramVector.size())
98 throw(fault("Not enough parameters", fault::CODE_TYPE));
100 if (this->paramVector[paramNumber].type() != value::TYPE_DOUBLE)
101 throw(fault("Parameter that is supposed to be floating point number "
105 double const doublevalue(static_cast<double>(
106 value_double(this->paramVector[paramNumber])));
108 if (doublevalue < minimum)
109 throw(fault("Floating point number parameter too low",
112 if (doublevalue > maximum)
113 throw(fault("Floating point number parameter too high",
122 paramList::getDatetime_sec(
123 unsigned int const paramNumber,
124 paramList::timeConstraint const constraint) const {
126 if (paramNumber >= this->paramVector.size())
127 throw(fault("Not enough parameters", fault::CODE_TYPE));
129 const xmlrpc_c::value * const paramP(&this->paramVector[paramNumber]);
131 if (paramP->type() != value::TYPE_DATETIME)
132 throw(fault("Parameter that is supposed to be a datetime is not",
135 time_t const timeValue(static_cast<time_t>(value_datetime(*paramP)));
136 time_t const now(time(NULL));
138 switch (constraint) {
140 /* He'll take anything; no problem */
144 throw(fault("Datetime parameter that is not supposed to be in "
145 "the future is.", fault::CODE_TYPE));
149 throw(fault("Datetime parameter that is not supposed to be in "
150 "the past is.", fault::CODE_TYPE));
160 paramList::getString(unsigned int const paramNumber) const {
162 if (paramNumber >= this->paramVector.size())
163 throw(fault("Not enough parameters", fault::CODE_TYPE));
165 if (this->paramVector[paramNumber].type() != value::TYPE_STRING)
166 throw(fault("Parameter that is supposed to be a string is not",
169 return static_cast<string>(value_string(this->paramVector[paramNumber]));
174 std::vector<unsigned char>
175 paramList::getBytestring(unsigned int const paramNumber) const {
177 if (paramNumber >= this->paramVector.size())
178 throw(fault("Not enough parameters", fault::CODE_TYPE));
180 const xmlrpc_c::value * const paramP(&this->paramVector[paramNumber]);
182 if (paramP->type() != value::TYPE_BYTESTRING)
183 throw(fault("Parameter that is supposed to be a byte string is not",
186 return value_bytestring(*paramP).vectorUcharValue();
190 std::vector<xmlrpc_c::value>
191 paramList::getArray(unsigned int const paramNumber,
192 unsigned int const minSize,
193 unsigned int const maxSize) const {
195 if (paramNumber >= this->paramVector.size())
196 throw(fault("Not enough parameters", fault::CODE_TYPE));
198 const xmlrpc_c::value * const paramP(&this->paramVector[paramNumber]);
200 if (paramP->type() != value::TYPE_ARRAY)
201 throw(fault("Parameter that is supposed to be an array is not",
204 xmlrpc_c::value_array const arrayValue(*paramP);
206 if (arrayValue.size() < minSize)
207 throw(fault("Array parameter has too few elements",
210 if (arrayValue.size() > maxSize)
211 throw(fault("Array parameter has too many elements",
214 return value_array(*paramP).vectorValueValue();
219 std::map<string, xmlrpc_c::value>
220 paramList::getStruct(unsigned int const paramNumber) const {
222 if (paramNumber >= this->paramVector.size())
223 throw(fault("Not enough parameters", fault::CODE_TYPE));
225 const xmlrpc_c::value * const paramP(&this->paramVector[paramNumber]);
227 if (paramP->type() != value::TYPE_STRUCT)
228 throw(fault("Parameter that is supposed to be a structure is not",
231 return static_cast<std::map<string, xmlrpc_c::value> >(
232 value_struct(*paramP));
238 paramList::getNil(unsigned int const paramNumber) const {
240 if (paramNumber >= this->paramVector.size())
241 throw(fault("Not enough parameters", fault::CODE_TYPE));
243 if (this->paramVector[paramNumber].type() != value::TYPE_NIL)
244 throw(fault("Parameter that is supposed to be nil is not",
251 paramList::verifyEnd(unsigned int const paramNumber) const {
253 if (paramNumber < this->paramVector.size())
254 throw(fault("Too many parameters", fault::CODE_TYPE));
255 if (paramNumber > this->paramVector.size())
256 throw(fault("Not enough parameters", fault::CODE_TYPE));