Api wrapper to communicate with EVRYTHNG's Engine.

Dependencies:   EthernetInterface mbed-rtos

Dependents:   EvrythngApiExample

Committer:
vladounet
Date:
Thu Aug 30 13:25:41 2012 +0000
Revision:
1:7162d0e030f5
Parent:
0:d38d192c2f5f
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vladounet 0:d38d192c2f5f 1 /*
vladounet 0:d38d192c2f5f 2 * (c) Copyright 2012 EVRYTHNG Ltd London / Zurich
vladounet 0:d38d192c2f5f 3 * www.evrythng.com
vladounet 0:d38d192c2f5f 4 *
vladounet 0:d38d192c2f5f 5 * --- DISCLAIMER ---
vladounet 0:d38d192c2f5f 6 *
vladounet 0:d38d192c2f5f 7 * EVRYTHNG provides this source code "as is" and without warranty of any kind,
vladounet 0:d38d192c2f5f 8 * and hereby disclaims all express or implied warranties, including without
vladounet 0:d38d192c2f5f 9 * limitation warranties of merchantability, fitness for a particular purpose,
vladounet 0:d38d192c2f5f 10 * performance, accuracy, reliability, and non-infringement.
vladounet 0:d38d192c2f5f 11 *
vladounet 0:d38d192c2f5f 12 * Author: Michel Yerly
vladounet 0:d38d192c2f5f 13 *
vladounet 0:d38d192c2f5f 14 */
vladounet 0:d38d192c2f5f 15 #ifndef JSONPARSER_H
vladounet 0:d38d192c2f5f 16 #define JSONPARSER_H
vladounet 0:d38d192c2f5f 17
vladounet 0:d38d192c2f5f 18 #include <vector>
vladounet 0:d38d192c2f5f 19 #include <map>
vladounet 0:d38d192c2f5f 20 #include <string>
vladounet 0:d38d192c2f5f 21
vladounet 0:d38d192c2f5f 22 /*
vladounet 0:d38d192c2f5f 23 * Possible JSON value types
vladounet 0:d38d192c2f5f 24 */
vladounet 0:d38d192c2f5f 25 enum ValueType {
vladounet 0:d38d192c2f5f 26
vladounet 0:d38d192c2f5f 27 VT_DOUBLE, // Number
vladounet 0:d38d192c2f5f 28 VT_CHAR_PTR, // String
vladounet 0:d38d192c2f5f 29 VT_VEC_PTR, // Array
vladounet 0:d38d192c2f5f 30 VT_MAP_PTR, // Object
vladounet 0:d38d192c2f5f 31 VT_CST_NULL, // Null
vladounet 0:d38d192c2f5f 32 VT_CST_TRUE, // True
vladounet 0:d38d192c2f5f 33 VT_CST_FALSE // False
vladounet 0:d38d192c2f5f 34 };
vladounet 0:d38d192c2f5f 35
vladounet 0:d38d192c2f5f 36 /*
vladounet 0:d38d192c2f5f 37 * Class to hold a JSON value. A JSON value may be composed of other JSON
vladounet 0:d38d192c2f5f 38 * values.
vladounet 0:d38d192c2f5f 39 */
vladounet 0:d38d192c2f5f 40 class JsonValue
vladounet 0:d38d192c2f5f 41 {
vladounet 0:d38d192c2f5f 42 public:
vladounet 0:d38d192c2f5f 43
vladounet 0:d38d192c2f5f 44 /*
vladounet 0:d38d192c2f5f 45 * Creates a new string JSON value. The string is copied into the object.
vladounet 0:d38d192c2f5f 46 * WARNING: a new object is created. The caller is responsible of deleting
vladounet 0:d38d192c2f5f 47 * it.
vladounet 0:d38d192c2f5f 48 * buffer: the string to read from.
vladounet 0:d38d192c2f5f 49 * len: the number of characters to read.
vladounet 0:d38d192c2f5f 50 */
vladounet 0:d38d192c2f5f 51 static JsonValue* createString(const char* buffer, int len);
vladounet 0:d38d192c2f5f 52
vladounet 0:d38d192c2f5f 53 /* Creates a new number JSON value.
vladounet 0:d38d192c2f5f 54 * WARNING: a new object is created. The caller is responsible of deleting
vladounet 0:d38d192c2f5f 55 * it.
vladounet 0:d38d192c2f5f 56 */
vladounet 0:d38d192c2f5f 57 static JsonValue* createDouble(double d);
vladounet 0:d38d192c2f5f 58
vladounet 0:d38d192c2f5f 59 /* Creates a new object JSON value.
vladounet 0:d38d192c2f5f 60 * WARNING: a new object is created. The caller is responsible of deleting
vladounet 0:d38d192c2f5f 61 * it.
vladounet 0:d38d192c2f5f 62 */
vladounet 0:d38d192c2f5f 63 static JsonValue* createMap();
vladounet 0:d38d192c2f5f 64
vladounet 0:d38d192c2f5f 65 /* Creates a new array JSON value.
vladounet 0:d38d192c2f5f 66 * WARNING: a new object is created. The caller is responsible of deleting
vladounet 0:d38d192c2f5f 67 * it.
vladounet 0:d38d192c2f5f 68 */
vladounet 0:d38d192c2f5f 69 static JsonValue* createVector();
vladounet 0:d38d192c2f5f 70
vladounet 0:d38d192c2f5f 71 /* Creates a new true or false JSON value, depending on b.
vladounet 0:d38d192c2f5f 72 * WARNING: a new object is created. The caller is responsible of deleting
vladounet 0:d38d192c2f5f 73 * it.
vladounet 0:d38d192c2f5f 74 */
vladounet 0:d38d192c2f5f 75 static JsonValue* createBoolean(bool b);
vladounet 0:d38d192c2f5f 76
vladounet 0:d38d192c2f5f 77 /* Creates a new null JSON value.
vladounet 0:d38d192c2f5f 78 * WARNING: a new object is created. The caller is responsible of deleting
vladounet 0:d38d192c2f5f 79 * it.
vladounet 0:d38d192c2f5f 80 */
vladounet 0:d38d192c2f5f 81 static JsonValue* createNull();
vladounet 0:d38d192c2f5f 82
vladounet 0:d38d192c2f5f 83 /*
vladounet 0:d38d192c2f5f 84 * Destructor.
vladounet 0:d38d192c2f5f 85 * The destructor also deletes nested JsonValues if any.
vladounet 0:d38d192c2f5f 86 */
vladounet 0:d38d192c2f5f 87 virtual ~JsonValue();
vladounet 0:d38d192c2f5f 88
vladounet 0:d38d192c2f5f 89 /*
vladounet 0:d38d192c2f5f 90 * Gets a JSON value given a path.
vladounet 0:d38d192c2f5f 91 * If the path is NULL or an empty string the method returns this.
vladounet 0:d38d192c2f5f 92 * If there is an error, the method returns NULL.
vladounet 0:d38d192c2f5f 93 * The path is composed of strings (object keys) and numbers (array
vladounet 0:d38d192c2f5f 94 * indices) separated by '/'.
vladounet 0:d38d192c2f5f 95 *
vladounet 0:d38d192c2f5f 96 * Example:
vladounet 0:d38d192c2f5f 97 * JSON: {"xy":34,"ab":[{"r":true},{"s":false}]}
vladounet 0:d38d192c2f5f 98 * Path: ab/1/s
vladounet 0:d38d192c2f5f 99 * Returns: a JsonValue representing false.
vladounet 0:d38d192c2f5f 100 */
vladounet 0:d38d192c2f5f 101 JsonValue* get(const char* path);
vladounet 0:d38d192c2f5f 102
vladounet 0:d38d192c2f5f 103 /*
vladounet 0:d38d192c2f5f 104 * Gets a pointer to a double given a path (see get()).
vladounet 0:d38d192c2f5f 105 * If there is an error, the method returns NULL.
vladounet 0:d38d192c2f5f 106 */
vladounet 0:d38d192c2f5f 107 const double* getDouble(const char* path);
vladounet 0:d38d192c2f5f 108
vladounet 0:d38d192c2f5f 109 /*
vladounet 0:d38d192c2f5f 110 * Gets a pointer to a string given a path (see get()).
vladounet 0:d38d192c2f5f 111 * If there is an error, the method returns NULL.
vladounet 0:d38d192c2f5f 112 */
vladounet 0:d38d192c2f5f 113 const char* getString(const char* path);
vladounet 0:d38d192c2f5f 114
vladounet 0:d38d192c2f5f 115 /*
vladounet 0:d38d192c2f5f 116 * Gets a pointer to an array given a path (see get()).
vladounet 0:d38d192c2f5f 117 * If there is an error, the method returns NULL.
vladounet 0:d38d192c2f5f 118 */
vladounet 0:d38d192c2f5f 119 const std::vector<JsonValue*>* getVector(const char* path);
vladounet 0:d38d192c2f5f 120
vladounet 0:d38d192c2f5f 121 /*
vladounet 0:d38d192c2f5f 122 * Gets a pointer to a map given a path (see get()).
vladounet 0:d38d192c2f5f 123 * If there is an error, the method returns NULL.
vladounet 0:d38d192c2f5f 124 */
vladounet 0:d38d192c2f5f 125 const std::map<std::string,JsonValue*>* getMap(const char* path);
vladounet 0:d38d192c2f5f 126
vladounet 0:d38d192c2f5f 127 /*
vladounet 0:d38d192c2f5f 128 * Gets a pointer to a boolean given a path (see get()).
vladounet 0:d38d192c2f5f 129 * If there is an error, the method returns NULL.
vladounet 0:d38d192c2f5f 130 */
vladounet 0:d38d192c2f5f 131 const bool* getBoolean(const char* path);
vladounet 0:d38d192c2f5f 132
vladounet 0:d38d192c2f5f 133 /*
vladounet 0:d38d192c2f5f 134 * Determines if the value at the path (see get()) is null.
vladounet 0:d38d192c2f5f 135 * Return true if and only if the value is explicitely null.
vladounet 0:d38d192c2f5f 136 */
vladounet 0:d38d192c2f5f 137 bool isNull(const char* path);
vladounet 0:d38d192c2f5f 138
vladounet 0:d38d192c2f5f 139 /*
vladounet 0:d38d192c2f5f 140 * Debug function.
vladounet 0:d38d192c2f5f 141 */
vladounet 0:d38d192c2f5f 142 void print();
vladounet 0:d38d192c2f5f 143
vladounet 0:d38d192c2f5f 144 friend class JsonParser;
vladounet 0:d38d192c2f5f 145
vladounet 0:d38d192c2f5f 146 private:
vladounet 0:d38d192c2f5f 147
vladounet 0:d38d192c2f5f 148 /*
vladounet 0:d38d192c2f5f 149 * Constructor that creates a string JSON value. The string is copied into
vladounet 0:d38d192c2f5f 150 * the object.
vladounet 0:d38d192c2f5f 151 * buffer: the string to read from.
vladounet 0:d38d192c2f5f 152 * len: the number of characters to read.
vladounet 0:d38d192c2f5f 153 */
vladounet 0:d38d192c2f5f 154 JsonValue(const char* buffer, int len);
vladounet 0:d38d192c2f5f 155
vladounet 0:d38d192c2f5f 156 /*
vladounet 0:d38d192c2f5f 157 * Constructor that creates a number JSON value.
vladounet 0:d38d192c2f5f 158 */
vladounet 0:d38d192c2f5f 159 JsonValue(double d);
vladounet 0:d38d192c2f5f 160
vladounet 0:d38d192c2f5f 161 /*
vladounet 0:d38d192c2f5f 162 * Constructor that creates either a True or a False JSON value.
vladounet 0:d38d192c2f5f 163 */
vladounet 0:d38d192c2f5f 164 JsonValue(bool b);
vladounet 0:d38d192c2f5f 165
vladounet 0:d38d192c2f5f 166 /*
vladounet 0:d38d192c2f5f 167 * Constructor that creates a JSON value without specifying the type.
vladounet 0:d38d192c2f5f 168 */
vladounet 0:d38d192c2f5f 169 JsonValue();
vladounet 0:d38d192c2f5f 170
vladounet 0:d38d192c2f5f 171 ValueType type;
vladounet 0:d38d192c2f5f 172 union {
vladounet 0:d38d192c2f5f 173 double d;
vladounet 0:d38d192c2f5f 174 char* s;
vladounet 0:d38d192c2f5f 175 std::vector<JsonValue*>* vec;
vladounet 0:d38d192c2f5f 176 std::map<std::string,JsonValue*>* map;
vladounet 0:d38d192c2f5f 177 } value;
vladounet 0:d38d192c2f5f 178
vladounet 0:d38d192c2f5f 179 };
vladounet 0:d38d192c2f5f 180
vladounet 0:d38d192c2f5f 181 enum TokenType {
vladounet 0:d38d192c2f5f 182 TOKEN_EOS,
vladounet 0:d38d192c2f5f 183 TOKEN_NUMBER,
vladounet 0:d38d192c2f5f 184 TOKEN_STRING,
vladounet 0:d38d192c2f5f 185 TOKEN_DELIMITER,
vladounet 0:d38d192c2f5f 186 TOKEN_TRUE,
vladounet 0:d38d192c2f5f 187 TOKEN_FALSE,
vladounet 0:d38d192c2f5f 188 TOKEN_NULL
vladounet 0:d38d192c2f5f 189 };
vladounet 0:d38d192c2f5f 190
vladounet 0:d38d192c2f5f 191 /*
vladounet 0:d38d192c2f5f 192 * Class to parse a JSON string.
vladounet 0:d38d192c2f5f 193 *
vladounet 0:d38d192c2f5f 194 * NOTE: The current implementation does only support ASCII encoding.
vladounet 0:d38d192c2f5f 195 */
vladounet 0:d38d192c2f5f 196 class JsonParser
vladounet 0:d38d192c2f5f 197 {
vladounet 0:d38d192c2f5f 198 public:
vladounet 0:d38d192c2f5f 199
vladounet 0:d38d192c2f5f 200 /*
vladounet 0:d38d192c2f5f 201 * Constructor.
vladounet 0:d38d192c2f5f 202 */
vladounet 0:d38d192c2f5f 203 JsonParser();
vladounet 0:d38d192c2f5f 204
vladounet 0:d38d192c2f5f 205 /*
vladounet 0:d38d192c2f5f 206 * Destructor.
vladounet 0:d38d192c2f5f 207 * The destructor also deletes the parsed document (the one you get with
vladounet 0:d38d192c2f5f 208 * getDocument().
vladounet 0:d38d192c2f5f 209 */
vladounet 0:d38d192c2f5f 210 virtual ~JsonParser();
vladounet 0:d38d192c2f5f 211
vladounet 0:d38d192c2f5f 212 /*
vladounet 0:d38d192c2f5f 213 * Parses the json string.
vladounet 0:d38d192c2f5f 214 * json: String that contains the json to parse.
vladounet 0:d38d192c2f5f 215 * Returns 0 on success, or -1 on error.
vladounet 0:d38d192c2f5f 216 *
vladounet 0:d38d192c2f5f 217 * NOTE: This method deletes the previously parsed document.
vladounet 0:d38d192c2f5f 218 */
vladounet 0:d38d192c2f5f 219 int parse(const char* json);
vladounet 0:d38d192c2f5f 220
vladounet 0:d38d192c2f5f 221 /*
vladounet 0:d38d192c2f5f 222 * Returns the parsed document, or NULL if the json is not parsed.
vladounet 0:d38d192c2f5f 223 */
vladounet 0:d38d192c2f5f 224 JsonValue* getDocument();
vladounet 0:d38d192c2f5f 225
vladounet 0:d38d192c2f5f 226 private:
vladounet 0:d38d192c2f5f 227 const char* json;
vladounet 0:d38d192c2f5f 228 int json_len;
vladounet 0:d38d192c2f5f 229 TokenType ct;
vladounet 0:d38d192c2f5f 230 int ctPos;
vladounet 0:d38d192c2f5f 231 int ctLen;
vladounet 0:d38d192c2f5f 232 double ctNumberVal;
vladounet 0:d38d192c2f5f 233 JsonValue* pDocument;
vladounet 0:d38d192c2f5f 234
vladounet 0:d38d192c2f5f 235 int goToNextToken();
vladounet 0:d38d192c2f5f 236
vladounet 0:d38d192c2f5f 237 int parseObject(JsonValue** object);
vladounet 0:d38d192c2f5f 238 int parseValue(JsonValue** value);
vladounet 0:d38d192c2f5f 239 int parseArray(JsonValue** array);
vladounet 0:d38d192c2f5f 240 };
vladounet 0:d38d192c2f5f 241
vladounet 0:d38d192c2f5f 242 #endif