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;
103 info = calloc(1, sizeof(struct app_info_s));
105 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) {
110 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
113 retval = pkgmgrinfo_appinfo_get_appid(handle, &appid);
116 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
119 info->app_id = strdup(appid);
120 info->pkg_app_info = handle;
122 foreach_context->callback(info, foreach_context->user_data);
124 return APP_MANAGER_ERROR_NONE;
127 static int app_info_foreach_app_metadata_cb(const char *metadata_key, const char *metadata_value, void *user_data)
129 foreach_metadata_context_s *foreach_context = user_data;
131 if (metadata_value == NULL || foreach_context == NULL)
132 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
134 foreach_context->callback(metadata_key, metadata_value, foreach_context->user_data);
136 return APP_MANAGER_ERROR_NONE;
139 static int app_info_foreach_app_info_cb(pkgmgrinfo_appinfo_h handle, void *cb_data)
141 foreach_context_s *foreach_context = cb_data;
142 app_info_h app_info = NULL;
145 bool iteration_next = true;
147 if (handle == NULL || foreach_context == NULL) {
148 app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
149 return PMINFO_R_ERROR;
152 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
153 if (ret != PMINFO_R_OK) {
154 app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
155 return PMINFO_R_ERROR;
158 if (app_info_create(appid, &app_info) == APP_MANAGER_ERROR_NONE) {
159 iteration_next = foreach_context->callback(app_info, foreach_context->user_data);
160 app_info_destroy(app_info);
163 if (iteration_next == true)
166 return PMINFO_R_ERROR;
169 int app_info_foreach_app_info(app_manager_app_info_cb callback, void *user_data)
171 foreach_context_s foreach_context = {
172 .callback = callback,
173 .user_data = user_data,
176 if (callback == NULL)
177 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
179 pkgmgrinfo_appinfo_get_usr_installed_list(app_info_foreach_app_info_cb, getuid(), &foreach_context);
181 return APP_MANAGER_ERROR_NONE;
184 API int app_info_create(const char *app_id, app_info_h *app_info)
186 pkgmgrinfo_pkginfo_h pkginfo = NULL;
187 pkgmgrinfo_appinfo_h appinfo = NULL;
188 app_info_h info = NULL;
190 char *main_appid = NULL;
192 if (app_id == NULL || app_info == NULL)
193 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
195 info = calloc(1, sizeof(struct app_info_s));
197 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
199 retval = pkgmgrinfo_pkginfo_get_usr_pkginfo(app_id, getuid(), &pkginfo);
201 if (pkgmgrinfo_appinfo_get_usr_appinfo(app_id, getuid(), &appinfo)) {
203 return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
206 info->app_id = strdup(app_id);
207 info->pkg_app_info = appinfo;
209 return APP_MANAGER_ERROR_NONE;
212 retval = pkgmgrinfo_pkginfo_get_mainappid(pkginfo, &main_appid);
214 app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
216 if (pkgmgrinfo_appinfo_get_usr_appinfo(main_appid, getuid(), &appinfo)) {
218 return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
221 info->app_id = strdup(main_appid);
222 info->pkg_app_info = appinfo;
225 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
227 return APP_MANAGER_ERROR_NONE;
230 API int app_info_destroy(app_info_h app_info)
232 if (app_info == NULL)
233 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
235 if (app_info->app_id) {
236 free(app_info->app_id);
237 app_info->app_id = NULL;
240 pkgmgrinfo_appinfo_destroy_appinfo(app_info->pkg_app_info);
242 return APP_MANAGER_ERROR_NONE;
245 API int app_info_get_app_id(app_info_h app_info, char **app_id)
249 if (app_info == NULL || app_id == NULL)
250 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
252 app_id_dup = strdup(app_info->app_id);
253 if (app_id_dup == NULL)
254 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
256 *app_id = app_id_dup;
258 return APP_MANAGER_ERROR_NONE;
261 API int app_info_get_exec(app_info_h app_info, char **exec)
266 if (app_info == NULL || exec == NULL)
267 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
269 pkgmgrinfo_appinfo_get_exec(app_info->pkg_app_info, &val);
271 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
273 app_exec_dup = strdup(val);
274 if (app_exec_dup == NULL)
275 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
277 *exec = app_exec_dup;
279 return APP_MANAGER_ERROR_NONE;
282 API int app_info_get_label(app_info_h app_info, char **label)
287 if (app_info == NULL || label == NULL)
288 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
290 pkgmgrinfo_appinfo_get_label(app_info->pkg_app_info, &val);
292 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
294 app_label_dup = strdup(val);
295 if (app_label_dup == NULL)
296 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
298 *label = app_label_dup;
300 return APP_MANAGER_ERROR_NONE;
303 API int app_info_get_localed_label(const char *app_id, const char *locale, char **label)
308 if (app_id == NULL || locale == NULL || label == NULL)
309 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
311 if (pkgmgrinfo_appinfo_usr_get_localed_label(app_id, locale, getuid(), &val))
312 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
314 app_label_dup = strdup(val);
315 if (app_label_dup == NULL)
316 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
318 *label = app_label_dup;
321 return APP_MANAGER_ERROR_NONE;
324 API int app_info_get_icon(app_info_h app_info, char **path)
329 if (app_info == NULL || path == NULL)
330 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
332 pkgmgrinfo_appinfo_get_icon(app_info->pkg_app_info, &val);
334 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
336 app_icon_dup = strdup(val);
337 if (app_icon_dup == NULL)
338 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
340 *path = app_icon_dup;
342 return APP_MANAGER_ERROR_NONE;
345 API int app_info_get_package(app_info_h app_info, char **package)
348 char *app_package_dup;
350 if (app_info == NULL || package == NULL)
351 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
353 pkgmgrinfo_appinfo_get_pkgname(app_info->pkg_app_info, &val);
355 app_package_dup = strdup(val);
356 if (app_package_dup == NULL)
357 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
359 *package = app_package_dup;
361 return APP_MANAGER_ERROR_NONE;
364 API int app_info_get_type(app_info_h app_info, char **type)
369 if (app_info == NULL || type == NULL)
370 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
372 pkgmgrinfo_appinfo_get_apptype(app_info->pkg_app_info, &val);
374 app_type_dup = strdup(val);
375 if (app_type_dup == NULL)
376 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
378 *type = app_type_dup;
380 return APP_MANAGER_ERROR_NONE;
383 API int app_info_foreach_metadata(app_info_h app_info, app_info_metadata_cb callback, void *user_data)
387 if (app_info == NULL || callback == NULL)
388 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
390 foreach_metadata_context_s foreach_context = {
391 .callback = callback,
392 .user_data = user_data,
395 retval = pkgmgrinfo_appinfo_foreach_metadata(app_info->pkg_app_info, app_info_foreach_app_metadata_cb, &foreach_context);
397 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
399 return APP_MANAGER_ERROR_NONE;
402 API int app_info_is_nodisplay(app_info_h app_info, bool *nodisplay)
406 if (app_info == NULL || nodisplay == NULL)
407 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
409 if (pkgmgrinfo_appinfo_is_nodisplay(app_info->pkg_app_info, &val) < 0)
410 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
413 return APP_MANAGER_ERROR_NONE;
416 API int app_info_is_enabled(app_info_h app_info, bool *enabled)
420 if (app_info == NULL || enabled == NULL)
421 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
423 if (pkgmgrinfo_appinfo_is_enabled(app_info->pkg_app_info, &val) < 0)
424 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
427 return APP_MANAGER_ERROR_NONE;
431 API int app_info_is_equal(app_info_h lhs, app_info_h rhs, bool *equal)
433 if (lhs == NULL || rhs == NULL || equal == NULL)
434 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
436 if (!strcmp(lhs->app_id, rhs->app_id))
441 return APP_MANAGER_ERROR_NONE;
444 API int app_info_is_onboot(app_info_h app_info, bool *onboot)
448 if (app_info == NULL || onboot == NULL)
449 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
451 if (pkgmgrinfo_appinfo_is_onboot(app_info->pkg_app_info, &val) < 0)
452 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
455 return APP_MANAGER_ERROR_NONE;
458 API int app_info_is_preload(app_info_h app_info, bool *preload)
462 if (app_info == NULL || preload == NULL)
463 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
465 if (pkgmgrinfo_appinfo_is_preload(app_info->pkg_app_info, &val) < 0)
466 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
469 return APP_MANAGER_ERROR_NONE;
472 API int app_info_clone(app_info_h *clone, app_info_h app_info)
476 if (clone == NULL || app_info == NULL)
477 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
479 retval = app_info_create(app_info->app_id, clone);
481 if (retval != APP_MANAGER_ERROR_NONE)
482 return app_manager_error(retval, __FUNCTION__, NULL);
484 return APP_MANAGER_ERROR_NONE;
487 API int app_info_filter_create(app_info_filter_h *handle)
490 app_info_filter_h filter_created = NULL;
491 pkgmgrinfo_appinfo_filter_h filter_h = NULL;
494 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
496 retval = pkgmgrinfo_appinfo_filter_create(&filter_h);
498 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
500 filter_created = calloc(1, sizeof(struct app_info_filter_s));
501 if (filter_created == NULL) {
503 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
506 filter_created->pkg_app_info_filter = filter_h;
508 *handle = filter_created;
510 return APP_MANAGER_ERROR_NONE;
513 API int app_info_filter_destroy(app_info_filter_h handle)
518 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
520 retval = pkgmgrinfo_appinfo_filter_destroy(handle->pkg_app_info_filter);
522 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
525 return APP_MANAGER_ERROR_NONE;
528 API int app_info_filter_add_bool(app_info_filter_h handle, const char *property, const bool value)
531 char *converted_property = NULL;
533 if ((handle == NULL) || (property == NULL))
534 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
536 retval = app_info_convert_bool_property(property, &converted_property);
538 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
540 retval = pkgmgrinfo_appinfo_filter_add_bool(handle->pkg_app_info_filter, converted_property, value);
542 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
544 return APP_MANAGER_ERROR_NONE;
547 API int app_info_filter_add_string(app_info_filter_h handle, const char *property, const char *value)
550 char *converted_property = NULL;
552 if ((handle == NULL) || (property == NULL))
553 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
555 retval = app_info_convert_str_property(property, &converted_property);
557 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
559 retval = pkgmgrinfo_appinfo_filter_add_string(handle->pkg_app_info_filter, converted_property, value);
561 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
563 return APP_MANAGER_ERROR_NONE;
566 API int app_info_filter_count_appinfo(app_info_filter_h handle, int *count)
570 if ((handle == NULL) || (count == NULL))
571 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
573 retval = pkgmgrinfo_appinfo_filter_count(handle->pkg_app_info_filter, count);
575 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
577 return APP_MANAGER_ERROR_NONE;
580 API int app_info_filter_foreach_appinfo(app_info_filter_h handle, app_info_filter_cb callback, void * user_data)
584 foreach_context_s foreach_context = {
585 .callback = callback,
586 .user_data = user_data,
589 if ((handle == NULL) || (callback == NULL))
590 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
592 retval = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle->pkg_app_info_filter, app_info_foreach_app_filter_cb, &foreach_context, getuid());
594 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
596 return APP_MANAGER_ERROR_NONE;
599 API int app_info_metadata_filter_create(app_info_metadata_filter_h *handle)
602 app_info_metadata_filter_h filter_created = NULL;
603 pkgmgrinfo_appinfo_metadata_filter_h filter_h = NULL;
606 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
608 filter_created = calloc(1, sizeof(struct app_info_metadata_filter_s));
609 if (filter_created == NULL)
610 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
612 retval = pkgmgrinfo_appinfo_metadata_filter_create(&filter_h);
614 free(filter_created);
615 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
618 filter_created->pkg_app_info_metadata_filter = filter_h;
620 *handle = filter_created;
622 return APP_MANAGER_ERROR_NONE;
625 API int app_info_metadata_filter_destroy(app_info_metadata_filter_h handle)
630 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
632 retval = pkgmgrinfo_appinfo_metadata_filter_destroy(handle->pkg_app_info_metadata_filter);
634 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
637 return APP_MANAGER_ERROR_NONE;
640 API int app_info_metadata_filter_add(app_info_metadata_filter_h handle, const char *key, const char *value)
644 if ((handle == NULL) || (key == NULL))
645 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
647 retval = pkgmgrinfo_appinfo_metadata_filter_add(handle->pkg_app_info_metadata_filter, key, value);
649 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
651 return APP_MANAGER_ERROR_NONE;
654 API int app_info_metadata_filter_foreach(app_info_metadata_filter_h handle, app_info_filter_cb callback, void *user_data)
658 foreach_context_s foreach_context = {
659 .callback = callback,
660 .user_data = user_data,
664 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
666 if (callback == NULL)
667 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
669 retval = pkgmgrinfo_appinfo_usr_metadata_filter_foreach(handle->pkg_app_info_metadata_filter, app_info_foreach_app_filter_cb, &foreach_context, getuid());
671 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
673 return APP_MANAGER_ERROR_NONE;