blob: 2f684e1fb22be15c21a495b5a8e42da93e28405a [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.
*/
#include <tcpmon_util.h>
#include <axiom.h>
#define START_ELEMENT 1
#define CHAR_VALUE 2
#define END_ELEMENT 3
#define EMPTY_ELEMENT 4
typedef struct tcpmon_util_allocator
{
int allocated;
int index;
axis2_char_t *buffer;
}
tcpmon_util_allocator_t;
axis2_char_t *tcpmon_strcat(
char *dest,
char *source,
int *cur_buf_s,
const axutil_env_t * env);
/*static void add_string(const axutil_env_t* env,
tcpmon_util_allocator_t* allocator,
axis2_char_t* string);
*/
/*static void add_axis2_char_t(const axutil_env_t* env,
tcpmon_util_allocator_t* allocator,
axis2_char_t c,
int turns);
*/
axis2_char_t *
tcpmon_util_format_as_xml(
const axutil_env_t * env,
axis2_char_t * data,
int format)
{
if (format)
{
int c;
int tab_pos = 0;
int has_value = 0;
int has_space = 0;
int start_ele = 0;
int prev_case = 0;
int buffer_size = 0;
axis2_char_t *out;
axiom_xml_reader_t *xml_reader = NULL;
buffer_size = 2 * strlen(data);
out = AXIS2_MALLOC(env->allocator, buffer_size * sizeof(axis2_char_t));
if (data)
{
int size = 0;
size = strlen(data);
xml_reader =
axiom_xml_reader_create_for_memory(env, data, size, "utf-8",
AXIS2_XML_PARSER_TYPE_BUFFER);
if (!xml_reader)
return AXIS2_FAILURE;
}
axiom_xml_reader_init();
while ((c = axiom_xml_reader_next(xml_reader, env)) != -1)
{
switch (c)
{
case AXIOM_XML_READER_START_DOCUMENT:
{
int ix;
tcpmon_strcat(out, "<?xml ", &buffer_size, env);
ix = axiom_xml_reader_get_attribute_count(xml_reader, env);
for (; ix > 0; ix--)
{
axis2_char_t *attr_prefix;
axis2_char_t *attr_name;
axis2_char_t *attr_value;
attr_prefix =
(axis2_char_t *)
axiom_xml_reader_get_attribute_prefix_by_number
(xml_reader, env, ix);
if (attr_prefix)
{
tcpmon_strcat(out, attr_prefix, &buffer_size, env);
tcpmon_strcat(out, ":", &buffer_size, env);
}
attr_name =
(axis2_char_t *)
axiom_xml_reader_get_attribute_name_by_number
(xml_reader, env, ix);
if (attr_name)
{
tcpmon_strcat(out, attr_name, &buffer_size, env);
tcpmon_strcat(out, "=\"", &buffer_size, env);
}
attr_value =
(axis2_char_t *)
axiom_xml_reader_get_attribute_value_by_number
(xml_reader, env, ix);
if (attr_value)
{
tcpmon_strcat(out, attr_value, &buffer_size, env);
tcpmon_strcat(out, "\"", &buffer_size, env);
}
}
printf("?>");
}
break;
case AXIOM_XML_READER_START_ELEMENT:
{
int i,
ix,
has_prefix = 0;
axis2_char_t *ele_name;
axis2_char_t *ele_prefix;
prev_case = START_ELEMENT;
has_value = 0;
has_space = 0;
if (start_ele != 0)
tcpmon_strcat(out, "\n", &buffer_size, env);
for (i = 0; i < tab_pos; i++)
tcpmon_strcat(out, "\t", &buffer_size, env);
tcpmon_strcat(out, "<", &buffer_size, env);
ele_prefix =
(axis2_char_t *) axiom_xml_reader_get_prefix(xml_reader,
env);
if (ele_prefix)
{
tcpmon_strcat(out, ele_prefix, &buffer_size, env);
tcpmon_strcat(out, ":", &buffer_size, env);
}
ele_name =
(axis2_char_t *) axiom_xml_reader_get_name(xml_reader,
env);
if (ele_name)
{
tcpmon_strcat(out, ele_name, &buffer_size, env);
}
ix = axiom_xml_reader_get_attribute_count(xml_reader, env);
for (; ix > 0; ix--)
{
axis2_char_t *attr_prefix;
axis2_char_t *attr_name;
axis2_char_t *attr_value;
attr_prefix =
(axis2_char_t *)
axiom_xml_reader_get_attribute_prefix_by_number
(xml_reader, env, ix);
if (attr_prefix)
{
has_prefix = 1;
tcpmon_strcat(out, " ", &buffer_size, env);
tcpmon_strcat(out, attr_prefix, &buffer_size, env);
tcpmon_strcat(out, ":", &buffer_size, env);
}
attr_name =
(axis2_char_t *)
axiom_xml_reader_get_attribute_name_by_number
(xml_reader, env, ix);
if (attr_name)
{
if (has_prefix)
{
tcpmon_strcat(out, attr_name, &buffer_size,
env);
tcpmon_strcat(out, "=\"", &buffer_size, env);
}
else
{
tcpmon_strcat(out, " ", &buffer_size, env);
tcpmon_strcat(out, attr_name, &buffer_size,
env);
tcpmon_strcat(out, "=\"", &buffer_size, env);
}
has_prefix = 0;
}
attr_value =
(axis2_char_t *)
axiom_xml_reader_get_attribute_value_by_number
(xml_reader, env, ix);
if (attr_value)
{
tcpmon_strcat(out, attr_value, &buffer_size, env);
tcpmon_strcat(out, "\"", &buffer_size, env);
}
}
tcpmon_strcat(out, ">", &buffer_size, env);
tab_pos++;
start_ele = 1;
}
break;
case AXIOM_XML_READER_CHARACTER:
{
axis2_char_t *ele_value;
prev_case = CHAR_VALUE;
ele_value = axiom_xml_reader_get_value(xml_reader, env);
if (ele_value)
tcpmon_strcat(out, ele_value, &buffer_size, env);
has_value = 1;
}
break;
case AXIOM_XML_READER_EMPTY_ELEMENT:
{
int i,
ix,
has_prefix = 0;
axis2_char_t *ele_name;
axis2_char_t *ele_prefix;
prev_case = EMPTY_ELEMENT;
has_value = 0;
has_space = 0;
if (start_ele != 0)
tcpmon_strcat(out, "\n", &buffer_size, env);
for (i = 0; i < tab_pos; i++)
tcpmon_strcat(out, "\t", &buffer_size, env);
tcpmon_strcat(out, "<", &buffer_size, env);
ele_prefix =
(axis2_char_t *) axiom_xml_reader_get_prefix(xml_reader,
env);
if (ele_prefix)
{
tcpmon_strcat(out, ele_prefix, &buffer_size, env);
tcpmon_strcat(out, ":", &buffer_size, env);
}
ele_name =
(axis2_char_t *) axiom_xml_reader_get_name(xml_reader,
env);
if (ele_name)
tcpmon_strcat(out, ele_name, &buffer_size, env);
ix = axiom_xml_reader_get_attribute_count(xml_reader, env);
for (; ix > 0; ix--)
{
axis2_char_t *attr_prefix;
axis2_char_t *attr_name;
axis2_char_t *attr_value;
attr_prefix =
(axis2_char_t *)
axiom_xml_reader_get_attribute_prefix_by_number
(xml_reader, env, ix);
if (attr_prefix)
{
has_prefix = 1;
tcpmon_strcat(out, " ", &buffer_size, env);
tcpmon_strcat(out, attr_prefix, &buffer_size, env);
tcpmon_strcat(out, ":", &buffer_size, env);
}
attr_name =
(axis2_char_t *)
axiom_xml_reader_get_attribute_name_by_number
(xml_reader, env, ix);
if (attr_name)
{
if (has_prefix)
{
tcpmon_strcat(out, attr_name, &buffer_size,
env);
tcpmon_strcat(out, "=\"", &buffer_size, env);
}
else
{
tcpmon_strcat(out, " ", &buffer_size, env);
tcpmon_strcat(out, attr_name, &buffer_size,
env);
tcpmon_strcat(out, "=\"", &buffer_size, env);
}
has_prefix = 0;
}
attr_value =
(axis2_char_t *)
axiom_xml_reader_get_attribute_value_by_number
(xml_reader, env, ix);
if (attr_value)
{
tcpmon_strcat(out, attr_value, &buffer_size, env);
tcpmon_strcat(out, "\"", &buffer_size, env);
}
}
tcpmon_strcat(out, "/>", &buffer_size, env);
start_ele = 1;
}
break;
case AXIOM_XML_READER_END_ELEMENT:
{
int i;
axis2_char_t *ele_prefix;
axis2_char_t *ele_name;
tab_pos--;
if (has_value == 0 && prev_case != START_ELEMENT)
{
tcpmon_strcat(out, "\n", &buffer_size, env);
for (i = 0; i < tab_pos; i++)
tcpmon_strcat(out, "\t", &buffer_size, env);
}
has_value = 0;
tcpmon_strcat(out, "</", &buffer_size, env);
ele_prefix =
(axis2_char_t *) axiom_xml_reader_get_prefix(xml_reader,
env);
if (ele_prefix)
{
tcpmon_strcat(out, ele_prefix, &buffer_size, env);
tcpmon_strcat(out, ":", &buffer_size, env);
}
ele_name =
(axis2_char_t *) axiom_xml_reader_get_name(xml_reader,
env);
if (ele_name)
{
tcpmon_strcat(out, ele_name, &buffer_size, env);
tcpmon_strcat(out, ">", &buffer_size, env);
}
prev_case = END_ELEMENT;
}
break;
}
}
return out;
}
return data;
}
/*void add_string(const axutil_env_t* env,
tcpmon_util_allocator_t* allocator,
axis2_char_t* string)
{
int additional_len = 0;
void* dest = NULL;
void* src = NULL;
int count = 0;
additional_len = axutil_strlen(string) + 1;
if (allocator-> index + additional_len >= allocator-> allocated)
{
if (allocator-> allocated == 0)
{
allocator-> buffer =
AXIS2_MALLOC(env-> allocator, additional_len);
}
else
{
allocator-> buffer =
AXIS2_REALLOC(env-> allocator, allocator-> buffer,
allocator-> allocated + additional_len);
}
allocator-> allocated += additional_len;
}
dest = allocator-> buffer + allocator-> index;
src = string;
count = additional_len;
memcpy(dest, src, count);
allocator-> index += count - 1;
}
*/
/*void add_axis2_char_t(const axutil_env_t* env,
tcpmon_util_allocator_t* allocator,
axis2_char_t c,
int turns)
{
int additional_len = 0;
additional_len = turns + 1;
if (allocator-> index + additional_len >= allocator-> allocated)
{
if (allocator-> allocated == 0)
{
allocator-> buffer =
AXIS2_MALLOC(env-> allocator, additional_len);
}
else
{
allocator-> buffer =
AXIS2_REALLOC(env-> allocator, allocator-> buffer,
allocator-> allocated + additional_len);
}
allocator-> allocated += additional_len;
}
memset(allocator-> buffer + allocator-> index, c, turns);
allocator-> index += turns;
} */
axis2_char_t *
tcpmon_strcat(
axis2_char_t * dest,
axis2_char_t * source,
int *buff_size,
const axutil_env_t * env)
{
int cur_len = 0;
int source_len = 0;
axis2_char_t *tmp;
cur_len = strlen(dest);
source_len = strlen(source);
if ((*buff_size - cur_len) < source_len)
{
*buff_size = *buff_size + (*buff_size * 2);
tmp =
(axis2_char_t *) AXIS2_REALLOC(env->allocator, dest,
*buff_size * sizeof(axis2_char_t));
dest = tmp;
strcat((char *) dest, (char *) source);
}
else
{
strcat((char *) dest, (char *) source);
}
return dest;
}