blob: 5bf4c104865c310653cba0afaca43da5b3ef8c95 [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.
*/
#ifndef GUTHTHILA_XML_WRITER_H
#define GUTHTHILA_XML_WRITER_H
#include <guththila_token.h>
#include <guththila_defines.h>
#include <guththila_buffer.h>
#include <guththila.h>
#include <axutil_utils.h>
EXTERN_C_START()
#define GUTHTHILA_XML_WRITER_TOKEN
/*
Design notes:-
namesp member of guththila_xml_writer_s is populated with malloc created objects.
Providing a list for this seems expensive because most of the times only few
namespaces are present in a XML document.
element member of guththila_xml_writer_s must be povided the list capablity. This
is particularly important in very deep XML documents.
*/
typedef enum guththila_writer_type_s
{
GUTHTHILA_WRITER_FILE = 1,
GUTHTHILA_WRITER_MEMORY
} guththila_writer_type_t;
typedef struct guththila_writer_s
{
short type;
FILE *out_stream;
guththila_buffer_t *buffer;
int next;
}
guththila_writer_t;
typedef enum guththila_writer_status_s
{
/*Started writing a non empty element */
START = 1,
/*Started writing a empty element */
START_EMPTY,
/*We are in a position to begin wrting an element */
BEGINING
} guththila_writer_status_t;
/*Main structure which provides the writer capability*/
typedef struct guththila_xml_writer_s
{
guththila_stack_t element;
guththila_stack_t namesp;
guththila_writer_t *writer;
#ifdef GUTHTHILA_XML_WRITER_TOKEN
guththila_tok_list_t tok_list;
#endif
/* Type of this writer. Can be file writer or memory writer */
guththila_writer_type_t type;
FILE *out_stream;
guththila_buffer_t buffer;
guththila_writer_status_t status;
int next;
} guththila_xml_writer_t;
/*TODO: we need to came up with common implementation of followng two structures in writer and reader*/
/*
This is a private structure for keeping track of the elements. When we start to write an element this structure will be pop
*/
typedef struct guththila_xml_writer_element_s
{
#ifdef GUTHTHILA_XML_WRITER_TOKEN
guththila_token_t *prefix;
guththila_token_t *name;
#else
guththila_char_t *prefix;
guththila_char_t *name;
#endif
/* contains the number of the stack which holds the namespaces
for this element. When we close this element all the namespaces
that are below this should also must be closed */
int name_sp_stack_no;
}
guththila_xml_writer_element_t;
typedef struct guththila_xml_writer_namesp_s
{
/* These are double pointers because a single element may contain multple
namespace declarations */
#ifdef GUTHTHILA_XML_WRITER_TOKEN
guththila_token_t **name;
guththila_token_t **uri;
#else
guththila_char_t **name;
guththila_char_t **uri;
#endif
int no; /*number of namespaces */
int size;
}
guththila_xml_writer_namesp_t;
#define GUTHTHILA_XML_WRITER_NAMESP_DEF_SIZE 4
/*Writer functions*/
/*
* Create a writer which writes to a file.
* @param file_name name of the file
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT guththila_xml_writer_t *GUTHTHILA_CALL
guththila_create_xml_stream_writer(
char *file_name,
const axutil_env_t * env);
/*
* Create a writer which writes to a memory buffer.
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT guththila_xml_writer_t *GUTHTHILA_CALL
guththila_create_xml_stream_writer_for_memory(
const axutil_env_t * env);
/*
* Jus write what ever the content in the buffer. If the writer was in
* a start of a element it will close it.
* @param wr pointer to the writer
* @param buff buffer containing the data
* @param size size of the buffer
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_to_buffer(
guththila_xml_writer_t * wr,
char *buff,
int size,
const axutil_env_t * env);
/*
* Write the name space with the given prifix and namespace.
* @param wr pointer to the writer
* @param prefix prefix of the namespace
* @param uri uri of the namespace
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_namespace(
guththila_xml_writer_t * wr,
char *prefix,
char *uri,
const axutil_env_t * env);
/*
* Write the name space with the given prifix and namespace.
* @param wr pointer to the writer
* @param prefix prefix of the namespace
* @param uri uri of the namespace
* @param local_name name of the attribute
* @param value value of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_do_write_attribute_with_prefix_and_namespace(
guththila_xml_writer_t * wr,
char *prefix,
char *uri,
char *local_name,
char *value,
const axutil_env_t * env);
/*
* Write the start document element with the xml version and encoding.
* @param wr pointer to the writer
* @param env pointer to the environment
* @param encoding encoding of the XML.
* @param version xml version
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_start_document(
guththila_xml_writer_t * wr,
const axutil_env_t * env,
char *encoding,
char *version);
/*
* Write the start element.
* @param wr pointer to the writer
* @param name name of the element
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_start_element(
guththila_xml_writer_t * wr,
char *name,
const axutil_env_t * env);
/*
* Write the end element.
* @param wr pointer to the writer
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_end_element(
guththila_xml_writer_t * wr,
const axutil_env_t * env);
/*
* Not implemented.
* @param wr pointer to the writer
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_close(
guththila_xml_writer_t * wr,
const axutil_env_t * env);
/*
* Write the text content of a element.
* @param wr pointer to the writer
* @param buff character string
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_characters(
guththila_xml_writer_t * wr,
char *buff,
const axutil_env_t * env);
/*
* Write comment with the given text data.
* @param wr pointer to the writer
* @param buff character string
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_comment(
guththila_xml_writer_t * wr,
char *buff,
const axutil_env_t * env);
/*
* Write scape character.
* @param wr pointer to the writer
* @param buff character string
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_escape_character(
guththila_xml_writer_t * wr,
char *buff,
const axutil_env_t * env);
/*
* Write a buffer with special chars on it
* The special chars will be escaped
* @param wr pointer to the writer
* @param buff character string
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_escaped_buffer(
guththila_xml_writer_t * wr,
char *buff,
const axutil_env_t * env);
/*
* Start to write an empty element with the given name.
* @param wr pointer to the writer
* @param name name of the element
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_empty_element(
guththila_xml_writer_t * wr,
char *name,
const axutil_env_t * env);
/*
* Write a defualt namespace.
* @param wr pointer to the writer
* @param uri uri of the namespace
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_default_namespace(
guththila_xml_writer_t * wr,
char *uri,
const axutil_env_t * env);
/*
* Write a attribute with the given name and value.
* @param wr pointer to the writer
* @param localname name of the attribute
* @param value value of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_attribute(
guththila_xml_writer_t * wr,
char *localname,
char *value,
const axutil_env_t * env);
/*
* Write a attribute with the given name and value and namespace.
* @param wr pointer to the writer
* @param prefix prefix of the attribute
* @param namespace_uri uri of the namespace
* @param localname name of the attribute
* @param value value of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_attribute_with_prefix_and_namespace(
guththila_xml_writer_t * wr,
char *prefix,
char *namespace_uri,
char *localname,
char *value,
const axutil_env_t * env);
/*
* Write a attribute with the given name, value and prefix. If the prefix
* is not defined previously as a namespace this method will fail.
* @param wr pointer to the writer
* @param prefix prefix of the attribute
* @param localname name of the attribute
* @param value value of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_attribute_with_prefix(
guththila_xml_writer_t * wr,
char *prefix,
char *localname,
char *value,
const axutil_env_t * env);
/*
* Write a attribute with the given name, value and namespace uri.
* If the namespace is not defined previously as a namespace this
* method will fail. The prefix corresponding to the namespace uri
* will be used.
* @param wr pointer to the writer
* @param namesp namespace uri
* @param localname name of the attribute
* @param value value of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_attribute_with_namespace(
guththila_xml_writer_t * wr,
char *namesp,
char *localname,
char *value,
const axutil_env_t * env);
/*
* Write a start element with prefix and namespace. If the namespace is not
* defined previoully new namespace will be written.
* @param wr pointer to the writer
* @param prefix prefix of the attribute
* @param namespace_uri uri
* @param localname name of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_start_element_with_prefix_and_namespace(
guththila_xml_writer_t * wr,
char *prefix,
char *namespace_uri,
char *local_name,
const axutil_env_t * env);
/*
* Write a start element with the namespace. If the namespace is not
* defined previously method will fail.
* @param wr pointer to the writer
* @param namespace_uri uri
* @param localname name of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_start_element_with_namespace(
guththila_xml_writer_t * wr,
char *namespace_uri,
char *local_name,
const axutil_env_t * env);
/*
* Write a start element with the prefix. If the prefix is not
* defined previously method will fail.
* @param wr pointer to the writer
* @param namespace_uri uri
* @param localname name of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_start_element_with_prefix(
guththila_xml_writer_t * wr,
char *prefix,
char *local_name,
const axutil_env_t * env);
/*
* Write a empty element with prefix and namespace. If the namespace is not
* defined previoully new namespace will be written.
* @param wr pointer to the writer
* @param prefix prefix of the attribute
* @param namespace_uri uri
* @param localname name of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_empty_element_with_prefix_and_namespace(
guththila_xml_writer_t * wr,
char *prefix,
char *namespace_uri,
char *local_name,
const axutil_env_t * env);
/*
* Write a empty element with the namespace. If the namespace is not
* defined previously method will fail.
* @param wr pointer to the writer
* @param namespace_uri uri
* @param localname name of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_empty_element_with_namespace(
guththila_xml_writer_t * wr,
char *namespace_uri,
char *local_name,
const axutil_env_t * env);
/*
* Write a empty element with the prefix. If the prefix is not
* defined previously method will fail.
* @param wr pointer to the writer
* @param namespace_uri uri
* @param localname name of the attribute
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_write_empty_element_with_prefix(
guththila_xml_writer_t * wr,
char *prefix,
char *local_name,
const axutil_env_t * env);
/*
* Close all the elements that were started by writing the end elements.
* @param wr pointer to the writer
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_end_document(
guththila_xml_writer_t * wr,
const axutil_env_t * env);
/*
* Write a new element with the name, then write the characters as text,
* then close the element and write a new line.
* @param wr pointer to the writer
* @element_name name of the element
* @characters text of the new element
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT int GUTHTHILA_CALL guththila_write_line(
guththila_xml_writer_t * wr,
char *element_name,
char *characters,
const axutil_env_t * env);
/*
* Get the memory buffer that is written.
* @param wr pointer to the writer
* @param env pointer to the environment
* @return memory buffer
*/
GUTHTHILA_EXPORT char *GUTHTHILA_CALL guththila_get_memory_buffer(
guththila_xml_writer_t * wr,
const axutil_env_t * env);
/*
* Get the size of the memory buffer.
* @param wr pointer to the writer
* @param env pointer to the environment
* @return size of the buffer
*/
GUTHTHILA_EXPORT unsigned int GUTHTHILA_CALL
guththila_get_memory_buffer_size(
guththila_xml_writer_t * wr,
const axutil_env_t * env);
/*
* Free the writer.
* @param wr pointer to the writer
* @param env pointer to the environment
*/
GUTHTHILA_EXPORT void GUTHTHILA_CALL guththila_xml_writer_free(
guththila_xml_writer_t * wr,
const axutil_env_t * env);
/*
* Get the prefix for the namespace.
* @param wr pointer to the writer
* @namespace namespace uri
* @param env pointer to the environment
* @return prefix for the namspace uri
*/
GUTHTHILA_EXPORT char *GUTHTHILA_CALL guththila_get_prefix_for_namespace(
guththila_xml_writer_t * wr,
char *namespace_uri,
const axutil_env_t * env);
EXTERN_C_END()
#endif