Dependents:   hello_message_pack

msgpack-c & msgpack-c++ https://github.com/msgpack/msgpack-c implementation for embedded systems (mbed / Arduino)

Committer:
hideakitai
Date:
Mon Feb 22 01:43:48 2016 +0000
Revision:
4:bd0c06dd6e92
Parent:
3:a56553e46a9a
fix throw error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hideakitai 0:3f9dbf1e2cb0 1 //
hideakitai 0:3f9dbf1e2cb0 2 // MessagePack for C++ deflate buffer implementation
hideakitai 0:3f9dbf1e2cb0 3 //
hideakitai 0:3f9dbf1e2cb0 4 // Copyright (C) 2010-2013 FURUHASHI Sadayuki and KONDO Takatoshi
hideakitai 0:3f9dbf1e2cb0 5 //
hideakitai 0:3f9dbf1e2cb0 6 // Distributed under the Boost Software License, Version 1.0.
hideakitai 0:3f9dbf1e2cb0 7 // (See accompanying file LICENSE_1_0.txt or copy at
hideakitai 0:3f9dbf1e2cb0 8 // http://www.boost.org/LICENSE_1_0.txt)
hideakitai 0:3f9dbf1e2cb0 9 //
hideakitai 0:3f9dbf1e2cb0 10 #ifndef MSGPACK_ZBUFFER_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_ZBUFFER_HPP
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 14
hideakitai 0:3f9dbf1e2cb0 15 #include <stdexcept>
hideakitai 0:3f9dbf1e2cb0 16 #include <zlib.h>
hideakitai 0:3f9dbf1e2cb0 17
hideakitai 0:3f9dbf1e2cb0 18 #ifndef MSGPACK_ZBUFFER_RESERVE_SIZE
hideakitai 3:a56553e46a9a 19 #if defined (__MBED__)
hideakitai 3:a56553e46a9a 20 #define MSGPACK_ZBUFFER_RESERVE_SIZE 256
hideakitai 3:a56553e46a9a 21 #elif defined (__AVR__)
hideakitai 3:a56553e46a9a 22 #define MSGPACK_ZBUFFER_RESERVE_SIZE 64
hideakitai 3:a56553e46a9a 23 #else
hideakitai 3:a56553e46a9a 24 #define MSGPACK_ZBUFFER_RESERVE_SIZE 512
hideakitai 3:a56553e46a9a 25 #endif
hideakitai 0:3f9dbf1e2cb0 26 #endif
hideakitai 0:3f9dbf1e2cb0 27
hideakitai 0:3f9dbf1e2cb0 28 #ifndef MSGPACK_ZBUFFER_INIT_SIZE
hideakitai 3:a56553e46a9a 29 #if defined (__MBED__)
hideakitai 3:a56553e46a9a 30 #define MSGPACK_ZBUFFER_INIT_SIZE 512
hideakitai 3:a56553e46a9a 31 #elif defined (__AVR__)
hideakitai 3:a56553e46a9a 32 #define MSGPACK_ZBUFFER_INIT_SIZE 128
hideakitai 3:a56553e46a9a 33 #else
hideakitai 3:a56553e46a9a 34 #define MSGPACK_ZBUFFER_INIT_SIZE 8192
hideakitai 3:a56553e46a9a 35 #endif
hideakitai 0:3f9dbf1e2cb0 36 #endif
hideakitai 0:3f9dbf1e2cb0 37
hideakitai 0:3f9dbf1e2cb0 38 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 39
hideakitai 0:3f9dbf1e2cb0 40 /// @cond
hideakitai 0:3f9dbf1e2cb0 41 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 42 /// @endcond
hideakitai 0:3f9dbf1e2cb0 43
hideakitai 0:3f9dbf1e2cb0 44 class zbuffer {
hideakitai 0:3f9dbf1e2cb0 45 public:
hideakitai 0:3f9dbf1e2cb0 46 zbuffer(int level = Z_DEFAULT_COMPRESSION,
hideakitai 0:3f9dbf1e2cb0 47 size_t init_size = MSGPACK_ZBUFFER_INIT_SIZE)
hideakitai 0:3f9dbf1e2cb0 48 : m_data(nullptr), m_init_size(init_size)
hideakitai 0:3f9dbf1e2cb0 49 {
hideakitai 0:3f9dbf1e2cb0 50 m_stream.zalloc = Z_NULL;
hideakitai 0:3f9dbf1e2cb0 51 m_stream.zfree = Z_NULL;
hideakitai 0:3f9dbf1e2cb0 52 m_stream.opaque = Z_NULL;
hideakitai 0:3f9dbf1e2cb0 53 m_stream.next_out = Z_NULL;
hideakitai 0:3f9dbf1e2cb0 54 m_stream.avail_out = 0;
hideakitai 0:3f9dbf1e2cb0 55 if(deflateInit(&m_stream, level) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 56 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 57 }
hideakitai 0:3f9dbf1e2cb0 58 }
hideakitai 0:3f9dbf1e2cb0 59
hideakitai 0:3f9dbf1e2cb0 60 ~zbuffer()
hideakitai 0:3f9dbf1e2cb0 61 {
hideakitai 0:3f9dbf1e2cb0 62 deflateEnd(&m_stream);
hideakitai 0:3f9dbf1e2cb0 63 ::free(m_data);
hideakitai 0:3f9dbf1e2cb0 64 }
hideakitai 0:3f9dbf1e2cb0 65
hideakitai 0:3f9dbf1e2cb0 66 public:
hideakitai 0:3f9dbf1e2cb0 67 void write(const char* buf, size_t len)
hideakitai 0:3f9dbf1e2cb0 68 {
hideakitai 0:3f9dbf1e2cb0 69 m_stream.next_in = reinterpret_cast<Bytef*>(const_cast<char*>(buf));
hideakitai 0:3f9dbf1e2cb0 70 m_stream.avail_in = len;
hideakitai 0:3f9dbf1e2cb0 71
hideakitai 0:3f9dbf1e2cb0 72 while(m_stream.avail_in > 0) {
hideakitai 0:3f9dbf1e2cb0 73 if(m_stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
hideakitai 0:3f9dbf1e2cb0 74 if(!expand()) {
hideakitai 0:3f9dbf1e2cb0 75 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 76 }
hideakitai 0:3f9dbf1e2cb0 77 }
hideakitai 0:3f9dbf1e2cb0 78
hideakitai 0:3f9dbf1e2cb0 79 if(deflate(&m_stream, Z_NO_FLUSH) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 80 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 81 }
hideakitai 0:3f9dbf1e2cb0 82 }
hideakitai 0:3f9dbf1e2cb0 83 }
hideakitai 0:3f9dbf1e2cb0 84
hideakitai 0:3f9dbf1e2cb0 85 char* flush()
hideakitai 0:3f9dbf1e2cb0 86 {
hideakitai 0:3f9dbf1e2cb0 87 while(true) {
hideakitai 0:3f9dbf1e2cb0 88 switch(deflate(&m_stream, Z_FINISH)) {
hideakitai 0:3f9dbf1e2cb0 89 case Z_STREAM_END:
hideakitai 0:3f9dbf1e2cb0 90 return m_data;
hideakitai 0:3f9dbf1e2cb0 91 case Z_OK:
hideakitai 0:3f9dbf1e2cb0 92 if(!expand()) {
hideakitai 0:3f9dbf1e2cb0 93 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 94 }
hideakitai 0:3f9dbf1e2cb0 95 break;
hideakitai 0:3f9dbf1e2cb0 96 default:
hideakitai 0:3f9dbf1e2cb0 97 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 98 }
hideakitai 0:3f9dbf1e2cb0 99 }
hideakitai 0:3f9dbf1e2cb0 100 }
hideakitai 0:3f9dbf1e2cb0 101
hideakitai 0:3f9dbf1e2cb0 102 char* data()
hideakitai 0:3f9dbf1e2cb0 103 {
hideakitai 0:3f9dbf1e2cb0 104 return m_data;
hideakitai 0:3f9dbf1e2cb0 105 }
hideakitai 0:3f9dbf1e2cb0 106
hideakitai 0:3f9dbf1e2cb0 107 const char* data() const
hideakitai 0:3f9dbf1e2cb0 108 {
hideakitai 0:3f9dbf1e2cb0 109 return m_data;
hideakitai 0:3f9dbf1e2cb0 110 }
hideakitai 0:3f9dbf1e2cb0 111
hideakitai 0:3f9dbf1e2cb0 112 size_t size() const
hideakitai 0:3f9dbf1e2cb0 113 {
hideakitai 0:3f9dbf1e2cb0 114 return reinterpret_cast<char*>(m_stream.next_out) - m_data;
hideakitai 0:3f9dbf1e2cb0 115 }
hideakitai 0:3f9dbf1e2cb0 116
hideakitai 0:3f9dbf1e2cb0 117 void reset()
hideakitai 0:3f9dbf1e2cb0 118 {
hideakitai 0:3f9dbf1e2cb0 119 if(deflateReset(&m_stream) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 120 throw std::bad_alloc();
hideakitai 0:3f9dbf1e2cb0 121 }
hideakitai 0:3f9dbf1e2cb0 122 reset_buffer();
hideakitai 0:3f9dbf1e2cb0 123 }
hideakitai 0:3f9dbf1e2cb0 124
hideakitai 0:3f9dbf1e2cb0 125 void reset_buffer()
hideakitai 0:3f9dbf1e2cb0 126 {
hideakitai 0:3f9dbf1e2cb0 127 m_stream.avail_out += reinterpret_cast<char*>(m_stream.next_out) - m_data;
hideakitai 0:3f9dbf1e2cb0 128 m_stream.next_out = reinterpret_cast<Bytef*>(m_data);
hideakitai 0:3f9dbf1e2cb0 129 }
hideakitai 0:3f9dbf1e2cb0 130
hideakitai 0:3f9dbf1e2cb0 131 char* release_buffer()
hideakitai 0:3f9dbf1e2cb0 132 {
hideakitai 0:3f9dbf1e2cb0 133 char* tmp = m_data;
hideakitai 0:3f9dbf1e2cb0 134 m_data = nullptr;
hideakitai 0:3f9dbf1e2cb0 135 m_stream.next_out = nullptr;
hideakitai 0:3f9dbf1e2cb0 136 m_stream.avail_out = 0;
hideakitai 0:3f9dbf1e2cb0 137 return tmp;
hideakitai 0:3f9dbf1e2cb0 138 }
hideakitai 0:3f9dbf1e2cb0 139
hideakitai 0:3f9dbf1e2cb0 140 private:
hideakitai 0:3f9dbf1e2cb0 141 bool expand()
hideakitai 0:3f9dbf1e2cb0 142 {
hideakitai 0:3f9dbf1e2cb0 143 size_t used = reinterpret_cast<char*>(m_stream.next_out) - m_data;
hideakitai 0:3f9dbf1e2cb0 144 size_t csize = used + m_stream.avail_out;
hideakitai 0:3f9dbf1e2cb0 145 size_t nsize = (csize == 0) ? m_init_size : csize * 2;
hideakitai 0:3f9dbf1e2cb0 146
hideakitai 0:3f9dbf1e2cb0 147 char* tmp = static_cast<char*>(::realloc(m_data, nsize));
hideakitai 0:3f9dbf1e2cb0 148 if(tmp == nullptr) {
hideakitai 0:3f9dbf1e2cb0 149 return false;
hideakitai 0:3f9dbf1e2cb0 150 }
hideakitai 0:3f9dbf1e2cb0 151
hideakitai 0:3f9dbf1e2cb0 152 m_data = tmp;
hideakitai 0:3f9dbf1e2cb0 153 m_stream.next_out = reinterpret_cast<Bytef*>(tmp + used);
hideakitai 0:3f9dbf1e2cb0 154 m_stream.avail_out = nsize - used;
hideakitai 0:3f9dbf1e2cb0 155
hideakitai 0:3f9dbf1e2cb0 156 return true;
hideakitai 0:3f9dbf1e2cb0 157 }
hideakitai 0:3f9dbf1e2cb0 158 #if defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 159 private:
hideakitai 0:3f9dbf1e2cb0 160 zbuffer(const zbuffer&);
hideakitai 0:3f9dbf1e2cb0 161 zbuffer& operator=(const zbuffer&);
hideakitai 0:3f9dbf1e2cb0 162 #else // defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 163 zbuffer(const zbuffer&) = delete;
hideakitai 0:3f9dbf1e2cb0 164 zbuffer& operator=(const zbuffer&) = delete;
hideakitai 0:3f9dbf1e2cb0 165 #endif // defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 166
hideakitai 0:3f9dbf1e2cb0 167 private:
hideakitai 0:3f9dbf1e2cb0 168 z_stream m_stream;
hideakitai 0:3f9dbf1e2cb0 169 char* m_data;
hideakitai 0:3f9dbf1e2cb0 170 size_t m_init_size;
hideakitai 0:3f9dbf1e2cb0 171 };
hideakitai 0:3f9dbf1e2cb0 172
hideakitai 0:3f9dbf1e2cb0 173 /// @cond
hideakitai 0:3f9dbf1e2cb0 174 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 175 /// @endcond
hideakitai 0:3f9dbf1e2cb0 176
hideakitai 0:3f9dbf1e2cb0 177 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 178
hideakitai 0:3f9dbf1e2cb0 179 #endif /* msgpack/zbuffer.hpp */