Add db busy handler
[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, uid_t uid, 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, uid, &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 bool __check_package_storage_status(pkgmgrinfo_filter_x *tmp_filter)
310 {
311         GSList *tmp_list = NULL;
312         pkgmgrinfo_node_x *tmp_node = NULL;
313         int property = -1;
314
315         property = _pminfo_pkginfo_convert_to_prop_bool(PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE);
316         for (tmp_list = tmp_filter->list; tmp_list != NULL;
317                         tmp_list = g_slist_next(tmp_list)) {
318                 tmp_node = (pkgmgrinfo_node_x *)tmp_list->data;
319                 if (property == tmp_node->prop) {
320                         if (strcmp(tmp_node->value, "true") == 0)
321                                 return true;
322                         else
323                                 return false;
324                 }
325         }
326         return true;
327 }
328
329 static int _pkginfo_get_packages(uid_t uid, const char *locale,
330                 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
331 {
332         static const char query_raw[] =
333                 "SELECT DISTINCT pi.package, pi.package_version, "
334                 "pi.install_location, pi.package_removable, "
335                 "pi.package_preload, pi.package_readonly, pi.package_update, "
336                 "pi.package_appsetting, pi.package_system, pi.package_type, "
337                 "pi.package_size, pi.installed_time, pi.installed_storage, "
338                 "pi.storeclient_id, pi.mainapp_id, pi.package_url, "
339                 "pi.root_path, pi.csc_path, pi.package_nodisplay, "
340                 "pi.package_api_version, pi.package_support_disable, "
341                 "pi.package_tep_name, pi.package_zip_mount_file, pi.external_path, "
342                 "pi.package_support_mode";
343         static const char query_author[] =
344                 ", pi.author_name, pi.author_email, pi.author_href";
345         static const char query_label[] =
346                 ", COALESCE("
347                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
348                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
349         static const char query_icon[] =
350                 ", COALESCE("
351                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
352                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
353         static const char query_description[] =
354                 ", COALESCE("
355                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
356                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
357         static const char query_from_clause[] = " FROM package_info as pi";
358         int ret = PMINFO_R_ERROR;
359         int idx = 0;
360         int query_len = 0;
361         char *dbpath;
362         char *tmp_record = NULL;
363         char *constraints = NULL;
364         char query[MAX_QUERY_LEN] = { '\0' };
365         package_x *info = NULL;
366         author_x *author = NULL;
367         GList *bind_params = NULL;
368         sqlite3 *db;
369         sqlite3_stmt *stmt;
370         pkgmgrinfo_filter_x *tmp_filter = NULL;
371         bool is_check_storage = true;
372
373         dbpath = getUserPkgParserDBPathUID(uid);
374         if (dbpath == NULL)
375                 return PMINFO_R_ERROR;
376
377         ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
378         if (ret != SQLITE_OK) {
379                 _LOGD("failed to open db: %d", ret);
380                 free(dbpath);
381                 return PMINFO_R_ERROR;
382         }
383         free(dbpath);
384
385         if (filter != NULL) {
386                 tmp_filter = filter;
387         } else {
388                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
389                 if (ret != PMINFO_R_OK) {
390                         _LOGE("Failed to create filter");
391                         return PMINFO_R_ERROR;
392                 }
393         }
394
395         is_check_storage = __check_package_storage_status(tmp_filter);
396
397         query_len = strlen(query_raw);
398         snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
399         if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
400                 strncat(query, query_author, MAX_QUERY_LEN - query_len - 1);
401                 query_len += strlen(query_author);
402         }
403         if (flag & PMINFO_PKGINFO_GET_LABEL) {
404                 strncat(query, query_label, MAX_QUERY_LEN - query_len - 1);
405                 query_len += strlen(query_label);
406                 bind_params = g_list_append(bind_params, strdup(locale));
407         }
408         if (flag & PMINFO_PKGINFO_GET_ICON) {
409                 strncat(query, query_icon, MAX_QUERY_LEN - query_len - 1);
410                 query_len += strlen(query_icon);
411                 bind_params = g_list_append(bind_params, strdup(locale));
412         }
413         if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
414                 strncat(query, query_description, MAX_QUERY_LEN - query_len - 1);
415                 query_len += strlen(query_description);
416                 bind_params = g_list_append(bind_params, strdup(locale));
417         }
418
419         strncat(query, query_from_clause, MAX_QUERY_LEN - query_len - 1);
420         query_len += strlen(query_from_clause);
421
422         ret = _get_filtered_query(tmp_filter, locale, uid, &constraints, &bind_params);
423         if (ret != PMINFO_R_OK) {
424                 LOGE("Failed to get WHERE clause");
425                 goto catch;
426         }
427
428         if (constraints)
429                 strncat(query, constraints, MAX_QUERY_LEN - query_len - 1);
430
431         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
432         if (ret != SQLITE_OK) {
433                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
434                 ret = PMINFO_R_ERROR;
435                 goto catch;
436         }
437
438         ret = __bind_params(stmt, bind_params);
439         if (ret != SQLITE_OK) {
440                 LOGE("Failed to bind parameters");
441                 goto catch;
442         }
443
444         while (sqlite3_step(stmt) == SQLITE_ROW) {
445                 info = calloc(1, sizeof(package_x));
446                 if (info == NULL) {
447                         LOGE("out of memory");
448                         sqlite3_finalize(stmt);
449                         sqlite3_close_v2(db);
450                         return PMINFO_R_ERROR;
451                 }
452                 idx = 0;
453                 _save_column_str(stmt, idx++, &info->package);
454                 if (g_hash_table_contains(packages,
455                                         (gconstpointer)info->package)) {
456                         free(info->package);
457                         free(info);
458                         continue;
459                 }
460                 _save_column_str(stmt, idx++, &info->version);
461                 _save_column_str(stmt, idx++, &info->installlocation);
462                 _save_column_str(stmt, idx++, &info->removable);
463                 _save_column_str(stmt, idx++, &info->preload);
464                 _save_column_str(stmt, idx++, &info->readonly);
465                 _save_column_str(stmt, idx++, &info->update);
466                 _save_column_str(stmt, idx++, &info->appsetting);
467                 _save_column_str(stmt, idx++, &info->system);
468                 _save_column_str(stmt, idx++, &info->type);
469                 _save_column_str(stmt, idx++, &info->package_size);
470                 _save_column_str(stmt, idx++, &info->installed_time);
471                 _save_column_str(stmt, idx++, &info->installed_storage);
472                 _save_column_str(stmt, idx++, &info->storeclient_id);
473                 _save_column_str(stmt, idx++, &info->mainapp_id);
474                 _save_column_str(stmt, idx++, &info->package_url);
475                 _save_column_str(stmt, idx++, &info->root_path);
476                 _save_column_str(stmt, idx++, &info->csc_path);
477                 _save_column_str(stmt, idx++, &info->nodisplay_setting);
478                 _save_column_str(stmt, idx++, &info->api_version);
479                 _save_column_str(stmt, idx++, &info->support_disable);
480                 _save_column_str(stmt, idx++, &info->tep_name);
481                 _save_column_str(stmt, idx++, &info->zip_mount_file);
482                 _save_column_str(stmt, idx++, &info->external_path);
483                 _save_column_str(stmt, idx++, &info->support_mode);
484                 info->for_all_users =
485                         strdup((uid != GLOBAL_USER) ? "false" : "true");
486
487                 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
488                         /* TODO : author should be retrieved at package_localized_info */
489                         author = calloc(1, sizeof(author_x));
490                         if (author == NULL) {
491                                 pkgmgrinfo_basic_free_package(info);
492                                 sqlite3_finalize(stmt);
493                                 sqlite3_close_v2(db);
494                                 return PMINFO_R_ERROR;
495                         }
496                         _save_column_str(stmt, idx++, &author->text);
497                         _save_column_str(stmt, idx++, &author->email);
498                         _save_column_str(stmt, idx++, &author->href);
499                         info->author = g_list_append(info->author, author);
500                 }
501
502                 if (flag & PMINFO_PKGINFO_GET_LABEL) {
503                         tmp_record = NULL;
504                         _save_column_str(stmt, idx++, &tmp_record);
505
506                         if (_add_label_info_into_list(locale, tmp_record, &info->label)) {
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_ICON) {
515                         tmp_record = NULL;
516                         _save_column_str(stmt, idx++, &tmp_record);
517                         if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) {
518                                 pkgmgrinfo_basic_free_package(info);
519                                 sqlite3_finalize(stmt);
520                                 sqlite3_close_v2(db);
521                                 return PMINFO_R_ERROR;
522                         }
523                 }
524
525                 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
526                         tmp_record = NULL;
527                         _save_column_str(stmt, idx++, &tmp_record);
528                         if (_pkginfo_add_description_info_into_list(locale, tmp_record,
529                                         &info->description)) {
530                                 pkgmgrinfo_basic_free_package(info);
531                                 sqlite3_finalize(stmt);
532                                 sqlite3_close_v2(db);
533                                 return PMINFO_R_ERROR;
534                         }
535                 }
536
537                 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
538                         if (_pkginfo_get_privilege(db, info->package,
539                                                 &info->privileges)) {
540                                 pkgmgrinfo_basic_free_package(info);
541                                 sqlite3_finalize(stmt);
542                                 sqlite3_close_v2(db);
543                                 return PMINFO_R_ERROR;
544                         }
545                 }
546
547                 if (is_check_storage &&
548                                 __pkginfo_check_installed_storage(info) != PMINFO_R_OK) {
549                         ret = PMINFO_R_ERROR;
550                         pkgmgrinfo_basic_free_package(info);
551                         info = NULL;
552                         continue;
553                 }
554
555                 g_hash_table_insert(packages, (gpointer)info->package,
556                                 (gpointer)info);
557         }
558
559         ret = PMINFO_R_OK;
560
561 catch:
562         if (constraints)
563                 free(constraints);
564
565         if (ret != PMINFO_R_OK && info != NULL)
566                 pkgmgrinfo_basic_free_package(info);
567
568         if (filter == NULL)
569                 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
570
571         g_list_free_full(bind_params, free);
572         sqlite3_close_v2(db);
573         sqlite3_finalize(stmt);
574
575         return ret;
576 }
577
578 static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
579                 pkgmgrinfo_filter_x *filter, int flag,
580                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
581 {
582         int ret;
583         char *locale;
584         package_x *pkg;
585         pkgmgr_pkginfo_x info;
586         pkgmgrinfo_filter_x *tmp_filter = NULL;
587         GHashTable *list;
588         GHashTableIter iter;
589         gpointer value;
590
591         locale = _get_system_locale();
592         if (locale == NULL)
593                 return PMINFO_R_ERROR;
594
595         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
596                         __free_packages);
597         if (list == NULL) {
598                 free(locale);
599                 return PMINFO_R_ERROR;
600         }
601
602         if (filter != NULL) {
603                 tmp_filter = (pkgmgrinfo_filter_x *)filter;
604         } else {
605                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
606                 if (ret != PMINFO_R_OK) {
607                         _LOGE("Failed to create filter");
608                         return PMINFO_R_ERROR;
609                 }
610         }
611
612         if (__check_disable_filter_exist(tmp_filter) == false)
613                 pkgmgrinfo_pkginfo_filter_add_bool(tmp_filter,
614                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
615
616         ret = _pkginfo_get_packages(uid, locale, tmp_filter, flag, list);
617         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
618                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, tmp_filter,
619                                 flag, list);
620
621         if (ret != PMINFO_R_OK) {
622                 g_hash_table_destroy(list);
623                 free(locale);
624                 if (filter == NULL)
625                         pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
626                 return PMINFO_R_ERROR;
627         }
628
629         g_hash_table_iter_init(&iter, list);
630         while (g_hash_table_iter_next(&iter, NULL, &value)) {
631                 pkg = (package_x *)value;
632                 info.uid = uid;
633                 info.pkg_info = pkg;
634                 info.locale = locale;
635                 if (pkg_list_cb(&info, user_data) < 0)
636                         break;
637         }
638
639         g_hash_table_destroy(list);
640         free(locale);
641
642         if (filter == NULL)
643                 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
644
645         return PMINFO_R_OK;
646 }
647
648 static int _pkgmgrinfo_get_pkginfo(const char *pkgid, uid_t uid,
649         pkgmgrinfo_pkginfo_filter_h filter, pkgmgrinfo_pkginfo_h *handle)
650 {
651         int ret;
652         char *locale;
653         GHashTable *list;
654         pkgmgr_pkginfo_x *info;
655
656         if (pkgid == NULL || filter == NULL || handle == NULL) {
657                         LOGE("invalid parameter");
658                         return PMINFO_R_EINVAL;
659         }
660
661         locale = _get_system_locale();
662         if (locale == NULL)
663                 return PMINFO_R_ERROR;
664
665         list = g_hash_table_new(g_str_hash, g_str_equal);
666         if (list == NULL) {
667                 free(locale);
668                 return PMINFO_R_ERROR;
669         }
670
671         ret = _pkginfo_get_packages(uid, locale, filter,
672                         PMINFO_PKGINFO_GET_ALL, list);
673         if (!g_hash_table_size(list) && uid != GLOBAL_USER)
674                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
675                                 PMINFO_PKGINFO_GET_ALL, list);
676
677         if (!g_hash_table_size(list)) {
678                 _LOGI("pkginfo for [%s] is not existed for user [%d]",
679                                 pkgid, uid);
680                 g_hash_table_destroy(list);
681                 free(locale);
682                 return PMINFO_R_ENOENT;
683         }
684
685         info = calloc(1, sizeof(pkgmgr_pkginfo_x));
686         if (info == NULL) {
687                 _LOGE("out of memory");
688                 g_hash_table_destroy(list);
689                 free(locale);
690                 return PMINFO_R_ERROR;
691         }
692
693         info->uid = uid;
694         info->pkg_info = (package_x *)g_hash_table_lookup(list, pkgid);
695         info->locale = locale;
696
697         /* just free list only */
698         g_hash_table_destroy(list);
699
700         *handle = info;
701
702         return ret;
703 }
704
705 API int pkgmgrinfo_pkginfo_get_usr_pkginfo(const char *pkgid, uid_t uid,
706                 pkgmgrinfo_pkginfo_h *handle)
707 {
708         int ret;
709         pkgmgrinfo_pkginfo_filter_h filter;
710
711         if (pkgid == NULL || handle == NULL) {
712                 LOGE("invalid parameter");
713                 return PMINFO_R_EINVAL;
714         }
715
716         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
717         if (ret != PMINFO_R_OK)
718                 return ret;
719
720         ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
721                         PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
722         if (ret != PMINFO_R_OK) {
723                 pkgmgrinfo_pkginfo_filter_destroy(filter);
724                 return PMINFO_R_ERROR;
725         }
726
727         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
728                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
729         if (ret != PMINFO_R_OK) {
730                 pkgmgrinfo_pkginfo_filter_destroy(filter);
731                 return PMINFO_R_ERROR;
732         }
733
734         ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
735         pkgmgrinfo_pkginfo_filter_destroy(filter);
736
737         return ret;
738 }
739
740 API int pkgmgrinfo_pkginfo_get_pkginfo(const char *pkgid,
741                 pkgmgrinfo_pkginfo_h *handle)
742 {
743         return pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, _getuid(), handle);
744 }
745
746 API int pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(const char *pkgid,
747                 uid_t uid, pkgmgrinfo_pkginfo_h *handle)
748 {
749         int ret;
750         char *locale;
751         GHashTable *list;
752         pkgmgrinfo_pkginfo_filter_h filter;
753         pkgmgr_pkginfo_x *info;
754
755         if (pkgid == NULL || handle == NULL) {
756                 LOGE("invalid parameter");
757                 return PMINFO_R_EINVAL;
758         }
759
760         locale = _get_system_locale();
761         if (locale == NULL)
762                 return PMINFO_R_ERROR;
763
764         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
765         if (ret != PMINFO_R_OK) {
766                 free(locale);
767                 return ret;
768         }
769
770         ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
771                         PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
772         if (ret != PMINFO_R_OK) {
773                 pkgmgrinfo_pkginfo_filter_destroy(filter);
774                 free(locale);
775                 return PMINFO_R_ERROR;
776         }
777
778         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
779                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
780         if (ret != PMINFO_R_OK) {
781                 pkgmgrinfo_pkginfo_filter_destroy(filter);
782                 free(locale);
783                 return PMINFO_R_ERROR;
784         }
785
786         list = g_hash_table_new(g_str_hash, g_str_equal);
787         if (list == NULL) {
788                 pkgmgrinfo_pkginfo_filter_destroy(filter);
789                 free(locale);
790                 return PMINFO_R_ERROR;
791         }
792
793         ret = _pkginfo_get_packages(uid, locale, filter,
794                         PMINFO_PKGINFO_GET_ALL, list);
795         if (!g_hash_table_size(list) && uid != GLOBAL_USER)
796                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, filter,
797                                 PMINFO_PKGINFO_GET_ALL, list);
798
799         pkgmgrinfo_pkginfo_filter_destroy(filter);
800         if (ret != PMINFO_R_OK) {
801                 g_hash_table_destroy(list);
802                 free(locale);
803                 return ret;
804         }
805
806         if (!g_hash_table_size(list)) {
807                 _LOGI("disabled pkginfo for [%s] is not existed for user [%d]",
808                                 pkgid, uid);
809                 g_hash_table_destroy(list);
810                 free(locale);
811                 return PMINFO_R_ENOENT;
812         }
813
814         info = calloc(1, sizeof(pkgmgr_pkginfo_x));
815         if (info == NULL) {
816                 _LOGE("out of memory");
817                 g_hash_table_destroy(list);
818                 free(locale);
819                 return PMINFO_R_ERROR;
820         }
821
822         info->uid = uid;
823         info->pkg_info = (package_x *)g_hash_table_lookup(list, pkgid);
824         info->locale = locale;
825
826         /* just free list only */
827         g_hash_table_destroy(list);
828
829         *handle = info;
830
831         return ret;
832 }
833
834 API int pkgmgrinfo_pkginfo_get_usr_all_pkginfo(const char *pkgid, uid_t uid,
835                 pkgmgrinfo_pkginfo_h *handle)
836 {
837
838         int ret;
839         pkgmgrinfo_pkginfo_filter_h filter;
840
841         if (pkgid == NULL || handle == NULL) {
842                 LOGE("invalid parameter");
843                 return PMINFO_R_EINVAL;
844         }
845
846         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
847         if (ret != PMINFO_R_OK)
848                 return ret;
849
850         ret = pkgmgrinfo_pkginfo_filter_add_string(filter,
851                         PMINFO_PKGINFO_PROP_PACKAGE_ID, pkgid);
852         if (ret != PMINFO_R_OK) {
853                 pkgmgrinfo_pkginfo_filter_destroy(filter);
854                 return PMINFO_R_ERROR;
855         }
856
857         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
858                         PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE, false);
859         if (ret != PMINFO_R_OK) {
860                 pkgmgrinfo_pkginfo_filter_destroy(filter);
861                 return PMINFO_R_ERROR;
862         }
863
864         ret = _pkgmgrinfo_get_pkginfo(pkgid, uid, filter, handle);
865         pkgmgrinfo_pkginfo_filter_destroy(filter);
866
867         return ret;
868 }
869
870 API int pkgmgrinfo_pkginfo_get_disabled_pkginfo(const char *pkgid,
871                 pkgmgrinfo_pkginfo_h *handle)
872 {
873         return pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(pkgid, _getuid(),
874                         handle);
875 }
876
877 API int pkgmgrinfo_pkginfo_get_all_pkginfo(const char *pkgid,
878                 pkgmgrinfo_pkginfo_h *handle)
879 {
880         return pkgmgrinfo_pkginfo_get_usr_all_pkginfo(pkgid, _getuid(), handle);
881 }
882
883 API int pkgmgrinfo_pkginfo_get_usr_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
884                 int flag, void *user_data, uid_t uid)
885 {
886         int ret;
887         pkgmgrinfo_pkginfo_filter_h filter;
888
889         if (pkg_list_cb == NULL) {
890                 LOGE("invalid parameter");
891                 return PMINFO_R_EINVAL;
892         }
893
894         /* create an empty filter */
895         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
896         if (ret != PMINFO_R_OK)
897                 return ret;
898
899         ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter, flag,
900                         pkg_list_cb, user_data);
901
902         pkgmgrinfo_pkginfo_filter_destroy(filter);
903
904         return ret;
905 }
906
907 API int pkgmgrinfo_pkginfo_get_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
908                 int flag, void *user_data)
909 {
910         return pkgmgrinfo_pkginfo_get_usr_list_full(pkg_list_cb, flag,
911                         user_data, _getuid());
912 }
913
914 API int pkgmgrinfo_pkginfo_get_usr_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
915                 void *user_data, uid_t uid)
916 {
917         int ret;
918         pkgmgrinfo_pkginfo_filter_h filter;
919
920         if (pkg_list_cb == NULL) {
921                 LOGE("invalid parameter");
922                 return PMINFO_R_EINVAL;
923         }
924
925         /* create an empty filter */
926         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
927         if (ret != PMINFO_R_OK)
928                 return ret;
929
930         ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter,
931                         PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
932
933         pkgmgrinfo_pkginfo_filter_destroy(filter);
934
935         return ret;
936 }
937
938 API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
939                 void *user_data)
940 {
941         return pkgmgrinfo_pkginfo_get_usr_list(pkg_list_cb, user_data,
942                         _getuid());
943 }
944
945 API int pkgmgrinfo_pkginfo_get_usr_disabled_list(
946                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data, uid_t uid)
947 {
948         int ret;
949         pkgmgrinfo_pkginfo_filter_h filter;
950
951         if (pkg_list_cb == NULL) {
952                 LOGE("invalid parameter");
953                 return PMINFO_R_EINVAL;
954         }
955
956         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
957         if (ret != PMINFO_R_OK)
958                 return ret;
959
960         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
961                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
962         if (ret != PMINFO_R_OK) {
963                 pkgmgrinfo_pkginfo_filter_destroy(filter);
964                 return PMINFO_R_ERROR;
965         }
966
967         ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter,
968                         PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
969
970         pkgmgrinfo_pkginfo_filter_destroy(filter);
971
972         return ret;
973 }
974
975 API int pkgmgrinfo_pkginfo_get_disabled_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
976                 void *user_data)
977 {
978         return pkgmgrinfo_pkginfo_get_usr_disabled_list(pkg_list_cb, user_data,
979                         _getuid());
980 }
981
982 API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name)
983 {
984         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
985
986         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
987         retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
988
989         if (info->pkg_info == NULL || info->pkg_info->package == NULL)
990                 return PMINFO_R_ERROR;
991
992         *pkg_name = (char *)info->pkg_info->package;
993
994         return PMINFO_R_OK;
995 }
996
997 API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid)
998 {
999         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1000
1001         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1002         retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1003
1004         if (info->pkg_info == NULL || info->pkg_info->package == NULL)
1005                 return PMINFO_R_ERROR;
1006
1007         *pkgid = (char *)info->pkg_info->package;
1008
1009         return PMINFO_R_OK;
1010 }
1011
1012 API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type)
1013 {
1014         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1015
1016         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1017         retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1018
1019         if (info->pkg_info == NULL)
1020                 return PMINFO_R_ERROR;
1021
1022         if (info->pkg_info->type == NULL)
1023                 *type = "";
1024         else
1025                 *type = (char *)info->pkg_info->type;
1026
1027         return PMINFO_R_OK;
1028 }
1029
1030 API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version)
1031 {
1032         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1033
1034         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1035         retvm_if(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1036
1037         if (info->pkg_info == NULL)
1038                 return PMINFO_R_ERROR;
1039
1040         if (info->pkg_info->version == NULL)
1041                 *version = "";
1042         else
1043                 *version = (char *)info->pkg_info->version;
1044
1045         return PMINFO_R_OK;
1046 }
1047
1048 API int pkgmgrinfo_pkginfo_get_api_version(pkgmgrinfo_pkginfo_h handle, char **api_version)
1049 {
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(api_version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1054
1055         if (info->pkg_info == NULL)
1056                 return PMINFO_R_ERROR;
1057
1058         if (info->pkg_info->api_version == NULL)
1059                 *api_version = "";
1060         else
1061                 *api_version = (char *)info->pkg_info->api_version;
1062
1063         return PMINFO_R_OK;
1064 }
1065
1066 API int pkgmgrinfo_pkginfo_get_tep_name(pkgmgrinfo_pkginfo_h handle, char **tep_name)
1067 {
1068         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1069
1070         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1071         retvm_if(tep_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1072
1073         if (info->pkg_info == NULL || info->pkg_info->tep_name == NULL)
1074                 return PMINFO_R_ERROR;
1075
1076         *tep_name = (char *)info->pkg_info->tep_name;
1077
1078         return PMINFO_R_OK;
1079 }
1080
1081 API int pkgmgrinfo_pkginfo_get_zip_mount_file(pkgmgrinfo_pkginfo_h handle, char **zip_mount_file)
1082 {
1083         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1084
1085         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1086         retvm_if(zip_mount_file == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1087
1088         if (info->pkg_info == NULL)
1089                 return PMINFO_R_ERROR;
1090
1091         if (info->pkg_info->zip_mount_file == NULL)
1092                 *zip_mount_file = "";
1093         else
1094                 *zip_mount_file = (char *)info->pkg_info->zip_mount_file;
1095
1096         return PMINFO_R_OK;
1097 }
1098
1099 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
1100 {
1101         char *val;
1102         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1103
1104         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1105         retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1106
1107         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1108                 return PMINFO_R_ERROR;
1109
1110         val = (char *)info->pkg_info->installlocation;
1111         if (strcmp(val, "internal-only") == 0)
1112                 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
1113         else if (strcmp(val, "prefer-external") == 0)
1114                 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
1115         else
1116                 *location = PMINFO_INSTALL_LOCATION_AUTO;
1117
1118         return PMINFO_R_OK;
1119 }
1120
1121 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
1122 {
1123         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1124         char *temp = NULL;
1125
1126         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1127         retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1128
1129         if (info->pkg_info == NULL)
1130                 return PMINFO_R_ERROR;
1131
1132         if (info->pkg_info->package_size == NULL) {
1133                 temp = strdup("");
1134                 if (temp == NULL) {
1135                         _LOGE("out of memory");
1136                         return PMINFO_R_ERROR;
1137                 } else {
1138                         info->pkg_info->package_size = temp;
1139                 }
1140         }
1141
1142         *size = atoi((char *)info->pkg_info->package_size);
1143
1144         return PMINFO_R_OK;
1145 }
1146
1147 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
1148 {
1149         icon_x *ptr;
1150         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1151
1152         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1153         retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1154
1155         if (info->pkg_info == NULL || info->pkg_info->icon == NULL)
1156                 return PMINFO_R_ERROR;
1157
1158         ptr = (icon_x *)info->pkg_info->icon->data;
1159         if (ptr == NULL)
1160                 return PMINFO_R_ERROR;
1161
1162         /* TODO : should we return empty string if there was no icon? */
1163         if (ptr->text == NULL)
1164                 *icon = "";
1165         else
1166                 *icon = ptr->text;
1167
1168         return PMINFO_R_OK;
1169 }
1170
1171 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
1172 {
1173         label_x *ptr;
1174         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1175
1176         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1177         retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1178
1179         if (info->pkg_info == NULL || info->pkg_info->label == NULL)
1180                 return PMINFO_R_ERROR;
1181
1182         ptr = (label_x *)info->pkg_info->label->data;
1183         if (ptr == NULL)
1184                 return PMINFO_R_ERROR;
1185
1186         /* TODO : should we return empty string if there was no label? */
1187         if (ptr->text == NULL)
1188                 *label = "";
1189         else
1190                 *label = ptr->text;
1191
1192         return PMINFO_R_OK;
1193 }
1194
1195 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
1196 {
1197         description_x *ptr;
1198         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1199
1200         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1201         retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1202
1203         if (info->pkg_info == NULL || info->pkg_info->description == NULL)
1204                 return PMINFO_R_ERROR;
1205
1206         ptr = (description_x *)info->pkg_info->description->data;
1207         if (ptr == NULL)
1208                 return PMINFO_R_ERROR;
1209
1210         if (ptr->text == NULL)
1211                 *description = "";
1212         else
1213                 *description = (char *)ptr->text;
1214
1215         return PMINFO_R_OK;
1216 }
1217
1218 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
1219 {
1220         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1221         author_x *author;
1222
1223         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1224         retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1225
1226         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1227                 return PMINFO_R_ERROR;
1228
1229         author = (author_x *)info->pkg_info->author->data;
1230         if (author == NULL)
1231                 return PMINFO_R_ERROR;
1232
1233         if (author->text == NULL)
1234                 *author_name = "";
1235         else
1236                 *author_name = (char *)author->text;
1237
1238         return PMINFO_R_OK;
1239 }
1240
1241 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
1242 {
1243         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1244         author_x *author;
1245
1246         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1247         retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1248
1249         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1250                 return PMINFO_R_ERROR;
1251
1252         author = (author_x *)info->pkg_info->author->data;
1253         if (author == NULL)
1254                 return PMINFO_R_ERROR;
1255
1256         if (author->email == NULL)
1257                 *author_email = "";
1258         else
1259                 *author_email = (char *)author->email;
1260
1261         return PMINFO_R_OK;
1262 }
1263
1264 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
1265 {
1266         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1267         author_x *author;
1268
1269         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1270         retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1271
1272         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1273                 return PMINFO_R_ERROR;
1274
1275         author = (author_x *)info->pkg_info->author->data;
1276         if (author == NULL)
1277                 return PMINFO_R_ERROR;
1278
1279         if (author->href == NULL)
1280                 *author_href = "";
1281         else
1282                 *author_href = (char *)author->href;
1283
1284         return PMINFO_R_OK;
1285 }
1286
1287 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
1288 {
1289         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1290
1291         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1292         retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1293
1294         if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
1295                 return PMINFO_R_ERROR;
1296
1297         if (strcmp(info->pkg_info->installed_storage, "installed_internal") == 0)
1298                 *storage = PMINFO_INTERNAL_STORAGE;
1299         else if (strcmp(info->pkg_info->installed_storage, "installed_external") == 0)
1300                 *storage = PMINFO_EXTERNAL_STORAGE;
1301         else
1302                 return PMINFO_R_ERROR;
1303
1304         return PMINFO_R_OK;
1305 }
1306
1307 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
1308 {
1309         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1310
1311         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1312         retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1313
1314         if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
1315                 return PMINFO_R_ERROR;
1316
1317         *installed_time = atoi(info->pkg_info->installed_time);
1318
1319         return PMINFO_R_OK;
1320 }
1321
1322 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
1323 {
1324         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1325
1326         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1327         retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1328
1329         if (info->pkg_info == NULL)
1330                 return PMINFO_R_ERROR;
1331
1332         if (info->pkg_info->storeclient_id == NULL)
1333                 *storeclientid = "";
1334         else
1335                 *storeclientid = (char *)info->pkg_info->storeclient_id;
1336
1337         return PMINFO_R_OK;
1338 }
1339
1340 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
1341 {
1342         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1343
1344         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1345         retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1346
1347         if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
1348                 return PMINFO_R_ERROR;
1349
1350         *mainappid = (char *)info->pkg_info->mainapp_id;
1351
1352         return PMINFO_R_OK;
1353 }
1354
1355 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
1356 {
1357         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1358
1359         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1360         retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1361
1362         if (info->pkg_info == NULL)
1363                 return PMINFO_R_ERROR;
1364
1365         if (info->pkg_info->package_url == NULL)
1366                 *url = "";
1367         else
1368                 *url = (char *)info->pkg_info->package_url;
1369
1370         return PMINFO_R_OK;
1371 }
1372
1373 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
1374 {
1375         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1376
1377         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1378         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1379
1380         if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
1381                 return PMINFO_R_ERROR;
1382
1383         *path = (char *)info->pkg_info->root_path;
1384
1385         return PMINFO_R_OK;
1386 }
1387
1388 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
1389 {
1390         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1391
1392         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1393         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1394
1395         if (info->pkg_info == NULL)
1396                 return PMINFO_R_ERROR;
1397
1398         if (info->pkg_info->csc_path == NULL)
1399                 *path = "";
1400         else
1401                 *path = (char *)info->pkg_info->csc_path;
1402
1403         return PMINFO_R_OK;
1404 }
1405
1406 API int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode)
1407 {
1408         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1409         retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1410
1411         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1412         if (info->pkg_info->support_mode)
1413                 *support_mode = atoi(info->pkg_info->support_mode);
1414         else
1415                 *support_mode = 0;
1416
1417         return PMINFO_R_OK;
1418 }
1419
1420 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
1421 {
1422         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1423         retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1424
1425 #if 0 /* smack issue occured, check later */
1426         char *pkgid = NULL;
1427         pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
1428         if (pkgid == NULL) {
1429                  _LOGD("invalid func parameters\n");
1430                  return PMINFO_R_ERROR;
1431         }
1432          _LOGD("pkgmgr_get_pkg_external_validation() called\n");
1433
1434         FILE *fp = NULL;
1435         char app_mmc_path[FILENAME_MAX] = { 0, };
1436         char app_dir_path[FILENAME_MAX] = { 0, };
1437         char app_mmc_internal_path[FILENAME_MAX] = { 0, };
1438         snprintf(app_dir_path, FILENAME_MAX, "%s%s", PKG_INSTALLATION_PATH, pkgid);
1439         snprintf(app_mmc_path, FILENAME_MAX, "%s%s", PKG_SD_PATH, pkgid);
1440         snprintf(app_mmc_internal_path, FILENAME_MAX, "%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
1441
1442         /*check whether application is in external memory or not */
1443         fp = fopen(app_mmc_path, "r");
1444         if (fp == NULL) {
1445                 _LOGD(" app path in external memory not accesible\n");
1446         } else {
1447                 fclose(fp);
1448                 fp = NULL;
1449                 *accessible = 1;
1450                 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
1451                 return PMINFO_R_OK;
1452         }
1453
1454         /*check whether application is in internal or not */
1455         if (fp == NULL) {
1456                 _LOGD(" app path in internal memory not accesible\n");
1457                 *accessible = 0;
1458                 return PMINFO_R_ERROR;
1459         } else {
1460                 fclose(fp);
1461                 /*check whether the application is installed in SD card
1462                 but SD card is not present*/
1463                 fp = fopen(app_mmc_internal_path, "r");
1464                 if (fp == NULL) {
1465                         *accessible = 1;
1466                         _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
1467                         return PMINFO_R_OK;
1468                 } else {
1469                         *accessible = 0;
1470                         _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
1471                 }
1472                 fclose(fp);
1473         }
1474
1475         _LOGD("pkgmgr_get_pkg_external_validation() end\n");
1476 #endif
1477
1478         *accessible = 1;
1479         return PMINFO_R_OK;
1480 }
1481
1482 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
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(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1488
1489         if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
1490                 return PMINFO_R_ERROR;
1491
1492         *removable = _get_bool_value(info->pkg_info->removable);
1493
1494         return PMINFO_R_OK;
1495 }
1496
1497 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1498 {
1499         char *val;
1500         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1501
1502         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1503         retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1504
1505         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1506                 return PMINFO_R_ERROR;
1507
1508         val = (char *)info->pkg_info->installlocation;
1509         if (strcmp(val, "internal-only") == 0)
1510                 *movable = 0;
1511         else if (strcmp(val, "prefer-external") == 0)
1512                 *movable = 1;
1513         else
1514                 *movable = 1;
1515
1516         return PMINFO_R_OK;
1517 }
1518
1519 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1520 {
1521         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1522
1523         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1524         retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1525
1526         if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1527                 return PMINFO_R_ERROR;
1528
1529         *preload = _get_bool_value(info->pkg_info->preload);
1530
1531         return PMINFO_R_OK;
1532 }
1533
1534 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1535 {
1536         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1537
1538         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1539         retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1540
1541         if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1542                 return PMINFO_R_ERROR;
1543
1544         *system = _get_bool_value(info->pkg_info->system);
1545
1546         return PMINFO_R_OK;
1547 }
1548
1549 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1550 {
1551         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1552
1553         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1554         retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1555
1556         if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1557                 return PMINFO_R_ERROR;
1558
1559         *readonly = _get_bool_value(info->pkg_info->readonly);
1560
1561         return PMINFO_R_OK;
1562 }
1563
1564 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
1565 {
1566         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1567
1568         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1569         retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1570
1571         if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1572                 return PMINFO_R_ERROR;
1573
1574         *update = _get_bool_value(info->pkg_info->update);
1575
1576         return PMINFO_R_OK;
1577 }
1578
1579 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1580 {
1581         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1582
1583         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1584         retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1585
1586         if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1587                 return PMINFO_R_ERROR;
1588
1589         *support_disable = _get_bool_value(info->pkg_info->support_disable);
1590
1591         return PMINFO_R_OK;
1592 }
1593
1594 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1595 {
1596         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1597
1598         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1599         retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1600
1601         if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1602                 return PMINFO_R_ERROR;
1603
1604         *global = _get_bool_value(info->pkg_info->for_all_users);
1605
1606         return PMINFO_R_OK;
1607 }
1608
1609 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1610 {
1611         return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1612 }
1613
1614 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1615 {
1616         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1617
1618         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1619
1620         __cleanup_pkginfo(info);
1621
1622         return PMINFO_R_OK;
1623 }
1624
1625 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1626 {
1627         pkgmgrinfo_filter_x *filter;
1628
1629         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1630
1631         filter = (pkgmgrinfo_filter_x *)calloc(1, sizeof(pkgmgrinfo_filter_x));
1632         if (filter == NULL) {
1633                 _LOGE("Out of Memory!!!");
1634                 return PMINFO_R_ERROR;
1635         }
1636
1637         *handle = filter;
1638
1639         return PMINFO_R_OK;
1640 }
1641
1642 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1643 {
1644         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1645
1646         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1647
1648         if (filter->list) {
1649                 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1650                 g_slist_free(filter->list);
1651         }
1652
1653         free(filter);
1654
1655         return PMINFO_R_OK;
1656 }
1657
1658 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1659                                 const char *property, const int value)
1660 {
1661         char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1662         char *val;
1663         GSList *link;
1664         int prop;
1665         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1666         pkgmgrinfo_node_x *node;
1667
1668         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1669         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1670
1671         prop = _pminfo_pkginfo_convert_to_prop_int(property);
1672         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1673                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1674                 _LOGE("Invalid Integer Property\n");
1675                 return PMINFO_R_EINVAL;
1676         }
1677         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1678         if (node == NULL) {
1679                 _LOGE("Out of Memory!!!\n");
1680                 return PMINFO_R_ERROR;
1681         }
1682         snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1683         val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1684         if (val == NULL) {
1685                 _LOGE("Out of Memory\n");
1686                 free(node);
1687                 return PMINFO_R_ERROR;
1688         }
1689         node->prop = prop;
1690         node->value = val;
1691         /*If API is called multiple times for same property, we should override the previous values.
1692         Last value set will be used for filtering.*/
1693         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1694         if (link)
1695                 filter->list = g_slist_delete_link(filter->list, link);
1696         filter->list = g_slist_append(filter->list, (gpointer)node);
1697         return PMINFO_R_OK;
1698
1699 }
1700
1701 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1702                                 const char *property, const bool value)
1703 {
1704         char *val;
1705         GSList *link;
1706         int prop;
1707         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1708         pkgmgrinfo_node_x *node;
1709
1710         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1711         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1712
1713         prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1714         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1715                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1716                 _LOGE("Invalid Boolean Property\n");
1717                 return PMINFO_R_EINVAL;
1718         }
1719         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1720         if (node == NULL) {
1721                 _LOGE("Out of Memory!!!\n");
1722                 return PMINFO_R_ERROR;
1723         }
1724         if (value)
1725                 val = strndup("true", 4);
1726         else
1727                 val = strndup("false", 5);
1728         if (val == NULL) {
1729                 _LOGE("Out of Memory\n");
1730                 free(node);
1731                 return PMINFO_R_ERROR;
1732         }
1733         node->prop = prop;
1734         node->value = val;
1735         /*If API is called multiple times for same property, we should override the previous values.
1736         Last value set will be used for filtering.*/
1737         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1738         if (link)
1739                 filter->list = g_slist_delete_link(filter->list, link);
1740         filter->list = g_slist_append(filter->list, (gpointer)node);
1741         return PMINFO_R_OK;
1742
1743 }
1744
1745 API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle,
1746                                 const char *property, const char *value)
1747 {
1748         char *val;
1749         GSList *link;
1750         int prop;
1751         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1752         pkgmgrinfo_node_x *node;
1753
1754         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1755         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1756         retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1757
1758         prop = _pminfo_pkginfo_convert_to_prop_str(property);
1759         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1760                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1761                 _LOGE("Invalid String Property\n");
1762                 return PMINFO_R_EINVAL;
1763         }
1764         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1765         if (node == NULL) {
1766                 _LOGE("Out of Memory!!!\n");
1767                 return PMINFO_R_ERROR;
1768         }
1769         if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1770                 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1771         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1772                 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1773         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1774                 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1775         else if (strcmp(value, "installed_internal") == 0)
1776                 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1777         else if (strcmp(value, "installed_external") == 0)
1778                 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1779         else
1780                 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1781         if (val == NULL) {
1782                 _LOGE("Out of Memory\n");
1783                 free(node);
1784                 return PMINFO_R_ERROR;
1785         }
1786         node->prop = prop;
1787         node->value = val;
1788         /*If API is called multiple times for same property, we should override the previous values.
1789         Last value set will be used for filtering.*/
1790         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1791         if (link)
1792                 filter->list = g_slist_delete_link(filter->list, link);
1793         filter->list = g_slist_append(filter->list, (gpointer)node);
1794         return PMINFO_R_OK;
1795
1796 }
1797
1798 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1799 {
1800         int ret;
1801         char *locale;
1802         GHashTable *list = NULL;
1803
1804         if (handle == NULL || count == NULL) {
1805                 _LOGE("invalid parameter");
1806                 return PMINFO_R_EINVAL;
1807         }
1808
1809         locale = _get_system_locale();
1810         if (locale == NULL)
1811                 return PMINFO_R_ERROR;
1812
1813         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
1814                         __free_packages);
1815         if (list == NULL) {
1816                 free(locale);
1817                 return PMINFO_R_ERROR;
1818         }
1819
1820         if (__check_disable_filter_exist((pkgmgrinfo_filter_x *)handle) == false) {
1821                 ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
1822                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
1823                 if (ret != PMINFO_R_OK) {
1824                         free(locale);
1825                         return PMINFO_R_ERROR;
1826                 }
1827         }
1828
1829         ret = _pkginfo_get_packages(uid, locale,
1830                         (pkgmgrinfo_filter_x *)handle, 0, list);
1831         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
1832                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, handle, 0,
1833                                 list);
1834
1835         if (ret != PMINFO_R_OK) {
1836                 g_hash_table_destroy(list);
1837                 free(locale);
1838                 return PMINFO_R_ERROR;
1839         }
1840
1841         *count = g_hash_table_size(list);
1842
1843         g_hash_table_destroy(list);
1844         free(locale);
1845
1846         return PMINFO_R_OK;
1847 }
1848
1849 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1850 {
1851         return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, _getuid());
1852 }
1853
1854 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1855                 pkgmgrinfo_pkginfo_filter_h handle,
1856                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1857 {
1858         if (handle == NULL || pkg_cb == NULL) {
1859                 LOGE("invalid parameter");
1860                 return PMINFO_R_EINVAL;
1861         }
1862
1863         return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
1864                         PMINFO_PKGINFO_GET_ALL, pkg_cb, user_data);
1865 }
1866
1867 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1868                                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1869 {
1870         return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, _getuid());
1871 }
1872
1873 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1874                         pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1875 {
1876         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1877         retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1878         int ret;
1879         privilege_x *privilege;
1880         GList *tmp;
1881         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1882
1883         if (info->pkg_info == NULL)
1884                 return PMINFO_R_ERROR;
1885
1886         for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1887                 privilege = (privilege_x *)tmp->data;
1888                 if (privilege == NULL)
1889                         continue;
1890                 ret = privilege_func(privilege->value, user_data);
1891                 if (ret < 0)
1892                         break;
1893         }
1894         return PMINFO_R_OK;
1895 }
1896
1897 int __compare_package_version(const char *version, int *major,
1898                 int *minor, int *macro, int *nano)
1899 {
1900         char *version_temp = NULL;
1901         char *major_str = NULL;
1902         char *minor_str = NULL;
1903         char *macro_str = NULL;
1904         char *nano_str = NULL;
1905         char *save_str = NULL;
1906
1907         if (version == NULL || major == NULL || minor == NULL ||
1908                 macro == NULL || nano == NULL) {
1909                 return PMINFO_R_EINVAL;
1910         }
1911
1912         version_temp = strdup(version);
1913         if (version_temp == NULL) {
1914                 LOGE("Out of memory");
1915                 return PMINFO_R_ERROR;
1916         }
1917
1918         major_str = strtok_r(version_temp, ".", &save_str);
1919         if (major_str == NULL) {
1920                 _LOGE("major version is NULL");
1921                 free(version_temp);
1922                 return PMINFO_R_ERROR;
1923         }
1924
1925         minor_str = strtok_r(NULL, ".", &save_str);
1926         if (minor_str == NULL) {
1927                 _LOGE("minor version is NULL");
1928                 free(version_temp);
1929                 return PMINFO_R_ERROR;
1930         }
1931
1932         *major = atoi(major_str);
1933         *minor = atoi(minor_str);
1934         *macro = 0;
1935         *minor = 0;
1936         macro_str = strtok_r(NULL, ".", &save_str);
1937         if (macro_str == NULL) {
1938                 _LOGD("macro version is NULL");
1939         } else {
1940                 *macro = atoi(macro_str);
1941                 nano_str = strtok_r(NULL, ".", &save_str);
1942                 if (nano_str) {
1943                         *nano = atoi(nano_str);
1944                         _LOGD("nano version exists");
1945                 }
1946         }
1947         _LOGD("version = [%s] -> major = [%d], minor = [%d]," \
1948                 " macro = [%d], nano = [%d]", version, *major,
1949                 *minor, *macro, *nano);
1950
1951         free(version_temp);
1952
1953         return PMINFO_R_OK;
1954 }
1955
1956 API int pkgmgrinfo_compare_package_version(const char *current_version,
1957                 const char *target_version,
1958                 pkgmgrinfo_version_compare_type *res)
1959 {
1960         int ret = 0;
1961         int current_version_major = 0;
1962         int current_version_minor = 0;
1963         int current_version_macro = 0;
1964         int current_version_nano = 0;
1965         int target_version_major = 0;
1966         int target_version_minor = 0;
1967         int target_version_macro = 0;
1968         int target_version_nano = 0;
1969
1970         if (current_version == NULL || target_version == NULL ||
1971                 res == NULL) {
1972                 _LOGE("Invalid parameter");
1973                 return PMINFO_R_EINVAL;
1974         }
1975
1976         ret = __compare_package_version(target_version,
1977                 &target_version_major, &target_version_minor,
1978                 &target_version_macro, &target_version_nano);
1979         if (ret < 0) {
1980                 _LOGE("Failed to compare target version(%d)", ret);
1981                 return PMINFO_R_ERROR;
1982         }
1983
1984         ret = __compare_package_version(current_version,
1985                 &current_version_major, &current_version_minor,
1986                 &current_version_macro, &current_version_nano);
1987         if (ret < 0) {
1988                 _LOGE("Failed to compare current version(%d)", ret);
1989                 return PMINFO_R_ERROR;
1990         }
1991
1992         _LOGD("new[%d.%d.%d.%d] old[%d.%d.%d.%d]", target_version_major,
1993                 target_version_minor, target_version_macro,
1994                 target_version_nano, current_version_major,
1995                 current_version_minor, current_version_macro,
1996                 target_version_nano);
1997
1998         if (target_version_major > current_version_major)
1999                 *res = PMINFO_VERSION_NEW;
2000         else if (target_version_major < current_version_major)
2001                 *res = PMINFO_VERSION_OLD;
2002         else if (target_version_minor > current_version_minor)
2003                 *res = PMINFO_VERSION_NEW;
2004         else if (target_version_minor < current_version_minor)
2005                 *res = PMINFO_VERSION_OLD;
2006         else if (target_version_macro > current_version_macro)
2007                 *res = PMINFO_VERSION_NEW;
2008         else if (target_version_macro < current_version_macro)
2009                 *res = PMINFO_VERSION_OLD;
2010         else if (target_version_nano > current_version_nano)
2011                 *res = PMINFO_VERSION_NEW;
2012         else if (target_version_nano < current_version_nano)
2013                 *res = PMINFO_VERSION_OLD;
2014         else
2015                 *res = PMINFO_VERSION_SAME;
2016
2017         return PMINFO_R_OK;
2018 }