2009-02-15 09:09:56 +00:00
|
|
|
#include <iostream>
|
2009-02-15 09:09:56 +00:00
|
|
|
#include <string>
|
2009-02-15 09:09:57 +00:00
|
|
|
//#include <msgpack/unpack.hpp>
|
|
|
|
//#include <msgpack/pack.hpp>
|
|
|
|
#include <msgpack.hpp>
|
2009-02-15 09:09:56 +00:00
|
|
|
#include <sstream>
|
2009-02-15 09:09:57 +00:00
|
|
|
#include <memory>
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
class checker {
|
|
|
|
public:
|
|
|
|
void check(const char* d, size_t len, msgpack::object should) {
|
2009-02-15 09:09:56 +00:00
|
|
|
using msgpack::object;
|
2009-02-15 09:09:56 +00:00
|
|
|
try {
|
|
|
|
std::cout << "----" << std::endl;
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
object o;
|
2009-02-15 09:09:56 +00:00
|
|
|
try {
|
|
|
|
o = msgpack::unpack(d, len, m_zone);
|
|
|
|
} catch (std::runtime_error& e) {
|
|
|
|
std::cout << should << std::endl;
|
|
|
|
std::cout << "**" << e.what() << "**" << std::endl;
|
|
|
|
return;
|
|
|
|
}
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
std::cout << o << std::endl;
|
|
|
|
if(o != should) {
|
|
|
|
std::cout << "** TEST FAILED **" << std::endl;
|
|
|
|
}
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
try {
|
2009-02-15 09:09:57 +00:00
|
|
|
std::stringstream s;
|
2009-02-15 09:09:56 +00:00
|
|
|
msgpack::pack(s, o);
|
2009-02-15 09:09:57 +00:00
|
|
|
std::string str(s.str());
|
|
|
|
object ro = msgpack::unpack(str.data(), str.size(), m_zone);
|
2009-02-15 09:09:56 +00:00
|
|
|
if(ro != o) { throw std::runtime_error("NOT MATCH"); }
|
|
|
|
} catch (std::runtime_error& e) {
|
|
|
|
std::cout << "** REUNPACK FAILED **" << std::endl;
|
|
|
|
std::cout << e.what() << std::endl;
|
|
|
|
} catch (...) {
|
|
|
|
std::cout << "** REUNPACK FAILED **" << std::endl;
|
|
|
|
std::cout << "unknown error" << std::endl;
|
|
|
|
}
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
} catch (...) { m_zone.clear(); throw; }
|
|
|
|
m_zone.clear();
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
msgpack::zone m_zone;
|
|
|
|
};
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
2009-02-15 09:09:56 +00:00
|
|
|
checker c;
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
{ // SimpleValue
|
|
|
|
msgpack::zone z;
|
|
|
|
const char d[] = {
|
|
|
|
0x93, 0xc0, 0xc2, 0xc3,
|
|
|
|
};
|
|
|
|
c.check(d, sizeof(d),
|
2009-02-15 09:09:56 +00:00
|
|
|
z.narray(
|
2009-02-15 09:09:56 +00:00
|
|
|
z.nnil(), z.nfalse(), z.ntrue()
|
2009-02-15 09:09:56 +00:00
|
|
|
)
|
2009-02-15 09:09:56 +00:00
|
|
|
);
|
|
|
|
}
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
{ // Fixnum
|
|
|
|
msgpack::zone z;
|
|
|
|
const char d[] = {
|
|
|
|
0x92,
|
|
|
|
0x93, 0x00, 0x40, 0x7f,
|
|
|
|
0x93, 0xe0, 0xf0, 0xff,
|
|
|
|
};
|
|
|
|
c.check(d, sizeof(d),
|
2009-02-15 09:09:56 +00:00
|
|
|
z.narray(
|
|
|
|
z.narray(
|
2009-02-15 09:09:56 +00:00
|
|
|
z.nu8(0),
|
|
|
|
z.nu8(64),
|
|
|
|
z.nu8(127)
|
|
|
|
),
|
|
|
|
z.narray(
|
|
|
|
z.ni8(-32),
|
|
|
|
z.ni8(-16),
|
|
|
|
z.ni8(-1)
|
2009-02-15 09:09:56 +00:00
|
|
|
)
|
|
|
|
)
|
2009-02-15 09:09:56 +00:00
|
|
|
);
|
|
|
|
}
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
{ // FixArray
|
|
|
|
msgpack::zone z;
|
|
|
|
const char d[] = {
|
|
|
|
0x92,
|
|
|
|
0x90,
|
|
|
|
0x91,
|
|
|
|
0x91, 0xc0,
|
|
|
|
};
|
|
|
|
c.check(d, sizeof(d),
|
|
|
|
z.narray(
|
|
|
|
z.narray(),
|
|
|
|
z.narray(
|
|
|
|
z.narray(
|
|
|
|
z.nnil()
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
{ // FixRaw
|
|
|
|
msgpack::zone z;
|
|
|
|
const char d[] = {
|
|
|
|
0x94,
|
|
|
|
0xa0,
|
|
|
|
0xa1, 'a',
|
|
|
|
0xa2, 'b', 'c',
|
|
|
|
0xa3, 'd', 'e', 'f',
|
|
|
|
};
|
|
|
|
c.check(d, sizeof(d),
|
|
|
|
z.narray(
|
2009-02-15 09:09:56 +00:00
|
|
|
z.nraw_ref("", 0),
|
|
|
|
z.nraw_ref("a", 1),
|
|
|
|
z.nraw_ref("bc", 2),
|
|
|
|
z.nraw_ref("def", 3)
|
2009-02-15 09:09:56 +00:00
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
static const uint16_t TASK_ARRAY = 100;
|
|
|
|
static char tarray[3];
|
|
|
|
static char traw[64];
|
|
|
|
|
|
|
|
{
|
|
|
|
memset(traw, 'a', sizeof(traw));
|
|
|
|
traw[0] = 0xda;
|
|
|
|
uint16_t n = htons(sizeof(traw)-3);
|
|
|
|
traw[1] = ((char*)&n)[0];
|
|
|
|
traw[2] = ((char*)&n)[1];
|
|
|
|
|
|
|
|
msgpack::zone z;
|
|
|
|
std::cout << msgpack::unpack(traw, sizeof(traw), z) << std::endl;;
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
tarray[0] = 0xdc;
|
|
|
|
uint16_t n = htons(TASK_ARRAY);
|
|
|
|
tarray[1] = ((char*)&n)[0];
|
|
|
|
tarray[2] = ((char*)&n)[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// write message
|
|
|
|
ssize_t total_bytes = 0;
|
|
|
|
std::stringstream stream;
|
|
|
|
for(unsigned q=0; q < 10; ++q) {
|
|
|
|
stream.write(tarray, sizeof(tarray));
|
|
|
|
total_bytes += sizeof(tarray);
|
|
|
|
for(uint16_t i=0; i < TASK_ARRAY; ++i) {
|
|
|
|
stream.write(traw, sizeof(traw));
|
|
|
|
total_bytes += sizeof(traw);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
stream.seekg(0);
|
|
|
|
|
|
|
|
// reserive message
|
|
|
|
unsigned num_msg = 0;
|
|
|
|
|
|
|
|
static const size_t RESERVE_SIZE = 32;//*1024;
|
|
|
|
|
|
|
|
msgpack::unpacker upk;
|
|
|
|
while(stream.good() && total_bytes > 0) {
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
// 1. reserve buffer
|
2009-02-15 09:09:56 +00:00
|
|
|
upk.reserve_buffer(RESERVE_SIZE);
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
// 2. read data to buffer() up to buffer_capacity() bytes
|
2009-02-15 09:09:56 +00:00
|
|
|
size_t sz = stream.readsome(
|
2009-02-15 09:09:57 +00:00
|
|
|
upk.buffer(),
|
2009-02-15 09:09:56 +00:00
|
|
|
upk.buffer_capacity());
|
|
|
|
|
|
|
|
total_bytes -= sz;
|
|
|
|
std::cout << "read " << sz << " bytes to capacity "
|
|
|
|
<< upk.buffer_capacity() << " bytes"
|
|
|
|
<< std::endl;
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
// 3. specify the number of bytes actually copied
|
2009-02-15 09:09:56 +00:00
|
|
|
upk.buffer_consumed(sz);
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
// 4. repeat execute() until it returns false
|
2009-02-15 09:09:56 +00:00
|
|
|
while( upk.execute() ) {
|
|
|
|
std::cout << "message parsed" << std::endl;
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
// 5.1. take out the parsed object
|
2009-02-15 09:09:56 +00:00
|
|
|
msgpack::object o = upk.data();
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
// 5.2. the parsed object is valid until the zone is deleted
|
2009-02-15 09:09:57 +00:00
|
|
|
std::auto_ptr<msgpack::zone> pz(upk.release_zone());
|
2009-02-15 09:09:56 +00:00
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
std::cout << o << std::endl;
|
|
|
|
++num_msg;
|
2009-02-15 09:09:56 +00:00
|
|
|
|
|
|
|
// 5.3 re-initialize unpacker
|
|
|
|
upk.reset();
|
2009-02-15 09:09:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cout << "stream finished" << std::endl;
|
|
|
|
std::cout << num_msg << " messages reached" << std::endl;
|
|
|
|
}
|
|
|
|
|
2009-02-15 09:09:56 +00:00
|
|
|
return 0;
|
2009-02-15 09:09:56 +00:00
|
|
|
}
|
|
|
|
|