/* * 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 #include #include struct axiom_attribute { /** localname of this attribute */ axutil_string_t *localname; /** value of this attribute */ axutil_string_t *value; /** attribute namespace */ axiom_namespace_t *ns; /** store qname here */ axutil_qname_t *qname; int ref; }; AXIS2_EXTERN axiom_attribute_t *AXIS2_CALL axiom_attribute_create( const axutil_env_t * env, const axis2_char_t * localname, const axis2_char_t * value, axiom_namespace_t * ns) { axiom_attribute_t *attribute = NULL; AXIS2_ENV_CHECK(env, NULL); /* localname is mandatory */ AXIS2_PARAM_CHECK(env->error, localname, NULL); attribute = (axiom_attribute_t *)AXIS2_MALLOC(env->allocator, sizeof(axiom_attribute_t)); if(!attribute) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return NULL; } /** initialize fields */ attribute->localname = NULL; attribute->value = NULL; attribute->ns = NULL; attribute->qname = NULL; attribute->localname = axutil_string_create(env, localname); if(!(attribute->localname)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); AXIS2_FREE(env->allocator, attribute); return NULL; } if(value) { attribute->value = axutil_string_create(env, value); if(!(attribute->value)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); axutil_string_free(attribute->localname, env); AXIS2_FREE(env->allocator, attribute); return NULL; } } attribute->ns = ns; attribute->ref = 0; return attribute; } AXIS2_EXTERN void AXIS2_CALL axiom_attribute_free( axiom_attribute_t * attribute, const axutil_env_t * env) { if(--attribute->ref > 0) { return; } AXIS2_ENV_CHECK(env, AXIS2_FAILURE); if(attribute->localname) { axutil_string_free(attribute->localname, env); } if(attribute->value) { axutil_string_free(attribute->value, env); } if(attribute->qname) { axutil_qname_free(attribute->qname, env); } AXIS2_FREE(env->allocator, attribute); return; } AXIS2_EXTERN void AXIS2_CALL axiom_attribute_free_void_arg( void *attribute, const axutil_env_t * env) { axiom_attribute_t *om_attribute_l = NULL; AXIS2_ENV_CHECK(env, AXIS2_FAILURE); om_attribute_l = (axiom_attribute_t *)attribute; axiom_attribute_free(om_attribute_l, env); return; } AXIS2_EXTERN axutil_qname_t *AXIS2_CALL axiom_attribute_get_qname( axiom_attribute_t * attribute, const axutil_env_t * env) { axutil_qname_t *qname = NULL; AXIS2_ENV_CHECK(env, NULL); if(!(attribute->qname)) { if(attribute->ns) { qname = axutil_qname_create(env, axutil_string_get_buffer(attribute-> localname, env), axiom_namespace_get_uri(attribute->ns, env), axiom_namespace_get_prefix( attribute-> ns, env)); } else { qname = axutil_qname_create(env, axutil_string_get_buffer(attribute-> localname, env), NULL, NULL); } attribute->qname = qname; return qname; } return attribute->qname; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_serialize( axiom_attribute_t * attribute, const axutil_env_t * env, axiom_output_t * om_output) { int status = AXIS2_SUCCESS; AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, om_output, AXIS2_FAILURE); if(attribute->ns) { axis2_char_t *uri = NULL; axis2_char_t *prefix = NULL; uri = axiom_namespace_get_uri(attribute->ns, env); prefix = axiom_namespace_get_prefix(attribute->ns, env); if((uri) && (NULL != prefix) && (axutil_strcmp(prefix, "") != 0)) { status = axiom_output_write(om_output, env, AXIOM_ATTRIBUTE, 4, axutil_string_get_buffer(attribute-> localname, env), axutil_string_get_buffer( attribute-> value, env), uri, prefix); } else if(uri) { status = axiom_output_write(om_output, env, AXIOM_ATTRIBUTE, 3, axutil_string_get_buffer(attribute-> localname, env), axutil_string_get_buffer( attribute-> value, env), uri); } } else { status = axiom_output_write(om_output, env, AXIOM_ATTRIBUTE, 2, axutil_string_get_buffer( attribute-> localname, env), axutil_string_get_buffer(attribute->value, env)); } return status; } AXIS2_EXTERN axis2_char_t *AXIS2_CALL axiom_attribute_get_localname( axiom_attribute_t * attribute, const axutil_env_t * env) { if(attribute->localname) { return (axis2_char_t *)axutil_string_get_buffer(attribute->localname, env); } return NULL; } AXIS2_EXTERN axis2_char_t *AXIS2_CALL axiom_attribute_get_value( axiom_attribute_t * attribute, const axutil_env_t * env) { if(attribute->value) { return (axis2_char_t *)axutil_string_get_buffer(attribute->value, env); } return NULL; } AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL axiom_attribute_get_namespace( axiom_attribute_t * attribute, const axutil_env_t * env) { AXIS2_ENV_CHECK(env, NULL); return attribute->ns; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_set_localname( axiom_attribute_t * attribute, const axutil_env_t * env, const axis2_char_t * localname) { AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); if(attribute->localname) { axutil_string_free(attribute->localname, env); attribute->localname = NULL; } attribute->localname = axutil_string_create(env, localname); if(!(attribute->localname)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return AXIS2_FAILURE; } return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_set_value( axiom_attribute_t * attribute, const axutil_env_t * env, const axis2_char_t * value) { AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, value, AXIS2_FAILURE); if(attribute->value) { axutil_string_free(attribute->value, env); attribute->value = NULL; } attribute->value = axutil_string_create(env, value); if(!(attribute->value)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return AXIS2_FAILURE; } return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_set_namespace( axiom_attribute_t * attribute, const axutil_env_t * env, axiom_namespace_t * om_namespace) { AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_FUNC_PARAM_CHECK(om_namespace, env, AXIS2_FAILURE); attribute->ns = om_namespace; return AXIS2_SUCCESS; } AXIS2_EXTERN axiom_attribute_t *AXIS2_CALL axiom_attribute_clone( axiom_attribute_t * attribute, const axutil_env_t * env) { axiom_attribute_t *cloned_attr = NULL; if(!attribute) return NULL; AXIS2_ENV_CHECK(env, NULL); /** namespace is not cloned since it is a shollow copy*/ cloned_attr = axiom_attribute_create_str(env, attribute->localname, attribute->value, attribute->ns); if(cloned_attr) { return cloned_attr; } return NULL; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_increment_ref( struct axiom_attribute * om_attribute, const axutil_env_t * env) { AXIS2_ENV_CHECK(env, AXIS2_FAILURE); om_attribute->ref++; return AXIS2_SUCCESS; } AXIS2_EXTERN axiom_attribute_t *AXIS2_CALL axiom_attribute_create_str( const axutil_env_t * env, axutil_string_t * localname, axutil_string_t * value, axiom_namespace_t * ns) { axiom_attribute_t *attribute = NULL; AXIS2_ENV_CHECK(env, NULL); /* localname is mandatory */ AXIS2_PARAM_CHECK(env->error, localname, NULL); attribute = (axiom_attribute_t *)AXIS2_MALLOC(env->allocator, sizeof(axiom_attribute_t)); if(!attribute) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return NULL; } /** initialize fields */ attribute->localname = NULL; attribute->value = NULL; attribute->ns = NULL; attribute->qname = NULL; attribute->localname = axutil_string_clone(localname, env); if(!(attribute->localname)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); AXIS2_FREE(env->allocator, attribute); return NULL; } if(value) { attribute->value = axutil_string_clone(value, env); if(!(attribute->value)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); axutil_string_free(attribute->localname, env); AXIS2_FREE(env->allocator, attribute); return NULL; } } attribute->ns = ns; attribute->ref = 0; return attribute; } AXIS2_EXTERN axutil_string_t *AXIS2_CALL axiom_attribute_get_localname_str( axiom_attribute_t * attribute, const axutil_env_t * env) { return attribute->localname; } AXIS2_EXTERN axutil_string_t *AXIS2_CALL axiom_attribute_get_value_str( axiom_attribute_t * attribute, const axutil_env_t * env) { return attribute->value; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_set_localname_str( axiom_attribute_t * attribute, const axutil_env_t * env, axutil_string_t * localname) { AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, localname, AXIS2_FAILURE); if(attribute->localname) { axutil_string_free(attribute->localname, env); attribute->localname = NULL; } attribute->localname = axutil_string_clone(localname, env); return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axiom_attribute_set_value_str( axiom_attribute_t * attribute, const axutil_env_t * env, axutil_string_t * value) { AXIS2_ENV_CHECK(env, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, value, AXIS2_FAILURE); if(attribute->value) { axutil_string_free(attribute->value, env); attribute->value = NULL; } attribute->value = axutil_string_clone(value, env); if(!(attribute->value)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return AXIS2_FAILURE; } return AXIS2_SUCCESS; }