add comment LCOV_EXCL
[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                 /* LCOV_EXCL_START */
311                 ERR("invalid parameter (property:0x%x)", property_id);
312                 return CALENDAR_ERROR_INVALID_PARAMETER;
313                 /* LCOV_EXCL_STOP */
314         }
315
316         return CALENDAR_ERROR_NONE;
317 }
318
319 static int _cal_record_todo_get_str_p(calendar_record_h record, unsigned int property_id, char** out_str)
320 {
321         cal_todo_s *rec = (cal_todo_s*)(record);
322         switch (property_id) {
323         case CAL_PROPERTY_TODO_SUMMARY:
324                 *out_str = (rec->summary);
325                 break;
326         case CAL_PROPERTY_TODO_DESCRIPTION:
327                 *out_str = (rec->description);
328                 break;
329         case CAL_PROPERTY_TODO_LOCATION:
330                 *out_str = (rec->location);
331                 break;
332         case CAL_PROPERTY_TODO_CATEGORIES:
333                 *out_str = (rec->categories);
334                 break;
335         case CAL_PROPERTY_TODO_UID:
336                 *out_str = (rec->uid);
337                 break;
338         case CAL_PROPERTY_TODO_BYSECOND:
339                 *out_str = (rec->bysecond);
340                 break;
341         case CAL_PROPERTY_TODO_BYMINUTE:
342                 *out_str = (rec->byminute);
343                 break;
344         case CAL_PROPERTY_TODO_BYHOUR:
345                 *out_str = (rec->byhour);
346                 break;
347         case CAL_PROPERTY_TODO_BYDAY:
348                 *out_str = (rec->byday);
349                 break;
350         case CAL_PROPERTY_TODO_BYMONTHDAY:
351                 *out_str = (rec->bymonthday);
352                 break;
353         case CAL_PROPERTY_TODO_BYYEARDAY:
354                 *out_str = (rec->byyearday);
355                 break;
356         case CAL_PROPERTY_TODO_BYWEEKNO:
357                 *out_str = (rec->byweekno);
358                 break;
359         case CAL_PROPERTY_TODO_BYMONTH:
360                 *out_str = (rec->bymonth);
361                 break;
362         case CAL_PROPERTY_TODO_BYSETPOS:
363                 *out_str = (rec->bysetpos);
364                 break;
365         case CAL_PROPERTY_TODO_SYNC_DATA1:
366                 *out_str = (rec->sync_data1);
367                 break;
368         case CAL_PROPERTY_TODO_SYNC_DATA2:
369                 *out_str = (rec->sync_data2);
370                 break;
371         case CAL_PROPERTY_TODO_SYNC_DATA3:
372                 *out_str = (rec->sync_data3);
373                 break;
374         case CAL_PROPERTY_TODO_SYNC_DATA4:
375                 *out_str = (rec->sync_data4);
376                 break;
377         case CAL_PROPERTY_TODO_START_TZID:
378                 *out_str = (rec->start_tzid);
379                 break;
380         case CAL_PROPERTY_TODO_DUE_TZID:
381                 *out_str = (rec->due_tzid);
382                 break;
383         case CAL_PROPERTY_TODO_ORGANIZER_NAME:
384                 *out_str = (rec->organizer_name);
385                 break;
386         case CAL_PROPERTY_TODO_ORGANIZER_EMAIL:
387                 *out_str = (rec->organizer_email);
388                 break;
389         default:
390                 /* LCOV_EXCL_START */
391                 ERR("invalid parameter (property:0x%x)", property_id);
392                 return CALENDAR_ERROR_INVALID_PARAMETER;
393                 /* LCOV_EXCL_STOP */
394         }
395
396         return CALENDAR_ERROR_NONE;
397 }
398
399 static int _cal_record_todo_get_int(calendar_record_h record, unsigned int property_id, int* out_value)
400 {
401         cal_todo_s *rec = (cal_todo_s*)(record);
402         switch (property_id) {
403         case CAL_PROPERTY_TODO_ID:
404                 *out_value = (rec->index);
405                 break;
406         case CAL_PROPERTY_TODO_CALENDAR_ID:
407                 *out_value = (rec->calendar_id);
408                 break;
409         case CAL_PROPERTY_TODO_TODO_STATUS:
410                 *out_value = (rec->todo_status);
411                 break;
412         case CAL_PROPERTY_TODO_PRIORITY:
413                 *out_value = (rec->priority);
414                 break;
415         case CAL_PROPERTY_TODO_SENSITIVITY:
416                 *out_value = (rec->sensitivity);
417                 break;
418         case CAL_PROPERTY_TODO_PROGRESS:
419                 *out_value = (rec->progress);
420                 break;
421         case CAL_PROPERTY_TODO_IS_DELETED:
422                 *out_value = (rec->is_deleted);
423                 break;
424         case CAL_PROPERTY_TODO_FREQ:
425                 *out_value = (rec->freq);
426                 break;
427         case CAL_PROPERTY_TODO_RANGE_TYPE:
428                 *out_value = (rec->range_type);
429                 break;
430         case CAL_PROPERTY_TODO_COUNT:
431                 *out_value = (rec->count);
432                 break;
433         case CAL_PROPERTY_TODO_INTERVAL:
434                 *out_value = (rec->interval);
435                 break;
436         case CAL_PROPERTY_TODO_WKST:
437                 *out_value = (rec->wkst);
438                 break;
439         case CAL_PROPERTY_TODO_HAS_ALARM:
440                 *out_value = (rec->has_alarm);
441                 break;
442         case CAL_PROPERTY_TODO_HAS_ATTENDEE:
443                 *out_value = (rec->has_attendee);
444                 break;
445         case CAL_PROPERTY_TODO_IS_ALLDAY:
446                 *out_value = (rec->is_allday);
447                 break;
448         default:
449                 /* LCOV_EXCL_START */
450                 ERR("invalid parameter (property:0x%x)", property_id);
451                 return CALENDAR_ERROR_INVALID_PARAMETER;
452                 /* LCOV_EXCL_STOP */
453         }
454
455         return CALENDAR_ERROR_NONE;
456 }
457
458 static int _cal_record_todo_get_double(calendar_record_h record, unsigned int property_id, double* out_value)
459 {
460         cal_todo_s *rec = (cal_todo_s*)(record);
461         switch (property_id) {
462         case CAL_PROPERTY_TODO_LATITUDE:
463                 *out_value = (rec->latitude);
464                 break;
465         case CAL_PROPERTY_TODO_LONGITUDE:
466                 *out_value = (rec->longitude);
467                 break;
468         default:
469                 /* LCOV_EXCL_START */
470                 ERR("invalid parameter (property:0x%x)", property_id);
471                 return CALENDAR_ERROR_INVALID_PARAMETER;
472                 /* LCOV_EXCL_STOP */
473         }
474
475         return CALENDAR_ERROR_NONE;
476 }
477
478 static int _cal_record_todo_get_lli(calendar_record_h record, unsigned int property_id, long long int* out_value)
479 {
480         cal_todo_s *rec = (cal_todo_s*)(record);
481         switch (property_id) {
482         case CAL_PROPERTY_TODO_CREATED_TIME:
483                 *out_value = (rec->created_time);
484                 break;
485         case CAL_PROPERTY_TODO_LAST_MODIFIED_TIME:
486                 *out_value = (rec->last_mod);
487                 break;
488         case CAL_PROPERTY_TODO_COMPLETED_TIME:
489                 *out_value = (rec->completed_time);
490                 break;
491         default:
492                 /* LCOV_EXCL_START */
493                 ERR("invalid parameter (property:0x%x)", property_id);
494                 return CALENDAR_ERROR_INVALID_PARAMETER;
495                 /* LCOV_EXCL_STOP */
496         }
497
498         return CALENDAR_ERROR_NONE;
499 }
500
501 static int _cal_record_todo_get_caltime(calendar_record_h record, unsigned int property_id, calendar_time_s* out_value)
502 {
503         cal_todo_s *rec = (cal_todo_s*)(record);
504         switch (property_id) {
505         case CAL_PROPERTY_TODO_START:
506                 *out_value = rec->start;
507                 break;
508         case CAL_PROPERTY_TODO_DUE:
509                 *out_value = rec->due;
510                 break;
511         case CAL_PROPERTY_TODO_UNTIL:
512                 *out_value = rec->until;
513                 break;
514         default:
515                 /* LCOV_EXCL_START */
516                 ERR("invalid parameter (property:0x%x)", property_id);
517                 return CALENDAR_ERROR_INVALID_PARAMETER;
518                 /* LCOV_EXCL_STOP */
519         }
520
521         return CALENDAR_ERROR_NONE;
522 }
523
524 static int _cal_record_todo_set_str(calendar_record_h record, unsigned int property_id, const char* value)
525 {
526         cal_todo_s *rec = (cal_todo_s*)(record);
527         switch (property_id) {
528         case CAL_PROPERTY_TODO_SUMMARY:
529                 CAL_FREE(rec->summary);
530                 rec->summary = cal_strdup(value);
531                 break;
532         case CAL_PROPERTY_TODO_DESCRIPTION:
533                 CAL_FREE(rec->description);
534                 rec->description = cal_strdup(value);
535                 break;
536         case CAL_PROPERTY_TODO_LOCATION:
537                 CAL_FREE(rec->location);
538                 rec->location = cal_strdup(value);
539                 break;
540         case CAL_PROPERTY_TODO_CATEGORIES:
541                 CAL_FREE(rec->categories);
542                 rec->categories = cal_strdup(value);
543                 break;
544         case CAL_PROPERTY_TODO_UID:
545                 CAL_FREE(rec->uid);
546                 rec->uid = cal_strdup(value);
547                 break;
548         case CAL_PROPERTY_TODO_BYSECOND:
549                 CAL_FREE(rec->bysecond);
550                 rec->bysecond = cal_strdup(value);
551                 break;
552         case CAL_PROPERTY_TODO_BYMINUTE:
553                 CAL_FREE(rec->byminute);
554                 rec->byminute = cal_strdup(value);
555                 break;
556         case CAL_PROPERTY_TODO_BYHOUR:
557                 CAL_FREE(rec->byhour);
558                 rec->byhour = cal_strdup(value);
559                 break;
560         case CAL_PROPERTY_TODO_BYDAY:
561                 CAL_FREE(rec->byday);
562                 rec->byday = cal_strdup(value);
563                 break;
564         case CAL_PROPERTY_TODO_BYMONTHDAY:
565                 CAL_FREE(rec->bymonthday);
566                 rec->bymonthday = cal_strdup(value);
567                 break;
568         case CAL_PROPERTY_TODO_BYYEARDAY:
569                 CAL_FREE(rec->byyearday);
570                 rec->byyearday = cal_strdup(value);
571                 break;
572         case CAL_PROPERTY_TODO_BYWEEKNO:
573                 CAL_FREE(rec->byweekno);
574                 rec->byweekno = cal_strdup(value);
575                 break;
576         case CAL_PROPERTY_TODO_BYMONTH:
577                 CAL_FREE(rec->bymonth);
578                 rec->bymonth = cal_strdup(value);
579                 break;
580         case CAL_PROPERTY_TODO_BYSETPOS:
581                 CAL_FREE(rec->bysetpos);
582                 rec->bysetpos = cal_strdup(value);
583                 break;
584         case CAL_PROPERTY_TODO_SYNC_DATA1:
585                 CAL_FREE(rec->sync_data1);
586                 rec->sync_data1 = cal_strdup(value);
587                 break;
588         case CAL_PROPERTY_TODO_SYNC_DATA2:
589                 CAL_FREE(rec->sync_data2);
590                 rec->sync_data2 = cal_strdup(value);
591                 break;
592         case CAL_PROPERTY_TODO_SYNC_DATA3:
593                 CAL_FREE(rec->sync_data3);
594                 rec->sync_data3 = cal_strdup(value);
595                 break;
596         case CAL_PROPERTY_TODO_SYNC_DATA4:
597                 CAL_FREE(rec->sync_data4);
598                 rec->sync_data4 = cal_strdup(value);
599                 break;
600         case CAL_PROPERTY_TODO_START_TZID:
601                 CAL_FREE(rec->start_tzid);
602                 rec->start_tzid = cal_strdup(value);
603                 break;
604         case CAL_PROPERTY_TODO_DUE_TZID:
605                 CAL_FREE(rec->due_tzid);
606                 rec->due_tzid = cal_strdup(value);
607                 break;
608         case CAL_PROPERTY_TODO_ORGANIZER_NAME:
609                 CAL_FREE(rec->organizer_name);
610                 rec->organizer_name = cal_strdup(value);
611                 break;
612         case CAL_PROPERTY_TODO_ORGANIZER_EMAIL:
613                 CAL_FREE(rec->organizer_email);
614                 rec->organizer_email = cal_strdup(value);
615                 break;
616         default:
617                 /* LCOV_EXCL_START */
618                 ERR("invalid parameter (value:%s)", value);
619                 return CALENDAR_ERROR_INVALID_PARAMETER;
620                 /* LCOV_EXCL_STOP */
621         }
622
623         return CALENDAR_ERROR_NONE;
624 }
625
626 static int _cal_record_todo_set_int(calendar_record_h record, unsigned int property_id, int value)
627 {
628         cal_todo_s *rec = (cal_todo_s*)(record);
629         switch (property_id) {
630         case CAL_PROPERTY_TODO_ID:
631                 (rec->index) = value;
632                 break;
633         case CAL_PROPERTY_TODO_CALENDAR_ID:
634                 (rec->calendar_id) = value;
635                 break;
636         case CAL_PROPERTY_TODO_TODO_STATUS:
637                 switch (value) {
638                 case CALENDAR_TODO_STATUS_NONE:
639                 case CALENDAR_TODO_STATUS_NEEDS_ACTION:
640                 case CALENDAR_TODO_STATUS_COMPLETED:
641                 case CALENDAR_TODO_STATUS_IN_PROCESS:
642                 case CALENDAR_TODO_STATUS_CANCELED:
643                         (rec->todo_status) = value;
644                         break;
645                 default:
646                         /* LCOV_EXCL_START */
647                         ERR("invalid parameter (value:%d)", value);
648                         return CALENDAR_ERROR_INVALID_PARAMETER;
649                         /* LCOV_EXCL_STOP */
650                 }
651                 break;
652         case CAL_PROPERTY_TODO_PRIORITY:
653                 switch (value) {
654                 case CALENDAR_TODO_PRIORITY_NONE:
655                 case CALENDAR_TODO_PRIORITY_LOW:
656                 case CALENDAR_TODO_PRIORITY_NORMAL:
657                 case CALENDAR_TODO_PRIORITY_HIGH:
658                         (rec->priority) = value;
659                         break;
660                 default:
661                         /* LCOV_EXCL_START */
662                         ERR("invalid parameter (value:%d)", value);
663                         return CALENDAR_ERROR_INVALID_PARAMETER;
664                         /* LCOV_EXCL_STOP */
665                 }
666                 break;
667         case CAL_PROPERTY_TODO_SENSITIVITY:
668                 (rec->sensitivity) = value;
669                 break;
670         case CAL_PROPERTY_TODO_PROGRESS:
671                 (rec->progress) = value;
672                 break;
673         case CAL_PROPERTY_TODO_IS_DELETED:
674                 (rec->is_deleted) = value;
675                 break;
676         case CAL_PROPERTY_TODO_FREQ:
677                 switch (value) {
678                 case CALENDAR_RECURRENCE_NONE:
679                 case CALENDAR_RECURRENCE_DAILY:
680                 case CALENDAR_RECURRENCE_WEEKLY:
681                 case CALENDAR_RECURRENCE_MONTHLY:
682                 case CALENDAR_RECURRENCE_YEARLY:
683                         (rec->freq) = value;
684                         break;
685                 default:
686                         /* LCOV_EXCL_START */
687                         ERR("invalid parameter (value:%d)", value);
688                         return CALENDAR_ERROR_INVALID_PARAMETER;
689                         /* LCOV_EXCL_STOP */
690                 }
691                 break;
692         case CAL_PROPERTY_TODO_RANGE_TYPE:
693                 switch (value) {
694                 case CALENDAR_RANGE_UNTIL:
695                 case CALENDAR_RANGE_COUNT:
696                 case CALENDAR_RANGE_NONE:
697                         (rec->range_type) = value;
698                         break;
699                 default:
700                         /* LCOV_EXCL_START */
701                         ERR("invalid parameter (value:%d)", value);
702                         return CALENDAR_ERROR_INVALID_PARAMETER;
703                         /* LCOV_EXCL_STOP */
704                 }
705                 break;
706         case CAL_PROPERTY_TODO_COUNT:
707                 (rec->count) = value;
708                 break;
709         case CAL_PROPERTY_TODO_INTERVAL:
710                 (rec->interval) = value;
711                 break;
712         case CAL_PROPERTY_TODO_WKST:
713                 switch (value) {
714                 case 0:
715                         DBG("set wkst as default");
716                 case CALENDAR_SUNDAY:
717                 case CALENDAR_MONDAY:
718                 case CALENDAR_TUESDAY:
719                 case CALENDAR_WEDNESDAY:
720                 case CALENDAR_THURSDAY:
721                 case CALENDAR_FRIDAY:
722                 case CALENDAR_SATURDAY:
723                         (rec->wkst) = value;
724                         break;
725                 default:
726                         /* LCOV_EXCL_START */
727                         ERR("invalid parameter (value:%d)", value);
728                         return CALENDAR_ERROR_INVALID_PARAMETER;
729                         /* LCOV_EXCL_STOP */
730                 }
731                 break;
732         case CAL_PROPERTY_TODO_HAS_ALARM:
733                 (rec->has_alarm) = value;
734                 break;
735         case CAL_PROPERTY_TODO_HAS_ATTENDEE:
736                 (rec->has_attendee) = value;
737                 break;
738         case CAL_PROPERTY_TODO_IS_ALLDAY:
739                 (rec->is_allday) = value;
740                 break;
741         default:
742                 /* LCOV_EXCL_START */
743                 ERR("invalid parameter (property:0x%x)", property_id);
744                 return CALENDAR_ERROR_INVALID_PARAMETER;
745                 /* LCOV_EXCL_STOP */
746         }
747
748         return CALENDAR_ERROR_NONE;
749 }
750
751 static int _cal_record_todo_set_double(calendar_record_h record, unsigned int property_id, double value)
752 {
753         cal_todo_s *rec = (cal_todo_s*)(record);
754         switch (property_id) {
755         case CAL_PROPERTY_TODO_LATITUDE:
756                 (rec->latitude) = value;
757                 break;
758         case CAL_PROPERTY_TODO_LONGITUDE:
759                 (rec->longitude) = value;
760                 break;
761         default:
762                 /* LCOV_EXCL_START */
763                 ERR("invalid parameter (property:0x%x)", property_id);
764                 return CALENDAR_ERROR_INVALID_PARAMETER;
765                 /* LCOV_EXCL_STOP */
766         }
767
768         return CALENDAR_ERROR_NONE;
769 }
770
771 static int _cal_record_todo_set_lli(calendar_record_h record, unsigned int property_id, long long int value)
772 {
773         cal_todo_s *rec = (cal_todo_s*)(record);
774         switch (property_id) {
775         case CAL_PROPERTY_TODO_COMPLETED_TIME:
776                 (rec->completed_time) = value;
777                 break;
778         case CAL_PROPERTY_TODO_CREATED_TIME:
779                 (rec->created_time) = value;
780                 break;
781         default:
782                 /* LCOV_EXCL_START */
783                 ERR("invalid parameter (property:0x%x)", property_id);
784                 return CALENDAR_ERROR_INVALID_PARAMETER;
785                 /* LCOV_EXCL_STOP */
786         }
787
788         return CALENDAR_ERROR_NONE;
789 }
790
791 static int _cal_record_todo_set_caltime(calendar_record_h record, unsigned int property_id, calendar_time_s value)
792 {
793         cal_todo_s *rec = (cal_todo_s*)(record);
794         switch (property_id) {
795         case CAL_PROPERTY_TODO_START:
796                 (rec->start) = value;
797                 break;
798         case CAL_PROPERTY_TODO_DUE:
799                 (rec->due) = value;
800                 break;
801         case CAL_PROPERTY_TODO_UNTIL:
802                 (rec->until) = value;
803                 break;
804         default:
805                 /* LCOV_EXCL_START */
806                 ERR("invalid parameter (property:0x%x)", property_id);
807                 return CALENDAR_ERROR_INVALID_PARAMETER;
808                 /* LCOV_EXCL_STOP */
809         }
810
811         return CALENDAR_ERROR_NONE;
812 }
813
814 static int _cal_record_todo_reset_child_record_id(calendar_record_h child_record)
815 {
816         cal_record_s *record = (cal_record_s*)child_record;
817         RETV_IF(NULL == record, CALENDAR_ERROR_INVALID_PARAMETER);
818
819         switch (record->type) {
820         case CAL_RECORD_TYPE_ALARM:
821                 ((cal_alarm_s *)record)->id = 0;
822                 break;
823         case CAL_RECORD_TYPE_ATTENDEE:
824                 ((cal_attendee_s *)record)->id = 0;
825                 break;
826         case CAL_RECORD_TYPE_EXTENDED:
827                 ((cal_extended_s *)record)->id = 0;
828                 break;
829         default:
830                 /* LCOV_EXCL_START */
831                 ERR("Invalid child record type (%d)", record->type);
832                 return CALENDAR_ERROR_INVALID_PARAMETER;
833                 /* LCOV_EXCL_STOP */
834         }
835         return CALENDAR_ERROR_NONE;
836 }
837
838
839 static int _cal_record_todo_add_child_record(calendar_record_h record, unsigned int property_id, calendar_record_h child_record)
840 {
841         int ret = CALENDAR_ERROR_NONE;
842         cal_todo_s *rec = (cal_todo_s*)(record);
843         _cal_record_todo_reset_child_record_id(child_record);
844
845         switch (property_id) {
846         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
847                 ret = calendar_list_add((calendar_list_h)rec->alarm_list, child_record);
848                 rec->has_alarm = 1;
849                 break;
850         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
851                 ret = calendar_list_add((calendar_list_h)rec->attendee_list, child_record);
852                 rec->has_attendee = 1;
853                 break;
854         case CAL_PROPERTY_TODO_EXTENDED:
855                 ret = calendar_list_add((calendar_list_h)rec->extended_list, child_record);
856                 break;
857         default:
858                 /* LCOV_EXCL_START */
859                 ERR("invalid parameter (property:0x%x)", property_id);
860                 return CALENDAR_ERROR_INVALID_PARAMETER;
861                 /* LCOV_EXCL_STOP */
862         }
863         return ret;
864 }
865
866 static int _cal_record_todo_remove_child_record(calendar_record_h record, unsigned int property_id, calendar_record_h child_record)
867 {
868         int ret = CALENDAR_ERROR_NONE;
869         cal_todo_s *rec = (cal_todo_s *)record;
870
871         switch (property_id) {
872         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
873                 ret = calendar_list_remove((calendar_list_h)rec->alarm_list, child_record);
874                 if (rec->alarm_list->count == 0)
875                         rec->has_alarm = 0;
876                 break;
877         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
878                 ret = calendar_list_remove((calendar_list_h)rec->attendee_list, child_record);
879                 if (rec->attendee_list->count == 0)
880                         rec->has_attendee = 0;
881                 break;
882         case CAL_PROPERTY_TODO_EXTENDED:
883                 ret = calendar_list_remove((calendar_list_h)rec->extended_list, child_record);
884                 break;
885         default:
886                 /* LCOV_EXCL_START */
887                 ERR("invalid parameter (property:0x%x)", property_id);
888                 return CALENDAR_ERROR_INVALID_PARAMETER;
889                 /* LCOV_EXCL_STOP */
890         }
891         return ret;
892 }
893
894 static int _cal_record_todo_get_child_record_count(calendar_record_h record, unsigned int property_id , unsigned int* count)
895 {
896         int ret = CALENDAR_ERROR_NONE;
897         cal_todo_s *rec = (cal_todo_s *)record;
898
899         RETV_IF(NULL == count, CALENDAR_ERROR_INVALID_PARAMETER);
900         *count = 0;
901
902         switch (property_id) {
903         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
904                 ret = calendar_list_get_count((calendar_list_h)rec->alarm_list, (int *)count);
905                 break;
906         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
907                 ret = calendar_list_get_count((calendar_list_h)rec->attendee_list, (int *)count);
908                 break;
909         case CAL_PROPERTY_TODO_EXTENDED:
910                 ret = calendar_list_get_count((calendar_list_h)rec->extended_list, (int *)count);
911                 break;
912         default:
913                 /* LCOV_EXCL_START */
914                 ERR("invalid parameter (property:0x%x)", property_id);
915                 return CALENDAR_ERROR_INVALID_PARAMETER;
916                 /* LCOV_EXCL_STOP */
917         }
918         return ret;
919 }
920
921 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)
922 {
923         int ret;
924         cal_todo_s *rec = (cal_todo_s*)(record);
925
926         RETV_IF(NULL == child_record, CALENDAR_ERROR_INVALID_PARAMETER);
927         *child_record = NULL;
928
929         switch (property_id) {
930         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
931                 ret = cal_list_get_nth_record_p(rec->alarm_list, index, child_record);
932                 break;
933         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
934                 ret = cal_list_get_nth_record_p(rec->attendee_list, index, child_record);
935                 break;
936         case CAL_PROPERTY_TODO_EXTENDED:
937                 ret = cal_list_get_nth_record_p(rec->extended_list, index, child_record);
938                 break;
939         default:
940                 /* LCOV_EXCL_START */
941                 ERR("invalid parameter (property:0x%x)", property_id);
942                 return CALENDAR_ERROR_INVALID_PARAMETER;
943                 /* LCOV_EXCL_STOP */
944         }
945         return ret;
946 }
947
948 static int _cal_record_todo_clone_child_record_list(calendar_record_h record, unsigned int property_id, calendar_list_h* out_list)
949 {
950         int ret;
951         cal_todo_s *rec = (cal_todo_s*)(record);
952
953         RETV_IF(NULL == out_list, CALENDAR_ERROR_INVALID_PARAMETER);
954         *out_list = NULL;
955
956         switch (property_id) {
957         case CAL_PROPERTY_TODO_CALENDAR_ALARM:
958                 ret = cal_list_clone((calendar_list_h)rec->alarm_list, out_list);
959                 break;
960         case CAL_PROPERTY_TODO_CALENDAR_ATTENDEE:
961                 ret = cal_list_clone((calendar_list_h)rec->attendee_list, out_list);
962                 break;
963         case CAL_PROPERTY_TODO_EXTENDED:
964                 ret = cal_list_clone((calendar_list_h)rec->extended_list, out_list);
965                 break;
966         default:
967                 /* LCOV_EXCL_START */
968                 ERR("invalid parameter (property:0x%x)", property_id);
969                 return CALENDAR_ERROR_INVALID_PARAMETER;
970                 /* LCOV_EXCL_STOP */
971         }
972         return ret;
973 }