/* -*- Mode: C -*- */ /*====================================================================== FILE: icalvalue.c CREATOR: eric 02 May 1999 (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org This program is free software; you can redistribute it and/or modify it under the terms of either: The LGPL as published by the Free Software Foundation, version 2.1, available at: http://www.fsf.org/copyleft/lesser.html Or: The Mozilla Public License Version 1.0. You may obtain a copy of the License at http://www.mozilla.org/MPL/ The original code is icalvalue.c Contributions from: Graham Davison (g.m.davison@computer.org) ======================================================================*/ #ifdef HAVE_CONFIG_H #include #endif #include "icalerror.h" #include "icalmemory.h" #include "icalparser.h" #include "icalenums.h" #include "icalvalueimpl.h" #include /* for malloc */ #include /* for snprintf */ #include /* For memset, others */ #include /* For offsetof() macro */ #include #include /* for mktime */ #include /* for atoi and atof */ #include /* for SHRT_MAX */ struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind); /* This map associates each of the value types with its string representation */ struct icalvalue_kind_map { icalvalue_kind kind; char name[20]; }; int icalvalue_kind_is_valid(const icalvalue_kind kind) { int i = 0; do { if (value_map[i].kind == kind) return 1; } while (value_map[i++].kind != ICAL_NO_VALUE); return 0; } const char* icalvalue_kind_to_string(const icalvalue_kind kind) { int i; for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) { if (value_map[i].kind == kind) { return value_map[i].name; } } return 0; } icalvalue_kind icalvalue_string_to_kind(const char* str) { int i; for (i=0; value_map[i].kind != ICAL_NO_VALUE; i++) { if (strcasecmp(value_map[i].name,str) == 0) { return value_map[i].kind; } } return value_map[i].kind; } icalvalue* icalvalue_new_x (const char* v){ struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_X_VALUE); icalerror_check_arg_rz( (v!=0),"v"); icalvalue_set_x((icalvalue*)impl,v); return (icalvalue*)impl; } void icalvalue_set_x(icalvalue* impl, const char* v) { icalerror_check_arg_rv( (impl!=0),"value"); icalerror_check_arg_rv( (v!=0),"v"); if(impl->x_value!=0) {free((void*)impl->x_value);} impl->x_value = icalmemory_strdup(v); if (impl->x_value == 0){ errno = ENOMEM; } } const char* icalvalue_get_x(const icalvalue* value) { icalerror_check_arg( (value!=0),"value"); icalerror_check_value_type(value, ICAL_X_VALUE); return value->x_value; } /* Recur is a special case, so it is not auto generated. */ icalvalue* icalvalue_new_recur (struct icalrecurrencetype v) { struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_RECUR_VALUE); icalvalue_set_recur((icalvalue*)impl,v); return (icalvalue*)impl; } void icalvalue_set_recur(icalvalue* impl, struct icalrecurrencetype v) { icalerror_check_arg_rv( (impl!=0),"value"); icalerror_check_value_type(value, ICAL_RECUR_VALUE); if (impl->data.v_recur != 0){ free(impl->data.v_recur); impl->data.v_recur = 0; } impl->data.v_recur = malloc(sizeof(struct icalrecurrencetype)); if (impl->data.v_recur == 0){ icalerror_set_errno(ICAL_NEWFAILED_ERROR); return; } else { memcpy(impl->data.v_recur, &v, sizeof(struct icalrecurrencetype)); } } struct icalrecurrencetype icalvalue_get_recur(const icalvalue* value) { icalerror_check_arg( (value!=0),"value"); icalerror_check_value_type(value, ICAL_RECUR_VALUE); return *(value->data.v_recur); } icalvalue* icalvalue_new_trigger (struct icaltriggertype v) { struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_TRIGGER_VALUE); icalvalue_set_trigger((icalvalue*)impl,v); return (icalvalue*)impl; } void icalvalue_set_trigger(icalvalue* value, struct icaltriggertype v) { icalerror_check_arg_rv( (value!=0),"value"); if(!icaltime_is_null_time(v.time)){ icalvalue_set_datetime(value,v.time); value->kind = ICAL_DATETIME_VALUE; } else { icalvalue_set_duration(value,v.duration); value->kind = ICAL_DURATION_VALUE; } } struct icaltriggertype icalvalue_get_trigger(const icalvalue* impl) { struct icaltriggertype tr; icalerror_check_arg( (impl!=0),"value"); icalerror_check_arg( (impl!=0),"value"); if(impl->kind == ICAL_DATETIME_VALUE){ tr.duration = icaldurationtype_from_int(0); tr.time = impl->data.v_time; } else if(impl->kind == ICAL_DURATION_VALUE){ tr.time = icaltime_null_time(); tr.duration = impl->data.v_duration; } else { tr.duration = icaldurationtype_from_int(0); tr.time = icaltime_null_time(); icalerror_set_errno(ICAL_BADARG_ERROR); } return tr; } /* DATE-TIME-PERIOD is a special case, and is not auto generated */ icalvalue* icalvalue_new_datetimeperiod (struct icaldatetimeperiodtype v) { struct icalvalue_impl* impl = icalvalue_new_impl(ICAL_DATETIMEPERIOD_VALUE); icalvalue_set_datetimeperiod(impl,v); return (icalvalue*)impl; } void icalvalue_set_datetimeperiod(icalvalue* impl, struct icaldatetimeperiodtype v) { icalerror_check_arg_rv( (impl!=0),"value"); icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE); if(!icaltime_is_null_time(v.time)){ if(!icaltime_is_valid_time(v.time)){ icalerror_set_errno(ICAL_BADARG_ERROR); return; } impl->kind = ICAL_DATETIME_VALUE; icalvalue_set_datetime(impl,v.time); } else if (!icalperiodtype_is_null_period(v.period)) { if(!icalperiodtype_is_valid_period(v.period)){ icalerror_set_errno(ICAL_BADARG_ERROR); return; } impl->kind = ICAL_PERIOD_VALUE; icalvalue_set_period(impl,v.period); } else { icalerror_set_errno(ICAL_BADARG_ERROR); } } struct icaldatetimeperiodtype icalvalue_get_datetimeperiod(const icalvalue* impl) { struct icaldatetimeperiodtype dtp; icalerror_check_arg( (impl!=0),"value"); icalerror_check_value_type(value, ICAL_DATETIMEPERIOD_VALUE); if( impl->kind == ICAL_DATETIME_VALUE || impl->kind == ICAL_DATE_VALUE ){ dtp.period = icalperiodtype_null_period(); dtp.time = impl->data.v_time; } else if(impl->kind == ICAL_PERIOD_VALUE) { dtp.period = impl->data.v_period; dtp.time = icaltime_null_time(); } else { dtp.period = icalperiodtype_null_period(); dtp.time = icaltime_null_time(); icalerror_set_errno(ICAL_BADARG_ERROR); } return dtp; } icalvalue * icalvalue_new_attach (icalattach *attach) { struct icalvalue_impl *impl; icalerror_check_arg_rz ((attach != NULL), "attach"); impl = icalvalue_new_impl (ICAL_ATTACH_VALUE); if (!impl) { errno = ENOMEM; return NULL; } icalvalue_set_attach ((icalvalue *) impl, attach); return (icalvalue *) impl; } void icalvalue_set_attach (icalvalue *value, icalattach *attach) { struct icalvalue_impl *impl; icalerror_check_arg_rv ((value != NULL), "value"); icalerror_check_value_type (value, ICAL_ATTACH_VALUE); icalerror_check_arg_rv ((attach != NULL), "attach"); impl = (struct icalvalue_impl *) value; icalattach_ref (attach); if (impl->data.v_attach) icalattach_unref (impl->data.v_attach); impl->data.v_attach = attach; } icalattach * icalvalue_get_attach (const icalvalue *value) { icalerror_check_arg_rz ((value != NULL), "value"); icalerror_check_value_type (value, ICAL_ATTACH_VALUE); return value->data.v_attach; } /* The remaining interfaces are 'new', 'set' and 'get' for each of the value types */ /* Everything below this line is machine generated. Do not edit. */