[misc] fixed attendee bug
authorJeesun Kim <iamjs.kim@samsung.com>
Mon, 22 Apr 2013 09:58:58 +0000 (18:58 +0900)
committerJeesun Kim <iamjs.kim@samsung.com>
Mon, 22 Apr 2013 09:58:58 +0000 (18:58 +0900)
[issue#] jira N_SE-35479

common/cal_time.cpp
common/cal_time.h
common/cal_vcalendar_parse.c
server/cal_server_alarm.c

index a4618cf..403a484 100644 (file)
@@ -536,6 +536,24 @@ long long int _cal_time_convert_itol(const char *tzid, int y, int mon, int d, in
        return lli;
 }
 
+int _cal_time_utoi(long long int utime, char *tzid, int *y, int *m, int *d, int *h, int *min, int *s)
+{
+       UCalendar *ucal = NULL;
+       UErrorCode status = U_ZERO_ERROR;
+
+       ucal = _cal_time_get_ucal(tzid, -1);
+       ucal_setMillis(ucal, sec2ms(utime), &status);
+       if (y) *y = ucal_get(ucal, UCAL_YEAR, &status);
+       if (m) *m = ucal_get(ucal, UCAL_MONTH, &status) + 1;
+       if (d) *d = ucal_get(ucal, UCAL_DATE, &status);
+       if (h) *h = ucal_get(ucal, UCAL_HOUR_OF_DAY, &status);
+       if (min) *min = ucal_get(ucal, UCAL_MINUTE, &status);
+       if (s) *s = ucal_get(ucal, UCAL_SECOND, &status);
+
+       ucal_close(ucal);
+       return CALENDAR_ERROR_NONE;
+}
+
 long long int _cal_time_convert_stol(char *tzid, char *datetime)
 {
        int y, mon, d, h, min, s;
index 5d47259..6766da8 100644 (file)
@@ -38,6 +38,7 @@ UCalendar *_cal_time_get_ucal(const char *tzid, int wkst);
 char * _cal_time_extract_by(const char *tzid, int wkst, calendar_time_s *ct, int field);
 char * _cal_time_convert_ltos(const char *tzid, long long int lli);
 long long int _cal_time_convert_itol(const char *tzid, int y, int m, int d, int h, int min, int s);
+int _cal_time_utoi(long long int utime, char *tzid, int *y, int *m, int *d, int *h, int *min, int *s);
 long long int _cal_time_convert_stol(char *tzid, char *datetime);
 int _cal_time_ltoi(char *tzid, long long int lli, int *year, int *month, int *mday);
 int _cal_time_ltoi2(char *tzid, long long int lli, int *nth, int *wday);
index ca15a23..6d37ff3 100644 (file)
@@ -93,45 +93,6 @@ static int __cal_vcalendar_parse_dtend(int type, calendar_list_h list, calendar_
 static int __cal_vcalendar_parse_completed(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont);
 static int __cal_vcalendar_parse_percent(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont);
 
-enum {
-       ATTENDEE_CUTYPE = 0x0,
-       ATTENDEE_MEMBER,
-       ATTENDEE_ROLE,
-       ATTENDEE_PARTSTAT,
-       ATTENDEE_RSVP,
-       ATTENDEE_DELTO,
-       ATTENDEE_DELFROM,
-       ATTENDEE_SENTBY,
-       ATTENDEE_CN,
-       ATTENDEE_DIR,
-       ATTENDEE_MAX,
-};
-
-static int __cal_vcalendar_parse_attendee_cutype(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_member(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_role(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_partstat(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_rsvp(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_delto(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_delfrom(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_sentby(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_cn(calendar_record_h event, void *data);
-static int __cal_vcalendar_parse_attendee_dir(calendar_record_h event, void *data);
-
-struct _record_func _attendee_funcs[ATTENDEE_MAX] =
-{
-       { "CUTYPE=", __cal_vcalendar_parse_attendee_cutype },
-       { "MEMBER=", __cal_vcalendar_parse_attendee_member },
-       { "ROLE=", __cal_vcalendar_parse_attendee_role },
-       { "PARTSTAT=", __cal_vcalendar_parse_attendee_partstat },
-       { "RSVP=", __cal_vcalendar_parse_attendee_rsvp },
-       { "DELTO=", __cal_vcalendar_parse_attendee_delto },
-       { "DELFROM=", __cal_vcalendar_parse_attendee_delfrom },
-       { "SENTBY=", __cal_vcalendar_parse_attendee_sentby },
-       { "CN=", __cal_vcalendar_parse_attendee_cn },
-       { "DIR=", __cal_vcalendar_parse_attendee_dir }
-};
-
 static int __cal_vcalendar_parse_attendee(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont);
 static int __cal_vcalendar_parse_categories(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont);
 static int __cal_vcalendar_parse_aalarm(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont);
@@ -1724,173 +1685,211 @@ static int __cal_vcalendar_parse_percent(int type, calendar_list_h list, calenda
        return CALENDAR_ERROR_NONE;
 }
 
-/////////////////////////////////////////////////////////////////
-static int __cal_vcalendar_parse_attendee_cutype(calendar_record_h attendee, void *data)
-{
-       return CALENDAR_ERROR_NONE;
-}
-
-static int __cal_vcalendar_parse_attendee_member(calendar_record_h attendee, void *data)
+static int __cal_vcalendar_parse_attendee_role(char *p, int *role)
 {
-       return CALENDAR_ERROR_NONE;
-}
-
-static int __cal_vcalendar_parse_attendee_role(calendar_record_h attendee, void *data)
-{
-       return CALENDAR_ERROR_NONE;
-}
-
-static int __cal_vcalendar_parse_attendee_partstat(calendar_record_h attendee, void *data)
-{
-       return CALENDAR_ERROR_NONE;
-}
+       if (NULL == p)
+       {
+               return CALENDAR_ERROR_INVALID_PARAMETER;
+       }
 
-static int __cal_vcalendar_parse_attendee_rsvp(calendar_record_h attendee, void *data)
-{
+       if (!strncmp(p, "REQ-PARTICIPANT", strlen("REQ-PARTICIPANT")))
+       {
+               *role = CALENDAR_ATTENDEE_ROLE_REQ_PARTICIPANT;
+       }
+       else if (!strncmp(p, "OPT-PARTICIPANT", strlen("OPT-PARTICIPANT")))
+       {
+               *role = CALENDAR_ATTENDEE_ROLE_OPT_PARTICIPANT;
+       }
+       else if (!strncmp(p, "NON-PARTICIPANT", strlen("NON-PARTICIPANT")))
+       {
+               *role = CALENDAR_ATTENDEE_ROLE_NON_PARTICIPANT;
+       }
+       else if (!strncmp(p, "CHAIR", strlen("CHAIR")))
+       {
+               *role = CALENDAR_ATTENDEE_ROLE_CHAIR;
+       }
+       else
+       {
+       }
        return CALENDAR_ERROR_NONE;
 }
 
-static int __cal_vcalendar_parse_attendee_delto(calendar_record_h attendee, void *data)
+static int __cal_vcalendar_parse_attendee_partstat(char *p, int *stat)
 {
-       return CALENDAR_ERROR_NONE;
-}
+       if (NULL == p)
+       {
+               return CALENDAR_ERROR_INVALID_PARAMETER;
+       }
 
-static int __cal_vcalendar_parse_attendee_delfrom(calendar_record_h attendee, void *data)
-{
+       if (!strncmp(p, "NEEDS-ACTION", strlen("NEEDS-ACTION")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_PENDING;
+       }
+       else if (!strncmp(p, "ACCEPTED", strlen("ACCEPTED")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_ACCEPTED;
+       }
+       else if (!strncmp(p, "DECLINED", strlen("DECLINED")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_DECLINED;
+       }
+       else if (!strncmp(p, "TENTATIVE", strlen("TENTATIVE")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_TENTATIVE;
+       }
+       else if (!strncmp(p, "DELEGATED", strlen("DELEGATED")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_DELEGATED;
+       }
+       else if (!strncmp(p, "COMPLETED", strlen("COMPLETED")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_COMPLETED;
+       }
+       else if (!strncmp(p, "IN-PROCESS", strlen("IN-PROCESS")))
+       {
+               *stat = CALENDAR_ATTENDEE_STATUS_IN_PROCESS;
+       }
+       else
+       {
+               ERR("Unable to parse[%s]", p);
+       }
        return CALENDAR_ERROR_NONE;
 }
 
-static int __cal_vcalendar_parse_attendee_sentby(calendar_record_h attendee, void *data)
+static int __cal_vcalendar_parse_attendee_mailto(char *p, calendar_record_h attendee)
 {
+       if (NULL == p || NULL == attendee)
+       {
+               ERR("Invalid parameter");
+               return CALENDAR_ERROR_INVALID_PARAMETER;
+       }
+       p++; // to remove ':'
+       _cal_record_set_str(attendee, _calendar_attendee.email, p);
        return CALENDAR_ERROR_NONE;
 }
 
-static int __cal_vcalendar_parse_attendee_cn(calendar_record_h attendee, void *data)
+static int __cal_vcalendar_parse_attendee_param(char *p, calendar_record_h attendee)
 {
-       int ret;
-       int i = 0;
-       char *text = NULL;
-       char *p = (char *)data;
+       int i;
+       int len = 0;
+       char **t;
 
-       while (*p != ':' && *p != '\n' && *p != '\r' && *p != '\0') {
-               i++;
-               p++;
+       if (NULL == p || NULL == attendee)
+       {
+               ERR("Invalid parameter");
+               return CALENDAR_ERROR_INVALID_PARAMETER;
        }
 
-       text = calloc(i + 1, sizeof(char));
-       if (text == NULL) {
-               ERR("Failed to calloc");
-               return -1;
+       DBG("attendee param[%s]", p);
+       t = g_strsplit_set(p, ";:", -1);
+       if (NULL == t)
+       {
+               ERR("g_strsplit_set() failed");
+               return CALENDAR_ERROR_OUT_OF_MEMORY;
        }
-       snprintf(text, i + 1, "%s", (char *)data);
-
-       ret = _cal_record_set_str(attendee, _calendar_attendee.name, text);
-       DBG("cn[%s]", text);
-       if (text) free(text);
-
-       return CALENDAR_ERROR_NONE;
-}
-
-static int __cal_vcalendar_parse_attendee_dir(calendar_record_h attendee, void *data)
-{
-       return CALENDAR_ERROR_NONE;
-}
-
-int _work_attendee_mailto(calendar_record_h attendee, char *buf)
-{
-       return CALENDAR_ERROR_NONE;
-}
-
-int _work_attendee_property(calendar_record_h attendee, char *buf)
-{
-       int i;
-       int len_all, len_prop;
 
-       for (i = 0; i < ATTENDEE_MAX; i++) {
-               if (!strncmp(buf, _attendee_funcs[i].prop, strlen(_attendee_funcs[i].prop))) {
-                       len_all = strlen(buf);
-                       len_prop = strlen(_attendee_funcs[i].prop);
-                       snprintf(buf, len_all - len_prop + 1, "%s", &buf[len_prop]);
-                       _attendee_funcs[i].func(attendee, buf);
-                       break;
+       len = g_strv_length(t);
+       for (i = 0; i < len; i++)
+       {
+               DBG("get string[%s]", t[i]);
+               if (!strncmp(t[i], "CUTYPE=", strlen("CUTYPE=")))
+               {
+               }
+               else if (!strncmp(t[i], "MEMBER=", strlen("MEMBER=")))
+               {
+               }
+               else if (!strncmp(t[i], "ROLE=", strlen("ROLE=")))
+               {
+                       int role = 0;
+                       __cal_vcalendar_parse_attendee_role(t[i] + strlen("ROLE="), &role);
+                       _cal_record_set_int(attendee, _calendar_attendee.role, role);
+               }
+               else if (!strncmp(t[i], "PARTSTAT=", strlen("PARTSTAT=")))
+               {
+                       int stat = 0;
+                       __cal_vcalendar_parse_attendee_partstat(t[i] + strlen("PARTSTAT="), &stat);
+                       _cal_record_set_int(attendee, _calendar_attendee.status, stat);
+               }
+               else if (!strncmp(t[i], "RSVP=", strlen("RSVP=")))
+               {
+               }
+               else if (!strncmp(t[i], "DELTO=", strlen("DELTO=")))
+               {
+                       DBG("[%s]", t[i] + strlen("DELTO="));
+                       _cal_record_set_str(attendee, _calendar_attendee.delegate_uri, t[i] + strlen("DELTO="));
+               }
+               else if (!strncmp(t[i], "DELFROM=", strlen("DELFROM=")))
+               {
+                       DBG("[%s]", t[i] + strlen("DELFROM="));
+                       _cal_record_set_str(attendee, _calendar_attendee.delegator_uri, t[i] + strlen("DELFROM="));
+               }
+               else if (!strncmp(t[i], "SENT-BY=", strlen("SENT-BY=")))
+               {
+               }
+               else if (!strncmp(t[i], "CN=", strlen("CN=")))
+               {
+                       DBG("[%s]", t[i] + strlen("CN="));
+                       _cal_record_set_str(attendee, _calendar_attendee.name, t[i] + strlen("CN="));
+               }
+               else if (!strncmp(t[i], "DIR=", strlen("DIR=")))
+               {
+               }
+               else
+               {
+                       DBG("No macthed field[%s]", t[i]);
                }
        }
+       g_strfreev(t);
        return CALENDAR_ERROR_NONE;
 }
 
 static int __cal_vcalendar_parse_attendee(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont)
 {
+       int i;
        int ret;
-       int i, j;
+       int len = 0;
        char *p = (char *)cont;
-       calendar_record_h attendee;
-
-       ret = calendar_record_create(_calendar_attendee._uri, &attendee);
-
-       ret = calendar_record_add_child_record(event, _calendar_event.calendar_attendee, attendee);
+       char **t;
 
-       i = 0;
-       j = 0;
-       int mode = 0;
-       char buf[64] = {0};
+       p++;
 
-       if (p[i + 1] == '\0')
+       // divide mailto firstly.
+       t = g_strsplit(p, ":mailto", -1);
        {
-               ERR("Invalid parameter");
-               return CALENDAR_ERROR_INVALID_PARAMETER;
+               if (NULL == t)
+               {
+                       ERR("g_strsplit_set() failed");
+                       return CALENDAR_ERROR_OUT_OF_MEMORY;
+               }
        }
 
-       while (p[i] != '\0') {
-               switch (p[i]) {
-               case ':':
-                       /* work mail to */
-                       if (mode) {
-                               buf[j] = '\0';
-                               _work_attendee_mailto(attendee, buf);
-                               mode = 0;
-                       } else {
-                               mode = 1;
-                       }
-                       j = 0;
-                       break;
-
-               case ';':
-                       /* work property */
-                       if (mode) {
-                               buf[j] = '\0';
-                               _work_attendee_property(attendee, buf);
-                               mode = 0;
-                       } else {
-                               mode = 2;
-                       }
-                       j = 0;
-                       break;
+       calendar_record_h attendee = NULL;
+       ret = calendar_record_create(_calendar_attendee._uri, &attendee);
+       if (NULL == attendee)
+       {
+               ERR("Failed to create attedee(ret:%d)", ret);
+               return ret;
+       }
 
-               default:
-                       buf[j] = p[i];
-                       j++;
-                       break;
+       len = g_strv_length(t);
+       for (i = 0; i < len; i++)
+       {
+               if (*t[i] == ':')
+               {
+                       __cal_vcalendar_parse_attendee_mailto(t[i], attendee);
+               }
+               else
+               {
+                       __cal_vcalendar_parse_attendee_param(t[i], attendee);
                }
-               i++;
        }
 
-       switch (mode) {
-       case 1:
-               buf[j] = '\0';
-               _work_attendee_mailto(attendee, buf);
-               break;
-       case 2:
-               buf[j] = '\0';
-               _work_attendee_property(attendee, buf);
-               break;
-       default:
-               break;
-       }
+       ret = calendar_record_add_child_record(event, _calendar_event.calendar_attendee, attendee);
 
+       g_strfreev(t);
        return CALENDAR_ERROR_NONE;
 }
 
-
 static int __cal_vcalendar_parse_categories(int type, calendar_list_h list, calendar_record_h event, char *prop, char *cont)
 {
        char *p = (char *)cont;
index de5e9ae..5c5a316 100644 (file)
@@ -788,9 +788,28 @@ static int __cal_server_alarm_register_next_normal(long long int now_utime, GLis
        // register new list
        long long int mod_alarm_utime; // del seconds
        mod_alarm_utime = nd->alarm_utime - (nd->alarm_utime % 60);
-       ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE,
-                       (time_t)(mod_alarm_utime - now_utime),
-                       0, NULL, &alarm_id);
+//     ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, (time_t)(mod_alarm_utime - now_utime), 0, NULL, &alarm_id);
+
+///////////////////////////////////////
+       alarm_entry_t *alarm_info = NULL;
+       alarm_info = alarmmgr_create_alarm();
+       if (NULL == alarm_info)
+       {
+               ERR("Failed to create alarm");
+               return CALENDAR_ERROR_DB_FAILED;
+       }
+       char *tzid = NULL;
+       tzid = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
+
+       alarm_date_t alarm_date;
+       _cal_time_utoi(mod_alarm_utime, tzid,
+                       &alarm_date.year, &alarm_date.month, &alarm_date.day,
+                       &alarm_date.hour, &alarm_date.min, &alarm_date.sec);
+       alarmmgr_set_time(alarm_info, alarm_date);
+       ret = alarmmgr_add_alarm_with_localtime(alarm_info, NULL, &alarm_id);
+       if (tzid) free(tzid);
+///////////////////////////////////////
+
        if (ret < 0)
        {
                ERR("alarmmgr_add_alarm_appsvc failed (%d)", ret);
@@ -835,9 +854,28 @@ static int __cal_server_alarm_register_next_allday(time_t now_timet, GList *alld
        }
 
        // register new list
-       ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE,
-                       (time_t)(alarm_timet - (ad->tick * ad->unit) - now_timet),
-                       0, NULL, &alarm_id);
+//     ret = alarmmgr_add_alarm(ALARM_TYPE_VOLATILE, (time_t)(alarm_timet - (ad->tick * ad->unit) - now_timet), 0, NULL, &alarm_id);
+
+///////////////////////////////////////
+       alarm_entry_t *alarm_info = NULL;
+       alarm_info = alarmmgr_create_alarm();
+       if (NULL == alarm_info)
+       {
+               ERR("Failed to create alarm");
+               return CALENDAR_ERROR_DB_FAILED;
+       }
+       char *tzid = NULL;
+       tzid = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
+
+       alarm_date_t alarm_date;
+       _cal_time_utoi((long long int)(alarm_timet - (ad->tick * ad->unit)), tzid,
+                       &alarm_date.year, &alarm_date.month, &alarm_date.day,
+                       &alarm_date.hour, &alarm_date.min, &alarm_date.sec);
+       alarmmgr_set_time(alarm_info, alarm_date);
+       ret = alarmmgr_add_alarm_with_localtime(alarm_info, NULL, &alarm_id);
+       if (tzid) free(tzid);
+///////////////////////////////////////
+
        if (ret < 0)
        {
                ERR("alarmmgr_add_alarm_appsvc failed (%d)", ret);