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