24 #include <lunaservice.h>
26 #include <pbnjson.hpp>
42 #define STANDARD_JSON_SUCCESS "{\"returnValue\":true}"
43 #define STANDARD_JSON_ERROR(errorCode, errorText) "{\"returnValue\":false,\"errorCode\":"STR(errorCode)",\"errorText\":\"" errorText "\"}"
44 #define MISSING_PARAMETER_ERROR(name, type) "{\"returnValue\":false,\"errorCode\":2,\"errorText\":\"Missing '" STR(name) "' " STR(type) " parameter.\"}"
45 #define INVALID_PARAMETER_ERROR(name, type) "{\"returnValue\":false,\"errorCode\":3,\"errorText\":\"Invalid '" STR(name) "' " STR(type) " parameter value.\"}"
48 #define IS_SYSTEM_PARAMETER(x) ((x) && *(x) == '$')
49 #define SYSTEM_PARAMETERS "\"$activity\":{\"type\":\"object\",\"optional\":true}"
52 #define SCHEMA_ANY "{}"
53 #define SCHEMA_0 "{\"type\":\"object\",\"properties\":{" SYSTEM_PARAMETERS "},\"additionalProperties\":false}" // Rejects any parameter. Only valid message is "{}"
54 #define SCHEMA_1(param) "{\"type\":\"object\",\"properties\":{" param "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}" // Ex: SCHEMA_1(REQUIRED(age,integer))
55 #define SCHEMA_2(p1, p2) "{\"type\":\"object\",\"properties\":{" p1 "," p2 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}" // Ex: SCHEMA_2(REQUIRED(age,integer),OPTIONAL(nickname,string)
56 #define SCHEMA_3(p1, p2, p3) "{\"type\":\"object\",\"properties\":{" p1 "," p2 "," p3 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
57 #define SCHEMA_4(p1, p2, p3, p4) "{\"type\":\"object\",\"properties\":{" p1 "," p2 "," p3 "," p4 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
58 #define SCHEMA_5(p1, p2, p3, p4, p5) "{\"type\":\"object\",\"properties\":{" p1 "," p2 "," p3 "," p4 "," p5 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
59 #define SCHEMA_6(p1, p2, p3, p4, p5, p6) "{\"type\":\"object\",\"properties\":{" p1 "," p2 "," p3 "," p4 "," p5 "," p6 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
60 #define SCHEMA_7(p1, p2, p3, p4, p5, p6, p7) "{\"type\":\"object\",\"properties\":{" p1 "," p2 "," p3 "," p4 "," p5 "," p6 "," p7 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
61 #define SCHEMA_8(p1, p2, p3, p4, p5, p6, p7, p8)"{\"type\":\"object\",\"properties\":{" p1 "," p2 "," p3 "," p4 "," p5 "," p6 "," p7 "," p8 "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
65 #define REQUIRED(name, type) "\"" #name "\":{\"type\":\"" #type "\"}"
66 #define OPTIONAL(name, type) "\"" #name "\":{\"type\":\"" #type "\",\"optional\":true}"
69 #define REQUIRED_UNION_2(name, type1, type2) "\"" #name "\":{\"type\":[{\"type\":\"" #type1 "\"},{\"type\":\"" #type2 "\"}]}"
72 #define NAKED_OBJECT_EMPTY(objName) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
73 #define OBJECT_EMPTY(objName) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
75 #define NAKED_OBJECT_REQUIRED_1(objName, p1, type1) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" REQUIRED(p1, type1) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
76 #define OBJECT_REQUIRED_1(objName, p1, type1) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" REQUIRED(p1, type1) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
78 #define NAKED_OBJECT_OPTIONAL_1(objName, p1, type1) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" OPTIONAL(p1, type1) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
79 #define OBJECT_OPTIONAL_1(objName, p1, type1) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" OPTIONAL(p1, type1) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
81 #define NAKED_OBJECT_REQUIRED_2(objName, p1, type1, p2, type2) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" REQUIRED(p1, type1) "," REQUIRED(p2, type2) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
82 #define OBJECT_REQUIRED_2(objName, p1, type1, p2, type2) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" REQUIRED(p1, type1) "," REQUIRED(p2, type2) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
84 #define NAKED_OBJECT_OPTIONAL_2(objName, p1, type1, p2, type2) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" OPTIONAL(p1, type1) "," OPTIONAL(p2, type2) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
85 #define OBJECT_OPTIONAL_2(objName, p1, type1, p2, type2) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" OPTIONAL(p1, type1) "," OPTIONAL(p2, type2) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
87 #define NAKED_OBJECT_REQUIRED_3(objName, p1, type1, p2, type2, p3, type3) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" REQUIRED(p1, type1) "," REQUIRED(p2, type2) "," REQUIRED(p3, type3) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
88 #define OBJECT_REQUIRED_3(objName, p1, type1, p2, type2, p3, type3) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" REQUIRED(p1, type1) "," REQUIRED(p2, type2) "," REQUIRED(p3, type3) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
90 #define NAKED_OBJECT_OPTIONAL_3(objName, p1, type1, p2, type2, p3, type3) "\"" #objName "\":{\"type\":\"object\",\"properties\":{" OPTIONAL(p1, type1) "," OPTIONAL(p2, type2) "," OPTIONAL(p3, type3) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}"
91 #define OBJECT_OPTIONAL_3(objName, p1, type1, p2, type2, p3, type3) "{\"" #objName "\":{\"type\":\"object\",\"properties\":{" OPTIONAL(p1, type1) "," OPTIONAL(p2, type2) "," OPTIONAL(p3, type3) "," SYSTEM_PARAMETERS "},\"additionalProperties\":false}}"
94 #define DEPRECATED_SERVICE_MSG() g_critical("THIS METHOD IS DEPRECATED. PLEASE REVISIT THE CODE.")
99 JsonValue(
const pbnjson::JValue & value) : mValue(value) {}
101 pbnjson::JValue &
get() {
return mValue; }
103 bool get(
const char * name, std::string & str) {
return mValue[name].asString(str) == CONV_OK; }
104 bool get(
const char * name,
bool & boolean) {
return mValue[name].asBool(
boolean) == CONV_OK; }
105 template <
class T>
bool get(
const char * name, T & number) {
return mValue[name].asNumber<T>(number) == CONV_OK; }
106 pbnjson::JValue
get(
const char * name) {
return mValue[name]; }
109 pbnjson::JValue mValue;
120 bool parse(
const char * callerFunction);
121 pbnjson::JValue
get() {
return mParser.getDom(); }
124 bool get(
const char * name, std::string & str) {
return get()[name].asString(str) == CONV_OK; }
125 bool get(
const char * name,
bool & boolean) {
return get()[name].asBool(
boolean) == CONV_OK; }
126 template <
class T>
bool get(
const char * name, T & number) {
return get()[name].asNumber<T>(number) == CONV_OK; }
127 pbnjson::JValue
get(
const char * name) {
return get()[name]; }
131 pbnjson::JSchemaFragment mSchema;
132 pbnjson::JDomParser mParser;
156 void Print(
const char * where,
int line, GLogLevelFlags logLevel = G_LOG_LEVEL_WARNING);
193 pbnjson::JValue
get() {
return mParser.getDom(); }
194 const char *
getPayload() {
return LSMessageGetPayload(mMessage); }
197 bool get(
const char * name, std::string & str) {
return get()[name].asString(str) == CONV_OK; }
198 bool get(
const char * name,
bool & boolean) {
return get()[name].asBool(
boolean) == CONV_OK; }
199 template <
class T>
bool get(
const char * name, T & number) {
return get()[name].asNumber<T>(number) == CONV_OK; }
202 LSMessage * mMessage;
203 const char * mSchemaText;
204 pbnjson::JSchemaFragment mSchema;
205 pbnjson::JDomParser mParser;
215 #define VALIDATE_SCHEMA_AND_RETURN_OPTION(lsHandle, message, schema, schErrOption) {\
216 LSMessageJsonParser jsonParser(message, schema); \
218 if (EDefault == schErrOption) \
219 schErrOption = static_cast<ESchemaErrorOptions>(Settings::LunaSettings()->schemaValidationOption); \
221 if (!jsonParser.parse(__FUNCTION__, lsHandle, schErrOption)) \
225 #define VALIDATE_SCHEMA_AND_RETURN(lsHandle, message, schema) {\
226 ESchemaErrorOptions schErrOption = EDefault; \
227 VALIDATE_SCHEMA_AND_RETURN_OPTION(lsHandle, message, schema, schErrOption); \
233 #define SUBSCRIBE_SCHEMA_RETURN(lsHandle, message) VALIDATE_SCHEMA_AND_RETURN(lsHandle, message, SCHEMA_1(OPTIONAL(subscribe, boolean)))
238 #define EMPTY_SCHEMA_RETURN(lsHandle, message) VALIDATE_SCHEMA_AND_RETURN(lsHandle, message, SCHEMA_ANY)
241 pbnjson::JValue
createJsonReply(
bool returnValue =
true,
int errorCode = 0,
const char * errorText = 0);
244 std::string
createJsonReplyString(
bool returnValue =
true,
int errorCode = 0,
const char * errorText = 0);
249 #endif // JSONUTILS_H