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

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

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

Line 
1/***************************************************************************
2 *            rpcValue.cc
3 *
4 *  Sat Mar 22 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/rpcValue.h>
33#include <libdodo/types.h>
34#include <libdodo/rpcValueEx.h>
35
36using namespace dodo::rpc;
37
38value::value() : valueDataType(DATA_BOOLEAN),
39                 booleanValue(false)
40{
41}
42
43//-------------------------------------------------------------------
44
45value::value(const dodo::string &value) : valueDataType(DATA_STRING),
46                                        stringValue(new dodo::string(value))
47{
48}
49
50//-------------------------------------------------------------------
51
52value::value(long value) : valueDataType(DATA_NUMERIC),
53                           numericValue(value)
54{
55}
56
57//-------------------------------------------------------------------
58
59value::value(double value) : valueDataType(DATA_NUMERIC),
60                             numericValue(value)
61{
62}
63
64//-------------------------------------------------------------------
65
66value::value(bool value) : valueDataType(DATA_BOOLEAN),
67                           booleanValue(value)
68{
69}
70
71//-------------------------------------------------------------------
72
73value::value(const dodoArray<value> &nvalue) : valueDataType(DATA_ARRAY),
74                                               arrayValue(new dodoArray<value>(nvalue))
75{
76}
77
78//-------------------------------------------------------------------
79
80value::value(const dodoMap<dodo::string, value, dodoMapStringCompare> &nvalue) : valueDataType(DATA_STRUCT),
81                                                                               structValue(new dodoMap<dodo::string, value, dodoMapStringCompare>(nvalue))
82{
83}
84
85//-------------------------------------------------------------------
86
87value::value(const value &on) : valueDataType(on.valueDataType)
88{
89    switch (valueDataType) {
90        case DATA_STRING:
91            stringValue = new dodo::string(*on.stringValue);
92            break;
93
94        case DATA_STRUCT:
95            structValue = new dodoMap<dodo::string, value, dodoMapStringCompare>(*on.structValue);
96            break;
97
98        case DATA_ARRAY:
99            arrayValue = new dodoArray<value>(*on.arrayValue);
100            break;
101
102        case DATA_NUMERIC:
103            numericValue = on.numericValue;
104            break;
105
106        case DATA_BOOLEAN:
107            booleanValue = on.booleanValue;
108            break;
109    }
110}
111
112//-------------------------------------------------------------------
113
114value::~value()
115{
116    switch (valueDataType) {
117        case DATA_STRING:
118            delete stringValue;
119            break;
120
121        case DATA_STRUCT:
122            delete structValue;
123            break;
124
125        case DATA_ARRAY:
126            delete arrayValue;
127            break;
128    }
129}
130
131//-------------------------------------------------------------------
132
133void
134value::setString(const dodo::string &nvalue)
135{
136    if (valueDataType != DATA_STRING) {
137        switch (valueDataType) {
138            case DATA_STRUCT:
139                delete structValue;
140                break;
141
142            case DATA_ARRAY:
143                delete arrayValue;
144                break;
145        }
146
147        valueDataType = DATA_STRING;
148        stringValue = new dodo::string(nvalue);
149    } else
150        *stringValue = nvalue;
151}
152
153//-------------------------------------------------------------------
154
155void
156value::setBoolean(bool value)
157{
158    if (valueDataType != DATA_BOOLEAN) {
159        switch (valueDataType) {
160            case DATA_STRING:
161                delete stringValue;
162                break;
163
164            case DATA_STRUCT:
165                delete structValue;
166                break;
167
168            case DATA_ARRAY:
169                delete arrayValue;
170                break;
171        }
172
173        valueDataType = DATA_BOOLEAN;
174    }
175
176    booleanValue = value;
177}
178
179//-------------------------------------------------------------------
180
181void
182value::setNumeric(double value)
183{
184    if (valueDataType != DATA_NUMERIC) {
185        switch (valueDataType) {
186            case DATA_STRING:
187                delete stringValue;
188                break;
189
190            case DATA_STRUCT:
191                delete structValue;
192                break;
193
194            case DATA_ARRAY:
195                delete arrayValue;
196                break;
197        }
198
199        valueDataType = DATA_NUMERIC;
200    }
201
202    numericValue = value;
203}
204
205//-------------------------------------------------------------------
206
207void
208value::addArrayElement(const value &nvalue)
209{
210    if (valueDataType != DATA_ARRAY) {
211        switch (valueDataType) {
212            case DATA_STRUCT:
213                delete structValue;
214                break;
215
216            case DATA_ARRAY:
217                delete arrayValue;
218                break;
219        }
220
221        valueDataType = DATA_ARRAY;
222        arrayValue = new dodoArray<value>;
223    }
224
225    arrayValue->push_back(nvalue);
226}
227
228//-------------------------------------------------------------------
229
230void
231value::addStructureMember(const dodo::string &name,
232                          const value      &nvalue)
233{
234    if (valueDataType != DATA_STRUCT) {
235        switch (valueDataType) {
236            case DATA_STRING:
237                delete stringValue;
238                break;
239
240            case DATA_ARRAY:
241                delete arrayValue;
242                break;
243        }
244
245        valueDataType = DATA_STRUCT;
246        structValue = new dodoMap<dodo::string, value, dodoMapStringCompare>;
247    }
248
249    structValue->insert(std::make_pair(name,  nvalue));
250}
251
252//-------------------------------------------------------------------
253
254void
255value::setArray(const dodoArray<value> &nvalue)
256{
257    if (valueDataType != DATA_ARRAY) {
258        switch (valueDataType) {
259            case DATA_STRING:
260                delete stringValue;
261                break;
262
263            case DATA_STRUCT:
264                delete structValue;
265                break;
266        }
267
268        valueDataType = DATA_ARRAY;
269        arrayValue = new dodoArray<value>(nvalue);
270    } else
271        *arrayValue = nvalue;
272}
273
274//-------------------------------------------------------------------
275
276void
277value::setStruct(const dodoMap<dodo::string, value, dodoMapStringCompare> &nvalue)
278{
279    if (valueDataType != DATA_STRUCT) {
280        switch (valueDataType) {
281            case DATA_STRING:
282                delete stringValue;
283                break;
284
285            case DATA_ARRAY:
286                delete arrayValue;
287                break;
288        }
289
290        valueDataType = DATA_STRUCT;
291        structValue = new dodoMap<dodo::string, value, dodoMapStringCompare>(nvalue);
292    } else
293        *structValue = nvalue;
294}
295
296//-------------------------------------------------------------------
297
298value
299value::operator[](const dodo::string &name)
300{
301    if (valueDataType != DATA_STRUCT)
302        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_BROPERATORSTRING, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
303
304    return (*structValue)[name];
305}
306
307//-------------------------------------------------------------------
308
309value
310value::operator[](unsigned long key)
311{
312    if (valueDataType != DATA_ARRAY)
313        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_BROPERATORNUMERIC, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
314
315    if (key >= arrayValue->size())
316        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_BROPERATORNUMERIC, exception::ERRNO_LIBDODO, VALUEEX_ARRAYOUTOFRANGE, RPCVALUEEX_ARRAYOUTOFRANGE_STR, __LINE__, __FILE__);
317
318    return (*arrayValue)[key];
319}
320
321//-------------------------------------------------------------------
322
323short
324value::type()
325{
326    return valueDataType;
327}
328
329//-------------------------------------------------------------------
330
331dodo::string
332value::string()
333{
334    if (valueDataType != DATA_STRING)
335        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_STRING, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
336
337    return *stringValue;
338}
339
340//-------------------------------------------------------------------
341
342bool
343value::boolean()
344{
345    if (valueDataType != DATA_BOOLEAN)
346        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_BOOLEAN, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
347
348    return booleanValue;
349}
350
351//-------------------------------------------------------------------
352
353long
354value::numeric()
355{
356    if (valueDataType != DATA_NUMERIC)
357        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_NUMERIC, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
358
359    return (long)numericValue;
360}
361
362//-------------------------------------------------------------------
363
364dodoArray<value>
365value::array()
366{
367    if (valueDataType != DATA_ARRAY)
368        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_ARRAY, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
369
370    return *arrayValue;
371}
372
373//-------------------------------------------------------------------
374
375dodoMap<dodo::string, value, dodo::dodoMapStringCompare>
376value::structure()
377{
378    if (valueDataType != DATA_STRUCT)
379        dodo_throw exception::basic(exception::MODULE_RPCVALUE, VALUEEX_STRUCT, exception::ERRNO_LIBDODO, VALUEEX_WRONGTYPEREQUESTED, RPCVALUEEX_WRONGTYPEREQUESTED_STR, __LINE__, __FILE__);
380
381    return *structValue;
382}
383
384//-------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.