20 static const char boundary_characters[] =
"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
25 #define BOUNDARY_SIGN_LENGTH (sizeof(boundary_sign) - 1) 26 #define CONTENT_TYPE_LENGTH (sizeof(content_type) - 1) 27 #define BOUNDARY_KEY_LENGTH (sizeof(boundary_key) - 1) 28 #define DOUBLE_ENDLINE_LENGTH (sizeof(endline) - 1) 29 #define ENDLINE_LENGTH (DOUBLE_ENDLINE_LENGTH / 2) 30 #define BOUNDARY_LENGTH 20 31 #define CONTENT_TYPE_MULTIPART_RELATED_LENGTH (sizeof(content_type_multipart_related) - 1) 32 #define CONTENT_TYPE_META_JSON_LENGTH (sizeof(content_type_meta_json) - 1) 33 #define CONTENT_TYPE_APPLICATION_JSON_LENGTH (sizeof(content_type_application_json) - 1) 35 #define MULTIPART_BASE_SIZE (5 * BOUNDARY_SIGN_LENGTH + 5 * BOUNDARY_LENGTH + 3 * CONTENT_TYPE_LENGTH + CONTENT_TYPE_MULTIPART_RELATED_LENGTH \ 36 + BOUNDARY_KEY_LENGTH + CONTENT_TYPE_META_JSON_LENGTH + 12 * ENDLINE_LENGTH) 38 #define MULTIPART_CLOSE_LENGTH (BOUNDARY_LENGTH + 2 * BOUNDARY_SIGN_LENGTH) 121 MCL_DEBUG_ENTRY(
"char *buffer = <%p>, mcl_size_t *buffer_size, void *item = <%p>, const char *boundary = <%p>", buffer, buffer_size, item, boundary);
135 char *position = buffer;
139 MCL_DEBUG_ENTRY(
"char *buffer = <%p>, void *item = <%p>, const char *boundary = <%p>, const char *payload_content_type = <%p>, "\
140 "multipart_add_payload_callback callback = <%p>, void *user_context = <%p>", buffer, item, boundary, payload_content_type, callback, user_context);
152 switch (multipart_state)
209 code =
_add_item_payload(&position, &remaining_size, item, callback, user_context);
230 *buffer_size = remaining_size;
241 MCL_DEBUG_ENTRY(
"void *item = <%p>, const char *payload_content_type = <%p>", item, payload_content_type);
254 MCL_DEBUG_ENTRY(
"char *buffer, mcl_size_t *buffer_size = <%p>, const char *boundary = <%s>", buffer, buffer_size, boundary);
310 char *position = buffer;
312 MCL_DEBUG_ENTRY(
"char *buffer = <%p>, const char *boundary = <%p>, mcl_bool_t add_and_close = <%d>", buffer, boundary, add_and_close);
342 if (*remaining_size >= item_meta_json_length)
345 (*remaining_size) -= item_meta_json_length;
346 (*position) += item_meta_json_length;
366 if (
MCL_NULL == payload_content_type)
374 source = payload_content_type;
377 if (*remaining_size >= length)
380 (*position) += length;
381 (*remaining_size) -= length;
405 if (*remaining_size >= payload_length)
408 (*position) += payload_length;
409 (*remaining_size) -= payload_length;
425 callback_value = callback(*position, 1, *remaining_size, user_context);
426 (*position) += callback_value;
427 (*remaining_size) -= callback_value;
428 }
while ((0 != callback_value) && (0 != *remaining_size));
430 if ((0 == *remaining_size) && (0 != callback_value))
static const char boundary_characters[]
mcl_size_t json_get_item_size(void *item)
mcl_error_t json_from_item_meta(void *item, char **json_string)
static const char boundary_sign[]
mcl_error_t multipart_add_tuple(char *buffer, mcl_size_t *buffer_size, void *item, const char *boundary)
mcl_size_t multipart_get_overhead_size(void)
mcl_size_t multipart_get_tuple_size(void *item, const char *payload_content_type)
static void _add_boundary(char *buffer, const char *boundary, mcl_bool_t add_and_close)
static const mcl_size_t _space_needed_for_state[MULTIPART_STATE_END]
#define MCL_DEBUG_ENTRY(...)
static mcl_error_t _add_item_meta_json(char **position, mcl_size_t *remaining_size, void *item)
static const char boundary_key[]
static mcl_error_t _add_item_payload(char **position, mcl_size_t *remaining_size, void *item, multipart_add_payload_callback callback, void *user_context)
#define DOUBLE_ENDLINE_LENGTH
mcl_error_t multipart_add_tuple_with_callback(char *buffer, mcl_size_t *buffer_size, void *item, const char *boundary, const char *payload_content_type, multipart_add_payload_callback callback, void *user_context)
MCL_CORE_EXPORT mcl_size_t mcl_string_util_strlen(const char *buffer)
#define MULTIPART_BASE_SIZE
#define MCL_ASSERT_CODE_MESSAGE(condition, return_code,...)
#define CONTENT_TYPE_LENGTH
mcl_size_t(* multipart_add_payload_callback)(char *buffer, mcl_size_t size, mcl_size_t count, void *user_context)
static const char content_type_application_json[]
Common module interface header file.
#define BOUNDARY_SIGN_LENGTH
static mcl_error_t _add_item_payload_content_type(char **position, mcl_size_t *remaining_size, const char *payload_content_type)
static const char content_type_meta_json[]
#define CONTENT_TYPE_MULTIPART_RELATED_LENGTH
#define MCL_ASSERT_STATEMENT_CODE_MESSAGE(condition, statement, return_code,...)
MCL_CORE_EXPORT void mcl_string_util_memcpy(void *destination, const void *source, mcl_size_t count)
static const char content_type[]
#define MULTIPART_CLOSE_LENGTH
mcl_error_t multipart_close(char *buffer, mcl_size_t *buffer_size, const char *boundary)
mcl_error_t multipart_generate_boundary(char **boundary)
static const char content_type_multipart_related[]
MCL_CORE_EXPORT mcl_error_t mcl_random_generate_bytes(unsigned char *buffer, mcl_size_t size)
#define CONTENT_TYPE_META_JSON_LENGTH
static const char endline[]
#define BOUNDARY_KEY_LENGTH
#define MCL_MALLOC(bytes)
mcl_error_t json_from_item_payload(void *item, char **json_string)
#define MCL_DEBUG_LEAVE(...)
#define CONTENT_TYPE_APPLICATION_JSON_LENGTH
Multipart module header file.