3 * Copyright 2012 Samsung Electronics Co., Ltd
5 * Licensed under the Flora License, Version 1.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.tizenopensource.org/license
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 static Calendar_color def_color[] = {
29 int * _calendar_svc_get_simple_cs(int acct_id, struct tm *start, struct tm *end)
33 int *month = calloc(31, sizeof(int));
34 c_retv_if(!month, NULL);
38 struct tm tm_start, tm_end;
39 long long int lli_start, lli_end;
41 cal_util_convert_tm_to_lli(NULL, start, &lli_start);
42 cal_util_convert_tm_to_lli(NULL, end, &lli_end);
44 cal_struct *cs = NULL;
45 cal_iter *iter = NULL;
47 int r = calendar_svc_event_get_normal_list_by_period(-1, CALS_LIST_PERIOD_NORMAL_OSP, lli_start, lli_end, &iter);
48 c_warn_if(r != CAL_SUCCESS, "calendar_svc_event_get_normal_list_by_period() is failed(%d)", r);
49 c_warn_if(!iter, "iter is NULL");
51 while ((r = CALENDAR_SVC_ITER_NEXT(iter)) == CAL_SUCCESS) {
53 r = CALENDAR_SVC_ITER_GET_INFO(iter, &cs);
57 lli_start = CALENDAR_SVC_STRUCT_GET_LLI(cs, CALS_VALUE_LLI_DTSTART_UTIME);
58 lli_end = CALENDAR_SVC_STRUCT_GET_LLI(cs, CALS_VALUE_LLI_DTEND_UTIME);
60 cal_util_convert_lli_to_tm(NULL, lli_start, &tm_start);
61 cal_util_convert_lli_to_tm(NULL, lli_end, &tm_end);
63 for (i = tm_start.tm_mday; i <= tm_end.tm_mday; i++)
67 r = calendar_svc_event_get_allday_list_by_period(-1, CALS_LIST_PERIOD_ALLDAY_OSP,
68 start->tm_year + 1900, start->tm_mon + 1, start->tm_mday,
69 end->tm_year + 1900, end->tm_mon + 1, end->tm_mday,
71 c_warn_if(r != CAL_SUCCESS, "calendar_svc_event_get_allday_list_by_period() is failed(%d)", r);
72 c_warn_if(!iter, "iter is NULL");
74 while ((r = CALENDAR_SVC_ITER_NEXT(iter)) == CAL_SUCCESS) {
76 r = CALENDAR_SVC_ITER_GET_INFO(iter, &cs);
80 tm_start.tm_mday = CALENDAR_SVC_STRUCT_GET_INT(cs, CALS_VALUE_INT_DTSTART_MDAY);
81 tm_end.tm_mday = CALENDAR_SVC_STRUCT_GET_INT(cs, CALS_VALUE_INT_DTEND_MDAY);
83 for (i = tm_start.tm_mday; i <= tm_end.tm_mday; i++)
92 void _calendar_svc_free_cslist(Eina_List **h)
97 cal_struct *cs = NULL;
100 EINA_LIST_FOREACH(*h, l, cs) {
102 CALENDAR_SVC_STRUCT_FREE(&cs);
105 *h = eina_list_free(*h);
109 int _calendar_svc_get_account_visibility(int account_id)
111 cal_struct* cs = NULL;
112 Eina_List* list = NULL;
116 list = CALENDAR_SVC_GET_ALL(account_id, ALL_CALENDAR_ID, CAL_STRUCT_CALENDAR);
117 EINA_LIST_FOREACH(list,l,cs)
119 r = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_TABLE_INT_VISIBILITY);
125 //DBG("CALENDAR_SVC_GET_ACCOUNT_VISIBILITY fail : %d\n", r);
131 void _calendar_svc_set_account_visibility(int account_id, int value)
133 cal_struct* cs = NULL;
134 Eina_List* list = NULL;
138 list = CALENDAR_SVC_GET_ALL(account_id, ALL_CALENDAR_ID, CAL_STRUCT_CALENDAR);
139 EINA_LIST_FOREACH(list,l,cs)
141 r = CALENDAR_SVC_STRUCT_SET_INT(cs, CAL_TABLE_INT_VISIBILITY, value);
144 //DBG("\n calendar_svc_struct_set_int fail : %d \n", r);
148 r = CALENDAR_SVC_UPDATE(cs);
151 //DBG("\n CALENDAR_SVC_UPDATE fail : %d \n", r);
157 void _calendar_svc_set_calendar_visibility(cal_struct* cs, int value)
163 r = CALENDAR_SVC_STRUCT_SET_INT(cs, CAL_TABLE_INT_VISIBILITY, value);
166 DBG("\n CALENDAR_SVC_STRUCT_SET_INT fail : %d \n", r);
169 account_id = CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_TABLE_INT_ACCOUNT_ID);
170 cal_id = CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_TABLE_INT_INDEX);
173 int _calendar_svc_get_calendar_visibility(cal_struct* cs)
179 r = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_TABLE_INT_VISIBILITY);
180 account_id = CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_TABLE_INT_ACCOUNT_ID);
181 cal_id = CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_TABLE_INT_INDEX);
185 //cal_calendar_svc_find_event is used only in alarm call back
186 Eina_List* _calendar_svc_find_event(int acct_id, const char *field, const void *val)
192 time_t t = time(NULL);
197 tmp = localtime_r((const time_t*)&t, &tm);
200 ERR("localtime_r return null");
205 r = CALENDAR_SVC_FIND_EVENT_LIST(acct_id, field, val, &it);
206 if (r != CAL_SUCCESS)
210 while (CALENDAR_SVC_ITER_NEXT(it) == CAL_SUCCESS) {
212 r = CALENDAR_SVC_ITER_GET_INFO(it, &cs);
213 if (r != CAL_SUCCESS)
216 csl = eina_list_append(csl, cs);
219 CALENDAR_SVC_ITER_REMOVE(&it);
224 Eina_List* _calendar_svc_get_calendars_with_account(int account_id, void* at)
226 Eina_List *csl = NULL;
227 cal_struct *cal = NULL;
229 Eina_List *list = CALENDAR_SVC_GET_ALL(account_id, ALL_CALENDAR_ID, CAL_STRUCT_CALENDAR);
230 c_retv_if(!list, NULL);
234 EINA_LIST_FOREACH(list, l, cal) {
235 struct _cs *cs = calloc(1, sizeof(struct _cs));
236 c_retv_if(!cs, NULL);
240 csl = eina_list_append(csl, cs);
243 eina_list_free(list);
248 void _calendar_svc_set_calendar_color(cal_struct* cal, Calendar_color* color )
252 snprintf(buf, sizeof(buf), "%d.%d.%d.%d", color->red, color->green, color->blue, color->alpha);
254 r = CALENDAR_SVC_STRUCT_SET_STR(cal, CAL_TABLE_TXT_COLOR, buf);
255 if (r != CAL_SUCCESS)
257 ERR("CALENDAR_SVC_STRUCT_SET_STR return %d", r);
262 void _calendar_svc_get_calendar_color(cal_struct* cal, Calendar_color* calendar_color )
264 if(!cal || !calendar_color)
266 ERR("parameter is NULL");
270 char* calendar = NULL;
276 calendar = CALENDAR_SVC_STRUCT_GET_STR(cal, CAL_TABLE_TXT_COLOR);
278 color = CAL_STRDUP(calendar);
280 if (8 < CAL_STRLEN(color)) {
282 token = strtok_r(color, ".", &temp);
284 calendar_color->red = atoi(token);
286 calendar_color->red = 0;
287 ERR("color : %s, token is NULL", calendar);
290 token = strtok_r(NULL, ".", &temp);
292 calendar_color->green = atoi(token);
294 calendar_color->green = 0;
295 ERR("color : %s, token is NULL", calendar);
298 token = strtok_r(NULL, ".", &temp);
300 calendar_color->blue = atoi(token);
302 calendar_color->blue = 0;
303 ERR("color : %s, token is NULL", calendar);
306 token = strtok_r(NULL, ".", &temp);
308 calendar_color->alpha = atoi(token);
310 calendar_color->alpha = 255;
311 ERR("color : %s, token is NULL", calendar);
315 index = CALENDAR_SVC_STRUCT_GET_INT(cal, CAL_TABLE_INT_INDEX)%6;
317 *calendar_color = def_color[index];
323 void _calendar_svc_add_event_changed_callback(void(*callback)(void *), void *user_data)
325 c_retm_if(!callback, "callback is null");
326 c_retm_if(!user_data, "user_data is null");
328 int ret = calendar_svc_subscribe_change(callback, user_data);
329 c_retm_if(ret!= CAL_SUCCESS, "calendar_svc_subscribe_change() is failed");
332 void _calendar_svc_del_event_changed_callback(void(*callback)(void *))
334 c_retm_if(!callback, "callback is null");
336 int ret = calendar_svc_unsubscribe_change(callback);
337 c_retm_if(ret!= CAL_SUCCESS, "calendar_svc_unsubscribe_change() is failed");
340 void _calendar_svc_add_calendar_changed_callback(const char *type, void(*callback)(void *), void *user_data)
342 c_retm_if(!callback, "callback is null");
343 c_retm_if(!user_data, "user_data is null");
345 int ret = calendar_svc_subscribe_db_change(type, callback, user_data);
346 c_retm_if(ret!= CAL_SUCCESS, "calendar_svc_subscribe_db_change() is failed");
349 void _calendar_svc_del_calendar_changed_callback(const char *type, void(*callback)(void *))
351 c_retm_if(!callback, "callback is null");
353 int ret = calendar_svc_unsubscribe_db_change(type, callback);
354 c_retm_if(ret!= CAL_SUCCESS, "calendar_svc_unsubscribe_db_change() is failed");
357 Eina_Bool _calendar_svc_is_allday_event(cal_struct *schedule)
359 c_retv_if(!schedule, EINA_FALSE);
361 return CALENDAR_SVC_STRUCT_GET_INT(schedule, CALS_VALUE_INT_DTSTART_TYPE) == CALS_TIME_LOCALTIME;
364 static void __calendar_svc_append_list_with_iter(Eina_List **list, cal_iter *iter)
369 cal_struct *cs = NULL;
371 while (CALENDAR_SVC_ITER_NEXT(iter) == CAL_SUCCESS) {
374 cal_error error = CALENDAR_SVC_ITER_GET_INFO(iter, &cs);
375 if (error != CAL_SUCCESS) {
376 ERR("CALENDAR_SVC_ITER_GET_INFO() is failed(%d)", error);
380 *list = eina_list_append(*list, cs);
384 static int __calendar_svc_compare_list_item(const void *data1, const void *data2)
386 c_retv_if(!data1, 1);
387 c_retv_if(!data2, -1);
389 cal_struct *normal_event = (cal_struct *)data1;
390 cal_struct *allday_event = (cal_struct *)data2;
392 long long int lli_normal = CALENDAR_SVC_STRUCT_GET_LLI(normal_event, CALS_VALUE_LLI_DTSTART_UTIME);
394 struct tm tm_allday = {0};
395 tm_allday.tm_year = CALENDAR_SVC_STRUCT_GET_INT(allday_event, CALS_VALUE_INT_DTSTART_YEAR) - 1900;
396 tm_allday.tm_mon = CALENDAR_SVC_STRUCT_GET_INT(allday_event, CALS_VALUE_INT_DTSTART_MONTH) - 1;
397 tm_allday.tm_mday = CALENDAR_SVC_STRUCT_GET_INT(allday_event, CALS_VALUE_INT_DTSTART_MDAY);
399 long long int lli_allday;
400 cal_util_convert_tm_to_lli(NULL, &tm_allday, &lli_allday);
402 return (lli_allday < lli_normal) ? 1 : -1;
406 Eina_List * _calendar_svc_get_normal_list(struct tm *tm_start, struct tm *tm_end)
408 c_retv_if(!tm_start, NULL);
409 c_retv_if(!tm_end, NULL);
411 long long int lli_start, lli_end;
413 cal_util_convert_tm_to_lli(NULL, tm_start, &lli_start);
414 cal_util_convert_tm_to_lli(NULL, tm_end, &lli_end);
416 cal_iter *iter = NULL;
418 // TODO: Change calendar_id to defined constants
420 int r = calendar_svc_event_get_normal_list_by_period(-1, CALS_LIST_PERIOD_NORMAL_OSP, lli_start, lli_end, &iter);
421 c_retvm_if(r != CAL_SUCCESS, NULL, "calendar_svc_event_get_normal_list_by_period() is failed(%d)", r);
423 Eina_List *normal_list = NULL;
425 __calendar_svc_append_list_with_iter(&normal_list, iter);
427 CALENDAR_SVC_ITER_REMOVE(&iter);
432 Eina_List * _calendar_svc_get_allday_list(struct tm *tm_start, struct tm *tm_end)
434 c_retv_if(!tm_start, NULL);
435 c_retv_if(!tm_end, NULL);
437 cal_iter *iter = NULL;
439 // TODO: Change calendar_id to defined constants
441 int r = calendar_svc_event_get_allday_list_by_period(-1, CALS_LIST_PERIOD_ALLDAY_OSP,
442 tm_start->tm_year + 1900, tm_start->tm_mon + 1, tm_start->tm_mday,
443 tm_end->tm_year + 1900, tm_end->tm_mon + 1, tm_end->tm_mday,
445 c_retvm_if(r != CAL_SUCCESS, NULL, "calendar_svc_event_get_allday_list_by_period() is failed(%d)", r);
447 Eina_List *allday_list = NULL;
449 __calendar_svc_append_list_with_iter(&allday_list, iter);
451 CALENDAR_SVC_ITER_REMOVE(&iter);
456 Eina_List *_calendar_svc_get_event_list(struct tm *tm_start, struct tm *tm_end)
458 c_retv_if(!tm_start, NULL);
459 c_retv_if(!tm_end, NULL);
461 Eina_List *normal_list = _calendar_svc_get_normal_list(tm_start, tm_end);
462 Eina_List *allday_list = _calendar_svc_get_allday_list(tm_start, tm_end);
464 return eina_list_sorted_merge(normal_list, allday_list, __calendar_svc_compare_list_item);
467 Eina_List * _calendar_svc_get_task_list(struct tm *tm_start, struct tm *tm_end, int priority, cals_status_t status, cals_todo_list_order_t order)
469 c_retv_if(!tm_start, NULL);
470 c_retv_if(!tm_end, NULL);
474 long long int lli_start, lli_end;
476 cal_util_convert_tm_to_lli(NULL, tm_start, &lli_start);
477 cal_util_convert_tm_to_lli(NULL, tm_end, &lli_end);
479 cal_error error = calendar_svc_todo_get_list(-1, lli_start, lli_end, priority, status, order, &it);
480 c_retvm_if(error != CAL_SUCCESS, NULL, "calendar_svc_todo_get_list(%d) is failed(%d)", -1, error);
482 Eina_List *task_list = NULL;
484 __calendar_svc_append_list_with_iter(&task_list, it);
486 CALENDAR_SVC_ITER_REMOVE(&it);
491 Eina_List *_calendar_svc_event_search(int search_fields, const char *keyword)
493 c_retv_if(!keyword, NULL);
495 cal_iter *iter = NULL;
497 int r = calendar_svc_event_search(search_fields, keyword, &iter);
498 c_retvm_if(r != CAL_SUCCESS, NULL, "calendar_svc_event_search(%d,%s) is failed(%d)", search_fields, keyword, r);
500 Eina_List *search_result = NULL;
502 __calendar_svc_append_list_with_iter(&search_result, iter);
504 CALENDAR_SVC_ITER_REMOVE(&iter);
506 return search_result;
509 Eina_List *_calendar_svc_todo_search(int search_fields, const char *keyword)
511 c_retv_if(!keyword, NULL);
513 cal_iter *iter = NULL;
515 int r = calendar_svc_todo_search(search_fields, keyword, &iter);
516 c_retvm_if(r != CAL_SUCCESS, NULL, "calendar_svc_event_search(%d,%s) is failed(%d)", search_fields, keyword, r);
518 Eina_List *search_result = NULL;
520 __calendar_svc_append_list_with_iter(&search_result, iter);
522 CALENDAR_SVC_ITER_REMOVE(&iter);
524 return search_result;
527 Eina_List * _calendar_svc_get_all(int account_id, int calendar_id, const char *type)
529 c_retv_if(!type, NULL);
531 cal_iter *iter = NULL;
533 int r = calendar_svc_get_all(account_id, calendar_id, type, &iter);
534 c_retvm_if(r != CAL_SUCCESS, NULL, "calendar_svc_get_all(%s) is failed(%d)", type, r);
536 Eina_List *list = NULL;
538 __calendar_svc_append_list_with_iter(&list, iter);
540 CALENDAR_SVC_ITER_REMOVE(&iter);