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"
41 #define OPT_DESKTOP_DIRECTORY "/opt/share/applications"
42 #define USR_DESKTOP_DIRECTORY "/usr/share/applications"
45 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
46 #define argsdelimiter " \t"
57 ail_error_e (*value_cb)(void *data, char *tag, char *value);
60 inline static char *_ltrim(char *str)
62 if (!str) return NULL;
64 while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
71 inline static int _rtrim(char *str)
76 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
96 char* x_slp_packagetype;
97 char* x_slp_packagecategories;
98 char* x_slp_packageid;
101 char* x_slp_exe_path;
105 int x_slp_baselayoutwidth;
106 int x_slp_installedtime;
108 int x_slp_taskmanage;
111 int x_slp_ishorizontalscale;
112 int x_slp_inactivated;
119 static ail_error_e _read_exec(void *data, char *tag, char *value)
121 desktop_info_s *info = data;
122 char *token_exe_path;
126 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
127 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
129 SAFE_FREE_AND_STRDUP(value, info->exec);
130 retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
132 temp_exec = strdup(value);
135 return AIL_ERROR_OUT_OF_MEMORY;
138 token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
140 info->x_slp_exe_path = strdup(token_exe_path);
141 if(!info->x_slp_exe_path) {
145 return AIL_ERROR_OUT_OF_MEMORY;
155 static ail_error_e _read_name(void *data, char *tag, char *value)
157 desktop_info_s *info = data;
159 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
160 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
161 retv_if(0 == strlen(value), AIL_ERROR_FAIL);
163 if (tag && strlen(tag) > 0) {
164 struct name_item *item;
165 item = (struct name_item *)calloc(1, sizeof(struct name_item));
166 retv_if (NULL == item, AIL_ERROR_OUT_OF_MEMORY);
168 SAFE_FREE_AND_STRDUP(tag, item->locale);
169 if(NULL == item->locale) {
170 _E("(NULL == item->locale) return\n");
172 return AIL_ERROR_OUT_OF_MEMORY;
175 SAFE_FREE_AND_STRDUP(value, item->name);
176 if(NULL == item->name) {
177 _E("(NULL == item->name) return\n");
180 return AIL_ERROR_OUT_OF_MEMORY;
183 info->localname = g_slist_append(info->localname, item);
187 SAFE_FREE_AND_STRDUP(value, info->name);
188 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
196 static ail_error_e _read_type(void *data, char *tag, char *value)
198 desktop_info_s *info = data;
200 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
201 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
203 SAFE_FREE_AND_STRDUP(value, info->type);
204 retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
211 _get_package_from_icon(char* icon)
216 retv_if(!icon, NULL);
218 package = strdup(icon);
219 retv_if(!package, NULL);
220 extension = rindex(package, '.');
224 _E("cannot extract from icon [%s] to package.", icon);
232 _get_icon_with_path(char* icon)
234 retv_if(!icon, NULL);
236 if (index(icon, '/') == NULL) {
239 char* icon_with_path = NULL;
242 package = _get_package_from_icon(icon);
243 retv_if(!package, NULL);
245 theme = vconf_get_str("db/setting/theme");
247 theme = strdup("default");
254 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
255 icon_with_path = malloc(len);
256 if(icon_with_path == NULL) {
257 _E("(icon_with_path == NULL) return\n");
263 memset(icon_with_path, 0, len);
265 sqlite3_snprintf( len, icon_with_path,"/opt/share/icons/%q/small/%q", theme, icon);
267 if (access(icon_with_path, R_OK) == 0) break;
268 sqlite3_snprintf( len, icon_with_path,"/usr/share/icons/%q/small/%q", theme, icon);
269 if (access(icon_with_path, R_OK) == 0) break;
270 _D("cannot find icon %s", icon_with_path);
271 sqlite3_snprintf( len, icon_with_path, "/opt/share/icons/default/small/%q", icon);
272 if (access(icon_with_path, R_OK) == 0) break;
273 sqlite3_snprintf( len, icon_with_path, "/usr/share/icons/default/small/%q", icon);
274 if (access(icon_with_path, R_OK) == 0) break;
276 #if 1 /* this will be remove when finish the work for moving icon path */
277 _E("icon file must be moved to %s", icon_with_path);
278 sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/%q/small/%q", package, theme, icon);
279 if (access(icon_with_path, R_OK) == 0) break;
280 sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/%q/small/%q", package, theme, icon);
281 if (access(icon_with_path, R_OK) == 0) break;
282 _D("cannot find icon %s", icon_with_path);
283 sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/default/small/%q", package, icon);
284 if (access(icon_with_path, R_OK) == 0) break;
285 sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/default/small/%q", package, icon);
286 if (access(icon_with_path, R_OK) == 0) break;
293 _D("Icon path : %s ---> %s", icon, icon_with_path);
295 return icon_with_path;
297 char* confirmed_icon = NULL;
299 confirmed_icon = strdup(icon);
300 retv_if(!confirmed_icon, NULL);
301 return confirmed_icon;
306 static ail_error_e _read_icon(void *data, char *tag, char *value)
308 desktop_info_s *info = data;
310 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
311 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
313 info->icon = _get_icon_with_path(value);
315 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
322 static ail_error_e _read_categories(void *data, char *tag, char *value)
324 desktop_info_s *info = data;
326 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
327 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
329 SAFE_FREE_AND_STRDUP(value, info->categories);
330 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
337 static ail_error_e _read_version(void *data, char *tag, char *value)
339 desktop_info_s *info = data;
341 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
342 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
344 SAFE_FREE_AND_STRDUP(value, info->version);
345 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
352 static ail_error_e _read_mimetype(void *data, char *tag, char *value)
354 desktop_info_s *info = data;
355 int size, total_len = 0;
356 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
358 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
359 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
360 retv_if(!strlen(value), AIL_ERROR_FAIL);
362 mimes_origin = strdup(value);
363 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
365 size = getpagesize();
366 mimes_changed = calloc(1, size);
367 if(mimes_changed == NULL) {
368 _E("(mimes_changed == NULL) return\n");
370 return AIL_ERROR_OUT_OF_MEMORY;
373 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
375 while (token_unalias) {
377 const char *token_alias;
379 _rtrim(token_unalias);
380 token_unalias = _ltrim(token_unalias);
382 token_alias = xdg_mime_unalias_mime_type(token_unalias);
383 if (!token_alias) continue;
385 token_len = strlen(token_alias);
386 if (total_len + token_len + (1<<1) >= size) {
389 tmp = realloc(mimes_changed, size);
392 return AIL_ERROR_OUT_OF_MEMORY;
397 strncat(mimes_changed, token_alias, size-1);
398 total_len += token_len;
400 token_unalias = strtok_r(NULL, ";", &save_ptr);
402 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
406 SAFE_FREE(info->mimetype);
407 info->mimetype = mimes_changed;
414 static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
416 desktop_info_s* info = data;
418 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
419 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
421 info->nodisplay = !strcasecmp(value, "true");
428 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
430 desktop_info_s *info = data;
432 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
433 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
435 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
436 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
443 static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
445 desktop_info_s *info = data;
447 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
448 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
450 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
451 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
458 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value)
460 desktop_info_s *info = data;
462 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
463 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
465 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
466 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
473 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
475 desktop_info_s *info = data;
477 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
478 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
480 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
481 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
488 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value)
490 desktop_info_s *info = data;
492 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
493 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
495 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
496 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
503 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
505 desktop_info_s *info = data;
507 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
508 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
510 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
511 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
518 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
520 desktop_info_s *info = data;
522 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
523 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
525 info->x_slp_taskmanage = !strcasecmp(value, "true");
532 static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
534 desktop_info_s *info = data;
536 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
537 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
539 info->x_slp_multiple = !strcasecmp(value, "true");
546 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
548 desktop_info_s *info = data;
550 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
551 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
553 info->x_slp_removable = !strcasecmp(value, "true");
559 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
561 desktop_info_s *info = data;
563 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
564 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
566 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
567 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
573 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
575 desktop_info_s *info = data;
577 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
578 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
580 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
581 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
587 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
589 desktop_info_s *info = data;
591 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
592 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
594 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
595 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
601 static struct entry_parser entry_parsers[] = {
604 .value_cb = _read_exec,
608 .value_cb = _read_name,
612 .value_cb = _read_type,
616 .value_cb = _read_icon,
619 .field = "categories",
620 .value_cb = _read_categories,
624 .value_cb = _read_version,
628 .value_cb = _read_mimetype,
631 .field = "x-tizen-service",
632 .value_cb = _read_x_slp_service,
635 .field = "x-tizen-packagetype",
636 .value_cb = _read_x_slp_packagetype,
639 .field = "x-tizen-packagecategories",
640 .value_cb = _read_x_slp_packagecategories,
643 .field = "x-tizen-packageid",
644 .value_cb = _read_x_slp_packageid,
647 .field = "x-tizen-uri",
648 .value_cb = _read_x_slp_uri,
651 .field = "x-tizen-svc",
652 .value_cb = _read_x_slp_svc,
655 .field = "nodisplay",
656 .value_cb = _read_nodisplay,
659 .field = "x-tizen-taskmanage",
660 .value_cb = _read_x_slp_taskmanage,
663 .field = "x-tizen-multiple",
664 .value_cb = _read_x_slp_multiple,
667 .field = "x-tizen-removable",
668 .value_cb = _read_x_slp_removable,
671 .field = "x-tizen-appid",
672 .value_cb = _read_x_slp_appid,
675 .field = "x-tizen-pkgid",
676 .value_cb = _read_x_slp_pkgid,
679 .field = "x-tizen-domain",
680 .value_cb = _read_x_slp_domain,
690 /* Utility functions */
691 static int _count_all(void)
696 ret = ail_filter_count_appinfo(NULL, &count);
697 if(ret != AIL_ERROR_OK) {
698 _E("cannot count appinfo");
702 retv_if(ret != AIL_ERROR_OK, -1);
709 char *_pkgname_to_desktop(const char *package)
714 retv_if(!package, NULL);
716 size = strlen(OPT_DESKTOP_DIRECTORY) + strlen(package) + 10;
717 desktop = malloc(size);
718 retv_if(!desktop, NULL);
720 snprintf(desktop, size, OPT_DESKTOP_DIRECTORY"/%s.desktop", package);
722 if (access(desktop, R_OK) == 0)
725 snprintf(desktop, size, USR_DESKTOP_DIRECTORY"/%s.desktop", package);
732 static inline int _strlen_desktop_info(desktop_info_s* info)
736 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
738 if (info->package) len += strlen(info->package);
739 if (info->exec) len += strlen(info->exec);
740 if (info->name) len += strlen(info->name);
741 if (info->type) len += strlen(info->type);
742 if (info->icon) len += strlen(info->icon);
743 if (info->categories) len += strlen(info->categories);
744 if (info->version) len += strlen(info->version);
745 if (info->mimetype) len += strlen(info->mimetype);
746 if (info->x_slp_service) len += strlen(info->x_slp_service);
747 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
748 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
749 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
750 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
751 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
752 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
753 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
754 if (info->desktop) len += strlen(info->desktop);
760 int __is_ail_initdb(void)
762 if( getenv("AIL_INITDB") || getenv("INITDB") )
770 /* Manipulating desktop_info functions */
771 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package)
773 static int is_initdb = -1;
776 is_initdb = __is_ail_initdb();
778 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
779 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
782 info->package = package;
784 info->x_slp_taskmanage = 1;
785 info->x_slp_removable = 1;
788 info->x_slp_installedtime = 0;
790 info->x_slp_installedtime = time(NULL);
793 info->x_slp_packagetype = strdup(PKGTYPE);
795 info->x_slp_packagetype = strdup("rpm");
797 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
799 info->x_slp_packageid = strdup(package);
800 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
801 info->x_slp_appid = strdup(package);
802 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
804 info->desktop = _pkgname_to_desktop(package);
805 retv_if(!info->desktop, AIL_ERROR_FAIL);
812 static ail_error_e _read_desktop_info(desktop_info_s* info)
819 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
821 fp = fopen(info->desktop, "r");
822 retv_if(!fp, AIL_ERROR_FAIL);
824 while ((read = getline(&line, &size, fp)) != -1) {
826 char *tmp, *field, *field_name, *tag, *value;
829 if(tmp == NULL) continue;
830 if (*tmp == '#') continue;
831 if (_rtrim(tmp) <= 0) continue;
833 len = strlen(line) + 1;
834 field = calloc(1, len);
835 field_name = calloc(1, len);
836 tag = calloc(1, len);
837 value = calloc(1, len);
839 if (!field || !field_name || !tag || !value) {
843 sscanf(tmp, "%[^=]=%[^\n]", field, value);
847 sscanf(field, "%[^[][%[^]]]", field_name, tag);
849 if (!field_name || !strlen(field_name)){
853 for (idx = 0; entry_parsers[idx].field; idx ++) {
854 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
855 if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
856 _E("field - [%s] is wrong.", field_name);
863 SAFE_FREE(field_name);
868 _D("Read (%s).", info->package);
876 static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
877 const char *property,
880 ail_prop_bool_e prop;
883 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
884 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
886 prop = _ail_convert_to_prop_bool(property);
888 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
889 return AIL_ERROR_INVALID_PARAMETER;
892 case E_AIL_PROP_X_SLP_INACTIVATED_BOOL:
893 info->x_slp_inactivated = (int)value;
896 return AIL_ERROR_FAIL;
904 static ail_error_e _create_table(void)
908 const char *tbls[3] = {
909 "CREATE TABLE app_info "
910 "(package TEXT PRIMARY KEY, "
911 "exec TEXT DEFAULT 'No Exec', "
912 "name TEXT DEFAULT 'No Name', "
913 "type TEXT DEFAULT 'Application', "
914 "icon TEXT DEFAULT 'No Icon', "
918 "x_slp_service TEXT, "
919 "x_slp_packagetype TEXT, "
920 "x_slp_packagecategories TEXT, "
921 "x_slp_packageid TEXT, "
924 "x_slp_exe_path TEXT, "
927 "x_slp_domain TEXT, "
928 "x_slp_baselayoutwidth INTEGER DEFAULT 0, "
929 "x_slp_installedtime INTEGER DEFAULT 0, "
930 "nodisplay INTEGER DEFAULT 0, "
931 "x_slp_taskmanage INTEGER DEFAULT 1, "
932 "x_slp_multiple INTEGER DEFAULT 0, "
933 "x_slp_removable INTEGER DEFAULT 1, "
934 "x_slp_ishorizontalscale INTEGER DEFAULT 0, "
935 "x_slp_inactivated INTEGER DEFAULT 0, "
936 "desktop TEXT UNIQUE NOT NULL);",
937 "CREATE TABLE localname (package TEXT NOT NULL, "
938 "locale TEXT NOT NULL, "
939 "name TEXT NOT NULL, PRIMARY KEY (package, locale));",
943 ret = db_open(DB_OPEN_RW);
944 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
946 for (i = 0; tbls[i] != NULL; i++) {
947 ret = db_exec(tbls[i]);
948 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
955 static inline void _insert_localname(gpointer data, gpointer user_data)
959 struct name_item *item = (struct name_item *)data;
960 desktop_info_s *info = (desktop_info_s *)user_data;
962 snprintf(query, sizeof(query), "insert into localname (package, locale, name) "
963 "values ('%s', '%s', '%s');",
964 info->package, item->locale, item->name);
965 if (db_exec(query) < 0)
966 _E("Failed to insert local name of package[%s]",info->package);
969 static ail_error_e _insert_desktop_info(desktop_info_s *info)
975 len = _strlen_desktop_info(info) + (0x01 << 10);
976 query = calloc(1, len);
977 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
979 sqlite3_snprintf(len, query, "insert into app_info ("
988 "x_slp_packagetype, "
989 "x_slp_packagecategories, "
997 "x_slp_baselayoutwidth, "
998 "x_slp_installedtime, "
1000 "x_slp_taskmanage, "
1003 "x_slp_ishorizontalscale, "
1004 "x_slp_inactivated, "
1007 "('%q', '%q', '%q', '%q', '%q', "
1008 "'%q', '%q', '%q', '%q', '%q', "
1009 "'%q', '%q', '%q', '%q', '%q', "
1010 "'%q', '%q', '%q', "
1011 "%d, %d, %d, %d, %d, %d, "
1022 info->x_slp_service,
1023 info->x_slp_packagetype,
1024 info->x_slp_packagecategories,
1025 info->x_slp_packageid,
1028 info->x_slp_exe_path,
1032 info->x_slp_baselayoutwidth,
1033 info->x_slp_installedtime,
1035 info->x_slp_taskmanage,
1036 info->x_slp_multiple,
1037 info->x_slp_removable,
1038 info->x_slp_ishorizontalscale,
1039 info->x_slp_inactivated,
1043 ret = db_open(DB_OPEN_RW);
1044 if(ret != AIL_ERROR_OK) {
1045 _E("(tmp == NULL) return\n");
1047 return AIL_ERROR_DB_FAILED;
1050 ret = db_exec(query);
1051 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1053 if (info->localname)
1054 g_slist_foreach(info->localname, _insert_localname, info);
1056 _D("Add (%s).", info->package);
1058 return AIL_ERROR_OK;
1063 static ail_error_e _update_desktop_info(desktop_info_s *info)
1068 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1070 if (db_open(DB_OPEN_RW) < 0) {
1071 return AIL_ERROR_DB_FAILED;
1074 len = _strlen_desktop_info(info) + (0x01 << 10);
1075 query = calloc(1, len);
1076 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1078 sqlite3_snprintf ( len, query, "update app_info set "
1086 "x_slp_service='%q', "
1087 "x_slp_packagetype='%q', "
1088 "x_slp_packagecategories='%q', "
1089 "x_slp_packageid='%q', "
1092 "x_slp_exe_path='%q', "
1093 "x_slp_appid='%q', "
1094 "x_slp_pkgid='%q', "
1095 "x_slp_domain='%q', "
1096 "x_slp_baselayoutwidth=%d, "
1097 "x_slp_installedtime=%d, "
1099 "x_slp_taskmanage=%d, "
1100 "x_slp_multiple=%d, "
1101 "x_slp_removable=%d, "
1102 "x_slp_ishorizontalscale=%d, "
1103 "x_slp_inactivated=%d, "
1105 "where package='%q'",
1113 info->x_slp_service,
1114 info->x_slp_packagetype,
1115 info->x_slp_packagecategories,
1116 info->x_slp_packageid,
1119 info->x_slp_exe_path,
1123 info->x_slp_baselayoutwidth,
1124 info->x_slp_installedtime,
1126 info->x_slp_taskmanage,
1127 info->x_slp_multiple,
1128 info->x_slp_removable,
1129 info->x_slp_ishorizontalscale,
1130 info->x_slp_inactivated,
1134 if (db_exec(query) < 0) {
1136 return AIL_ERROR_DB_FAILED;
1139 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1141 if (db_exec(query) < 0) {
1143 return AIL_ERROR_DB_FAILED;
1146 if (info->localname)
1147 g_slist_foreach(info->localname, _insert_localname, info);
1149 _D("Update (%s).", info->package);
1153 return AIL_ERROR_OK;
1158 static ail_error_e _remove_package(const char* package)
1163 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1165 if (db_open(DB_OPEN_RW) < 0) {
1166 return AIL_ERROR_DB_FAILED;
1169 size = strlen(package) + (0x01 << 10);
1170 query = calloc(1, size);
1171 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1173 snprintf(query, size, "delete from app_info where package = '%s'", package);
1175 if (db_exec(query) < 0) {
1177 return AIL_ERROR_DB_FAILED;
1180 snprintf(query, size, "delete from localname where package = '%s'", package);
1181 _D("query=%s",query);
1183 if (db_exec(query) < 0) {
1185 return AIL_ERROR_DB_FAILED;
1188 _D("Remove (%s).", package);
1191 return AIL_ERROR_OK;
1196 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1198 char *type_string, *noti_string;
1201 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1205 type_string = "create";
1208 type_string = "update";
1211 type_string = "delete";
1214 return AIL_ERROR_FAIL;
1217 size = strlen(package) + 8;
1218 noti_string = calloc(1, size);
1219 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1221 snprintf(noti_string, size, "%s:%s", type_string, package);
1222 vconf_set_str("memory/menuscreen/desktop", noti_string);
1223 _D("Noti : %s", noti_string);
1227 return AIL_ERROR_OK;
1231 static void inline _name_item_free_func(gpointer data)
1233 struct name_item *item = (struct name_item *)data;
1235 SAFE_FREE(item->locale);
1236 item->locale = NULL;
1237 SAFE_FREE(item->name);
1243 static void _fini_desktop_info(desktop_info_s *info)
1245 SAFE_FREE(info->exec);
1246 SAFE_FREE(info->name);
1247 SAFE_FREE(info->type);
1248 SAFE_FREE(info->icon);
1249 SAFE_FREE(info->categories);
1250 SAFE_FREE(info->version);
1251 SAFE_FREE(info->mimetype);
1252 SAFE_FREE(info->x_slp_service);
1253 SAFE_FREE(info->x_slp_packagetype);
1254 SAFE_FREE(info->x_slp_packagecategories);
1255 SAFE_FREE(info->x_slp_packageid);
1256 SAFE_FREE(info->x_slp_uri);
1257 SAFE_FREE(info->x_slp_svc);
1258 SAFE_FREE(info->x_slp_exe_path);
1259 SAFE_FREE(info->x_slp_appid);
1260 SAFE_FREE(info->desktop);
1261 if (info->localname) {
1262 g_slist_free_full(info->localname, _name_item_free_func);
1263 info->localname = NULL;
1271 /* Public functions */
1272 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1274 desktop_info_s info = {0,};
1278 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1280 count = _count_all();
1282 ret = _create_table();
1283 if (ret != AIL_ERROR_OK) {
1284 _D("Cannot create a table. Maybe there is already a table.");
1288 ret = _init_desktop_info(&info, appid);
1289 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1291 ret = _read_desktop_info(&info);
1292 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1294 ret = _insert_desktop_info(&info);
1295 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1297 ret = _send_db_done_noti(NOTI_ADD, appid);
1298 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1300 _fini_desktop_info(&info);
1302 return AIL_ERROR_OK;
1307 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1309 desktop_info_s info = {0,};
1312 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1314 ret = _init_desktop_info(&info, appid);
1315 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1317 ret = _read_desktop_info(&info);
1318 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1320 ret = _update_desktop_info(&info);
1321 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1323 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1324 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1326 _fini_desktop_info(&info);
1328 return AIL_ERROR_OK;
1333 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1337 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1339 ret = _remove_package(appid);
1340 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1342 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1343 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1345 return AIL_ERROR_OK;
1349 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *package,
1350 const char *property,
1353 desktop_info_s info = {0,};
1355 ail_prop_bool_e prop;
1357 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1359 retv_if(strcmp(property, AIL_PROP_X_SLP_INACTIVATED_BOOL),
1360 AIL_ERROR_INVALID_PARAMETER);
1362 ret = _init_desktop_info(&info, package);
1363 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1365 ret = _modify_desktop_info_bool(&info, property, value);
1366 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1368 ret = _update_desktop_info(&info);
1369 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1371 ret = _send_db_done_noti(NOTI_UPDATE, package);
1372 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1374 _fini_desktop_info(&info);
1376 return AIL_ERROR_OK;