/*
 * 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.
 */
 
#ifndef SANDESHA2_IDENTIFIER_H
#define SANDESHA2_IDENTIFIER_H

/**
  * @file sandesha2_identifier.h
  * @brief 
  */

#include <axutil_utils_defines.h>
#include <axutil_env.h>
#include <axiom_soap_envelope.h>
#include <sandesha2_error.h>


#ifdef __cplusplus
extern "C"
{
#endif

/** @defgroup sandesha2_identifier
 * @ingroup sandesha2_wsrm
 * @{
 */
typedef struct sandesha2_identifier_t sandesha2_identifier_t;

/**
 * @brief sandesha2_identifier
 *    sandesha2_identifier
 */

axis2_status_t AXIS2_CALL
sandesha2_identifier_free_void_arg(
    void *identifier,
    const axutil_env_t *env);

axis2_status_t AXIS2_CALL 
sandesha2_identifier_free (
    sandesha2_identifier_t *identifier, 
    const axutil_env_t *env);	

AXIS2_EXTERN sandesha2_identifier_t* AXIS2_CALL
sandesha2_identifier_create(
    const axutil_env_t *env, 
    axis2_char_t *ns_value);
                    	
axis2_char_t * AXIS2_CALL
sandesha2_identifier_get_identifier(
    sandesha2_identifier_t *identifier,
    const axutil_env_t *env);

axis2_status_t AXIS2_CALL                 
sandesha2_identifier_set_identifier(
    sandesha2_identifier_t *identifier,
    const axutil_env_t *env, 
    axis2_char_t *str_id);

axis2_char_t* AXIS2_CALL 
sandesha2_identifier_get_namespace_value (
    sandesha2_identifier_t *identifier,
    const axutil_env_t *env);

void* AXIS2_CALL 
sandesha2_identifier_from_om_node(
    sandesha2_identifier_t *identifier,
    const axutil_env_t *env, axiom_node_t *om_node);

axiom_node_t* AXIS2_CALL 
sandesha2_identifier_to_om_node(
    sandesha2_identifier_t *identifier,
    const axutil_env_t *env, 
    void *om_node);

/** @} */
#ifdef __cplusplus
}
#endif

#endif                          /* SANDESHA2_IDENTIFIER_H */

