Thinger.io Client Library for ARM mbed platform. This is a generic library that provides a base class that can be used to other develop hardware specific libraries.

Fork of ThingerClient by Alvaro Luis Bustamante

Committer:
alvarolb
Date:
Thu Dec 24 13:18:08 2015 +0000
Revision:
0:b75d784c7c1a
Child:
4:de51256455f7
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alvarolb 0:b75d784c7c1a 1 // The MIT License (MIT)
alvarolb 0:b75d784c7c1a 2 //
alvarolb 0:b75d784c7c1a 3 // Copyright (c) 2015 THINGER LTD
alvarolb 0:b75d784c7c1a 4 // Author: alvarolb@gmail.com (Alvaro Luis Bustamante)
alvarolb 0:b75d784c7c1a 5 //
alvarolb 0:b75d784c7c1a 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
alvarolb 0:b75d784c7c1a 7 // of this software and associated documentation files (the "Software"), to deal
alvarolb 0:b75d784c7c1a 8 // in the Software without restriction, including without limitation the rights
alvarolb 0:b75d784c7c1a 9 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
alvarolb 0:b75d784c7c1a 10 // copies of the Software, and to permit persons to whom the Software is
alvarolb 0:b75d784c7c1a 11 // furnished to do so, subject to the following conditions:
alvarolb 0:b75d784c7c1a 12 //
alvarolb 0:b75d784c7c1a 13 // The above copyright notice and this permission notice shall be included in
alvarolb 0:b75d784c7c1a 14 // all copies or substantial portions of the Software.
alvarolb 0:b75d784c7c1a 15 //
alvarolb 0:b75d784c7c1a 16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
alvarolb 0:b75d784c7c1a 17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
alvarolb 0:b75d784c7c1a 18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
alvarolb 0:b75d784c7c1a 19 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
alvarolb 0:b75d784c7c1a 20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
alvarolb 0:b75d784c7c1a 21 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
alvarolb 0:b75d784c7c1a 22 // THE SOFTWARE.
alvarolb 0:b75d784c7c1a 23
alvarolb 0:b75d784c7c1a 24 #ifndef THINGER_DECODER_HPP
alvarolb 0:b75d784c7c1a 25 #define THINGER_DECODER_HPP
alvarolb 0:b75d784c7c1a 26
alvarolb 0:b75d784c7c1a 27 #include "pson.h"
alvarolb 0:b75d784c7c1a 28 #include "thinger_io.hpp"
alvarolb 0:b75d784c7c1a 29 #include "thinger_message.hpp"
alvarolb 0:b75d784c7c1a 30
alvarolb 0:b75d784c7c1a 31 namespace thinger{
alvarolb 0:b75d784c7c1a 32
alvarolb 0:b75d784c7c1a 33 class thinger_decoder : public protoson::pson_decoder{
alvarolb 0:b75d784c7c1a 34 public:
alvarolb 0:b75d784c7c1a 35 void decode(thinger_message& message, size_t size){
alvarolb 0:b75d784c7c1a 36 size_t start_read = bytes_read();
alvarolb 0:b75d784c7c1a 37 while(size-(bytes_read()-start_read)>0) {
alvarolb 0:b75d784c7c1a 38 protoson::pb_wire_type wire_type;
alvarolb 0:b75d784c7c1a 39 uint32_t field_number;
alvarolb 0:b75d784c7c1a 40 pb_decode_tag(wire_type, field_number);
alvarolb 0:b75d784c7c1a 41 switch (wire_type) {
alvarolb 0:b75d784c7c1a 42 case protoson::length_delimited:{
alvarolb 0:b75d784c7c1a 43 uint32_t size = pb_decode_varint32();
alvarolb 0:b75d784c7c1a 44 void *data = NULL;
alvarolb 0:b75d784c7c1a 45 switch (field_number) {
alvarolb 0:b75d784c7c1a 46 /*
alvarolb 0:b75d784c7c1a 47 case thinger_message::THING_ID:
alvarolb 0:b75d784c7c1a 48 data = protoson::pool.allocate(size + 1);
alvarolb 0:b75d784c7c1a 49 pb_read_string((char *) data, size);
alvarolb 0:b75d784c7c1a 50 message.set_thing_id((const char *) data);
alvarolb 0:b75d784c7c1a 51 break;
alvarolb 0:b75d784c7c1a 52 */
alvarolb 0:b75d784c7c1a 53 default:
alvarolb 0:b75d784c7c1a 54 pb_skip(size);
alvarolb 0:b75d784c7c1a 55 break;
alvarolb 0:b75d784c7c1a 56 }
alvarolb 0:b75d784c7c1a 57 }
alvarolb 0:b75d784c7c1a 58 break;
alvarolb 0:b75d784c7c1a 59 case protoson::varint: {
alvarolb 0:b75d784c7c1a 60 switch (field_number) {
alvarolb 0:b75d784c7c1a 61 case thinger_message::SIGNAL_FLAG:
alvarolb 0:b75d784c7c1a 62 message.set_signal_flag((thinger_message::signal_flag)pb_decode_varint32());
alvarolb 0:b75d784c7c1a 63 break;
alvarolb 0:b75d784c7c1a 64 case thinger_message::STREAM_ID:
alvarolb 0:b75d784c7c1a 65 message.set_stream_id(pb_decode_varint32());
alvarolb 0:b75d784c7c1a 66 break;
alvarolb 0:b75d784c7c1a 67 default:
alvarolb 0:b75d784c7c1a 68 pb_skip_varint();
alvarolb 0:b75d784c7c1a 69 break;
alvarolb 0:b75d784c7c1a 70 }
alvarolb 0:b75d784c7c1a 71 break;
alvarolb 0:b75d784c7c1a 72 }
alvarolb 0:b75d784c7c1a 73 case protoson::pson_type:
alvarolb 0:b75d784c7c1a 74 switch(field_number){
alvarolb 0:b75d784c7c1a 75 case thinger_message::RESOURCE:
alvarolb 0:b75d784c7c1a 76 protoson::pson_decoder::decode(message.get_resources());
alvarolb 0:b75d784c7c1a 77 break;
alvarolb 0:b75d784c7c1a 78 case thinger_message::PSON_PAYLOAD:
alvarolb 0:b75d784c7c1a 79 protoson::pson_decoder::decode(((protoson::pson&) message));
alvarolb 0:b75d784c7c1a 80 break;
alvarolb 0:b75d784c7c1a 81 default:
alvarolb 0:b75d784c7c1a 82 break;
alvarolb 0:b75d784c7c1a 83 }
alvarolb 0:b75d784c7c1a 84 break;
alvarolb 0:b75d784c7c1a 85 case protoson::fixed_32:
alvarolb 0:b75d784c7c1a 86 pb_skip(4);
alvarolb 0:b75d784c7c1a 87 break;
alvarolb 0:b75d784c7c1a 88 case protoson::fixed_64:
alvarolb 0:b75d784c7c1a 89 pb_skip(8);
alvarolb 0:b75d784c7c1a 90 break;
alvarolb 0:b75d784c7c1a 91 default:
alvarolb 0:b75d784c7c1a 92 break;
alvarolb 0:b75d784c7c1a 93 }
alvarolb 0:b75d784c7c1a 94 }
alvarolb 0:b75d784c7c1a 95 }
alvarolb 0:b75d784c7c1a 96 };
alvarolb 0:b75d784c7c1a 97
alvarolb 0:b75d784c7c1a 98 class thinger_read_decoder : public thinger_decoder{
alvarolb 0:b75d784c7c1a 99 public:
alvarolb 0:b75d784c7c1a 100 thinger_read_decoder(thinger_io& io) : io_(io)
alvarolb 0:b75d784c7c1a 101 {}
alvarolb 0:b75d784c7c1a 102
alvarolb 0:b75d784c7c1a 103 protected:
alvarolb 0:b75d784c7c1a 104 virtual bool read(void* buffer, size_t size){
alvarolb 0:b75d784c7c1a 105 io_.read((char*)buffer, size);
alvarolb 0:b75d784c7c1a 106 protoson::pson_decoder::read(buffer, size);
alvarolb 0:b75d784c7c1a 107 return true;
alvarolb 0:b75d784c7c1a 108 }
alvarolb 0:b75d784c7c1a 109
alvarolb 0:b75d784c7c1a 110 private:
alvarolb 0:b75d784c7c1a 111 thinger_io& io_;
alvarolb 0:b75d784c7c1a 112 };
alvarolb 0:b75d784c7c1a 113
alvarolb 0:b75d784c7c1a 114 class thinger_memory_decoder : public thinger_decoder{
alvarolb 0:b75d784c7c1a 115
alvarolb 0:b75d784c7c1a 116 public:
alvarolb 0:b75d784c7c1a 117 thinger_memory_decoder(uint8_t* buffer, size_t size) : buffer_(buffer), size_(size){}
alvarolb 0:b75d784c7c1a 118
alvarolb 0:b75d784c7c1a 119 protected:
alvarolb 0:b75d784c7c1a 120 virtual bool read(void* buffer, size_t size){
alvarolb 0:b75d784c7c1a 121 if(read_+size<=size_){
alvarolb 0:b75d784c7c1a 122 memcpy(buffer, buffer_ + read_, size);
alvarolb 0:b75d784c7c1a 123 return protoson::pson_decoder::read(buffer, size);
alvarolb 0:b75d784c7c1a 124 }else{
alvarolb 0:b75d784c7c1a 125 return false;
alvarolb 0:b75d784c7c1a 126 }
alvarolb 0:b75d784c7c1a 127 }
alvarolb 0:b75d784c7c1a 128
alvarolb 0:b75d784c7c1a 129 private:
alvarolb 0:b75d784c7c1a 130 uint8_t* buffer_;
alvarolb 0:b75d784c7c1a 131 size_t size_;
alvarolb 0:b75d784c7c1a 132
alvarolb 0:b75d784c7c1a 133 };
alvarolb 0:b75d784c7c1a 134
alvarolb 0:b75d784c7c1a 135 }
alvarolb 0:b75d784c7c1a 136
alvarolb 0:b75d784c7c1a 137 #endif