3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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.
21 #include <glib-object.h>
22 #include <glib/gprintf.h>
23 #include <vconf-keys.h>
28 #include "plugin/platform_monitor_interface.h"
30 //#include "slp_callback.h"
32 /* for alarm service */
33 //#include "slp_alarm.h"
34 #include "plugin_slp_sysnoti_alarm.h"
37 #include "utility/sync_util.h"
40 #define EXPORT_API __attribute__ ((visibility("default")))
43 #ifndef SYNC_AGENT_LOG
45 #define LOG_TAG "PLUGIN_PM_SYSNOTI_ALARM"
48 static int _convert_service_time(char *temp_time, alarm_date_t * out_time);
49 static int _convert_fw_time(alarm_date_t * temp_time, char **out_time);
51 EXPORT_API void sync_agent_plugin_init_service_noti(void *data)
55 retm_if(data == NULL, "data is NULL. FAIL !!!");
57 sync_agent_pm_register_data_s *reg_data = (sync_agent_pm_register_data_s *) data;
58 if (reg_data == NULL) {
59 _DEBUG_ERROR("data is NULL !!");
63 _DEBUG_INFO("pkg_name : %s", reg_data->pkg_name);
65 int ret = alarmmgr_init(reg_data->pkg_name);
66 if (ret != ALARMMGR_RESULT_SUCCESS) {
67 _DEBUG_ERROR("alarmmgr_init() failed ( err_code : %d ) !!", ret);
69 _DEBUG_INFO("alarmmgr_init() success !!");
73 if (reg_data != NULL) {
74 if (reg_data->pkg_name != NULL)
75 free(reg_data->pkg_name);
79 _DEBUG_INFO("free sync_agent_pm_register_data_s !!");
85 EXPORT_API sync_agent_pm_return_e sync_agent_plugin_unregister_service_noti(void)
89 sync_agent_pm_return_e ret = SYNC_AGENT_PM_SUCCESS;
91 /* not support destroy alarm api */
92 _DEBUG_INFO("not support destroy alarm api !!");
99 EXPORT_API sync_agent_pm_return_e sync_agent_plugin_add_service_data(void *add_data, int *added_data_id)
103 retvm_if(add_data == NULL, SYNC_AGENT_PM_FAIL, "add_data is NULL. FAIL !!!");
106 sync_agent_pm_return_e ret = SYNC_AGENT_PM_SUCCESS;
108 pmci_alarm_s *temp_add_data = (pmci_alarm_s *) add_data;
110 _DEBUG_INFO("temp_add_data start_alarm_time[%s], repeat_type[%d], repeat_value[%d], is_disposable[%d]", temp_add_data->start_alarm_time, temp_add_data->repeat_type, temp_add_data->repeat_value, temp_add_data->is_disposable);
111 int appsync_alarm = 0;
114 if(appsync_alarm == 0) {
117 /* allocate service alarm struct */
118 alarm_entry_t *service_add_data = NULL;
119 service_add_data = alarmmgr_create_alarm();
120 if (service_add_data == NULL)
123 /* convert fw struct to service struct */
125 /* setting start alarm time */
126 if (temp_add_data->start_alarm_time != NULL) {
127 alarm_date_t expire_time;
128 memset(&expire_time, 0x00, sizeof(alarm_date_t));
129 err = _convert_service_time(temp_add_data->start_alarm_time, &expire_time);
131 _DEBUG_ERROR("__convert_alarm_time() failed (err_code : %d ) !!", err);
133 err = alarmmgr_set_time(service_add_data, expire_time);
134 if (err != ALARMMGR_RESULT_SUCCESS)
135 _DEBUG_ERROR("alarmmgr_set_time() failed ( err_code : %d ) !!", err);
138 /* setting repeat mode and repeat value */
139 alarm_repeat_mode_t repeat_mode = 0;
140 if (temp_add_data->repeat_type != REPEAT_NO_TYPE) {
141 switch (temp_add_data->repeat_type) {
143 repeat_mode = ALARM_REPEAT_MODE_ONCE;
146 repeat_mode = ALARM_REPEAT_MODE_REPEAT;
149 repeat_mode = ALARM_REPEAT_MODE_WEEKLY;
152 repeat_mode = ALARM_REPEAT_MODE_MONTHLY;
154 case REPEAT_ANNUALLY:
155 repeat_mode = ALARM_REPEAT_MODE_ANNUALLY;
162 alarm_day_of_week_t repeat_value = 0;
163 if (temp_add_data->repeat_value != DAY_NO_TYPE) {
164 switch (temp_add_data->repeat_type) {
168 repeat_value = temp_add_data->repeat_value;
171 case REPEAT_ANNUALLY:
179 for (i = 1; i <= DAY_CNT; i++) {
180 tmp = (temp_add_data->repeat_value >> i);
183 repeat_value |= ALARM_WDAY_SUNDAY;
186 repeat_value |= ALARM_WDAY_MONDAY;
189 repeat_value |= ALARM_WDAY_TUESDAY;
192 repeat_value |= ALARM_WDAY_WEDNESDAY;
195 repeat_value |= ALARM_WDAY_THURSDAY;
198 repeat_value |= ALARM_WDAY_FRIDAY;
201 repeat_value |= ALARM_WDAY_SATURDAY;
216 err = alarmmgr_set_repeat_mode(service_add_data, repeat_mode, repeat_value);
217 if (err != ALARMMGR_RESULT_SUCCESS)
218 _DEBUG_ERROR("alarmmgr_set_repeat_mode() failed ( err_code : %d ) !!", err);
222 if (temp_add_data->is_disposable != 0) {
223 alarm_type = ALARM_TYPE_VOLATILE;
225 alarm_type = ALARM_TYPE_DEFAULT;
228 err = alarmmgr_set_type(service_add_data, alarm_type);
229 if (err != ALARMMGR_RESULT_SUCCESS)
230 _DEBUG_ERROR("alarmmgr_set_type() failed ( err_code : %d ) !!", err);
232 /* insert add alarm item */
234 int result = alarmmgr_add_alarm_with_localtime(service_add_data, 0, &alarm_id);
235 if (result != ALARMMGR_RESULT_SUCCESS) {
236 _DEBUG_ERROR("alarmmgr_add_alarm() failed ( err_code : %d ) !!", result);
239 _DEBUG_INFO("alarmmgr_add_alarm() success ( alarm_id : %d ) !!", alarm_id);
240 *added_data_id = alarm_id;
244 if (service_add_data != NULL)
245 alarmmgr_free_alarm(service_add_data);
250 ret = SYNC_AGENT_PM_FAIL;
252 ret = SYNC_AGENT_PM_SUCCESS;
260 EXPORT_API sync_agent_pm_return_e sync_agent_plugin_remove_service_data(int remove_data_id)
264 sync_agent_pm_return_e ret = SYNC_AGENT_PM_SUCCESS;
266 int result = alarmmgr_remove_alarm(remove_data_id);
267 if (result != ALARMMGR_RESULT_SUCCESS) {
268 _DEBUG_ERROR("alarmmgr_remove_alarm() failed ( err_code : %d ) !!", result);
269 ret = SYNC_AGENT_PM_FAIL;
271 _DEBUG_INFO("alarmmgr_remove_alarm() success !!");
279 EXPORT_API sync_agent_pm_return_e sync_agent_plugin_get_service_data(int get_data_id, void **service_data)
283 sync_agent_pm_return_e ret = SYNC_AGENT_PM_SUCCESS;
285 alarm_entry_t *alarm = alarmmgr_create_alarm();
286 int result = alarmmgr_get_info(get_data_id, alarm);
287 if (result != ALARMMGR_RESULT_SUCCESS) {
288 _DEBUG_ERROR("alarmmgr_get_info() failed ( err_code : %d ) !!", result);
289 result = alarmmgr_free_alarm(alarm);
290 return SYNC_AGENT_PM_FAIL;
294 pmci_alarm_s *agent_alarm_info = (pmci_alarm_s *) calloc(1, sizeof(pmci_alarm_s));
295 if (agent_alarm_info == NULL) {
296 _DEBUG_ERROR("calloc failed !!!");
297 return SYNC_AGENT_PM_FAIL;
301 result = alarmmgr_get_type(alarm, &alarm_type);
302 if (result != ALARMMGR_RESULT_SUCCESS) {
303 _DEBUG_ERROR("alarmmgr_get_type() failed ( err_code : %d ) !!", result);
304 return SYNC_AGENT_PM_FAIL;
306 _DEBUG_INFO("alarm_type : %d", alarm_type);
308 if (alarm_type == ALARM_TYPE_DEFAULT) {
309 agent_alarm_info->is_disposable = false;
311 agent_alarm_info->is_disposable = true;
314 alarm_repeat_mode_t repeat_mode;
315 alarm_day_of_week_t repeat_value;
316 result = alarmmgr_get_repeat_mode(alarm, &repeat_mode, (int *)(&repeat_value));
317 if (result != ALARMMGR_RESULT_SUCCESS) {
318 _DEBUG_ERROR("alarmmgr_get_repeat_mode() failed ( err_code : %d ) !!", result);
319 return SYNC_AGENT_PM_FAIL;
321 _DEBUG_INFO("repeat_mode : %d, repeat_value : %d", repeat_mode, repeat_value);
323 switch (repeat_mode) {
324 case ALARM_REPEAT_MODE_ONCE:
326 _DEBUG_INFO("ALARM_REPEAT_ONCE");
327 agent_alarm_info->repeat_type = ONCE;
328 agent_alarm_info->repeat_value = repeat_value;
331 case ALARM_REPEAT_MODE_REPEAT:
333 _DEBUG_INFO("ALARM_REPEAT_MODE_REPEAT");
334 agent_alarm_info->repeat_type = REPEAT;
335 agent_alarm_info->repeat_value = repeat_value;
338 case ALARM_REPEAT_MODE_WEEKLY:
339 case ALARM_REPEAT_MODE_MONTHLY:
340 case ALARM_REPEAT_MODE_ANNUALLY:
342 _DEBUG_INFO("ALARM_REPEAT_MODE_WEEKLY, MONTHLY, ANNUALLY");
347 for (i = 1; i <= DAY_CNT; i++) {
348 tmp = (repeat_value >> i);
351 agent_alarm_info->repeat_value |= DAY_SUN;
354 agent_alarm_info->repeat_value |= DAY_MON;
357 agent_alarm_info->repeat_value |= DAY_TUE;
360 agent_alarm_info->repeat_value |= DAY_WED;
363 agent_alarm_info->repeat_value |= DAY_THU;
366 agent_alarm_info->repeat_value |= DAY_FRI;
369 agent_alarm_info->repeat_value |= DAY_SAT;
382 alarm_date_t alarm_time;
383 result = alarmmgr_get_time(alarm, &alarm_time);
384 if (result != ALARMMGR_RESULT_SUCCESS) {
385 _DEBUG_ERROR("alarmmgr_get_info() failed ( err_code : %d ) !!", result);
386 return SYNC_AGENT_PM_FAIL;
389 char *alarm_time_s = NULL;
390 _convert_fw_time(&alarm_time, &alarm_time_s);
391 _DEBUG_INFO("alarm_time_s : %s", alarm_time_s);
392 agent_alarm_info->start_alarm_time = alarm_time_s;
394 *service_data = agent_alarm_info;
397 alarmmgr_free_alarm(alarm);
404 EXPORT_API void sync_agent_plugin_set_user_callback(int callback_counts, va_list list)
408 int result = ALARMMGR_RESULT_SUCCESS;
411 for (; i < callback_counts; i++) {
412 result = alarmmgr_set_cb(va_arg(list, sync_agent_user_callback_cb_plugin), 0);
413 if (result != ALARMMGR_RESULT_SUCCESS) {
414 _DEBUG_ERROR("alarmmgr_set_cb() failed ( err_code : %d ) !!", result);
416 _DEBUG_INFO("alarmmgr_set_cb() success !!");
423 static int _convert_service_time(char *temp_time, alarm_date_t * out_time)
427 retvm_if(temp_time == NULL, 0, "temp_time is NULL. FAIL !!!");
429 _DEBUG_TRACE("temp_time = %s", temp_time);
431 char *delimiter = "-";
433 char *day_ptr = strstr(temp_time, "T");
434 if(day_ptr == NULL) {
435 _DEBUG_TRACE("day_ptr is NULL!!");
438 _DEBUG_TRACE("Day_ptr = %s", day_ptr);
440 int length1 = strlen(day_ptr);
441 _DEBUG_TRACE("length1 = %d", length1);
443 char *day = (char *)calloc(length1 + 1, sizeof(char));
445 _DEBUG_ERROR("calloc fail !!");
448 strncpy(day, temp_time, length1);
449 _DEBUG_TRACE("Day = %s", day);
452 char *ptr = strtok(day, delimiter);
457 _DEBUG_TRACE("Year = %s\n", ptr);
458 (out_time)->year = atoi(ptr);
461 ptr = strtok(0, delimiter);
466 _DEBUG_TRACE("Month = %s\n", ptr);
467 (out_time)->month = atoi(ptr);
470 ptr = strtok(0, delimiter);
475 _DEBUG_TRACE("Day = %s\n", ptr);
476 (out_time)->day = atoi(ptr);
481 char *time_ptr = strstr(day_ptr, "Z");
482 _DEBUG_TRACE("time_ptr = %s", time_ptr);
484 int length2 = strlen(temp_time) - strlen(day_ptr) - 2;
485 _DEBUG_TRACE("length2 = %d", length2);
487 char *time = (char *)calloc(length2, sizeof(char));
489 _DEBUG_ERROR("calloc fail !!");
492 strncpy(time, day_ptr + 1, length2);
493 _DEBUG_TRACE("Time = %s", time);
497 ptr = strtok(time, delimiter);
502 _DEBUG_TRACE("hour = %s\n", ptr);
503 (out_time)->hour = atoi(ptr);
506 ptr = strtok(0, delimiter);
511 _DEBUG_TRACE("min = %s\n", ptr);
512 (out_time)->min = atoi(ptr);
515 ptr = strtok(0, delimiter);
520 _DEBUG_TRACE("sec = %s\n", ptr);
521 (out_time)->sec = atoi(ptr);
531 static int _convert_fw_time(alarm_date_t * temp_time, char **out_time)
535 retvm_if(temp_time == NULL, 0, "temp_time is NULL. FAIL !!!");
537 *out_time = g_strdup_printf("%.2d-%.2d-%.2dT%.2d:%.2d:%.2dZ", temp_time->year, temp_time->month, temp_time->day, temp_time->hour, temp_time->min, temp_time->sec);
538 _DEBUG_TRACE("out_time = %s\n", *out_time);