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");
281 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
282 icon_with_path = malloc(len);
283 if(icon_with_path == NULL) {
284 _E("icon_with_path == NULL\n");
290 memset(icon_with_path, 0, len);
291 if (uid != GLOBAL_USER)
292 sqlite3_snprintf( len, icon_with_path, "%s%q", ail_get_icon_path(uid), icon);
294 sqlite3_snprintf( len, icon_with_path, "%s/%q/small/%q", ail_get_icon_path(GLOBAL_USER), theme, icon);
296 if (access (icon_with_path, F_OK)) {
297 app_path = tzplatform_getenv(TZ_SYS_RW_APP);
299 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q",app_path, package, theme, icon);
300 if (access (icon_with_path, F_OK))
301 _E("Cannot find icon path");
305 _D("Icon path : %s", icon_with_path);
306 return icon_with_path;
308 char* confirmed_icon = NULL;
310 confirmed_icon = strdup(icon);
311 retv_if(!confirmed_icon, NULL);
312 return confirmed_icon;
317 static ail_error_e _read_icon(void *data, char *tag, char *value, uid_t uid)
319 desktop_info_s *info = data;
321 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
322 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
324 info->icon = _get_icon_with_path(value, uid);
326 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
333 static ail_error_e _read_categories(void *data, char *tag, char *value, uid_t uid)
335 desktop_info_s *info = data;
337 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
338 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
340 SAFE_FREE_AND_STRDUP(value, info->categories);
341 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
348 static ail_error_e _read_version(void *data, char *tag, char *value, uid_t uid)
350 desktop_info_s *info = data;
352 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
353 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
355 SAFE_FREE_AND_STRDUP(value, info->version);
356 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
363 static ail_error_e _read_mimetype(void *data, char *tag, char *value, uid_t uid)
365 desktop_info_s *info = data;
366 int size, total_len = 0;
367 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
369 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
370 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
371 retv_if(!strlen(value), AIL_ERROR_FAIL);
373 mimes_origin = strdup(value);
374 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
376 size = getpagesize();
377 mimes_changed = calloc(1, size);
378 if(mimes_changed == NULL) {
379 _E("(mimes_changed == NULL) return\n");
381 return AIL_ERROR_OUT_OF_MEMORY;
384 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
386 while (token_unalias) {
388 const char *token_alias;
390 _rtrim(token_unalias);
391 token_unalias = _ltrim(token_unalias);
393 token_alias = xdg_mime_unalias_mime_type(token_unalias);
394 if (!token_alias) continue;
396 token_len = strlen(token_alias);
397 if (total_len + token_len + (1<<1) >= size) {
400 tmp = realloc(mimes_changed, size);
403 return AIL_ERROR_OUT_OF_MEMORY;
408 strncat(mimes_changed, token_alias, size-1);
409 total_len += token_len;
411 token_unalias = strtok_r(NULL, ";", &save_ptr);
413 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
417 SAFE_FREE(info->mimetype);
418 info->mimetype = mimes_changed;
425 static ail_error_e _read_nodisplay(void *data, char *tag, char *value, uid_t uid)
427 desktop_info_s* info = data;
429 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
430 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
432 info->nodisplay = !strcasecmp(value, "true");
439 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value, uid_t uid)
441 desktop_info_s *info = data;
443 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
444 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
446 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
447 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
454 static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value, uid_t uid)
456 desktop_info_s *info = data;
458 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
459 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
461 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
462 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
469 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value, uid_t uid)
471 desktop_info_s *info = data;
473 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
474 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
476 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
477 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
484 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value, uid_t uid)
486 desktop_info_s *info = data;
488 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
489 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
491 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
492 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
497 static ail_error_e _read_x_slp_submodemainid(void *data, char *tag, char *value, uid_t uid)
499 desktop_info_s *info = data;
501 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
502 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
504 SAFE_FREE_AND_STRDUP(value, info->x_slp_submodemainid);
505 retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY);
510 static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value, uid_t uid)
512 desktop_info_s *info = data;
514 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
515 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
517 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
518 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
523 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value, uid_t uid)
525 desktop_info_s *info = data;
527 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
528 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
530 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
531 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
538 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value, uid_t uid)
540 desktop_info_s *info = data;
542 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
543 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
545 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
546 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
553 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value, uid_t uid)
555 desktop_info_s *info = data;
557 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
558 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
560 info->x_slp_taskmanage = !strcasecmp(value, "true");
567 static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value, uid_t uid)
569 desktop_info_s *info = data;
571 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
572 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
574 info->x_slp_multiple = !strcasecmp(value, "true");
581 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value, uid_t uid)
583 desktop_info_s *info = data;
585 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
586 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
588 info->x_slp_removable = !strcasecmp(value, "true");
594 static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value, uid_t uid)
596 desktop_info_s *info = data;
598 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
599 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
601 info->x_slp_submode = !strcasecmp(value, "true");
606 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value, uid_t uid)
608 desktop_info_s *info = data;
610 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
611 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
613 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
614 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
620 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value, uid_t uid)
622 desktop_info_s *info = data;
624 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
625 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
627 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
628 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
634 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value, uid_t uid)
636 desktop_info_s *info = data;
638 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
639 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
641 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
642 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
648 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value, uid_t uid)
650 desktop_info_s *info = data;
652 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
653 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
655 info->x_slp_enabled = !strcasecmp(value, "true");
661 static struct entry_parser entry_parsers[] = {
664 .value_cb = _read_exec,
668 .value_cb = _read_name,
672 .value_cb = _read_type,
676 .value_cb = _read_icon,
679 .field = "categories",
680 .value_cb = _read_categories,
684 .value_cb = _read_version,
688 .value_cb = _read_mimetype,
691 .field = "x-tizen-service",
692 .value_cb = _read_x_slp_service,
695 .field = "x-tizen-packagetype",
696 .value_cb = _read_x_slp_packagetype,
699 .field = "x-tizen-packagecategories",
700 .value_cb = _read_x_slp_packagecategories,
703 .field = "x-tizen-packageid",
704 .value_cb = _read_x_slp_packageid,
707 .field = "x-tizen-submodemainid",
708 .value_cb = _read_x_slp_submodemainid,
711 .field = "x-tizen-installedstorage",
712 .value_cb = _read_x_slp_installedstorage,
715 .field = "x-tizen-uri",
716 .value_cb = _read_x_slp_uri,
719 .field = "x-tizen-svc",
720 .value_cb = _read_x_slp_svc,
723 .field = "nodisplay",
724 .value_cb = _read_nodisplay,
727 .field = "x-tizen-taskmanage",
728 .value_cb = _read_x_slp_taskmanage,
731 .field = "x-tizen-enabled",
732 .value_cb = _read_x_slp_enabled,
735 .field = "x-tizen-submode",
736 .value_cb = _read_x_slp_submode,
739 .field = "x-tizen-multiple",
740 .value_cb = _read_x_slp_multiple,
743 .field = "x-tizen-removable",
744 .value_cb = _read_x_slp_removable,
747 .field = "x-tizen-appid",
748 .value_cb = _read_x_slp_appid,
751 .field = "x-tizen-pkgid",
752 .value_cb = _read_x_slp_pkgid,
755 .field = "x-tizen-domain",
756 .value_cb = _read_x_slp_domain,
759 .field = "x-tizen-enabled",
760 .value_cb = _read_x_slp_domain,
770 /* Utility functions */
771 static int _count_all(uid_t uid)
776 if (uid != GLOBAL_USER)
777 ret = ail_filter_count_usr_appinfo(NULL, &count, uid);
779 ret = ail_filter_count_appinfo(NULL, &count);
781 if (ret != AIL_ERROR_OK) {
782 _E("cannot count appinfo");
789 char *_pkgname_to_desktop(const char *package, uid_t uid)
795 retv_if(!package, NULL);
797 desktop_path = ail_get_desktop_path(uid);
798 if (desktop_path == NULL) {
799 _E("Failed to get desktop path");
803 size = strlen(desktop_path) + strlen(package) + 10;
804 desktop = malloc(size);
805 if (desktop == NULL) {
811 snprintf(desktop, size, "%s/%s.desktop", desktop_path, package);
812 _D("uid: %d / desktop: [%s]\n", uid, desktop);
819 static inline int _bind_local_info(desktop_info_s* info, sqlite3_stmt * stmt)
823 struct name_item *item;
825 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
826 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
827 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
828 localname = info->localname;
830 item = (struct name_item *) localname->data;
831 if (item && item->locale && item->name) {
832 // Bind values for a triplet : package, locale, name
833 retv_if(db_bind_text(stmt, i+1, info->package) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
834 retv_if(db_bind_text(stmt, i+2, item->locale) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
835 retv_if(db_bind_text(stmt, i+3, item->name) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
838 localname = g_slist_next(localname);
843 static inline int _len_local_info(desktop_info_s* info)
846 struct name_item *item;
848 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
849 if(info->localname) {
850 localname = info->localname;
852 item = (struct name_item *) localname->data;
853 if (item && item->locale && item->name)
855 localname = g_slist_next(localname);
861 static inline int _insert_local_info(desktop_info_s* info, uid_t uid)
863 int len_query = SQL_INSERT_LOCALNAME_STR_LEN;
866 int ret = AIL_ERROR_OK;
867 sqlite3_stmt *stmt = NULL;
870 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
871 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
873 nb_locale_args = _len_local_info(info);
874 retv_if(!nb_locale_args, AIL_ERROR_INVALID_PARAMETER);
876 len_query += SQL_LOCALNAME_TRIPLET_STR_LEN*nb_locale_args + 1;
878 query = (char *)malloc(len_query);
879 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
881 stpncpy(query, SQL_INSERT_LOCALNAME_INIT_STR, len_query);
882 for (i = 0; i < nb_locale_args - 1; i++)
883 strncat(query, SQL_LOCALNAME_TRIPLET_STR, len_query - strlen(query) - 1);
886 if (uid != GLOBAL_USER)
887 ret = db_prepare_rw(query, &stmt);
889 ret = db_prepare_globalrw(query, &stmt);
894 ret = _bind_local_info(info, stmt);
896 _E("Can't bind locale information to this query - %s. ",query);
902 if (ret != AIL_ERROR_NO_DATA) {
903 /* Insert Request doesn't return any data.
904 * db_step should returns AIL_ERROR_NO_DATA in this case. */
905 _E("Can't execute this query - %s. ",query);
910 ret = db_finalize(stmt);
918 static inline int _strlen_desktop_info(desktop_info_s* info)
922 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
924 if (info->package) len += strlen(info->package);
925 if (info->exec) len += strlen(info->exec);
926 if (info->name) len += strlen(info->name);
927 if (info->type) len += strlen(info->type);
928 if (info->icon) len += strlen(info->icon);
929 if (info->categories) len += strlen(info->categories);
930 if (info->version) len += strlen(info->version);
931 if (info->mimetype) len += strlen(info->mimetype);
932 if (info->x_slp_service) len += strlen(info->x_slp_service);
933 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
934 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
935 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
936 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
937 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
938 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
939 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
940 if (info->desktop) len += strlen(info->desktop);
941 if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid);
942 if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage);
948 int __is_ail_initdb(void)
950 if( getenv("AIL_INITDB") || getenv("INITDB") )
956 /* Manipulating desktop_info functions */
957 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package, uid_t uid)
959 static int is_initdb = -1;
961 _D("package - [%s].", package);
964 is_initdb = __is_ail_initdb();
966 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
967 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
970 info->package = package;
972 info->x_slp_taskmanage = 1;
973 info->x_slp_removable = 1;
974 info->x_slp_submode = 0;
977 info->x_slp_installedtime = 0;
979 info->x_slp_installedtime = time(NULL);
982 info->x_slp_packagetype = strdup(PKGTYPE);
984 info->x_slp_packagetype = strdup("rpm");
986 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
988 info->x_slp_packageid = strdup(package);
989 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
991 info->x_slp_appid = strdup(package);
992 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
994 info->x_slp_enabled = 1;
996 info->desktop = _pkgname_to_desktop(package, uid);
997 retv_if(!info->desktop, AIL_ERROR_FAIL);
999 _D("desktop - [%s].", info->desktop);
1001 return AIL_ERROR_OK;
1004 static ail_error_e _read_desktop_info(desktop_info_s* info,uid_t uid)
1011 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1013 fp = fopen(info->desktop, "r");
1014 retv_if(!fp, AIL_ERROR_FAIL);
1016 while ((read = getline(&line, &size, fp)) != -1) {
1018 char *tmp, *field, *field_name, *tag, *value;
1021 if(tmp == NULL) continue;
1022 if (*tmp == '#') continue;
1023 if (_rtrim(tmp) <= 0) continue;
1025 len = strlen(line) + 1;
1026 field = calloc(1, len);
1027 field_name = calloc(1, len);
1028 tag = calloc(1, len);
1029 value = calloc(1, len);
1031 if (!field || !field_name || !tag || !value) {
1035 sscanf(tmp, "%[^=]=%[^\n]", field, value);
1037 tmp = _ltrim(value);
1039 sscanf(field, "%[^[][%[^]]]", field_name, tag);
1041 if (!field_name || !strlen(field_name)){
1045 for (idx = 0; entry_parsers[idx].field; idx ++) {
1046 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
1047 if (entry_parsers[idx].value_cb(info, tag, tmp,uid) != AIL_ERROR_OK) {
1048 _E("field - [%s] is wrong.", field_name);
1055 SAFE_FREE(field_name);
1060 _D("Read (%s).", info->package);
1063 return AIL_ERROR_OK;
1067 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
1074 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1076 values = calloc(NUM_OF_PROP, sizeof(char *));
1077 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
1079 for (i = 0; i < NUM_OF_PROP; i++) {
1080 err = db_column_str(stmt, i, &col);
1081 if (AIL_ERROR_OK != err)
1087 values[i] = strdup(col);
1089 err = AIL_ERROR_OUT_OF_MEMORY;
1095 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
1096 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
1097 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
1098 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
1099 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
1100 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
1101 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
1102 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
1103 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
1104 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
1105 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
1106 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
1107 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
1108 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
1109 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
1110 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
1111 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
1112 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid);
1113 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage);
1115 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
1117 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
1118 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
1119 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
1120 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
1121 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
1122 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
1123 info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]);
1128 for (j = 0; j < i; ++j) {
1138 static ail_error_e _load_desktop_info(desktop_info_s* info, uid_t uid)
1141 char query[AIL_SQL_QUERY_MAX_LEN];
1142 sqlite3_stmt *stmt = NULL;
1143 char w[AIL_SQL_QUERY_MAX_LEN];
1146 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1148 filter = sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR);
1150 return AIL_ERROR_FAIL;
1152 snprintf(w, sizeof(w), filter, info->package);
1153 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
1156 ret = db_open(DB_OPEN_RO, uid);
1159 if (uid != GLOBAL_USER) {
1160 ret = db_prepare(query, &stmt);
1162 ret = db_prepare_globalro(query, &stmt);
1167 ret = db_step(stmt);
1173 ret = _retrieve_all_column_to_desktop_info(info, stmt);
1179 ret = db_finalize(stmt);
1182 return AIL_ERROR_OK;
1188 static ail_error_e _modify_desktop_info_bool(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_bool(property);
1200 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1201 return AIL_ERROR_INVALID_PARAMETER;
1204 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1205 info->x_slp_enabled = (int)value;
1208 return AIL_ERROR_FAIL;
1211 return AIL_ERROR_OK;
1215 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1216 const char *property,
1219 ail_prop_bool_e prop;
1222 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1223 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1225 prop = _ail_convert_to_prop_str(property);
1227 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1228 return AIL_ERROR_INVALID_PARAMETER;
1231 case E_AIL_PROP_NAME_STR:
1232 SAFE_FREE_AND_STRDUP(value, info->name);
1233 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
1235 case E_AIL_PROP_X_SLP_SVC_STR:
1236 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1237 retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1239 case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR:
1240 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
1241 retv_if (!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
1244 _E("prop[%d] is not defined\n", prop);
1245 return AIL_ERROR_FAIL;
1248 return AIL_ERROR_OK;
1252 static inline void _insert_localname(gpointer data, gpointer user_data, uid_t uid)
1256 struct name_item *item = (struct name_item *)data;
1257 desktop_info_s *info = (desktop_info_s *)user_data;
1259 sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) "
1260 "values ('%q', '%q', '%q', '%q');",
1261 info->package, item->locale, item->name, info->x_slp_pkgid);
1262 if(uid != GLOBAL_USER) {
1263 if (db_exec_usr_rw(query) < 0)
1264 _E("Failed to insert local name of package[%s]",info->package);
1266 if (db_exec_glo_rw(query) < 0)
1267 _E("Failed to insert local name of package[%s]",info->package);
1271 static ail_error_e _insert_desktop_info(desktop_info_s *info, uid_t uid)
1277 len = _strlen_desktop_info(info) + (0x01 << 10);
1278 query = calloc(1, len);
1279 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1281 sqlite3_snprintf(len, query, "insert into app_info ("
1290 "x_slp_packagetype, "
1291 "x_slp_packagecategories, "
1299 "x_slp_submodemainid, "
1300 "x_slp_installedstorage, "
1301 "x_slp_baselayoutwidth, "
1302 "x_slp_installedtime, "
1304 "x_slp_taskmanage, "
1307 "x_slp_ishorizontalscale, "
1312 "('%q', '%q', '%q', '%q', '%q', "
1313 "'%q', '%q', '%q', '%q', '%q', "
1314 "'%q', '%q', '%q', '%q', '%q', "
1315 "'%q', '%q', '%q', '%q', '%q', "
1316 "%d, %d, %d, %d, %d, %d, %d,"
1327 info->x_slp_service,
1328 info->x_slp_packagetype,
1329 info->x_slp_packagecategories,
1330 info->x_slp_packageid,
1333 info->x_slp_exe_path,
1337 info->x_slp_submodemainid,
1338 info->x_slp_installedstorage,
1339 info->x_slp_baselayoutwidth,
1340 info->x_slp_installedtime,
1342 info->x_slp_taskmanage,
1343 info->x_slp_multiple,
1344 info->x_slp_removable,
1345 info->x_slp_ishorizontalscale,
1346 info->x_slp_enabled,
1347 info->x_slp_submode,
1351 ret = db_open(DB_OPEN_RW, uid);
1352 if(ret != AIL_ERROR_OK) {
1353 _E("(tmp == NULL) return\n");
1355 return AIL_ERROR_DB_FAILED;
1357 if (uid != GLOBAL_USER)
1358 ret = db_exec_usr_rw(query);
1360 ret = db_exec_glo_rw(query);
1362 _D("Add (%s).", query);
1365 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1367 if (info->localname)
1368 _insert_local_info(info, uid);
1370 return AIL_ERROR_OK;
1373 static ail_error_e _update_desktop_info(desktop_info_s *info, uid_t uid)
1378 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1380 if (db_open(DB_OPEN_RW, uid) < 0) {
1381 return AIL_ERROR_DB_FAILED;
1384 len = _strlen_desktop_info(info) + (0x01 << 10);
1385 query = calloc(1, len);
1386 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1388 sqlite3_snprintf ( len, query, "update app_info set "
1396 "x_slp_service='%q', "
1397 "x_slp_packagetype='%q', "
1398 "x_slp_packagecategories='%q', "
1399 "x_slp_packageid='%q', "
1402 "x_slp_exe_path='%q', "
1403 "x_slp_appid='%q', "
1404 "x_slp_pkgid='%q', "
1405 "x_slp_domain='%q', "
1406 "x_slp_submodemainid='%q', "
1407 "x_slp_installedstorage='%q', "
1408 "x_slp_baselayoutwidth=%d, "
1409 "x_slp_installedtime=%d, "
1411 "x_slp_taskmanage=%d, "
1412 "x_slp_multiple=%d, "
1413 "x_slp_removable=%d, "
1414 "x_slp_ishorizontalscale=%d, "
1415 "x_slp_enabled=%d, "
1416 "x_slp_submode=%d, "
1418 "where package='%q'",
1426 info->x_slp_service,
1427 info->x_slp_packagetype,
1428 info->x_slp_packagecategories,
1429 info->x_slp_packageid,
1432 info->x_slp_exe_path,
1436 info->x_slp_submodemainid,
1437 info->x_slp_installedstorage,
1438 info->x_slp_baselayoutwidth,
1439 info->x_slp_installedtime,
1441 info->x_slp_taskmanage,
1442 info->x_slp_multiple,
1443 info->x_slp_removable,
1444 info->x_slp_ishorizontalscale,
1445 info->x_slp_enabled,
1446 info->x_slp_submode,
1450 if(uid != GLOBAL_USER) {
1451 if (db_exec_usr_rw(query) < 0) {
1453 return AIL_ERROR_DB_FAILED;
1456 if (db_exec_glo_rw(query) < 0) {
1458 return AIL_ERROR_DB_FAILED;
1461 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1462 if (uid != GLOBAL_USER) {
1463 if (db_exec_usr_rw(query) < 0) {
1465 return AIL_ERROR_DB_FAILED;
1468 if (db_exec_glo_rw(query) < 0) {
1470 return AIL_ERROR_DB_FAILED;
1473 if (info->localname)
1474 _insert_local_info(info, uid);
1476 _D("Update (%s).", info->package);
1480 return AIL_ERROR_OK;
1485 static ail_error_e _remove_package(const char* package, uid_t uid)
1490 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1492 if (db_open(DB_OPEN_RW, uid) < 0) {
1493 return AIL_ERROR_DB_FAILED;
1496 size = strlen(package) + (0x01 << 10);
1497 query = calloc(1, size);
1498 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1500 snprintf(query, size, "delete from app_info where package = '%s'", package);
1502 if(uid != GLOBAL_USER) {
1503 if (db_exec_usr_rw(query) < 0) {
1505 return AIL_ERROR_DB_FAILED;
1508 if (db_exec_glo_rw(query) < 0) {
1510 return AIL_ERROR_DB_FAILED;
1513 snprintf(query, size, "delete from localname where package = '%s'", package);
1514 _D("query=%s",query);
1516 if(uid != GLOBAL_USER) {
1517 if (db_exec_usr_rw(query) < 0) {
1519 return AIL_ERROR_DB_FAILED;
1522 if (db_exec_glo_rw(query) < 0) {
1524 return AIL_ERROR_DB_FAILED;
1527 _D("Remove (%s).", package);
1530 return AIL_ERROR_OK;
1533 static ail_error_e _clean_pkgid_data(const char* pkgid, uid_t uid)
1538 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1540 if (db_open(DB_OPEN_RW, uid) ){
1541 return AIL_ERROR_DB_FAILED;
1544 size = strlen(pkgid) + (0x01 << 10);
1545 query = calloc(1, size);
1546 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1548 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1550 if(uid != GLOBAL_USER) {
1551 if (db_exec_usr_rw(query) < 0) {
1553 return AIL_ERROR_DB_FAILED;
1556 if (db_exec_glo_rw(query) < 0) {
1558 return AIL_ERROR_DB_FAILED;
1561 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1562 _D("query=%s",query);
1564 if(uid != GLOBAL_USER) {
1565 if (db_exec_usr_rw(query) < 0) {
1567 return AIL_ERROR_DB_FAILED;
1570 if (db_exec_glo_rw(query) < 0) {
1572 return AIL_ERROR_DB_FAILED;
1575 _D("Clean pkgid data (%s).", pkgid);
1578 return AIL_ERROR_OK;
1581 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1583 char *type_string, *noti_string;
1586 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1590 type_string = "create";
1593 type_string = "update";
1596 type_string = "delete";
1599 return AIL_ERROR_FAIL;
1602 size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid());
1603 noti_string = (char*) calloc(size + 1, sizeof(char));
1604 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1606 snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
1607 _D("Noti : %s", noti_string);
1611 return AIL_ERROR_OK;
1615 static void inline _name_item_free_func(gpointer data)
1617 struct name_item *item = (struct name_item *)data;
1619 SAFE_FREE(item->locale);
1620 item->locale = NULL;
1621 SAFE_FREE(item->name);
1627 static void _fini_desktop_info(desktop_info_s *info)
1629 SAFE_FREE(info->exec);
1630 SAFE_FREE(info->name);
1631 SAFE_FREE(info->type);
1632 SAFE_FREE(info->icon);
1633 SAFE_FREE(info->categories);
1634 SAFE_FREE(info->version);
1635 SAFE_FREE(info->mimetype);
1636 SAFE_FREE(info->x_slp_service);
1637 SAFE_FREE(info->x_slp_packagetype);
1638 SAFE_FREE(info->x_slp_packagecategories);
1639 SAFE_FREE(info->x_slp_packageid);
1640 SAFE_FREE(info->x_slp_uri);
1641 SAFE_FREE(info->x_slp_svc);
1642 SAFE_FREE(info->x_slp_exe_path);
1643 SAFE_FREE(info->x_slp_appid);
1644 SAFE_FREE(info->x_slp_pkgid);
1645 SAFE_FREE(info->x_slp_domain);
1646 SAFE_FREE(info->x_slp_submodemainid);
1647 SAFE_FREE(info->x_slp_installedstorage);
1648 SAFE_FREE(info->desktop);
1649 if (info->localname) {
1650 g_slist_free_full(info->localname, _name_item_free_func);
1651 info->localname = NULL;
1657 static int __is_authorized()
1659 uid_t uid = getuid();
1660 if ((uid_t) GLOBAL_USER == uid )
1666 /* Public functions */
1667 EXPORT_API ail_error_e ail_usr_desktop_add(const char *appid, uid_t uid)
1669 desktop_info_s info = {0,};
1672 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1674 ret = _init_desktop_info(&info, appid, uid);
1675 if (ret != AIL_ERROR_OK)
1678 ret = _read_desktop_info(&info, uid);
1679 if (ret != AIL_ERROR_OK)
1682 ret = _insert_desktop_info(&info, uid);
1683 if (ret != AIL_ERROR_OK)
1686 ret = _send_db_done_noti(NOTI_ADD, appid);
1689 _fini_desktop_info(&info);
1694 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1696 return ail_usr_desktop_add(appid, GLOBAL_USER);
1699 EXPORT_API ail_error_e ail_usr_desktop_update(const char *appid, uid_t uid)
1701 desktop_info_s info = {0,};
1704 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1706 ret = _init_desktop_info(&info, appid, uid);
1707 if (ret != AIL_ERROR_OK)
1710 ret = _read_desktop_info(&info, uid);
1711 if (ret != AIL_ERROR_OK)
1714 ret = _update_desktop_info(&info, uid);
1715 if (ret != AIL_ERROR_OK)
1718 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1721 _fini_desktop_info(&info);
1726 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1728 return ail_usr_desktop_update(appid,GLOBAL_USER);
1732 EXPORT_API ail_error_e ail_usr_desktop_remove(const char *appid, uid_t uid)
1736 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1738 ret = _remove_package(appid, uid);
1739 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1741 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1742 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1744 return AIL_ERROR_OK;
1747 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1749 return ail_usr_desktop_remove(appid, GLOBAL_USER);
1753 EXPORT_API ail_error_e ail_usr_desktop_clean(const char *pkgid, uid_t uid)
1757 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1759 _D("ail_desktop_clean=%s",pkgid);
1761 ret = _clean_pkgid_data(pkgid, uid);
1762 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1764 return AIL_ERROR_OK;
1767 EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid)
1769 return ail_usr_desktop_clean(pkgid, GLOBAL_USER);
1772 EXPORT_API ail_error_e ail_usr_desktop_fota(const char *appid, uid_t uid)
1774 desktop_info_s info = {0,};
1777 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1779 ret = _init_desktop_info(&info, appid, uid);
1780 if (ret != AIL_ERROR_OK)
1783 ret = _read_desktop_info(&info,uid);
1784 if (ret != AIL_ERROR_OK)
1787 ret = _insert_desktop_info(&info, uid);
1790 _fini_desktop_info(&info);
1795 EXPORT_API ail_error_e ail_desktop_fota(const char *appid)
1797 return ail_usr_desktop_fota(appid, GLOBAL_USER);
1801 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_bool(const char *appid,
1802 const char *property, bool value, bool broadcast, uid_t uid)
1804 desktop_info_s info = {0,};
1807 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1809 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1810 AIL_ERROR_INVALID_PARAMETER);
1812 ret = _init_desktop_info(&info, appid, uid);
1813 if (ret != AIL_ERROR_OK)
1816 ret = _load_desktop_info(&info, uid);
1817 if (ret != AIL_ERROR_OK)
1820 ret = _modify_desktop_info_bool(&info, property, value);
1821 if (ret != AIL_ERROR_OK)
1824 ret = _update_desktop_info(&info, uid);
1825 if (ret != AIL_ERROR_OK)
1829 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1832 _fini_desktop_info(&info);
1837 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1838 const char *property, bool value, bool broadcast)
1840 return ail_desktop_appinfo_modify_usr_bool(appid, property, value,
1841 broadcast, GLOBAL_USER);
1845 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_str(const char *appid,
1846 uid_t uid, const char *property, const char *value, bool broadcast)
1848 desktop_info_s info = {0,};
1851 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1853 ret = _init_desktop_info(&info, appid, uid);
1854 if (ret != AIL_ERROR_OK)
1857 ret = _load_desktop_info(&info, uid);
1858 if (ret != AIL_ERROR_OK)
1861 _D("info.name [%s], value [%s]", info.name, value);
1862 ret = _modify_desktop_info_str(&info, property, value);
1863 if (ret != AIL_ERROR_OK)
1866 _D("info.name [%s], value [%s]", info.name, value);
1868 ret = _update_desktop_info(&info, uid);
1869 if (ret != AIL_ERROR_OK)
1873 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1876 _fini_desktop_info(&info);
1881 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1882 const char *property, const char *value, bool broadcast)
1884 return ail_desktop_appinfo_modify_usr_str(appid, GLOBAL_USER, property,