blob: 2c4296a5f25e8327ea20c733bbff53ab90a5074a [file] [log] [blame]
/*
* 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_namespace.h>
#include <axutil_string.h>
#include "axiom_namespace_internal.h"
struct axiom_namespace
{
/** namespace URI */
axutil_string_t *uri;
/** namespace prefix */
axutil_string_t *prefix;
axis2_char_t *key;
int ref;
};
AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
axiom_namespace_create(
const axutil_env_t * env,
const axis2_char_t * uri,
const axis2_char_t * prefix)
{
axiom_namespace_t *om_namespace = NULL;
AXIS2_ENV_CHECK(env, NULL);
if (!uri)
{
uri = "";
}
om_namespace = (axiom_namespace_t *) AXIS2_MALLOC(env->allocator,
sizeof
(axiom_namespace_t));
if (!om_namespace)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
om_namespace->ref = 0;
om_namespace->prefix = NULL;
om_namespace->uri = NULL;
om_namespace->key = NULL;
om_namespace->uri = axutil_string_create(env, uri);
if (!om_namespace->uri)
{
AXIS2_FREE(env->allocator, om_namespace);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
if (prefix)
{
om_namespace->prefix = axutil_string_create(env, prefix);
if (!om_namespace->prefix)
{
AXIS2_FREE(env->allocator, om_namespace);
AXIS2_FREE(env->allocator, om_namespace->uri);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
}
return om_namespace;
}
AXIS2_EXTERN void AXIS2_CALL
axiom_namespace_free(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
if (--om_namespace->ref > 0)
{
return;
}
if (om_namespace->prefix)
{
axutil_string_free(om_namespace->prefix, env);
}
if (om_namespace->uri)
{
axutil_string_free(om_namespace->uri, env);
}
if (om_namespace->key)
{
AXIS2_FREE(env->allocator, om_namespace->key);
}
AXIS2_FREE(env->allocator, om_namespace);
return;
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
axiom_namespace_equals(
axiom_namespace_t * om_namespace,
const axutil_env_t * env,
axiom_namespace_t * om_namespace1)
{
int uris_differ = 0;
int prefixes_differ = 0;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, om_namespace, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, om_namespace1, AXIS2_FAILURE);
if (!om_namespace || !om_namespace1)
{
return AXIS2_FALSE;
}
if (om_namespace->uri && om_namespace1->uri)
{
uris_differ =
axutil_strcmp(axutil_string_get_buffer(om_namespace->uri, env),
axutil_string_get_buffer(om_namespace1->uri, env));
}
else
{
uris_differ = (om_namespace->uri || om_namespace1->uri);
}
if (om_namespace->prefix && om_namespace1->prefix)
{
prefixes_differ =
axutil_strcmp(axutil_string_get_buffer(om_namespace->prefix, env),
axutil_string_get_buffer(om_namespace1->prefix, env));
}
else
{
prefixes_differ = (om_namespace->prefix || om_namespace1->prefix);
}
return (!uris_differ && !prefixes_differ);
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axiom_namespace_serialize(
axiom_namespace_t * om_namespace,
const axutil_env_t * env,
axiom_output_t * om_output)
{
int status = AXIS2_SUCCESS;
if (!om_namespace)
{
return AXIS2_FAILURE;
}
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, om_output, AXIS2_FAILURE);
if (om_namespace->uri && NULL != om_namespace->prefix &&
axutil_strcmp(axutil_string_get_buffer(om_namespace->prefix, env),
"") != 0)
{
status = axiom_output_write(om_output, env, AXIOM_NAMESPACE,
2,
axutil_string_get_buffer(om_namespace->
prefix, env),
axutil_string_get_buffer(om_namespace->uri,
env));
}
else if (om_namespace->uri)
{
status = axiom_output_write(om_output, env, AXIOM_NAMESPACE,
2, NULL,
axutil_string_get_buffer(om_namespace->uri,
env));
}
return status;
}
AXIS2_EXTERN axis2_char_t *AXIS2_CALL
axiom_namespace_get_uri(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
if (om_namespace->uri)
{
return (axis2_char_t *) axutil_string_get_buffer(om_namespace->uri,
env);
}
return NULL;
}
AXIS2_EXTERN axis2_char_t *AXIS2_CALL
axiom_namespace_get_prefix(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
if (om_namespace->prefix)
{
return (axis2_char_t *) axutil_string_get_buffer(om_namespace->prefix,
env);
}
return NULL;
}
AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
axiom_namespace_clone(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
axiom_namespace_t *cloned_ns = NULL;
AXIS2_ENV_CHECK(env, NULL);
cloned_ns = axiom_namespace_create_str(env,
om_namespace->uri,
om_namespace->prefix);
if (cloned_ns)
{
return cloned_ns;
}
return NULL;
}
AXIS2_EXTERN axis2_char_t *AXIS2_CALL
axiom_namespace_to_string(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
axis2_char_t *temp_str = NULL;
AXIS2_ENV_CHECK(env, NULL);
if (om_namespace->key)
{
AXIS2_FREE(env->allocator, om_namespace->key);
om_namespace->key = NULL;
}
if ((om_namespace->uri) && (NULL != om_namespace->prefix))
{
temp_str =
axutil_stracat(env,
axutil_string_get_buffer(om_namespace->uri, env),
"|");
om_namespace->key =
axutil_stracat(env, temp_str,
axutil_string_get_buffer(om_namespace->prefix, env));
if (temp_str)
{
AXIS2_FREE(env->allocator, temp_str);
temp_str = NULL;
}
}
else if ((om_namespace->uri) && !(om_namespace->prefix))
{
om_namespace->key =
axutil_strdup(env,
axutil_string_get_buffer(om_namespace->uri, env));
if (!(om_namespace->key))
{
return NULL;
}
}
return om_namespace->key;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axiom_namespace_set_uri(
axiom_namespace_t * om_namespace,
const axutil_env_t * env,
const axis2_char_t * uri)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, uri, AXIS2_FAILURE);
if (om_namespace->uri)
{
axutil_string_free(om_namespace->uri, env);
om_namespace->uri = NULL;
}
om_namespace->uri = axutil_string_create(env, uri);
if (!(om_namespace->uri))
{
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_namespace_increment_ref(
struct axiom_namespace * om_namespace,
const axutil_env_t * env)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
om_namespace->ref++;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
axiom_namespace_create_str(
const axutil_env_t * env,
axutil_string_t * uri,
axutil_string_t * prefix)
{
axiom_namespace_t *om_namespace = NULL;
AXIS2_ENV_CHECK(env, NULL);
if (!uri)
{
uri = axutil_string_create(env, "");
}
om_namespace = (axiom_namespace_t *) AXIS2_MALLOC(env->allocator,
sizeof
(axiom_namespace_t));
if (!om_namespace)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
om_namespace->ref = 0;
om_namespace->prefix = NULL;
om_namespace->uri = NULL;
om_namespace->key = NULL;
om_namespace->uri = axutil_string_clone(uri, env);
if (!om_namespace->uri)
{
AXIS2_FREE(env->allocator, om_namespace);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
if (prefix)
{
om_namespace->prefix = axutil_string_clone(prefix, env);
if (!om_namespace->prefix)
{
AXIS2_FREE(env->allocator, om_namespace);
AXIS2_FREE(env->allocator, om_namespace->uri);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
}
return om_namespace;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axiom_namespace_set_uri_str(
axiom_namespace_t * om_namespace,
const axutil_env_t * env,
axutil_string_t * uri)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, uri, AXIS2_FAILURE);
if (om_namespace->uri)
{
axutil_string_free(om_namespace->uri, env);
om_namespace->uri = NULL;
}
om_namespace->uri = axutil_string_clone(uri, env);
if (!(om_namespace->uri))
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axutil_string_t *AXIS2_CALL
axiom_namespace_get_uri_str(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
return om_namespace->uri;
}
AXIS2_EXTERN axutil_string_t *AXIS2_CALL
axiom_namespace_get_prefix_str(
axiom_namespace_t * om_namespace,
const axutil_env_t * env)
{
return om_namespace->prefix;
}