/* -*- Mode: C -*- ====================================================================== FILE: icalderivedparameters.{c,h} CREATOR: eric 09 May 1999 $Id: icalparameter.c,v 1.15 2008-01-15 23:17:40 dothebart Exp $ $Locker: $ (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 icalderivedparameters.{c,h} Contributions from: Graham Davison ======================================================================*/ #ifdef HAVE_CONFIG_H #include #endif #include "icalparameter.h" #include "icalproperty.h" #include "icalerror.h" #include "icalmemory.h" #include "icalparameterimpl.h" #include /* for malloc() */ #include #include /* for memset() */ #if defined(_MSC_VER) #define snprintf _snprintf #define strcasecmp stricmp #endif /* In icalderivedparameter */ icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind,const char* val); struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind) { struct icalparameter_impl* v; if ( ( v = (struct icalparameter_impl*) malloc(sizeof(struct icalparameter_impl))) == 0) { icalerror_set_errno(ICAL_NEWFAILED_ERROR); return 0; } strcpy(v->id,"para"); v->kind = kind; v->size = 0; v->string = 0; v->x_name = 0; v->parent = 0; v->data = 0; return v; } icalparameter* icalparameter_new (icalparameter_kind kind) { struct icalparameter_impl* v = icalparameter_new_impl(kind); return (icalparameter*) v; } void icalparameter_free (icalparameter* param) { /* HACK. This always triggers, even when parameter is non-zero icalerror_check_arg_rv((parameter==0),"parameter");*/ #ifdef ICAL_FREE_ON_LIST_IS_ERROR icalerror_assert( (param->parent ==0),"Tried to free a parameter that is still attached to a component. "); #else if(param->parent !=0){ return; } #endif if (param->string != 0){ free ((void*)param->string); } if (param->x_name != 0){ free ((void*)param->x_name); } memset(param,0,sizeof(icalparameter)); param->parent = 0; param->id[0] = 'X'; free(param); } icalparameter* icalparameter_new_clone(icalparameter* old) { struct icalparameter_impl *new; new = icalparameter_new_impl(old->kind); icalerror_check_arg_rz((old!=0),"param"); if (new == 0){ return 0; } memcpy(new,old,sizeof(struct icalparameter_impl)); if (old->string != 0){ new->string = icalmemory_strdup(old->string); if (new->string == 0){ icalparameter_free(new); return 0; } } if (old->x_name != 0){ new->x_name = icalmemory_strdup(old->x_name); if (new->x_name == 0){ icalparameter_free(new); return 0; } } return new; } icalparameter* icalparameter_new_from_string(const char *str) { char* eq; char* cpy; icalparameter_kind kind; icalparameter *param; icalerror_check_arg_rz(str != 0,"str"); cpy = icalmemory_strdup(str); if (cpy == 0){ icalerror_set_errno(ICAL_NEWFAILED_ERROR); return 0; } eq = strchr(cpy,'='); if(eq == 0){ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); free(cpy); return 0; } *eq = '\0'; eq++; kind = icalparameter_string_to_kind(cpy); if(kind == ICAL_NO_PARAMETER){ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); free(cpy); return 0; } param = icalparameter_new_from_value_string(kind,eq); if(kind == ICAL_X_PARAMETER){ icalparameter_set_xname(param,cpy); } else if(kind == ICAL_IANA_PARAMETER) { icalparameter_set_iana_name(param, cpy); } free(cpy); return param; } char* icalparameter_as_ical_string(icalparameter* param) { char *buf; buf = icalparameter_as_ical_string_r(param); icalmemory_add_tmp_buffer(buf); return buf; } /** * Return a string representation of the parameter according to RFC2445. * * param = param-name "=" param-value * param-name = iana-token / x-token * param-value = paramtext /quoted-string * paramtext = *SAFE-SHARE * quoted-string= DQUOTE *QSAFE-CHARE DQUOTE * QSAFE-CHAR = any character except CTLs and DQUOTE * SAFE-CHAR = any character except CTLs, DQUOTE. ";", ":", "," */ char* icalparameter_as_ical_string_r(icalparameter* param) { size_t buf_size = 1024; char* buf; char* buf_ptr; const char *kind_string; icalerror_check_arg_rz( (param!=0), "parameter"); /* Create new buffer that we can append names, parameters and a * value to, and reallocate as needed. */ buf = icalmemory_new_buffer(buf_size); buf_ptr = buf; if(param->kind == ICAL_X_PARAMETER) { icalmemory_append_string(&buf, &buf_ptr, &buf_size, icalparameter_get_xname(param)); } else if (param->kind == ICAL_IANA_PARAMETER) { icalmemory_append_string(&buf, &buf_ptr, &buf_size, icalparameter_get_iana_name(param)); } else { kind_string = icalparameter_kind_to_string(param->kind); if (param->kind == ICAL_NO_PARAMETER || param->kind == ICAL_ANY_PARAMETER || kind_string == 0) { icalerror_set_errno(ICAL_BADARG_ERROR); free(buf); return 0; } /* Put the parameter name into the string */ icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string); } icalmemory_append_string(&buf, &buf_ptr, &buf_size, "="); if(param->string !=0){ int qm = 0; /* Encapsulate the property in quotes if necessary */ if (strpbrk(param->string, ";:,") != 0) { icalmemory_append_char (&buf, &buf_ptr, &buf_size, '"'); qm = 1; } icalmemory_append_string(&buf, &buf_ptr, &buf_size, param->string); if (qm == 1) { icalmemory_append_char (&buf, &buf_ptr, &buf_size, '"'); } } else if (param->data != 0){ const char* str = icalparameter_enum_to_string(param->data); icalmemory_append_string(&buf, &buf_ptr, &buf_size, str); } else { icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); free(buf); return 0; } return buf; } int icalparameter_is_valid (icalparameter* parameter); icalparameter_kind icalparameter_isa (icalparameter* parameter) { if(parameter == 0){ return ICAL_NO_PARAMETER; } return parameter->kind; } int icalparameter_isa_parameter (void* parameter) { struct icalparameter_impl *impl = (struct icalparameter_impl *)parameter; if (parameter == 0){ return 0; } if (strcmp(impl->id,"para") == 0) { return 1; } else { return 0; } } void icalparameter_set_xname (icalparameter* param, const char* v) { icalerror_check_arg_rv( (param!=0),"param"); icalerror_check_arg_rv( (v!=0),"v"); if (param->x_name != 0){ free((void*)param->x_name); } param->x_name = icalmemory_strdup(v); if (param->x_name == 0){ errno = ENOMEM; } } const char* icalparameter_get_xname (icalparameter* param) { icalerror_check_arg_rz( (param!=0),"param"); return param->x_name; } void icalparameter_set_xvalue (icalparameter* param, const char* v) { icalerror_check_arg_rv( (param!=0),"param"); icalerror_check_arg_rv( (v!=0),"v"); if (param->string != 0){ free((void*)param->string); } param->string = icalmemory_strdup(v); if (param->string == 0){ errno = ENOMEM; } } const char* icalparameter_get_xvalue (icalparameter* param) { icalerror_check_arg_rz( (param!=0),"param"); return param->string; } void icalparameter_set_iana_value (icalparameter* param, const char* v) { icalparameter_set_xvalue(param, v); } const char* icalparameter_get_iana_value(icalparameter* param) { return icalparameter_get_xvalue(param); } void icalparameter_set_iana_name (icalparameter* param, const char* v) { icalparameter_set_xname(param, v); } const char* icalparameter_get_iana_name (icalparameter* param) { return icalparameter_get_xname(param); } void icalparameter_set_parent(icalparameter* param, icalproperty* property) { icalerror_check_arg_rv( (param!=0),"param"); param->parent = property; } icalproperty* icalparameter_get_parent(icalparameter* param) { icalerror_check_arg_rz( (param!=0),"param"); return param->parent; } /* returns 1 if parameters have same name in ICAL, otherwise 0 */ int icalparameter_has_same_name(icalparameter* param1, icalparameter* param2) { icalparameter_kind kind1; icalparameter_kind kind2; const char *name1; const char *name2; icalerror_check_arg_rz( (param1!=0),"param1"); icalerror_check_arg_rz( (param2!=0),"param2"); kind1 = icalparameter_isa(param1); kind2 = icalparameter_isa(param2); if (kind1 != kind2) return 0; if (kind1 == ICAL_X_PARAMETER) { name1 = icalparameter_get_xname(param1); name2 = icalparameter_get_xname(param2); if (strcasecmp(name1, name2) != 0) return 0; } else if (kind1 == ICAL_IANA_PARAMETER) { name1 = icalparameter_get_iana_name(param1); name2 = icalparameter_get_iana_name(param2); if (strcasecmp(name1, name2) != 0) return 0; } return 1; } /* Everything below this line is machine generated. Do not edit. */ /* ALTREP */