BERG Cloud / BERGCloud

Dependents:   LittleCounter-Example

Committer:
nickludlam
Date:
Tue Nov 12 14:38:30 2013 +0000
Revision:
0:b4ccb530b9eb
Child:
5:2e04a8b3fc25
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nickludlam 0:b4ccb530b9eb 1 /*
nickludlam 0:b4ccb530b9eb 2
nickludlam 0:b4ccb530b9eb 3 BERGCloud message pack/unpack
nickludlam 0:b4ccb530b9eb 4
nickludlam 0:b4ccb530b9eb 5 Based on MessagePack http://msgpack.org/
nickludlam 0:b4ccb530b9eb 6
nickludlam 0:b4ccb530b9eb 7 Copyright (c) 2013 BERG Cloud Ltd. http://bergcloud.com/
nickludlam 0:b4ccb530b9eb 8
nickludlam 0:b4ccb530b9eb 9 Permission is hereby granted, free of charge, to any person obtaining a copy
nickludlam 0:b4ccb530b9eb 10 of this software and associated documentation files (the "Software"), to deal
nickludlam 0:b4ccb530b9eb 11 in the Software without restriction, including without limitation the rights
nickludlam 0:b4ccb530b9eb 12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
nickludlam 0:b4ccb530b9eb 13 copies of the Software, and to permit persons to whom the Software is
nickludlam 0:b4ccb530b9eb 14 furnished to do so, subject to the following conditions:
nickludlam 0:b4ccb530b9eb 15
nickludlam 0:b4ccb530b9eb 16 The above copyright notice and this permission notice shall be included in
nickludlam 0:b4ccb530b9eb 17 all copies or substantial portions of the Software.
nickludlam 0:b4ccb530b9eb 18
nickludlam 0:b4ccb530b9eb 19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
nickludlam 0:b4ccb530b9eb 20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
nickludlam 0:b4ccb530b9eb 21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
nickludlam 0:b4ccb530b9eb 22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
nickludlam 0:b4ccb530b9eb 23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
nickludlam 0:b4ccb530b9eb 24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
nickludlam 0:b4ccb530b9eb 25 THE SOFTWARE.
nickludlam 0:b4ccb530b9eb 26
nickludlam 0:b4ccb530b9eb 27 */
nickludlam 0:b4ccb530b9eb 28
nickludlam 0:b4ccb530b9eb 29 #include <stddef.h> /* For NULL */
nickludlam 0:b4ccb530b9eb 30 #include <string.h> /* For memcpy() */
nickludlam 0:b4ccb530b9eb 31 #include "BERGCloudMessageBase.h"
nickludlam 0:b4ccb530b9eb 32
nickludlam 0:b4ccb530b9eb 33 BERGCloudMessageBase::BERGCloudMessageBase(void)
nickludlam 0:b4ccb530b9eb 34 {
nickludlam 0:b4ccb530b9eb 35 }
nickludlam 0:b4ccb530b9eb 36
nickludlam 0:b4ccb530b9eb 37 BERGCloudMessageBase::~BERGCloudMessageBase(void)
nickludlam 0:b4ccb530b9eb 38 {
nickludlam 0:b4ccb530b9eb 39 }
nickludlam 0:b4ccb530b9eb 40
nickludlam 0:b4ccb530b9eb 41 #define _MP_FIXNUM_POS_MIN 0x00
nickludlam 0:b4ccb530b9eb 42 #define _MP_FIXNUM_POS_MAX 0x7f
nickludlam 0:b4ccb530b9eb 43 #define _MP_FIXMAP_MIN 0x80
nickludlam 0:b4ccb530b9eb 44 #define _MP_FIXMAP_MAX 0x8f
nickludlam 0:b4ccb530b9eb 45 #define _MP_FIXARRAY_MIN 0x90
nickludlam 0:b4ccb530b9eb 46 #define _MP_FIXARRAY_MAX 0x9f
nickludlam 0:b4ccb530b9eb 47 #define _MP_FIXRAW_MIN 0xa0
nickludlam 0:b4ccb530b9eb 48 #define _MP_FIXRAW_MAX 0xbf
nickludlam 0:b4ccb530b9eb 49 #define _MP_NIL 0xc0
nickludlam 0:b4ccb530b9eb 50 #define _MP_BOOL_FALSE 0xc2
nickludlam 0:b4ccb530b9eb 51 #define _MP_BOOL_TRUE 0xc3
nickludlam 0:b4ccb530b9eb 52 #define _MP_FLOAT 0xca
nickludlam 0:b4ccb530b9eb 53 #define _MP_DOUBLE 0xcb
nickludlam 0:b4ccb530b9eb 54 #define _MP_UINT8 0xcc
nickludlam 0:b4ccb530b9eb 55 #define _MP_UINT16 0xcd
nickludlam 0:b4ccb530b9eb 56 #define _MP_UINT32 0xce
nickludlam 0:b4ccb530b9eb 57 #define _MP_UINT64 0xcf
nickludlam 0:b4ccb530b9eb 58 #define _MP_INT8 0xd0
nickludlam 0:b4ccb530b9eb 59 #define _MP_INT16 0xd1
nickludlam 0:b4ccb530b9eb 60 #define _MP_INT32 0xd2
nickludlam 0:b4ccb530b9eb 61 #define _MP_INT64 0xd3
nickludlam 0:b4ccb530b9eb 62 #define _MP_RAW16 0xda
nickludlam 0:b4ccb530b9eb 63 #define _MP_RAW32 0xdb
nickludlam 0:b4ccb530b9eb 64 #define _MP_ARRAY16 0xdc
nickludlam 0:b4ccb530b9eb 65 #define _MP_ARRAY32 0xdd
nickludlam 0:b4ccb530b9eb 66 #define _MP_MAP16 0xde
nickludlam 0:b4ccb530b9eb 67 #define _MP_MAP32 0xdf
nickludlam 0:b4ccb530b9eb 68 #define _MP_FIXNUM_NEG_MIN 0xe0
nickludlam 0:b4ccb530b9eb 69 #define _MP_FIXNUM_NEG_MAX 0xff
nickludlam 0:b4ccb530b9eb 70
nickludlam 0:b4ccb530b9eb 71 #define _MAX_FIXRAW (_MP_FIXRAW_MAX - _MP_FIXRAW_MIN)
nickludlam 0:b4ccb530b9eb 72 #define _MAX_FIXARRAY (_MP_FIXARRAY_MAX - _MP_FIXARRAY_MIN)
nickludlam 0:b4ccb530b9eb 73 #define _MAX_FIXMAP (_MP_FIXMAP_MAX - _MP_FIXMAP_MIN)
nickludlam 0:b4ccb530b9eb 74
nickludlam 0:b4ccb530b9eb 75 uint16_t BERGCloudMessageBase::strlen(const char *string)
nickludlam 0:b4ccb530b9eb 76 {
nickludlam 0:b4ccb530b9eb 77 uint16_t strLen = 0;
nickludlam 0:b4ccb530b9eb 78
nickludlam 0:b4ccb530b9eb 79 /* Find string length */
nickludlam 0:b4ccb530b9eb 80 if (string != NULL)
nickludlam 0:b4ccb530b9eb 81 {
nickludlam 0:b4ccb530b9eb 82 while ((strLen < UINT16_MAX) && (*string != '\0'))
nickludlam 0:b4ccb530b9eb 83 {
nickludlam 0:b4ccb530b9eb 84 string++;
nickludlam 0:b4ccb530b9eb 85 strLen++;
nickludlam 0:b4ccb530b9eb 86 }
nickludlam 0:b4ccb530b9eb 87 }
nickludlam 0:b4ccb530b9eb 88
nickludlam 0:b4ccb530b9eb 89 return strLen;
nickludlam 0:b4ccb530b9eb 90 }
nickludlam 0:b4ccb530b9eb 91
nickludlam 0:b4ccb530b9eb 92 bool BERGCloudMessageBase::strcompare(const char *s1, const char *s2)
nickludlam 0:b4ccb530b9eb 93 {
nickludlam 0:b4ccb530b9eb 94 uint16_t count = 0;
nickludlam 0:b4ccb530b9eb 95
nickludlam 0:b4ccb530b9eb 96 if ((s1 == NULL) || (s2==NULL))
nickludlam 0:b4ccb530b9eb 97 {
nickludlam 0:b4ccb530b9eb 98 return false;
nickludlam 0:b4ccb530b9eb 99 }
nickludlam 0:b4ccb530b9eb 100
nickludlam 0:b4ccb530b9eb 101 while ((*s1 != '\0') && (*s2 != '\0'))
nickludlam 0:b4ccb530b9eb 102 {
nickludlam 0:b4ccb530b9eb 103 if (*s1++ != *s2++)
nickludlam 0:b4ccb530b9eb 104 {
nickludlam 0:b4ccb530b9eb 105 return false;
nickludlam 0:b4ccb530b9eb 106 }
nickludlam 0:b4ccb530b9eb 107
nickludlam 0:b4ccb530b9eb 108 if (count++ == UINT16_MAX)
nickludlam 0:b4ccb530b9eb 109 {
nickludlam 0:b4ccb530b9eb 110 return false;
nickludlam 0:b4ccb530b9eb 111 }
nickludlam 0:b4ccb530b9eb 112 }
nickludlam 0:b4ccb530b9eb 113
nickludlam 0:b4ccb530b9eb 114 /* identical */
nickludlam 0:b4ccb530b9eb 115 return true;
nickludlam 0:b4ccb530b9eb 116 }
nickludlam 0:b4ccb530b9eb 117
nickludlam 0:b4ccb530b9eb 118
nickludlam 0:b4ccb530b9eb 119 /*
nickludlam 0:b4ccb530b9eb 120 Pack methods
nickludlam 0:b4ccb530b9eb 121 */
nickludlam 0:b4ccb530b9eb 122
nickludlam 0:b4ccb530b9eb 123 bool BERGCloudMessageBase::pack(uint8_t n)
nickludlam 0:b4ccb530b9eb 124 {
nickludlam 0:b4ccb530b9eb 125 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 126 {
nickludlam 0:b4ccb530b9eb 127 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 128 return false;
nickludlam 0:b4ccb530b9eb 129 }
nickludlam 0:b4ccb530b9eb 130
nickludlam 0:b4ccb530b9eb 131 add(_MP_UINT8);
nickludlam 0:b4ccb530b9eb 132 add(n);
nickludlam 0:b4ccb530b9eb 133 return true;
nickludlam 0:b4ccb530b9eb 134 }
nickludlam 0:b4ccb530b9eb 135
nickludlam 0:b4ccb530b9eb 136 bool BERGCloudMessageBase::pack(uint16_t n)
nickludlam 0:b4ccb530b9eb 137 {
nickludlam 0:b4ccb530b9eb 138 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 139 {
nickludlam 0:b4ccb530b9eb 140 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 141 return false;
nickludlam 0:b4ccb530b9eb 142 }
nickludlam 0:b4ccb530b9eb 143
nickludlam 0:b4ccb530b9eb 144 add(_MP_UINT16);
nickludlam 0:b4ccb530b9eb 145 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 146 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 147 return true;
nickludlam 0:b4ccb530b9eb 148 }
nickludlam 0:b4ccb530b9eb 149
nickludlam 0:b4ccb530b9eb 150 bool BERGCloudMessageBase::pack(uint32_t n)
nickludlam 0:b4ccb530b9eb 151 {
nickludlam 0:b4ccb530b9eb 152 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 153 {
nickludlam 0:b4ccb530b9eb 154 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 155 return false;
nickludlam 0:b4ccb530b9eb 156 }
nickludlam 0:b4ccb530b9eb 157
nickludlam 0:b4ccb530b9eb 158 add(_MP_UINT32);
nickludlam 0:b4ccb530b9eb 159 add((uint8_t)(n >> 24));
nickludlam 0:b4ccb530b9eb 160 add((uint8_t)(n >> 16));
nickludlam 0:b4ccb530b9eb 161 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 162 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 163 return true;
nickludlam 0:b4ccb530b9eb 164 }
nickludlam 0:b4ccb530b9eb 165
nickludlam 0:b4ccb530b9eb 166 bool BERGCloudMessageBase::pack(int8_t n)
nickludlam 0:b4ccb530b9eb 167 {
nickludlam 0:b4ccb530b9eb 168 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 169 {
nickludlam 0:b4ccb530b9eb 170 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 171 return false;
nickludlam 0:b4ccb530b9eb 172 }
nickludlam 0:b4ccb530b9eb 173
nickludlam 0:b4ccb530b9eb 174 add(_MP_INT8);
nickludlam 0:b4ccb530b9eb 175 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 176 return true;
nickludlam 0:b4ccb530b9eb 177 }
nickludlam 0:b4ccb530b9eb 178
nickludlam 0:b4ccb530b9eb 179 bool BERGCloudMessageBase::pack(int16_t n)
nickludlam 0:b4ccb530b9eb 180 {
nickludlam 0:b4ccb530b9eb 181 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 182 {
nickludlam 0:b4ccb530b9eb 183 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 184 return false;
nickludlam 0:b4ccb530b9eb 185 }
nickludlam 0:b4ccb530b9eb 186
nickludlam 0:b4ccb530b9eb 187 add(_MP_INT16);
nickludlam 0:b4ccb530b9eb 188 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 189 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 190 return true;
nickludlam 0:b4ccb530b9eb 191 }
nickludlam 0:b4ccb530b9eb 192
nickludlam 0:b4ccb530b9eb 193 bool BERGCloudMessageBase::pack(int32_t n)
nickludlam 0:b4ccb530b9eb 194 {
nickludlam 0:b4ccb530b9eb 195 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 196 {
nickludlam 0:b4ccb530b9eb 197 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 198 return false;
nickludlam 0:b4ccb530b9eb 199 }
nickludlam 0:b4ccb530b9eb 200
nickludlam 0:b4ccb530b9eb 201 add(_MP_INT32);
nickludlam 0:b4ccb530b9eb 202 add((uint8_t)(n >> 24));
nickludlam 0:b4ccb530b9eb 203 add((uint8_t)(n >> 16));
nickludlam 0:b4ccb530b9eb 204 add((uint8_t)(n >> 8));
nickludlam 0:b4ccb530b9eb 205 add((uint8_t)n);
nickludlam 0:b4ccb530b9eb 206 return true;
nickludlam 0:b4ccb530b9eb 207 }
nickludlam 0:b4ccb530b9eb 208
nickludlam 0:b4ccb530b9eb 209 bool BERGCloudMessageBase::pack(float n)
nickludlam 0:b4ccb530b9eb 210 {
nickludlam 0:b4ccb530b9eb 211 uint32_t data;
nickludlam 0:b4ccb530b9eb 212
nickludlam 0:b4ccb530b9eb 213 if (!available(sizeof(n) + 1))
nickludlam 0:b4ccb530b9eb 214 {
nickludlam 0:b4ccb530b9eb 215 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 216 return false;
nickludlam 0:b4ccb530b9eb 217 }
nickludlam 0:b4ccb530b9eb 218
nickludlam 0:b4ccb530b9eb 219 /* Convert to data */
nickludlam 0:b4ccb530b9eb 220 memcpy(&data, &n, sizeof(float));
nickludlam 0:b4ccb530b9eb 221
nickludlam 0:b4ccb530b9eb 222 add(_MP_FLOAT);
nickludlam 0:b4ccb530b9eb 223 add((uint8_t)(data >> 24));
nickludlam 0:b4ccb530b9eb 224 add((uint8_t)(data >> 16));
nickludlam 0:b4ccb530b9eb 225 add((uint8_t)(data >> 8));
nickludlam 0:b4ccb530b9eb 226 add((uint8_t)data);
nickludlam 0:b4ccb530b9eb 227 return true;
nickludlam 0:b4ccb530b9eb 228 }
nickludlam 0:b4ccb530b9eb 229
nickludlam 0:b4ccb530b9eb 230 bool BERGCloudMessageBase::pack(bool n)
nickludlam 0:b4ccb530b9eb 231 {
nickludlam 0:b4ccb530b9eb 232 /*
nickludlam 0:b4ccb530b9eb 233 Note that Arduino redefines 'true' and 'false' in Arduino.h.
nickludlam 0:b4ccb530b9eb 234 You can undefine them in your code to make them type 'bool' again:
nickludlam 0:b4ccb530b9eb 235 #undef true
nickludlam 0:b4ccb530b9eb 236 #undef false
nickludlam 0:b4ccb530b9eb 237 */
nickludlam 0:b4ccb530b9eb 238
nickludlam 0:b4ccb530b9eb 239 if (!available(1))
nickludlam 0:b4ccb530b9eb 240 {
nickludlam 0:b4ccb530b9eb 241 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 242 return false;
nickludlam 0:b4ccb530b9eb 243 }
nickludlam 0:b4ccb530b9eb 244
nickludlam 0:b4ccb530b9eb 245 add(n ? _MP_BOOL_TRUE : _MP_BOOL_FALSE);
nickludlam 0:b4ccb530b9eb 246 return true;
nickludlam 0:b4ccb530b9eb 247 }
nickludlam 0:b4ccb530b9eb 248
nickludlam 0:b4ccb530b9eb 249 bool BERGCloudMessageBase::pack_nil(void)
nickludlam 0:b4ccb530b9eb 250 {
nickludlam 0:b4ccb530b9eb 251 if (!available(1))
nickludlam 0:b4ccb530b9eb 252 {
nickludlam 0:b4ccb530b9eb 253 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 254 return false;
nickludlam 0:b4ccb530b9eb 255 }
nickludlam 0:b4ccb530b9eb 256
nickludlam 0:b4ccb530b9eb 257 add(_MP_NIL);
nickludlam 0:b4ccb530b9eb 258 return true;
nickludlam 0:b4ccb530b9eb 259 }
nickludlam 0:b4ccb530b9eb 260
nickludlam 0:b4ccb530b9eb 261 bool BERGCloudMessageBase::pack_array(uint16_t items)
nickludlam 0:b4ccb530b9eb 262 {
nickludlam 0:b4ccb530b9eb 263 if (items <= _MAX_FIXARRAY)
nickludlam 0:b4ccb530b9eb 264 {
nickludlam 0:b4ccb530b9eb 265 /* Use fix array */
nickludlam 0:b4ccb530b9eb 266 if (!available(items + 1))
nickludlam 0:b4ccb530b9eb 267 {
nickludlam 0:b4ccb530b9eb 268 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 269 return false;
nickludlam 0:b4ccb530b9eb 270 }
nickludlam 0:b4ccb530b9eb 271
nickludlam 0:b4ccb530b9eb 272 add(_MP_FIXARRAY_MIN + items);
nickludlam 0:b4ccb530b9eb 273 }
nickludlam 0:b4ccb530b9eb 274 else
nickludlam 0:b4ccb530b9eb 275 {
nickludlam 0:b4ccb530b9eb 276 /* Use array 16 */
nickludlam 0:b4ccb530b9eb 277 if (!available(items + 1 + sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 278 {
nickludlam 0:b4ccb530b9eb 279 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 280 return false;
nickludlam 0:b4ccb530b9eb 281 }
nickludlam 0:b4ccb530b9eb 282
nickludlam 0:b4ccb530b9eb 283 add(_MP_ARRAY16);
nickludlam 0:b4ccb530b9eb 284 add((uint8_t)(items >> 8));
nickludlam 0:b4ccb530b9eb 285 add((uint8_t)items);
nickludlam 0:b4ccb530b9eb 286 }
nickludlam 0:b4ccb530b9eb 287
nickludlam 0:b4ccb530b9eb 288 return true;
nickludlam 0:b4ccb530b9eb 289 }
nickludlam 0:b4ccb530b9eb 290
nickludlam 0:b4ccb530b9eb 291 bool BERGCloudMessageBase::pack_map(uint16_t items)
nickludlam 0:b4ccb530b9eb 292 {
nickludlam 0:b4ccb530b9eb 293 if (items <= _MAX_FIXMAP)
nickludlam 0:b4ccb530b9eb 294 {
nickludlam 0:b4ccb530b9eb 295 /* Use fix map */
nickludlam 0:b4ccb530b9eb 296 if (!available(items + 1))
nickludlam 0:b4ccb530b9eb 297 {
nickludlam 0:b4ccb530b9eb 298 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 299 return false;
nickludlam 0:b4ccb530b9eb 300 }
nickludlam 0:b4ccb530b9eb 301
nickludlam 0:b4ccb530b9eb 302 add(_MP_FIXMAP_MIN + items);
nickludlam 0:b4ccb530b9eb 303 }
nickludlam 0:b4ccb530b9eb 304 else
nickludlam 0:b4ccb530b9eb 305 {
nickludlam 0:b4ccb530b9eb 306 /* Use map 16 */
nickludlam 0:b4ccb530b9eb 307 if (!available(items + 1 + sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 308 {
nickludlam 0:b4ccb530b9eb 309 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 310 return false;
nickludlam 0:b4ccb530b9eb 311 }
nickludlam 0:b4ccb530b9eb 312
nickludlam 0:b4ccb530b9eb 313 add(_MP_MAP16);
nickludlam 0:b4ccb530b9eb 314 add((uint8_t)(items >> 8));
nickludlam 0:b4ccb530b9eb 315 add((uint8_t)items);
nickludlam 0:b4ccb530b9eb 316 }
nickludlam 0:b4ccb530b9eb 317
nickludlam 0:b4ccb530b9eb 318 return true;
nickludlam 0:b4ccb530b9eb 319 }
nickludlam 0:b4ccb530b9eb 320
nickludlam 0:b4ccb530b9eb 321 bool BERGCloudMessageBase::pack(uint8_t *data, uint16_t sizeInBytes)
nickludlam 0:b4ccb530b9eb 322 {
nickludlam 0:b4ccb530b9eb 323 /* Pack data */
nickludlam 0:b4ccb530b9eb 324 if (!pack_raw_header(sizeInBytes))
nickludlam 0:b4ccb530b9eb 325 {
nickludlam 0:b4ccb530b9eb 326 return false;
nickludlam 0:b4ccb530b9eb 327 }
nickludlam 0:b4ccb530b9eb 328
nickludlam 0:b4ccb530b9eb 329 return pack_raw_data(data, sizeInBytes);
nickludlam 0:b4ccb530b9eb 330 }
nickludlam 0:b4ccb530b9eb 331
nickludlam 0:b4ccb530b9eb 332 bool BERGCloudMessageBase::pack(const char *string)
nickludlam 0:b4ccb530b9eb 333 {
nickludlam 0:b4ccb530b9eb 334 /* Pack a null-terminated C string */
nickludlam 0:b4ccb530b9eb 335 uint16_t strLen;
nickludlam 0:b4ccb530b9eb 336
nickludlam 0:b4ccb530b9eb 337 strLen = BERGCloudMessageBase::strlen(string);
nickludlam 0:b4ccb530b9eb 338
nickludlam 0:b4ccb530b9eb 339 return pack((uint8_t *)string, strLen);
nickludlam 0:b4ccb530b9eb 340 }
nickludlam 0:b4ccb530b9eb 341
nickludlam 0:b4ccb530b9eb 342 /* Separate header and data methods are provided for raw data*/
nickludlam 0:b4ccb530b9eb 343 /* so that Arduino strings may be packed without having to create */
nickludlam 0:b4ccb530b9eb 344 /* a temporary buffer first. */
nickludlam 0:b4ccb530b9eb 345
nickludlam 0:b4ccb530b9eb 346 bool BERGCloudMessageBase::pack_raw_header(uint16_t sizeInBytes)
nickludlam 0:b4ccb530b9eb 347 {
nickludlam 0:b4ccb530b9eb 348 if (sizeInBytes <= _MAX_FIXRAW)
nickludlam 0:b4ccb530b9eb 349 {
nickludlam 0:b4ccb530b9eb 350 /* Use fix raw */
nickludlam 0:b4ccb530b9eb 351 if (!available(sizeInBytes + 1))
nickludlam 0:b4ccb530b9eb 352 {
nickludlam 0:b4ccb530b9eb 353 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 354 return false;
nickludlam 0:b4ccb530b9eb 355 }
nickludlam 0:b4ccb530b9eb 356
nickludlam 0:b4ccb530b9eb 357 add(_MP_FIXRAW_MIN + sizeInBytes);
nickludlam 0:b4ccb530b9eb 358 }
nickludlam 0:b4ccb530b9eb 359 else
nickludlam 0:b4ccb530b9eb 360 {
nickludlam 0:b4ccb530b9eb 361 /* Use raw 16 */
nickludlam 0:b4ccb530b9eb 362 if (!available(sizeInBytes + 1 + sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 363 {
nickludlam 0:b4ccb530b9eb 364 _LOG_PACK_ERROR_NO_SPACE;
nickludlam 0:b4ccb530b9eb 365 return false;
nickludlam 0:b4ccb530b9eb 366 }
nickludlam 0:b4ccb530b9eb 367
nickludlam 0:b4ccb530b9eb 368 add(_MP_RAW16);
nickludlam 0:b4ccb530b9eb 369 add((uint8_t)(sizeInBytes >> 8));
nickludlam 0:b4ccb530b9eb 370 add((uint8_t)sizeInBytes);
nickludlam 0:b4ccb530b9eb 371 }
nickludlam 0:b4ccb530b9eb 372
nickludlam 0:b4ccb530b9eb 373 return true;
nickludlam 0:b4ccb530b9eb 374 }
nickludlam 0:b4ccb530b9eb 375
nickludlam 0:b4ccb530b9eb 376 bool BERGCloudMessageBase::pack_raw_data(uint8_t *data, uint16_t sizeInBytes)
nickludlam 0:b4ccb530b9eb 377 {
nickludlam 0:b4ccb530b9eb 378 /* Add data */
nickludlam 0:b4ccb530b9eb 379 while (sizeInBytes-- > 0)
nickludlam 0:b4ccb530b9eb 380 {
nickludlam 0:b4ccb530b9eb 381 add(*data++);
nickludlam 0:b4ccb530b9eb 382 }
nickludlam 0:b4ccb530b9eb 383
nickludlam 0:b4ccb530b9eb 384 return true;
nickludlam 0:b4ccb530b9eb 385 }
nickludlam 0:b4ccb530b9eb 386
nickludlam 0:b4ccb530b9eb 387 /*
nickludlam 0:b4ccb530b9eb 388 Unpack methods
nickludlam 0:b4ccb530b9eb 389 */
nickludlam 0:b4ccb530b9eb 390
nickludlam 0:b4ccb530b9eb 391 bool BERGCloudMessageBase::unpack_peek(uint8_t& messagePackType)
nickludlam 0:b4ccb530b9eb 392 {
nickludlam 0:b4ccb530b9eb 393 return peek(&messagePackType);
nickludlam 0:b4ccb530b9eb 394 }
nickludlam 0:b4ccb530b9eb 395
nickludlam 0:b4ccb530b9eb 396 #ifdef BERGCLOUD_LOG
nickludlam 0:b4ccb530b9eb 397 bool BERGCloudMessageBase::unpack_peek(void)
nickludlam 0:b4ccb530b9eb 398 {
nickludlam 0:b4ccb530b9eb 399 uint8_t type;
nickludlam 0:b4ccb530b9eb 400
nickludlam 0:b4ccb530b9eb 401 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 402 {
nickludlam 0:b4ccb530b9eb 403 return false;
nickludlam 0:b4ccb530b9eb 404 }
nickludlam 0:b4ccb530b9eb 405
nickludlam 0:b4ccb530b9eb 406 if (type <= _MP_FIXNUM_POS_MAX)
nickludlam 0:b4ccb530b9eb 407 {
nickludlam 0:b4ccb530b9eb 408 _LOG("Positive integer\r\n");
nickludlam 0:b4ccb530b9eb 409 return true;
nickludlam 0:b4ccb530b9eb 410 }
nickludlam 0:b4ccb530b9eb 411
nickludlam 0:b4ccb530b9eb 412 if (IN_RANGE(type, _MP_FIXNUM_NEG_MIN, _MP_FIXNUM_NEG_MAX))
nickludlam 0:b4ccb530b9eb 413 {
nickludlam 0:b4ccb530b9eb 414 _LOG("Negative integer\r\n");
nickludlam 0:b4ccb530b9eb 415 return true;
nickludlam 0:b4ccb530b9eb 416 }
nickludlam 0:b4ccb530b9eb 417
nickludlam 0:b4ccb530b9eb 418 if ((type == _MP_MAP16) || (type == _MP_MAP32) || IN_RANGE(type, _MP_FIXMAP_MIN, _MP_FIXMAP_MAX))
nickludlam 0:b4ccb530b9eb 419 {
nickludlam 0:b4ccb530b9eb 420 _LOG("Map\r\n");
nickludlam 0:b4ccb530b9eb 421 return true;
nickludlam 0:b4ccb530b9eb 422 }
nickludlam 0:b4ccb530b9eb 423
nickludlam 0:b4ccb530b9eb 424 if ((type == _MP_ARRAY16) || (type == _MP_ARRAY32) || IN_RANGE(type, _MP_FIXARRAY_MIN, _MP_FIXARRAY_MAX))
nickludlam 0:b4ccb530b9eb 425 {
nickludlam 0:b4ccb530b9eb 426 _LOG("Array\r\n");
nickludlam 0:b4ccb530b9eb 427 return true;
nickludlam 0:b4ccb530b9eb 428 }
nickludlam 0:b4ccb530b9eb 429
nickludlam 0:b4ccb530b9eb 430 if ((type == _MP_RAW16) || (type == _MP_RAW32) || IN_RANGE(type, _MP_FIXRAW_MIN, _MP_FIXRAW_MAX))
nickludlam 0:b4ccb530b9eb 431 {
nickludlam 0:b4ccb530b9eb 432 _LOG("Raw\r\n");
nickludlam 0:b4ccb530b9eb 433 return true;
nickludlam 0:b4ccb530b9eb 434 }
nickludlam 0:b4ccb530b9eb 435
nickludlam 0:b4ccb530b9eb 436 if ((type ==_MP_UINT8) || (type == _MP_UINT16) || (type == _MP_UINT32) || (type == _MP_UINT64))
nickludlam 0:b4ccb530b9eb 437 {
nickludlam 0:b4ccb530b9eb 438 _LOG("Unsigned integer\r\n");
nickludlam 0:b4ccb530b9eb 439 return true;
nickludlam 0:b4ccb530b9eb 440 }
nickludlam 0:b4ccb530b9eb 441
nickludlam 0:b4ccb530b9eb 442 if ((type ==_MP_INT8) || (type == _MP_INT16) || (type == _MP_INT32) || (type == _MP_INT64))
nickludlam 0:b4ccb530b9eb 443 {
nickludlam 0:b4ccb530b9eb 444 _LOG("Signed integer\r\n");
nickludlam 0:b4ccb530b9eb 445 return true;
nickludlam 0:b4ccb530b9eb 446 }
nickludlam 0:b4ccb530b9eb 447
nickludlam 0:b4ccb530b9eb 448 if (type == _MP_NIL)
nickludlam 0:b4ccb530b9eb 449 {
nickludlam 0:b4ccb530b9eb 450 _LOG("Nil\r\n");
nickludlam 0:b4ccb530b9eb 451 return true;
nickludlam 0:b4ccb530b9eb 452 }
nickludlam 0:b4ccb530b9eb 453
nickludlam 0:b4ccb530b9eb 454 if (type == _MP_BOOL_FALSE)
nickludlam 0:b4ccb530b9eb 455 {
nickludlam 0:b4ccb530b9eb 456 _LOG("Boolean false\r\n");
nickludlam 0:b4ccb530b9eb 457 return true;
nickludlam 0:b4ccb530b9eb 458 }
nickludlam 0:b4ccb530b9eb 459
nickludlam 0:b4ccb530b9eb 460 if (type == _MP_BOOL_TRUE)
nickludlam 0:b4ccb530b9eb 461 {
nickludlam 0:b4ccb530b9eb 462 _LOG("Boolean true\r\n");
nickludlam 0:b4ccb530b9eb 463 return true;
nickludlam 0:b4ccb530b9eb 464 }
nickludlam 0:b4ccb530b9eb 465
nickludlam 0:b4ccb530b9eb 466 if (type == _MP_FLOAT)
nickludlam 0:b4ccb530b9eb 467 {
nickludlam 0:b4ccb530b9eb 468 _LOG("Float\r\n");
nickludlam 0:b4ccb530b9eb 469 return true;
nickludlam 0:b4ccb530b9eb 470 }
nickludlam 0:b4ccb530b9eb 471
nickludlam 0:b4ccb530b9eb 472 if (type == _MP_DOUBLE)
nickludlam 0:b4ccb530b9eb 473 {
nickludlam 0:b4ccb530b9eb 474 _LOG("Double\r\n");
nickludlam 0:b4ccb530b9eb 475 return true;
nickludlam 0:b4ccb530b9eb 476 }
nickludlam 0:b4ccb530b9eb 477
nickludlam 0:b4ccb530b9eb 478 _LOG("Unknown\r\n");
nickludlam 0:b4ccb530b9eb 479 return false;
nickludlam 0:b4ccb530b9eb 480 }
nickludlam 0:b4ccb530b9eb 481
nickludlam 0:b4ccb530b9eb 482 void BERGCloudMessageBase::print(void)
nickludlam 0:b4ccb530b9eb 483 {
nickludlam 0:b4ccb530b9eb 484 uint16_t last_read;
nickludlam 0:b4ccb530b9eb 485
nickludlam 0:b4ccb530b9eb 486 /* Remember the current read position in the raw data */
nickludlam 0:b4ccb530b9eb 487 last_read = bytesRead;
nickludlam 0:b4ccb530b9eb 488
nickludlam 0:b4ccb530b9eb 489 /* Start reading from the beginning of the data */
nickludlam 0:b4ccb530b9eb 490 restart();
nickludlam 0:b4ccb530b9eb 491
nickludlam 0:b4ccb530b9eb 492 /* Print all items */
nickludlam 0:b4ccb530b9eb 493 while(unpack_peek())
nickludlam 0:b4ccb530b9eb 494 {
nickludlam 0:b4ccb530b9eb 495 unpack_skip();
nickludlam 0:b4ccb530b9eb 496 }
nickludlam 0:b4ccb530b9eb 497
nickludlam 0:b4ccb530b9eb 498 /* Return to the last position */
nickludlam 0:b4ccb530b9eb 499 bytesRead = last_read;
nickludlam 0:b4ccb530b9eb 500 }
nickludlam 0:b4ccb530b9eb 501
nickludlam 0:b4ccb530b9eb 502 void BERGCloudMessageBase::print_bytes(void)
nickludlam 0:b4ccb530b9eb 503 {
nickludlam 0:b4ccb530b9eb 504 uint16_t size = used();
nickludlam 0:b4ccb530b9eb 505 uint8_t *data = ptr();
nickludlam 0:b4ccb530b9eb 506
nickludlam 0:b4ccb530b9eb 507 while (size-- > 0)
nickludlam 0:b4ccb530b9eb 508 {
nickludlam 0:b4ccb530b9eb 509 _LOG_HEX(*data);
nickludlam 0:b4ccb530b9eb 510 _LOG(" ");
nickludlam 0:b4ccb530b9eb 511 data++;
nickludlam 0:b4ccb530b9eb 512 }
nickludlam 0:b4ccb530b9eb 513 _LOG("\r\n");
nickludlam 0:b4ccb530b9eb 514 }
nickludlam 0:b4ccb530b9eb 515 #endif
nickludlam 0:b4ccb530b9eb 516
nickludlam 0:b4ccb530b9eb 517 bool BERGCloudMessageBase::getUnsignedInteger(uint32_t *value, uint8_t maxBytes)
nickludlam 0:b4ccb530b9eb 518 {
nickludlam 0:b4ccb530b9eb 519 /* Try to decode the next messagePack item as an unsigned integer */
nickludlam 0:b4ccb530b9eb 520 /* of less than or equal to 'maxBytes' size in bytes. */
nickludlam 0:b4ccb530b9eb 521
nickludlam 0:b4ccb530b9eb 522 uint8_t type;
nickludlam 0:b4ccb530b9eb 523
nickludlam 0:b4ccb530b9eb 524 if (maxBytes == 0)
nickludlam 0:b4ccb530b9eb 525 {
nickludlam 0:b4ccb530b9eb 526 /* Invalid */
nickludlam 0:b4ccb530b9eb 527 return false;
nickludlam 0:b4ccb530b9eb 528 }
nickludlam 0:b4ccb530b9eb 529
nickludlam 0:b4ccb530b9eb 530 /* Look at next type */
nickludlam 0:b4ccb530b9eb 531 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 532 {
nickludlam 0:b4ccb530b9eb 533 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 534 return false;
nickludlam 0:b4ccb530b9eb 535 }
nickludlam 0:b4ccb530b9eb 536
nickludlam 0:b4ccb530b9eb 537 if (type <= _MP_FIXNUM_POS_MAX)
nickludlam 0:b4ccb530b9eb 538 {
nickludlam 0:b4ccb530b9eb 539 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 540 *value = read();
nickludlam 0:b4ccb530b9eb 541
nickludlam 0:b4ccb530b9eb 542 /* Success */
nickludlam 0:b4ccb530b9eb 543 return true;
nickludlam 0:b4ccb530b9eb 544 }
nickludlam 0:b4ccb530b9eb 545
nickludlam 0:b4ccb530b9eb 546 if (type == _MP_UINT8)
nickludlam 0:b4ccb530b9eb 547 {
nickludlam 0:b4ccb530b9eb 548 if (!remaining(sizeof(uint8_t)))
nickludlam 0:b4ccb530b9eb 549 {
nickludlam 0:b4ccb530b9eb 550 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 551 return false;
nickludlam 0:b4ccb530b9eb 552 }
nickludlam 0:b4ccb530b9eb 553
nickludlam 0:b4ccb530b9eb 554 /* Read type */
nickludlam 0:b4ccb530b9eb 555 read();
nickludlam 0:b4ccb530b9eb 556
nickludlam 0:b4ccb530b9eb 557 /* Read 8-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 558 *value = read();
nickludlam 0:b4ccb530b9eb 559
nickludlam 0:b4ccb530b9eb 560 /* Success */
nickludlam 0:b4ccb530b9eb 561 return true;
nickludlam 0:b4ccb530b9eb 562 }
nickludlam 0:b4ccb530b9eb 563
nickludlam 0:b4ccb530b9eb 564 if ((type == _MP_UINT16) && (maxBytes >= sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 565 {
nickludlam 0:b4ccb530b9eb 566 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 567 {
nickludlam 0:b4ccb530b9eb 568 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 569 return false;
nickludlam 0:b4ccb530b9eb 570 }
nickludlam 0:b4ccb530b9eb 571
nickludlam 0:b4ccb530b9eb 572 /* Read type */
nickludlam 0:b4ccb530b9eb 573 read();
nickludlam 0:b4ccb530b9eb 574
nickludlam 0:b4ccb530b9eb 575 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 576 *value = read();
nickludlam 0:b4ccb530b9eb 577 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 578 *value |= read();
nickludlam 0:b4ccb530b9eb 579
nickludlam 0:b4ccb530b9eb 580 /* Success */
nickludlam 0:b4ccb530b9eb 581 return true;
nickludlam 0:b4ccb530b9eb 582 }
nickludlam 0:b4ccb530b9eb 583
nickludlam 0:b4ccb530b9eb 584 if ((type == _MP_UINT32) && (maxBytes >= sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 585 {
nickludlam 0:b4ccb530b9eb 586 if (!remaining(sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 587 {
nickludlam 0:b4ccb530b9eb 588 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 589 return false;
nickludlam 0:b4ccb530b9eb 590 }
nickludlam 0:b4ccb530b9eb 591
nickludlam 0:b4ccb530b9eb 592 /* Read type */
nickludlam 0:b4ccb530b9eb 593 read();
nickludlam 0:b4ccb530b9eb 594
nickludlam 0:b4ccb530b9eb 595 /* Read 32-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 596 *value = read();
nickludlam 0:b4ccb530b9eb 597 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 598 *value |= read();
nickludlam 0:b4ccb530b9eb 599 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 600 *value |= read();
nickludlam 0:b4ccb530b9eb 601 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 602 *value |= read();
nickludlam 0:b4ccb530b9eb 603
nickludlam 0:b4ccb530b9eb 604 /* Success */
nickludlam 0:b4ccb530b9eb 605 return true;
nickludlam 0:b4ccb530b9eb 606 }
nickludlam 0:b4ccb530b9eb 607
nickludlam 0:b4ccb530b9eb 608 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 609 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 610 return false;
nickludlam 0:b4ccb530b9eb 611 }
nickludlam 0:b4ccb530b9eb 612
nickludlam 0:b4ccb530b9eb 613 bool BERGCloudMessageBase::getSignedInteger(int32_t *value, uint8_t maxBytes)
nickludlam 0:b4ccb530b9eb 614 {
nickludlam 0:b4ccb530b9eb 615 /* Try to decode the next messagePack item as an signed integer */
nickludlam 0:b4ccb530b9eb 616 /* of less than or equal to 'maxBytes' size in bytes. */
nickludlam 0:b4ccb530b9eb 617
nickludlam 0:b4ccb530b9eb 618 uint8_t type;
nickludlam 0:b4ccb530b9eb 619
nickludlam 0:b4ccb530b9eb 620 if (maxBytes == 0)
nickludlam 0:b4ccb530b9eb 621 {
nickludlam 0:b4ccb530b9eb 622 /* Invalid */
nickludlam 0:b4ccb530b9eb 623 return false;
nickludlam 0:b4ccb530b9eb 624 }
nickludlam 0:b4ccb530b9eb 625
nickludlam 0:b4ccb530b9eb 626 /* Look at next type */
nickludlam 0:b4ccb530b9eb 627 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 628 {
nickludlam 0:b4ccb530b9eb 629 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 630 return false;
nickludlam 0:b4ccb530b9eb 631 }
nickludlam 0:b4ccb530b9eb 632
nickludlam 0:b4ccb530b9eb 633 if (type <= _MP_FIXNUM_POS_MAX)
nickludlam 0:b4ccb530b9eb 634 {
nickludlam 0:b4ccb530b9eb 635 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 636 *value = (int32_t)read();
nickludlam 0:b4ccb530b9eb 637
nickludlam 0:b4ccb530b9eb 638 /* Success */
nickludlam 0:b4ccb530b9eb 639 return true;
nickludlam 0:b4ccb530b9eb 640 }
nickludlam 0:b4ccb530b9eb 641
nickludlam 0:b4ccb530b9eb 642 if (IN_RANGE(type, _MP_FIXNUM_NEG_MIN, _MP_FIXNUM_NEG_MAX))
nickludlam 0:b4ccb530b9eb 643 {
nickludlam 0:b4ccb530b9eb 644 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 645 *value = (int32_t)read();
nickludlam 0:b4ccb530b9eb 646
nickludlam 0:b4ccb530b9eb 647 /* Success */
nickludlam 0:b4ccb530b9eb 648 return true;
nickludlam 0:b4ccb530b9eb 649 }
nickludlam 0:b4ccb530b9eb 650
nickludlam 0:b4ccb530b9eb 651 if (type == _MP_INT8)
nickludlam 0:b4ccb530b9eb 652 {
nickludlam 0:b4ccb530b9eb 653 if (!remaining(sizeof(int8_t)))
nickludlam 0:b4ccb530b9eb 654 {
nickludlam 0:b4ccb530b9eb 655 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 656 return false;
nickludlam 0:b4ccb530b9eb 657 }
nickludlam 0:b4ccb530b9eb 658
nickludlam 0:b4ccb530b9eb 659 /* Read type */
nickludlam 0:b4ccb530b9eb 660 read();
nickludlam 0:b4ccb530b9eb 661
nickludlam 0:b4ccb530b9eb 662 /* Read 8-bit signed integer */
nickludlam 0:b4ccb530b9eb 663 *value = (int32_t)read();
nickludlam 0:b4ccb530b9eb 664 return true;
nickludlam 0:b4ccb530b9eb 665 }
nickludlam 0:b4ccb530b9eb 666
nickludlam 0:b4ccb530b9eb 667 if ((type == _MP_INT16) && (maxBytes >= sizeof(int16_t)))
nickludlam 0:b4ccb530b9eb 668 {
nickludlam 0:b4ccb530b9eb 669 if (!remaining(sizeof(int16_t)))
nickludlam 0:b4ccb530b9eb 670 {
nickludlam 0:b4ccb530b9eb 671 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 672 return false;
nickludlam 0:b4ccb530b9eb 673 }
nickludlam 0:b4ccb530b9eb 674
nickludlam 0:b4ccb530b9eb 675 /* Read type */
nickludlam 0:b4ccb530b9eb 676 read();
nickludlam 0:b4ccb530b9eb 677
nickludlam 0:b4ccb530b9eb 678 /* Read 16-bit signed integer */
nickludlam 0:b4ccb530b9eb 679 *value = read();
nickludlam 0:b4ccb530b9eb 680 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 681 *value |= read();
nickludlam 0:b4ccb530b9eb 682
nickludlam 0:b4ccb530b9eb 683 /* Success */
nickludlam 0:b4ccb530b9eb 684 return true;
nickludlam 0:b4ccb530b9eb 685 }
nickludlam 0:b4ccb530b9eb 686
nickludlam 0:b4ccb530b9eb 687 if ((type == _MP_INT32) && (maxBytes >= sizeof(int32_t)))
nickludlam 0:b4ccb530b9eb 688 {
nickludlam 0:b4ccb530b9eb 689 if (!remaining(sizeof(int32_t)))
nickludlam 0:b4ccb530b9eb 690 {
nickludlam 0:b4ccb530b9eb 691 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 692 return false;
nickludlam 0:b4ccb530b9eb 693 }
nickludlam 0:b4ccb530b9eb 694
nickludlam 0:b4ccb530b9eb 695 /* Read type */
nickludlam 0:b4ccb530b9eb 696 read();
nickludlam 0:b4ccb530b9eb 697
nickludlam 0:b4ccb530b9eb 698 /* Read 32-bit signed integer */
nickludlam 0:b4ccb530b9eb 699 *value = read();
nickludlam 0:b4ccb530b9eb 700 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 701 *value |= read();
nickludlam 0:b4ccb530b9eb 702 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 703 *value |= read();
nickludlam 0:b4ccb530b9eb 704 *value = *value << 8;
nickludlam 0:b4ccb530b9eb 705 *value |= read();
nickludlam 0:b4ccb530b9eb 706
nickludlam 0:b4ccb530b9eb 707 /* Success */
nickludlam 0:b4ccb530b9eb 708 return true;
nickludlam 0:b4ccb530b9eb 709 }
nickludlam 0:b4ccb530b9eb 710
nickludlam 0:b4ccb530b9eb 711 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 712 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 713 return false;
nickludlam 0:b4ccb530b9eb 714 }
nickludlam 0:b4ccb530b9eb 715
nickludlam 0:b4ccb530b9eb 716 bool BERGCloudMessageBase::unpack_skip(void)
nickludlam 0:b4ccb530b9eb 717 {
nickludlam 0:b4ccb530b9eb 718 /* Skip next item */
nickludlam 0:b4ccb530b9eb 719
nickludlam 0:b4ccb530b9eb 720 uint8_t type;
nickludlam 0:b4ccb530b9eb 721 uint32_t bytesToSkip = 0;
nickludlam 0:b4ccb530b9eb 722
nickludlam 0:b4ccb530b9eb 723 /* Must be at least one byte of data */
nickludlam 0:b4ccb530b9eb 724 if (!remaining(sizeof(uint8_t)))
nickludlam 0:b4ccb530b9eb 725 {
nickludlam 0:b4ccb530b9eb 726 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 727 return false;
nickludlam 0:b4ccb530b9eb 728 }
nickludlam 0:b4ccb530b9eb 729
nickludlam 0:b4ccb530b9eb 730 /* Read type */
nickludlam 0:b4ccb530b9eb 731 type = read();
nickludlam 0:b4ccb530b9eb 732
nickludlam 0:b4ccb530b9eb 733 if ((type == _MP_UINT8) || (type == _MP_INT8))
nickludlam 0:b4ccb530b9eb 734 {
nickludlam 0:b4ccb530b9eb 735 bytesToSkip = 1;
nickludlam 0:b4ccb530b9eb 736 }
nickludlam 0:b4ccb530b9eb 737 else if ((type == _MP_UINT16) || (type == _MP_INT16))
nickludlam 0:b4ccb530b9eb 738 {
nickludlam 0:b4ccb530b9eb 739 bytesToSkip = 2;
nickludlam 0:b4ccb530b9eb 740 }
nickludlam 0:b4ccb530b9eb 741 else if ((type == _MP_UINT32) || (type == _MP_INT32) || (type == _MP_FLOAT))
nickludlam 0:b4ccb530b9eb 742 {
nickludlam 0:b4ccb530b9eb 743 bytesToSkip = 4;
nickludlam 0:b4ccb530b9eb 744 }
nickludlam 0:b4ccb530b9eb 745 else if ((type == _MP_UINT64) || (type == _MP_INT64) || (type == _MP_DOUBLE))
nickludlam 0:b4ccb530b9eb 746 {
nickludlam 0:b4ccb530b9eb 747 bytesToSkip = 8;
nickludlam 0:b4ccb530b9eb 748 }
nickludlam 0:b4ccb530b9eb 749 else if ((type == _MP_ARRAY16) || (type == _MP_MAP16))
nickludlam 0:b4ccb530b9eb 750 {
nickludlam 0:b4ccb530b9eb 751 /* TODO: This could skip all of the array/map elements too. */
nickludlam 0:b4ccb530b9eb 752 bytesToSkip = 2;
nickludlam 0:b4ccb530b9eb 753 }
nickludlam 0:b4ccb530b9eb 754 else if ((type == _MP_ARRAY32) || (type == _MP_MAP32))
nickludlam 0:b4ccb530b9eb 755 {
nickludlam 0:b4ccb530b9eb 756 /* TODO: This could skip all of the array/map elements too. */
nickludlam 0:b4ccb530b9eb 757 bytesToSkip = 4;
nickludlam 0:b4ccb530b9eb 758 }
nickludlam 0:b4ccb530b9eb 759 else if (type == _MP_RAW16)
nickludlam 0:b4ccb530b9eb 760 {
nickludlam 0:b4ccb530b9eb 761 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 762 {
nickludlam 0:b4ccb530b9eb 763 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 764 return false;
nickludlam 0:b4ccb530b9eb 765 }
nickludlam 0:b4ccb530b9eb 766
nickludlam 0:b4ccb530b9eb 767 /* Read 16-bit unsigned integer, data size */
nickludlam 0:b4ccb530b9eb 768 bytesToSkip = read();
nickludlam 0:b4ccb530b9eb 769 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 770 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 771 }
nickludlam 0:b4ccb530b9eb 772 else if (type == _MP_RAW32)
nickludlam 0:b4ccb530b9eb 773 {
nickludlam 0:b4ccb530b9eb 774 if (!remaining(sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 775 {
nickludlam 0:b4ccb530b9eb 776 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 777 return false;
nickludlam 0:b4ccb530b9eb 778 }
nickludlam 0:b4ccb530b9eb 779
nickludlam 0:b4ccb530b9eb 780 /* read 32-bit unsigned integer, data size */
nickludlam 0:b4ccb530b9eb 781 bytesToSkip = read();
nickludlam 0:b4ccb530b9eb 782 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 783 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 784 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 785 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 786 bytesToSkip = bytesToSkip << 8;
nickludlam 0:b4ccb530b9eb 787 bytesToSkip |= read();
nickludlam 0:b4ccb530b9eb 788 }
nickludlam 0:b4ccb530b9eb 789 else if (IN_RANGE(type, _MP_FIXRAW_MIN, _MP_FIXRAW_MAX))
nickludlam 0:b4ccb530b9eb 790 {
nickludlam 0:b4ccb530b9eb 791 bytesToSkip = type - _MP_FIXRAW_MIN;
nickludlam 0:b4ccb530b9eb 792 }
nickludlam 0:b4ccb530b9eb 793
nickludlam 0:b4ccb530b9eb 794 if (!remaining(bytesToSkip))
nickludlam 0:b4ccb530b9eb 795 {
nickludlam 0:b4ccb530b9eb 796 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 797 return false;
nickludlam 0:b4ccb530b9eb 798 }
nickludlam 0:b4ccb530b9eb 799
nickludlam 0:b4ccb530b9eb 800 while (bytesToSkip-- > 0)
nickludlam 0:b4ccb530b9eb 801 {
nickludlam 0:b4ccb530b9eb 802 /* Discard data */
nickludlam 0:b4ccb530b9eb 803 read();
nickludlam 0:b4ccb530b9eb 804 }
nickludlam 0:b4ccb530b9eb 805
nickludlam 0:b4ccb530b9eb 806 /* Success */
nickludlam 0:b4ccb530b9eb 807 return true;
nickludlam 0:b4ccb530b9eb 808 }
nickludlam 0:b4ccb530b9eb 809
nickludlam 0:b4ccb530b9eb 810 bool BERGCloudMessageBase::unpack(uint8_t& n)
nickludlam 0:b4ccb530b9eb 811 {
nickludlam 0:b4ccb530b9eb 812 uint32_t temp;
nickludlam 0:b4ccb530b9eb 813
nickludlam 0:b4ccb530b9eb 814 if (!getUnsignedInteger(&temp, sizeof(uint8_t)))
nickludlam 0:b4ccb530b9eb 815 {
nickludlam 0:b4ccb530b9eb 816 return false;
nickludlam 0:b4ccb530b9eb 817 }
nickludlam 0:b4ccb530b9eb 818
nickludlam 0:b4ccb530b9eb 819 n = (uint8_t)temp;
nickludlam 0:b4ccb530b9eb 820 return true;
nickludlam 0:b4ccb530b9eb 821 }
nickludlam 0:b4ccb530b9eb 822
nickludlam 0:b4ccb530b9eb 823 bool BERGCloudMessageBase::unpack(uint16_t& n)
nickludlam 0:b4ccb530b9eb 824 {
nickludlam 0:b4ccb530b9eb 825 uint32_t temp;
nickludlam 0:b4ccb530b9eb 826
nickludlam 0:b4ccb530b9eb 827 if (!getUnsignedInteger(&temp, sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 828 {
nickludlam 0:b4ccb530b9eb 829 return false;
nickludlam 0:b4ccb530b9eb 830 }
nickludlam 0:b4ccb530b9eb 831
nickludlam 0:b4ccb530b9eb 832 n = (uint16_t)temp;
nickludlam 0:b4ccb530b9eb 833 return true;
nickludlam 0:b4ccb530b9eb 834 }
nickludlam 0:b4ccb530b9eb 835
nickludlam 0:b4ccb530b9eb 836 bool BERGCloudMessageBase::unpack(uint32_t& n)
nickludlam 0:b4ccb530b9eb 837 {
nickludlam 0:b4ccb530b9eb 838 uint32_t temp;
nickludlam 0:b4ccb530b9eb 839
nickludlam 0:b4ccb530b9eb 840 if (!getUnsignedInteger(&temp, sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 841 {
nickludlam 0:b4ccb530b9eb 842 return false;
nickludlam 0:b4ccb530b9eb 843 }
nickludlam 0:b4ccb530b9eb 844
nickludlam 0:b4ccb530b9eb 845 n = temp;
nickludlam 0:b4ccb530b9eb 846 return true;
nickludlam 0:b4ccb530b9eb 847 }
nickludlam 0:b4ccb530b9eb 848
nickludlam 0:b4ccb530b9eb 849 bool BERGCloudMessageBase::unpack(int8_t& n)
nickludlam 0:b4ccb530b9eb 850 {
nickludlam 0:b4ccb530b9eb 851 int32_t temp;
nickludlam 0:b4ccb530b9eb 852
nickludlam 0:b4ccb530b9eb 853 if (!getSignedInteger(&temp, sizeof(int8_t)))
nickludlam 0:b4ccb530b9eb 854 {
nickludlam 0:b4ccb530b9eb 855 return false;
nickludlam 0:b4ccb530b9eb 856 }
nickludlam 0:b4ccb530b9eb 857
nickludlam 0:b4ccb530b9eb 858 n = (int8_t)temp;
nickludlam 0:b4ccb530b9eb 859 return true;
nickludlam 0:b4ccb530b9eb 860 }
nickludlam 0:b4ccb530b9eb 861
nickludlam 0:b4ccb530b9eb 862 bool BERGCloudMessageBase::unpack(int16_t& n)
nickludlam 0:b4ccb530b9eb 863 {
nickludlam 0:b4ccb530b9eb 864 int32_t temp;
nickludlam 0:b4ccb530b9eb 865
nickludlam 0:b4ccb530b9eb 866 if (!getSignedInteger(&temp, sizeof(int16_t)))
nickludlam 0:b4ccb530b9eb 867 {
nickludlam 0:b4ccb530b9eb 868 return false;
nickludlam 0:b4ccb530b9eb 869 }
nickludlam 0:b4ccb530b9eb 870
nickludlam 0:b4ccb530b9eb 871 n = (uint16_t)temp;
nickludlam 0:b4ccb530b9eb 872 return true;
nickludlam 0:b4ccb530b9eb 873 }
nickludlam 0:b4ccb530b9eb 874
nickludlam 0:b4ccb530b9eb 875 bool BERGCloudMessageBase::unpack(int32_t& n)
nickludlam 0:b4ccb530b9eb 876 {
nickludlam 0:b4ccb530b9eb 877 int32_t temp;
nickludlam 0:b4ccb530b9eb 878
nickludlam 0:b4ccb530b9eb 879 if (!getSignedInteger(&temp, sizeof(int32_t)))
nickludlam 0:b4ccb530b9eb 880 {
nickludlam 0:b4ccb530b9eb 881 return false;
nickludlam 0:b4ccb530b9eb 882 }
nickludlam 0:b4ccb530b9eb 883
nickludlam 0:b4ccb530b9eb 884 n = temp;
nickludlam 0:b4ccb530b9eb 885 return true;
nickludlam 0:b4ccb530b9eb 886 }
nickludlam 0:b4ccb530b9eb 887
nickludlam 0:b4ccb530b9eb 888 bool BERGCloudMessageBase::unpack(float& n)
nickludlam 0:b4ccb530b9eb 889 {
nickludlam 0:b4ccb530b9eb 890 /* Try to decode the next messagePack item as an 4-byte float */
nickludlam 0:b4ccb530b9eb 891 uint32_t data;
nickludlam 0:b4ccb530b9eb 892 uint8_t type;
nickludlam 0:b4ccb530b9eb 893
nickludlam 0:b4ccb530b9eb 894 /* Look at next type */
nickludlam 0:b4ccb530b9eb 895 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 896 {
nickludlam 0:b4ccb530b9eb 897 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 898 return false;
nickludlam 0:b4ccb530b9eb 899 }
nickludlam 0:b4ccb530b9eb 900
nickludlam 0:b4ccb530b9eb 901 if (type == _MP_FLOAT)
nickludlam 0:b4ccb530b9eb 902 {
nickludlam 0:b4ccb530b9eb 903 if (!remaining(sizeof(float)))
nickludlam 0:b4ccb530b9eb 904 {
nickludlam 0:b4ccb530b9eb 905 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 906 return false;
nickludlam 0:b4ccb530b9eb 907 }
nickludlam 0:b4ccb530b9eb 908
nickludlam 0:b4ccb530b9eb 909 /* Read type */
nickludlam 0:b4ccb530b9eb 910 read();
nickludlam 0:b4ccb530b9eb 911
nickludlam 0:b4ccb530b9eb 912 /* Read 32-bit float */
nickludlam 0:b4ccb530b9eb 913 data = read();
nickludlam 0:b4ccb530b9eb 914 data = data << 8;
nickludlam 0:b4ccb530b9eb 915 data |= read();
nickludlam 0:b4ccb530b9eb 916 data = data << 8;
nickludlam 0:b4ccb530b9eb 917 data |= read();
nickludlam 0:b4ccb530b9eb 918 data = data << 8;
nickludlam 0:b4ccb530b9eb 919 data |= read();
nickludlam 0:b4ccb530b9eb 920
nickludlam 0:b4ccb530b9eb 921 /* Convert to float */
nickludlam 0:b4ccb530b9eb 922 memcpy(&n, &data, sizeof(float));
nickludlam 0:b4ccb530b9eb 923
nickludlam 0:b4ccb530b9eb 924 /* Success */
nickludlam 0:b4ccb530b9eb 925 return true;
nickludlam 0:b4ccb530b9eb 926 }
nickludlam 0:b4ccb530b9eb 927
nickludlam 0:b4ccb530b9eb 928 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 929 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 930 return false;
nickludlam 0:b4ccb530b9eb 931 }
nickludlam 0:b4ccb530b9eb 932
nickludlam 0:b4ccb530b9eb 933 bool BERGCloudMessageBase::unpack(bool& n)
nickludlam 0:b4ccb530b9eb 934 {
nickludlam 0:b4ccb530b9eb 935 /* Try to decode the next messagePack item as boolean */
nickludlam 0:b4ccb530b9eb 936 uint8_t type;
nickludlam 0:b4ccb530b9eb 937
nickludlam 0:b4ccb530b9eb 938 /* Look at next type */
nickludlam 0:b4ccb530b9eb 939 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 940 {
nickludlam 0:b4ccb530b9eb 941 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 942 return false;
nickludlam 0:b4ccb530b9eb 943 }
nickludlam 0:b4ccb530b9eb 944
nickludlam 0:b4ccb530b9eb 945 if ((type == _MP_BOOL_FALSE) || (type == _MP_BOOL_TRUE))
nickludlam 0:b4ccb530b9eb 946 {
nickludlam 0:b4ccb530b9eb 947 n = (read() == _MP_BOOL_TRUE);
nickludlam 0:b4ccb530b9eb 948
nickludlam 0:b4ccb530b9eb 949 /* Success */
nickludlam 0:b4ccb530b9eb 950 return true;
nickludlam 0:b4ccb530b9eb 951 }
nickludlam 0:b4ccb530b9eb 952
nickludlam 0:b4ccb530b9eb 953 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 954 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 955 return false;
nickludlam 0:b4ccb530b9eb 956 }
nickludlam 0:b4ccb530b9eb 957
nickludlam 0:b4ccb530b9eb 958 bool BERGCloudMessageBase::unpack_nil(void)
nickludlam 0:b4ccb530b9eb 959 {
nickludlam 0:b4ccb530b9eb 960 /* Try to decode the next messagePack item as nil */
nickludlam 0:b4ccb530b9eb 961 uint8_t type;
nickludlam 0:b4ccb530b9eb 962
nickludlam 0:b4ccb530b9eb 963 /* Look at next type */
nickludlam 0:b4ccb530b9eb 964 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 965 {
nickludlam 0:b4ccb530b9eb 966 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 967 return false;
nickludlam 0:b4ccb530b9eb 968 }
nickludlam 0:b4ccb530b9eb 969
nickludlam 0:b4ccb530b9eb 970 if (type == _MP_NIL)
nickludlam 0:b4ccb530b9eb 971 {
nickludlam 0:b4ccb530b9eb 972 /* Read type */
nickludlam 0:b4ccb530b9eb 973 read();
nickludlam 0:b4ccb530b9eb 974
nickludlam 0:b4ccb530b9eb 975 /* Success */
nickludlam 0:b4ccb530b9eb 976 return true;
nickludlam 0:b4ccb530b9eb 977 }
nickludlam 0:b4ccb530b9eb 978
nickludlam 0:b4ccb530b9eb 979 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 980 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 981 return false;
nickludlam 0:b4ccb530b9eb 982 }
nickludlam 0:b4ccb530b9eb 983
nickludlam 0:b4ccb530b9eb 984 bool BERGCloudMessageBase::unpack_array(uint16_t& items)
nickludlam 0:b4ccb530b9eb 985 {
nickludlam 0:b4ccb530b9eb 986 /* Try to decode the next messagePack item as array */
nickludlam 0:b4ccb530b9eb 987 uint8_t type;
nickludlam 0:b4ccb530b9eb 988
nickludlam 0:b4ccb530b9eb 989 /* Look at next type */
nickludlam 0:b4ccb530b9eb 990 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 991 {
nickludlam 0:b4ccb530b9eb 992 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 993 return false;
nickludlam 0:b4ccb530b9eb 994 }
nickludlam 0:b4ccb530b9eb 995
nickludlam 0:b4ccb530b9eb 996 if (IN_RANGE(type, _MP_FIXARRAY_MIN, _MP_FIXARRAY_MAX))
nickludlam 0:b4ccb530b9eb 997 {
nickludlam 0:b4ccb530b9eb 998 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 999 items = read() - _MP_FIXARRAY_MIN;
nickludlam 0:b4ccb530b9eb 1000
nickludlam 0:b4ccb530b9eb 1001 /* Success */
nickludlam 0:b4ccb530b9eb 1002 return true;
nickludlam 0:b4ccb530b9eb 1003 }
nickludlam 0:b4ccb530b9eb 1004
nickludlam 0:b4ccb530b9eb 1005 if (type == _MP_ARRAY16)
nickludlam 0:b4ccb530b9eb 1006 {
nickludlam 0:b4ccb530b9eb 1007 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 1008 {
nickludlam 0:b4ccb530b9eb 1009 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1010 return false;
nickludlam 0:b4ccb530b9eb 1011 }
nickludlam 0:b4ccb530b9eb 1012
nickludlam 0:b4ccb530b9eb 1013 /* Read type */
nickludlam 0:b4ccb530b9eb 1014 read();
nickludlam 0:b4ccb530b9eb 1015
nickludlam 0:b4ccb530b9eb 1016 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1017 items = read();
nickludlam 0:b4ccb530b9eb 1018 items = items << 8;
nickludlam 0:b4ccb530b9eb 1019 items |= read();
nickludlam 0:b4ccb530b9eb 1020
nickludlam 0:b4ccb530b9eb 1021 /* Success */
nickludlam 0:b4ccb530b9eb 1022 return true;
nickludlam 0:b4ccb530b9eb 1023 }
nickludlam 0:b4ccb530b9eb 1024
nickludlam 0:b4ccb530b9eb 1025 if (type == _MP_ARRAY32)
nickludlam 0:b4ccb530b9eb 1026 {
nickludlam 0:b4ccb530b9eb 1027 /* Not yet supported */
nickludlam 0:b4ccb530b9eb 1028 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1029 return false;
nickludlam 0:b4ccb530b9eb 1030 }
nickludlam 0:b4ccb530b9eb 1031
nickludlam 0:b4ccb530b9eb 1032 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 1033 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1034 return false;
nickludlam 0:b4ccb530b9eb 1035 }
nickludlam 0:b4ccb530b9eb 1036
nickludlam 0:b4ccb530b9eb 1037 bool BERGCloudMessageBase::unpack_map(uint16_t& items)
nickludlam 0:b4ccb530b9eb 1038 {
nickludlam 0:b4ccb530b9eb 1039 /* Try to decode the next messagePack item as array */
nickludlam 0:b4ccb530b9eb 1040 uint8_t type;
nickludlam 0:b4ccb530b9eb 1041
nickludlam 0:b4ccb530b9eb 1042 /* Look at next type */
nickludlam 0:b4ccb530b9eb 1043 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 1044 {
nickludlam 0:b4ccb530b9eb 1045 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1046 return false;
nickludlam 0:b4ccb530b9eb 1047 }
nickludlam 0:b4ccb530b9eb 1048
nickludlam 0:b4ccb530b9eb 1049 if (IN_RANGE(type, _MP_FIXMAP_MIN, _MP_FIXMAP_MAX))
nickludlam 0:b4ccb530b9eb 1050 {
nickludlam 0:b4ccb530b9eb 1051 /* Read fix num value */
nickludlam 0:b4ccb530b9eb 1052 items = read() - _MP_FIXMAP_MIN;
nickludlam 0:b4ccb530b9eb 1053
nickludlam 0:b4ccb530b9eb 1054 /* Success */
nickludlam 0:b4ccb530b9eb 1055 return true;
nickludlam 0:b4ccb530b9eb 1056 }
nickludlam 0:b4ccb530b9eb 1057
nickludlam 0:b4ccb530b9eb 1058 if (type == _MP_MAP16)
nickludlam 0:b4ccb530b9eb 1059 {
nickludlam 0:b4ccb530b9eb 1060 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 1061 {
nickludlam 0:b4ccb530b9eb 1062 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1063 return false;
nickludlam 0:b4ccb530b9eb 1064 }
nickludlam 0:b4ccb530b9eb 1065
nickludlam 0:b4ccb530b9eb 1066 /* Read type */
nickludlam 0:b4ccb530b9eb 1067 read();
nickludlam 0:b4ccb530b9eb 1068
nickludlam 0:b4ccb530b9eb 1069 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1070 items = read();
nickludlam 0:b4ccb530b9eb 1071 items = items << 8;
nickludlam 0:b4ccb530b9eb 1072 items |= read();
nickludlam 0:b4ccb530b9eb 1073
nickludlam 0:b4ccb530b9eb 1074 /* Success */
nickludlam 0:b4ccb530b9eb 1075 return true;
nickludlam 0:b4ccb530b9eb 1076 }
nickludlam 0:b4ccb530b9eb 1077
nickludlam 0:b4ccb530b9eb 1078 if (type == _MP_MAP32)
nickludlam 0:b4ccb530b9eb 1079 {
nickludlam 0:b4ccb530b9eb 1080 /* Not yet supported */
nickludlam 0:b4ccb530b9eb 1081 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1082 return true;
nickludlam 0:b4ccb530b9eb 1083 }
nickludlam 0:b4ccb530b9eb 1084
nickludlam 0:b4ccb530b9eb 1085 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 1086 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1087 return false;
nickludlam 0:b4ccb530b9eb 1088 }
nickludlam 0:b4ccb530b9eb 1089
nickludlam 0:b4ccb530b9eb 1090 /* Separate header and data methods are provided for raw data*/
nickludlam 0:b4ccb530b9eb 1091 /* so that Arduino strings may be unpacked without having to create */
nickludlam 0:b4ccb530b9eb 1092 /* a temporary buffer first. */
nickludlam 0:b4ccb530b9eb 1093
nickludlam 0:b4ccb530b9eb 1094 bool BERGCloudMessageBase::unpack_raw_header(uint16_t *sizeInBytes)
nickludlam 0:b4ccb530b9eb 1095 {
nickludlam 0:b4ccb530b9eb 1096 uint8_t type;
nickludlam 0:b4ccb530b9eb 1097
nickludlam 0:b4ccb530b9eb 1098 /* Look at next type */
nickludlam 0:b4ccb530b9eb 1099 if (!peek(&type))
nickludlam 0:b4ccb530b9eb 1100 {
nickludlam 0:b4ccb530b9eb 1101 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1102 return false;
nickludlam 0:b4ccb530b9eb 1103 }
nickludlam 0:b4ccb530b9eb 1104
nickludlam 0:b4ccb530b9eb 1105 if (IN_RANGE(type, _MP_FIXRAW_MIN, _MP_FIXRAW_MAX))
nickludlam 0:b4ccb530b9eb 1106 {
nickludlam 0:b4ccb530b9eb 1107 /* Read fix raw value */
nickludlam 0:b4ccb530b9eb 1108 *sizeInBytes = read() - _MP_FIXRAW_MIN;
nickludlam 0:b4ccb530b9eb 1109
nickludlam 0:b4ccb530b9eb 1110 /* Success */
nickludlam 0:b4ccb530b9eb 1111 return true;
nickludlam 0:b4ccb530b9eb 1112 }
nickludlam 0:b4ccb530b9eb 1113
nickludlam 0:b4ccb530b9eb 1114 if (type == _MP_RAW16)
nickludlam 0:b4ccb530b9eb 1115 {
nickludlam 0:b4ccb530b9eb 1116 if (!remaining(sizeof(uint16_t)))
nickludlam 0:b4ccb530b9eb 1117 {
nickludlam 0:b4ccb530b9eb 1118 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1119 return false;
nickludlam 0:b4ccb530b9eb 1120 }
nickludlam 0:b4ccb530b9eb 1121
nickludlam 0:b4ccb530b9eb 1122 /* Read type */
nickludlam 0:b4ccb530b9eb 1123 read();
nickludlam 0:b4ccb530b9eb 1124
nickludlam 0:b4ccb530b9eb 1125 /* Read 16-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1126 *sizeInBytes = read();
nickludlam 0:b4ccb530b9eb 1127 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1128 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1129
nickludlam 0:b4ccb530b9eb 1130 /* Success */
nickludlam 0:b4ccb530b9eb 1131 return true;
nickludlam 0:b4ccb530b9eb 1132 }
nickludlam 0:b4ccb530b9eb 1133
nickludlam 0:b4ccb530b9eb 1134 if (type == _MP_RAW32)
nickludlam 0:b4ccb530b9eb 1135 {
nickludlam 0:b4ccb530b9eb 1136 if (!remaining(sizeof(uint32_t)))
nickludlam 0:b4ccb530b9eb 1137 {
nickludlam 0:b4ccb530b9eb 1138 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1139 return false;
nickludlam 0:b4ccb530b9eb 1140 }
nickludlam 0:b4ccb530b9eb 1141
nickludlam 0:b4ccb530b9eb 1142 /* Read type */
nickludlam 0:b4ccb530b9eb 1143 read();
nickludlam 0:b4ccb530b9eb 1144
nickludlam 0:b4ccb530b9eb 1145 /* read 32-bit unsigned integer */
nickludlam 0:b4ccb530b9eb 1146 *sizeInBytes = read();
nickludlam 0:b4ccb530b9eb 1147 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1148 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1149 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1150 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1151 *sizeInBytes = *sizeInBytes << 8;
nickludlam 0:b4ccb530b9eb 1152 *sizeInBytes |= read();
nickludlam 0:b4ccb530b9eb 1153
nickludlam 0:b4ccb530b9eb 1154 /* Success */
nickludlam 0:b4ccb530b9eb 1155 return true;
nickludlam 0:b4ccb530b9eb 1156 }
nickludlam 0:b4ccb530b9eb 1157
nickludlam 0:b4ccb530b9eb 1158 /* Can't convert this type */
nickludlam 0:b4ccb530b9eb 1159 _LOG_UNPACK_ERROR_TYPE;
nickludlam 0:b4ccb530b9eb 1160 return false;
nickludlam 0:b4ccb530b9eb 1161 }
nickludlam 0:b4ccb530b9eb 1162
nickludlam 0:b4ccb530b9eb 1163 bool BERGCloudMessageBase::unpack_raw_data(uint8_t *pData, uint16_t packedSizeInBytes, uint16_t bufferSizeInBytes)
nickludlam 0:b4ccb530b9eb 1164 {
nickludlam 0:b4ccb530b9eb 1165 uint8_t data;
nickludlam 0:b4ccb530b9eb 1166
nickludlam 0:b4ccb530b9eb 1167 /* Unpack all bytes */
nickludlam 0:b4ccb530b9eb 1168 while (packedSizeInBytes-- > 0)
nickludlam 0:b4ccb530b9eb 1169 {
nickludlam 0:b4ccb530b9eb 1170 data = read();
nickludlam 0:b4ccb530b9eb 1171
nickludlam 0:b4ccb530b9eb 1172 /* Only write up to the buffer size */
nickludlam 0:b4ccb530b9eb 1173 if (bufferSizeInBytes-- > 0)
nickludlam 0:b4ccb530b9eb 1174 {
nickludlam 0:b4ccb530b9eb 1175 *pData++ = data;
nickludlam 0:b4ccb530b9eb 1176 }
nickludlam 0:b4ccb530b9eb 1177 }
nickludlam 0:b4ccb530b9eb 1178
nickludlam 0:b4ccb530b9eb 1179 return true;
nickludlam 0:b4ccb530b9eb 1180 }
nickludlam 0:b4ccb530b9eb 1181
nickludlam 0:b4ccb530b9eb 1182 bool BERGCloudMessageBase::unpack(char *pString, uint32_t maxSizeInBytes)
nickludlam 0:b4ccb530b9eb 1183 {
nickludlam 0:b4ccb530b9eb 1184 /* Try to decode a null-terminated C string */
nickludlam 0:b4ccb530b9eb 1185 uint16_t sizeInBytes;
nickludlam 0:b4ccb530b9eb 1186
nickludlam 0:b4ccb530b9eb 1187 if (!unpack_raw_header(&sizeInBytes))
nickludlam 0:b4ccb530b9eb 1188 {
nickludlam 0:b4ccb530b9eb 1189 return false;
nickludlam 0:b4ccb530b9eb 1190 }
nickludlam 0:b4ccb530b9eb 1191
nickludlam 0:b4ccb530b9eb 1192 if (!remaining(sizeInBytes))
nickludlam 0:b4ccb530b9eb 1193 {
nickludlam 0:b4ccb530b9eb 1194 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1195 return false;
nickludlam 0:b4ccb530b9eb 1196 }
nickludlam 0:b4ccb530b9eb 1197
nickludlam 0:b4ccb530b9eb 1198 if (!unpack_raw_data((uint8_t *)pString, sizeInBytes, maxSizeInBytes - 1)) /* -1 to allow space for null terminator */
nickludlam 0:b4ccb530b9eb 1199 {
nickludlam 0:b4ccb530b9eb 1200 return false;
nickludlam 0:b4ccb530b9eb 1201 }
nickludlam 0:b4ccb530b9eb 1202
nickludlam 0:b4ccb530b9eb 1203 /* Add null terminator */
nickludlam 0:b4ccb530b9eb 1204 pString[sizeInBytes] = '\0';
nickludlam 0:b4ccb530b9eb 1205
nickludlam 0:b4ccb530b9eb 1206 /* Success */
nickludlam 0:b4ccb530b9eb 1207 return true;
nickludlam 0:b4ccb530b9eb 1208 }
nickludlam 0:b4ccb530b9eb 1209
nickludlam 0:b4ccb530b9eb 1210 bool BERGCloudMessageBase::unpack(uint8_t *pData, uint32_t maxSizeInBytes, uint32_t *pSizeInBytes)
nickludlam 0:b4ccb530b9eb 1211 {
nickludlam 0:b4ccb530b9eb 1212 /* Try to decode a block of raw data */
nickludlam 0:b4ccb530b9eb 1213 uint16_t sizeInBytes;
nickludlam 0:b4ccb530b9eb 1214
nickludlam 0:b4ccb530b9eb 1215 if (!unpack_raw_header(&sizeInBytes))
nickludlam 0:b4ccb530b9eb 1216 {
nickludlam 0:b4ccb530b9eb 1217 return false;
nickludlam 0:b4ccb530b9eb 1218 }
nickludlam 0:b4ccb530b9eb 1219
nickludlam 0:b4ccb530b9eb 1220 if (!remaining(sizeInBytes))
nickludlam 0:b4ccb530b9eb 1221 {
nickludlam 0:b4ccb530b9eb 1222 _LOG_UNPACK_ERROR_NO_DATA;
nickludlam 0:b4ccb530b9eb 1223 return false;
nickludlam 0:b4ccb530b9eb 1224 }
nickludlam 0:b4ccb530b9eb 1225
nickludlam 0:b4ccb530b9eb 1226 if (pSizeInBytes != NULL)
nickludlam 0:b4ccb530b9eb 1227 {
nickludlam 0:b4ccb530b9eb 1228 *pSizeInBytes = sizeInBytes;
nickludlam 0:b4ccb530b9eb 1229 }
nickludlam 0:b4ccb530b9eb 1230
nickludlam 0:b4ccb530b9eb 1231 return unpack_raw_data(pData, sizeInBytes, maxSizeInBytes);
nickludlam 0:b4ccb530b9eb 1232 }
nickludlam 0:b4ccb530b9eb 1233
nickludlam 0:b4ccb530b9eb 1234 bool BERGCloudMessageBase::unpack_find(const char *key)
nickludlam 0:b4ccb530b9eb 1235 {
nickludlam 0:b4ccb530b9eb 1236 /* Search for a string key in a map; in this simple */
nickludlam 0:b4ccb530b9eb 1237 /* implementation maps cannot contain maps or arrays */
nickludlam 0:b4ccb530b9eb 1238 uint16_t last_read;
nickludlam 0:b4ccb530b9eb 1239 uint16_t map_items;
nickludlam 0:b4ccb530b9eb 1240 uint8_t type;
nickludlam 0:b4ccb530b9eb 1241 char keyString[MAX_MAP_KEY_STRING_LENGTH+1]; /* +1 for null terminator */
nickludlam 0:b4ccb530b9eb 1242
nickludlam 0:b4ccb530b9eb 1243 if (key == NULL)
nickludlam 0:b4ccb530b9eb 1244 {
nickludlam 0:b4ccb530b9eb 1245 return false;
nickludlam 0:b4ccb530b9eb 1246 }
nickludlam 0:b4ccb530b9eb 1247
nickludlam 0:b4ccb530b9eb 1248 if (strlen(key) > MAX_MAP_KEY_STRING_LENGTH)
nickludlam 0:b4ccb530b9eb 1249 {
nickludlam 0:b4ccb530b9eb 1250 _LOG("Unpack: Key name too long.\r\n");
nickludlam 0:b4ccb530b9eb 1251 return false;
nickludlam 0:b4ccb530b9eb 1252 }
nickludlam 0:b4ccb530b9eb 1253
nickludlam 0:b4ccb530b9eb 1254 /* Remember the current read position in the raw data */
nickludlam 0:b4ccb530b9eb 1255 last_read = bytesRead;
nickludlam 0:b4ccb530b9eb 1256
nickludlam 0:b4ccb530b9eb 1257 /* Start reading from the beginning of the data */
nickludlam 0:b4ccb530b9eb 1258 restart();
nickludlam 0:b4ccb530b9eb 1259
nickludlam 0:b4ccb530b9eb 1260 while(peek(&type))
nickludlam 0:b4ccb530b9eb 1261 {
nickludlam 0:b4ccb530b9eb 1262 if (IN_RANGE(type, _MP_FIXMAP_MIN, _MP_FIXMAP_MAX) || (type == _MP_MAP16)) /* _MP_MAP32 not yet supported */
nickludlam 0:b4ccb530b9eb 1263 {
nickludlam 0:b4ccb530b9eb 1264 /* Map found, get number of items */
nickludlam 0:b4ccb530b9eb 1265 unpack_map(map_items);
nickludlam 0:b4ccb530b9eb 1266
nickludlam 0:b4ccb530b9eb 1267 /* Iterate through the key-value pairs */
nickludlam 0:b4ccb530b9eb 1268 while (map_items-- > 0)
nickludlam 0:b4ccb530b9eb 1269 {
nickludlam 0:b4ccb530b9eb 1270 if (unpack(keyString, sizeof(keyString)))
nickludlam 0:b4ccb530b9eb 1271 {
nickludlam 0:b4ccb530b9eb 1272 /* String key found */
nickludlam 0:b4ccb530b9eb 1273 if (strcompare(keyString, key))
nickludlam 0:b4ccb530b9eb 1274 {
nickludlam 0:b4ccb530b9eb 1275 /* Match found */
nickludlam 0:b4ccb530b9eb 1276 return true;
nickludlam 0:b4ccb530b9eb 1277 }
nickludlam 0:b4ccb530b9eb 1278 else
nickludlam 0:b4ccb530b9eb 1279 {
nickludlam 0:b4ccb530b9eb 1280 /* No match, skip this value */
nickludlam 0:b4ccb530b9eb 1281 unpack_skip();
nickludlam 0:b4ccb530b9eb 1282 }
nickludlam 0:b4ccb530b9eb 1283 }
nickludlam 0:b4ccb530b9eb 1284 else
nickludlam 0:b4ccb530b9eb 1285 {
nickludlam 0:b4ccb530b9eb 1286 /* Not a suitable string key; skip this key and value */
nickludlam 0:b4ccb530b9eb 1287 unpack_skip();
nickludlam 0:b4ccb530b9eb 1288 unpack_skip();
nickludlam 0:b4ccb530b9eb 1289 }
nickludlam 0:b4ccb530b9eb 1290 }
nickludlam 0:b4ccb530b9eb 1291 }
nickludlam 0:b4ccb530b9eb 1292 else
nickludlam 0:b4ccb530b9eb 1293 {
nickludlam 0:b4ccb530b9eb 1294 /* Not a map */
nickludlam 0:b4ccb530b9eb 1295 unpack_skip();
nickludlam 0:b4ccb530b9eb 1296 }
nickludlam 0:b4ccb530b9eb 1297 }
nickludlam 0:b4ccb530b9eb 1298
nickludlam 0:b4ccb530b9eb 1299 /* Not found; return to last position */
nickludlam 0:b4ccb530b9eb 1300 bytesRead = last_read;
nickludlam 0:b4ccb530b9eb 1301 return false;
nickludlam 0:b4ccb530b9eb 1302 }
nickludlam 0:b4ccb530b9eb 1303
nickludlam 0:b4ccb530b9eb 1304 bool BERGCloudMessageBase::unpack_find(uint16_t i)
nickludlam 0:b4ccb530b9eb 1305 {
nickludlam 0:b4ccb530b9eb 1306 /* Search for an index in an array; in this simple */
nickludlam 0:b4ccb530b9eb 1307 /* implementation arrays cannot contain maps or arrays */
nickludlam 0:b4ccb530b9eb 1308 uint16_t last_read;
nickludlam 0:b4ccb530b9eb 1309 uint16_t array_items;
nickludlam 0:b4ccb530b9eb 1310 uint16_t item;
nickludlam 0:b4ccb530b9eb 1311 uint8_t type;
nickludlam 0:b4ccb530b9eb 1312
nickludlam 0:b4ccb530b9eb 1313 /* Remember the current read position in the raw data */
nickludlam 0:b4ccb530b9eb 1314 last_read = bytesRead;
nickludlam 0:b4ccb530b9eb 1315
nickludlam 0:b4ccb530b9eb 1316 /* Start reading from the beginning of the data */
nickludlam 0:b4ccb530b9eb 1317 restart();
nickludlam 0:b4ccb530b9eb 1318
nickludlam 0:b4ccb530b9eb 1319 while(peek(&type))
nickludlam 0:b4ccb530b9eb 1320 {
nickludlam 0:b4ccb530b9eb 1321 if (IN_RANGE(type, _MP_FIXARRAY_MIN, _MP_FIXARRAY_MAX) || (type == _MP_ARRAY16)) /* _MP_ARRAY32 not yet supported */
nickludlam 0:b4ccb530b9eb 1322 {
nickludlam 0:b4ccb530b9eb 1323 /* Array found, get number of items */
nickludlam 0:b4ccb530b9eb 1324 unpack_array(array_items);
nickludlam 0:b4ccb530b9eb 1325
nickludlam 0:b4ccb530b9eb 1326 /* Assume items are numbered starting from one */
nickludlam 0:b4ccb530b9eb 1327 item = 1;
nickludlam 0:b4ccb530b9eb 1328
nickludlam 0:b4ccb530b9eb 1329 if (i == 0)
nickludlam 0:b4ccb530b9eb 1330 {
nickludlam 0:b4ccb530b9eb 1331 _LOG("Unpack: Array indexes start from 1.\r\n");
nickludlam 0:b4ccb530b9eb 1332 return false;
nickludlam 0:b4ccb530b9eb 1333 }
nickludlam 0:b4ccb530b9eb 1334
nickludlam 0:b4ccb530b9eb 1335 /* Iterate through the values in the array */
nickludlam 0:b4ccb530b9eb 1336 while (array_items-- > 0)
nickludlam 0:b4ccb530b9eb 1337 {
nickludlam 0:b4ccb530b9eb 1338 if (item++ == i)
nickludlam 0:b4ccb530b9eb 1339 {
nickludlam 0:b4ccb530b9eb 1340 /* Found it */
nickludlam 0:b4ccb530b9eb 1341 return true;
nickludlam 0:b4ccb530b9eb 1342 }
nickludlam 0:b4ccb530b9eb 1343 else
nickludlam 0:b4ccb530b9eb 1344 {
nickludlam 0:b4ccb530b9eb 1345 /* Skip this item */
nickludlam 0:b4ccb530b9eb 1346 unpack_skip();
nickludlam 0:b4ccb530b9eb 1347 }
nickludlam 0:b4ccb530b9eb 1348 }
nickludlam 0:b4ccb530b9eb 1349 }
nickludlam 0:b4ccb530b9eb 1350 else
nickludlam 0:b4ccb530b9eb 1351 {
nickludlam 0:b4ccb530b9eb 1352 /* Not an array */
nickludlam 0:b4ccb530b9eb 1353 unpack_skip();
nickludlam 0:b4ccb530b9eb 1354 }
nickludlam 0:b4ccb530b9eb 1355 }
nickludlam 0:b4ccb530b9eb 1356
nickludlam 0:b4ccb530b9eb 1357 /* Not found; return to last position */
nickludlam 0:b4ccb530b9eb 1358 bytesRead = last_read;
nickludlam 0:b4ccb530b9eb 1359 return false;
nickludlam 0:b4ccb530b9eb 1360 }
nickludlam 0:b4ccb530b9eb 1361