| /* |
| * Copyright 2004,2005 The Apache Software Foundation. |
| * |
| * Licensed 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.h> |
| #include <platforms/axutil_platform_auto_sense.h> |
| |
| #include <axis2_endpoint_ref.h> |
| #include <axis2_svc_client.h> |
| |
| #include <savan_subscriber.h> |
| #include <savan_util.h> |
| |
| #ifdef SAVAN_FILTERING |
| #include <libxslt/xsltutils.h> |
| #endif |
| |
| struct savan_subscriber_t |
| { |
| axis2_char_t *id; |
| axis2_endpoint_ref_t *end_to; |
| axis2_endpoint_ref_t *notify_to; |
| axis2_char_t *delivery_mode; |
| axis2_char_t *expires; |
| axis2_char_t *filter; |
| axis2_char_t *topic; |
| axis2_bool_t renewed; |
| axis2_char_t *filter_dialect; |
| |
| #ifdef SAVAN_FILTERING |
| xsltStylesheetPtr xslt_filter; |
| #endif |
| }; |
| |
| /*****************************************************************************/ |
| |
| AXIS2_EXTERN savan_subscriber_t * AXIS2_CALL |
| savan_subscriber_create( |
| const axutil_env_t *env) |
| { |
| savan_subscriber_t *subscriber = NULL; |
| |
| AXIS2_ENV_CHECK(env, NULL); |
| |
| subscriber = AXIS2_MALLOC(env->allocator, sizeof(savan_subscriber_t)); |
| |
| if (!subscriber) |
| { |
| AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| subscriber->id = NULL; |
| subscriber->end_to = NULL; |
| subscriber->notify_to = NULL; |
| subscriber->delivery_mode = NULL; |
| subscriber->expires = NULL; |
| subscriber->filter = NULL; |
| subscriber->filter_dialect = NULL; |
| subscriber->topic = NULL; |
| subscriber->renewed = AXIS2_FALSE; |
| #ifdef SAVAN_FILTERING |
| subscriber->xslt_filter = NULL; |
| #endif |
| |
| return subscriber; |
| } |
| |
| AXIS2_EXTERN void AXIS2_CALL |
| savan_subscriber_free_void_arg( |
| void *subscriber, |
| const axutil_env_t *env) |
| { |
| savan_subscriber_t *subs = (savan_subscriber_t *) subscriber; |
| savan_subscriber_free(subs, env); |
| } |
| |
| AXIS2_EXTERN void AXIS2_CALL |
| savan_subscriber_free( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| if(subscriber->id) |
| AXIS2_FREE(env->allocator, subscriber->id); |
| if(subscriber->delivery_mode) |
| AXIS2_FREE(env->allocator, subscriber->delivery_mode); |
| if(subscriber->expires) |
| AXIS2_FREE(env->allocator, subscriber->expires); |
| if(subscriber->filter) |
| AXIS2_FREE(env->allocator, subscriber->filter); |
| if(subscriber->topic) |
| AXIS2_FREE(env->allocator, subscriber->topic); |
| #ifdef SAVAN_FILTERING |
| if(subscriber->xslt_filter) |
| AXIS2_FREE(env->allocator, subscriber->xslt_filter); |
| #endif |
| if(subscriber->filter_dialect) |
| AXIS2_FREE(env->allocator, subscriber->filter_dialect); |
| AXIS2_FREE(env->allocator, subscriber); |
| } |
| |
| /******************************************************************************/ |
| |
| void* AXIS2_CALL |
| savan_subscriber_get_filter_template( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| #ifdef SAVAN_FILTERING |
| return subscriber->xslt_filter; |
| #else |
| return NULL; |
| #endif |
| } |
| |
| /******************************************************************************/ |
| |
| axis2_status_t AXIS2_CALL |
| savan_subscriber_set_filter_template( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| void *xslt_filter_template) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| if (subscriber->filter == NULL) |
| { |
| return AXIS2_SUCCESS; |
| } |
| |
| #ifdef SAVAN_FILTERING |
| if (subscriber->xslt_filter != NULL) |
| { |
| AXIS2_FREE(env->allocator, subscriber->filter); |
| subscriber->xslt_filter = NULL; |
| } |
| subscriber->xslt_filter = (xsltStylesheetPtr)xslt_filter_template; |
| #endif |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_char_t * AXIS2_CALL |
| savan_subscriber_get_id( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| return subscriber->id; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_id( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| const axis2_char_t *id) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| /* If id is already set, free it */ |
| if (subscriber->id != NULL) |
| { |
| AXIS2_FREE(env->allocator, subscriber->id); |
| subscriber->id = NULL; |
| } |
| |
| /* copy the new id */ |
| subscriber->id = axutil_strdup(env, id); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_filter_dialect |
| (savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| const axis2_char_t *filter_dialect) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| if(subscriber->filter_dialect != NULL) |
| { |
| AXIS2_FREE(env->allocator, subscriber->filter_dialect); |
| subscriber->filter_dialect = NULL; |
| } |
| |
| subscriber->filter_dialect = axutil_strdup(env, filter_dialect); |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_char_t * AXIS2_CALL |
| savan_subscriber_get_filter_dialect( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| return subscriber->filter_dialect; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_end_to( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| axis2_endpoint_ref_t *end_to) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| subscriber->end_to = end_to; |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_endpoint_ref_t *AXIS2_CALL |
| savan_subscriber_get_end_to( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| return subscriber->end_to; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_notify_to( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| axis2_endpoint_ref_t *notify_to) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| subscriber->notify_to = notify_to; |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_endpoint_ref_t *AXIS2_CALL |
| savan_subscriber_get_notify_to( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| return subscriber->notify_to; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_delivery_mode( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| const axis2_char_t *mode) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| /* if already set, free it */ |
| if (subscriber->delivery_mode != NULL) |
| { |
| AXIS2_FREE(env->allocator, subscriber->delivery_mode); |
| subscriber->delivery_mode = NULL; |
| } |
| |
| /* copy the new one */ |
| subscriber->delivery_mode = axutil_strdup(env, mode); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_char_t * AXIS2_CALL |
| savan_subscriber_get_delivery_mode( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| return subscriber->delivery_mode; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_expires( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| const axis2_char_t *expires) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| /* if already set, free it */ |
| if (subscriber->expires != NULL) |
| { |
| AXIS2_FREE(env->allocator, subscriber->expires); |
| subscriber->expires = NULL; |
| } |
| |
| /* copy the new one */ |
| subscriber->expires = axutil_strdup(env, expires); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_char_t * AXIS2_CALL |
| savan_subscriber_get_expires( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| return subscriber->expires; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_filter( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| const axis2_char_t *filter) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| /* if already set, free it */ |
| if (subscriber->filter != NULL) |
| { |
| AXIS2_FREE(env->allocator, subscriber->filter); |
| subscriber->filter = NULL; |
| } |
| |
| /* copy the new one */ |
| subscriber->filter = axutil_strdup(env, filter); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| AXIS2_EXTERN axis2_char_t *AXIS2_CALL |
| savan_subscriber_get_filter( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| return subscriber->filter; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_publish( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| axiom_node_t *payload) |
| { |
| axis2_svc_client_t *svc_client = NULL; |
| axis2_char_t *path = NULL; |
| axis2_options_t *options = NULL; |
| axis2_status_t status = AXIS2_SUCCESS; |
| axis2_endpoint_ref_t *to = NULL; |
| const axis2_char_t *address = NULL; |
| |
| AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, |
| "[savan] Start:savan_subscriber_publish"); |
| |
| path = AXIS2_GETENV("AXIS2C_HOME"); |
| svc_client = axis2_svc_client_create(env, path); |
| |
| /* Setup options */ |
| options = axis2_options_create(env); |
| if(subscriber->notify_to) |
| { |
| address = axis2_endpoint_ref_get_address(subscriber->notify_to, env); |
| AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "address:%s", address); |
| if(address) |
| { |
| to = axis2_endpoint_ref_create(env, address); |
| axis2_options_set_to(options, env, to); |
| } |
| } |
| axis2_options_set_xml_parser_reset(options, env, AXIS2_FALSE); |
| |
| /* Apply the filter, and check whether it evaluates to success */ |
| |
| #ifdef SAVAN_FILTERING |
| if (savan_util_apply_filter(subscriber, env, payload) == AXIS2_FAILURE) |
| { |
| return AXIS2_SUCCESS; |
| } |
| #endif |
| |
| /* Set service client options */ |
| axis2_svc_client_set_options(svc_client, env, options); |
| axis2_svc_client_send_robust(svc_client, env, payload); |
| |
| if(svc_client) |
| axis2_svc_client_free(svc_client, env); |
| |
| AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, |
| "[savan] End:savan_subscriber_publish"); |
| return status; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_renew_status( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| axis2_bool_t renewed) |
| { |
| subscriber->renewed = renewed; |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| /******************************************************************************/ |
| |
| AXIS2_EXTERN axis2_bool_t AXIS2_CALL |
| savan_subscriber_get_renew_status( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| return subscriber->renewed; |
| } |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_subscriber_set_topic( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env, |
| axis2_char_t *topic) |
| { |
| AXIS2_ENV_CHECK(env, AXIS2_FAILURE); |
| |
| subscriber->topic = axutil_strdup(env, topic); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| AXIS2_EXTERN axis2_char_t *AXIS2_CALL |
| savan_subscriber_get_topic( |
| savan_subscriber_t *subscriber, |
| const axutil_env_t *env) |
| { |
| return subscriber->topic; |
| } |
| |
| |