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:
Sat Dec 26 13:18:01 2015 +0000
Revision:
4:de51256455f7
Parent:
0:b75d784c7c1a
Adapter pson to properly work in ARM Mbed old compiler

Who changed what in which revision?

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