Add PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM property
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_private.c
1 /*
2  * pkgmgr-info
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7  * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <stdio.h>
26 #include <ctype.h>
27 #include <dlfcn.h>
28
29 #include <vconf.h>
30 #include <sqlite3.h>
31 #include <glib.h>
32 #include <unzip.h>
33
34 #include "pkgmgr-info.h"
35 #include "pkgmgrinfo_debug.h"
36 #include "pkgmgrinfo_private.h"
37 #include "pkgmgr_parser.h"
38
39 static GHashTable *plugin_set_list;
40
41 struct _pkginfo_str_map_t {
42         pkgmgrinfo_pkginfo_filter_prop_str prop;
43         const char *property;
44 };
45
46 static struct _pkginfo_str_map_t pkginfo_str_prop_map[] = {
47         {E_PMINFO_PKGINFO_PROP_PACKAGE_ID,      PMINFO_PKGINFO_PROP_PACKAGE_ID},
48         {E_PMINFO_PKGINFO_PROP_PACKAGE_TYPE,    PMINFO_PKGINFO_PROP_PACKAGE_TYPE},
49         {E_PMINFO_PKGINFO_PROP_PACKAGE_VERSION, PMINFO_PKGINFO_PROP_PACKAGE_VERSION},
50         {E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION,        PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION},
51         {E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE,       PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE},
52         {E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME,     PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME},
53         {E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL,    PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL},
54         {E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF,     PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF},
55         {E_PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE,       PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE}
56 };
57
58 struct _pkginfo_int_map_t {
59         pkgmgrinfo_pkginfo_filter_prop_int prop;
60         const char *property;
61 };
62
63 static struct _pkginfo_int_map_t pkginfo_int_prop_map[] = {
64         {E_PMINFO_PKGINFO_PROP_PACKAGE_SIZE,    PMINFO_PKGINFO_PROP_PACKAGE_SIZE}
65 };
66
67 struct _pkginfo_bool_map_t {
68         pkgmgrinfo_pkginfo_filter_prop_bool prop;
69         const char *property;
70 };
71
72 static struct _pkginfo_bool_map_t pkginfo_bool_prop_map[] = {
73         {E_PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE,       PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE},
74         {E_PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD,         PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD},
75         {E_PMINFO_PKGINFO_PROP_PACKAGE_READONLY,        PMINFO_PKGINFO_PROP_PACKAGE_READONLY},
76         {E_PMINFO_PKGINFO_PROP_PACKAGE_UPDATE,          PMINFO_PKGINFO_PROP_PACKAGE_UPDATE},
77         {E_PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING,      PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING},
78         {E_PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING,       PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING},
79         {E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE, PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE},
80         {E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE, PMINFO_PKGINFO_PROP_PACKAGE_DISABLE},
81         {E_PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE,   PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE},
82         {E_PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM,          PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM}
83 };
84
85 struct _appinfo_str_map_t {
86         pkgmgrinfo_appinfo_filter_prop_str prop;
87         const char *property;
88 };
89
90 static struct _appinfo_str_map_t appinfo_str_prop_map[] = {
91         {E_PMINFO_APPINFO_PROP_APP_ID,          PMINFO_APPINFO_PROP_APP_ID},
92         {E_PMINFO_APPINFO_PROP_APP_COMPONENT,   PMINFO_APPINFO_PROP_APP_COMPONENT},
93         {E_PMINFO_APPINFO_PROP_APP_EXEC,        PMINFO_APPINFO_PROP_APP_EXEC},
94         {E_PMINFO_APPINFO_PROP_APP_ICON,        PMINFO_APPINFO_PROP_APP_ICON},
95         {E_PMINFO_APPINFO_PROP_APP_TYPE,        PMINFO_APPINFO_PROP_APP_TYPE},
96         {E_PMINFO_APPINFO_PROP_APP_OPERATION,   PMINFO_APPINFO_PROP_APP_OPERATION},
97         {E_PMINFO_APPINFO_PROP_APP_URI, PMINFO_APPINFO_PROP_APP_URI},
98         {E_PMINFO_APPINFO_PROP_APP_MIME,        PMINFO_APPINFO_PROP_APP_MIME},
99         {E_PMINFO_APPINFO_PROP_APP_CATEGORY,    PMINFO_APPINFO_PROP_APP_CATEGORY},
100         {E_PMINFO_APPINFO_PROP_APP_HWACCELERATION,      PMINFO_APPINFO_PROP_APP_HWACCELERATION},
101         {E_PMINFO_APPINFO_PROP_APP_SCREENREADER,        PMINFO_APPINFO_PROP_APP_SCREENREADER},
102         {E_PMINFO_APPINFO_PROP_APP_PACKAGE,     PMINFO_APPINFO_PROP_APP_PACKAGE},
103         {E_PMINFO_APPINFO_PROP_APP_INSTALLED_STORAGE,   PMINFO_APPINFO_PROP_APP_INSTALLED_STORAGE}
104 };
105
106 struct _appinfo_int_map_t {
107         pkgmgrinfo_appinfo_filter_prop_int prop;
108         const char *property;
109 };
110
111 static struct _appinfo_int_map_t appinfo_int_prop_map[] = {
112         {E_PMINFO_APPINFO_PROP_APP_SUPPORT_MODE,        PMINFO_APPINFO_PROP_APP_SUPPORT_MODE}
113 };
114
115 struct _appinfo_bool_map_t {
116         pkgmgrinfo_appinfo_filter_prop_bool prop;
117         const char *property;
118 };
119
120 static struct _appinfo_bool_map_t appinfo_bool_prop_map[] = {
121         {E_PMINFO_APPINFO_PROP_APP_NODISPLAY,           PMINFO_APPINFO_PROP_APP_NODISPLAY},
122         {E_PMINFO_APPINFO_PROP_APP_MULTIPLE,            PMINFO_APPINFO_PROP_APP_MULTIPLE},
123         {E_PMINFO_APPINFO_PROP_APP_ONBOOT,              PMINFO_APPINFO_PROP_APP_ONBOOT},
124         {E_PMINFO_APPINFO_PROP_APP_AUTORESTART,         PMINFO_APPINFO_PROP_APP_AUTORESTART},
125         {E_PMINFO_APPINFO_PROP_APP_TASKMANAGE,          PMINFO_APPINFO_PROP_APP_TASKMANAGE},
126         {E_PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION,             PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION},
127         {E_PMINFO_APPINFO_PROP_APP_UI_GADGET,           PMINFO_APPINFO_PROP_APP_UI_GADGET},
128         {E_PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE,             PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE},
129         {E_PMINFO_APPINFO_PROP_APP_DISABLE,             PMINFO_APPINFO_PROP_APP_DISABLE},
130         {E_PMINFO_APPINFO_PROP_APP_CHECK_STORAGE,               PMINFO_APPINFO_PROP_APP_CHECK_STORAGE},
131         {E_PMINFO_APPINFO_PROP_PKG_DISABLE,             PMINFO_APPINFO_PROP_PKG_DISABLE}
132 };
133
134 inline pkgmgrinfo_pkginfo_filter_prop_str _pminfo_pkginfo_convert_to_prop_str(const char *property)
135 {
136         int i = 0;
137         int max = 0;
138         pkgmgrinfo_pkginfo_filter_prop_str prop = -1;
139
140         if (property == NULL)
141                 return -1;
142         max = E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_STR - E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR + 1;
143         for (i = 0 ; i < max; i++) {
144                 if (strcmp(property, pkginfo_str_prop_map[i].property) == 0) {
145                         prop =  pkginfo_str_prop_map[i].prop;
146                         break;
147                 }
148         }
149         return prop;
150 }
151
152 inline pkgmgrinfo_pkginfo_filter_prop_int _pminfo_pkginfo_convert_to_prop_int(const char *property)
153 {
154         int i = 0;
155         int max = 0;
156         pkgmgrinfo_pkginfo_filter_prop_int prop = -1;
157
158         if (property == NULL)
159                 return -1;
160         max = E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_INT - E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_INT + 1;
161         for (i = 0 ; i < max; i++) {
162                 if (strcmp(property, pkginfo_int_prop_map[i].property) == 0) {
163                         prop =  pkginfo_int_prop_map[i].prop;
164                         break;
165                 }
166         }
167         return prop;
168 }
169
170 inline pkgmgrinfo_pkginfo_filter_prop_bool _pminfo_pkginfo_convert_to_prop_bool(const char *property)
171 {
172         int i = 0;
173         int max = 0;
174         pkgmgrinfo_pkginfo_filter_prop_bool prop = -1;
175
176         if (property == NULL)
177                 return -1;
178         max = E_PMINFO_PKGINFO_PROP_PACKAGE_MAX_BOOL - E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_BOOL + 1;
179         for (i = 0 ; i < max; i++) {
180                 if (strcmp(property, pkginfo_bool_prop_map[i].property) == 0) {
181                         prop =  pkginfo_bool_prop_map[i].prop;
182                         break;
183                 }
184         }
185         return prop;
186 }
187
188 inline pkgmgrinfo_appinfo_filter_prop_str _pminfo_appinfo_convert_to_prop_str(const char *property)
189 {
190         int i = 0;
191         int max = 0;
192         pkgmgrinfo_appinfo_filter_prop_str prop = -1;
193
194         if (property == NULL)
195                 return -1;
196         max = E_PMINFO_APPINFO_PROP_APP_MAX_STR - E_PMINFO_APPINFO_PROP_APP_MIN_STR + 1;
197         for (i = 0 ; i < max; i++) {
198                 if (strcmp(property, appinfo_str_prop_map[i].property) == 0) {
199                         prop =  appinfo_str_prop_map[i].prop;
200                         break;
201                 }
202         }
203         return prop;
204 }
205
206 inline pkgmgrinfo_appinfo_filter_prop_int _pminfo_appinfo_convert_to_prop_int(const char *property)
207 {
208         int i = 0;
209         int max = 0;
210         pkgmgrinfo_appinfo_filter_prop_int prop = -1;
211
212         if (property == NULL)
213                 return -1;
214         max = E_PMINFO_APPINFO_PROP_APP_MAX_INT - E_PMINFO_APPINFO_PROP_APP_MIN_INT + 1;
215         for (i = 0 ; i < max; i++) {
216                 if (strcmp(property, appinfo_int_prop_map[i].property) == 0) {
217                         prop =  appinfo_int_prop_map[i].prop;
218                         break;
219                 }
220         }
221         return prop;
222 }
223
224 inline pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool(const char *property)
225 {
226         int i = 0;
227         int max = 0;
228         pkgmgrinfo_appinfo_filter_prop_bool prop = -1;
229
230         if (property == NULL)
231                 return -1;
232         max = E_PMINFO_APPINFO_PROP_APP_MAX_BOOL - E_PMINFO_APPINFO_PROP_APP_MIN_BOOL + 1;
233         for (i = 0 ; i < max; i++) {
234                 if (strcmp(property, appinfo_bool_prop_map[i].property) == 0) {
235                         prop =  appinfo_bool_prop_map[i].prop;
236                         break;
237                 }
238         }
239         return prop;
240 }
241
242 int __get_filter_condition(gpointer data, uid_t uid, char **condition, GList **params)
243 {
244         pkgmgrinfo_node_x *node = (pkgmgrinfo_node_x *)data;
245         char buf[MAX_QUERY_LEN] = {'\0'};
246         int flag = 0;
247         char *value;
248         char *ptr = NULL;
249         char *saveptr = NULL;
250
251         switch (node->prop) {
252         case E_PMINFO_PKGINFO_PROP_PACKAGE_ID:
253                 snprintf(buf, sizeof(buf), "pi.package=?");
254                 break;
255         case E_PMINFO_PKGINFO_PROP_PACKAGE_TYPE:
256                 snprintf(buf, sizeof(buf), "pi.package_type=?");
257                 break;
258         case E_PMINFO_PKGINFO_PROP_PACKAGE_VERSION:
259                 snprintf(buf, sizeof(buf), "pi.package_version=?");
260                 break;
261         case E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALL_LOCATION:
262                 snprintf(buf, sizeof(buf), "pi.install_location=?");
263                 break;
264         case E_PMINFO_PKGINFO_PROP_PACKAGE_INSTALLED_STORAGE:
265                 snprintf(buf, sizeof(buf), "pi.installed_storage=?");
266                 break;
267         case E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_NAME:
268                 snprintf(buf, sizeof(buf), "pi.author_name=?");
269                 break;
270         case E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_HREF:
271                 snprintf(buf, sizeof(buf), "pi.author_href=?");
272                 break;
273         case E_PMINFO_PKGINFO_PROP_PACKAGE_AUTHOR_EMAIL:
274                 snprintf(buf, sizeof(buf), "pi.author_email=?");
275                 break;
276         case E_PMINFO_PKGINFO_PROP_PACKAGE_PRIVILEGE:
277                 snprintf(buf, sizeof(buf), "package_privilege_info.privilege=?");
278                 flag = E_PMINFO_PKGINFO_JOIN_PRIVILEGE_INFO;
279                 break;
280         case E_PMINFO_PKGINFO_PROP_PACKAGE_SIZE:
281                 snprintf(buf, sizeof(buf), "pi.package_size=?");
282                 break;
283         case E_PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE:
284                 snprintf(buf, sizeof(buf), "pi.package_removable=? COLLATE NOCASE");
285                 break;
286         case E_PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD:
287                 snprintf(buf, sizeof(buf), "pi.package_preload=? COLLATE NOCASE");
288                 break;
289         case E_PMINFO_PKGINFO_PROP_PACKAGE_READONLY:
290                 snprintf(buf, sizeof(buf), "pi.package_readonly=? COLLATE NOCASE");
291                 break;
292         case E_PMINFO_PKGINFO_PROP_PACKAGE_UPDATE:
293                 snprintf(buf, sizeof(buf), "pi.package_update=? COLLATE NOCASE");
294                 break;
295         case E_PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING:
296                 snprintf(buf, sizeof(buf), "pi.package_appsetting=? COLLATE NOCASE");
297                 break;
298         case E_PMINFO_PKGINFO_PROP_PACKAGE_NODISPLAY_SETTING:
299                 snprintf(buf, sizeof(buf), "pi.package_nodisplay=? COLLATE NOCASE");
300                 break;
301         case E_PMINFO_PKGINFO_PROP_PACKAGE_SUPPORT_DISABLE:
302                 snprintf(buf, sizeof(buf), "pi.package_support_disable=? COLLATE NOCASE");
303                 break;
304         case E_PMINFO_PKGINFO_PROP_PACKAGE_DISABLE:
305                 snprintf(buf, sizeof(buf), "pi.package_disable=? COLLATE NOCASE");
306                 break;
307         case E_PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM:
308                 snprintf(buf, sizeof(buf), "pi.package_system=? COLLATE NOCASE");
309                 break;
310
311         case E_PMINFO_APPINFO_PROP_APP_ID:
312                 snprintf(buf, sizeof(buf), "ai.app_id=?");
313                 break;
314         case E_PMINFO_APPINFO_PROP_APP_COMPONENT:
315                 snprintf(buf, sizeof(buf), "ai.app_component=?");
316                 break;
317         case E_PMINFO_APPINFO_PROP_APP_EXEC:
318                 snprintf(buf, sizeof(buf), "ai.app_exec=?");
319                 break;
320         case E_PMINFO_APPINFO_PROP_APP_ICON:
321                 snprintf(buf, sizeof(buf), "package_app_localized_info.app_icon=?");
322                 flag = E_PMINFO_APPINFO_JOIN_LOCALIZED_INFO;
323                 break;
324         case E_PMINFO_APPINFO_PROP_APP_TYPE:
325                 snprintf(buf, sizeof(buf), "ai.app_type=?");
326                 break;
327         case E_PMINFO_APPINFO_PROP_APP_OPERATION:
328                 snprintf(buf, sizeof(buf), "package_app_app_control.app_control LIKE ?||'|%%%%|%%%%'");
329                 flag = E_PMINFO_APPINFO_JOIN_APP_CONTROL;
330                 break;
331         case E_PMINFO_APPINFO_PROP_APP_URI:
332                 snprintf(buf, sizeof(buf), "package_app_app_control.app_control LIKE '%%%%|'||?||'|%%%%'");
333                 flag = E_PMINFO_APPINFO_JOIN_APP_CONTROL;
334                 break;
335         case E_PMINFO_APPINFO_PROP_APP_MIME:
336                 snprintf(buf, sizeof(buf), "package_app_app_control.app_control LIKE '%%%%|%%%%|'||?");
337                 flag = E_PMINFO_APPINFO_JOIN_APP_CONTROL;
338                 break;
339         case E_PMINFO_APPINFO_PROP_APP_CATEGORY:
340                 snprintf(buf, sizeof(buf), "package_app_app_category.category IN (");
341                 value = strdup(node->value);
342                 if (value == NULL) {
343                         _LOGE("out of memeory");
344                         return 0;
345                 }
346                 ptr = strtok_r(value, ",", &saveptr);
347                 if (ptr == NULL) {
348                         free(value);
349                         return 0;
350                 }
351                 strncat(buf, "?", sizeof(buf) - strlen(buf) - 1);
352                 *params = g_list_append(*params, strdup(ptr));
353                 while ((ptr = strtok_r(NULL, ",", &saveptr))) {
354                         strncat(buf, ", ?", sizeof(buf) - strlen(buf) - 1);
355                         *params = g_list_append(*params, strdup(ptr));
356                 }
357                 strncat(buf, ")", sizeof(buf) - strlen(buf) - 1);
358                 *condition = strdup(buf);
359                 flag = E_PMINFO_APPINFO_JOIN_CATEGORY;
360                 free(value);
361
362                 return flag;
363         case E_PMINFO_APPINFO_PROP_APP_NODISPLAY:
364                 snprintf(buf, sizeof(buf), "ai.app_nodisplay=? COLLATE NOCASE");
365                 break;
366         case E_PMINFO_APPINFO_PROP_APP_MULTIPLE:
367                 snprintf(buf, sizeof(buf), "ai.app_multiple=? COLLATE NOCASE");
368                 break;
369         case E_PMINFO_APPINFO_PROP_APP_ONBOOT:
370                 snprintf(buf, sizeof(buf), "ai.app_onboot=? COLLATE NOCASE");
371                 break;
372         case E_PMINFO_APPINFO_PROP_APP_AUTORESTART:
373                 snprintf(buf, sizeof(buf), "ai.app_autorestart=? COLLATE NOCASE");
374                 break;
375         case E_PMINFO_APPINFO_PROP_APP_TASKMANAGE:
376                 snprintf(buf, sizeof(buf), "ai.app_taskmanage=? COLLATE NOCASE");
377                 break;
378         case E_PMINFO_APPINFO_PROP_APP_HWACCELERATION:
379                 snprintf(buf, sizeof(buf), "ai.app_hwacceleration=?");
380                 break;
381         case E_PMINFO_APPINFO_PROP_APP_SCREENREADER:
382                 snprintf(buf, sizeof(buf), "ai.app_screenreader=?");
383                 break;
384         case E_PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION:
385                 snprintf(buf, sizeof(buf), "ai.app_launchcondition=? COLLATE NOCASE");
386                 break;
387         case E_PMINFO_APPINFO_PROP_APP_PACKAGE:
388                 snprintf(buf, sizeof(buf), "ai.package=?");
389                 break;
390         case E_PMINFO_APPINFO_PROP_APP_INSTALLED_STORAGE:
391                 snprintf(buf, sizeof(buf), "ai.app_installed_storage=?");
392                 break;
393         case E_PMINFO_APPINFO_PROP_APP_UI_GADGET:
394                 snprintf(buf, sizeof(buf), "ai.app_ui_gadget=? COLLATE NOCASE");
395                 break;
396         case E_PMINFO_APPINFO_PROP_APP_DISABLE:
397                 if (strcasecmp(node->value, "true") == 0)
398                         snprintf(buf, MAX_QUERY_LEN, "(ai.app_disable=? COLLATE NOCASE " \
399                                         "OR ui.is_disabled='true' COLLATE NOCASE)");
400                 else
401                         snprintf(buf, MAX_QUERY_LEN, "(ai.app_disable=? COLLATE NOCASE " \
402                                         "AND (ui.is_disabled='false' COLLATE NOCASE " \
403                                         "OR ui.is_disabled IS NULL))");
404                 break;
405         case E_PMINFO_APPINFO_PROP_APP_SUPPORT_DISABLE:
406                 snprintf(buf, MAX_QUERY_LEN, "ai.app_support_disable=? COLLATE NOCASE");
407                 break;
408         case E_PMINFO_APPINFO_PROP_PKG_DISABLE:
409                 snprintf(buf, MAX_QUERY_LEN,
410                                 "ai.package IN (SELECT package FROM " \
411                                 "package_info WHERE package_disable=?)");
412                 break;
413         case E_PMINFO_APPINFO_PROP_APP_SUPPORT_MODE:
414                 snprintf(buf, sizeof(buf), "ai.app_support_mode=?");
415                 break;
416         case E_PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE:
417         case E_PMINFO_APPINFO_PROP_APP_CHECK_STORAGE:
418                 *condition = NULL;
419                 return 0;
420         default:
421                 _LOGE("Invalid Property Type\n");
422                 *condition = NULL;
423                 return 0;
424         }
425         *condition = strdup(buf);
426         *params = g_list_append(*params, strdup(node->value));
427         return flag;
428 }
429
430 int __get_metadata_filter_condition(gpointer data, char **condition,
431                 GList **params)
432 {
433         pkgmgrinfo_metadata_node_x *node = (pkgmgrinfo_metadata_node_x *)data;
434         char buf[MAX_QUERY_LEN];
435
436         snprintf(buf, sizeof(buf), "(package_app_app_metadata.md_key=?");
437         if (node->value)
438                 strncat(buf, " AND package_app_app_metadata.md_value=?",
439                                 sizeof(buf) - strlen(buf) - 1);
440         strncat(buf, ")", sizeof(buf) - strlen(buf) - 1);
441
442         *condition = strdup(buf);
443         *params = g_list_append(*params, strdup(node->key));
444         if (node->value)
445                 *params = g_list_append(*params, strdup(node->value));
446
447         return E_PMINFO_APPINFO_JOIN_METADATA;
448 }
449
450 int _add_icon_info_into_list(const char *locale, char *value, GList **icon)
451 {
452         icon_x *info;
453
454         info = calloc(1, sizeof(icon_x));
455         if (info == NULL) {
456                 LOGE("out of memory");
457                 return PMINFO_R_ERROR;
458         }
459         info->text = value;
460         info->lang = strdup(locale);
461         *icon = g_list_append(*icon, info);
462
463         return PMINFO_R_OK;
464 }
465
466 int _add_label_info_into_list(const char *locale, char *value, GList **label)
467 {
468         label_x *info;
469
470         info = calloc(1, sizeof(label_x));
471         if (info == NULL) {
472                 LOGE("out of memory");
473                 return PMINFO_R_ERROR;
474         }
475         info->text = value;
476         info->lang = strdup(locale);
477         *label = g_list_append(*label, info);
478
479         return PMINFO_R_OK;
480 }
481
482 char *_get_system_locale(void)
483 {
484         char *lang;
485         char *locale;
486
487         lang = vconf_get_str(VCONFKEY_LANGSET);
488         if (lang == NULL) {
489                 locale = strdup(DEFAULT_LOCALE);
490                 if (locale == NULL) {
491                         LOGE("out of memory");
492                         return NULL;
493                 }
494                 return locale;
495         }
496
497         locale = malloc(sizeof(char) * 6);
498         if (locale == NULL) {
499                 LOGE("out of memory");
500                 free(lang);
501                 return NULL;
502         }
503
504         strncpy(locale, lang, 2);
505         locale[2] = '-';
506         locale[3] = tolower(lang[3]);
507         locale[4] = tolower(lang[4]);
508         locale[5] = '\0';
509
510         free(lang);
511
512         return locale;
513 }
514
515 int __pkginfo_check_installed_storage(package_x *pkginfo)
516 {
517         char buf[MAX_QUERY_LEN] = {'\0'};
518         int ret;
519
520         retvm_if(pkginfo->package == NULL, PMINFO_R_OK, "pkgid is NULL\n");
521         retvm_if(pkginfo->installed_storage == NULL, PMINFO_R_ERROR,
522                         "installed_storage is NULL\n");
523
524         if (strcmp(pkginfo->installed_storage, "installed_external") == 0) {
525                 snprintf(buf, MAX_QUERY_LEN - 1, "%s", pkginfo->external_path);
526                 ret = access(buf, R_OK);
527                 if (ret != 0) {
528                         _LOGE("can not access [%s] - %d", buf, ret);
529                         return PMINFO_R_ERROR;
530                 }
531         }
532
533         return PMINFO_R_OK;
534 }
535
536 int __appinfo_check_installed_storage(application_x *appinfo)
537 {
538         retvm_if(appinfo->installed_storage == NULL, PMINFO_R_ERROR,
539                         "installed_storage is NULL\n");
540
541         if (strcmp(appinfo->installed_storage, "installed_external") == 0) {
542                 retvm_if(appinfo->external_path == NULL, PMINFO_R_ERROR,
543                                 "external path is NULL\n");
544                 if (access(appinfo->external_path, R_OK) != 0) {
545                         _LOGE("can not access [%s]", appinfo->external_path);
546                         return PMINFO_R_ERROR;
547                 }
548         }
549
550         return PMINFO_R_OK;
551 }
552
553 #define BUSY_WAITING_USEC (1000000 / 10 / 2) /* 0.05 sec */
554 #define BUSY_WAITING_MAX 20 /* wait for max 1 sec */
555 static int __db_busy_handler(void *data, int count)
556 {
557         if (count < BUSY_WAITING_MAX) {
558                 usleep(BUSY_WAITING_USEC);
559                 return 1;
560         } else {
561                 /* sqlite3_prepare_v2 will return SQLITE_BUSY */
562                 return 0;
563         }
564 }
565
566 int __open_db(const char *path, sqlite3 **db, int flags)
567 {
568         int ret;
569
570         ret = sqlite3_open_v2(path, db, flags, NULL);
571         if (ret != SQLITE_OK)
572                 return ret;
573
574         ret = sqlite3_busy_handler(*db, __db_busy_handler, NULL);
575         if (ret != SQLITE_OK) {
576                 _LOGE("failed to register busy handler: %s",
577                                 sqlite3_errmsg(*db));
578                 sqlite3_close_v2(*db);
579                 return ret;
580         }
581
582         return ret;
583 }
584
585 struct type_map {
586         const char *manifest;
587         const char *type;
588 };
589
590 struct type_map type_map[] = {
591         { "res/wgt/config.xml", "wgt" },
592         { "config.xml", "wgt" },
593         { "tizen-manifest.xml", "tpk" },
594         { NULL, NULL}
595 };
596
597 char *__get_type_from_path(const char *pkg_path)
598 {
599         const char *type = NULL;
600         unzFile uf;
601         int i;
602
603         uf = unzOpen(pkg_path);
604         if (uf == NULL) {
605                 _LOGE("failed to open zip file %s", pkg_path);
606                 return NULL;
607         }
608
609         for (i = 0; type_map[i].manifest != NULL; i++) {
610                 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
611                         _LOGD("pkgtype of %s: [%s]", pkg_path,
612                                         type_map[i].type);
613                         type = type_map[i].type;
614                         break;
615                 }
616         }
617         unzClose(uf);
618
619         if (type == NULL) {
620                 _LOGE("cannot get pkg type of file %s", pkg_path);
621                 return NULL;
622         }
623
624         return strdup(type);
625 }
626
627 static const char *__get_library_path(const char *pkg_type)
628 {
629         char buf[64];
630         const char *path;
631
632         snprintf(buf, sizeof(buf), "package-manager/backendlib/lib%s.so",
633                         pkg_type);
634         path = tzplatform_mkpath(TZ_SYS_RO_ETC, buf);
635
636         return path;
637 }
638
639 pkg_plugin_set *__load_library(const char *pkg_type)
640 {
641         void *library_handle;
642         pkg_plugin_set *plugin_set;
643         bool (*on_load)(pkg_plugin_set *plugin);
644         const char *library_path;
645
646         library_path = __get_library_path(pkg_type);
647         if (library_path == NULL) {
648                 _LOGE("cannot get library path for %s", pkg_type);
649                 return NULL;
650         }
651
652         if (plugin_set_list == NULL) {
653                 plugin_set_list = g_hash_table_new_full(g_str_hash,
654                                 g_str_equal, free, free);
655                 if (plugin_set_list == NULL) {
656                         _LOGE("out of memory");
657                         return NULL;
658                 }
659         }
660
661         plugin_set = (pkg_plugin_set *)g_hash_table_lookup(plugin_set_list,
662                         (gconstpointer)pkg_type);
663         if (plugin_set) {
664                 _LOGD("already loaded [%s]", library_path);
665                 return plugin_set;
666         }
667
668         if ((library_handle = dlopen(library_path, RTLD_LAZY)) == NULL) {
669                 _LOGE("dlopen is failed library_path[%s]", library_path);
670                 return NULL;
671         }
672
673         if ((on_load = dlsym(library_handle, "pkg_plugin_on_load")) == NULL ||
674                         dlerror() != NULL) {
675                 _LOGE("cannot find symbol");
676                 dlclose(library_handle);
677                 return NULL;
678         }
679
680         plugin_set = (pkg_plugin_set *)calloc(1, sizeof(pkg_plugin_set));
681         if (plugin_set == NULL) {
682                 _LOGE("out of memory");
683                 dlclose(library_handle);
684                 return NULL;
685         }
686
687         if (on_load(plugin_set) != 0) {
688                 _LOGE("pkg_plugin_on_load failed");
689                 free(plugin_set);
690                 dlclose(library_handle);
691                 plugin_set = NULL;
692                 return NULL;
693         }
694
695         plugin_set->plugin_handle = library_handle;
696         snprintf(plugin_set->pkg_type,
697                         sizeof(plugin_set->pkg_type), "%s", pkg_type);
698
699         g_hash_table_insert(plugin_set_list, (gpointer)strdup(pkg_type),
700                         (gpointer)plugin_set);
701
702         _LOGD("library [%s] is loaded", library_path);
703
704         return plugin_set;
705 }
706
707 void __unload_library(const char *pkg_type)
708 {
709         pkg_plugin_set *plugin_set;
710
711         if (plugin_set_list == NULL)
712                 return;
713
714         plugin_set = (pkg_plugin_set *)g_hash_table_lookup(plugin_set_list,
715                         (gconstpointer)pkg_type);
716
717         if (plugin_set == NULL) {
718                 _LOGE("pkg plugin for %s is not loaded", pkg_type);
719                 return;
720         }
721
722         plugin_set->plugin_on_unload();
723         dlclose(plugin_set->plugin_handle);
724         g_hash_table_remove(plugin_set_list, (gconstpointer)pkg_type);
725 }