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.
31 #include <sys/types.h>
33 #include <tzplatform_config.h>
40 #include "ail_private.h"
44 #include "ail_vconf.h"
47 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
49 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
50 #define argsdelimiter " \t"
52 #define SQL_INSERT_LOCALNAME_STR "insert into localname (package, locale, name) values "
53 #define SQL_INSERT_LOCALNAME_STR_LEN (sizeof(SQL_INSERT_LOCALNAME_STR)-1)
55 #define SQL_INSERT_LOCALNAME_INIT_STR SQL_INSERT_LOCALNAME_STR"( ?, ?, ?) "
57 #define SQL_LOCALNAME_TRIPLET_STR ", ( ?, ?, ?)"
58 #define SQL_LOCALNAME_TRIPLET_STR_LEN (sizeof(SQL_LOCALNAME_TRIPLET_STR)-1)
69 ail_error_e (*value_cb)(void *data, char *tag, char *value, uid_t uid);
72 inline static char *_ltrim(char *str)
74 if (!str) return NULL;
76 while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
83 inline static int _rtrim(char *str)
88 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
108 char* x_slp_packagetype;
109 char* x_slp_packagecategories;
110 char* x_slp_packageid;
113 char* x_slp_exe_path;
117 char* x_slp_submodemainid;
118 char* x_slp_installedstorage;
119 int x_slp_baselayoutwidth;
120 int x_slp_installedtime;
122 int x_slp_taskmanage;
125 int x_slp_ishorizontalscale;
134 static ail_error_e _read_exec(void *data, char *tag, char *value, uid_t uid)
136 desktop_info_s *info = data;
137 char *token_exe_path;
141 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
142 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
144 SAFE_FREE_AND_STRDUP(value, info->exec);
145 retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
147 temp_exec = strdup(value);
150 return AIL_ERROR_OUT_OF_MEMORY;
153 token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
155 info->x_slp_exe_path = strdup(token_exe_path);
156 if(!info->x_slp_exe_path) {
160 return AIL_ERROR_OUT_OF_MEMORY;
170 static ail_error_e _read_name(void *data, char *tag, char *value, uid_t uid)
172 desktop_info_s *info = data;
174 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
175 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
176 retv_if(0 == strlen(value), AIL_ERROR_FAIL);
178 if (tag && strlen(tag) > 0) {
179 struct name_item *item;
180 item = (struct name_item *)calloc(1, sizeof(struct name_item));
181 retv_if (NULL == item, AIL_ERROR_OUT_OF_MEMORY);
183 SAFE_FREE_AND_STRDUP(tag, item->locale);
184 if(NULL == item->locale) {
185 _E("(NULL == item->locale) return\n");
187 return AIL_ERROR_OUT_OF_MEMORY;
190 SAFE_FREE_AND_STRDUP(value, item->name);
191 if(NULL == item->name) {
192 _E("(NULL == item->name) return\n");
195 return AIL_ERROR_OUT_OF_MEMORY;
198 info->localname = g_slist_append(info->localname, item);
202 SAFE_FREE_AND_STRDUP(value, info->name);
203 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
211 static ail_error_e _read_type(void *data, char *tag, char *value, uid_t uid)
213 desktop_info_s *info = data;
215 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
216 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
218 SAFE_FREE_AND_STRDUP(value, info->type);
219 retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
226 _get_package_from_icon(char* icon)
231 retv_if(!icon, NULL);
233 package = strdup(icon);
234 retv_if(!package, NULL);
235 extension = rindex(package, '.');
239 _E("cannot extract from icon [%s] to package.", icon);
247 _get_icon_with_path(char* icon, uid_t uid)
249 retv_if(!icon, NULL);
251 if (index(icon, '/') == NULL) {
254 char* icon_with_path = NULL;
256 char *app_path = NULL;
258 package = _get_package_from_icon(icon);
259 retv_if(!package, NULL);
261 /* "db/setting/theme" is not exist */
263 theme = ail_vconf_get_str("db/setting/theme");
265 theme = strdup("default");
272 theme = strdup("default");
275 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
276 icon_with_path = malloc(len);
277 if(icon_with_path == NULL) {
278 _E("icon_with_path == NULL\n");
284 memset(icon_with_path, 0, len);
285 if (uid != GLOBAL_USER)
286 sqlite3_snprintf( len, icon_with_path, "%s%q", ail_get_icon_path(uid), icon);
288 sqlite3_snprintf( len, icon_with_path, "%s/%q/small/%q", ail_get_icon_path(GLOBAL_USER), theme, icon);
290 if (access (icon_with_path, F_OK)) {
291 app_path = tzplatform_getenv(TZ_SYS_RW_APP);
293 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q",app_path, package, theme, icon);
294 if (access (icon_with_path, F_OK))
295 _E("Cannot find icon path");
299 _D("Icon path : %s", icon_with_path);
300 return icon_with_path;
302 char* confirmed_icon = NULL;
304 confirmed_icon = strdup(icon);
305 retv_if(!confirmed_icon, NULL);
306 return confirmed_icon;
311 static ail_error_e _read_icon(void *data, char *tag, char *value, uid_t uid)
313 desktop_info_s *info = data;
315 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
316 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
318 info->icon = _get_icon_with_path(value, uid);
320 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
327 static ail_error_e _read_categories(void *data, char *tag, char *value, uid_t uid)
329 desktop_info_s *info = data;
331 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
332 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
334 SAFE_FREE_AND_STRDUP(value, info->categories);
335 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
342 static ail_error_e _read_version(void *data, char *tag, char *value, uid_t uid)
344 desktop_info_s *info = data;
346 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
347 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
349 SAFE_FREE_AND_STRDUP(value, info->version);
350 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
357 static ail_error_e _read_mimetype(void *data, char *tag, char *value, uid_t uid)
359 desktop_info_s *info = data;
360 int size, total_len = 0;
361 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
363 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
364 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
365 retv_if(!strlen(value), AIL_ERROR_FAIL);
367 mimes_origin = strdup(value);
368 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
370 size = getpagesize();
371 mimes_changed = calloc(1, size);
372 if(mimes_changed == NULL) {
373 _E("(mimes_changed == NULL) return\n");
375 return AIL_ERROR_OUT_OF_MEMORY;
378 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
380 while (token_unalias) {
382 const char *token_alias;
384 _rtrim(token_unalias);
385 token_unalias = _ltrim(token_unalias);
387 token_alias = xdg_mime_unalias_mime_type(token_unalias);
388 if (!token_alias) continue;
390 token_len = strlen(token_alias);
391 if (total_len + token_len + (1<<1) >= size) {
394 tmp = realloc(mimes_changed, size);
397 return AIL_ERROR_OUT_OF_MEMORY;
402 strncat(mimes_changed, token_alias, size-1);
403 total_len += token_len;
405 token_unalias = strtok_r(NULL, ";", &save_ptr);
407 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
411 SAFE_FREE(info->mimetype);
412 info->mimetype = mimes_changed;
419 static ail_error_e _read_nodisplay(void *data, char *tag, char *value, uid_t uid)
421 desktop_info_s* info = data;
423 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
424 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
426 info->nodisplay = !strcasecmp(value, "true");
433 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value, uid_t uid)
435 desktop_info_s *info = data;
437 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
438 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
440 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
441 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
448 static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value, uid_t uid)
450 desktop_info_s *info = data;
452 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
453 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
455 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
456 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
463 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value, uid_t uid)
465 desktop_info_s *info = data;
467 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
468 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
470 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
471 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
478 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value, uid_t uid)
480 desktop_info_s *info = data;
482 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
483 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
485 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
486 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
491 static ail_error_e _read_x_slp_submodemainid(void *data, char *tag, char *value, uid_t uid)
493 desktop_info_s *info = data;
495 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
496 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
498 SAFE_FREE_AND_STRDUP(value, info->x_slp_submodemainid);
499 retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY);
504 static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value, uid_t uid)
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_installedstorage);
512 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
517 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value, uid_t uid)
519 desktop_info_s *info = data;
521 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
522 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
524 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
525 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
532 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value, uid_t uid)
534 desktop_info_s *info = data;
536 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
537 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
539 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
540 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
547 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value, uid_t uid)
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_taskmanage = !strcasecmp(value, "true");
561 static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value, uid_t uid)
563 desktop_info_s *info = data;
565 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
566 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
568 info->x_slp_multiple = !strcasecmp(value, "true");
575 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value, uid_t uid)
577 desktop_info_s *info = data;
579 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
580 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
582 info->x_slp_removable = !strcasecmp(value, "true");
588 static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value, uid_t uid)
590 desktop_info_s *info = data;
592 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
593 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
595 info->x_slp_submode = !strcasecmp(value, "true");
600 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value, uid_t uid)
602 desktop_info_s *info = data;
604 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
605 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
607 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
608 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
614 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value, uid_t uid)
616 desktop_info_s *info = data;
618 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
619 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
621 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
622 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
628 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value, uid_t uid)
630 desktop_info_s *info = data;
632 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
633 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
635 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
636 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
642 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value, uid_t uid)
644 desktop_info_s *info = data;
646 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
647 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
649 info->x_slp_enabled = !strcasecmp(value, "true");
655 static struct entry_parser entry_parsers[] = {
658 .value_cb = _read_exec,
662 .value_cb = _read_name,
666 .value_cb = _read_type,
670 .value_cb = _read_icon,
673 .field = "categories",
674 .value_cb = _read_categories,
678 .value_cb = _read_version,
682 .value_cb = _read_mimetype,
685 .field = "x-tizen-service",
686 .value_cb = _read_x_slp_service,
689 .field = "x-tizen-packagetype",
690 .value_cb = _read_x_slp_packagetype,
693 .field = "x-tizen-packagecategories",
694 .value_cb = _read_x_slp_packagecategories,
697 .field = "x-tizen-packageid",
698 .value_cb = _read_x_slp_packageid,
701 .field = "x-tizen-submodemainid",
702 .value_cb = _read_x_slp_submodemainid,
705 .field = "x-tizen-installedstorage",
706 .value_cb = _read_x_slp_installedstorage,
709 .field = "x-tizen-uri",
710 .value_cb = _read_x_slp_uri,
713 .field = "x-tizen-svc",
714 .value_cb = _read_x_slp_svc,
717 .field = "nodisplay",
718 .value_cb = _read_nodisplay,
721 .field = "x-tizen-taskmanage",
722 .value_cb = _read_x_slp_taskmanage,
725 .field = "x-tizen-enabled",
726 .value_cb = _read_x_slp_enabled,
729 .field = "x-tizen-submode",
730 .value_cb = _read_x_slp_submode,
733 .field = "x-tizen-multiple",
734 .value_cb = _read_x_slp_multiple,
737 .field = "x-tizen-removable",
738 .value_cb = _read_x_slp_removable,
741 .field = "x-tizen-appid",
742 .value_cb = _read_x_slp_appid,
745 .field = "x-tizen-pkgid",
746 .value_cb = _read_x_slp_pkgid,
749 .field = "x-tizen-domain",
750 .value_cb = _read_x_slp_domain,
753 .field = "x-tizen-enabled",
754 .value_cb = _read_x_slp_domain,
764 /* Utility functions */
765 static int _count_all(uid_t uid)
770 if (uid != GLOBAL_USER)
771 ret = ail_filter_count_usr_appinfo(NULL, &count, uid);
773 ret = ail_filter_count_appinfo(NULL, &count);
774 if(ret != AIL_ERROR_OK) {
775 _E("cannot count appinfo");
779 retv_if(ret != AIL_ERROR_OK, -1);
784 char *_pkgname_to_desktop(const char *package, uid_t uid)
790 retv_if(!package, NULL);
792 desktop_path = ail_get_desktop_path(uid);
794 size = strlen(desktop_path) + strlen(package) + 10;
795 desktop = malloc(size);
796 retv_if(!desktop, NULL);
798 snprintf(desktop, size, "%s/%s.desktop", desktop_path, package);
800 _D("uid: %d / desktop: [%s]\n", uid, desktop);
805 static inline int _bind_local_info(desktop_info_s* info, sqlite3_stmt * stmt)
809 struct name_item *item;
811 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
812 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
813 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
814 localname = info->localname;
816 item = (struct name_item *) localname->data;
817 if (item && item->locale && item->name) {
818 // Bind values for a triplet : package, locale, name
819 retv_if(db_bind_text(stmt, i+1, info->package) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
820 retv_if(db_bind_text(stmt, i+2, item->locale) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
821 retv_if(db_bind_text(stmt, i+3, item->name) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
824 localname = g_slist_next(localname);
830 static inline int _len_local_info(desktop_info_s* info)
833 struct name_item *item;
835 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
836 if(info->localname) {
837 localname = info->localname;
839 item = (struct name_item *) localname->data;
840 if (item && item->locale && item->name)
842 localname = g_slist_next(localname);
849 static inline int _insert_local_info(desktop_info_s* info, uid_t uid)
851 int len_query = SQL_INSERT_LOCALNAME_STR_LEN;
854 int ret = AIL_ERROR_OK;
855 sqlite3_stmt *stmt = NULL;
857 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
858 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
860 nb_locale_args = _len_local_info(info);
862 retv_if(!nb_locale_args, AIL_ERROR_INVALID_PARAMETER);
864 len_query += SQL_LOCALNAME_TRIPLET_STR_LEN*nb_locale_args +1;
866 query = (char *) malloc(len_query);
867 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
868 stpncpy(query, SQL_INSERT_LOCALNAME_INIT_STR, len_query);
869 for (i = 0; i < nb_locale_args - 1; i++)
870 strcat(query, SQL_LOCALNAME_TRIPLET_STR);
873 if(uid != GLOBAL_USER)
874 ret = db_prepare_rw(query, &stmt);
876 ret = db_prepare_globalrw(query, &stmt);
879 ret = _bind_local_info(info, stmt);
881 _E("Can't bind locale information to this query - %s. ",query);
886 if (ret != AIL_ERROR_NO_DATA) {
887 /* Insert Request doesn't return any data.
888 * db_step should returns AIL_ERROR_NO_DATA in this case. */
889 _E("Can't execute this query - %s. ",query);
893 ret = db_finalize(stmt);
900 static inline int _strlen_desktop_info(desktop_info_s* info)
904 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
906 if (info->package) len += strlen(info->package);
907 if (info->exec) len += strlen(info->exec);
908 if (info->name) len += strlen(info->name);
909 if (info->type) len += strlen(info->type);
910 if (info->icon) len += strlen(info->icon);
911 if (info->categories) len += strlen(info->categories);
912 if (info->version) len += strlen(info->version);
913 if (info->mimetype) len += strlen(info->mimetype);
914 if (info->x_slp_service) len += strlen(info->x_slp_service);
915 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
916 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
917 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
918 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
919 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
920 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
921 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
922 if (info->desktop) len += strlen(info->desktop);
923 if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid);
924 if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage);
930 int __is_ail_initdb(void)
932 if( getenv("AIL_INITDB") || getenv("INITDB") )
938 /* Manipulating desktop_info functions */
939 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package, uid_t uid)
941 static int is_initdb = -1;
943 _D("package - [%s].", package);
946 is_initdb = __is_ail_initdb();
948 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
949 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
952 info->package = package;
954 info->x_slp_taskmanage = 1;
955 info->x_slp_removable = 1;
956 info->x_slp_submode = 0;
959 info->x_slp_installedtime = 0;
961 info->x_slp_installedtime = time(NULL);
964 info->x_slp_packagetype = strdup(PKGTYPE);
966 info->x_slp_packagetype = strdup("rpm");
968 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
970 info->x_slp_packageid = strdup(package);
971 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
972 info->x_slp_appid = strdup(package);
973 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
975 info->x_slp_enabled = 1;
977 info->desktop = _pkgname_to_desktop(package, uid);
978 retv_if(!info->desktop, AIL_ERROR_FAIL);
980 _D("desktop - [%s].", info->desktop);
987 static ail_error_e _read_desktop_info(desktop_info_s* info,uid_t uid)
994 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
996 fp = fopen(info->desktop, "r");
997 retv_if(!fp, AIL_ERROR_FAIL);
999 while ((read = getline(&line, &size, fp)) != -1) {
1001 char *tmp, *field, *field_name, *tag, *value;
1004 if(tmp == NULL) continue;
1005 if (*tmp == '#') continue;
1006 if (_rtrim(tmp) <= 0) continue;
1008 len = strlen(line) + 1;
1009 field = calloc(1, len);
1010 field_name = calloc(1, len);
1011 tag = calloc(1, len);
1012 value = calloc(1, len);
1014 if (!field || !field_name || !tag || !value) {
1018 sscanf(tmp, "%[^=]=%[^\n]", field, value);
1020 tmp = _ltrim(value);
1022 sscanf(field, "%[^[][%[^]]]", field_name, tag);
1024 if (!field_name || !strlen(field_name)){
1028 for (idx = 0; entry_parsers[idx].field; idx ++) {
1029 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
1030 if (entry_parsers[idx].value_cb(info, tag, tmp,uid) != AIL_ERROR_OK) {
1031 _E("field - [%s] is wrong.", field_name);
1038 SAFE_FREE(field_name);
1043 _D("Read (%s).", info->package);
1046 return AIL_ERROR_OK;
1050 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
1057 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1059 values = calloc(NUM_OF_PROP, sizeof(char *));
1060 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
1062 for (i = 0; i < NUM_OF_PROP; i++) {
1063 err = db_column_str(stmt, i, &col);
1064 if (AIL_ERROR_OK != err)
1070 values[i] = strdup(col);
1072 err = AIL_ERROR_OUT_OF_MEMORY;
1078 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
1079 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
1080 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
1081 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
1082 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
1083 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
1084 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
1085 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
1086 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
1087 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
1088 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
1089 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
1090 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
1091 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
1092 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
1093 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
1094 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
1095 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid);
1096 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage);
1098 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
1100 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
1101 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
1102 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
1103 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
1104 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
1105 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
1106 info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]);
1111 for (j = 0; j < i; ++j) {
1121 static ail_error_e _load_desktop_info(desktop_info_s* info, uid_t uid)
1124 char query[AIL_SQL_QUERY_MAX_LEN];
1125 sqlite3_stmt *stmt = NULL;
1126 char w[AIL_SQL_QUERY_MAX_LEN];
1128 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1130 snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), info->package);
1132 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
1135 ret = db_open(DB_OPEN_RO, uid);
1138 if (uid != GLOBAL_USER) {
1139 ret = db_prepare(query, &stmt);
1141 ret = db_prepare_globalro(query, &stmt);
1146 ret = db_step(stmt);
1152 ret = _retrieve_all_column_to_desktop_info(info, stmt);
1158 ret = db_finalize(stmt);
1161 return AIL_ERROR_OK;
1167 static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
1168 const char *property,
1171 ail_prop_bool_e prop;
1174 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1175 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1177 prop = _ail_convert_to_prop_bool(property);
1179 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1180 return AIL_ERROR_INVALID_PARAMETER;
1183 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1184 info->x_slp_enabled = (int)value;
1187 return AIL_ERROR_FAIL;
1190 return AIL_ERROR_OK;
1194 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1195 const char *property,
1198 ail_prop_bool_e prop;
1201 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1202 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1204 prop = _ail_convert_to_prop_str(property);
1206 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1207 return AIL_ERROR_INVALID_PARAMETER;
1210 case E_AIL_PROP_NAME_STR:
1211 SAFE_FREE_AND_STRDUP(value, info->name);
1212 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
1214 case E_AIL_PROP_X_SLP_SVC_STR:
1215 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1216 retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1218 case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR:
1219 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
1220 retv_if (!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
1223 _E("prop[%d] is not defined\n", prop);
1224 return AIL_ERROR_FAIL;
1227 return AIL_ERROR_OK;
1231 static inline void _insert_localname(gpointer data, gpointer user_data, uid_t uid)
1235 struct name_item *item = (struct name_item *)data;
1236 desktop_info_s *info = (desktop_info_s *)user_data;
1238 sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) "
1239 "values ('%q', '%q', '%q', '%q');",
1240 info->package, item->locale, item->name, info->x_slp_pkgid);
1241 if(uid != GLOBAL_USER) {
1242 if (db_exec_usr_rw(query) < 0)
1243 _E("Failed to insert local name of package[%s]",info->package);
1245 if (db_exec_glo_rw(query) < 0)
1246 _E("Failed to insert local name of package[%s]",info->package);
1250 static ail_error_e _insert_desktop_info(desktop_info_s *info, uid_t uid)
1256 len = _strlen_desktop_info(info) + (0x01 << 10);
1257 query = calloc(1, len);
1258 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1260 sqlite3_snprintf(len, query, "insert into app_info ("
1269 "x_slp_packagetype, "
1270 "x_slp_packagecategories, "
1278 "x_slp_submodemainid, "
1279 "x_slp_installedstorage, "
1280 "x_slp_baselayoutwidth, "
1281 "x_slp_installedtime, "
1283 "x_slp_taskmanage, "
1286 "x_slp_ishorizontalscale, "
1291 "('%q', '%q', '%q', '%q', '%q', "
1292 "'%q', '%q', '%q', '%q', '%q', "
1293 "'%q', '%q', '%q', '%q', '%q', "
1294 "'%q', '%q', '%q', '%q', '%q', "
1295 "%d, %d, %d, %d, %d, %d, %d,"
1306 info->x_slp_service,
1307 info->x_slp_packagetype,
1308 info->x_slp_packagecategories,
1309 info->x_slp_packageid,
1312 info->x_slp_exe_path,
1316 info->x_slp_submodemainid,
1317 info->x_slp_installedstorage,
1318 info->x_slp_baselayoutwidth,
1319 info->x_slp_installedtime,
1321 info->x_slp_taskmanage,
1322 info->x_slp_multiple,
1323 info->x_slp_removable,
1324 info->x_slp_ishorizontalscale,
1325 info->x_slp_enabled,
1326 info->x_slp_submode,
1330 ret = db_open(DB_OPEN_RW, uid);
1331 if(ret != AIL_ERROR_OK) {
1332 _E("(tmp == NULL) return\n");
1334 return AIL_ERROR_DB_FAILED;
1336 if (uid != GLOBAL_USER)
1337 ret = db_exec_usr_rw(query);
1339 ret = db_exec_glo_rw(query);
1342 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1344 if (info->localname)
1345 _insert_local_info(info, uid);
1347 _D("Add (%s).", query);
1349 return AIL_ERROR_OK;
1354 static ail_error_e _update_desktop_info(desktop_info_s *info, uid_t uid)
1359 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1361 if (db_open(DB_OPEN_RW, uid) < 0) {
1362 return AIL_ERROR_DB_FAILED;
1365 len = _strlen_desktop_info(info) + (0x01 << 10);
1366 query = calloc(1, len);
1367 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1369 sqlite3_snprintf ( len, query, "update app_info set "
1377 "x_slp_service='%q', "
1378 "x_slp_packagetype='%q', "
1379 "x_slp_packagecategories='%q', "
1380 "x_slp_packageid='%q', "
1383 "x_slp_exe_path='%q', "
1384 "x_slp_appid='%q', "
1385 "x_slp_pkgid='%q', "
1386 "x_slp_domain='%q', "
1387 "x_slp_submodemainid='%q', "
1388 "x_slp_installedstorage='%q', "
1389 "x_slp_baselayoutwidth=%d, "
1390 "x_slp_installedtime=%d, "
1392 "x_slp_taskmanage=%d, "
1393 "x_slp_multiple=%d, "
1394 "x_slp_removable=%d, "
1395 "x_slp_ishorizontalscale=%d, "
1396 "x_slp_enabled=%d, "
1397 "x_slp_submode=%d, "
1399 "where package='%q'",
1407 info->x_slp_service,
1408 info->x_slp_packagetype,
1409 info->x_slp_packagecategories,
1410 info->x_slp_packageid,
1413 info->x_slp_exe_path,
1417 info->x_slp_submodemainid,
1418 info->x_slp_installedstorage,
1419 info->x_slp_baselayoutwidth,
1420 info->x_slp_installedtime,
1422 info->x_slp_taskmanage,
1423 info->x_slp_multiple,
1424 info->x_slp_removable,
1425 info->x_slp_ishorizontalscale,
1426 info->x_slp_enabled,
1427 info->x_slp_submode,
1431 if(uid != GLOBAL_USER) {
1432 if (db_exec_usr_rw(query) < 0) {
1434 return AIL_ERROR_DB_FAILED;
1437 if (db_exec_glo_rw(query) < 0) {
1439 return AIL_ERROR_DB_FAILED;
1442 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1443 if (uid != GLOBAL_USER) {
1444 if (db_exec_usr_rw(query) < 0) {
1446 return AIL_ERROR_DB_FAILED;
1449 if (db_exec_glo_rw(query) < 0) {
1451 return AIL_ERROR_DB_FAILED;
1454 if (info->localname)
1455 _insert_local_info(info, uid);
1457 _D("Update (%s).", info->package);
1461 return AIL_ERROR_OK;
1466 static ail_error_e _remove_package(const char* package, uid_t uid)
1471 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1473 if (db_open(DB_OPEN_RW, uid) < 0) {
1474 return AIL_ERROR_DB_FAILED;
1477 size = strlen(package) + (0x01 << 10);
1478 query = calloc(1, size);
1479 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1481 snprintf(query, size, "delete from app_info where package = '%s'", package);
1483 if(uid != GLOBAL_USER) {
1484 if (db_exec_usr_rw(query) < 0) {
1486 return AIL_ERROR_DB_FAILED;
1489 if (db_exec_glo_rw(query) < 0) {
1491 return AIL_ERROR_DB_FAILED;
1494 snprintf(query, size, "delete from localname where package = '%s'", package);
1495 _D("query=%s",query);
1497 if(uid != GLOBAL_USER) {
1498 if (db_exec_usr_rw(query) < 0) {
1500 return AIL_ERROR_DB_FAILED;
1503 if (db_exec_glo_rw(query) < 0) {
1505 return AIL_ERROR_DB_FAILED;
1508 _D("Remove (%s).", package);
1511 return AIL_ERROR_OK;
1514 static ail_error_e _clean_pkgid_data(const char* pkgid, uid_t uid)
1519 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1521 if (db_open(DB_OPEN_RW, uid) ){
1522 return AIL_ERROR_DB_FAILED;
1525 size = strlen(pkgid) + (0x01 << 10);
1526 query = calloc(1, size);
1527 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1529 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1531 if(uid != GLOBAL_USER) {
1532 if (db_exec_usr_rw(query) < 0) {
1534 return AIL_ERROR_DB_FAILED;
1537 if (db_exec_glo_rw(query) < 0) {
1539 return AIL_ERROR_DB_FAILED;
1542 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1543 _D("query=%s",query);
1545 if(uid != GLOBAL_USER) {
1546 if (db_exec_usr_rw(query) < 0) {
1548 return AIL_ERROR_DB_FAILED;
1551 if (db_exec_glo_rw(query) < 0) {
1553 return AIL_ERROR_DB_FAILED;
1556 _D("Clean pkgid data (%s).", pkgid);
1559 return AIL_ERROR_OK;
1562 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1564 char *type_string, *noti_string;
1567 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1571 type_string = "create";
1574 type_string = "update";
1577 type_string = "delete";
1580 return AIL_ERROR_FAIL;
1583 size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid());
1584 noti_string = (char*) calloc(size + 1, sizeof(char));
1585 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1587 snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
1588 ail_vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
1589 ail_vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
1590 _D("Noti : %s", noti_string);
1594 return AIL_ERROR_OK;
1598 static void inline _name_item_free_func(gpointer data)
1600 struct name_item *item = (struct name_item *)data;
1602 SAFE_FREE(item->locale);
1603 item->locale = NULL;
1604 SAFE_FREE(item->name);
1610 static void _fini_desktop_info(desktop_info_s *info)
1612 SAFE_FREE(info->exec);
1613 SAFE_FREE(info->name);
1614 SAFE_FREE(info->type);
1615 SAFE_FREE(info->icon);
1616 SAFE_FREE(info->categories);
1617 SAFE_FREE(info->version);
1618 SAFE_FREE(info->mimetype);
1619 SAFE_FREE(info->x_slp_service);
1620 SAFE_FREE(info->x_slp_packagetype);
1621 SAFE_FREE(info->x_slp_packagecategories);
1622 SAFE_FREE(info->x_slp_packageid);
1623 SAFE_FREE(info->x_slp_uri);
1624 SAFE_FREE(info->x_slp_svc);
1625 SAFE_FREE(info->x_slp_exe_path);
1626 SAFE_FREE(info->x_slp_appid);
1627 SAFE_FREE(info->x_slp_pkgid);
1628 SAFE_FREE(info->x_slp_domain);
1629 SAFE_FREE(info->x_slp_submodemainid);
1630 SAFE_FREE(info->x_slp_installedstorage);
1631 SAFE_FREE(info->desktop);
1632 if (info->localname) {
1633 g_slist_free_full(info->localname, _name_item_free_func);
1634 info->localname = NULL;
1640 static int __is_authorized()
1642 uid_t uid = getuid();
1643 if ((uid_t) GLOBAL_USER == uid )
1650 /* Public functions */
1651 EXPORT_API ail_error_e ail_usr_desktop_add(const char *appid, uid_t uid)
1653 desktop_info_s info = {0,};
1656 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1658 ret = _init_desktop_info(&info, appid, uid);
1659 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1661 ret = _read_desktop_info(&info,uid);
1662 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1664 ret = _insert_desktop_info(&info, uid);
1665 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1667 ret = _send_db_done_noti(NOTI_ADD, appid);
1668 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1670 _fini_desktop_info(&info);
1672 return AIL_ERROR_OK;
1675 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1677 return ail_usr_desktop_add(appid,GLOBAL_USER);
1680 EXPORT_API ail_error_e ail_usr_desktop_update(const char *appid, uid_t uid)
1682 desktop_info_s info = {0,};
1685 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1687 ret = _init_desktop_info(&info, appid, uid);
1688 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1690 ret = _read_desktop_info(&info,uid);
1691 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1693 ret = _update_desktop_info(&info, uid);
1694 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1696 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1697 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1699 _fini_desktop_info(&info);
1701 return AIL_ERROR_OK;
1704 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1706 return ail_usr_desktop_update(appid,GLOBAL_USER);
1710 EXPORT_API ail_error_e ail_usr_desktop_remove(const char *appid, uid_t uid)
1714 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1716 ret = _remove_package(appid, uid);
1717 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1719 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1720 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1722 return AIL_ERROR_OK;
1725 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1727 return ail_usr_desktop_remove(appid, GLOBAL_USER);
1731 EXPORT_API ail_error_e ail_usr_desktop_clean(const char *pkgid, uid_t uid)
1735 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1737 _D("ail_desktop_clean=%s",pkgid);
1739 ret = _clean_pkgid_data(pkgid, uid);
1740 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1742 return AIL_ERROR_OK;
1745 EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid)
1747 return ail_usr_desktop_clean(pkgid, GLOBAL_USER);
1750 EXPORT_API ail_error_e ail_usr_desktop_fota(const char *appid, uid_t uid)
1752 desktop_info_s info = {0,};
1755 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1757 ret = _init_desktop_info(&info, appid, uid);
1758 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1760 ret = _read_desktop_info(&info,uid);
1761 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1763 ret = _insert_desktop_info(&info, uid);
1764 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1766 _fini_desktop_info(&info);
1768 return AIL_ERROR_OK;
1771 EXPORT_API ail_error_e ail_desktop_fota(const char *appid)
1773 return ail_usr_desktop_fota(appid, GLOBAL_USER);
1777 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_bool(const char *appid,
1778 const char *property,
1780 bool broadcast, uid_t uid)
1782 desktop_info_s info = {0,};
1785 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1787 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1788 AIL_ERROR_INVALID_PARAMETER);
1790 ret = _init_desktop_info(&info, appid, uid);
1791 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1793 ret = _load_desktop_info(&info, uid);
1794 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1796 ret = _modify_desktop_info_bool(&info, property, value);
1797 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1799 ret = _update_desktop_info(&info, uid);
1800 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1803 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1804 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1807 _fini_desktop_info(&info);
1809 return AIL_ERROR_OK;
1812 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1813 const char *property,
1817 return ail_desktop_appinfo_modify_usr_bool(appid, property, value, broadcast,
1822 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_str(const char *appid, uid_t uid,
1823 const char *property,
1827 desktop_info_s info = {0,};
1830 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1832 ret = _init_desktop_info(&info, appid, uid);
1833 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1835 ret = _load_desktop_info(&info, uid);
1836 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1838 _D("info.name [%s], value [%s]", info.name, value);
1839 ret = _modify_desktop_info_str(&info, property, value);
1840 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1841 _D("info.name [%s], value [%s]", info.name, value);
1843 ret = _update_desktop_info(&info, uid);
1844 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1847 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1848 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1851 _fini_desktop_info(&info);
1853 return AIL_ERROR_OK;
1856 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1857 const char *property,
1861 return ail_desktop_appinfo_modify_usr_str(appid, GLOBAL_USER, property, value,