4 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngjoo Park <yjoo93.park@samsung.com>,
7 * Seungtaek Chung <seungtaek.chung@samsung.com>, Youngsub Ko <ys4610.ko@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.
29 #include <dbus/dbus.h>
30 #include <dbus/dbus-glib-lowlevel.h>
34 #include <package_manager.h>
35 #include <tzplatform_config.h>
37 #include "badge_log.h"
38 #include "badge_error.h"
39 #include "badge_internal.h"
40 #include "badge_ipc.h"
43 #define BADGE_DB_PATH tzplatform_mkpath(TZ_SYS_DB, ".badge.db")
45 #define BADGE_PKGNAME_LEN 512
46 #define BADGE_TABLE_NAME "badge_data"
47 #define BADGE_OPTION_TABLE_NAME "badge_option"
49 #define BADGE_CHANGED_NOTI "badge_changed"
56 struct _badge_cb_data {
57 badge_change_cb callback;
61 static GList *g_badge_cb_list;
63 static inline long _get_max_len(void)
66 long path_max_len = 4096;
69 max = (pathconf("/", _PC_PATH_MAX) < 1 ? path_max_len
70 : pathconf("/", _PC_PATH_MAX));
71 #else /* _PC_PATH_MAX */
73 #endif /* _PC_PATH_MAX */
77 char *_badge_get_pkgname_by_pid(void)
87 pkgname = malloc(max);
89 ERR("fail to alloc memory");
92 memset(pkgname, 0x00, max);
94 ret = aul_app_get_pkgname_bypid(pid, pkgname, max);
95 if (ret != AUL_R_OK) {
96 fd = open("/proc/self/cmdline", O_RDONLY);
102 ret = read(fd, pkgname, max - 1);
112 if (pkgname[0] == '\0') {
119 static int _badge_check_data_inserted(const char *pkgname,
122 sqlite3_stmt *stmt = NULL;
124 int result = BADGE_ERROR_NONE;
129 return BADGE_ERROR_INVALID_PARAMETER;
132 return BADGE_ERROR_INVALID_PARAMETER;
134 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
136 BADGE_TABLE_NAME, pkgname);
139 ERR("fail to alloc sql query");
140 return BADGE_ERROR_OUT_OF_MEMORY;
143 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
144 if (sqlret != SQLITE_OK) {
145 ERR("DB err [%s]", sqlite3_errmsg(db));
146 ERR("query[%s]", sqlbuf);
147 result = BADGE_ERROR_FROM_DB;
148 goto free_and_return;
151 sqlret = sqlite3_step(stmt);
152 if (sqlret == SQLITE_ROW)
153 count = sqlite3_column_int(stmt, 0);
157 DBG("[%s], count[%d]", sqlbuf, count);
160 result = BADGE_ERROR_ALREADY_EXIST;
162 result = BADGE_ERROR_NOT_EXIST;
166 sqlite3_free(sqlbuf);
169 sqlite3_finalize(stmt);
174 static int _badge_check_option_inserted(const char *pkgname,
177 sqlite3_stmt *stmt = NULL;
179 int result = BADGE_ERROR_NONE;
184 return BADGE_ERROR_INVALID_PARAMETER;
187 return BADGE_ERROR_INVALID_PARAMETER;
189 sqlbuf = sqlite3_mprintf("SELECT count(*) FROM %q WHERE " \
191 BADGE_OPTION_TABLE_NAME, pkgname);
194 ERR("fail to alloc sql query");
195 return BADGE_ERROR_OUT_OF_MEMORY;
198 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
199 if (sqlret != SQLITE_OK) {
200 ERR("DB err [%s]", sqlite3_errmsg(db));
201 ERR("query[%s]", sqlbuf);
202 result = BADGE_ERROR_FROM_DB;
203 goto free_and_return;
206 sqlret = sqlite3_step(stmt);
207 if (sqlret == SQLITE_ROW)
208 count = sqlite3_column_int(stmt, 0);
212 DBG("[%s], count[%d]", sqlbuf, count);
215 result = BADGE_ERROR_ALREADY_EXIST;
217 result = BADGE_ERROR_NOT_EXIST;
221 sqlite3_free(sqlbuf);
224 sqlite3_finalize(stmt);
229 static int _is_same_certinfo(const char *caller, const char *pkgname)
231 int ret = PACKAGE_MANAGER_ERROR_NONE;
232 package_manager_compare_result_type_e compare_result = PACKAGE_MANAGER_COMPARE_MISMATCH;
240 ret = package_manager_compare_package_cert_info(pkgname, caller, &compare_result);
241 if (ret == PACKAGE_MANAGER_ERROR_NONE &&
242 compare_result == PACKAGE_MANAGER_COMPARE_MATCH)
248 static int _badge_check_writable(const char *caller,
249 const char *pkgname, sqlite3 *db)
251 sqlite3_stmt *stmt = NULL;
253 int result = BADGE_ERROR_NONE;
258 return BADGE_ERROR_INVALID_PARAMETER;
261 return BADGE_ERROR_INVALID_PARAMETER;
264 return BADGE_ERROR_INVALID_PARAMETER;
266 if (g_strcmp0(caller, pkgname) == 0)
267 return BADGE_ERROR_NONE;
269 if (_is_same_certinfo(caller, pkgname) == 1)
270 return BADGE_ERROR_NONE;
272 sqlbuf = sqlite3_mprintf("SELECT COUNT(*) FROM %q WHERE " \
273 "pkgname = %Q AND writable_pkgs LIKE '%%%q%%'",
277 ERR("fail to alloc sql query");
278 return BADGE_ERROR_OUT_OF_MEMORY;
281 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
282 if (sqlret != SQLITE_OK) {
283 ERR("DB err [%s]", sqlite3_errmsg(db));
284 ERR("query[%s]", sqlbuf);
285 result = BADGE_ERROR_FROM_DB;
286 goto free_and_return;
289 sqlret = sqlite3_step(stmt);
290 if (sqlret == SQLITE_ROW)
291 count = sqlite3_column_int(stmt, 0);
295 DBG("[%s], count[%d]", sqlbuf, count);
298 result = BADGE_ERROR_PERMISSION_DENIED;
302 sqlite3_free(sqlbuf);
305 sqlite3_finalize(stmt);
311 int _badge_is_existing(const char *pkgname, bool *existing)
315 int result = BADGE_ERROR_NONE;
317 if (!pkgname || !existing) {
318 ERR("pkgname : %s, existing : %p", pkgname, existing);
319 return BADGE_ERROR_INVALID_PARAMETER;
322 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
323 if (sqlret != SQLITE_OK || !db) {
324 ERR("fail to db_util_open - [%d]", sqlret);
325 if (sqlret == SQLITE_PERM)
326 return BADGE_ERROR_PERMISSION_DENIED;
327 return BADGE_ERROR_FROM_DB;
330 result = _badge_check_data_inserted(pkgname, db);
331 if (result == BADGE_ERROR_ALREADY_EXIST) {
333 result = BADGE_ERROR_NONE;
334 } else if (result == BADGE_ERROR_NOT_EXIST) {
336 result = BADGE_ERROR_NONE;
339 sqlret = db_util_close(db);
340 if (sqlret != SQLITE_OK)
341 WARN("fail to db_util_close - [%d]", sqlret);
346 int _badge_foreach_existed(badge_foreach_cb callback, void *data)
349 int result = BADGE_ERROR_NONE;
351 sqlite3_stmt *stmt = NULL;
354 unsigned int badge_count;
357 return BADGE_ERROR_INVALID_PARAMETER;
359 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
360 if (sqlret != SQLITE_OK || !db) {
361 ERR("fail to db_util_open - [%d]", sqlret);
362 return BADGE_ERROR_FROM_DB;
365 sqlbuf = sqlite3_mprintf("SELECT pkgname, badge FROM %q",
368 ERR("fail to alloc sql query");
369 result = BADGE_ERROR_OUT_OF_MEMORY;
370 goto free_and_return;
373 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
374 if (sqlret != SQLITE_OK) {
375 ERR("fail to sqlite3_prepare_v2 - [%s]", sqlite3_errmsg(db));
376 ERR("query[%s]", sqlbuf);
377 result = BADGE_ERROR_FROM_DB;
378 goto free_and_return;
381 sqlret = sqlite3_step(stmt);
382 if (sqlret == SQLITE_DONE) {
383 INFO("badge db has no data");
384 result = BADGE_ERROR_NOT_EXIST;
385 goto free_and_return;
386 } else if (sqlret == SQLITE_ROW) {
387 pkg = (const char *)sqlite3_column_text(stmt, 0);
388 badge_count = (unsigned int)sqlite3_column_int(stmt, 1);
391 callback(pkg, badge_count, data);
393 ERR("db has invaild data");
395 ERR("fail to sqlite3_step : %d", sqlret);
396 result = BADGE_ERROR_FROM_DB;
397 goto free_and_return;
400 while (sqlite3_step(stmt) == SQLITE_ROW) {
401 pkg = (const char *)sqlite3_column_text(stmt, 0);
402 badge_count = (unsigned int)sqlite3_column_int(stmt, 1);
405 callback(pkg, badge_count, data);
407 ERR("db has invaild data");
412 sqlite3_free(sqlbuf);
415 sqlite3_finalize(stmt);
417 sqlret = db_util_close(db);
418 if (sqlret != SQLITE_OK)
419 WARN("fail to db_util_close - [%d]", sqlret);
424 int _badge_insert(badge_h *badge)
428 int ret = BADGE_ERROR_NONE;
429 int result = BADGE_ERROR_NONE;
432 if (!badge || !badge->pkgname || !badge->writable_pkgs)
433 return BADGE_ERROR_INVALID_PARAMETER;
435 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
436 if (sqlret != SQLITE_OK || !db) {
437 ERR("fail to db_util_open - [%s][%d]", BADGE_DB_PATH, sqlret);
438 return BADGE_ERROR_FROM_DB;
441 /* Check pkgname & id */
442 ret = _badge_check_data_inserted(badge->pkgname, db);
443 if (ret != BADGE_ERROR_NOT_EXIST) {
445 goto return_close_db;
448 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
454 badge->pkgname, badge->writable_pkgs);
456 ERR("fail to alloc query");
457 result = BADGE_ERROR_OUT_OF_MEMORY;
458 goto return_close_db;
461 ret = badge_db_exec(db, sqlbuf, NULL);
462 if (ret != BADGE_ERROR_NONE) {
463 ERR("failed to insert badge[%s], err[%d]",
464 badge->pkgname, ret);
466 goto return_close_db;
469 /* inserting badge options */
470 ret = _badge_check_option_inserted(badge->pkgname, db);
471 if (ret != BADGE_ERROR_NOT_EXIST) {
473 goto return_close_db;
476 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
480 BADGE_OPTION_TABLE_NAME,
483 ERR("fail to alloc query");
484 result = BADGE_ERROR_OUT_OF_MEMORY;
485 goto return_close_db;
488 ret = badge_db_exec(db, sqlbuf, NULL);
489 if (ret != BADGE_ERROR_NONE) {
490 ERR("failed to insert badge option[%s], err[%d]",
491 badge->pkgname, sqlret);
493 goto return_close_db;
498 sqlite3_free(sqlbuf);
500 sqlret = db_util_close(db);
501 if (sqlret != SQLITE_OK)
502 WARN("fail to db_util_close - [%d]", sqlret);
507 int _badge_remove(const char *caller, const char *pkgname)
509 int ret = BADGE_ERROR_NONE;
510 int result = BADGE_ERROR_NONE;
516 return BADGE_ERROR_INVALID_PARAMETER;
519 return BADGE_ERROR_INVALID_PARAMETER;
521 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
522 if (sqlret != SQLITE_OK || !db) {
523 ERR("fail to db_util_open - [%d]", sqlret);
524 return BADGE_ERROR_FROM_DB;
527 ret = _badge_check_data_inserted(pkgname, db);
528 if (ret != BADGE_ERROR_ALREADY_EXIST) {
530 goto return_close_db;
533 ret = _badge_check_writable(caller, pkgname, db);
534 if (ret != BADGE_ERROR_NONE) {
536 goto return_close_db;
539 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q",
540 BADGE_TABLE_NAME, pkgname);
542 ERR("fail to alloc query");
543 result = BADGE_ERROR_OUT_OF_MEMORY;
544 goto return_close_db;
547 ret = badge_db_exec(db, sqlbuf, NULL);
548 if (ret != BADGE_ERROR_NONE) {
549 ERR("failed to remove badge[%s], err[%d]",
552 goto return_close_db;
555 /* treating option table */
556 ret = _badge_check_option_inserted(pkgname, db);
557 if (ret != BADGE_ERROR_ALREADY_EXIST) {
559 goto return_close_db;
562 sqlbuf = sqlite3_mprintf("DELETE FROM %q WHERE pkgname = %Q",
563 BADGE_OPTION_TABLE_NAME, pkgname);
565 ERR("fail to alloc query");
566 result = BADGE_ERROR_OUT_OF_MEMORY;
567 goto return_close_db;
570 ret = badge_db_exec(db, sqlbuf, NULL);
571 if (ret != BADGE_ERROR_NONE) {
572 ERR("failed to remove badge option[%s], err[%d]",
575 goto return_close_db;
580 sqlite3_free(sqlbuf);
582 sqlret = db_util_close(db);
583 if (sqlret != SQLITE_OK)
584 WARN("fail to db_util_close - [%d]", sqlret);
589 int _badget_set_count(const char *caller, const char *pkgname,
592 int ret = BADGE_ERROR_NONE;
593 int result = BADGE_ERROR_NONE;
599 return BADGE_ERROR_INVALID_PARAMETER;
602 return BADGE_ERROR_INVALID_PARAMETER;
604 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
605 if (sqlret != SQLITE_OK || !db) {
606 ERR("fail to db_util_open - [%d]", sqlret);
607 return BADGE_ERROR_FROM_DB;
610 ret = _badge_check_data_inserted(pkgname, db);
611 if (ret != BADGE_ERROR_ALREADY_EXIST) {
613 goto return_close_db;
616 ret = _badge_check_writable(caller, pkgname, db);
617 if (ret != BADGE_ERROR_NONE) {
619 goto return_close_db;
622 sqlbuf = sqlite3_mprintf("UPDATE %q SET badge = %d " \
623 "WHERE pkgname = %Q",
624 BADGE_TABLE_NAME, count, pkgname);
626 ERR("fail to alloc query");
627 result = BADGE_ERROR_OUT_OF_MEMORY;
628 goto return_close_db;
631 ret = badge_db_exec(db, sqlbuf, NULL);
632 if (ret != BADGE_ERROR_NONE) {
633 ERR("failed to set badge[%s] count[%d], err[%d]",
634 pkgname, count, ret);
636 goto return_close_db;
641 sqlite3_free(sqlbuf);
643 sqlret = db_util_close(db);
644 if (sqlret != SQLITE_OK)
645 WARN("fail to db_util_close - [%d]", sqlret);
650 int _badget_get_count(const char *pkgname, unsigned int *count)
652 int ret = BADGE_ERROR_NONE;
653 int result = BADGE_ERROR_NONE;
656 sqlite3_stmt *stmt = NULL;
660 return BADGE_ERROR_INVALID_PARAMETER;
663 return BADGE_ERROR_INVALID_PARAMETER;
665 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
666 if (sqlret != SQLITE_OK || !db) {
667 ERR("fail to db_util_open - [%d]", sqlret);
668 if (sqlret == SQLITE_PERM)
669 return BADGE_ERROR_PERMISSION_DENIED;
671 return BADGE_ERROR_FROM_DB;
674 ret = _badge_check_data_inserted(pkgname, db);
675 if (ret != BADGE_ERROR_ALREADY_EXIST) {
677 goto return_close_db;
680 sqlbuf = sqlite3_mprintf("SELECT badge FROM %q " \
681 "WHERE pkgname = %Q",
682 BADGE_TABLE_NAME, pkgname);
684 ERR("fail to alloc query");
685 result = BADGE_ERROR_OUT_OF_MEMORY;
686 goto return_close_db;
689 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
690 if (sqlret != SQLITE_OK) {
691 ERR("fail to prepare %s - [%s]",
692 sqlbuf, sqlite3_errmsg(db));
693 result = BADGE_ERROR_FROM_DB;
694 goto return_close_db;
697 sqlret = sqlite3_step(stmt);
698 if (sqlret == SQLITE_ROW)
699 *count = (unsigned int)sqlite3_column_int(stmt, 0);
701 *count = (unsigned int)0;
705 sqlite3_free(sqlbuf);
708 sqlite3_finalize(stmt);
710 sqlret = db_util_close(db);
711 if (sqlret != SQLITE_OK)
712 WARN("fail to db_util_close - [%d]", sqlret);
717 int _badget_set_display(const char *pkgname,
718 unsigned int is_display)
720 int ret = BADGE_ERROR_NONE;
721 int result = BADGE_ERROR_NONE;
727 return BADGE_ERROR_INVALID_PARAMETER;
729 if (is_display != 0 && is_display != 1)
730 return BADGE_ERROR_INVALID_PARAMETER;
732 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
733 if (sqlret != SQLITE_OK || !db) {
734 ERR("fail to db_util_open - [%d]", sqlret);
735 return BADGE_ERROR_FROM_DB;
738 ret = _badge_check_data_inserted(pkgname, db);
739 if (ret != BADGE_ERROR_ALREADY_EXIST) {
741 goto return_close_db;
744 ret = _badge_check_option_inserted(pkgname, db);
745 if (ret == BADGE_ERROR_ALREADY_EXIST) {
746 sqlbuf = sqlite3_mprintf("UPDATE %q SET display = %d " \
747 "WHERE pkgname = %Q",
748 BADGE_OPTION_TABLE_NAME, is_display, pkgname);
750 ERR("fail to alloc query");
751 result = BADGE_ERROR_OUT_OF_MEMORY;
752 goto return_close_db;
755 ret = badge_db_exec(db, sqlbuf, NULL);
756 if (ret != BADGE_ERROR_NONE) {
757 ERR("failed to set badge[%s] option[%d], err[%d]",
758 pkgname, is_display, ret);
760 goto return_close_db;
763 } else if (ret == BADGE_ERROR_NOT_EXIST) {
764 sqlbuf = sqlite3_mprintf("INSERT INTO %q " \
769 BADGE_OPTION_TABLE_NAME,
770 pkgname, is_display);
772 ERR("fail to alloc query");
773 result = BADGE_ERROR_OUT_OF_MEMORY;
774 goto return_close_db;
777 ret = badge_db_exec(db, sqlbuf, NULL);
778 if (ret != BADGE_ERROR_NONE) {
779 ERR("failed to set badge[%s] option[%d], err[%d]",
780 pkgname, is_display, ret);
782 goto return_close_db;
786 goto return_close_db;
791 sqlite3_free(sqlbuf);
793 sqlret = db_util_close(db);
794 if (sqlret != SQLITE_OK)
795 WARN("fail to db_util_close - [%d]", sqlret);
800 int _badget_get_display(const char *pkgname, unsigned int *is_display)
802 int ret = BADGE_ERROR_NONE;
803 int result = BADGE_ERROR_NONE;
806 sqlite3_stmt *stmt = NULL;
810 return BADGE_ERROR_INVALID_PARAMETER;
813 return BADGE_ERROR_INVALID_PARAMETER;
815 sqlret = db_util_open(BADGE_DB_PATH, &db, 0);
816 if (sqlret != SQLITE_OK || !db) {
817 ERR("fail to db_util_open - [%d]", sqlret);
818 if (sqlret == SQLITE_PERM)
819 return BADGE_ERROR_PERMISSION_DENIED;
821 return BADGE_ERROR_FROM_DB;
824 ret = _badge_check_option_inserted(pkgname, db);
825 if (ret != BADGE_ERROR_ALREADY_EXIST) {
826 if (ret == BADGE_ERROR_NOT_EXIST)
830 goto return_close_db;
833 sqlbuf = sqlite3_mprintf("SELECT display FROM %q " \
834 "WHERE pkgname = %Q",
835 BADGE_OPTION_TABLE_NAME, pkgname);
837 ERR("fail to alloc query");
838 result = BADGE_ERROR_OUT_OF_MEMORY;
839 goto return_close_db;
842 sqlret = sqlite3_prepare_v2(db, sqlbuf, -1, &stmt, NULL);
843 if (sqlret != SQLITE_OK) {
844 ERR("fail to prepare %s - [%s]",
845 sqlbuf, sqlite3_errmsg(db));
846 result = BADGE_ERROR_FROM_DB;
847 goto return_close_db;
850 sqlret = sqlite3_step(stmt);
851 if (sqlret == SQLITE_ROW)
852 *is_display = (unsigned int)sqlite3_column_int(stmt, 0);
854 *is_display = (unsigned int)1;
858 sqlite3_free(sqlbuf);
861 sqlite3_finalize(stmt);
863 sqlret = db_util_close(db);
864 if (sqlret != SQLITE_OK)
865 WARN("fail to db_util_close - [%d]", sqlret);
870 void badge_changed_cb_call(unsigned int action, const char *pkgname,
873 DBG("call badge_change_cb");
874 GList *list = g_badge_cb_list;
875 struct _badge_cb_data *bd = NULL;
878 bd = g_list_nth_data(list, 0);
883 DBG("call badge_change_cb : action %d, pkgname %s, count %d",
884 action, pkgname, count);
885 bd->callback(action, pkgname, count, bd->data);
888 list = g_list_next(list);
892 static int _badge_changed_monitor_init()
894 return badge_ipc_monitor_init();
897 static void _badge_chanaged_monitor_fini()
899 badge_ipc_monitor_fini();
902 static gint _badge_data_compare(gconstpointer a, gconstpointer b)
904 const struct _badge_cb_data *bd = NULL;
910 if (bd->callback == b)
916 int _badge_register_changed_cb(badge_change_cb callback, void *data)
918 struct _badge_cb_data *bd = NULL;
923 return BADGE_ERROR_INVALID_PARAMETER;
925 found = g_list_find_custom(g_badge_cb_list, (gconstpointer)callback,
926 _badge_data_compare);
929 bd = g_list_nth_data(found, 0);
933 bd = malloc(sizeof(struct _badge_cb_data));
935 return BADGE_ERROR_OUT_OF_MEMORY;
938 bd->callback = callback;
941 g_badge_cb_list = g_list_append(g_badge_cb_list, bd);
944 ret = _badge_changed_monitor_init();
945 if (ret != BADGE_ERROR_NONE) {
946 ERR("badge_ipc_monitor_init err : %d", ret);
947 _badge_unregister_changed_cb(callback);
950 return BADGE_ERROR_NONE;
953 int _badge_unregister_changed_cb(badge_change_cb callback)
956 struct _badge_cb_data *bd = NULL;
959 return BADGE_ERROR_INVALID_PARAMETER;
961 found = g_list_find_custom(g_badge_cb_list, (gconstpointer)callback,
962 _badge_data_compare);
965 bd = g_list_nth_data(found, 0);
966 g_badge_cb_list = g_list_delete_link(g_badge_cb_list, found);
970 if (!g_badge_cb_list)
971 _badge_chanaged_monitor_fini();
974 return BADGE_ERROR_NONE;
976 return BADGE_ERROR_INVALID_PARAMETER;
980 int _badge_free(badge_h *badge)
983 return BADGE_ERROR_INVALID_PARAMETER;
986 free(badge->pkgname);
988 if (badge->writable_pkgs)
989 free(badge->writable_pkgs);
993 return BADGE_ERROR_NONE;
996 badge_h *_badge_new(const char *pkgname, const char *writable_pkgs,
999 badge_h *badge = NULL;
1002 ERR("PKGNAME is NULL");
1004 *err = BADGE_ERROR_INVALID_PARAMETER;
1008 if (!writable_pkgs) {
1009 ERR("writable_pkgs is NULL");
1011 *err = BADGE_ERROR_INVALID_PARAMETER;
1016 badge = (badge_h *)malloc(sizeof(struct _badge_h));
1018 ERR("fail to alloc handle");
1020 *err = BADGE_ERROR_OUT_OF_MEMORY;
1024 badge->pkgname = strdup(pkgname);
1025 badge->writable_pkgs = strdup(writable_pkgs);
1027 *err = BADGE_ERROR_NONE;
1032 char *_badge_pkgs_new(int *err, const char *pkg1, ...)
1034 char *caller_pkgname = NULL;
1036 char *result = NULL;
1040 char *new_pkgs = NULL;
1044 *err = BADGE_ERROR_NONE;
1046 caller_pkgname = _badge_get_pkgname_by_pid();
1047 if (!caller_pkgname) {
1048 ERR("fail to get caller pkgname");
1050 *err = BADGE_ERROR_PERMISSION_DENIED;
1055 WARN("pkg1 is NULL");
1056 return caller_pkgname;
1059 length = strlen(pkg1);
1060 va_start(args, pkg1);
1061 s = va_arg(args, char *);
1063 length += strlen(s) ;
1064 s = va_arg(args, char *);
1069 WARN("length is %d", length);
1070 return caller_pkgname;
1073 result = g_new0(char, length + 1); /* 1 for null terminate */
1075 ERR("fail to alloc memory");
1077 *err = BADGE_ERROR_OUT_OF_MEMORY;
1078 free(caller_pkgname);
1083 ptr = g_stpcpy(ptr, pkg1);
1084 va_start(args, pkg1);
1085 s = va_arg(args, char *);
1087 ptr = g_stpcpy(ptr, s);
1088 s = va_arg(args, char *);
1092 if (g_strstr_len(result, -1, caller_pkgname) == NULL) {
1093 new_pkgs = g_strdup_printf("%s%s", caller_pkgname, result);
1095 ERR("fail to alloc memory");
1097 *err = BADGE_ERROR_OUT_OF_MEMORY;
1100 free(caller_pkgname);
1107 free(caller_pkgname);
1112 char *_badge_pkgs_new_valist(int *err, const char *pkg1, va_list args)
1114 char *caller_pkgname = NULL;
1116 char *result = NULL;
1120 char *new_pkgs = NULL;
1123 *err = BADGE_ERROR_NONE;
1125 caller_pkgname = _badge_get_pkgname_by_pid();
1126 if (!caller_pkgname) {
1127 ERR("fail to get caller pkgname");
1129 *err = BADGE_ERROR_PERMISSION_DENIED;
1134 WARN("pkg1 is NULL");
1135 return caller_pkgname;
1138 G_VA_COPY(args2, args);
1140 length = strlen(pkg1);
1141 s = va_arg(args, char *);
1143 length += strlen(s) ;
1144 s = va_arg(args, char *);
1148 WARN("length is %d", length);
1150 return caller_pkgname;
1153 result = g_new0(char, length + 1); /* 1 for null terminate */
1155 ERR("fail to alloc memory");
1157 *err = BADGE_ERROR_OUT_OF_MEMORY;
1158 free(caller_pkgname);
1164 ptr = g_stpcpy(ptr, pkg1);
1165 s = va_arg(args2, char *);
1167 ptr = g_stpcpy(ptr, s);
1168 s = va_arg(args2, char *);
1172 if (g_strstr_len(result, -1, caller_pkgname) == NULL) {
1173 new_pkgs = g_strdup_printf("%s%s", caller_pkgname, result);
1175 ERR("fail to alloc memory");
1177 *err = BADGE_ERROR_OUT_OF_MEMORY;
1180 free(caller_pkgname);
1187 free(caller_pkgname);