3a2c3a6e7b5112c17ad2f047b04e922a750edb9d
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_pkginfo.c
1 /*
2  * pkgmgr-info
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7  * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
8  *
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
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
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.
20  *
21  */
22
23 #define _GNU_SOURCE
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <stdbool.h>
28 #include <unistd.h>
29 #include <ctype.h>
30 #include <sys/smack.h>
31 #include <linux/limits.h>
32 #include <libgen.h>
33 #include <sys/stat.h>
34
35 #include <sqlite3.h>
36 #include <glib.h>
37
38 #include "pkgmgrinfo_basic.h"
39 #include "pkgmgrinfo_private.h"
40 #include "pkgmgrinfo_debug.h"
41 #include "pkgmgr-info.h"
42
43 static bool _get_bool_value(const char *str)
44 {
45         if (str && !strcmp(str, "true"))
46                 return true;
47         else
48                 return false;
49 }
50
51 static gint __compare_func(gconstpointer data1, gconstpointer data2)
52 {
53         pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x *)data1;
54         pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x *)data2;
55         if (node1->prop == node2->prop)
56                 return 0;
57         else if (node1->prop > node2->prop)
58                 return 1;
59         else
60                 return -1;
61 }
62
63 static gint __pkg_disable_chk_func(gconstpointer data1, gconstpointer data2)
64 {
65         pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data1;
66
67         if (node->prop == E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE)
68                 return 0;
69         else
70                 return 1;
71 }
72
73 static void __destroy_each_node(gpointer data, gpointer user_data)
74 {
75         ret_if(data == NULL);
76         pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data;
77         if (node->value) {
78                 free(node->value);
79                 node->value = NULL;
80         }
81         if (node->key) {
82                 free(node->key);
83                 node->key = NULL;
84         }
85         free(node);
86         node = NULL;
87 }
88
89 static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data)
90 {
91         ret_if(data == NULL);
92         if (data->locale) {
93                 free((void *)data->locale);
94                 data->locale = NULL;
95         }
96
97         pkgmgrinfo_basic_free_package(data->pkg_info);
98         free((void *)data);
99         data = NULL;
100         return;
101 }
102
103 long long _pkgmgr_calculate_dir_size(char *dirname)
104 {
105         long long total = 0;
106         long long ret = 0;
107         int q = 0; /*quotient*/
108         int r = 0; /*remainder*/
109         DIR *dp = NULL;
110         struct dirent ep, *result;
111         struct stat fileinfo;
112         char abs_filename[FILENAME_MAX] = { 0, };
113         retvm_if(dirname == NULL, PMINFO_R_ERROR, "dirname is NULL");
114
115         dp = opendir(dirname);
116         if (dp == NULL) {
117                 _LOGE("Couldn't open the directory\n");
118                 return -1;
119         }
120
121         for (ret = readdir_r(dp, &ep, &result);
122                         ret == 0 && result != NULL;
123                         ret = readdir_r(dp, &ep, &result)) {
124                 if (!strcmp(ep.d_name, ".") ||
125                         !strcmp(ep.d_name, "..")) {
126                         continue;
127                 }
128                 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
129                          ep.d_name);
130                 if (lstat(abs_filename, &fileinfo) < 0)
131                         perror(abs_filename);
132                 else {
133                         if (S_ISDIR(fileinfo.st_mode)) {
134                                 total += fileinfo.st_size;
135                                 if (strcmp(ep.d_name, ".")
136                                     && strcmp(ep.d_name, "..")) {
137                                         ret = _pkgmgr_calculate_dir_size
138                                             (abs_filename);
139                                         total = total + ret;
140                                 }
141                         } else if (S_ISLNK(fileinfo.st_mode)) {
142                                 continue;
143                         } else {
144                                 /*It is a file. Calculate the actual
145                                 size occupied (in terms of 4096 blocks)*/
146                         q = (fileinfo.st_size / BLOCK_SIZE);
147                         r = (fileinfo.st_size % BLOCK_SIZE);
148                         if (r)
149                                 q = q + 1;
150                         total += q * BLOCK_SIZE;
151                         }
152                 }
153         }
154         (void)closedir(dp);
155         return total;
156
157 }
158
159 static int _pkginfo_add_description_info_into_list(const char *locale,
160                 char *record, GList **description)
161 {
162         description_x *info;
163
164         info = calloc(1, sizeof(description_x));
165         if (info == NULL) {
166                 LOGE("out of memory");
167                 return PMINFO_R_ERROR;
168         }
169         info->lang = strdup(locale);
170         info->text = record;
171         *description = g_list_append(*description, info);
172
173         return PMINFO_R_OK;
174 }
175
176 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
177                 GList **privileges)
178 {
179         static const char query_raw[] =
180                 "SELECT DISTINCT privilege, type FROM package_privilege_info "
181                 "WHERE package=%Q";
182         int ret;
183         char *query;
184         sqlite3_stmt *stmt;
185         privilege_x *privilege;
186
187         query = sqlite3_mprintf(query_raw, pkgid);
188         if (query == NULL) {
189                 LOGE("out of memory");
190                 return PMINFO_R_ERROR;
191         }
192
193         ret = sqlite3_prepare_v2(db, query, strlen(query),
194                         &stmt, NULL);
195         sqlite3_free(query);
196         if (ret != SQLITE_OK) {
197                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
198                 return PMINFO_R_ERROR;
199         }
200
201         while (sqlite3_step(stmt) == SQLITE_ROW) {
202                 privilege = calloc(1, sizeof(privilege_x));
203                 _save_column_str(stmt, 0, &privilege->value);
204                 _save_column_str(stmt, 1, &privilege->type);
205                 *privileges = g_list_append(*privileges,
206                                 (gpointer)privilege);
207         }
208
209         sqlite3_finalize(stmt);
210
211         return PMINFO_R_OK;
212 }
213
214 static const char join_localized_info[] =
215         " LEFT OUTER JOIN package_localized_info"
216         "  ON pi.package=package_localized_info.package"
217         "  AND package_localized_info.package_locale=?";
218 static const char join_privilege_info[] =
219         " LEFT OUTER JOIN package_privilege_info"
220         "  ON pi.package=package_privilege_info.package";
221
222 static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
223                 const char *locale, char **query, GList **bind_params)
224 {
225         int joined = 0;
226         char buf[MAX_QUERY_LEN] = { '\0' };
227         char buf2[MAX_QUERY_LEN] = { '\0' };
228         char *condition = NULL;
229         size_t len = 0;
230         GSList *list = NULL;
231
232         if (filter == NULL)
233                 return PMINFO_R_OK;
234
235         len += strlen(" WHERE 1=1 ");
236         strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1);
237         for (list = filter->list; list; list = list->next) {
238                 joined |= __get_filter_condition(list->data, &condition,
239                                 bind_params);
240                 if (condition == NULL)
241                         continue;
242
243                 len += strlen(" AND ");
244                 strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
245
246                 len += strlen(condition);
247                 strncat(buf, condition, sizeof(buf) - len - 1);
248                 free(condition);
249                 condition = NULL;
250         }
251
252         if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
253                 strncat(buf2, join_localized_info, MAX_QUERY_LEN - len - 1);
254                 len += strlen(join_localized_info);
255                 *bind_params = g_list_append(*bind_params, strdup(locale));
256         }
257         if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO) {
258                 strncat(buf2, join_privilege_info, MAX_QUERY_LEN - len - 1);
259                 len += strlen(join_privilege_info);
260         }
261         strncat(buf2, buf, MAX_QUERY_LEN - len - 1);
262
263         *query = strdup(buf2);
264         if (*query == NULL)
265                 return PMINFO_R_ERROR;
266
267         return PMINFO_R_OK;
268 }
269
270 static void __free_packages(gpointer data)
271 {
272         pkgmgrinfo_basic_free_package((package_x *)data);
273 }
274
275 static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter)
276 {
277         GSList *link;
278
279         if (filter == NULL)
280                 return false;
281
282         link = g_slist_find_custom(filter->list, NULL, __pkg_disable_chk_func);
283         if (link)
284                 return true;
285
286         return false;
287 }
288
289 static int __bind_params(sqlite3_stmt *stmt, GList *params)
290 {
291         GList *tmp_list = NULL;
292         int idx = 0;
293         int ret;
294
295         if (stmt == NULL || params == NULL)
296                 return PMINFO_R_EINVAL;
297
298         tmp_list = params;
299         while (tmp_list) {
300                 ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC);
301                 if (ret != SQLITE_OK)
302                         return PMINFO_R_ERROR;
303                 tmp_list = tmp_list->next;
304         }
305
306         return PMINFO_R_OK;
307 }
308
309 static int _pkginfo_get_packages(uid_t uid, const char *locale,
310                 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
311 {
312         static const char query_raw[] =
313                 "SELECT DISTINCT pi.package, pi.package_version, "
314                 "pi.install_location, pi.package_removable, "
315                 "pi.package_preload, pi.package_readonly, pi.package_update, "
316                 "pi.package_appsetting, pi.package_system, pi.package_type, "
317                 "pi.package_size, pi.installed_time, pi.installed_storage, "
318                 "pi.storeclient_id, pi.mainapp_id, pi.package_url, "
319                 "pi.root_path, pi.csc_path, pi.package_nodisplay, "
320                 "pi.package_api_version, pi.package_support_disable, "
321                 "pi.package_tep_name, pi.package_zip_mount_file, pi.external_path, "
322                 "pi.package_support_mode";
323         static const char query_author[] =
324                 ", pi.author_name, pi.author_email, pi.author_href";
325         static const char query_label[] =
326                 ", COALESCE("
327                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
328                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
329         static const char query_icon[] =
330                 ", COALESCE("
331                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
332                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
333         static const char query_description[] =
334                 ", COALESCE("
335                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
336                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
337         static const char query_from_clause[] = " FROM package_info as pi";
338         int ret = PMINFO_R_ERROR;
339         int idx = 0;
340         int query_len = 0;
341         char *dbpath;
342         char *tmp_record = NULL;
343         char *constraints = NULL;
344         char query[MAX_QUERY_LEN] = { '\0' };
345         package_x *info = NULL;
346         author_x *author = NULL;
347         GList *bind_params = NULL;
348         sqlite3 *db;
349         sqlite3_stmt *stmt;
350         pkgmgrinfo_filter_x *tmp_filter = NULL;
351
352         dbpath = getUserPkgParserDBPathUID(uid);
353         if (dbpath == NULL)
354                 return PMINFO_R_ERROR;
355
356         ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
357         if (ret != SQLITE_OK) {
358                 _LOGD("failed to open db: %d", ret);
359                 free(dbpath);
360                 return PMINFO_R_ERROR;
361         }
362         free(dbpath);
363
364         if (filter != NULL) {
365                 tmp_filter = filter;
366         } else {
367                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
368                 if (ret != PMINFO_R_OK) {
369                         _LOGE("Failed to create filter");
370                         return PMINFO_R_ERROR;
371                 }
372         }
373
374         query_len = strlen(query_raw);
375         snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
376         if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
377                 strncat(query, query_author, MAX_QUERY_LEN - query_len - 1);
378                 query_len += strlen(query_author);
379         }
380         if (flag & PMINFO_PKGINFO_GET_LABEL) {
381                 strncat(query, query_label, MAX_QUERY_LEN - query_len - 1);
382                 query_len += strlen(query_label);
383                 bind_params = g_list_append(bind_params, strdup(locale));
384         }
385         if (flag & PMINFO_PKGINFO_GET_ICON) {
386                 strncat(query, query_icon, MAX_QUERY_LEN - query_len - 1);
387                 query_len += strlen(query_icon);
388                 bind_params = g_list_append(bind_params, strdup(locale));
389         }
390         if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
391                 strncat(query, query_description, MAX_QUERY_LEN - query_len - 1);
392                 query_len += strlen(query_description);
393                 bind_params = g_list_append(bind_params, strdup(locale));
394         }
395
396         strncat(query, query_from_clause, MAX_QUERY_LEN - query_len - 1);
397         query_len += strlen(query_from_clause);
398
399         ret = _get_filtered_query(tmp_filter, locale, &constraints, &bind_params);
400         if (ret != PMINFO_R_OK) {
401                 LOGE("Failed to get WHERE clause");
402                 goto catch;
403         }
404
405         if (constraints)
406                 strncat(query, constraints, MAX_QUERY_LEN - query_len - 1);
407
408         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
409         if (ret != SQLITE_OK) {
410                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
411                 ret = PMINFO_R_ERROR;
412                 goto catch;
413         }
414
415         ret = __bind_params(stmt, bind_params);
416         if (ret != SQLITE_OK) {
417                 LOGE("Failed to bind parameters");
418                 goto catch;
419         }
420
421         while (sqlite3_step(stmt) == SQLITE_ROW) {
422                 info = calloc(1, sizeof(package_x));
423                 if (info == NULL) {
424                         LOGE("out of memory");
425                         sqlite3_finalize(stmt);
426                         sqlite3_close_v2(db);
427                         return PMINFO_R_ERROR;
428                 }
429                 idx = 0;
430                 _save_column_str(stmt, idx++, &info->package);
431                 if (g_hash_table_contains(packages,
432                                         (gconstpointer)info->package)) {
433                         free(info->package);
434                         free(info);
435                         continue;
436                 }
437                 _save_column_str(stmt, idx++, &info->version);
438                 _save_column_str(stmt, idx++, &info->installlocation);
439                 _save_column_str(stmt, idx++, &info->removable);
440                 _save_column_str(stmt, idx++, &info->preload);
441                 _save_column_str(stmt, idx++, &info->readonly);
442                 _save_column_str(stmt, idx++, &info->update);
443                 _save_column_str(stmt, idx++, &info->appsetting);
444                 _save_column_str(stmt, idx++, &info->system);
445                 _save_column_str(stmt, idx++, &info->type);
446                 _save_column_str(stmt, idx++, &info->package_size);
447                 _save_column_str(stmt, idx++, &info->installed_time);
448                 _save_column_str(stmt, idx++, &info->installed_storage);
449                 _save_column_str(stmt, idx++, &info->storeclient_id);
450                 _save_column_str(stmt, idx++, &info->mainapp_id);
451                 _save_column_str(stmt, idx++, &info->package_url);
452                 _save_column_str(stmt, idx++, &info->root_path);
453                 _save_column_str(stmt, idx++, &info->csc_path);
454                 _save_column_str(stmt, idx++, &info->nodisplay_setting);
455                 _save_column_str(stmt, idx++, &info->api_version);
456                 _save_column_str(stmt, idx++, &info->support_disable);
457                 _save_column_str(stmt, idx++, &info->tep_name);
458                 _save_column_str(stmt, idx++, &info->zip_mount_file);
459                 _save_column_str(stmt, idx++, &info->external_path);
460                 _save_column_str(stmt, idx++, &info->support_mode);
461                 info->for_all_users =
462                         strdup((uid != GLOBAL_USER) ? "false" : "true");
463
464                 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
465                         /* TODO : author should be retrieved at package_localized_info */
466                         author = calloc(1, sizeof(author_x));
467                         if (author == NULL) {
468                                 pkgmgrinfo_basic_free_package(info);
469                                 sqlite3_finalize(stmt);
470                                 sqlite3_close_v2(db);
471                                 return PMINFO_R_ERROR;
472                         }
473                         _save_column_str(stmt, idx++, &author->text);
474                         _save_column_str(stmt, idx++, &author->email);
475                         _save_column_str(stmt, idx++, &author->href);
476                         info->author = g_list_append(info->author, author);
477                 }
478
479                 if (flag & PMINFO_PKGINFO_GET_LABEL) {
480                         tmp_record = NULL;
481                         _save_column_str(stmt, idx++, &tmp_record);
482
483                         if (_add_label_info_into_list(locale, tmp_record, &info->label)) {
484                                 pkgmgrinfo_basic_free_package(info);
485                                 sqlite3_finalize(stmt);
486                                 sqlite3_close_v2(db);
487                                 return PMINFO_R_ERROR;
488                         }
489                 }
490
491                 if (flag & PMINFO_PKGINFO_GET_ICON) {
492                         tmp_record = NULL;
493                         _save_column_str(stmt, idx++, &tmp_record);
494                         if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) {
495                                 pkgmgrinfo_basic_free_package(info);
496                                 sqlite3_finalize(stmt);
497                                 sqlite3_close_v2(db);
498                                 return PMINFO_R_ERROR;
499                         }
500                 }
501
502                 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
503                         tmp_record = NULL;
504                         _save_column_str(stmt, idx++, &tmp_record);
505                         if (_pkginfo_add_description_info_into_list(locale, tmp_record,
506                                         &info->description)) {
507                                 pkgmgrinfo_basic_free_package(info);
508                                 sqlite3_finalize(stmt);
509                                 sqlite3_close_v2(db);
510                                 return PMINFO_R_ERROR;
511                         }
512                 }
513
514                 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
515                         if (_pkginfo_get_privilege(db, info->package,
516                                                 &info->privileges)) {
517                                 pkgmgrinfo_basic_free_package(info);
518                                 sqlite3_finalize(stmt);
519                                 sqlite3_close_v2(db);
520                                 return PMINFO_R_ERROR;
521                         }
522                 }
523
524                 if (__pkginfo_check_installed_storage(info) != PMINFO_R_OK) {
525                         ret = PMINFO_R_ERROR;
526                         pkgmgrinfo_basic_free_package(info);
527                         info = NULL;
528                         continue;
529                 }
530
531                 g_hash_table_insert(packages, (gpointer)info->package,
532                                 (gpointer)info);
533         }
534
535         ret = PMINFO_R_OK;
536
537 catch:
538         if (constraints)
539                 free(constraints);
540
541         if (ret != PMINFO_R_OK && info != NULL)
542                 pkgmgrinfo_basic_free_package(info);
543
544         if (filter == NULL)
545                 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
546
547         g_list_free_full(bind_params, free);
548         sqlite3_close_v2(db);
549         sqlite3_finalize(stmt);
550
551         return ret;
552 }
553
554 static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
555                 pkgmgrinfo_filter_x *filter, int flag,
556                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
557 {
558         int ret;
559         char *locale;
560         package_x *pkg;
561         pkgmgr_pkginfo_x info;
562         pkgmgrinfo_filter_x *tmp_filter = NULL;
563         GHashTable *list;
564         GHashTableIter iter;
565         gpointer value;
566
567         locale = _get_system_locale();
568         if (locale == NULL)
569                 return PMINFO_R_ERROR;
570
571         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
572                         __free_packages);
573         if (list == NULL) {
574                 free(locale);
575                 return PMINFO_R_ERROR;
576         }
577
578         if (filter != NULL) {
579                 tmp_filter = (pkgmgrinfo_filter_x *)filter;
580         } else {
581                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
582                 if (ret != PMINFO_R_OK) {
583                         _LOGE("Failed to create filter");
584                         return PMINFO_R_ERROR;
585                 }
586         }
587
588         if (__check_disable_filter_exist(tmp_filter) == false)
589                 pkgmgrinfo_pkginfo_filter_add_bool(tmp_filter,
590                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
591
592         ret = _pkginfo_get_packages(uid, locale, filter, flag, list);
593         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
594                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
595                                 flag, list);
596
597         if (ret != PMINFO_R_OK) {
598                 g_hash_table_destroy(list);
599                 free(locale);
600                 if (filter == NULL)
601                         pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
602                 return PMINFO_R_ERROR;
603         }
604
605         g_hash_table_iter_init(&iter, list);
606         while (g_hash_table_iter_next(&iter, NULL, &value)) {
607                 pkg = (package_x *)value;
608                 info.uid = uid;
609                 info.pkg_info = pkg;
610                 info.locale = locale;
611                 if (pkg_list_cb(&info, user_data) < 0)
612                         break;
613         }
614
615         g_hash_table_destroy(list);
616         free(locale);
617
618         if (filter == NULL)
619                 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
620
621         return PMINFO_R_OK;
622 }
623
624 static int _pkgmgrinfo_get_pkginfo(const char *pkgid, uid_t uid,
625         pkgmgrinfo_pkginfo_filter_h filter, pkgmgrinfo_pkginfo_h *handle)
626 {
627         int ret;
628         char *locale;
629         GHashTable *list;
630         pkgmgr_pkginfo_x *info;
631
632         if (pkgid == NULL || filter == NULL || handle == NULL) {
633                         LOGE("invalid parameter");
634                         return PMINFO_R_EINVAL;
635         }
636
637         locale = _get_system_locale();
638         if (locale == NULL)
639                 return PMINFO_R_ERROR;
640
641         list = g_hash_table_new(g_str_hash, g_str_equal);
642         if (list == NULL) {
643                 pkgmgrinfo_pkginfo_filter_destroy(filter);
644                 free(locale);
645                 return PMINFO_R_ERROR;
646         }
647
648         ret = _pkginfo_get_packages(uid, locale, filter,
649                         PMINFO_PKGINFO_GET_ALL, list);
650         if (!g_hash_table_size(list) && uid != GLOBAL_USER)
651                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
652                                 PMINFO_PKGINFO_GET_ALL, list);
653
654         if (!g_hash_table_size(list)) {
655                 _LOGI("pkginfo for [%s] is not existed for user [%d]",
656                                 pkgid, uid);
657                 g_hash_table_destroy(list);
658                 free(locale);
659                 return PMINFO_R_ENOENT;
660         }
661
662         info = calloc(1, sizeof(pkgmgr_pkginfo_x));
663         if (info == NULL) {
664                 _LOGE("out of memory");
665                 g_hash_table_destroy(list);
666                 free(locale);
667                 return PMINFO_R_ERROR;
668         }
669
670         info->uid = uid;
671         info->pkg_info = (package_x *)g_hash_table_lookup(list, pkgid);
672         info->locale = locale;
673
674         /* just free list only */
675         g_hash_table_destroy(list);
676
677         *handle = info;
678
679         return ret;
680
681
682 }
683
684 API int pkgmgrinfo_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid,
685                 pkgmgrinfo_pkginfo_h *handle)
686 {
687         int ret;
688         pkgmgrinfo_pkginfo_filter_h filter;
689
690         if (pkgid == NULL || handle == NULL) {
691                 LOGE("invalid parameter");
692                 return PMINFO_R_EINVAL;
693         }
694
695         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
696         if (ret != PMINFO_R_OK)
697                 return ret;
698
699         ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
700                         PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
701         if (ret != PMINFO_R_OK) {
702                 pkgmgrinfo_pkginfo_filter_destroy(filter);
703                 return PMINFO_R_ERROR;
704         }
705
706         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
707                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
708         if (ret != PMINFO_R_OK) {
709                 pkgmgrinfo_pkginfo_filter_destroy(filter);
710                 return PMINFO_R_ERROR;
711         }
712
713         ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
714         pkgmgrinfo_pkginfo_filter_destroy(filter);
715
716         return ret;
717 }
718
719 API int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid,
720                 pkgmgrinfo_pkginfo_h *handle)
721 {
722         return pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, _getuid(), handle);
723 }
724
725 API int pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(const char *pkgid,
726                 uid_t uid, pkgmgrinfo_pkginfo_h *handle)
727 {
728         int ret;
729         char *locale;
730         GHashTable *list;
731         pkgmgrinfo_pkginfo_filter_h filter;
732         pkgmgr_pkginfo_x *info;
733
734         if (pkgid == NULL || handle == NULL) {
735                 LOGE("invalid parameter");
736                 return PMINFO_R_EINVAL;
737         }
738
739         locale = _get_system_locale();
740         if (locale == NULL)
741                 return PMINFO_R_ERROR;
742
743         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
744         if (ret != PMINFO_R_OK) {
745                 free(locale);
746                 return ret;
747         }
748
749         ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
750                         PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
751         if (ret != PMINFO_R_OK) {
752                 pkgmgrinfo_pkginfo_filter_destroy(filter);
753                 free(locale);
754                 return PMINFO_R_ERROR;
755         }
756
757         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
758                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
759         if (ret != PMINFO_R_OK) {
760                 pkgmgrinfo_pkginfo_filter_destroy(filter);
761                 free(locale);
762                 return PMINFO_R_ERROR;
763         }
764
765         list = g_hash_table_new(g_str_hash, g_str_equal);
766         if (list == NULL) {
767                 pkgmgrinfo_pkginfo_filter_destroy(filter);
768                 free(locale);
769                 return PMINFO_R_ERROR;
770         }
771
772         ret = _pkginfo_get_packages(uid, locale, filter,
773                         PMINFO_PKGINFO_GET_ALL, list);
774         if (!g_hash_table_size(list) && uid != GLOBAL_USER)
775                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
776                                 PMINFO_PKGINFO_GET_ALL, list);
777
778         pkgmgrinfo_pkginfo_filter_destroy(filter);
779         if (ret != PMINFO_R_OK) {
780                 g_hash_table_destroy(list);
781                 free(locale);
782                 return ret;
783         }
784
785         if (!g_hash_table_size(list)) {
786                 _LOGI("disabled pkginfo for [%s] is not existed for user [%d]",
787                                 pkgid, uid);
788                 g_hash_table_destroy(list);
789                 free(locale);
790                 return PMINFO_R_ENOENT;
791         }
792
793         info = calloc(1, sizeof(pkgmgr_pkginfo_x));
794         if (info == NULL) {
795                 _LOGE("out of memory");
796                 g_hash_table_destroy(list);
797                 free(locale);
798                 return PMINFO_R_ERROR;
799         }
800
801         info->uid = uid;
802         info->pkg_info = (package_x *)g_hash_table_lookup(list, pkgid);
803         info->locale = locale;
804
805         /* just free list only */
806         g_hash_table_destroy(list);
807
808         *handle = info;
809
810         return ret;
811 }
812
813 API int pkgmgrinfo_pkginfo_get_usr_all_pkginfo(const char *pkgid, uid_t uid,
814                 pkgmgrinfo_pkginfo_h *handle)
815 {
816
817         int ret;
818         pkgmgrinfo_pkginfo_filter_h filter;
819
820         if (pkgid == NULL || handle == NULL) {
821                 LOGE("invalid parameter");
822                 return PMINFO_R_EINVAL;
823         }
824
825         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
826         if (ret != PMINFO_R_OK)
827                 return ret;
828
829         ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
830                         PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
831         if (ret != PMINFO_R_OK) {
832                 pkgmgrinfo_pkginfo_filter_destroy(filter);
833                 return PMINFO_R_ERROR;
834         }
835
836         ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
837         pkgmgrinfo_pkginfo_filter_destroy(filter);
838
839         return ret;
840 }
841
842 API int pkgmgrinfo_pkginfo_get_disabled_pkginfo(const char *pkgid,
843                 pkgmgrinfo_pkginfo_h *handle)
844 {
845         return pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(pkgid, _getuid(),
846                         handle);
847 }
848
849 API int pkgmgrinfo_pkginfo_get_all_pkginfo(const char *pkgid,
850                 pkgmgrinfo_pkginfo_h *handle)
851 {
852         return pkgmgrinfo_pkginfo_get_usr_all_pkginfo(pkgid, _getuid(), handle);
853 }
854
855 API int pkgmgrinfo_pkginfo_get_usr_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
856                 int flag, void *user_data, uid_t uid)
857 {
858         if (pkg_list_cb == NULL) {
859                 LOGE("invalid parameter");
860                 return PMINFO_R_EINVAL;
861         }
862
863         return _pkginfo_get_filtered_foreach_pkginfo(uid, NULL, flag,
864                         pkg_list_cb, user_data);
865 }
866
867 API int pkgmgrinfo_pkginfo_get_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
868                 int flag, void *user_data)
869 {
870         return pkgmgrinfo_pkginfo_get_usr_list_full(pkg_list_cb, flag,
871                         user_data, _getuid());
872 }
873
874 API int pkgmgrinfo_pkginfo_get_usr_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
875                 void *user_data, uid_t uid)
876 {
877         if (pkg_list_cb == NULL) {
878                 LOGE("invalid parameter");
879                 return PMINFO_R_EINVAL;
880         }
881
882         return _pkginfo_get_filtered_foreach_pkginfo(uid, NULL,
883                         PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
884 }
885
886 API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
887                 void *user_data)
888 {
889         return pkgmgrinfo_pkginfo_get_usr_list(pkg_list_cb, user_data,
890                         _getuid());
891 }
892
893 API int pkgmgrinfo_pkginfo_get_usr_disabled_list(
894                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data, uid_t uid)
895 {
896         int ret;
897         pkgmgrinfo_pkginfo_filter_h filter;
898
899         if (pkg_list_cb == NULL) {
900                 LOGE("invalid parameter");
901                 return PMINFO_R_EINVAL;
902         }
903
904         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
905         if (ret != PMINFO_R_OK)
906                 return ret;
907
908         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
909                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
910         if (ret != PMINFO_R_OK) {
911                 pkgmgrinfo_pkginfo_filter_destroy(filter);
912                 return PMINFO_R_ERROR;
913         }
914
915         ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter,
916                         PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
917
918         pkgmgrinfo_pkginfo_filter_destroy(filter);
919
920         return ret;
921 }
922
923 API int pkgmgrinfo_pkginfo_get_disabled_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
924                 void *user_data)
925 {
926         return pkgmgrinfo_pkginfo_get_usr_disabled_list(pkg_list_cb, user_data,
927                         _getuid());
928 }
929
930 API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name)
931 {
932         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
933
934         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
935         retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
936
937         if (info->pkg_info == NULL || info->pkg_info->package == NULL)
938                 return PMINFO_R_ERROR;
939
940         *pkg_name = (char *)info->pkg_info->package;
941
942         return PMINFO_R_OK;
943 }
944
945 API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid)
946 {
947         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
948
949         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
950         retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
951
952         if (info->pkg_info == NULL || info->pkg_info->package == NULL)
953                 return PMINFO_R_ERROR;
954
955         *pkgid = (char *)info->pkg_info->package;
956
957         return PMINFO_R_OK;
958 }
959
960 API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type)
961 {
962         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
963
964         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
965         retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
966
967         if (info->pkg_info == NULL)
968                 return PMINFO_R_ERROR;
969
970         if (info->pkg_info->type == NULL)
971                 *type = "";
972         else
973                 *type = (char *)info->pkg_info->type;
974
975         return PMINFO_R_OK;
976 }
977
978 API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version)
979 {
980         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
981
982         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
983         retvm_if(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
984
985         if (info->pkg_info == NULL)
986                 return PMINFO_R_ERROR;
987
988         if (info->pkg_info->version == NULL)
989                 *version = "";
990         else
991                 *version = (char *)info->pkg_info->version;
992
993         return PMINFO_R_OK;
994 }
995
996 API int pkgmgrinfo_pkginfo_get_api_version(pkgmgrinfo_pkginfo_h handle, char **api_version)
997 {
998         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
999
1000         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1001         retvm_if(api_version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1002
1003         if (info->pkg_info == NULL)
1004                 return PMINFO_R_ERROR;
1005
1006         if (info->pkg_info->api_version == NULL)
1007                 *api_version = "";
1008         else
1009                 *api_version = (char *)info->pkg_info->api_version;
1010
1011         return PMINFO_R_OK;
1012 }
1013
1014 API int pkgmgrinfo_pkginfo_get_tep_name(pkgmgrinfo_pkginfo_h handle, char **tep_name)
1015 {
1016         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1017
1018         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1019         retvm_if(tep_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1020
1021         if (info->pkg_info == NULL || info->pkg_info->tep_name == NULL)
1022                 return PMINFO_R_ERROR;
1023
1024         *tep_name = (char *)info->pkg_info->tep_name;
1025
1026         return PMINFO_R_OK;
1027 }
1028
1029 API int pkgmgrinfo_pkginfo_get_zip_mount_file(pkgmgrinfo_pkginfo_h handle, char **zip_mount_file)
1030 {
1031         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1032
1033         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1034         retvm_if(zip_mount_file == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1035
1036         if (info->pkg_info == NULL)
1037                 return PMINFO_R_ERROR;
1038
1039         if (info->pkg_info->zip_mount_file == NULL)
1040                 *zip_mount_file = "";
1041         else
1042                 *zip_mount_file = (char *)info->pkg_info->zip_mount_file;
1043
1044         return PMINFO_R_OK;
1045 }
1046
1047 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
1048 {
1049         char *val;
1050         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1051
1052         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1053         retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1054
1055         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1056                 return PMINFO_R_ERROR;
1057
1058         val = (char *)info->pkg_info->installlocation;
1059         if (strcmp(val, "internal-only") == 0)
1060                 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
1061         else if (strcmp(val, "prefer-external") == 0)
1062                 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
1063         else
1064                 *location = PMINFO_INSTALL_LOCATION_AUTO;
1065
1066         return PMINFO_R_OK;
1067 }
1068
1069 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
1070 {
1071         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1072         char *temp = NULL;
1073
1074         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1075         retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1076
1077         if (info->pkg_info == NULL)
1078                 return PMINFO_R_ERROR;
1079
1080         if (info->pkg_info->package_size == NULL) {
1081                 temp = strdup("");
1082                 if (temp == NULL) {
1083                         _LOGE("out of memory");
1084                         return PMINFO_R_ERROR;
1085                 } else {
1086                         info->pkg_info->package_size = temp;
1087                 }
1088         }
1089
1090         *size = atoi((char *)info->pkg_info->package_size);
1091
1092         return PMINFO_R_OK;
1093 }
1094
1095 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
1096 {
1097         icon_x *ptr;
1098         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1099
1100         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1101         retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1102
1103         if (info->pkg_info == NULL || info->pkg_info->icon == NULL)
1104                 return PMINFO_R_ERROR;
1105
1106         ptr = (icon_x *)info->pkg_info->icon->data;
1107         if (ptr == NULL)
1108                 return PMINFO_R_ERROR;
1109
1110         /* TODO : should we return empty string if there was no icon? */
1111         if (ptr->text == NULL)
1112                 *icon = "";
1113         else
1114                 *icon = ptr->text;
1115
1116         return PMINFO_R_OK;
1117 }
1118
1119 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
1120 {
1121         label_x *ptr;
1122         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1123
1124         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1125         retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1126
1127         if (info->pkg_info == NULL || info->pkg_info->label == NULL)
1128                 return PMINFO_R_ERROR;
1129
1130         ptr = (label_x *)info->pkg_info->label->data;
1131         if (ptr == NULL)
1132                 return PMINFO_R_ERROR;
1133
1134         /* TODO : should we return empty string if there was no label? */
1135         if (ptr->text == NULL)
1136                 *label = "";
1137         else
1138                 *label = ptr->text;
1139
1140         return PMINFO_R_OK;
1141 }
1142
1143 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
1144 {
1145         description_x *ptr;
1146         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1147
1148         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1149         retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1150
1151         if (info->pkg_info == NULL || info->pkg_info->description == NULL)
1152                 return PMINFO_R_ERROR;
1153
1154         ptr = (description_x *)info->pkg_info->description->data;
1155         if (ptr == NULL)
1156                 return PMINFO_R_ERROR;
1157
1158         if (ptr->text == NULL)
1159                 *description = "";
1160         else
1161                 *description = (char *)ptr->text;
1162
1163         return PMINFO_R_OK;
1164 }
1165
1166 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
1167 {
1168         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1169         author_x *author;
1170
1171         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1172         retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1173
1174         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1175                 return PMINFO_R_ERROR;
1176
1177         author = (author_x *)info->pkg_info->author->data;
1178         if (author == NULL)
1179                 return PMINFO_R_ERROR;
1180
1181         if (author->text == NULL)
1182                 *author_name = "";
1183         else
1184                 *author_name = (char *)author->text;
1185
1186         return PMINFO_R_OK;
1187 }
1188
1189 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
1190 {
1191         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1192         author_x *author;
1193
1194         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1195         retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1196
1197         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1198                 return PMINFO_R_ERROR;
1199
1200         author = (author_x *)info->pkg_info->author->data;
1201         if (author == NULL)
1202                 return PMINFO_R_ERROR;
1203
1204         if (author->email == NULL)
1205                 *author_email = "";
1206         else
1207                 *author_email = (char *)author->email;
1208
1209         return PMINFO_R_OK;
1210 }
1211
1212 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
1213 {
1214         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1215         author_x *author;
1216
1217         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1218         retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1219
1220         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1221                 return PMINFO_R_ERROR;
1222
1223         author = (author_x *)info->pkg_info->author->data;
1224         if (author == NULL)
1225                 return PMINFO_R_ERROR;
1226
1227         if (author->href == NULL)
1228                 *author_href = "";
1229         else
1230                 *author_href = (char *)author->href;
1231
1232         return PMINFO_R_OK;
1233 }
1234
1235 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
1236 {
1237         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1238
1239         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1240         retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1241
1242         if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
1243                 return PMINFO_R_ERROR;
1244
1245         if (strcmp(info->pkg_info->installed_storage, "installed_internal") == 0)
1246                 *storage = PMINFO_INTERNAL_STORAGE;
1247         else if (strcmp(info->pkg_info->installed_storage, "installed_external") == 0)
1248                 *storage = PMINFO_EXTERNAL_STORAGE;
1249         else
1250                 return PMINFO_R_ERROR;
1251
1252         return PMINFO_R_OK;
1253 }
1254
1255 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
1256 {
1257         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1258
1259         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1260         retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1261
1262         if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
1263                 return PMINFO_R_ERROR;
1264
1265         *installed_time = atoi(info->pkg_info->installed_time);
1266
1267         return PMINFO_R_OK;
1268 }
1269
1270 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
1271 {
1272         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1273
1274         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1275         retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1276
1277         if (info->pkg_info == NULL)
1278                 return PMINFO_R_ERROR;
1279
1280         if (info->pkg_info->storeclient_id == NULL)
1281                 *storeclientid = "";
1282         else
1283                 *storeclientid = (char *)info->pkg_info->storeclient_id;
1284
1285         return PMINFO_R_OK;
1286 }
1287
1288 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
1289 {
1290         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1291
1292         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1293         retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1294
1295         if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
1296                 return PMINFO_R_ERROR;
1297
1298         *mainappid = (char *)info->pkg_info->mainapp_id;
1299
1300         return PMINFO_R_OK;
1301 }
1302
1303 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
1304 {
1305         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1306
1307         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1308         retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1309
1310         if (info->pkg_info == NULL)
1311                 return PMINFO_R_ERROR;
1312
1313         if (info->pkg_info->package_url == NULL)
1314                 *url = "";
1315         else
1316                 *url = (char *)info->pkg_info->package_url;
1317
1318         return PMINFO_R_OK;
1319 }
1320
1321 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
1322 {
1323         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1324
1325         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1326         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1327
1328         if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
1329                 return PMINFO_R_ERROR;
1330
1331         *path = (char *)info->pkg_info->root_path;
1332
1333         return PMINFO_R_OK;
1334 }
1335
1336 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
1337 {
1338         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1339
1340         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1341         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1342
1343         if (info->pkg_info == NULL)
1344                 return PMINFO_R_ERROR;
1345
1346         if (info->pkg_info->csc_path == NULL)
1347                 *path = "";
1348         else
1349                 *path = (char *)info->pkg_info->csc_path;
1350
1351         return PMINFO_R_OK;
1352 }
1353
1354 API int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode)
1355 {
1356         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1357         retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1358
1359         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1360         if (info->pkg_info->support_mode)
1361                 *support_mode = atoi(info->pkg_info->support_mode);
1362         else
1363                 *support_mode = 0;
1364
1365         return PMINFO_R_OK;
1366 }
1367
1368 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
1369 {
1370         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1371         retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1372
1373 #if 0 /* smack issue occured, check later */
1374         char *pkgid = NULL;
1375         pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
1376         if (pkgid == NULL) {
1377                  _LOGD("invalid func parameters\n");
1378                  return PMINFO_R_ERROR;
1379         }
1380          _LOGD("pkgmgr_get_pkg_external_validation() called\n");
1381
1382         FILE *fp = NULL;
1383         char app_mmc_path[FILENAME_MAX] = { 0, };
1384         char app_dir_path[FILENAME_MAX] = { 0, };
1385         char app_mmc_internal_path[FILENAME_MAX] = { 0, };
1386         snprintf(app_dir_path, FILENAME_MAX, "%s%s", PKG_INSTALLATION_PATH, pkgid);
1387         snprintf(app_mmc_path, FILENAME_MAX, "%s%s", PKG_SD_PATH, pkgid);
1388         snprintf(app_mmc_internal_path, FILENAME_MAX, "%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
1389
1390         /*check whether application is in external memory or not */
1391         fp = fopen(app_mmc_path, "r");
1392         if (fp == NULL) {
1393                 _LOGD(" app path in external memory not accesible\n");
1394         } else {
1395                 fclose(fp);
1396                 fp = NULL;
1397                 *accessible = 1;
1398                 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
1399                 return PMINFO_R_OK;
1400         }
1401
1402         /*check whether application is in internal or not */
1403         if (fp == NULL) {
1404                 _LOGD(" app path in internal memory not accesible\n");
1405                 *accessible = 0;
1406                 return PMINFO_R_ERROR;
1407         } else {
1408                 fclose(fp);
1409                 /*check whether the application is installed in SD card
1410                 but SD card is not present*/
1411                 fp = fopen(app_mmc_internal_path, "r");
1412                 if (fp == NULL) {
1413                         *accessible = 1;
1414                         _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
1415                         return PMINFO_R_OK;
1416                 } else {
1417                         *accessible = 0;
1418                         _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
1419                 }
1420                 fclose(fp);
1421         }
1422
1423         _LOGD("pkgmgr_get_pkg_external_validation() end\n");
1424 #endif
1425
1426         *accessible = 1;
1427         return PMINFO_R_OK;
1428 }
1429
1430 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
1431 {
1432         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1433
1434         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1435         retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1436
1437         if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
1438                 return PMINFO_R_ERROR;
1439
1440         *removable = _get_bool_value(info->pkg_info->removable);
1441
1442         return PMINFO_R_OK;
1443 }
1444
1445 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1446 {
1447         char *val;
1448         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1449
1450         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1451         retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1452
1453         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1454                 return PMINFO_R_ERROR;
1455
1456         val = (char *)info->pkg_info->installlocation;
1457         if (strcmp(val, "internal-only") == 0)
1458                 *movable = 0;
1459         else if (strcmp(val, "prefer-external") == 0)
1460                 *movable = 1;
1461         else
1462                 *movable = 1;
1463
1464         return PMINFO_R_OK;
1465 }
1466
1467 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1468 {
1469         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1470
1471         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1472         retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1473
1474         if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1475                 return PMINFO_R_ERROR;
1476
1477         *preload = _get_bool_value(info->pkg_info->preload);
1478
1479         return PMINFO_R_OK;
1480 }
1481
1482 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1483 {
1484         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1485
1486         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1487         retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1488
1489         if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1490                 return PMINFO_R_ERROR;
1491
1492         *system = _get_bool_value(info->pkg_info->system);
1493
1494         return PMINFO_R_OK;
1495 }
1496
1497 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1498 {
1499         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1500
1501         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1502         retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1503
1504         if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1505                 return PMINFO_R_ERROR;
1506
1507         *readonly = _get_bool_value(info->pkg_info->readonly);
1508
1509         return PMINFO_R_OK;
1510 }
1511
1512 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
1513 {
1514         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1515
1516         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1517         retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1518
1519         if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1520                 return PMINFO_R_ERROR;
1521
1522         *update = _get_bool_value(info->pkg_info->update);
1523
1524         return PMINFO_R_OK;
1525 }
1526
1527 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1528 {
1529         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1530
1531         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1532         retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1533
1534         if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1535                 return PMINFO_R_ERROR;
1536
1537         *support_disable = _get_bool_value(info->pkg_info->support_disable);
1538
1539         return PMINFO_R_OK;
1540 }
1541
1542 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1543 {
1544         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1545
1546         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1547         retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1548
1549         if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1550                 return PMINFO_R_ERROR;
1551
1552         *global = _get_bool_value(info->pkg_info->for_all_users);
1553
1554         return PMINFO_R_OK;
1555 }
1556
1557 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1558 {
1559         return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1560 }
1561
1562 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1563 {
1564         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1565
1566         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1567
1568         __cleanup_pkginfo(info);
1569
1570         return PMINFO_R_OK;
1571 }
1572
1573 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1574 {
1575         pkgmgrinfo_filter_x *filter;
1576
1577         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1578
1579         filter = (pkgmgrinfo_filter_x*)calloc(1, sizeof(pkgmgrinfo_filter_x));
1580         if (filter == NULL) {
1581                 _LOGE("Out of Memory!!!");
1582                 return PMINFO_R_ERROR;
1583         }
1584
1585         *handle = filter;
1586
1587         return PMINFO_R_OK;
1588 }
1589
1590 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1591 {
1592         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1593
1594         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1595
1596         if (filter->list) {
1597                 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1598                 g_slist_free(filter->list);
1599         }
1600
1601         free(filter);
1602
1603         return PMINFO_R_OK;
1604 }
1605
1606 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1607                                 const char *property, const int value)
1608 {
1609         char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1610         char *val;
1611         GSList *link;
1612         int prop;
1613         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1614         pkgmgrinfo_node_x *node;
1615
1616         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1617         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1618
1619         prop = _pminfo_pkginfo_convert_to_prop_int(property);
1620         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1621                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1622                 _LOGE("Invalid Integer Property\n");
1623                 return PMINFO_R_EINVAL;
1624         }
1625         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1626         if (node == NULL) {
1627                 _LOGE("Out of Memory!!!\n");
1628                 return PMINFO_R_ERROR;
1629         }
1630         snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1631         val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1632         if (val == NULL) {
1633                 _LOGE("Out of Memory\n");
1634                 free(node);
1635                 return PMINFO_R_ERROR;
1636         }
1637         node->prop = prop;
1638         node->value = val;
1639         /*If API is called multiple times for same property, we should override the previous values.
1640         Last value set will be used for filtering.*/
1641         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1642         if (link)
1643                 filter->list = g_slist_delete_link(filter->list, link);
1644         filter->list = g_slist_append(filter->list, (gpointer)node);
1645         return PMINFO_R_OK;
1646
1647 }
1648
1649 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1650                                 const char *property, const bool value)
1651 {
1652         char *val;
1653         GSList *link;
1654         int prop;
1655         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1656         pkgmgrinfo_node_x *node;
1657
1658         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1659         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1660
1661         prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1662         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1663                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1664                 _LOGE("Invalid Boolean Property\n");
1665                 return PMINFO_R_EINVAL;
1666         }
1667         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1668         if (node == NULL) {
1669                 _LOGE("Out of Memory!!!\n");
1670                 return PMINFO_R_ERROR;
1671         }
1672         if (value)
1673                 val = strndup("true", 4);
1674         else
1675                 val = strndup("false", 5);
1676         if (val == NULL) {
1677                 _LOGE("Out of Memory\n");
1678                 free(node);
1679                 return PMINFO_R_ERROR;
1680         }
1681         node->prop = prop;
1682         node->value = val;
1683         /*If API is called multiple times for same property, we should override the previous values.
1684         Last value set will be used for filtering.*/
1685         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1686         if (link)
1687                 filter->list = g_slist_delete_link(filter->list, link);
1688         filter->list = g_slist_append(filter->list, (gpointer)node);
1689         return PMINFO_R_OK;
1690
1691 }
1692
1693 API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle,
1694                                 const char *property, const char *value)
1695 {
1696         char *val;
1697         GSList *link;
1698         int prop;
1699         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1700         pkgmgrinfo_node_x *node;
1701
1702         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1703         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1704         retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1705
1706         prop = _pminfo_pkginfo_convert_to_prop_str(property);
1707         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1708                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1709                 _LOGE("Invalid String Property\n");
1710                 return PMINFO_R_EINVAL;
1711         }
1712         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1713         if (node == NULL) {
1714                 _LOGE("Out of Memory!!!\n");
1715                 return PMINFO_R_ERROR;
1716         }
1717         if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1718                 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1719         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1720                 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1721         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1722                 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1723         else if (strcmp(value, "installed_internal") == 0)
1724                 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1725         else if (strcmp(value, "installed_external") == 0)
1726                 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1727         else
1728                 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1729         if (val == NULL) {
1730                 _LOGE("Out of Memory\n");
1731                 free(node);
1732                 return PMINFO_R_ERROR;
1733         }
1734         node->prop = prop;
1735         node->value = val;
1736         /*If API is called multiple times for same property, we should override the previous values.
1737         Last value set will be used for filtering.*/
1738         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1739         if (link)
1740                 filter->list = g_slist_delete_link(filter->list, link);
1741         filter->list = g_slist_append(filter->list, (gpointer)node);
1742         return PMINFO_R_OK;
1743
1744 }
1745
1746 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1747 {
1748         int ret;
1749         char *locale;
1750         GHashTable *list = NULL;
1751
1752         if (handle == NULL || count == NULL) {
1753                 _LOGE("invalid parameter");
1754                 return PMINFO_R_EINVAL;
1755         }
1756
1757         locale = _get_system_locale();
1758         if (locale == NULL)
1759                 return PMINFO_R_ERROR;
1760
1761         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
1762                         __free_packages);
1763         if (list == NULL) {
1764                 free(locale);
1765                 return PMINFO_R_ERROR;
1766         }
1767
1768         if (__check_disable_filter_exist((pkgmgrinfo_filter_x *)handle) == false) {
1769                 ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
1770                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
1771                 if (ret != PMINFO_R_OK) {
1772                         free(locale);
1773                         return PMINFO_R_ERROR;
1774                 }
1775         }
1776
1777         ret = _pkginfo_get_packages(uid, locale,
1778                         (pkgmgrinfo_filter_x *)handle, 0, list);
1779         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
1780                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, handle, 0,
1781                                 list);
1782
1783         if (ret != PMINFO_R_OK) {
1784                 g_hash_table_destroy(list);
1785                 free(locale);
1786                 return PMINFO_R_ERROR;
1787         }
1788
1789         *count = g_hash_table_size(list);
1790
1791         g_hash_table_destroy(list);
1792         free(locale);
1793
1794         return PMINFO_R_OK;
1795 }
1796
1797 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1798 {
1799         return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, _getuid());
1800 }
1801
1802 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1803                 pkgmgrinfo_pkginfo_filter_h handle,
1804                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1805 {
1806         if (handle == NULL || pkg_cb == NULL) {
1807                 LOGE("invalid parameter");
1808                 return PMINFO_R_EINVAL;
1809         }
1810
1811         return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
1812                         PMINFO_PKGINFO_GET_ALL, pkg_cb, user_data);
1813 }
1814
1815 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1816                                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1817 {
1818         return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, _getuid());
1819 }
1820
1821 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1822                         pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1823 {
1824         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1825         retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1826         int ret;
1827         privilege_x *privilege;
1828         GList *tmp;
1829         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1830
1831         if (info->pkg_info == NULL)
1832                 return PMINFO_R_ERROR;
1833
1834         for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1835                 privilege = (privilege_x *)tmp->data;
1836                 if (privilege == NULL)
1837                         continue;
1838                 ret = privilege_func(privilege->value, user_data);
1839                 if (ret < 0)
1840                         break;
1841         }
1842         return PMINFO_R_OK;
1843 }