4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
30 #include <sys/types.h>
37 #include "ail_private.h"
42 #define OPT_DESKTOP_DIRECTORY "/opt/share/applications"
43 #define USR_DESKTOP_DIRECTORY "/usr/share/applications"
46 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
47 #define argsdelimiter " \t"
58 ail_error_e (*value_cb)(void *data, char *tag, char *value);
61 inline static char *_ltrim(char *str)
63 if (!str) return NULL;
65 while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
72 inline static int _rtrim(char *str)
77 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
97 char* x_slp_packagetype;
98 char* x_slp_packagecategories;
99 char* x_slp_packageid;
102 char* x_slp_exe_path;
106 int x_slp_baselayoutwidth;
107 int x_slp_installedtime;
109 int x_slp_taskmanage;
112 int x_slp_ishorizontalscale;
120 static ail_error_e _read_exec(void *data, char *tag, char *value)
122 desktop_info_s *info = data;
123 char *token_exe_path;
127 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
128 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
130 SAFE_FREE_AND_STRDUP(value, info->exec);
131 retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
133 temp_exec = strdup(value);
136 return AIL_ERROR_OUT_OF_MEMORY;
139 token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
141 info->x_slp_exe_path = strdup(token_exe_path);
142 if(!info->x_slp_exe_path) {
146 return AIL_ERROR_OUT_OF_MEMORY;
156 static ail_error_e _read_name(void *data, char *tag, char *value)
158 desktop_info_s *info = data;
160 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
161 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
162 retv_if(0 == strlen(value), AIL_ERROR_FAIL);
164 if (tag && strlen(tag) > 0) {
165 struct name_item *item;
166 item = (struct name_item *)calloc(1, sizeof(struct name_item));
167 retv_if (NULL == item, AIL_ERROR_OUT_OF_MEMORY);
169 SAFE_FREE_AND_STRDUP(tag, item->locale);
170 if(NULL == item->locale) {
171 _E("(NULL == item->locale) return\n");
173 return AIL_ERROR_OUT_OF_MEMORY;
176 SAFE_FREE_AND_STRDUP(value, item->name);
177 if(NULL == item->name) {
178 _E("(NULL == item->name) return\n");
181 return AIL_ERROR_OUT_OF_MEMORY;
184 info->localname = g_slist_append(info->localname, item);
188 SAFE_FREE_AND_STRDUP(value, info->name);
189 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
197 static ail_error_e _read_type(void *data, char *tag, char *value)
199 desktop_info_s *info = data;
201 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
202 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
204 SAFE_FREE_AND_STRDUP(value, info->type);
205 retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
212 _get_package_from_icon(char* icon)
217 retv_if(!icon, NULL);
219 package = strdup(icon);
220 retv_if(!package, NULL);
221 extension = rindex(package, '.');
225 _E("cannot extract from icon [%s] to package.", icon);
233 _get_icon_with_path(char* icon)
235 retv_if(!icon, NULL);
237 if (index(icon, '/') == NULL) {
240 char* icon_with_path = NULL;
243 package = _get_package_from_icon(icon);
244 retv_if(!package, NULL);
246 theme = vconf_get_str("db/setting/theme");
248 theme = strdup("default");
255 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
256 icon_with_path = malloc(len);
257 if(icon_with_path == NULL) {
258 _E("(icon_with_path == NULL) return\n");
264 memset(icon_with_path, 0, len);
266 sqlite3_snprintf( len, icon_with_path,"/opt/share/icons/%q/small/%q", theme, icon);
268 if (access(icon_with_path, R_OK) == 0) break;
269 sqlite3_snprintf( len, icon_with_path,"/usr/share/icons/%q/small/%q", theme, icon);
270 if (access(icon_with_path, R_OK) == 0) break;
271 _D("cannot find icon %s", icon_with_path);
272 sqlite3_snprintf( len, icon_with_path, "/opt/share/icons/default/small/%q", icon);
273 if (access(icon_with_path, R_OK) == 0) break;
274 sqlite3_snprintf( len, icon_with_path, "/usr/share/icons/default/small/%q", icon);
275 if (access(icon_with_path, R_OK) == 0) break;
277 #if 1 /* this will be remove when finish the work for moving icon path */
278 _E("icon file must be moved to %s", icon_with_path);
279 sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/%q/small/%q", package, theme, icon);
280 if (access(icon_with_path, R_OK) == 0) break;
281 sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/%q/small/%q", package, theme, icon);
282 if (access(icon_with_path, R_OK) == 0) break;
283 _D("cannot find icon %s", icon_with_path);
284 sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/default/small/%q", package, icon);
285 if (access(icon_with_path, R_OK) == 0) break;
286 sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/default/small/%q", package, icon);
287 if (access(icon_with_path, R_OK) == 0) break;
294 _D("Icon path : %s ---> %s", icon, icon_with_path);
296 return icon_with_path;
298 char* confirmed_icon = NULL;
300 confirmed_icon = strdup(icon);
301 retv_if(!confirmed_icon, NULL);
302 return confirmed_icon;
307 static ail_error_e _read_icon(void *data, char *tag, char *value)
309 desktop_info_s *info = data;
311 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
312 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
314 info->icon = _get_icon_with_path(value);
316 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
323 static ail_error_e _read_categories(void *data, char *tag, char *value)
325 desktop_info_s *info = data;
327 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
328 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
330 SAFE_FREE_AND_STRDUP(value, info->categories);
331 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
338 static ail_error_e _read_version(void *data, char *tag, char *value)
340 desktop_info_s *info = data;
342 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
343 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
345 SAFE_FREE_AND_STRDUP(value, info->version);
346 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
353 static ail_error_e _read_mimetype(void *data, char *tag, char *value)
355 desktop_info_s *info = data;
356 int size, total_len = 0;
357 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
359 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
360 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
361 retv_if(!strlen(value), AIL_ERROR_FAIL);
363 mimes_origin = strdup(value);
364 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
366 size = getpagesize();
367 mimes_changed = calloc(1, size);
368 if(mimes_changed == NULL) {
369 _E("(mimes_changed == NULL) return\n");
371 return AIL_ERROR_OUT_OF_MEMORY;
374 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
376 while (token_unalias) {
378 const char *token_alias;
380 _rtrim(token_unalias);
381 token_unalias = _ltrim(token_unalias);
383 token_alias = xdg_mime_unalias_mime_type(token_unalias);
384 if (!token_alias) continue;
386 token_len = strlen(token_alias);
387 if (total_len + token_len + (1<<1) >= size) {
390 tmp = realloc(mimes_changed, size);
393 return AIL_ERROR_OUT_OF_MEMORY;
398 strncat(mimes_changed, token_alias, size-1);
399 total_len += token_len;
401 token_unalias = strtok_r(NULL, ";", &save_ptr);
403 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
407 SAFE_FREE(info->mimetype);
408 info->mimetype = mimes_changed;
415 static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
417 desktop_info_s* info = data;
419 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
420 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
422 info->nodisplay = !strcasecmp(value, "true");
429 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
431 desktop_info_s *info = data;
433 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
434 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
436 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
437 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
444 static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
446 desktop_info_s *info = data;
448 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
449 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
451 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
452 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
459 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value)
461 desktop_info_s *info = data;
463 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
464 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
466 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
467 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
474 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
476 desktop_info_s *info = data;
478 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
479 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
481 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
482 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
489 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value)
491 desktop_info_s *info = data;
493 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
494 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
496 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
497 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
504 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
506 desktop_info_s *info = data;
508 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
509 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
511 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
512 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
519 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
521 desktop_info_s *info = data;
523 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
524 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
526 info->x_slp_taskmanage = !strcasecmp(value, "true");
533 static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
535 desktop_info_s *info = data;
537 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
538 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
540 info->x_slp_multiple = !strcasecmp(value, "true");
547 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
549 desktop_info_s *info = data;
551 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
552 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
554 info->x_slp_removable = !strcasecmp(value, "true");
560 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
562 desktop_info_s *info = data;
564 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
565 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
567 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
568 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
574 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
576 desktop_info_s *info = data;
578 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
579 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
581 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
582 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
588 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
590 desktop_info_s *info = data;
592 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
593 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
595 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
596 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
602 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value)
604 desktop_info_s *info = data;
606 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
607 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
609 info->x_slp_enabled = !strcasecmp(value, "true");
615 static struct entry_parser entry_parsers[] = {
618 .value_cb = _read_exec,
622 .value_cb = _read_name,
626 .value_cb = _read_type,
630 .value_cb = _read_icon,
633 .field = "categories",
634 .value_cb = _read_categories,
638 .value_cb = _read_version,
642 .value_cb = _read_mimetype,
645 .field = "x-tizen-service",
646 .value_cb = _read_x_slp_service,
649 .field = "x-tizen-packagetype",
650 .value_cb = _read_x_slp_packagetype,
653 .field = "x-tizen-packagecategories",
654 .value_cb = _read_x_slp_packagecategories,
657 .field = "x-tizen-packageid",
658 .value_cb = _read_x_slp_packageid,
661 .field = "x-tizen-uri",
662 .value_cb = _read_x_slp_uri,
665 .field = "x-tizen-svc",
666 .value_cb = _read_x_slp_svc,
669 .field = "nodisplay",
670 .value_cb = _read_nodisplay,
673 .field = "x-tizen-taskmanage",
674 .value_cb = _read_x_slp_taskmanage,
677 .field = "x-tizen-enabled",
678 .value_cb = _read_x_slp_enabled,
681 .field = "x-tizen-multiple",
682 .value_cb = _read_x_slp_multiple,
685 .field = "x-tizen-removable",
686 .value_cb = _read_x_slp_removable,
689 .field = "x-tizen-appid",
690 .value_cb = _read_x_slp_appid,
693 .field = "x-tizen-pkgid",
694 .value_cb = _read_x_slp_pkgid,
697 .field = "x-tizen-domain",
698 .value_cb = _read_x_slp_domain,
701 .field = "x-tizen-enabled",
702 .value_cb = _read_x_slp_domain,
712 /* Utility functions */
713 static int _count_all(void)
718 ret = ail_filter_count_appinfo(NULL, &count);
719 if(ret != AIL_ERROR_OK) {
720 _E("cannot count appinfo");
724 retv_if(ret != AIL_ERROR_OK, -1);
731 char *_pkgname_to_desktop(const char *package)
736 retv_if(!package, NULL);
738 size = strlen(OPT_DESKTOP_DIRECTORY) + strlen(package) + 10;
739 desktop = malloc(size);
740 retv_if(!desktop, NULL);
742 snprintf(desktop, size, OPT_DESKTOP_DIRECTORY"/%s.desktop", package);
744 if (access(desktop, R_OK) == 0)
747 snprintf(desktop, size, USR_DESKTOP_DIRECTORY"/%s.desktop", package);
754 static inline int _strlen_desktop_info(desktop_info_s* info)
758 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
760 if (info->package) len += strlen(info->package);
761 if (info->exec) len += strlen(info->exec);
762 if (info->name) len += strlen(info->name);
763 if (info->type) len += strlen(info->type);
764 if (info->icon) len += strlen(info->icon);
765 if (info->categories) len += strlen(info->categories);
766 if (info->version) len += strlen(info->version);
767 if (info->mimetype) len += strlen(info->mimetype);
768 if (info->x_slp_service) len += strlen(info->x_slp_service);
769 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
770 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
771 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
772 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
773 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
774 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
775 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
776 if (info->desktop) len += strlen(info->desktop);
782 int __is_ail_initdb(void)
784 if( getenv("AIL_INITDB") || getenv("INITDB") )
792 /* Manipulating desktop_info functions */
793 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package)
795 static int is_initdb = -1;
798 is_initdb = __is_ail_initdb();
800 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
801 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
804 info->package = package;
806 info->x_slp_taskmanage = 1;
807 info->x_slp_removable = 1;
810 info->x_slp_installedtime = 0;
812 info->x_slp_installedtime = time(NULL);
815 info->x_slp_packagetype = strdup(PKGTYPE);
817 info->x_slp_packagetype = strdup("rpm");
819 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
821 info->x_slp_packageid = strdup(package);
822 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
823 info->x_slp_appid = strdup(package);
824 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
826 info->x_slp_enabled = 1;
828 info->desktop = _pkgname_to_desktop(package);
829 retv_if(!info->desktop, AIL_ERROR_FAIL);
836 static ail_error_e _read_desktop_info(desktop_info_s* info)
843 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
845 fp = fopen(info->desktop, "r");
846 retv_if(!fp, AIL_ERROR_FAIL);
848 while ((read = getline(&line, &size, fp)) != -1) {
850 char *tmp, *field, *field_name, *tag, *value;
853 if(tmp == NULL) continue;
854 if (*tmp == '#') continue;
855 if (_rtrim(tmp) <= 0) continue;
857 len = strlen(line) + 1;
858 field = calloc(1, len);
859 field_name = calloc(1, len);
860 tag = calloc(1, len);
861 value = calloc(1, len);
863 if (!field || !field_name || !tag || !value) {
867 sscanf(tmp, "%[^=]=%[^\n]", field, value);
871 sscanf(field, "%[^[][%[^]]]", field_name, tag);
873 if (!field_name || !strlen(field_name)){
877 for (idx = 0; entry_parsers[idx].field; idx ++) {
878 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
879 if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
880 _E("field - [%s] is wrong.", field_name);
887 SAFE_FREE(field_name);
892 _D("Read (%s).", info->package);
899 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
906 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
908 values = calloc(NUM_OF_PROP, sizeof(char *));
909 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
911 for (i = 0; i < NUM_OF_PROP; i++) {
912 err = db_column_str(stmt, i, &col);
913 if (AIL_ERROR_OK != err)
919 values[i] = strdup(col);
921 err = AIL_ERROR_OUT_OF_MEMORY;
927 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
928 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
929 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
930 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
931 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
932 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
933 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
934 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
935 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
936 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
937 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
938 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
939 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
940 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
941 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
942 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
943 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
945 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
947 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
948 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
949 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
950 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
951 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
952 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
957 for (j = 0; j < i; ++j) {
967 static ail_error_e _load_desktop_info(desktop_info_s* info)
970 char query[AIL_SQL_QUERY_MAX_LEN];
971 sqlite3_stmt *stmt = NULL;
972 char w[AIL_SQL_QUERY_MAX_LEN];
974 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
976 snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), info->package);
978 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
981 ret = db_open(DB_OPEN_RO);
984 ret = db_prepare(query, &stmt);
993 ret = _retrieve_all_column_to_desktop_info(info, stmt);
999 ret = db_finalize(stmt);
1002 return AIL_ERROR_OK;
1008 static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
1009 const char *property,
1012 ail_prop_bool_e prop;
1015 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1016 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1018 prop = _ail_convert_to_prop_bool(property);
1020 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1021 return AIL_ERROR_INVALID_PARAMETER;
1024 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1025 info->x_slp_enabled = (int)value;
1028 return AIL_ERROR_FAIL;
1031 return AIL_ERROR_OK;
1035 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1036 const char *property,
1039 ail_prop_bool_e prop;
1042 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1043 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1045 prop = _ail_convert_to_prop_str(property);
1047 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1048 return AIL_ERROR_INVALID_PARAMETER;
1051 case E_AIL_PROP_NAME_STR:
1052 SAFE_FREE_AND_STRDUP(value, info->name);
1053 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
1055 case E_AIL_PROP_X_SLP_SVC_STR:
1056 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1057 retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1060 return AIL_ERROR_FAIL;
1063 return AIL_ERROR_OK;
1069 static ail_error_e _create_table(void)
1073 const char *tbls[3] = {
1074 "CREATE TABLE app_info "
1075 "(package TEXT PRIMARY KEY, "
1076 "exec TEXT DEFAULT 'No Exec', "
1077 "name TEXT DEFAULT 'No Name', "
1078 "type TEXT DEFAULT 'Application', "
1079 "icon TEXT DEFAULT 'No Icon', "
1083 "x_slp_service TEXT, "
1084 "x_slp_packagetype TEXT, "
1085 "x_slp_packagecategories TEXT, "
1086 "x_slp_packageid TEXT, "
1089 "x_slp_exe_path TEXT, "
1090 "x_slp_appid TEXT, "
1091 "x_slp_pkgid TEXT, "
1092 "x_slp_domain TEXT, "
1093 "x_slp_baselayoutwidth INTEGER DEFAULT 0, "
1094 "x_slp_installedtime INTEGER DEFAULT 0, "
1095 "nodisplay INTEGER DEFAULT 0, "
1096 "x_slp_taskmanage INTEGER DEFAULT 1, "
1097 "x_slp_multiple INTEGER DEFAULT 0, "
1098 "x_slp_removable INTEGER DEFAULT 1, "
1099 "x_slp_ishorizontalscale INTEGER DEFAULT 0, "
1100 "x_slp_enabled INTEGER DEFAULT 1, "
1101 "desktop TEXT UNIQUE NOT NULL);",
1102 "CREATE TABLE localname (package TEXT NOT NULL, "
1103 "locale TEXT NOT NULL, "
1104 "name TEXT NOT NULL, "
1105 "x_slp_pkgid TEXT NOT NULL, PRIMARY KEY (package, locale));",
1110 ret = db_open(DB_OPEN_RW);
1111 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1113 for (i = 0; tbls[i] != NULL; i++) {
1114 ret = db_exec(tbls[i]);
1115 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1118 return AIL_ERROR_OK;
1122 static inline void _insert_localname(gpointer data, gpointer user_data)
1126 struct name_item *item = (struct name_item *)data;
1127 desktop_info_s *info = (desktop_info_s *)user_data;
1129 snprintf(query, sizeof(query), "insert into localname (package, locale, name, x_slp_pkgid) "
1130 "values ('%s', '%s', '%s', '%s');",
1131 info->package, item->locale, item->name, info->x_slp_pkgid);
1132 if (db_exec(query) < 0)
1133 _E("Failed to insert local name of package[%s]",info->package);
1136 static ail_error_e _insert_desktop_info(desktop_info_s *info)
1142 len = _strlen_desktop_info(info) + (0x01 << 10);
1143 query = calloc(1, len);
1144 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1146 sqlite3_snprintf(len, query, "insert into app_info ("
1155 "x_slp_packagetype, "
1156 "x_slp_packagecategories, "
1164 "x_slp_baselayoutwidth, "
1165 "x_slp_installedtime, "
1167 "x_slp_taskmanage, "
1170 "x_slp_ishorizontalscale, "
1174 "('%q', '%q', '%q', '%q', '%q', "
1175 "'%q', '%q', '%q', '%q', '%q', "
1176 "'%q', '%q', '%q', '%q', '%q', "
1177 "'%q', '%q', '%q', "
1178 "%d, %d, %d, %d, %d, %d, "
1189 info->x_slp_service,
1190 info->x_slp_packagetype,
1191 info->x_slp_packagecategories,
1192 info->x_slp_packageid,
1195 info->x_slp_exe_path,
1199 info->x_slp_baselayoutwidth,
1200 info->x_slp_installedtime,
1202 info->x_slp_taskmanage,
1203 info->x_slp_multiple,
1204 info->x_slp_removable,
1205 info->x_slp_ishorizontalscale,
1206 info->x_slp_enabled,
1210 ret = db_open(DB_OPEN_RW);
1211 if(ret != AIL_ERROR_OK) {
1212 _E("(tmp == NULL) return\n");
1214 return AIL_ERROR_DB_FAILED;
1217 ret = db_exec(query);
1218 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1220 if (info->localname)
1221 g_slist_foreach(info->localname, _insert_localname, info);
1223 _D("Add (%s).", info->package);
1225 return AIL_ERROR_OK;
1230 static ail_error_e _update_desktop_info(desktop_info_s *info)
1235 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1237 if (db_open(DB_OPEN_RW) < 0) {
1238 return AIL_ERROR_DB_FAILED;
1241 len = _strlen_desktop_info(info) + (0x01 << 10);
1242 query = calloc(1, len);
1243 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1245 sqlite3_snprintf ( len, query, "update app_info set "
1253 "x_slp_service='%q', "
1254 "x_slp_packagetype='%q', "
1255 "x_slp_packagecategories='%q', "
1256 "x_slp_packageid='%q', "
1259 "x_slp_exe_path='%q', "
1260 "x_slp_appid='%q', "
1261 "x_slp_pkgid='%q', "
1262 "x_slp_domain='%q', "
1263 "x_slp_baselayoutwidth=%d, "
1264 "x_slp_installedtime=%d, "
1266 "x_slp_taskmanage=%d, "
1267 "x_slp_multiple=%d, "
1268 "x_slp_removable=%d, "
1269 "x_slp_ishorizontalscale=%d, "
1270 "x_slp_enabled=%d, "
1272 "where package='%q'",
1280 info->x_slp_service,
1281 info->x_slp_packagetype,
1282 info->x_slp_packagecategories,
1283 info->x_slp_packageid,
1286 info->x_slp_exe_path,
1290 info->x_slp_baselayoutwidth,
1291 info->x_slp_installedtime,
1293 info->x_slp_taskmanage,
1294 info->x_slp_multiple,
1295 info->x_slp_removable,
1296 info->x_slp_ishorizontalscale,
1297 info->x_slp_enabled,
1301 if (db_exec(query) < 0) {
1303 return AIL_ERROR_DB_FAILED;
1306 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1308 if (db_exec(query) < 0) {
1310 return AIL_ERROR_DB_FAILED;
1313 if (info->localname)
1314 g_slist_foreach(info->localname, _insert_localname, info);
1316 _D("Update (%s).", info->package);
1320 return AIL_ERROR_OK;
1325 static ail_error_e _remove_package(const char* package)
1330 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1332 if (db_open(DB_OPEN_RW) < 0) {
1333 return AIL_ERROR_DB_FAILED;
1336 size = strlen(package) + (0x01 << 10);
1337 query = calloc(1, size);
1338 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1340 snprintf(query, size, "delete from app_info where package = '%s'", package);
1342 if (db_exec(query) < 0) {
1344 return AIL_ERROR_DB_FAILED;
1347 snprintf(query, size, "delete from localname where package = '%s'", package);
1348 _D("query=%s",query);
1350 if (db_exec(query) < 0) {
1352 return AIL_ERROR_DB_FAILED;
1355 _D("Remove (%s).", package);
1358 return AIL_ERROR_OK;
1361 static ail_error_e _clean_pkgid_data(const char* pkgid)
1366 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1368 if (db_open(DB_OPEN_RW) < 0) {
1369 return AIL_ERROR_DB_FAILED;
1372 size = strlen(pkgid) + (0x01 << 10);
1373 query = calloc(1, size);
1374 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1376 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1378 if (db_exec(query) < 0) {
1380 return AIL_ERROR_DB_FAILED;
1383 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1384 _D("query=%s",query);
1386 if (db_exec(query) < 0) {
1388 return AIL_ERROR_DB_FAILED;
1391 _D("Clean pkgid data (%s).", pkgid);
1394 return AIL_ERROR_OK;
1398 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1400 char *type_string, *noti_string;
1403 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1407 type_string = "create";
1410 type_string = "update";
1413 type_string = "delete";
1416 return AIL_ERROR_FAIL;
1419 size = strlen(package) + 8;
1420 noti_string = calloc(1, size);
1421 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1423 snprintf(noti_string, size, "%s:%s", type_string, package);
1424 vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
1425 vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
1426 _D("Noti : %s", noti_string);
1430 return AIL_ERROR_OK;
1434 static void inline _name_item_free_func(gpointer data)
1436 struct name_item *item = (struct name_item *)data;
1438 SAFE_FREE(item->locale);
1439 item->locale = NULL;
1440 SAFE_FREE(item->name);
1446 static void _fini_desktop_info(desktop_info_s *info)
1448 SAFE_FREE(info->exec);
1449 SAFE_FREE(info->name);
1450 SAFE_FREE(info->type);
1451 SAFE_FREE(info->icon);
1452 SAFE_FREE(info->categories);
1453 SAFE_FREE(info->version);
1454 SAFE_FREE(info->mimetype);
1455 SAFE_FREE(info->x_slp_service);
1456 SAFE_FREE(info->x_slp_packagetype);
1457 SAFE_FREE(info->x_slp_packagecategories);
1458 SAFE_FREE(info->x_slp_packageid);
1459 SAFE_FREE(info->x_slp_uri);
1460 SAFE_FREE(info->x_slp_svc);
1461 SAFE_FREE(info->x_slp_exe_path);
1462 SAFE_FREE(info->x_slp_appid);
1463 SAFE_FREE(info->x_slp_pkgid);
1464 SAFE_FREE(info->x_slp_domain);
1465 SAFE_FREE(info->desktop);
1466 if (info->localname) {
1467 g_slist_free_full(info->localname, _name_item_free_func);
1468 info->localname = NULL;
1474 static int __is_authorized()
1476 uid_t uid = getuid();
1477 if ((uid_t) 0 == uid )
1484 /* Public functions */
1485 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1487 desktop_info_s info = {0,};
1491 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1492 if (!__is_authorized()) {
1493 _E("You are not an authorized user on adding!\n");
1497 count = _count_all();
1499 ret = _create_table();
1500 if (ret != AIL_ERROR_OK) {
1501 _D("Cannot create a table. Maybe there is already a table.");
1505 ret = _init_desktop_info(&info, appid);
1506 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1508 ret = _read_desktop_info(&info);
1509 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1511 ret = _insert_desktop_info(&info);
1512 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1514 ret = _send_db_done_noti(NOTI_ADD, appid);
1515 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1517 _fini_desktop_info(&info);
1519 return AIL_ERROR_OK;
1524 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1526 desktop_info_s info = {0,};
1529 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1530 if (!__is_authorized()) {
1531 _E("You are not an authorized user on updating!\n");
1535 ret = _init_desktop_info(&info, appid);
1536 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1538 ret = _read_desktop_info(&info);
1539 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1541 ret = _update_desktop_info(&info);
1542 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1544 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1545 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1547 _fini_desktop_info(&info);
1549 return AIL_ERROR_OK;
1554 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1558 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1559 if (!__is_authorized()) {
1560 _E("You are not an authorized user on removing!\n");
1564 ret = _remove_package(appid);
1565 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1567 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1568 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1570 return AIL_ERROR_OK;
1573 EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid)
1577 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1578 if (!__is_authorized()) {
1579 _E("You are not an authorized user on removing!\n");
1583 _D("ail_desktop_clean=%s",pkgid);
1585 ret = _clean_pkgid_data(pkgid);
1586 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1588 return AIL_ERROR_OK;
1592 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1593 const char *property,
1597 desktop_info_s info = {0,};
1600 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1602 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1603 AIL_ERROR_INVALID_PARAMETER);
1605 ret = _init_desktop_info(&info, appid);
1606 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1608 ret = _load_desktop_info(&info);
1609 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1611 ret = _modify_desktop_info_bool(&info, property, value);
1612 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1614 ret = _update_desktop_info(&info);
1615 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1618 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1619 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1622 _fini_desktop_info(&info);
1624 return AIL_ERROR_OK;
1628 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1629 const char *property,
1633 desktop_info_s info = {0,};
1636 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1638 ret = _init_desktop_info(&info, appid);
1639 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1641 ret = _load_desktop_info(&info);
1642 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1644 _D("info.name [%s], value [%s]", info.name, value);
1645 ret = _modify_desktop_info_str(&info, property, value);
1646 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1647 _D("info.name [%s], value [%s]", info.name, value);
1649 ret = _update_desktop_info(&info);
1650 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1653 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1654 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1657 _fini_desktop_info(&info);
1659 return AIL_ERROR_OK;