2 * Copyright (c) 2011 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.
24 #include <package-manager.h>
28 #include <app_manager.h>
29 #include <app_manager_private.h>
35 #define LOG_TAG "TIZEN_N_APP_MANAGER"
37 static int app_info_create(const char *app_id, app_info_h *app_info);
41 ail_appinfo_h ail_app_info;
44 typedef struct _foreach_context_{
45 app_manager_app_info_cb callback;
50 static ail_cb_ret_e app_info_foreach_app_info_cb(const ail_appinfo_h ail_app_info, void *cb_data)
52 foreach_context_s *foreach_context = cb_data;
53 app_info_h app_info = NULL;
55 bool iteration_next = true;
57 if (ail_app_info == NULL || foreach_context == NULL)
59 app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
60 return AIL_CB_RET_CANCEL;
63 ail_appinfo_get_str(ail_app_info, AIL_PROP_PACKAGE_STR, &app_id);
65 if (app_info_create(app_id, &app_info) == APP_MANAGER_ERROR_NONE)
67 iteration_next = foreach_context->callback(app_info, foreach_context->user_data);
68 app_info_destroy(app_info);
71 if (iteration_next == true)
73 return AIL_CB_RET_CONTINUE;
77 return AIL_CB_RET_CANCEL;
81 int app_info_foreach_app_info(app_manager_app_info_cb callback, void *user_data)
83 foreach_context_s foreach_context = {
85 .user_data = user_data,
90 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
93 ail_filter_list_appinfo_foreach(NULL, app_info_foreach_app_info_cb, &foreach_context);
95 return APP_MANAGER_ERROR_NONE;
98 int app_info_get_app_info(const char *app_id, app_info_h *app_info)
100 return app_info_create(app_id, app_info);
103 static int app_info_create(const char *app_id, app_info_h *app_info)
105 app_info_h app_info_created;
106 ail_appinfo_h ail_app_info;
108 if (app_id == NULL || app_info == NULL)
110 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
113 if (ail_package_get_appinfo(app_id, &ail_app_info) != AIL_ERROR_OK)
115 return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
118 app_info_created = calloc(1, sizeof(struct app_info_s));
120 if (app_info_created == NULL)
122 ail_package_destroy_appinfo(ail_app_info);
123 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
126 app_info_created->app_id = strdup(app_id);
128 if (app_info_created->app_id == NULL)
130 ail_package_destroy_appinfo(ail_app_info);
131 free(app_info_created);
132 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
135 app_info_created->ail_app_info = ail_app_info;
137 *app_info = app_info_created;
139 return APP_MANAGER_ERROR_NONE;
142 int app_info_destroy(app_info_h app_info)
144 if (app_info == NULL)
146 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
149 free(app_info->app_id);
151 ail_package_destroy_appinfo(app_info->ail_app_info);
155 return APP_MANAGER_ERROR_NONE;
158 int app_info_get_app_id(app_info_h app_info, char **app_id)
162 if (app_info == NULL || app_id == NULL)
164 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
167 app_id_dup = strdup(app_info->app_id);
169 if (app_id_dup == NULL)
171 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
174 *app_id = app_id_dup;
176 return APP_MANAGER_ERROR_NONE;
180 int app_info_get_name(app_info_h app_info, char **name)
182 char *ail_value = NULL;
185 if (app_info == NULL || name == NULL)
187 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
190 if (ail_appinfo_get_str(app_info->ail_app_info, AIL_PROP_NAME_STR, &ail_value) != AIL_ERROR_OK)
192 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
195 name_dup = strdup(ail_value);
197 if (name_dup == NULL)
199 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
204 return APP_MANAGER_ERROR_NONE;
208 int app_info_get_version(app_info_h app_info, char **version)
210 char *ail_value = NULL;
213 if (app_info == NULL || version == NULL)
215 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
218 if (ail_appinfo_get_str(app_info->ail_app_info, AIL_PROP_VERSION_STR, &ail_value) != AIL_ERROR_OK)
220 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
223 version_dup = strdup(ail_value);
225 if (version_dup == NULL)
227 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
230 *version = version_dup;
232 return APP_MANAGER_ERROR_NONE;
236 int app_info_get_icon(app_info_h app_info, char **path)
238 char *ail_value = NULL;
241 if (app_info == NULL || path == NULL)
243 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
246 if (ail_appinfo_get_str(app_info->ail_app_info, AIL_PROP_ICON_STR, &ail_value) != AIL_ERROR_OK)
248 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
251 path_dup = strdup(ail_value);
253 if (path_dup == NULL)
255 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
260 return APP_MANAGER_ERROR_NONE;
264 int app_info_is_equal(app_info_h lhs, app_info_h rhs, bool *equal)
266 if (lhs == NULL || rhs == NULL || equal == NULL)
268 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
271 if (!strcmp(lhs->app_id, rhs->app_id))
280 return APP_MANAGER_ERROR_NONE;
284 int app_info_clone(app_info_h *clone, app_info_h app_info)
288 if (clone == NULL || app_info == NULL)
290 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
293 retval = app_info_create(app_info->app_id, clone);
295 if (retval != APP_MANAGER_ERROR_NONE)
297 return app_manager_error(retval, __FUNCTION__, NULL);
300 return APP_MANAGER_ERROR_NONE;
303 static pkgmgr_client *package_event_listener = NULL;
304 static app_manager_app_info_event_cb app_info_event_cb = NULL;
305 static void *app_info_event_cb_data = NULL;
307 static app_info_event_e app_info_get_app_info_event(const char *value)
309 if (!strcasecmp(value, "install"))
311 return APP_INFO_EVENT_INSTALLED;
313 else if (!strcasecmp(value, "uninstall"))
315 return APP_INFO_EVENT_UNINSTALLED;
317 else if (!strcasecmp(value, "update"))
319 return APP_INFO_EVENT_UPDATED;
323 return APP_MANAGER_ERROR_INVALID_PARAMETER;
327 static int app_info_package_event_listener_cb(
328 int id, const char *type, const char *package, const char *key, const char *val, const void *msg, void *data)
330 static int event_id = -1;
331 static app_info_event_e event_type = -1;
333 if (!strcasecmp(key, "start"))
336 event_type = app_info_get_app_info_event(val);
338 else if (!strcasecmp(key, "end") && !strcasecmp(val, "ok") && id == event_id)
340 if (app_info_event_cb != NULL && event_type >= 0)
344 if (app_info_create(package, &app_info) == APP_MANAGER_ERROR_NONE)
346 app_info_event_cb(app_info, event_type, app_info_event_cb_data);
347 app_info_destroy(app_info);
355 return APP_MANAGER_ERROR_NONE;
358 int app_info_set_event_cb(app_manager_app_info_event_cb callback, void *user_data)
360 if (callback == NULL)
362 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
365 if (app_info_event_cb == NULL)
367 package_event_listener = pkgmgr_client_new(PC_LISTENING);
369 if (package_event_listener == NULL)
371 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
374 pkgmgr_client_listen_status(package_event_listener, app_info_package_event_listener_cb, NULL);
377 app_info_event_cb = callback;
378 app_info_event_cb_data = user_data;
380 return APP_MANAGER_ERROR_NONE;
384 void app_info_unset_event_cb(void)
386 if (app_info_event_cb != NULL)
388 pkgmgr_client_free(package_event_listener);
389 package_event_listener = NULL;
392 app_info_event_cb = NULL;
393 app_info_event_cb_data = NULL;