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 237c006017SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 247c006017SMilanka Ringwald * RINGWALD 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 387c006017SMilanka Ringwald #ifndef __OBEX_MESSAGE_BUILDER_H 397c006017SMilanka Ringwald 407c006017SMilanka Ringwald #if defined __cplusplus 417c006017SMilanka Ringwald extern "C" { 427c006017SMilanka Ringwald #endif 437c006017SMilanka Ringwald 447c006017SMilanka Ringwald #include <stdint.h> 457c006017SMilanka Ringwald #include <stdio.h> 467c006017SMilanka Ringwald #include <stdlib.h> 477c006017SMilanka Ringwald #include <string.h> 487c006017SMilanka Ringwald 497c006017SMilanka Ringwald #include "btstack_defines.h" 507c006017SMilanka Ringwald 517c006017SMilanka Ringwald //------------------------------------------------------------------------------------------------------------ 527c006017SMilanka Ringwald // obex_message_builder.h 537c006017SMilanka Ringwald // 54*81fb6ec9SMilanka Ringwald // Functions to incrementaly construct an OBEX message. The current length of the message is stored at 55*81fb6ec9SMilanka Ringwald // offset 1 in the buffer. All functions return status code ERROR_CODE_MEMORY_CAPACITY_EXCEEDED id the 56*81fb6ec9SMilanka Ringwald // buffer is too small. 577c006017SMilanka Ringwald 587c006017SMilanka Ringwald /* API_START */ 597c006017SMilanka Ringwald 607c006017SMilanka Ringwald /** 617c006017SMilanka Ringwald * @brief Start Connect request 627c006017SMilanka Ringwald * @param buffer 637c006017SMilanka Ringwald * @param buffer_len 647c006017SMilanka Ringwald * @param obex_version_number 657c006017SMilanka Ringwald * @param flags 667c006017SMilanka Ringwald * @param maximum_obex_packet_length 67*81fb6ec9SMilanka Ringwald * @return status 687c006017SMilanka Ringwald */ 697c006017SMilanka 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); 707c006017SMilanka Ringwald 717c006017SMilanka Ringwald /** 727c006017SMilanka Ringwald * @brief Start Disconnect request 737c006017SMilanka Ringwald * @param buffer 747c006017SMilanka Ringwald * @param buffer_len 757c006017SMilanka Ringwald * @param connection_id 76*81fb6ec9SMilanka Ringwald * @return status 777c006017SMilanka Ringwald */ 787c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 797c006017SMilanka Ringwald 807c006017SMilanka Ringwald /** 817c006017SMilanka Ringwald * @brief Create Get request 827c006017SMilanka Ringwald * @param buffer 837c006017SMilanka Ringwald * @param buffer_len 847c006017SMilanka Ringwald * @param connection_id 85*81fb6ec9SMilanka Ringwald * @return status 867c006017SMilanka Ringwald */ 877c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 887c006017SMilanka Ringwald 897c006017SMilanka Ringwald /** 907c006017SMilanka Ringwald * @brief Create Put request 917c006017SMilanka Ringwald * @param buffer 927c006017SMilanka Ringwald * @param buffer_len 937c006017SMilanka Ringwald * @param connection_id 94*81fb6ec9SMilanka Ringwald * @return status 957c006017SMilanka Ringwald */ 967c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 977c006017SMilanka Ringwald 987c006017SMilanka Ringwald 997c006017SMilanka Ringwald /** 1007c006017SMilanka Ringwald * @brief Create Abort request 1017c006017SMilanka Ringwald * @param buffer 1027c006017SMilanka Ringwald * @param buffer_len 1037c006017SMilanka Ringwald * @param connection_id 104*81fb6ec9SMilanka Ringwald * @return status 1057c006017SMilanka Ringwald */ 1067c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1077c006017SMilanka Ringwald 1087c006017SMilanka Ringwald /** 1097c006017SMilanka Ringwald * @brief Start Set Path request 1107c006017SMilanka Ringwald * @param buffer 1117c006017SMilanka Ringwald * @param buffer_len 1127c006017SMilanka Ringwald * @param connection_id 113*81fb6ec9SMilanka Ringwald * @return status 1147c006017SMilanka Ringwald */ 1157c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t connection_id); 1167c006017SMilanka Ringwald 1177c006017SMilanka Ringwald /** 1187c006017SMilanka Ringwald * @brief Add SRM Enable 1197c006017SMilanka Ringwald * @param buffer 1207c006017SMilanka Ringwald * @param buffer_len 121*81fb6ec9SMilanka Ringwald * @return status 1227c006017SMilanka Ringwald */ 1237c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len); 1247c006017SMilanka Ringwald 125*81fb6ec9SMilanka Ringwald /** 126*81fb6ec9SMilanka Ringwald * @brief Add header with single byte value (8 bit) 127*81fb6ec9SMilanka Ringwald * @param buffer 128*81fb6ec9SMilanka Ringwald * @param buffer_len 129*81fb6ec9SMilanka Ringwald * @param header_type 130*81fb6ec9SMilanka Ringwald * @param value 131*81fb6ec9SMilanka Ringwald * @return status 132*81fb6ec9SMilanka Ringwald */ 133*81fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value); 1347c006017SMilanka Ringwald 135*81fb6ec9SMilanka Ringwald /** 136*81fb6ec9SMilanka Ringwald * @brief Add header with word value (32 bit) 137*81fb6ec9SMilanka Ringwald * @param buffer 138*81fb6ec9SMilanka Ringwald * @param buffer_len 139*81fb6ec9SMilanka Ringwald * @param header_type 140*81fb6ec9SMilanka Ringwald * @param value 141*81fb6ec9SMilanka Ringwald * @return status 142*81fb6ec9SMilanka Ringwald */ 143*81fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value); 1447c006017SMilanka Ringwald 145*81fb6ec9SMilanka Ringwald /** 146*81fb6ec9SMilanka Ringwald * @brief Add header with variable size 147*81fb6ec9SMilanka Ringwald * @param buffer 148*81fb6ec9SMilanka Ringwald * @param buffer_len 149*81fb6ec9SMilanka Ringwald * @param header_type 150*81fb6ec9SMilanka Ringwald * @param header_data 151*81fb6ec9SMilanka Ringwald * @param header_data_length 152*81fb6ec9SMilanka Ringwald * @return status 153*81fb6ec9SMilanka Ringwald */ 154*81fb6ec9SMilanka 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); 1557c006017SMilanka Ringwald 1567c006017SMilanka Ringwald /** 1577c006017SMilanka Ringwald * @brief Add name header to current request 1587c006017SMilanka Ringwald * @param buffer 1597c006017SMilanka Ringwald * @param buffer_len 1607c006017SMilanka Ringwald * @param name 161*81fb6ec9SMilanka Ringwald * @return status 1627c006017SMilanka Ringwald */ 1637c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name); 1647c006017SMilanka Ringwald 1657c006017SMilanka Ringwald /** 1667c006017SMilanka Ringwald * @brief Add target header to current request 1677c006017SMilanka Ringwald * @param buffer 1687c006017SMilanka Ringwald * @param buffer_len 1697c006017SMilanka Ringwald * @param target 1707c006017SMilanka Ringwald * @param lenght of target 171*81fb6ec9SMilanka Ringwald * @return status 1727c006017SMilanka Ringwald */ 1737c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length); 1747c006017SMilanka Ringwald 1757c006017SMilanka Ringwald /** 1767c006017SMilanka Ringwald * @brief Add type header to current request 1777c006017SMilanka Ringwald * @param buffer 1787c006017SMilanka Ringwald * @param buffer_len 1797c006017SMilanka Ringwald * @param type 180*81fb6ec9SMilanka Ringwald * @return status 1817c006017SMilanka Ringwald */ 1827c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type); 1837c006017SMilanka Ringwald 1847c006017SMilanka Ringwald /** 1857c006017SMilanka Ringwald * @brief Add count header to current request 1867c006017SMilanka Ringwald * @param buffer 1877c006017SMilanka Ringwald * @param buffer_len 1887c006017SMilanka Ringwald * @param count 189*81fb6ec9SMilanka Ringwald * @return status 1907c006017SMilanka Ringwald */ 1917c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_count(uint8_t * buffer, uint16_t buffer_len, uint32_t count); 1927c006017SMilanka Ringwald 1937c006017SMilanka Ringwald /** 1947c006017SMilanka Ringwald * @brief Add application parameters header to current request 1957c006017SMilanka Ringwald * @param buffer 1967c006017SMilanka Ringwald * @param buffer_len 1977c006017SMilanka Ringwald * @param data 1987c006017SMilanka Ringwald * @param lenght of application parameters 199*81fb6ec9SMilanka Ringwald * @return status 2007c006017SMilanka Ringwald */ 2017c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); 2027c006017SMilanka Ringwald 2037c006017SMilanka Ringwald /** 2047c006017SMilanka Ringwald * @brief Add application parameters header to current request 2057c006017SMilanka Ringwald * @param buffer 2067c006017SMilanka Ringwald * @param buffer_len 2077c006017SMilanka Ringwald * @param data 2087c006017SMilanka Ringwald * @param lenght of challenge response 209*81fb6ec9SMilanka Ringwald * @return status 2107c006017SMilanka Ringwald */ 2117c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); 2127c006017SMilanka Ringwald 2137c006017SMilanka Ringwald /** 2147c006017SMilanka Ringwald * @brief Add body 2157c006017SMilanka Ringwald * @param buffer 2167c006017SMilanka Ringwald * @param buffer_len 2177c006017SMilanka Ringwald * @param data 2187c006017SMilanka Ringwald * @param lenght 219*81fb6ec9SMilanka Ringwald * @return status 2207c006017SMilanka Ringwald */ 2217c006017SMilanka Ringwald uint8_t obex_message_builder_static_add_body(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length); 2227c006017SMilanka Ringwald 2237c006017SMilanka Ringwald /* API_END */ 2247c006017SMilanka Ringwald 225*81fb6ec9SMilanka Ringwald // 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)); 226*81fb6ec9SMilanka Ringwald 2277c006017SMilanka Ringwald #if defined __cplusplus 2287c006017SMilanka Ringwald } 2297c006017SMilanka Ringwald #endif 2307c006017SMilanka Ringwald #endif 2317c006017SMilanka Ringwald 232