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>
30 #define MAX_PATH_LEN 1024
32 #define AUL_APP_INFO_FLD_PKG_NAME "package"
33 #define AUL_APP_INFO_FLD_APP_PATH "exec"
34 #define AUL_APP_INFO_FLD_APP_TYPE "x_slp_packagetype"
35 #define AUL_APP_INFO_FLD_WIDTH "x_slp_baselayoutwidth"
36 #define AUL_APP_INFO_FLD_HEIGHT "x_slp_baselayoutheight"
37 #define AUL_APP_INFO_FLD_VERTICAL "x_slp_ishorizontalscale"
38 #define AUL_APP_INFO_FLD_MULTIPLE "x_slp_multiple"
39 #define AUL_APP_INFO_FLD_TASK_MANAGE "x_slp_taskmanage"
40 #define AUL_APP_INFO_FLD_MIMETYPE "mimetype"
41 #define AUL_APP_INFO_FLD_SERVICE "x_slp_service"
43 #define AUL_RETRIEVE_PKG_NAME "package = '?'"
44 #define AUL_RETRIEVE_APP_PATH "exec = '?'"
45 #define AUL_RETRIEVE_MIMETYPE "mimetype like '?'"
46 #define AUL_RETRIEVE_SERVICE "x_slp_service like '?'"
49 char *appid; /* appid */
50 char *app_path; /* exec */
51 char *original_app_path; /* exec */
52 char *pkg_type; /* x_slp_packagetype */
53 char *hwacc; /* hwacceleration */
57 static inline char *_get_appid(app_info_from_db *menu_info)
59 return menu_info ? menu_info->appid : NULL;
62 static inline char *_get_pkgid(app_info_from_db *menu_info)
64 return menu_info ? menu_info->pkg_id : NULL;
67 static inline char *_get_app_path(app_info_from_db *menu_info)
72 if (!menu_info || menu_info->app_path == NULL)
75 while (menu_info->app_path[i] != 0) {
76 if (menu_info->app_path[i] == ' '
77 || menu_info->app_path[i] == '\t') {
85 free(menu_info->app_path);
86 menu_info->app_path = NULL;
87 } else if (path_len > 0) {
88 char *tmp_app_path = (char *)malloc(
89 sizeof(char) * (path_len + 1));
90 if (tmp_app_path == NULL)
92 snprintf(tmp_app_path, path_len + 1, "%s", menu_info->app_path);
93 free(menu_info->app_path);
94 menu_info->app_path = tmp_app_path;
97 return menu_info->app_path;
100 static inline char *_get_original_app_path(app_info_from_db *menu_info)
102 return menu_info ? menu_info->original_app_path : NULL;
105 static inline void _free_app_info_from_db(app_info_from_db *menu_info)
107 if (menu_info != NULL) {
108 if (menu_info->appid != NULL)
109 free(menu_info->appid);
110 if (menu_info->app_path != NULL)
111 free(menu_info->app_path);
112 if (menu_info->original_app_path != NULL)
113 free(menu_info->original_app_path);
114 if (menu_info->pkg_type != NULL)
115 free(menu_info->pkg_type);
116 if (menu_info->hwacc != NULL)
117 free(menu_info->hwacc);
118 if (menu_info->pkg_id != NULL)
119 free(menu_info->pkg_id);
124 static inline app_info_from_db *_get_app_info_from_db_by_pkgname(
127 app_info_from_db *menu_info = NULL;
128 pkgmgrinfo_appinfo_h handle = NULL;
129 int ret = PMINFO_R_OK;
131 char *apptype = NULL;
133 menu_info = (app_info_from_db *)calloc(1, sizeof(app_info_from_db));
134 if (menu_info == NULL)
138 _free_app_info_from_db(menu_info);
143 if (getuid() != GLOBAL_USER)
144 ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, getuid(), &handle);
146 ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
148 if (ret != PMINFO_R_OK) {
149 _free_app_info_from_db(menu_info);
153 menu_info->appid = strdup(appid);
155 ret = pkgmgrinfo_appinfo_get_exec(handle, &exec);
156 if (ret != PMINFO_R_OK)
157 _E("fail to get exec from appinfo handle");
160 menu_info->app_path = strdup(exec);
162 if (menu_info->app_path != NULL)
163 menu_info->original_app_path = strdup(menu_info->app_path);
165 ret = pkgmgrinfo_appinfo_get_apptype(handle, &apptype);
166 if (ret != PMINFO_R_OK)
167 _E("fail to get apptype from appinfo handle");
170 menu_info->pkg_type = strdup(apptype);
172 ret = pkgmgrinfo_appinfo_destroy_appinfo(handle);
173 if (ret != PMINFO_R_OK)
174 _E("pkgmgrinfo_appinfo_destroy_appinfo failed");
176 if (!_get_app_path(menu_info)) {
177 _free_app_info_from_db(menu_info);
184 static inline int __appinfo_func(const pkgmgrinfo_appinfo_h appinfo,
187 app_info_from_db *menu_info = (app_info_from_db *)user_data;
190 int ret = PMINFO_R_OK;
195 ret = pkgmgrinfo_appinfo_get_exec(appinfo, &apppath);
196 if (ret == PMINFO_R_OK && apppath) {
197 menu_info->app_path = strdup(apppath);
198 if (menu_info->app_path == NULL) {
200 return PMINFO_R_ERROR;
204 ret = pkgmgrinfo_appinfo_get_pkgid(appinfo, &pkgid);
205 if (ret == PMINFO_R_OK && pkgid) {
206 menu_info->pkg_id = strdup(pkgid);
207 if (menu_info->pkg_id == NULL) {
209 return PMINFO_R_ERROR;
216 static inline app_info_from_db *_get_app_info_from_db_by_appid_user(
217 const char *appid, uid_t uid)
219 app_info_from_db *menu_info;
220 pkgmgrinfo_appinfo_filter_h filter;
221 int ret = PMINFO_R_OK;
224 _E("request from root, treat as global user");
231 menu_info = (app_info_from_db *)calloc(1, sizeof(app_info_from_db));
232 if (menu_info == NULL)
235 ret = pkgmgrinfo_appinfo_filter_create(&filter);
236 if (ret != PMINFO_R_OK) {
237 _free_app_info_from_db(menu_info);
241 ret = pkgmgrinfo_appinfo_filter_add_string(filter,
242 PMINFO_APPINFO_PROP_APP_ID, appid);
243 if (ret != PMINFO_R_OK) {
244 pkgmgrinfo_appinfo_filter_destroy(filter);
245 _free_app_info_from_db(menu_info);
249 if (uid != GLOBAL_USER)
250 ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(filter,
251 __appinfo_func, (void *)menu_info, uid);
253 ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(filter,
254 __appinfo_func, (void *)menu_info);
256 if ((ret != PMINFO_R_OK) || (menu_info->app_path == NULL)) {
257 pkgmgrinfo_appinfo_filter_destroy(filter);
258 _free_app_info_from_db(menu_info);
262 pkgmgrinfo_appinfo_filter_destroy(filter);
264 menu_info->appid = strdup(appid);
265 menu_info->original_app_path = strdup(menu_info->app_path);
271 static inline app_info_from_db *_get_app_info_from_db_by_appid(
274 return _get_app_info_from_db_by_appid_user(appid, GLOBAL_USER);