summaryrefslogtreecommitdiffstats
path: root/src/core/transport/amqp/sender
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/transport/amqp/sender')
-rw-r--r--src/core/transport/amqp/sender/Makefile.am26
-rw-r--r--src/core/transport/amqp/sender/axis2_amqp_sender.c344
-rw-r--r--src/core/transport/amqp/sender/axis2_amqp_sender.h63
-rw-r--r--src/core/transport/amqp/sender/qpid_sender/Makefile.am23
-rw-r--r--src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.cpp242
-rw-r--r--src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.h49
-rw-r--r--src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.cpp130
-rw-r--r--src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.h50
8 files changed, 927 insertions, 0 deletions
diff --git a/src/core/transport/amqp/sender/Makefile.am b/src/core/transport/amqp/sender/Makefile.am
new file mode 100644
index 0000000..8af0c7b
--- /dev/null
+++ b/src/core/transport/amqp/sender/Makefile.am
@@ -0,0 +1,26 @@
+SUBDIRS = qpid_sender
+
+lib_LTLIBRARIES = libaxis2_amqp_sender.la
+
+libaxis2_amqp_sender_la_SOURCES = axis2_amqp_sender.c
+
+libaxis2_amqp_sender_la_LIBADD = $(top_builddir)/util/src/libaxutil.la \
+ $(top_builddir)/src/core/transport/amqp/util/libaxis2_amqp_util.la \
+ $(top_builddir)/src/core/transport/amqp/sender/qpid_sender/libaxis2_qpid_sender.la
+
+libaxis2_amqp_sender_la_LDFLAGS = -version-info $(VERSION_NO)
+
+INCLUDES = -I$(top_builddir)/include \
+ -I$(top_builddir)/src/core/transport/amqp/util \
+ -I$(top_builddir)/src/core/transport/amqp/receiver \
+ -I$(top_builddir)/src/core/transport/amqp/receiver/qpid_receiver \
+ -I$(top_builddir)/src/core/transport/amqp/sender \
+ -I$(top_builddir)/src/core/transport/amqp/sender/qpid_sender \
+ -I$(top_builddir)/src/core/description \
+ -I$(top_builddir)/src/core/context \
+ -I$(top_builddir)/src/core/phaseresolver \
+ -I$(top_builddir)/src/core/engine \
+ -I$(top_builddir)/src/core/deployment \
+ -I$(top_builddir)/util/include \
+ -I$(top_builddir)/axiom/include
+
diff --git a/src/core/transport/amqp/sender/axis2_amqp_sender.c b/src/core/transport/amqp/sender/axis2_amqp_sender.c
new file mode 100644
index 0000000..aae5496
--- /dev/null
+++ b/src/core/transport/amqp/sender/axis2_amqp_sender.c
@@ -0,0 +1,344 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <axiom_soap.h>
+#include <axis2_transport_in_desc.h>
+#include <axis2_amqp_defines.h>
+#include <axis2_amqp_util.h>
+#include <axis2_amqp_receiver.h>
+#include <axis2_amqp_sender.h>
+
+static const axis2_transport_sender_ops_t amqp_sender_ops =
+{
+ axis2_amqp_sender_init,
+ axis2_amqp_sender_invoke,
+ axis2_amqp_sender_clean_up,
+ axis2_amqp_sender_free
+};
+
+AXIS2_EXTERN axis2_transport_sender_t* AXIS2_CALL
+axis2_amqp_sender_create(
+ const axutil_env_t* env)
+{
+ AXIS2_ENV_CHECK(env, NULL);
+
+ axis2_amqp_sender_resource_pack_t* sender_resource_pack = NULL;
+
+ sender_resource_pack = (axis2_amqp_sender_resource_pack_t*)AXIS2_MALLOC(env->allocator,
+ sizeof(axis2_amqp_sender_resource_pack_t));
+
+ if(!sender_resource_pack)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+ return NULL;
+ }
+
+ sender_resource_pack->sender.ops = &amqp_sender_ops;
+ sender_resource_pack->conf_ctx = NULL;
+
+ return &(sender_resource_pack->sender);
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_amqp_sender_init(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env,
+ axis2_conf_ctx_t* conf_ctx,
+ axis2_transport_out_desc_t* out_desc)
+{
+ axis2_amqp_sender_resource_pack_t* sender_resource_pack = NULL;
+ axutil_property_t* property = NULL;
+ int* request_timeout = (int*)AXIS2_MALLOC(env->allocator, sizeof(int));
+ *request_timeout = AXIS2_QPID_NULL_CONF_INT;
+
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+ sender_resource_pack = AXIS2_AMQP_SENDER_TO_RESOURCE_PACK(sender);
+ sender_resource_pack->conf_ctx = conf_ctx;
+
+ /* Set request timeout */
+ *request_timeout = axis2_amqp_util_get_out_desc_conf_value_int(out_desc, env,
+ AXIS2_AMQP_CONF_QPID_REQUEST_TIMEOUT);
+ if(*request_timeout == AXIS2_QPID_NULL_CONF_INT)
+ {
+ *request_timeout = AXIS2_QPID_DEFAULT_REQUEST_TIMEOUT;
+ }
+ property = axutil_property_create_with_args(env, AXIS2_SCOPE_APPLICATION, 0, 0,
+ (void*)request_timeout);
+ axis2_conf_ctx_set_property(sender_resource_pack->conf_ctx, env,
+ AXIS2_AMQP_CONF_CTX_PROPERTY_REQUEST_TIMEOUT, property);
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_amqp_sender_invoke(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env,
+ axis2_msg_ctx_t* msg_ctx)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FAILURE);
+
+ axiom_soap_envelope_t* request_soap_envelope = NULL;
+ axiom_xml_writer_t* xml_writer = NULL;
+ axiom_output_t* request_om_output = NULL;
+ axis2_char_t* request_content = NULL;
+ axis2_bool_t is_server = AXIS2_TRUE;
+ axis2_bool_t is_soap_11 = AXIS2_FALSE;
+ axutil_string_t* content_type = NULL;
+ const axis2_char_t* soap_action = NULL;
+ axis2_bool_t do_mtom = AXIS2_FALSE;
+ axis2_bool_t status = AXIS2_FAILURE;
+
+ request_soap_envelope = axis2_msg_ctx_get_soap_envelope(msg_ctx, env);
+
+ xml_writer = axiom_xml_writer_create_for_memory(env, NULL, AXIS2_TRUE, 0,
+ AXIS2_XML_PARSER_TYPE_BUFFER);
+ if(!xml_writer)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Failed to Create XML Writer");
+ return AXIS2_FAILURE;
+ }
+
+ request_om_output = axiom_output_create(env, xml_writer);
+ if(!request_om_output)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Failed to Create OM Output");
+ axiom_xml_writer_free(xml_writer, env);
+ xml_writer = NULL;
+ return AXIS2_FAILURE;
+ }
+
+ is_soap_11 = axis2_msg_ctx_get_is_soap_11(msg_ctx, env);
+
+ /* Set SOAP version */
+ axiom_output_set_soap11(request_om_output, env, is_soap_11);
+
+ /* Content-Type */
+ if(AXIS2_TRUE == is_soap_11)
+ {
+ /* SOAP1.1 */
+ content_type = axutil_string_create(env, AXIS2_AMQP_HEADER_ACCEPT_TEXT_XML);
+ }
+ else
+ {
+ /* SOAP1.2 */
+ content_type = axutil_string_create(env, AXIS2_AMQP_HEADER_ACCEPT_APPL_SOAP);
+ }
+
+ /* SOAP action */
+ soap_action = axutil_string_get_buffer(axis2_msg_ctx_get_soap_action(msg_ctx, env), env);
+
+ if(!soap_action)
+ soap_action = "";
+
+ /* Handle MTOM */
+ do_mtom = axis2_msg_ctx_get_doing_mtom(msg_ctx, env);
+
+ axiom_output_set_do_optimize(request_om_output, env, do_mtom);
+ axiom_soap_envelope_serialize(request_soap_envelope, env, request_om_output, AXIS2_FALSE);
+
+ if(do_mtom)
+ {
+ axis2_status_t mtom_status = AXIS2_FAILURE;
+ axutil_array_list_t* mime_parts = NULL;
+
+ mtom_status = axiom_output_flush(request_om_output, env);
+
+ if(mtom_status == AXIS2_SUCCESS)
+ {
+ mime_parts = axiom_output_get_mime_parts(request_om_output, env);
+ if(!mime_parts)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "Unable to create the mime part list from request_om_output");
+
+ return AXIS2_FAILURE;
+ }
+ else
+ {
+ axis2_msg_ctx_set_mime_parts(msg_ctx, env, mime_parts);
+ }
+ }
+
+ content_type = axutil_string_create(env, axiom_output_get_content_type(request_om_output,
+ env));
+ }
+
+ request_content = (axis2_char_t*)axiom_xml_writer_get_xml(xml_writer, env);
+ if(!request_content)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Failed to Serialize the SOAP Envelope");
+ return AXIS2_FAILURE;
+ }
+
+ is_server = axis2_amqp_util_msg_ctx_get_server_side(msg_ctx, env);
+
+ if(is_server)
+ {
+ status = axis2_qpid_send(request_content, env, axutil_string_get_buffer(content_type, env),
+ soap_action, msg_ctx);
+ }
+ else
+ {
+ if(AXIS2_TRUE == axis2_amqp_util_msg_ctx_get_use_separate_listener(msg_ctx, env)) /* Dual Channel */
+ {
+ status = axis2_qpid_send(request_content, env, axutil_string_get_buffer(content_type,
+ env), soap_action, msg_ctx);
+ }
+ else
+ {
+ axis2_op_t* op = NULL;
+ const axis2_char_t* mep = NULL;
+
+ op = axis2_msg_ctx_get_op(msg_ctx, env);
+
+ if(op)
+ {
+ mep = axis2_op_get_msg_exchange_pattern(op, env);
+ }
+
+ axis2_amqp_response_t* response = NULL;
+ response = axis2_qpid_send_receive(request_content, env, axutil_string_get_buffer(
+ content_type, env), soap_action, msg_ctx);
+
+ if(response)
+ {
+ /* Create in stream */
+ if(response->data)
+ {
+ axutil_stream_t* in_stream = NULL;
+ axutil_property_t* property = NULL;
+
+ in_stream = axutil_stream_create_basic(env);
+ axutil_stream_write(in_stream, env, response->data, response->length);
+
+ property = axutil_property_create(env);
+ axutil_property_set_scope(property, env, AXIS2_SCOPE_REQUEST);
+ axutil_property_set_free_func(property, env, axutil_stream_free_void_arg);
+ axutil_property_set_value(property, env, in_stream);
+
+ axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_TRANSPORT_IN, property);
+ }
+
+ if(mep)
+ {
+ if(0 == axutil_strcmp(mep, AXIS2_MEP_URI_OUT_IN)) /* Out-In */
+ {
+ axiom_soap_envelope_t* response_soap_envelope = NULL;
+
+ response_soap_envelope = axis2_amqp_util_get_soap_envelope(response, env,
+ msg_ctx);
+ if(response_soap_envelope)
+ {
+ axis2_msg_ctx_set_response_soap_envelope(msg_ctx, env,
+ response_soap_envelope);
+ }
+ }
+ }
+
+ status = AXIS2_SUCCESS;
+
+ axis2_msg_ctx_set_status_code(msg_ctx, env, status);
+
+ axis2_amqp_response_free(response, env);
+ }
+ else
+ {
+ if(mep)
+ {
+ if(axutil_strcmp(mep, AXIS2_MEP_URI_OUT_ONLY) == 0 || axutil_strcmp(mep,
+ AXIS2_MEP_URI_ROBUST_OUT_ONLY) == 0) /* One-way */
+ {
+ status = AXIS2_SUCCESS;
+
+ /* Set status code in msg_ctx */
+ axis2_msg_ctx_set_status_code(msg_ctx, env, status);
+ }
+ }
+ }
+ }
+ }
+
+ if(content_type)
+ axutil_string_free(content_type, env);
+
+ return status;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_amqp_sender_clean_up(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env,
+ axis2_msg_ctx_t* msg_ctx)
+{
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN void AXIS2_CALL
+axis2_amqp_sender_free(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env)
+{
+ AXIS2_ENV_CHECK(env, void);
+
+ axis2_amqp_sender_resource_pack_t* sender_resource_pack = NULL;
+ sender_resource_pack = AXIS2_AMQP_SENDER_TO_RESOURCE_PACK(sender);
+
+ AXIS2_FREE(env->allocator, sender_resource_pack);
+}
+
+/* Library Exports */
+
+AXIS2_EXPORT int
+#ifndef AXIS2_STATIC_DEPLOY
+axis2_get_instance(
+#else
+ axis2_amqp_sender_get_instance(
+#endif
+ struct axis2_transport_sender** inst,
+ const axutil_env_t* env)
+{
+ int status = AXIS2_SUCCESS;
+
+ *inst = axis2_amqp_sender_create(env);
+ if(!(*inst))
+ {
+ status = AXIS2_FAILURE;
+ }
+
+ return status;
+}
+
+AXIS2_EXPORT int
+#ifndef AXIS2_STATIC_DEPLOY
+axis2_remove_instance(
+#else
+ axis2_amqp_sender_remove_instance(
+#endif
+ axis2_transport_sender_t* inst,
+ const axutil_env_t* env)
+{
+ if(inst)
+ {
+ axis2_transport_sender_free(inst, env);
+ }
+
+ return AXIS2_SUCCESS;
+}
+
diff --git a/src/core/transport/amqp/sender/axis2_amqp_sender.h b/src/core/transport/amqp/sender/axis2_amqp_sender.h
new file mode 100644
index 0000000..b523347
--- /dev/null
+++ b/src/core/transport/amqp/sender/axis2_amqp_sender.h
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AXIS2_AMQP_SENDER_H
+#define AXIS2_AMQP_SENDER_H
+
+#include <axutil_env.h>
+#include <axis2_conf_ctx.h>
+#include <axis2_transport_sender.h>
+#include <axis2_qpid_sender_interface.h>
+
+typedef struct axis2_amqp_sender_resource_pack
+{
+ axis2_transport_sender_t sender;
+ axis2_conf_ctx_t* conf_ctx;
+}
+axis2_amqp_sender_resource_pack_t;
+
+#define AXIS2_AMQP_SENDER_TO_RESOURCE_PACK(amqp_sender) \
+ ((axis2_amqp_sender_resource_pack_t*)(amqp_sender))
+
+AXIS2_EXTERN axis2_transport_sender_t* AXIS2_CALL
+axis2_amqp_sender_create(const axutil_env_t* env);
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_amqp_sender_init(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env,
+ axis2_conf_ctx_t* conf_ctx,
+ axis2_transport_out_desc_t* out_desc);
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_amqp_sender_invoke(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env,
+ axis2_msg_ctx_t* msg_ctx);
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_amqp_sender_clean_up(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env,
+ axis2_msg_ctx_t* msg_ctx);
+
+AXIS2_EXTERN void AXIS2_CALL
+axis2_amqp_sender_free(
+ axis2_transport_sender_t* sender,
+ const axutil_env_t* env);
+
+#endif
diff --git a/src/core/transport/amqp/sender/qpid_sender/Makefile.am b/src/core/transport/amqp/sender/qpid_sender/Makefile.am
new file mode 100644
index 0000000..46dcb5e
--- /dev/null
+++ b/src/core/transport/amqp/sender/qpid_sender/Makefile.am
@@ -0,0 +1,23 @@
+lib_LTLIBRARIES = libaxis2_qpid_sender.la
+
+libaxis2_qpid_sender_la_SOURCES = axis2_qpid_sender.cpp \
+ axis2_qpid_sender_interface.cpp
+
+libaxis2_qpid_sender_la_LIBADD = $(top_builddir)/util/src/libaxutil.la \
+ $(top_builddir)/src/core/transport/amqp/util/libaxis2_amqp_util.la \
+ $(QPID_HOME)/lib/libqpidclient.la
+
+libaxis2_qpid_sender_la_LDFLAGS = g++ -version-info $(VERSION_NO)
+
+INCLUDES = -I$(top_builddir)/include \
+ -I$(top_builddir)/src/core/transport/amqp/sender/qpid_sender \
+ -I$(top_builddir)/src/core/transport/amqp/util \
+ -I$(top_builddir)/src/core/description \
+ -I$(top_builddir)/src/core/context \
+ -I$(top_builddir)/src/core/phaseresolver \
+ -I$(top_builddir)/src/core/engine \
+ -I$(top_builddir)/src/core/deployment \
+ -I$(top_builddir)/util/include \
+ -I$(top_builddir)/axiom/include \
+ -I$(QPID_HOME)/include
+
diff --git a/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.cpp b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.cpp
new file mode 100644
index 0000000..7f0799b
--- /dev/null
+++ b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.cpp
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * tcp://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <qpid/client/Connection.h>
+#include <qpid/client/Session.h>
+#include <qpid/client/Message.h>
+#include <qpid/client/SubscriptionManager.h>
+#include <qpid/sys/Time.h>
+#include <axis2_amqp_defines.h>
+#include <axiom_mime_part.h>
+#include <axis2_qpid_sender.h>
+#include <fstream>
+
+using namespace std;
+using namespace qpid::client;
+using namespace qpid::framing;
+
+Axis2QpidSender::Axis2QpidSender(
+ string qpidBrokerIP,
+ int qpidBrokerPort,
+ const axutil_env_t* env)
+{
+ this->qpidBrokerIP = qpidBrokerIP;
+ this->qpidBrokerPort = qpidBrokerPort;
+ this->env = env;
+ this->responseContent = "";
+ this->responseContentType = "";
+}
+
+Axis2QpidSender::~Axis2QpidSender(
+ void)
+{
+}
+
+bool
+Axis2QpidSender::SendReceive(
+ string messageContent,
+ string toQueueName,
+ bool isSOAP11,
+ string contentType,
+ string soapAction,
+ axutil_array_list_t* mime_parts,
+ int timeout)
+{
+ bool status = false;
+ this->responseContent = "";
+ this->responseContentType = "";
+
+ try
+ {
+ Connection connection;
+ connection.open(qpidBrokerIP, qpidBrokerPort);
+
+ Session session = connection.newSession();
+
+ /* Declare Private Queue */
+ string replyToQueueName = AXIS2_AMQP_TEMP_QUEUE_NAME_PREFIX;
+ replyToQueueName.append(axutil_uuid_gen(env));
+
+ session.queueDeclare(arg::queue = replyToQueueName, arg::autoDelete = true);
+ session.exchangeBind(arg::exchange = AXIS2_AMQP_EXCHANGE_DIRECT, arg::queue
+ = replyToQueueName, arg::bindingKey = replyToQueueName);
+
+ /* Create Message */
+ Message reqMessage;
+
+ reqMessage.getDeliveryProperties().setRoutingKey(toQueueName);
+ reqMessage.getMessageProperties().setReplyTo(ReplyTo(AXIS2_AMQP_EXCHANGE_DIRECT,
+ replyToQueueName));
+
+ reqMessage.getHeaders().setString(AXIS2_AMQP_HEADER_CONTENT_TYPE, contentType);
+ reqMessage.getHeaders().setString(AXIS2_AMQP_HEADER_SOAP_ACTION, soapAction);
+
+ if(mime_parts)
+ {
+ string mimeBody;
+ GetMimeBody(mime_parts, mimeBody);
+
+ messageContent.clear();/* MIME parts include SOAP envelop */
+
+ messageContent.append(mimeBody);
+ }
+
+ reqMessage.setData(messageContent);
+
+ session.messageTransfer(arg::content = reqMessage, arg::destination
+ = AXIS2_AMQP_EXCHANGE_DIRECT);
+
+ /* Create subscription manager */
+ SubscriptionManager subscriptionManager(session);
+
+ Message resMessage;
+ qpid::sys::Duration reqTimeout(timeout * AXIS2_AMQP_NANOSEC_PER_MILLISEC);
+
+ if(subscriptionManager.get(resMessage, replyToQueueName, reqTimeout))
+ {
+ responseContent = resMessage.getData();
+ responseContentType = resMessage.getHeaders().getAsString(
+ AXIS2_AMQP_HEADER_CONTENT_TYPE);
+
+ status = true;
+ }
+
+ connection.close();
+ }
+ catch(const std::exception& e)
+ {
+ }
+
+ return status;
+}
+
+bool
+Axis2QpidSender::Send(
+ string messageContent,
+ string toQueueName,
+ string replyToQueueName,
+ bool isSOAP11,
+ string contentType,
+ string soapAction,
+ axutil_array_list_t* mime_parts)
+{
+ bool status = false;
+
+ try
+ {
+ Connection connection;
+ connection.open(qpidBrokerIP, qpidBrokerPort);
+
+ Session session = connection.newSession();
+
+ /* Create Message */
+ Message message;
+
+ message.getDeliveryProperties().setRoutingKey(toQueueName);
+
+ if(!replyToQueueName.empty()) /* Client dual-channel */
+ {
+ message.getMessageProperties().setReplyTo(ReplyTo(AXIS2_AMQP_EXCHANGE_DIRECT,
+ replyToQueueName));
+
+ session.queueDeclare(arg::queue = replyToQueueName);
+ session.exchangeBind(arg::exchange = AXIS2_AMQP_EXCHANGE_DIRECT, arg::queue
+ = replyToQueueName, arg::bindingKey = replyToQueueName);
+ }
+
+ message.getHeaders().setString(AXIS2_AMQP_HEADER_CONTENT_TYPE, contentType);
+ message.getHeaders().setString(AXIS2_AMQP_HEADER_SOAP_ACTION, soapAction);
+
+ if(mime_parts)
+ {
+ string mimeBody;
+ GetMimeBody(mime_parts, mimeBody);
+
+ messageContent.clear();/* MIME parts include SOAP envelop */
+
+ messageContent.append(mimeBody);
+ }
+
+ message.setData(messageContent);
+
+ session.messageTransfer(arg::content = message, arg::destination
+ = AXIS2_AMQP_EXCHANGE_DIRECT);
+
+ connection.close();
+
+ status = true;
+ }
+ catch(const std::exception& e)
+ {
+ }
+
+ return status;
+}
+
+void
+Axis2QpidSender::GetMimeBody(
+ axutil_array_list_t* mime_parts,
+ string& mimeBody)
+{
+ int i = 0;
+ axiom_mime_part_t *mime_part = NULL;
+ axis2_status_t status = AXIS2_SUCCESS;
+
+ if(!mime_parts)
+ return;
+
+ for(i = 0; i < axutil_array_list_size(mime_parts, env); i++)
+ {
+ mime_part = (axiom_mime_part_t *)axutil_array_list_get(mime_parts, env, i);
+
+ if(mime_part->type == AXIOM_MIME_PART_BUFFER)
+ {
+ mimeBody.append(mime_part->part, mime_part->part_size);
+ }
+ else if(mime_part->type == AXIOM_MIME_PART_FILE)
+ {
+ int length;
+ char* buffer;
+
+ ifstream file;
+ file.open(mime_part->file_name, ios::binary);
+
+ file.seekg(0, ios::end);
+ length = file.tellg();
+ file.seekg(0, ios::beg);
+
+ buffer = new char[length];
+
+ file.read(buffer, length);
+ file.close();
+
+ mimeBody.append(buffer, length);
+
+ delete[] buffer;
+ }
+ else
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unknown mime type");
+ return;
+ }
+
+ if(status == AXIS2_FAILURE)
+ {
+ break;
+ }
+ }
+}
diff --git a/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.h b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.h
new file mode 100644
index 0000000..8c94cfa
--- /dev/null
+++ b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender.h
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * tcp://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AXIS2_QPID_SENDER_H
+#define AXIS2_QPID_SENDER_H
+
+#include <axis2_util.h>
+#include <sstream>
+#include <string>
+
+using std::string;
+
+class Axis2QpidSender
+{
+ public:
+ Axis2QpidSender(string qpidBrokerIP, int qpidBrokerPort, const axutil_env_t* env);
+ ~Axis2QpidSender(void);
+
+ bool SendReceive(string messageContent, string toQueueName, bool isSOAP11,
+ string contentType, string soapAction, axutil_array_list_t* mime_parts, int timeout);
+ bool Send(string messageContent, string toQueueName, string replyToQueueName, bool isSOAP11,
+ string contentType, string soapAction, axutil_array_list_t* mime_parts);
+
+ string responseContent;
+ string responseContentType;
+
+ private:
+ void GetMimeBody(axutil_array_list_t* mime_parts, string& mimeBody);
+
+ string qpidBrokerIP;
+ int qpidBrokerPort;
+ const axutil_env_t* env;
+};
+
+#endif
diff --git a/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.cpp b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.cpp
new file mode 100644
index 0000000..ac4f51e
--- /dev/null
+++ b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.cpp
@@ -0,0 +1,130 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include <axis2_amqp_util.h>
+#include <axis2_qpid_sender.h>
+#include <axis2_qpid_sender_interface.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+AXIS2_EXTERN axis2_amqp_response_t* AXIS2_CALL
+axis2_qpid_send_receive(
+ const axis2_char_t* request_content,
+ const axutil_env_t* env,
+ const axis2_char_t* content_type,
+ const axis2_char_t* soap_action,
+ axis2_msg_ctx_t* msg_ctx)
+{
+ axis2_amqp_destination_info_t* destination_info = NULL;
+ destination_info = axis2_amqp_util_msg_ctx_get_destination_info(msg_ctx, env);
+
+ if (!destination_info || !destination_info->broker_ip ||
+ !destination_info->broker_port || !destination_info->queue_name)
+ {
+ return NULL;
+ }
+
+ axis2_bool_t is_soap_11 = axis2_msg_ctx_get_is_soap_11(msg_ctx, env);
+ axutil_array_list_t* mime_parts = axis2_msg_ctx_get_mime_parts(msg_ctx, env);
+ int timeout = axis2_amqp_util_msg_ctx_get_request_timeout(msg_ctx, env);
+
+ /* Get Response */
+ Axis2QpidSender qpid_sender(destination_info->broker_ip,
+ destination_info->broker_port, env);
+
+ bool status = qpid_sender.SendReceive(request_content, destination_info->queue_name,
+ is_soap_11, content_type, soap_action, mime_parts, timeout);
+
+ axis2_amqp_destination_info_free(destination_info, env);
+
+ if (!status)
+ {
+ return NULL;
+ }
+
+ /* Create response */
+ axis2_amqp_response_t* response = (axis2_amqp_response_t*)AXIS2_MALLOC(
+ env->allocator, sizeof(axis2_amqp_response_t));
+
+ /* Data */
+ response->data = AXIS2_MALLOC(env->allocator, qpid_sender.responseContent.size());
+ memcpy(response->data, qpid_sender.responseContent.c_str(),
+ qpid_sender.responseContent.size());
+
+ /* Length */
+ response->length = qpid_sender.responseContent.size();
+
+ /* ContentType */
+ response->content_type = (axis2_char_t*)AXIS2_MALLOC(
+ env->allocator, qpid_sender.responseContentType.size() + 1);
+ strcpy(response->content_type, qpid_sender.responseContentType.c_str());
+
+ return response;
+}
+
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_qpid_send(
+ const axis2_char_t* request_content,
+ const axutil_env_t* env,
+ const axis2_char_t* content_type,
+ const axis2_char_t* soap_action,
+ axis2_msg_ctx_t* msg_ctx)
+{
+ axis2_amqp_destination_info_t* destination_info = NULL;
+ axis2_status_t status = AXIS2_FAILURE;
+ string reply_to_queue_name = "";
+
+ destination_info = axis2_amqp_util_msg_ctx_get_destination_info(msg_ctx, env);
+
+ if (!destination_info || !destination_info->broker_ip ||
+ !destination_info->broker_port || !destination_info->queue_name)
+ {
+ return AXIS2_FAILURE;
+ }
+
+ axis2_bool_t is_soap_11 = axis2_msg_ctx_get_is_soap_11(msg_ctx, env);
+ axutil_array_list_t* mime_parts = axis2_msg_ctx_get_mime_parts(msg_ctx, env);
+
+ /* If client side, find reply_to_queue_name */
+ if (!axis2_msg_ctx_get_server_side(msg_ctx, env))
+ {
+ axis2_conf_ctx_t* conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env);
+
+ axis2_char_t* queue_name =
+ axis2_amqp_util_conf_ctx_get_dual_channel_queue_name(conf_ctx, env);
+ if (queue_name)
+ reply_to_queue_name = queue_name;
+ }
+
+ Axis2QpidSender qpid_sender(destination_info->broker_ip,
+ destination_info->broker_port, env);
+
+ status = qpid_sender.Send(request_content, destination_info->queue_name,
+ reply_to_queue_name, is_soap_11, content_type, soap_action, mime_parts);
+
+ axis2_amqp_destination_info_free(destination_info, env);
+
+ return status;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.h b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.h
new file mode 100644
index 0000000..94e232f
--- /dev/null
+++ b/src/core/transport/amqp/sender/qpid_sender/axis2_qpid_sender_interface.h
@@ -0,0 +1,50 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef AXIS2_QPID_SENDER_INTERFACE_H
+#define AXIS2_QPID_SENDER_INTERFACE_H
+
+#include <axis2_util.h>
+#include <axis2_conf_init.h>
+#include <axis2_amqp_util.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+AXIS2_EXTERN axis2_amqp_response_t* AXIS2_CALL
+axis2_qpid_send_receive(
+ const axis2_char_t* request_content,
+ const axutil_env_t* env,
+ const axis2_char_t* content_type,
+ const axis2_char_t* soap_action,
+ axis2_msg_ctx_t* msg_ctx);
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axis2_qpid_send(
+ const axis2_char_t* request_content,
+ const axutil_env_t* env,
+ const axis2_char_t* content_type,
+ const axis2_char_t* soap_action,
+ axis2_msg_ctx_t* msg_ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif