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 */ 631f6020d5SMilanka Ringwald /** 641f6020d5SMilanka Ringwald * @brief Get message lenght 651f6020d5SMilanka Ringwald * @param buffer 661f6020d5SMilanka Ringwald * @return buffer_length 671f6020d5SMilanka Ringwald */ 681f6020d5SMilanka 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 /** 821f6020d5SMilanka Ringwald * @brief Start Connect response 831f6020d5SMilanka Ringwald * @param buffer 841f6020d5SMilanka Ringwald * @param buffer_len 851f6020d5SMilanka Ringwald * @param obex_version_number 861f6020d5SMilanka Ringwald * @param flags 871f6020d5SMilanka Ringwald * @param maximum_obex_packet_length 881f6020d5SMilanka Ringwald * @param connection_id 891f6020d5SMilanka Ringwald * @return status 901f6020d5SMilanka Ringwald */ 911f6020d5SMilanka 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); 921f6020d5SMilanka Ringwald 931f6020d5SMilanka Ringwald /** 948460ee57SMatthias Ringwald * @brief Start General response with given response code 9509ef1e1eSMatthias Ringwald * @param buffer 9609ef1e1eSMatthias Ringwald * @param buffer_len 978460ee57SMatthias Ringwald * @param response_code 9809ef1e1eSMatthias Ringwald * @return status 9909ef1e1eSMatthias Ringwald */ 1008460ee57SMatthias Ringwald uint8_t obex_message_builder_response_create_general(uint8_t * buffer, uint16_t buffer_len, uint8_t response_code); 10109ef1e1eSMatthias Ringwald 10209ef1e1eSMatthias Ringwald /** 103c2e0c88eSMatthias Ringwald * @brief Update response code 104c2e0c88eSMatthias Ringwald * @param buffer 105c2e0c88eSMatthias Ringwald * @param buffer_len 106c2e0c88eSMatthias Ringwald * @param response_code 107c2e0c88eSMatthias Ringwald * @return status 108c2e0c88eSMatthias Ringwald */ 109c2e0c88eSMatthias Ringwald uint8_t obex_message_builder_response_update_code(uint8_t * buffer, uint16_t buffer_len, uint8_t response_code); 110c2e0c88eSMatthias Ringwald 111c2e0c88eSMatthias Ringwald /** 1127c006017SMilanka Ringwald * @brief Start Disconnect 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_disconnect(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1197c006017SMilanka Ringwald 1207c006017SMilanka Ringwald /** 1217c006017SMilanka Ringwald * @brief Create Get request 1227c006017SMilanka Ringwald * @param buffer 1237c006017SMilanka Ringwald * @param buffer_len 1247c006017SMilanka Ringwald * @param connection_id 12581fb6ec9SMilanka Ringwald * @return status 1267c006017SMilanka Ringwald */ 1277c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_get(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1287c006017SMilanka Ringwald 1297c006017SMilanka Ringwald /** 1307c006017SMilanka Ringwald * @brief Create Put request 1317c006017SMilanka Ringwald * @param buffer 1327c006017SMilanka Ringwald * @param buffer_len 1337c006017SMilanka Ringwald * @param connection_id 13481fb6ec9SMilanka Ringwald * @return status 1357c006017SMilanka Ringwald */ 1367c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_put(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1377c006017SMilanka Ringwald 1387c006017SMilanka Ringwald 1397c006017SMilanka Ringwald /** 1407c006017SMilanka Ringwald * @brief Create Abort request 1417c006017SMilanka Ringwald * @param buffer 1427c006017SMilanka Ringwald * @param buffer_len 1437c006017SMilanka Ringwald * @param connection_id 14481fb6ec9SMilanka Ringwald * @return status 1457c006017SMilanka Ringwald */ 1467c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_abort(uint8_t * buffer, uint16_t buffer_len, uint32_t connection_id); 1477c006017SMilanka Ringwald 1487c006017SMilanka Ringwald /** 1497c006017SMilanka Ringwald * @brief Start Set Path request 1507c006017SMilanka Ringwald * @param buffer 1517c006017SMilanka Ringwald * @param buffer_len 1527c006017SMilanka Ringwald * @param connection_id 15381fb6ec9SMilanka Ringwald * @return status 1547c006017SMilanka Ringwald */ 1557c006017SMilanka Ringwald uint8_t obex_message_builder_request_create_set_path(uint8_t * buffer, uint16_t buffer_len, uint8_t flags, uint32_t connection_id); 1567c006017SMilanka Ringwald 1577c006017SMilanka Ringwald /** 15849df53afSSimon Budig * @brief Control the "final" bit 15949df53afSSimon Budig * @param buffer 16049df53afSSimon Budig * @param buffer_len 16149df53afSSimon Budig * @param final 16249df53afSSimon Budig * @return status 16349df53afSSimon Budig */ 16449df53afSSimon Budig uint8_t obex_message_builder_set_final_bit (uint8_t * buffer, uint16_t buffer_len, bool final); 16549df53afSSimon Budig 16649df53afSSimon Budig /** 1677c006017SMilanka Ringwald * @brief Add SRM Enable 1687c006017SMilanka Ringwald * @param buffer 1697c006017SMilanka Ringwald * @param buffer_len 17081fb6ec9SMilanka Ringwald * @return status 1717c006017SMilanka Ringwald */ 1727c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_srm_enable(uint8_t * buffer, uint16_t buffer_len); 1737c006017SMilanka Ringwald 17481fb6ec9SMilanka Ringwald /** 175*7e1e42bbSMatthias Ringwald * @brief Add SRMP wait header 176*7e1e42bbSMatthias Ringwald * @param buffer 177*7e1e42bbSMatthias Ringwald * @param buffer_len 178*7e1e42bbSMatthias Ringwald * @return status 179*7e1e42bbSMatthias Ringwald */ 180*7e1e42bbSMatthias Ringwald uint8_t obex_message_builder_header_add_srmp_wait(uint8_t* buffer, uint16_t buffer_len); 181*7e1e42bbSMatthias Ringwald 182*7e1e42bbSMatthias Ringwald 183*7e1e42bbSMatthias Ringwald /** 18481fb6ec9SMilanka Ringwald * @brief Add header with single byte value (8 bit) 18581fb6ec9SMilanka Ringwald * @param buffer 18681fb6ec9SMilanka Ringwald * @param buffer_len 18781fb6ec9SMilanka Ringwald * @param header_type 18881fb6ec9SMilanka Ringwald * @param value 18981fb6ec9SMilanka Ringwald * @return status 19081fb6ec9SMilanka Ringwald */ 19181fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_byte(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint8_t value); 1927c006017SMilanka Ringwald 19381fb6ec9SMilanka Ringwald /** 19481fb6ec9SMilanka Ringwald * @brief Add header with word value (32 bit) 19581fb6ec9SMilanka Ringwald * @param buffer 19681fb6ec9SMilanka Ringwald * @param buffer_len 19781fb6ec9SMilanka Ringwald * @param header_type 19881fb6ec9SMilanka Ringwald * @param value 19981fb6ec9SMilanka Ringwald * @return status 20081fb6ec9SMilanka Ringwald */ 20181fb6ec9SMilanka Ringwald uint8_t obex_message_builder_header_add_word(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, uint32_t value); 2027c006017SMilanka Ringwald 20381fb6ec9SMilanka Ringwald /** 20481fb6ec9SMilanka Ringwald * @brief Add header with variable size 20581fb6ec9SMilanka Ringwald * @param buffer 20681fb6ec9SMilanka Ringwald * @param buffer_len 20781fb6ec9SMilanka Ringwald * @param header_type 20881fb6ec9SMilanka Ringwald * @param header_data 20981fb6ec9SMilanka Ringwald * @param header_data_length 21081fb6ec9SMilanka Ringwald * @return status 21181fb6ec9SMilanka Ringwald */ 21281fb6ec9SMilanka 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); 2137c006017SMilanka Ringwald 2147c006017SMilanka Ringwald /** 21549df53afSSimon Budig * @brief Add (partial) header with variable size 21649df53afSSimon Budig * @param buffer 21749df53afSSimon Budig * @param buffer_len 21849df53afSSimon Budig * @param header_type 21949df53afSSimon Budig * @param header_data 22049df53afSSimon Budig * @param header_data_length 22149df53afSSimon Budig * @param ret_length 22249df53afSSimon Budig * @return status 22349df53afSSimon Budig */ 22449df53afSSimon Budig uint8_t obex_message_builder_header_fillup_variable(uint8_t * buffer, uint16_t buffer_len, uint8_t header_type, const uint8_t * header_data, uint16_t header_data_length, uint32_t * ret_length); 22549df53afSSimon Budig 226*7e1e42bbSMatthias Ringwald 227*7e1e42bbSMatthias Ringwald /** 228*7e1e42bbSMatthias Ringwald * @brief returns name header size in bytes from its string len 229*7e1e42bbSMatthias Ringwald * @param name_len - use value returned by strlen 230*7e1e42bbSMatthias Ringwald * @return header size in bytes 231*7e1e42bbSMatthias Ringwald */ 232*7e1e42bbSMatthias Ringwald uint8_t obex_message_builder_get_header_name_len_from_strlen(uint16_t name_len); 233*7e1e42bbSMatthias Ringwald 23449df53afSSimon Budig /** 2357c006017SMilanka Ringwald * @brief Add name header to current request 2367c006017SMilanka Ringwald * @param buffer 2377c006017SMilanka Ringwald * @param buffer_len 2382946c1e3SMatthias Ringwald * @param name with trailing '\0' 23981fb6ec9SMilanka Ringwald * @return status 2407c006017SMilanka Ringwald */ 2417c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_name(uint8_t * buffer, uint16_t buffer_len, const char * name); 2427c006017SMilanka Ringwald 2437c006017SMilanka Ringwald /** 2442946c1e3SMatthias Ringwald * @brief Add name header to current request 2452946c1e3SMatthias Ringwald * @param buffer 2462946c1e3SMatthias Ringwald * @param buffer_len 2472946c1e3SMatthias Ringwald * @param name 2482946c1e3SMatthias Ringwald * @param name_len 2492946c1e3SMatthias Ringwald * @return status 2502946c1e3SMatthias Ringwald */ 2512946c1e3SMatthias Ringwald uint8_t obex_message_builder_header_add_name_prefix(uint8_t * buffer, uint16_t buffer_len, const char * name, uint16_t name_len); 2522946c1e3SMatthias Ringwald 2532946c1e3SMatthias Ringwald /** 254c1dd2356SMatthias Ringwald * @brief Add string encoded in unicode to current request 255c1dd2356SMatthias Ringwald * @param buffer 256c1dd2356SMatthias Ringwald * @param buffer_len 257c1dd2356SMatthias Ringwald * @param header_id 258c1dd2356SMatthias Ringwald * @param string 259c1dd2356SMatthias Ringwald * @param string_len 260c1dd2356SMatthias Ringwald * @return status 261c1dd2356SMatthias Ringwald */ 262c1dd2356SMatthias Ringwald uint8_t obex_message_builder_header_add_unicode_prefix(uint8_t * buffer, uint16_t buffer_len, uint8_t header_id, const char * name, uint16_t name_len); 263c1dd2356SMatthias Ringwald 264c1dd2356SMatthias Ringwald /** 2657c006017SMilanka Ringwald * @brief Add target header to current request 2667c006017SMilanka Ringwald * @param buffer 2677c006017SMilanka Ringwald * @param buffer_len 2687c006017SMilanka Ringwald * @param target 2692946c1e3SMatthias Ringwald * @param length of target 27081fb6ec9SMilanka Ringwald * @return status 2717c006017SMilanka Ringwald */ 2727c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_target(uint8_t * buffer, uint16_t buffer_len, const uint8_t * target, uint16_t length); 2737c006017SMilanka Ringwald 2747c006017SMilanka Ringwald /** 2751f6020d5SMilanka Ringwald * @brief Add target header to current request 2761f6020d5SMilanka Ringwald * @param buffer 2771f6020d5SMilanka Ringwald * @param buffer_len 2781f6020d5SMilanka Ringwald * @param who fixed len of 16 bytes 2791f6020d5SMilanka Ringwald * @return status 2801f6020d5SMilanka Ringwald */ 2811f6020d5SMilanka Ringwald uint8_t obex_message_builder_header_add_who(uint8_t * buffer, uint16_t buffer_len, const uint8_t * who); 2821f6020d5SMilanka Ringwald 283*7e1e42bbSMatthias Ringwald /** 284*7e1e42bbSMatthias Ringwald * @brief returns the length of the type header for string <type> 285*7e1e42bbSMatthias Ringwald * @param type 286*7e1e42bbSMatthias Ringwald * @return header len in bytes 287*7e1e42bbSMatthias Ringwald */ 288*7e1e42bbSMatthias Ringwald uint8_t obex_message_builder_get_header_type_len(char* type); 289*7e1e42bbSMatthias Ringwald 2901f6020d5SMilanka Ringwald 2911f6020d5SMilanka Ringwald /** 2927c006017SMilanka Ringwald * @brief Add type header to current request 2937c006017SMilanka Ringwald * @param buffer 2947c006017SMilanka Ringwald * @param buffer_len 2957c006017SMilanka Ringwald * @param type 29681fb6ec9SMilanka Ringwald * @return status 2977c006017SMilanka Ringwald */ 2987c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_type(uint8_t * buffer, uint16_t buffer_len, const char * type); 2997c006017SMilanka Ringwald 3007c006017SMilanka Ringwald /** 3017c006017SMilanka Ringwald * @brief Add count header to current request 3027c006017SMilanka Ringwald * @param buffer 3037c006017SMilanka Ringwald * @param buffer_len 3047c006017SMilanka Ringwald * @param count 30581fb6ec9SMilanka Ringwald * @return status 3067c006017SMilanka Ringwald */ 3077c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_count(uint8_t * buffer, uint16_t buffer_len, uint32_t count); 3087c006017SMilanka Ringwald 3097c006017SMilanka Ringwald /** 31049df53afSSimon Budig * @brief Add length header to current request 31149df53afSSimon Budig * @param buffer 31249df53afSSimon Budig * @param buffer_len 31349df53afSSimon Budig * @param lenght 31449df53afSSimon Budig * @return status 31549df53afSSimon Budig */ 31649df53afSSimon Budig uint8_t obex_message_builder_header_add_length(uint8_t * buffer, uint16_t buffer_len, uint32_t length); 31749df53afSSimon Budig 31849df53afSSimon Budig /** 3197c006017SMilanka Ringwald * @brief Add application parameters header to current request 3207c006017SMilanka Ringwald * @param buffer 3217c006017SMilanka Ringwald * @param buffer_len 3227c006017SMilanka Ringwald * @param data 3231f6020d5SMilanka Ringwald * @param length of application parameters 32481fb6ec9SMilanka Ringwald * @return status 3257c006017SMilanka Ringwald */ 3267c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_application_parameters(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); 3277c006017SMilanka Ringwald 3287c006017SMilanka Ringwald /** 3297c006017SMilanka Ringwald * @brief Add application parameters header to current request 3307c006017SMilanka Ringwald * @param buffer 3317c006017SMilanka Ringwald * @param buffer_len 3327c006017SMilanka Ringwald * @param data 3331f6020d5SMilanka Ringwald * @param length of challenge response 33481fb6ec9SMilanka Ringwald * @return status 3357c006017SMilanka Ringwald */ 3367c006017SMilanka Ringwald uint8_t obex_message_builder_header_add_challenge_response(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint16_t length); 3377c006017SMilanka Ringwald 3387c006017SMilanka Ringwald /** 3397c006017SMilanka Ringwald * @brief Add body 3407c006017SMilanka Ringwald * @param buffer 3417c006017SMilanka Ringwald * @param buffer_len 3427c006017SMilanka Ringwald * @param data 3431f6020d5SMilanka Ringwald * @param length 34481fb6ec9SMilanka Ringwald * @return status 3457c006017SMilanka Ringwald */ 346948b3642SMilanka Ringwald uint8_t obex_message_builder_body_add_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length); 3477c006017SMilanka Ringwald 34849df53afSSimon Budig /** 34949df53afSSimon Budig * @brief Add body 35049df53afSSimon Budig * @param buffer 35149df53afSSimon Budig * @param buffer_len 35249df53afSSimon Budig * @param data 35349df53afSSimon Budig * @param length 35449df53afSSimon Budig * @param ret_length 35549df53afSSimon Budig * @return status 35649df53afSSimon Budig */ 35749df53afSSimon Budig uint8_t obex_message_builder_body_fillup_static(uint8_t * buffer, uint16_t buffer_len, const uint8_t * data, uint32_t length, uint32_t *ret_length); 35849df53afSSimon Budig 3597c006017SMilanka Ringwald /* API_END */ 3607c006017SMilanka Ringwald 361948b3642SMilanka 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)); 36281fb6ec9SMilanka Ringwald 3637c006017SMilanka Ringwald #if defined __cplusplus 3647c006017SMilanka Ringwald } 3657c006017SMilanka Ringwald #endif 3667c006017SMilanka Ringwald #endif 3677c006017SMilanka Ringwald 368