A wrapper class for talking to Axeda from MBED devices. Uses HTTPClient and MbedJSONValue classes.

Dependents:   axeda_wrapper_dev MTS_Axeda_Example

AxedaWrapper simplifies pushing data to Axeda's cloud.

Uses HTTPClient and MbedJSONValue libs:

http://mbed.org/users/donatien/code/HTTPClient/

http://mbed.org/users/samux/code/MbedJSONValue/

Committer:
mfiore
Date:
Sat Jan 04 08:00:38 2014 +0000
Revision:
6:aa0594410aa9
Parent:
5:dd1e00e3eba5
shorten HTTPClient timeout to 5 seconds

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfiore 5:dd1e00e3eba5 1 #include "MbedJSONValue.h"
mfiore 5:dd1e00e3eba5 2
mfiore 5:dd1e00e3eba5 3 # include <stdlib.h>
mfiore 5:dd1e00e3eba5 4 # include <stdio.h>
mfiore 5:dd1e00e3eba5 5
mfiore 5:dd1e00e3eba5 6 // Clean up
mfiore 5:dd1e00e3eba5 7 void MbedJSONValue::clean() {
mfiore 5:dd1e00e3eba5 8 switch (_type) {
mfiore 5:dd1e00e3eba5 9 case TypeString:
mfiore 5:dd1e00e3eba5 10 delete _value.asString;
mfiore 5:dd1e00e3eba5 11 break;
mfiore 5:dd1e00e3eba5 12 case TypeArray:
mfiore 5:dd1e00e3eba5 13 for (int i = 0; i < index_array; i++)
mfiore 5:dd1e00e3eba5 14 delete array[i];
mfiore 5:dd1e00e3eba5 15 index_array = 0;
mfiore 5:dd1e00e3eba5 16 break;
mfiore 5:dd1e00e3eba5 17 case TypeObject:
mfiore 5:dd1e00e3eba5 18 for (int i = 0; i < index_token; i++) {
mfiore 5:dd1e00e3eba5 19 delete token[i];
mfiore 5:dd1e00e3eba5 20 delete token_name[i];
mfiore 5:dd1e00e3eba5 21 }
mfiore 5:dd1e00e3eba5 22 index_token = 0;
mfiore 5:dd1e00e3eba5 23 break;
mfiore 5:dd1e00e3eba5 24 default:
mfiore 5:dd1e00e3eba5 25 break;
mfiore 5:dd1e00e3eba5 26 }
mfiore 5:dd1e00e3eba5 27 _type = TypeNull;
mfiore 5:dd1e00e3eba5 28 _type = TypeNull;
mfiore 5:dd1e00e3eba5 29 }
mfiore 5:dd1e00e3eba5 30
mfiore 5:dd1e00e3eba5 31 bool MbedJSONValue::hasMember(char * name)
mfiore 5:dd1e00e3eba5 32 {
mfiore 5:dd1e00e3eba5 33 for(int i = 0; i < index_token; i++)
mfiore 5:dd1e00e3eba5 34 if( !strcmp(name, (*(token_name[i])).c_str() ))
mfiore 5:dd1e00e3eba5 35 return true;
mfiore 5:dd1e00e3eba5 36 return false;
mfiore 5:dd1e00e3eba5 37 }
mfiore 5:dd1e00e3eba5 38
mfiore 5:dd1e00e3eba5 39
mfiore 5:dd1e00e3eba5 40 void copy(const std::string& s, std::back_insert_iterator<std::string> oi) {
mfiore 5:dd1e00e3eba5 41 std::copy(s.begin(), s.end(), oi);
mfiore 5:dd1e00e3eba5 42 }
mfiore 5:dd1e00e3eba5 43
mfiore 5:dd1e00e3eba5 44 void serialize_str(const std::string& s, std::back_insert_iterator<std::string> oi) {
mfiore 5:dd1e00e3eba5 45 *oi++ = '"';
mfiore 5:dd1e00e3eba5 46 for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) {
mfiore 5:dd1e00e3eba5 47 switch (*i) {
mfiore 5:dd1e00e3eba5 48 #define MAP(val, sym) case val: copy(sym, oi); break
mfiore 5:dd1e00e3eba5 49 MAP('"', "\\\"");
mfiore 5:dd1e00e3eba5 50 MAP('\\', "\\\\");
mfiore 5:dd1e00e3eba5 51 MAP('/', "\\/");
mfiore 5:dd1e00e3eba5 52 MAP('\b', "\\b");
mfiore 5:dd1e00e3eba5 53 MAP('\f', "\\f");
mfiore 5:dd1e00e3eba5 54 MAP('\n', "\\n");
mfiore 5:dd1e00e3eba5 55 MAP('\r', "\\r");
mfiore 5:dd1e00e3eba5 56 MAP('\t', "\\t");
mfiore 5:dd1e00e3eba5 57 #undef MAP
mfiore 5:dd1e00e3eba5 58 default:
mfiore 5:dd1e00e3eba5 59 if ((unsigned char)*i < 0x20 || *i == 0x7f) {
mfiore 5:dd1e00e3eba5 60 char buf[7];
mfiore 5:dd1e00e3eba5 61 sprintf(buf, "\\u%04x", *i & 0xff);
mfiore 5:dd1e00e3eba5 62 copy(buf, buf + 6, oi);
mfiore 5:dd1e00e3eba5 63 } else {
mfiore 5:dd1e00e3eba5 64 *oi++ = *i;
mfiore 5:dd1e00e3eba5 65 }
mfiore 5:dd1e00e3eba5 66 break;
mfiore 5:dd1e00e3eba5 67 }
mfiore 5:dd1e00e3eba5 68 }
mfiore 5:dd1e00e3eba5 69 *oi++ = '"';
mfiore 5:dd1e00e3eba5 70 }
mfiore 5:dd1e00e3eba5 71
mfiore 5:dd1e00e3eba5 72 std::string MbedJSONValue::serialize(){
mfiore 5:dd1e00e3eba5 73 std::string s;
mfiore 5:dd1e00e3eba5 74 serialize(std::back_inserter(s));
mfiore 5:dd1e00e3eba5 75 return s;
mfiore 5:dd1e00e3eba5 76 }
mfiore 5:dd1e00e3eba5 77
mfiore 5:dd1e00e3eba5 78 std::string MbedJSONValue::to_str(){
mfiore 5:dd1e00e3eba5 79 switch (_type) {
mfiore 5:dd1e00e3eba5 80 case TypeNull:
mfiore 5:dd1e00e3eba5 81 return "null";
mfiore 5:dd1e00e3eba5 82 case TypeBoolean:
mfiore 5:dd1e00e3eba5 83 return _value.asBool ? "true" : "false";
mfiore 5:dd1e00e3eba5 84 case TypeInt: {
mfiore 5:dd1e00e3eba5 85 char buf[10];
mfiore 5:dd1e00e3eba5 86 sprintf(buf, "%d", _value.asInt);
mfiore 5:dd1e00e3eba5 87 return buf;
mfiore 5:dd1e00e3eba5 88 }
mfiore 5:dd1e00e3eba5 89 case TypeDouble: {
mfiore 5:dd1e00e3eba5 90 char buf[10];
mfiore 5:dd1e00e3eba5 91 sprintf(buf, "%f", _value.asDouble);
mfiore 5:dd1e00e3eba5 92 return buf;
mfiore 5:dd1e00e3eba5 93 }
mfiore 5:dd1e00e3eba5 94 default:
mfiore 5:dd1e00e3eba5 95 break;
mfiore 5:dd1e00e3eba5 96 }
mfiore 5:dd1e00e3eba5 97 return NULL;
mfiore 5:dd1e00e3eba5 98 }
mfiore 5:dd1e00e3eba5 99
mfiore 5:dd1e00e3eba5 100
mfiore 5:dd1e00e3eba5 101
mfiore 5:dd1e00e3eba5 102 void MbedJSONValue::serialize(std::back_insert_iterator<std::string> oi) {
mfiore 5:dd1e00e3eba5 103 switch (_type) {
mfiore 5:dd1e00e3eba5 104 case TypeString:
mfiore 5:dd1e00e3eba5 105 serialize_str(*_value.asString, oi);
mfiore 5:dd1e00e3eba5 106 break;
mfiore 5:dd1e00e3eba5 107 case TypeArray: {
mfiore 5:dd1e00e3eba5 108 *oi++ = '[';
mfiore 5:dd1e00e3eba5 109 for (int i = 0; i < index_array; i++) {
mfiore 5:dd1e00e3eba5 110 if (i)
mfiore 5:dd1e00e3eba5 111 *oi++ = ',';
mfiore 5:dd1e00e3eba5 112 (*this)[i].serialize(oi);
mfiore 5:dd1e00e3eba5 113 }
mfiore 5:dd1e00e3eba5 114 *oi++ = ']';
mfiore 5:dd1e00e3eba5 115 break;
mfiore 5:dd1e00e3eba5 116 }
mfiore 5:dd1e00e3eba5 117 case TypeObject: {
mfiore 5:dd1e00e3eba5 118 *oi++ = '{';
mfiore 5:dd1e00e3eba5 119 for (int i = 0; i < index_token; i++) {
mfiore 5:dd1e00e3eba5 120 if (i)
mfiore 5:dd1e00e3eba5 121 *oi++ = ',';
mfiore 5:dd1e00e3eba5 122 serialize_str(*(token_name[i]), oi);
mfiore 5:dd1e00e3eba5 123 *oi++ = ':';
mfiore 5:dd1e00e3eba5 124 (*(token[i])).serialize(oi);
mfiore 5:dd1e00e3eba5 125 }
mfiore 5:dd1e00e3eba5 126 *oi++ = '}';
mfiore 5:dd1e00e3eba5 127 break;
mfiore 5:dd1e00e3eba5 128 }
mfiore 5:dd1e00e3eba5 129 default:
mfiore 5:dd1e00e3eba5 130 copy(to_str(), oi);
mfiore 5:dd1e00e3eba5 131 break;
mfiore 5:dd1e00e3eba5 132 }
mfiore 5:dd1e00e3eba5 133 }
mfiore 5:dd1e00e3eba5 134
mfiore 5:dd1e00e3eba5 135
mfiore 5:dd1e00e3eba5 136
mfiore 5:dd1e00e3eba5 137 MbedJSONValue& MbedJSONValue::operator[](int i) {
mfiore 5:dd1e00e3eba5 138 _type = TypeArray;
mfiore 5:dd1e00e3eba5 139 if (i < NB_TOKEN && index_array == i ) {
mfiore 5:dd1e00e3eba5 140 #ifdef DEBUG
mfiore 5:dd1e00e3eba5 141 printf("will add an element to the array\r\n");
mfiore 5:dd1e00e3eba5 142 #endif
mfiore 5:dd1e00e3eba5 143 array[i] = new MbedJSONValue();
mfiore 5:dd1e00e3eba5 144 index_array++;
mfiore 5:dd1e00e3eba5 145 return *(array[i]);
mfiore 5:dd1e00e3eba5 146 }
mfiore 5:dd1e00e3eba5 147 if (i < NB_TOKEN && index_array > i)
mfiore 5:dd1e00e3eba5 148 return *(array[i]);
mfiore 5:dd1e00e3eba5 149
mfiore 5:dd1e00e3eba5 150 //if the user is not doing something wrong, this code is never executed!!
mfiore 5:dd1e00e3eba5 151 return *(new MbedJSONValue());
mfiore 5:dd1e00e3eba5 152 }
mfiore 5:dd1e00e3eba5 153
mfiore 5:dd1e00e3eba5 154 MbedJSONValue& MbedJSONValue::operator[](std::string k) {
mfiore 5:dd1e00e3eba5 155 _type = TypeObject;
mfiore 5:dd1e00e3eba5 156 for (int i = 0; i < index_token; i++) {
mfiore 5:dd1e00e3eba5 157 #ifdef DEBUG
mfiore 5:dd1e00e3eba5 158 printf("k: %s\r\n", k.c_str());
mfiore 5:dd1e00e3eba5 159 printf("str: %s\r\n", token_name[i]->c_str());
mfiore 5:dd1e00e3eba5 160 #endif
mfiore 5:dd1e00e3eba5 161 //existing token
mfiore 5:dd1e00e3eba5 162 if (!strcmp(k.c_str(), token_name[i]->c_str())) {
mfiore 5:dd1e00e3eba5 163 #ifdef DEBUG
mfiore 5:dd1e00e3eba5 164 printf("token found: %d\r\n", i);
mfiore 5:dd1e00e3eba5 165 #endif
mfiore 5:dd1e00e3eba5 166 return *(token[i]);
mfiore 5:dd1e00e3eba5 167 }
mfiore 5:dd1e00e3eba5 168 }
mfiore 5:dd1e00e3eba5 169
mfiore 5:dd1e00e3eba5 170 if(index_token >= NB_TOKEN)
mfiore 5:dd1e00e3eba5 171 index_token = NB_TOKEN - 1;
mfiore 5:dd1e00e3eba5 172 //non existing token
mfiore 5:dd1e00e3eba5 173 token_name[index_token] = new std::string(k);
mfiore 5:dd1e00e3eba5 174 token[index_token] = new MbedJSONValue();
mfiore 5:dd1e00e3eba5 175 index_token++;
mfiore 5:dd1e00e3eba5 176 return *(token[index_token - 1]);
mfiore 5:dd1e00e3eba5 177 }
mfiore 5:dd1e00e3eba5 178
mfiore 5:dd1e00e3eba5 179 MbedJSONValue& MbedJSONValue::operator[](std::string k) const
mfiore 5:dd1e00e3eba5 180 {
mfiore 5:dd1e00e3eba5 181 for (int i = 0; i < index_token; i++) {
mfiore 5:dd1e00e3eba5 182 #ifdef DEBUG
mfiore 5:dd1e00e3eba5 183 printf("k: %s\r\n", k.c_str());
mfiore 5:dd1e00e3eba5 184 printf("str: %s\r\n", token_name[i]->c_str());
mfiore 5:dd1e00e3eba5 185 #endif
mfiore 5:dd1e00e3eba5 186 if (!strcmp(k.c_str(), token_name[i]->c_str())) {
mfiore 5:dd1e00e3eba5 187 #ifdef DEBUG
mfiore 5:dd1e00e3eba5 188 printf("token found: %d\r\n", i);
mfiore 5:dd1e00e3eba5 189 #endif
mfiore 5:dd1e00e3eba5 190 return *(token[i]);
mfiore 5:dd1e00e3eba5 191 }
mfiore 5:dd1e00e3eba5 192 }
mfiore 5:dd1e00e3eba5 193
mfiore 5:dd1e00e3eba5 194 //if the user is not doing something wrong, this code is never executed!!
mfiore 5:dd1e00e3eba5 195 return *(new MbedJSONValue());
mfiore 5:dd1e00e3eba5 196 }
mfiore 5:dd1e00e3eba5 197
mfiore 5:dd1e00e3eba5 198
mfiore 5:dd1e00e3eba5 199 // Operators
mfiore 5:dd1e00e3eba5 200 MbedJSONValue& MbedJSONValue::operator=(MbedJSONValue const& rhs) {
mfiore 5:dd1e00e3eba5 201 if (this != &rhs) {
mfiore 5:dd1e00e3eba5 202 clean();
mfiore 5:dd1e00e3eba5 203 _type = rhs._type;
mfiore 5:dd1e00e3eba5 204 switch (_type) {
mfiore 5:dd1e00e3eba5 205 case TypeBoolean:
mfiore 5:dd1e00e3eba5 206 _value.asBool = rhs._value.asBool;
mfiore 5:dd1e00e3eba5 207 break;
mfiore 5:dd1e00e3eba5 208 case TypeInt:
mfiore 5:dd1e00e3eba5 209 _value.asInt = rhs._value.asInt;
mfiore 5:dd1e00e3eba5 210 break;
mfiore 5:dd1e00e3eba5 211 case TypeDouble:
mfiore 5:dd1e00e3eba5 212 _value.asDouble = rhs._value.asDouble;
mfiore 5:dd1e00e3eba5 213 break;
mfiore 5:dd1e00e3eba5 214 case TypeString:
mfiore 5:dd1e00e3eba5 215 _value.asString = new std::string(*rhs._value.asString);
mfiore 5:dd1e00e3eba5 216 break;
mfiore 5:dd1e00e3eba5 217 case TypeArray:
mfiore 5:dd1e00e3eba5 218 for (int i = 0; i < rhs.index_array; i++)
mfiore 5:dd1e00e3eba5 219 (*this)[i] = rhs[i];
mfiore 5:dd1e00e3eba5 220 case TypeObject:
mfiore 5:dd1e00e3eba5 221 for (int i = 0; i < rhs.index_token; i++)
mfiore 5:dd1e00e3eba5 222 (*this)[*(rhs.token_name[i])] = rhs[*(rhs.token_name[i])];
mfiore 5:dd1e00e3eba5 223 default:
mfiore 5:dd1e00e3eba5 224 break;
mfiore 5:dd1e00e3eba5 225 }
mfiore 5:dd1e00e3eba5 226 }
mfiore 5:dd1e00e3eba5 227 return *this;
mfiore 5:dd1e00e3eba5 228 }
mfiore 5:dd1e00e3eba5 229
mfiore 5:dd1e00e3eba5 230
mfiore 5:dd1e00e3eba5 231 // Works for strings, arrays, and structs.
mfiore 5:dd1e00e3eba5 232 int MbedJSONValue::size() const {
mfiore 5:dd1e00e3eba5 233 switch (_type) {
mfiore 5:dd1e00e3eba5 234 case TypeString:
mfiore 5:dd1e00e3eba5 235 return int(_value.asString->size());
mfiore 5:dd1e00e3eba5 236 case TypeArray:
mfiore 5:dd1e00e3eba5 237 return index_array;
mfiore 5:dd1e00e3eba5 238 case TypeObject:
mfiore 5:dd1e00e3eba5 239 return index_token;
mfiore 5:dd1e00e3eba5 240 default:
mfiore 5:dd1e00e3eba5 241 break;
mfiore 5:dd1e00e3eba5 242 }
mfiore 5:dd1e00e3eba5 243 return -1;
mfiore 5:dd1e00e3eba5 244 }
mfiore 5:dd1e00e3eba5 245