-
-
Notifications
You must be signed in to change notification settings - Fork 324
Expand file tree
/
Copy pathprocedure.cpp
More file actions
152 lines (140 loc) · 5.11 KB
/
procedure.cpp
File metadata and controls
152 lines (140 loc) · 5.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*************************************************************************
* libjson-rpc-cpp
*************************************************************************
* @file procedure.cpp
* @date 31.12.2012
* @author Peter Spiess-Knafl <dev@spiessknafl.at>
* @license See attached LICENSE.txt
************************************************************************/
#include "procedure.h"
#include "errors.h"
#include "exception.h"
#include <cstdarg>
#include <vector>
using namespace std;
using namespace jsonrpc;
Procedure::Procedure() : procedureName(""), procedureType(RPC_METHOD), returntype(JSON_BOOLEAN), paramDeclaration(PARAMS_BY_NAME) {}
Procedure::Procedure(const string &name, parameterDeclaration_t paramType, jsontype_t returntype, ...) {
va_list parameters;
va_start(parameters, returntype);
const char *paramname = va_arg(parameters, const char *);
jsontype_t type;
while (paramname != NULL) {
type = (jsontype_t)va_arg(parameters, int);
this->AddParameter(paramname, type);
paramname = va_arg(parameters, const char *);
}
va_end(parameters);
this->procedureName = name;
this->returntype = returntype;
this->procedureType = RPC_METHOD;
this->paramDeclaration = paramType;
}
Procedure::Procedure(const string &name, parameterDeclaration_t paramType, ...) {
va_list parameters;
va_start(parameters, paramType);
const char *paramname = va_arg(parameters, const char *);
jsontype_t type;
while (paramname != NULL) {
type = (jsontype_t)va_arg(parameters, int);
this->AddParameter(paramname, type);
paramname = va_arg(parameters, const char *);
}
va_end(parameters);
this->procedureName = name;
this->procedureType = RPC_NOTIFICATION;
this->paramDeclaration = paramType;
this->returntype = JSON_BOOLEAN;
}
bool Procedure::ValdiateParameters(const Json::Value ¶meters) const {
if (this->parametersName.empty()) {
return true;
}
if (parameters.isArray() && this->paramDeclaration == PARAMS_BY_POSITION) {
return this->ValidatePositionalParameters(parameters);
} else if (parameters.isArray() && this->paramDeclaration == PARAMS_BY_POSITION_WITH_OPTIONAL) {
return this->ValidateOptionalPositionalParameters(parameters);
} else if (parameters.isObject() && this->paramDeclaration == PARAMS_BY_NAME) {
return this->ValidateNamedParameters(parameters);
} else {
return false;
}
}
const parameterNameList_t &Procedure::GetParameters() const { return this->parametersName; }
procedure_t Procedure::GetProcedureType() const { return this->procedureType; }
const std::string &Procedure::GetProcedureName() const { return this->procedureName; }
parameterDeclaration_t Procedure::GetParameterDeclarationType() const { return this->paramDeclaration; }
jsontype_t Procedure::GetReturnType() const { return this->returntype; }
void Procedure::SetProcedureName(const string &name) { this->procedureName = name; }
void Procedure::SetProcedureType(procedure_t type) { this->procedureType = type; }
void Procedure::SetReturnType(jsontype_t type) { this->returntype = type; }
void Procedure::SetParameterDeclarationType(parameterDeclaration_t type) { this->paramDeclaration = type; }
void Procedure::AddParameter(const string &name, jsontype_t type) {
this->parametersName[name] = type;
this->parametersPosition.push_back(type);
}
bool Procedure::ValidateNamedParameters(const Json::Value ¶meters) const {
bool ok = parameters.isObject() || parameters.isNull();
for (map<string, jsontype_t>::const_iterator it = this->parametersName.begin(); ok == true && it != this->parametersName.end(); ++it) {
if (!parameters.isMember(it->first)) {
ok = false;
} else {
ok = this->ValidateSingleParameter(it->second, parameters[it->first]);
}
}
return ok;
}
bool Procedure::ValidatePositionalParameters(const Json::Value ¶meters) const {
bool ok = true;
if (parameters.size() != this->parametersPosition.size()) {
return false;
}
for (unsigned int i = 0; ok && i < this->parametersPosition.size(); i++) {
ok = this->ValidateSingleParameter(this->parametersPosition.at(i), parameters[i]);
}
return ok;
}
bool Procedure::ValidateOptionalPositionalParameters(const Json::Value ¶meters) const {
bool ok = true;
if (parameters.size() > this->parametersPosition.size()) {
return false;
}
for (unsigned int i = 0; ok && i < parameters.size(); i++) {
ok = this->ValidateSingleParameter(this->parametersPosition.at(i), parameters[i]);
}
return ok;
}
bool Procedure::ValidateSingleParameter(jsontype_t expectedType, const Json::Value &value) const {
bool ok = true;
switch (expectedType) {
case JSON_STRING:
if (!value.isString())
ok = false;
break;
case JSON_BOOLEAN:
if (!value.isBool())
ok = false;
break;
case JSON_INTEGER:
if (!value.isIntegral())
ok = false;
break;
case JSON_REAL:
if (!value.isDouble())
ok = false;
break;
case JSON_NUMERIC:
if (!value.isNumeric())
ok = false;
break;
case JSON_OBJECT:
if (!value.isObject())
ok = false;
break;
case JSON_ARRAY:
if (!value.isArray())
ok = false;
break;
}
return ok;
}