コード例 #1
0
ファイル: xmpp.c プロジェクト: strategist922/libconflate
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;
}
コード例 #2
0
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;
}