static kvpair_t *grok_form(xmpp_stanza_t *fields) { kvpair_t *rv = NULL; /* walk the field peers and grab their values and stuff */ while (fields) { if (xmpp_stanza_is_tag(fields)) { char* k = xmpp_stanza_get_attribute(fields, "var"); char **vals = get_specific_form_values(fields, k); kvpair_t* thispair = mk_kvpair(k, vals); free_string_list(vals); thispair->next = rv; rv = thispair; } fields = xmpp_stanza_get_next(fields); } return rv; }
static sdvp_WriteParam_t* _CreateWriteParam (xmpp_stanza_t * params) { int expectedParams, nVarParams = 0; sdvp_WriteParam_t* rv = NULL; int i = 0, j = 0, expectedDataElementsInArray; bool elementNotFund = false; xmpp_stanza_t *structure = NULL, *member = NULL, *value = NULL, *type = NULL; xmpp_stanza_t *name = NULL, *array, *arrayEntry; char *text, *textname; structure = _GetRpcStructureElementFromParams(params); if (structure == NULL ) { return NULL ; } // Get the number of elements // expectedParams = _FindNumberOfParams(params); if (expectedParams > 1) { nVarParams = expectedParams - 1; } else { // TODO: This should result in a ServiceError as minimum two is expected } rv = _InitiateWriteParameters(nVarParams); for (member = xmpp_stanza_get_children(structure); member && !elementNotFund && (i < expectedParams); member = xmpp_stanza_get_next(member)) { if (xmpp_stanza_get_name(member) && strcmp(xmpp_stanza_get_name(member), "member") == 0) { if (!(name = xmpp_stanza_get_child_by_name(member, "name"))) { _FreeWriteParameters(rv); // TODO: Signal error back return NULL ; } name = xmpp_stanza_get_children(name); textname = xmpp_stanza_get_text(name); if (strcmp(textname, "VariableAccessSpecification") == 0) { if (!(value = xmpp_stanza_get_child_by_name(member, "value"))) { _FreeWriteParameters(rv); // TODO: Signal error back return NULL ; } if ((type = xmpp_stanza_get_child_by_name(value, "string"))) { if (xmpp_stanza_get_children(type)) { text = xmpp_stanza_get_text(type); rv->params->reference = text; } else { rv->params->reference = NULL; } } else { elementNotFund = true; } } else if (strcmp(textname, "ListOfData") == 0) { if (!(value = xmpp_stanza_get_child_by_name(member, "value"))) { _FreeWriteParameters(rv); // TODO: Signal error back return NULL ; } if (!(array = xmpp_stanza_get_child_by_name(value, "array"))) { _FreeWriteParameters(rv); // TODO: Signal error back return NULL ; } expectedDataElementsInArray = _countDataElementsInArray(array); _InitiateWriteDataParameters(rv, expectedDataElementsInArray); // array = xmpp_stanza_get_children(array); arrayEntry = xmpp_stanza_get_children(array); //HJP Why skip the first element?! // arrayEntry = xmpp_stanza_get_next(arrayEntry); for (j = 0; arrayEntry; arrayEntry = xmpp_stanza_get_next(arrayEntry)) { if (xmpp_stanza_is_tag(arrayEntry)) { if (!(value = xmpp_stanza_get_child_by_name(arrayEntry, "value"))) { _FreeWriteParameters(rv); // TODO: Signal error back return NULL ; } // MISSING: base64 if ((type = xmpp_stanza_get_child_by_name(value, "string"))) { rv->params->dataAttributeValues[j]->dataType = IEC_VISIBLE_STRING; rv->params->dataAttributeValues[j]->strValue = xmpp_stanza_get_text(type); } else if ((type = xmpp_stanza_get_child_by_name(value, "i4")) || (type = xmpp_stanza_get_child_by_name(value, "int"))) { rv->params->dataAttributeValues[j]->dataType = IEC_INT32; text = xmpp_stanza_get_text(type); rv->params->dataAttributeValues[j]->intValue = strtol(text, NULL, 10); free(text); } else if ((type = xmpp_stanza_get_child_by_name(value, "double"))) { rv->params->dataAttributeValues[j]->dataType = IEC_FLOAT32; text = xmpp_stanza_get_text(type); rv->params->dataAttributeValues[j]->f32Value = strtof(text, NULL ); free(text); } else if ((type = xmpp_stanza_get_child_by_name(value, "boolean"))) { rv->params->dataAttributeValues[j]->dataType = IEC_BOOLEAN; text = xmpp_stanza_get_text(type); if (strcmp(text, "1") == 0) { rv->params->dataAttributeValues[j]->boolValue = true; } else { rv->params->dataAttributeValues[j]->boolValue = false; } free(text); } else if ((type = xmpp_stanza_get_child_by_name(value, "dateTime.iso8601"))) { rv->params->dataAttributeValues[j]->dataType = IEC_TIME; text = xmpp_stanza_get_text(type); rv->params->dataAttributeValues[j]->time = ne_iso8601_parse(text); free(text); } j++; } } } else { // if (!type) { // _FreeWriteParameters(rv); // return NULL ; // } } free(textname); } } return rv; }