LPDRMETA with_dr_store::t_meta(const char * libname, const char * metaname) { LPDRMETALIB lib = t_metalib(libname); if (lib == NULL) return NULL; LPDRMETA meta = dr_lib_find_meta_by_name(lib, metaname); EXPECT_TRUE(meta) << "dr_store " << libname << " have no meta " << metaname; return meta; }
int WriteTest::write(const char * typeName, const void * data, size_t data_size) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, typeName); EXPECT_TRUE(meta) << "get meta " << typeName << " error!"; t_elist_clear(); int r = dr_pbuf_write(m_buffer, sizeof(m_buffer), data, data_size, meta, t_em()); m_bufffer_len = r >= 0 ? (size_t)r : 0; return r; }
int ReadTest::read(const char * encodeTypeName, const char * decodeTypeName, const char * defs) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, encodeTypeName); EXPECT_TRUE(meta) << "get meta " << encodeTypeName << " error!"; char buf[1024]; int r = dr_cfg_read(buf, sizeof(buf), t_cfg_parse(defs), meta, 0, t_em()); EXPECT_GT(r, 0); return read(decodeTypeName, buf, r); }
int WriteTest::write(const char * typeName, const char * defs) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, typeName); EXPECT_TRUE(meta) << "get meta " << typeName << " error!"; char buf[1024]; int r = dr_cfg_read(buf, sizeof(buf), t_cfg_parse(defs), meta, 0, t_em()); EXPECT_GT(r, 0); return write(typeName, buf, r); }
int PrintTest::print(const void * data, const char * typeName) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, typeName); EXPECT_TRUE(meta) << "get meta " << typeName << " error!"; t_elist_clear(); struct write_stream_buffer stream = CPE_WRITE_STREAM_BUFFER_INITIALIZER(&m_buffer); int r = dr_json_print((write_stream_t)&stream, data, meta, DR_JSON_PRINT_BEAUTIFY, t_em()); stream_putc((write_stream_t)&stream, 0); return r; }
int ReadTest::read(const char * decodeTypeName, const void * data, size_t data_size) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, decodeTypeName); EXPECT_TRUE(meta) << "get meta " << decodeTypeName << " error!"; t_elist_clear(); char buf[1024]; int len = dr_pbuf_write(buf, sizeof(buf), data, data_size, meta, t_em()); EXPECT_GT(len, 0); int r = dr_pbuf_read(m_result_buffer, sizeof(m_result_buffer), buf, len, meta, t_em()); m_result_bufffer_len = r; m_result_meta = meta; return r; }
int ReadTest::read(const char * data, const char * typeName, int policy, size_t capacity) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, typeName); EXPECT_TRUE(meta) << "get meta " << typeName << " error!"; if (meta == 0) return -1; if (capacity == 0) { capacity = dr_meta_size(meta); } cfg_t input = t_cfg_parse(data); EXPECT_TRUE(input) << "parse input to cfg fail!"; if (input == 0) return -1; t_elist_clear(); mem_buffer_clear(&m_buffer); return dr_cfg_read( mem_buffer_alloc(&m_buffer, capacity), capacity, input, meta, policy, t_em()); }
Meta const * findMeta(const char * name) const { return (Meta const *)dr_lib_find_meta_by_name(*this, name); }
static void cpe_dr_generate_h_metas(write_stream_t stream, dr_metalib_source_t source, cpe_dr_generate_ctx_t ctx) { struct dr_metalib_source_element_it element_it; dr_metalib_source_element_t element; int curent_pack; int packed; curent_pack = 0; packed = 0; dr_metalib_source_elements(&element_it, source); while((element = dr_metalib_source_element_next(&element_it))) { LPDRMETA meta; int entry_pos; if (dr_metalib_source_element_type(element) != dr_metalib_source_element_type_meta) continue; meta = dr_lib_find_meta_by_name(ctx->m_metalib, dr_metalib_source_element_name(element)); if (meta == NULL) continue; if (dr_meta_align(meta) != curent_pack) { stream_printf(stream, "\n#pragma pack(1)\n"); curent_pack = dr_meta_align(meta); packed = 1; } stream_printf(stream, "\nstruct %s {", dr_meta_name(meta)); for(entry_pos = 0; entry_pos < dr_meta_entry_num(meta); ++entry_pos) { LPDRMETAENTRY entry = dr_meta_entry_at(meta, entry_pos); stream_printf(stream, "\n"); stream_printf(stream, " "); switch(dr_entry_type(entry)) { case CPE_DR_TYPE_UNION: case CPE_DR_TYPE_STRUCT: { LPDRMETA ref_meta; ref_meta = dr_entry_ref_meta(entry); if (ref_meta == NULL) continue; stream_printf(stream, "%s %s %s", dr_type_name(dr_entry_type(entry)), dr_meta_name(ref_meta), dr_entry_name(entry)); break; } case CPE_DR_TYPE_STRING: { stream_printf(stream, "char %s[%d]", dr_entry_name(entry), dr_entry_size(entry)); break; } default: { stream_printf(stream, "%s_t %s", dr_type_name(dr_entry_type(entry)), dr_entry_name(entry)); break; } } if (dr_entry_array_count(entry) != 1) { stream_printf(stream, "[%d]", dr_entry_array_count(entry) < 1 ? 1 : dr_entry_array_count(entry)); } stream_printf(stream, ";"); } stream_printf(stream, "\n};\n"); } if (packed) { stream_printf(stream, "\n#pragma pack()\n\n"); } }