Change krbCred member to reauthCred to better clarify purpose
[moonshot.git] / mech_eap / util_json.h
1 /*
2  * Copyright (c) 2011, JANET(UK)
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. Neither the name of JANET(UK) nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32
33 /*
34  * JSON object wrapper with not-entirely-toll-free DDF bridging.
35  */
36
37 #ifndef _UTIL_JSON_H_
38 #define _UTIL_JSON_H_ 1
39
40 #ifdef __cplusplus
41 #include <string>
42 #include <new>
43
44 #include <jansson.h>
45 #include <shibsp/remoting/ddf.h>
46
47 using namespace shibsp;
48
49 namespace gss_eap_util {
50     class JSONObject;
51
52     class JSONException : public std::exception {
53     public:
54         JSONException(json_t *obj = NULL, json_type type = JSON_NULL);
55
56         ~JSONException(void) throw() {
57             json_decref(m_obj);
58         }
59
60         virtual const char *what(void) const throw() {
61             return m_reason.c_str();
62         }
63
64     private:
65         json_t *m_obj;
66         json_type m_type;
67         std::string m_reason;
68     };
69
70     class JSONIterator {
71     public:
72         JSONIterator(const JSONObject &obj);
73         ~JSONIterator(void);
74         const char *key(void) const;
75         JSONObject value(void) const;
76         bool next(void);
77
78     private:
79         json_t *m_obj;
80         void *m_iter;
81     };
82
83     class JSONObject {
84     public:
85         static JSONObject load(const char *input, size_t flags, json_error_t *error);
86         static JSONObject load(FILE *, size_t flags, json_error_t *error);
87
88         static JSONObject object(void);
89         static JSONObject array(void);
90         static JSONObject null(void);
91         static JSONObject ddf(DDF &value);
92
93         char *dump(size_t flags = 0) const;
94         void dump(FILE *fp, size_t flags = JSON_INDENT(4)) const;
95
96         json_type type(void) const { return json_typeof(m_obj); }
97         size_t size(void) const;
98
99         JSONObject(void);
100         JSONObject(const char *value);
101         JSONObject(json_int_t value);
102         JSONObject(double value);
103         JSONObject(bool value);
104
105         void set(const char *key, JSONObject &value);
106         void set(const char *key, const char *value);
107         void set(const char *key, json_int_t value);
108         void del(const char *key);
109         void update(JSONObject &value);
110         JSONIterator iterator(void) const { return JSONIterator(*this); }
111         JSONObject get(const char *key) const;
112         JSONObject operator[](const char *key) const;
113
114         JSONObject get(size_t index) const;
115         JSONObject operator[](size_t index) const;
116         void append(JSONObject &value);
117         void insert(size_t index, JSONObject &value);
118         void remove(size_t index);
119         void clear(void);
120         void extend(JSONObject &value);
121
122         const char *string(void) const;
123         json_int_t integer(void) const;
124         double real(void) const;
125         double number(void) const;
126         DDF ddf(void) const;
127
128         bool isObject(void) const;
129         bool isArray(void) const;
130         bool isString(void) const;
131         bool isInteger(void) const;
132         bool isNumber(void) const;
133         bool isBoolean(void) const;
134         bool isNull(void) const;
135
136         ~JSONObject(void)
137         {
138             if (m_obj != NULL)
139                 json_decref(m_obj);
140         }
141
142         JSONObject(const JSONObject &obj)
143         {
144             m_obj = json_incref(obj.m_obj);
145         }
146
147         JSONObject& operator=(const JSONObject &obj)
148         {
149             if (this != &obj)
150                 set(obj.m_obj);
151             return *this;
152         }
153
154     private:
155         friend class JSONIterator;
156
157         json_t *get(void) const {
158             return json_incref(m_obj);
159         }
160
161         void set(json_t *obj) {
162             if (m_obj != obj) {
163                 json_decref(m_obj);
164                 m_obj = json_incref(m_obj);
165             }
166         }
167
168         JSONObject(json_t *obj, bool retain = true);
169
170         json_t *m_obj;
171     };
172 }
173
174 #endif /* __cplusplus */
175
176 #endif /* _UTIL_JSON_H_ */