static qeocore_type_t *type_unnest_register(qeo_factory_t *factory) { qeocore_type_t *outer = NULL; qeocore_type_t *member = NULL; // the outer struct assert(NULL != (outer = qeocore_type_struct_new("org.qeo.test.NestedTests"))); assert(NULL != (member = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT32))); assert(QEO_OK == qeocore_type_struct_add(outer, member, "outer_int32", &_outer_int32_id, QEOCORE_FLAG_KEY)); qeocore_type_free(member); assert(NULL != (member = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT8))); assert(QEO_OK == qeocore_type_struct_add(outer, member, "outer_int8", &_outer_int8_id, QEOCORE_FLAG_NONE)); qeocore_type_free(member); assert(NULL != (member = qeocore_type_string_new(0))); assert(QEO_OK == qeocore_type_struct_add(outer, member, "outer_string", &_outer_string_id, QEOCORE_FLAG_NONE)); qeocore_type_free(member); assert(NULL != (member = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT16))); assert(QEO_OK == qeocore_type_struct_add(outer, member, "outer_int16", &_outer_int16_id, QEOCORE_FLAG_NONE)); qeocore_type_free(member); assert(NULL != (member = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT64))); assert(QEO_OK == qeocore_type_struct_add(outer, member, "outer_int64", &_outer_int64_id, QEOCORE_FLAG_NONE)); qeocore_type_free(member); assert(QEO_OK == qeocore_type_register(factory, outer, "org.qeo.test.QDMTestDynType")); return outer; }
END_TEST START_TEST(test_dynamic_type) { qeocore_type_t *structure = NULL, *sequence = NULL, *string = NULL, *primitive = NULL; qeocore_member_id_t id; /* init */ stub_init(); /* test */ fail_unless(NULL != (structure = qeocore_type_struct_new("a_dynamic_struct"))); fail_unless(NULL != (string = qeocore_type_string_new(0))); fail_unless(NULL != (primitive = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT32))); fail_unless(NULL != (sequence = qeocore_type_sequence_new(primitive))); qeocore_type_free(primitive); id = QEOCORE_MEMBER_ID_DEFAULT; fail_unless(QEO_OK == qeocore_type_struct_add(structure, string, "a_string", &id, QEOCORE_FLAG_KEY)); qeocore_type_free(string); id = QEOCORE_MEMBER_ID_DEFAULT; fail_unless(QEO_OK == qeocore_type_struct_add(structure, sequence, "a_sequence", &id, QEOCORE_FLAG_NONE)); qeocore_type_free(sequence); /* clean up */ qeocore_type_free(structure); stub_fini(); }
static qeocore_type_t *type_register(qeo_factory_t *factory) { qeocore_type_t *bigdata = NULL; qeocore_type_t *primitive = NULL; qeocore_type_t *sequence = NULL; assert(NULL != (bigdata = qeocore_type_struct_new("org.qeo.test.bigdata"))); assert(NULL != (primitive = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT32))); assert(QEO_OK == qeocore_type_struct_add(bigdata, primitive, "size", &_size_id, QEOCORE_FLAG_KEY)); qeocore_type_free(primitive); assert(NULL != (primitive = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT8))); assert(NULL != (sequence = qeocore_type_sequence_new(primitive))); assert(QEO_OK == qeocore_type_struct_add(bigdata, sequence, "buf", &_buf_id, QEOCORE_FLAG_NONE)); qeocore_type_free(sequence); qeocore_type_free(primitive); assert(QEO_OK == qeocore_type_register(factory, bigdata, "org.qeo.test.bigdata")); return bigdata; }
static qeocore_type_t *build_member_type(const qeo_factory_t *factory, json_t *member) { qeocore_type_t *memberType = NULL; qeocore_typecode_t qeoTypeCode; json_t *member_type = json_object_get(member, KEY_TYPE); if (!((NULL != member_type) && (json_is_string(member_type)))) { qeo_log_e("Could not retrieve type"); return memberType; } const char *jsonTypeCode = json_string_value(member_type); do { if (!strcmp(jsonTypeCode, "boolean")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_BOOLEAN); qeoTypeCode = QEOCORE_TYPECODE_BOOLEAN; } else if (!strcmp(jsonTypeCode, "byte")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT8); qeoTypeCode = QEOCORE_TYPECODE_INT8; } else if (!strcmp(jsonTypeCode, "int16")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT16); qeoTypeCode = QEOCORE_TYPECODE_INT16; } else if (!strcmp(jsonTypeCode, "int32")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT32); qeoTypeCode = QEOCORE_TYPECODE_INT32; } else if (!strcmp(jsonTypeCode, "int64")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_INT64); qeoTypeCode = QEOCORE_TYPECODE_INT64; } else if (!strcmp(jsonTypeCode, "float32")) { memberType = qeocore_type_primitive_new(QEOCORE_TYPECODE_FLOAT32); qeoTypeCode = QEOCORE_TYPECODE_FLOAT32; } else if (!strcmp(jsonTypeCode, "string")) { size_t size = 0; memberType = qeocore_type_string_new(size); qeoTypeCode = QEOCORE_TYPECODE_STRING; } else if (!strcmp(jsonTypeCode, "object")) { json_t *item = json_object_get(member, KEY_ITEM); if ((NULL == item) || !json_is_object(item)) { qeo_log_e("Could not find item"); break; } memberType = build_object(factory, item); qeoTypeCode = QEOCORE_TYPECODE_STRUCT; } else if (!strcmp(jsonTypeCode, "array")) { json_t *items = json_object_get(member, KEY_ITEMS); if ((NULL == items) || !json_is_object(items)) { qeo_log_e("Could not find items"); break; } qeocore_type_t *elemtype = build_member_type(factory, items); if (elemtype == NULL){ qeo_log_e("Could not build member for array"); break; } memberType = qeocore_type_sequence_new(elemtype); qeocore_type_free(elemtype); qeoTypeCode = QEOCORE_TYPECODE_SEQUENCE; } else if (!strcmp(jsonTypeCode, "enum")){ json_t *item = json_object_get(member, KEY_ITEM); if ((NULL == item) || !json_is_object(item)) { qeo_log_e("Could not find item"); break; } memberType = build_enum(factory, item); qeoTypeCode = QEOCORE_TYPECODE_ENUM; } else { qeo_log_e("Unsupported jsonTypeCode %s", jsonTypeCode); } } while (0); if (NULL == memberType) { qeo_log_e("Could not make type (%s)", jsonTypeCode); return memberType; } json_object_set_new(member, KEY_QEO_TYPE_CODE, json_integer(qeoTypeCode)); return memberType; }