fededfbdb40df31711335aac588f546ff82b42e2
[platform/core/pim/calendar-service.git] / common / cal_record_todo.c
1 /*
2  * Calendar Service
3  *
4  * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <stdlib.h>
21 #include <stdbool.h>
22 #include <string.h>
23
24 #include "calendar_list.h"
25 #include "cal_internal.h"
26 #include "cal_typedef.h"
27 #include "cal_view.h"
28 #include "cal_list.h"
29 #include "cal_record.h"
30 #include "cal_utils.h"
31
32 static int _cal_record_todo_create(calendar_record_h* out_record);
33 static int _cal_record_todo_destroy(calendar_record_h record, bool delete_child);
34 static int _cal_record_todo_clone(calendar_record_h record, calendar_record_h* out_record);
35 static int _cal_record_todo_get_str(calendar_record_h record, unsigned int property_id, char** out_str);
36 static int _cal_record_todo_get_str_p(calendar_record_h record, unsigned int property_id, char** out_str);
37 static int _cal_record_todo_get_int(calendar_record_h record, unsigned int property_id, int* out_value);
38 static int _cal_record_todo_get_double(calendar_record_h record, unsigned int property_id, double* out_value);
39 static int _cal_record_todo_get_lli(calendar_record_h record, unsigned int property_id, long long int* out_value);
40 static int _cal_record_todo_get_caltime(calendar_record_h record, unsigned int property_id, calendar_time_s* out_value);
41 static int _cal_record_todo_set_str(calendar_record_h record, unsigned int property_id, const char* value);
42 static int _cal_record_todo_set_int(calendar_record_h record, unsigned int property_id, int value);
43 static int _cal_record_todo_set_double(calendar_record_h record, unsigned int property_id, double value);
44 static int _cal_record_todo_set_lli(calendar_record_h record, unsigned int property_id, long long int value);
45 static int _cal_record_todo_set_caltime(calendar_record_h record, unsigned int property_id, calendar_time_s value);
46 static int _cal_record_todo_add_child_record(calendar_record_h record, unsigned int property_id, calendar_record_h child_record);
47 static int _cal_record_todo_remove_child_record(calendar_record_h record, unsigned int property_id, calendar_record_h child_record);
48 static int _cal_record_todo_get_child_record_count(calendar_record_h record, unsigned int property_id, unsigned int* count);
49 static int _cal_record_todo_get_child_record_at_p(calendar_record_h record, unsigned int property_id, int index, calendar_record_h* child_record);
50 static int _cal_record_todo_clone_child_record_list(calendar_record_h record, unsigned int property_id, calendar_list_h* out_list);
51
52 cal_record_plugin_cb_s cal_record_todo_plugin_cb = {
53         .create = _cal_record_todo_create,
54         .destroy = _cal_record_todo_destroy,
55         .clone = _cal_record_todo_clone,
56         .get_str = _cal_record_todo_get_str,
57         .get_str_p = _cal_record_todo_get_str_p,
58         .get_int = _cal_record_todo_get_int,
59         .get_double = _cal_record_todo_get_double,
60         .get_lli = _cal_record_todo_get_lli,
61         .get_caltime = _cal_record_todo_get_caltime,
62         .set_str = _cal_record_todo_set_str,
63         .set_int = _cal_record_todo_set_int,
64         .set_double = _cal_record_todo_set_double,
65         .set_lli = _cal_record_todo_set_lli,
66         .set_caltime = _cal_record_todo_set_caltime,
67         .add_child_record = _cal_record_todo_add_child_record,
68         .remove_child_record = _cal_record_todo_remove_child_record,
69         .get_child_record_count = _cal_record_todo_get_child_record_count,
70         .get_child_record_at_p = _cal_record_todo_get_child_record_at_p,
71         .clone_child_record_list = _cal_record_todo_clone_child_record_list
72 };
73
74 static void _cal_record_todo_struct_init(cal_todo_s *record)
75 {
76         memset(record, 0, sizeof(cal_todo_s));
77
78         record->todo_status = CALENDAR_TODO_STATUS_NONE;
79         record->calendar_id = DEFAULT_TODO_CALENDAR_BOOK_ID;
80
81         record->index = CAL_INVALID_ID;
82         record->summary = NULL;
83         record->description = NULL;
84         record->location = NULL;
85         record->categories = NULL;
86         record->uid = NULL;
87         record->is_deleted = 0;
88         record->latitude = CALENDAR_RECORD_NO_COORDINATE; /* set default 1000 out of range(-180 ~ 180) */
89         record->longitude = CALENDAR_RECORD_NO_COORDINATE; /* set default 1000 out of range(-180 ~ 180) */
90         record->priority = CALENDAR_TODO_PRIORITY_NONE;
91         record->freq = CALENDAR_RECURRENCE_NONE;
92         record->start.time.utime = CALENDAR_TODO_NO_START_DATE;
93         record->due.time.utime = CALENDAR_TODO_NO_DUE_DATE;
94         record->until.time.utime = CALENDAR_RECORD_NO_UNTIL;
95
96         record->alarm_list = calloc(1, sizeof(cal_list_s));
97         record->attendee_list = calloc(1, sizeof(cal_list_s));
98         record->extended_list = calloc(1, sizeof(cal_list_s));
99
100         return ;
101 }
102
103 static int _cal_record_todo_create(calendar_record_h* out_record)
104 {
105         cal_todo_s *temp = NULL;
106         int ret = CALENDAR_ERROR_NONE;
107
108         temp = calloc(1, sizeof(cal_todo_s));
109         RETVM_IF(NULL == temp, CALENDAR_ERROR_OUT_OF_MEMORY, "calloc() Fail");
110
111         _cal_record_todo_struct_init(temp);
112
113         *out_record = (calendar_record_h)temp;
114
115         return ret;
116 }
117
118 static void _cal_record_todo_struct_free(cal_todo_s *record, bool delete_child)
119 {
120         CAL_FREE(record->summary);
121         CAL_FREE(record->description);
122         CAL_FREE(record->location);
123         CAL_FREE(record->categories);
124         CAL_FREE(record->uid);
125         CAL_FREE(record->start_tzid);
126         CAL_FREE(record->due_tzid);
127
128         CAL_FREE(record->bysecond);
129         CAL_FREE(record->byminute);
130         CAL_FREE(record->byhour);
131         CAL_FREE(record->byday);
132         CAL_FREE(record->bymonthday);
133         CAL_FREE(record->byyearday);
134         CAL_FREE(record->byweekno);
135         CAL_FREE(record->bymonth);
136         CAL_FREE(record->bysetpos);
137
138         CAL_FREE(record->sync_data1);
139         CAL_FREE(record->sync_data2);
140         CAL_FREE(record->sync_data3);
141         CAL_FREE(record->sync_data4);
142
143         CAL_FREE(record->organizer_name);
144         CAL_FREE(record->organizer_email);
145
146         calendar_list_destroy((calendar_list_h)record->alarm_list, delete_child);
147         calendar_list_destroy((calendar_list_h)record->attendee_list, delete_child);
148         calendar_list_destroy((calendar_list_h)record->extended_list, delete_child);
149
150         CAL_FREE(record);
151 }
152
153 static int _cal_record_todo_destroy(calendar_record_h record, bool delete_child)
154 {
155         int ret = CALENDAR_ERROR_NONE;
156
157         cal_todo_s *temp = (cal_todo_s*)(record);
158
159         _cal_record_todo_struct_free(temp, delete_child);
160
161         return ret;
162 }
163
164 static int _cal_record_todo_clone(calendar_record_h record, calendar_record_h* out_record)
165 {
166         cal_todo_s *out_data = NULL;
167         cal_todo_s *src_data = NULL;
168
169         src_data = (cal_todo_s*)(record);
170
171         out_data = calloc(1, sizeof(cal_todo_s));
172         RETVM_IF(NULL == out_data, CALENDAR_ERROR_OUT_OF_MEMORY, "calloc() Fail");
173
174         CAL_RECORD_COPY_COMMON(&(out_data->common), &(src_data->common));
175
176         out_data->index = src_data->index;
177         out_data->summary = cal_strdup(src_data->summary);
178         out_data->description = cal_strdup(src_data->description);
179         out_data->location = cal_strdup(src_data->location);
180         out_data->categories = cal_strdup(src_data->categories);
181
182         out_data->todo_status = src_data->todo_status;
183         out_data->priority = src_data->priority;
184         out_data->sensitivity = src_data->sensitivity;
185
186         out_data->uid = cal_strdup(src_data->uid);
187
188         out_data->calendar_id = src_data->calendar_id;
189         out_data->latitude = src_data->latitude;
190         out_data->longitude = src_data->longitude;
191
192         out_data->created_time = src_data->created_time;
193         out_data->completed_time = src_data->completed_time;
194         out_data->progress = src_data->progress;
195         out_data->is_deleted = src_data->is_deleted;
196         out_data->last_mod = src_data->last_mod;
197
198         out_data->freq = src_data->freq;
199         out_data->range_type = src_data->range_type;
200         out_data->until = src_data->until;
201         out_data->count = src_data->count;
202         out_data->interval = src_data->interval;
203         out_data->bysecond = cal_strdup(src_data->bysecond);
204         out_data->byminute = cal_strdup(src_data->byminute);
205         out_data->byhour = cal_strdup(src_data->byhour);
206         out_data->byday = cal_strdup(src_data->byday);
207         out_data->bymonthday = cal_strdup(src_data->bymonthday);
208         out_data->byyearday = cal_strdup(src_data->byyearday);
209         out_data->byweekno = cal_strdup(src_data->byweekno);
210         out_data->bymonth = cal_strdup(src_data->bymonth);
211         out_data->bysetpos = cal_strdup(src_data->bysetpos);
212         out_data->wkst = src_data->wkst;
213         out_data->has_alarm = src_data->has_alarm;
214         out_data->updated = src_data->updated;
215
216         out_data->sync_data1 = cal_strdup(src_data->sync_data1);
217         out_data->sync_data2 = cal_strdup(src_data->sync_data2);
218         out_data->sync_data3 = cal_strdup(src_data->sync_data3);
219         out_data->sync_data4 = cal_strdup(src_data->sync_data4);
220
221         out_data->start = src_data->start;
222         out_data->start_tzid = cal_strdup(src_data->start_tzid);
223         out_data->due = src_data->due;
224         out_data->due_tzid = cal_strdup(src_data->due_tzid);
225
226         out_data->organizer_name = cal_strdup(src_data->organizer_name);
227         out_data->organizer_email = cal_strdup(src_data->organizer_email);
228         out_data->has_attendee = src_data->has_attendee;
229
230         cal_list_clone((calendar_list_h)src_data->alarm_list, (calendar_list_h *)&out_data->alarm_list);
231         cal_list_clone((calendar_list_h)src_data->attendee_list, (calendar_list_h *)&out_data->attendee_list);
232         cal_list_clone((calendar_list_h)src_data->extended_list, (calendar_list_h *)&out_data->extended_list);
233
234         *out_record = (calendar_record_h)out_data;
235
236         return CALENDAR_ERROR_NONE;
237 }
238
239 static int _cal_record_todo_get_str(calendar_record_h record, unsigned int property_id, char** out_str)
240 {
241         cal_todo_s *rec = (cal_todo_s*)(record);
242         switch (property_id) {
243         case CAL_PROPERTY_TODO_SUMMARY:
244                 *out_str = cal_strdup(rec->summary);
245                 break;
246         case CAL_PROPERTY_TODO_DESCRIPTION:
247                 *out_str = cal_strdup(rec->description);
248                 break;
249         case CAL_PROPERTY_TODO_LOCATION:
250                 *out_str = cal_strdup(rec->location);
251                 break;
252         case CAL_PROPERTY_TODO_CATEGORIES:
253                 *out_str = cal_strdup(rec->categories);
254                 break;
255         case CAL_PROPERTY_TODO_UID:
256                 *out_str = cal_strdup(rec->uid);
257                 break;
258         case CAL_PROPERTY_TODO_BYSECOND:
259                 *out_str = cal_strdup(rec->bysecond);
260                 break;
261         case CAL_PROPERTY_TODO_BYMINUTE:
262                 *out_str = cal_strdup(rec->byminute);
263                 break;
264         case CAL_PROPERTY_TODO_BYHOUR:
265                 *out_str = cal_strdup(rec->byhour);
266                 break;
267         case CAL_PROPERTY_TODO_BYDAY:
268                 *out_str = cal_strdup(rec->byday);
269                 break;
270         case CAL_PROPERTY_TODO_BYMONTHDAY:
271                 *out_str = cal_strdup(rec->bymonthday);
272                 break;
273         case CAL_PROPERTY_TODO_BYYEARDAY:
274                 *out_str = cal_strdup(rec->byyearday);
275                 break;
276         case CAL_PROPERTY_TODO_BYWEEKNO:
277                 *out_str = cal_strdup(rec->byweekno);
278                 break;
279         case CAL_PROPERTY_TODO_BYMONTH:
280                 *out_str = cal_strdup(rec->bymonth);
281                 break;
282         case CAL_PROPERTY_TODO_BYSETPOS:
283                 *out_str = cal_strdup(rec->bysetpos);
284                 break;
285         case CAL_PROPERTY_TODO_SYNC_DATA1:
286                 *out_str = cal_strdup(rec->sync_data1);
287                 break;
288         case CAL_PROPERTY_TODO_SYNC_DATA2:
289                 *out_str = cal_strdup(rec->sync_data2);
290                 break;
291         case CAL_PROPERTY_TODO_SYNC_DATA3:
292                 *out_str = cal_strdup(rec->sync_data3);
293                 break;
294         case CAL_PROPERTY_TODO_SYNC_DATA4:
295                 *out_str = cal_strdup(rec->sync_data4);
296                 break;
297         case CAL_PROPERTY_TODO_START_TZID:
298                 *out_str = cal_strdup(rec->start_tzid);
299                 break;
300         case CAL_PROPERTY_TODO_DUE_TZID:
301                 *out_str = cal_strdup(rec->due_tzid);
302                 break;
303         case CAL_PROPERTY_TODO_ORGANIZER_NAME:
304                 *out_str = cal_strdup(rec->organizer_name);
305                 break;
306         case CAL_PROPERTY_TODO_ORGANIZER_EMAIL:
307                 *out_str = cal_strdup(rec->organizer_email);
308                 break;
309         default:
310                 ERR("invalid parameter (property:0x%x)", property_id);
311                 return CALENDAR_ERROR_INVALID_PARAMETER;
312         }
313
314         return CALENDAR_ERROR_NONE;
315 }
316
317 static int _cal_record_todo_get_str_p(calendar_record_h record, unsigned int property_id, char** out_str)
318 {
319         cal_todo_s *rec = (cal_todo_s*)(record);
320         switch (property_id) {
321         case CAL_PROPERTY_TODO_SUMMARY:
322                 *out_str = (rec->summary);
323                 break;
324         case CAL_PROPERTY_TODO_DESCRIPTION:
325                 *out_str = (rec->description);
326                 break;
327         case CAL_PROPERTY_TODO_LOCATION:
328                 *out_str = (rec->location);
329                 break;
330         case CAL_PROPERTY_TODO_CATEGORIES:
331                 *out_str = (rec->categories);
332                 break;
333         case CAL_PROPERTY_TODO_UID:
334                 *out_str = (rec->uid);
335                 break;
336         case CAL_PROPERTY_TODO_BYSECOND:
337                 *out_str = (rec->bysecond);
338                 break;
339         case CAL_PROPERTY_TODO_BYMINUTE:
340                 *out_str = (rec->byminute);
341                 break;
342         case CAL_PROPERTY_TODO_BYHOUR:
343                 *out_str = (rec->byhour);
344                 break;
345         case CAL_PROPERTY_TODO_BYDAY:
346                 *out_str = (rec->byday);
347                 break;
348         case CAL_PROPERTY_TODO_BYMONTHDAY:
349                 *out_str = (rec->bymonthday);
350                 break;
351         case CAL_PROPERTY_TODO_BYYEARDAY:
352                 *out_str = (rec->byyearday);
353                 break;
354         case CAL_PROPERTY_TODO_BYWEEKNO:
355                 *out_str = (rec->byweekno);
356                 break;
357         case CAL_PROPERTY_TODO_BYMONTH:
358                 *out_str = (rec->bymonth);
359                 break;
360         case CAL_PROPERTY_TODO_BYSETPOS:
361                 *out_str = (rec->bysetpos);
362                 break;
363         case CAL_PROPERTY_TODO_SYNC_DATA1:
364                 *out_str = (rec->sync_data1);
365                 break;
366         case CAL_PROPERTY_TODO_SYNC_DATA2:
367                 *out_str = (rec->sync_data2);
368                 break;
369         case CAL_PROPERTY_TODO_SYNC_DATA3:
370                 *out_str = (rec->sync_data3);
371                 break;
372         case CAL_PROPERTY_TODO_SYNC_DATA4:
373                 *out_str = (rec->sync_data4);
374                 break;
375         case CAL_PROPERTY_TODO_START_TZID:
376                 *out_str = (rec->start_tzid);
377                 break;
378         case CAL_PROPERTY_TODO_DUE_TZID:
379                 *out_str = (rec->due_tzid);
380                 break;
381         case CAL_PROPERTY_TODO_ORGANIZER_NAME:
382                 *out_str = (rec->organizer_name);
383                 break;
384         case CAL_PROPERTY_TODO_ORGANIZER_EMAIL:
385                 *out_str = (rec->organizer_email);
386                 break;
387         default:
388                 ERR("invalid parameter (property:0x%x)", property_id);
389                 return CALENDAR_ERROR_INVALID_PARAMETER;
390         }
391
392         return CALENDAR_ERROR_NONE;
393 }
394
395 static int _cal_record_todo_get_int(calendar_record_h record, unsigned int property_id, int* out_value)
396 {
397         cal_todo_s *rec = (cal_todo_s*)(record);
398         switch (property_id) {
399         case CAL_PROPERTY_TODO_ID:
400                 *out_value = (rec->index);
401                 break;
402         case CAL_PROPERTY_TODO_CALENDAR_ID:
403                 *out_value = (rec->calendar_id);
404                 break;
405         case CAL_PROPERTY_TODO_TODO_STATUS:
406                 *out_value = (rec->todo_status);
407                 break;
408         case CAL_PROPERTY_TODO_PRIORITY:
409                 *out_value = (rec->priority);
410                 break;
411         case CAL_PROPERTY_TODO_SENSITIVITY:
412                 *out_value = (rec->sensitivity);
413                 break;
414         case CAL_PROPERTY_TODO_PROGRESS:
415                 *out_value = (rec->progress);
416                 break;
417         case CAL_PROPERTY_TODO_IS_DELETED:
418                 *out_value = (rec->is_deleted);
419                 break;
420         case CAL_PROPERTY_TODO_FREQ:
421                 *out_value = (rec->freq);
422                 break;
423         case CAL_PROPERTY_TODO_RANGE_TYPE:
424                 *out_value = (rec->range_type);
425                 break;
426         case CAL_PROPERTY_TODO_COUNT:
427                 *out_value = (rec->count);
428                 break;
429         case CAL_PROPERTY_TODO_INTERVAL:
430                 *out_value = (rec->interval);
431                 break;
432         case CAL_PROPERTY_TODO_WKST:
433                 *out_value = (rec->wkst);
434                 break;
435         case CAL_PROPERTY_TODO_HAS_ALARM:
436                 *out_value = (rec->has_alarm);
437                 break;
438         case CAL_PROPERTY_TODO_HAS_ATTENDEE:
439                 *out_value = (rec->has_attendee);
440                 break;
441         case CAL_PROPERTY_TODO_IS_ALLDAY:
442                 *out_value = (rec->is_allday);
443                 break;
444         default:
445                 ERR("invalid parameter (property:0x%x)", property_id);
446                 return CALENDAR_ERROR_INVALID_PARAMETER;
447         }
448
449         return CALENDAR_ERROR_NONE;
450 }
451
452 static int _cal_record_todo_get_double(calendar_record_h record, unsigned int property_id, double* out_value)
453 {
454         cal_todo_s *rec = (cal_todo_s*)(record);
455         switch (property_id) {
456         case CAL_PROPERTY_TODO_LATITUDE:
457                 *out_value = (rec->latitude);
458                 break;
459         case CAL_PROPERTY_TODO_LONGITUDE:
460                 *out_value = (rec->longitude);
461                 break;
462         default:
463                 ERR("invalid parameter (property:0x%x)", property_id);
464                 return CALENDAR_ERROR_INVALID_PARAMETER;
465         }
466
467         return CALENDAR_ERROR_NONE;
468 }
469
470 static int _cal_record_todo_get_lli(calendar_record_h record, unsigned int property_id, long long int* out_value)
471 {
472         cal_todo_s *rec = (cal_todo_s*)(record);
473         switch (property_id) {
474         case CAL_PROPERTY_TODO_CREATED_TIME:
475                 *out_value = (rec->created_time);
476                 break;
477         case CAL_PROPERTY_TODO_LAST_MODIFIED_TIME:
478                 *out_value = (rec->last_mod);
479                 break;
480         case CAL_PROPERTY_TODO_COMPLETED_TIME:
481                 *out_value = (rec->completed_time);
482                 break;
483         default:
484                 ERR("invalid parameter (property:0x%x)", property_id);
485                 return CALENDAR_ERROR_INVALID_PARAMETER;
486         }
487
488         return CALENDAR_ERROR_NONE;
489 }
490
491 static int _cal_record_todo_get_caltime(calendar_record_h record, unsigned int property_id, calendar_time_s* out_value)
492 {
493         cal_todo_s *rec = (cal_todo_s*)(record);
494         switch (property_id) {
495         case CAL_PROPERTY_TODO_START:
496                 *out_value = rec->start;
497                 break;
498         case CAL_PROPERTY_TODO_DUE:
499                 *out_value = rec->due;
500                 break;
501         case CAL_PROPERTY_TODO_UNTIL:
502                 *out_value = rec->until;
503                 break;
504         default:
505                 ERR("invalid parameter (property:0x%x)", property_id);
506                 return CALENDAR_ERROR_INVALID_PARAMETER;
507         }
508
509         return CALENDAR_ERROR_NONE;
510 }
511
512 static int _cal_record_todo_set_str(calendar_record_h record, unsigned int property_id, const char* value)
513 {
514         cal_todo_s *rec = (cal_todo_s*)(record);
515         switch (property_id) {
516         case CAL_PROPERTY_TODO_SUMMARY:
517                 CAL_FREE(rec->summary);
518                 rec->summary = cal_strdup(value);
519                 break;
520         case CAL_PROPERTY_TODO_DESCRIPTION:
521                 CAL_FREE(rec->description);
522                 rec->description = cal_strdup(value);
523                 break;
524         case CAL_PROPERTY_TODO_LOCATION:
525                 CAL_FREE(rec->location);
526                 rec->location = cal_strdup(value);
527                 break;
528         case CAL_PROPERTY_TODO_CATEGORIES:
529                 CAL_FREE(rec->categories);
530                 rec->categories = cal_strdup(value);
531                 break;
532         case CAL_PROPERTY_TODO_UID:
533                 CAL_FREE(rec->uid);
534                 rec->uid = cal_strdup(value);
535                 break;
536         case CAL_PROPERTY_TODO_BYSECOND:
537                 CAL_FREE(rec->bysecond);
538                 rec->bysecond = cal_strdup(value);
539                 break;
540         case CAL_PROPERTY_TODO_BYMINUTE:
541                 CAL_FREE(rec->byminute);
542                 rec->byminute = cal_strdup(value);
543                 break;
544         case CAL_PROPERTY_TODO_BYHOUR:
545                 CAL_FREE(rec->byhour);
546                 rec->byhour = cal_strdup(value);
547                 break;
548         case CAL_PROPERTY_TODO_BYDAY:
549                 CAL_FREE(rec->byday);
550                 rec->byday = cal_strdup(value);
551                 break;
552         case CAL_PROPERTY_TODO_BYMONTHDAY:
553                 CAL_FREE(rec->bymonthday);
554                 rec->bymonthday = cal_strdup(value);
555                 break;
556         case CAL_PROPERTY_TODO_BYYEARDAY:
557                 CAL_FREE(rec->byyearday);
558                 rec->byyearday = cal_strdup(value);
559                 break;
560         case CAL_PROPERTY_TODO_BYWEEKNO:
561                 CAL_FREE(rec->byweekno);
562                 rec->byweekno = cal_strdup(value);
563                 break;
564         case CAL_PROPERTY_TODO_BYMONTH:
565                 CAL_FREE(rec->bymonth);
566                 rec->bymonth = cal_strdup(value);
567                 break;
568         case CAL_PROPERTY_TODO_BYSETPOS:
569                 CAL_FREE(rec->bysetpos);
570                 rec->bysetpos = cal_strdup(value);
571                 break;
572         case CAL_PROPERTY_TODO_SYNC_DATA1:
573                 CAL_FREE(rec->sync_data1);
574                 rec->sync_data1 = cal_strdup(value);
575                 break;
576         case CAL_PROPERTY_TODO_SYNC_DATA2:
577                 CAL_FREE(rec->sync_data2);
578                 rec->sync_data2 = cal_strdup(value);
579                 break;
580         case CAL_PROPERTY_TODO_SYNC_DATA3:
581                 CAL_FREE(rec->sync_data3);
582                 rec->sync_data3 = cal_strdup(value);
583                 break;
584         case CAL_PROPERTY_TODO_SYNC_DATA4:
585                 CAL_FREE(rec->sync_data4);
586                 rec->sync_data4 = cal_strdup(value);
587                 break;
588         case CAL_PROPERTY_TODO_START_TZID:
589                 CAL_FREE(rec->start_tzid);
590                 rec->start_tzid = cal_strdup(value);
591                 break;
592         case CAL_PROPERTY_TODO_DUE_TZID:
593                 CAL_FREE(rec->due_tzid);
594                 rec->due_tzid = cal_strdup(value);
595                 break;
596         case CAL_PROPERTY_TODO_ORGANIZER_NAME:
597                 CAL_FREE(rec->organizer_name);
598                 rec->organizer_name = cal_strdup(value);
599                 break;
600         case CAL_PROPERTY_TODO_ORGANIZER_EMAIL:
601                 CAL_FREE(rec->organizer_email);
602                 rec->organizer_email = cal_strdup(value);
603                 break;
604         default:
605                 return CALENDAR_ERROR_INVALID_PARAMETER;
606         }
607
608         return CALENDAR_ERROR_NONE;
609 }
610
611 static int _cal_record_todo_set_int(calendar_record_h record, unsigned int property_id, int value)
612 {
613         cal_todo_s *rec = (cal_todo_s*)(record);
614         switch (property_id) {
615         case CAL_PROPERTY_TODO_ID:
616                 (rec->index) = value;
617                 break;
618         case CAL_PROPERTY_TODO_CALENDAR_ID:
619                 (rec->calendar_id) = value;
620                 break;
621         case CAL_PROPERTY_TODO_TODO_STATUS:
622                 switch (value) {
623                 case CALENDAR_TODO_STATUS_NONE:
624                 case CALENDAR_TODO_STATUS_NEEDS_ACTION:
625                 case CALENDAR_TODO_STATUS_COMPLETED:
626                 case CALENDAR_TODO_STATUS_IN_PROCESS:
627                 case CALENDAR_TODO_STATUS_CANCELED:
628                         (rec->todo_status) = value;
629                         break;
630                 default:
631                         ERR("invalid parameter (value:%d)", value);
632                         return CALENDAR_ERROR_INVALID_PARAMETER;
633                 }
634                 break;
635         case CAL_PROPERTY_TODO_PRIORITY:
636                 switch (value) {
637                 case CALENDAR_TODO_PRIORITY_NONE:
638                 case CALENDAR_TODO_PRIORITY_LOW:
639                 case CALENDAR_TODO_PRIORITY_NORMAL:
640                 case CALENDAR_TODO_PRIORITY_HIGH:
641                         (rec->priority) = value;
642                         break;
643                 default:
644                         ERR("invalid parameter (value:%d)", value);
645                         return CALENDAR_ERROR_INVALID_PARAMETER;
646                 }
647                 break;
648         case CAL_PROPERTY_TODO_SENSITIVITY:
649                 (rec->sensitivity) = value;
650                 break;
651         case CAL_PROPERTY_TODO_PROGRESS:
652                 (rec->progress) = value;
653                 break;
654         case CAL_PROPERTY_TODO_IS_DELETED:
655                 (rec->is_deleted) = value;
656                 break;
657         case CAL_PROPERTY_TODO_FREQ:
658                 switch (value) {
659                 case CALENDAR_RECURRENCE_NONE:
660                 case CALENDAR_RECURRENCE_DAILY:
661                 case CALENDAR_RECURRENCE_WEEKLY:
662                 case CALENDAR_RECURRENCE_MONTHLY:
663                 case CALENDAR_RECURRENCE_YEARLY:
664                         (rec->freq) = value;
665                         break;
666                 default:
667                         ERR("invalid parameter (value:%d)", value);
668                         return CALENDAR_ERROR_INVALID_PARAMETER;
669                 }
670                 break;
671         case CAL_PROPERTY_TODO_RANGE_TYPE:
672                 switch (value) {
673                 case CALENDAR_RANGE_UNTIL:
674                 case CALENDAR_RANGE_COUNT:
675                 case CALENDAR_RANGE_NONE:
676                         (rec->range_type) = value;
677                         break;
678                 default:
679                         ERR("invalid parameter (value:%d)", value);
680                         return CALENDAR_ERROR_INVALID_PARAMETER;
681                 }
682                 break;
683         case CAL_PROPERTY_TODO_COUNT:
684                 (rec->count) = value;
685                 break;
686         case CAL_PROPERTY_TODO_INTERVAL:
687                 (rec->interval) = value;
688                 break;
689         case CAL_PROPERTY_TODO_WKST:
690                 switch (value) {
691                 case 0:
692                         DBG("set wkst as default");
693                 case CALENDAR_SUNDAY:
694                 case CALENDAR_MONDAY:
695                 case CALENDAR_TUESDAY:
696                 case CALENDAR_WEDNESDAY:
697                 case CALENDAR_THURSDAY:
698                 case CALENDAR_FRIDAY:
699                 case CALENDAR_SATURDAY:
700                         (rec->wkst) = value;
701                         break;
702                 default:
703                         ERR("invalid parameter (value:%d)", value);
704                         return CALENDAR_ERROR_INVALID_PARAMETER;
705                 }
706                 break;
707         case CAL_PROPERTY_TODO_HAS_ALARM:
708                 (rec->has_alarm) = value;
709                 break;
710         case CAL_PROPERTY_TODO_HAS_ATTENDEE:
711                 (rec->has_attendee) = value;
712                 break;
713         case CAL_PROPERTY_TODO_IS_ALLDAY:
714                 (rec->is_allday) = value;
715                 break;
716         default:
717                 ERR("invalid parameter (property:0x%x)", property_id);
718                 return CALENDAR_ERROR_INVALID_PARAMETER;
719         }
720
721         return CALENDAR_ERROR_NONE;
722 }
723
724 static int _cal_record_todo_set_double(calendar_record_h record, unsigned int property_id, double value)
725 {
726         cal_todo_s *rec = (cal_todo_s*)(record);
727         switch (property_id) {
728         case CAL_PROPERTY_TODO_LATITUDE:
729                 (rec->latitude) = value;
730                 break;
731         case CAL_PROPERTY_TODO_LONGITUDE:
732                 (rec->longitude) = value;
733                 break;
734         default:
735                 ERR("invalid parameter (property:0x%x)", property_id);
736                 return CALENDAR_ERROR_INVALID_PARAMETER;
737         }
738
739         return CALENDAR_ERROR_NONE;
740 }
741
742 static int _cal_record_todo_set_lli(calendar_record_h record, unsigned int property_id, long long int value)
743 {
744         cal_todo_s *rec = (cal_todo_s*)(record);
745         switch (property_id) {
746         case CAL_PROPERTY_TODO_COMPLETED_TIME:
747                 (rec->completed_time) = value;
748                 break;
749         case CAL_PROPERTY_TODO_CREATED_TIME:
750                 (rec->created_time) = value;
751                 break;
752         default:
753                 ERR("invalid parameter (property:0x%x)", property_id);
754                 return CALENDAR_ERROR_INVALID_PARAMETER;
755         }
756
757         return CALENDAR_ERROR_NONE;
758 }
759
760 static int _cal_record_todo_set_caltime(calendar_record_h record, unsigned int property_id, calendar_time_s value)
761 {
762         cal_todo_s *rec = (cal_todo_s*)(record);
763         switch (property_id) {
764         case CAL_PROPERTY_TODO_START:
765                 (rec->start) = value;
766                 break;
767         case CAL_PROPERTY_TODO_DUE:
768                 (rec->due) = value;
769                 break;
770         case CAL_PROPERTY_TODO_UNTIL:
771                 (rec->until) = value;
772                 break;
773         default:
774                 ERR("invalid parameter (property:0x%x)", property_id);
775                 return CALENDAR_ERROR_INVALID_PARAMETER;
776         }
777
778         return CALENDAR_ERROR_NONE;
779 }
780
781 static int _cal_record_todo_reset_child_record_id(calendar_record_h child_record)
782 {
783         cal_record_s *record = (cal_record_s*)child_record;
784         RETV_IF(NULL == record, CALENDAR_ERROR_INVALID_PARAMETER);
785
786         switch (record->type) {
787         case CAL_RECORD_TYPE_ALARM:
788                 ((cal_alarm_s *)record)->id = 0;
789                 break;
790         case CAL_RECORD_TYPE_ATTENDEE:
791                 ((cal_attendee_s *)record)->id = 0;
792                 break;
793         case CAL_RECORD_TYPE_EXTENDED:
794                 ((cal_extended_s *)record)->id = 0;
795                 break;
796         default:
797                 ERR("Invalid child record type (%d)", record->type);
798                 return CALENDAR_ERROR_INVALID_PARAMETER;
799         }
800         return CALENDAR_ERROR_NONE;
801 }
802
803
804 static int _cal_record_todo_add_child_record(calendar_record_h record, unsigned int property_id, calendar_record_h child_record)
805 {
806         int ret = CALENDAR_ERROR_NONE;
807         cal_todo_s *rec = (cal_todo_s*)(record);
808         _cal_record_todo_reset_child_record_id(child_record);
809
810         switch (property_id) {
811         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
812                 ret = calendar_list_add((calendar_list_h)rec->alarm_list, child_record);
813                 rec->has_alarm = 1;
814                 break;
815         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
816                 ret = calendar_list_add((calendar_list_h)rec->attendee_list, child_record);
817                 rec->has_attendee = 1;
818                 break;
819         case CAL_PROPERTY_TODO_EXTENDED:
820                 ret = calendar_list_add((calendar_list_h)rec->extended_list, child_record);
821                 break;
822         default:
823                 ERR("invalid parameter (property:0x%x)", property_id);
824                 return CALENDAR_ERROR_INVALID_PARAMETER;
825         }
826         return ret;
827 }
828
829 static int _cal_record_todo_remove_child_record(calendar_record_h record, unsigned int property_id, calendar_record_h child_record)
830 {
831         int ret = CALENDAR_ERROR_NONE;
832         cal_todo_s *rec = (cal_todo_s *)record;
833
834         switch (property_id) {
835         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
836                 ret = calendar_list_remove((calendar_list_h)rec->alarm_list, child_record);
837                 if (rec->alarm_list->count == 0)
838                         rec->has_alarm = 0;
839                 break;
840         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
841                 ret = calendar_list_remove((calendar_list_h)rec->attendee_list, child_record);
842                 if (rec->attendee_list->count == 0)
843                         rec->has_attendee = 0;
844                 break;
845         case CAL_PROPERTY_TODO_EXTENDED:
846                 ret = calendar_list_remove((calendar_list_h)rec->extended_list, child_record);
847                 break;
848         default:
849                 ERR("invalid parameter (property:0x%x)", property_id);
850                 return CALENDAR_ERROR_INVALID_PARAMETER;
851         }
852         return ret;
853 }
854
855 static int _cal_record_todo_get_child_record_count(calendar_record_h record, unsigned int property_id , unsigned int* count)
856 {
857         int ret = CALENDAR_ERROR_NONE;
858         cal_todo_s *rec = (cal_todo_s *)record;
859
860         RETV_IF(NULL == count, CALENDAR_ERROR_INVALID_PARAMETER);
861         *count = 0;
862
863         switch (property_id) {
864         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
865                 ret = calendar_list_get_count((calendar_list_h)rec->alarm_list, (int *)count);
866                 break;
867         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
868                 ret = calendar_list_get_count((calendar_list_h)rec->attendee_list, (int *)count);
869                 break;
870         case CAL_PROPERTY_TODO_EXTENDED:
871                 ret = calendar_list_get_count((calendar_list_h)rec->extended_list, (int *)count);
872                 break;
873         default:
874                 ERR("invalid parameter (property:0x%x)", property_id);
875                 return CALENDAR_ERROR_INVALID_PARAMETER;
876         }
877         return ret;
878 }
879
880 static int _cal_record_todo_get_child_record_at_p(calendar_record_h record, unsigned int property_id, int index, calendar_record_h* child_record)
881 {
882         int ret;
883         cal_todo_s *rec = (cal_todo_s*)(record);
884
885         RETV_IF(NULL == child_record, CALENDAR_ERROR_INVALID_PARAMETER);
886         *child_record = NULL;
887
888         switch (property_id) {
889         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
890                 ret = cal_list_get_nth_record_p(rec->alarm_list, index, child_record);
891                 break;
892         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
893                 ret = cal_list_get_nth_record_p(rec->attendee_list, index, child_record);
894                 break;
895         case CAL_PROPERTY_TODO_EXTENDED:
896                 ret = cal_list_get_nth_record_p(rec->extended_list, index, child_record);
897                 break;
898         default:
899                 ERR("invalid parameter (property:0x%x)", property_id);
900                 return CALENDAR_ERROR_INVALID_PARAMETER;
901         }
902         return ret;
903 }
904
905 static int _cal_record_todo_clone_child_record_list(calendar_record_h record, unsigned int property_id, calendar_list_h* out_list)
906 {
907         int ret;
908         cal_todo_s *rec = (cal_todo_s*)(record);
909
910         RETV_IF(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER);
911         *out_list = NULL;
912
913         switch (property_id) {
914         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
915                 ret = cal_list_clone((calendar_list_h)rec->alarm_list, out_list);
916                 break;
917         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
918                 ret = cal_list_clone((calendar_list_h)rec->attendee_list, out_list);
919                 break;
920         case CAL_PROPERTY_TODO_EXTENDED:
921                 ret = cal_list_clone((calendar_list_h)rec->extended_list, out_list);
922                 break;
923         default:
924                 ERR("invalid parameter (property:0x%x)", property_id);
925                 return CALENDAR_ERROR_INVALID_PARAMETER;
926         }
927         return ret;
928 }