コード例 #1
0
ファイル: ocpayloadconvert.c プロジェクト: rzr/iotivity-1
static int64_t OCConvertArrayItem(CborEncoder* array, const OCRepPayloadValueArray* valArray,
        size_t index)
{
    int64_t err = 0;
    switch (valArray->type)
    {
        case OCREP_PROP_NULL:
            OC_LOG(ERROR, TAG, "ConvertArray Invalid NULL");
            err = CborUnknownError;
            break;
        case OCREP_PROP_INT:
            err = err | cbor_encode_int(array, valArray->iArray[index]);
            break;
        case OCREP_PROP_DOUBLE:
            err = err | cbor_encode_double(array, valArray->dArray[index]);
            break;
        case OCREP_PROP_BOOL:
            err = err | cbor_encode_boolean(array, valArray->bArray[index]);
            break;
        case OCREP_PROP_STRING:
            if (!valArray->strArray[index])
            {
                err = err | cbor_encode_null(array);
            }
            else
            {
                err = err | cbor_encode_text_string(array, valArray->strArray[index],
                        strlen(valArray->strArray[index]));
            }
            break;
        case OCREP_PROP_OBJECT:
            if (!valArray->objArray[index])
            {
                err = err | cbor_encode_null(array);
            }
            else
            {
                err = OCConvertSingleRepPayload(array, valArray->objArray[index]);
            }
            break;
        case OCREP_PROP_ARRAY:
            OC_LOG(ERROR, TAG, "ConvertArray Invalid child array");
            err = CborUnknownError;
            break;
    }

    return err;
}
コード例 #2
0
static int64_t OCConvertSingleRepPayload(CborEncoder *repMap, const OCRepPayload *payload)
{
    int64_t err = CborNoError;
    OCRepPayloadValue *value = payload->values;
    while (value)
    {
        err |= cbor_encode_text_string(repMap, value->name, strlen(value->name));
        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tag name");

        switch (value->type)
        {
            case OCREP_PROP_NULL:
                err |= cbor_encode_null(repMap);
                break;
            case OCREP_PROP_INT:
                err |= cbor_encode_int(repMap, value->i);
                break;
            case OCREP_PROP_DOUBLE:
                err |= cbor_encode_double(repMap, value->d);
                break;
            case OCREP_PROP_BOOL:
                err |= cbor_encode_boolean(repMap, value->b);
                break;
            case OCREP_PROP_STRING:
                err |= cbor_encode_text_string(repMap, value->str, strlen(value->str));
                break;
            case OCREP_PROP_BYTE_STRING:
                err |= cbor_encode_byte_string(repMap, value->ocByteStr.bytes, value->ocByteStr.len);
                break;
            case OCREP_PROP_OBJECT:
                err |= OCConvertRepMap(repMap, value->obj);
                break;
            case OCREP_PROP_ARRAY:
                err |= OCConvertArray(repMap, &value->arr);
                break;
            default:
                OIC_LOG_V(ERROR, TAG, "Invalid Prop type: %d", value->type);
                break;
        }
        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding single rep value");
        value = value->next;
    }

exit:
    return err;
}
コード例 #3
0
ファイル: serialization.c プロジェクト: cedric-d/libcbor
size_t cbor_serialize_float_ctrl(const cbor_item_t *item, unsigned char *buffer, size_t buffer_size)
{
	assert(cbor_isa_float_ctrl(item));
	switch (cbor_float_get_width(item)) {
	case CBOR_FLOAT_0:
		/* CTRL - special treatment */
		return cbor_encode_ctrl(cbor_ctrl_value(item), buffer, buffer_size);
	case CBOR_FLOAT_16:
		return cbor_encode_half(cbor_float_get_float2(item), buffer, buffer_size);
	case CBOR_FLOAT_32:
		return cbor_encode_single(cbor_float_get_float4(item), buffer, buffer_size);
	case CBOR_FLOAT_64:
		return cbor_encode_double(cbor_float_get_float8(item), buffer, buffer_size);
	}

	/* Should never happen - make the compiler happy */
	return 0;
}
コード例 #4
0
ファイル: sol-oic-cbor.c プロジェクト: anselmolsm/soletta
CborError
sol_oic_encode_cbor_repr(struct sol_coap_packet *pkt,
    const char *href, const struct sol_vector *repr_vec)
{
    CborEncoder encoder, rep_map, array, map;
    CborError err;
    uint8_t *payload;
    uint16_t size;

    if (!repr_vec)
        return CborNoError;

    if (sol_coap_packet_get_payload(pkt, &payload, &size) < 0) {
        SOL_WRN("Could not get CoAP payload");
        return CborUnknownError;
    }

    cbor_encoder_init(&encoder, payload, size, 0);

    err = cbor_encoder_create_array(&encoder, &array, CborIndefiniteLength);
    err |= cbor_encode_uint(&array, SOL_OIC_PAYLOAD_REPRESENTATION);

    err |= cbor_encoder_create_map(&array, &map, CborIndefiniteLength);

    err |= cbor_encode_text_stringz(&map, SOL_OIC_KEY_HREF);
    err |= cbor_encode_text_stringz(&map, href);

    err |= cbor_encode_text_stringz(&map, SOL_OIC_KEY_REPRESENTATION);
    err |= cbor_encoder_create_map(&map, &rep_map, CborIndefiniteLength);

    if (repr_vec) {
        struct sol_oic_repr_field *repr;
        uint16_t idx;

        SOL_VECTOR_FOREACH_IDX (repr_vec, repr, idx) {
            if (err != CborNoError)
                break;

            err |= cbor_encode_text_stringz(&rep_map, repr->key);

            switch (repr->type) {
            case SOL_OIC_REPR_TYPE_UINT:
                err |= cbor_encode_uint(&rep_map, repr->v_uint);
                break;
            case SOL_OIC_REPR_TYPE_INT:
                err |= cbor_encode_int(&rep_map, repr->v_int);
                break;
            case SOL_OIC_REPR_TYPE_SIMPLE:
                err |= cbor_encode_simple_value(&rep_map, repr->v_simple);
                break;
            case SOL_OIC_REPR_TYPE_TEXT_STRING: {
                const char *p = repr->v_slice.data ? repr->v_slice.data : "";

                err |= cbor_encode_text_string(&rep_map, p, repr->v_slice.len);
                break;
            }
            case SOL_OIC_REPR_TYPE_BYTE_STRING: {
                const uint8_t *empty = (const uint8_t *)"";
                const uint8_t *p = repr->v_slice.data ? (const uint8_t *)repr->v_slice.data : empty;

                err |= cbor_encode_byte_string(&rep_map, p, repr->v_slice.len);
                break;
            }
            case SOL_OIC_REPR_TYPE_HALF_FLOAT:
                err |= cbor_encode_half_float(&rep_map, repr->v_voidptr);
                break;
            case SOL_OIC_REPR_TYPE_FLOAT:
                err |= cbor_encode_float(&rep_map, repr->v_float);
                break;
            case SOL_OIC_REPR_TYPE_DOUBLE:
                err |= cbor_encode_double(&rep_map, repr->v_double);
                break;
            case SOL_OIC_REPR_TYPE_BOOLEAN:
                err |= cbor_encode_boolean(&rep_map, repr->v_boolean);
                break;
            default:
                if (err == CborNoError)
                    err = CborErrorUnknownType;
            }
        }
    }

    err |= cbor_encoder_close_container(&map, &rep_map);

    err |= cbor_encoder_close_container(&array, &map);

    err |= cbor_encoder_close_container(&encoder, &array);

    if (err == CborNoError)
        sol_coap_packet_set_payload_used(pkt, encoder.ptr - payload);

    return err;
}
コード例 #5
0
ファイル: ocpayloadconvert.c プロジェクト: hanglei/iotivity
static int64_t OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload)
{
    int64_t err = 0;
    CborEncoder map;
    err = err | cbor_encoder_create_map(parent, &map, CborIndefiniteLength);

    // Uri
    err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF,
            sizeof(OC_RSRVD_HREF) - 1,
            payload->uri);

    // Prop Map
    // resource types, interfaces
    if(payload->types || payload->interfaces)
    {
        OC_LOG(INFO, TAG, "Payload has types or interfaces");
        err = err | cbor_encode_text_string(&map,
                OC_RSRVD_PROPERTY,
                sizeof(OC_RSRVD_PROPERTY) - 1);
        CborEncoder propMap;
        err = err | cbor_encoder_create_map(&map, &propMap, CborIndefiniteLength);

        if (payload->types)
        {
            char* joinedTypes = OCStringLLJoin(payload->types);
            if (joinedTypes)
            {
                err = err | cbor_encode_text_string(&propMap, OC_RSRVD_RESOURCE_TYPE,
                        sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
                err = err | cbor_encode_text_string(&propMap, joinedTypes,
                        strlen(joinedTypes));
                OICFree(joinedTypes);
            }
            else
            {
                return OC_STACK_NO_MEMORY;
            }
        }
        if (payload->interfaces)
        {
            char* joinedInterfaces = OCStringLLJoin(payload->interfaces);
            if (joinedInterfaces)
            {
                err = err | cbor_encode_text_string(&propMap, OC_RSRVD_INTERFACE,
                        sizeof(OC_RSRVD_INTERFACE) - 1);
                err = err | cbor_encode_text_string(&propMap, joinedInterfaces,
                        strlen(joinedInterfaces));
                OICFree(joinedInterfaces);
            }
            else
            {
                return OC_STACK_NO_MEMORY;
            }
        }
        err = err | cbor_encoder_close_container(&map, &propMap);
    }

    // Rep Map
    {
        CborEncoder repMap;
        err = err | cbor_encode_text_string(&map,
                OC_RSRVD_REPRESENTATION,
                sizeof(OC_RSRVD_REPRESENTATION) - 1);
        err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength);
        OCRepPayloadValue* value = payload->values;
        while(value)
        {
            err = err | cbor_encode_text_string(&repMap,
                    value->name,
                    strlen(value->name));
            switch(value->type)
            {
                case OCREP_PROP_NULL:
                    err = err | cbor_encode_null(&repMap);
                    break;
                case OCREP_PROP_INT:
                    err = err | cbor_encode_int(&repMap,
                            value->i);
                    break;
                case OCREP_PROP_DOUBLE:
                    err = err | cbor_encode_double(&repMap,
                            value->d);
                    break;
                case OCREP_PROP_BOOL:
                    err = err | cbor_encode_boolean(&repMap,
                            value->b);
                    break;
                case OCREP_PROP_STRING:
                    err = err | cbor_encode_text_string(&repMap,
                            value->str, strlen(value->str));
                    break;
                case OCREP_PROP_BYTE_STRING:
                    err = err | cbor_encode_byte_string(&repMap,
                            value->ocByteStr.bytes, value->ocByteStr.len);
                    break;
                case OCREP_PROP_OBJECT:
                    err = err | OCConvertSingleRepPayload(&repMap, value->obj);
                    break;
                case OCREP_PROP_ARRAY:
                    err = err | OCConvertArray(&repMap, &value->arr);
                    break;
                default:
                    OC_LOG_V(ERROR, TAG, "Invalid Prop type: %d",
                            value->type);
                    break;
            }
            value = value->next;
        }

        err = err | cbor_encoder_close_container(&map, &repMap);
    }

    // Close Map
    err = err | cbor_encoder_close_container(parent, &map);

    return err;
}
コード例 #6
0
ファイル: ocpayloadconvert.c プロジェクト: darcyg/iotivity-1
static bool OCConvertSingleRepPayload(CborEncoder* parent, const OCRepPayload* payload)
{
    bool err = false;
    CborEncoder map;
    err = err || cbor_encoder_create_map(parent, &map, CborIndefiniteLength);

    // Uri
    err = err || ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF,
            sizeof(OC_RSRVD_HREF) - 1,
            payload->uri);

    // Prop Map
    // resource types, interfaces
    if(payload->types || payload->interfaces)
    {
        OC_LOG_V(INFO, TAG, "Payload has types or interfaces");
        err = err || cbor_encode_text_string(&map,
                OC_RSRVD_PROPERTY,
                sizeof(OC_RSRVD_PROPERTY) - 1);
        CborEncoder propMap;
        err = err || cbor_encoder_create_map(&map, &propMap, 2);

        CborEncoder curArray;
        if(payload->types)
        {
            err = err || cbor_encode_text_string(&propMap,
                    OC_RSRVD_RESOURCE_TYPE,
                    sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
            err = err || cbor_encoder_create_array(&propMap, &curArray, CborIndefiniteLength);
            OCStringLL* val = payload->types;
            while(val)
            {
                err = err || cbor_encode_text_string(&curArray, val->value, strlen(val->value));
                val = val->next;
            }
            err = err || cbor_encoder_close_container(&propMap, &curArray);
        }
        if(payload->interfaces)
        {
            err = err || cbor_encode_text_string(&propMap,
                    OC_RSRVD_INTERFACE,
                    sizeof(OC_RSRVD_INTERFACE) - 1);
            err = err || cbor_encoder_create_array(&propMap, &curArray, CborIndefiniteLength);
            OCStringLL* val = payload->interfaces;
            while(val)
            {
                err = err || cbor_encode_text_string(&curArray, val->value, strlen(val->value));
                val = val->next;
            }
            err = err || cbor_encoder_close_container(&propMap, &curArray);
        }
        err = err || cbor_encoder_close_container(&map, &propMap);
    }

    // Rep Map
    {
        CborEncoder repMap;
        err = err || cbor_encode_text_string(&map,
                OC_RSRVD_REPRESENTATION,
                sizeof(OC_RSRVD_REPRESENTATION) - 1);
        err = err || cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength);
        OCRepPayloadValue* value = payload->values;
        while(value)
        {
            err = err || cbor_encode_text_string(&repMap,
                    value->name,
                    strlen(value->name));
            switch(value->type)
            {
                case OCREP_PROP_NULL:
                    err = err || cbor_encode_null(&repMap);
                    break;
                case OCREP_PROP_INT:
                    err = err || cbor_encode_int(&repMap,
                            value->i);
                    break;
                case OCREP_PROP_DOUBLE:
                    err = err || cbor_encode_double(&repMap,
                            value->d);
                    break;
                case OCREP_PROP_BOOL:
                    err = err || cbor_encode_boolean(&repMap,
                            value->b);
                    break;
                case OCREP_PROP_STRING:
                    err = err || cbor_encode_text_string(&repMap,
                            value->str, strlen(value->str));
                    break;
                case OCREP_PROP_OBJECT:
                    err = err || OCConvertSingleRepPayload(&repMap, value->obj);
                    break;
                case OCREP_PROP_ARRAY:
                    err = err || OCConvertArray(&repMap, &value->arr);
                    break;
                default:
                    OC_LOG_V(ERROR, TAG, "Invalid Prop type: %d",
                            value->type);
                    break;
            }
            value = value->next;
        }

        err = err || cbor_encoder_close_container(&map, &repMap);
    }

    // Close Map
    err = err || cbor_encoder_close_container(parent, &map);

    return err;
}