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.
23 #include <pkgmgr-info.h>
24 #include <package-manager.h>
28 #include "app_manager.h"
29 #include "app_manager_internal.h"
35 #define LOG_TAG "TIZEN_N_APP_MANAGER"
39 pkgmgrinfo_appinfo_h pkg_app_info;
42 struct app_info_filter_s {
43 pkgmgrinfo_appinfo_filter_h pkg_app_info_filter;
46 struct app_info_metadata_filter_s {
47 pkgmgrinfo_appinfo_metadata_filter_h pkg_app_info_metadata_filter;
50 typedef struct _foreach_context_{
51 app_manager_app_info_cb callback;
55 typedef struct _foreach_metada_context_{
56 app_info_metadata_cb callback;
58 } foreach_metadata_context_s;
60 static int app_info_convert_str_property(const char *property, char **converted_property)
65 if (strcmp(property, PACKAGE_INFO_PROP_APP_ID)==0)
66 *converted_property = PMINFO_APPINFO_PROP_APP_ID;
68 else if (strcmp(property, PACKAGE_INFO_PROP_APP_TYPE)==0)
69 *converted_property = PMINFO_APPINFO_PROP_APP_TYPE;
71 else if (strcmp(property, PACKAGE_INFO_PROP_APP_CATEGORY)==0)
72 *converted_property = PMINFO_APPINFO_PROP_APP_CATEGORY;
80 static int app_info_convert_bool_property(const char *property, char **converted_property)
85 if (strcmp(property, PACKAGE_INFO_PROP_APP_NODISPLAY)==0)
86 *converted_property = PMINFO_APPINFO_PROP_APP_NODISPLAY;
88 else if (strcmp(property, PACKAGE_INFO_PROP_APP_TASKMANAGE)==0)
89 *converted_property = PMINFO_APPINFO_PROP_APP_TASKMANAGE;
97 static int app_info_foreach_app_filter_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
101 app_info_h info = NULL;
102 info = calloc(1, sizeof(struct app_info_s));
104 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
107 foreach_context_s *foreach_context = user_data;
108 if (handle == NULL || foreach_context == NULL)
111 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
114 retval = pkgmgrinfo_appinfo_get_appid(handle, &appid);
118 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
121 info->app_id = strdup(appid);
122 info->pkg_app_info = handle;
124 foreach_context->callback(info, foreach_context->user_data);
126 return APP_MANAGER_ERROR_NONE;
129 static int app_info_foreach_app_metadata_cb(const char *metadata_key, const char *metadata_value, void *user_data)
131 foreach_metadata_context_s *foreach_context = user_data;
133 if (metadata_value == NULL || foreach_context == NULL)
135 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
138 foreach_context->callback(metadata_key, metadata_value, foreach_context->user_data);
140 return APP_MANAGER_ERROR_NONE;
143 static int app_info_foreach_app_info_cb(pkgmgrinfo_appinfo_h handle, void *cb_data)
145 foreach_context_s *foreach_context = cb_data;
146 app_info_h app_info = NULL;
149 bool iteration_next = true;
151 if (handle == NULL || foreach_context == NULL)
153 app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
154 return PMINFO_R_ERROR;
157 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
158 if (ret != PMINFO_R_OK) {
159 app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
160 return PMINFO_R_ERROR;
163 if (app_info_create(appid, &app_info) == APP_MANAGER_ERROR_NONE)
165 iteration_next = foreach_context->callback(app_info, foreach_context->user_data);
166 app_info_destroy(app_info);
169 if (iteration_next == true)
175 return PMINFO_R_ERROR;
179 int app_info_foreach_app_info(app_manager_app_info_cb callback, void *user_data)
181 foreach_context_s foreach_context = {
182 .callback = callback,
183 .user_data = user_data,
186 if (callback == NULL)
188 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
191 pkgmgrinfo_appinfo_get_usr_installed_list(app_info_foreach_app_info_cb, getuid(), &foreach_context);
193 return APP_MANAGER_ERROR_NONE;
196 API int app_info_create(const char *app_id, app_info_h *app_info)
198 pkgmgrinfo_pkginfo_h pkginfo = NULL;
199 pkgmgrinfo_appinfo_h appinfo = NULL;
200 app_info_h info = NULL;
202 char *main_appid = NULL;
204 if (app_id == NULL || app_info == NULL) {
205 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
207 info = calloc(1, sizeof(struct app_info_s));
209 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
212 retval = pkgmgrinfo_pkginfo_get_usr_pkginfo(app_id, getuid(), &pkginfo);
214 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, getuid(), &appinfo)) {
216 return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
219 info->app_id = strdup(app_id);
220 info->pkg_app_info = appinfo;
222 return APP_MANAGER_ERROR_NONE;
225 retval = pkgmgrinfo_pkginfo_get_mainappid(pkginfo, &main_appid);
227 app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
230 if (pkgmgrinfo_appinfo_get_usr_appinfo(main_appid, getuid(), &appinfo)) {
232 return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
235 info->app_id = strdup(main_appid);
236 info->pkg_app_info = appinfo;
239 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
241 return APP_MANAGER_ERROR_NONE;
244 API int app_info_destroy(app_info_h app_info)
246 if (app_info == NULL)
248 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
250 if (app_info->app_id) {
251 free(app_info->app_id);
252 app_info->app_id = NULL;
254 pkgmgrinfo_appinfo_destroy_appinfo(app_info->pkg_app_info);
256 return APP_MANAGER_ERROR_NONE;
259 API int app_info_get_app_id(app_info_h app_info, char **app_id)
263 if (app_info == NULL || app_id == NULL)
265 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
268 app_id_dup = strdup(app_info->app_id);
270 if (app_id_dup == NULL)
272 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
275 *app_id = app_id_dup;
277 return APP_MANAGER_ERROR_NONE;
280 API int app_info_get_exec(app_info_h app_info, char **exec)
285 if (app_info == NULL || exec == NULL)
287 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
290 pkgmgrinfo_appinfo_get_exec(app_info->pkg_app_info, &val);
293 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
296 app_exec_dup = strdup(val);
297 if (app_exec_dup == NULL)
299 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
302 *exec = app_exec_dup;
304 return APP_MANAGER_ERROR_NONE;
307 API int app_info_get_label(app_info_h app_info, char **label)
312 if (app_info == NULL || label == NULL)
314 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
317 pkgmgrinfo_appinfo_get_label(app_info->pkg_app_info, &val);
320 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
323 app_label_dup = strdup(val);
324 if (app_label_dup == NULL)
326 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
329 *label = app_label_dup;
331 return APP_MANAGER_ERROR_NONE;
334 API int app_info_get_localed_label(const char *app_id, const char *locale, char **label)
339 if (app_id == NULL || locale == NULL || label == NULL)
341 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
344 if (pkgmgrinfo_appinfo_usr_get_localed_label(app_id, locale, getuid(), &val))
346 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
349 app_label_dup = strdup(val);
350 if (app_label_dup == NULL)
352 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
355 *label = app_label_dup;
358 return APP_MANAGER_ERROR_NONE;
361 API int app_info_get_icon(app_info_h app_info, char **path)
366 if (app_info == NULL || path == NULL)
368 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
371 pkgmgrinfo_appinfo_get_icon(app_info->pkg_app_info, &val);
374 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
377 app_icon_dup = strdup(val);
378 if (app_icon_dup == NULL)
380 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
383 *path = app_icon_dup;
385 return APP_MANAGER_ERROR_NONE;
388 API int app_info_get_package(app_info_h app_info, char **package)
391 char *app_package_dup;
393 if (app_info == NULL || package == NULL)
395 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
398 pkgmgrinfo_appinfo_get_pkgname(app_info->pkg_app_info, &val);
400 app_package_dup = strdup(val);
401 if (app_package_dup == NULL)
403 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
406 *package = app_package_dup;
408 return APP_MANAGER_ERROR_NONE;
411 API int app_info_get_type(app_info_h app_info, char **type)
416 if (app_info == NULL || type == NULL)
418 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
421 pkgmgrinfo_appinfo_get_apptype(app_info->pkg_app_info, &val);
423 app_type_dup = strdup(val);
424 if (app_type_dup == NULL)
426 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
429 *type = app_type_dup;
431 return APP_MANAGER_ERROR_NONE;
434 API int app_info_foreach_metadata(app_info_h app_info, app_info_metadata_cb callback, void *user_data)
438 if (app_info == NULL || callback == NULL)
440 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
443 foreach_metadata_context_s foreach_context = {
444 .callback = callback,
445 .user_data = user_data,
448 retval = pkgmgrinfo_appinfo_foreach_metadata(app_info->pkg_app_info, app_info_foreach_app_metadata_cb, &foreach_context);
451 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
454 return APP_MANAGER_ERROR_NONE;
457 API int app_info_is_nodisplay(app_info_h app_info, bool *nodisplay)
461 if (app_info == NULL || nodisplay == NULL)
463 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
466 if (pkgmgrinfo_appinfo_is_nodisplay(app_info->pkg_app_info, &val) < 0)
467 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
470 return APP_MANAGER_ERROR_NONE;
473 API int app_info_is_enabled(app_info_h app_info, bool *enabled)
477 if (app_info == NULL || enabled == NULL)
479 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
482 if (pkgmgrinfo_appinfo_is_enabled(app_info->pkg_app_info, &val) < 0)
483 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
486 return APP_MANAGER_ERROR_NONE;
490 API int app_info_is_equal(app_info_h lhs, app_info_h rhs, bool *equal)
492 if (lhs == NULL || rhs == NULL || equal == NULL)
494 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
497 if (!strcmp(lhs->app_id, rhs->app_id))
506 return APP_MANAGER_ERROR_NONE;
509 API int app_info_is_onboot(app_info_h app_info, bool *onboot)
513 if (app_info == NULL || onboot == NULL)
515 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
518 if (pkgmgrinfo_appinfo_is_onboot(app_info->pkg_app_info, &val) < 0)
520 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
524 return APP_MANAGER_ERROR_NONE;
527 API int app_info_is_preload(app_info_h app_info, bool *preload)
531 if (app_info == NULL || preload == NULL)
533 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
536 if (pkgmgrinfo_appinfo_is_preload(app_info->pkg_app_info, &val) < 0)
538 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
542 return APP_MANAGER_ERROR_NONE;
545 API int app_info_clone(app_info_h *clone, app_info_h app_info)
549 if (clone == NULL || app_info == NULL)
551 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
554 retval = app_info_create(app_info->app_id, clone);
556 if (retval != APP_MANAGER_ERROR_NONE)
558 return app_manager_error(retval, __FUNCTION__, NULL);
561 return APP_MANAGER_ERROR_NONE;
564 API int app_info_filter_create(app_info_filter_h *handle)
567 app_info_filter_h filter_created = NULL;
568 pkgmgrinfo_appinfo_filter_h filter_h = NULL;
572 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
575 retval = pkgmgrinfo_appinfo_filter_create(&filter_h);
577 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
580 filter_created = calloc(1, sizeof(struct app_info_filter_s));
581 if (filter_created == NULL)
584 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
587 filter_created->pkg_app_info_filter = filter_h;
589 *handle = filter_created;
591 return APP_MANAGER_ERROR_NONE;
594 API int app_info_filter_destroy(app_info_filter_h handle)
600 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
603 retval = pkgmgrinfo_appinfo_filter_destroy(handle->pkg_app_info_filter);
606 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
610 return APP_MANAGER_ERROR_NONE;
613 API int app_info_filter_add_bool(app_info_filter_h handle, const char *property, const bool value)
616 char *converted_property = NULL;
618 if ((handle == NULL) || (property == NULL))
620 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
623 retval = app_info_convert_bool_property(property, &converted_property);
626 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
629 retval = pkgmgrinfo_appinfo_filter_add_bool(handle->pkg_app_info_filter, converted_property, value);
632 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
635 return APP_MANAGER_ERROR_NONE;
638 API int app_info_filter_add_string(app_info_filter_h handle, const char *property, const char *value)
641 char *converted_property = NULL;
643 if ((handle == NULL) || (property == NULL))
645 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
648 retval = app_info_convert_str_property(property, &converted_property);
651 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
654 retval = pkgmgrinfo_appinfo_filter_add_string(handle->pkg_app_info_filter, converted_property, value);
657 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
660 return APP_MANAGER_ERROR_NONE;
663 API int app_info_filter_count_appinfo(app_info_filter_h handle, int *count)
667 if ((handle == NULL) || (count == NULL))
669 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
672 retval = pkgmgrinfo_appinfo_filter_count(handle->pkg_app_info_filter, count);
675 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
678 return APP_MANAGER_ERROR_NONE;
681 API int app_info_filter_foreach_appinfo(app_info_filter_h handle, app_info_filter_cb callback, void * user_data)
685 foreach_context_s foreach_context = {
686 .callback = callback,
687 .user_data = user_data,
690 if ((handle == NULL) || (callback == NULL))
692 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
695 retval = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle->pkg_app_info_filter, app_info_foreach_app_filter_cb, &foreach_context, getuid());
698 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
701 return APP_MANAGER_ERROR_NONE;
704 API int app_info_metadata_filter_create(app_info_metadata_filter_h *handle)
707 app_info_metadata_filter_h filter_created = NULL;
708 pkgmgrinfo_appinfo_metadata_filter_h filter_h = NULL;
712 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
715 filter_created = calloc(1, sizeof(struct app_info_metadata_filter_s));
716 if (filter_created == NULL)
718 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
721 retval = pkgmgrinfo_appinfo_metadata_filter_create(&filter_h);
723 free(filter_created);
724 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
727 filter_created->pkg_app_info_metadata_filter = filter_h;
729 *handle = filter_created;
731 return APP_MANAGER_ERROR_NONE;
734 API int app_info_metadata_filter_destroy(app_info_metadata_filter_h handle)
740 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
743 retval = pkgmgrinfo_appinfo_metadata_filter_destroy(handle->pkg_app_info_metadata_filter);
746 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
750 return APP_MANAGER_ERROR_NONE;
753 API int app_info_metadata_filter_add(app_info_metadata_filter_h handle, const char *key, const char *value)
757 if ((handle == NULL) || (key == NULL))
759 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
762 retval = pkgmgrinfo_appinfo_metadata_filter_add(handle->pkg_app_info_metadata_filter, key, value);
765 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
768 return APP_MANAGER_ERROR_NONE;
771 API int app_info_metadata_filter_foreach(app_info_metadata_filter_h handle, app_info_filter_cb callback, void *user_data)
775 foreach_context_s foreach_context = {
776 .callback = callback,
777 .user_data = user_data,
782 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
785 if (callback == NULL)
787 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
790 retval = pkgmgrinfo_appinfo_usr_metadata_filter_foreach(handle->pkg_app_info_metadata_filter, app_info_foreach_app_filter_cb, &foreach_context, getuid());
793 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
796 return APP_MANAGER_ERROR_NONE;