You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ma...@apache.org on 2008/12/09 10:01:18 UTC
svn commit: r724643 -
/webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c
Author: manjula
Date: Tue Dec 9 01:01:17 2008
New Revision: 724643
URL: http://svn.apache.org/viewvc?rev=724643&view=rev
Log:
Fixes for AXIS2C-1302.
Modified:
webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c
Modified: webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c?rev=724643&r1=724642&r2=724643&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/util/http_transport_utils.c Tue Dec 9 01:01:17 2008
@@ -42,6 +42,7 @@
#include <axutil_uuid_gen.h>
#include <platforms/axutil_platform_auto_sense.h>
#include <axiom_mime_part.h>
+#include <axutil_class_loader.h>
#define AXIOM_MIME_BOUNDARY_BYTE 45
@@ -189,13 +190,22 @@
axis2_char_t * method);
static axis2_status_t
-axis2_http_transport_utils_send_attachment(
+axis2_http_transport_utils_send_attachment_using_file(
const axutil_env_t * env,
axutil_http_chunked_stream_t *chunked_stream,
FILE *fp,
axis2_byte_t *buffer,
int buffer_size);
+static axis2_status_t
+axis2_http_transport_utils_send_attachment_using_callback(
+ const axutil_env_t * env,
+ axutil_http_chunked_stream_t *chunked_stream,
+ axiom_mtom_sending_callback_t *callback,
+ void *handler,
+ void *user_param);
+
+
/***************************** End of function headers ************************/
AXIS2_EXTERN axis2_status_t AXIS2_CALL
@@ -400,9 +410,11 @@
axutil_param_t *buffer_size_param = NULL;
axutil_param_t *max_buffers_param = NULL;
axutil_param_t *attachment_dir_param = NULL;
+ axutil_param_t *callback_name_param = NULL;
axis2_char_t *value_size = NULL;
axis2_char_t *value_num = NULL;
axis2_char_t *value_dir = NULL;
+ axis2_char_t *value_callback = NULL;
int size = 0;
int num = 0;
@@ -440,6 +452,20 @@
}
/* If this paramter is there mime_parser will cached the attachment
* using to the directory for large attachments. */
+
+ callback_name_param = axis2_msg_ctx_get_parameter (msg_ctx,
+ env,
+ AXIS2_MTOM_CACHING_CALLBACK);
+ if(callback_name_param)
+ {
+ value_callback =
+ (axis2_char_t *) axutil_param_get_value (callback_name_param, env);
+ if(value_callback)
+ {
+ axiom_mime_parser_set_caching_callback_name(mime_parser, env, value_callback);
+ }
+ }
+
attachment_dir_param = axis2_msg_ctx_get_parameter (msg_ctx,
env,
AXIS2_ATTACHMENT_DIR);
@@ -853,9 +879,11 @@
axutil_param_t *buffer_size_param = NULL;
axutil_param_t *max_buffers_param = NULL;
axutil_param_t *attachment_dir_param = NULL;
+ axutil_param_t *callback_name_param = NULL;
axis2_char_t *value_size = NULL;
axis2_char_t *value_num = NULL;
axis2_char_t *value_dir = NULL;
+ axis2_char_t *value_callback = NULL;
int size = 0;
int num = 0;
@@ -889,6 +917,20 @@
axiom_mime_parser_set_max_buffers(mime_parser, env, num);
}
}
+
+ callback_name_param = axis2_msg_ctx_get_parameter (msg_ctx,
+ env,
+ AXIS2_MTOM_CACHING_CALLBACK);
+ if(callback_name_param)
+ {
+ value_callback =
+ (axis2_char_t *) axutil_param_get_value (callback_name_param, env);
+ if(value_callback)
+ {
+ axiom_mime_parser_set_caching_callback_name(mime_parser, env, value_callback);
+ }
+ }
+
attachment_dir_param = axis2_msg_ctx_get_parameter (msg_ctx,
env,
@@ -2042,14 +2084,19 @@
axutil_param_t *buffer_size_param = NULL;
axutil_param_t *max_buffers_param = NULL;
axutil_param_t *attachment_dir_param = NULL;
+ axutil_param_t *callback_name_param = NULL;
axis2_char_t *value_size = NULL;
axis2_char_t *value_num = NULL;
axis2_char_t *value_dir = NULL;
+ axis2_char_t *value_callback = NULL;
int size = 0;
int num = 0;
mime_parser = axiom_mime_parser_create(env);
+ /* Following are the parameters in the axis2.xml regarding MTOM */
+
+
buffer_size_param =
axis2_msg_ctx_get_parameter (msg_ctx,
env,
@@ -2079,6 +2126,19 @@
axiom_mime_parser_set_max_buffers(mime_parser, env, num);
}
}
+
+ callback_name_param = axis2_msg_ctx_get_parameter (msg_ctx,
+ env,
+ AXIS2_MTOM_CACHING_CALLBACK);
+ if(callback_name_param)
+ {
+ value_callback =
+ (axis2_char_t *) axutil_param_get_value (callback_name_param, env);
+ if(value_callback)
+ {
+ axiom_mime_parser_set_caching_callback_name(mime_parser, env, value_callback);
+ }
+ }
attachment_dir_param = axis2_msg_ctx_get_parameter (msg_ctx,
env,
@@ -3123,7 +3183,8 @@
axis2_http_transport_utils_send_mtom_message(
axutil_http_chunked_stream_t * chunked_stream,
const axutil_env_t * env,
- axutil_array_list_t *mime_parts)
+ axutil_array_list_t *mime_parts,
+ axis2_char_t *sending_callback_name)
{
int i = 0;
axiom_mime_part_t *mime_part = NULL;
@@ -3139,7 +3200,7 @@
mime_part = (axiom_mime_part_t *)axutil_array_list_get(
mime_parts, env, i);
- /* If it is a buffer just wite it to the wire. This incudes mime_bounadaries,
+ /* If it is a buffer just write it to the wire. This includes mime_bounadaries,
* mime_headers and SOAP */
if((mime_part->type) == AXIOM_MIME_PART_BUFFER)
@@ -3196,13 +3257,43 @@
(output_buffer_size + 1) * sizeof(axis2_char_t));
/*This is the method responsible for writing to the wire */
- status = axis2_http_transport_utils_send_attachment(env, chunked_stream,
+ status = axis2_http_transport_utils_send_attachment_using_file(env, chunked_stream,
f, output_buffer, output_buffer_size);
if(status == AXIS2_FAILURE)
{
return status;
}
}
+ else if((mime_part->type) == AXIOM_MIME_PART_CALLBACK)
+ {
+ void *handler = NULL;
+ axiom_mtom_sending_callback_t *callback = NULL;
+
+ handler = axis2_http_transport_utils_initiate_callback(env,
+ sending_callback_name, mime_part->user_param, &callback);
+
+ if(handler)
+ {
+ status = axis2_http_transport_utils_send_attachment_using_callback(env,
+ chunked_stream, callback, handler, mime_part->user_param);
+ }
+ else
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "MTOM Sending Callback loading failed");
+ status = AXIS2_FAILURE;
+ }
+
+ if(callback)
+ {
+ AXIOM_MTOM_SENDING_CALLBACK_FREE(callback, env);
+ callback = NULL;
+ }
+
+ if(status == AXIS2_FAILURE)
+ {
+ return status;
+ }
+ }
else
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unknown mime_part.");
@@ -3234,7 +3325,7 @@
static axis2_status_t
-axis2_http_transport_utils_send_attachment(
+axis2_http_transport_utils_send_attachment_using_file(
const axutil_env_t * env,
axutil_http_chunked_stream_t *chunked_stream,
FILE *fp,
@@ -3344,3 +3435,120 @@
}
}
+AXIS2_EXTERN void *AXIS2_CALL axis2_http_transport_utils_initiate_callback(
+ const axutil_env_t *env,
+ axis2_char_t *callback_name,
+ void *user_param,
+ axiom_mtom_sending_callback_t **callback)
+{
+
+ axutil_dll_desc_t *dll_desc = NULL;
+ axutil_param_t *impl_info_param = NULL;
+ void *ptr = NULL;
+
+ if(callback_name)
+ {
+ AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Trying to load module = %s",
+ callback_name);
+ dll_desc = axutil_dll_desc_create(env);
+ axutil_dll_desc_set_name(dll_desc, env, callback_name);
+ impl_info_param = axutil_param_create(env, NULL, dll_desc);
+ /*Set the free function*/
+ axutil_param_set_value_free(impl_info_param, env, axutil_dll_desc_free_void_arg);
+ axutil_class_loader_init(env);
+ ptr = axutil_class_loader_create_dll(env, impl_info_param);
+
+ if (!ptr)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "Unable to load the module %s. ERROR", callback_name);
+ return NULL;
+ }
+
+ *callback = (axiom_mtom_sending_callback_t *)ptr;
+ (*callback)->param = impl_info_param;
+
+ return AXIOM_MTOM_SENDING_CALLBACK_INIT_HANDLER(*callback, env, user_param);
+ }
+
+ else
+ {
+ return NULL;
+ }
+}
+
+static axis2_status_t
+axis2_http_transport_utils_send_attachment_using_callback(
+ const axutil_env_t * env,
+ axutil_http_chunked_stream_t *chunked_stream,
+ axiom_mtom_sending_callback_t *callback,
+ void *handler,
+ void *user_param)
+{
+ int count = 0;
+ int len = 0;
+ int written = 0;
+ axis2_status_t status = AXIS2_SUCCESS;
+ axis2_char_t *buffer = NULL;
+
+ /* Keep on loading the data in a loop until
+ * all the data is sent */
+
+ while((count = AXIOM_MTOM_SENDING_CALLBACK_LOAD_DATA(callback, env, handler, &buffer)) > 0)
+ {
+ written = 0;
+ while(written < count)
+ {
+ len = 0;
+ len = axutil_http_chunked_stream_write(chunked_stream, env,
+ buffer + written, count - written);
+ if(len == -1)
+ {
+ status = AXIS2_FAILURE;
+ break;
+ }
+ else
+ {
+ written += len;
+ }
+ }
+ }
+
+ if (status == AXIS2_FAILURE)
+ {
+ AXIOM_MTOM_SENDING_CALLBACK_CLOSE_HANDLER(callback, env, handler);
+ return status;
+ }
+
+ status = AXIOM_MTOM_SENDING_CALLBACK_CLOSE_HANDLER(callback, env, handler);
+ return status;
+}
+
+
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL axis2_http_transport_utils_is_callback_required(
+ const axutil_env_t *env,
+ axutil_array_list_t *mime_parts)
+{
+ int size = 0;
+ int i = 0;
+ axiom_mime_part_t *mime_part = NULL;
+ axis2_bool_t is_required = AXIS2_FALSE;
+
+ size = axutil_array_list_size(mime_parts, env);
+
+ for(i = 0; i < size; i++)
+ {
+ mime_part = (axiom_mime_part_t *)axutil_array_list_get(mime_parts, env, i);
+ if(mime_part)
+ {
+ if(mime_part->type == AXIOM_MIME_PART_CALLBACK)
+ {
+ is_required = AXIS2_TRUE;
+ break;
+ }
+ }
+ }
+
+ return is_required;
+
+}