/*
 * 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 AXIS2_ANY_CONTENT_TYPE_H
#define AXIS2_ANY_CONTENT_TYPE_H

/**
 * @file axis2_any_content_type.h
 * @brief Axis2 core addressing interface
 */

#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2.h>
#include <axis2_hash.h>
#include <axis2_qname.h>

#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_any_content_type;
    struct axis2_any_content_type_ops;
    
/**
 * @defgroup axis2_any_content_type WS Addressing any content type
 * @ingroup axis2_addr
 * @{
 */

/**
 *   \brief any_content_type ops struct
 */
 AXIS2_DECLARE_DATA typedef struct axis2_any_content_type_ops
    { 
        /**
         * Adds given value to the content value map.
         * @param any_content_type any_content_type struct. cannot be NULL.
         * @param env Environment. MUST NOT be NULL.
         * @param value value to be added.
         * @return AXIS2_SUCCESS on success else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
        add_value)(struct axis2_any_content_type *any_content_type,
                   axis2_env_t **env, 
                   axis2_qname_t *qname, 
                   axis2_char_t *value); 
       
        /**
         * Gets the value from the content value map.
         * @param any_content_type any_content_type struct. cannot be NULL.
         * @param env Environment. MUST NOT be NULL.
         * @param qname qname of the corresponging value to be retrived
         * @return Pointer to the value if present, else returns NULL. 
         *          Environment status would be set to AXIS2_FAILURE on error.
         */
        axis2_char_t* (AXIS2_CALL *get_value)(struct axis2_any_content_type *any_content_type, axis2_env_t **env, axis2_qname_t *qname);
        /**
         * Gets the map of values
         * @param any_content_type any_content_type struct. cannot be NULL.
         * @param env Environment. MUST NOT be NULL.
         * @return Pointer to the value map. Would return NULL and set 
         *          Environment status to AXIS2_FAILURE on error.
         */
        axis2_hash_t* (AXIS2_CALL *get_value_map)(struct axis2_any_content_type *any_content_type, axis2_env_t **env);
        /**
         * Frees the given any_content_type struct
         * @param any_content_type any_content_type struct. cannot be NULL.
         * @param env Environment. MUST NOT be NULL.
         * @return AXIS2_SUCCESS on success else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *free)(struct axis2_any_content_type *any_content_type, 
                                                       axis2_env_t **env);
    } axis2_any_content_type_ops_t;
	
   /** 
    * \brief axis2_any_content_type struct
    */
    typedef struct axis2_any_content_type
    {
        /** axis2_any_content_type related ops */
        axis2_any_content_type_ops_t *ops;
    } axis2_any_content_type_t;


/**
 * creates an instance of any_content_type struct
 * @param env Environment. MUST NOT be NULL.
 * @return Pointer to the newly created any_content_type instance. Returns NULL on error.
 */
AXIS2_DECLARE(axis2_any_content_type_t*) 
axis2_any_content_type_create(axis2_env_t **env);
    
    
/**************************** Start of function macros ************************/    
#define AXIS2_ANY_CONTENT_TYPE_ADD_VALUE(any_content_type, env, qname, value) \
    ((any_content_type)->ops->add_value(any_content_type, env, qname, value))
    
#define AXIS2_ANY_CONTENT_TYPE_GET_VALUE(any_content_type, env, qname) \
    ((any_content_type)->ops->get_value(any_content_type, env, qname))
    
#define AXIS2_ANY_CONTENT_TYPE_GET_VALUE_MAP(any_content_type, env) \
    ((any_content_type)->ops->get_value_map(any_content_type, env))
    
#define AXIS2_ANY_CONTENT_TYPE_FREE(any_content_type, env) \
    ((any_content_type)->ops->free(any_content_type, env))

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

#endif    /* AXIS2_ANY_CONTENT_TYPE_H */
