2009-02-15 09:09:56 +00:00
|
|
|
#ifndef MSGPACK_UNPACK_HPP__
|
|
|
|
#define MSGPACK_UNPACK_HPP__
|
|
|
|
|
|
|
|
#include "msgpack/object.hpp"
|
|
|
|
#include "msgpack/zone.hpp"
|
|
|
|
#include <stdexcept>
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
#ifndef MSGPACK_UNPACKER_INITIAL_BUFFER_SIZE
|
|
|
|
#define MSGPACK_UNPACKER_INITIAL_BUFFER_SIZE 8*1024
|
|
|
|
#endif
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
namespace msgpack {
|
|
|
|
|
|
|
|
|
|
|
|
struct unpack_error : public std::runtime_error {
|
|
|
|
unpack_error(const std::string& msg) :
|
|
|
|
std::runtime_error(msg) { }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class unpacker {
|
|
|
|
public:
|
2009-02-15 09:09:56 +00:00
|
|
|
unpacker();
|
2009-02-15 09:09:56 +00:00
|
|
|
~unpacker();
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
public:
|
2009-02-15 09:09:56 +00:00
|
|
|
void reserve_buffer(size_t len);
|
|
|
|
void* buffer();
|
|
|
|
size_t buffer_capacity() const;
|
|
|
|
void buffer_consumed(size_t len);
|
|
|
|
bool execute();
|
|
|
|
zone* release_zone(); // never throw
|
2009-02-15 09:09:56 +00:00
|
|
|
object data();
|
|
|
|
void reset();
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
private:
|
2009-02-15 09:09:56 +00:00
|
|
|
zone* m_zone;
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
struct context;
|
|
|
|
context* m_ctx;
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
void* m_buffer;
|
|
|
|
size_t m_used;
|
|
|
|
size_t m_free;
|
|
|
|
size_t m_off;
|
|
|
|
void expand_buffer(size_t len);
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
private:
|
|
|
|
unpacker(const unpacker&);
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
public:
|
|
|
|
static object unpack(const void* data, size_t len, zone& z);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
inline void unpacker::reserve_buffer(size_t len)
|
|
|
|
{
|
|
|
|
if(m_free >= len) { return; }
|
|
|
|
expand_buffer(len);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void* unpacker::buffer()
|
|
|
|
{ return (void*)(((char*)m_buffer)+m_used); }
|
|
|
|
|
|
|
|
inline size_t unpacker::buffer_capacity() const
|
|
|
|
{ return m_free; }
|
|
|
|
|
|
|
|
inline void unpacker::buffer_consumed(size_t len)
|
|
|
|
{
|
|
|
|
m_used += len;
|
|
|
|
m_free -= len;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
inline object unpack(const void* data, size_t len, zone& z)
|
|
|
|
{
|
|
|
|
return unpacker::unpack(data, len, z);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace msgpack
|
|
|
|
|
|
|
|
#endif /* msgpack/unpack.hpp */
|
|
|
|
|