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"
47 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
48 #define argsdelimiter " \t"
50 #define SQL_INSERT_LOCALNAME_STR "insert into localname (package, locale, name) values "
51 #define SQL_INSERT_LOCALNAME_STR_LEN (sizeof(SQL_INSERT_LOCALNAME_STR)-1)
53 #define SQL_INSERT_LOCALNAME_INIT_STR SQL_INSERT_LOCALNAME_STR"( ?, ?, ?) "
55 #define SQL_LOCALNAME_TRIPLET_STR ", ( ?, ?, ?)"
56 #define SQL_LOCALNAME_TRIPLET_STR_LEN (sizeof(SQL_LOCALNAME_TRIPLET_STR)-1)
67 ail_error_e (*value_cb)(void *data, char *tag, char *value);
70 inline static char *_ltrim(char *str)
72 if (!str) return NULL;
74 while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
81 inline static int _rtrim(char *str)
86 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
106 char* x_slp_packagetype;
107 char* x_slp_packagecategories;
108 char* x_slp_packageid;
111 char* x_slp_exe_path;
115 char* x_slp_submodemainid;
116 char* x_slp_installedstorage;
117 int x_slp_baselayoutwidth;
118 int x_slp_installedtime;
120 int x_slp_taskmanage;
123 int x_slp_ishorizontalscale;
132 static ail_error_e _read_exec(void *data, char *tag, char *value)
134 desktop_info_s *info = data;
135 char *token_exe_path;
139 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
140 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
142 SAFE_FREE_AND_STRDUP(value, info->exec);
143 retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
145 temp_exec = strdup(value);
148 return AIL_ERROR_OUT_OF_MEMORY;
151 token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
153 info->x_slp_exe_path = strdup(token_exe_path);
154 if(!info->x_slp_exe_path) {
158 return AIL_ERROR_OUT_OF_MEMORY;
168 static ail_error_e _read_name(void *data, char *tag, char *value)
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(NULL == item->locale) {
183 _E("(NULL == item->locale) return\n");
185 return AIL_ERROR_OUT_OF_MEMORY;
188 SAFE_FREE_AND_STRDUP(value, item->name);
189 if(NULL == item->name) {
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);
209 static ail_error_e _read_type(void *data, char *tag, char *value)
211 desktop_info_s *info = data;
213 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
214 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
216 SAFE_FREE_AND_STRDUP(value, info->type);
217 retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
224 _get_package_from_icon(char* icon)
229 retv_if(!icon, NULL);
231 package = strdup(icon);
232 retv_if(!package, NULL);
233 extension = rindex(package, '.');
237 _E("cannot extract from icon [%s] to package.", icon);
245 _get_icon_with_path(char* icon, uid_t uid)
247 retv_if(!icon, NULL);
249 if (index(icon, '/') == NULL) {
252 char* icon_with_path = NULL;
255 package = _get_package_from_icon(icon);
256 retv_if(!package, NULL);
258 /* "db/setting/theme" is not exist */
260 theme = vconf_get_str("db/setting/theme");
262 theme = strdup("default");
269 theme = strdup("default");
272 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
273 icon_with_path = malloc(len);
274 if(icon_with_path == NULL) {
275 _E("(icon_with_path == NULL) return\n");
281 memset(icon_with_path, 0, len);
283 sqlite3_snprintf( len, icon_with_path,"%s/%q/small/%q", ail_get_icon_path(uid), theme, icon);
285 if (access(icon_with_path, R_OK) == 0) break;
286 sqlite3_snprintf( len, icon_with_path,"%s/%q/small/%q", tzplatform_getenv(TZ_SYS_RO_ICONS), theme, icon);
287 if (access(icon_with_path, R_OK) == 0) break;
288 _D("cannot find icon %s", icon_with_path);
289 sqlite3_snprintf( len, icon_with_path, "%s/default/small/%q", ail_get_icon_path(uid), icon);
290 if (access(icon_with_path, R_OK) == 0) break;
291 sqlite3_snprintf( len, icon_with_path, "%s/default/small/%q", tzplatform_getenv(TZ_SYS_RO_ICONS), icon);
292 if (access(icon_with_path, R_OK) == 0) break;
294 #if 1 /* this will be remove when finish the work for moving icon path */
295 _E("icon file must be moved to %s", icon_with_path);
296 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q", tzplatform_getenv(TZ_SYS_RW_APP), package, theme, icon);
297 if (access(icon_with_path, R_OK) == 0) break;
298 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/%q/small/%q", tzplatform_getenv(TZ_SYS_RO_APP), package, theme, icon);
299 if (access(icon_with_path, R_OK) == 0) break;
300 _D("cannot find icon %s", icon_with_path);
301 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/default/small/%q", tzplatform_getenv(TZ_SYS_RW_APP), package, icon);
302 if (access(icon_with_path, R_OK) == 0) break;
303 sqlite3_snprintf( len, icon_with_path, "%s/%q/res/icons/default/small/%q", tzplatform_getenv(TZ_SYS_RO_APP), package, icon);
304 if (access(icon_with_path, R_OK) == 0) break;
311 _D("Icon path : %s ---> %s", icon, icon_with_path);
313 return icon_with_path;
315 char* confirmed_icon = NULL;
317 confirmed_icon = strdup(icon);
318 retv_if(!confirmed_icon, NULL);
319 return confirmed_icon;
324 static ail_error_e _read_icon(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 info->icon = _get_icon_with_path(value, uid);
333 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
340 static ail_error_e _read_categories(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->categories);
348 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
355 static ail_error_e _read_version(void *data, char *tag, char *value)
357 desktop_info_s *info = data;
359 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
360 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
362 SAFE_FREE_AND_STRDUP(value, info->version);
363 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
370 static ail_error_e _read_mimetype(void *data, char *tag, char *value)
372 desktop_info_s *info = data;
373 int size, total_len = 0;
374 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
376 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
377 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
378 retv_if(!strlen(value), AIL_ERROR_FAIL);
380 mimes_origin = strdup(value);
381 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
383 size = getpagesize();
384 mimes_changed = calloc(1, size);
385 if(mimes_changed == NULL) {
386 _E("(mimes_changed == NULL) return\n");
388 return AIL_ERROR_OUT_OF_MEMORY;
391 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
393 while (token_unalias) {
395 const char *token_alias;
397 _rtrim(token_unalias);
398 token_unalias = _ltrim(token_unalias);
400 token_alias = xdg_mime_unalias_mime_type(token_unalias);
401 if (!token_alias) continue;
403 token_len = strlen(token_alias);
404 if (total_len + token_len + (1<<1) >= size) {
407 tmp = realloc(mimes_changed, size);
410 return AIL_ERROR_OUT_OF_MEMORY;
415 strncat(mimes_changed, token_alias, size-1);
416 total_len += token_len;
418 token_unalias = strtok_r(NULL, ";", &save_ptr);
420 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
424 SAFE_FREE(info->mimetype);
425 info->mimetype = mimes_changed;
432 static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
434 desktop_info_s* info = data;
436 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
437 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
439 info->nodisplay = !strcasecmp(value, "true");
446 static ail_error_e _read_x_slp_service(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_service);
454 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
461 static ail_error_e _read_x_slp_packagetype(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_packagetype);
469 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
476 static ail_error_e _read_x_slp_packagecategories(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_packagecategories);
484 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
491 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
493 desktop_info_s *info = data;
495 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
496 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
498 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
499 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
504 static ail_error_e _read_x_slp_submodemainid(void *data, char *tag, char *value)
506 desktop_info_s *info = data;
508 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
509 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
511 SAFE_FREE_AND_STRDUP(value, info->x_slp_submodemainid);
512 retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY);
517 static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value)
519 desktop_info_s *info = data;
521 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
522 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
524 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
525 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
530 static ail_error_e _read_x_slp_uri(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_uri);
538 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
545 static ail_error_e _read_x_slp_svc(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 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
553 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
560 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
562 desktop_info_s *info = data;
564 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
565 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
567 info->x_slp_taskmanage = !strcasecmp(value, "true");
574 static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
576 desktop_info_s *info = data;
578 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
579 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
581 info->x_slp_multiple = !strcasecmp(value, "true");
588 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
590 desktop_info_s *info = data;
592 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
593 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
595 info->x_slp_removable = !strcasecmp(value, "true");
601 static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value)
603 desktop_info_s *info = data;
605 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
606 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
608 info->x_slp_submode = !strcasecmp(value, "true");
613 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
615 desktop_info_s *info = data;
617 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
618 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
620 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
621 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
627 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
629 desktop_info_s *info = data;
631 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
632 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
634 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
635 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
641 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
643 desktop_info_s *info = data;
645 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
646 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
648 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
649 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
655 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value)
657 desktop_info_s *info = data;
659 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
660 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
662 info->x_slp_enabled = !strcasecmp(value, "true");
668 static struct entry_parser entry_parsers[] = {
671 .value_cb = _read_exec,
675 .value_cb = _read_name,
679 .value_cb = _read_type,
683 .value_cb = _read_icon,
686 .field = "categories",
687 .value_cb = _read_categories,
691 .value_cb = _read_version,
695 .value_cb = _read_mimetype,
698 .field = "x-tizen-service",
699 .value_cb = _read_x_slp_service,
702 .field = "x-tizen-packagetype",
703 .value_cb = _read_x_slp_packagetype,
706 .field = "x-tizen-packagecategories",
707 .value_cb = _read_x_slp_packagecategories,
710 .field = "x-tizen-packageid",
711 .value_cb = _read_x_slp_packageid,
714 .field = "x-tizen-submodemainid",
715 .value_cb = _read_x_slp_submodemainid,
718 .field = "x-tizen-installedstorage",
719 .value_cb = _read_x_slp_installedstorage,
722 .field = "x-tizen-uri",
723 .value_cb = _read_x_slp_uri,
726 .field = "x-tizen-svc",
727 .value_cb = _read_x_slp_svc,
730 .field = "nodisplay",
731 .value_cb = _read_nodisplay,
734 .field = "x-tizen-taskmanage",
735 .value_cb = _read_x_slp_taskmanage,
738 .field = "x-tizen-enabled",
739 .value_cb = _read_x_slp_enabled,
742 .field = "x-tizen-submode",
743 .value_cb = _read_x_slp_submode,
746 .field = "x-tizen-multiple",
747 .value_cb = _read_x_slp_multiple,
750 .field = "x-tizen-removable",
751 .value_cb = _read_x_slp_removable,
754 .field = "x-tizen-appid",
755 .value_cb = _read_x_slp_appid,
758 .field = "x-tizen-pkgid",
759 .value_cb = _read_x_slp_pkgid,
762 .field = "x-tizen-domain",
763 .value_cb = _read_x_slp_domain,
766 .field = "x-tizen-enabled",
767 .value_cb = _read_x_slp_domain,
777 /* Utility functions */
778 static int _count_all(uid_t uid)
783 if (uid != GLOBAL_USER)
784 ret = ail_filter_count_usr_appinfo(NULL, &count, uid);
786 ret = ail_filter_count_appinfo(NULL, &count);
787 if(ret != AIL_ERROR_OK) {
788 _E("cannot count appinfo");
792 retv_if(ret != AIL_ERROR_OK, -1);
797 char *_pkgname_to_desktop(const char *package, uid_t uid)
803 retv_if(!package, NULL);
805 if(uid != GLOBAL_USER)
807 desktop_path = tzplatform_mkpath(TZ_USER_HOME, ".applications/desktop");
808 if(access(desktop_path, F_OK)) {
809 struct group *grpinfo = NULL;
810 const char *name = "users"; //to change
813 mkdir(desktop_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
814 grpinfo = getgrnam(name);
816 _E("getgrnam(users) returns NULL !");
818 ret = chown(desktop_path, uid, grpinfo->gr_gid);
820 strerror_r(errno, buf, sizeof(buf));
821 _E("FAIL : chown %s %d.%d, because %s", desktop_path, uid, grpinfo->gr_gid, buf);
827 desktop_path = tzplatform_getenv(TZ_SYS_RW_DESKTOP_APP);
828 if(access(desktop_path, F_OK)) {
829 struct group *grpinfo = NULL;
830 const char *name = "root"; //to change
833 mkdir(desktop_path, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
834 grpinfo = getgrnam(name);
836 _E("getgrnam(users) returns NULL !");
838 ret = chown(desktop_path, uid, grpinfo->gr_gid);
840 strerror_r(errno, buf, sizeof(buf));
841 _E("FAIL : chown %s %d.%d, because %s", desktop_path, uid, grpinfo->gr_gid, buf);
846 size = strlen(desktop_path) + strlen(package) + 10;
847 desktop = malloc(size);
848 retv_if(!desktop, NULL);
850 snprintf(desktop, size, "%s/%s.desktop", desktop_path, package);
852 _D("uid: %d / desktop: [%s]\n", uid, desktop);
857 static inline int _bind_local_info(desktop_info_s* info, sqlite3_stmt * stmt)
861 struct name_item *item;
863 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
864 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
865 retv_if(!stmt, AIL_ERROR_INVALID_PARAMETER);
866 localname = info->localname;
868 item = (struct name_item *) localname->data;
869 if (item && item->locale && item->name) {
870 // Bind values for a triplet : package, locale, name
871 retv_if(db_bind_text(stmt, i+1, info->package) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
872 retv_if(db_bind_text(stmt, i+2, item->locale) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
873 retv_if(db_bind_text(stmt, i+3, item->name) != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
876 localname = g_slist_next(localname);
882 static inline int _len_local_info(desktop_info_s* info)
885 struct name_item *item;
887 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
888 if(info->localname) {
889 localname = info->localname;
891 item = (struct name_item *) localname->data;
892 if (item && item->locale && item->name)
894 localname = g_slist_next(localname);
901 static inline int _insert_local_info(desktop_info_s* info, uid_t uid)
903 int len_query = SQL_INSERT_LOCALNAME_STR_LEN;
906 int ret = AIL_ERROR_OK;
907 sqlite3_stmt *stmt = NULL;
909 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
910 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
912 nb_locale_args = _len_local_info(info);
914 retv_if(!nb_locale_args, AIL_ERROR_INVALID_PARAMETER);
916 len_query += SQL_LOCALNAME_TRIPLET_STR_LEN*nb_locale_args +1;
918 query = (char *) malloc(len_query);
919 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
920 stpncpy(query, SQL_INSERT_LOCALNAME_INIT_STR, len_query);
921 for (i = 0; i < nb_locale_args - 1; i++)
922 strcat(query, SQL_LOCALNAME_TRIPLET_STR);
925 if(uid != GLOBAL_USER)
926 ret = db_prepare_rw(query, &stmt);
928 ret = db_prepare_globalrw(query, &stmt);
931 ret = _bind_local_info(info, stmt);
933 _E("Can't bind locale information to this query - %s. ",query);
938 if (ret != AIL_ERROR_NO_DATA) {
939 /* Insert Request doesn't return any data.
940 * db_step should returns AIL_ERROR_NO_DATA in this case. */
941 _E("Can't execute this query - %s. ",query);
945 ret = db_finalize(stmt);
952 static inline int _strlen_desktop_info(desktop_info_s* info)
956 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
958 if (info->package) len += strlen(info->package);
959 if (info->exec) len += strlen(info->exec);
960 if (info->name) len += strlen(info->name);
961 if (info->type) len += strlen(info->type);
962 if (info->icon) len += strlen(info->icon);
963 if (info->categories) len += strlen(info->categories);
964 if (info->version) len += strlen(info->version);
965 if (info->mimetype) len += strlen(info->mimetype);
966 if (info->x_slp_service) len += strlen(info->x_slp_service);
967 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
968 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
969 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
970 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
971 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
972 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
973 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
974 if (info->desktop) len += strlen(info->desktop);
975 if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid);
976 if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage);
982 int __is_ail_initdb(void)
984 if( getenv("AIL_INITDB") || getenv("INITDB") )
990 /* Manipulating desktop_info functions */
991 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package, uid_t uid)
993 static int is_initdb = -1;
995 _D("package - [%s].", package);
998 is_initdb = __is_ail_initdb();
1000 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1001 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1004 info->package = package;
1006 info->x_slp_taskmanage = 1;
1007 info->x_slp_removable = 1;
1008 info->x_slp_submode = 0;
1011 info->x_slp_installedtime = 0;
1013 info->x_slp_installedtime = time(NULL);
1016 info->x_slp_packagetype = strdup(PKGTYPE);
1018 info->x_slp_packagetype = strdup("rpm");
1020 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
1022 info->x_slp_packageid = strdup(package);
1023 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
1024 info->x_slp_appid = strdup(package);
1025 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
1027 info->x_slp_enabled = 1;
1029 info->desktop = _pkgname_to_desktop(package, uid);
1030 retv_if(!info->desktop, AIL_ERROR_FAIL);
1032 _D("desktop - [%s].", info->desktop);
1034 return AIL_ERROR_OK;
1039 static ail_error_e _read_desktop_info(desktop_info_s* info)
1046 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1048 fp = fopen(info->desktop, "r");
1049 retv_if(!fp, AIL_ERROR_FAIL);
1051 while ((read = getline(&line, &size, fp)) != -1) {
1053 char *tmp, *field, *field_name, *tag, *value;
1056 if(tmp == NULL) continue;
1057 if (*tmp == '#') continue;
1058 if (_rtrim(tmp) <= 0) continue;
1060 len = strlen(line) + 1;
1061 field = calloc(1, len);
1062 field_name = calloc(1, len);
1063 tag = calloc(1, len);
1064 value = calloc(1, len);
1066 if (!field || !field_name || !tag || !value) {
1070 sscanf(tmp, "%[^=]=%[^\n]", field, value);
1072 tmp = _ltrim(value);
1074 sscanf(field, "%[^[][%[^]]]", field_name, tag);
1076 if (!field_name || !strlen(field_name)){
1080 for (idx = 0; entry_parsers[idx].field; idx ++) {
1081 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
1082 if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
1083 _E("field - [%s] is wrong.", field_name);
1090 SAFE_FREE(field_name);
1095 _D("Read (%s).", info->package);
1098 return AIL_ERROR_OK;
1102 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
1109 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1111 values = calloc(NUM_OF_PROP, sizeof(char *));
1112 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
1114 for (i = 0; i < NUM_OF_PROP; i++) {
1115 err = db_column_str(stmt, i, &col);
1116 if (AIL_ERROR_OK != err)
1122 values[i] = strdup(col);
1124 err = AIL_ERROR_OUT_OF_MEMORY;
1130 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
1131 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
1132 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
1133 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
1134 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
1135 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
1136 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
1137 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
1138 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
1139 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
1140 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
1141 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
1142 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
1143 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
1144 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
1145 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
1146 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
1147 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid);
1148 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage);
1150 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
1152 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
1153 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
1154 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
1155 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
1156 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
1157 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
1158 info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]);
1163 for (j = 0; j < i; ++j) {
1173 static ail_error_e _load_desktop_info(desktop_info_s* info, uid_t uid)
1176 char query[AIL_SQL_QUERY_MAX_LEN];
1177 sqlite3_stmt *stmt = NULL;
1178 char w[AIL_SQL_QUERY_MAX_LEN];
1180 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1182 snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), info->package);
1184 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
1187 ret = db_open(DB_OPEN_RO, uid);
1190 ret = db_prepare(query, &stmt);
1191 //ret = db_prepare_globalro(query, &stmt);
1194 ret = db_step(stmt);
1200 ret = _retrieve_all_column_to_desktop_info(info, stmt);
1206 ret = db_finalize(stmt);
1209 return AIL_ERROR_OK;
1215 static ail_error_e _modify_desktop_info_bool(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_bool(property);
1227 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1228 return AIL_ERROR_INVALID_PARAMETER;
1231 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1232 info->x_slp_enabled = (int)value;
1235 return AIL_ERROR_FAIL;
1238 return AIL_ERROR_OK;
1242 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1243 const char *property,
1246 ail_prop_bool_e prop;
1249 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1250 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1252 prop = _ail_convert_to_prop_str(property);
1254 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1255 return AIL_ERROR_INVALID_PARAMETER;
1258 case E_AIL_PROP_NAME_STR:
1259 SAFE_FREE_AND_STRDUP(value, info->name);
1260 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
1262 case E_AIL_PROP_X_SLP_SVC_STR:
1263 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1264 retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1266 case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR:
1267 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
1268 retv_if (!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
1271 _E("prop[%d] is not defined\n", prop);
1272 return AIL_ERROR_FAIL;
1275 return AIL_ERROR_OK;
1279 static inline void _insert_localname(gpointer data, gpointer user_data, uid_t uid)
1283 struct name_item *item = (struct name_item *)data;
1284 desktop_info_s *info = (desktop_info_s *)user_data;
1286 sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) "
1287 "values ('%q', '%q', '%q', '%q');",
1288 info->package, item->locale, item->name, info->x_slp_pkgid);
1289 if(uid != GLOBAL_USER) {
1290 if (db_exec_usr_rw(query) < 0)
1291 _E("Failed to insert local name of package[%s]",info->package);
1293 if (db_exec_glo_rw(query) < 0)
1294 _E("Failed to insert local name of package[%s]",info->package);
1298 static ail_error_e _insert_desktop_info(desktop_info_s *info, uid_t uid)
1304 len = _strlen_desktop_info(info) + (0x01 << 10);
1305 query = calloc(1, len);
1306 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1308 sqlite3_snprintf(len, query, "insert into app_info ("
1317 "x_slp_packagetype, "
1318 "x_slp_packagecategories, "
1326 "x_slp_submodemainid, "
1327 "x_slp_installedstorage, "
1328 "x_slp_baselayoutwidth, "
1329 "x_slp_installedtime, "
1331 "x_slp_taskmanage, "
1334 "x_slp_ishorizontalscale, "
1339 "('%q', '%q', '%q', '%q', '%q', "
1340 "'%q', '%q', '%q', '%q', '%q', "
1341 "'%q', '%q', '%q', '%q', '%q', "
1342 "'%q', '%q', '%q', '%q', '%q', "
1343 "%d, %d, %d, %d, %d, %d, %d,"
1354 info->x_slp_service,
1355 info->x_slp_packagetype,
1356 info->x_slp_packagecategories,
1357 info->x_slp_packageid,
1360 info->x_slp_exe_path,
1364 info->x_slp_submodemainid,
1365 info->x_slp_installedstorage,
1366 info->x_slp_baselayoutwidth,
1367 info->x_slp_installedtime,
1369 info->x_slp_taskmanage,
1370 info->x_slp_multiple,
1371 info->x_slp_removable,
1372 info->x_slp_ishorizontalscale,
1373 info->x_slp_enabled,
1374 info->x_slp_submode,
1378 ret = db_open(DB_OPEN_RW, uid);
1379 if(ret != AIL_ERROR_OK) {
1380 _E("(tmp == NULL) return\n");
1382 return AIL_ERROR_DB_FAILED;
1384 if (uid != GLOBAL_USER)
1385 ret = db_exec_usr_rw(query);
1387 ret = db_exec_glo_rw(query);
1390 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1392 if (info->localname)
1393 _insert_local_info(info, uid);
1395 _D("Add (%s).", query);
1397 return AIL_ERROR_OK;
1402 static ail_error_e _update_desktop_info(desktop_info_s *info, uid_t uid)
1407 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1409 if (db_open(DB_OPEN_RW, uid) < 0) {
1410 return AIL_ERROR_DB_FAILED;
1413 len = _strlen_desktop_info(info) + (0x01 << 10);
1414 query = calloc(1, len);
1415 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1417 sqlite3_snprintf ( len, query, "update app_info set "
1425 "x_slp_service='%q', "
1426 "x_slp_packagetype='%q', "
1427 "x_slp_packagecategories='%q', "
1428 "x_slp_packageid='%q', "
1431 "x_slp_exe_path='%q', "
1432 "x_slp_appid='%q', "
1433 "x_slp_pkgid='%q', "
1434 "x_slp_domain='%q', "
1435 "x_slp_submodemainid='%q', "
1436 "x_slp_installedstorage='%q', "
1437 "x_slp_baselayoutwidth=%d, "
1438 "x_slp_installedtime=%d, "
1440 "x_slp_taskmanage=%d, "
1441 "x_slp_multiple=%d, "
1442 "x_slp_removable=%d, "
1443 "x_slp_ishorizontalscale=%d, "
1444 "x_slp_enabled=%d, "
1445 "x_slp_submode=%d, "
1447 "where package='%q'",
1455 info->x_slp_service,
1456 info->x_slp_packagetype,
1457 info->x_slp_packagecategories,
1458 info->x_slp_packageid,
1461 info->x_slp_exe_path,
1465 info->x_slp_submodemainid,
1466 info->x_slp_installedstorage,
1467 info->x_slp_baselayoutwidth,
1468 info->x_slp_installedtime,
1470 info->x_slp_taskmanage,
1471 info->x_slp_multiple,
1472 info->x_slp_removable,
1473 info->x_slp_ishorizontalscale,
1474 info->x_slp_enabled,
1475 info->x_slp_submode,
1479 if(uid != GLOBAL_USER) {
1480 if (db_exec_usr_rw(query) < 0) {
1482 return AIL_ERROR_DB_FAILED;
1485 if (db_exec_glo_rw(query) < 0) {
1487 return AIL_ERROR_DB_FAILED;
1490 snprintf(query, len, "delete from localname where package = '%s'", info->package);
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 if (info->localname)
1503 _insert_local_info(info, uid);
1505 _D("Update (%s).", info->package);
1509 return AIL_ERROR_OK;
1514 static ail_error_e _remove_package(const char* package, uid_t uid)
1519 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1521 if (db_open(DB_OPEN_RW, uid) < 0) {
1522 return AIL_ERROR_DB_FAILED;
1525 size = strlen(package) + (0x01 << 10);
1526 query = calloc(1, size);
1527 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1529 snprintf(query, size, "delete from app_info where package = '%s'", package);
1531 if(uid != GLOBAL_USER) {
1532 if (db_exec_usr_rw(query) < 0) {
1534 return AIL_ERROR_DB_FAILED;
1537 if (db_exec_glo_rw(query) < 0) {
1539 return AIL_ERROR_DB_FAILED;
1542 snprintf(query, size, "delete from localname where package = '%s'", package);
1543 _D("query=%s",query);
1545 if(uid != GLOBAL_USER) {
1546 if (db_exec_usr_rw(query) < 0) {
1548 return AIL_ERROR_DB_FAILED;
1551 if (db_exec_glo_rw(query) < 0) {
1553 return AIL_ERROR_DB_FAILED;
1556 _D("Remove (%s).", package);
1559 return AIL_ERROR_OK;
1562 static ail_error_e _clean_pkgid_data(const char* pkgid, uid_t uid)
1567 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1569 if (db_open(DB_OPEN_RW, uid) ){
1570 return AIL_ERROR_DB_FAILED;
1573 size = strlen(pkgid) + (0x01 << 10);
1574 query = calloc(1, size);
1575 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1577 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1579 if(uid != GLOBAL_USER) {
1580 if (db_exec_usr_rw(query) < 0) {
1582 return AIL_ERROR_DB_FAILED;
1585 if (db_exec_glo_rw(query) < 0) {
1587 return AIL_ERROR_DB_FAILED;
1590 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1591 _D("query=%s",query);
1593 if(uid != GLOBAL_USER) {
1594 if (db_exec_usr_rw(query) < 0) {
1596 return AIL_ERROR_DB_FAILED;
1599 if (db_exec_glo_rw(query) < 0) {
1601 return AIL_ERROR_DB_FAILED;
1604 _D("Clean pkgid data (%s).", pkgid);
1607 return AIL_ERROR_OK;
1610 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1612 char *type_string, *noti_string;
1615 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1619 type_string = "create";
1622 type_string = "update";
1625 type_string = "delete";
1628 return AIL_ERROR_FAIL;
1631 size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid());
1632 noti_string = (char*) calloc(size + 1, sizeof(char));
1633 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1635 snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
1636 vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
1637 vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
1638 _D("Noti : %s", noti_string);
1642 return AIL_ERROR_OK;
1646 static void inline _name_item_free_func(gpointer data)
1648 struct name_item *item = (struct name_item *)data;
1650 SAFE_FREE(item->locale);
1651 item->locale = NULL;
1652 SAFE_FREE(item->name);
1658 static void _fini_desktop_info(desktop_info_s *info)
1660 SAFE_FREE(info->exec);
1661 SAFE_FREE(info->name);
1662 SAFE_FREE(info->type);
1663 SAFE_FREE(info->icon);
1664 SAFE_FREE(info->categories);
1665 SAFE_FREE(info->version);
1666 SAFE_FREE(info->mimetype);
1667 SAFE_FREE(info->x_slp_service);
1668 SAFE_FREE(info->x_slp_packagetype);
1669 SAFE_FREE(info->x_slp_packagecategories);
1670 SAFE_FREE(info->x_slp_packageid);
1671 SAFE_FREE(info->x_slp_uri);
1672 SAFE_FREE(info->x_slp_svc);
1673 SAFE_FREE(info->x_slp_exe_path);
1674 SAFE_FREE(info->x_slp_appid);
1675 SAFE_FREE(info->x_slp_pkgid);
1676 SAFE_FREE(info->x_slp_domain);
1677 SAFE_FREE(info->x_slp_submodemainid);
1678 SAFE_FREE(info->x_slp_installedstorage);
1679 SAFE_FREE(info->desktop);
1680 if (info->localname) {
1681 g_slist_free_full(info->localname, _name_item_free_func);
1682 info->localname = NULL;
1688 static int __is_authorized()
1690 uid_t uid = getuid();
1691 if ((uid_t) 0 == uid )
1698 /* Public functions */
1699 EXPORT_API ail_error_e ail_usr_desktop_add(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 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1709 ret = _read_desktop_info(&info);
1710 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1712 ret = _insert_desktop_info(&info, uid);
1713 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1715 ret = _send_db_done_noti(NOTI_ADD, appid);
1716 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1718 _fini_desktop_info(&info);
1720 return AIL_ERROR_OK;
1723 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1725 return ail_usr_desktop_add(appid,GLOBAL_USER);
1728 EXPORT_API ail_error_e ail_usr_desktop_update(const char *appid, uid_t uid)
1730 desktop_info_s info = {0,};
1733 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1735 ret = _init_desktop_info(&info, appid, uid);
1736 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1738 ret = _read_desktop_info(&info);
1739 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1741 ret = _update_desktop_info(&info, uid);
1742 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1744 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1745 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1747 _fini_desktop_info(&info);
1749 return AIL_ERROR_OK;
1752 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1754 return ail_usr_desktop_update(appid,GLOBAL_USER);
1758 EXPORT_API ail_error_e ail_usr_desktop_remove(const char *appid, uid_t uid)
1762 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1764 ret = _remove_package(appid, uid);
1765 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1767 ret = _send_db_done_noti(NOTI_REMOVE, appid);
1768 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1770 return AIL_ERROR_OK;
1773 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1775 return ail_usr_desktop_remove(appid, GLOBAL_USER);
1779 EXPORT_API ail_error_e ail_usr_desktop_clean(const char *pkgid, uid_t uid)
1783 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1785 _D("ail_desktop_clean=%s",pkgid);
1787 ret = _clean_pkgid_data(pkgid, uid);
1788 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1790 return AIL_ERROR_OK;
1793 EXPORT_API ail_error_e ail_desktop_clean(const char *pkgid)
1795 return ail_usr_desktop_clean(pkgid, GLOBAL_USER);
1798 EXPORT_API ail_error_e ail_usr_desktop_fota(const char *appid, uid_t uid)
1800 desktop_info_s info = {0,};
1803 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1805 ret = _init_desktop_info(&info, appid, uid);
1806 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1808 ret = _read_desktop_info(&info);
1809 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1811 ret = _insert_desktop_info(&info, uid);
1812 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1814 _fini_desktop_info(&info);
1816 return AIL_ERROR_OK;
1819 EXPORT_API ail_error_e ail_desktop_fota(const char *appid)
1821 return ail_usr_desktop_fota(appid, GLOBAL_USER);
1825 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_bool(const char *appid,
1826 const char *property,
1828 bool broadcast, uid_t uid)
1830 desktop_info_s info = {0,};
1833 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1835 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1836 AIL_ERROR_INVALID_PARAMETER);
1838 ret = _init_desktop_info(&info, appid, uid);
1839 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1841 ret = _load_desktop_info(&info, uid);
1842 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1844 ret = _modify_desktop_info_bool(&info, property, value);
1845 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1847 ret = _update_desktop_info(&info, uid);
1848 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1851 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1852 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1855 _fini_desktop_info(&info);
1857 return AIL_ERROR_OK;
1860 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1861 const char *property,
1865 return ail_desktop_appinfo_modify_usr_bool(appid, property, value, broadcast,
1870 EXPORT_API ail_error_e ail_desktop_appinfo_modify_usr_str(const char *appid, uid_t uid,
1871 const char *property,
1875 desktop_info_s info = {0,};
1878 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1880 ret = _init_desktop_info(&info, appid, uid);
1881 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1883 ret = _load_desktop_info(&info, uid);
1884 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1886 _D("info.name [%s], value [%s]", info.name, value);
1887 ret = _modify_desktop_info_str(&info, property, value);
1888 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1889 _D("info.name [%s], value [%s]", info.name, value);
1891 ret = _update_desktop_info(&info, uid);
1892 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1895 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1896 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1899 _fini_desktop_info(&info);
1901 return AIL_ERROR_OK;
1904 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1905 const char *property,
1909 return ail_desktop_appinfo_modify_usr_str(appid, GLOBAL_USER, property, value,