/**@ingroup tsk_params_group * Adds a parameter to the list of parameters. If the parameter already exist(case-insensitive), then it's value will be updated. * @param self The destination list. * @param name The name of the parameter to add. * @param value The value of the parameter to add. * @retval Zero if succeed and -1 otherwise. */ int tsk_params_add_param(tsk_params_L_t **self, const char* name, const char* value) { tsk_param_t *param; if(!self || !name) { TSK_DEBUG_ERROR("Invalid parameter"); return -1; } if(!*self){ *self = tsk_list_create(); } if((param = (tsk_param_t*)tsk_params_get_param_by_name(*self, name))){ tsk_strupdate(¶m->value, value); /* Already exist ==> update the value. */ } else{ param = tsk_param_create(name, value); tsk_list_push_back_data(*self, (void**)¶m); } return 0; }
// @param str e.g. "1 1 udp 1 192.168.196.1 57806 typ host name video_rtcp network_name {0C0137CC-DB78-46B6-9B6C-7E097FFA79FE} username StFEVThMK2DHThkv password qkhKUDr4WqKRwZTo generation 0" tnet_ice_candidate_t* tnet_ice_candidate_parse(const char* str) { char *v, *copy; int32_t k; tnet_ice_candidate_t* candidate; if(tsk_strnullORempty(str)){ TSK_DEBUG_ERROR("Invalid parameter"); return tsk_null; } if(!(candidate = tsk_object_new(&tnet_ice_candidate_def_s))){ TSK_DEBUG_ERROR("Failed to create candidate"); return tsk_null; } k = 0; copy = tsk_strdup(str); v = strtok(copy, " "); while(v){ switch(k){ case 0: { memcpy(candidate->foundation, v, TSK_MIN(tsk_strlen(v), sizeof(candidate->foundation))); break; } case 1: { candidate->comp_id = atoi(v); break; } case 2: { candidate->transport_str = tsk_strdup(v); break; } case 3: { candidate->priority = atoi(v); break; } case 4: { memcpy(candidate->connection_addr, v, TSK_MIN(tsk_strlen(v), sizeof(candidate->connection_addr))); break; } case 5: { tnet_family_t family; candidate->port = atoi(v); family = tnet_get_family(candidate->connection_addr, candidate->port); candidate->transport_e = _tnet_ice_candidate_get_transport_type((family == AF_INET6), candidate->transport_str); break; } case 6: { v = strtok(tsk_null, " "); tsk_strupdate(&candidate->cand_type_str, v); candidate->type_e = _tnet_ice_candtype_get_transport_type(v); break; } default: { const char* name = v; const char* value = (v = strtok(tsk_null, " ")); tsk_param_t* param = tsk_param_create(name, value); if(param){ tsk_list_push_back_data(candidate->extension_att_list, (void**)¶m); } break; } } ++k; v = strtok(tsk_null, " "); } if(k < 6){ TSK_DEBUG_ERROR("Failed to parse: %s", str); TSK_OBJECT_SAFE_FREE(candidate); } TSK_FREE(copy); return candidate; }
/**@ingroup tsk_params_group */ tsk_param_t* tsk_param_create_null() { return tsk_param_create(tsk_null, tsk_null); }