2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <pkgmgr-info.h>
25 #define MAX_PATH_LEN 1024
27 #define AUL_APP_INFO_FLD_PKG_NAME "package"
28 #define AUL_APP_INFO_FLD_APP_PATH "exec"
29 #define AUL_APP_INFO_FLD_APP_TYPE "x_slp_packagetype"
30 #define AUL_APP_INFO_FLD_WIDTH "x_slp_baselayoutwidth"
31 #define AUL_APP_INFO_FLD_HEIGHT "x_slp_baselayoutheight"
32 #define AUL_APP_INFO_FLD_VERTICAL "x_slp_ishorizontalscale"
33 #define AUL_APP_INFO_FLD_MULTIPLE "x_slp_multiple"
34 #define AUL_APP_INFO_FLD_TASK_MANAGE "x_slp_taskmanage"
35 #define AUL_APP_INFO_FLD_MIMETYPE "mimetype"
36 #define AUL_APP_INFO_FLD_SERVICE "x_slp_service"
38 #define AUL_RETRIEVE_PKG_NAME "package = '?'"
39 #define AUL_RETRIEVE_APP_PATH "exec = '?'"
40 #define AUL_RETRIEVE_MIMETYPE "mimetype like '?'"
41 #define AUL_RETRIEVE_SERVICE "x_slp_service like '?'"
44 char *appid; /* appid */
45 char *app_path; /* exec */
46 char *original_app_path; /* exec */
47 char *pkg_type; /* x_slp_packagetype */
48 char *hwacc; /* hwacceleration */
52 static inline char *_get_appid(app_info_from_db *menu_info)
54 return menu_info ? menu_info->appid : NULL;
57 static inline char *_get_pkgid(app_info_from_db *menu_info)
59 return menu_info ? menu_info->pkg_id : NULL;
62 static inline char *_get_app_path(app_info_from_db *menu_info)
67 if (!menu_info || menu_info->app_path == NULL)
70 while (menu_info->app_path[i] != 0) {
71 if (menu_info->app_path[i] == ' '
72 || menu_info->app_path[i] == '\t') {
80 free(menu_info->app_path);
81 menu_info->app_path = NULL;
82 } else if (path_len > 0) {
83 char *tmp_app_path = malloc(sizeof(char) * (path_len + 1));
84 if (tmp_app_path == NULL)
86 snprintf(tmp_app_path, path_len + 1, "%s", menu_info->app_path);
87 free(menu_info->app_path);
88 menu_info->app_path = tmp_app_path;
91 return menu_info->app_path;
94 static inline char *_get_original_app_path(app_info_from_db *menu_info)
96 return menu_info ? menu_info->original_app_path : NULL;
99 static inline void _free_app_info_from_db(app_info_from_db *menu_info)
101 if (menu_info != NULL) {
102 if (menu_info->appid != NULL)
103 free(menu_info->appid);
104 if (menu_info->app_path != NULL)
105 free(menu_info->app_path);
106 if (menu_info->original_app_path != NULL)
107 free(menu_info->original_app_path);
108 if (menu_info->pkg_type != NULL)
109 free(menu_info->pkg_type);
110 if (menu_info->hwacc != NULL)
111 free(menu_info->hwacc);
112 if (menu_info->pkg_id != NULL)
113 free(menu_info->pkg_id);
118 static inline app_info_from_db *_get_app_info_from_db_by_pkgname(
121 app_info_from_db *menu_info = NULL;
122 pkgmgrinfo_appinfo_h handle = NULL;
123 int ret = PMINFO_R_OK;
125 char *apptype = NULL;
127 menu_info = calloc(1, sizeof(app_info_from_db));
128 if (menu_info == NULL)
132 _free_app_info_from_db(menu_info);
137 if (getuid() != GLOBAL_USER)
138 ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, getuid(), &handle);
140 ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
142 if (ret != PMINFO_R_OK) {
143 _free_app_info_from_db(menu_info);
147 menu_info->appid = strdup(appid);
149 ret = pkgmgrinfo_appinfo_get_exec(handle, &exec);
150 if (ret != PMINFO_R_OK)
151 _E("fail to get exec from appinfo handle");
154 menu_info->app_path = strdup(exec);
156 if (menu_info->app_path != NULL)
157 menu_info->original_app_path = strdup(menu_info->app_path);
159 ret = pkgmgrinfo_appinfo_get_apptype(handle, &apptype);
160 if (ret != PMINFO_R_OK)
161 _E("fail to get apptype from appinfo handle");
164 menu_info->pkg_type = strdup(apptype);
166 ret = pkgmgrinfo_appinfo_destroy_appinfo(handle);
167 if (ret != PMINFO_R_OK)
168 _E("pkgmgrinfo_appinfo_destroy_appinfo failed");
170 if (!_get_app_path(menu_info)) {
171 _free_app_info_from_db(menu_info);
178 static inline int __appinfo_func(const pkgmgrinfo_appinfo_h appinfo,
181 app_info_from_db *menu_info = (app_info_from_db *)user_data;
184 int ret = PMINFO_R_OK;
189 ret = pkgmgrinfo_appinfo_get_exec(appinfo, &apppath);
190 if (ret == PMINFO_R_OK && apppath) {
191 menu_info->app_path = strdup(apppath);
192 if (menu_info->app_path == NULL) {
194 return PMINFO_R_ERROR;
198 ret = pkgmgrinfo_appinfo_get_pkgid(appinfo, &pkgid);
199 if (ret == PMINFO_R_OK && pkgid) {
200 menu_info->pkg_id = strdup(pkgid);
201 if (menu_info->pkg_id == NULL) {
203 return PMINFO_R_ERROR;
210 static inline app_info_from_db *_get_app_info_from_db_by_appid_user(
211 const char *appid, uid_t uid)
213 app_info_from_db *menu_info;
214 pkgmgrinfo_appinfo_filter_h filter;
215 int ret = PMINFO_R_OK;
218 _E("request from root, treat as global user");
225 menu_info = calloc(1, sizeof(app_info_from_db));
226 if (menu_info == NULL)
229 ret = pkgmgrinfo_appinfo_filter_create(&filter);
230 if (ret != PMINFO_R_OK) {
231 _free_app_info_from_db(menu_info);
235 ret = pkgmgrinfo_appinfo_filter_add_string(filter,
236 PMINFO_APPINFO_PROP_APP_ID, appid);
237 if (ret != PMINFO_R_OK) {
238 pkgmgrinfo_appinfo_filter_destroy(filter);
239 _free_app_info_from_db(menu_info);
243 if (uid != GLOBAL_USER)
244 ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(filter,
245 __appinfo_func, (void *)menu_info, uid);
247 ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(filter,
248 __appinfo_func, (void *)menu_info);
250 if ((ret != PMINFO_R_OK) || (menu_info->app_path == NULL)) {
251 pkgmgrinfo_appinfo_filter_destroy(filter);
252 _free_app_info_from_db(menu_info);
256 pkgmgrinfo_appinfo_filter_destroy(filter);
258 menu_info->appid = strdup(appid);
259 menu_info->original_app_path = strdup(menu_info->app_path);
265 static inline app_info_from_db *_get_app_info_from_db_by_appid(
268 return _get_app_info_from_db_by_appid_user(appid, GLOBAL_USER);