2 * Copyright (c) 2016 - 2017 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <pkgmgr-info.h>
23 #include <package_manager.h>
25 #include "badge_setting.h"
26 #include "badge_setting_service.h"
28 #include "badge_error.h"
29 #include "badge_log.h"
31 #define BADGE_PRIVILEGE "http://tizen.org/privilege/notification"
38 static bool _get_table_field_data_int(char **table, int *buf, int index)
40 if (table == NULL || buf == NULL || index < 0) {
42 ERR("table[%p], buf[%p], index[%d]", table, buf, index);
47 if (table[index] != NULL) {
48 *buf = atoi(table[index]);
58 static bool _get_table_field_data_string(char **table, char **buf, int ucs2, int index)
64 if (table == NULL || buf == NULL || index < 0) {
66 ERR("table[%p], buf[%p], index[%d]", table, buf, index);
73 *buf = NULL; /* LCOV_EXCL_LINE */
77 *buf = (char *)malloc(sLen + 1);
79 ERR("malloc is failed"); /* LCOV_EXCL_LINE */
82 memset(*buf, 0, sLen + 1);
83 strncpy(*buf, pTemp, sLen);
85 *buf = NULL; /* LCOV_EXCL_LINE */
95 EXPORT_API int badge_db_get_setting_by_appid(const char *appid, badge_setting_h *setting, uid_t uid)
97 int ret = BADGE_ERROR_NONE;
102 char *sql_query = NULL;
103 char **query_result = NULL;
104 badge_setting_h result_setting;
108 return BADGE_ERROR_INVALID_PARAMETER;
110 sql_ret = db_util_open(BADGE_DB_PATH, &db, 0);
111 if (sql_ret != SQLITE_OK || db == NULL) {
112 ERR("Failed db util open [%s][%d]", BADGE_DB_PATH, sql_ret);
113 return BADGE_ERROR_FROM_DB;
116 sql_query = sqlite3_mprintf("SELECT pkgname, appid, allow_to_display FROM %s " \
117 "WHERE appid = %Q AND (uid = %d OR uid = %d) " \
118 "ORDER BY uid DESC;",
119 BADGE_SETTING_DB_TABLE, appid, uid, tzplatform_getuid(TZ_SYS_GLOBALAPP_USER));
121 ERR("Failed to alloc query");
122 ret = BADGE_ERROR_FROM_DB;
126 sql_ret = sqlite3_get_table(db, sql_query, &query_result, &row_count, &col_count, NULL);
127 if (sql_ret != SQLITE_OK && sql_ret != -1) {
128 ERR("sqlite3_get_table failed [%d][%s]", sql_ret,
130 ret = BADGE_ERROR_FROM_DB;
135 DBG("No setting found for [%s]", appid);
136 ret = BADGE_ERROR_NOT_EXIST;
140 result_setting = (struct badge_setting *)malloc(sizeof(struct badge_setting));
141 if (result_setting == NULL) {
142 ERR("Failed to alloc setting");
143 ret = BADGE_ERROR_OUT_OF_MEMORY;
147 col_index = col_count;
149 _get_table_field_data_string(query_result, &(result_setting[0].pkgname), 1, col_index++);
150 _get_table_field_data_string(query_result, &(result_setting[0].appid), 1, col_index++);
151 _get_table_field_data_int(query_result, (int *)&(result_setting[0].allow_to_display), col_index++);
153 *setting = result_setting;
157 sqlite3_free_table(query_result);
159 sqlite3_free(sql_query);
161 sql_ret = db_util_close(db);
162 if (sql_ret != SQLITE_OK)
163 WARN("Failed to db_util_close");
169 EXPORT_API int badge_db_update_setting(char *pkgname, char *appid, int allow_to_display, uid_t uid)
171 int ret = BADGE_ERROR_NONE;
176 if (pkgname == NULL || appid == NULL) {
177 ERR("Invalid package name or app id");
178 return BADGE_ERROR_INVALID_PARAMETER;
181 sql_ret = db_util_open(BADGE_DB_PATH, &db, 0);
182 if (sql_ret != SQLITE_OK || db == NULL) {
183 ERR("db_util_open failed [%s][%d]", BADGE_DB_PATH, sql_ret);
184 return BADGE_ERROR_FROM_DB;
187 sqlbuf = sqlite3_mprintf("UPDATE %s SET allow_to_display = %d " \
188 "WHERE pkgname = %Q AND appid = %Q " \
190 BADGE_SETTING_DB_TABLE, allow_to_display,
191 pkgname, appid, uid);
194 ERR("Failed to alloc query");
195 ret = BADGE_ERROR_FROM_DB;
199 ret = badge_db_exec(db, sqlbuf, NULL);
203 sqlite3_free(sqlbuf);
205 sql_ret = db_util_close(db);
206 if (sql_ret != SQLITE_OK)
207 WARN("Failed to db_util_close");
213 EXPORT_API int badge_db_get_allow_to_display_by_appid(char *appid, int *allow_to_display, uid_t uid)
215 int ret = BADGE_ERROR_NONE;
220 char *sql_query = NULL;
221 char **query_result = NULL;
225 return BADGE_ERROR_INVALID_PARAMETER;
227 sql_ret = db_util_open(BADGE_DB_PATH, &db, 0);
228 if (sql_ret != SQLITE_OK || db == NULL) {
229 ERR("Failed db util open [%s][%d]", BADGE_DB_PATH, sql_ret);
230 return BADGE_ERROR_FROM_DB;
233 sql_query = sqlite3_mprintf("SELECT allow_to_display FROM %s WHERE appid = %Q " \
234 "AND (uid = %d OR uid = %d) ORDER BY uid DESC;",
235 BADGE_SETTING_DB_TABLE, appid, uid,
236 tzplatform_getuid(TZ_SYS_GLOBALAPP_USER));
238 ERR("Failed to alloc query");
239 ret = BADGE_ERROR_FROM_DB;
243 sql_ret = sqlite3_get_table(db, sql_query, &query_result, &row_count, &col_count, NULL);
244 if (sql_ret != SQLITE_OK && sql_ret != -1) {
245 ERR("sqlite3_get_table failed [%d][%s]", sql_ret,
247 ret = BADGE_ERROR_FROM_DB;
252 DBG("No setting found for [%s]", appid);
253 ret = BADGE_ERROR_NOT_EXIST;
257 col_index = col_count;
259 _get_table_field_data_int(query_result, (int *)allow_to_display, col_index++);
263 sqlite3_free_table(query_result);
265 sqlite3_free(sql_query);
267 sql_ret = db_util_close(db);
268 if (sql_ret != SQLITE_OK)
269 WARN("Failed to db_util_close");
275 EXPORT_API int badge_setting_is_existed_appid(const char *appid, bool *is_existed, uid_t uid)
277 int ret = BADGE_ERROR_NONE;
280 sqlite3_stmt *stmt = NULL;
284 if (appid == NULL || is_existed == NULL) {
285 ERR("Invalid parameter");
286 return BADGE_ERROR_INVALID_PARAMETER;
289 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
290 if (sqlret != SQLITE_OK || !db) {
291 ERR("Failed to db_util_open [%d]", sqlret);
292 if (sqlret == SQLITE_PERM)
293 return BADGE_ERROR_PERMISSION_DENIED;
294 return BADGE_ERROR_FROM_DB;
297 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
298 "appid = %Q AND uid = %d",
299 BADGE_SETTING_DB_TABLE, appid, uid);
301 ERR("Failed to alloc query");
302 ret = BADGE_ERROR_OUT_OF_MEMORY;
306 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
307 if (sqlret != SQLITE_OK) {
308 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret,
310 ret = BADGE_ERROR_FROM_DB;
314 sqlret = sqlite3_step(stmt);
315 if (sqlret == SQLITE_ROW)
316 count = sqlite3_column_int(stmt, 0);
325 sqlite3_free(sqlbuf);
327 sqlite3_finalize(stmt);
329 sqlret = db_util_close(db);
330 if (sqlret != SQLITE_OK)
331 WARN("Failed to db_util_close [%d]", sqlret);
337 static bool _is_package_in_setting_table(sqlite3 *db, const char *pkgname, const char* appid, uid_t uid)
339 sqlite3_stmt *db_statement = NULL;
340 int sqlite3_ret = SQLITE_OK;
345 sqlite3_ret = sqlite3_prepare_v2(db, "SELECT appid FROM badge_setting WHERE uid = ? AND pkgname = ? AND appid = ?", -1, &db_statement, NULL);
347 sqlite3_ret = sqlite3_prepare_v2(db, "SELECT pkgname FROM badge_setting WHERE uid = ? AND pkgname = ?", -1, &db_statement, NULL);
349 if (sqlite3_ret != SQLITE_OK) {
350 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlite3_ret,
356 sqlite3_bind_int(db_statement, field_index++, uid);
357 sqlite3_bind_text(db_statement, field_index++, pkgname, -1, SQLITE_TRANSIENT);
359 sqlite3_bind_text(db_statement, field_index++, appid, -1, SQLITE_TRANSIENT);
361 sqlite3_ret = sqlite3_step(db_statement);
362 if (sqlite3_ret == SQLITE_DONE) {
363 INFO("no matched appid from pkgname found[%s][%s][%d]", pkgname, appid, sqlite3_ret);
368 if (sqlite3_ret != SQLITE_OK && sqlite3_ret != SQLITE_ROW) {
369 ERR("sqlite3_step failed [%d][%s]", sqlite3_ret,
377 sqlite3_finalize(db_statement);
382 static int app_info_callback(const pkgmgrinfo_appinfo_h handle, void *user_data)
384 badge_setting_info *info = (badge_setting_info *)user_data;
385 sqlite3 *db = info->db;
386 sqlite3_stmt *db_statement = NULL;
387 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
389 int sqlite3_ret = SQLITE_OK;
391 char *pkgname = NULL;
393 pkgmgr_ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
394 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE) {
395 ERR("pkgmgrinfo_appinfo_get_appid failed [%d]", pkgmgr_ret);
399 pkgmgr_ret = pkgmgrinfo_appinfo_get_pkgname(handle, &pkgname);
400 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE) {
401 ERR("pkgmgrinfo_appinfo_get_pkgname failed [%d]", pkgmgr_ret);
405 if (_is_package_in_setting_table(db, pkgname, appid, info->uid) == true) {
406 INFO("uid %d [%s] is exist", info->uid, appid);
410 INFO("uid %d pkgname %s [%s] will be inserted", info->uid, pkgname, appid);
411 sqlite3_ret = sqlite3_prepare_v2(db, "INSERT INTO badge_setting (uid, pkgname, appid) "
412 "VALUES (?, ?, ?) ", -1, &db_statement, NULL);
414 if (sqlite3_ret != SQLITE_OK) {
415 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlite3_ret,
420 sqlite3_bind_int(db_statement, field_index++, info->uid);
421 sqlite3_bind_text(db_statement, field_index++, pkgname, -1, SQLITE_TRANSIENT);
422 sqlite3_bind_text(db_statement, field_index++, appid, -1, SQLITE_TRANSIENT);
424 sqlite3_ret = sqlite3_step(db_statement);
426 INFO("sqlite3_step returns[%d]", sqlite3_ret);
428 if (sqlite3_ret != SQLITE_OK && sqlite3_ret != SQLITE_DONE)
429 ERR("sqlite3_step failed [%d][%s]", sqlite3_ret,
434 sqlite3_finalize(db_statement);
439 static int package_info_callback(const pkgmgrinfo_pkginfo_h package_info, void *user_data)
441 char *pkgname = NULL;
442 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
443 pkgmgrinfo_appinfo_filter_h handle = NULL;
444 badge_setting_info *info = (badge_setting_info *)user_data;
446 pkgmgr_ret = pkgmgrinfo_pkginfo_get_pkgname(package_info, &pkgname);
447 if (pkgmgr_ret != PACKAGE_MANAGER_ERROR_NONE) {
448 ERR("package_info_get_package failed [%d]", pkgmgr_ret);
452 pkgmgr_ret = pkgmgrinfo_appinfo_filter_create(&handle);
453 if (pkgmgr_ret != PMINFO_R_OK) {
454 ERR("pkgmgrinfo_appinfo_filter_create failed [%d]", pkgmgr_ret);
458 pkgmgr_ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_PACKAGE, pkgname);
459 if (pkgmgr_ret != PMINFO_R_OK) {
460 ERR("pkgmgrinfo_appinfo_filter_add_string failed [%d]",
465 pkgmgr_ret = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_NODISPLAY, false);
466 if (pkgmgr_ret != PMINFO_R_OK) {
467 ERR("pkgmgrinfo_appinfo_filter_add_bool failed [%d]",
472 pkgmgr_ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle, app_info_callback, info, info->uid);
473 if (pkgmgr_ret != PMINFO_R_OK) {
474 ERR("pkgmgrinfo_pkginfo_filter_foreach_appinfo failed [%d]",
481 pkgmgrinfo_appinfo_filter_destroy(handle);
486 EXPORT_API int badge_setting_insert_package_for_uid(const char *pkgname, uid_t uid)
489 int ret = BADGE_ERROR_NONE;
490 int sqlite3_ret = SQLITE_OK;
491 int pkgmgr_ret = PACKAGE_MANAGER_ERROR_NONE;
492 badge_setting_info info;
493 pkgmgrinfo_pkginfo_filter_h handle = NULL;
495 sqlite3_ret = sqlite3_open_v2(BADGE_DB_PATH, &db, SQLITE_OPEN_READWRITE, NULL);
496 if (sqlite3_ret != SQLITE_OK || db == NULL) {
497 ERR("db_util_open failed [%s][%d]", BADGE_DB_PATH, sqlite3_ret);
498 ret = BADGE_ERROR_FROM_DB;
502 sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
504 pkgmgr_ret = pkgmgrinfo_pkginfo_filter_create(&handle);
505 if (pkgmgr_ret != PMINFO_R_OK) {
506 ERR("pkgmgrinfo_pkginfo_filter_create failed [%d]", pkgmgr_ret);
507 ret = BADGE_ERROR_FROM_DB;
511 pkgmgr_ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgname);
512 if (pkgmgr_ret != PMINFO_R_OK) {
513 ERR("pkgmgrinfo_pkginfo_filter_add_string failed [%d]",
515 ret = BADGE_ERROR_FROM_DB;
521 pkgmgr_ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, package_info_callback, &info, uid);
522 if (pkgmgr_ret != PMINFO_R_OK) {
523 ERR("pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo failed [%d]",
525 ret = BADGE_ERROR_FROM_DB;
531 pkgmgrinfo_pkginfo_filter_destroy(handle);
533 if (ret == BADGE_ERROR_NONE)
534 sqlite3_exec(db, "END;", NULL, NULL, NULL);
536 sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
538 if ((sqlite3_ret = db_util_close(db)) != SQLITE_OK)
539 WARN("db_util_close failed [%d]", sqlite3_ret);
545 EXPORT_API int badge_setting_delete_package_for_uid(const char *pkgname, uid_t uid)
548 sqlite3_stmt *db_statement = NULL;
549 int ret = BADGE_ERROR_NONE;
550 int sqlite3_ret = SQLITE_OK;
552 bool is_package_in_setting_table = false;
554 sqlite3_ret = sqlite3_open_v2(BADGE_DB_PATH, &db, SQLITE_OPEN_READWRITE, NULL);
555 if (sqlite3_ret != SQLITE_OK || db == NULL) {
556 ERR("db_util_open failed [%s][%d]", BADGE_DB_PATH, sqlite3_ret);
557 ret = BADGE_ERROR_FROM_DB;
561 is_package_in_setting_table = _is_package_in_setting_table(db, pkgname, NULL, uid);
562 if (is_package_in_setting_table == false) {
563 INFO("[%s] is not exist", pkgname);
567 sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
569 sqlite3_ret = sqlite3_prepare_v2(db, "DELETE FROM badge_setting WHERE uid = ? AND pkgname = ? ", -1, &db_statement, NULL);
570 if (sqlite3_ret != SQLITE_OK) {
571 ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlite3_ret,
573 ret = BADGE_ERROR_FROM_DB;
577 sqlite3_bind_int(db_statement, field_index++, uid);
578 sqlite3_bind_text(db_statement, field_index++, pkgname, -1, SQLITE_TRANSIENT);
580 sqlite3_ret = sqlite3_step(db_statement);
581 if (sqlite3_ret != SQLITE_OK && sqlite3_ret != SQLITE_DONE) {
582 ERR("sqlite3_step failed [%d][%s]", sqlite3_ret,
584 ret = BADGE_ERROR_FROM_DB;
589 sqlite3_finalize(db_statement);
591 if (ret == BADGE_ERROR_NONE)
592 sqlite3_exec(db, "END;", NULL, NULL, NULL);
594 sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
596 if ((sqlite3_ret = db_util_close(db)) != SQLITE_OK)
597 WARN("db_util_close failed [%d]", sqlite3_ret);
603 EXPORT_API int badge_setting_refresh_setting_table(uid_t uid)
605 int ret = BADGE_ERROR_NONE;
609 badge_setting_info info;
610 pkgmgrinfo_pkginfo_filter_h filter;
612 sql_ret = sqlite3_open_v2(BADGE_DB_PATH, &db, SQLITE_OPEN_READWRITE, NULL);
613 if (sql_ret != SQLITE_OK || db == NULL) {
614 ERR("sqlite3_open_v2 fail [%s][%d]", BADGE_DB_PATH, sql_ret);
615 return BADGE_ERROR_FROM_DB;
618 sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
620 pkgmgr_ret = pkgmgrinfo_pkginfo_filter_create(&filter);
621 if (pkgmgr_ret != PMINFO_R_OK) {
622 ERR("pkgmgrinfo_pkginfo_filter_create failed [%d]", pkgmgr_ret);
623 ret = BADGE_ERROR_FROM_DB;
629 pkgmgr_ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(filter, package_info_callback, &info, uid);
630 if (pkgmgr_ret != PMINFO_R_OK) {
631 ERR("pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo failed [%d]",
633 ret = BADGE_ERROR_FROM_DB;
639 pkgmgrinfo_pkginfo_filter_destroy(filter);
641 if (ret == BADGE_ERROR_NONE)
642 sqlite3_exec(db, "END;", NULL, NULL, NULL);
644 sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
645 if ((sql_ret = db_util_close(db)) != SQLITE_OK)
646 WARN("fail to db_util_close [%d]", sql_ret);