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>
40 #include "ail_private.h"
48 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
49 #define argsdelimiter " \t"
51 #define SQL_INSERT_LOCALNAME_STR "insert into localname (package, locale, name) values "
52 #define SQL_INSERT_LOCALNAME_STR_LEN (sizeof(SQL_INSERT_LOCALNAME_STR)-1)
54 #define SQL_INSERT_LOCALNAME_INIT_STR SQL_INSERT_LOCALNAME_STR"( ?, ?, ?) "
56 #define SQL_LOCALNAME_TRIPLET_STR ", ( ?, ?, ?)"
57 #define SQL_LOCALNAME_TRIPLET_STR_LEN (sizeof(SQL_LOCALNAME_TRIPLET_STR)-1)
68 ail_error_e (*value_cb)(void *data, char *tag, char *value);
71 inline static char *_ltrim(char *str)
73 if (!str) return NULL;
75 while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
82 inline static int _rtrim(char *str)
87 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
107 char* x_slp_packagetype;
108 char* x_slp_packagecategories;
109 char* x_slp_packageid;
112 char* x_slp_exe_path;
116 char* x_slp_submodemainid;
117 char* x_slp_installedstorage;
118 int x_slp_baselayoutwidth;
119 int x_slp_installedtime;
121 int x_slp_taskmanage;
124 int x_slp_ishorizontalscale;
133 static ail_error_e _read_exec(void *data, char *tag, char *value)
135 desktop_info_s *info = data;
136 char *token_exe_path;
140 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
141 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
143 SAFE_FREE_AND_STRDUP(value, info->exec);
144 retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
146 temp_exec = strdup(value);
149 return AIL_ERROR_OUT_OF_MEMORY;
152 token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
154 info->x_slp_exe_path = strdup(token_exe_path);
155 if(!info->x_slp_exe_path) {
159 return AIL_ERROR_OUT_OF_MEMORY;
169 static ail_error_e _read_name(void *data, char *tag, char *value)
171 desktop_info_s *info = data;
173 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
174 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
175 retv_if(0 == strlen(value), AIL_ERROR_FAIL);
177 if (tag && strlen(tag) > 0) {
178 struct name_item *item;
179 item = (struct name_item *)calloc(1, sizeof(struct name_item));
180 retv_if (NULL == item, AIL_ERROR_OUT_OF_MEMORY);
182 SAFE_FREE_AND_STRDUP(tag, item->locale);
183 if(NULL == item->locale) {
184 _E("(NULL == item->locale) return\n");
186 return AIL_ERROR_OUT_OF_MEMORY;
189 SAFE_FREE_AND_STRDUP(value, item->name);
190 if(NULL == item->name) {
191 _E("(NULL == item->name) return\n");
194 return AIL_ERROR_OUT_OF_MEMORY;
197 info->localname = g_slist_append(info->localname, item);
201 SAFE_FREE_AND_STRDUP(value, info->name);
202 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
210 static ail_error_e _read_type(void *data, char *tag, char *value)
212 desktop_info_s *info = data;
214 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
215 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
217 SAFE_FREE_AND_STRDUP(value, info->type);
218 retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
225 _get_package_from_icon(char* icon)
230 retv_if(!icon, NULL);
232 package = strdup(icon);
233 retv_if(!package, NULL);
234 extension = rindex(package, '.');
238 _E("cannot extract from icon [%s] to package.", icon);
246 _get_icon_with_path(char* icon, uid_t uid)
248 retv_if(!icon, NULL);
250 if (index(icon, '/') == NULL) {
253 char* icon_with_path = NULL;
256 package = _get_package_from_icon(icon);
257 retv_if(!package, NULL);
259 /* "db/setting/theme" is not exist */
261 theme = vconf_get_str("db/setting/theme");
263 theme = strdup("default");
270 theme = strdup("default");
273 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
274 icon_with_path = malloc(len);
275 if(icon_with_path == NULL) {
276 _E("icon_with_path == NULL\n");
282 memset(icon_with_path, 0, len);
283 if (uid != GLOBAL_USER)
284 sqlite3_snprintf( len, icon_with_path, "%s%q", ail_get_icon_path(uid), icon);
286 sqlite3_snprintf( len, icon_with_path, "%s/%q/small/%q", ail_get_icon_path(GLOBAL_USER), theme, icon);
287 if (!access (icon_with_path, F_OK))
288 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q", tzplatform_getenv(TZ_SYS_RO_APP), package, theme, icon);
289 else if (!access (icon_with_path, F_OK))
290 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q", tzplatform_getenv(TZ_SYS_RW_APP), package, theme, icon);
292 _D("Cannot find icon path");
295 _D("Icon path : %s", icon_with_path);
298 return icon_with_path;
300 char* confirmed_icon = NULL;
302 confirmed_icon = strdup(icon);
303 retv_if(!confirmed_icon, NULL);
304 return confirmed_icon;
309 static ail_error_e _read_icon(void *data, char *tag, char *value, uid_t uid)
311 desktop_info_s *info = data;
313 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
314 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
316 info->icon = _get_icon_with_path(value, uid);
318 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
325 static ail_error_e _read_categories(void *data, char *tag, char *value)
327 desktop_info_s *info = data;
329 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
330 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
332 SAFE_FREE_AND_STRDUP(value, info->categories);
333 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
340 static ail_error_e _read_version(void *data, char *tag, char *value)
342 desktop_info_s *info = data;
344 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
345 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
347 SAFE_FREE_AND_STRDUP(value, info->version);
348 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
355 static ail_error_e _read_mimetype(void *data, char *tag, char *value)
357 desktop_info_s *info = data;
358 int size, total_len = 0;
359 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
361 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
362 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
363 retv_if(!strlen(value), AIL_ERROR_FAIL);
365 mimes_origin = strdup(value);
366 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
368 size = getpagesize();
369 mimes_changed = calloc(1, size);
370 if(mimes_changed == NULL) {
371 _E("(mimes_changed == NULL) return\n");
373 return AIL_ERROR_OUT_OF_MEMORY;
376 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
378 while (token_unalias) {
380 const char *token_alias;
382 _rtrim(token_unalias);
383 token_unalias = _ltrim(token_unalias);
385 token_alias = xdg_mime_unalias_mime_type(token_unalias);
386 if (!token_alias) continue;
388 token_len = strlen(token_alias);
389 if (total_len + token_len + (1<<1) >= size) {
392 tmp = realloc(mimes_changed, size);
395 return AIL_ERROR_OUT_OF_MEMORY;
400 strncat(mimes_changed, token_alias, size-1);
401 total_len += token_len;
403 token_unalias = strtok_r(NULL, ";", &save_ptr);
405 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
409 SAFE_FREE(info->mimetype);
410 info->mimetype = mimes_changed;
417 static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
419 desktop_info_s* info = data;
421 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
422 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
424 info->nodisplay = !strcasecmp(value, "true");
431 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
433 desktop_info_s *info = data;
435 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
436 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
438 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
439 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
446 static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
448 desktop_info_s *info = data;
450 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
451 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
453 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
454 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
461 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value)
463 desktop_info_s *info = data;
465 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
466 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
468 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
469 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
476 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
478 desktop_info_s *info = data;
480 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
481 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
483 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
484 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
489 static ail_error_e _read_x_slp_submodemainid(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_submodemainid);
497 retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY);
502 static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value)
504 desktop_info_s *info = data;
506 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
507 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
509 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
510 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
515 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value)
517 desktop_info_s *info = data;
519 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
520 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
522 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
523 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
530 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
532 desktop_info_s *info = data;
534 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
535 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
537 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
538 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
545 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
547 desktop_info_s *info = data;
549 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
550 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
552 info->x_slp_taskmanage = !strcasecmp(value, "true");
559 static ail_error_e _read_x_slp_multiple(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 info->x_slp_multiple = !strcasecmp(value, "true");
573 static ail_error_e _read_x_slp_removable(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 info->x_slp_removable = !strcasecmp(value, "true");
586 static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value)
588 desktop_info_s *info = data;
590 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
591 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
593 info->x_slp_submode = !strcasecmp(value, "true");
598 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
600 desktop_info_s *info = data;
602 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
603 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
605 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
606 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
612 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
614 desktop_info_s *info = data;
616 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
617 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
619 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
620 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
626 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
628 desktop_info_s *info = data;
630 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
631 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
633 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
634 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
640 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value)
642 desktop_info_s *info = data;
644 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
645 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
647 info->x_slp_enabled = !strcasecmp(value, "true");
653 static struct entry_parser entry_parsers[] = {
656 .value_cb = _read_exec,
660 .value_cb = _read_name,
664 .value_cb = _read_type,
668 .value_cb = _read_icon,
671 .field = "categories",
672 .value_cb = _read_categories,
676 .value_cb = _read_version,
680 .value_cb = _read_mimetype,
683 .field = "x-tizen-service",
684 .value_cb = _read_x_slp_service,
687 .field = "x-tizen-packagetype",
688 .value_cb = _read_x_slp_packagetype,
691 .field = "x-tizen-packagecategories",
692 .value_cb = _read_x_slp_packagecategories,
695 .field = "x-tizen-packageid",
696 .value_cb = _read_x_slp_packageid,
699 .field = "x-tizen-submodemainid",
700 .value_cb = _read_x_slp_submodemainid,
703 .field = "x-tizen-installedstorage",
704 .value_cb = _read_x_slp_installedstorage,
707 .field = "x-tizen-uri",
708 .value_cb = _read_x_slp_uri,
711 .field = "x-tizen-svc",
712 .value_cb = _read_x_slp_svc,
715 .field = "nodisplay",
716 .value_cb = _read_nodisplay,
719 .field = "x-tizen-taskmanage",
720 .value_cb = _read_x_slp_taskmanage,
723 .field = "x-tizen-enabled",
724 .value_cb = _read_x_slp_enabled,
727 .field = "x-tizen-submode",
728 .value_cb = _read_x_slp_submode,
731 .field = "x-tizen-multiple",
732 .value_cb = _read_x_slp_multiple,
735 .field = "x-tizen-removable",
736 .value_cb = _read_x_slp_removable,
739 .field = "x-tizen-appid",
740 .value_cb = _read_x_slp_appid,
743 .field = "x-tizen-pkgid",
744 .value_cb = _read_x_slp_pkgid,
747 .field = "x-tizen-domain",
748 .value_cb = _read_x_slp_domain,
751 .field = "x-tizen-enabled",
752 .value_cb = _read_x_slp_domain,
762 /* Utility functions */
763 static int _count_all(uid_t uid)
768 if (uid != GLOBAL_USER)
769 ret = ail_filter_count_usr_appinfo(NULL, &count, uid);
771 ret = ail_filter_count_appinfo(NULL, &count);
772 if(ret != AIL_ERROR_OK) {
773 _E("cannot count appinfo");
777 retv_if(ret != AIL_ERROR_OK, -1);
782 char *_pkgname_to_desktop(const char *package, uid_t uid)
788 retv_if(!package, NULL);
790 desktop_path = al_get_desktop_path(uid);
792 size = strlen(desktop_path) + strlen(package) + 10;
793 desktop = malloc(size);
794 retv_if(!desktop, NULL);
796 snprintf(desktop, size, "%s/%s.desktop", desktop_path, package);
798 _D("uid: %d / desktop: [%s]\n", uid, desktop);
803 static inline int _bind_local_info(desktop_info_s* info, sqlite3_stmt * stmt)
807 struct name_item *item;
809 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
810 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
811 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
812 localname = info->localname;
814 item = (struct name_item *) localname->data;
815 if (item && item->locale && item->name) {
816 // Bind values for a triplet : package, locale, name
817 retv_if(db_bind_text(stmt, i+1, info->package) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
818 retv_if(db_bind_text(stmt, i+2, item->locale) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
819 retv_if(db_bind_text(stmt, i+3, item->name) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
822 localname = g_slist_next(localname);
828 static inline int _len_local_info(desktop_info_s* info)
831 struct name_item *item;
833 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
834 if(info->localname) {
835 localname = info->localname;
837 item = (struct name_item *) localname->data;
838 if (item && item->locale && item->name)
840 localname = g_slist_next(localname);
847 static inline int _insert_local_info(desktop_info_s* info, uid_t uid)
849 int len_query = SQL_INSERT_LOCALNAME_STR_LEN;
852 int ret = AIL_ERROR_OK;
853 sqlite3_stmt *stmt = NULL;
855 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
856 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
858 nb_locale_args = _len_local_info(info);
860 retv_if(!nb_locale_args, AIL_ERROR_INVALID_PARAMETER);
862 len_query += SQL_LOCALNAME_TRIPLET_STR_LEN*nb_locale_args +1;
864 query = (char *) malloc(len_query);
865 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
866 stpncpy(query, SQL_INSERT_LOCALNAME_INIT_STR, len_query);
867 for (i = 0; i < nb_locale_args - 1; i++)
868 strcat(query, SQL_LOCALNAME_TRIPLET_STR);
871 if(uid != GLOBAL_USER)
872 ret = db_prepare_rw(query, &stmt);
874 ret = db_prepare_globalrw(query, &stmt);
877 ret = _bind_local_info(info, stmt);
879 _E("Can't bind locale information to this query - %s. ",query);
884 if (ret != AIL_ERROR_NO_DATA) {
885 /* Insert Request doesn't return any data.
886 * db_step should returns AIL_ERROR_NO_DATA in this case. */
887 _E("Can't execute this query - %s. ",query);
891 ret = db_finalize(stmt);
898 static inline int _strlen_desktop_info(desktop_info_s* info)
902 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
904 if (info->package) len += strlen(info->package);
905 if (info->exec) len += strlen(info->exec);
906 if (info->name) len += strlen(info->name);
907 if (info->type) len += strlen(info->type);
908 if (info->icon) len += strlen(info->icon);
909 if (info->categories) len += strlen(info->categories);
910 if (info->version) len += strlen(info->version);
911 if (info->mimetype) len += strlen(info->mimetype);
912 if (info->x_slp_service) len += strlen(info->x_slp_service);
913 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
914 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
915 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
916 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
917 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
918 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
919 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
920 if (info->desktop) len += strlen(info->desktop);
921 if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid);
922 if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage);
928 int __is_ail_initdb(void)
930 if( getenv("AIL_INITDB") || getenv("INITDB") )
936 /* Manipulating desktop_info functions */
937 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package, uid_t uid)
939 static int is_initdb = -1;
941 _D("package - [%s].", package);
944 is_initdb = __is_ail_initdb();
946 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
947 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
950 info->package = package;
952 info->x_slp_taskmanage = 1;
953 info->x_slp_removable = 1;
954 info->x_slp_submode = 0;
957 info->x_slp_installedtime = 0;
959 info->x_slp_installedtime = time(NULL);
962 info->x_slp_packagetype = strdup(PKGTYPE);
964 info->x_slp_packagetype = strdup("rpm");
966 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
968 info->x_slp_packageid = strdup(package);
969 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
970 info->x_slp_appid = strdup(package);
971 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
973 info->x_slp_enabled = 1;
975 info->desktop = _pkgname_to_desktop(package, uid);
976 retv_if(!info->desktop, AIL_ERROR_FAIL);
978 _D("desktop - [%s].", info->desktop);
985 static ail_error_e _read_desktop_info(desktop_info_s* info)
992 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
994 fp = fopen(info->desktop, "r");
995 retv_if(!fp, AIL_ERROR_FAIL);
997 while ((read = getline(&line, &size, fp)) != -1) {
999 char *tmp, *field, *field_name, *tag, *value;
1002 if(tmp == NULL) continue;
1003 if (*tmp == '#') continue;
1004 if (_rtrim(tmp) <= 0) continue;
1006 len = strlen(line) + 1;
1007 field = calloc(1, len);
1008 field_name = calloc(1, len);
1009 tag = calloc(1, len);
1010 value = calloc(1, len);
1012 if (!field || !field_name || !tag || !value) {
1016 sscanf(tmp, "%[^=]=%[^\n]", field, value);
1018 tmp = _ltrim(value);
1020 sscanf(field, "%[^[][%[^]]]", field_name, tag);
1022 if (!field_name || !strlen(field_name)){
1026 for (idx = 0; entry_parsers[idx].field; idx ++) {
1027 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
1028 if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
1029 _E("field - [%s] is wrong.", field_name);
1036 SAFE_FREE(field_name);
1041 _D("Read (%s).", info->package);
1044 return AIL_ERROR_OK;
1048 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
1055 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1057 values = calloc(NUM_OF_PROP, sizeof(char *));
1058 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
1060 for (i = 0; i < NUM_OF_PROP; i++) {
1061 err = db_column_str(stmt, i, &col);
1062 if (AIL_ERROR_OK != err)
1068 values[i] = strdup(col);
1070 err = AIL_ERROR_OUT_OF_MEMORY;
1076 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
1077 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
1078 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
1079 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
1080 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
1081 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
1082 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
1083 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
1084 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
1085 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
1086 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
1087 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
1088 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
1089 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
1090 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
1091 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
1092 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
1093 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid);
1094 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage);
1096 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
1098 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
1099 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
1100 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
1101 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
1102 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
1103 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
1104 info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]);
1109 for (j = 0; j < i; ++j) {
1119 static ail_error_e _load_desktop_info(desktop_info_s* info, uid_t uid)
1122 char query[AIL_SQL_QUERY_MAX_LEN];
1123 sqlite3_stmt *stmt = NULL;
1124 char w[AIL_SQL_QUERY_MAX_LEN];
1126 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1128 snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), info->package);
1130 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
1133 ret = db_open(DB_OPEN_RO, uid);
1136 ret = db_prepare(query, &stmt);
1137 //ret = db_prepare_globalro(query, &stmt);
1140 ret = db_step(stmt);
1146 ret = _retrieve_all_column_to_desktop_info(info, stmt);
1152 ret = db_finalize(stmt);
1155 return AIL_ERROR_OK;
1161 static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
1162 const char *property,
1165 ail_prop_bool_e prop;
1168 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1169 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1171 prop = _ail_convert_to_prop_bool(property);
1173 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1174 return AIL_ERROR_INVALID_PARAMETER;
1177 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1178 info->x_slp_enabled = (int)value;
1181 return AIL_ERROR_FAIL;
1184 return AIL_ERROR_OK;
1188 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1189 const char *property,
1192 ail_prop_bool_e prop;
1195 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1196 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1198 prop = _ail_convert_to_prop_str(property);
1200 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1201 return AIL_ERROR_INVALID_PARAMETER;
1204 case E_AIL_PROP_NAME_STR:
1205 SAFE_FREE_AND_STRDUP(value, info->name);
1206 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
1208 case E_AIL_PROP_X_SLP_SVC_STR:
1209 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1210 retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1212 case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR:
1213 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
1214 retv_if (!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
1217 _E("prop[%d] is not defined\n", prop);
1218 return AIL_ERROR_FAIL;
1221 return AIL_ERROR_OK;
1225 static inline void _insert_localname(gpointer data, gpointer user_data, uid_t uid)
1229 struct name_item *item = (struct name_item *)data;
1230 desktop_info_s *info = (desktop_info_s *)user_data;
1232 sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) "
1233 "values ('%q', '%q', '%q', '%q');",
1234 info->package, item->locale, item->name, info->x_slp_pkgid);
1235 if(uid != GLOBAL_USER) {
1236 if (db_exec_usr_rw(query) < 0)
1237 _E("Failed to insert local name of package[%s]",info->package);
1239 if (db_exec_glo_rw(query) < 0)
1240 _E("Failed to insert local name of package[%s]",info->package);
1244 static ail_error_e _insert_desktop_info(desktop_info_s *info, uid_t uid)
1250 len = _strlen_desktop_info(info) + (0x01 << 10);
1251 query = calloc(1, len);
1252 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1254 sqlite3_snprintf(len, query, "insert into app_info ("
1263 "x_slp_packagetype, "
1264 "x_slp_packagecategories, "
1272 "x_slp_submodemainid, "
1273 "x_slp_installedstorage, "
1274 "x_slp_baselayoutwidth, "
1275 "x_slp_installedtime, "
1277 "x_slp_taskmanage, "
1280 "x_slp_ishorizontalscale, "
1285 "('%q', '%q', '%q', '%q', '%q', "
1286 "'%q', '%q', '%q', '%q', '%q', "
1287 "'%q', '%q', '%q', '%q', '%q', "
1288 "'%q', '%q', '%q', '%q', '%q', "
1289 "%d, %d, %d, %d, %d, %d, %d,"
1300 info->x_slp_service,
1301 info->x_slp_packagetype,
1302 info->x_slp_packagecategories,
1303 info->x_slp_packageid,
1306 info->x_slp_exe_path,
1310 info->x_slp_submodemainid,
1311 info->x_slp_installedstorage,
1312 info->x_slp_baselayoutwidth,
1313 info->x_slp_installedtime,
1315 info->x_slp_taskmanage,
1316 info->x_slp_multiple,
1317 info->x_slp_removable,
1318 info->x_slp_ishorizontalscale,
1319 info->x_slp_enabled,
1320 info->x_slp_submode,
1324 ret = db_open(DB_OPEN_RW, uid);
1325 if(ret != AIL_ERROR_OK) {
1326 _E("(tmp == NULL) return\n");
1328 return AIL_ERROR_DB_FAILED;
1330 if (uid != GLOBAL_USER)
1331 ret = db_exec_usr_rw(query);
1333 ret = db_exec_glo_rw(query);
1336 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1338 if (info->localname)
1339 _insert_local_info(info, uid);
1341 _D("Add (%s).", query);
1343 return AIL_ERROR_OK;
1348 static ail_error_e _update_desktop_info(desktop_info_s *info, uid_t uid)
1353 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1355 if (db_open(DB_OPEN_RW, uid) < 0) {
1356 return AIL_ERROR_DB_FAILED;
1359 len = _strlen_desktop_info(info) + (0x01 << 10);
1360 query = calloc(1, len);
1361 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1363 sqlite3_snprintf ( len, query, "update app_info set "
1371 "x_slp_service='%q', "
1372 "x_slp_packagetype='%q', "
1373 "x_slp_packagecategories='%q', "
1374 "x_slp_packageid='%q', "
1377 "x_slp_exe_path='%q', "
1378 "x_slp_appid='%q', "
1379 "x_slp_pkgid='%q', "
1380 "x_slp_domain='%q', "
1381 "x_slp_submodemainid='%q', "
1382 "x_slp_installedstorage='%q', "
1383 "x_slp_baselayoutwidth=%d, "
1384 "x_slp_installedtime=%d, "
1386 "x_slp_taskmanage=%d, "
1387 "x_slp_multiple=%d, "
1388 "x_slp_removable=%d, "
1389 "x_slp_ishorizontalscale=%d, "
1390 "x_slp_enabled=%d, "
1391 "x_slp_submode=%d, "
1393 "where package='%q'",
1401 info->x_slp_service,
1402 info->x_slp_packagetype,
1403 info->x_slp_packagecategories,
1404 info->x_slp_packageid,
1407 info->x_slp_exe_path,
1411 info->x_slp_submodemainid,
1412 info->x_slp_installedstorage,
1413 info->x_slp_baselayoutwidth,
1414 info->x_slp_installedtime,
1416 info->x_slp_taskmanage,
1417 info->x_slp_multiple,
1418 info->x_slp_removable,
1419 info->x_slp_ishorizontalscale,
1420 info->x_slp_enabled,
1421 info->x_slp_submode,
1425 if(uid != GLOBAL_USER) {
1426 if (db_exec_usr_rw(query) < 0) {
1428 return AIL_ERROR_DB_FAILED;
1431 if (db_exec_glo_rw(query) < 0) {
1433 return AIL_ERROR_DB_FAILED;
1436 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1437 if (uid != GLOBAL_USER) {
1438 if (db_exec_usr_rw(query) < 0) {
1440 return AIL_ERROR_DB_FAILED;
1443 if (db_exec_glo_rw(query) < 0) {
1445 return AIL_ERROR_DB_FAILED;
1448 if (info->localname)
1449 _insert_local_info(info, uid);
1451 _D("Update (%s).", info->package);
1455 return AIL_ERROR_OK;
1460 static ail_error_e _remove_package(const char* package, uid_t uid)
1465 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1467 if (db_open(DB_OPEN_RW, uid) < 0) {
1468 return AIL_ERROR_DB_FAILED;
1471 size = strlen(package) + (0x01 << 10);
1472 query = calloc(1, size);
1473 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1475 snprintf(query, size, "delete from app_info where package = '%s'", package);
1477 if(uid != GLOBAL_USER) {
1478 if (db_exec_usr_rw(query) < 0) {
1480 return AIL_ERROR_DB_FAILED;
1483 if (db_exec_glo_rw(query) < 0) {
1485 return AIL_ERROR_DB_FAILED;
1488 snprintf(query, size, "delete from localname where package = '%s'", package);
1489 _D("query=%s",query);
1491 if(uid != GLOBAL_USER) {
1492 if (db_exec_usr_rw(query) < 0) {
1494 return AIL_ERROR_DB_FAILED;
1497 if (db_exec_glo_rw(query) < 0) {
1499 return AIL_ERROR_DB_FAILED;
1502 _D("Remove (%s).", package);
1505 return AIL_ERROR_OK;
1508 static ail_error_e _clean_pkgid_data(const char* pkgid, uid_t uid)
1513 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1515 if (db_open(DB_OPEN_RW, uid) ){
1516 return AIL_ERROR_DB_FAILED;
1519 size = strlen(pkgid) + (0x01 << 10);
1520 query = calloc(1, size);
1521 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1523 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1525 if(uid != GLOBAL_USER) {
1526 if (db_exec_usr_rw(query) < 0) {
1528 return AIL_ERROR_DB_FAILED;
1531 if (db_exec_glo_rw(query) < 0) {
1533 return AIL_ERROR_DB_FAILED;
1536 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1537 _D("query=%s",query);
1539 if(uid != GLOBAL_USER) {
1540 if (db_exec_usr_rw(query) < 0) {
1542 return AIL_ERROR_DB_FAILED;
1545 if (db_exec_glo_rw(query) < 0) {
1547 return AIL_ERROR_DB_FAILED;
1550 _D("Clean pkgid data (%s).", pkgid);
1553 return AIL_ERROR_OK;
1556 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1558 char *type_string, *noti_string;
1561 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1565 type_string = "create";
1568 type_string = "update";
1571 type_string = "delete";
1574 return AIL_ERROR_FAIL;
1577 size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid());
1578 noti_string = (char*) calloc(size + 1, sizeof(char));
1579 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1581 snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
1582 vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
1583 vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
1584 _D("Noti : %s", noti_string);
1588 return AIL_ERROR_OK;
1592 static void inline _name_item_free_func(gpointer data)
1594 struct name_item *item = (struct name_item *)data;
1596 SAFE_FREE(item->locale);
1597 item->locale = NULL;
1598 SAFE_FREE(item->name);
1604 static void _fini_desktop_info(desktop_info_s *info)
1606 SAFE_FREE(info->exec);
1607 SAFE_FREE(info->name);
1608 SAFE_FREE(info->type);
1609 SAFE_FREE(info->icon);
1610 SAFE_FREE(info->categories);
1611 SAFE_FREE(info->version);
1612 SAFE_FREE(info->mimetype);
1613 SAFE_FREE(info->x_slp_service);
1614 SAFE_FREE(info->x_slp_packagetype);
1615 SAFE_FREE(info->x_slp_packagecategories);
1616 SAFE_FREE(info->x_slp_packageid);
1617 SAFE_FREE(info->x_slp_uri);
1618 SAFE_FREE(info->x_slp_svc);
1619 SAFE_FREE(info->x_slp_exe_path);
1620 SAFE_FREE(info->x_slp_appid);
1621 SAFE_FREE(info->x_slp_pkgid);
1622 SAFE_FREE(info->x_slp_domain);
1623 SAFE_FREE(info->x_slp_submodemainid);
1624 SAFE_FREE(info->x_slp_installedstorage);
1625 SAFE_FREE(info->desktop);
1626 if (info->localname) {
1627 g_slist_free_full(info->localname, _name_item_free_func);
1628 info->localname = NULL;
1634 static int __is_authorized()
1636 uid_t uid = getuid();
1637 if ((uid_t) 0 == uid )
1644 /* Public functions */
1645 EXPORT_API ail_error_e ail_usr_desktop_add(const char *appid, uid_t uid)
1647 desktop_info_s info = {0,};
1650 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1652 ret = _init_desktop_info(&info, appid, uid);
1653 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1655 ret = _read_desktop_info(&info);
1656 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1658 ret = _insert_desktop_info(&info, uid);
1659 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1661 ret = _send_db_done_noti(NOTI_ADD, appid);
1662 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1664 _fini_desktop_info(&info);
1666 return AIL_ERROR_OK;
1669 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1671 return ail_usr_desktop_add(appid,GLOBAL_USER);
1674 EXPORT_API ail_error_e ail_usr_desktop_update(const char *appid, uid_t uid)
1676 desktop_info_s info = {0,};
1679 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1681 ret = _init_desktop_info(&info, appid, uid);
1682 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1684 ret = _read_desktop_info(&info);
1685 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1687 ret = _update_desktop_info(&info, uid);
1688 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1690 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1691 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1693 _fini_desktop_info(&info);
1695 return AIL_ERROR_OK;
1698 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1700 return ail_usr_desktop_update(appid,GLOBAL_USER);
1704 EXPORT_API ail_error_e ail_usr_desktop_remove(const char *appid, uid_t uid)
1708 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1710 ret = _remove_package(appid, uid);
1711 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1713 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1714 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1716 return AIL_ERROR_OK;
1719 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1721 return ail_usr_desktop_remove(appid, GLOBAL_USER);
1725 EXPORT_API ail_error_e ail_usr_desktop_clean(const char *pkgid, uid_t uid)
1729 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1731 _D("ail_desktop_clean=%s",pkgid);
1733 ret = _clean_pkgid_data(pkgid, uid);
1734 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1736 return AIL_ERROR_OK;
1739 EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid)
1741 return ail_usr_desktop_clean(pkgid, GLOBAL_USER);
1744 EXPORT_API ail_error_e ail_usr_desktop_fota(const char *appid, uid_t uid)
1746 desktop_info_s info = {0,};
1749 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1751 ret = _init_desktop_info(&info, appid, uid);
1752 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1754 ret = _read_desktop_info(&info);
1755 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1757 ret = _insert_desktop_info(&info, uid);
1758 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1760 _fini_desktop_info(&info);
1762 return AIL_ERROR_OK;
1765 EXPORT_API ail_error_e ail_desktop_fota(const char *appid)
1767 return ail_usr_desktop_fota(appid, GLOBAL_USER);
1771 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_bool(const char *appid,
1772 const char *property,
1774 bool broadcast, uid_t uid)
1776 desktop_info_s info = {0,};
1779 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1781 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1782 AIL_ERROR_INVALID_PARAMETER);
1784 ret = _init_desktop_info(&info, appid, uid);
1785 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1787 ret = _load_desktop_info(&info, uid);
1788 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1790 ret = _modify_desktop_info_bool(&info, property, value);
1791 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1793 ret = _update_desktop_info(&info, uid);
1794 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1797 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1798 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1801 _fini_desktop_info(&info);
1803 return AIL_ERROR_OK;
1806 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1807 const char *property,
1811 return ail_desktop_appinfo_modify_usr_bool(appid, property, value, broadcast,
1816 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_str(const char *appid, uid_t uid,
1817 const char *property,
1821 desktop_info_s info = {0,};
1824 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1826 ret = _init_desktop_info(&info, appid, uid);
1827 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1829 ret = _load_desktop_info(&info, uid);
1830 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1832 _D("info.name [%s], value [%s]", info.name, value);
1833 ret = _modify_desktop_info_str(&info, property, value);
1834 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1835 _D("info.name [%s], value [%s]", info.name, value);
1837 ret = _update_desktop_info(&info, uid);
1838 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1841 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1842 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1845 _fini_desktop_info(&info);
1847 return AIL_ERROR_OK;
1850 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1851 const char *property,
1855 return ail_desktop_appinfo_modify_usr_str(appid, GLOBAL_USER, property, value,