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.
30 #include <sys/types.h>
37 #include "ail_private.h"
44 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
45 #define argsdelimiter " \t"
47 #define SQL_INSERT_LOCALNAME_STR "insert into localname (package, locale, name) values "
48 #define SQL_INSERT_LOCALNAME_STR_LEN (sizeof(SQL_INSERT_LOCALNAME_STR)-1)
50 #define SQL_INSERT_LOCALNAME_INIT_STR SQL_INSERT_LOCALNAME_STR"( ?, ?, ?) "
52 #define SQL_LOCALNAME_TRIPLET_STR ", ( ?, ?, ?)"
53 #define SQL_LOCALNAME_TRIPLET_STR_LEN (sizeof(SQL_LOCALNAME_TRIPLET_STR)-1)
64 ail_error_e (*value_cb)(void *data, char *tag, char *value);
67 inline static char *_ltrim(char *str)
69 if (!str) return NULL;
71 while (*str == ' ' || *str == '\t' || *str == '\n') str ++;
78 inline static int _rtrim(char *str)
83 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) str[len] = '\0';
103 char* x_slp_packagetype;
104 char* x_slp_packagecategories;
105 char* x_slp_packageid;
108 char* x_slp_exe_path;
112 char* x_slp_submodemainid;
113 char* x_slp_installedstorage;
114 int x_slp_baselayoutwidth;
115 int x_slp_installedtime;
117 int x_slp_taskmanage;
120 int x_slp_ishorizontalscale;
129 static ail_error_e _read_exec(void *data, char *tag, char *value)
131 desktop_info_s *info = data;
132 char *token_exe_path;
136 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
137 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
139 SAFE_FREE_AND_STRDUP(value, info->exec);
140 retv_if(!info->exec, AIL_ERROR_OUT_OF_MEMORY);
142 temp_exec = strdup(value);
145 return AIL_ERROR_OUT_OF_MEMORY;
148 token_exe_path = strtok_r(temp_exec, argsdelimiter, &save_ptr);
150 info->x_slp_exe_path = strdup(token_exe_path);
151 if(!info->x_slp_exe_path) {
155 return AIL_ERROR_OUT_OF_MEMORY;
165 static ail_error_e _read_name(void *data, char *tag, char *value)
167 desktop_info_s *info = data;
169 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
170 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
171 retv_if(0 == strlen(value), AIL_ERROR_FAIL);
173 if (tag && strlen(tag) > 0) {
174 struct name_item *item;
175 item = (struct name_item *)calloc(1, sizeof(struct name_item));
176 retv_if (NULL == item, AIL_ERROR_OUT_OF_MEMORY);
178 SAFE_FREE_AND_STRDUP(tag, item->locale);
179 if(NULL == item->locale) {
180 _E("(NULL == item->locale) return\n");
182 return AIL_ERROR_OUT_OF_MEMORY;
185 SAFE_FREE_AND_STRDUP(value, item->name);
186 if(NULL == item->name) {
187 _E("(NULL == item->name) return\n");
190 return AIL_ERROR_OUT_OF_MEMORY;
193 info->localname = g_slist_append(info->localname, item);
197 SAFE_FREE_AND_STRDUP(value, info->name);
198 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
206 static ail_error_e _read_type(void *data, char *tag, char *value)
208 desktop_info_s *info = data;
210 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
211 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
213 SAFE_FREE_AND_STRDUP(value, info->type);
214 retv_if (!info->type, AIL_ERROR_OUT_OF_MEMORY);
221 _get_package_from_icon(char* icon)
226 retv_if(!icon, NULL);
228 package = strdup(icon);
229 retv_if(!package, NULL);
230 extension = rindex(package, '.');
234 _E("cannot extract from icon [%s] to package.", icon);
242 _get_icon_with_path(char* icon)
244 retv_if(!icon, NULL);
246 if (index(icon, '/') == NULL) {
249 char* icon_with_path = NULL;
252 package = _get_package_from_icon(icon);
253 retv_if(!package, NULL);
255 /* "db/setting/theme" is not exist */
257 theme = vconf_get_str("db/setting/theme");
259 theme = strdup("default");
266 theme = strdup("default");
269 len = (0x01 << 7) + strlen(icon) + strlen(package) + strlen(theme);
270 icon_with_path = malloc(len);
271 if(icon_with_path == NULL) {
272 _E("(icon_with_path == NULL) return\n");
278 memset(icon_with_path, 0, len);
280 sqlite3_snprintf( len, icon_with_path,"/opt/share/icons/%q/small/%q", theme, icon);
282 if (access(icon_with_path, R_OK) == 0) break;
283 sqlite3_snprintf( len, icon_with_path,"/usr/share/icons/%q/small/%q", theme, icon);
284 if (access(icon_with_path, R_OK) == 0) break;
285 _D("cannot find icon %s", icon_with_path);
286 sqlite3_snprintf( len, icon_with_path, "/opt/share/icons/default/small/%q", icon);
287 if (access(icon_with_path, R_OK) == 0) break;
288 sqlite3_snprintf( len, icon_with_path, "/usr/share/icons/default/small/%q", icon);
289 if (access(icon_with_path, R_OK) == 0) break;
291 #if 1 /* this will be remove when finish the work for moving icon path */
292 _E("icon file must be moved to %s", icon_with_path);
293 sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/%q/small/%q", package, theme, icon);
294 if (access(icon_with_path, R_OK) == 0) break;
295 sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/%q/small/%q", package, theme, icon);
296 if (access(icon_with_path, R_OK) == 0) break;
297 _D("cannot find icon %s", icon_with_path);
298 sqlite3_snprintf( len, icon_with_path, "/opt/apps/%q/res/icons/default/small/%q", package, icon);
299 if (access(icon_with_path, R_OK) == 0) break;
300 sqlite3_snprintf( len, icon_with_path, "/usr/apps/%q/res/icons/default/small/%q", package, icon);
301 if (access(icon_with_path, R_OK) == 0) break;
308 _D("Icon path : %s ---> %s", icon, icon_with_path);
310 return icon_with_path;
312 char* confirmed_icon = NULL;
314 confirmed_icon = strdup(icon);
315 retv_if(!confirmed_icon, NULL);
316 return confirmed_icon;
321 static ail_error_e _read_icon(void *data, char *tag, char *value)
323 desktop_info_s *info = data;
325 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
326 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
328 info->icon = _get_icon_with_path(value);
330 retv_if (!info->icon, AIL_ERROR_OUT_OF_MEMORY);
337 static ail_error_e _read_categories(void *data, char *tag, char *value)
339 desktop_info_s *info = data;
341 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
342 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
344 SAFE_FREE_AND_STRDUP(value, info->categories);
345 retv_if (!info->categories, AIL_ERROR_OUT_OF_MEMORY);
352 static ail_error_e _read_version(void *data, char *tag, char *value)
354 desktop_info_s *info = data;
356 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
357 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
359 SAFE_FREE_AND_STRDUP(value, info->version);
360 retv_if (!info->version, AIL_ERROR_OUT_OF_MEMORY);
367 static ail_error_e _read_mimetype(void *data, char *tag, char *value)
369 desktop_info_s *info = data;
370 int size, total_len = 0;
371 char *mimes_origin, *mimes_changed, *token_unalias, *save_ptr;
373 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
374 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
375 retv_if(!strlen(value), AIL_ERROR_FAIL);
377 mimes_origin = strdup(value);
378 retv_if(!mimes_origin, AIL_ERROR_OUT_OF_MEMORY);
380 size = getpagesize();
381 mimes_changed = calloc(1, size);
382 if(mimes_changed == NULL) {
383 _E("(mimes_changed == NULL) return\n");
385 return AIL_ERROR_OUT_OF_MEMORY;
388 token_unalias = strtok_r(mimes_origin, ";", &save_ptr);
390 while (token_unalias) {
392 const char *token_alias;
394 _rtrim(token_unalias);
395 token_unalias = _ltrim(token_unalias);
397 token_alias = xdg_mime_unalias_mime_type(token_unalias);
398 if (!token_alias) continue;
400 token_len = strlen(token_alias);
401 if (total_len + token_len + (1<<1) >= size) {
404 tmp = realloc(mimes_changed, size);
407 return AIL_ERROR_OUT_OF_MEMORY;
412 strncat(mimes_changed, token_alias, size-1);
413 total_len += token_len;
415 token_unalias = strtok_r(NULL, ";", &save_ptr);
417 strncat(mimes_changed, ";", size-strlen(mimes_changed)-1);
421 SAFE_FREE(info->mimetype);
422 info->mimetype = mimes_changed;
429 static ail_error_e _read_nodisplay(void *data, char *tag, char *value)
431 desktop_info_s* info = data;
433 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
434 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
436 info->nodisplay = !strcasecmp(value, "true");
443 static ail_error_e _read_x_slp_service(void *data, char *tag, char *value)
445 desktop_info_s *info = data;
447 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
448 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
450 SAFE_FREE_AND_STRDUP(value, info->x_slp_service);
451 retv_if(!info->x_slp_service, AIL_ERROR_OUT_OF_MEMORY);
458 static ail_error_e _read_x_slp_packagetype(void *data, char *tag, char *value)
460 desktop_info_s *info = data;
462 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
463 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
465 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagetype);
466 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
473 static ail_error_e _read_x_slp_packagecategories(void *data, char *tag, char *value)
475 desktop_info_s *info = data;
477 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
478 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
480 SAFE_FREE_AND_STRDUP(value, info->x_slp_packagecategories);
481 retv_if(!info->x_slp_packagecategories, AIL_ERROR_OUT_OF_MEMORY);
488 static ail_error_e _read_x_slp_packageid(void *data, char *tag, char *value)
490 desktop_info_s *info = data;
492 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
493 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
495 SAFE_FREE_AND_STRDUP(value, info->x_slp_packageid);
496 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
501 static ail_error_e _read_x_slp_submodemainid(void *data, char *tag, char *value)
503 desktop_info_s *info = data;
505 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
506 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
508 SAFE_FREE_AND_STRDUP(value, info->x_slp_submodemainid);
509 retv_if(!info->x_slp_submodemainid, AIL_ERROR_OUT_OF_MEMORY);
514 static ail_error_e _read_x_slp_installedstorage(void *data, char *tag, char *value)
516 desktop_info_s *info = data;
518 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
519 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
521 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
522 retv_if(!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
527 static ail_error_e _read_x_slp_uri(void *data, char *tag, char *value)
529 desktop_info_s *info = data;
531 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
532 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
534 SAFE_FREE_AND_STRDUP(value, info->x_slp_uri);
535 retv_if(!info->x_slp_uri, AIL_ERROR_OUT_OF_MEMORY);
542 static ail_error_e _read_x_slp_svc(void *data, char *tag, char *value)
544 desktop_info_s *info = data;
546 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
547 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
549 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
550 retv_if(!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
557 static ail_error_e _read_x_slp_taskmanage(void *data, char *tag, char *value)
559 desktop_info_s *info = data;
561 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
562 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
564 info->x_slp_taskmanage = !strcasecmp(value, "true");
571 static ail_error_e _read_x_slp_multiple(void *data, char *tag, char *value)
573 desktop_info_s *info = data;
575 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
576 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
578 info->x_slp_multiple = !strcasecmp(value, "true");
585 static ail_error_e _read_x_slp_removable(void *data, char *tag, char *value)
587 desktop_info_s *info = data;
589 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
590 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
592 info->x_slp_removable = !strcasecmp(value, "true");
598 static ail_error_e _read_x_slp_submode(void *data, char *tag, char *value)
600 desktop_info_s *info = data;
602 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
603 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
605 info->x_slp_submode = !strcasecmp(value, "true");
610 static ail_error_e _read_x_slp_appid(void *data, char *tag, char *value)
612 desktop_info_s *info = data;
614 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
615 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
617 SAFE_FREE_AND_STRDUP(value, info->x_slp_appid);
618 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
624 static ail_error_e _read_x_slp_pkgid(void *data, char *tag, char *value)
626 desktop_info_s *info = data;
628 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
629 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
631 SAFE_FREE_AND_STRDUP(value, info->x_slp_pkgid);
632 retv_if(!info->x_slp_pkgid, AIL_ERROR_OUT_OF_MEMORY);
638 static ail_error_e _read_x_slp_domain(void *data, char *tag, char *value)
640 desktop_info_s *info = data;
642 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
643 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
645 SAFE_FREE_AND_STRDUP(value, info->x_slp_domain);
646 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
652 static ail_error_e _read_x_slp_enabled(void *data, char *tag, char *value)
654 desktop_info_s *info = data;
656 retv_if(!data, AIL_ERROR_INVALID_PARAMETER);
657 retv_if(!value, AIL_ERROR_INVALID_PARAMETER);
659 info->x_slp_enabled = !strcasecmp(value, "true");
665 static struct entry_parser entry_parsers[] = {
668 .value_cb = _read_exec,
672 .value_cb = _read_name,
676 .value_cb = _read_type,
680 .value_cb = _read_icon,
683 .field = "categories",
684 .value_cb = _read_categories,
688 .value_cb = _read_version,
692 .value_cb = _read_mimetype,
695 .field = "x-tizen-service",
696 .value_cb = _read_x_slp_service,
699 .field = "x-tizen-packagetype",
700 .value_cb = _read_x_slp_packagetype,
703 .field = "x-tizen-packagecategories",
704 .value_cb = _read_x_slp_packagecategories,
707 .field = "x-tizen-packageid",
708 .value_cb = _read_x_slp_packageid,
711 .field = "x-tizen-submodemainid",
712 .value_cb = _read_x_slp_submodemainid,
715 .field = "x-tizen-installedstorage",
716 .value_cb = _read_x_slp_installedstorage,
719 .field = "x-tizen-uri",
720 .value_cb = _read_x_slp_uri,
723 .field = "x-tizen-svc",
724 .value_cb = _read_x_slp_svc,
727 .field = "nodisplay",
728 .value_cb = _read_nodisplay,
731 .field = "x-tizen-taskmanage",
732 .value_cb = _read_x_slp_taskmanage,
735 .field = "x-tizen-enabled",
736 .value_cb = _read_x_slp_enabled,
739 .field = "x-tizen-submode",
740 .value_cb = _read_x_slp_submode,
743 .field = "x-tizen-multiple",
744 .value_cb = _read_x_slp_multiple,
747 .field = "x-tizen-removable",
748 .value_cb = _read_x_slp_removable,
751 .field = "x-tizen-appid",
752 .value_cb = _read_x_slp_appid,
755 .field = "x-tizen-pkgid",
756 .value_cb = _read_x_slp_pkgid,
759 .field = "x-tizen-domain",
760 .value_cb = _read_x_slp_domain,
763 .field = "x-tizen-enabled",
764 .value_cb = _read_x_slp_domain,
774 /* Utility functions */
775 static int _count_all(void)
780 ret = ail_filter_count_appinfo(NULL, &count);
781 if(ret != AIL_ERROR_OK) {
782 _E("cannot count appinfo");
786 retv_if(ret != AIL_ERROR_OK, -1);
791 char *_pkgname_to_desktop(const char *package)
797 retv_if(!package, NULL);
801 desktop_path = tzplatform_mkpath(TZ_USER_HOME, ".applications/desktop");
805 desktop_path = tzplatform_getenv(TZ_SYS_RW_DESKTOP_APP);
808 size = strlen(desktop_path) + strlen(package) + 10;
809 desktop = malloc(size);
810 retv_if(!desktop, NULL);
812 snprintf(desktop, size, "%s/%s.desktop", desktop_path, package);
814 _D("uid: %d / desktop: [%s]\n", getuid(), 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);
844 static inline int _len_local_info(desktop_info_s* info)
847 struct name_item *item;
849 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
850 if(info->localname) {
851 localname = info->localname;
853 item = (struct name_item *) localname->data;
854 if (item && item->locale && item->name)
856 localname = g_slist_next(localname);
863 static inline int _insert_local_info(desktop_info_s* info)
865 int len_query = SQL_INSERT_LOCALNAME_STR_LEN;
868 int ret = AIL_ERROR_OK;
869 sqlite3_stmt *stmt = NULL;
871 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
872 retv_if(!info->localname, AIL_ERROR_INVALID_PARAMETER);
874 nb_locale_args = _len_local_info(info);
876 retv_if(!nb_locale_args, AIL_ERROR_INVALID_PARAMETER);
878 len_query += SQL_LOCALNAME_TRIPLET_STR_LEN*nb_locale_args +1;
880 query = (char *) malloc(len_query);
881 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
882 stpncpy(query, SQL_INSERT_LOCALNAME_INIT_STR, len_query);
883 for (i = 0; i < nb_locale_args - 1; i++)
884 strcat(query, SQL_LOCALNAME_TRIPLET_STR);
887 ret = db_prepare_rw(query, &stmt);
890 ret = _bind_local_info(info, stmt);
892 _E("Can't bind locale information to this query - %s. ",query);
897 if (ret != AIL_ERROR_NO_DATA) {
898 /* Insert Request doesn't return any data.
899 * db_step should returns AIL_ERROR_NO_DATA in this case. */
900 _E("Can't execute this query - %s. ",query);
904 ret = db_finalize(stmt);
911 static inline int _strlen_desktop_info(desktop_info_s* info)
915 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
917 if (info->package) len += strlen(info->package);
918 if (info->exec) len += strlen(info->exec);
919 if (info->name) len += strlen(info->name);
920 if (info->type) len += strlen(info->type);
921 if (info->icon) len += strlen(info->icon);
922 if (info->categories) len += strlen(info->categories);
923 if (info->version) len += strlen(info->version);
924 if (info->mimetype) len += strlen(info->mimetype);
925 if (info->x_slp_service) len += strlen(info->x_slp_service);
926 if (info->x_slp_packagetype) len += strlen(info->x_slp_packagetype);
927 if (info->x_slp_packagecategories) len += strlen(info->x_slp_packagecategories);
928 if (info->x_slp_packageid) len += strlen(info->x_slp_packageid);
929 if (info->x_slp_uri) len += strlen(info->x_slp_uri);
930 if (info->x_slp_svc) len += strlen(info->x_slp_svc);
931 if (info->x_slp_exe_path) len += strlen(info->x_slp_exe_path);
932 if (info->x_slp_appid) len += strlen(info->x_slp_appid);
933 if (info->desktop) len += strlen(info->desktop);
934 if (info->x_slp_submodemainid) len += strlen(info->x_slp_submodemainid);
935 if (info->x_slp_installedstorage) len += strlen(info->x_slp_installedstorage);
941 int __is_ail_initdb(void)
943 if( getenv("AIL_INITDB") || getenv("INITDB") )
949 /* Manipulating desktop_info functions */
950 static ail_error_e _init_desktop_info(desktop_info_s *info, const char *package)
952 static int is_initdb = -1;
954 _D("package - [%s].", package);
957 is_initdb = __is_ail_initdb();
959 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
960 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
963 info->package = package;
965 info->x_slp_taskmanage = 1;
966 info->x_slp_removable = 1;
967 info->x_slp_submode = 0;
970 info->x_slp_installedtime = 0;
972 info->x_slp_installedtime = time(NULL);
975 info->x_slp_packagetype = strdup(PKGTYPE);
977 info->x_slp_packagetype = strdup("rpm");
979 retv_if(!info->x_slp_packagetype, AIL_ERROR_OUT_OF_MEMORY);
981 info->x_slp_packageid = strdup(package);
982 retv_if(!info->x_slp_packageid, AIL_ERROR_OUT_OF_MEMORY);
983 info->x_slp_appid = strdup(package);
984 retv_if(!info->x_slp_appid, AIL_ERROR_OUT_OF_MEMORY);
986 info->x_slp_enabled = 1;
988 info->desktop = _pkgname_to_desktop(package);
989 retv_if(!info->desktop, AIL_ERROR_FAIL);
991 _D("desktop - [%s].", info->desktop);
998 static ail_error_e _read_desktop_info(desktop_info_s* info)
1005 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1007 fp = fopen(info->desktop, "r");
1008 retv_if(!fp, AIL_ERROR_FAIL);
1010 while ((read = getline(&line, &size, fp)) != -1) {
1012 char *tmp, *field, *field_name, *tag, *value;
1015 if(tmp == NULL) continue;
1016 if (*tmp == '#') continue;
1017 if (_rtrim(tmp) <= 0) continue;
1019 len = strlen(line) + 1;
1020 field = calloc(1, len);
1021 field_name = calloc(1, len);
1022 tag = calloc(1, len);
1023 value = calloc(1, len);
1025 if (!field || !field_name || !tag || !value) {
1029 sscanf(tmp, "%[^=]=%[^\n]", field, value);
1031 tmp = _ltrim(value);
1033 sscanf(field, "%[^[][%[^]]]", field_name, tag);
1035 if (!field_name || !strlen(field_name)){
1039 for (idx = 0; entry_parsers[idx].field; idx ++) {
1040 if (!g_ascii_strcasecmp(entry_parsers[idx].field, field_name) && entry_parsers[idx].value_cb) {
1041 if (entry_parsers[idx].value_cb(info, tag, tmp) != AIL_ERROR_OK) {
1042 _E("field - [%s] is wrong.", field_name);
1049 SAFE_FREE(field_name);
1054 _D("Read (%s).", info->package);
1057 return AIL_ERROR_OK;
1061 static ail_error_e _retrieve_all_column_to_desktop_info(desktop_info_s* info, sqlite3_stmt *stmt)
1068 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1070 values = calloc(NUM_OF_PROP, sizeof(char *));
1071 retv_if(!values, AIL_ERROR_OUT_OF_MEMORY);
1073 for (i = 0; i < NUM_OF_PROP; i++) {
1074 err = db_column_str(stmt, i, &col);
1075 if (AIL_ERROR_OK != err)
1081 values[i] = strdup(col);
1083 err = AIL_ERROR_OUT_OF_MEMORY;
1089 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_EXEC_STR], info->exec);
1090 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_NAME_STR], info->name);
1091 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_TYPE_STR], info->type);
1092 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_ICON_STR], info->icon);
1093 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_CATEGORIES_STR], info->categories);
1094 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_VERSION_STR], info->version);
1095 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_MIMETYPE_STR], info->mimetype);
1096 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SERVICE_STR], info->x_slp_service);
1097 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGETYPE_STR], info->x_slp_packagetype);
1098 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGECATEGORIES_STR], info->x_slp_packagecategories);
1099 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PACKAGEID_STR], info->x_slp_packageid);
1100 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_URI_STR], info->x_slp_uri);
1101 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SVC_STR], info->x_slp_svc);
1102 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_EXE_PATH], info->x_slp_exe_path);
1103 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_APPID_STR], info->x_slp_appid);
1104 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_PKGID_STR], info->x_slp_pkgid);
1105 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_DOMAIN_STR], info->x_slp_domain);
1106 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_SUBMODEMAINID_STR], info->x_slp_submodemainid);
1107 SAFE_FREE_AND_STRDUP(values[E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR], info->x_slp_installedstorage);
1109 info->x_slp_installedtime = atoi(values[E_AIL_PROP_X_SLP_INSTALLEDTIME_INT]);
1111 info->nodisplay = atoi(values[E_AIL_PROP_NODISPLAY_BOOL]);
1112 info->x_slp_taskmanage = atoi(values[E_AIL_PROP_X_SLP_TASKMANAGE_BOOL]);
1113 info->x_slp_multiple = atoi(values[E_AIL_PROP_X_SLP_MULTIPLE_BOOL]);
1114 info->x_slp_removable = atoi(values[E_AIL_PROP_X_SLP_REMOVABLE_BOOL]);
1115 info->x_slp_ishorizontalscale = atoi(values[E_AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL]);
1116 info->x_slp_enabled = atoi(values[E_AIL_PROP_X_SLP_ENABLED_BOOL]);
1117 info->x_slp_submode = atoi(values[E_AIL_PROP_X_SLP_SUBMODE_BOOL]);
1122 for (j = 0; j < i; ++j) {
1132 static ail_error_e _load_desktop_info(desktop_info_s* info)
1135 char query[AIL_SQL_QUERY_MAX_LEN];
1136 sqlite3_stmt *stmt = NULL;
1137 char w[AIL_SQL_QUERY_MAX_LEN];
1139 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1141 snprintf(w, sizeof(w), sql_get_filter(E_AIL_PROP_X_SLP_APPID_STR), info->package);
1143 snprintf(query, sizeof(query), "SELECT %s FROM %s WHERE %s",SQL_FLD_APP_INFO, SQL_TBL_APP_INFO, w);
1146 ret = db_open(DB_OPEN_RO);
1149 ret = db_prepare(query, &stmt);
1152 ret = db_step(stmt);
1158 ret = _retrieve_all_column_to_desktop_info(info, stmt);
1164 ret = db_finalize(stmt);
1167 return AIL_ERROR_OK;
1173 static ail_error_e _modify_desktop_info_bool(desktop_info_s* info,
1174 const char *property,
1177 ail_prop_bool_e prop;
1180 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1181 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1183 prop = _ail_convert_to_prop_bool(property);
1185 if (prop < E_AIL_PROP_BOOL_MIN || prop > E_AIL_PROP_BOOL_MAX)
1186 return AIL_ERROR_INVALID_PARAMETER;
1189 case E_AIL_PROP_X_SLP_ENABLED_BOOL:
1190 info->x_slp_enabled = (int)value;
1193 return AIL_ERROR_FAIL;
1196 return AIL_ERROR_OK;
1200 static ail_error_e _modify_desktop_info_str(desktop_info_s* info,
1201 const char *property,
1204 ail_prop_bool_e prop;
1207 retv_if(!info, AIL_ERROR_INVALID_PARAMETER);
1208 retv_if(!property, AIL_ERROR_INVALID_PARAMETER);
1210 prop = _ail_convert_to_prop_str(property);
1212 if (prop < E_AIL_PROP_STR_MIN || prop > E_AIL_PROP_STR_MAX)
1213 return AIL_ERROR_INVALID_PARAMETER;
1216 case E_AIL_PROP_NAME_STR:
1217 SAFE_FREE_AND_STRDUP(value, info->name);
1218 retv_if (!info->name, AIL_ERROR_OUT_OF_MEMORY);
1220 case E_AIL_PROP_X_SLP_SVC_STR:
1221 SAFE_FREE_AND_STRDUP(value, info->x_slp_svc);
1222 retv_if (!info->x_slp_svc, AIL_ERROR_OUT_OF_MEMORY);
1224 case E_AIL_PROP_X_SLP_INSTALLEDSTORAGE_STR:
1225 SAFE_FREE_AND_STRDUP(value, info->x_slp_installedstorage);
1226 retv_if (!info->x_slp_installedstorage, AIL_ERROR_OUT_OF_MEMORY);
1229 _E("prop[%d] is not defined\n", prop);
1230 return AIL_ERROR_FAIL;
1233 return AIL_ERROR_OK;
1239 static ail_error_e _create_table(void)
1243 const char *tbls[3] = {
1244 "CREATE TABLE app_info "
1245 "(package TEXT PRIMARY KEY, "
1246 "exec TEXT DEFAULT 'No Exec', "
1247 "name TEXT DEFAULT 'No Name', "
1248 "type TEXT DEFAULT 'Application', "
1249 "icon TEXT DEFAULT 'No Icon', "
1253 "x_slp_service TEXT, "
1254 "x_slp_packagetype TEXT, "
1255 "x_slp_packagecategories TEXT, "
1256 "x_slp_packageid TEXT, "
1259 "x_slp_exe_path TEXT, "
1260 "x_slp_appid TEXT, "
1261 "x_slp_pkgid TEXT, "
1262 "x_slp_domain TEXT, "
1263 "x_slp_submodemainid TEXT, "
1264 "x_slp_installedstorage TEXT, "
1265 "x_slp_baselayoutwidth INTEGER DEFAULT 0, "
1266 "x_slp_installedtime INTEGER DEFAULT 0, "
1267 "nodisplay INTEGER DEFAULT 0, "
1268 "x_slp_taskmanage INTEGER DEFAULT 1, "
1269 "x_slp_multiple INTEGER DEFAULT 0, "
1270 "x_slp_removable INTEGER DEFAULT 1, "
1271 "x_slp_ishorizontalscale INTEGER DEFAULT 0, "
1272 "x_slp_enabled INTEGER DEFAULT 1, "
1273 "x_slp_submode INTEGER DEFAULT 0, "
1274 "desktop TEXT UNIQUE NOT NULL);",
1275 "CREATE TABLE localname (package TEXT NOT NULL, "
1276 "locale TEXT NOT NULL, "
1277 "name TEXT NOT NULL, "
1278 "x_slp_pkgid TEXT NOT NULL, PRIMARY KEY (package, locale));",
1283 ret = db_open(DB_OPEN_RW);
1284 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1286 for (i = 0; tbls[i] != NULL; i++) {
1287 ret = db_exec(tbls[i]);
1288 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1291 return AIL_ERROR_OK;
1295 static inline void _insert_localname(gpointer data, gpointer user_data)
1299 struct name_item *item = (struct name_item *)data;
1300 desktop_info_s *info = (desktop_info_s *)user_data;
1302 sqlite3_snprintf(sizeof(query), query, "insert into localname (package, locale, name, x_slp_pkgid) "
1303 "values ('%q', '%q', '%q', '%q');",
1304 info->package, item->locale, item->name, info->x_slp_pkgid);
1305 if (db_exec(query) < 0)
1306 _E("Failed to insert local name of package[%s]",info->package);
1309 static ail_error_e _insert_desktop_info(desktop_info_s *info)
1315 len = _strlen_desktop_info(info) + (0x01 << 10);
1316 query = calloc(1, len);
1317 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1319 sqlite3_snprintf(len, query, "insert into app_info ("
1328 "x_slp_packagetype, "
1329 "x_slp_packagecategories, "
1337 "x_slp_submodemainid, "
1338 "x_slp_installedstorage, "
1339 "x_slp_baselayoutwidth, "
1340 "x_slp_installedtime, "
1342 "x_slp_taskmanage, "
1345 "x_slp_ishorizontalscale, "
1350 "('%q', '%q', '%q', '%q', '%q', "
1351 "'%q', '%q', '%q', '%q', '%q', "
1352 "'%q', '%q', '%q', '%q', '%q', "
1353 "'%q', '%q', '%q', '%q', '%q', "
1354 "%d, %d, %d, %d, %d, %d, %d,"
1365 info->x_slp_service,
1366 info->x_slp_packagetype,
1367 info->x_slp_packagecategories,
1368 info->x_slp_packageid,
1371 info->x_slp_exe_path,
1375 info->x_slp_submodemainid,
1376 info->x_slp_installedstorage,
1377 info->x_slp_baselayoutwidth,
1378 info->x_slp_installedtime,
1380 info->x_slp_taskmanage,
1381 info->x_slp_multiple,
1382 info->x_slp_removable,
1383 info->x_slp_ishorizontalscale,
1384 info->x_slp_enabled,
1385 info->x_slp_submode,
1389 ret = db_open(DB_OPEN_RW);
1390 if(ret != AIL_ERROR_OK) {
1391 _E("(tmp == NULL) return\n");
1393 return AIL_ERROR_DB_FAILED;
1396 ret = db_exec(query);
1398 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_DB_FAILED);
1400 if (info->localname)
1401 _insert_local_info(info);
1403 _D("Add (%s).", query);
1405 return AIL_ERROR_OK;
1410 static ail_error_e _update_desktop_info(desktop_info_s *info)
1415 retv_if (NULL == info, AIL_ERROR_INVALID_PARAMETER);
1417 if (db_open(DB_OPEN_RW) < 0) {
1418 return AIL_ERROR_DB_FAILED;
1421 len = _strlen_desktop_info(info) + (0x01 << 10);
1422 query = calloc(1, len);
1423 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1425 sqlite3_snprintf ( len, query, "update app_info set "
1433 "x_slp_service='%q', "
1434 "x_slp_packagetype='%q', "
1435 "x_slp_packagecategories='%q', "
1436 "x_slp_packageid='%q', "
1439 "x_slp_exe_path='%q', "
1440 "x_slp_appid='%q', "
1441 "x_slp_pkgid='%q', "
1442 "x_slp_domain='%q', "
1443 "x_slp_submodemainid='%q', "
1444 "x_slp_installedstorage='%q', "
1445 "x_slp_baselayoutwidth=%d, "
1446 "x_slp_installedtime=%d, "
1448 "x_slp_taskmanage=%d, "
1449 "x_slp_multiple=%d, "
1450 "x_slp_removable=%d, "
1451 "x_slp_ishorizontalscale=%d, "
1452 "x_slp_enabled=%d, "
1453 "x_slp_submode=%d, "
1455 "where package='%q'",
1463 info->x_slp_service,
1464 info->x_slp_packagetype,
1465 info->x_slp_packagecategories,
1466 info->x_slp_packageid,
1469 info->x_slp_exe_path,
1473 info->x_slp_submodemainid,
1474 info->x_slp_installedstorage,
1475 info->x_slp_baselayoutwidth,
1476 info->x_slp_installedtime,
1478 info->x_slp_taskmanage,
1479 info->x_slp_multiple,
1480 info->x_slp_removable,
1481 info->x_slp_ishorizontalscale,
1482 info->x_slp_enabled,
1483 info->x_slp_submode,
1487 if (db_exec(query) < 0) {
1489 return AIL_ERROR_DB_FAILED;
1492 snprintf(query, len, "delete from localname where package = '%s'", info->package);
1494 if (db_exec(query) < 0) {
1496 return AIL_ERROR_DB_FAILED;
1499 if (info->localname)
1500 _insert_local_info(info);
1502 _D("Update (%s).", info->package);
1506 return AIL_ERROR_OK;
1511 static ail_error_e _remove_package(const char* package)
1516 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1518 if (db_open(DB_OPEN_RW) < 0) {
1519 return AIL_ERROR_DB_FAILED;
1522 size = strlen(package) + (0x01 << 10);
1523 query = calloc(1, size);
1524 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1526 snprintf(query, size, "delete from app_info where package = '%s'", package);
1528 if (db_exec(query) < 0) {
1530 return AIL_ERROR_DB_FAILED;
1533 snprintf(query, size, "delete from localname where package = '%s'", package);
1534 _D("query=%s",query);
1536 if (db_exec(query) < 0) {
1538 return AIL_ERROR_DB_FAILED;
1541 _D("Remove (%s).", package);
1544 return AIL_ERROR_OK;
1547 static ail_error_e _clean_pkgid_data(const char* pkgid)
1552 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1554 if (db_open(DB_OPEN_RW) < 0) {
1555 return AIL_ERROR_DB_FAILED;
1558 size = strlen(pkgid) + (0x01 << 10);
1559 query = calloc(1, size);
1560 retv_if(!query, AIL_ERROR_OUT_OF_MEMORY);
1562 snprintf(query, size, "delete from app_info where x_slp_pkgid = '%s'", pkgid);
1564 if (db_exec(query) < 0) {
1566 return AIL_ERROR_DB_FAILED;
1569 snprintf(query, size, "delete from localname where x_slp_pkgid = '%s'", pkgid);
1570 _D("query=%s",query);
1572 if (db_exec(query) < 0) {
1574 return AIL_ERROR_DB_FAILED;
1577 _D("Clean pkgid data (%s).", pkgid);
1580 return AIL_ERROR_OK;
1583 static ail_error_e _send_db_done_noti(noti_type type, const char *package)
1585 char *type_string, *noti_string;
1588 retv_if(!package, AIL_ERROR_INVALID_PARAMETER);
1592 type_string = "create";
1595 type_string = "update";
1598 type_string = "delete";
1601 return AIL_ERROR_FAIL;
1604 size = snprintf(NULL, 0, "%s:%s:%u", type_string, package, getuid());
1605 noti_string = (char*) calloc(size + 1, sizeof(char));
1606 retv_if(!noti_string, AIL_ERROR_OUT_OF_MEMORY);
1608 snprintf(noti_string, size + 1, "%s:%s:%u", type_string, package, getuid());
1609 vconf_set_str(VCONFKEY_AIL_INFO_STATE, noti_string);
1610 vconf_set_str(VCONFKEY_MENUSCREEN_DESKTOP, noti_string); // duplicate, will be removed
1611 _D("Noti : %s", noti_string);
1615 return AIL_ERROR_OK;
1619 static void inline _name_item_free_func(gpointer data)
1621 struct name_item *item = (struct name_item *)data;
1623 SAFE_FREE(item->locale);
1624 item->locale = NULL;
1625 SAFE_FREE(item->name);
1631 static void _fini_desktop_info(desktop_info_s *info)
1633 SAFE_FREE(info->exec);
1634 SAFE_FREE(info->name);
1635 SAFE_FREE(info->type);
1636 SAFE_FREE(info->icon);
1637 SAFE_FREE(info->categories);
1638 SAFE_FREE(info->version);
1639 SAFE_FREE(info->mimetype);
1640 SAFE_FREE(info->x_slp_service);
1641 SAFE_FREE(info->x_slp_packagetype);
1642 SAFE_FREE(info->x_slp_packagecategories);
1643 SAFE_FREE(info->x_slp_packageid);
1644 SAFE_FREE(info->x_slp_uri);
1645 SAFE_FREE(info->x_slp_svc);
1646 SAFE_FREE(info->x_slp_exe_path);
1647 SAFE_FREE(info->x_slp_appid);
1648 SAFE_FREE(info->x_slp_pkgid);
1649 SAFE_FREE(info->x_slp_domain);
1650 SAFE_FREE(info->x_slp_submodemainid);
1651 SAFE_FREE(info->x_slp_installedstorage);
1652 SAFE_FREE(info->desktop);
1653 if (info->localname) {
1654 g_slist_free_full(info->localname, _name_item_free_func);
1655 info->localname = NULL;
1661 static int __is_authorized()
1663 uid_t uid = getuid();
1664 if ((uid_t) 0 == uid )
1671 /* Public functions */
1672 EXPORT_API ail_error_e ail_desktop_add(const char *appid)
1674 desktop_info_s info = {0,};
1678 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1680 count = _count_all();
1682 ret = _create_table();
1683 if (ret != AIL_ERROR_OK) {
1684 _D("Cannot create a table. Maybe there is already a table.");
1687 ret = _init_desktop_info(&info, appid);
1688 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1690 ret = _read_desktop_info(&info);
1691 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1693 ret = _insert_desktop_info(&info);
1694 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1696 ret = _send_db_done_noti(NOTI_ADD, appid);
1697 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1699 _fini_desktop_info(&info);
1701 return AIL_ERROR_OK;
1706 EXPORT_API ail_error_e ail_desktop_update(const char *appid)
1708 desktop_info_s info = {0,};
1711 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1713 ret = _init_desktop_info(&info, appid);
1714 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1716 ret = _read_desktop_info(&info);
1717 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1719 ret = _update_desktop_info(&info);
1720 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1722 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1723 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1725 _fini_desktop_info(&info);
1727 return AIL_ERROR_OK;
1732 EXPORT_API ail_error_e ail_desktop_remove(const char *appid)
1736 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1738 ret = _remove_package(appid);
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_clean(const char *pkgid)
1751 retv_if(!pkgid, AIL_ERROR_INVALID_PARAMETER);
1753 _D("ail_desktop_clean=%s",pkgid);
1755 ret = _clean_pkgid_data(pkgid);
1756 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1758 return AIL_ERROR_OK;
1762 EXPORT_API ail_error_e ail_desktop_fota(const char *appid)
1764 desktop_info_s info = {0,};
1768 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1770 count = _count_all();
1772 ret = _create_table();
1773 if (ret != AIL_ERROR_OK) {
1774 _D("Cannot create a table. Maybe there is already a table.");
1778 ret = _init_desktop_info(&info, appid);
1779 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1781 ret = _read_desktop_info(&info);
1782 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1784 ret = _insert_desktop_info(&info);
1785 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1787 _fini_desktop_info(&info);
1789 return AIL_ERROR_OK;
1792 EXPORT_API ail_error_e ail_desktop_appinfo_modify_bool(const char *appid,
1793 const char *property,
1797 desktop_info_s info = {0,};
1800 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1802 retv_if(strcmp(property, AIL_PROP_X_SLP_ENABLED_BOOL),
1803 AIL_ERROR_INVALID_PARAMETER);
1805 ret = _init_desktop_info(&info, appid);
1806 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1808 ret = _load_desktop_info(&info);
1809 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1811 ret = _modify_desktop_info_bool(&info, property, value);
1812 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1814 ret = _update_desktop_info(&info);
1815 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1818 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1819 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1822 _fini_desktop_info(&info);
1824 return AIL_ERROR_OK;
1828 EXPORT_API ail_error_e ail_desktop_appinfo_modify_str(const char *appid,
1829 const char *property,
1833 desktop_info_s info = {0,};
1836 retv_if(!appid, AIL_ERROR_INVALID_PARAMETER);
1838 ret = _init_desktop_info(&info, appid);
1839 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1841 ret = _load_desktop_info(&info);
1842 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1844 _D("info.name [%s], value [%s]", info.name, value);
1845 ret = _modify_desktop_info_str(&info, property, value);
1846 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1847 _D("info.name [%s], value [%s]", info.name, value);
1849 ret = _update_desktop_info(&info);
1850 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1853 ret = _send_db_done_noti(NOTI_UPDATE, appid);
1854 retv_if(ret != AIL_ERROR_OK, AIL_ERROR_FAIL);
1857 _fini_desktop_info(&info);
1859 return AIL_ERROR_OK;