17c006017SMilanka Ringwald /* 27c006017SMilanka Ringwald * Copyright (C) 2019 BlueKitchen GmbH 37c006017SMilanka Ringwald * 47c006017SMilanka Ringwald * Redistribution and use in source and binary forms, with or without 57c006017SMilanka Ringwald * modification, are permitted provided that the following conditions 67c006017SMilanka Ringwald * are met: 77c006017SMilanka Ringwald * 87c006017SMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 97c006017SMilanka Ringwald * notice, this list of conditions and the following disclaimer. 107c006017SMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 117c006017SMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 127c006017SMilanka Ringwald * documentation and/or other materials provided with the distribution. 137c006017SMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 147c006017SMilanka Ringwald * contributors may be used to endorse or promote products derived 157c006017SMilanka Ringwald * from this software without specific prior written permission. 167c006017SMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 177c006017SMilanka Ringwald * personal benefit and not for any commercial purpose or for 187c006017SMilanka Ringwald * monetary gain. 197c006017SMilanka Ringwald * 207c006017SMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 217c006017SMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 227c006017SMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 232fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 242fca4dadSMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 257c006017SMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 267c006017SMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 277c006017SMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 287c006017SMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 297c006017SMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 307c006017SMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 317c006017SMilanka Ringwald * SUCH DAMAGE. 327c006017SMilanka Ringwald * 337c006017SMilanka Ringwald * Please inquire about commercial licensing options at 347c006017SMilanka Ringwald * [email protected] 357c006017SMilanka Ringwald * 367c006017SMilanka Ringwald */ 377c006017SMilanka Ringwald 38fe5a6c4eSMilanka Ringwald /** 39fe5a6c4eSMilanka Ringwald * OBEX Message Builder 40fe5a6c4eSMilanka Ringwald * 41fe5a6c4eSMilanka Ringwald */ 42fe5a6c4eSMilanka Ringwald 4380e33422SMatthias Ringwald #ifndef OBEX_MESSAGE_BUILDER_H 4480e33422SMatthias Ringwald #define OBEX_MESSAGE_BUILDER_H 457c006017SMilanka Ringwald 467c006017SMilanka Ringwald #if defined __cplusplus 477c006017SMilanka Ringwald extern "C" { 487c006017SMilanka Ringwald #endif 497c006017SMilanka Ringwald 507c006017SMilanka Ringwald #include <stdint.h> 517c006017SMilanka Ringwald #include <string.h> 527c006017SMilanka Ringwald 537c006017SMilanka Ringwald #include "btstack_defines.h" 547c006017SMilanka Ringwald 557c006017SMilanka Ringwald //------------------------------------------------------------------------------------------------------------ 567c006017SMilanka Ringwald // obex_message_builder.h 577c006017SMilanka Ringwald // 5881fb6ec9SMilanka Ringwald // Functions to incrementaly construct an OBEX message. The current length of the message is stored at 5981fb6ec9SMilanka Ringwald // offset 1 in the buffer. All functions return status code ERROR_CODE_MEMORY_CAPACITY_EXCEEDED id the 6081fb6ec9SMilanka Ringwald // buffer is too small. 617c006017SMilanka Ringwald 627c006017SMilanka Ringwald /* API_START */ 63*1f6020d5SMilanka Ringwald /** 64*1f6020d5SMilanka Ringwald * @brief Get message lenght 65*1f6020d5SMilanka Ringwald * @param buffer 66*1f6020d5SMilanka Ringwald * @return buffer_length 67*1f6020d5SMilanka Ringwald */ 68*1f6020d5SMilanka Ringwald uint16_t obex_message_builder_get_message_length(uint8_t * buffer); 697c006017SMilanka Ringwald 707c006017SMilanka Ringwald /** 717c006017SMilanka Ringwald * @brief Start Connect request 727c006017SMilanka Ringwald * @param buffer 737c006017SMilanka Ringwald * @param buffer_len 747c006017SMilanka Ringwald * @param obex_version_number 757c006017SMilanka Ringwald * @param flags 767c006017SMilanka Ringwald * @param maximum_obex_packet_length 7781fb6ec9SMilanka Ringwald * @return status 787c006017SMilanka Ringwald */ 797c006017SMilanka Ringwald 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); 807c006017SMilanka Ringwald 817c006017SMilanka Ringwald /** 82*1f6020d5SMilanka Ringwald * @brief Start Connect response 83*1f6020d5SMilanka Ringwald * @param buffer 84*1f6020d5SMilanka Ringwald * @param buffer_len 85*1f6020d5SMilanka Ringwald * @param obex_version_number 86*1f6020d5SMilanka Ringwald * @param flags 87*1f6020d5SMilanka Ringwald * @param maximum_obex_packet_length 88*1f6020d5SMilanka Ringwald * @param connection_id 89*1f6020d5SMilanka Ringwald * @return status 90*1f6020d5SMilanka Ringwald */ 91*1f6020d5SMilanka Ringwald uint8_t obex_message_builder_response_create_connect(uint8_t * buffer, uint16_t buffer_len, uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length, uint32_t connection_id); 92*1f6020d5SMilanka Ringwald 93*1f6020d5SMilanka Ringwald /** 947c006017SMilanka Ringwald * @brief Start Disconnect request 957c006017SMilanka Ringwald * @param buffer 967c006017SMilanka Ringwald * @param buffer_len 977c006017SMilanka Ringwald * @param connection_id 9881fb6ec9SMilanka Ringwald * @return status 997c006017SMilanka Ringwald */ 1007c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1017c006017SMilanka Ringwald 1027c006017SMilanka Ringwald /** 1037c006017SMilanka Ringwald * @brief Create Get request 1047c006017SMilanka Ringwald * @param buffer 1057c006017SMilanka Ringwald * @param buffer_len 1067c006017SMilanka Ringwald * @param connection_id 10781fb6ec9SMilanka Ringwald * @return status 1087c006017SMilanka Ringwald */ 1097c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1107c006017SMilanka Ringwald 1117c006017SMilanka Ringwald /** 1127c006017SMilanka Ringwald * @brief Create Put request 1137c006017SMilanka Ringwald * @param buffer 1147c006017SMilanka Ringwald * @param buffer_len 1157c006017SMilanka Ringwald * @param connection_id 11681fb6ec9SMilanka Ringwald * @return status 1177c006017SMilanka Ringwald */ 1187c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1197c006017SMilanka Ringwald 1207c006017SMilanka Ringwald 1217c006017SMilanka Ringwald /** 1227c006017SMilanka Ringwald * @brief Create Abort request 1237c006017SMilanka Ringwald * @param buffer 1247c006017SMilanka Ringwald * @param buffer_len 1257c006017SMilanka Ringwald * @param connection_id 12681fb6ec9SMilanka Ringwald * @return status 1277c006017SMilanka Ringwald */ 1287c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1297c006017SMilanka Ringwald 1307c006017SMilanka Ringwald /** 1317c006017SMilanka Ringwald * @brief Start Set Path request 1327c006017SMilanka Ringwald * @param buffer 1337c006017SMilanka Ringwald * @param buffer_len 1347c006017SMilanka Ringwald * @param connection_id 13581fb6ec9SMilanka Ringwald * @return status 1367c006017SMilanka Ringwald */ 1377c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t connection_id); 1387c006017SMilanka Ringwald 1397c006017SMilanka Ringwald /** 1407c006017SMilanka Ringwald * @brief Add SRM Enable 1417c006017SMilanka Ringwald * @param buffer 1427c006017SMilanka Ringwald * @param buffer_len 14381fb6ec9SMilanka Ringwald * @return status 1447c006017SMilanka Ringwald */ 1457c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len); 1467c006017SMilanka Ringwald 14781fb6ec9SMilanka Ringwald /** 14881fb6ec9SMilanka Ringwald * @brief Add header with single byte value (8 bit) 14981fb6ec9SMilanka Ringwald * @param buffer 15081fb6ec9SMilanka Ringwald * @param buffer_len 15181fb6ec9SMilanka Ringwald * @param header_type 15281fb6ec9SMilanka Ringwald * @param value 15381fb6ec9SMilanka Ringwald * @return status 15481fb6ec9SMilanka Ringwald */ 15581fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value); 1567c006017SMilanka Ringwald 15781fb6ec9SMilanka Ringwald /** 15881fb6ec9SMilanka Ringwald * @brief Add header with word value (32 bit) 15981fb6ec9SMilanka Ringwald * @param buffer 16081fb6ec9SMilanka Ringwald * @param buffer_len 16181fb6ec9SMilanka Ringwald * @param header_type 16281fb6ec9SMilanka Ringwald * @param value 16381fb6ec9SMilanka Ringwald * @return status 16481fb6ec9SMilanka Ringwald */ 16581fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value); 1667c006017SMilanka Ringwald 16781fb6ec9SMilanka Ringwald /** 16881fb6ec9SMilanka Ringwald * @brief Add header with variable size 16981fb6ec9SMilanka Ringwald * @param buffer 17081fb6ec9SMilanka Ringwald * @param buffer_len 17181fb6ec9SMilanka Ringwald * @param header_type 17281fb6ec9SMilanka Ringwald * @param header_data 17381fb6ec9SMilanka Ringwald * @param header_data_length 17481fb6ec9SMilanka Ringwald * @return status 17581fb6ec9SMilanka Ringwald */ 17681fb6ec9SMilanka Ringwald 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); 1777c006017SMilanka Ringwald 1787c006017SMilanka Ringwald /** 1797c006017SMilanka Ringwald * @brief Add name header to current request 1807c006017SMilanka Ringwald * @param buffer 1817c006017SMilanka Ringwald * @param buffer_len 1822946c1e3SMatthias Ringwald * @param name with trailing '\0' 18381fb6ec9SMilanka Ringwald * @return status 1847c006017SMilanka Ringwald */ 1857c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name); 1867c006017SMilanka Ringwald 1877c006017SMilanka Ringwald /** 1882946c1e3SMatthias Ringwald * @brief Add name header to current request 1892946c1e3SMatthias Ringwald * @param buffer 1902946c1e3SMatthias Ringwald * @param buffer_len 1912946c1e3SMatthias Ringwald * @param name 1922946c1e3SMatthias Ringwald * @param name_len 1932946c1e3SMatthias Ringwald * @return status 1942946c1e3SMatthias Ringwald */ 1952946c1e3SMatthias Ringwald uint8_t obex_message_builder_header_add_name_prefix(uint8_t * buffer, uint16_t buffer_len, const char * name, uint16_t name_len); 1962946c1e3SMatthias Ringwald 1972946c1e3SMatthias Ringwald /** 1987c006017SMilanka Ringwald * @brief Add target header to current request 1997c006017SMilanka Ringwald * @param buffer 2007c006017SMilanka Ringwald * @param buffer_len 2017c006017SMilanka Ringwald * @param target 2022946c1e3SMatthias Ringwald * @param length of target 20381fb6ec9SMilanka Ringwald * @return status 2047c006017SMilanka Ringwald */ 2057c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length); 2067c006017SMilanka Ringwald 2077c006017SMilanka Ringwald /** 208*1f6020d5SMilanka Ringwald * @brief Add target header to current request 209*1f6020d5SMilanka Ringwald * @param buffer 210*1f6020d5SMilanka Ringwald * @param buffer_len 211*1f6020d5SMilanka Ringwald * @param who fixed len of 16 bytes 212*1f6020d5SMilanka Ringwald * @return status 213*1f6020d5SMilanka Ringwald */ 214*1f6020d5SMilanka Ringwald uint8_t obex_message_builder_header_add_who(uint8_t * buffer, uint16_t buffer_len, const uint8_t * who); 215*1f6020d5SMilanka Ringwald 216*1f6020d5SMilanka Ringwald 217*1f6020d5SMilanka Ringwald /** 2187c006017SMilanka Ringwald * @brief Add type header to current request 2197c006017SMilanka Ringwald * @param buffer 2207c006017SMilanka Ringwald * @param buffer_len 2217c006017SMilanka Ringwald * @param type 22281fb6ec9SMilanka Ringwald * @return status 2237c006017SMilanka Ringwald */ 2247c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type); 2257c006017SMilanka Ringwald 2267c006017SMilanka Ringwald /** 2277c006017SMilanka Ringwald * @brief Add count header to current request 2287c006017SMilanka Ringwald * @param buffer 2297c006017SMilanka Ringwald * @param buffer_len 2307c006017SMilanka Ringwald * @param count 23181fb6ec9SMilanka Ringwald * @return status 2327c006017SMilanka Ringwald */ 2337c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_count(uint8_t * buffer, uint16_t buffer_len, uint32_t count); 2347c006017SMilanka Ringwald 2357c006017SMilanka Ringwald /** 2367c006017SMilanka Ringwald * @brief Add application parameters header to current request 2377c006017SMilanka Ringwald * @param buffer 2387c006017SMilanka Ringwald * @param buffer_len 2397c006017SMilanka Ringwald * @param data 240*1f6020d5SMilanka Ringwald * @param length of application parameters 24181fb6ec9SMilanka Ringwald * @return status 2427c006017SMilanka Ringwald */ 2437c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); 2447c006017SMilanka Ringwald 2457c006017SMilanka Ringwald /** 2467c006017SMilanka Ringwald * @brief Add application parameters header to current request 2477c006017SMilanka Ringwald * @param buffer 2487c006017SMilanka Ringwald * @param buffer_len 2497c006017SMilanka Ringwald * @param data 250*1f6020d5SMilanka Ringwald * @param length of challenge response 25181fb6ec9SMilanka Ringwald * @return status 2527c006017SMilanka Ringwald */ 2537c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); 2547c006017SMilanka Ringwald 2557c006017SMilanka Ringwald /** 2567c006017SMilanka Ringwald * @brief Add body 2577c006017SMilanka Ringwald * @param buffer 2587c006017SMilanka Ringwald * @param buffer_len 2597c006017SMilanka Ringwald * @param data 260*1f6020d5SMilanka Ringwald * @param length 26181fb6ec9SMilanka Ringwald * @return status 2627c006017SMilanka Ringwald */ 263948b3642SMilanka Ringwald uint8_t obex_message_builder_body_add_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length); 2647c006017SMilanka Ringwald 2657c006017SMilanka Ringwald /* API_END */ 2667c006017SMilanka Ringwald 267948b3642SMilanka Ringwald // int obex_message_builder_body_add_dynamic(uint8_t * buffer, uint16_t buffer_len, uint32_t length, void (*data_callback)(uint32_t offset, uint8_t * buffer, uint32_t len)); 26881fb6ec9SMilanka Ringwald 2697c006017SMilanka Ringwald #if defined __cplusplus 2707c006017SMilanka Ringwald } 2717c006017SMilanka Ringwald #endif 2727c006017SMilanka Ringwald #endif 2737c006017SMilanka Ringwald 274