You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sa...@apache.org on 2005/11/29 04:53:58 UTC

svn commit: r349607 [2/3] - in /webservices/axis2/trunk/c: include/ modules/test/om/src/ modules/util/src/ modules/xml/om/src/ modules/xml/parser/ modules/xml/parser/guththila/src/ modules/xml/parser/libxml2/src/

Added: webservices/axis2/trunk/c/modules/xml/parser/libxml2/src/axis2_libxml2_reader_wrapper.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/xml/parser/libxml2/src/axis2_libxml2_reader_wrapper.c?rev=349607&view=auto
==============================================================================
--- webservices/axis2/trunk/c/modules/xml/parser/libxml2/src/axis2_libxml2_reader_wrapper.c (added)
+++ webservices/axis2/trunk/c/modules/xml/parser/libxml2/src/axis2_libxml2_reader_wrapper.c Mon Nov 28 19:53:29 2005
@@ -0,0 +1,738 @@
+/*
+ *   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.
+ *
+ */
+ 
+ #include <axis2_xml_reader.h>
+ #include <libxml/xmlreader.h>
+ #include <axis2_defines.h>
+ #include <axis2.h>
+ #include <string.h>
+ 
+/*************************** Function Prototypes ******************************/
+
+#define AXIS2_ATTR_NS_MAX   20
+
+ 
+int AXIS2_CALL
+axis2_libxml2_reader_wrapper_next(axis2_xml_reader_t *parser,
+                               axis2_env_t **env);
+                 
+axis2_status_t AXIS2_CALL 
+axis2_libxml2_reader_wrapper_free(axis2_xml_reader_t *parser,
+                           axis2_env_t **env);
+           
+int AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_count(axis2_xml_reader_t *parser,
+                                          axis2_env_t **env);
+        
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_name_by_number(axis2_xml_reader_t *parser,
+                                                   axis2_env_t **env,
+                                                   int i);
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_prefix_by_number(axis2_xml_reader_t *parser,
+                                                     axis2_env_t **env,
+                                                     int i);
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_value_by_number(axis2_xml_reader_t *parser,
+                                                     axis2_env_t **env,
+                                                     int i);
+        
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_namespace_by_number
+                                                    (axis2_xml_reader_t *parser,
+                                                     axis2_env_t **env,
+                                                     int i);
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_value(axis2_xml_reader_t *parser,
+                                axis2_env_t **env);
+                                                      
+int AXIS2_CALL 
+axis2_libxml2_reader_wrapper_get_namespace_count(axis2_xml_reader_t *parser,
+                                          axis2_env_t **env);
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_namespace_uri_by_number(axis2_xml_reader_t *parser,
+                                                  axis2_env_t **env,
+                                                  int i);
+                                               
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_namespace_prefix_by_number(axis2_xml_reader_t *parser,
+                                                	 axis2_env_t **env,
+                                                	 int i); 
+                                                
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_prefix(axis2_xml_reader_t *parser,
+                                 axis2_env_t **env);   
+        
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_name(axis2_xml_reader_t *parser,
+                               axis2_env_t **env); 
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_pi_target(axis2_xml_reader_t *parser,
+                                    axis2_env_t **env);
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_pi_data(axis2_xml_reader_t *parser,
+                                  axis2_env_t **env);
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_dtd(axis2_xml_reader_t *parser,
+                                  axis2_env_t **env);                                  
+                                  
+axis2_status_t AXIS2_CALL
+axis2_libxml2_reader_wrapper_xml_free(axis2_xml_reader_t *parser,
+                               axis2_env_t **env,
+                               void *data);
+
+axis2_status_t axis2_libxml2_reader_wrapper_fill_maps(axis2_xml_reader_t *parser,
+                                            axis2_env_t **env);
+                                            
+static int axis2_libxml2_reader_wrapper_read_input_callback(void *ctx,char *buffer,int size);                                            
+                                   
+/************* End function parameters , axis2_libxml2_reader_wrapper_impl_t struct ***/
+
+typedef struct axis2_libxml2_reader_wrapper_impl_t
+{
+	axis2_xml_reader_t parser;
+	
+	xmlTextReaderPtr reader;
+	
+	int current_event;
+	int current_attribute_count;
+    int current_namespace_count;
+	int event_map[18];
+    /* assuming that max ns and attri will be 20 */
+    
+    int namespace_map[AXIS2_ATTR_NS_MAX];
+    int attribute_map[AXIS2_ATTR_NS_MAX];
+    /******************************************/
+    /* read callback function */
+    int (*read_input_callback)(char *buffer, int size);
+    
+    
+}axis2_libxml2_reader_wrapper_impl_t;
+
+/****************** End struct , Macro *****************************************/
+
+#define AXIS2_INTF_TO_IMPL(p) ((axis2_libxml2_reader_wrapper_impl_t*)p)
+#define AXIS2_IMPL_TO_INTF(p) &(p->parser)
+
+
+/********************* End Macro  , event_map init function **********************/
+
+static axis2_status_t axis2_libxml2_reader_wrapper_init_map(
+                                      axis2_libxml2_reader_wrapper_impl_t *parser)
+{   
+    int i=0;
+    if(parser)
+    {
+        for(i=0;i<18;i++)
+           parser->event_map[i] = -1;
+        
+        parser->event_map[XML_READER_TYPE_ELEMENT] = 
+                    AXIS2_XML_READER_START_ELEMENT;
+        
+        parser->event_map[XML_READER_TYPE_ELEMENT] = 
+                    AXIS2_XML_READER_START_ELEMENT;
+        
+        parser->event_map[XML_READER_TYPE_DOCUMENT] = 
+                    AXIS2_XML_READER_START_DOCUMENT;
+        
+        parser->event_map[XML_READER_TYPE_TEXT] = AXIS2_XML_READER_CHARACTER;
+        
+        parser->event_map[XML_READER_TYPE_CDATA] = AXIS2_XML_READER_CDATA;
+        
+        parser->event_map[XML_READER_TYPE_SIGNIFICANT_WHITESPACE] = 
+                    AXIS2_XML_READER_SPACE;
+        
+        parser->event_map[XML_READER_TYPE_WHITESPACE] = AXIS2_XML_READER_SPACE;
+        
+        parser->event_map[XML_READER_TYPE_END_ELEMENT] = 
+                    AXIS2_XML_READER_END_ELEMENT;
+        
+        parser->event_map [XML_READER_TYPE_ENTITY_REFERENCE] = 
+                    AXIS2_XML_READER_ENTITY_REFERANCE;
+        
+        parser->event_map [XML_READER_TYPE_END_ENTITY] = AXIS2_XML_READER_SPACE;
+        
+        parser->event_map[XML_READER_TYPE_ENTITY] = AXIS2_XML_READER_SPACE;
+            
+        parser->event_map[XML_READER_TYPE_PROCESSING_INSTRUCTION] =
+                    AXIS2_XML_READER_PROCESSING_INSTRUCTION;
+                    
+        parser->event_map[XML_READER_TYPE_COMMENT] = AXIS2_XML_READER_COMMENT;
+        
+        parser->event_map[XML_READER_TYPE_DOCUMENT_TYPE] =
+                    AXIS2_XML_READER_DOCUMENT_TYPE;
+        return AXIS2_SUCCESS;
+    }
+    return AXIS2_FAILURE;
+}
+
+
+
+
+/*******************************************************************************/
+AXIS2_DECLARE(axis2_xml_reader_t *)
+axis2_xml_reader_create_for_file(axis2_env_t **env,
+                                  char *filename,
+                                  const axis2_char_t *encoding)
+{
+    
+	axis2_libxml2_reader_wrapper_impl_t *wrapper_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(filename, env, NULL);
+    
+    wrapper_impl = (axis2_libxml2_reader_wrapper_impl_t*)AXIS2_MALLOC((*env)->allocator,
+         sizeof(axis2_libxml2_reader_wrapper_impl_t));
+    if(!wrapper_impl)
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, NULL);
+    
+    wrapper_impl->reader =  xmlNewTextReaderFilename(filename);
+    if(!(wrapper_impl->reader))
+    {
+        AXIS2_FREE((*env)->allocator, wrapper_impl);
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_CREATING_XML_STREAM_READER, NULL);
+        
+    }
+	
+    
+    wrapper_impl->current_event = -1;
+    
+    axis2_libxml2_reader_wrapper_init_map(wrapper_impl);
+	
+    
+    wrapper_impl->parser.ops = NULL;
+    wrapper_impl->parser.ops = (axis2_xml_reader_ops_t*)AXIS2_MALLOC((*env)->allocator,
+                                sizeof(axis2_xml_reader_ops_t));
+    
+    if(!(wrapper_impl->parser.ops))
+    {
+        xmlFreeTextReader(wrapper_impl->reader);
+        AXIS2_FREE((*env)->allocator, wrapper_impl);
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, NULL);
+    }
+	/* operations */
+	
+	wrapper_impl->parser.ops->free = axis2_libxml2_reader_wrapper_free;
+    wrapper_impl->parser.ops->next = axis2_libxml2_reader_wrapper_next;
+    wrapper_impl->parser.ops->xml_free = axis2_libxml2_reader_wrapper_xml_free;
+    
+    wrapper_impl->parser.ops->get_attribute_count =
+        axis2_libxml2_reader_wrapper_get_attribute_count;
+    wrapper_impl->parser.ops->get_attribute_name_by_number =
+        axis2_libxml2_reader_wrapper_get_attribute_name_by_number;
+    wrapper_impl->parser.ops->get_attribute_value_by_number = 
+        axis2_libxml2_reader_wrapper_get_attribute_value_by_number;
+    wrapper_impl->parser.ops->get_attribute_namespace_by_number =
+        axis2_libxml2_reader_wrapper_get_attribute_namespace_by_number;
+    wrapper_impl->parser.ops->get_attribute_prefix_by_number =
+        axis2_libxml2_reader_wrapper_get_attribute_prefix_by_number;
+    
+    wrapper_impl->parser.ops->get_value =
+        axis2_libxml2_reader_wrapper_get_value;
+    wrapper_impl->parser.ops->get_prefix =
+        axis2_libxml2_reader_wrapper_get_prefix;
+    wrapper_impl->parser.ops->get_name =
+        axis2_libxml2_reader_wrapper_get_name;
+        
+        
+    wrapper_impl->parser.ops->get_namespace_count =
+        axis2_libxml2_reader_wrapper_get_namespace_count;
+    wrapper_impl->parser.ops->get_namespace_prefix_by_number =
+        axis2_libxml2_reader_wrapper_get_namespace_prefix_by_number;
+    wrapper_impl->parser.ops->get_namespace_uri_by_number =
+        axis2_libxml2_reader_wrapper_get_namespace_uri_by_number;
+        
+    wrapper_impl->parser.ops->get_pi_target =
+        axis2_libxml2_reader_wrapper_get_pi_target;
+    wrapper_impl->parser.ops->get_pi_data =
+        axis2_libxml2_reader_wrapper_get_pi_data;
+        
+    wrapper_impl->parser.ops->get_dtd =
+        axis2_libxml2_reader_wrapper_get_dtd;    
+	return &(wrapper_impl->parser);
+}
+
+/************** create function for io callback function **********************/
+
+
+
+
+AXIS2_DECLARE(axis2_xml_reader_t *)
+axis2_xml_reader_create_for_memory(axis2_env_t **env,
+                                    int (*read_input_callback)(char *buffer,int size),
+                                    const axis2_char_t *encoding)
+{
+    
+	axis2_libxml2_reader_wrapper_impl_t *wrapper_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(read_input_callback, env, NULL);
+    
+    wrapper_impl = (axis2_libxml2_reader_wrapper_impl_t*)AXIS2_MALLOC((*env)->allocator,
+         sizeof(axis2_libxml2_reader_wrapper_impl_t));
+    if(!wrapper_impl)
+    {
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, NULL);
+        return NULL;   
+    }
+    
+    wrapper_impl->read_input_callback = read_input_callback;
+    
+    wrapper_impl->reader =  xmlReaderForIO(axis2_libxml2_reader_wrapper_read_input_callback,
+             NULL, wrapper_impl, NULL, encoding, XML_PARSE_RECOVER);
+    
+    if(!(wrapper_impl->reader))
+    {
+        AXIS2_FREE((*env)->allocator, wrapper_impl);
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_CREATING_XML_STREAM_READER, NULL);
+    }
+	
+    
+    wrapper_impl->current_event = -1;
+    
+    axis2_libxml2_reader_wrapper_init_map(wrapper_impl);
+	
+    
+    wrapper_impl->parser.ops = NULL;
+    wrapper_impl->parser.ops = (axis2_xml_reader_ops_t*)AXIS2_MALLOC((*env)->allocator,
+                                sizeof(axis2_xml_reader_ops_t));
+    
+    if(!(wrapper_impl->parser.ops))
+    {
+        xmlFreeTextReader(wrapper_impl->reader);
+        AXIS2_FREE((*env)->allocator, wrapper_impl);
+        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, NULL);
+    }
+
+	
+		wrapper_impl->parser.ops->free = axis2_libxml2_reader_wrapper_free;
+    wrapper_impl->parser.ops->next = axis2_libxml2_reader_wrapper_next;
+    wrapper_impl->parser.ops->xml_free = axis2_libxml2_reader_wrapper_xml_free;
+    
+    wrapper_impl->parser.ops->get_attribute_count =
+        axis2_libxml2_reader_wrapper_get_attribute_count;
+    wrapper_impl->parser.ops->get_attribute_name_by_number =
+        axis2_libxml2_reader_wrapper_get_attribute_name_by_number;
+    wrapper_impl->parser.ops->get_attribute_value_by_number = 
+        axis2_libxml2_reader_wrapper_get_attribute_value_by_number;
+    wrapper_impl->parser.ops->get_attribute_namespace_by_number =
+        axis2_libxml2_reader_wrapper_get_attribute_namespace_by_number;
+    wrapper_impl->parser.ops->get_attribute_prefix_by_number =
+        axis2_libxml2_reader_wrapper_get_attribute_prefix_by_number;
+    
+    wrapper_impl->parser.ops->get_value =
+        axis2_libxml2_reader_wrapper_get_value;
+    wrapper_impl->parser.ops->get_prefix =
+        axis2_libxml2_reader_wrapper_get_prefix;
+    wrapper_impl->parser.ops->get_name =
+        axis2_libxml2_reader_wrapper_get_name;
+        
+        
+    wrapper_impl->parser.ops->get_namespace_count =
+        axis2_libxml2_reader_wrapper_get_namespace_count;
+    wrapper_impl->parser.ops->get_namespace_prefix_by_number =
+        axis2_libxml2_reader_wrapper_get_namespace_prefix_by_number;
+    wrapper_impl->parser.ops->get_namespace_uri_by_number =
+        axis2_libxml2_reader_wrapper_get_namespace_uri_by_number;
+        
+    wrapper_impl->parser.ops->get_pi_target =
+        axis2_libxml2_reader_wrapper_get_pi_target;
+    wrapper_impl->parser.ops->get_pi_data =
+        axis2_libxml2_reader_wrapper_get_pi_data;
+        
+    wrapper_impl->parser.ops->get_dtd =
+        axis2_libxml2_reader_wrapper_get_dtd;    
+	return &(wrapper_impl->parser);
+}
+
+
+
+int AXIS2_CALL
+axis2_libxml2_reader_wrapper_next(axis2_xml_reader_t *parser,
+                               axis2_env_t **env)
+{
+    int ret_val = 0;
+    int node = 2;
+    int empty_check = 0;
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl; 
+    AXIS2_FUNC_PARAM_CHECK(parser,env, -1);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    /* if end_element event after empty element event is not required remove
+        this if close 
+    if(parser_impl->current_event == AXIS2_XML_READER_EMPTY_ELEMENT)
+    {
+         if the previous event was a empty element then create an end element
+            event 
+        parser_impl->current_event = AXIS2_XML_READER_END_ELEMENT;
+        return AXIS2_XML_READER_END_ELEMENT;        
+    }
+    */
+    ret_val = xmlTextReaderRead(parser_impl->reader);
+    
+    if(ret_val == 1)
+    {
+        node = xmlTextReaderNodeType(parser_impl->reader);
+        parser_impl->current_event = parser_impl->event_map[node];
+        parser_impl->current_attribute_count=0;
+        parser_impl->current_namespace_count=0;
+        
+        if(node == XML_READER_TYPE_ELEMENT)
+        {
+            empty_check = xmlTextReaderIsEmptyElement(parser_impl->reader);
+            axis2_libxml2_reader_wrapper_fill_maps(parser , env);
+        }
+        if(empty_check == 1)
+        {   
+            parser_impl->current_event =  AXIS2_XML_READER_EMPTY_ELEMENT;
+            return AXIS2_XML_READER_EMPTY_ELEMENT;         
+        }
+        return parser_impl->event_map[node];
+    }
+    else
+        return -1;
+}
+                 
+axis2_status_t AXIS2_CALL 
+axis2_libxml2_reader_wrapper_free(axis2_xml_reader_t *parser,
+                           axis2_env_t **env)
+{
+    AXIS2_FUNC_PARAM_CHECK(parser,env, AXIS2_FAILURE);
+    
+    if(AXIS2_INTF_TO_IMPL(parser)->reader)
+        xmlFreeTextReader(AXIS2_INTF_TO_IMPL(parser)->reader);
+    if(parser->ops)
+        AXIS2_FREE((*env)->allocator, parser->ops);
+    AXIS2_FREE((*env)->allocator, AXIS2_INTF_TO_IMPL(parser));
+    return AXIS2_SUCCESS;   
+}
+           
+int AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_count(axis2_xml_reader_t *parser,
+                                          axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl=NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser,env, AXIS2_FAILURE);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    if(parser_impl->current_event == AXIS2_XML_READER_START_ELEMENT ||
+       parser_impl->current_event == AXIS2_XML_READER_EMPTY_ELEMENT )
+        return parser_impl->current_attribute_count;
+    else
+        return 0;
+}
+        
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_name_by_number(axis2_xml_reader_t *parser,
+                                                   axis2_env_t **env,
+                                                   int i)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    if(parser_impl->current_attribute_count >0 && 
+        parser_impl->current_attribute_count >= i)
+    {
+        int ret = xmlTextReaderMoveToAttributeNo(parser_impl->reader,
+                                                 parser_impl->attribute_map[i]);
+        if(ret == 1)
+            return (axis2_char_t*)xmlTextReaderLocalName(parser_impl->reader);
+        else
+            return NULL;
+    }
+    return NULL;
+}
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_prefix_by_number(axis2_xml_reader_t *parser,
+                                                     axis2_env_t **env,
+                                                     int i)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    if(parser_impl->current_attribute_count >0 && 
+        parser_impl->current_attribute_count >= i)
+    {
+        int ret = xmlTextReaderMoveToAttributeNo(parser_impl->reader,
+                                                 parser_impl->attribute_map[i]);
+        if(ret == 1)
+            return (axis2_char_t*)xmlTextReaderPrefix(parser_impl->reader);
+        else
+            return NULL;
+    }
+    return NULL;   
+}
+
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_value_by_number(axis2_xml_reader_t *parser,
+                                                     axis2_env_t **env,
+                                                     int i)
+{
+    
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    if(parser_impl->current_attribute_count >0 && 
+        parser_impl->current_attribute_count >= i)
+    {
+        int ret = xmlTextReaderMoveToAttributeNo(parser_impl->reader,
+                                                 parser_impl->attribute_map[i]);
+        if(ret == 1)
+            return (axis2_char_t*)xmlTextReaderValue(parser_impl->reader);
+        else
+            return NULL;
+    }
+    return NULL; 
+}
+        
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_attribute_namespace_by_number
+                                                    (axis2_xml_reader_t *parser,
+                                                     axis2_env_t **env,
+                                                     int i)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    if(parser_impl->current_attribute_count >0 && 
+        parser_impl->current_attribute_count >= i )
+    {
+        int ret = xmlTextReaderMoveToAttributeNo(parser_impl->reader,
+                                                 parser_impl->attribute_map[i]);
+        
+        
+        if(ret == 1)
+            return (axis2_char_t*)xmlTextReaderNamespaceUri(parser_impl->reader);
+        else
+            return NULL;
+    }
+    return NULL;     
+}
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_value(axis2_xml_reader_t *parser,
+                                axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    return (axis2_char_t*)xmlTextReaderValue(parser_impl->reader);
+   
+}
+                                                      
+int AXIS2_CALL 
+axis2_libxml2_reader_wrapper_get_namespace_count(axis2_xml_reader_t *parser,
+                                          axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser,env, AXIS2_FAILURE);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    if(parser_impl->current_event == AXIS2_XML_READER_START_ELEMENT ||
+       parser_impl->current_event == AXIS2_XML_READER_EMPTY_ELEMENT)
+        return parser_impl->current_namespace_count;
+    else
+        return 0;
+}
+
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_namespace_uri_by_number(axis2_xml_reader_t *parser,
+                                                  axis2_env_t **env,
+                                                  int i)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    if(parser_impl->current_namespace_count >0 && 
+        parser_impl->current_namespace_count >= i )
+    {
+        
+        int ret = xmlTextReaderMoveToAttributeNo(parser_impl->reader,
+                                                 parser_impl->namespace_map[i]);
+        if(ret == 1)
+            return (axis2_char_t*)xmlTextReaderValue(parser_impl->reader);
+        else
+            return NULL;
+    }
+    return NULL; 
+}
+                                               
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_namespace_prefix_by_number(axis2_xml_reader_t *parser,
+                                                	 axis2_env_t **env,
+                                                	 int i)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    if(parser_impl->current_namespace_count >0 && 
+        parser_impl->current_namespace_count >= i ) 
+    {   
+        int ret = xmlTextReaderMoveToAttributeNo(parser_impl->reader,
+                                                 parser_impl->namespace_map[i]);
+        
+        if(ret == 1)
+            return (axis2_char_t*)xmlTextReaderLocalName(parser_impl->reader);
+        else
+            return NULL;
+    } 
+    return NULL; 
+
+    
+    
+}
+                                                
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_prefix(axis2_xml_reader_t *parser,
+                                 axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    xmlTextReaderMoveToElement(parser_impl->reader);
+    return (axis2_char_t*)xmlTextReaderPrefix(parser_impl->reader);
+}
+        
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_name(axis2_xml_reader_t *parser,
+                               axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    xmlTextReaderMoveToElement(parser_impl->reader);
+    return (axis2_char_t*)xmlTextReaderLocalName(parser_impl->reader);
+    
+}
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_pi_target(axis2_xml_reader_t *parser,
+                                    axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    if(parser_impl->current_event ==  AXIS2_XML_READER_PROCESSING_INSTRUCTION)
+        return (axis2_char_t*)xmlTextReaderLocalName(parser_impl->reader);
+    else
+        return NULL;        
+}
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_dtd(axis2_xml_reader_t *parser,
+                                  axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    if(parser_impl->current_event ==  AXIS2_XML_READER_DOCUMENT_TYPE)
+        return (axis2_char_t*)xmlTextReaderLocalName(parser_impl->reader);
+    else
+        return NULL;        
+}
+
+
+axis2_char_t* AXIS2_CALL
+axis2_libxml2_reader_wrapper_get_pi_data(axis2_xml_reader_t *parser,
+                                  axis2_env_t **env)
+{
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    AXIS2_FUNC_PARAM_CHECK(parser, env, NULL);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    if(parser_impl->current_event ==  AXIS2_XML_READER_PROCESSING_INSTRUCTION)
+         return (axis2_char_t*)xmlTextReaderValue(parser_impl->reader);
+    else
+    {
+        return NULL;
+    }    
+}
+
+axis2_status_t AXIS2_CALL
+axis2_libxml2_reader_wrapper_xml_free(axis2_xml_reader_t *parser,
+                               axis2_env_t **env,
+                               void *data)
+{
+    AXIS2_FUNC_PARAM_CHECK(parser, env, AXIS2_FAILURE);
+    AXIS2_PARAM_CHECK((*env)->error, data, AXIS2_FAILURE);
+    xmlFree(data);
+    return AXIS2_SUCCESS;
+ }
+
+
+axis2_status_t axis2_libxml2_reader_wrapper_fill_maps(axis2_xml_reader_t *parser,
+                                            axis2_env_t **env)
+{
+    int libxml2_attribute_count = 0;
+    int attr_count = 0;
+    int ns_count = 0;
+    int i=0;
+    char *q_name = NULL;
+    axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+    
+    AXIS2_FUNC_PARAM_CHECK(parser, env, AXIS2_FAILURE);
+    parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    
+    libxml2_attribute_count = xmlTextReaderAttributeCount(parser_impl->reader);
+    if(libxml2_attribute_count == 0)
+        return AXIS2_SUCCESS;
+    
+    for(i = 0;i < AXIS2_ATTR_NS_MAX ;i++)
+    {
+        parser_impl->namespace_map[i] = -1;
+        parser_impl->attribute_map[i] = -1;        
+    }
+    
+    for(i = 0; i < libxml2_attribute_count ; i++)
+    {
+        xmlTextReaderMoveToAttributeNo(parser_impl->reader,i);
+        q_name = xmlTextReaderName(parser_impl->reader);
+        if(q_name != NULL)
+        {    
+           if((strcmp(q_name, "xmlns") == 0) || (strncmp(q_name, "xmlns:",6) == 0))
+           {
+                /* found a namespace */
+               ns_count++;
+               parser_impl->namespace_map[ns_count] = i;
+           }
+           else
+           {
+                /* found an attribute */       
+               attr_count++;
+               parser_impl->attribute_map[attr_count] = i;
+           }
+           
+           xmlFree(q_name);
+           q_name = NULL;
+        }
+        
+        parser_impl->current_attribute_count = attr_count;
+        parser_impl->current_namespace_count = ns_count;
+    }
+    return AXIS2_SUCCESS;
+}
+
+
+static int axis2_libxml2_reader_wrapper_read_input_callback(void *ctx,char *buffer,int size)
+{
+ return  ((axis2_libxml2_reader_wrapper_impl_t*)ctx)->read_input_callback(buffer, size);
+}