From 7c006017049f293307f1ba63f1a6136a5ef8ad5b Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Tue, 26 Mar 2019 15:48:00 +0100 Subject: [PATCH] obex_message_builder: extract functionality --- src/classic/obex_message_builder.c | 196 ++++++++++++++++++++++++ src/classic/obex_message_builder.h | 213 ++++++++++++++++++++++++++ test/obex/Makefile | 4 +- test/obex/obex_message_builder_test.c | 156 +------------------ 4 files changed, 415 insertions(+), 154 deletions(-) create mode 100644 src/classic/obex_message_builder.c create mode 100644 src/classic/obex_message_builder.h diff --git a/src/classic/obex_message_builder.c b/src/classic/obex_message_builder.c new file mode 100644 index 000000000..7d88ed208 --- /dev/null +++ b/src/classic/obex_message_builder.c @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2019 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ + +#define __BTSTACK_FILE__ "obex_message_builder.c" + +#include "btstack_config.h" + +#include +#include + +#include "btstack_util.h" +#include "btstack_debug.h" +#include "classic/obex.h" +#include "classic/obex_message_builder.h" + +static uint8_t obex_message_builder_packet_init(uint8_t * buffer, uint16_t buffer_len, uint8_t opcode){ + if (buffer_len < 3) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; + buffer[0] = opcode; + big_endian_store_16(buffer, 1, 3); + return ERROR_CODE_SUCCESS; +} + +static uint8_t obex_message_builder_packet_append(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t len){ + uint16_t pos = big_endian_read_16(buffer, 1); + if (buffer_len < pos + len) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; + memcpy(&buffer[pos], data, len); + pos += len; + big_endian_store_16(buffer, 1, pos); + return ERROR_CODE_SUCCESS; +} + +static uint8_t obex_message_builder_header_add_variable(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, const uint8_t * header_data, uint16_t header_data_length){ + uint8_t header[3]; + header[0] = header_type; + big_endian_store_16(header, 1, sizeof(header) + header_data_length); + + uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); + if (status != ERROR_CODE_SUCCESS) return status; + + return obex_message_builder_packet_append(buffer, buffer_len, header_data, header_data_length); +} + +static uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value){ + uint8_t header[2]; + header[0] = header_type; + header[1] = value; + return obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); +} + +static uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value){ + uint8_t header[5]; + header[0] = header_type; + big_endian_store_32(header, 1, value); + return obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); +} + +static uint8_t obex_message_builder_header_add_connection_id(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ + // add connection_id header if set, must be first header if used + if (obex_connection_id == OBEX_CONNECTION_ID_INVALID) return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE; + return obex_message_builder_header_add_word(buffer, buffer_len, OBEX_HEADER_CONNECTION_ID, obex_connection_id); +} + +uint8_t obex_message_builder_request_create_connect(uint8_t * buffer, uint16_t buffer_len, uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length){ + uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_CONNECT); + if (status != ERROR_CODE_SUCCESS) return status; + + uint8_t fields[4]; + fields[0] = obex_version_number; + fields[1] = flags; + big_endian_store_16(fields, 2, maximum_obex_packet_length); + return obex_message_builder_packet_append(buffer, buffer_len, &fields[0], sizeof(fields)); +} + +uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ + uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_GET | OBEX_OPCODE_FINAL_BIT_MASK); + if (status != ERROR_CODE_SUCCESS) return status; + return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); +} + +uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ + uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_PUT | OBEX_OPCODE_FINAL_BIT_MASK); + if (status != ERROR_CODE_SUCCESS) return status; + + return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); +} + +uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t obex_connection_id){ + uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_SETPATH); + if (status != ERROR_CODE_SUCCESS) return status; + + uint8_t fields[2]; + fields[0] = flags; + fields[1] = 0; // reserved + status = obex_message_builder_packet_append(buffer, buffer_len, &fields[0], sizeof(fields)); + if (status != ERROR_CODE_SUCCESS) return status; + return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); +} + +uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ + uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_ABORT); + if (status != ERROR_CODE_SUCCESS) return status; + return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); +} + +uint8_t obex_message_builder_request_create_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ + uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_DISCONNECT); + if (status != ERROR_CODE_SUCCESS) return status; + return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); +} + +uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len){ + return obex_message_builder_header_add_byte(buffer, buffer_len, OBEX_HEADER_SINGLE_RESPONSE_MODE, OBEX_SRM_ENABLE); +} + +uint8_t obex_message_builder_header_add_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length){ + return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_TARGET, target, length); +} + +uint8_t obex_message_builder_header_add_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length){ + return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_APPLICATION_PARAMETERS, data, length); +} + +uint8_t obex_message_builder_add_header_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length){ + return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_AUTHENTICATION_RESPONSE, data, length); +} + +uint8_t obex_message_builder_add_body_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length){ + return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_END_OF_BODY, data, length); +} + +uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name){ + int len = strlen(name); + if (len) { + // empty string does not have trailing \0 + len++; + } + if (buffer_len < (1 + 2 + len*2) ) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; + + uint16_t pos = big_endian_read_16(buffer, 1); + buffer[pos++] = OBEX_HEADER_NAME; + big_endian_store_16(buffer, pos, 1 + 2 + len*2); + pos += 2; + int i; + // @note name[len] == 0 + for (i = 0 ; i < len ; i++){ + buffer[pos++] = 0; + buffer[pos++] = *name++; + } + big_endian_store_16(buffer, 1, pos); + return ERROR_CODE_SUCCESS; +} + +uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type){ + uint8_t header[3]; + header[0] = OBEX_HEADER_TYPE; + int len_incl_zero = strlen(type) + 1; + big_endian_store_16(header, 1, 1 + 2 + len_incl_zero); + + uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); + if (status != ERROR_CODE_SUCCESS) return status; + return obex_message_builder_packet_append(buffer, buffer_len, (const uint8_t*)type, len_incl_zero); +} diff --git a/src/classic/obex_message_builder.h b/src/classic/obex_message_builder.h new file mode 100644 index 000000000..6065d46c8 --- /dev/null +++ b/src/classic/obex_message_builder.h @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2019 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ + +#ifndef __OBEX_MESSAGE_BUILDER_H + +#if defined __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +#include "btstack_defines.h" + +//------------------------------------------------------------------------------------------------------------ +// obex_message_builder.h +// +// +// + +/* API_START */ + +/** + * @brief Start Connect request + * @param buffer + * @param buffer_len + * @param obex_version_number + * @param flags + * @param maximum_obex_packet_length + */ +uint8_t obex_message_builder_request_create_connect(uint8_t * buffer, uint16_t buffer_len, uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length); + +/** + * @brief Start Disconnect request + * @param buffer + * @param buffer_len + * @param connection_id + */ +uint8_t obex_message_builder_request_create_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); + +/** + * @brief Create Get request + * @param buffer + * @param buffer_len + * @param connection_id + */ +uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); + +/** + * @brief Create Put request + * @param buffer + * @param buffer_len + * @param connection_id + */ +uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); + + +/** + * @brief Create Abort request + * @param buffer + * @param buffer_len + * @param connection_id + */ +uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); + +/** + * @brief Start Set Path request + * @param buffer + * @param buffer_len + * @param connection_id + */ +uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t connection_id); + +/** + * @brief Add SRM Enable + * @param buffer + * @param buffer_len + */ +uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len); + +// /** +// * @brief Add header with single byte value (8 bit) +// * @param buffer +// * @param buffer_len +// * @param header_type +// * @param value +// */ +// uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value); + +// /** +// * @brief Add header with word value (32 bit) +// * @param buffer +// * @param buffer_len +// * @param header_type +// * @param value +// */ +// uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value); + +// /** +// * @brief Add header with variable size +// * @param buffer +// * @param buffer_len +// * @param header_type +// * @param header_data +// * @param header_data_length +// */ +// uint8_t obex_message_builder_header_add_variable(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, const uint8_t * header_data, uint16_t header_data_length); + +/** + * @brief Add name header to current request + * @param buffer + * @param buffer_len + * @param name + */ +uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name); + +/** + * @brief Add target header to current request + * @param buffer + * @param buffer_len + * @param target + * @param lenght of target + */ +uint8_t obex_message_builder_header_add_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length); + +/** + * @brief Add type header to current request + * @param buffer + * @param buffer_len + * @param type + */ +uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type); + +/** + * @brief Add count header to current request + * @param buffer + * @param buffer_len + * @param count + */ +uint8_t obex_message_builder_header_add_count(uint8_t * buffer, uint16_t buffer_len, uint32_t count); + +/** + * @brief Add application parameters header to current request + * @param buffer + * @param buffer_len + * @param data + * @param lenght of application parameters + */ +uint8_t obex_message_builder_header_add_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); + +/** + * @brief Add application parameters header to current request + * @param buffer + * @param buffer_len + * @param data + * @param lenght of challenge response + */ +uint8_t obex_message_builder_header_add_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); + +/** + * @brief Add body + * @param buffer + * @param buffer_len + * @param data + * @param lenght + */ +uint8_t obex_message_builder_static_add_body(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length); +// int obex_message_builder_add_body_dynamic(uint8_t * buffer, uint16_t buffer_len, uint32_t length, void (*data_callback)(uint32_t offset, uint8_t * buffer, uint32_t len)); + + +/* API_END */ + +#if defined __cplusplus +} +#endif +#endif + diff --git a/test/obex/Makefile b/test/obex/Makefile index dd065451a..febc492cb 100644 --- a/test/obex/Makefile +++ b/test/obex/Makefile @@ -10,12 +10,14 @@ LDFLAGS += -lCppUTest -lCppUTestExt VPATH += ${BTSTACK_ROOT}/src/ble VPATH += ${BTSTACK_ROOT}/src +VPATH += ${BTSTACK_ROOT}/src/classic VPATH += ${BTSTACK_ROOT}/platform/posix COMMON = \ btstack_util.c \ hci_dump.c \ - + obex_message_builder.c \ + COMMON_OBJ = $(COMMON:.c=.o) all: obex_message_builder_test diff --git a/test/obex/obex_message_builder_test.c b/test/obex/obex_message_builder_test.c index 2eec2ab0f..36fadf5d0 100644 --- a/test/obex/obex_message_builder_test.c +++ b/test/obex/obex_message_builder_test.c @@ -4,154 +4,7 @@ #include "btstack_util.h" #include "btstack_debug.h" #include "classic/obex.h" - -static uint8_t obex_message_builder_packet_init(uint8_t * buffer, uint16_t buffer_len, uint8_t opcode){ - if (buffer_len < 3) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; - buffer[0] = opcode; - big_endian_store_16(buffer, 1, 3); - return ERROR_CODE_SUCCESS; -} - -static uint8_t obex_message_builder_packet_append(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t len){ - uint16_t pos = big_endian_read_16(buffer, 1); - if (buffer_len < pos + len) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; - memcpy(&buffer[pos], data, len); - pos += len; - big_endian_store_16(buffer, 1, pos); - return ERROR_CODE_SUCCESS; -} - -static uint8_t obex_message_builder_header_add_variable(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, const uint8_t * header_data, uint16_t header_data_length){ - uint8_t header[3]; - header[0] = header_type; - big_endian_store_16(header, 1, sizeof(header) + header_data_length); - - uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); - if (status != ERROR_CODE_SUCCESS) return status; - - return obex_message_builder_packet_append(buffer, buffer_len, header_data, header_data_length); -} - -static uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value){ - uint8_t header[2]; - header[0] = header_type; - header[1] = value; - return obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); -} - -static uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value){ - uint8_t header[5]; - header[0] = header_type; - big_endian_store_32(header, 1, value); - return obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); -} - -static uint8_t obex_message_builder_header_add_connection_id(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ - // add connection_id header if set, must be first header if used - if (obex_connection_id == OBEX_CONNECTION_ID_INVALID) return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE; - return obex_message_builder_header_add_word(buffer, buffer_len, OBEX_HEADER_CONNECTION_ID, obex_connection_id); -} - -uint8_t obex_message_builder_request_create_connect(uint8_t * buffer, uint16_t buffer_len, uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length){ - uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_CONNECT); - if (status != ERROR_CODE_SUCCESS) return status; - - uint8_t fields[4]; - fields[0] = obex_version_number; - fields[1] = flags; - big_endian_store_16(fields, 2, maximum_obex_packet_length); - return obex_message_builder_packet_append(buffer, buffer_len, &fields[0], sizeof(fields)); -} - -uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ - uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_GET | OBEX_OPCODE_FINAL_BIT_MASK); - if (status != ERROR_CODE_SUCCESS) return status; - return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); -} - -uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ - uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_PUT | OBEX_OPCODE_FINAL_BIT_MASK); - if (status != ERROR_CODE_SUCCESS) return status; - - return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); -} - -uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t obex_connection_id){ - uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_SETPATH); - if (status != ERROR_CODE_SUCCESS) return status; - - uint8_t fields[2]; - fields[0] = flags; - fields[1] = 0; // reserved - status = obex_message_builder_packet_append(buffer, buffer_len, &fields[0], sizeof(fields)); - if (status != ERROR_CODE_SUCCESS) return status; - return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); -} - -uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ - uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_ABORT); - if (status != ERROR_CODE_SUCCESS) return status; - return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); -} - -uint8_t obex_message_builder_request_create_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t obex_connection_id){ - uint8_t status = obex_message_builder_packet_init(buffer, buffer_len, OBEX_OPCODE_DISCONNECT); - if (status != ERROR_CODE_SUCCESS) return status; - return obex_message_builder_header_add_connection_id(buffer, buffer_len, obex_connection_id); -} - -uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len){ - return obex_message_builder_header_add_byte(buffer, buffer_len, OBEX_HEADER_SINGLE_RESPONSE_MODE, OBEX_SRM_ENABLE); -} - -uint8_t obex_message_builder_add_header_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length){ - return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_TARGET, target, length); -} - -uint8_t obex_message_builder_add_header_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length){ - return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_APPLICATION_PARAMETERS, data, length); -} - -uint8_t obex_message_builder_add_header_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length){ - return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_AUTHENTICATION_RESPONSE, data, length); -} - -uint8_t obex_message_builder_add_body_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length){ - return obex_message_builder_header_add_variable(buffer, buffer_len, OBEX_HEADER_END_OF_BODY, data, length); -} - -uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name){ - int len = strlen(name); - if (len) { - // empty string does not have trailing \0 - len++; - } - if (buffer_len < (1 + 2 + len*2) ) return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; - - uint16_t pos = big_endian_read_16(buffer, 1); - buffer[pos++] = OBEX_HEADER_NAME; - big_endian_store_16(buffer, pos, 1 + 2 + len*2); - pos += 2; - int i; - // @note name[len] == 0 - for (i = 0 ; i < len ; i++){ - buffer[pos++] = 0; - buffer[pos++] = *name++; - } - big_endian_store_16(buffer, 1, pos); - return ERROR_CODE_SUCCESS; -} - -uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type){ - uint8_t header[3]; - header[0] = OBEX_HEADER_TYPE; - int len_incl_zero = strlen(type) + 1; - big_endian_store_16(header, 1, 1 + 2 + len_incl_zero); - - uint8_t status = obex_message_builder_packet_append(buffer, buffer_len, &header[0], sizeof(header)); - if (status != ERROR_CODE_SUCCESS) return status; - return obex_message_builder_packet_append(buffer, buffer_len, (const uint8_t*)type, len_incl_zero); -} +#include "classic/obex_message_builder.h" static const uint8_t service_uuid[] = {0xbb, 0x58, 0x2b, 0x40, 0x42, 0xc, 0x11, 0xdb, 0xb0, 0xde, 0x8, 0x0, 0x20, 0xc, 0x9a, 0x66}; static const uint8_t application_parameters[] = {0x29, 4, 0, 0, 0xFF, 0xFF}; @@ -290,17 +143,14 @@ TEST(OBEX_MESSAGE_BUILDER, CreateConnectWithHeaderTarget){ status = obex_message_builder_request_create_connect(actual_message, actual_message_len, obex_version_number, flags, maximum_obex_packet_length); validate_success(expected_message, expected_message[2]); - status = obex_message_builder_add_header_target(actual_message, actual_message_len, service_uuid, sizeof(service_uuid)); + status = obex_message_builder_header_add_target(actual_message, actual_message_len, service_uuid, sizeof(service_uuid)); expected_message[2] += header_len; validate_success(expected_message, expected_message[2]); } TEST(OBEX_MESSAGE_BUILDER, CreateConnectWithHeaderApplicationParameters){ uint8_t expected_message[] = {OBEX_OPCODE_CONNECT, 0, 0, obex_version_number, flags, 0, 0, - // service UUID OBEX_HEADER_APPLICATION_PARAMETERS, 0,0, 0,0,0,0,0,0 - // OBEX_HEADER_AUTHENTICATION_RESPONSE, 0,0 - // OBEX_HEADER_END_OF_BODY, 0,0 }; int header_len = 3 + sizeof(application_parameters); expected_message[2] = 7; @@ -311,7 +161,7 @@ TEST(OBEX_MESSAGE_BUILDER, CreateConnectWithHeaderApplicationParameters){ status = obex_message_builder_request_create_connect(actual_message, actual_message_len, obex_version_number, flags, maximum_obex_packet_length); validate_success(expected_message, expected_message[2]); - status = obex_message_builder_add_header_application_parameters(actual_message, actual_message_len, &application_parameters[0], sizeof(application_parameters)); + status = obex_message_builder_header_add_application_parameters(actual_message, actual_message_len, &application_parameters[0], sizeof(application_parameters)); expected_message[2] += header_len; validate_success(expected_message, expected_message[2]); }