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"
45 #include "ail_convert.h"
48 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
50 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
51 #define argsdelimiter " \t"
53 #define SQL_INSERT_LOCALNAME_STR "insert into localname (package, locale, name) values "
54 #define SQL_INSERT_LOCALNAME_STR_LEN (sizeof(SQL_INSERT_LOCALNAME_STR)-1)
56 #define SQL_INSERT_LOCALNAME_INIT_STR SQL_INSERT_LOCALNAME_STR"( ?, ?, ?) "
58 #define SQL_LOCALNAME_TRIPLET_STR ", ( ?, ?, ?)"
59 #define SQL_LOCALNAME_TRIPLET_STR_LEN (sizeof(SQL_LOCALNAME_TRIPLET_STR) - 1)
70 ail_error_e (*value_cb)(void *data, char *tag, char *value, uid_t uid);
73 static inline char *_ltrim(char *str)
78 while (*str == ' ' || *str == '\t' || *str == '\n')
84 static inline int _rtrim(char *str)
89 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t'))
110 char* x_slp_packagetype;
111 char* x_slp_packagecategories;
112 char* x_slp_packageid;
115 char* x_slp_exe_path;
119 char* x_slp_submodemainid;
120 char* x_slp_installedstorage;
121 int x_slp_baselayoutwidth;
122 int x_slp_installedtime;
124 int x_slp_taskmanage;
127 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;
168 static ail_error_e _read_name(void *data, char *tag, char *value, uid_t uid)
170 desktop_info_s *info = data;
172 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
173 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
174 retv_if(0 == strlen(value), AIL_ERROR_FAIL);
176 if (tag && strlen(tag) > 0) {
177 struct name_item *item;
178 item = (struct name_item *)calloc(1, sizeof(struct name_item));
179 retv_if(NULL == item, AIL_ERROR_OUT_OF_MEMORY);
181 SAFE_FREE_AND_STRDUP(tag, item->locale);
182 if (item->locale == NULL) {
183 _E("(NULL == item->locale) return\n");
185 return AIL_ERROR_OUT_OF_MEMORY;
188 SAFE_FREE_AND_STRDUP(value, item->name);
189 if (item->name == NULL) {
190 _E("(NULL == item->name) return\n");
193 return AIL_ERROR_OUT_OF_MEMORY;
196 info->localname = g_slist_append(info->localname, item);
200 SAFE_FREE_AND_STRDUP(value, info->name);
201 retv_if(!info->name, AIL_ERROR_OUT_OF_MEMORY);
207 static ail_error_e _read_type(void *data, char *tag, char *value, uid_t uid)
209 desktop_info_s *info = data;
211 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
212 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
214 SAFE_FREE_AND_STRDUP(value, info->type);
215 retv_if(!info->type, AIL_ERROR_OUT_OF_MEMORY);
220 static char *_get_package_from_icon(char* icon)
225 retv_if(!icon, NULL);
227 package = strdup(icon);
228 retv_if(!package, NULL);
229 extension = rindex(package, '.');
233 _E("cannot extract from icon [%s] to package.", icon);
239 _get_icon_with_path(char* icon, uid_t uid)
241 retv_if(!icon, NULL);
243 if (index(icon, '/') == NULL) {
246 char* icon_with_path = NULL;
248 const char *app_path = NULL;
250 package = _get_package_from_icon(icon);
251 retv_if(!package, NULL);
253 /* "db/setting/theme" is not exist */
254 theme = strdup("default");
261 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
262 icon_with_path = malloc(len);
263 if (icon_with_path == NULL) {
264 _E("icon_with_path == NULL\n");
270 memset(icon_with_path, 0, len);
272 if (uid != GLOBAL_USER)
273 sqlite3_snprintf(len, icon_with_path, "%s%q", ail_get_icon_path(uid), icon);
275 sqlite3_snprintf(len, icon_with_path, "%s/%q/small/%q", ail_get_icon_path(GLOBAL_USER), theme, icon);
277 if (access(icon_with_path, F_OK)) {
278 app_path = tzplatform_getenv(TZ_SYS_RW_APP);
280 sqlite3_snprintf(len, icon_with_path, "%s/%q/res/icons/%q/small/%q", app_path, package, theme, icon);
281 if (access(icon_with_path, F_OK))
282 _E("Cannot find icon path");
286 _D("Icon path : %s", icon_with_path);
287 return icon_with_path;
289 char* confirmed_icon = NULL;
291 confirmed_icon = strdup(icon);
292 retv_if(!confirmed_icon, NULL);
293 return confirmed_icon;
297 static ail_error_e _read_icon(void *data, char *tag, char *value, uid_t uid)
299 desktop_info_s *info = data;
301 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
302 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
304 info->icon = _get_icon_with_path(value, uid);
306 retv_if(!info->icon, AIL_ERROR_OUT_OF_MEMORY);
311 static ail_error_e _read_categories(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 SAFE_FREE_AND_STRDUP(value, info->categories);
319 retv_if(!info->categories, AIL_ERROR_OUT_OF_MEMORY);
324 static ail_error_e _read_version(void *data, char *tag, char *value, uid_t uid)
326 desktop_info_s *info = data;
328 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
329 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
331 SAFE_FREE_AND_STRDUP(value, info->version);
332 retv_if(!info->version, AIL_ERROR_OUT_OF_MEMORY);
337 static ail_error_e _read_mimetype(void *data, char *tag, char *value, uid_t uid)
339 desktop_info_s *info = data;
340 int size, total_len = 0;
341 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
343 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
344 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
345 retv_if(!strlen(value), AIL_ERROR_FAIL);
347 mimes_origin = strdup(value);
348 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
350 size = getpagesize();
351 mimes_changed = calloc(1, size);
352 if (mimes_changed == NULL) {
353 _E("(mimes_changed == NULL) return\n");
355 return AIL_ERROR_OUT_OF_MEMORY;
358 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
360 while (token_unalias) {
362 const char *token_alias;
364 _rtrim(token_unalias);
365 token_unalias = _ltrim(token_unalias);
367 token_alias = xdg_mime_unalias_mime_type(token_unalias);
368 if (!token_alias) continue;
370 token_len = strlen(token_alias);
371 if (total_len + token_len + (1<<1) >= size) {
374 tmp = realloc(mimes_changed, size);
377 return AIL_ERROR_OUT_OF_MEMORY;
382 strncat(mimes_changed, token_alias, size-1);
383 total_len += token_len;
385 token_unalias = strtok_r(NULL, ";", &save_ptr);
387 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
390 SAFE_FREE(info->mimetype);
391 info->mimetype = mimes_changed;
396 static ail_error_e _read_nodisplay(void *data, char *tag, char *value, uid_t uid)
398 desktop_info_s* info = data;
400 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
401 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
403 info->nodisplay = !strcasecmp(value, "true");
410 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value, uid_t uid)
412 desktop_info_s *info = data;
414 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
415 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
417 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
418 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
425 static ail_error_e _read_x_slp_packagetype(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 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
433 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
440 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value, uid_t uid)
442 desktop_info_s *info = data;
444 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
445 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
447 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
448 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
455 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value, uid_t uid)
457 desktop_info_s *info = data;
459 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
460 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
462 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
463 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
468 static ail_error_e _read_x_slp_submodemainid(void *data, char *tag, char *value, uid_t uid)
470 desktop_info_s *info = data;
472 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
473 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
475 SAFE_FREE_AND_STRDUP(value, info->x_slp_submodemainid);
476 retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY);
481 static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value, uid_t uid)
483 desktop_info_s *info = data;
485 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
486 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
488 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
489 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
494 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value, uid_t uid)
496 desktop_info_s *info = data;
498 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
499 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
501 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
502 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
509 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value, uid_t uid)
511 desktop_info_s *info = data;
513 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
514 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
516 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
517 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
524 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value, uid_t uid)
526 desktop_info_s *info = data;
528 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
529 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
531 info->x_slp_taskmanage = !strcasecmp(value, "true");
538 static ail_error_e _read_x_slp_multiple(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 info->x_slp_multiple = !strcasecmp(value, "true");
552 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value, uid_t uid)
554 desktop_info_s *info = data;
556 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
557 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
559 info->x_slp_removable = !strcasecmp(value, "true");
565 static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value, uid_t uid)
567 desktop_info_s *info = data;
569 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
570 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
572 info->x_slp_submode = !strcasecmp(value, "true");
577 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value, uid_t uid)
579 desktop_info_s *info = data;
581 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
582 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
584 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
585 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
591 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value, uid_t uid)
593 desktop_info_s *info = data;
595 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
596 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
598 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
599 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
605 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value, uid_t uid)
607 desktop_info_s *info = data;
609 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
610 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
612 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
613 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
619 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value, uid_t uid)
621 desktop_info_s *info = data;
623 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
624 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
626 info->x_slp_enabled = !strcasecmp(value, "true");
632 static struct entry_parser entry_parsers[] = {
635 .value_cb = _read_exec,
639 .value_cb = _read_name,
643 .value_cb = _read_type,
647 .value_cb = _read_icon,
650 .field = "categories",
651 .value_cb = _read_categories,
655 .value_cb = _read_version,
659 .value_cb = _read_mimetype,
662 .field = "x-tizen-service",
663 .value_cb = _read_x_slp_service,
666 .field = "x-tizen-packagetype",
667 .value_cb = _read_x_slp_packagetype,
670 .field = "x-tizen-packagecategories",
671 .value_cb = _read_x_slp_packagecategories,
674 .field = "x-tizen-packageid",
675 .value_cb = _read_x_slp_packageid,
678 .field = "x-tizen-submodemainid",
679 .value_cb = _read_x_slp_submodemainid,
682 .field = "x-tizen-installedstorage",
683 .value_cb = _read_x_slp_installedstorage,
686 .field = "x-tizen-uri",
687 .value_cb = _read_x_slp_uri,
690 .field = "x-tizen-svc",
691 .value_cb = _read_x_slp_svc,
694 .field = "nodisplay",
695 .value_cb = _read_nodisplay,
698 .field = "x-tizen-taskmanage",
699 .value_cb = _read_x_slp_taskmanage,
702 .field = "x-tizen-enabled",
703 .value_cb = _read_x_slp_enabled,
706 .field = "x-tizen-submode",
707 .value_cb = _read_x_slp_submode,
710 .field = "x-tizen-multiple",
711 .value_cb = _read_x_slp_multiple,
714 .field = "x-tizen-removable",
715 .value_cb = _read_x_slp_removable,
718 .field = "x-tizen-appid",
719 .value_cb = _read_x_slp_appid,
722 .field = "x-tizen-pkgid",
723 .value_cb = _read_x_slp_pkgid,
726 .field = "x-tizen-domain",
727 .value_cb = _read_x_slp_domain,
730 .field = "x-tizen-enabled",
731 .value_cb = _read_x_slp_domain,
739 char *_pkgname_to_desktop(const char *package, uid_t uid)
745 retv_if(!package, NULL);
747 desktop_path = ail_get_desktop_path(uid);
748 if (desktop_path == NULL) {
749 _E("Failed to get desktop path");
753 size = strlen(desktop_path) + strlen(package) + 10;
754 desktop = malloc(size);
755 if (desktop == NULL) {
761 snprintf(desktop, size, "%s/%s.desktop", desktop_path, package);
762 _D("uid: %d / desktop: [%s]\n", uid, desktop);
769 static inline int _bind_local_info(desktop_info_s* info, sqlite3_stmt * stmt)
772 struct name_item *item;
775 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
776 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
777 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
779 localname = info->localname;
781 item = (struct name_item *) localname->data;
782 if (item && item->locale && item->name) {
783 /* Bind values for a triplet : package, locale, name */
784 retv_if(db_bind_text(stmt, i+1, info->package) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
785 retv_if(db_bind_text(stmt, i+2, item->locale) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
786 retv_if(db_bind_text(stmt, i+3, item->name) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
789 localname = g_slist_next(localname);
795 static inline int _len_local_info(desktop_info_s* info)
798 struct name_item *item;
800 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
801 if (info->localname) {
802 localname = info->localname;
804 item = (struct name_item *) localname->data;
805 if (item && item->locale && item->name)
807 localname = g_slist_next(localname);
813 static inline int _insert_local_info(desktop_info_s* info, uid_t uid)
815 int len_query = SQL_INSERT_LOCALNAME_STR_LEN;
818 int ret = AIL_ERROR_OK;
819 sqlite3_stmt *stmt = NULL;
822 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
823 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
825 nb_locale_args = _len_local_info(info);
826 retv_if(!nb_locale_args, AIL_ERROR_INVALID_PARAMETER);
828 len_query += SQL_LOCALNAME_TRIPLET_STR_LEN*nb_locale_args + 1;
830 query = (char *)malloc(len_query);
831 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
833 stpncpy(query, SQL_INSERT_LOCALNAME_INIT_STR, len_query);
834 for (i = 0; i < nb_locale_args - 1; i++)
835 strncat(query, SQL_LOCALNAME_TRIPLET_STR, len_query - strlen(query) - 1);
838 if (uid != GLOBAL_USER)
839 ret = db_prepare_rw(query, &stmt);
841 ret = db_prepare_globalrw(query, &stmt);
846 ret = _bind_local_info(info, stmt);
848 _E("Can't bind locale information to this query - %s. ", query);
854 if (ret != AIL_ERROR_NO_DATA) {
855 /* Insert Request doesn't return any data.
856 * db_step should returns AIL_ERROR_NO_DATA in this case. */
857 _E("Can't execute this query - %s. ", query);
862 ret = db_finalize(stmt);
870 static inline int _strlen_desktop_info(desktop_info_s* info)
874 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
876 if (info->package) len += strlen(info->package);
877 if (info->exec) len += strlen(info->exec);
878 if (info->name) len += strlen(info->name);
879 if (info->type) len += strlen(info->type);
880 if (info->icon) len += strlen(info->icon);
881 if (info->categories) len += strlen(info->categories);
882 if (info->version) len += strlen(info->version);
883 if (info->mimetype) len += strlen(info->mimetype);
884 if (info->x_slp_service) len += strlen(info->x_slp_service);
885 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
886 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
887 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
888 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
889 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
890 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
891 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
892 if (info->desktop) len += strlen(info->desktop);
893 if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid);
894 if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage);
899 int __is_ail_initdb(void)
901 if (getenv("AIL_INITDB") || getenv("INITDB"))
907 /* Manipulating desktop_info functions */
908 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package, uid_t uid)
910 static int is_initdb = -1;
912 _D("package - [%s].", package);
915 is_initdb = __is_ail_initdb();
917 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
918 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
921 info->package = package;
923 info->x_slp_taskmanage = 1;
924 info->x_slp_removable = 1;
925 info->x_slp_submode = 0;
928 info->x_slp_installedtime = 0;
930 info->x_slp_installedtime = time(NULL);
933 info->x_slp_packagetype = strdup(PKGTYPE);
935 info->x_slp_packagetype = strdup("rpm");
937 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
939 info->x_slp_packageid = strdup(package);
940 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
942 info->x_slp_appid = strdup(package);
943 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
945 info->x_slp_enabled = 1;
947 info->desktop = _pkgname_to_desktop(package, uid);
948 retv_if(!info->desktop, AIL_ERROR_FAIL);
950 _D("desktop - [%s].", info->desktop);
955 static ail_error_e _read_desktop_info(desktop_info_s *info, uid_t uid)
962 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
964 fp = fopen(info->desktop, "r");
965 retv_if(!fp, AIL_ERROR_FAIL);
967 while ((read = getline(&line, &size, fp)) != -1) {
969 char *tmp, *field, *field_name, *tag, *value;
976 if (_rtrim(tmp) <= 0)
979 len = strlen(line) + 1;
980 field = calloc(1, len);
981 field_name = calloc(1, len);
982 tag = calloc(1, len);
983 value = calloc(1, len);
985 if (!field || !field_name || !tag || !value)
988 sscanf(tmp, "%[^=]=%[^\n]", field, value);
992 sscanf(field, "%[^[][%[^]]]", field_name, tag);
994 if (!field_name || !strlen(field_name))
997 for (idx = 0; entry_parsers[idx].field; idx++) {
998 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
999 if (entry_parsers[idx].value_cb(info, tag, tmp, uid) != AIL_ERROR_OK)
1000 _E("field - [%s] is wrong.", field_name);
1006 SAFE_FREE(field_name);
1011 _D("Read (%s).", info->package);
1014 return AIL_ERROR_OK;
1018 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
1025 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1027 values = calloc(NUM_OF_PROP, sizeof(char *));
1028 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
1030 for (i = 0; i < NUM_OF_PROP; i++) {
1031 err = db_column_str(stmt, i, &col);
1032 if (AIL_ERROR_OK != err)
1038 values[i] = strdup(col);
1040 err = AIL_ERROR_OUT_OF_MEMORY;
1046 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
1047 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
1048 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
1049 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
1050 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
1051 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
1052 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
1053 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
1054 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
1055 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
1056 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
1057 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
1058 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
1059 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
1060 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
1061 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
1062 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
1063 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid);
1064 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage);
1066 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
1068 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
1069 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
1070 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
1071 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
1072 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
1073 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
1074 info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]);
1079 for (j = 0; j < i; ++j) {
1089 static ail_error_e _load_desktop_info(desktop_info_s* info, uid_t uid)
1092 char query[AIL_SQL_QUERY_MAX_LEN];
1093 sqlite3_stmt *stmt = NULL;
1094 char w[AIL_SQL_QUERY_MAX_LEN];
1097 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1099 filter = sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR);
1101 return AIL_ERROR_FAIL;
1103 snprintf(w, sizeof(w), filter, info->package);
1104 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s", SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
1107 ret = db_open(DB_OPEN_RO, uid);
1111 if (uid != GLOBAL_USER)
1112 ret = db_prepare(query, &stmt);
1114 ret = db_prepare_globalro(query, &stmt);
1119 ret = db_step(stmt);
1125 ret = _retrieve_all_column_to_desktop_info(info, stmt);
1131 ret = db_finalize(stmt);
1135 return AIL_ERROR_OK;
1141 static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
1142 const char *property,
1145 ail_prop_bool_e prop;
1147 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1148 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1150 prop = _ail_convert_to_prop_bool(property);
1152 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1153 return AIL_ERROR_INVALID_PARAMETER;
1156 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1157 info->x_slp_enabled = (int)value;
1160 return AIL_ERROR_FAIL;
1163 return AIL_ERROR_OK;
1167 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1168 const char *property,
1173 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1174 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1176 prop = _ail_convert_to_prop_str(property);
1178 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1179 return AIL_ERROR_INVALID_PARAMETER;
1182 case E_AIL_PROP_NAME_STR:
1183 SAFE_FREE_AND_STRDUP(value, info->name);
1184 retv_if(!info->name, AIL_ERROR_OUT_OF_MEMORY);
1186 case E_AIL_PROP_X_SLP_SVC_STR:
1187 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1188 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1190 case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR:
1191 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
1192 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
1195 _E("prop[%d] is not defined\n", prop);
1196 return AIL_ERROR_FAIL;
1199 return AIL_ERROR_OK;
1203 static inline void _insert_localname(gpointer data, gpointer user_data, uid_t uid)
1207 struct name_item *item = (struct name_item *)data;
1208 desktop_info_s *info = (desktop_info_s *)user_data;
1210 sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) "
1211 "values ('%q', '%q', '%q', '%q');",
1212 info->package, item->locale, item->name, info->x_slp_pkgid);
1213 if (uid != GLOBAL_USER) {
1214 if (db_exec_usr_rw(query) < 0)
1215 _E("Failed to insert local name of package[%s]", info->package);
1217 if (db_exec_glo_rw(query) < 0)
1218 _E("Failed to insert local name of package[%s]", info->package);
1222 static ail_error_e _insert_desktop_info(desktop_info_s *info, uid_t uid)
1228 len = _strlen_desktop_info(info) + (0x01 << 10);
1229 query = calloc(1, len);
1230 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1232 sqlite3_snprintf(len, query, "insert into app_info ("
1241 "x_slp_packagetype, "
1242 "x_slp_packagecategories, "
1250 "x_slp_submodemainid, "
1251 "x_slp_installedstorage, "
1252 "x_slp_baselayoutwidth, "
1253 "x_slp_installedtime, "
1255 "x_slp_taskmanage, "
1258 "x_slp_ishorizontalscale, "
1263 "('%q', '%q', '%q', '%q', '%q', "
1264 "'%q', '%q', '%q', '%q', '%q', "
1265 "'%q', '%q', '%q', '%q', '%q', "
1266 "'%q', '%q', '%q', '%q', '%q', "
1267 "%d, %d, %d, %d, %d, %d, %d,"
1278 info->x_slp_service,
1279 info->x_slp_packagetype,
1280 info->x_slp_packagecategories,
1281 info->x_slp_packageid,
1284 info->x_slp_exe_path,
1288 info->x_slp_submodemainid,
1289 info->x_slp_installedstorage,
1290 info->x_slp_baselayoutwidth,
1291 info->x_slp_installedtime,
1293 info->x_slp_taskmanage,
1294 info->x_slp_multiple,
1295 info->x_slp_removable,
1296 info->x_slp_ishorizontalscale,
1297 info->x_slp_enabled,
1298 info->x_slp_submode,
1302 ret = db_open(DB_OPEN_RW, uid);
1303 if (ret != AIL_ERROR_OK) {
1304 _E("(tmp == NULL) return\n");
1306 return AIL_ERROR_DB_FAILED;
1308 if (uid != GLOBAL_USER)
1309 ret = db_exec_usr_rw(query);
1311 ret = db_exec_glo_rw(query);
1313 _D("Add (%s).", query);
1316 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1318 if (info->localname)
1319 _insert_local_info(info, uid);
1321 return AIL_ERROR_OK;
1324 static ail_error_e _update_desktop_info(desktop_info_s *info, uid_t uid)
1329 retv_if(NULL == info, AIL_ERROR_INVALID_PARAMETER);
1331 if (db_open(DB_OPEN_RW, uid) < 0)
1332 return AIL_ERROR_DB_FAILED;
1334 len = _strlen_desktop_info(info) + (0x01 << 10);
1335 query = calloc(1, len);
1336 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1338 sqlite3_snprintf(len, query, "update app_info set "
1346 "x_slp_service='%q', "
1347 "x_slp_packagetype='%q', "
1348 "x_slp_packagecategories='%q', "
1349 "x_slp_packageid='%q', "
1352 "x_slp_exe_path='%q', "
1353 "x_slp_appid='%q', "
1354 "x_slp_pkgid='%q', "
1355 "x_slp_domain='%q', "
1356 "x_slp_submodemainid='%q', "
1357 "x_slp_installedstorage='%q', "
1358 "x_slp_baselayoutwidth=%d, "
1359 "x_slp_installedtime=%d, "
1361 "x_slp_taskmanage=%d, "
1362 "x_slp_multiple=%d, "
1363 "x_slp_removable=%d, "
1364 "x_slp_ishorizontalscale=%d, "
1365 "x_slp_enabled=%d, "
1366 "x_slp_submode=%d, "
1368 "where package='%q'",
1376 info->x_slp_service,
1377 info->x_slp_packagetype,
1378 info->x_slp_packagecategories,
1379 info->x_slp_packageid,
1382 info->x_slp_exe_path,
1386 info->x_slp_submodemainid,
1387 info->x_slp_installedstorage,
1388 info->x_slp_baselayoutwidth,
1389 info->x_slp_installedtime,
1391 info->x_slp_taskmanage,
1392 info->x_slp_multiple,
1393 info->x_slp_removable,
1394 info->x_slp_ishorizontalscale,
1395 info->x_slp_enabled,
1396 info->x_slp_submode,
1400 if (uid != GLOBAL_USER) {
1401 if (db_exec_usr_rw(query) < 0) {
1403 return AIL_ERROR_DB_FAILED;
1406 if (db_exec_glo_rw(query) < 0) {
1408 return AIL_ERROR_DB_FAILED;
1411 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1412 if (uid != GLOBAL_USER) {
1413 if (db_exec_usr_rw(query) < 0) {
1415 return AIL_ERROR_DB_FAILED;
1418 if (db_exec_glo_rw(query) < 0) {
1420 return AIL_ERROR_DB_FAILED;
1423 if (info->localname)
1424 _insert_local_info(info, uid);
1426 _D("Update (%s).", info->package);
1430 return AIL_ERROR_OK;
1435 static ail_error_e _remove_package(const char* package, uid_t uid)
1440 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1442 if (db_open(DB_OPEN_RW, uid) < 0)
1443 return AIL_ERROR_DB_FAILED;
1445 size = strlen(package) + (0x01 << 10);
1446 query = calloc(1, size);
1447 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1449 snprintf(query, size, "delete from app_info where package = '%s'", package);
1451 if (uid != GLOBAL_USER) {
1452 if (db_exec_usr_rw(query) < 0) {
1454 return AIL_ERROR_DB_FAILED;
1457 if (db_exec_glo_rw(query) < 0) {
1459 return AIL_ERROR_DB_FAILED;
1462 snprintf(query, size, "delete from localname where package = '%s'", package);
1463 _D("query=%s", query);
1465 if (uid != GLOBAL_USER) {
1466 if (db_exec_usr_rw(query) < 0) {
1468 return AIL_ERROR_DB_FAILED;
1471 if (db_exec_glo_rw(query) < 0) {
1473 return AIL_ERROR_DB_FAILED;
1476 _D("Remove (%s).", package);
1479 return AIL_ERROR_OK;
1482 static ail_error_e _clean_pkgid_data(const char* pkgid, uid_t uid)
1487 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1489 if (db_open(DB_OPEN_RW, uid))
1490 return AIL_ERROR_DB_FAILED;
1492 size = strlen(pkgid) + (0x01 << 10);
1493 query = calloc(1, size);
1494 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1496 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1498 if (uid != GLOBAL_USER) {
1499 if (db_exec_usr_rw(query) < 0) {
1501 return AIL_ERROR_DB_FAILED;
1504 if (db_exec_glo_rw(query) < 0) {
1506 return AIL_ERROR_DB_FAILED;
1509 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1510 _D("query=%s", query);
1512 if (uid != GLOBAL_USER) {
1513 if (db_exec_usr_rw(query) < 0) {
1515 return AIL_ERROR_DB_FAILED;
1518 if (db_exec_glo_rw(query) < 0) {
1520 return AIL_ERROR_DB_FAILED;
1523 _D("Clean pkgid data (%s).", pkgid);
1526 return AIL_ERROR_OK;
1529 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1531 char *type_string, *noti_string;
1534 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1538 type_string = "create";
1541 type_string = "update";
1544 type_string = "delete";
1547 return AIL_ERROR_FAIL;
1550 size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid());
1551 noti_string = (char*) calloc(size + 1, sizeof(char));
1552 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1554 snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
1555 _D("Noti : %s", noti_string);
1559 return AIL_ERROR_OK;
1562 static inline void _name_item_free_func(gpointer data)
1564 struct name_item *item = (struct name_item *)data;
1566 SAFE_FREE(item->locale);
1567 item->locale = NULL;
1568 SAFE_FREE(item->name);
1574 static void _fini_desktop_info(desktop_info_s *info)
1576 SAFE_FREE(info->exec);
1577 SAFE_FREE(info->name);
1578 SAFE_FREE(info->type);
1579 SAFE_FREE(info->icon);
1580 SAFE_FREE(info->categories);
1581 SAFE_FREE(info->version);
1582 SAFE_FREE(info->mimetype);
1583 SAFE_FREE(info->x_slp_service);
1584 SAFE_FREE(info->x_slp_packagetype);
1585 SAFE_FREE(info->x_slp_packagecategories);
1586 SAFE_FREE(info->x_slp_packageid);
1587 SAFE_FREE(info->x_slp_uri);
1588 SAFE_FREE(info->x_slp_svc);
1589 SAFE_FREE(info->x_slp_exe_path);
1590 SAFE_FREE(info->x_slp_appid);
1591 SAFE_FREE(info->x_slp_pkgid);
1592 SAFE_FREE(info->x_slp_domain);
1593 SAFE_FREE(info->x_slp_submodemainid);
1594 SAFE_FREE(info->x_slp_installedstorage);
1595 SAFE_FREE(info->desktop);
1596 if (info->localname) {
1597 g_slist_free_full(info->localname, _name_item_free_func);
1598 info->localname = NULL;
1604 /* Public functions */
1605 EXPORT_API ail_error_e ail_usr_desktop_add(const char *appid, uid_t uid)
1607 desktop_info_s info = {0,};
1610 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1612 ret = _init_desktop_info(&info, appid, uid);
1613 if (ret != AIL_ERROR_OK)
1616 ret = _read_desktop_info(&info, uid);
1617 if (ret != AIL_ERROR_OK)
1620 ret = _insert_desktop_info(&info, uid);
1621 if (ret != AIL_ERROR_OK)
1624 ret = _send_db_done_noti(NOTI_ADD, appid);
1627 _fini_desktop_info(&info);
1632 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1634 return ail_usr_desktop_add(appid, GLOBAL_USER);
1637 EXPORT_API ail_error_e ail_usr_desktop_update(const char *appid, uid_t uid)
1639 desktop_info_s info = {0,};
1642 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1644 ret = _init_desktop_info(&info, appid, uid);
1645 if (ret != AIL_ERROR_OK)
1648 ret = _read_desktop_info(&info, uid);
1649 if (ret != AIL_ERROR_OK)
1652 ret = _update_desktop_info(&info, uid);
1653 if (ret != AIL_ERROR_OK)
1656 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1659 _fini_desktop_info(&info);
1664 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1666 return ail_usr_desktop_update(appid, GLOBAL_USER);
1669 EXPORT_API ail_error_e ail_usr_desktop_remove(const char *appid, uid_t uid)
1673 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1675 ret = _remove_package(appid, uid);
1676 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1678 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1679 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1681 return AIL_ERROR_OK;
1684 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1686 return ail_usr_desktop_remove(appid, GLOBAL_USER);
1690 EXPORT_API ail_error_e ail_usr_desktop_clean(const char *pkgid, uid_t uid)
1694 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1696 _D("ail_desktop_clean=%s", pkgid);
1698 ret = _clean_pkgid_data(pkgid, uid);
1699 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1701 return AIL_ERROR_OK;
1704 EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid)
1706 return ail_usr_desktop_clean(pkgid, GLOBAL_USER);
1709 EXPORT_API ail_error_e ail_usr_desktop_fota(const char *appid, uid_t uid)
1711 desktop_info_s info = {0,};
1714 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1716 ret = _init_desktop_info(&info, appid, uid);
1717 if (ret != AIL_ERROR_OK)
1720 ret = _read_desktop_info(&info, uid);
1721 if (ret != AIL_ERROR_OK)
1724 ret = _insert_desktop_info(&info, uid);
1727 _fini_desktop_info(&info);
1732 EXPORT_API ail_error_e ail_desktop_fota(const char *appid)
1734 return ail_usr_desktop_fota(appid, GLOBAL_USER);
1738 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_bool(const char *appid,
1739 const char *property, bool value, bool broadcast, uid_t uid)
1741 desktop_info_s info = {0,};
1744 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1746 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1747 AIL_ERROR_INVALID_PARAMETER);
1749 ret = _init_desktop_info(&info, appid, uid);
1750 if (ret != AIL_ERROR_OK)
1753 ret = _load_desktop_info(&info, uid);
1754 if (ret != AIL_ERROR_OK)
1757 ret = _modify_desktop_info_bool(&info, property, value);
1758 if (ret != AIL_ERROR_OK)
1761 ret = _update_desktop_info(&info, uid);
1762 if (ret != AIL_ERROR_OK)
1766 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1769 _fini_desktop_info(&info);
1774 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1775 const char *property, bool value, bool broadcast)
1777 return ail_desktop_appinfo_modify_usr_bool(appid, property, value,
1778 broadcast, GLOBAL_USER);
1782 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_str(const char *appid,
1783 uid_t uid, const char *property, const char *value, bool broadcast)
1785 desktop_info_s info = {0,};
1788 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1790 ret = _init_desktop_info(&info, appid, uid);
1791 if (ret != AIL_ERROR_OK)
1794 ret = _load_desktop_info(&info, uid);
1795 if (ret != AIL_ERROR_OK)
1798 _D("info.name [%s], value [%s]", info.name, value);
1799 ret = _modify_desktop_info_str(&info, property, value);
1800 if (ret != AIL_ERROR_OK)
1803 _D("info.name [%s], value [%s]", info.name, value);
1805 ret = _update_desktop_info(&info, uid);
1806 if (ret != AIL_ERROR_OK)
1810 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1813 _fini_desktop_info(&info);
1818 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1819 const char *property, const char *value, bool broadcast)
1821 return ail_desktop_appinfo_modify_usr_str(appid, GLOBAL_USER, property,