2 ======================================================================
3 FILE: icalderivedparameters.{c,h}
4 CREATOR: eric 09 May 1999
6 $Id: icalparameter.c,v 1.15 2008-01-15 23:17:40 dothebart Exp $
10 (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org>
11 http://www.softwarestudio.org
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of either:
16 The LGPL as published by the Free Software Foundation, version
17 2.1, available at: http://www.fsf.org/copyleft/lesser.html
21 The Mozilla Public License Version 1.0. You may obtain a copy of
22 the License at http://www.mozilla.org/MPL/
24 The original code is icalderivedparameters.{c,h}
27 Graham Davison <g.m.davison@computer.org>
29 ======================================================================*/
35 #include "icalparameter.h"
36 #include "icalproperty.h"
37 #include "icalerror.h"
38 #include "icalmemory.h"
39 #include "icalparameterimpl.h"
41 #include <stdlib.h> /* for malloc() */
43 #include <string.h> /* for memset() */
46 #define snprintf _snprintf
47 #define strcasecmp stricmp
50 /* In icalderivedparameter */
51 icalparameter* icalparameter_new_from_value_string(icalparameter_kind kind,const char* val);
54 struct icalparameter_impl* icalparameter_new_impl(icalparameter_kind kind)
56 struct icalparameter_impl* v;
58 if ( ( v = (struct icalparameter_impl*)
59 malloc(sizeof(struct icalparameter_impl))) == 0) {
60 icalerror_set_errno(ICAL_NEWFAILED_ERROR);
77 icalparameter_new (icalparameter_kind kind)
79 struct icalparameter_impl* v = icalparameter_new_impl(kind);
81 return (icalparameter*) v;
86 icalparameter_free (icalparameter* param)
89 /* HACK. This always triggers, even when parameter is non-zero
90 icalerror_check_arg_rv((parameter==0),"parameter");*/
93 #ifdef ICAL_FREE_ON_LIST_IS_ERROR
94 icalerror_assert( (param->parent ==0),"Tried to free a parameter that is still attached to a component. ");
97 if(param->parent !=0){
103 if (param->string != 0){
104 free ((void*)param->string);
107 if (param->x_name != 0){
108 free ((void*)param->x_name);
111 memset(param,0,sizeof(icalparameter));
121 icalparameter_new_clone(icalparameter* old)
123 struct icalparameter_impl *new;
125 new = icalparameter_new_impl(old->kind);
127 icalerror_check_arg_rz((old!=0),"param");
133 memcpy(new,old,sizeof(struct icalparameter_impl));
135 if (old->string != 0){
136 new->string = icalmemory_strdup(old->string);
137 if (new->string == 0){
138 icalparameter_free(new);
143 if (old->x_name != 0){
144 new->x_name = icalmemory_strdup(old->x_name);
145 if (new->x_name == 0){
146 icalparameter_free(new);
154 icalparameter* icalparameter_new_from_string(const char *str)
158 icalparameter_kind kind;
159 icalparameter *param;
161 icalerror_check_arg_rz(str != 0,"str");
163 cpy = icalmemory_strdup(str);
166 icalerror_set_errno(ICAL_NEWFAILED_ERROR);
170 eq = strchr(cpy,'=');
173 icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
182 kind = icalparameter_string_to_kind(cpy);
184 if(kind == ICAL_NO_PARAMETER){
185 icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
190 param = icalparameter_new_from_value_string(kind,eq);
192 if(kind == ICAL_X_PARAMETER){
193 icalparameter_set_xname(param,cpy);
194 } else if(kind == ICAL_IANA_PARAMETER) {
195 icalparameter_set_iana_name(param, cpy);
205 icalparameter_as_ical_string(icalparameter* param)
208 buf = icalparameter_as_ical_string_r(param);
209 icalmemory_add_tmp_buffer(buf);
215 * Return a string representation of the parameter according to RFC2445.
217 * param = param-name "=" param-value
218 * param-name = iana-token / x-token
219 * param-value = paramtext /quoted-string
220 * paramtext = *SAFE-SHARE
221 * quoted-string= DQUOTE *QSAFE-CHARE DQUOTE
222 * QSAFE-CHAR = any character except CTLs and DQUOTE
223 * SAFE-CHAR = any character except CTLs, DQUOTE. ";", ":", ","
226 icalparameter_as_ical_string_r(icalparameter* param)
228 size_t buf_size = 1024;
231 const char *kind_string;
233 icalerror_check_arg_rz( (param!=0), "parameter");
235 /* Create new buffer that we can append names, parameters and a
236 * value to, and reallocate as needed.
239 buf = icalmemory_new_buffer(buf_size);
242 if(param->kind == ICAL_X_PARAMETER) {
243 icalmemory_append_string(&buf, &buf_ptr, &buf_size,
244 icalparameter_get_xname(param));
245 } else if (param->kind == ICAL_IANA_PARAMETER) {
246 icalmemory_append_string(&buf, &buf_ptr, &buf_size,
247 icalparameter_get_iana_name(param));
250 kind_string = icalparameter_kind_to_string(param->kind);
252 if (param->kind == ICAL_NO_PARAMETER ||
253 param->kind == ICAL_ANY_PARAMETER ||
256 icalerror_set_errno(ICAL_BADARG_ERROR);
262 /* Put the parameter name into the string */
263 icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
267 icalmemory_append_string(&buf, &buf_ptr, &buf_size, "=");
269 if(param->string !=0){
272 /* Encapsulate the property in quotes if necessary */
273 if (strpbrk(param->string, ";:,") != 0) {
274 icalmemory_append_char (&buf, &buf_ptr, &buf_size, '"');
277 icalmemory_append_string(&buf, &buf_ptr, &buf_size, param->string);
279 icalmemory_append_char (&buf, &buf_ptr, &buf_size, '"');
281 } else if (param->data != 0){
282 const char* str = icalparameter_enum_to_string(param->data);
283 icalmemory_append_string(&buf, &buf_ptr, &buf_size, str);
285 icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
295 icalparameter_is_valid (icalparameter* parameter);
299 icalparameter_isa (icalparameter* parameter)
302 return ICAL_NO_PARAMETER;
305 return parameter->kind;
310 icalparameter_isa_parameter (void* parameter)
312 struct icalparameter_impl *impl = (struct icalparameter_impl *)parameter;
318 if (strcmp(impl->id,"para") == 0) {
327 icalparameter_set_xname (icalparameter* param, const char* v)
329 icalerror_check_arg_rv( (param!=0),"param");
330 icalerror_check_arg_rv( (v!=0),"v");
332 if (param->x_name != 0){
333 free((void*)param->x_name);
336 param->x_name = icalmemory_strdup(v);
338 if (param->x_name == 0){
345 icalparameter_get_xname (icalparameter* param)
347 icalerror_check_arg_rz( (param!=0),"param");
349 return param->x_name;
353 icalparameter_set_xvalue (icalparameter* param, const char* v)
355 icalerror_check_arg_rv( (param!=0),"param");
356 icalerror_check_arg_rv( (v!=0),"v");
358 if (param->string != 0){
359 free((void*)param->string);
362 param->string = icalmemory_strdup(v);
364 if (param->string == 0){
371 icalparameter_get_xvalue (icalparameter* param)
373 icalerror_check_arg_rz( (param!=0),"param");
375 return param->string;
378 void icalparameter_set_iana_value (icalparameter* param, const char* v)
380 icalparameter_set_xvalue(param, v);
383 const char* icalparameter_get_iana_value(icalparameter* param)
385 return icalparameter_get_xvalue(param);
388 void icalparameter_set_iana_name (icalparameter* param, const char* v)
390 icalparameter_set_xname(param, v);
393 const char* icalparameter_get_iana_name (icalparameter* param)
395 return icalparameter_get_xname(param);
398 void icalparameter_set_parent(icalparameter* param,
399 icalproperty* property)
401 icalerror_check_arg_rv( (param!=0),"param");
403 param->parent = property;
406 icalproperty* icalparameter_get_parent(icalparameter* param)
408 icalerror_check_arg_rz( (param!=0),"param");
410 return param->parent;
413 /* returns 1 if parameters have same name in ICAL, otherwise 0 */
414 int icalparameter_has_same_name(icalparameter* param1, icalparameter* param2)
416 icalparameter_kind kind1;
417 icalparameter_kind kind2;
421 icalerror_check_arg_rz( (param1!=0),"param1");
422 icalerror_check_arg_rz( (param2!=0),"param2");
424 kind1 = icalparameter_isa(param1);
425 kind2 = icalparameter_isa(param2);
430 if (kind1 == ICAL_X_PARAMETER) {
431 name1 = icalparameter_get_xname(param1);
432 name2 = icalparameter_get_xname(param2);
433 if (strcasecmp(name1, name2) != 0)
435 } else if (kind1 == ICAL_IANA_PARAMETER) {
436 name1 = icalparameter_get_iana_name(param1);
437 name2 = icalparameter_get_iana_name(param2);
438 if (strcasecmp(name1, name2) != 0)
444 /* Everything below this line is machine generated. Do not edit. */