コード例 #1
0
ファイル: message.c プロジェクト: mikewlange/kubos
bool cnc_daemon_encode_response(uint8_t * data, CNCWrapper * wrapper, CborEncoder * encoder, CborEncoder * container)
{
    CborError err;

    if(data == NULL || wrapper == NULL)
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "%s called with a NULL pointer\n", __func__);
        return false;
    }

    if (err = cbor_encode_text_stringz(container, "RETURN_CODE"))
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "Unable to encode key \"RETURN_CODE\". Error code: %i\n", err);
        return false;
    }

    if (err = cbor_encode_simple_value(container, wrapper->response_packet->return_code))
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "Unable to encode value for key \"RETURN_CODE\". Error code:%i\n", err);
        return false;
    }

    if (err = cbor_encode_text_stringz(container, "EXEC_TIME"))
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "Unable to encode key \"EXEC_TIME\". Error code: %i\n", err);
        return false;
    }

    if (err = cbor_encode_double(container, wrapper->response_packet->execution_time))
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "Unable to encode value for key \"EXEC_TIME\". Error code:%i\n", err);
        return false;
    }

    if (err = cbor_encode_text_stringz(container, "OUTPUT"))
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "Unable to encode key \"OUTPUT\". Error code: %i\n", err);
        return false;
    }

    if (err = cbor_encode_text_stringz(container, wrapper->response_packet->output))
    {
        KLOG_ERR(&log_handle, LOG_COMPONENT_NAME, "Unable to encode value for key \"OUTPUT\". Error code:%i\n", err);
        return false;
    }

    return cnc_daemon_finish_encode_response_and_send(data, encoder, container);
}
コード例 #2
0
static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload,
        size_t *size)
{
    int64_t err = CborNoError;
    CborEncoder encoder;

    cbor_encoder_init(&encoder, outPayload, *size, 0);
    CborEncoder map;
    err |= cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating presence map");

    // Sequence Number
    err |= cbor_encode_text_string(&map, OC_RSRVD_NONCE, sizeof(OC_RSRVD_NONCE) - 1);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding nonce tag to presence map");
    err |= cbor_encode_uint(&map, payload->sequenceNumber);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding nonce value to presence map");

    // Max Age
    err |= cbor_encode_text_string(&map, OC_RSRVD_TTL, sizeof(OC_RSRVD_TTL) - 1);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding ttl tag to presence map");
    err |= cbor_encode_uint(&map, payload->maxAge);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding ttl value to presence map");

    // Trigger
    err |= cbor_encode_text_string(&map, OC_RSRVD_TRIGGER, sizeof(OC_RSRVD_TRIGGER) - 1);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding trigger tag to presence map");
    err |= cbor_encode_simple_value(&map, payload->trigger);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding trigger value to presence map");

    // Resource type name
    if (payload->trigger != OC_PRESENCE_TRIGGER_DELETE)
    {
        err |= ConditionalAddTextStringToMap(&map, OC_RSRVD_RESOURCE_TYPE,
                sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->resourceType);
        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type to presence map");
    }

    // Close Map
    err |= cbor_encoder_close_container(&encoder, &map);
    VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing presence map");

exit:
    return checkError(err, &encoder, outPayload, size);
}
コード例 #3
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;
}