Add an exception handling
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_pkginfo.c
1 /*
2  * pkgmgr-info
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7  * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */
22
23 #define _GNU_SOURCE
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <stdbool.h>
28 #include <unistd.h>
29 #include <ctype.h>
30 #include <sys/smack.h>
31 #include <linux/limits.h>
32 #include <libgen.h>
33 #include <sys/stat.h>
34
35 #include <sqlite3.h>
36 #include <glib.h>
37
38 #include "pkgmgrinfo_basic.h"
39 #include "pkgmgrinfo_private.h"
40 #include "pkgmgrinfo_debug.h"
41 #include "pkgmgr-info.h"
42
43 static bool _get_bool_value(const char *str)
44 {
45         if (str && !strcmp(str, "true"))
46                 return true;
47         else
48                 return false;
49 }
50
51 static gint __compare_func(gconstpointer data1, gconstpointer data2)
52 {
53         pkgmgrinfo_node_x *node1 = (pkgmgrinfo_node_x *)data1;
54         pkgmgrinfo_node_x *node2 = (pkgmgrinfo_node_x *)data2;
55         if (node1->prop == node2->prop)
56                 return 0;
57         else if (node1->prop > node2->prop)
58                 return 1;
59         else
60                 return -1;
61 }
62
63 static gint __pkg_disable_chk_func(gconstpointer data1, gconstpointer data2)
64 {
65         pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data1;
66
67         if (node->prop == E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE)
68                 return 0;
69         else
70                 return 1;
71 }
72
73 static void __destroy_each_node(gpointer data, gpointer user_data)
74 {
75         ret_if(data == NULL);
76         pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data;
77         if (node->value) {
78                 free(node->value);
79                 node->value = NULL;
80         }
81         if (node->key) {
82                 free(node->key);
83                 node->key = NULL;
84         }
85         free(node);
86         node = NULL;
87 }
88
89 static void __cleanup_pkginfo(pkgmgr_pkginfo_x *data)
90 {
91         ret_if(data == NULL);
92         if (data->locale) {
93                 free((void *)data->locale);
94                 data->locale = NULL;
95         }
96
97         pkgmgrinfo_basic_free_package(data->pkg_info);
98         free((void *)data);
99         data = NULL;
100         return;
101 }
102
103 long long _pkgmgr_calculate_dir_size(char *dirname)
104 {
105         long long total = 0;
106         long long ret = 0;
107         int q = 0; /*quotient*/
108         int r = 0; /*remainder*/
109         DIR *dp = NULL;
110         struct dirent ep, *result;
111         struct stat fileinfo;
112         char abs_filename[FILENAME_MAX] = { 0, };
113         retvm_if(dirname == NULL, PMINFO_R_ERROR, "dirname is NULL");
114
115         dp = opendir(dirname);
116         if (dp == NULL) {
117                 _LOGE("Couldn't open the directory\n");
118                 return -1;
119         }
120
121         for (ret = readdir_r(dp, &ep, &result);
122                         ret == 0 && result != NULL;
123                         ret = readdir_r(dp, &ep, &result)) {
124                 if (!strcmp(ep.d_name, ".") ||
125                         !strcmp(ep.d_name, "..")) {
126                         continue;
127                 }
128                 snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
129                          ep.d_name);
130                 if (lstat(abs_filename, &fileinfo) < 0)
131                         perror(abs_filename);
132                 else {
133                         if (S_ISDIR(fileinfo.st_mode)) {
134                                 total += fileinfo.st_size;
135                                 if (strcmp(ep.d_name, ".")
136                                     && strcmp(ep.d_name, "..")) {
137                                         ret = _pkgmgr_calculate_dir_size
138                                             (abs_filename);
139                                         total = total + ret;
140                                 }
141                         } else if (S_ISLNK(fileinfo.st_mode)) {
142                                 continue;
143                         } else {
144                                 /*It is a file. Calculate the actual
145                                 size occupied (in terms of 4096 blocks)*/
146                         q = (fileinfo.st_size / BLOCK_SIZE);
147                         r = (fileinfo.st_size % BLOCK_SIZE);
148                         if (r)
149                                 q = q + 1;
150                         total += q * BLOCK_SIZE;
151                         }
152                 }
153         }
154         (void)closedir(dp);
155         return total;
156
157 }
158
159 static int _pkginfo_add_description_info_into_list(const char *locale,
160                 char *record, GList **description)
161 {
162         description_x *info;
163
164         info = calloc(1, sizeof(description_x));
165         if (info == NULL) {
166                 LOGE("out of memory");
167                 return PMINFO_R_ERROR;
168         }
169         info->lang = strdup(locale);
170         info->text = record;
171         *description = g_list_append(*description, info);
172
173         return PMINFO_R_OK;
174 }
175
176 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
177                 GList **privileges)
178 {
179         static const char query_raw[] =
180                 "SELECT DISTINCT privilege, type FROM package_privilege_info "
181                 "WHERE package=%Q";
182         int ret;
183         char *query;
184         sqlite3_stmt *stmt;
185         privilege_x *privilege;
186
187         query = sqlite3_mprintf(query_raw, pkgid);
188         if (query == NULL) {
189                 LOGE("out of memory");
190                 return PMINFO_R_ERROR;
191         }
192
193         ret = sqlite3_prepare_v2(db, query, strlen(query),
194                         &stmt, NULL);
195         sqlite3_free(query);
196         if (ret != SQLITE_OK) {
197                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
198                 return PMINFO_R_ERROR;
199         }
200
201         while (sqlite3_step(stmt) == SQLITE_ROW) {
202                 privilege = calloc(1, sizeof(privilege_x));
203                 _save_column_str(stmt, 0, &privilege->value);
204                 _save_column_str(stmt, 1, &privilege->type);
205                 *privileges = g_list_append(*privileges,
206                                 (gpointer)privilege);
207         }
208
209         sqlite3_finalize(stmt);
210
211         return PMINFO_R_OK;
212 }
213
214 static const char join_localized_info[] =
215         " LEFT OUTER JOIN package_localized_info"
216         "  ON pi.package=package_localized_info.package"
217         "  AND package_localized_info.package_locale=?";
218 static const char join_privilege_info[] =
219         " LEFT OUTER JOIN package_privilege_info"
220         "  ON pi.package=package_privilege_info.package";
221
222 static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
223                 const char *locale, char **query, GList **bind_params)
224 {
225         int joined = 0;
226         char buf[MAX_QUERY_LEN] = { '\0' };
227         char buf2[MAX_QUERY_LEN] = { '\0' };
228         char *condition = NULL;
229         size_t len = 0;
230         GSList *list = NULL;
231
232         if (filter == NULL)
233                 return PMINFO_R_OK;
234
235         len += strlen(" WHERE 1=1 ");
236         strncat(buf, " WHERE 1=1 ", MAX_QUERY_LEN - len - 1);
237         for (list = filter->list; list; list = list->next) {
238                 joined |= __get_filter_condition(list->data, &condition,
239                                 bind_params);
240                 if (condition == NULL)
241                         continue;
242
243                 len += strlen(" AND ");
244                 strncat(buf, " AND ", MAX_QUERY_LEN - len - 1);
245
246                 len += strlen(condition);
247                 strncat(buf, condition, sizeof(buf) - len - 1);
248                 free(condition);
249                 condition = NULL;
250         }
251
252         if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
253                 strncat(buf2, join_localized_info, MAX_QUERY_LEN - len - 1);
254                 len += strlen(join_localized_info);
255                 *bind_params = g_list_append(*bind_params, strdup(locale));
256         }
257         if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO) {
258                 strncat(buf2, join_privilege_info, MAX_QUERY_LEN - len - 1);
259                 len += strlen(join_privilege_info);
260         }
261         strncat(buf2, buf, MAX_QUERY_LEN - len - 1);
262
263         *query = strdup(buf2);
264         if (*query == NULL)
265                 return PMINFO_R_ERROR;
266
267         return PMINFO_R_OK;
268 }
269
270 static void __free_packages(gpointer data)
271 {
272         pkgmgrinfo_basic_free_package((package_x *)data);
273 }
274
275 static bool __check_disable_filter_exist(pkgmgrinfo_filter_x *filter)
276 {
277         GSList *link;
278
279         if (filter == NULL)
280                 return false;
281
282         link = g_slist_find_custom(filter->list, NULL, __pkg_disable_chk_func);
283         if (link)
284                 return true;
285
286         return false;
287 }
288
289 static int __bind_params(sqlite3_stmt *stmt, GList *params)
290 {
291         GList *tmp_list = NULL;
292         int idx = 0;
293         int ret;
294
295         if (stmt == NULL || params == NULL)
296                 return PMINFO_R_EINVAL;
297
298         tmp_list = params;
299         while (tmp_list) {
300                 ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC);
301                 if (ret != SQLITE_OK)
302                         return PMINFO_R_ERROR;
303                 tmp_list = tmp_list->next;
304         }
305
306         return PMINFO_R_OK;
307 }
308
309 static bool __check_package_storage_status(pkgmgrinfo_filter_x *tmp_filter)
310 {
311         GSList *tmp_list = NULL;
312         pkgmgrinfo_node_x *tmp_node = NULL;
313         int property = -1;
314
315         property = _pminfo_pkginfo_convert_to_prop_bool(PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE);
316         for (tmp_list = tmp_filter->list; tmp_list != NULL;
317                         tmp_list = g_slist_next(tmp_list)) {
318                 tmp_node = (pkgmgrinfo_node_x *)tmp_list->data;
319                 if (property == tmp_node->prop) {
320                         if (strcmp(tmp_node->value, "true") == 0)
321                                 return true;
322                         else
323                                 return false;
324                 }
325         }
326         return true;
327 }
328
329 static int _pkginfo_get_packages(uid_t uid, const char *locale,
330                 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
331 {
332         static const char query_raw[] =
333                 "SELECT DISTINCT pi.package, pi.package_version, "
334                 "pi.install_location, pi.package_removable, "
335                 "pi.package_preload, pi.package_readonly, pi.package_update, "
336                 "pi.package_appsetting, pi.package_system, pi.package_type, "
337                 "pi.package_size, pi.installed_time, pi.installed_storage, "
338                 "pi.storeclient_id, pi.mainapp_id, pi.package_url, "
339                 "pi.root_path, pi.csc_path, pi.package_nodisplay, "
340                 "pi.package_api_version, pi.package_support_disable, "
341                 "pi.package_tep_name, pi.package_zip_mount_file, pi.external_path, "
342                 "pi.package_support_mode";
343         static const char query_author[] =
344                 ", pi.author_name, pi.author_email, pi.author_href";
345         static const char query_label[] =
346                 ", COALESCE("
347                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
348                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
349         static const char query_icon[] =
350                 ", COALESCE("
351                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
352                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
353         static const char query_description[] =
354                 ", COALESCE("
355                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
356                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
357         static const char query_from_clause[] = " FROM package_info as pi";
358         int ret = PMINFO_R_ERROR;
359         int idx = 0;
360         int query_len = 0;
361         char *dbpath;
362         char *tmp_record = NULL;
363         char *constraints = NULL;
364         char query[MAX_QUERY_LEN] = { '\0' };
365         package_x *info = NULL;
366         author_x *author = NULL;
367         GList *bind_params = NULL;
368         sqlite3 *db;
369         sqlite3_stmt *stmt;
370         pkgmgrinfo_filter_x *tmp_filter = NULL;
371         bool is_check_storage = true;
372
373         dbpath = getUserPkgParserDBPathUID(uid);
374         if (dbpath == NULL)
375                 return PMINFO_R_ERROR;
376
377         ret = sqlite3_open_v2(dbpath, &db, SQLITE_OPEN_READONLY, NULL);
378         if (ret != SQLITE_OK) {
379                 _LOGD("failed to open db: %d", ret);
380                 free(dbpath);
381                 return PMINFO_R_ERROR;
382         }
383         free(dbpath);
384
385         if (filter != NULL) {
386                 tmp_filter = filter;
387         } else {
388                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
389                 if (ret != PMINFO_R_OK) {
390                         _LOGE("Failed to create filter");
391                         return PMINFO_R_ERROR;
392                 }
393         }
394
395         is_check_storage = __check_package_storage_status(tmp_filter);
396
397         query_len = strlen(query_raw);
398         snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
399         if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
400                 strncat(query, query_author, MAX_QUERY_LEN - query_len - 1);
401                 query_len += strlen(query_author);
402         }
403         if (flag & PMINFO_PKGINFO_GET_LABEL) {
404                 strncat(query, query_label, MAX_QUERY_LEN - query_len - 1);
405                 query_len += strlen(query_label);
406                 bind_params = g_list_append(bind_params, strdup(locale));
407         }
408         if (flag & PMINFO_PKGINFO_GET_ICON) {
409                 strncat(query, query_icon, MAX_QUERY_LEN - query_len - 1);
410                 query_len += strlen(query_icon);
411                 bind_params = g_list_append(bind_params, strdup(locale));
412         }
413         if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
414                 strncat(query, query_description, MAX_QUERY_LEN - query_len - 1);
415                 query_len += strlen(query_description);
416                 bind_params = g_list_append(bind_params, strdup(locale));
417         }
418
419         strncat(query, query_from_clause, MAX_QUERY_LEN - query_len - 1);
420         query_len += strlen(query_from_clause);
421
422         ret = _get_filtered_query(tmp_filter, locale, &constraints, &bind_params);
423         if (ret != PMINFO_R_OK) {
424                 LOGE("Failed to get WHERE clause");
425                 goto catch;
426         }
427
428         if (constraints)
429                 strncat(query, constraints, MAX_QUERY_LEN - query_len - 1);
430
431         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
432         if (ret != SQLITE_OK) {
433                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
434                 ret = PMINFO_R_ERROR;
435                 goto catch;
436         }
437
438         ret = __bind_params(stmt, bind_params);
439         if (ret != SQLITE_OK) {
440                 LOGE("Failed to bind parameters");
441                 goto catch;
442         }
443
444         while (sqlite3_step(stmt) == SQLITE_ROW) {
445                 info = calloc(1, sizeof(package_x));
446                 if (info == NULL) {
447                         LOGE("out of memory");
448                         sqlite3_finalize(stmt);
449                         sqlite3_close_v2(db);
450                         return PMINFO_R_ERROR;
451                 }
452                 idx = 0;
453                 _save_column_str(stmt, idx++, &info->package);
454                 if (g_hash_table_contains(packages,
455                                         (gconstpointer)info->package)) {
456                         free(info->package);
457                         free(info);
458                         continue;
459                 }
460                 _save_column_str(stmt, idx++, &info->version);
461                 _save_column_str(stmt, idx++, &info->installlocation);
462                 _save_column_str(stmt, idx++, &info->removable);
463                 _save_column_str(stmt, idx++, &info->preload);
464                 _save_column_str(stmt, idx++, &info->readonly);
465                 _save_column_str(stmt, idx++, &info->update);
466                 _save_column_str(stmt, idx++, &info->appsetting);
467                 _save_column_str(stmt, idx++, &info->system);
468                 _save_column_str(stmt, idx++, &info->type);
469                 _save_column_str(stmt, idx++, &info->package_size);
470                 _save_column_str(stmt, idx++, &info->installed_time);
471                 _save_column_str(stmt, idx++, &info->installed_storage);
472                 _save_column_str(stmt, idx++, &info->storeclient_id);
473                 _save_column_str(stmt, idx++, &info->mainapp_id);
474                 _save_column_str(stmt, idx++, &info->package_url);
475                 _save_column_str(stmt, idx++, &info->root_path);
476                 _save_column_str(stmt, idx++, &info->csc_path);
477                 _save_column_str(stmt, idx++, &info->nodisplay_setting);
478                 _save_column_str(stmt, idx++, &info->api_version);
479                 _save_column_str(stmt, idx++, &info->support_disable);
480                 _save_column_str(stmt, idx++, &info->tep_name);
481                 _save_column_str(stmt, idx++, &info->zip_mount_file);
482                 _save_column_str(stmt, idx++, &info->external_path);
483                 _save_column_str(stmt, idx++, &info->support_mode);
484                 info->for_all_users =
485                         strdup((uid != GLOBAL_USER) ? "false" : "true");
486
487                 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
488                         /* TODO : author should be retrieved at package_localized_info */
489                         author = calloc(1, sizeof(author_x));
490                         if (author == NULL) {
491                                 pkgmgrinfo_basic_free_package(info);
492                                 sqlite3_finalize(stmt);
493                                 sqlite3_close_v2(db);
494                                 return PMINFO_R_ERROR;
495                         }
496                         _save_column_str(stmt, idx++, &author->text);
497                         _save_column_str(stmt, idx++, &author->email);
498                         _save_column_str(stmt, idx++, &author->href);
499                         info->author = g_list_append(info->author, author);
500                 }
501
502                 if (flag & PMINFO_PKGINFO_GET_LABEL) {
503                         tmp_record = NULL;
504                         _save_column_str(stmt, idx++, &tmp_record);
505
506                         if (_add_label_info_into_list(locale, tmp_record, &info->label)) {
507                                 pkgmgrinfo_basic_free_package(info);
508                                 sqlite3_finalize(stmt);
509                                 sqlite3_close_v2(db);
510                                 return PMINFO_R_ERROR;
511                         }
512                 }
513
514                 if (flag & PMINFO_PKGINFO_GET_ICON) {
515                         tmp_record = NULL;
516                         _save_column_str(stmt, idx++, &tmp_record);
517                         if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) {
518                                 pkgmgrinfo_basic_free_package(info);
519                                 sqlite3_finalize(stmt);
520                                 sqlite3_close_v2(db);
521                                 return PMINFO_R_ERROR;
522                         }
523                 }
524
525                 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
526                         tmp_record = NULL;
527                         _save_column_str(stmt, idx++, &tmp_record);
528                         if (_pkginfo_add_description_info_into_list(locale, tmp_record,
529                                         &info->description)) {
530                                 pkgmgrinfo_basic_free_package(info);
531                                 sqlite3_finalize(stmt);
532                                 sqlite3_close_v2(db);
533                                 return PMINFO_R_ERROR;
534                         }
535                 }
536
537                 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
538                         if (_pkginfo_get_privilege(db, info->package,
539                                                 &info->privileges)) {
540                                 pkgmgrinfo_basic_free_package(info);
541                                 sqlite3_finalize(stmt);
542                                 sqlite3_close_v2(db);
543                                 return PMINFO_R_ERROR;
544                         }
545                 }
546
547                 if (is_check_storage &&
548                                 __pkginfo_check_installed_storage(info) != PMINFO_R_OK) {
549                         ret = PMINFO_R_ERROR;
550                         pkgmgrinfo_basic_free_package(info);
551                         info = NULL;
552                         continue;
553                 }
554
555                 g_hash_table_insert(packages, (gpointer)info->package,
556                                 (gpointer)info);
557         }
558
559         ret = PMINFO_R_OK;
560
561 catch:
562         if (constraints)
563                 free(constraints);
564
565         if (ret != PMINFO_R_OK && info != NULL)
566                 pkgmgrinfo_basic_free_package(info);
567
568         if (filter == NULL)
569                 pkgmgrinfo_pkginfo_filter_destroy(tmp_filter);
570
571         g_list_free_full(bind_params, free);
572         sqlite3_close_v2(db);
573         sqlite3_finalize(stmt);
574
575         return ret;
576 }
577
578 static int _pkginfo_get_filtered_foreach_pkginfo(uid_t uid,
579                 pkgmgrinfo_filter_x *filter, int flag,
580                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data)
581 {
582         int ret;
583         char *locale;
584         package_x *pkg;
585         pkgmgr_pkginfo_x info;
586         pkgmgrinfo_filter_x *tmp_filter = NULL;
587         GHashTable *list;
588         GHashTableIter iter;
589         gpointer value;
590
591         locale = _get_system_locale();
592         if (locale == NULL)
593                 return PMINFO_R_ERROR;
594
595         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
596                         __free_packages);
597         if (list == NULL) {
598                 free(locale);
599                 return PMINFO_R_ERROR;
600         }
601
602         if (filter != NULL) {
603                 tmp_filter = (pkgmgrinfo_filter_x *)filter;
604         } else {
605                 ret = pkgmgrinfo_pkginfo_filter_create((void *)&tmp_filter);
606                 if (ret != PMINFO_R_OK) {
607                         _LOGE("Failed to create filter");
608                         return PMINFO_R_ERROR;
609                 }
610         }
611
612         if (__check_disable_filter_exist(tmp_filter) == false)
613                 pkgmgrinfo_pkginfo_filter_add_bool(tmp_filter,
614                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
615
616         ret = _pkginfo_get_packages(uid, locale, filter, flag, list);
617         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
618                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, 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         if (pkg_list_cb == NULL) {
887                 LOGE("invalid parameter");
888                 return PMINFO_R_EINVAL;
889         }
890
891         return _pkginfo_get_filtered_foreach_pkginfo(uid, NULL, flag,
892                         pkg_list_cb, user_data);
893 }
894
895 API int pkgmgrinfo_pkginfo_get_list_full(pkgmgrinfo_pkg_list_cb pkg_list_cb,
896                 int flag, void *user_data)
897 {
898         return pkgmgrinfo_pkginfo_get_usr_list_full(pkg_list_cb, flag,
899                         user_data, _getuid());
900 }
901
902 API int pkgmgrinfo_pkginfo_get_usr_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
903                 void *user_data, uid_t uid)
904 {
905         if (pkg_list_cb == NULL) {
906                 LOGE("invalid parameter");
907                 return PMINFO_R_EINVAL;
908         }
909
910         return _pkginfo_get_filtered_foreach_pkginfo(uid, NULL,
911                         PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
912 }
913
914 API int pkgmgrinfo_pkginfo_get_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
915                 void *user_data)
916 {
917         return pkgmgrinfo_pkginfo_get_usr_list(pkg_list_cb, user_data,
918                         _getuid());
919 }
920
921 API int pkgmgrinfo_pkginfo_get_usr_disabled_list(
922                 pkgmgrinfo_pkg_list_cb pkg_list_cb, void *user_data, uid_t uid)
923 {
924         int ret;
925         pkgmgrinfo_pkginfo_filter_h filter;
926
927         if (pkg_list_cb == NULL) {
928                 LOGE("invalid parameter");
929                 return PMINFO_R_EINVAL;
930         }
931
932         ret = pkgmgrinfo_pkginfo_filter_create(&filter);
933         if (ret != PMINFO_R_OK)
934                 return ret;
935
936         ret = pkgmgrinfo_pkginfo_filter_add_bool(filter,
937                         PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, true);
938         if (ret != PMINFO_R_OK) {
939                 pkgmgrinfo_pkginfo_filter_destroy(filter);
940                 return PMINFO_R_ERROR;
941         }
942
943         ret = _pkginfo_get_filtered_foreach_pkginfo(uid, filter,
944                         PMINFO_PKGINFO_GET_ALL, pkg_list_cb, user_data);
945
946         pkgmgrinfo_pkginfo_filter_destroy(filter);
947
948         return ret;
949 }
950
951 API int pkgmgrinfo_pkginfo_get_disabled_list(pkgmgrinfo_pkg_list_cb pkg_list_cb,
952                 void *user_data)
953 {
954         return pkgmgrinfo_pkginfo_get_usr_disabled_list(pkg_list_cb, user_data,
955                         _getuid());
956 }
957
958 API int pkgmgrinfo_pkginfo_get_pkgname(pkgmgrinfo_pkginfo_h handle, char **pkg_name)
959 {
960         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
961
962         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
963         retvm_if(pkg_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
964
965         if (info->pkg_info == NULL || info->pkg_info->package == NULL)
966                 return PMINFO_R_ERROR;
967
968         *pkg_name = (char *)info->pkg_info->package;
969
970         return PMINFO_R_OK;
971 }
972
973 API int pkgmgrinfo_pkginfo_get_pkgid(pkgmgrinfo_pkginfo_h handle, char **pkgid)
974 {
975         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
976
977         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
978         retvm_if(pkgid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
979
980         if (info->pkg_info == NULL || info->pkg_info->package == NULL)
981                 return PMINFO_R_ERROR;
982
983         *pkgid = (char *)info->pkg_info->package;
984
985         return PMINFO_R_OK;
986 }
987
988 API int pkgmgrinfo_pkginfo_get_type(pkgmgrinfo_pkginfo_h handle, char **type)
989 {
990         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
991
992         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
993         retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
994
995         if (info->pkg_info == NULL)
996                 return PMINFO_R_ERROR;
997
998         if (info->pkg_info->type == NULL)
999                 *type = "";
1000         else
1001                 *type = (char *)info->pkg_info->type;
1002
1003         return PMINFO_R_OK;
1004 }
1005
1006 API int pkgmgrinfo_pkginfo_get_version(pkgmgrinfo_pkginfo_h handle, char **version)
1007 {
1008         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1009
1010         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1011         retvm_if(version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1012
1013         if (info->pkg_info == NULL)
1014                 return PMINFO_R_ERROR;
1015
1016         if (info->pkg_info->version == NULL)
1017                 *version = "";
1018         else
1019                 *version = (char *)info->pkg_info->version;
1020
1021         return PMINFO_R_OK;
1022 }
1023
1024 API int pkgmgrinfo_pkginfo_get_api_version(pkgmgrinfo_pkginfo_h handle, char **api_version)
1025 {
1026         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1027
1028         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1029         retvm_if(api_version == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1030
1031         if (info->pkg_info == NULL)
1032                 return PMINFO_R_ERROR;
1033
1034         if (info->pkg_info->api_version == NULL)
1035                 *api_version = "";
1036         else
1037                 *api_version = (char *)info->pkg_info->api_version;
1038
1039         return PMINFO_R_OK;
1040 }
1041
1042 API int pkgmgrinfo_pkginfo_get_tep_name(pkgmgrinfo_pkginfo_h handle, char **tep_name)
1043 {
1044         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1045
1046         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1047         retvm_if(tep_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1048
1049         if (info->pkg_info == NULL || info->pkg_info->tep_name == NULL)
1050                 return PMINFO_R_ERROR;
1051
1052         *tep_name = (char *)info->pkg_info->tep_name;
1053
1054         return PMINFO_R_OK;
1055 }
1056
1057 API int pkgmgrinfo_pkginfo_get_zip_mount_file(pkgmgrinfo_pkginfo_h handle, char **zip_mount_file)
1058 {
1059         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1060
1061         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1062         retvm_if(zip_mount_file == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1063
1064         if (info->pkg_info == NULL)
1065                 return PMINFO_R_ERROR;
1066
1067         if (info->pkg_info->zip_mount_file == NULL)
1068                 *zip_mount_file = "";
1069         else
1070                 *zip_mount_file = (char *)info->pkg_info->zip_mount_file;
1071
1072         return PMINFO_R_OK;
1073 }
1074
1075 API int pkgmgrinfo_pkginfo_get_install_location(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_install_location *location)
1076 {
1077         char *val;
1078         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1079
1080         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1081         retvm_if(location == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1082
1083         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1084                 return PMINFO_R_ERROR;
1085
1086         val = (char *)info->pkg_info->installlocation;
1087         if (strcmp(val, "internal-only") == 0)
1088                 *location = PMINFO_INSTALL_LOCATION_INTERNAL_ONLY;
1089         else if (strcmp(val, "prefer-external") == 0)
1090                 *location = PMINFO_INSTALL_LOCATION_PREFER_EXTERNAL;
1091         else
1092                 *location = PMINFO_INSTALL_LOCATION_AUTO;
1093
1094         return PMINFO_R_OK;
1095 }
1096
1097 API int pkgmgrinfo_pkginfo_get_package_size(pkgmgrinfo_pkginfo_h handle, int *size)
1098 {
1099         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1100         char *temp = NULL;
1101
1102         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1103         retvm_if(size == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1104
1105         if (info->pkg_info == NULL)
1106                 return PMINFO_R_ERROR;
1107
1108         if (info->pkg_info->package_size == NULL) {
1109                 temp = strdup("");
1110                 if (temp == NULL) {
1111                         _LOGE("out of memory");
1112                         return PMINFO_R_ERROR;
1113                 } else {
1114                         info->pkg_info->package_size = temp;
1115                 }
1116         }
1117
1118         *size = atoi((char *)info->pkg_info->package_size);
1119
1120         return PMINFO_R_OK;
1121 }
1122
1123 API int pkgmgrinfo_pkginfo_get_icon(pkgmgrinfo_pkginfo_h handle, char **icon)
1124 {
1125         icon_x *ptr;
1126         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1127
1128         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1129         retvm_if(icon == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1130
1131         if (info->pkg_info == NULL || info->pkg_info->icon == NULL)
1132                 return PMINFO_R_ERROR;
1133
1134         ptr = (icon_x *)info->pkg_info->icon->data;
1135         if (ptr == NULL)
1136                 return PMINFO_R_ERROR;
1137
1138         /* TODO : should we return empty string if there was no icon? */
1139         if (ptr->text == NULL)
1140                 *icon = "";
1141         else
1142                 *icon = ptr->text;
1143
1144         return PMINFO_R_OK;
1145 }
1146
1147 API int pkgmgrinfo_pkginfo_get_label(pkgmgrinfo_pkginfo_h handle, char **label)
1148 {
1149         label_x *ptr;
1150         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1151
1152         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1153         retvm_if(label == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL");
1154
1155         if (info->pkg_info == NULL || info->pkg_info->label == NULL)
1156                 return PMINFO_R_ERROR;
1157
1158         ptr = (label_x *)info->pkg_info->label->data;
1159         if (ptr == NULL)
1160                 return PMINFO_R_ERROR;
1161
1162         /* TODO : should we return empty string if there was no label? */
1163         if (ptr->text == NULL)
1164                 *label = "";
1165         else
1166                 *label = ptr->text;
1167
1168         return PMINFO_R_OK;
1169 }
1170
1171 API int pkgmgrinfo_pkginfo_get_description(pkgmgrinfo_pkginfo_h handle, char **description)
1172 {
1173         description_x *ptr;
1174         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1175
1176         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1177         retvm_if(description == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1178
1179         if (info->pkg_info == NULL || info->pkg_info->description == NULL)
1180                 return PMINFO_R_ERROR;
1181
1182         ptr = (description_x *)info->pkg_info->description->data;
1183         if (ptr == NULL)
1184                 return PMINFO_R_ERROR;
1185
1186         if (ptr->text == NULL)
1187                 *description = "";
1188         else
1189                 *description = (char *)ptr->text;
1190
1191         return PMINFO_R_OK;
1192 }
1193
1194 API int pkgmgrinfo_pkginfo_get_author_name(pkgmgrinfo_pkginfo_h handle, char **author_name)
1195 {
1196         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1197         author_x *author;
1198
1199         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1200         retvm_if(author_name == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1201
1202         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1203                 return PMINFO_R_ERROR;
1204
1205         author = (author_x *)info->pkg_info->author->data;
1206         if (author == NULL)
1207                 return PMINFO_R_ERROR;
1208
1209         if (author->text == NULL)
1210                 *author_name = "";
1211         else
1212                 *author_name = (char *)author->text;
1213
1214         return PMINFO_R_OK;
1215 }
1216
1217 API int pkgmgrinfo_pkginfo_get_author_email(pkgmgrinfo_pkginfo_h handle, char **author_email)
1218 {
1219         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1220         author_x *author;
1221
1222         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1223         retvm_if(author_email == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1224
1225         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1226                 return PMINFO_R_ERROR;
1227
1228         author = (author_x *)info->pkg_info->author->data;
1229         if (author == NULL)
1230                 return PMINFO_R_ERROR;
1231
1232         if (author->email == NULL)
1233                 *author_email = "";
1234         else
1235                 *author_email = (char *)author->email;
1236
1237         return PMINFO_R_OK;
1238 }
1239
1240 API int pkgmgrinfo_pkginfo_get_author_href(pkgmgrinfo_pkginfo_h handle, char **author_href)
1241 {
1242         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1243         author_x *author;
1244
1245         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1246         retvm_if(author_href == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1247
1248         if (info->pkg_info == NULL || info->pkg_info->author == NULL)
1249                 return PMINFO_R_ERROR;
1250
1251         author = (author_x *)info->pkg_info->author->data;
1252         if (author == NULL)
1253                 return PMINFO_R_ERROR;
1254
1255         if (author->href == NULL)
1256                 *author_href = "";
1257         else
1258                 *author_href = (char *)author->href;
1259
1260         return PMINFO_R_OK;
1261 }
1262
1263 API int pkgmgrinfo_pkginfo_get_installed_storage(pkgmgrinfo_pkginfo_h handle, pkgmgrinfo_installed_storage *storage)
1264 {
1265         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1266
1267         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1268         retvm_if(storage == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1269
1270         if (info->pkg_info == NULL || info->pkg_info->installed_storage == NULL)
1271                 return PMINFO_R_ERROR;
1272
1273         if (strcmp(info->pkg_info->installed_storage, "installed_internal") == 0)
1274                 *storage = PMINFO_INTERNAL_STORAGE;
1275         else if (strcmp(info->pkg_info->installed_storage, "installed_external") == 0)
1276                 *storage = PMINFO_EXTERNAL_STORAGE;
1277         else
1278                 return PMINFO_R_ERROR;
1279
1280         return PMINFO_R_OK;
1281 }
1282
1283 API int pkgmgrinfo_pkginfo_get_installed_time(pkgmgrinfo_pkginfo_h handle, int *installed_time)
1284 {
1285         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1286
1287         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1288         retvm_if(installed_time == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1289
1290         if (info->pkg_info == NULL || info->pkg_info->installed_time == NULL)
1291                 return PMINFO_R_ERROR;
1292
1293         *installed_time = atoi(info->pkg_info->installed_time);
1294
1295         return PMINFO_R_OK;
1296 }
1297
1298 API int pkgmgrinfo_pkginfo_get_storeclientid(pkgmgrinfo_pkginfo_h handle, char **storeclientid)
1299 {
1300         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1301
1302         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1303         retvm_if(storeclientid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1304
1305         if (info->pkg_info == NULL)
1306                 return PMINFO_R_ERROR;
1307
1308         if (info->pkg_info->storeclient_id == NULL)
1309                 *storeclientid = "";
1310         else
1311                 *storeclientid = (char *)info->pkg_info->storeclient_id;
1312
1313         return PMINFO_R_OK;
1314 }
1315
1316 API int pkgmgrinfo_pkginfo_get_mainappid(pkgmgrinfo_pkginfo_h handle, char **mainappid)
1317 {
1318         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1319
1320         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1321         retvm_if(mainappid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1322
1323         if (info->pkg_info == NULL || info->pkg_info->mainapp_id == NULL)
1324                 return PMINFO_R_ERROR;
1325
1326         *mainappid = (char *)info->pkg_info->mainapp_id;
1327
1328         return PMINFO_R_OK;
1329 }
1330
1331 API int pkgmgrinfo_pkginfo_get_url(pkgmgrinfo_pkginfo_h handle, char **url)
1332 {
1333         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1334
1335         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1336         retvm_if(url == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1337
1338         if (info->pkg_info == NULL)
1339                 return PMINFO_R_ERROR;
1340
1341         if (info->pkg_info->package_url == NULL)
1342                 *url = "";
1343         else
1344                 *url = (char *)info->pkg_info->package_url;
1345
1346         return PMINFO_R_OK;
1347 }
1348
1349 API int pkgmgrinfo_pkginfo_get_root_path(pkgmgrinfo_pkginfo_h handle, char **path)
1350 {
1351         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1352
1353         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1354         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1355
1356         if (info->pkg_info == NULL || info->pkg_info->root_path == NULL)
1357                 return PMINFO_R_ERROR;
1358
1359         *path = (char *)info->pkg_info->root_path;
1360
1361         return PMINFO_R_OK;
1362 }
1363
1364 API int pkgmgrinfo_pkginfo_get_csc_path(pkgmgrinfo_pkginfo_h handle, char **path)
1365 {
1366         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1367
1368         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1369         retvm_if(path == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1370
1371         if (info->pkg_info == NULL)
1372                 return PMINFO_R_ERROR;
1373
1374         if (info->pkg_info->csc_path == NULL)
1375                 *path = "";
1376         else
1377                 *path = (char *)info->pkg_info->csc_path;
1378
1379         return PMINFO_R_OK;
1380 }
1381
1382 API int pkgmgrinfo_pkginfo_get_support_mode(pkgmgrinfo_pkginfo_h handle, int *support_mode)
1383 {
1384         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1385         retvm_if(support_mode == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1386
1387         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1388         if (info->pkg_info->support_mode)
1389                 *support_mode = atoi(info->pkg_info->support_mode);
1390         else
1391                 *support_mode = 0;
1392
1393         return PMINFO_R_OK;
1394 }
1395
1396 API int pkgmgrinfo_pkginfo_is_accessible(pkgmgrinfo_pkginfo_h handle, bool *accessible)
1397 {
1398         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1399         retvm_if(accessible == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1400
1401 #if 0 /* smack issue occured, check later */
1402         char *pkgid = NULL;
1403         pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
1404         if (pkgid == NULL) {
1405                  _LOGD("invalid func parameters\n");
1406                  return PMINFO_R_ERROR;
1407         }
1408          _LOGD("pkgmgr_get_pkg_external_validation() called\n");
1409
1410         FILE *fp = NULL;
1411         char app_mmc_path[FILENAME_MAX] = { 0, };
1412         char app_dir_path[FILENAME_MAX] = { 0, };
1413         char app_mmc_internal_path[FILENAME_MAX] = { 0, };
1414         snprintf(app_dir_path, FILENAME_MAX, "%s%s", PKG_INSTALLATION_PATH, pkgid);
1415         snprintf(app_mmc_path, FILENAME_MAX, "%s%s", PKG_SD_PATH, pkgid);
1416         snprintf(app_mmc_internal_path, FILENAME_MAX, "%s%s/.mmc", PKG_INSTALLATION_PATH, pkgid);
1417
1418         /*check whether application is in external memory or not */
1419         fp = fopen(app_mmc_path, "r");
1420         if (fp == NULL) {
1421                 _LOGD(" app path in external memory not accesible\n");
1422         } else {
1423                 fclose(fp);
1424                 fp = NULL;
1425                 *accessible = 1;
1426                 _LOGD("pkgmgr_get_pkg_external_validation() : SD_CARD \n");
1427                 return PMINFO_R_OK;
1428         }
1429
1430         /*check whether application is in internal or not */
1431         if (fp == NULL) {
1432                 _LOGD(" app path in internal memory not accesible\n");
1433                 *accessible = 0;
1434                 return PMINFO_R_ERROR;
1435         } else {
1436                 fclose(fp);
1437                 /*check whether the application is installed in SD card
1438                 but SD card is not present*/
1439                 fp = fopen(app_mmc_internal_path, "r");
1440                 if (fp == NULL) {
1441                         *accessible = 1;
1442                         _LOGD("pkgmgr_get_pkg_external_validation() : INTERNAL_MEM \n");
1443                         return PMINFO_R_OK;
1444                 } else {
1445                         *accessible = 0;
1446                         _LOGD("pkgmgr_get_pkg_external_validation() : ERROR_MMC_STATUS \n");
1447                 }
1448                 fclose(fp);
1449         }
1450
1451         _LOGD("pkgmgr_get_pkg_external_validation() end\n");
1452 #endif
1453
1454         *accessible = 1;
1455         return PMINFO_R_OK;
1456 }
1457
1458 API int pkgmgrinfo_pkginfo_is_removable(pkgmgrinfo_pkginfo_h handle, bool *removable)
1459 {
1460         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1461
1462         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1463         retvm_if(removable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1464
1465         if (info->pkg_info == NULL || info->pkg_info->removable == NULL)
1466                 return PMINFO_R_ERROR;
1467
1468         *removable = _get_bool_value(info->pkg_info->removable);
1469
1470         return PMINFO_R_OK;
1471 }
1472
1473 API int pkgmgrinfo_pkginfo_is_movable(pkgmgrinfo_pkginfo_h handle, bool *movable)
1474 {
1475         char *val;
1476         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1477
1478         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1479         retvm_if(movable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1480
1481         if (info->pkg_info == NULL || info->pkg_info->installlocation == NULL)
1482                 return PMINFO_R_ERROR;
1483
1484         val = (char *)info->pkg_info->installlocation;
1485         if (strcmp(val, "internal-only") == 0)
1486                 *movable = 0;
1487         else if (strcmp(val, "prefer-external") == 0)
1488                 *movable = 1;
1489         else
1490                 *movable = 1;
1491
1492         return PMINFO_R_OK;
1493 }
1494
1495 API int pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo_h handle, bool *preload)
1496 {
1497         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1498
1499         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1500         retvm_if(preload == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1501
1502         if (info->pkg_info == NULL || info->pkg_info->preload == NULL)
1503                 return PMINFO_R_ERROR;
1504
1505         *preload = _get_bool_value(info->pkg_info->preload);
1506
1507         return PMINFO_R_OK;
1508 }
1509
1510 API int pkgmgrinfo_pkginfo_is_system(pkgmgrinfo_pkginfo_h handle, bool *system)
1511 {
1512         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1513
1514         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1515         retvm_if(system == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1516
1517         if (info->pkg_info == NULL || info->pkg_info->system == NULL)
1518                 return PMINFO_R_ERROR;
1519
1520         *system = _get_bool_value(info->pkg_info->system);
1521
1522         return PMINFO_R_OK;
1523 }
1524
1525 API int pkgmgrinfo_pkginfo_is_readonly(pkgmgrinfo_pkginfo_h handle, bool *readonly)
1526 {
1527         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1528
1529         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1530         retvm_if(readonly == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1531
1532         if (info->pkg_info == NULL || info->pkg_info->readonly == NULL)
1533                 return PMINFO_R_ERROR;
1534
1535         *readonly = _get_bool_value(info->pkg_info->readonly);
1536
1537         return PMINFO_R_OK;
1538 }
1539
1540 API int pkgmgrinfo_pkginfo_is_update(pkgmgrinfo_pkginfo_h handle, bool *update)
1541 {
1542         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1543
1544         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1545         retvm_if(update == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1546
1547         if (info->pkg_info == NULL || info->pkg_info->update == NULL)
1548                 return PMINFO_R_ERROR;
1549
1550         *update = _get_bool_value(info->pkg_info->update);
1551
1552         return PMINFO_R_OK;
1553 }
1554
1555 API int pkgmgrinfo_pkginfo_is_support_disable(pkgmgrinfo_pkginfo_h handle, bool *support_disable)
1556 {
1557         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1558
1559         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1560         retvm_if(support_disable == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1561
1562         if (info->pkg_info == NULL || info->pkg_info->support_disable == NULL)
1563                 return PMINFO_R_ERROR;
1564
1565         *support_disable = _get_bool_value(info->pkg_info->support_disable);
1566
1567         return PMINFO_R_OK;
1568 }
1569
1570 API int pkgmgrinfo_pkginfo_is_global(pkgmgrinfo_pkginfo_h handle, bool *global)
1571 {
1572         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1573
1574         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1575         retvm_if(global == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
1576
1577         if (info->pkg_info == NULL || info->pkg_info->for_all_users == NULL)
1578                 return PMINFO_R_ERROR;
1579
1580         *global = _get_bool_value(info->pkg_info->for_all_users);
1581
1582         return PMINFO_R_OK;
1583 }
1584
1585 API int pkgmgrinfo_pkginfo_is_for_all_users(pkgmgrinfo_pkginfo_h handle, bool *for_all_users)
1586 {
1587         return pkgmgrinfo_pkginfo_is_global(handle, for_all_users);
1588 }
1589
1590 API int pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo_h handle)
1591 {
1592         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1593
1594         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL\n");
1595
1596         __cleanup_pkginfo(info);
1597
1598         return PMINFO_R_OK;
1599 }
1600
1601 API int pkgmgrinfo_pkginfo_filter_create(pkgmgrinfo_pkginfo_filter_h *handle)
1602 {
1603         pkgmgrinfo_filter_x *filter;
1604
1605         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle output parameter is NULL\n");
1606
1607         filter = (pkgmgrinfo_filter_x *)calloc(1, sizeof(pkgmgrinfo_filter_x));
1608         if (filter == NULL) {
1609                 _LOGE("Out of Memory!!!");
1610                 return PMINFO_R_ERROR;
1611         }
1612
1613         *handle = filter;
1614
1615         return PMINFO_R_OK;
1616 }
1617
1618 API int pkgmgrinfo_pkginfo_filter_destroy(pkgmgrinfo_pkginfo_filter_h handle)
1619 {
1620         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1621
1622         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1623
1624         if (filter->list) {
1625                 g_slist_foreach(filter->list, __destroy_each_node, NULL);
1626                 g_slist_free(filter->list);
1627         }
1628
1629         free(filter);
1630
1631         return PMINFO_R_OK;
1632 }
1633
1634 API int pkgmgrinfo_pkginfo_filter_add_int(pkgmgrinfo_pkginfo_filter_h handle,
1635                                 const char *property, const int value)
1636 {
1637         char buf[PKG_VALUE_STRING_LEN_MAX] = {'\0'};
1638         char *val;
1639         GSList *link;
1640         int prop;
1641         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1642         pkgmgrinfo_node_x *node;
1643
1644         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1645         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1646
1647         prop = _pminfo_pkginfo_convert_to_prop_int(property);
1648         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT ||
1649                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT) {
1650                 _LOGE("Invalid Integer Property\n");
1651                 return PMINFO_R_EINVAL;
1652         }
1653         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1654         if (node == NULL) {
1655                 _LOGE("Out of Memory!!!\n");
1656                 return PMINFO_R_ERROR;
1657         }
1658         snprintf(buf, PKG_VALUE_STRING_LEN_MAX - 1, "%d", value);
1659         val = strndup(buf, PKG_VALUE_STRING_LEN_MAX - 1);
1660         if (val == NULL) {
1661                 _LOGE("Out of Memory\n");
1662                 free(node);
1663                 return PMINFO_R_ERROR;
1664         }
1665         node->prop = prop;
1666         node->value = val;
1667         /*If API is called multiple times for same property, we should override the previous values.
1668         Last value set will be used for filtering.*/
1669         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1670         if (link)
1671                 filter->list = g_slist_delete_link(filter->list, link);
1672         filter->list = g_slist_append(filter->list, (gpointer)node);
1673         return PMINFO_R_OK;
1674
1675 }
1676
1677 API int pkgmgrinfo_pkginfo_filter_add_bool(pkgmgrinfo_pkginfo_filter_h handle,
1678                                 const char *property, const bool value)
1679 {
1680         char *val;
1681         GSList *link;
1682         int prop;
1683         pkgmgrinfo_filter_x *filter = (pkgmgrinfo_filter_x *)handle;
1684         pkgmgrinfo_node_x *node;
1685
1686         retvm_if(handle == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1687         retvm_if(property == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1688
1689         prop = _pminfo_pkginfo_convert_to_prop_bool(property);
1690         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL ||
1691                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL) {
1692                 _LOGE("Invalid Boolean Property\n");
1693                 return PMINFO_R_EINVAL;
1694         }
1695         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1696         if (node == NULL) {
1697                 _LOGE("Out of Memory!!!\n");
1698                 return PMINFO_R_ERROR;
1699         }
1700         if (value)
1701                 val = strndup("true", 4);
1702         else
1703                 val = strndup("false", 5);
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_string(pkgmgrinfo_pkginfo_filter_h handle,
1722                                 const char *property, const char *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         retvm_if(value == NULL, PMINFO_R_EINVAL, "Filter handle input parameter is NULL\n");
1733
1734         prop = _pminfo_pkginfo_convert_to_prop_str(property);
1735         if (prop < E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR ||
1736                 prop > E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR) {
1737                 _LOGE("Invalid String Property\n");
1738                 return PMINFO_R_EINVAL;
1739         }
1740         node = (pkgmgrinfo_node_x *)calloc(1, sizeof(pkgmgrinfo_node_x));
1741         if (node == NULL) {
1742                 _LOGE("Out of Memory!!!\n");
1743                 return PMINFO_R_ERROR;
1744         }
1745         if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_AUTO) == 0)
1746                 val = strndup("auto", PKG_STRING_LEN_MAX - 1);
1747         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_INTERNAL) == 0)
1748                 val = strndup("internal-only", PKG_STRING_LEN_MAX - 1);
1749         else if (strcmp(value, PMINFO_PKGINFO_INSTALL_LOCATION_EXTERNAL) == 0)
1750                 val = strndup("prefer-external", PKG_STRING_LEN_MAX - 1);
1751         else if (strcmp(value, "installed_internal") == 0)
1752                 val = strndup("installed_internal", PKG_STRING_LEN_MAX - 1);
1753         else if (strcmp(value, "installed_external") == 0)
1754                 val = strndup("installed_external", PKG_STRING_LEN_MAX - 1);
1755         else
1756                 val = strndup(value, PKG_STRING_LEN_MAX - 1);
1757         if (val == NULL) {
1758                 _LOGE("Out of Memory\n");
1759                 free(node);
1760                 return PMINFO_R_ERROR;
1761         }
1762         node->prop = prop;
1763         node->value = val;
1764         /*If API is called multiple times for same property, we should override the previous values.
1765         Last value set will be used for filtering.*/
1766         link = g_slist_find_custom(filter->list, (gconstpointer)node, __compare_func);
1767         if (link)
1768                 filter->list = g_slist_delete_link(filter->list, link);
1769         filter->list = g_slist_append(filter->list, (gpointer)node);
1770         return PMINFO_R_OK;
1771
1772 }
1773
1774 API int pkgmgrinfo_pkginfo_usr_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count, uid_t uid)
1775 {
1776         int ret;
1777         char *locale;
1778         GHashTable *list = NULL;
1779
1780         if (handle == NULL || count == NULL) {
1781                 _LOGE("invalid parameter");
1782                 return PMINFO_R_EINVAL;
1783         }
1784
1785         locale = _get_system_locale();
1786         if (locale == NULL)
1787                 return PMINFO_R_ERROR;
1788
1789         list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
1790                         __free_packages);
1791         if (list == NULL) {
1792                 free(locale);
1793                 return PMINFO_R_ERROR;
1794         }
1795
1796         if (__check_disable_filter_exist((pkgmgrinfo_filter_x *)handle) == false) {
1797                 ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
1798                                 PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, false);
1799                 if (ret != PMINFO_R_OK) {
1800                         free(locale);
1801                         return PMINFO_R_ERROR;
1802                 }
1803         }
1804
1805         ret = _pkginfo_get_packages(uid, locale,
1806                         (pkgmgrinfo_filter_x *)handle, 0, list);
1807         if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
1808                 ret = _pkginfo_get_packages(GLOBAL_USER, locale, handle, 0,
1809                                 list);
1810
1811         if (ret != PMINFO_R_OK) {
1812                 g_hash_table_destroy(list);
1813                 free(locale);
1814                 return PMINFO_R_ERROR;
1815         }
1816
1817         *count = g_hash_table_size(list);
1818
1819         g_hash_table_destroy(list);
1820         free(locale);
1821
1822         return PMINFO_R_OK;
1823 }
1824
1825 API int pkgmgrinfo_pkginfo_filter_count(pkgmgrinfo_pkginfo_filter_h handle, int *count)
1826 {
1827         return pkgmgrinfo_pkginfo_usr_filter_count(handle, count, _getuid());
1828 }
1829
1830 API int pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(
1831                 pkgmgrinfo_pkginfo_filter_h handle,
1832                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data, uid_t uid)
1833 {
1834         if (handle == NULL || pkg_cb == NULL) {
1835                 LOGE("invalid parameter");
1836                 return PMINFO_R_EINVAL;
1837         }
1838
1839         return _pkginfo_get_filtered_foreach_pkginfo(uid, handle,
1840                         PMINFO_PKGINFO_GET_ALL, pkg_cb, user_data);
1841 }
1842
1843 API int pkgmgrinfo_pkginfo_filter_foreach_pkginfo(pkgmgrinfo_pkginfo_filter_h handle,
1844                                 pkgmgrinfo_pkg_list_cb pkg_cb, void *user_data)
1845 {
1846         return pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, pkg_cb, user_data, _getuid());
1847 }
1848
1849 API int pkgmgrinfo_pkginfo_foreach_privilege(pkgmgrinfo_pkginfo_h handle,
1850                         pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
1851 {
1852         retvm_if(handle == NULL, PMINFO_R_EINVAL, "pkginfo handle is NULL");
1853         retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
1854         int ret;
1855         privilege_x *privilege;
1856         GList *tmp;
1857         pkgmgr_pkginfo_x *info = (pkgmgr_pkginfo_x *)handle;
1858
1859         if (info->pkg_info == NULL)
1860                 return PMINFO_R_ERROR;
1861
1862         for (tmp = info->pkg_info->privileges; tmp; tmp = tmp->next) {
1863                 privilege = (privilege_x *)tmp->data;
1864                 if (privilege == NULL)
1865                         continue;
1866                 ret = privilege_func(privilege->value, user_data);
1867                 if (ret < 0)
1868                         break;
1869         }
1870         return PMINFO_R_OK;
1871 }
1872
1873 int __compare_package_version(const char *version, int *major,
1874                 int *minor, int *macro, int *nano)
1875 {
1876         char *version_temp = NULL;
1877         char *major_str = NULL;
1878         char *minor_str = NULL;
1879         char *macro_str = NULL;
1880         char *nano_str = NULL;
1881         char *save_str = NULL;
1882
1883         if (version == NULL || major == NULL || minor == NULL ||
1884                 macro == NULL || nano == NULL) {
1885                 return PMINFO_R_EINVAL;
1886         }
1887
1888         version_temp = strdup(version);
1889         if (version_temp == NULL) {
1890                 LOGE("Out of memory");
1891                 return PMINFO_R_ERROR;
1892         }
1893
1894         major_str = strtok_r(version_temp, ".", &save_str);
1895         if (major_str == NULL) {
1896                 _LOGE("major version is NULL");
1897                 free(version_temp);
1898                 return PMINFO_R_ERROR;
1899         }
1900
1901         minor_str = strtok_r(NULL, ".", &save_str);
1902         if (minor_str == NULL) {
1903                 _LOGE("minor version is NULL");
1904                 free(version_temp);
1905                 return PMINFO_R_ERROR;
1906         }
1907
1908         *major = atoi(major_str);
1909         *minor = atoi(minor_str);
1910         *macro = 0;
1911         *minor = 0;
1912         macro_str = strtok_r(NULL, ".", &save_str);
1913         if (macro_str == NULL) {
1914                 _LOGD("macro version is NULL");
1915         } else {
1916                 *macro = atoi(macro_str);
1917                 nano_str = strtok_r(NULL, ".", &save_str);
1918                 if (nano_str) {
1919                         *nano = atoi(nano_str);
1920                         _LOGD("nano version exists");
1921                 }
1922         }
1923         _LOGD("version = [%s] -> major = [%d], minor = [%d]," \
1924                 " macro = [%d], nano = [%d]", version, *major,
1925                 *minor, *macro, *nano);
1926
1927         free(version_temp);
1928
1929         return PMINFO_R_OK;
1930 }
1931
1932 API int pkgmgrinfo_compare_package_version(const char *current_version,
1933                 const char *target_version,
1934                 pkgmgrinfo_version_compare_type *res)
1935 {
1936         int ret = 0;
1937         int current_version_major = 0;
1938         int current_version_minor = 0;
1939         int current_version_macro = 0;
1940         int current_version_nano = 0;
1941         int target_version_major = 0;
1942         int target_version_minor = 0;
1943         int target_version_macro = 0;
1944         int target_version_nano = 0;
1945
1946         if (current_version == NULL || target_version == NULL ||
1947                 res == NULL) {
1948                 _LOGE("Invalid parameter");
1949                 return PMINFO_R_EINVAL;
1950         }
1951
1952         ret = __compare_package_version(target_version,
1953                 &target_version_major, &target_version_minor,
1954                 &target_version_macro, &target_version_nano);
1955         if (ret < 0) {
1956                 _LOGE("Failed to compare target version(%d)", ret);
1957                 return PMINFO_R_ERROR;
1958         }
1959
1960         ret = __compare_package_version(current_version,
1961                 &current_version_major, &current_version_minor,
1962                 &current_version_macro, &current_version_nano);
1963         if (ret < 0) {
1964                 _LOGE("Failed to compare current version(%d)", ret);
1965                 return PMINFO_R_ERROR;
1966         }
1967
1968         _LOGD("new[%d.%d.%d.%d] old[%d.%d.%d.%d]", target_version_major,
1969                 target_version_minor, target_version_macro,
1970                 target_version_nano, current_version_major,
1971                 current_version_minor, current_version_macro,
1972                 target_version_nano);
1973
1974         if (target_version_major > current_version_major)
1975                 *res = PMINFO_VERSION_NEW;
1976         else if (target_version_major < current_version_major)
1977                 *res = PMINFO_VERSION_OLD;
1978         else if (target_version_minor > current_version_minor)
1979                 *res = PMINFO_VERSION_NEW;
1980         else if (target_version_minor < current_version_minor)
1981                 *res = PMINFO_VERSION_OLD;
1982         else if (target_version_macro > current_version_macro)
1983                 *res = PMINFO_VERSION_NEW;
1984         else if (target_version_macro < current_version_macro)
1985                 *res = PMINFO_VERSION_OLD;
1986         else if (target_version_nano > current_version_nano)
1987                 *res = PMINFO_VERSION_NEW;
1988         else if (target_version_nano < current_version_nano)
1989                 *res = PMINFO_VERSION_OLD;
1990         else
1991                 *res = PMINFO_VERSION_SAME;
1992
1993         return PMINFO_R_OK;
1994 }