4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Seungtaek Chung <seungtaek.chung@samsung.com>, Mi-Ju Lee <miju52.lee@samsung.com>, Xi Zhichan <zhichan.xi@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
26 #include <package_manager.h>
27 #include <pkgmgr-info.h>
28 #include <tizen_type.h>
30 #include <notification.h>
31 #include <notification_db.h>
32 #include <notification_list.h>
33 #include <notification_noti.h>
34 #include <notification_debug.h>
35 #include <notification_ipc.h>
36 #include <notification_private.h>
37 #include <notification_setting.h>
38 #include <notification_setting_internal.h>
40 #define NOTIFICATION_PRIVILEGE "http://tizen.org/privilege/notification"
43 static int _get_table_field_data_int(char **table, int *buf, int index)
45 if ((table == NULL) || (buf == NULL) || (index < 0)) {
46 NOTIFICATION_ERR("table[%p], buf[%p], index[%d]", table, buf, index);
50 if (table[index] != NULL) {
51 *buf = atoi(table[index]);
59 static int _get_table_field_data_string(char **table, char **buf, int ucs2, int index)
63 if ((table == NULL) || (buf == NULL) || (index < 0)) {
64 NOTIFICATION_ERR("table[%p], buf[%p], index[%d]", table, buf, index);
68 char *pTemp = table[index];
75 *buf = (char *) malloc(sLen + 1);
77 NOTIFICATION_ERR("malloc is failed");
80 memset(*buf, 0, sLen + 1);
81 strncpy(*buf, pTemp, sLen);
95 EXPORT_API int notification_setting_get_setting_array(notification_setting_h *setting_array, int *count)
97 int err = NOTIFICATION_ERROR_NONE;
98 sqlite3 *local_db_handle = NULL;
99 char *sql_query = NULL;
100 char **query_result = NULL;
103 int column_count = 0;
106 notification_setting_h result_setting_array= NULL;
108 if (setting_array == NULL || count == NULL) {
109 NOTIFICATION_ERR("NOTIFICATION_ERROR_INVALID_PARAMETER");
110 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
114 sql_return = db_util_open(DBPATH, &local_db_handle, 0);
116 if (sql_return != SQLITE_OK || local_db_handle == NULL) {
117 NOTIFICATION_ERR("db_util_open failed [%d]", sql_return);
118 err = NOTIFICATION_ERROR_FROM_DB;
122 sql_query = sqlite3_mprintf("SELECT package_name, allow_to_notify, do_not_disturb_except, visibility_class "
124 "ORDER BY package_name", NOTIFICATION_SETTING_DB_TABLE);
127 NOTIFICATION_ERR("fail to alloc query");
128 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
132 sql_return = sqlite3_get_table(local_db_handle, sql_query, &query_result, &row_count, &column_count, NULL);
134 if (sql_return != SQLITE_OK && sql_return != -1) {
135 NOTIFICATION_ERR("NOTIFICATION_ERROR_FROM_DB failed [%d][%s]", sql_return, sql_query);
136 err = NOTIFICATION_ERROR_FROM_DB;
141 NOTIFICATION_DBG ("No setting found...");
142 err= NOTIFICATION_ERROR_NOT_EXIST_ID;
146 NOTIFICATION_DBG ("row_count [%d] column_count [%d]", row_count, column_count);
147 if (!(result_setting_array = (struct notification_setting*)malloc(sizeof(struct notification_setting) * row_count))) {
148 NOTIFICATION_ERR("malloc failed...");
149 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
153 col_index = column_count;
155 for (i = 0; i < row_count; i++) {
156 _get_table_field_data_string(query_result, &(result_setting_array[i].package_name), 1, col_index++);
157 _get_table_field_data_int(query_result, (int*)&(result_setting_array[i].allow_to_notify), col_index++);
158 _get_table_field_data_int(query_result, (int*)&(result_setting_array[i].do_not_disturb_except), col_index++);
159 _get_table_field_data_int(query_result, &(result_setting_array[i].visibility_class), col_index++);
162 *setting_array = result_setting_array;
167 sqlite3_free_table(query_result);
170 sqlite3_free(sql_query);
172 if (local_db_handle) {
173 sql_return = db_util_close(local_db_handle);
174 if (sql_return != SQLITE_OK) {
175 NOTIFICATION_WARN("fail to db_util_close - [%d]", sql_return);
182 EXPORT_API int notification_setting_get_setting_by_package_name(const char *package_name, notification_setting_h *setting)
184 int err = NOTIFICATION_ERROR_NONE;
185 sqlite3 *local_db_handle = NULL;
186 char *sql_query = NULL;
187 char **query_result = NULL;
190 int column_count = 0;
193 notification_setting_h result_setting_array= NULL;
195 if (package_name == NULL || setting == NULL) {
196 NOTIFICATION_ERR("NOTIFICATION_ERROR_INVALID_PARAMETER");
197 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
201 sql_return = db_util_open(DBPATH, &local_db_handle, 0);
203 if (sql_return != SQLITE_OK || local_db_handle == NULL) {
204 NOTIFICATION_ERR("db_util_open failed [%d]", sql_return);
205 err = NOTIFICATION_ERROR_FROM_DB;
209 sql_query = sqlite3_mprintf("SELECT package_name, allow_to_notify, do_not_disturb_except, visibility_class "
211 "WHERE package_name = %Q ", NOTIFICATION_SETTING_DB_TABLE, package_name);
214 NOTIFICATION_ERR("fail to alloc query");
215 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
219 sql_return = sqlite3_get_table(local_db_handle, sql_query, &query_result, &row_count, &column_count, NULL);
221 if (sql_return != SQLITE_OK && sql_return != -1) {
222 NOTIFICATION_ERR("sqlite3_get_table failed [%d][%s]", sql_return, sql_query);
223 err = NOTIFICATION_ERROR_FROM_DB;
228 NOTIFICATION_DBG ("No setting found for [%s]", package_name);
229 err= NOTIFICATION_ERROR_NOT_EXIST_ID;
233 NOTIFICATION_DBG ("row_count [%d] column_count [%d]", row_count, column_count);
237 if (!(result_setting_array = (struct notification_setting*)malloc(sizeof(struct notification_setting) * row_count))) {
238 NOTIFICATION_ERR("malloc failed...");
239 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
243 col_index = column_count;
245 _get_table_field_data_string(query_result, &(result_setting_array[i].package_name), 1, col_index++);
246 _get_table_field_data_int(query_result, (int*)&(result_setting_array[i].allow_to_notify), col_index++);
247 _get_table_field_data_int(query_result, (int*)&(result_setting_array[i].do_not_disturb_except), col_index++);
248 _get_table_field_data_int(query_result, &(result_setting_array[i].visibility_class), col_index++);
250 *setting = result_setting_array;
254 sqlite3_free_table(query_result);
257 sqlite3_free(sql_query);
259 if (local_db_handle) {
260 sql_return = db_util_close(local_db_handle);
261 if (sql_return != SQLITE_OK) {
262 NOTIFICATION_WARN("fail to db_util_close - [%d]", sql_return);
269 EXPORT_API int notification_setting_get_setting(notification_setting_h *setting)
272 char *package_name = NULL;
274 package_name = notification_get_pkgname_by_pid();
276 if (package_name == NULL)
277 return NOTIFICATION_ERROR_NOT_EXIST_ID;
279 ret = notification_setting_get_setting_by_package_name(package_name, setting);
286 EXPORT_API int notification_setting_get_package_name(notification_setting_h setting, char **value)
288 int err = NOTIFICATION_ERROR_NONE;
290 if (setting == NULL || value == NULL) {
291 NOTIFICATION_ERR("Invalid parameter\n");
292 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
296 if (setting->package_name == NULL) {
297 NOTIFICATION_ERR("setting->package_name is null\n");
298 err = NOTIFICATION_ERROR_NOT_EXIST_ID;
302 *value = SAFE_STRDUP(setting->package_name);
309 EXPORT_API int notification_setting_set_package_name(notification_setting_h setting, char *value)
311 int err = NOTIFICATION_ERROR_NONE;
313 if (setting == NULL || value == NULL) {
314 NOTIFICATION_ERR("Invalid parameter\n");
315 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
319 if (setting->package_name != NULL) {
320 free(setting->package_name);
323 setting->package_name = SAFE_STRDUP(value);
330 EXPORT_API int notification_setting_get_allow_to_notify(notification_setting_h setting, bool *value)
332 int err = NOTIFICATION_ERROR_NONE;
334 if (setting == NULL || value == NULL) {
335 NOTIFICATION_ERR("Invalid parameter\n");
336 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
340 *value = setting->allow_to_notify;
347 EXPORT_API int notification_setting_set_allow_to_notify(notification_setting_h setting, bool value)
349 int err = NOTIFICATION_ERROR_NONE;
351 if (setting == NULL) {
352 NOTIFICATION_ERR("Invalid parameter\n");
353 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
357 setting->allow_to_notify = value;
364 EXPORT_API int notification_setting_get_do_not_disturb_except(notification_setting_h setting, bool *value)
366 int err = NOTIFICATION_ERROR_NONE;
368 if (setting == NULL || value == NULL) {
369 NOTIFICATION_ERR("Invalid parameter\n");
370 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
374 *value = setting->do_not_disturb_except;
381 EXPORT_API int notification_setting_set_do_not_disturb_except(notification_setting_h setting, bool value)
383 int err = NOTIFICATION_ERROR_NONE;
385 if (setting == NULL) {
386 NOTIFICATION_ERR("Invalid parameter\n");
387 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
391 setting->do_not_disturb_except = value;
398 EXPORT_API int notification_setting_get_visibility_class(notification_setting_h setting, int *value)
400 int err = NOTIFICATION_ERROR_NONE;
402 if (setting == NULL || value == NULL) {
403 NOTIFICATION_ERR("Invalid parameter\n");
404 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
408 *value = setting->visibility_class;
415 EXPORT_API int notification_setting_set_visibility_class(notification_setting_h setting, int value)
417 int err = NOTIFICATION_ERROR_NONE;
419 if (setting == NULL) {
420 NOTIFICATION_ERR("Invalid parameter\n");
421 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
425 setting->visibility_class = value;
432 EXPORT_API int notification_setting_update_setting(notification_setting_h setting)
434 int err = NOTIFICATION_ERROR_NONE;
436 if (setting == NULL) {
437 NOTIFICATION_ERR("Invalid parameter\n");
438 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
442 err = notification_ipc_update_setting(setting);
443 if (err != NOTIFICATION_ERROR_NONE) {
444 NOTIFICATION_ERR("notification_setting_update_setting returns[%d]\n", err);
452 EXPORT_API int notification_setting_free_notification(notification_setting_h setting)
454 int err = NOTIFICATION_ERROR_NONE;
456 if (setting == NULL) {
457 NOTIFICATION_ERR("Invalid parameter\n");
458 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
462 SAFE_FREE(setting->package_name);
464 /* add codes to free all properties */
472 EXPORT_API int notification_setting_db_update(const char *package_name, int allow_to_notify, int do_not_disturb_except, int visibility_class)
474 int err = NOTIFICATION_ERROR_NONE;
479 if (package_name == NULL)
480 return NOTIFICATION_ERROR_INVALID_PARAMETER;
482 sqlret = db_util_open(DBPATH, &db, 0);
483 if (sqlret != SQLITE_OK || db == NULL) {
484 NOTIFICATION_ERR("db_util_open failed [%s][%d]", DBPATH, sqlret);
485 return NOTIFICATION_ERROR_FROM_DB;
488 sqlbuf = sqlite3_mprintf("UPDATE %s SET allow_to_notify = %d, do_not_disturb_except = %d, visibility_class = %d " \
489 "WHERE package_name = %Q",
490 NOTIFICATION_SETTING_DB_TABLE, allow_to_notify, do_not_disturb_except, visibility_class, package_name);
492 NOTIFICATION_ERR("fail to alloc query");
493 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
494 goto return_close_db;
497 err = notification_db_exec(db, sqlbuf, NULL);
501 sqlite3_free(sqlbuf);
503 sqlret = db_util_close(db);
504 if (sqlret != SQLITE_OK) {
505 NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
511 static bool _is_package_in_setting_table(sqlite3 *db, const char *package_name)
513 sqlite3_stmt *db_statement = NULL;
514 int sqlite3_ret = SQLITE_OK;
518 sqlite3_ret = sqlite3_prepare_v2(db, "SELECT package_name FROM notification_setting WHERE package_name = ?", -1, &db_statement, NULL);
520 if (sqlite3_ret != SQLITE_OK) {
521 NOTIFICATION_ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db));
526 sqlite3_bind_text(db_statement, field_index++, package_name, -1, SQLITE_TRANSIENT);
528 sqlite3_ret = sqlite3_step(db_statement);
530 if (sqlite3_ret == SQLITE_DONE) {
531 NOTIFICATION_INFO("no matched package_name found[%s][%d]", package_name, sqlite3_ret);
536 if (sqlite3_ret != SQLITE_OK && sqlite3_ret != SQLITE_ROW) {
537 NOTIFICATION_ERR("sqlite3_step failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db));
543 sqlite3_finalize(db_statement);
549 static int foreach_package_info_callback(const pkgmgrinfo_pkginfo_h package_info, void *user_data)
551 sqlite3 *db = user_data;
552 sqlite3_stmt *db_statement = NULL;
553 char *package_name = NULL;
554 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
555 int sqlite3_ret = SQLITE_OK;
559 if ((pkgmgr_ret = pkgmgrinfo_pkginfo_get_pkgname(package_info, &package_name)) != PACKAGE_MANAGER_ERROR_NONE) {
560 NOTIFICATION_ERR("package_info_get_package failed [%d]", pkgmgr_ret);
565 if (_is_package_in_setting_table(db, package_name) == true) {
566 NOTIFICATION_INFO("[%s] is exist", package_name);
570 NOTIFICATION_INFO("[%s] will be inserted", package_name);
572 sqlite3_ret = sqlite3_prepare_v2(db, "INSERT INTO notification_setting (package_name) VALUES (?) ", -1, &db_statement, NULL);
574 if (sqlite3_ret != SQLITE_OK) {
575 NOTIFICATION_ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db));
580 sqlite3_bind_text(db_statement, field_index++, package_name, -1, SQLITE_TRANSIENT);
582 sqlite3_ret = sqlite3_step(db_statement);
584 NOTIFICATION_INFO("sqlite3_step returns[%d]", sqlite3_ret);
586 if (sqlite3_ret != SQLITE_OK && sqlite3_ret != SQLITE_DONE) {
587 NOTIFICATION_ERR("sqlite3_step failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db));
593 sqlite3_finalize(db_statement);
596 NOTIFICATION_INFO("foreach_package_info_callback returns[%d]", err);
600 EXPORT_API int notification_setting_refresh_setting_table()
602 int err = NOTIFICATION_ERROR_NONE;
604 int sqlite3_ret = SQLITE_OK;
605 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
606 pkgmgrinfo_pkginfo_filter_h filter;
609 sqlite3_ret = db_util_open(DBPATH, &db, 0);
611 if (sqlite3_ret != SQLITE_OK || db == NULL) {
612 NOTIFICATION_ERR("db_util_open failed [%s][%d]", DBPATH, sqlite3_ret);
613 err = NOTIFICATION_ERROR_FROM_DB;
617 sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
619 pkgmgr_ret = pkgmgrinfo_pkginfo_filter_create(&filter);
620 if (pkgmgr_ret != PMINFO_R_OK) {
621 NOTIFICATION_ERR("pkgmgrinfo_pkginfo_filter_create failed [%d]", pkgmgr_ret);
622 err = NOTIFICATION_ERROR_FROM_DB;
626 pkgmgr_ret = pkgmgrinfo_pkginfo_filter_add_string(filter, PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE, NOTIFICATION_PRIVILEGE);
627 if (pkgmgr_ret != PMINFO_R_OK) {
628 NOTIFICATION_ERR("pkgmgrinfo_pkginfo_filter_add_string failed [%d]", pkgmgr_ret);
629 err = NOTIFICATION_ERROR_FROM_DB;
633 current_uid = getuid();
635 pkgmgr_ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(filter, foreach_package_info_callback, db, current_uid);
636 if (pkgmgr_ret != PMINFO_R_OK) {
637 NOTIFICATION_ERR("pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo failed [%d]", pkgmgr_ret);
638 err = NOTIFICATION_ERROR_FROM_DB;
642 pkgmgrinfo_pkginfo_filter_destroy(filter);
648 if (err == NOTIFICATION_ERROR_NONE) {
649 sqlite3_exec(db, "END;", NULL, NULL, NULL);
652 sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
655 if ((sqlite3_ret = db_util_close(db)) != SQLITE_OK) {
656 NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlite3_ret);
660 NOTIFICATION_INFO("notification_setting_refresh_setting_table returns [%08X]", err);
666 OPERATION_TYPE_INSERT_RECORD = 0,
667 OPERATION_TYPE_DELETE_RECORD = 1,
668 } notification_setting_operation_type;
670 static int _notification_setting_alter_package_list(notification_setting_operation_type operation_type, const char *package_name)
673 sqlite3_stmt *db_statement = NULL;
674 int sqlite3_ret = SQLITE_OK;
676 bool is_package_in_setting_table = false;
677 int err = NOTIFICATION_ERROR_NONE;
679 sqlite3_ret = db_util_open(DBPATH, &db, 0);
681 if (sqlite3_ret != SQLITE_OK || db == NULL) {
682 NOTIFICATION_ERR("db_util_open failed [%s][%d]", DBPATH, sqlite3_ret);
683 err = NOTIFICATION_ERROR_FROM_DB;
687 sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
689 is_package_in_setting_table = _is_package_in_setting_table(db, package_name);
691 switch (operation_type) {
692 case OPERATION_TYPE_INSERT_RECORD :
693 if (is_package_in_setting_table == true) {
694 NOTIFICATION_INFO("[%s] is already exist", package_name);
697 NOTIFICATION_INFO("[%s] will be inserted", package_name);
698 sqlite3_ret = sqlite3_prepare_v2(db, "INSERT INTO notification_setting (package_name) VALUES (?) ", -1, &db_statement, NULL);
701 case OPERATION_TYPE_DELETE_RECORD :
702 if (is_package_in_setting_table == false) {
703 NOTIFICATION_INFO("[%s] is not exist", package_name);
706 NOTIFICATION_INFO("[%s] will be removed", package_name);
707 sqlite3_ret = sqlite3_prepare_v2(db, "DELETE FROM notification_setting WHERE package_name = ? ", -1, &db_statement, NULL);
713 if (sqlite3_ret != SQLITE_OK) {
714 NOTIFICATION_ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db));
715 err = NOTIFICATION_ERROR_FROM_DB;
719 sqlite3_bind_text(db_statement, field_index++, package_name, -1, SQLITE_TRANSIENT);
721 sqlite3_ret = sqlite3_step(db_statement);
723 if (sqlite3_ret != SQLITE_OK && sqlite3_ret != SQLITE_DONE) {
724 NOTIFICATION_ERR("sqlite3_step failed [%d][%s]", sqlite3_ret, sqlite3_errmsg(db));
725 err = NOTIFICATION_ERROR_FROM_DB;
730 sqlite3_finalize(db_statement);
734 NOTIFICATION_INFO("err [%d]", err);
735 if (err == NOTIFICATION_ERROR_NONE) {
736 sqlite3_exec(db, "END;", NULL, NULL, NULL);
739 sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
742 if ((sqlite3_ret = db_util_close(db)) != SQLITE_OK) {
743 NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlite3_ret);
750 bool privilege_info_cb(const char *privilege_name, void *user_data)
752 bool *found = user_data;
754 if (privilege_name && strcmp(NOTIFICATION_PRIVILEGE, privilege_name) == 0) {
762 static bool _has_privilege(const char *package_id)
765 int error_from_package_info = PACKAGE_MANAGER_ERROR_NONE;
766 package_info_h package_info = NULL;
768 error_from_package_info = package_info_create(package_id, &package_info);
769 if (error_from_package_info != PACKAGE_MANAGER_ERROR_NONE) {
770 NOTIFICATION_ERR("package_info_create failed [%d]", error_from_package_info);
774 error_from_package_info = package_info_foreach_privilege_info(package_info, privilege_info_cb, &found);
776 if (error_from_package_info != PACKAGE_MANAGER_ERROR_NONE) {
777 NOTIFICATION_ERR("package_info_foreach_privilege_info failed [%d]", error_from_package_info);
784 package_info_destroy(package_info);
790 EXPORT_API int notification_setting_insert_package(const char *package_id)
792 int err = NOTIFICATION_ERROR_NONE;
794 if (_has_privilege(package_id) == true) {
795 err = _notification_setting_alter_package_list(OPERATION_TYPE_INSERT_RECORD, package_id);
801 EXPORT_API int notification_setting_delete_package(const char *package_id)
803 return _notification_setting_alter_package_list(OPERATION_TYPE_DELETE_RECORD, package_id);
806 /* system setting --------------------------------*/
808 EXPORT_API int notification_system_setting_load_system_setting(notification_system_setting_h *system_setting)
810 int err = NOTIFICATION_ERROR_NONE;
811 sqlite3 *local_db_handle = NULL;
812 char *sql_query = NULL;
813 char **query_result = NULL;
816 int column_count = 0;
818 notification_system_setting_h result_system_setting= NULL;
820 if (system_setting == NULL) {
821 NOTIFICATION_ERR("NOTIFICATION_ERROR_INVALID_PARAMETER");
822 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
826 sql_return = db_util_open(DBPATH, &local_db_handle, 0);
828 if (sql_return != SQLITE_OK || local_db_handle == NULL) {
829 NOTIFICATION_ERR("db_util_open failed [%d]", sql_return);
830 err = NOTIFICATION_ERROR_FROM_DB;
834 sql_query = sqlite3_mprintf("SELECT do_not_disturb, visibility_class "
835 "FROM %s ", NOTIFICATION_SYSTEM_SETTING_DB_TABLE);
838 NOTIFICATION_ERR("fail to alloc query");
839 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
843 sql_return = sqlite3_get_table(local_db_handle, sql_query, &query_result, &row_count, &column_count, NULL);
845 if (sql_return != SQLITE_OK && sql_return != -1) {
846 NOTIFICATION_ERR("sqlite3_get_table failed [%d][%s]", sql_return, sql_query);
847 err = NOTIFICATION_ERROR_FROM_DB;
852 NOTIFICATION_DBG ("No setting found...");
853 err= NOTIFICATION_ERROR_NOT_EXIST_ID;
857 NOTIFICATION_DBG ("row_count [%d] column_count [%d]", row_count, column_count);
861 if (!(result_system_setting = (struct notification_system_setting*)malloc(sizeof(struct notification_system_setting)))) {
862 NOTIFICATION_ERR("malloc failed...");
863 err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
867 col_index = column_count;
869 _get_table_field_data_int(query_result, (int*)&(result_system_setting->do_not_disturb), col_index++);
870 _get_table_field_data_int(query_result, &(result_system_setting->visibility_class), col_index++);
872 *system_setting = result_system_setting;
876 sqlite3_free_table(query_result);
879 sqlite3_free(sql_query);
881 if (local_db_handle) {
882 sql_return = db_util_close(local_db_handle);
883 if (sql_return != SQLITE_OK) {
884 NOTIFICATION_WARN("fail to db_util_close - [%d]", sql_return);
891 EXPORT_API int notification_system_setting_update_system_setting(notification_system_setting_h system_setting)
893 int err = NOTIFICATION_ERROR_NONE;
895 if (system_setting == NULL) {
896 NOTIFICATION_ERR("Invalid parameter\n");
897 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
901 err = notification_ipc_update_system_setting(system_setting);
902 if (err != NOTIFICATION_ERROR_NONE) {
903 NOTIFICATION_ERR("notification_ipc_update_system_setting returns[%d]\n", err);
911 EXPORT_API int notification_system_setting_free_system_setting(notification_system_setting_h system_setting)
913 int err = NOTIFICATION_ERROR_NONE;
915 if (system_setting == NULL) {
916 NOTIFICATION_ERR("Invalid parameter\n");
917 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
921 /* add codes to free all properties */
923 SAFE_FREE(system_setting);
930 EXPORT_API int notification_system_setting_get_do_not_disturb(notification_system_setting_h system_setting, bool *value)
932 int err = NOTIFICATION_ERROR_NONE;
934 if (system_setting == NULL || value == NULL) {
935 NOTIFICATION_ERR("Invalid parameter\n");
936 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
940 *value = system_setting->do_not_disturb;
947 EXPORT_API int notification_system_setting_set_do_not_disturb(notification_system_setting_h system_setting, bool value)
949 int err = NOTIFICATION_ERROR_NONE;
951 if (system_setting == NULL) {
952 NOTIFICATION_ERR("Invalid parameter\n");
953 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
957 system_setting->do_not_disturb = value;
964 EXPORT_API int notification_system_setting_get_visibility_class(notification_system_setting_h system_setting, int *value)
966 int err = NOTIFICATION_ERROR_NONE;
968 if (system_setting == NULL || value == NULL) {
969 NOTIFICATION_ERR("Invalid parameter\n");
970 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
974 *value = system_setting->visibility_class;
981 EXPORT_API int notification_system_setting_set_visibility_class(notification_system_setting_h system_setting, int value)
983 int err = NOTIFICATION_ERROR_NONE;
985 if (system_setting == NULL) {
986 NOTIFICATION_ERR("Invalid parameter\n");
987 err = NOTIFICATION_ERROR_INVALID_PARAMETER;
991 system_setting->visibility_class = value;
999 EXPORT_API int notification_setting_db_update_system_setting(int do_not_disturb, int visibility_class)
1001 int err = NOTIFICATION_ERROR_NONE;
1003 int field_index = 1;
1005 sqlite3_stmt *db_statement = NULL;
1007 sqlret = db_util_open(DBPATH, &db, 0);
1009 if (sqlret != SQLITE_OK || db == NULL) {
1010 NOTIFICATION_ERR("db_util_open failed [%s][%d][%s]", DBPATH, sqlret, sqlite3_errmsg(db));
1011 err = NOTIFICATION_ERROR_FROM_DB;
1012 goto return_close_db;
1015 sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
1017 sqlret = sqlite3_prepare_v2(db, "UPDATE notification_system_setting SET do_not_disturb = ?, visibility_class = ?;", -1, &db_statement, NULL);
1019 if (sqlret != SQLITE_OK) {
1020 NOTIFICATION_ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret, sqlite3_errmsg(db));
1021 err = NOTIFICATION_ERROR_FROM_DB;
1022 goto return_close_db;
1025 sqlite3_bind_int(db_statement, field_index++, do_not_disturb);
1026 sqlite3_bind_int(db_statement, field_index++, visibility_class);
1028 sqlret = sqlite3_step(db_statement);
1030 if (sqlret != SQLITE_OK && sqlret != SQLITE_DONE) {
1031 NOTIFICATION_ERR("sqlite3_step failed [%d][%s]", sqlret, sqlite3_errmsg(db));
1032 err = NOTIFICATION_ERROR_FROM_DB;
1033 goto return_close_db;
1036 sqlret = sqlite3_changes(db);
1039 NOTIFICATION_WARN("No changes on DB");
1044 sqlite3_finalize(db_statement);
1048 if (err == NOTIFICATION_ERROR_NONE) {
1049 sqlite3_exec(db, "END;", NULL, NULL, NULL);
1052 sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
1054 sqlret = db_util_close(db);
1057 if (sqlret != SQLITE_OK) {
1058 NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
1064 /* OLD IMPLEMENTATION ----------------------------*/
1065 #define NOTIFICATION_SETTING_DB "notification_setting"
1066 #define NOTIFICATION_SETTING_DB_PATH "/opt/usr/dbspace/.notification_parser.db"
1068 struct _notification_setting_h {
1078 const char *property;
1080 const char *default_value;
1083 static struct prop_table g_prop_table[] = {
1085 .property = "OPT_NOTIFICATION",
1086 .column = "notification",
1087 .default_value = "ON",
1090 .property = "OPT_SOUNDS",
1092 .default_value = "ON",
1095 .property = "OPT_CONTENTS",
1096 .column = "contents",
1097 .default_value = "ON",
1100 .property = "OPT_BADGE",
1102 .default_value = "ON",
1107 .default_value = NULL,
1111 static const char *_get_prop_column(const char *property)
1115 for (i = 0; g_prop_table[i].property; i++) {
1116 if (strcmp(g_prop_table[i].property, property))
1119 return g_prop_table[i].column;
1126 static const char *_get_prop_default_value(const char *property)
1130 for (i = 0; g_prop_table[i].property; i++) {
1131 if (strcmp(g_prop_table[i].property, property))
1134 return g_prop_table[i].default_value;
1141 static int _is_record_exist(const char *pkgname, sqlite3 *db)
1143 sqlite3_stmt *stmt = NULL;
1145 int result = NOTIFICATION_ERROR_NONE;
1146 char *sqlbuf = NULL;
1150 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1153 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1155 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %s WHERE " \
1157 NOTIFICATION_SETTING_DB, pkgname);
1160 NOTIFICATION_ERR("fail to alloc sql query");
1161 return NOTIFICATION_ERROR_OUT_OF_MEMORY;
1164 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
1165 if (sqlret != SQLITE_OK) {
1166 NOTIFICATION_ERR("DB err [%s]", sqlite3_errmsg(db));
1167 NOTIFICATION_ERR("query[%s]", sqlbuf);
1168 result = NOTIFICATION_ERROR_FROM_DB;
1169 goto free_and_return;
1172 sqlret = sqlite3_step(stmt);
1173 if (sqlret == SQLITE_ROW)
1174 count = sqlite3_column_int(stmt, 0);
1179 result = NOTIFICATION_ERROR_ALREADY_EXIST_ID;
1181 result = NOTIFICATION_ERROR_NOT_EXIST_ID;
1185 sqlite3_free(sqlbuf);
1188 sqlite3_finalize(stmt);
1193 EXPORT_API int notification_setting_db_set(const char *pkgname, const char *property, const char *value)
1195 int ret = NOTIFICATION_ERROR_NONE;
1196 int result = NOTIFICATION_ERROR_NONE;
1198 char *sqlbuf = NULL;
1200 const char *column = NULL;
1203 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1206 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1209 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1211 column = _get_prop_column(property);
1213 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1215 sqlret = db_util_open(NOTIFICATION_SETTING_DB_PATH, &db, 0);
1216 if (sqlret != SQLITE_OK || !db) {
1217 NOTIFICATION_ERR("fail to db_util_open - [%d]", sqlret);
1218 return NOTIFICATION_ERROR_FROM_DB;
1221 ret = _is_record_exist(pkgname, db);
1222 if (ret != NOTIFICATION_ERROR_ALREADY_EXIST_ID) {
1224 goto return_close_db;
1227 sqlbuf = sqlite3_mprintf("UPDATE %s SET %s = %Q " \
1229 NOTIFICATION_SETTING_DB, column, value, pkgname);
1231 NOTIFICATION_ERR("fail to alloc query");
1232 result = NOTIFICATION_ERROR_OUT_OF_MEMORY;
1233 goto return_close_db;
1236 result = notification_db_exec(db, sqlbuf, NULL);
1240 sqlite3_free(sqlbuf);
1242 sqlret = db_util_close(db);
1243 if (sqlret != SQLITE_OK) {
1244 NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
1250 EXPORT_API int notification_setting_db_get(const char *pkgname, const char *property, char **value)
1252 int ret = NOTIFICATION_ERROR_NONE;
1253 int result = NOTIFICATION_ERROR_NONE;
1255 char *sqlbuf = NULL;
1256 sqlite3_stmt *stmt = NULL;
1258 const char *column = NULL;
1261 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1264 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1267 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1269 column = _get_prop_column(property);
1271 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1273 sqlret = db_util_open(NOTIFICATION_SETTING_DB_PATH, &db, 0);
1274 if (sqlret != SQLITE_OK || !db) {
1275 NOTIFICATION_ERR("fail to db_util_open - [%d]", sqlret);
1276 return NOTIFICATION_ERROR_FROM_DB;
1279 ret = _is_record_exist(pkgname, db);
1280 if (ret != NOTIFICATION_ERROR_ALREADY_EXIST_ID) {
1282 goto return_close_db;
1285 sqlbuf = sqlite3_mprintf("SELECT %s FROM %s " \
1287 column, NOTIFICATION_SETTING_DB, pkgname);
1289 NOTIFICATION_ERR("fail to alloc query");
1290 result = NOTIFICATION_ERROR_OUT_OF_MEMORY;
1291 goto return_close_db;
1294 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
1295 if (sqlret != SQLITE_OK) {
1296 NOTIFICATION_ERR("fail to prepare %s - [%s]",
1297 sqlbuf, sqlite3_errmsg(db));
1298 result = NOTIFICATION_ERROR_FROM_DB;
1299 goto return_close_db;
1302 sqlret = sqlite3_step(stmt);
1303 if (sqlret == SQLITE_ROW) {
1304 int get_bytes = sqlite3_column_bytes(stmt, 0);
1305 char *get_data = (char *)calloc(get_bytes + 1, sizeof(char));
1306 if (get_data != NULL) {
1307 memcpy(get_data, sqlite3_column_text(stmt, 0),
1308 get_bytes * sizeof(char));
1309 get_data[get_bytes] = '\0';
1312 NOTIFICATION_ERR("fail to alloc query");
1313 result = NOTIFICATION_ERROR_OUT_OF_MEMORY;
1314 goto return_close_db;
1320 sqlite3_free(sqlbuf);
1323 sqlite3_finalize(stmt);
1325 sqlret = db_util_close(db);
1326 if (sqlret != SQLITE_OK)
1327 NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
1332 EXPORT_API int notification_setting_property_set(const char *pkgname, const char *property, const char *value)
1337 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1340 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1343 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1345 ret = notification_ipc_noti_setting_property_set(pkgname, property, value);
1346 if (ret != NOTIFICATION_ERROR_NONE) {
1350 return NOTIFICATION_ERROR_NONE;
1353 EXPORT_API int notification_setting_property_get(const char *pkgname, const char *property, char **value)
1358 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1361 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1364 return NOTIFICATION_ERROR_INVALID_PARAMETER;
1366 ret = notification_ipc_noti_setting_property_get(pkgname, property, value);
1367 if (ret != NOTIFICATION_ERROR_NONE) {
1371 return NOTIFICATION_ERROR_NONE;