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