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

/**
 *@file axis2_xml_writer.h	
 *@brief this is the parser abstraction layer for axis2 
 */
 
 #include <axis2_env.h>
 
 #ifdef __cplusplus
extern "C"
{
#endif
    
typedef struct axis2_xml_writer_ops axis2_xml_writer_ops_t;    
typedef struct axis2_xml_writer axis2_xml_writer_t;


/**
 * @defgroup axis2_xml_writer 
 * @ingroup axis2_om_parser
 * @{
 */



  /**
    * \brief axis2_xml_writer ops
    * Encapsulator struct for ops of axis2_xml_writer
    */

    AXIS2_DECLARE_DATA struct axis2_xml_writer_ops 
    {
       /**
        * Free xml writer
        * @param writer pointer to xml_writer struct to be freed
        * @param env environment, MUST NOT be NULL.
        * @returns status of the op. 
        *       AXIS2_SUCCESS on success and AXIS2_FAILURE on error
        */
        
        axis2_status_t (AXIS2_CALL *
		free)(axis2_xml_writer_t *writer,
              axis2_env_t **env);
       /**
        *  Write a start tag to output stream with localname.
        *  Internally the writer keeps track of the opened tags 
        *  @param writer pointer to xml writer struct
        *  @param env environment. MUST NOT be NULL.
        *  @param localname localname of the tag, May not be NULL.
        *  @return the status of the op, AXIS2_SUCCESS on success
                    AXIS2_FAILURE on error.
        */
        axis2_status_t (AXIS2_CALL *
		write_start_element)(axis2_xml_writer_t *writer,
                             axis2_env_t **env, 
							 axis2_char_t *localname);
       /**
        *  write an end tag to the output relying on the internal
        *  state of writer to determine the prefix and localname of
        *  the element
        *  @param writer xml_writer struct
        *  @param env environment, MUST NOT be NULL.
        *  @return status of the op. AXIS2_SUCCESS on success.
        *           AXIS2_FAILURE on error.
        */
        axis2_status_t (AXIS2_CALL *
		end_start_element)(axis2_xml_writer_t *writer,
                           axis2_env_t **env);
        /**
         * Write an element tag with localname and namespace uri 
         * @param writer pointer to xml writer struct
         * @param env environment struct
         * @param localname localname of the tag, May not be null.
         * @param namespace_uri the namespace URI of the the pefix
         *        to use.may not be null.
         * @returns status of the op, AXIS2_SUCCESS on success.
         *          AXIS2_FAILURE on error
         */
        axis2_status_t (AXIS2_CALL *
		write_start_element_with_namespace)(axis2_xml_writer_t *writer,
											axis2_env_t **env,
											axis2_char_t *localname,
											axis2_char_t *namespace_uri);
       
        /**
         * write a start tag to output
         * @param writer pointer to xml_writer struct
         * @param environment, MUST NOT be NULL.
         * @param localname localname of the tag, May not be null.
         * @param namespace_uri namespace to bind the prefix to
         * @param prefix the prefix to the tag.May not be NULL.
         * @return status of the op 
                   AXIS2_SUCCESS on success. AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_start_element_with_namespace_prefix)(axis2_xml_writer_t *writer,
													axis2_env_t **env,
													axis2_char_t *localname,
													axis2_char_t *namespace_uri,
													axis2_char_t *prefix);       
        /**
         * write an element tag with localname 
         * @param writer xml_writer
         * @param env environment
         * @param localname localname 
         * @return status of the op AXIS2_SUCCESS on success,
         *                AXIS2_FAILURE on error.
         */         
        axis2_status_t (AXIS2_CALL *
		write_empty_element)(axis2_xml_writer_t *writer,
		                     axis2_env_t **env,
							 axis2_char_t *localname);
        /**
         * write empty_element with localname and namespace uri.
         * @param writer xml writer
         * @param env environment
         * @param localname localname 
         * @param namespace uri
         * @return status of the op, AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        
        axis2_status_t (AXIS2_CALL *
		write_empty_element_with_namespace)(axis2_xml_writer_t *writer,
											axis2_env_t **env,
											axis2_char_t *localname,
											axis2_char_t *namespace_uri);
        /**
         * write empty element with namespace uri and prefix 
         * @param writer xml_writer
         * @param env environment
         * @param localname localname
         * @param namespace_uri namespace uri 
         * @param prefix prefix
         * @return status of the op, AXIS2_SUCCESS on success,
         *                    AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_empty_element_with_namespace_prefix)(axis2_xml_writer_t *writer,
													axis2_env_t **env,
													axis2_char_t *localname,
													axis2_char_t *namespace_uri,
													axis2_char_t *prefix);
        /**
         * write end tag with correct localname prefix resolved internally 
         * @param writer xml writer
         * @param env environment
         * @return status of the op, AXIS2_SUCCESS on success,
         *            AXIS2_FAILURE on failure 
         */
        axis2_status_t (AXIS2_CALL *
		write_end_element)(axis2_xml_writer_t *writer,
                           axis2_env_t **env);
        /**
         * write end document
         * @param writer xml writer
         * @param env environment
         * @return status of the op AXIS2_SUCCESS on success,
         *              AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_end_document)(axis2_xml_writer_t *writer,
                            axis2_env_t **env);
        /**
         * write attribute with localname and value
         * @param writer writer
         * @param env environment
         * @param localname localname 
         * @param value text value of attribute
         * @return status of the op AXIS2_SUCCESS on success,
         *                 AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_attribute)(axis2_xml_writer_t *writer,
						 axis2_env_t **env,
						 axis2_char_t *localname,
						 axis2_char_t *value);
        /**
         *  @param writer
         *  @param env environment
         *  @param localname
         *  @param value text value of attribute
         *  @param namespace uri namespace uri
         *  @return status code of the op AXIS2_SUCCESS on success,
         *                    AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_attribute_with_namespace)(axis2_xml_writer_t *writer,
										  axis2_env_t **env,
										  axis2_char_t *localname,
										  axis2_char_t *value,
										  axis2_char_t *namespace_uri);
        /**
         * @param writer xml_writer
         * @param env environment
         * @param localname localname
         * @param value text value of attribute
         * @param namespace uri namespaceuri
         * @param prefix prefix 
         */         
        axis2_status_t (AXIS2_CALL *
		write_attribute_with_namespace_prefix)(axis2_xml_writer_t *writer,
                                                  axis2_env_t **env,
                                                  axis2_char_t *localname,
                                                  axis2_char_t *value,
                                                  axis2_char_t *namespace_uri,
                                                  axis2_char_t *prefix);
        /**
         * @param writer xml_writer
         * @param env environment
         * @param prefix prefix 
         * @param namespace uri namespaceuri
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        
        axis2_status_t (AXIS2_CALL *
		write_namespace)(axis2_xml_writer_t *writer,
						 axis2_env_t **env,
						 axis2_char_t *prefix,
						 axis2_char_t *namespace_uri);   
        /**
         * @param writer xml_writer
         * @param env environment
         * @param namespace uri namespaceuri
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */

        axis2_status_t (AXIS2_CALL *
		write_default_namespace)(axis2_xml_writer_t *writer,
								 axis2_env_t **env,
								 axis2_char_t *namespace_uri);  
        /**
         * @param writer xml_writer
         * @param env environment
         * @param value value
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
                                                    

        axis2_status_t (AXIS2_CALL *
		write_comment)(axis2_xml_writer_t *writer,
					   axis2_env_t **env,
					   axis2_char_t *value);
        /**
         * @param writer xml_writer
         * @param env environment
         * @param target pi target 
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */


        axis2_status_t (AXIS2_CALL *
		write_processing_instruction)(axis2_xml_writer_t *writer,
									   axis2_env_t **env,
									   axis2_char_t *target);
                                   
        /**
         * @param writer xml_writer
         * @param env environment
         * @param target pi target
         * @param data  pi data
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
                                   
        axis2_status_t (AXIS2_CALL *
		write_processing_instruction_data)(axis2_xml_writer_t *writer,
										   axis2_env_t **env,
										   axis2_char_t *target,
										   axis2_char_t *data);
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param data  cdata
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */                                           
        axis2_status_t (AXIS2_CALL *
		write_cdata)(axis2_xml_writer_t *writer,
					 axis2_env_t **env,
					 axis2_char_t *data);
        
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param dtd  dtd
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_dtd)(axis2_xml_writer_t *writer,
				   axis2_env_t **env,
				   axis2_char_t *dtd); 
        
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param name name
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_entity_ref)(axis2_xml_writer_t *writer,
                          axis2_env_t **env,
                          axis2_char_t *name); 
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_start_document)(axis2_xml_writer_t *writer,
                              axis2_env_t **env);  
        
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param version version 
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_start_document_with_version)(axis2_xml_writer_t *writer,
                                           axis2_env_t **env,
                                           axis2_char_t *version);   
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param version version
         * @param encoding encoding
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_start_document_with_version_encoding)(axis2_xml_writer_t *writer,
                                                    axis2_env_t **env,
                                                    axis2_char_t *version,
                                                    axis2_char_t *encoding);
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param text text 
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */                                         
        axis2_status_t (AXIS2_CALL *
		write_characters)(axis2_xml_writer_t *writer,
                          axis2_env_t **env,
                          axis2_char_t *text);   
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param uri uri
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
       axis2_char_t* (AXIS2_CALL *
	   get_prefix)(axis2_xml_writer_t *writer,
                   axis2_env_t **env,
                   axis2_char_t *uri);
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param prefix prefix
         * @param uri uri
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
       axis2_status_t (AXIS2_CALL *
	   set_prefix)(axis2_xml_writer_t *writer,
                   axis2_env_t **env,
                   axis2_char_t *prefix,
                   axis2_char_t *uri);
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param uri uri
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */                                                 
       axis2_status_t (AXIS2_CALL *
	   set_default_prefix)(axis2_xml_writer_t *writer,
                           axis2_env_t **env,
                           axis2_char_t *uri);                                                 
         
        /**
         * @param writer xml_writer
         * @param env environment
         * @param text text
         * @param in_attr 
         * @return status of op AXIS2_SUCCESS on success,
         *               AXIS2_FAILURE on error.
         */
        axis2_status_t (AXIS2_CALL *
		write_encoded)(axis2_xml_writer_t *writer,
                       axis2_env_t **env,
                       axis2_char_t *text,
                       int in_attr);
                                                 
        axis2_char_t* (AXIS2_CALL *
		get_xml)(axis2_xml_writer_t *writer,
                 axis2_env_t **env);                                                 

    };

/** 
 * @brief axis2_pull_parser struct
  *	Axis2 OM pull_parser
 */

struct axis2_xml_writer
{
    axis2_xml_writer_ops_t *ops;    
};    

/**
 *  create function for axis2_xml_writer
 *
 */
AXIS2_DECLARE(axis2_xml_writer_t *)
axis2_xml_writer_create(axis2_env_t **env,
                        axis2_char_t *filename,
                        axis2_char_t *encoding,
                        int is_prefix_default,
                        int compression);

AXIS2_DECLARE(axis2_xml_writer_t *)
axis2_xml_writer_create_for_memory(axis2_env_t **env,
                                   axis2_char_t *encoding,
                                   int is_prefix_default,
                                   int compression);

/********************** start macros *******************************************/

#define AXIS2_XML_WRITER_FREE(writer, env) \
        ((writer)->ops->free(writer,env))

#define AXIS2_XML_WRITER_WRITE_START_ELEMENT(writer, env, localname) \
        ((writer)->ops->write_start_element(writer, env, localname))

#define AXIS2_XML_WRITER_END_START_ELEMENT(writer, env) \
        ((writer)->ops->end_start_element(writer,env))


#define AXIS2_XML_WRITER_WRITE_START_ELEMENT_WITH_NAMESPACE(\
        writer, env, localname, namespace_uri)\
        ((writer)->ops->write_start_element_with_namespace(\
        writer, env, localname, namespace_uri))

#define AXIS2_XML_WRITER_WRITE_START_ELEMENT_WITH_NAMESPACE_PREFIX(\
        writer, env, localname, namespace_uri, prefix) \
        ((writer)->ops->write_start_element_with_namespace_prefix(\
        writer,env,localname,namespace_uri,prefix))
        
        
#define AXIS2_XML_WRITER_WRITE_EMPTY_ELEMENT(writer,env,localname) \
        ((writer)->ops->write_empty_element(writer,env,localname))
        
#define AXIS2_XML_WRITER_WRITE_EMPTY_ELEMENT_WITH_NAMESPACE(\
        writer, env,localname,namespace_uri) \
        ((writer)->ops->write_empty_element_with_namespace(writer,env,localname,namespace_uri))       

#define AXIS2_XML_WRITER_WRITE_EMPTY_ELEMENT_WITH_NAMESPACE_PREFIX(\
        writer, env, localname, namespace_uri, prefix) \
        ((writer)->ops->write_empty_element_with_namespace_prefix(\
        writer,env,localname,namespace_uri, prefix))

#define AXIS2_XML_WRITER_WRITE_END_ELEMENT(writer, env) \
        ((writer)->ops->write_end_element(writer,env))


#define AXIS2_XML_WRITER_WRITE_END_DOCUMENT(writer, env) \
        ((writer)->ops->write_end_document(writer,env))

#define AXIS2_XML_WRITER_WRITE_ATTRIBUTE(writer, env, localname, value) \
        ((writer)->ops->write_attribute(writer,env, localname, value))

#define AXIS2_XML_WRITER_WRITE_ATTRIBUTE_WITH_NAMESPACE(\
        writer, env, localname, value, namespace_uri) \
        ((writer)->ops->write_attribute_with_namespace(\
        writer,env, localname, value,namespace_uri))

#define AXIS2_XML_WRITER_WRITE_ATTRIBUTE_WITH_NAMESPACE_PREFIX(\
        writer, env, localname, value, namespace_uri, prefix) \
        ((writer)->ops->write_attribute_with_namespace_prefix(\
        writer,env, localname, value,namespace_uri, prefix))

#define AXIS2_XML_WRITER_WRITE_NAMESPACE(writer, env, prefix , namespace_uri) \
        ((writer)->ops->write_namespace(writer, env, prefix, namespace_uri))

#define AXIS2_XML_WRITER_WRITE_DEFAULT_NAMESPACE(writer, env, namespace_uri) \
        ((writer)->ops->write_default_namespace(writer, env, namespace_uri))

#define AXIS2_XML_WRITER_WRITE_COMMENT(writer, env, value) \
        ((writer)->ops->write_comment(writer, env, value))

#define AXIS2_XML_WRITER_WRITE_PROCESSING_INSTRUCTION(writer, env, target) \
        ((writer)->ops->write_processing_instruction(writer, env, target))

#define AXIS2_XML_WRITER_WRITE_PROCESSING_INSTRUCTION_DATA(writer, env, target, data) \
        ((writer)->ops->write_processing_instruction_data(writer, env, target, data))
        
#define AXIS2_XML_WRITER_WRITE_CDATA(writer, env, data) \
        ((writer)->ops->write_cdata(writer, env, data))        

#define AXIS2_XML_WRITER_WRITE_DTD(writer, env, dtd) \
        ((writer)->ops->write_cdata(writer, env, dtd)) 

#define AXIS2_XML_WRITER_WRITE_ENTITY_REF(writer, env, entity_ref) \
        ((writer)->ops->write_entity_ref(writer, env, entity_ref)) 
        
#define AXIS2_XML_WRITER_WRITE_START_DOCUMENT(writer, env) \
        ((writer)->ops->write_start_document(writer,env))        

#define AXIS2_XML_WRITER_WRITE_START_DOCUMENT_WITH_VERSION(writer, env, version) \
        ((writer)->ops->write_start_document_with_version(writer, env, version)) 

#define AXIS2_XML_WRITER_WRITE_START_DOCUMENT_WITH_VERSION_ENCODING(\
        writer, env,  version, encoding) \
        ((writer)->ops->write_start_document_with_version_encoding(\
        writer, env, version, encoding))

#define AXIS2_XML_WRITER_WRITE_CHARACTERS(writer, env, text) \
        ((writer)->ops->write_characters(writer, env, text)) 

#define AXIS2_XML_WRITER_GET_PREFIX(writer, env, uri) \
        ((writer)->ops->get_prefix(writer, env, uri))

#define AXIS2_XML_WRITER_SET_PREFIX(writer, env, prefix, uri) \
        ((writer)->ops->set_prefix(writer, env, prefix, uri))

#define AXIS2_XML_WRITER_SET_DEFAULT_PREFIX(writer, env, uri) \
        ((writer)->ops->set_default_prefix(writer, env, uri))

#define AXIS2_XML_WRITER_WRITE_ENCODED(writer, env, text, in_attr) \
        ((writer)->ops->write_encoded(writer, env, text, in_attr))
        
#define AXIS2_XML_WRITER_GET_XML(writer, env) \
        ((writer)->ops->get_xml(writer, env))        
/** @} */


#ifdef __cplusplus
}
#endif

#endif /* AXIS2_XML_WRITER_H */
