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
thinger/thinger_decoder.hpp@4:de51256455f7, 2015-12-26 (annotated)
- 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?
User | Revision | Line number | New 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 |