getdns_list* GNUtil::convertToList(Local<Array> array) { uint32_t len = array->Length(); getdns_list* result = getdns_list_create(); for (uint32_t i = 0; i < len; ++i) { size_t idx = getdns_list_get_length(result, &idx); Local<Value> val = array->Get(i); GetdnsType type = getGetdnsType(val); switch (type) { case IntType: getdns_list_set_int(result, idx, val->ToUint32()->Value()); break; case BoolType: if (val->IsTrue()) { getdns_list_set_int(result, idx, GETDNS_EXTENSION_TRUE); } else { getdns_list_set_int(result, idx, GETDNS_EXTENSION_FALSE); } break; case StringType: { struct getdns_bindata strdata; String::Utf8Value utf8Str(val->ToString()); int len = utf8Str.length(); strdata.data = (uint8_t*) *utf8Str; strdata.size = len; getdns_list_set_bindata(result, idx, &strdata); } break; case BinDataType: { struct getdns_bindata bdata; bdata.data = (uint8_t*) node::Buffer::Data(val); bdata.size = node::Buffer::Length(val); getdns_list_set_bindata(result, idx, &bdata); } break; case ListType: { Local<Array> subArray = Local<Array>::Cast(val); struct getdns_list* sublist = GNUtil::convertToList(subArray); getdns_list_set_list(result, idx, sublist); getdns_list_destroy(sublist); } break; case DictType: { Local<Object> subObj = val->ToObject(); struct getdns_dict* subdict = GNUtil::convertToDict(subObj); if (subdict) { getdns_list_set_dict(result, idx, subdict); getdns_dict_destroy(subdict); } } break; default: break; } } return result; }
/** * test the list get and set routines */ void tst_listsetget(void) { char msg[TSTMSGBUF]; size_t index = 0; getdns_return_t retval; uint32_t ans_int; struct getdns_list *list = NULL; struct getdns_list *new_list = NULL; struct getdns_list *ans_list = NULL; tstmsg_case_begin("tst_listsetget"); list = getdns_list_create(); /* test get function against empty list and with bogus params */ tstmsg_case_msg("getdns_list_get_list() empty list"); retval = getdns_list_get_list(NULL, index, &ans_list); snprintf(msg, sizeof(msg), "getdns_list_get_list(NULL, index, &ans_list),retval = %d", retval); tstmsg_case_msg(msg); retval = getdns_list_get_list(list, index, NULL); snprintf(msg, sizeof(msg), "getdns_list_get_list(list, index, NULL),retval = %d", retval); tstmsg_case_msg(msg); tstmsg_case_msg("getdns_list_get_list(list, 0, &ans_list)"); retval = getdns_list_get_list(list, 0, &ans_list); snprintf(msg, sizeof(msg), "getdns_list_get_list,retval = %d", retval); tstmsg_case_msg(msg); tstmsg_case_msg("getdns_list_get_list(list, 1, &ans_list)"); retval = getdns_list_get_list(list, 1, &ans_list); snprintf(msg, sizeof(msg), "getdns_list_get_list,retval = %d", retval); tstmsg_case_msg(msg); /* test set function against empty list with bogus params */ tstmsg_case_msg("getdns_list_set_list(list, -1, ans_list)"); retval = getdns_list_set_list(list, -1, NULL); snprintf(msg, sizeof(msg), "getdns_list_set_list,retval = %d", retval); tstmsg_case_msg(msg); tstmsg_case_msg("getdns_list_set_list(list, 1, ans_list)"); retval = getdns_list_set_list(list, 1, NULL); snprintf(msg, sizeof(msg), "getdns_list_set_list,retval = %d", retval); tstmsg_case_msg(msg); /* test set and get legitimate use case */ new_list = getdns_list_create(); getdns_list_set_int(new_list, index, 42); getdns_list_set_list(list, index, new_list); retval = getdns_list_get_list(list, index, &ans_list); getdns_list_get_int(ans_list, 0, &ans_int); snprintf(msg, sizeof(msg), "getdns_list_set/get_list,retval = %d, ans[0] = %d", retval, ans_int); tstmsg_case_msg(msg); getdns_list_destroy(new_list); getdns_list_destroy(list); tstmsg_case_end(); return; } /* tst_listsetget */
getdns_return_t _getdns_list_append_list(getdns_list *list, const getdns_list *child_list) { if (!list) return GETDNS_RETURN_INVALID_PARAMETER; return getdns_list_set_list(list, list->numinuse, child_list); }