You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by mi...@apache.org on 2007/05/30 16:01:06 UTC
svn commit: r542822 - in /webservices/axis2/trunk/c/util:
include/axutil_duration.h src/Makefile.am src/duration.c
Author: milinda
Date: Wed May 30 07:01:05 2007
New Revision: 542822
URL: http://svn.apache.org/viewvc?view=rev&rev=542822
Log:
Add XSD Duration support to Axis2 Data Binding.
Added:
webservices/axis2/trunk/c/util/include/axutil_duration.h
webservices/axis2/trunk/c/util/src/duration.c
Modified:
webservices/axis2/trunk/c/util/src/Makefile.am
Added: webservices/axis2/trunk/c/util/include/axutil_duration.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/util/include/axutil_duration.h?view=auto&rev=542822
==============================================================================
--- webservices/axis2/trunk/c/util/include/axutil_duration.h (added)
+++ webservices/axis2/trunk/c/util/include/axutil_duration.h Wed May 30 07:01:05 2007
@@ -0,0 +1,144 @@
+/*
+ * 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 AXUTIL_DURATION_H
+#define AXUTIL_DURATION_H
+
+#include <axutil_utils_defines.h>
+#include <axutil_env.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ /**
+ * @defgroup axutil_duration
+ * @ingroup axis2_util
+ * @{
+ */
+
+ typedef struct axutil_duration axutil_duration_t;
+
+
+ /**
+ * Creates axutil_duration struct with current date time
+ * @param env double pointer to environment struct. MUST NOT be NULL
+ * @return pointer to newly created axutil_duration struct
+ */
+ AXIS2_EXTERN axutil_duration_t * AXIS2_CALL
+ axutil_duration_create(axutil_env_t *env);
+
+ AXIS2_EXTERN axutil_duration_t * AXIS2_CALL
+ axutil_duration_create_from_values(const axutil_env_t *env,
+ axis2_bool_t negative,
+ int years, int months, int days, int hours,
+ int minutes, double seconds);
+
+ AXIS2_EXTERN axutil_duration_t * AXIS2_CALL
+ axutil_duration_create_from_string(const axutil_env_t *env,
+ axis2_char_t *duration_str);
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_free(axutil_duration_t *duration,
+ const axutil_env_t *env);
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_deserialize_duration(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ const char* duration_str);
+
+ AXIS2_EXTERN char* AXIS2_CALL
+ axutil_duration_serialize_duration(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_duration(axutil_duration_t* duration,
+ const axutil_env_t *env,
+ axis2_bool_t negative,
+ int years, int months, int days,
+ int hours, int mins, double seconds);
+
+ AXIS2_EXTERN int AXIS2_CALL
+ axutil_duration_get_years(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_years(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int years);
+
+
+ AXIS2_EXTERN int AXIS2_CALL
+ axutil_duration_get_months(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_months(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int months);
+
+ AXIS2_EXTERN int AXIS2_CALL
+ axutil_duration_get_days(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_days(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int days);
+
+ AXIS2_EXTERN int AXIS2_CALL
+ axutil_duration_get_hours(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_hours(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int hours);
+
+ AXIS2_EXTERN int AXIS2_CALL
+ axutil_duration_get_mins(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_mins(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int mins);
+
+ AXIS2_EXTERN double AXIS2_CALL
+ axutil_duration_get_seconds(axutil_duration_t *duration,
+ const axutil_env_t *env );
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ axutil_duration_set_seconds(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ double seconds);
+
+ AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+ axutil_duration_compare(axutil_duration_t *duration_one,
+ axutil_duration_t *duration_two,
+ axutil_env_t *env);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AXIS2_DURATION_H */
+
+
+
Modified: webservices/axis2/trunk/c/util/src/Makefile.am
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/util/src/Makefile.am?view=diff&rev=542822&r1=542821&r2=542822
==============================================================================
--- webservices/axis2/trunk/c/util/src/Makefile.am (original)
+++ webservices/axis2/trunk/c/util/src/Makefile.am Wed May 30 07:01:05 2007
@@ -34,7 +34,8 @@
properties.c \
rand.c \
date_time_util.c \
- version.c
+ version.c \
+ duration.c
libaxutil_la_LIBADD = $(top_builddir)/src/platforms/unix/libaxis2_unix.la \
$(top_builddir)/src/minizip/libaxis2_minizip.la
Added: webservices/axis2/trunk/c/util/src/duration.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/util/src/duration.c?view=auto&rev=542822
==============================================================================
--- webservices/axis2/trunk/c/util/src/duration.c (added)
+++ webservices/axis2/trunk/c/util/src/duration.c Wed May 30 07:01:05 2007
@@ -0,0 +1,414 @@
+/*
+ * 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 <axutil_duration.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <axutil_error.h>
+#include <axutil_utils.h>
+
+/**
+ * @brief
+ */
+
+struct axutil_duration
+{
+ axis2_bool_t is_negative;
+ int years;
+ int months;
+ int days;
+ int hours;
+ int mins;
+ double secs;
+};
+
+
+AXIS2_EXTERN axutil_duration_t * AXIS2_CALL
+axutil_duration_create(axutil_env_t *env)
+{
+ return axutil_duration_create_from_values(env, 0, 0, 0, 0, 0, 0, 0.0);
+}
+
+AXIS2_EXTERN axutil_duration_t * AXIS2_CALL
+axutil_duration_create_from_values(const axutil_env_t *env,
+ axis2_bool_t negative,
+ int years, int months, int days, int hours,
+ int minutes, double seconds)
+{
+ axutil_duration_t *duration = NULL;
+
+ AXIS2_ENV_CHECK(env, NULL);
+
+ duration = (axutil_duration_t *)AXIS2_MALLOC(env->allocator,
+ sizeof(axutil_duration_t));
+ if (NULL == duration)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+ return NULL;
+ }
+
+ duration->is_negative = negative;
+ duration->years = years;
+ duration->months = months;
+ duration->days = days;
+ duration->hours = hours;
+ duration->mins = minutes;
+ duration->secs = seconds;
+
+ return duration;
+}
+
+AXIS2_EXTERN axutil_duration_t * AXIS2_CALL
+axutil_duration_create_from_string(const axutil_env_t *env,
+ axis2_char_t *duration_str)
+{
+ axutil_duration_t *duration = NULL;
+ return (axutil_duration_t*)axutil_duration_deserialize_duration(duration, env, duration_str);
+}
+
+
+/***************************Function implementation****************************/
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_free(axutil_duration_t *duration,
+ const axutil_env_t *env)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+ if (duration)
+ {
+ AXIS2_FREE(env->allocator, duration);
+ duration = NULL;
+ }
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_deserialize_duration(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ const axis2_char_t *duration_str)
+{
+ const axis2_char_t *cur = duration_str;
+ double num;
+ int num_type = 0;
+ unsigned int seq = 0;
+ const char desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'};
+
+ if (duration_str == NULL)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ if (*cur == '-')
+ {
+ duration->is_negative = 1;
+ cur++;
+ }
+
+ if (*cur++ != 'P')
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ if (*cur == 0)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ while ( *cur != 0 )
+ {
+ if ( seq >= sizeof(desig))
+ {
+ AXIS2_ERROR_SET(env->error,AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ if (*cur == 'T')
+ {
+ if (seq < 3) {
+ seq = 3;
+ cur++;
+ }
+ else
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+ }
+ else if (seq == 3)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ num = 0;
+
+ if ((*cur < '0') || (*cur > '9'))
+ num_type = -1;
+ else
+ {
+ while ((*cur >= '0') && (*cur <= '9')) {
+ num = num * 10 + (*cur - '0');
+ cur++;
+ }
+ }
+
+ if (!num_type && (*cur == '.')) {
+ double mult = 1;
+ cur++;
+ if ((*cur < '0') || (*cur > '9'))
+ num_type = -1;
+ else
+ num_type = 1;
+ while ((*cur >= '0') && (*cur <= '9')) {
+ mult /= 10;
+ num += (*cur - '0') * mult;
+ cur++;
+ }
+ }
+
+ if ((num_type == -1) || (*cur == 0))
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ while ( seq < sizeof(desig) )
+ {
+ if (*cur == desig[seq])
+ {
+ if ((num_type = 0) && (seq < (sizeof(desig)-1)))
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NONE, AXIS2_FAILURE);
+ return AXIS2_FAILURE;
+ }
+
+ switch (seq)
+ {
+ case 0:
+ duration->years = (int)num;
+ seq++;
+ break;
+ case 1:
+ duration->months = (int)num;
+ seq++;
+ break;
+ case 2:
+ duration->days = (int)num;
+ seq++;
+ break;
+ case 3:
+ duration->hours = (int)num;
+ seq++;
+ break;
+ case 4:
+ duration->mins = (int)num;
+ seq++;
+ break;
+ case 5:
+ duration->secs = num;
+ seq++;
+ break;
+ }
+ break;
+ }
+ if ((++seq == 3) || (seq == 6))
+ return 1;
+ }
+ cur++;
+ }
+ return AXIS2_SUCCESS;
+
+}
+
+AXIS2_EXTERN char* AXIS2_CALL
+axutil_duration_serialize_duration(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ axis2_char_t *duration_str = NULL;
+
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+ duration_str = (axis2_char_t*)AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * 64);
+
+ if (duration->is_negative == 0)
+ sprintf(duration_str, "P%dY%dM%dDT%dH%dM%fS", duration->years, duration->months,
+ duration->days, duration->hours, duration->mins, duration->secs);
+ else
+ sprintf(duration_str, "-P%dY%dM%dDT%dH%dM%fS", duration->years, duration->months,
+ duration->days, duration->hours, duration->mins, duration->secs);
+
+ return duration_str;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_duration(axutil_duration_t* duration,
+ const axutil_env_t *env,
+ axis2_bool_t negative,
+ int years, int months, int days,
+ int hours, int mins, double seconds)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+ if(years > -1)duration->years = years;
+ if(months > -1)duration->months = months;
+ if(days > -1)duration->days = days;
+ if(hours > -1)duration->hours = hours;
+ if(mins > -1)duration->mins = mins;
+ if(seconds > -1)duration->secs = seconds;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN int AXIS2_CALL
+axutil_duration_get_years(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ return duration->years;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_years(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int years)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ duration->years = years;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN int AXIS2_CALL
+axutil_duration_get_months(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ return duration->months;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_months(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int months)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ duration->months = months;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN int AXIS2_CALL
+axutil_duration_get_days(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ return duration->days;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_days(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int days)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ duration->days = days;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN int AXIS2_CALL
+axutil_duration_get_hours(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ return duration->hours;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_hours(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int hours)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ duration->hours = hours;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN int AXIS2_CALL
+axutil_duration_get_mins(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ return duration->mins;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_mins(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ int mins)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ duration->mins = mins;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN double AXIS2_CALL
+axutil_duration_get_seconds(axutil_duration_t *duration,
+ const axutil_env_t *env )
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ return duration->secs;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axutil_duration_set_seconds(axutil_duration_t *duration,
+ const axutil_env_t *env,
+ double seconds)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ duration->secs = seconds;
+
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+axutil_duration_compare(axutil_duration_t *duration_one,
+ axutil_duration_t *duration_two,
+ axutil_env_t *env)
+{
+ AXIS2_ENV_CHECK(env, AXIS2_FALSE);
+
+ if (!duration_one || !duration_two)
+ {
+ AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE);
+ return -1;
+ }
+
+ /*TODO*/
+
+ return AXIS2_SUCCESS;
+}
+
+
+
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org