Fix memory leak
[platform/core/appfw/pkgmgr-info.git] / src / pkginfo_internal.c
1 // copyright
2
3 #define _GNU_SOURCE
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <stdbool.h>
8 #include <unistd.h>
9 #include <ctype.h>
10 #include <sys/smack.h>
11 #include <linux/limits.h>
12 #include <libgen.h>
13 #include <sys/stat.h>
14
15 #include <sqlite3.h>
16 #include <glib.h>
17
18 #include <system_info.h>
19
20 #include "pkgmgr_parser.h"
21 #include "pkgmgrinfo_basic.h"
22 #include "pkgmgrinfo_private.h"
23 #include "pkgmgrinfo_debug.h"
24 #include "pkgmgr-info.h"
25
26 #define __BEGIN_TRANSACTION(db)                                                \
27 do {                                                                           \
28         if (sqlite3_exec(db, "BEGIN DEFERRED", NULL, NULL, NULL) !=            \
29                         SQLITE_OK) {                                           \
30                 _LOGE("begin transaction failed: %s", sqlite3_errmsg(db));     \
31                 return -1;                                                     \
32         }                                                                      \
33 } while (0)                                                                    \
34
35 #define __DO_TRANSACTION(db, func)                                             \
36 do {                                                                           \
37         if (func) {                                                            \
38                 _LOGE("transaction failed: %s, rollback", sqlite3_errmsg(db)); \
39                 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) !=          \
40                                 SQLITE_OK)                                     \
41                         _LOGE("roll back transaction failed: %s",              \
42                                         sqlite3_errmsg(db));                   \
43                 return -1;                                                     \
44         }                                                                      \
45 } while (0)                                                                    \
46
47 #define __END_TRANSACTION(db)                                                  \
48 do {                                                                           \
49         if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) !=                    \
50                         SQLITE_OK) {                                           \
51                 _LOGE("commit failed: %s, rollback", sqlite3_errmsg(db));      \
52                 if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL) !=          \
53                                 SQLITE_OK)                                     \
54                         _LOGE("roll back transaction failed: %s",              \
55                                         sqlite3_errmsg(db));                   \
56                 return -1;                                                     \
57         }                                                                      \
58 } while (0)                                                                    \
59
60 #define __BIND_TEXT(db, stmt, i, text)                                         \
61 do {                                                                           \
62         if (sqlite3_bind_text(stmt, i, text, -1, SQLITE_STATIC) != SQLITE_OK) {\
63                 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db));      \
64                 sqlite3_finalize(stmt);                                        \
65                 return -1;                                                     \
66         }                                                                      \
67 } while (0)
68
69 #define __BIND_INT(db, stmt, i, int)                                           \
70 do {                                                                           \
71         if (sqlite3_bind_int(stmt, i, int) != SQLITE_OK) {                     \
72                 _LOGE("bind error(index %d): %s", i, sqlite3_errmsg(db));      \
73                 sqlite3_finalize(stmt);                                        \
74                 return -1;                                                     \
75         }                                                                      \
76 } while (0)
77
78 #define LDPI "ldpi"
79 #define MDPI "mdpi"
80 #define HDPI "hdpi"
81 #define XHDPI "xhdpi"
82 #define XXHDPI "xxhdpi"
83
84 #define LDPI_MIN 0
85 #define LDPI_MAX 240
86 #define MDPI_MIN 241
87 #define MDPI_MAX 300
88 #define HDPI_MIN 301
89 #define HDPI_MAX 380
90 #define XHDPI_MIN 381
91 #define XHDPI_MAX 480
92 #define XXHDPI_MIN 481
93 #define XXHDPI_MAX 600
94
95 static const char join_localized_info[] =
96         " LEFT OUTER JOIN package_localized_info"
97         "  ON pi.package=package_localized_info.package"
98         "  AND package_localized_info.package_locale=?";
99 static const char join_privilege_info[] =
100         " LEFT OUTER JOIN package_privilege_info"
101         "  ON pi.package=package_privilege_info.package";
102
103 static int _get_filtered_query(pkgmgrinfo_filter_x *filter,
104                 const char *locale, uid_t uid, char **query, GList **bind_params)
105 {
106         int joined = 0;
107         int size;
108         char buf[MAX_QUERY_LEN] = { '\0' };
109         char buf2[MAX_QUERY_LEN] = { '\0' };
110         char *condition = NULL;
111         GSList *list = NULL;
112
113         if (filter == NULL)
114                 return PMINFO_R_OK;
115
116         snprintf(buf, sizeof(buf), "%s", " WHERE 1=1 ");
117         for (list = filter->list; list; list = list->next) {
118                 joined |= __get_filter_condition(list->data, uid, &condition,
119                                 bind_params);
120                 if (condition == NULL)
121                         continue;
122
123                 strncat(buf, " AND ", sizeof(buf) - strlen(buf) - 1);
124
125                 strncat(buf, condition, sizeof(buf) - strlen(buf) - 1);
126                 free(condition);
127                 condition = NULL;
128         }
129
130         if (joined & E_PMINFO_PKGINFO_JOIN_LOCALIZED_INFO) {
131                 strncat(buf2, join_localized_info, sizeof(buf2) - strlen(buf2) - 1);
132                 *bind_params = g_list_append(*bind_params, strdup(locale));
133         }
134         if (joined & E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO)
135                 strncat(buf2, join_privilege_info, sizeof(buf2) - strlen(buf2) - 1);
136
137         size = strlen(buf2) + strlen(buf) + 1;
138         *query = (char *)calloc(1, size);
139         if (*query == NULL)
140                 return PMINFO_R_ERROR;
141         snprintf(*query, size, "%s%s", buf2, buf);
142
143         return PMINFO_R_OK;
144 }
145
146 static int __bind_params(sqlite3_stmt *stmt, GList *params)
147 {
148         GList *tmp_list = NULL;
149         int idx = 0;
150         int ret;
151
152         if (stmt == NULL || params == NULL)
153                 return PMINFO_R_EINVAL;
154
155         tmp_list = params;
156         while (tmp_list) {
157                 ret = sqlite3_bind_text(stmt, ++idx, (char *)tmp_list->data, -1, SQLITE_STATIC);
158                 if (ret != SQLITE_OK)
159                         return PMINFO_R_ERROR;
160                 tmp_list = tmp_list->next;
161         }
162
163         return PMINFO_R_OK;
164 }
165
166 static bool __check_package_storage_status(pkgmgrinfo_filter_x *tmp_filter)
167 {
168         GSList *tmp_list = NULL;
169         pkgmgrinfo_node_x *tmp_node = NULL;
170         int property = -1;
171
172         property = _pminfo_pkginfo_convert_to_prop_bool(PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE);
173         for (tmp_list = tmp_filter->list; tmp_list != NULL;
174                         tmp_list = g_slist_next(tmp_list)) {
175                 tmp_node = (pkgmgrinfo_node_x *)tmp_list->data;
176                 if (property == tmp_node->prop) {
177                         if (strcmp(tmp_node->value, "true") == 0)
178                                 return true;
179                         else
180                                 return false;
181                 }
182         }
183         return true;
184 }
185
186 static int _pkginfo_add_description_info_into_list(const char *locale,
187                 char *record, GList **description)
188 {
189         description_x *info;
190
191         info = calloc(1, sizeof(description_x));
192         if (info == NULL) {
193                 LOGE("out of memory");
194                 return PMINFO_R_ERROR;
195         }
196         info->lang = strdup(locale);
197         info->text = record;
198         *description = g_list_prepend(*description, info);
199
200         return PMINFO_R_OK;
201 }
202
203 static int _pkginfo_get_plugin_execution_info(sqlite3 *db, const char *pkgid,
204                 GList **plugins)
205 {
206         static const char query_raw[] =
207                 "SELECT appid, plugin_type, plugin_name FROM package_plugin_info "
208                 "WHERE pkgid=%Q";
209         int ret;
210         char *query;
211         sqlite3_stmt *stmt;
212         plugin_x *plugin;
213
214         query = sqlite3_mprintf(query_raw, pkgid);
215         if (query == NULL) {
216                 LOGE("out of memory");
217                 return PMINFO_R_ERROR;
218         }
219
220         ret = sqlite3_prepare_v2(db, query, strlen(query),
221                         &stmt, NULL);
222         sqlite3_free(query);
223         if (ret != SQLITE_OK) {
224                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
225                 return PMINFO_R_ERROR;
226         }
227
228         while (sqlite3_step(stmt) == SQLITE_ROW) {
229                 plugin = calloc(1, sizeof(plugin_x));
230                 if (!plugin) {
231                         LOGE("out of memory");
232                         sqlite3_finalize(stmt);
233                         return PMINFO_R_ERROR;
234                 }
235                 plugin->pkgid = strdup(pkgid);
236                 _save_column_str(stmt, 0, &plugin->appid);
237                 _save_column_str(stmt, 1, &plugin->plugin_type);
238                 _save_column_str(stmt, 2, &plugin->plugin_name);
239                 *plugins = g_list_prepend(*plugins,
240                                 (gpointer)plugin);
241         }
242
243         sqlite3_finalize(stmt);
244
245         return PMINFO_R_OK;
246 }
247
248 static int _pkginfo_get_privilege(sqlite3 *db, const char *pkgid,
249                 GList **privileges)
250 {
251         static const char query_raw[] =
252                 "SELECT DISTINCT privilege, type FROM package_privilege_info "
253                 "WHERE package=%Q";
254         int ret;
255         char *query;
256         sqlite3_stmt *stmt;
257         privilege_x *privilege;
258
259         query = sqlite3_mprintf(query_raw, pkgid);
260         if (query == NULL) {
261                 LOGE("out of memory");
262                 return PMINFO_R_ERROR;
263         }
264
265         ret = sqlite3_prepare_v2(db, query, strlen(query),
266                         &stmt, NULL);
267         sqlite3_free(query);
268         if (ret != SQLITE_OK) {
269                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
270                 return PMINFO_R_ERROR;
271         }
272
273         while (sqlite3_step(stmt) == SQLITE_ROW) {
274                 privilege = calloc(1, sizeof(privilege_x));
275                 if (!privilege) {
276                         LOGE("failed to alloc memory");
277                         sqlite3_finalize(stmt);
278                         return PMINFO_R_ERROR;
279                 }
280                 _save_column_str(stmt, 0, &privilege->value);
281                 _save_column_str(stmt, 1, &privilege->type);
282                 *privileges = g_list_prepend(*privileges,
283                                 (gpointer)privilege);
284         }
285
286         sqlite3_finalize(stmt);
287
288         return PMINFO_R_OK;
289 }
290
291 static int _pkginfo_get_appdefined_privilege(sqlite3 *db, const char *pkgid,
292                 GList **privileges)
293 {
294         static const char query_raw[] =
295                 "SELECT DISTINCT privilege, license, type FROM "
296                 "package_appdefined_privilege_info WHERE package=%Q";
297         int ret;
298         char *query;
299         sqlite3_stmt *stmt;
300         appdefined_privilege_x *privilege;
301
302         query = sqlite3_mprintf(query_raw, pkgid);
303         if (query == NULL) {
304                 LOGE("out of memory");
305                 return PMINFO_R_ERROR;
306         }
307
308         ret = sqlite3_prepare_v2(db, query, strlen(query),
309                         &stmt, NULL);
310         sqlite3_free(query);
311         if (ret != SQLITE_OK) {
312                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
313                 return PMINFO_R_ERROR;
314         }
315
316         while (sqlite3_step(stmt) == SQLITE_ROW) {
317                 privilege = calloc(1, sizeof(appdefined_privilege_x));
318                 if (!privilege) {
319                         LOGE("failed to alloc memory");
320                         sqlite3_finalize(stmt);
321                         return PMINFO_R_ERROR;
322                 }
323                 _save_column_str(stmt, 0, &privilege->value);
324                 _save_column_str(stmt, 1, &privilege->license);
325                 _save_column_str(stmt, 2, &privilege->type);
326                 *privileges = g_list_prepend(*privileges,
327                                 (gpointer)privilege);
328         }
329
330         sqlite3_finalize(stmt);
331
332         return PMINFO_R_OK;
333 }
334
335 static int _pkginfo_get_dependency(sqlite3 *db, const char *pkgid,
336                 GList **dependencies)
337 {
338         static const char query_raw[] =
339                 "SELECT DISTINCT depends_on, type, required_version "
340                 "FROM package_dependency_info WHERE package=%Q";
341         int ret;
342         char *query;
343         sqlite3_stmt *stmt;
344         dependency_x *dependency;
345
346         query = sqlite3_mprintf(query_raw, pkgid);
347         if (query == NULL) {
348                 LOGE("out of memory");
349                 return PMINFO_R_ERROR;
350         }
351
352         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
353         sqlite3_free(query);
354         if (ret != SQLITE_OK) {
355                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
356                 return PMINFO_R_ERROR;
357         }
358
359         while (sqlite3_step(stmt) == SQLITE_ROW) {
360                 dependency = calloc(1, sizeof(dependency_x));
361                 if (!dependency) {
362                         LOGE("failed to alloc memory");
363                         sqlite3_finalize(stmt);
364                         return PMINFO_R_ERROR;
365                 }
366                 _save_column_str(stmt, 0, &dependency->depends_on);
367                 _save_column_str(stmt, 1, &dependency->type);
368                 _save_column_str(stmt, 2, &dependency->required_version);
369                 *dependencies = g_list_prepend(*dependencies,
370                                 (gpointer)dependency);
371         }
372
373         sqlite3_finalize(stmt);
374
375         return PMINFO_R_OK;
376 }
377
378 static int _pkginfo_get_packages(sqlite3 *db, uid_t uid, const char *locale,
379                 pkgmgrinfo_filter_x *filter, int flag, GHashTable *packages)
380 {
381         static const char query_raw[] =
382                 "SELECT DISTINCT pi.package, pi.installed_storage, pi.external_path";
383         static const char query_basic[] =
384                 ", pi.package_version, pi.install_location, "
385                 "pi.package_removable, pi.package_preload, pi.package_readonly, "
386                 "pi.package_update, pi.package_appsetting, pi.package_system, "
387                 "pi.package_type, pi.package_size, pi.installed_time, "
388                 "pi.storeclient_id, pi.mainapp_id, pi.package_url, pi.root_path, "
389                 "pi.csc_path, pi.package_nodisplay, pi.package_api_version, "
390                 "pi.package_support_disable, pi.package_tep_name, "
391                 "pi.package_zip_mount_file, pi.package_support_mode";
392         static const char query_author[] =
393                 ", pi.author_name, pi.author_email, pi.author_href";
394         static const char query_label[] =
395                 ", COALESCE("
396                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
397                 "(SELECT package_label FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
398         static const char query_icon[] =
399                 ", COALESCE("
400                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
401                 "(SELECT package_icon FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
402         static const char query_description[] =
403                 ", COALESCE("
404                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale=?), "
405                 "(SELECT package_description FROM package_localized_info WHERE pi.package=package AND package_locale='No Locale'))";
406         static const char query_from_clause[] = " FROM package_info as pi";
407         int ret = PMINFO_R_ERROR;
408         int idx = 0;
409         //char *dbpath;
410         char *tmp_record = NULL;
411         char *constraints = NULL;
412         char query[MAX_QUERY_LEN] = { '\0' };
413         package_x *info = NULL;
414         author_x *author = NULL;
415         GList *bind_params = NULL;
416         //sqlite3 *db;
417         sqlite3_stmt *stmt = NULL;
418         bool is_check_storage = true;
419         const uid_t global_user_uid = GLOBAL_USER;
420 #if 0
421         dbpath = getUserPkgParserDBPathUID(uid);
422         if (dbpath == NULL)
423                 return PMINFO_R_ERROR;
424
425         ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
426         if (ret != SQLITE_OK) {
427                 _LOGD("failed to open db(%s): %d", dbpath, ret);
428                 free(dbpath);
429                 return PMINFO_R_ERROR;
430         }
431         free(dbpath);
432 #endif
433         is_check_storage = __check_package_storage_status(filter);
434
435         snprintf(query, MAX_QUERY_LEN - 1, "%s", query_raw);
436         if (flag & PMINFO_APPINFO_GET_BASICINFO)
437                 strncat(query, query_basic, sizeof(query) - strlen(query) - 1);
438         if (flag & PMINFO_PKGINFO_GET_AUTHOR)
439                 strncat(query, query_author, sizeof(query) - strlen(query) - 1);
440         if (flag & PMINFO_PKGINFO_GET_LABEL) {
441                 strncat(query, query_label, sizeof(query) - strlen(query) - 1);
442                 bind_params = g_list_append(bind_params, strdup(locale));
443         }
444         if (flag & PMINFO_PKGINFO_GET_ICON) {
445                 strncat(query, query_icon, sizeof(query) - strlen(query) - 1);
446                 bind_params = g_list_append(bind_params, strdup(locale));
447         }
448         if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
449                 strncat(query, query_description, sizeof(query) - strlen(query) - 1);
450                 bind_params = g_list_append(bind_params, strdup(locale));
451         }
452
453         strncat(query, query_from_clause, sizeof(query) - strlen(query) - 1);
454
455         ret = _get_filtered_query(filter, locale, uid, &constraints, &bind_params);
456         if (ret != PMINFO_R_OK) {
457                 LOGE("Failed to get WHERE clause");
458                 goto catch;
459         }
460
461         if (constraints)
462                 strncat(query, constraints, sizeof(query) - strlen(query) - 1);
463
464         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
465         if (ret != SQLITE_OK) {
466                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
467                 ret = PMINFO_R_ERROR;
468                 goto catch;
469         }
470
471         ret = __bind_params(stmt, bind_params);
472         if (ret != SQLITE_OK) {
473                 LOGE("Failed to bind parameters");
474                 goto catch;
475         }
476
477         while (sqlite3_step(stmt) == SQLITE_ROW) {
478                 info = calloc(1, sizeof(package_x));
479                 if (info == NULL) {
480                         LOGE("out of memory");
481                         ret = PMINFO_R_ERROR;
482                         goto catch;
483                 }
484                 info->locale = strdup(locale);
485                 if (info->locale == NULL) {
486                         LOGE("Out of memory");
487                         ret = PMINFO_R_ERROR;
488                         goto catch;
489                 }
490
491                 idx = 0;
492                 _save_column_str(stmt, idx++, &info->package);
493                 _save_column_str(stmt, idx++, &info->installed_storage);
494                 _save_column_str(stmt, idx++, &info->external_path);
495
496                 if (flag & PMINFO_APPINFO_GET_BASICINFO) {
497                         _save_column_str(stmt, idx++, &info->version);
498                         _save_column_str(stmt, idx++, &info->installlocation);
499                         _save_column_str(stmt, idx++, &info->removable);
500                         _save_column_str(stmt, idx++, &info->preload);
501                         _save_column_str(stmt, idx++, &info->readonly);
502                         _save_column_str(stmt, idx++, &info->update);
503                         _save_column_str(stmt, idx++, &info->appsetting);
504                         _save_column_str(stmt, idx++, &info->system);
505                         _save_column_str(stmt, idx++, &info->type);
506                         _save_column_str(stmt, idx++, &info->package_size);
507                         _save_column_str(stmt, idx++, &info->installed_time);
508                         _save_column_str(stmt, idx++, &info->storeclient_id);
509                         _save_column_str(stmt, idx++, &info->mainapp_id);
510                         _save_column_str(stmt, idx++, &info->package_url);
511                         _save_column_str(stmt, idx++, &info->root_path);
512                         _save_column_str(stmt, idx++, &info->csc_path);
513                         _save_column_str(stmt, idx++, &info->nodisplay_setting);
514                         _save_column_str(stmt, idx++, &info->api_version);
515                         _save_column_str(stmt, idx++, &info->support_disable);
516                         _save_column_str(stmt, idx++, &info->tep_name);
517                         _save_column_str(stmt, idx++, &info->zip_mount_file);
518                         _save_column_str(stmt, idx++, &info->support_mode);
519                 }
520
521                 info->for_all_users =
522                         strdup((uid != global_user_uid) ? "false" : "true");
523
524                 if (_pkginfo_get_plugin_execution_info(db, info->package, &info->plugin)) {
525                         ret = PMINFO_R_ERROR;
526                         goto catch;
527                 }
528
529                 if (flag & PMINFO_PKGINFO_GET_AUTHOR) {
530                         /* TODO : author should be retrieved at package_localized_info */
531                         author = calloc(1, sizeof(author_x));
532                         if (author == NULL) {
533                                 ret = PMINFO_R_ERROR;
534                                 goto catch;
535                         }
536                         _save_column_str(stmt, idx++, &author->text);
537                         _save_column_str(stmt, idx++, &author->email);
538                         _save_column_str(stmt, idx++, &author->href);
539                         info->author = g_list_prepend(info->author, author);
540                 }
541
542                 if (flag & PMINFO_PKGINFO_GET_LABEL) {
543                         tmp_record = NULL;
544                         _save_column_str(stmt, idx++, &tmp_record);
545
546                         if (_add_label_info_into_list(locale, tmp_record, &info->label)) {
547                                 ret = PMINFO_R_ERROR;
548                                 goto catch;
549                         }
550                 }
551
552                 if (flag & PMINFO_PKGINFO_GET_ICON) {
553                         tmp_record = NULL;
554                         _save_column_str(stmt, idx++, &tmp_record);
555                         if (_add_icon_info_into_list(locale, tmp_record, &info->icon)) {
556                                 ret = PMINFO_R_ERROR;
557                                 goto catch;
558                         }
559                 }
560
561                 if (flag & PMINFO_PKGINFO_GET_DESCRIPTION) {
562                         tmp_record = NULL;
563                         _save_column_str(stmt, idx++, &tmp_record);
564                         if (_pkginfo_add_description_info_into_list(locale, tmp_record,
565                                         &info->description)) {
566                                 ret = PMINFO_R_ERROR;
567                                 goto catch;
568                         }
569                 }
570
571                 if (flag & PMINFO_PKGINFO_GET_PRIVILEGE) {
572                         if (_pkginfo_get_privilege(db, info->package,
573                                                 &info->privileges)) {
574                                 ret = PMINFO_R_ERROR;
575                                 goto catch;
576                         }
577                 }
578
579                 if (flag & PMINFO_PKGINFO_GET_APPDEFINED_PRIVILEGE) {
580                         if (_pkginfo_get_appdefined_privilege(db, info->package,
581                                                 &info->appdefined_privileges)) {
582                                 ret = PMINFO_R_ERROR;
583                                 goto catch;
584                         }
585                 }
586
587                 if (flag & PMINFO_PKGINFO_GET_DEPENDENCY) {
588                         if (_pkginfo_get_dependency(db, info->package,
589                                                 &info->dependencies)) {
590                                 ret = PMINFO_R_ERROR;
591                                 goto catch;
592                         }
593                 }
594
595                 if (is_check_storage &&
596                                 __pkginfo_check_installed_storage(info) != PMINFO_R_OK) {
597                         ret = PMINFO_R_ERROR;
598                         pkgmgrinfo_basic_free_package(info);
599                         info = NULL;
600                         continue;
601                 }
602
603                 g_hash_table_insert(packages, (gpointer)info->package,
604                                 (gpointer)info);
605         }
606
607         ret = PMINFO_R_OK;
608
609 catch:
610         sqlite3_finalize(stmt);
611
612         if (constraints)
613                 free(constraints);
614
615         if (ret != PMINFO_R_OK && info != NULL)
616                 pkgmgrinfo_basic_free_package(info);
617
618         g_list_free_full(bind_params, free);
619
620         return ret;
621 }
622
623 API int pkginfo_internal_filter_get_list(
624                 sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter,
625                 uid_t uid, const char *locale, GHashTable *pkginfo_list) {
626         int ret;
627
628         if (filter == NULL || pkginfo_list == NULL) {
629                 LOGE("Invalid argument");
630                 return PMINFO_R_EINVAL;
631         }
632
633         ret = _pkginfo_get_packages(db, uid, locale, filter,
634                         PMINFO_PKGINFO_GET_ALL, pkginfo_list);
635         return ret;
636 }
637
638 API int get_query_result(sqlite3 *db, const char *query,
639                 GList **list, int *row, int *col) {
640         int ret = 0;
641         int col_cnt = 0;
642         int row_cnt = 0;
643         int idx = 0;
644         sqlite3_stmt *stmt = NULL;
645         char *result = NULL;
646
647         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
648         if (ret != SQLITE_OK) {
649                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
650                 return PMINFO_R_ERROR;
651         }
652
653         col_cnt = sqlite3_column_count(stmt);
654
655         while (sqlite3_step(stmt) == SQLITE_ROW) {
656                 row_cnt++;
657                 for (idx = 0; idx < col_cnt; ++idx) {
658                         _save_column_str(stmt, idx, &result);
659                         *list = g_list_append(*list, result);
660                         result = NULL;
661                 }
662         }
663
664         *row = row_cnt;
665         *col = col_cnt;
666
667         sqlite3_finalize(stmt);
668
669         return PMINFO_R_OK;
670 }
671
672 static int _get_depends_on(sqlite3 *db, const char *pkgid, GQueue **queue,
673                 GHashTable **table, GList **pkg_list)
674 {
675         static const char query[] =
676                 "SELECT package, depends_on, type, required_version "
677                 "FROM package_dependency_info WHERE depends_on=?";
678         int ret;
679         sqlite3_stmt *stmt;
680         dependency_x *req;
681
682         /* already checked */
683         if (!g_hash_table_insert(*table, strdup(pkgid), GINT_TO_POINTER(1)))
684                 return PMINFO_R_OK;
685
686         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
687         if (ret != SQLITE_OK) {
688                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
689                 return PMINFO_R_ERROR;
690         }
691
692         ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_STATIC);
693         if (ret != SQLITE_OK) {
694                 LOGE("bind failed: %s", sqlite3_errmsg(db));
695                 sqlite3_finalize(stmt);
696                 return PMINFO_R_ERROR;
697         }
698
699         while (sqlite3_step(stmt) == SQLITE_ROW) {
700                 req = calloc(1, sizeof(dependency_x));
701                 if (req == NULL) {
702                         LOGE("out of memory");
703                         sqlite3_finalize(stmt);
704                         return PMINFO_R_ERROR;
705                 }
706                 _save_column_str(stmt, 0, &req->pkgid);
707                 _save_column_str(stmt, 1, &req->depends_on);
708                 _save_column_str(stmt, 2, &req->type);
709                 _save_column_str(stmt, 3, &req->required_version);
710
711                 *pkg_list = g_list_prepend(*pkg_list, req);
712                 g_queue_push_tail(*queue, strdup(req->pkgid));
713         }
714
715         sqlite3_finalize(stmt);
716
717         return PMINFO_R_OK;
718 }
719
720 static void __free_depends_on(gpointer data)
721 {
722         struct dependency_x *dep = (struct dependency_x *)data;
723         free(dep->pkgid);
724         free(dep->depends_on);
725         free(dep->type);
726         free(dep->required_version);
727         free(dep);
728 }
729
730 API int pkginfo_internal_filter_get_depends_on(sqlite3 *db, const char *pkgid,
731                 GList **list) {
732         GQueue *queue;
733         GHashTable *table;
734         char *item;
735         int ret;
736
737         queue = g_queue_new();
738         if (queue == NULL) {
739                 LOGE("out of memory");
740                 return PMINFO_R_ERROR;
741         }
742         table = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
743
744         g_queue_push_tail(queue, strdup(pkgid));
745         while (!g_queue_is_empty(queue)) {
746                 item = g_queue_pop_head(queue);
747                 ret = _get_depends_on(db, item, &queue, &table, list);
748                 free(item);
749                 if (ret != PMINFO_R_OK) {
750                         LOGE("failed to get pkgs depends on %s", pkgid);
751                         g_hash_table_destroy(table);
752                         g_list_free_full(*list, __free_depends_on);
753                         g_queue_free_full(queue, free);
754                         return PMINFO_R_ERROR;
755                 }
756         }
757
758         g_hash_table_destroy(table);
759         g_queue_free_full(queue, free);
760         return PMINFO_R_OK;
761 }
762
763 static int __execute_query(sqlite3 *db, const char *query) {
764         int ret = 0;
765         sqlite3_stmt *stmt = NULL;
766
767         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
768         if (ret != SQLITE_OK) {
769                 LOGE("prepare failed: %s", sqlite3_errmsg(db));
770                 return -1;
771         }
772
773         ret = sqlite3_step(stmt);
774         if (ret != SQLITE_DONE) {
775                 LOGE("step failed: %s", sqlite3_errmsg(db));
776                 sqlite3_finalize(stmt);
777                 return -1;
778         }
779
780         sqlite3_finalize(stmt);
781
782         return 0;
783 }
784
785 API int execute_write_queries(sqlite3 *db, const char **queries, int len) {
786         int i;
787
788         __BEGIN_TRANSACTION(db);
789         for (i = 0; i < len; ++i) {
790                 __DO_TRANSACTION(db, __execute_query(db, queries[i]));
791         }
792         __END_TRANSACTION(db);
793
794         // Is db handel freed by AbstractDBHandler?
795         // sqlite3_close_v2(db);
796
797         return 0;
798 }
799
800 /*###############################################################################*/
801
802 static int __check_dpi(const char *dpi_char, int dpi_int)
803 {
804         if (dpi_char == NULL)
805                 return -1;
806
807         if (strcasecmp(dpi_char, LDPI) == 0) {
808                 if (dpi_int >= LDPI_MIN && dpi_int <= LDPI_MAX)
809                         return 0;
810                 else
811                         return -1;
812         } else if (strcasecmp(dpi_char, MDPI) == 0) {
813                 if (dpi_int >= MDPI_MIN && dpi_int <= MDPI_MAX)
814                         return 0;
815                 else
816                         return -1;
817         } else if (strcasecmp(dpi_char, HDPI) == 0) {
818                 if (dpi_int >= HDPI_MIN && dpi_int <= HDPI_MAX)
819                         return 0;
820                 else
821                         return -1;
822         } else if (strcasecmp(dpi_char, XHDPI) == 0) {
823                 if (dpi_int >= XHDPI_MIN && dpi_int <= XHDPI_MAX)
824                         return 0;
825                 else
826                         return -1;
827         } else if (strcasecmp(dpi_char, XXHDPI) == 0) {
828                 if (dpi_int >= XXHDPI_MIN && dpi_int <= XXHDPI_MAX)
829                         return 0;
830                 else
831                         return -1;
832         } else
833                 return -1;
834 }
835
836 static void __find_appcontrol_splashscreen_with_dpi(gpointer data,
837                 gpointer user_data)
838 {
839         splashscreen_x *ss = (splashscreen_x *)data;
840         GList **list = (GList **)user_data;
841         int dpi = -1;
842         int ret;
843
844         if (ss->operation == NULL || ss->dpi == NULL)
845                 return;
846
847         ret = system_info_get_platform_int(
848                         "http://tizen.org/feature/screen.dpi", &dpi);
849         if (ret != SYSTEM_INFO_ERROR_NONE)
850                 return;
851
852         if (__check_dpi(ss->dpi, dpi) != 0)
853                 return;
854
855         *list = g_list_prepend(*list, ss);
856 }
857
858 static void __find_appcontrol_splashscreen(gpointer data, gpointer user_data)
859 {
860         splashscreen_x *ss = (splashscreen_x *)data;
861         GList **list = (GList **)user_data;
862         splashscreen_x *ss_tmp;
863         GList *tmp;
864
865         if (ss->operation == NULL || ss->dpi)
866                 return;
867
868         for (tmp = *list; tmp; tmp = tmp->next) {
869                 ss_tmp = (splashscreen_x *)tmp->data;
870                 if (ss_tmp->operation
871                         && strcmp(ss_tmp->operation, ss->operation) == 0
872                         && strcmp(ss_tmp->orientation, ss->orientation) == 0)
873                         return;
874         }
875
876         *list = g_list_prepend(*list, ss);
877 }
878
879 static gint __compare_splashscreen_with_orientation_dpi(gconstpointer a,
880                 gconstpointer b)
881 {
882         splashscreen_x *ss = (splashscreen_x *)a;
883         const char *orientation = (const char *)b;
884         int dpi = -1;
885         int ret;
886
887         if (ss->operation || ss->dpi == NULL)
888                 return -1;
889
890         ret = system_info_get_platform_int(
891                         "http://tizen.org/feature/screen.dpi", &dpi);
892         if (ret != SYSTEM_INFO_ERROR_NONE)
893                 return -1;
894
895         if (strcasecmp(ss->orientation, orientation) == 0 &&
896                         __check_dpi(ss->dpi, dpi) == 0)
897                 return 0;
898
899         return -1;
900 }
901
902 static gint __compare_splashscreen_with_orientation(gconstpointer a,
903                 gconstpointer b)
904 {
905         splashscreen_x *ss = (splashscreen_x *)a;
906         const char *orientation = (const char *)b;
907
908         if (ss->operation || ss->dpi)
909                 return -1;
910
911         if (strcasecmp(ss->orientation, orientation) == 0)
912                 return 0;
913
914         return -1;
915 }
916
917 static splashscreen_x *__find_default_splashscreen(GList *splashscreens,
918                 const char *orientation)
919 {
920         GList *tmp;
921
922         tmp = g_list_find_custom(splashscreens, orientation,
923                         (GCompareFunc)
924                         __compare_splashscreen_with_orientation_dpi);
925         if (tmp)
926                 return (splashscreen_x *)tmp->data;
927
928         tmp = g_list_find_custom(splashscreens, orientation,
929                         (GCompareFunc)__compare_splashscreen_with_orientation);
930         if (tmp)
931                 return (splashscreen_x *)tmp->data;
932
933         return NULL;
934 }
935
936 static GList *__find_splashscreens(GList *splashscreens)
937 {
938         GList *list = NULL;
939         splashscreen_x *ss;
940
941         if (splashscreens == NULL)
942                 return NULL;
943
944         g_list_foreach(splashscreens,
945                         __find_appcontrol_splashscreen_with_dpi, &list);
946         g_list_foreach(splashscreens,
947                         __find_appcontrol_splashscreen, &list);
948
949         ss = __find_default_splashscreen(splashscreens, "portrait");
950         if (ss)
951                 list = g_list_prepend(list, ss);
952         ss = __find_default_splashscreen(splashscreens, "landscape");
953         if (ss)
954                 list = g_list_prepend(list, ss);
955
956         return list;
957 }
958
959 static int __insert_splashscreen_info(sqlite3 *db, application_x *app,
960                 GList *ss_list)
961 {
962         static const char query[] =
963                 "INSERT INTO package_app_splash_screen (app_id, src, type,"
964                 "  orientation, indicatordisplay, operation, color_depth) "
965                 "VALUES (?, ?, ?, ?, ?, ?, ?)";
966         int ret;
967         sqlite3_stmt *stmt;
968         int idx;
969         GList *tmp;
970         splashscreen_x *ss;
971
972         if (app->splashscreens == NULL)
973                 return 0;
974
975         if (ss_list == NULL)
976                 return 0;
977
978         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
979         if (ret != SQLITE_OK) {
980                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
981                 return -1;
982         }
983
984         for (tmp = ss_list; tmp; tmp = tmp->next) {
985                 ss = (splashscreen_x *)tmp->data;
986                 if (ss == NULL)
987                         continue;
988                 idx = 1;
989                 __BIND_TEXT(db, stmt, idx++, app->appid);
990                 __BIND_TEXT(db, stmt, idx++, ss->src);
991                 __BIND_TEXT(db, stmt, idx++, ss->type);
992                 __BIND_TEXT(db, stmt, idx++, ss->orientation);
993                 __BIND_TEXT(db, stmt, idx++, ss->indicatordisplay);
994                 __BIND_TEXT(db, stmt, idx++, ss->operation);
995                 __BIND_TEXT(db, stmt, idx++, ss->color_depth);
996
997                 ret = sqlite3_step(stmt);
998                 if (ret != SQLITE_DONE) {
999                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1000                         sqlite3_finalize(stmt);
1001                         return -1;
1002                 }
1003
1004                 sqlite3_reset(stmt);
1005         }
1006
1007         sqlite3_finalize(stmt);
1008
1009         return 0;
1010 }
1011
1012 static void __trimfunc(GList *trim_list)
1013 {
1014         char *trim_data;
1015         char *prev = NULL;
1016         GList *list = g_list_first(trim_list);
1017
1018         while (list) {
1019                 trim_data = (char *)list->data;
1020                 if (trim_data) {
1021                         if (prev) {
1022                                 if (strcmp(trim_data, prev) == 0) {
1023                                         trim_list = g_list_remove(trim_list,
1024                                                         trim_data);
1025                                         list = g_list_first(trim_list);
1026                                         prev = NULL;
1027                                         continue;
1028                                 } else
1029                                         prev = trim_data;
1030                         } else {
1031                                 prev = trim_data;
1032                         }
1033                 }
1034                 list = g_list_next(list);
1035         }
1036 }
1037
1038 static int __insert_package_appdefined_privilege_info(sqlite3 *db,
1039                 manifest_x *mfx)
1040 {
1041         static const char query[] =
1042                 "INSERT INTO package_appdefined_privilege_info "
1043                 "(package, privilege, license, type) "
1044                 "VALUES (?, ?, ?, ?)";
1045         int ret;
1046         sqlite3_stmt *stmt;
1047         int idx;
1048         GList *tmp;
1049         appdefined_privilege_x *priv;
1050
1051         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1052         if (ret != SQLITE_OK) {
1053                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1054                 return -1;
1055         }
1056
1057         for (tmp = mfx->appdefined_privileges; tmp; tmp = tmp->next) {
1058                 priv = (appdefined_privilege_x *)tmp->data;
1059                 if (priv == NULL)
1060                         continue;
1061
1062                 idx = 1;
1063                 __BIND_TEXT(db, stmt, idx++, mfx->package);
1064                 __BIND_TEXT(db, stmt, idx++, priv->value);
1065                 __BIND_TEXT(db, stmt, idx++, priv->license);
1066                 __BIND_TEXT(db, stmt, idx++, priv->type);
1067
1068                 ret = sqlite3_step(stmt);
1069                 if (ret != SQLITE_DONE) {
1070                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1071                         sqlite3_finalize(stmt);
1072                         return -1;
1073                 }
1074                 sqlite3_reset(stmt);
1075         }
1076
1077         sqlite3_finalize(stmt);
1078
1079         return 0;
1080 }
1081
1082 static int __insert_package_dependency_info(sqlite3 *db, manifest_x *mfx)
1083 {
1084         static const char query[] =
1085                 "INSERT INTO package_dependency_info"
1086                 "  (package, depends_on, type, required_version) "
1087                 "VALUES (?, ?, ?, ?)";
1088         int ret;
1089         sqlite3_stmt *stmt;
1090         int idx;
1091         GList *tmp;
1092         dependency_x *dep;
1093
1094         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1095         if (ret != SQLITE_OK) {
1096                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1097                 return -1;
1098         }
1099
1100         for (tmp = mfx->dependencies; tmp; tmp = tmp->next) {
1101                 dep = (dependency_x *)tmp->data;
1102                 if (dep == NULL)
1103                         continue;
1104
1105                 idx = 1;
1106                 __BIND_TEXT(db, stmt, idx++, mfx->package);
1107                 __BIND_TEXT(db, stmt, idx++, dep->depends_on);
1108                 __BIND_TEXT(db, stmt, idx++, dep->type);
1109                 __BIND_TEXT(db, stmt, idx++, dep->required_version);
1110
1111                 ret = sqlite3_step(stmt);
1112                 if (ret != SQLITE_DONE) {
1113                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1114                         sqlite3_finalize(stmt);
1115                         return -1;
1116                 }
1117                 sqlite3_reset(stmt);
1118         }
1119
1120         sqlite3_finalize(stmt);
1121
1122         return 0;
1123 }
1124
1125 static int __insert_mainapp_localized_info(sqlite3 *db, application_x *app,
1126                 const char *locale, const char *label, const char *icon)
1127 {
1128         static const char query[] =
1129                 "INSERT OR REPLACE INTO package_localized_info ("
1130                 "  package, package_locale, package_label, package_icon,"
1131                 "  package_description, package_license, package_author) "
1132                 "VALUES (?, ?,"
1133                 "  COALESCE((SELECT package_label FROM package_localized_info"
1134                 "            WHERE package=? AND package_locale=?), ?),"
1135                 "  COALESCE((SELECT package_icon FROM package_localized_info"
1136                 "            WHERE package=? AND package_icon=?), ?),"
1137                 "  (SELECT package_description FROM package_localized_info"
1138                 "   WHERE package=? AND package_locale=?),"
1139                 "  (SELECT package_description FROM package_localized_info"
1140                 "   WHERE package=? AND package_locale=?),"
1141                 "  (SELECT package_description FROM package_localized_info"
1142                 "   WHERE package=? AND package_locale=?))";
1143         int ret;
1144         sqlite3_stmt *stmt;
1145         int idx = 1;
1146
1147         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1148         if (ret != SQLITE_OK) {
1149                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1150                 return -1;
1151         }
1152
1153         __BIND_TEXT(db, stmt, idx++, app->package);
1154         __BIND_TEXT(db, stmt, idx++, locale);
1155         __BIND_TEXT(db, stmt, idx++, app->package);
1156         __BIND_TEXT(db, stmt, idx++, locale);
1157         __BIND_TEXT(db, stmt, idx++, label);
1158         __BIND_TEXT(db, stmt, idx++, app->package);
1159         __BIND_TEXT(db, stmt, idx++, locale);
1160         __BIND_TEXT(db, stmt, idx++, icon);
1161         __BIND_TEXT(db, stmt, idx++, app->package);
1162         __BIND_TEXT(db, stmt, idx++, locale);
1163         __BIND_TEXT(db, stmt, idx++, app->package);
1164         __BIND_TEXT(db, stmt, idx++, locale);
1165         __BIND_TEXT(db, stmt, idx++, app->package);
1166         __BIND_TEXT(db, stmt, idx++, locale);
1167
1168         ret = sqlite3_step(stmt);
1169         if (ret != SQLITE_DONE) {
1170                 _LOGE("step failed: %s", sqlite3_errmsg(db));
1171                 sqlite3_finalize(stmt);
1172                 return -1;
1173         }
1174
1175         sqlite3_finalize(stmt);
1176
1177         return 0;
1178 }
1179
1180 static gint __comparefunc(gconstpointer a, gconstpointer b, gpointer userdata)
1181 {
1182         if (a == NULL || b == NULL)
1183                 return 0;
1184         if (strcmp((char *)a, (char *)b) == 0)
1185                 return 0;
1186         if (strcmp((char *)a, (char *)b) < 0)
1187                 return -1;
1188         if (strcmp((char *)a, (char *)b) > 0)
1189                 return 1;
1190         return 0;
1191 }
1192
1193 static GList *__create_locale_list(GList *lbls, GList *lcns, GList *icns,
1194                 GList *dcns, GList *aths)
1195 {
1196         GList *locale = NULL;
1197         GList *tmp;
1198         label_x *lbl;
1199         license_x *lcn;
1200         icon_x *icn;
1201         description_x *dcn;
1202         author_x *ath;
1203
1204         for (tmp = lbls; tmp; tmp = tmp->next) {
1205                 lbl = (label_x *)tmp->data;
1206                 if (lbl == NULL)
1207                         continue;
1208                 if (lbl->lang)
1209                         locale = g_list_insert_sorted_with_data(
1210                                         locale, (gpointer)lbl->lang,
1211                                         __comparefunc, NULL);
1212         }
1213         for (tmp = lcns; tmp; tmp = tmp->next) {
1214                 lcn = (license_x *)tmp->data;
1215                 if (lcn == NULL)
1216                         continue;
1217                 if (lcn->lang)
1218                         locale = g_list_insert_sorted_with_data(
1219                                         locale, (gpointer)lcn->lang,
1220                                         __comparefunc, NULL);
1221         }
1222         for (tmp = icns; tmp; tmp = tmp->next) {
1223                 icn = (icon_x *)tmp->data;
1224                 if (icn == NULL)
1225                         continue;
1226                 if (icn->lang)
1227                         locale = g_list_insert_sorted_with_data(
1228                                         locale, (gpointer)icn->lang,
1229                                         __comparefunc, NULL);
1230         }
1231         for (tmp = dcns; tmp; tmp = tmp->next) {
1232                 dcn = (description_x *)tmp->data;
1233                 if (dcn == NULL)
1234                         continue;
1235                 if (dcn->lang)
1236                         locale = g_list_insert_sorted_with_data(
1237                                         locale, (gpointer)dcn->lang,
1238                                         __comparefunc, NULL);
1239         }
1240         for (tmp = aths; tmp; tmp = tmp->next) {
1241                 ath = (author_x *)tmp->data;
1242                 if (ath == NULL)
1243                         continue;
1244                 if (ath->lang)
1245                         locale = g_list_insert_sorted_with_data(
1246                                         locale, (gpointer)ath->lang,
1247                                         __comparefunc, NULL);
1248         }
1249         __trimfunc(locale);
1250         return locale;
1251 }
1252
1253 static gint __check_icon_resolution(const char *orig_icon_path,
1254                 char **new_icon_path)
1255 {
1256         int ret;
1257         char *dpi_path[2];
1258         char *icon_filename;
1259         char modified_iconpath[BUFSIZE];
1260         char icon_path[BUFSIZE];
1261         int i;
1262         int dpi = -1;
1263
1264         if (orig_icon_path == NULL)
1265                 return -1;
1266
1267         ret = system_info_get_platform_int(
1268                         "http://tizen.org/feature/screen.dpi", &dpi);
1269         if (ret != SYSTEM_INFO_ERROR_NONE)
1270                 return -1;
1271
1272         if (dpi >= LDPI_MIN && dpi <= LDPI_MAX) {
1273                 dpi_path[0] = "LDPI";
1274                 dpi_path[1] = "ldpi";
1275         } else if (dpi >= MDPI_MIN && dpi <= MDPI_MAX) {
1276                 dpi_path[0] = "MDPI";
1277                 dpi_path[1] = "mdpi";
1278         } else if (dpi >= HDPI_MIN && dpi <= HDPI_MAX) {
1279                 dpi_path[0] = "HDPI";
1280                 dpi_path[1] = "hdpi";
1281         } else if (dpi >= XHDPI_MIN && dpi <= XHDPI_MAX) {
1282                 dpi_path[0] = "XHDPI";
1283                 dpi_path[1] = "xhdpi";
1284         } else if (dpi >= XXHDPI_MIN && dpi <= XXHDPI_MAX) {
1285                 dpi_path[0] = "XXHDPI";
1286                 dpi_path[1] = "xxhdpi";
1287         } else {
1288                 _LOGE("Unidentified dpi[%d]", dpi);
1289                 return -1;
1290         }
1291
1292         icon_filename = strrchr(orig_icon_path, '/');
1293         if (icon_filename == NULL)
1294                 return -1;
1295
1296         snprintf(icon_path,
1297                         strlen(orig_icon_path) - (strlen(icon_filename) - 1),
1298                         "%s", orig_icon_path);
1299         for (i = 0; i < 2; i++) {
1300                 ret = snprintf(modified_iconpath, BUFSIZE - 1, "%s/%s%s",
1301                                 icon_path, dpi_path[i], icon_filename);
1302                 if (ret < 0 || ret > BUFSIZE -1) {
1303                         _LOGE("snprintf fail");
1304                         return -1;
1305                 }
1306                 if (access(modified_iconpath, F_OK) != -1) {
1307                         /* if exists, return modified icon path */
1308                         *new_icon_path = strdup(modified_iconpath);
1309                         return 0;
1310                 }
1311         }
1312
1313         return -1;
1314 }
1315
1316 static gint __compare_icon(gconstpointer a, gconstpointer b)
1317 {
1318         icon_x *icon = (icon_x *)a;
1319         char *icon_path;
1320
1321         if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1322                 return -1;
1323
1324         if (icon->dpi != NULL)
1325                 return -1;
1326
1327         if (__check_icon_resolution(icon->text, &icon_path) == 0) {
1328                 free(icon->text);
1329                 icon->text = icon_path;
1330         }
1331
1332         return 0;
1333 }
1334
1335 static gint __compare_icon_with_lang(gconstpointer a, gconstpointer b)
1336 {
1337         icon_x *icon = (icon_x *)a;
1338         char *lang = (char *)b;
1339         char *icon_path;
1340
1341         if (icon->dpi != NULL)
1342                 return -1;
1343
1344         if (strcasecmp(icon->lang, lang) == 0) {
1345                 if (strcasecmp(icon->lang, DEFAULT_LOCALE) == 0) {
1346                         /* icon for no locale. check existance of
1347                          * folder-hierachied default icons
1348                          */
1349                         if (__check_icon_resolution(icon->text,
1350                                                 &icon_path) == 0) {
1351                                 free(icon->text);
1352                                 icon->text = icon_path;
1353                         }
1354                 }
1355                 return 0;
1356         }
1357
1358         return -1;
1359 }
1360
1361 static gint __compare_icon_with_dpi(gconstpointer a, gconstpointer b)
1362 {
1363         icon_x *icon = (icon_x *)a;
1364         int dpi = GPOINTER_TO_INT(b);
1365
1366         if (icon->lang != NULL && strcasecmp(icon->lang, DEFAULT_LOCALE) != 0)
1367                 return -1;
1368
1369         if (icon->dpi == NULL)
1370                 return -1;
1371
1372         if (__check_dpi(icon->dpi, dpi) == 0)
1373                 return 0;
1374
1375         return -1;
1376 }
1377
1378 static gint __compare_icon_with_lang_dpi(gconstpointer a, gconstpointer b)
1379 {
1380         int ret;
1381         icon_x *icon = (icon_x *)a;
1382         char *lang = (char *)b;
1383         int dpi = -1;
1384
1385         ret = system_info_get_platform_int(
1386                         "http://tizen.org/feature/screen.dpi", &dpi);
1387         if (ret != SYSTEM_INFO_ERROR_NONE)
1388                 return -1;
1389
1390         if (strcasecmp(icon->lang, lang) == 0 &&
1391                         __check_dpi(icon->dpi, dpi) == 0)
1392                 return 0;
1393
1394         return -1;
1395 }
1396
1397 static char *__find_icon(GList *icons, const char *lang)
1398 {
1399         GList *tmp;
1400         icon_x *icon;
1401         int dpi = 0;
1402         int ret;
1403
1404         /* first, find icon whose locale and dpi with given lang and
1405          * system's dpi has matched
1406          */
1407         tmp = g_list_find_custom(icons, lang,
1408                         (GCompareFunc)__compare_icon_with_lang_dpi);
1409         if (tmp != NULL) {
1410                 icon = (icon_x *)tmp->data;
1411                 return (char *)icon->text;
1412         }
1413
1414         /* if first has failed, find icon whose locale has matched */
1415         tmp = g_list_find_custom(icons, lang,
1416                         (GCompareFunc)__compare_icon_with_lang);
1417         if (tmp != NULL) {
1418                 icon = (icon_x *)tmp->data;
1419                 return (char *)icon->text;
1420         }
1421
1422         /* if second has failed, find icon whose dpi has matched with
1423          * system's dpi
1424          */
1425         ret = system_info_get_platform_int(
1426                         "http://tizen.org/feature/screen.dpi", &dpi);
1427         if (ret == SYSTEM_INFO_ERROR_NONE) {
1428                 tmp = g_list_find_custom(icons, GINT_TO_POINTER(dpi),
1429                                 (GCompareFunc)__compare_icon_with_dpi);
1430                 if (tmp != NULL) {
1431                         icon = (icon_x *)tmp->data;
1432                         return (char *)icon->text;
1433                 }
1434         }
1435
1436         /* last, find default icon marked as "No Locale" */
1437         tmp = g_list_find_custom(icons, NULL, (GCompareFunc)__compare_icon);
1438         if (tmp != NULL) {
1439                 icon = (icon_x *)tmp->data;
1440                 return (char *)icon->text;
1441         }
1442
1443         return NULL;
1444 }
1445
1446 static void __extract_data(const char *locale, GList *lbls, GList *lcns,
1447                 GList *icns, GList *dcns, GList *aths, char **label,
1448                 char **license, char **icon, char **description, char **author)
1449 {
1450         GList *tmp;
1451         label_x *lbl;
1452         license_x *lcn;
1453         description_x *dcn;
1454         author_x *ath;
1455
1456         for (tmp = lbls; tmp; tmp = tmp->next) {
1457                 lbl = (label_x *)tmp->data;
1458                 if (lbl == NULL)
1459                         continue;
1460                 if (lbl->lang) {
1461                         if (strcmp(lbl->lang, locale) == 0) {
1462                                 *label = (char *)lbl->text;
1463                                 break;
1464                         }
1465                 }
1466         }
1467         for (tmp = lcns; tmp; tmp = tmp->next) {
1468                 lcn = (license_x *)tmp->data;
1469                 if (lcn == NULL)
1470                         continue;
1471                 if (lcn->lang) {
1472                         if (strcmp(lcn->lang, locale) == 0) {
1473                                 *license = (char *)lcn->text;
1474                                 break;
1475                         }
1476                 }
1477         }
1478
1479         *icon = __find_icon(icns, locale);
1480
1481         for (tmp = dcns; tmp; tmp = tmp->next) {
1482                 dcn = (description_x *)tmp->data;
1483                 if (dcn == NULL)
1484                         continue;
1485                 if (dcn->lang) {
1486                         if (strcmp(dcn->lang, locale) == 0) {
1487                                 *description = (char *)dcn->text;
1488                                 break;
1489                         }
1490                 }
1491         }
1492         for (tmp = aths; tmp; tmp = tmp->next) {
1493                 ath = (author_x *)tmp->data;
1494                 if (ath == NULL)
1495                         continue;
1496                 if (ath->lang) {
1497                         if (strcmp(ath->lang, locale) == 0) {
1498                                 *author = (char *)ath->text;
1499                                 break;
1500                         }
1501                 }
1502         }
1503 }
1504
1505 static int __insert_app_localized_info(sqlite3 *db, application_x *app)
1506 {
1507         static const char query[] =
1508                 "INSERT INTO package_app_localized_info (app_id, app_locale,"
1509                 "  app_label, app_icon) "
1510                 "VALUES (?, ?, ?, ?)";
1511         int ret;
1512         sqlite3_stmt *stmt;
1513         int idx;
1514         GList *tmp;
1515         GList *locales;
1516         const char *locale;
1517         char *label;
1518         char *icon;
1519
1520         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1521         if (ret != SQLITE_OK) {
1522                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1523                 return -1;
1524         }
1525
1526         locales = __create_locale_list(app->label, NULL, app->icon, NULL, NULL);
1527         for (tmp = locales; tmp; tmp = tmp->next) {
1528                 locale = (const char *)tmp->data;
1529                 label = NULL;
1530                 icon = NULL;
1531                 __extract_data(locale, app->label, NULL, app->icon, NULL, NULL,
1532                                 &label, NULL, &icon, NULL, NULL);
1533                 if (!label && !icon)
1534                         continue;
1535
1536                 idx = 1;
1537                 __BIND_TEXT(db, stmt, idx++, app->appid);
1538                 __BIND_TEXT(db, stmt, idx++, locale);
1539                 __BIND_TEXT(db, stmt, idx++, label);
1540                 __BIND_TEXT(db, stmt, idx++, icon);
1541
1542                 ret = sqlite3_step(stmt);
1543                 if (ret != SQLITE_DONE) {
1544                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1545                         g_list_free(locales);
1546                         sqlite3_finalize(stmt);
1547                         return -1;
1548                 }
1549
1550                 sqlite3_reset(stmt);
1551
1552                 if (strcasecmp(app->mainapp, "true") == 0) {
1553                         if (__insert_mainapp_localized_info(db, app, locale,
1554                                                 label, icon))
1555                                 _LOGE("insert mainapp localized info failed");
1556                 }
1557         }
1558
1559         g_list_free(locales);
1560         sqlite3_finalize(stmt);
1561
1562         return 0;
1563 }
1564
1565 static int __insert_package_privilege_info(sqlite3 *db, manifest_x *mfx)
1566 {
1567         static const char query[] =
1568                 "INSERT INTO package_privilege_info (package, privilege, type) "
1569                 "VALUES (?, ?, ?)";
1570         int ret;
1571         sqlite3_stmt *stmt;
1572         int idx;
1573         GList *tmp;
1574         privilege_x *priv;
1575
1576         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1577         if (ret != SQLITE_OK) {
1578                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1579                 return -1;
1580         }
1581
1582         for (tmp = mfx->privileges; tmp; tmp = tmp->next) {
1583                 priv = (privilege_x *)tmp->data;
1584                 if (priv == NULL)
1585                         continue;
1586
1587                 idx = 1;
1588                 __BIND_TEXT(db, stmt, idx++, mfx->package);
1589                 __BIND_TEXT(db, stmt, idx++, priv->value);
1590                 __BIND_TEXT(db, stmt, idx++, priv->type);
1591
1592                 ret = sqlite3_step(stmt);
1593                 if (ret != SQLITE_DONE) {
1594                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1595                         sqlite3_finalize(stmt);
1596                         return -1;
1597                 }
1598                 sqlite3_reset(stmt);
1599         }
1600
1601         sqlite3_finalize(stmt);
1602
1603         return 0;
1604 }
1605
1606 static int __insert_app_data_control_privilege_info(sqlite3 *db,
1607                 datacontrol_x *datacontrol)
1608 {
1609         static const char query[] =
1610                 "INSERT INTO package_app_data_control_privilege (providerid,"
1611                 "  privilege, type) VALUES (?, ?, ?)";
1612
1613         int ret;
1614         sqlite3_stmt *stmt;
1615         int idx;
1616         GList *privileges;
1617         char *priv;
1618
1619         if (datacontrol == NULL)
1620                 return 0;
1621
1622         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1623         if (ret != SQLITE_OK) {
1624                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1625                 return -1;
1626         }
1627
1628         for (privileges = datacontrol->privileges; privileges;
1629                         privileges = privileges->next) {
1630                 priv = (char *)privileges->data;
1631                 if (priv == NULL)
1632                         continue;
1633
1634                 idx = 1;
1635                 __BIND_TEXT(db, stmt, idx++, datacontrol->providerid);
1636                 __BIND_TEXT(db, stmt, idx++, priv);
1637                 __BIND_TEXT(db, stmt, idx++, datacontrol->type);
1638
1639                 ret = sqlite3_step(stmt);
1640                 if (ret != SQLITE_DONE) {
1641                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1642                         sqlite3_finalize(stmt);
1643                         return -1;
1644                 }
1645
1646                 sqlite3_reset(stmt);
1647         }
1648
1649         sqlite3_finalize(stmt);
1650         return 0;
1651 }
1652
1653 static int __insert_datacontrol_info(sqlite3 *db, application_x *app)
1654 {
1655         static const char query[] =
1656                 "INSERT INTO package_app_data_control (app_id, providerid,"
1657                 "  access, type, trusted) VALUES (?, ?, ?, ?, ?)";
1658         int ret;
1659         sqlite3_stmt *stmt;
1660         int idx;
1661         GList *tmp;
1662         datacontrol_x *dc;
1663
1664         if (app->datacontrol == NULL)
1665                 return 0;
1666
1667         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1668         if (ret != SQLITE_OK) {
1669                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1670                 return -1;
1671         }
1672
1673         for (tmp = app->datacontrol; tmp; tmp = tmp->next) {
1674                 dc = (datacontrol_x *)tmp->data;
1675                 if (dc == NULL)
1676                         continue;
1677                 idx = 1;
1678                 __BIND_TEXT(db, stmt, idx++, app->appid);
1679                 __BIND_TEXT(db, stmt, idx++, dc->providerid);
1680                 __BIND_TEXT(db, stmt, idx++, dc->access);
1681                 __BIND_TEXT(db, stmt, idx++, dc->type);
1682                 __BIND_TEXT(db, stmt, idx++, dc->trusted);
1683
1684                 ret = sqlite3_step(stmt);
1685                 if (ret != SQLITE_DONE) {
1686                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1687                         sqlite3_finalize(stmt);
1688                         return -1;
1689                 }
1690
1691                 if (dc->privileges &&
1692                                 __insert_app_data_control_privilege_info(db, dc)) {
1693                         sqlite3_finalize(stmt);
1694                         return -1;
1695                 }
1696
1697                 sqlite3_reset(stmt);
1698         }
1699
1700         sqlite3_finalize(stmt);
1701
1702         return 0;
1703 }
1704
1705 static int __insert_category_info(sqlite3 *db, application_x *app)
1706 {
1707         static const char query[] =
1708                 "INSERT INTO package_app_app_category (app_id, category) "
1709                 "VALUES (?, ?)";
1710         int ret;
1711         sqlite3_stmt *stmt;
1712         int idx;
1713         GList *tmp;
1714         const char *category;
1715
1716         if (app->category == NULL)
1717                 return 0;
1718
1719         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1720         if (ret != SQLITE_OK) {
1721                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1722                 return -1;
1723         }
1724
1725         for (tmp = app->category; tmp; tmp = tmp->next) {
1726                 category = (const char *)tmp->data;
1727                 if (category == NULL)
1728                         continue;
1729                 idx = 1;
1730                 __BIND_TEXT(db, stmt, idx++, app->appid);
1731                 __BIND_TEXT(db, stmt, idx++, category);
1732
1733                 ret = sqlite3_step(stmt);
1734                 if (ret != SQLITE_DONE) {
1735                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1736                         sqlite3_finalize(stmt);
1737                         return -1;
1738                 }
1739
1740                 sqlite3_reset(stmt);
1741         }
1742
1743         sqlite3_finalize(stmt);
1744
1745         return 0;
1746 }
1747
1748 static int __insert_metadata_info(sqlite3 *db, application_x *app)
1749 {
1750         static const char query[] =
1751                 "INSERT INTO package_app_app_metadata (app_id,"
1752                 "  md_key, md_value) VALUES (?, ?, ?)";
1753         int ret;
1754         sqlite3_stmt *stmt;
1755         int idx;
1756         GList *tmp;
1757         metadata_x *md;
1758
1759         if (app->metadata == NULL)
1760                 return 0;
1761
1762         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1763         if (ret != SQLITE_OK) {
1764                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1765                 return -1;
1766         }
1767
1768         for (tmp = app->metadata; tmp; tmp = tmp->next) {
1769                 md = (metadata_x *)tmp->data;
1770                 if (md == NULL)
1771                         continue;
1772                 idx = 1;
1773                 __BIND_TEXT(db, stmt, idx++, app->appid);
1774                 __BIND_TEXT(db, stmt, idx++, md->key);
1775                 __BIND_TEXT(db, stmt, idx++, md->value);
1776
1777                 ret = sqlite3_step(stmt);
1778                 if (ret != SQLITE_DONE) {
1779                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1780                         sqlite3_finalize(stmt);
1781                         return -1;
1782                 }
1783
1784                 sqlite3_reset(stmt);
1785         }
1786
1787         sqlite3_finalize(stmt);
1788
1789         return 0;
1790 }
1791
1792 static int __insert_appcontrol_privilege_info(sqlite3 *db, const char *appid,
1793                 appcontrol_x *ac)
1794 {
1795         static const char query[] =
1796                 "INSERT INTO package_app_app_control_privilege (app_id,"
1797                 "  app_control, privilege) VALUES (?, ?, ?)";
1798         int ret;
1799         sqlite3_stmt *stmt;
1800         int idx;
1801         char app_control[BUFSIZE];
1802         GList *tmp;
1803         char *privilege;
1804
1805         if (ac == NULL)
1806                 return 0;
1807
1808         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1809         if (ret != SQLITE_OK) {
1810                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1811                 return -1;
1812         }
1813
1814         for (tmp = ac->privileges; tmp; tmp = tmp->next) {
1815                 privilege = (char *)tmp->data;
1816                 if (privilege == NULL || !strlen(privilege))
1817                         continue;
1818
1819                 idx = 1;
1820                 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
1821                                 ac->operation ? (strlen(ac->operation) > 0 ?
1822                                         ac->operation : "NULL") : "NULL",
1823                                 ac->uri ? (strlen(ac->uri) > 0 ?
1824                                         ac->uri : "NULL") : "NULL",
1825                                 ac->mime ? (strlen(ac->mime) > 0 ?
1826                                         ac->mime : "NULL") : "NULL");
1827                 __BIND_TEXT(db, stmt, idx++, appid);
1828                 __BIND_TEXT(db, stmt, idx++, app_control);
1829                 __BIND_TEXT(db, stmt, idx++, privilege);
1830
1831                 ret = sqlite3_step(stmt);
1832                 if (ret != SQLITE_DONE) {
1833                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1834                         sqlite3_finalize(stmt);
1835                         return -1;
1836                 }
1837
1838                 sqlite3_reset(stmt);
1839         }
1840
1841         sqlite3_finalize(stmt);
1842
1843         return 0;
1844 }
1845
1846 static int __insert_appcontrol_info(sqlite3 *db, application_x *app)
1847 {
1848         static const char query[] =
1849                 "INSERT INTO package_app_app_control (app_id, app_control,"
1850                 "  visibility, app_control_id) "
1851                 "VALUES (?, ?, ?, ?)";
1852         int ret;
1853         sqlite3_stmt *stmt;
1854         int idx;
1855         char app_control[BUFSIZE];
1856         GList *tmp;
1857         appcontrol_x *ac;
1858
1859         if (app->appcontrol == NULL)
1860                 return 0;
1861
1862         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
1863         if (ret != SQLITE_OK) {
1864                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
1865                 return -1;
1866         }
1867
1868         for (tmp = app->appcontrol; tmp; tmp = tmp->next) {
1869                 ac = (appcontrol_x *)tmp->data;
1870                 if (ac == NULL)
1871                         continue;
1872                 idx = 1;
1873                 snprintf(app_control, sizeof(app_control), "%s|%s|%s",
1874                                 ac->operation ? (strlen(ac->operation) > 0 ?
1875                                         ac->operation : "NULL") : "NULL",
1876                                 ac->uri ? (strlen(ac->uri) > 0 ?
1877                                         ac->uri : "NULL") : "NULL",
1878                                 ac->mime ? (strlen(ac->mime) > 0 ?
1879                                         ac->mime : "NULL") : "NULL");
1880                 __BIND_TEXT(db, stmt, idx++, app->appid);
1881                 __BIND_TEXT(db, stmt, idx++, app_control);
1882                 __BIND_TEXT(db, stmt, idx++, ac->visibility);
1883                 __BIND_TEXT(db, stmt, idx++, ac->id);
1884
1885                 ret = sqlite3_step(stmt);
1886                 if (ret != SQLITE_DONE) {
1887                         _LOGE("step failed: %s", sqlite3_errmsg(db));
1888                         sqlite3_finalize(stmt);
1889                         return -1;
1890                 }
1891
1892                 if (__insert_appcontrol_privilege_info(db, app->appid, ac)) {
1893                         sqlite3_finalize(stmt);
1894                         return -1;
1895                 }
1896
1897                 sqlite3_reset(stmt);
1898         }
1899
1900         sqlite3_finalize(stmt);
1901
1902         return 0;
1903 }
1904
1905 static const char *__get_bool(char *value, bool is_true)
1906 {
1907         if (value != NULL) {
1908                 if (!strcmp(value, ""))
1909                         return (is_true) ? "true" : "false";
1910                 return value;
1911         }
1912
1913         return (is_true) ? "true" : "false";
1914 }
1915
1916 #define EFFECTIVE_APPID_KEY "http://tizen.org/metadata/effective-appid"
1917 static const char *__find_effective_appid(GList *metadata_list)
1918 {
1919         GList *tmp;
1920         metadata_x *md;
1921
1922         for (tmp = metadata_list; tmp; tmp = tmp->next) {
1923                 md = (metadata_x *)tmp->data;
1924                 if (md == NULL || md->key == NULL)
1925                         continue;
1926
1927                 if (strcmp(md->key, EFFECTIVE_APPID_KEY) == 0) {
1928                         if (md->value)
1929                                 return md->value;
1930                 }
1931         }
1932
1933         return NULL;
1934 }
1935
1936 static int __convert_background_category(GList *category_list)
1937 {
1938         int ret = 0;
1939         GList *tmp;
1940         char *category_data;
1941
1942         if (category_list == NULL)
1943                 return 0;
1944
1945         for (tmp = category_list; tmp; tmp = tmp->next) {
1946                 category_data = (char *)tmp->data;
1947                 if (category_data == NULL)
1948                         continue;
1949                 if (!strcmp(category_data, APP_BG_CATEGORY_MEDIA_STR))
1950                         ret |= APP_BG_CATEGORY_MEDIA_VAL;
1951                 else if (!strcmp(category_data, APP_BG_CATEGORY_DOWNLOAD_STR))
1952                         ret |= APP_BG_CATEGORY_DOWNLOAD_VAL;
1953                 else if (!strcmp(category_data, APP_BG_CATEGORY_BGNETWORK_STR))
1954                         ret |= APP_BG_CATEGORY_BGNETWORK_VAL;
1955                 else if (!strcmp(category_data, APP_BG_CATEGORY_LOCATION_STR))
1956                         ret |= APP_BG_CATEGORY_LOCATION_VAL;
1957                 else if (!strcmp(category_data, APP_BG_CATEGORY_SENSOR_STR))
1958                         ret |= APP_BG_CATEGORY_SENSOR_VAL;
1959                 else if (!strcmp(category_data, APP_BG_CATEGORY_IOTCOMM_STR))
1960                         ret |= APP_BG_CATEGORY_IOTCOMM_VAL;
1961                 else if (!strcmp(category_data, APP_BG_CATEGORY_SYSTEM))
1962                         ret |= APP_BG_CATEGORY_SYSTEM_VAL;
1963                 else
1964                         _LOGE("Unidentified category [%s]", category_data);
1965         }
1966
1967         return ret;
1968 }
1969
1970 static int __insert_application_info(sqlite3 *db, manifest_x *mfx)
1971 {
1972         static const char query[] =
1973                 "INSERT INTO package_app_info (app_id, app_component,"
1974                 "  app_exec, app_nodisplay, app_type, app_onboot, app_multiple,"
1975                 "  app_autorestart, app_taskmanage, app_hwacceleration,"
1976                 "  app_screenreader, app_mainapp, app_recentimage,"
1977                 "  app_launchcondition, app_indicatordisplay, app_portraitimg,"
1978                 "  app_landscapeimg, app_guestmodevisibility,"
1979                 "  app_permissiontype, app_preload, app_submode,"
1980                 "  app_submode_mainid, app_installed_storage, app_process_pool,"
1981                 "  app_launch_mode, app_ui_gadget, app_support_mode,"
1982                 "  app_support_disable, component_type, package, app_tep_name,"
1983                 "  app_zip_mount_file, app_background_category,"
1984                 "  app_package_type, app_root_path, app_api_version,"
1985                 "  app_effective_appid, app_splash_screen_display,"
1986                 "  app_package_system, app_removable,"
1987                 "  app_package_installed_time, app_support_ambient,"
1988                 "  app_external_path, app_setup_appid) "
1989                 "VALUES (?, ?, "
1990                 "  ?, LOWER(?), ?, LOWER(?), LOWER(?),"
1991                 "  LOWER(?), LOWER(?), ?,"
1992                 "  ?, LOWER(?), ?,"
1993                 "  ?, LOWER(?), ?,"
1994                 "  ?, LOWER(?),"
1995                 "  ?, LOWER(?), LOWER(?),"
1996                 "  ?, ?, LOWER(?),"
1997                 "  COALESCE(?, 'single'), LOWER(?), ?,"
1998                 "  LOWER(?), ?, ?, ?,"
1999                 "  ?, ?,"
2000                 "  ?, ?, ?,"
2001                 "  ?, LOWER(?),"
2002                 "  LOWER(?), LOWER(?),"
2003                 "  ?, LOWER(?),"
2004                 "  ?, ?)";
2005         int ret;
2006         sqlite3_stmt *stmt;
2007         int idx;
2008         GList *tmp;
2009         application_x *app;
2010         int bg_category;
2011         const char *effective_appid;
2012         GList *ss_list;
2013
2014         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2015         if (ret != SQLITE_OK) {
2016                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2017                 return -1;
2018         }
2019
2020         for (tmp = mfx->application; tmp; tmp = tmp->next) {
2021                 app = (application_x *)tmp->data;
2022                 if (app == NULL)
2023                         continue;
2024
2025                 bg_category = __convert_background_category(
2026                                 app->background_category);
2027                 effective_appid = __find_effective_appid(app->metadata);
2028
2029                 idx = 1;
2030                 __BIND_TEXT(db, stmt, idx++, app->appid);
2031                 __BIND_TEXT(db, stmt, idx++, app->component_type);
2032                 __BIND_TEXT(db, stmt, idx++, app->exec);
2033                 __BIND_TEXT(db, stmt, idx++, __get_bool(app->nodisplay, false));
2034                 __BIND_TEXT(db, stmt, idx++, app->type);
2035                 __BIND_TEXT(db, stmt, idx++, __get_bool(app->onboot, false));
2036                 __BIND_TEXT(db, stmt, idx++, __get_bool(app->multiple, false));
2037                 __BIND_TEXT(db, stmt, idx++,
2038                                 __get_bool(app->autorestart, false));
2039                 __BIND_TEXT(db, stmt, idx++,
2040                                 __get_bool(app->taskmanage, false));
2041                 __BIND_TEXT(db, stmt, idx++, app->hwacceleration);
2042                 __BIND_TEXT(db, stmt, idx++, app->screenreader);
2043                 __BIND_TEXT(db, stmt, idx++, __get_bool(app->mainapp, false));
2044                 __BIND_TEXT(db, stmt, idx++, app->recentimage);
2045                 __BIND_TEXT(db, stmt, idx++, app->launchcondition);
2046                 __BIND_TEXT(db, stmt, idx++,
2047                                 __get_bool(app->indicatordisplay, true));
2048                 __BIND_TEXT(db, stmt, idx++, app->portraitimg);
2049                 __BIND_TEXT(db, stmt, idx++, app->landscapeimg);
2050                 __BIND_TEXT(db, stmt, idx++,
2051                                 __get_bool(app->guestmode_visibility, true));
2052                 __BIND_TEXT(db, stmt, idx++, app->permission_type);
2053                 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2054                 __BIND_TEXT(db, stmt, idx++, __get_bool(app->submode, false));
2055                 __BIND_TEXT(db, stmt, idx++, app->submode_mainid);
2056                 __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2057                 __BIND_TEXT(db, stmt, idx++,
2058                                 __get_bool(app->process_pool, false));
2059                 __BIND_TEXT(db, stmt, idx++, app->launch_mode);
2060                 __BIND_TEXT(db, stmt, idx++, __get_bool(app->ui_gadget, false));
2061                 __BIND_TEXT(db, stmt, idx++,
2062                                 app->support_mode ? app->support_mode : "0");
2063                 __BIND_TEXT(db, stmt, idx++,
2064                                 __get_bool(mfx->support_disable, false));
2065                 __BIND_TEXT(db, stmt, idx++, app->component_type);
2066                 __BIND_TEXT(db, stmt, idx++, mfx->package);
2067                 __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2068                 __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2069                 __BIND_INT(db, stmt, idx++, bg_category);
2070                 __BIND_TEXT(db, stmt, idx++, mfx->type ? mfx->type : "tpk");
2071                 __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2072                 __BIND_TEXT(db, stmt, idx++, app->api_version);
2073                 __BIND_TEXT(db, stmt, idx++, effective_appid);
2074                 __BIND_TEXT(db, stmt, idx++,
2075                                 __get_bool(app->splash_screen_display, true));
2076                 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2077                 __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, false));
2078                 __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2079                 __BIND_TEXT(db, stmt, idx++,
2080                                 __get_bool(app->support_ambient, false));
2081                 __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2082                 __BIND_TEXT(db, stmt, idx++, app->setup_appid);
2083
2084                 ret = sqlite3_step(stmt);
2085                 if (ret != SQLITE_DONE) {
2086                         _LOGE("step failed: %s", sqlite3_errmsg(db));
2087                         sqlite3_finalize(stmt);
2088                         return -1;
2089                 }
2090
2091                 sqlite3_reset(stmt);
2092
2093                 if (__insert_appcontrol_info(db, app)) {
2094                         sqlite3_finalize(stmt);
2095                         return -1;
2096                 }
2097                 if (__insert_category_info(db, app)) {
2098                         sqlite3_finalize(stmt);
2099                         return -1;
2100                 }
2101                 if (__insert_metadata_info(db, app)) {
2102                         sqlite3_finalize(stmt);
2103                         return -1;
2104                 }
2105                 if (__insert_datacontrol_info(db, app)) {
2106                         sqlite3_finalize(stmt);
2107                         return -1;
2108                 }
2109                 ss_list = __find_splashscreens(app->splashscreens);
2110                 if (__insert_splashscreen_info(db, app, ss_list)) {
2111                         g_list_free(ss_list);
2112                         sqlite3_finalize(stmt);
2113                         return -1;
2114                 }
2115                 g_list_free(ss_list);
2116                 if (__insert_app_localized_info(db, app)) {
2117                         sqlite3_finalize(stmt);
2118                         return -1;
2119                 }
2120         }
2121
2122         sqlite3_finalize(stmt);
2123
2124         return 0;
2125 }
2126
2127 static int __insert_package_update_info(sqlite3 *db, manifest_x *mfx)
2128 {
2129         static const char query[] =
2130                 "INSERT INTO package_update_info (package, update_version) "
2131                 "VALUES (?, ?)";
2132         int ret;
2133         int idx;
2134         sqlite3_stmt *stmt;
2135
2136         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2137         if (ret != SQLITE_OK) {
2138                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2139                 return -1;
2140         }
2141
2142         idx = 1;
2143         __BIND_TEXT(db, stmt, idx++, mfx->package);
2144         __BIND_TEXT(db, stmt, idx, mfx->version);
2145         ret = sqlite3_step(stmt);
2146         if (ret != SQLITE_DONE) {
2147                 _LOGE("step failed: %s", sqlite3_errmsg(db));
2148                 sqlite3_finalize(stmt);
2149                 return -1;
2150         }
2151         sqlite3_finalize(stmt);
2152
2153         return 0;
2154 }
2155
2156 static int __insert_package_localized_info(sqlite3 *db, manifest_x *mfx)
2157 {
2158         static const char query[] =
2159                 "INSERT INTO package_localized_info (package, package_locale,"
2160                 "  package_label, package_icon, package_description,"
2161                 "  package_license, package_author) "
2162                 "VALUES (?, ?, ?, ?, ?, ?, ?)";
2163         int ret;
2164         sqlite3_stmt *stmt;
2165         int idx;
2166         GList *tmp;
2167         GList *locales;
2168         const char *locale;
2169         char *label;
2170         char *icon;
2171         char *description;
2172         char *license;
2173         char *author;
2174
2175         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2176         if (ret != SQLITE_OK) {
2177                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2178                 return -1;
2179         }
2180
2181         locales = __create_locale_list(mfx->label, mfx->license, mfx->icon,
2182                         mfx->description, mfx->author);
2183         for (tmp = locales; tmp; tmp = tmp->next) {
2184                 locale = (const char *)tmp->data;
2185                 label = NULL;
2186                 icon = NULL;
2187                 description = NULL;
2188                 license = NULL;
2189                 author = NULL;
2190                 __extract_data(locale, mfx->label, mfx->license, mfx->icon,
2191                                 mfx->description, mfx->author,
2192                                 &label, &license, &icon, &description, &author);
2193                 if (!label && !license && !icon && !description && !author)
2194                         continue;
2195
2196                 idx = 1;
2197                 __BIND_TEXT(db, stmt, idx++, mfx->package);
2198                 __BIND_TEXT(db, stmt, idx++, locale);
2199                 __BIND_TEXT(db, stmt, idx++, label);
2200                 __BIND_TEXT(db, stmt, idx++, icon);
2201                 __BIND_TEXT(db, stmt, idx++, description);
2202                 __BIND_TEXT(db, stmt, idx++, license);
2203                 __BIND_TEXT(db, stmt, idx++, author);
2204
2205                 ret = sqlite3_step(stmt);
2206                 if (ret != SQLITE_DONE) {
2207                         _LOGE("step failed: %s", sqlite3_errmsg(db));
2208                         g_list_free(locales);
2209                         sqlite3_finalize(stmt);
2210                         return -1;
2211                 }
2212
2213                 sqlite3_reset(stmt);
2214         }
2215
2216         g_list_free(locales);
2217         sqlite3_finalize(stmt);
2218
2219         return 0;
2220 }
2221
2222 static int __insert_package_info(sqlite3 *db, manifest_x *mfx)
2223 {
2224         static const char query[] =
2225                 "INSERT INTO package_info (package, package_type,"
2226                 "  package_version, package_api_version, package_tep_name,"
2227                 "  package_zip_mount_file, install_location, package_size,"
2228                 "  package_removable, package_preload, package_readonly,"
2229                 "  package_update, package_appsetting, package_nodisplay,"
2230                 "  package_system, author_name, author_email, author_href,"
2231                 "  installed_time, installed_storage, storeclient_id,"
2232                 "  mainapp_id, package_url, root_path, external_path,"
2233                 "  csc_path, package_support_mode, package_support_disable) "
2234                 "VALUES (?, ?,"
2235                 "  ?, ?, ?,"
2236                 "  ?, ?, ?,"
2237                 "  LOWER(?), LOWER(?), LOWER(?),"
2238                 "  LOWER(?), LOWER(?), LOWER(?),"
2239                 "  LOWER(?), ?, ?, ?,"
2240                 "  ?, ?, ?,"
2241                 "  ?, ?, ?, ?,"
2242                 "  ?, ?, LOWER(?))";
2243         int ret;
2244         sqlite3_stmt *stmt;
2245         int idx = 1;
2246         const char *author_name = NULL;
2247         const char *author_email = NULL;
2248         const char *author_href = NULL;
2249
2250         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2251         if (ret != SQLITE_OK) {
2252                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2253                 return -1;
2254         }
2255
2256         if (mfx->author && mfx->author->data) {
2257                 author_name = ((author_x *)mfx->author->data)->text;
2258                 author_email = ((author_x *)mfx->author->data)->email;
2259                 author_href = ((author_x *)mfx->author->data)->href;
2260         }
2261
2262         __BIND_TEXT(db, stmt, idx++, mfx->package);
2263         __BIND_TEXT(db, stmt, idx++, mfx->type);
2264         __BIND_TEXT(db, stmt, idx++, mfx->version);
2265         __BIND_TEXT(db, stmt, idx++, mfx->api_version);
2266         __BIND_TEXT(db, stmt, idx++, mfx->tep_name);
2267         __BIND_TEXT(db, stmt, idx++, mfx->zip_mount_file);
2268         __BIND_TEXT(db, stmt, idx++, mfx->installlocation);
2269         __BIND_TEXT(db, stmt, idx++, mfx->package_size);
2270         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->removable, true));
2271         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->preload, false));
2272         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->readonly, false));
2273         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->update, false));
2274         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->appsetting, false));
2275         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->nodisplay_setting, false));
2276         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->system, false));
2277         __BIND_TEXT(db, stmt, idx++, author_name);
2278         __BIND_TEXT(db, stmt, idx++, author_email);
2279         __BIND_TEXT(db, stmt, idx++, author_href);
2280         __BIND_TEXT(db, stmt, idx++, mfx->installed_time);
2281         __BIND_TEXT(db, stmt, idx++, mfx->installed_storage);
2282         __BIND_TEXT(db, stmt, idx++, mfx->storeclient_id);
2283         __BIND_TEXT(db, stmt, idx++, mfx->mainapp_id);
2284         __BIND_TEXT(db, stmt, idx++, mfx->package_url);
2285         __BIND_TEXT(db, stmt, idx++, mfx->root_path);
2286         __BIND_TEXT(db, stmt, idx++, mfx->external_path);
2287         __BIND_TEXT(db, stmt, idx++, mfx->csc_path);
2288         __BIND_TEXT(db, stmt, idx++,
2289                         mfx->support_mode ? mfx->support_mode : "0");
2290         __BIND_TEXT(db, stmt, idx++, __get_bool(mfx->support_disable, false));
2291
2292         ret = sqlite3_step(stmt);
2293         if (ret != SQLITE_DONE) {
2294                 _LOGE("step failed: %s", sqlite3_errmsg(db));
2295                 sqlite3_finalize(stmt);
2296                 return -1;
2297         }
2298
2299         sqlite3_finalize(stmt);
2300
2301         if (__insert_package_update_info(db, mfx))
2302                 return -1;
2303         if (__insert_package_localized_info(db, mfx))
2304                 return -1;
2305         if (__insert_application_info(db, mfx))
2306                 return -1;
2307         if (__insert_package_privilege_info(db, mfx))
2308                 return -1;
2309         if (__insert_package_appdefined_privilege_info(db, mfx))
2310                 return -1;
2311         if (__insert_package_dependency_info(db, mfx))
2312                 return -1;
2313
2314         return 0;
2315 }
2316
2317 static int __delete_package_info(sqlite3 *db, const char *pkgid)
2318 {
2319         static const char query[] =
2320                 "DELETE FROM package_info WHERE package=?";
2321         int ret;
2322         sqlite3_stmt *stmt;
2323
2324         ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
2325         if (ret != SQLITE_OK) {
2326                 _LOGE("prepare failed: %s", sqlite3_errmsg(db));
2327                 return -1;
2328         }
2329
2330         __BIND_TEXT(db, stmt, 1, pkgid);
2331
2332         ret = sqlite3_step(stmt);
2333         if (ret != SQLITE_DONE) {
2334                 _LOGE("step failed: %s", sqlite3_errmsg(db));
2335                 sqlite3_finalize(stmt);
2336                 return -1;
2337         }
2338
2339         sqlite3_finalize(stmt);
2340
2341         return 0;
2342 }
2343
2344 API int pkgmgr_parser_delete_pkg_info(sqlite3 *db, const char *package, uid_t uid)
2345 {
2346         if (db == NULL || package == NULL) {
2347                 _LOGE("invalid parameter");
2348                 return PM_PARSER_R_EINVAL;
2349         }
2350
2351         __BEGIN_TRANSACTION(db);
2352         __DO_TRANSACTION(db, __delete_package_info(db, package));
2353         __END_TRANSACTION(db);
2354
2355         return PM_PARSER_R_OK;
2356 }
2357
2358 API int pkgmgr_parser_update_pkg_info(sqlite3 *db, manifest_x *mfx, uid_t uid)
2359 {
2360         if (db == NULL || mfx == NULL) {
2361                 _LOGE("invalid parameter");
2362                 return PM_PARSER_R_EINVAL;
2363         }
2364
2365         __BEGIN_TRANSACTION(db);
2366         __DO_TRANSACTION(db, __delete_package_info(db, mfx->package));
2367         __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2368         __END_TRANSACTION(db);
2369
2370         sqlite3_close_v2(db);
2371
2372         return PM_PARSER_R_OK;
2373 }
2374
2375 API int pkgmgr_parser_insert_pkg_info(sqlite3 *db, manifest_x *mfx, uid_t uid)
2376 {
2377         if (db == NULL || mfx == NULL) {
2378                 _LOGE("invalid parameter");
2379                 return PM_PARSER_R_EINVAL;
2380         }
2381
2382         __BEGIN_TRANSACTION(db);
2383         __DO_TRANSACTION(db, __insert_package_info(db, mfx));
2384         __END_TRANSACTION(db);
2385
2386         sqlite3_close_v2(db);
2387
2388         return PM_PARSER_R_OK;
2389 }