source: sources/src/rpcJsonMethod.cc @ 1464:3f6711617be1

Revision 1464:3f6711617be1, 4.7 KB checked in by niam, 22 months ago (diff)

{issue #58[resolved]} support for non-c++ exceptions

Line 
1/***************************************************************************
2 *            rpcJsonMethod.cc
3 *
4 *  Mon Jul 07 2008
5 *  Copyright  2008  Dmytro Milinevskyy
6 *  milinevskyy@gmail.com
7 ****************************************************************************/
8
9/*
10 *  This program is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU Lesser General Public License version 2.1 as published by
12 *  the Free Software Foundation;
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU Library General Public License for more details.
18 *
19 *  You should have received a copy of the GNU Lesser General Public License
20 *  along with this program; if not, write to the Free Software
21 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 */
23
24/**
25 * vim indentation settings
26 * set tabstop=4
27 * set shiftwidth=4
28 */
29
30#include <libdodo/directives.h>
31
32#include <libdodo/rpcJsonMethod.h>
33#include <libdodo/types.h>
34#include <libdodo/dataFormatJsonNode.h>
35#include <libdodo/rpcMethod.h>
36#include <libdodo/rpcJsonMethodEx.h>
37#include <libdodo/rpcJsonValue.h>
38#include <libdodo/rpcValue.h>
39
40using namespace dodo::rpc::json;
41
42dodo::rpc::method
43method::jsonToMethod(dodo::data::format::json::node &node,
44                     dodo::string                     &version,
45                     long                           &id)
46{
47    if (node.valueDataType != dodo::data::format::json::node::DATA_OBJECT)
48        dodo_throw exception::basic(exception::MODULE_RPCJSONMETHOD, METHODEX_JSONTOMETHOD, exception::ERRNO_LIBDODO, METHODEX_ROOTNOTANOBJECT, RPCJSONMETHODEX_ROOTNOTANOBJECT_STR, __LINE__, __FILE__);
49
50    rpc::method meth;
51
52    meth.name = (*node.objectValue)["method"].string();
53    version = (*node.objectValue)["version"].string();
54    id = (*node.objectValue)["id"].numeric();
55
56    dodo::data::format::json::node &params = (*node.objectValue)["params"];
57
58    if (params.valueDataType != dodo::data::format::json::node::DATA_ARRAY &&
59        params.valueDataType != dodo::data::format::json::node::DATA_OBJECT)
60        dodo_throw exception::basic(exception::MODULE_RPCJSONMETHOD, METHODEX_JSONTOMETHOD, exception::ERRNO_LIBDODO, METHODEX_PARAMSNOTANARRAY, RPCJSONMETHODEX_PARAMSNOTANARRAY_STR, __LINE__, __FILE__);
61
62    if (params.valueDataType == dodo::data::format::json::node::DATA_ARRAY) {
63        dodoArray<dodo::data::format::json::node>::iterator
64        i = params.arrayValue->begin(),
65        j = params.arrayValue->end();
66        for (; i != j; ++i)
67            meth.arguments.push_back(value::jsonToValue(*i));
68    } else
69        meth.arguments.push_back(value::jsonToValue(params));
70
71    return meth;
72}
73
74//-------------------------------------------------------------------
75
76dodo::data::format::json::node
77method::methodToJson(const rpc::method &data,
78                     const dodo::string  &version,
79                     long              id)
80{
81    dodo::data::format::json::node meth;
82    dodo::data::format::json::node node;
83
84    meth.valueDataType = dodo::data::format::json::node::DATA_OBJECT;
85    meth.objectValue = new dodoMap<dodo::string, dodo::data::format::json::node, dodoMapStringCompare>;
86
87    node.valueDataType = dodo::data::format::json::node::DATA_STRING;
88
89    node.stringValue = new dodo::string(data.name);
90    meth.objectValue->insert(std::make_pair(dodo::string("method"), node));
91    delete node.stringValue;
92
93    node.stringValue = new dodo::string(version);
94    meth.objectValue->insert(std::make_pair(dodo::string("version"), node));
95    delete node.stringValue;
96
97    node.valueDataType = dodo::data::format::json::node::DATA_NUMERIC;
98    node.numericValue = id;
99    meth.objectValue->insert(std::make_pair(dodo::string("id"), node));
100
101    dodoArray<rpc::value>::const_iterator i = data.arguments.begin(), j = data.arguments.end();
102    if (i != j) {
103        if (data.arguments.size() == 1 && i->valueDataType == dodo::rpc::value::DATA_STRUCT)
104            meth.objectValue->insert(std::make_pair(dodo::string("params"), value::valueToJson(*i)));
105        else {
106            node.valueDataType = dodo::data::format::json::node::DATA_ARRAY;
107            node.arrayValue = new dodoArray<dodo::data::format::json::node>;
108
109            for (; i != j; ++i)
110                node.arrayValue->push_back(value::valueToJson(*i));
111
112            meth.objectValue->insert(std::make_pair(dodo::string("params"), node));
113
114            delete node.arrayValue;
115            node.valueDataType = dodo::data::format::json::node::DATA_NULL;
116        }
117    }
118
119    return meth;
120}
121
122//-------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.