053193053b1385e7e8f51fed670bfcfe1e263f81
[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 __destroy_metadata_node(gpointer data)
90 {
91         pkgmgrinfo_metadata_node_x *node = (pkgmgrinfo_metadata_node_x *)data;
92         if (node->key)
93                 free(node->key);
94         if (node->value)
95                 free(node->value);
96         free(node);
97 }
98
99 static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data)
100 {
101         ret_if(data == NULL);
102         if (data->locale) {
103                 free((void *)data->locale);
104                 data->locale = NULL;
105         }
106
107         pkgmgrinfo_basic_free_package(data->pkg_info);
108         free((void *)data);
109         data = NULL;
110         return;
111 }
112
113 long long _pkgmgr_calculate_dir_size(char *dirname)
114 {
115         long long total = 0;
116         long long ret = 0;
117         int q = 0; /*quotient*/
118         int r = 0; /*remainder*/
119         DIR *dp = NULL;
120         struct dirent *ep;
121         struct stat fileinfo;
122         char abs_filename[FILENAME_MAX] = { 0, };
123         retvm_if(dirname == NULL, PMINFO_R_ERROR, "dirname is NULL");
124
125         dp = opendir(dirname);
126         if (dp == NULL) {
127                 _LOGE("Couldn't open the directory\n");
128                 return -1;
129         }
130
131         for (ep = readdir(dp); ep != NULL; ep = readdir(dp)) {
132                 if (!strcmp(ep->d_name, ".") ||
133                         !strcmp(ep->d_name, "..")) {
134                         continue;
135                 }
136                 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
137                          ep->d_name);
138                 if (lstat(abs_filename, &fileinfo) < 0)
139                         perror(abs_filename);
140                 else {
141                         if (S_ISDIR(fileinfo.st_mode)) {
142                                 total += fileinfo.st_size;
143                                 if (strcmp(ep->d_name, ".")
144                                     && strcmp(ep->d_name, "..")) {
145                                         ret = _pkgmgr_calculate_dir_size
146                                             (abs_filename);
147                                         total = total + ret;
148                                 }
149                         } else if (S_ISLNK(fileinfo.st_mode)) {
150                                 continue;
151                         } else {
152                                 /*It is a file. Calculate the actual
153                                 size occupied (in terms of 4096 blocks)*/
154                         q = (fileinfo.st_size / BLOCK_SIZE);
155                         r = (fileinfo.st_size % BLOCK_SIZE);
156                         if (r)
157                                 q = q + 1;
158                         total += q * BLOCK_SIZE;
159                         }
160                 }
161         }
162         (void)closedir(dp);
163         return total;
164
165 }
166
167 static int _pkginfo_add_description_info_into_list(const char *locale,
168                 char *record, GList **description)
169 {
170         description_x *info;
171
172         info = calloc(1, sizeof(description_x));
173         if (info == NULL) {
174                 LOGE("out of memory");
175                 return PMINFO_R_ERROR;
176         }
177         info->lang = strdup(locale);
178         info->text = record;
179         *description = g_list_append(*description, info);
180
181         return PMINFO_R_OK;
182 }
183
184 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
185                 GList **privileges)
186 {
187         static const char query_raw[] =
188                 "SELECT DISTINCT privilege, type FROM package_privilege_info "
189                 "WHERE package=%Q";
190         int ret;
191         char *query;
192         sqlite3_stmt *stmt;
193         privilege_x *privilege;
194
195         query = sqlite3_mprintf(query_raw, pkgid);
196         if (query == NULL) {
197                 LOGE("out of memory");
198                 return PMINFO_R_ERROR;
199         }
200
201         ret = sqlite3_prepare_v2(db, query, strlen(query),
202                         &stmt, NULL);
203         sqlite3_free(query);
204         if (ret != SQLITE_OK) {
205                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
206                 return PMINFO_R_ERROR;
207         }
208
209         while (sqlite3_step(stmt) == SQLITE_ROW) {
210                 privilege = calloc(1, sizeof(privilege_x));
211                 _save_column_str(stmt, 0, &privilege->value);
212                 _save_column_str(stmt, 1, &privilege->type);
213                 *privileges = g_list_append(*privileges,
214                                 (gpointer)privilege);
215         }
216
217         sqlite3_finalize(stmt);
218
219         return PMINFO_R_OK;
220 }
221
222 static const char join_localized_info[] =
223         " LEFT OUTER JOIN package_localized_info"
224         "  ON pi.package=package_localized_info.package"
225         "  AND package_localized_info.package_locale=?";
226 static const char join_privilege_info[] =
227         " LEFT OUTER JOIN package_privilege_info"
228         "  ON pi.package=package_privilege_info.package";
229
230 static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
231                 const char *locale, uid_t uid, char **query, GList **bind_params)
232 {
233         int joined = 0;
234         char buf[MAX_QUERY_LEN] = { '\0' };
235         char buf2[MAX_QUERY_LEN] = { '\0' };
236         char *condition = NULL;
237         size_t len = 0;
238         GSList *list = NULL;
239
240         if (filter == NULL)
241                 return PMINFO_R_OK;
242
243         strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1);
244         len += strlen(" WHERE 1=1 ");
245         for (list = filter->list; list; list = list->next) {
246                 joined |= __get_filter_condition(list->data, uid, &condition,
247                                 bind_params);
248                 if (condition == NULL)
249                         continue;
250
251                 strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
252                 len += strlen(" AND ");
253
254                 strncat(buf, condition, sizeof(buf) - len - 1);
255                 len += strlen(condition);
256                 free(condition);
257                 condition = NULL;
258         }
259
260         if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
261                 strncat(buf2, join_localized_info, MAX_QUERY_LEN - len - 1);
262                 len += strlen(join_localized_info);
263                 *bind_params = g_list_append(*bind_params, strdup(locale));
264         }
265         if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO) {
266                 strncat(buf2, join_privilege_info, MAX_QUERY_LEN - len - 1);
267                 len += strlen(join_privilege_info);
268         }
269         strncat(buf2, buf, MAX_QUERY_LEN - len - 1);
270
271         *query = strdup(buf2);
272         if (*query == NULL)
273                 return PMINFO_R_ERROR;
274
275         return PMINFO_R_OK;
276 }
277
278 static void __free_packages(gpointer data)
279 {
280         pkgmgrinfo_basic_free_package((package_x *)data);
281 }
282
283 static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter)
284 {
285         GSList *link;
286
287         if (filter == NULL)
288                 return false;
289
290         link = g_slist_find_custom(filter->list, NULL, __pkg_disable_chk_func);
291         if (link)
292                 return true;
293
294         return false;
295 }
296
297 static int __bind_params(sqlite3_stmt *stmt, GList *params)
298 {
299         GList *tmp_list = NULL;
300         int idx = 0;
301         int ret;
302
303         if (stmt == NULL || params == NULL)
304                 return PMINFO_R_EINVAL;
305
306         tmp_list = params;
307         while (tmp_list) {
308                 ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC);
309                 if (ret != SQLITE_OK)
310                         return PMINFO_R_ERROR;
311                 tmp_list = tmp_list->next;
312         }
313
314         return PMINFO_R_OK;
315 }
316
317 static bool __check_package_storage_status(pkgmgrinfo_filter_x *tmp_filter)
318 {
319         GSList *tmp_list = NULL;
320         pkgmgrinfo_node_x *tmp_node = NULL;
321         int property = -1;
322
323         property = _pminfo_pkginfo_convert_to_prop_bool(PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE);
324         for (tmp_list = tmp_filter->list; tmp_list != NULL;
325                         tmp_list = g_slist_next(tmp_list)) {
326                 tmp_node = (pkgmgrinfo_node_x *)tmp_list->data;
327                 if (property == tmp_node->prop) {
328                         if (strcmp(tmp_node->value, "true") == 0)
329                                 return true;
330                         else
331                                 return false;
332                 }
333         }
334         return true;
335 }
336
337 static int _pkginfo_get_packages(uid_t uid, const char *locale,
338                 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
339 {
340         static const char query_raw[] =
341                 "SELECT DISTINCT pi.package, pi.package_version, "
342                 "pi.install_location, pi.package_removable, "
343                 "pi.package_preload, pi.package_readonly, pi.package_update, "
344                 "pi.package_appsetting, pi.package_system, pi.package_type, "
345                 "pi.package_size, pi.installed_time, pi.installed_storage, "
346                 "pi.storeclient_id, pi.mainapp_id, pi.package_url, "
347                 "pi.root_path, pi.csc_path, pi.package_nodisplay, "
348                 "pi.package_api_version, pi.package_support_disable, "
349                 "pi.package_tep_name, pi.package_zip_mount_file, pi.external_path, "
350                 "pi.package_support_mode";
351         static const char query_author[] =
352                 ", pi.author_name, pi.author_email, pi.author_href";
353         static const char query_label[] =
354                 ", COALESCE("
355                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
356                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
357         static const char query_icon[] =
358                 ", COALESCE("
359                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
360                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
361         static const char query_description[] =
362                 ", COALESCE("
363                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
364                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
365         static const char query_from_clause[] = " FROM package_info as pi";
366         int ret = PMINFO_R_ERROR;
367         int idx = 0;
368         int query_len = 0;
369         char *dbpath;
370         char *tmp_record = NULL;
371         char *constraints = NULL;
372         char query[MAX_QUERY_LEN] = { '\0' };
373         package_x *info = NULL;
374         author_x *author = NULL;
375         GList *bind_params = NULL;
376         sqlite3 *db;
377         sqlite3_stmt *stmt = NULL;
378         pkgmgrinfo_filter_x *tmp_filter = NULL;
379         bool is_check_storage = true;
380
381         dbpath = getUserPkgParserDBPathUID(uid);
382         if (dbpath == NULL)
383                 return PMINFO_R_ERROR;
384
385         ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
386         if (ret != SQLITE_OK) {
387                 _LOGD("failed to open db: %d", ret);
388                 free(dbpath);
389                 return PMINFO_R_ERROR;
390         }
391         free(dbpath);
392
393         if (filter != NULL) {
394                 tmp_filter = filter;
395         } else {
396                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
397                 if (ret != PMINFO_R_OK) {
398                         _LOGE("Failed to create filter");
399                         return PMINFO_R_ERROR;
400                 }
401         }
402
403         is_check_storage = __check_package_storage_status(tmp_filter);
404
405         query_len = strlen(query_raw);
406         snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
407         if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
408                 strncat(query, query_author, MAX_QUERY_LEN - query_len - 1);
409                 query_len += strlen(query_author);
410         }
411         if (flag & PMINFO_PKGINFO_GET_LABEL) {
412                 strncat(query, query_label, MAX_QUERY_LEN - query_len - 1);
413                 query_len += strlen(query_label);
414                 bind_params = g_list_append(bind_params, strdup(locale));
415         }
416         if (flag & PMINFO_PKGINFO_GET_ICON) {
417                 strncat(query, query_icon, MAX_QUERY_LEN - query_len - 1);
418                 query_len += strlen(query_icon);
419                 bind_params = g_list_append(bind_params, strdup(locale));
420         }
421         if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
422                 strncat(query, query_description, MAX_QUERY_LEN - query_len - 1);
423                 query_len += strlen(query_description);
424                 bind_params = g_list_append(bind_params, strdup(locale));
425         }
426
427         strncat(query, query_from_clause, MAX_QUERY_LEN - query_len - 1);
428         query_len += strlen(query_from_clause);
429
430         ret = _get_filtered_query(tmp_filter, locale, uid, &constraints, &bind_params);
431         if (ret != PMINFO_R_OK) {
432                 LOGE("Failed to get WHERE clause");
433                 goto catch;
434         }
435
436         if (constraints)
437                 strncat(query, constraints, MAX_QUERY_LEN - query_len - 1);
438
439         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
440         if (ret != SQLITE_OK) {
441                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
442                 ret = PMINFO_R_ERROR;
443                 goto catch;
444         }
445
446         ret = __bind_params(stmt, bind_params);
447         if (ret != SQLITE_OK) {
448                 LOGE("Failed to bind parameters");
449                 goto catch;
450         }
451
452         while (sqlite3_step(stmt) == SQLITE_ROW) {
453                 info = calloc(1, sizeof(package_x));
454                 if (info == NULL) {
455                         LOGE("out of memory");
456                         ret = PMINFO_R_ERROR;
457                         goto catch;
458                 }
459                 idx = 0;
460                 _save_column_str(stmt, idx++, &info->package);
461                 if (g_hash_table_contains(packages,
462                                         (gconstpointer)info->package)) {
463                         free(info->package);
464                         free(info);
465                         info = NULL;
466                         continue;
467                 }
468                 _save_column_str(stmt, idx++, &info->version);
469                 _save_column_str(stmt, idx++, &info->installlocation);
470                 _save_column_str(stmt, idx++, &info->removable);
471                 _save_column_str(stmt, idx++, &info->preload);
472                 _save_column_str(stmt, idx++, &info->readonly);
473                 _save_column_str(stmt, idx++, &info->update);
474                 _save_column_str(stmt, idx++, &info->appsetting);
475                 _save_column_str(stmt, idx++, &info->system);
476                 _save_column_str(stmt, idx++, &info->type);
477                 _save_column_str(stmt, idx++, &info->package_size);
478                 _save_column_str(stmt, idx++, &info->installed_time);
479                 _save_column_str(stmt, idx++, &info->installed_storage);
480                 _save_column_str(stmt, idx++, &info->storeclient_id);
481                 _save_column_str(stmt, idx++, &info->mainapp_id);
482                 _save_column_str(stmt, idx++, &info->package_url);
483                 _save_column_str(stmt, idx++, &info->root_path);
484                 _save_column_str(stmt, idx++, &info->csc_path);
485                 _save_column_str(stmt, idx++, &info->nodisplay_setting);
486                 _save_column_str(stmt, idx++, &info->api_version);
487                 _save_column_str(stmt, idx++, &info->support_disable);
488                 _save_column_str(stmt, idx++, &info->tep_name);
489                 _save_column_str(stmt, idx++, &info->zip_mount_file);
490                 _save_column_str(stmt, idx++, &info->external_path);
491                 _save_column_str(stmt, idx++, &info->support_mode);
492                 info->for_all_users =
493                         strdup((uid != GLOBAL_USER) ? "false" : "true");
494
495                 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
496                         /* TODO : author should be retrieved at package_localized_info */
497                         author = calloc(1, sizeof(author_x));
498                         if (author == NULL) {
499                                 ret = PMINFO_R_ERROR;
500                                 goto catch;
501                         }
502                         _save_column_str(stmt, idx++, &author->text);
503                         _save_column_str(stmt, idx++, &author->email);
504                         _save_column_str(stmt, idx++, &author->href);
505                         info->author = g_list_append(info->author, author);
506                 }
507
508                 if (flag & PMINFO_PKGINFO_GET_LABEL) {
509                         tmp_record = NULL;
510                         _save_column_str(stmt, idx++, &tmp_record);
511
512                         if (_add_label_info_into_list(locale, tmp_record, &info->label)) {
513                                 ret = PMINFO_R_ERROR;
514                                 goto catch;
515                         }
516                 }
517
518                 if (flag & PMINFO_PKGINFO_GET_ICON) {
519                         tmp_record = NULL;
520                         _save_column_str(stmt, idx++, &tmp_record);
521                         if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) {
522                                 ret = PMINFO_R_ERROR;
523                                 goto catch;
524                         }
525                 }
526
527                 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
528                         tmp_record = NULL;
529                         _save_column_str(stmt, idx++, &tmp_record);
530                         if (_pkginfo_add_description_info_into_list(locale, tmp_record,
531                                         &info->description)) {
532                                 ret = PMINFO_R_ERROR;
533                                 goto catch;
534                         }
535                 }
536
537                 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
538                         if (_pkginfo_get_privilege(db, info->package,
539                                                 &info->privileges)) {
540                                 ret = PMINFO_R_ERROR;
541                                 goto catch;
542                         }
543                 }
544
545                 if (is_check_storage &&
546                                 __pkginfo_check_installed_storage(info) != PMINFO_R_OK) {
547                         ret = PMINFO_R_ERROR;
548                         pkgmgrinfo_basic_free_package(info);
549                         info = NULL;
550                         continue;
551                 }
552
553                 g_hash_table_insert(packages, (gpointer)info->package,
554                                 (gpointer)info);
555         }
556
557         ret = PMINFO_R_OK;
558
559 catch:
560         if (constraints)
561                 free(constraints);
562
563         if (ret != PMINFO_R_OK && info != NULL)
564                 pkgmgrinfo_basic_free_package(info);
565
566         if (filter == NULL)
567                 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
568
569         g_list_free_full(bind_params, free);
570         sqlite3_close_v2(db);
571         if (stmt)
572                 sqlite3_finalize(stmt);
573
574         return ret;
575 }
576
577 static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
578                 pkgmgrinfo_filter_x *filter, int flag,
579                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
580 {
581         int ret;
582         char *locale;
583         package_x *pkg;
584         pkgmgr_pkginfo_x info;
585         pkgmgrinfo_filter_x *tmp_filter = NULL;
586         GHashTable *list;
587         GHashTableIter iter;
588         gpointer value;
589
590         locale = _get_system_locale();
591         if (locale == NULL)
592                 return PMINFO_R_ERROR;
593
594         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
595                         __free_packages);
596         if (list == NULL) {
597                 free(locale);
598                 return PMINFO_R_ERROR;
599         }
600
601         if (filter != NULL) {
602                 tmp_filter = (pkgmgrinfo_filter_x *)filter;
603         } else {
604                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
605                 if (ret != PMINFO_R_OK) {
606                         _LOGE("Failed to create filter");
607                         g_hash_table_destroy(list);
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_external_image_path(pkgmgrinfo_pkginfo_h handle, char **ext_image_path)
1100 {
1101         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1102
1103         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1104         retvm_if(ext_image_path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1105
1106         if (info->pkg_info == NULL)
1107                 return PMINFO_R_ERROR;
1108
1109         if (info->pkg_info->external_path == NULL)
1110                 return PMINFO_R_ENOENT;
1111
1112         *ext_image_path = (char *)info->pkg_info->external_path;
1113
1114         return PMINFO_R_OK;
1115 }
1116
1117 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
1118 {
1119         char *val;
1120         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1121
1122         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1123         retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1124
1125         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1126                 return PMINFO_R_ERROR;
1127
1128         val = (char *)info->pkg_info->installlocation;
1129         if (strcmp(val, "internal-only") == 0)
1130                 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
1131         else if (strcmp(val, "prefer-external") == 0)
1132                 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
1133         else
1134                 *location = PMINFO_INSTALL_LOCATION_AUTO;
1135
1136         return PMINFO_R_OK;
1137 }
1138
1139 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
1140 {
1141         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1142         char *temp = NULL;
1143
1144         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1145         retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1146
1147         if (info->pkg_info == NULL)
1148                 return PMINFO_R_ERROR;
1149
1150         if (info->pkg_info->package_size == NULL) {
1151                 temp = strdup("");
1152                 if (temp == NULL) {
1153                         _LOGE("out of memory");
1154                         return PMINFO_R_ERROR;
1155                 } else {
1156                         info->pkg_info->package_size = temp;
1157                 }
1158         }
1159
1160         *size = atoi((char *)info->pkg_info->package_size);
1161
1162         return PMINFO_R_OK;
1163 }
1164
1165 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
1166 {
1167         icon_x *ptr;
1168         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1169
1170         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1171         retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1172
1173         if (info->pkg_info == NULL || info->pkg_info->icon == NULL)
1174                 return PMINFO_R_ERROR;
1175
1176         ptr = (icon_x *)info->pkg_info->icon->data;
1177         if (ptr == NULL)
1178                 return PMINFO_R_ERROR;
1179
1180         /* TODO : should we return empty string if there was no icon? */
1181         if (ptr->text == NULL)
1182                 *icon = "";
1183         else
1184                 *icon = ptr->text;
1185
1186         return PMINFO_R_OK;
1187 }
1188
1189 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
1190 {
1191         label_x *ptr;
1192         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1193
1194         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1195         retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1196
1197         if (info->pkg_info == NULL || info->pkg_info->label == NULL)
1198                 return PMINFO_R_ERROR;
1199
1200         ptr = (label_x *)info->pkg_info->label->data;
1201         if (ptr == NULL)
1202                 return PMINFO_R_ERROR;
1203
1204         /* TODO : should we return empty string if there was no label? */
1205         if (ptr->text == NULL)
1206                 *label = "";
1207         else
1208                 *label = ptr->text;
1209
1210         return PMINFO_R_OK;
1211 }
1212
1213 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
1214 {
1215         description_x *ptr;
1216         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1217
1218         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1219         retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1220
1221         if (info->pkg_info == NULL || info->pkg_info->description == NULL)
1222                 return PMINFO_R_ERROR;
1223
1224         ptr = (description_x *)info->pkg_info->description->data;
1225         if (ptr == NULL)
1226                 return PMINFO_R_ERROR;
1227
1228         if (ptr->text == NULL)
1229                 *description = "";
1230         else
1231                 *description = (char *)ptr->text;
1232
1233         return PMINFO_R_OK;
1234 }
1235
1236 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
1237 {
1238         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1239         author_x *author;
1240
1241         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1242         retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1243
1244         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1245                 return PMINFO_R_ERROR;
1246
1247         author = (author_x *)info->pkg_info->author->data;
1248         if (author == NULL)
1249                 return PMINFO_R_ERROR;
1250
1251         if (author->text == NULL)
1252                 *author_name = "";
1253         else
1254                 *author_name = (char *)author->text;
1255
1256         return PMINFO_R_OK;
1257 }
1258
1259 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
1260 {
1261         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1262         author_x *author;
1263
1264         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1265         retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1266
1267         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1268                 return PMINFO_R_ERROR;
1269
1270         author = (author_x *)info->pkg_info->author->data;
1271         if (author == NULL)
1272                 return PMINFO_R_ERROR;
1273
1274         if (author->email == NULL)
1275                 *author_email = "";
1276         else
1277                 *author_email = (char *)author->email;
1278
1279         return PMINFO_R_OK;
1280 }
1281
1282 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
1283 {
1284         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1285         author_x *author;
1286
1287         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1288         retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1289
1290         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1291                 return PMINFO_R_ERROR;
1292
1293         author = (author_x *)info->pkg_info->author->data;
1294         if (author == NULL)
1295                 return PMINFO_R_ERROR;
1296
1297         if (author->href == NULL)
1298                 *author_href = "";
1299         else
1300                 *author_href = (char *)author->href;
1301
1302         return PMINFO_R_OK;
1303 }
1304
1305 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
1306 {
1307         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1308
1309         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1310         retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1311
1312         if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
1313                 return PMINFO_R_ERROR;
1314
1315         if (strcmp(info->pkg_info->installed_storage, "installed_internal") == 0)
1316                 *storage = PMINFO_INTERNAL_STORAGE;
1317         else if (strcmp(info->pkg_info->installed_storage, "installed_external") == 0)
1318                 *storage = PMINFO_EXTERNAL_STORAGE;
1319         else
1320                 return PMINFO_R_ERROR;
1321
1322         return PMINFO_R_OK;
1323 }
1324
1325 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
1326 {
1327         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1328
1329         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1330         retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1331
1332         if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
1333                 return PMINFO_R_ERROR;
1334
1335         *installed_time = atoi(info->pkg_info->installed_time);
1336
1337         return PMINFO_R_OK;
1338 }
1339
1340 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
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(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1346
1347         if (info->pkg_info == NULL)
1348                 return PMINFO_R_ERROR;
1349
1350         if (info->pkg_info->storeclient_id == NULL)
1351                 *storeclientid = "";
1352         else
1353                 *storeclientid = (char *)info->pkg_info->storeclient_id;
1354
1355         return PMINFO_R_OK;
1356 }
1357
1358 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
1359 {
1360         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1361
1362         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1363         retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1364
1365         if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
1366                 return PMINFO_R_ERROR;
1367
1368         *mainappid = (char *)info->pkg_info->mainapp_id;
1369
1370         return PMINFO_R_OK;
1371 }
1372
1373 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
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(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1379
1380         if (info->pkg_info == NULL)
1381                 return PMINFO_R_ERROR;
1382
1383         if (info->pkg_info->package_url == NULL)
1384                 *url = "";
1385         else
1386                 *url = (char *)info->pkg_info->package_url;
1387
1388         return PMINFO_R_OK;
1389 }
1390
1391 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
1392 {
1393         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1394
1395         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1396         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1397
1398         if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
1399                 return PMINFO_R_ERROR;
1400
1401         *path = (char *)info->pkg_info->root_path;
1402
1403         return PMINFO_R_OK;
1404 }
1405
1406 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
1407 {
1408         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1409
1410         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1411         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1412
1413         if (info->pkg_info == NULL)
1414                 return PMINFO_R_ERROR;
1415
1416         if (info->pkg_info->csc_path == NULL)
1417                 *path = "";
1418         else
1419                 *path = (char *)info->pkg_info->csc_path;
1420
1421         return PMINFO_R_OK;
1422 }
1423
1424 API int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode)
1425 {
1426         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1427         retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1428
1429         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1430         if (info->pkg_info->support_mode)
1431                 *support_mode = atoi(info->pkg_info->support_mode);
1432         else
1433                 *support_mode = 0;
1434
1435         return PMINFO_R_OK;
1436 }
1437
1438 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
1439 {
1440         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1441         retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1442
1443 #if 0 /* smack issue occured, check later */
1444         char *pkgid = NULL;
1445         pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
1446         if (pkgid == NULL) {
1447                  _LOGD("invalid func parameters\n");
1448                  return PMINFO_R_ERROR;
1449         }
1450          _LOGD("pkgmgr_get_pkg_external_validation() called\n");
1451
1452         FILE *fp = NULL;
1453         char app_mmc_path[FILENAME_MAX] = { 0, };
1454         char app_dir_path[FILENAME_MAX] = { 0, };
1455         char app_mmc_internal_path[FILENAME_MAX] = { 0, };
1456         snprintf(app_dir_path, FILENAME_MAX, "%s%s", PKG_INSTALLATION_PATH, pkgid);
1457         snprintf(app_mmc_path, FILENAME_MAX, "%s%s", PKG_SD_PATH, pkgid);
1458         snprintf(app_mmc_internal_path, FILENAME_MAX, "%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
1459
1460         /*check whether application is in external memory or not */
1461         fp = fopen(app_mmc_path, "r");
1462         if (fp == NULL) {
1463                 _LOGD(" app path in external memory not accesible\n");
1464         } else {
1465                 fclose(fp);
1466                 fp = NULL;
1467                 *accessible = 1;
1468                 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
1469                 return PMINFO_R_OK;
1470         }
1471
1472         /*check whether application is in internal or not */
1473         if (fp == NULL) {
1474                 _LOGD(" app path in internal memory not accesible\n");
1475                 *accessible = 0;
1476                 return PMINFO_R_ERROR;
1477         } else {
1478                 fclose(fp);
1479                 /*check whether the application is installed in SD card
1480                 but SD card is not present*/
1481                 fp = fopen(app_mmc_internal_path, "r");
1482                 if (fp == NULL) {
1483                         *accessible = 1;
1484                         _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
1485                         return PMINFO_R_OK;
1486                 } else {
1487                         *accessible = 0;
1488                         _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
1489                 }
1490                 fclose(fp);
1491         }
1492
1493         _LOGD("pkgmgr_get_pkg_external_validation() end\n");
1494 #endif
1495
1496         *accessible = 1;
1497         return PMINFO_R_OK;
1498 }
1499
1500 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
1501 {
1502         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1503
1504         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1505         retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1506
1507         if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
1508                 return PMINFO_R_ERROR;
1509
1510         *removable = _get_bool_value(info->pkg_info->removable);
1511
1512         return PMINFO_R_OK;
1513 }
1514
1515 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1516 {
1517         char *val;
1518         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1519
1520         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1521         retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1522
1523         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1524                 return PMINFO_R_ERROR;
1525
1526         val = (char *)info->pkg_info->installlocation;
1527         if (strcmp(val, "internal-only") == 0)
1528                 *movable = 0;
1529         else if (strcmp(val, "prefer-external") == 0)
1530                 *movable = 1;
1531         else
1532                 *movable = 1;
1533
1534         return PMINFO_R_OK;
1535 }
1536
1537 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1538 {
1539         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1540
1541         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1542         retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1543
1544         if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1545                 return PMINFO_R_ERROR;
1546
1547         *preload = _get_bool_value(info->pkg_info->preload);
1548
1549         return PMINFO_R_OK;
1550 }
1551
1552 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1553 {
1554         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1555
1556         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1557         retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1558
1559         if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1560                 return PMINFO_R_ERROR;
1561
1562         *system = _get_bool_value(info->pkg_info->system);
1563
1564         return PMINFO_R_OK;
1565 }
1566
1567 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1568 {
1569         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1570
1571         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1572         retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1573
1574         if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1575                 return PMINFO_R_ERROR;
1576
1577         *readonly = _get_bool_value(info->pkg_info->readonly);
1578
1579         return PMINFO_R_OK;
1580 }
1581
1582 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
1583 {
1584         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1585
1586         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1587         retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1588
1589         if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1590                 return PMINFO_R_ERROR;
1591
1592         *update = _get_bool_value(info->pkg_info->update);
1593
1594         return PMINFO_R_OK;
1595 }
1596
1597 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1598 {
1599         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1600
1601         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1602         retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1603
1604         if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1605                 return PMINFO_R_ERROR;
1606
1607         *support_disable = _get_bool_value(info->pkg_info->support_disable);
1608
1609         return PMINFO_R_OK;
1610 }
1611
1612 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1613 {
1614         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1615
1616         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1617         retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1618
1619         if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1620                 return PMINFO_R_ERROR;
1621
1622         *global = _get_bool_value(info->pkg_info->for_all_users);
1623
1624         return PMINFO_R_OK;
1625 }
1626
1627 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1628 {
1629         return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1630 }
1631
1632 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1633 {
1634         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1635
1636         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1637
1638         __cleanup_pkginfo(info);
1639
1640         return PMINFO_R_OK;
1641 }
1642
1643 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1644 {
1645         pkgmgrinfo_filter_x *filter;
1646
1647         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1648
1649         filter = (pkgmgrinfo_filter_x *)calloc(1, sizeof(pkgmgrinfo_filter_x));
1650         if (filter == NULL) {
1651                 _LOGE("Out of Memory!!!");
1652                 return PMINFO_R_ERROR;
1653         }
1654
1655         *handle = filter;
1656
1657         return PMINFO_R_OK;
1658 }
1659
1660 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1661 {
1662         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1663
1664         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1665
1666         if (filter->list) {
1667                 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1668                 g_slist_free(filter->list);
1669         }
1670
1671         g_slist_free_full(filter->list_metadata, __destroy_metadata_node);
1672
1673         free(filter);
1674
1675         return PMINFO_R_OK;
1676 }
1677
1678 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1679                                 const char *property, const int value)
1680 {
1681         char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1682         char *val;
1683         GSList *link;
1684         int prop;
1685         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1686         pkgmgrinfo_node_x *node;
1687
1688         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1689         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1690
1691         prop = _pminfo_pkginfo_convert_to_prop_int(property);
1692         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1693                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1694                 _LOGE("Invalid Integer Property\n");
1695                 return PMINFO_R_EINVAL;
1696         }
1697         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1698         if (node == NULL) {
1699                 _LOGE("Out of Memory!!!\n");
1700                 return PMINFO_R_ERROR;
1701         }
1702         snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1703         val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1704         if (val == NULL) {
1705                 _LOGE("Out of Memory\n");
1706                 free(node);
1707                 return PMINFO_R_ERROR;
1708         }
1709         node->prop = prop;
1710         node->value = val;
1711         /*If API is called multiple times for same property, we should override the previous values.
1712         Last value set will be used for filtering.*/
1713         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1714         if (link)
1715                 filter->list = g_slist_delete_link(filter->list, link);
1716         filter->list = g_slist_append(filter->list, (gpointer)node);
1717         return PMINFO_R_OK;
1718
1719 }
1720
1721 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1722                                 const char *property, const bool value)
1723 {
1724         char *val;
1725         GSList *link;
1726         int prop;
1727         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1728         pkgmgrinfo_node_x *node;
1729
1730         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1731         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1732
1733         prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1734         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1735                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1736                 _LOGE("Invalid Boolean Property\n");
1737                 return PMINFO_R_EINVAL;
1738         }
1739         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1740         if (node == NULL) {
1741                 _LOGE("Out of Memory!!!\n");
1742                 return PMINFO_R_ERROR;
1743         }
1744         if (value)
1745                 val = strndup("true", 4);
1746         else
1747                 val = strndup("false", 5);
1748         if (val == NULL) {
1749                 _LOGE("Out of Memory\n");
1750                 free(node);
1751                 return PMINFO_R_ERROR;
1752         }
1753         node->prop = prop;
1754         node->value = val;
1755         /*If API is called multiple times for same property, we should override the previous values.
1756         Last value set will be used for filtering.*/
1757         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1758         if (link)
1759                 filter->list = g_slist_delete_link(filter->list, link);
1760         filter->list = g_slist_append(filter->list, (gpointer)node);
1761         return PMINFO_R_OK;
1762
1763 }
1764
1765 API int pkgmgrinfo_pkginfo_filter_add_string(pkgmgrinfo_pkginfo_filter_h handle,
1766                                 const char *property, const char *value)
1767 {
1768         char *val;
1769         GSList *link;
1770         int prop;
1771         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1772         pkgmgrinfo_node_x *node;
1773
1774         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1775         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1776         retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1777
1778         prop = _pminfo_pkginfo_convert_to_prop_str(property);
1779         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1780                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1781                 _LOGE("Invalid String Property\n");
1782                 return PMINFO_R_EINVAL;
1783         }
1784         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1785         if (node == NULL) {
1786                 _LOGE("Out of Memory!!!\n");
1787                 return PMINFO_R_ERROR;
1788         }
1789         if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1790                 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1791         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1792                 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1793         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1794                 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1795         else if (strcmp(value, "installed_internal") == 0)
1796                 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1797         else if (strcmp(value, "installed_external") == 0)
1798                 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1799         else
1800                 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1801         if (val == NULL) {
1802                 _LOGE("Out of Memory\n");
1803                 free(node);
1804                 return PMINFO_R_ERROR;
1805         }
1806         node->prop = prop;
1807         node->value = val;
1808         /*If API is called multiple times for same property, we should override the previous values.
1809         Last value set will be used for filtering.*/
1810         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1811         if (link)
1812                 filter->list = g_slist_delete_link(filter->list, link);
1813         filter->list = g_slist_append(filter->list, (gpointer)node);
1814         return PMINFO_R_OK;
1815
1816 }
1817
1818 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1819 {
1820         int ret;
1821         char *locale;
1822         GHashTable *list = NULL;
1823
1824         if (handle == NULL || count == NULL) {
1825                 _LOGE("invalid parameter");
1826                 return PMINFO_R_EINVAL;
1827         }
1828
1829         locale = _get_system_locale();
1830         if (locale == NULL)
1831                 return PMINFO_R_ERROR;
1832
1833         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
1834                         __free_packages);
1835         if (list == NULL) {
1836                 free(locale);
1837                 return PMINFO_R_ERROR;
1838         }
1839
1840         if (__check_disable_filter_exist((pkgmgrinfo_filter_x *)handle) == false) {
1841                 ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
1842                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
1843                 if (ret != PMINFO_R_OK) {
1844                         free(locale);
1845                         g_hash_table_destroy(list);
1846                         return PMINFO_R_ERROR;
1847                 }
1848         }
1849
1850         ret = _pkginfo_get_packages(uid, locale,
1851                         (pkgmgrinfo_filter_x *)handle, 0, list);
1852         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
1853                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, handle, 0,
1854                                 list);
1855
1856         if (ret != PMINFO_R_OK) {
1857                 g_hash_table_destroy(list);
1858                 free(locale);
1859                 return PMINFO_R_ERROR;
1860         }
1861
1862         *count = g_hash_table_size(list);
1863
1864         g_hash_table_destroy(list);
1865         free(locale);
1866
1867         return PMINFO_R_OK;
1868 }
1869
1870 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1871 {
1872         return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, _getuid());
1873 }
1874
1875 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1876                 pkgmgrinfo_pkginfo_filter_h handle,
1877                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1878 {
1879         if (handle == NULL || pkg_cb == NULL) {
1880                 LOGE("invalid parameter");
1881                 return PMINFO_R_EINVAL;
1882         }
1883
1884         return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
1885                         PMINFO_PKGINFO_GET_ALL, pkg_cb, user_data);
1886 }
1887
1888 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1889                                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1890 {
1891         return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, _getuid());
1892 }
1893
1894 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1895                         pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1896 {
1897         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1898         retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1899         int ret;
1900         privilege_x *privilege;
1901         GList *tmp;
1902         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1903
1904         if (info->pkg_info == NULL)
1905                 return PMINFO_R_ERROR;
1906
1907         for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1908                 privilege = (privilege_x *)tmp->data;
1909                 if (privilege == NULL)
1910                         continue;
1911                 ret = privilege_func(privilege->value, user_data);
1912                 if (ret < 0)
1913                         break;
1914         }
1915         return PMINFO_R_OK;
1916 }
1917
1918 int __compare_package_version(const char *version, int *major,
1919                 int *minor, int *macro, int *nano)
1920 {
1921         char *version_temp = NULL;
1922         char *major_str = NULL;
1923         char *minor_str = NULL;
1924         char *macro_str = NULL;
1925         char *nano_str = NULL;
1926         char *save_str = NULL;
1927
1928         if (version == NULL || major == NULL || minor == NULL ||
1929                 macro == NULL || nano == NULL) {
1930                 return PMINFO_R_EINVAL;
1931         }
1932
1933         version_temp = strdup(version);
1934         if (version_temp == NULL) {
1935                 LOGE("Out of memory");
1936                 return PMINFO_R_ERROR;
1937         }
1938
1939         major_str = strtok_r(version_temp, ".", &save_str);
1940         if (major_str == NULL) {
1941                 _LOGE("major version is NULL");
1942                 free(version_temp);
1943                 return PMINFO_R_ERROR;
1944         }
1945
1946         minor_str = strtok_r(NULL, ".", &save_str);
1947         if (minor_str == NULL) {
1948                 _LOGE("minor version is NULL");
1949                 free(version_temp);
1950                 return PMINFO_R_ERROR;
1951         }
1952
1953         *major = atoi(major_str);
1954         *minor = atoi(minor_str);
1955         *macro = 0;
1956         *nano = 0;
1957         macro_str = strtok_r(NULL, ".", &save_str);
1958         if (macro_str == NULL) {
1959                 _LOGD("macro version is NULL");
1960         } else {
1961                 *macro = atoi(macro_str);
1962                 nano_str = strtok_r(NULL, ".", &save_str);
1963                 if (nano_str) {
1964                         *nano = atoi(nano_str);
1965                         _LOGD("nano version exists");
1966                 }
1967         }
1968         _LOGD("version = [%s] -> major = [%d], minor = [%d]," \
1969                 " macro = [%d], nano = [%d]", version, *major,
1970                 *minor, *macro, *nano);
1971
1972         free(version_temp);
1973
1974         return PMINFO_R_OK;
1975 }
1976
1977 API int pkgmgrinfo_compare_package_version(const char *current_version,
1978                 const char *target_version,
1979                 pkgmgrinfo_version_compare_type *res)
1980 {
1981         int ret = 0;
1982         int current_version_major = 0;
1983         int current_version_minor = 0;
1984         int current_version_macro = 0;
1985         int current_version_nano = 0;
1986         int target_version_major = 0;
1987         int target_version_minor = 0;
1988         int target_version_macro = 0;
1989         int target_version_nano = 0;
1990
1991         if (current_version == NULL || target_version == NULL ||
1992                 res == NULL) {
1993                 _LOGE("Invalid parameter");
1994                 return PMINFO_R_EINVAL;
1995         }
1996
1997         ret = __compare_package_version(target_version,
1998                 &target_version_major, &target_version_minor,
1999                 &target_version_macro, &target_version_nano);
2000         if (ret < 0) {
2001                 _LOGE("Failed to compare target version(%d)", ret);
2002                 return PMINFO_R_ERROR;
2003         }
2004
2005         ret = __compare_package_version(current_version,
2006                 &current_version_major, &current_version_minor,
2007                 &current_version_macro, &current_version_nano);
2008         if (ret < 0) {
2009                 _LOGE("Failed to compare current version(%d)", ret);
2010                 return PMINFO_R_ERROR;
2011         }
2012
2013         _LOGD("new[%d.%d.%d.%d] old[%d.%d.%d.%d]", target_version_major,
2014                 target_version_minor, target_version_macro,
2015                 target_version_nano, current_version_major,
2016                 current_version_minor, current_version_macro,
2017                 target_version_nano);
2018
2019         if (target_version_major > current_version_major)
2020                 *res = PMINFO_VERSION_NEW;
2021         else if (target_version_major < current_version_major)
2022                 *res = PMINFO_VERSION_OLD;
2023         else if (target_version_minor > current_version_minor)
2024                 *res = PMINFO_VERSION_NEW;
2025         else if (target_version_minor < current_version_minor)
2026                 *res = PMINFO_VERSION_OLD;
2027         else if (target_version_macro > current_version_macro)
2028                 *res = PMINFO_VERSION_NEW;
2029         else if (target_version_macro < current_version_macro)
2030                 *res = PMINFO_VERSION_OLD;
2031         else if (target_version_nano > current_version_nano)
2032                 *res = PMINFO_VERSION_NEW;
2033         else if (target_version_nano < current_version_nano)
2034                 *res = PMINFO_VERSION_OLD;
2035         else
2036                 *res = PMINFO_VERSION_SAME;
2037
2038         return PMINFO_R_OK;
2039 }