MIDAS
Loading...
Searching...
No Matches
mjsonrpc_user.cxx
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: mjsonrpc_user.cxx
4 Created by: Konstantin Olchanski
5
6 Contents: handler of user-provided and experimental JSON-RPC requests
7
8\********************************************************************/
9
10#include <stdio.h>
11
12#include "mjsonrpc.h"
13
14//
15// example 1: extract request parameters, return up to 3 results
16//
17
18static MJsonNode* user_example1(const MJsonNode* params)
19{
20 if (!params) {
21 MJSO* doc = MJSO::I();
22 doc->D("example of user defined RPC method that returns up to 3 results");
23 doc->P("arg", MJSON_STRING, "example string argment");
24 doc->P("optional_arg?", MJSON_INT, "optional example integer argument");
25 doc->R("string", MJSON_STRING, "returns the value of \"arg\" parameter");
26 doc->R("integer", MJSON_INT, "returns the value of \"optional_arg\" parameter");
27 return doc;
28 }
29
30 MJsonNode* error = NULL;
31
32 std::string arg = mjsonrpc_get_param(params, "arg", &error)->GetString(); if (error) return error;
33 int optional_arg = mjsonrpc_get_param(params, "optional_arg", NULL)->GetInt();
34
36 printf("user_example1(%s,%d)\n", arg.c_str(), optional_arg);
37
38 return mjsonrpc_make_result("string", MJsonNode::MakeString(arg.c_str()), "integer", MJsonNode::MakeInt(optional_arg));
39}
40
41//
42// example 2: extract request parameters, return more than 3 results
43//
44
45static MJsonNode* user_example2(const MJsonNode* params)
46{
47 if (!params) {
48 MJSO* doc = MJSO::I();
49 doc->D("example of user defined RPC method that returns more than 3 results");
50 doc->P("arg", MJSON_STRING, "example string argment");
51 doc->P("optional_arg?", MJSON_INT, "optional example integer argument");
52 doc->R("string1", MJSON_STRING, "returns the value of \"arg\" parameter");
53 doc->R("string2", MJSON_STRING, "returns \"hello\"");
54 doc->R("string3", MJSON_STRING, "returns \"world!\"");
55 doc->R("value1", MJSON_INT, "returns the value of \"optional_arg\" parameter");
56 doc->R("value2", MJSON_NUMBER, "returns 3.14");
57 return doc;
58 }
59
60 MJsonNode* error = NULL;
61
62 std::string arg = mjsonrpc_get_param(params, "arg", &error)->GetString(); if (error) return error;
63 int optional_arg = mjsonrpc_get_param(params, "optional_arg", NULL)->GetInt();
64
66 printf("user_example2(%s,%d)\n", arg.c_str(), optional_arg);
67
68 MJsonNode* result = MJsonNode::MakeObject();
69
70 result->AddToObject("string1", MJsonNode::MakeString(arg.c_str()));
71 result->AddToObject("string2", MJsonNode::MakeString("hello"));
72 result->AddToObject("string3", MJsonNode::MakeString("world!"));
73 result->AddToObject("value1", MJsonNode::MakeInt(optional_arg));
74 result->AddToObject("value2", MJsonNode::MakeNumber(3.14));
75
76 return mjsonrpc_make_result(result);
77}
78
79//
80// example 3: return an error
81//
82
83static MJsonNode* user_example3(const MJsonNode* params)
84{
85 if (!params) {
86 MJSO* doc = MJSO::I();
87 doc->D("example of user defined RPC method that returns an error");
88 doc->P("arg", MJSON_INT, "integer value, if zero, throws a JSON-RPC error");
89 doc->R("status", MJSON_INT, "returns the value of \"arg\" parameter");
90 return doc;
91 }
92
93 MJsonNode* error = NULL;
94
95 int arg = mjsonrpc_get_param(params, "arg", &error)->GetInt(); if (error) return error;
96
98 printf("user_example3(%d)\n", arg);
99
100 if (arg)
101 return mjsonrpc_make_result("status", MJsonNode::MakeInt(arg));
102 else
103 return mjsonrpc_make_error(15, "example error message", "example error data");
104}
105
106//
107// to create your own rpc method handler, copy one of the examples here, register it in user_init below
108//
109
110
111
112//
113// user_init function is called at startup time to register user rpc method handlers
114//
115
117{
118 if (mjsonrpc_debug) {
119 printf("mjsonrpc_user_init!\n");
120 }
121
122 // add user functions to the rpc list
123
124 mjsonrpc_add_handler("user_example1", user_example1);
125 mjsonrpc_add_handler("user_example2", user_example2);
126 mjsonrpc_add_handler("user_example3", user_example3);
127}
128
129/* emacs
130 * Local Variables:
131 * tab-width: 8
132 * c-basic-offset: 3
133 * indent-tabs-mode: nil
134 * End:
135 */
136
MJsonNode * mjsonrpc_make_result(MJsonNode *node)
Definition mjsonrpc.cxx:135
static MJSO * I()
Definition mjsonrpc.cxx:298
void mjsonrpc_user_init()
MJsonNode * mjsonrpc_make_error(int code, const char *message, const char *data)
Definition mjsonrpc.cxx:123
int mjsonrpc_debug
Definition mjsonrpc.cxx:112
const MJsonNode * mjsonrpc_get_param(const MJsonNode *params, const char *name, MJsonNode **error)
Definition mjsonrpc.cxx:178
void mjsonrpc_add_handler(const char *method, mjsonrpc_handler_t *handler, bool needs_locking)
static MJsonNode * user_example3(const MJsonNode *params)
static MJsonNode * user_example1(const MJsonNode *params)
static MJsonNode * user_example2(const MJsonNode *params)
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24