4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Venkatesha Sarpangala <sarpangala.v@samsung.com>, Jayoun Lee <airjany@samsung.com>,
7 * Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
32 #if !GLIB_CHECK_VERSION (2, 31, 0)
33 #include <glib/gmacros.h>
36 #include"alarm-internal.h"
38 #define SIG_TIMER 0x32
40 #define MAX_GCONF_PATH_LEN 256
41 #define MAX_QUERY_LEN 4096
43 extern __alarm_server_context_t alarm_context;
44 extern GSList *alarmmgr_db_list;
45 bool _save_alarms(__alarm_info_t *__alarm_info);
46 bool _update_alarms(__alarm_info_t *__alarm_info);
47 bool _delete_alarms(alarm_id_t alarm_id, const char *zone);
48 bool _load_alarms_from_registry(void);
50 static gint _find_zone_alarmmgr_db(void *db_info, void *data)
52 _zone_alarm_db_list_t *db_struct = (_zone_alarm_db_list_t *)db_info;
53 return strcmp(db_struct->zone, (char *)data);
56 static sqlite3 *_find_db(const char *zone)
58 sqlite3 *alarmmgr_db = NULL;
59 GSList *iter = g_slist_find_custom(alarmmgr_db_list, zone, (GCompareFunc)_find_zone_alarmmgr_db);
61 SECURE_LOGE("failed to find db for zone[%s]", zone);
64 alarmmgr_db = ((_zone_alarm_db_list_t *)iter->data)->alarmmgr_db;
69 bool _save_alarms(__alarm_info_t *__alarm_info)
71 char *error_message = NULL;
72 alarm_info_t *alarm_info =
73 (alarm_info_t *) &(__alarm_info->alarm_info);
74 alarm_date_t *start = &alarm_info->start;
75 alarm_mode_t *mode = &alarm_info->mode;
77 SECURE_LOGE("__zone %s", g_quark_to_string(__alarm_info->zone));
78 sqlite3 *alarmmgr_db = _find_db((const char *)g_quark_to_string(__alarm_info->zone));
79 if (alarmmgr_db == NULL) {
80 SECURE_LOGE("failed to retrieve db");
84 char *query = sqlite3_mprintf("insert into alarmmgr( alarm_id, start,\
85 end, pid, caller_pkgid, callee_pkgid, app_unique_name, app_service_name, app_service_name_mod, bundle, year,\
86 month, day, hour, min, sec, day_of_week, repeat,\
87 alarm_type, reserved_info, dst_service_name, dst_service_name_mod)\
88 values (%d,%d,%d,%d,%Q,%Q,%Q,%Q,%Q,%Q,%d,%d,%d,%d,%d,%d,%d,%d,\
90 __alarm_info->alarm_id,
91 (int)__alarm_info->start,
92 (int)__alarm_info->end,
94 (char *)g_quark_to_string(__alarm_info->quark_caller_pkgid),
95 (char *)g_quark_to_string(__alarm_info->quark_callee_pkgid),
96 (char *)g_quark_to_string(
97 __alarm_info->quark_app_unique_name),
98 (char *)g_quark_to_string(
99 __alarm_info->quark_app_service_name),
100 (char *)g_quark_to_string(
101 __alarm_info->quark_app_service_name_mod),
102 (char *)g_quark_to_string(
103 __alarm_info->quark_bundle),
110 mode->u_interval.day_of_week,
112 alarm_info->alarm_type,
113 alarm_info->reserved_info,
114 (char *)g_quark_to_string(
115 __alarm_info->quark_dst_service_name),
116 (char *)g_quark_to_string(
117 __alarm_info->quark_dst_service_name_mod));
119 if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) {
120 SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message);
129 bool _update_alarms(__alarm_info_t *__alarm_info)
131 char *error_message = NULL;
132 alarm_info_t *alarm_info =
133 (alarm_info_t *) &(__alarm_info->alarm_info);
134 alarm_date_t *start = &alarm_info->start;
135 alarm_mode_t *mode = &alarm_info->mode;
137 sqlite3 *alarmmgr_db = _find_db((const char *)g_quark_to_string(__alarm_info->zone));
138 if (alarmmgr_db == NULL) {
139 SECURE_LOGE("failed to retrieve db");
143 char *query = sqlite3_mprintf("update alarmmgr set start=%d, end=%d,\
144 pid=%d, caller_pkgid=%Q, callee_pkgid=%Q, app_unique_name=%Q, app_service_name=%Q, app_service_name_mod=%Q,\
145 bundle=%Q, year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d,\
146 day_of_week=%d, repeat=%d, alarm_type=%d,\
147 reserved_info=%d, dst_service_name=%Q, dst_service_name_mod=%Q\
149 (int)__alarm_info->start,
150 (int)__alarm_info->end,
152 (char *)g_quark_to_string(__alarm_info->quark_caller_pkgid),
153 (char *)g_quark_to_string(__alarm_info->quark_callee_pkgid),
154 (char *)g_quark_to_string(
155 __alarm_info->quark_app_unique_name),
156 (char *)g_quark_to_string(
157 __alarm_info->quark_app_service_name),
158 (char *)g_quark_to_string(
159 __alarm_info->quark_app_service_name_mod),
160 (char *)g_quark_to_string(
161 __alarm_info->quark_bundle),
168 mode->u_interval.day_of_week,
170 alarm_info->alarm_type,
171 alarm_info->reserved_info,
172 (char *)g_quark_to_string(
173 __alarm_info->quark_dst_service_name),
174 (char *)g_quark_to_string(
175 __alarm_info->quark_dst_service_name_mod),
176 __alarm_info->alarm_id);
178 if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) {
179 SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message);
188 bool _delete_alarms(alarm_id_t alarm_id, const char *zone)
190 char *error_message = NULL;
191 char *query = sqlite3_mprintf("delete from alarmmgr where alarm_id=%d", alarm_id);
193 sqlite3 *alarmmgr_db = _find_db(zone);
194 if (alarmmgr_db == NULL) {
195 SECURE_LOGE("failed to retrieve db");
199 if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) {
200 SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message);
209 bool _load_alarms_from_registry()
212 char query[MAX_QUERY_LEN] = {0,};
213 sqlite3_stmt *stmt = NULL;
214 const char *tail = NULL;
215 alarm_info_t *alarm_info = NULL;
216 __alarm_info_t *__alarm_info = NULL;
217 alarm_date_t *start = NULL;
218 alarm_mode_t *mode = NULL;
219 char caller_pkgid[MAX_PKG_ID_LEN] = {0,};
220 char callee_pkgid[MAX_PKG_ID_LEN] = {0,};
221 char app_unique_name[MAX_SERVICE_NAME_LEN] = {0,};
222 char app_service_name[MAX_SERVICE_NAME_LEN] = {0,};
223 char app_service_name_mod[MAX_SERVICE_NAME_LEN] = {0,};
224 char dst_service_name[MAX_SERVICE_NAME_LEN] = {0,};
225 char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = {0,};
226 char bundle[MAX_BUNDLE_NAME_LEN] = {0,};
228 snprintf(query, MAX_QUERY_LEN, "select * from alarmmgr");
231 sqlite3 *alarmmgr_db = NULL;
233 for (iter = alarmmgr_db_list; iter != NULL; iter = g_slist_next(iter)) {
234 alarmmgr_db = ((_zone_alarm_db_list_t *)iter->data)->alarmmgr_db;
235 zone = ((_zone_alarm_db_list_t *)iter->data)->zone;
237 if (SQLITE_OK != sqlite3_prepare(alarmmgr_db, query, strlen(query), &stmt, &tail)) {
238 ALARM_MGR_EXCEPTION_PRINT("sqlite3_prepare() is failed.");
241 for (i = 0; SQLITE_ROW == sqlite3_step(stmt); i++) {
242 __alarm_info = malloc(sizeof(__alarm_info_t));
244 if (G_UNLIKELY(__alarm_info == NULL)) {
245 ALARM_MGR_EXCEPTION_PRINT("Memory allocation failed.");
248 alarm_info = (alarm_info_t *) &(__alarm_info->alarm_info);
249 start = &alarm_info->start;
250 mode = &alarm_info->mode;
252 __alarm_info->alarm_id = sqlite3_column_int(stmt, 0);
253 __alarm_info->start = sqlite3_column_int(stmt, 1);
254 __alarm_info->end = sqlite3_column_int(stmt, 2);
255 __alarm_info->pid = sqlite3_column_int(stmt, 3);
257 strncpy(caller_pkgid, (const char *)sqlite3_column_text(stmt, 4),
259 strncpy(callee_pkgid, (const char *)sqlite3_column_text(stmt, 5),
261 strncpy(app_unique_name, (const char *)sqlite3_column_text(stmt, 6),
262 MAX_SERVICE_NAME_LEN - 1);
263 strncpy(app_service_name, (const char *)sqlite3_column_text(stmt, 7),
264 MAX_SERVICE_NAME_LEN - 1);
265 strncpy(app_service_name_mod, (const char *)sqlite3_column_text(stmt, 8),
266 MAX_SERVICE_NAME_LEN - 1);
267 strncpy(bundle, (const char *)sqlite3_column_text(stmt, 9),
268 MAX_BUNDLE_NAME_LEN - 1);
269 start->year = sqlite3_column_int(stmt, 10);
270 start->month = sqlite3_column_int(stmt, 11);
271 start->day = sqlite3_column_int(stmt, 12);
272 start->hour = sqlite3_column_int(stmt, 13);
273 start->min = sqlite3_column_int(stmt, 14);
274 start->sec = sqlite3_column_int(stmt, 15);
275 mode->u_interval.day_of_week = sqlite3_column_int(stmt, 16);
276 mode->repeat = sqlite3_column_int(stmt, 17);
277 alarm_info->alarm_type = sqlite3_column_int(stmt, 18);
278 alarm_info->reserved_info = sqlite3_column_int(stmt, 19);
279 strncpy(dst_service_name, (const char *)sqlite3_column_text(stmt, 20),
280 MAX_SERVICE_NAME_LEN - 1);
281 strncpy(dst_service_name_mod, (const char *)sqlite3_column_text(stmt, 21),
282 MAX_SERVICE_NAME_LEN - 1);
284 __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
285 __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid);
286 __alarm_info->quark_app_unique_name =
287 g_quark_from_string(app_unique_name);
288 __alarm_info->quark_app_service_name =
289 g_quark_from_string(app_service_name);
290 __alarm_info->quark_app_service_name_mod=
291 g_quark_from_string(app_service_name_mod);
292 __alarm_info->quark_dst_service_name =
293 g_quark_from_string(dst_service_name);
294 __alarm_info->quark_dst_service_name_mod=
295 g_quark_from_string(dst_service_name_mod);
296 __alarm_info->quark_bundle = g_quark_from_string(bundle);
297 __alarm_info->zone = g_quark_from_string(zone);
299 _alarm_next_duetime(__alarm_info);
300 alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info);
303 if (SQLITE_OK != sqlite3_finalize(stmt)) {
304 ALARM_MGR_EXCEPTION_PRINT("sqlite3_finalize() is failed.");
311 if (SQLITE_OK != sqlite3_finalize(stmt)) {
312 ALARM_MGR_EXCEPTION_PRINT("sqlite3_finalize() is failed.");