From b9c83268b84078b3d8530e5ab598730e9ca2b0af Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:33:34 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- AUTHORS | 2 + CMakeLists.txt | 98 +++ LICENSE | 206 +++++ TC/build.sh | 21 + TC/com.samsung.hello-0.0.1-0.armv7l.rpm | Bin 0 -> 47484 bytes TC/execute.sh | 19 + TC/tet_code | 12 + TC/tet_scen | 7 + TC/tetbuild.cfg | 2 + TC/tetclean.cfg | 2 + TC/tetexec.cfg | 1 + TC/unit/Makefile | 57 ++ TC/unit/tc_gen.sh | 28 + TC/unit/tslist | 34 + TC/unit/utc_ApplicationFW_package_info_clone.c | 97 +++ TC/unit/utc_ApplicationFW_package_info_destroy.c | 94 ++ ...ationFW_package_info_foreach_app_from_package.c | 100 +++ ..._ApplicationFW_package_info_foreach_cert_info.c | 101 +++ TC/unit/utc_ApplicationFW_package_info_get_icon.c | 102 +++ ...licationFW_package_info_get_installed_storage.c | 102 +++ TC/unit/utc_ApplicationFW_package_info_get_label.c | 102 +++ .../utc_ApplicationFW_package_info_get_package.c | 102 +++ .../utc_ApplicationFW_package_info_get_root_path.c | 98 +++ TC/unit/utc_ApplicationFW_package_info_get_type.c | 102 +++ .../utc_ApplicationFW_package_info_get_version.c | 102 +++ .../utc_ApplicationFW_package_info_is_accessible.c | 102 +++ TC/unit/utc_ApplicationFW_package_info_is_equal.c | 116 +++ ...ApplicationFW_package_info_is_preload_package.c | 102 +++ ...plicationFW_package_info_is_removable_package.c | 102 +++ ..._ApplicationFW_package_info_is_system_package.c | 102 +++ ...ationFW_package_manager_compare_app_cert_info.c | 93 ++ ...nFW_package_manager_compare_package_cert_info.c | 93 ++ TC/unit/utc_ApplicationFW_package_manager_create.c | 90 ++ .../utc_ApplicationFW_package_manager_destroy.c | 91 ++ ...cationFW_package_manager_foreach_package_info.c | 93 ++ ...onFW_package_manager_get_package_id_by_app_id.c | 91 ++ ...pplicationFW_package_manager_get_package_info.c | 93 ++ ...icationFW_package_manager_get_permission_type.c | 91 ++ ..._package_manager_is_preload_package_by_app_id.c | 92 ++ ..._ApplicationFW_package_manager_request_create.c | 90 ++ ...ApplicationFW_package_manager_request_destroy.c | 91 ++ ...ApplicationFW_package_manager_request_install.c | 112 +++ ...tc_ApplicationFW_package_manager_request_move.c | 93 ++ ...cationFW_package_manager_request_set_event_cb.c | 112 +++ ...pplicationFW_package_manager_request_set_mode.c | 112 +++ ...pplicationFW_package_manager_request_set_type.c | 112 +++ ...plicationFW_package_manager_request_uninstall.c | 112 +++ ...tionFW_package_manager_request_unset_event_cb.c | 113 +++ ...tc_ApplicationFW_package_manager_set_event_cb.c | 105 +++ ..._ApplicationFW_package_manager_unset_event_cb.c | 106 +++ capi-appfw-package-manager.manifest | 8 + capi-appfw-package-manager.pc.in | 15 + debian/README | 0 debian/capi-appfw-package-manager-dev.install | 4 + debian/capi-appfw-package-manager-dev.postinst | 1 + debian/capi-appfw-package-manager.install | 2 + debian/capi-appfw-package-manager.postinst | 1 + debian/changelog | 8 + debian/compat | 1 + debian/control | 22 + debian/rules | 68 ++ include/package_info.h | 325 +++++++ include/package_manager.h | 478 +++++++++++ include/package_manager_private.h | 37 + packaging/capi-appfw-package-manager.spec | 65 ++ src/package_info.c | 608 +++++++++++++ src/package_manager.c | 953 +++++++++++++++++++++ tool/CMakeLists.txt | 23 + tool/main.c | 142 +++ 69 files changed, 6861 insertions(+) create mode 100755 AUTHORS create mode 100755 CMakeLists.txt create mode 100755 LICENSE create mode 100755 TC/build.sh create mode 100755 TC/com.samsung.hello-0.0.1-0.armv7l.rpm create mode 100755 TC/execute.sh create mode 100755 TC/tet_code create mode 100755 TC/tet_scen create mode 100755 TC/tetbuild.cfg create mode 100755 TC/tetclean.cfg create mode 100755 TC/tetexec.cfg create mode 100644 TC/unit/Makefile create mode 100644 TC/unit/tc_gen.sh create mode 100644 TC/unit/tslist create mode 100644 TC/unit/utc_ApplicationFW_package_info_clone.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_destroy.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_foreach_app_from_package.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_foreach_cert_info.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_icon.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_installed_storage.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_label.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_package.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_root_path.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_type.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_get_version.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_is_accessible.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_is_equal.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_is_preload_package.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_is_removable_package.c create mode 100644 TC/unit/utc_ApplicationFW_package_info_is_system_package.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_compare_app_cert_info.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_compare_package_cert_info.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_create.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_destroy.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_foreach_package_info.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_get_package_id_by_app_id.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_get_package_info.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_get_permission_type.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_is_preload_package_by_app_id.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_create.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_destroy.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_install.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_move.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_set_event_cb.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_set_mode.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_set_type.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_uninstall.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_request_unset_event_cb.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_set_event_cb.c create mode 100644 TC/unit/utc_ApplicationFW_package_manager_unset_event_cb.c create mode 100644 capi-appfw-package-manager.manifest create mode 100755 capi-appfw-package-manager.pc.in create mode 100755 debian/README create mode 100755 debian/capi-appfw-package-manager-dev.install create mode 100755 debian/capi-appfw-package-manager-dev.postinst create mode 100755 debian/capi-appfw-package-manager.install create mode 100755 debian/capi-appfw-package-manager.postinst create mode 100755 debian/changelog create mode 100755 debian/compat create mode 100755 debian/control create mode 100755 debian/rules create mode 100755 include/package_info.h create mode 100755 include/package_manager.h create mode 100755 include/package_manager_private.h create mode 100755 packaging/capi-appfw-package-manager.spec create mode 100755 src/package_info.c create mode 100755 src/package_manager.c create mode 100644 tool/CMakeLists.txt create mode 100755 tool/main.c diff --git a/AUTHORS b/AUTHORS new file mode 100755 index 0000000..a228ba0 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +junghyuk park + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..d5349e9 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,98 @@ + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +SET(fw_name "capi-appfw-package-manager") + +PROJECT(${fw_name}) + +SET(CMAKE_INSTALL_PREFIX /usr) +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) + +SET(INC_DIR include) +INCLUDE_DIRECTORIES(${INC_DIR}) + +SET(requires "capi-base-common dlog vconf aul ail pkgmgr pkgmgr-info") +SET(pc_requires "capi-base-common") + +INCLUDE(FindPkgConfig) +pkg_check_modules(${fw_name} REQUIRED ${requires}) +FOREACH(flag ${${fw_name}_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") + +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DSLP_DEBUG") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIB_INSTALL_DIR}") + +aux_source_directory(src SOURCES) +ADD_LIBRARY(${fw_name} SHARED ${SOURCES}) + +TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS}) + +SET_TARGET_PROPERTIES(${fw_name} + PROPERTIES + VERSION ${FULLVER} + SOVERSION ${MAJORVER} + CLEAN_DIRECT_OUTPUT 1 +) + +INSTALL(TARGETS ${fw_name} DESTINATION ${LIB_INSTALL_DIR}) +INSTALL( + DIRECTORY ${INC_DIR}/ DESTINATION include/appfw + FILES_MATCHING + PATTERN "*_private.h" EXCLUDE + PATTERN "${INC_DIR}/*.h" + ) + +SET(PC_NAME ${fw_name}) +SET(PC_REQUIRED ${pc_requires}) +SET(PC_LDFLAGS -l${fw_name}) +SET(PC_CFLAGS -I\${includedir}/appfw) + +CONFIGURE_FILE( + capi-appfw-package-manager.pc.in + ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc + @ONLY +) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) + + +IF(UNIX) + +ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution) +ADD_CUSTOM_COMMAND( + DEPENDS clean + COMMENT "distribution clean" + COMMAND find + ARGS . + -not -name config.cmake -and \( + -name tester.c -or + -name Testing -or + -name CMakeFiles -or + -name cmake.depends -or + -name cmake.check_depends -or + -name CMakeCache.txt -or + -name cmake.check_cache -or + -name *.cmake -or + -name Makefile -or + -name core -or + -name core.* -or + -name gmon.out -or + -name install_manifest.txt -or + -name *.pc -or + -name *~ \) + | grep -v TC | xargs rm -rf + TARGET distclean + VERBATIM +) + +ENDIF(UNIX) + +add_subdirectory(tool) diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..bbe9d02 --- /dev/null +++ b/LICENSE @@ -0,0 +1,206 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + diff --git a/TC/build.sh b/TC/build.sh new file mode 100755 index 0000000..bcdb10e --- /dev/null +++ b/TC/build.sh @@ -0,0 +1,21 @@ +#!/bin/sh +export TET_INSTALL_HOST_PATH=/dts_fw/TETware +export TET_INSTALL_TARGET_PATH=/dts_fw/TETware +export TET_INSTALL_PATH=$TET_INSTALL_HOST_PATH # local tetware path +export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target +export PATH=$TET_TARGET_PATH/bin:$PATH +export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH +export TET_ROOT=$TET_TARGET_PATH + +export TET_SUITE_ROOT=`pwd` +FILE_NAME_EXTENSION=`date +%s` + +RESULT_DIR=results +HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html +JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal + +mkdir -p $RESULT_DIR + +tcc -c -p ./ +tcc -b -j $JOURNAL_RESULT -p ./ +grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/com.samsung.hello-0.0.1-0.armv7l.rpm b/TC/com.samsung.hello-0.0.1-0.armv7l.rpm new file mode 100755 index 0000000000000000000000000000000000000000..7465258faaf8308699dded0b60249b8eafbf3e87 GIT binary patch literal 47484 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
    `VH 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 M0V%F#IVimV01?IYNB{r; literal 0 HcmV?d00001 diff --git a/TC/execute.sh b/TC/execute.sh new file mode 100755 index 0000000..e2c742e --- /dev/null +++ b/TC/execute.sh @@ -0,0 +1,19 @@ +#!/bin/sh +export TET_INSTALL_PATH=/mnt/nfs/TETware +export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target +export PATH=$TET_TARGET_PATH/bin:$PATH +export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH + +export TET_ROOT=$TET_TARGET_PATH + +export TET_SUITE_ROOT=`pwd` +FILE_NAME_EXTENSION=`date +%s` + +RESULT_DIR=results +HTML_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.html +JOURNAL_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.journal + +mkdir -p $RESULT_DIR + +tcc -e -j $JOURNAL_RESULT -p ./ +grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/tet_code b/TC/tet_code new file mode 100755 index 0000000..a2cf6c1 --- /dev/null +++ b/TC/tet_code @@ -0,0 +1,12 @@ +# TET reserved codes +0 "PASS" +1 "FAIL" +2 "UNRESOLVED" +3 "NOTINUSE" +4 "UNSUPPORTED" +5 "UNTESTED" +6 "UNINITIATED" +7 "NORESULT" + +# Test suite additional codes +33 "INSPECT" diff --git a/TC/tet_scen b/TC/tet_scen new file mode 100755 index 0000000..43cbc9b --- /dev/null +++ b/TC/tet_scen @@ -0,0 +1,7 @@ +all + ^TEST +##### Scenarios for TEST ##### + +# Test scenario +TEST + :include:/unit/tslist diff --git a/TC/tetbuild.cfg b/TC/tetbuild.cfg new file mode 100755 index 0000000..a584acd --- /dev/null +++ b/TC/tetbuild.cfg @@ -0,0 +1,2 @@ +TET_OUTPUT_CAPTURE=False +TET_BUILD_TOOL=make diff --git a/TC/tetclean.cfg b/TC/tetclean.cfg new file mode 100755 index 0000000..c66eda4 --- /dev/null +++ b/TC/tetclean.cfg @@ -0,0 +1,2 @@ +TET_OUTPUT_CAPTURE=False +TET_CLEAN_TOOL=make clean diff --git a/TC/tetexec.cfg b/TC/tetexec.cfg new file mode 100755 index 0000000..0d9d39a --- /dev/null +++ b/TC/tetexec.cfg @@ -0,0 +1 @@ +TET_OUTPUT_CAPTURE=False diff --git a/TC/unit/Makefile b/TC/unit/Makefile new file mode 100644 index 0000000..6f93779 --- /dev/null +++ b/TC/unit/Makefile @@ -0,0 +1,57 @@ +CC ?= gcc + +TARGETS = utc_ApplicationFW_package_manager_compare_app_cert_info \ + utc_ApplicationFW_package_manager_compare_package_cert_info \ + utc_ApplicationFW_package_manager_create \ + utc_ApplicationFW_package_manager_destroy \ + utc_ApplicationFW_package_manager_foreach_package_info \ + utc_ApplicationFW_package_manager_get_package_id_by_app_id \ + utc_ApplicationFW_package_manager_get_permission_type \ + utc_ApplicationFW_package_manager_is_preload_package_by_app_id \ + utc_ApplicationFW_package_manager_request_create \ + utc_ApplicationFW_package_manager_request_destroy \ + utc_ApplicationFW_package_manager_request_install \ + utc_ApplicationFW_package_manager_request_set_event_cb \ + utc_ApplicationFW_package_manager_request_set_mode \ + utc_ApplicationFW_package_manager_request_set_type \ + utc_ApplicationFW_package_manager_request_move \ + utc_ApplicationFW_package_manager_request_uninstall \ + utc_ApplicationFW_package_manager_request_unset_event_cb \ + utc_ApplicationFW_package_manager_set_event_cb \ + utc_ApplicationFW_package_manager_unset_event_cb \ + utc_ApplicationFW_package_info_destroy \ + utc_ApplicationFW_package_info_clone \ + utc_ApplicationFW_package_info_foreach_app_from_package \ + utc_ApplicationFW_package_info_foreach_cert_info \ + utc_ApplicationFW_package_info_get_icon \ + utc_ApplicationFW_package_info_get_installed_storage\ + utc_ApplicationFW_package_info_get_label\ + utc_ApplicationFW_package_info_get_package\ + utc_ApplicationFW_package_info_get_type\ + utc_ApplicationFW_package_info_get_version\ + utc_ApplicationFW_package_info_get_root_path\ + utc_ApplicationFW_package_info_is_accessible\ + utc_ApplicationFW_package_info_is_equal\ + utc_ApplicationFW_package_info_is_preload_package\ + utc_ApplicationFW_package_info_is_removable_package\ + utc_ApplicationFW_package_info_is_system_package + +PKGS = glib-2.0 dlog capi-appfw-package-manager + +LDFLAGS = `pkg-config --libs $(PKGS)` +LDFLAGS += $(TET_ROOT)/lib/tet3/tcm_s.o +LDFLAGS += -L$(TET_ROOT)/lib/tet3 -ltcm_s +LDFLAGS += -L$(TET_ROOT)/lib/tet3 -lapi_s +LDFLAGS += -L/usr/lib -lpthread + +CFLAGS = -I. `pkg-config --cflags $(PKGS)` +CFLAGS += -I$(TET_ROOT)/inc/tet3 +CFLAGS += -Wall + +all: $(TARGETS) + +$(TARGETS): %: %.c + $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) + +clean: + rm -f $(TARGETS) diff --git a/TC/unit/tc_gen.sh b/TC/unit/tc_gen.sh new file mode 100644 index 0000000..54f482d --- /dev/null +++ b/TC/unit/tc_gen.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +TMPSTR=$0 +SCRIPT=${TMPSTR##*/} + +if [ $# -lt 2 ]; then + echo "Usage) $SCRIPT module_name api_name" + exit 1 +fi + +MODULE=$1 +API=$2 +TEMPLATE=utc_MODULE_API_func.c.in +TESTCASE=utc_${MODULE}_${API}_func + +sed -e ' + s^@API@^'"$API"'^g + s^@MODULE@^'"$MODULE"'^g + ' $TEMPLATE > $TESTCASE.c + +if [ ! -e "$TESTCASE.c" ]; then + echo "Failed" + exit 1 +fi +echo "Testcase file is $TESTCASE.c" +echo "Done" +echo "please put \"$TESTCASE\" as Target in Makefile" +echo "please put \"/unit/$TESTCASE\" in tslist" diff --git a/TC/unit/tslist b/TC/unit/tslist new file mode 100644 index 0000000..492454c --- /dev/null +++ b/TC/unit/tslist @@ -0,0 +1,34 @@ +/unit/utc_ApplicationFW_package_manager_compare_app_cert_info +/unit/utc_ApplicationFW_package_manager_compare_package_cert_info +/unit/utc_ApplicationFW_package_manager_create +/unit/utc_ApplicationFW_package_manager_destroy +/unit/utc_ApplicationFW_package_manager_foreach_package_info +/unit/utc_ApplicationFW_package_manager_get_package_id_by_app_id +/unit/utc_ApplicationFW_package_manager_get_permission_type +/unit/utc_ApplicationFW_package_manager_is_preload_package_by_app_id +/unit/utc_ApplicationFW_package_manager_request_create +/unit/utc_ApplicationFW_package_manager_request_destroy +/unit/utc_ApplicationFW_package_manager_request_install +/unit/utc_ApplicationFW_package_manager_request_set_event_cb +/unit/utc_ApplicationFW_package_manager_request_set_mode +/unit/utc_ApplicationFW_package_manager_request_set_type +/unit/utc_ApplicationFW_package_manager_request_move +/unit/utc_ApplicationFW_package_manager_request_uninstall +/unit/utc_ApplicationFW_package_manager_request_unset_event_cb +/unit/utc_ApplicationFW_package_manager_set_event_cb +/unit/utc_ApplicationFW_package_manager_unset_event_cb +/unit/utc_ApplicationFW_package_info_destroy +/unit/utc_ApplicationFW_package_info_clone +/unit/utc_ApplicationFW_package_info_foreach_cert_info +/unit/utc_ApplicationFW_package_info_get_icon +/unit/utc_ApplicationFW_package_info_get_installed_storage +/unit/utc_ApplicationFW_package_info_get_label +/unit/utc_ApplicationFW_package_info_get_package +/unit/utc_ApplicationFW_package_info_get_type +/unit/utc_ApplicationFW_package_info_get_version +/unit/utc_ApplicationFW_package_info_get_root_path +/unit/utc_ApplicationFW_package_info_is_accessible +/unit/utc_ApplicationFW_package_info_is_equal +/unit/utc_ApplicationFW_package_info_is_preload_package +/unit/utc_ApplicationFW_package_info_is_removable_package +/unit/utc_ApplicationFW_package_info_is_system_package \ No newline at end of file diff --git a/TC/unit/utc_ApplicationFW_package_info_clone.c b/TC/unit/utc_ApplicationFW_package_info_clone.c new file mode 100644 index 0000000..ec99512 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_clone.c @@ -0,0 +1,97 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_clone_func_01(void); +static void utc_ApplicationFW_package_info_clone_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_clone_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_clone_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_info_clone() + */ +static void utc_ApplicationFW_package_info_clone_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + package_info_h clone_info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_clone(&package_info, clone_info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_clone() + */ +static void utc_ApplicationFW_package_info_clone_func_02(void) +{ + int ret = 0; + int id; + package_info_h clone_info; + + ret = package_info_clone(-1, clone_info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_destroy.c b/TC/unit/utc_ApplicationFW_package_info_destroy.c new file mode 100644 index 0000000..e3e1ef9 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_destroy.c @@ -0,0 +1,94 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_destroy_func_01(void); +static void utc_ApplicationFW_package_info_destroy_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_destroy_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_destroy_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_info_destroy() + */ +static void utc_ApplicationFW_package_info_destroy_func_01(void) +{ + int ret = 0; + package_info_h package_info; + char *pkgid = "com.samsung.dispcpuinfo"; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_destroy(package_info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_destroy() + */ +static void utc_ApplicationFW_package_info_destroy_func_02(void) +{ + int ret = 0; + package_info_h package_info; + char *pkgid = NULL; + + ret = package_info_destroy(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_foreach_app_from_package.c b/TC/unit/utc_ApplicationFW_package_info_foreach_app_from_package.c new file mode 100644 index 0000000..6ce93a8 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_foreach_app_from_package.c @@ -0,0 +1,100 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_foreach_app_from_package_func_01(void); +static void utc_ApplicationFW_package_info_foreach_app_from_package_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_foreach_app_from_package_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_foreach_app_from_package_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} +/** + * @brief Positive test case of package_info_foreach_app_from_package() + */ +static void utc_ApplicationFW_package_info_foreach_app_from_package_func_01(void) +{ + int ret = 0; + + char *pkgid = "com.samsung.email"; + package_info_h package_info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_foreach_app_from_package(package_info, PACKAGE_INFO_UIAPP, info_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_foreach_app_from_package() + */ +static void utc_ApplicationFW_package_info_foreach_app_from_package_func_02(void) +{ + int ret = 0; + package_info_h package_info; + char *pkgid = NULL; + + ret = package_info_foreach_app_from_package(package_info, PACKAGE_INFO_UIAPP, info_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_foreach_cert_info.c b/TC/unit/utc_ApplicationFW_package_info_foreach_cert_info.c new file mode 100644 index 0000000..5a8790a --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_foreach_cert_info.c @@ -0,0 +1,101 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_foreach_cert_info_func_01(void); +static void utc_ApplicationFW_package_info_foreach_cert_info_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_foreach_cert_info_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_foreach_cert_info_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_foreach_cert_info() + */ +static void utc_ApplicationFW_package_info_foreach_cert_info_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + package_info_h clone_info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_foreach_cert_info(package_info, info_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_foreach_cert_info() + */ +static void utc_ApplicationFW_package_info_foreach_cert_info_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + + ret = package_info_foreach_cert_info(package_info, info_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_icon.c b/TC/unit/utc_ApplicationFW_package_info_get_icon.c new file mode 100644 index 0000000..5dae213 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_icon.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_icon_func_01(void); +static void utc_ApplicationFW_package_info_get_icon_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_icon_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_icon_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_get_icon() + */ +static void utc_ApplicationFW_package_info_get_icon_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + char *info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_icon(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_icon() + */ +static void utc_ApplicationFW_package_info_get_icon_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + char *info; + + ret = package_info_get_icon(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_installed_storage.c b/TC/unit/utc_ApplicationFW_package_info_get_installed_storage.c new file mode 100644 index 0000000..ae4d6ed --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_installed_storage.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_installed_storage_func_01(void); +static void utc_ApplicationFW_package_info_get_installed_storage_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_installed_storage_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_installed_storage_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_get_installed_storage() + */ +static void utc_ApplicationFW_package_info_get_installed_storage_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + package_info_installed_storage_type_e info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_installed_storage(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_installed_storage() + */ +static void utc_ApplicationFW_package_info_get_installed_storage_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + package_info_installed_storage_type_e info; + + ret = package_info_get_installed_storage(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_label.c b/TC/unit/utc_ApplicationFW_package_info_get_label.c new file mode 100644 index 0000000..8c3ae7f --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_label.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_label_func_01(void); +static void utc_ApplicationFW_package_info_get_label_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_label_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_label_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_get_label() + */ +static void utc_ApplicationFW_package_info_get_label_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + char *info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_label(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_label() + */ +static void utc_ApplicationFW_package_info_get_label_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + char *info; + + ret = package_info_get_label(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_package.c b/TC/unit/utc_ApplicationFW_package_info_get_package.c new file mode 100644 index 0000000..f21e9e6 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_package.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_package_func_01(void); +static void utc_ApplicationFW_package_info_get_package_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_package_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_package_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_get_package() + */ +static void utc_ApplicationFW_package_info_get_package_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + char *info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_package() + */ +static void utc_ApplicationFW_package_info_get_package_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + char *info; + + ret = package_info_get_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_root_path.c b/TC/unit/utc_ApplicationFW_package_info_get_root_path.c new file mode 100644 index 0000000..8c43748 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_root_path.c @@ -0,0 +1,98 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Junsuk Oh + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_root_path_func_01(void); +static void utc_ApplicationFW_package_info_get_root_path_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_root_path_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_root_path_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + + +/** + * @brief Positive test case of package_info_get_root_path() + */ +static void utc_ApplicationFW_package_info_get_root_path_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + char *info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_root_path(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_root_path() + */ +static void utc_ApplicationFW_package_info_get_root_path_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + char *info; + + ret = package_info_get_root_path(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_type.c b/TC/unit/utc_ApplicationFW_package_info_get_type.c new file mode 100644 index 0000000..7b8bb8d --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_type.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_type_func_01(void); +static void utc_ApplicationFW_package_info_get_type_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_type_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_type_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_get_type() + */ +static void utc_ApplicationFW_package_info_get_type_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + char *info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_type(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_type() + */ +static void utc_ApplicationFW_package_info_get_type_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + char *info; + + ret = package_info_get_type(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_get_version.c b/TC/unit/utc_ApplicationFW_package_info_get_version.c new file mode 100644 index 0000000..261cbe6 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_get_version.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_get_version_func_01(void); +static void utc_ApplicationFW_package_info_get_version_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_get_version_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_get_version_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_get_version() + */ +static void utc_ApplicationFW_package_info_get_version_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + char *info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_get_version(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_get_version() + */ +static void utc_ApplicationFW_package_info_get_version_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + char *info; + + ret = package_info_get_version(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_is_accessible.c b/TC/unit/utc_ApplicationFW_package_info_is_accessible.c new file mode 100644 index 0000000..bd35a99 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_is_accessible.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_is_accessible_func_01(void); +static void utc_ApplicationFW_package_info_is_accessible_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_is_accessible_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_is_accessible_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_is_accessible() + */ +static void utc_ApplicationFW_package_info_is_accessible_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + bool info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_is_accessible(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_is_accessible() + */ +static void utc_ApplicationFW_package_info_is_accessible_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + bool info; + + ret = package_info_is_accessible(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_is_equal.c b/TC/unit/utc_ApplicationFW_package_info_is_equal.c new file mode 100644 index 0000000..ebbf049 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_is_equal.c @@ -0,0 +1,116 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_is_equal_func_01(void); +static void utc_ApplicationFW_package_info_is_equal_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_is_equal_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_is_equal_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_is_equal() + */ +static void utc_ApplicationFW_package_info_is_equal_func_01(void) +{ + int ret = 0; + int id; + char *lpkgid = "com.samsung.email"; + char *rpkgid = "com.samsung.email"; + + package_info_h lpackage_info; + package_info_h rpackage_info; + + bool info; + + package_manager_get_package_info(lpkgid, &lpackage_info); + package_manager_get_package_info(rpkgid, &rpackage_info); + + ret = package_info_is_equal(lpackage_info, rpackage_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(lpackage_info); + package_info_destroy(rpackage_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_is_equal() + */ +static void utc_ApplicationFW_package_info_is_equal_func_02(void) +{ + int ret = 0; + int id; + char *lpkgid = NULL; + char *rpkgid = NULL; + + package_info_h lpackage_info; + package_info_h rpackage_info; + + bool info; + + package_manager_get_package_info(lpkgid, &lpackage_info); + package_manager_get_package_info(rpkgid, &rpackage_info); + + ret = package_info_is_equal(lpackage_info, rpackage_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_is_preload_package.c b/TC/unit/utc_ApplicationFW_package_info_is_preload_package.c new file mode 100644 index 0000000..e6129b3 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_is_preload_package.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_is_preload_package_func_01(void); +static void utc_ApplicationFW_package_info_is_preload_package_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_is_preload_package_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_is_preload_package_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_is_preload_package() + */ +static void utc_ApplicationFW_package_info_is_preload_package_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + bool info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_is_preload_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_is_preload_package() + */ +static void utc_ApplicationFW_package_info_is_preload_package_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + bool info; + + ret = package_info_is_preload_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_is_removable_package.c b/TC/unit/utc_ApplicationFW_package_info_is_removable_package.c new file mode 100644 index 0000000..4eed0b4 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_is_removable_package.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_is_removable_package_func_01(void); +static void utc_ApplicationFW_package_info_is_removable_package_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_is_removable_package_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_is_removable_package_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_is_removable_package() + */ +static void utc_ApplicationFW_package_info_is_removable_package_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + bool info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_is_removable_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_is_removable_package() + */ +static void utc_ApplicationFW_package_info_is_removable_package_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + bool info; + + ret = package_info_is_removable_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_info_is_system_package.c b/TC/unit/utc_ApplicationFW_package_info_is_system_package.c new file mode 100644 index 0000000..0fa4682 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_info_is_system_package.c @@ -0,0 +1,102 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_info_is_system_package_func_01(void); +static void utc_ApplicationFW_package_info_is_system_package_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_info_is_system_package_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_info_is_system_package_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +static void info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_info_is_system_package() + */ +static void utc_ApplicationFW_package_info_is_system_package_func_01(void) +{ + int ret = 0; + int id; + char *pkgid = "com.samsung.email"; + package_info_h package_info; + bool info; + + package_manager_get_package_info(pkgid, &package_info); + + ret = package_info_is_system_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_info_is_system_package() + */ +static void utc_ApplicationFW_package_info_is_system_package_func_02(void) +{ + int ret = 0; + int id; + package_info_h package_info; + bool info; + + ret = package_info_is_system_package(package_info, &info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_compare_app_cert_info.c b/TC/unit/utc_ApplicationFW_package_manager_compare_app_cert_info.c new file mode 100644 index 0000000..dfe7639 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_compare_app_cert_info.c @@ -0,0 +1,93 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_compare_app_cert_info_func_01(void); +static void utc_ApplicationFW_package_manager_compare_app_cert_info_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_compare_app_cert_info_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_compare_app_cert_info_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_compare_app_cert_info() + */ +static void utc_ApplicationFW_package_manager_compare_app_cert_info_func_01(void) +{ + int ret = 0; + char *lhs_app_id = "com.samsung.calendar"; + char *rhs_app_id = "com.samsung.lockscreen"; + package_manager_compare_result_type_e compare_result = -1; + + ret = package_manager_compare_app_cert_info(lhs_app_id, rhs_app_id, &compare_result); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of package_manager_compare_app_cert_info() + */ +static void utc_ApplicationFW_package_manager_compare_app_cert_info_func_02(void) +{ + int ret = 0; + char *lhs_app_id = "com.samsung.calendar"; + char *rhs_app_id = NULL; + package_manager_compare_result_type_e compare_result = -1; + + ret = package_manager_compare_app_cert_info(lhs_app_id, rhs_app_id, &compare_result); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_compare_package_cert_info.c b/TC/unit/utc_ApplicationFW_package_manager_compare_package_cert_info.c new file mode 100644 index 0000000..8009846 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_compare_package_cert_info.c @@ -0,0 +1,93 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_compare_package_cert_info_func_01(void); +static void utc_ApplicationFW_package_manager_compare_package_cert_info_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_compare_package_cert_info_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_compare_package_cert_info_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_compare_package_cert_info() + */ +static void utc_ApplicationFW_package_manager_compare_package_cert_info_func_01(void) +{ + int ret = 0; + char *lhs_app_id = "com.samsung.calendar"; + char *rhs_app_id = "com.samsung.lockscreen"; + package_manager_compare_result_type_e compare_result = -1; + + ret = package_manager_compare_package_cert_info(lhs_app_id, rhs_app_id, &compare_result); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of package_manager_compare_package_cert_info() + */ +static void utc_ApplicationFW_package_manager_compare_package_cert_info_func_02(void) +{ + int ret = 0; + char *lhs_app_id = "com.samsung.calendar"; + char *rhs_app_id = NULL; + package_manager_compare_result_type_e compare_result = -1; + + ret = package_manager_compare_package_cert_info(lhs_app_id, rhs_app_id, &compare_result); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_create.c b/TC/unit/utc_ApplicationFW_package_manager_create.c new file mode 100644 index 0000000..04318e5 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_create.c @@ -0,0 +1,90 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_create_func_01(void); +static void utc_ApplicationFW_package_manager_create_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_create_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_create_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_create() + */ +static void utc_ApplicationFW_package_manager_create_func_01(void) +{ + int ret = 0; + package_manager_h manager; + + ret = package_manager_create(&manager); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + package_manager_destroy(manager); + + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of package_manager_create() + */ +static void utc_ApplicationFW_package_manager_create_func_02(void) +{ + int ret = 0; + + ret = package_manager_create(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_destroy.c b/TC/unit/utc_ApplicationFW_package_manager_destroy.c new file mode 100644 index 0000000..3bbce25 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_destroy.c @@ -0,0 +1,91 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_destroy_func_01(void); +static void utc_ApplicationFW_package_manager_destroy_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_destroy_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_destroy_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_destroy() + */ +static void utc_ApplicationFW_package_manager_destroy_func_01(void) +{ + int ret = 0; + package_manager_h manager; + + package_manager_create(&manager); + + ret = package_manager_destroy(manager); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_destroy() + */ +static void utc_ApplicationFW_package_manager_destroy_func_02(void) +{ + int ret = 0; + + ret = package_manager_destroy(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_foreach_package_info.c b/TC/unit/utc_ApplicationFW_package_manager_foreach_package_info.c new file mode 100644 index 0000000..fb5baa4 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_foreach_package_info.c @@ -0,0 +1,93 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_foreach_package_info_func_01(void); +static void utc_ApplicationFW_package_manager_foreach_package_info_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_foreach_package_info_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_foreach_package_info_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +static int __info_cb(package_info_h package_info, void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_foreach_package_info() + */ +static void utc_ApplicationFW_package_manager_foreach_package_info_func_01(void) +{ + int ret = 0; + + ret = package_manager_foreach_package_info(__info_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_foreach_package_info() + */ +static void utc_ApplicationFW_package_manager_foreach_package_info_func_02(void) +{ + int ret = 0; + + ret = package_manager_foreach_package_info(NULL, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_get_package_id_by_app_id.c b/TC/unit/utc_ApplicationFW_package_manager_get_package_id_by_app_id.c new file mode 100644 index 0000000..a2fe003 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_get_package_id_by_app_id.c @@ -0,0 +1,91 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_get_package_id_by_app_id_func_01(void); +static void utc_ApplicationFW_package_manager_get_package_id_by_app_id_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_get_package_id_by_app_id_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_get_package_id_by_app_id_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_get_package_id_by_app_id() + */ +static void utc_ApplicationFW_package_manager_get_package_id_by_app_id_func_01(void) +{ + int ret = 0; + char *appid = "com.samsung.dispcpuinfo"; + char *pkgid = NULL; + ret = package_manager_get_package_id_by_app_id(appid, &pkgid); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_get_package_id_by_app_id() + */ +static void utc_ApplicationFW_package_manager_get_package_id_by_app_id_func_02(void) +{ + int ret = 0; + char *appid = NULL; + char *pkgid = NULL; + + ret = package_manager_get_package_id_by_app_id(appid, &pkgid); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_get_package_info.c b/TC/unit/utc_ApplicationFW_package_manager_get_package_info.c new file mode 100644 index 0000000..46e3542 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_get_package_info.c @@ -0,0 +1,93 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_get_package_info_func_01(void); +static void utc_ApplicationFW_package_manager_get_package_info_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_get_package_info_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_get_package_info_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_get_package_info() + */ +static void utc_ApplicationFW_package_manager_get_package_info_func_01(void) +{ + int ret = 0; + package_info_h package_info; + char *pkgid = "com.samsung.dispcpuinfo"; + + ret = package_manager_get_package_info(pkgid, &package_info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_info_destroy(package_info); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_get_package_info() + */ +static void utc_ApplicationFW_package_manager_get_package_info_func_02(void) +{ + int ret = 0; + package_info_h package_info; + char *pkgid = NULL; + + ret = package_manager_get_package_info(pkgid, &package_info); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_get_permission_type.c b/TC/unit/utc_ApplicationFW_package_manager_get_permission_type.c new file mode 100644 index 0000000..18a0f30 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_get_permission_type.c @@ -0,0 +1,91 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_get_permission_type_func_01(void); +static void utc_ApplicationFW_package_manager_get_permission_type_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_get_permission_type_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_get_permission_type_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_get_permission_type() + */ +static void utc_ApplicationFW_package_manager_get_permission_type_func_01(void) +{ + int ret = 0; + package_manager_permission_type_e permission; + char *pkgid = "com.samsung.dispcpuinfo"; + + ret = package_manager_get_permission_type(pkgid, &permission); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_get_permission_type() + */ +static void utc_ApplicationFW_package_manager_get_permission_type_func_02(void) +{ + int ret = 0; + package_manager_permission_type_e permission; + char *pkgid = NULL; + + ret = package_manager_get_permission_type(pkgid, &permission); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_is_preload_package_by_app_id.c b/TC/unit/utc_ApplicationFW_package_manager_is_preload_package_by_app_id.c new file mode 100644 index 0000000..1f40e78 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_is_preload_package_by_app_id.c @@ -0,0 +1,92 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_is_preload_package_by_app_id_func_01(void); +static void utc_ApplicationFW_package_manager_is_preload_package_by_app_id_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_is_preload_package_by_app_id_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_is_preload_package_by_app_id_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_is_preload_package_by_app_id() + */ +static void utc_ApplicationFW_package_manager_is_preload_package_by_app_id_func_01(void) +{ + int ret = 0; + bool preload; + char *appid = "com.samsung.dispcpuinfo"; + + ret = package_manager_is_preload_package_by_app_id(appid, &preload); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_is_preload_package_by_app_id() + */ +static void utc_ApplicationFW_package_manager_is_preload_package_by_app_id_func_02(void) +{ + int ret = 0; + bool preload; + char *appid = NULL; + + ret = package_manager_is_preload_package_by_app_id(appid, &preload); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_create.c b/TC/unit/utc_ApplicationFW_package_manager_request_create.c new file mode 100644 index 0000000..52e7233 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_create.c @@ -0,0 +1,90 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_create_func_01(void); +static void utc_ApplicationFW_package_manager_request_create_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_create_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_create_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_request_create() + */ +static void utc_ApplicationFW_package_manager_request_create_func_01(void) +{ + int ret = 0; + package_manager_request_h request; + + ret = package_manager_request_create(&request); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + package_manager_request_destroy(request); + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_create() + */ +static void utc_ApplicationFW_package_manager_request_create_func_02(void) +{ + int ret = 0; + + ret = package_manager_request_create(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_destroy.c b/TC/unit/utc_ApplicationFW_package_manager_request_destroy.c new file mode 100644 index 0000000..d610115 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_destroy.c @@ -0,0 +1,91 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_destroy_func_01(void); +static void utc_ApplicationFW_package_manager_request_destroy_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_destroy_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_destroy_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_request_destroy() + */ +static void utc_ApplicationFW_package_manager_request_destroy_func_01(void) +{ + int ret = 0; + package_manager_request_h request; + + package_manager_request_create(&request); + + ret = package_manager_request_destroy(request); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_destroy() + */ +static void utc_ApplicationFW_package_manager_request_destroy_func_02(void) +{ + int ret = 0; + + ret = package_manager_request_destroy(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_install.c b/TC/unit/utc_ApplicationFW_package_manager_request_install.c new file mode 100644 index 0000000..2c8bc18 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_install.c @@ -0,0 +1,112 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_install_func_01(void); +static void utc_ApplicationFW_package_manager_request_install_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_install_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_install_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_request_install() + */ +static void utc_ApplicationFW_package_manager_request_install_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + package_manager_request_set_type(request,"rpm"); + + package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + + package_manager_request_set_event_cb(request, _event_cb, NULL); + + ret = package_manager_request_install(request, "/mnt/nfs/slp-pkgmgr/TC/com.samsung.hello-0.0.1-0.armv7l.rpm", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_install() + */ +static void utc_ApplicationFW_package_manager_request_install_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_install(NULL, "/mnt/nfs/slp-pkgmgr/TC/com.samsung.hello-0.0.1-0.armv7l.rpm", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_move.c b/TC/unit/utc_ApplicationFW_package_manager_request_move.c new file mode 100644 index 0000000..2d5594d --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_move.c @@ -0,0 +1,93 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_move_func_01(void); +static void utc_ApplicationFW_package_manager_request_move_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_move_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_move_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of package_manager_request_move() + */ +static void utc_ApplicationFW_package_manager_request_move_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + ret = package_manager_request_move(request, "com.samsung.hello",0); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_move() + */ +static void utc_ApplicationFW_package_manager_request_move_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_move(-1, "com.samsung.hello",0); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_set_event_cb.c b/TC/unit/utc_ApplicationFW_package_manager_request_set_event_cb.c new file mode 100644 index 0000000..1dccff1 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_set_event_cb.c @@ -0,0 +1,112 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_set_event_cb_func_01(void); +static void utc_ApplicationFW_package_manager_request_set_event_cb_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_set_event_cb_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_set_event_cb_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_request_set_event_cb() + */ +static void utc_ApplicationFW_package_manager_request_set_event_cb_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + package_manager_request_set_type(request,"rpm"); + + package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + + ret = package_manager_request_set_event_cb(request, _event_cb, NULL); + + package_manager_request_install(request, "/mnt/nfs/slp-pkgmgr/TC/com.samsung.hello-0.0.1-0.armv7l.rpm", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_set_event_cb() + */ +static void utc_ApplicationFW_package_manager_request_set_event_cb_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_set_event_cb(-1, _event_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_set_mode.c b/TC/unit/utc_ApplicationFW_package_manager_request_set_mode.c new file mode 100644 index 0000000..ed368eb --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_set_mode.c @@ -0,0 +1,112 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_set_mode_func_01(void); +static void utc_ApplicationFW_package_manager_request_set_mode_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_set_mode_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_set_mode_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_request_set_mode() + */ +static void utc_ApplicationFW_package_manager_request_set_mode_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + package_manager_request_set_type(request,"rpm"); + + ret = package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + + package_manager_request_set_event_cb(request, _event_cb, NULL); + + package_manager_request_install(request, "/mnt/nfs/slp-pkgmgr/TC/com.samsung.hello-0.0.1-0.armv7l.rpm", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_set_mode() + */ +static void utc_ApplicationFW_package_manager_request_set_mode_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_set_mode(-1, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_set_type.c b/TC/unit/utc_ApplicationFW_package_manager_request_set_type.c new file mode 100644 index 0000000..4f1f6d4 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_set_type.c @@ -0,0 +1,112 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_set_type_func_01(void); +static void utc_ApplicationFW_package_manager_request_set_type_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_set_type_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_set_type_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_request_set_type() + */ +static void utc_ApplicationFW_package_manager_request_set_type_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + ret = package_manager_request_set_type(request,"rpm"); + + package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + + package_manager_request_set_event_cb(request, _event_cb, NULL); + + package_manager_request_install(request, "/mnt/nfs/slp-pkgmgr/TC/com.samsung.hello-0.0.1-0.armv7l.rpm", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_set_type() + */ +static void utc_ApplicationFW_package_manager_request_set_type_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_set_type(-1,"rpm"); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_uninstall.c b/TC/unit/utc_ApplicationFW_package_manager_request_uninstall.c new file mode 100644 index 0000000..365d866 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_uninstall.c @@ -0,0 +1,112 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_uninstall_func_01(void); +static void utc_ApplicationFW_package_manager_request_uninstall_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_uninstall_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_uninstall_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_request_uninstall() + */ +static void utc_ApplicationFW_package_manager_request_uninstall_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + package_manager_request_set_type(request,"rpm"); + + package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + + package_manager_request_set_event_cb(request, _event_cb, NULL); + + ret = package_manager_request_uninstall(request, "com.samsung.hello", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_uninstall() + */ +static void utc_ApplicationFW_package_manager_request_uninstall_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_uninstall(-1, "com.samsung.hello", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_request_unset_event_cb.c b/TC/unit/utc_ApplicationFW_package_manager_request_unset_event_cb.c new file mode 100644 index 0000000..62c4945 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_request_unset_event_cb.c @@ -0,0 +1,113 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_request_unset_event_cb_func_01(void); +static void utc_ApplicationFW_package_manager_request_unset_event_cb_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_request_unset_event_cb_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_request_unset_event_cb_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} +void _event_cb ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_request_unset_event_cb() + */ +static void utc_ApplicationFW_package_manager_request_unset_event_cb_func_01(void) +{ + int ret = 0; + int id; + + package_manager_request_h request; + package_manager_request_create(&request); + + package_manager_request_set_type(request,"rpm"); + + package_manager_request_set_mode(request, PACKAGE_MANAGER_REQUEST_MODE_QUIET); + + package_manager_request_set_event_cb(request, _event_cb, NULL); + + ret = package_manager_request_unset_event_cb(request); + + package_manager_request_uninstall(request, "com.samsung.hello", &id); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_request_unset_event_cb() + */ +static void utc_ApplicationFW_package_manager_request_unset_event_cb_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_request_unset_event_cb(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_set_event_cb.c b/TC/unit/utc_ApplicationFW_package_manager_set_event_cb.c new file mode 100644 index 0000000..96a0925 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_set_event_cb.c @@ -0,0 +1,105 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_set_event_cb_func_01(void); +static void utc_ApplicationFW_package_manager_set_event_cb_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_set_event_cb_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_set_event_cb_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_set_event_cb() + */ +static void utc_ApplicationFW_package_manager_set_event_cb_func_01(void) +{ + int ret = 0; + int id; + + package_manager_h request; + package_manager_create(&request); + + ret = package_manager_set_event_cb(request, _event_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_set_event_cb() + */ +static void utc_ApplicationFW_package_manager_set_event_cb_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_set_event_cb(-1, _event_cb, NULL); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_package_manager_unset_event_cb.c b/TC/unit/utc_ApplicationFW_package_manager_unset_event_cb.c new file mode 100644 index 0000000..2dedc19 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_package_manager_unset_event_cb.c @@ -0,0 +1,106 @@ +/* + * capi-package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup) (void) = startup; +void (*tet_cleanup) (void) = cleanup; + +static void utc_ApplicationFW_package_manager_unset_event_cb_func_01(void); +static void utc_ApplicationFW_package_manager_unset_event_cb_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + {utc_ApplicationFW_package_manager_unset_event_cb_func_01, POSITIVE_TC_IDX}, + {utc_ApplicationFW_package_manager_unset_event_cb_func_02, NEGATIVE_TC_IDX}, + {NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +void _event_cb ( + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data) +{ + return 0; +} + +/** + * @brief Positive test case of package_manager_unset_event_cb() + */ +static void utc_ApplicationFW_package_manager_unset_event_cb_func_01(void) +{ + int ret = 0; + int id; + + package_manager_h request; + package_manager_create(&request); + + package_manager_set_event_cb(request, _event_cb, NULL); + ret = package_manager_unset_event_cb(request); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + + +/** + * @brief Negative test case of package_manager_unset_event_cb() + */ +static void utc_ApplicationFW_package_manager_unset_event_cb_func_02(void) +{ + int ret = 0; + int id; + + ret = package_manager_unset_event_cb(-1); + if (ret != 0) { + tet_infoline + ("tc() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/capi-appfw-package-manager.manifest b/capi-appfw-package-manager.manifest new file mode 100644 index 0000000..6e65195 --- /dev/null +++ b/capi-appfw-package-manager.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/capi-appfw-package-manager.pc.in b/capi-appfw-package-manager.pc.in new file mode 100755 index 0000000..4881866 --- /dev/null +++ b/capi-appfw-package-manager.pc.in @@ -0,0 +1,15 @@ + +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=/usr +libdir=@LIB_INSTALL_DIR@ +includedir=/usr/include/appfw + +Name: @PC_NAME@ +Description: @PACKAGE_DESCRIPTION@ +Version: @VERSION@ +Requires: @PC_REQUIRED@ +Libs: -L${libdir} @PC_LDFLAGS@ +Cflags: -I${includedir} + diff --git a/debian/README b/debian/README new file mode 100755 index 0000000..e69de29 diff --git a/debian/capi-appfw-package-manager-dev.install b/debian/capi-appfw-package-manager-dev.install new file mode 100755 index 0000000..761a28b --- /dev/null +++ b/debian/capi-appfw-package-manager-dev.install @@ -0,0 +1,4 @@ +/usr/include/* +/usr/include/*/* +/usr/lib/pkgconfig/*.pc + diff --git a/debian/capi-appfw-package-manager-dev.postinst b/debian/capi-appfw-package-manager-dev.postinst new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/debian/capi-appfw-package-manager-dev.postinst @@ -0,0 +1 @@ +#!/bin/sh diff --git a/debian/capi-appfw-package-manager.install b/debian/capi-appfw-package-manager.install new file mode 100755 index 0000000..a814bc2 --- /dev/null +++ b/debian/capi-appfw-package-manager.install @@ -0,0 +1,2 @@ +/usr/lib/lib*.so* +/usr/bin* diff --git a/debian/capi-appfw-package-manager.postinst b/debian/capi-appfw-package-manager.postinst new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/debian/capi-appfw-package-manager.postinst @@ -0,0 +1 @@ +#!/bin/sh diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..773a068 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,8 @@ +capi-appfw-package-manager (0.0.1-1) unstable; urgency=low + + * Initial upload + * Git: slp-source.sec.samsung.net:slp/api/package-manager + * Tag: capi-appfw-package-manager_0.0.1-1 + + -- Sewook Park Thu, 04 Aug 2011 18:49:46 +0900 + diff --git a/debian/compat b/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100755 index 0000000..f5666e6 --- /dev/null +++ b/debian/control @@ -0,0 +1,22 @@ + +Source: capi-appfw-package-manager +Section: libs +Priority: extra +Maintainer: Woongsuk Cho , junghyuk park +Build-Depends: debhelper (>= 5), dlog-dev, capi-base-common-dev, libail-0-dev, libpkgmgr-client-dev, libglib2.0-dev + +Package: capi-appfw-package-manager +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: The Application Manager API provides functions to get information about running applications. + +Package: capi-appfw-package-manager-dev +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, capi-appfw-package-manager (= ${Source-Version}), capi-base-common-dev +Description: The Application Manager API provides functions to get information about running applications. (DEV) + +Package: capi-appfw-package-manager-dbg +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, capi-appfw-package-manager (= ${Source-Version}) +Description: The Application Manager API provides functions to get information about running applications. (DBG) + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..aedf630 --- /dev/null +++ b/debian/rules @@ -0,0 +1,68 @@ +#!/usr/bin/make -f + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +CMAKE_ROOT_DIR ?= $(CURDIR) +CMAKE_BUILD_DIR ?= $(CURDIR)/cmake_build_tmp + +FULLVER ?= $(shell dpkg-parsechangelog | grep Version: | cut -d ' ' -f 2 | cut -d '-' -f 1) +MAJORVER ?= $(shell echo $(FULLVER) | cut -d '.' -f 1) + +configure: configure-stamp +configure-stamp: + dh_testdir + mkdir -p $(CMAKE_BUILD_DIR) && cd $(CMAKE_BUILD_DIR) && cmake .. -DFULLVER=${FULLVER} -DMAJORVER=${MAJORVER} + touch configure-stamp + + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + cd $(CMAKE_BUILD_DIR) && $(MAKE) + touch $@ + +clean: + cd $(CMAKE_ROOT_DIR) + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + rm -f `find . -name *.pc` + rm -rf $(CMAKE_BUILD_DIR) + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + cd $(CMAKE_BUILD_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + +binary-indep: build install + +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp + dh_installman + dh_link + dh_strip --dbg-package=capi-appfw-package-manager-dbg + dh_fixperms + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure + diff --git a/include/package_info.h b/include/package_info.h new file mode 100755 index 0000000..f26546b --- /dev/null +++ b/include/package_info.h @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __TIZEN_APPFW_PACKAGE_INFO_H +#define __TIZEN_APPFW_PACKAGE_INFO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** +* @addtogroup CAPI_PACKAGE_INFO_MODULE +* @{ +*/ + +/** + * @brief Package information handle. + */ + typedef struct package_info_s *package_info_h; + +/** + * @brief Enumeration of storage type + */ +typedef enum { + PACKAGE_INFO_INTERNAL_STORAGE = 0, + PACKAGE_INFO_EXTERNAL_STORAGE = 1, +} package_info_installed_storage_type_e; + +typedef enum { + PACKAGE_INFO_ALLAPP = 0, + PACKAGE_INFO_UIAPP = 1, + PACKAGE_INFO_SERVICEAPP = 2, +} package_info_app_component_type_e; + +typedef enum { + PACKAGE_INFO_AUTHOR_ROOT_CERT = 0, /**< Author Root Certificate*/ + PACKAGE_INFO_AUTHOR_INTERMEDIATE_CERT = 1, /**< Author Intermediate Certificate*/ + PACKAGE_INFO_AUTHOR_SIGNER_CERT = 2, /**< Author Signer Certificate*/ + PACKAGE_INFO_DISTRIBUTOR_ROOT_CERT = 3, /**< Distributor Root Certificate*/ + PACKAGE_INFO_DISTRIBUTOR_INTERMEDIATE_CERT = 4, /**< Distributor Intermediate Certificate*/ + PACKAGE_INFO_DISTRIBUTOR_SIGNER_CERT = 5, /**< Distributor Signer Certificate*/ + PACKAGE_INFO_DISTRIBUTOR2_ROOT_CERT = 6, /**< Distributor2 Root Certificate*/ + PACKAGE_INFO_DISTRIBUTOR2_INTERMEDIATE_CERT = 7, /**< Distributor2 Intermediate Certificate*/ + PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT = 8, /**< Distributor2 Signer Certificate*/ +} package_cert_type_e; + + +/** + * @brief Called to get the application id once for each installed package. + * @param [in] comp_type The Application Component type + * @param [in] callback The callback function to invoke + * @param [in] user_data The user data passed from the foreach function + * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop. + * @pre package_info_foreach_app_from_package() will invoke this callback. + * @see package_info_foreach_app_from_package() + */ +/*This callback is not fixed, Don't use it now */ +typedef bool (*package_info_app_cb) (package_info_app_component_type_e comp_type, const char *app_id, void *user_data); + + +/** + * @brief Called to get the certification information + * @param [in] package_info The package info handle + * @param [in] cert_type The certificate type + * @param [in] cert_value The certificate value of corresponding certificate key. This value is base64 encoded data + * @param [in] user_data The user data passed from the foreach function + * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop. + * @pre package_info_foreach_cert_info() will invoke this callback. + * @see package_info_foreach_cert_info() + */ +typedef bool (*package_info_cert_info_cb) (package_info_h handle, package_cert_type_e cert_type, const char *cert_value, void *user_data); + + +/** + * @brief Retrieves all application id of each package + * @param [in] package_info The package info handle + * @param [in] comp_type The application component type + * @param [in] callback The callback function to invoke + * @param [in] user_data The user data to be passed to the callback function + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE No such package + * @post This function invokes package_info_app_cb() repeatedly for each package. + * @see package_info_app_cb() + */ +/*This API is not fixed, Don't use it now */ +int package_info_foreach_app_from_package(package_info_h package_info, package_info_app_component_type_e comp_type, package_info_app_cb callback, void *user_data); + + +/** + * @brief Destroys the package information handle and releases all its resources. + * @param [in] package_info The package information handle + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see package_manager_foreach_package_info() + * @see package_manager_get_package_info() + */ +int package_info_destroy(package_info_h package_info); + + +/** + * @brief Gets the absolute path to the icon image + * @remarks @a package must be released with free() by you. + * @param [in] package_info The package information + * @param [out] package The package name + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + */ +int package_info_get_package(package_info_h package_info, char **package); + + +/** + * @brief Gets the label of the package + * @remarks @a label must be released with free() by you. + * @param [in] package_info The package information + * @param [out] name The label of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_get_label(package_info_h package_info, char **label); + + +/** + * @brief Gets the absolute path to the icon image + * @remarks @a path must be released with free() by you. + * @param [in] package_info The package information + * @param [out] path The path of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_get_icon(package_info_h package_info, char **path); + + +/** + * @brief Gets the version of the package + * @remarks @a version must be released with free() by you. + * @param [in] package_info The package information + * @param [out] path The version of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_get_version(package_info_h package_info, char **version); + + +/** + * @brief Gets the type of the package + * @remarks @a type must be released with free() by you. + * @param [in] package_info The package information + * @param [out] version The type of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_get_type(package_info_h package_info, char **type); + + +/** + * @brief Gets the installed storage for the given package + * @param [in] package_info The package information + * @param[out] storage The installed storage + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + */ +int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage); + + +/** + * @brief Gets the root path of the package + * @remarks @a path must be released with free() by you. + * @param [in] package_info The package information + * @param [out] path The root path of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_get_root_path(package_info_h package_info, char **path); + +/** + * @brief Gets whether the package is system package or not + * @param [in] package_info The package information + * @param [out] system The system info of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_is_system_package(package_info_h package_info, bool *system); + + +/** + * @brief Gets whether the package is removable or not + * @param [in] package_info The package information + * @param [out] removable The removable info of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_is_removable_package(package_info_h package_info, bool *removable); + + +/** + * @brief Gets whether the package is preload or not + * @param [in] package_info The package information + * @param [out] preload The preload info of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_is_preload_package(package_info_h package_info, bool *preload); + + +/** + * @brief Checks whether two package information are equal. + * @param [in] lhs The first package information to compare + * @param [in] rhs The second package information to compare + * @param [out] equal true if the package information are equal, otherwise false + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Database error occurred + */ +int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal); + + +/** + * @brief Gets the package accessible for the given package + * @param [in] package_info The package information + * @param[out] accessible If the given package can access, it returns ture. If it is not, it returns false + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + */ +int package_info_is_accessible(package_info_h package_info, bool *accessible); + + +/** + * @brief Clones the package information handle. + * @param [out] clone If successful, a newly created package information handle will be returned. + * @param [in] package_info_h The package information + * @return 0 on success, otherwise a negative error value. + * @retval #APP_MANAGER_ERROR_NONE Successful + * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #APP_MANAGER_ERROR_DB_FAILED Database error occurred + * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + */ +int package_info_clone(package_info_h *clone, package_info_h package_info); + + +/** + * @brief Retrieves certification information of the package + * @param [in] package_info The package information + * @param [in] callback The iteration callback function + * @param [in] user_data The user data to be passed to the callback function + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void* user_data); + + +/** + * @brief Gets the package information for the given package + * @remarks @a package_info must be released with package_info_destroy() by you. + * @param [in] package The ID of the package + * @param [out] package_info The package information for the given package ID + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Database error occurred + */ +int package_info_create(const char *package, package_info_h *package_info); + + +/** +* @} +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_APPFW_PACKAGE_INFO_H */ diff --git a/include/package_manager.h b/include/package_manager.h new file mode 100755 index 0000000..8d58676 --- /dev/null +++ b/include/package_manager.h @@ -0,0 +1,478 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_APPFW_PACKAGE_MANAGER_H +#define __TIZEN_APPFW_PACKAGE_MANAGER_H + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup CAPI_PACKAGE_MANAGER_MODULE + * @{ + */ + +/** + * @brief Enumerations of error code + */ +typedef enum { + PACKAGE_MANAGER_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + PACKAGE_MANAGER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + PACKAGE_MANAGER_ERROR_IO_ERROR = TIZEN_ERROR_IO_ERROR, /**< Internal I/O error */ + PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE = TIZEN_ERROR_APPLICATION_CLASS | 0x71, /**< No such package */ +} package_manager_error_e; + +/** + * @brief Enumeration of event type + */ +typedef enum { + PACKAGE_MANAGER_EVENT_TYPE_INSTALL = 0, + PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL, + PACKAGE_MANAGER_EVENT_TYPE_UPDATE, + + /* These enum will be deprecated. Use above enum instead. */ + PACAKGE_MANAGER_EVENT_TYPE_INSTALL = 0, + PACAKGE_MANAGER_EVENT_TYPE_UNINSTALL, + PACAKGE_MANAGER_EVENT_TYPE_UPDATE, +} package_manager_event_type_e; + +/** + * @brief Enumeration of event state + */ +typedef enum { + PACKAGE_MANAGER_EVENT_STATE_STARTED = 0, + PACKAGE_MANAGER_EVENT_STATE_PROCESSING, + PACKAGE_MANAGER_EVENT_STATE_COMPLETED, + PACKAGE_MANAGER_EVENT_STATE_FAILED, + + /* These enum will be deprecated. Use above enum instead. */ + PACAKGE_MANAGER_EVENT_STATE_STARTED = 0, + PACAKGE_MANAGER_EVENT_STATE_PROCESSING, + PACAKGE_MANAGER_EVENT_STATE_COMPLETED, + PACAKGE_MANAGER_EVENT_STATE_FAILED, +} package_manager_event_state_e; + +/** + * @brief Enumeration of request mode + */ +typedef enum { + PACKAGE_MANAGER_REQUEST_MODE_DEFAULT = 0, + PACKAGE_MANAGER_REQUEST_MODE_QUIET, + + /* These enum will be deprecated. Use above enum instead. */ + PACAKGE_MANAGER_REQUEST_MODE_DEFAULT = 0, + PACAKGE_MANAGER_REQUEST_MODE_QUIET, +} package_manager_request_mode_e; + +/** + * @brief Enumeration of move type + */ +typedef enum { + PACKAGE_MANAGER_REQUEST_MOVE_TO_INTERNAL = 0, + PACKAGE_MANAGER_REQUEST_MOVE_TO_EXTERNAL, + + /* These enum will be deprecated. Use above enum instead. */ + PACAKGE_MANAGER_REQUEST_MOVE_TO_INTERNAL = 0, + PACAKGE_MANAGER_REQUEST_MOVE_TO_EXTERNAL, +} package_manager_move_type_e; + +/** + * @brief Enumeration of certification compare type + */ +typedef enum { + PACKAGE_MANAGER_COMPARE_MATCH = 0, + PACKAGE_MANAGER_COMPARE_MISMATCH, + PACKAGE_MANAGER_COMPARE_LHS_NO_CERT, + PACKAGE_MANAGER_COMPARE_RHS_NO_CERT, + PACKAGE_MANAGER_COMPARE_BOTH_NO_CERT, + + /* These enum will be deprecated. Use above enum instead. */ + PACAKGE_MANAGER_COMPARE_MATCH = 0, + PACAKGE_MANAGER_COMPARE_MISMATCH, + PACAKGE_MANAGER_COMPARE_LHS_NO_CERT, + PACAKGE_MANAGER_COMPARE_RHS_NO_CERT, + PACAKGE_MANAGER_COMPARE_BOTH_NO_CERT, +} package_manager_compare_result_type_e; + +/** + * @brief Enumeration of permission type + */ +typedef enum { + PACKAGE_MANAGER_PERMISSION_NORMAL = 0, + PACKAGE_MANAGER_PERMISSION_SIGNATURE, + PACKAGE_MANAGER_PERMISSION_PRIVILEGE, +} package_manager_permission_type_e; + +/** + * @brief Package manager handle + */ +typedef struct package_manager_s *package_manager_h; + +/** + * @brief Package manager request handle + */ +typedef struct package_manager_request_s *package_manager_request_h; + +/** + * @brief Called when the progress of the request to the package manager changes. + * + * @param [in] id The ID of the request to the package manager + * @param [in] type The type of the package to install, uninstall or update + * @param [in] package The name of the package to install, uninstall or update + * @param [in] event_type The type of the request to the package manager + * @param [in] event_state The current state of the request to the package manager + * @param [in] progress The progress for the request that is being processed by the package manager \n + * The range of progress is from 0 to 100. + * @param [in] error The error code when the package manager failed to process the request + * @param [in] user_data The user data passed from package_manager_request_set_event_cb() + * @see package_manager_request_set_event_cb() + * @see package_manager_request_unset_event_cb() + */ +typedef void (*package_manager_request_event_cb) ( + int id, + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data); + +/** + * @brief Creates a request handle to the package manager. + * + * @remarks The @a request must be released with package_manager_request_destroy() by you. + * @param [out] request A request handle to be newly created on success + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Internal I/O error + * @see package_manager_request_destroy() + */ +int package_manager_request_create(package_manager_request_h *request); + +/** + * @brief Destroys the request handle to the package manager. + * + * @param [in] request The request handle to the package manager + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see package_manager_request_create() + */ +int package_manager_request_destroy(package_manager_request_h request); + +/** + * @brief Registers a callback function to be invoked when the progress of the request changes. + * + * @param [in] request The request handle + * @param [in] callback The callback function to register + * @param [in] user_data The user data to be passed to the callback function + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @post package_manager_request_event_cb() will be invoked. + * @see package_manager_request_event_cb() + * @see package_manager_request_unset_event_cb() +*/ +int package_manager_request_set_event_cb(package_manager_request_h request, + package_manager_request_event_cb callback, void *user_data); + +/** + * @brief Unregisters the callback function. + * + * @param [in] request The request handle + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see package_manager_request_event_cb() + * @see package_manager_request_set_event_cb() +*/ +int package_manager_request_unset_event_cb(package_manager_request_h request); + +/** + * @brief Sets the type of the package to install, uninstall or update. + * + * @param [in] request The request handle + * @param [in] type The type of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter +*/ +int package_manager_request_set_type(package_manager_request_h request, + const char *type); + +/** + * @brief Sets the mode of the request. + * + * @param [in] request The request handle + * @param [in] mode The mode of the request + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter +*/ +int package_manager_request_set_mode(package_manager_request_h request, + package_manager_request_mode_e mode); + +/** + * @brief Installs the package which is located at the given path. + * + * @param [in] request The request handle + * @param [in] path The absolute path to the package to install + * @param [out] id The ID of the request to the package manager + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see package_manager_request_uninstall() +*/ +int package_manager_request_install(package_manager_request_h request, + const char *path, int *id); + +/** + * @brief Uninstalls the package with the given name + * + * @param [in] request The request handle + * @param [in] name The name of the package to uninstall + * @param [out] id The ID of the request to the package manager + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter +*/ +int package_manager_request_uninstall(package_manager_request_h request, + const char *name, int *id); + +/** + * @brief moves the package from sd card to internal memory and vice versa.. + * + * @param [in] request The request handle + * @param [in] name The name of the package to move + * @param [in] move_type move type[enum package_manager_move_type_e], [external to internal/internal to external] + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter +*/ +int package_manager_request_move(package_manager_request_h request, + const char *name, package_manager_move_type_e move_type); + + +/** + * @brief Called when the package is installed, uninstalled or updated, and the progress of the request to the package manager changes. + * + * @param [in] type The type of the package to install, uninstall or update + * @param [in] package The name of the package to install, uninstall or update + * @param [in] event_type The type of the request to the package manager + * @param [in] event_state The current state of the request to the package manager + * @param [in] progress The progress for the request that is being processed by the package manager \n + * The range of progress is from 0 to 100. + * @param [in] error The error code when the package manager failed to process the request + * @param [in] user_data The user data passed from package_manager_set_event_cb() + * @see package_manager_set_event_cb() + * @see package_manager_unset_event_cb() + */ +typedef void (*package_manager_event_cb) ( + const char *type, + const char *package, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state, + int progress, + package_manager_error_e error, + void *user_data); + +/** + * @brief Creates a package manager handle. + * + * @remarks The @a manager must be released with package_manager_destroy() by you + * @param [out] manager A package manager handle to be newly created on success + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Internal I/O error + * @see package_manager_destroy() + */ +int package_manager_create(package_manager_h * manager); + +/** + * @brief Destroys the package manager handle. + * + * @param [in] manager The package manager handle + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see package_manager_create() + */ +int package_manager_destroy(package_manager_h manager); + +/** + * @brief Set the event of status of package when the package is installed, uninstalled or updated. + * + * @param [in] manager The package manager handle + * @param [in] status_type The status of package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Internal I/O error + */ +int package_manager_set_event_status(package_manager_h manager, int status_type); + +/** + * @brief Registers a callback function to be invoked when the package is installed, uninstalled or updated. + * + * @param [in] manager The package manager handle + * @param [in] callback The callback function to register + * @param [in] user_data The user data to be passed to the callback function + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @post package_manager_event_cb() will be invoked. + * @see package_manager_event_cb() + * @see package_manager_unset_event_cb() +*/ +int package_manager_set_event_cb(package_manager_h manager, + package_manager_event_cb callback, + void *user_data); + +/** + * @brief Unregisters the callback function. + * + * @param [in] manager The package manager handle + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see package_manager_event_cb() + * @see package_manager_set_event_cb() +*/ +int package_manager_unset_event_cb(package_manager_h manager); + + +/** + * @brief Retrieves all packages + * @param[in] package_info The package information + * @param[in] user_data The user data passed from the foreach function + * @return @c true to continue with the next iteration of the loop, \n @c false to break out of the loop. + * @see package_manager_foreach_package_info() + */ +typedef bool (*package_manager_package_info_cb) ( + package_info_h package_info, + void *user_data); + + +/** + * @brief Retrieves all package information of installed packages + * @param [in] callback The callback function to invoke + * @param [in] user_data The user data to be passed to the callback function + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @post This function invokes package_manager_package_info_cb() repeatedly for each package information. + * @see package_manager_package_info_cb() + */ +int package_manager_foreach_package_info(package_manager_package_info_cb callback, + void *user_data); + + +/** + * @brief Gets the package_id for the given app_id + * @param [in] app_id The ID of the application + * @param [out] package_id The ID of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + */ +int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id); + + +/** + * @brief Gets the package information for the given package + * @remarks @a package_info must be released with package_info_destroy() by you. + * @param [in] package_id The ID of the package + * @param [out] package_info The package information for the given package ID + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Database error occurred + */ +int package_manager_get_package_info(const char *package_id, package_info_h *package_info); + + +/** + * @brief compare whether two package certification are matched. + * @param [in] lhs The first package ID to compare + * @param [in] rhs The second package ID to compare + * @param [out] compare_result 0 if the certification information are matched, otherwise returns compared result + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Database error occurred + */ +int package_manager_compare_package_cert_info(const char *lhs_package_id, const char *rhs_package_id, package_manager_compare_result_type_e *compare_result); + +/** + * @brief compare whether two app certification are matched. + * @param [in] lhs The first app ID to compare + * @param [in] rhs The second app ID to compare + * @param [out] compare_result 0 if the certification information are matched, otherwise returns compared result + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR Database error occurred + */ + int package_manager_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, package_manager_compare_result_type_e *compare_result); + +/** + * @brief Gets whether the package is preload or not by app_id + * @param [in] app_id The ID of the application + * @param [out] preload The preload info of the package + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload); + +/** + * @brief Gets the package permission type by app_id + * @param [in] app_id The ID of the application + * @param [out] permission_type The package permission type + * @return 0 on success, otherwise a negative error value. + * @retval #PACKAGE_MANAGER_ERROR_NONE Successful + * @retval #PACKAGE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @retval #PACKAGE_MANAGER_ERROR_IO_ERROR IO error + */ +int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type); + +/** +* @} +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_APPFW_PACKAGE_MANAGER_H */ diff --git a/include/package_manager_private.h b/include/package_manager_private.h new file mode 100755 index 0000000..e66cff0 --- /dev/null +++ b/include/package_manager_private.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_APPFW_PACKAGE_MANAGER_PRIVATE_H__ +#define __TIZEN_APPFW_PACKAGE_MANAGER_PRIVATE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int package_manager_error(package_manager_error_e error, const char* function, const char *description); + +int package_info_get_package_info(const char *package, package_info_h *package_info); + +int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data); + + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_APPFW_PACKAGE_MANAGER_PRIVATE_H__ */ diff --git a/packaging/capi-appfw-package-manager.spec b/packaging/capi-appfw-package-manager.spec new file mode 100755 index 0000000..3f8ac66 --- /dev/null +++ b/packaging/capi-appfw-package-manager.spec @@ -0,0 +1,65 @@ +Name: capi-appfw-package-manager +Summary: Package Manager API +Version: 0.0.35 +Release: 1 +Group: API +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(pkgmgr) +BuildRequires: pkgconfig(pkgmgr-info) +BuildRequires: pkgconfig(ail) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(capi-base-common) + +%description +The Package Manager API provides functions to install, uninstall the package, +and also privides event listening function. + +%package devel +Summary: Package Manager API (Development) +Group: API +Requires: %{name} = %{version}-%{release} + +%description devel +The Package Manager API provides functions to install, uninstall the package, +and also privides event listening function. (DEV) + + +%prep +%setup -q + + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER} + +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +mkdir -p %{buildroot}/usr/share/license +cp LICENSE %{buildroot}/usr/share/license/%{name} + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + + +%files +%manifest capi-appfw-package-manager.manifest +%{_libdir}/libcapi-appfw-package-manager.so.* +%{_bindir}/pkgmgr_tool +/usr/share/license/%{name} + +%files devel +%{_includedir}/appfw/package_manager.h +%{_includedir}/appfw/package_info.h +%{_libdir}/libcapi-appfw-package-manager.so +%{_libdir}/pkgconfig/*.pc + + diff --git a/src/package_info.c b/src/package_info.c new file mode 100755 index 0000000..cd550dd --- /dev/null +++ b/src/package_info.c @@ -0,0 +1,608 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "package_manager_private.h" + + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER" + +struct package_info_s { + char *package; + pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo; +}; + +struct package_cert_info_s { + char *package; + pkgmgrinfo_certinfo_h pkgmgrinfo_certinfo; +}; + +typedef struct _foreach_pkg_context_{ + package_manager_package_info_cb callback; + void *user_data; +} foreach_pkg_context_s; + + +typedef struct _foreach_app_context_{ + package_info_app_cb callback; + void *user_data; +} foreach_app_context_s; + + +int package_info_create(const char *package, package_info_h *package_info) +{ + package_info_h package_info_created; + pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo; + + if (package == NULL || package_info == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_pkginfo(package, &pkgmgrinfo_pkginfo) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + package_info_created = calloc(1, sizeof(struct package_info_s)); + + if (package_info_created == NULL) + { + pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo); + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + + package_info_created->package = strdup(package); + + if (package_info_created->package == NULL) + { + pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo); + free(package_info_created); + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + + package_info_created->pkgmgrinfo_pkginfo = pkgmgrinfo_pkginfo; + + *package_info = package_info_created; + + return PACKAGE_MANAGER_ERROR_NONE; +} + + +int package_info_get_package_info(const char *package, package_info_h *package_info) +{ + return package_info_create(package, package_info); +} + + +static int package_info_foreach_package_info_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) +{ + char *pkg_name = NULL; + foreach_pkg_context_s *foreach_pkg_context = user_data; + package_info_h package_info = NULL; + + if (handle == NULL || foreach_pkg_context == NULL) + { + package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return PKGMGR_R_EINVAL; + } + + pkgmgrinfo_pkginfo_get_pkgname(handle, &pkg_name); + + if (package_info_create(pkg_name, &package_info) == PACKAGE_MANAGER_ERROR_NONE) + { + foreach_pkg_context->callback(package_info, foreach_pkg_context->user_data); + package_info_destroy(package_info); + } + + /* pkgmgr_get_info_list() needs to be enhanced to stop and continue callback */ + return PKGMGR_R_OK; +} + + +int package_info_foreach_package_info(package_manager_package_info_cb callback, void *user_data) +{ + foreach_pkg_context_s foreach_pkg_context = { + .callback = callback, + .user_data = user_data, + }; + int ret = 0; + + if (callback == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + ret = pkgmgrinfo_pkginfo_get_list(package_info_foreach_package_info_cb, &foreach_pkg_context); + if (ret < 0) { + return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE; + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + + +static int package_info_foreach_app_cb (const pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + pkgmgr_app_component comp; + foreach_app_context_s *foreach_app_context = user_data; + int ret = 0; + + if (handle == NULL || foreach_app_context == NULL) + { + package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + return PKGMGR_R_EINVAL; + } + + ret = pkgmgrinfo_appinfo_get_appid(handle, &appid); + if (ret < 0) { + return PKGMGR_R_ERROR; + } + ret = pkgmgrinfo_appinfo_get_component(handle, &comp); + if (ret < 0) { + return PKGMGR_R_ERROR; + } + + foreach_app_context->callback(comp, appid, foreach_app_context->user_data); + + return PKGMGR_R_OK; +} + + + +int package_info_foreach_app_from_package(package_info_h package_info, package_info_app_component_type_e comp_type, package_info_app_cb callback, void *user_data) +{ + foreach_app_context_s foreach_app_context = { + .callback = callback, + .user_data = user_data, + }; + pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo; + int ret = 0; + + if (package_info == NULL || callback == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_pkginfo(package_info->package, &pkgmgrinfo_pkginfo) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + if (comp_type == PACKAGE_INFO_ALLAPP) + ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PM_ALL_APP, package_info_foreach_app_cb, &foreach_app_context); + if (comp_type == PACKAGE_INFO_UIAPP) + ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PM_UI_APP, package_info_foreach_app_cb, &foreach_app_context); + if (comp_type == PACKAGE_INFO_SERVICEAPP) + ret = pkgmgrinfo_appinfo_get_list(pkgmgrinfo_pkginfo, PM_SVC_APP, package_info_foreach_app_cb, &foreach_app_context); + + return ret; +} + + +int package_info_destroy(package_info_h package_info) +{ + if (package_info == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + free(package_info->package); + + pkgmgrinfo_pkginfo_destroy_pkginfo(package_info->pkgmgrinfo_pkginfo); + + free(package_info); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_package(package_info_h package_info, char **package) +{ + char *package_dup; + + if (package_info == NULL || package == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + package_dup = strdup(package_info->package); + + if (package_dup == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + + *package = package_dup; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_label(package_info_h package_info, char **label) +{ + char *pkg_info_value = NULL; + char *label_dup = NULL; + + if (package_info == NULL || label == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_label(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + if(!pkg_info_value) + goto END; + + label_dup = strdup(pkg_info_value); + + if (label_dup == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + +END: + *label = label_dup; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_icon(package_info_h package_info, char **path) +{ + char *pkg_info_value = NULL; + char *icon_dup = NULL; + + if (package_info == NULL || path == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_icon(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + if(!pkg_info_value) + goto END; + + icon_dup = strdup(pkg_info_value); + + if (icon_dup == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + +END: + *path = icon_dup; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_version(package_info_h package_info, char **version) +{ + char *pkg_info_value = NULL; + char *ver_dup = NULL; + + if (package_info == NULL || version == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_version(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + if(!pkg_info_value) + goto END; + + ver_dup = strdup(pkg_info_value); + + if (ver_dup == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + +END: + *version = ver_dup; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_type(package_info_h package_info, char **type) +{ + char *pkg_info_value = NULL; + char *type_dup = NULL; + + if (package_info == NULL || type == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_type(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + if(!pkg_info_value) + goto END; + + type_dup = strdup(pkg_info_value); + + if (type_dup == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + +END: + *type = type_dup; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_installed_storage(package_info_h package_info, package_info_installed_storage_type_e *storage) +{ + int ret = 0; + pkgmgr_installed_storage pkg_info_value; + + if (package_info == NULL || storage == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + ret = pkgmgrinfo_pkginfo_get_installed_storage(package_info->pkgmgrinfo_pkginfo, &pkg_info_value); + if (ret < 0) + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + + if (pkg_info_value == PM_INTERNAL_STORAGE) + *storage = PACKAGE_INFO_INTERNAL_STORAGE; + else if (pkg_info_value == PM_EXTERNAL_STORAGE) + *storage = PACKAGE_INFO_EXTERNAL_STORAGE; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_get_root_path(package_info_h package_info, char **path) +{ + char *pkg_info_value = NULL; + char *path_dup = NULL; + + if (package_info == NULL || path == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_root_path(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + if(!pkg_info_value) + goto END; + + path_dup = strdup(pkg_info_value); + + if (path_dup == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + +END: + *path = path_dup; + + return PACKAGE_MANAGER_ERROR_NONE; +} + + +/* +int package_info_get_install_location(package_info_h package_info, package_manager_package_location_e *location) +{ + pkgmgr_install_location pkg_info_value = 0; + + if (package_info == NULL || system == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_install_location(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + *location = (pkg_info_value==PM_INSTALL_LOCATION_INTERNAL_ONLY ? PACAKGE_MANAGER_LOCATION_INTERNAL : PACAKGE_MANAGER_LOCATION_EXTERNAL); + + return PACKAGE_MANAGER_ERROR_NONE; +} +*/ + +int package_info_is_system_package(package_info_h package_info, bool *system) +{ + bool pkg_info_value = false; + + if (package_info == NULL || system == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + *system = pkg_info_value; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_is_removable_package(package_info_h package_info, bool *removable) +{ + bool pkg_info_value = false; + + if (package_info == NULL || removable == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_is_removable(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + *removable = pkg_info_value; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_is_preload_package(package_info_h package_info, bool *preload) +{ + bool pkg_info_value = false; + + if (package_info == NULL || preload == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_is_preload(package_info->pkgmgrinfo_pkginfo, &pkg_info_value) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + *preload = pkg_info_value; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_is_equal(package_info_h lhs, package_info_h rhs, bool *equal) +{ + if (lhs == NULL || rhs == NULL || equal == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (!strcmp(lhs->package, rhs->package)) + { + *equal = true; + } + else + { + *equal = false; + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_is_accessible(package_info_h package_info, bool *accessible) +{ + int ret = 0; + bool pkg_info_value = false; + + if (package_info == NULL || accessible == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + ret = pkgmgrinfo_pkginfo_is_accessible(package_info->pkgmgrinfo_pkginfo, &pkg_info_value); + if (ret < 0) + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + + + *accessible = pkg_info_value; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_clone(package_info_h *clone, package_info_h package_info) +{ + int retval; + + if (clone == NULL || package_info == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + retval = package_info_create(package_info->package, clone); + + if (retval != PACKAGE_MANAGER_ERROR_NONE) + { + return package_manager_error(retval, __FUNCTION__, NULL); + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_info_foreach_cert_info(package_info_h package_info, package_info_cert_info_cb callback, void* user_data) +{ + int retval; + pkgmgrinfo_certinfo_h handle = NULL; + int i = 0; + const char *cert_value = NULL; + + if (package_info == NULL || callback == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + retval = pkgmgrinfo_pkginfo_create_certinfo(&handle); + if (retval != PMINFO_R_OK) + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + + retval = pkgmgrinfo_pkginfo_load_certinfo(package_info->package, handle); + if (retval != PMINFO_R_OK) + { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + for( i=0; i<=PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT; i++) + { + retval = pkgmgrinfo_pkginfo_get_cert_value(handle, i, &cert_value); + if (retval != PMINFO_R_OK) + { + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + if ( cert_value && strncmp(cert_value, "(null)", strlen("(null)")) ) + { + retval = callback(package_info, (package_cert_type_e)i, cert_value, user_data); + if (!retval) + break; + } + + cert_value = NULL; + } + + pkgmgrinfo_pkginfo_destroy_certinfo(handle); + + return PACKAGE_MANAGER_ERROR_NONE; +} + diff --git a/src/package_manager.c b/src/package_manager.c new file mode 100755 index 0000000..cf05018 --- /dev/null +++ b/src/package_manager.c @@ -0,0 +1,953 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include +#include +#include + + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "CAPI_APPFW_PACKAGE_MANAGER" + +#define _LOGE(fmt, arg...) LOGE(fmt,##arg) +#define _LOGD(fmt, arg...) LOGD(fmt, ##arg) + +typedef struct _event_info { + int req_id; + package_manager_event_type_e event_type; + package_manager_event_state_e event_state; + struct _event_info *next; +} event_info; + +struct package_manager_s { + int handle_id; + client_type ctype; + pkgmgr_client *pc; + pkgmgr_mode mode; + event_info *head; + package_manager_event_cb event_cb; + void *user_data; +}; + +struct package_manager_request_s { + int handle_id; + client_type ctype; + pkgmgr_client *pc; + const char *pkg_type; + const char *pkg_path; + const char *pkg_name; + pkgmgr_mode mode; + event_info *head; + package_manager_request_event_cb event_cb; + void *user_data; +}; + +static int package_manager_request_new_id() +{ + static int request_handle_id = 0; + return request_handle_id++; +} + +static int package_manager_new_id() +{ + static int manager_handle_id = 0; + return manager_handle_id++; +} + +static const char *package_manager_error_to_string(package_manager_error_e + error) +{ + switch (error) { + case PACKAGE_MANAGER_ERROR_NONE: + return "NONE"; + + case PACKAGE_MANAGER_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + + case PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + + case PACKAGE_MANAGER_ERROR_IO_ERROR: + return "IO_ERROR"; + default: + return "UNKNOWN"; + } +} + +int package_manager_error(package_manager_error_e error, + const char *function, const char *description) +{ + if (description) { + _LOGE("[%s] %s(0x%08x) : %s", function, + package_manager_error_to_string(error), error, + description); + } else { + _LOGE("[%s] %s(0x%08x)", function, + package_manager_error_to_string(error), error); + } + + return error; +} + +int package_manager_request_create(package_manager_request_h * request) +{ + struct package_manager_request_s *package_manager_request; + + if (request == NULL) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + package_manager_request = + calloc(1, sizeof(struct package_manager_request_s)); + if (package_manager_request == NULL) { + return + package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create a package_manager handle"); + } + + package_manager_request->ctype = PC_REQUEST; + package_manager_request->pc = pkgmgr_client_new(PC_REQUEST); + if (package_manager_request->pc == NULL) { + free(package_manager_request); + return + package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create a package_manager client"); + } + + package_manager_request->handle_id = package_manager_request_new_id(); + + *request = package_manager_request; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +static int package_manager_client_valiate_handle(package_manager_request_h + request) +{ + if (request == NULL || request->pc == NULL) { + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_client_destroy(package_manager_request_h request) +{ + if (package_manager_client_valiate_handle(request)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + pkgmgr_client_free(request->pc); + request->pc = NULL; + free(request); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_destroy(package_manager_request_h request) +{ + if (package_manager_client_valiate_handle(request)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + pkgmgr_client_free(request->pc); + request->pc = NULL; + free(request); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_set_event_cb(package_manager_request_h request, + package_manager_request_event_cb + callback, void *user_data) +{ + if (package_manager_client_valiate_handle(request)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + request->event_cb = callback; + request->user_data = user_data; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_unset_event_cb(package_manager_request_h request) +{ + // TODO: Please implement this function. + return PACKAGE_MANAGER_ERROR_NONE; +} + + +int package_manager_request_set_type(package_manager_request_h request, + const char *pkg_type) +{ + if (package_manager_client_valiate_handle(request)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + request->pkg_type = pkg_type; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_set_mode(package_manager_request_h request, + package_manager_request_mode_e mode) +{ + if (package_manager_client_valiate_handle(request)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + if (mode == PACKAGE_MANAGER_REQUEST_MODE_QUIET) + request->mode = PM_QUIET; + else + request->mode = PM_DEFAULT; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +static int package_manager_get_event_type(const char *key, + package_manager_event_type_e * + event_type) +{ + if (key == NULL) + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + + if (strcasecmp(key, "install") == 0) + *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL; + else if (strcasecmp(key, "uninstall") == 0) + *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL; + else if (strcasecmp(key, "update") == 0) + *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE; + else + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +static int __add_event_info(event_info ** head, int req_id, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state) +{ + event_info *evt_info; + event_info *current; + event_info *prev; + + evt_info = (event_info *) calloc(1, sizeof(event_info)); + if (evt_info == NULL) { + _LOGD("calloc failed"); + return -1; + } + evt_info->req_id = req_id; + evt_info->event_type = event_type; + evt_info->next = NULL; + + if (*head == NULL) + *head = evt_info; + else { + current = prev = *head; + while (current) { + prev = current; + current = current->next; + } + + prev->next = evt_info; + } + + return 0; +} + +static int __find_event_info(event_info ** head, int req_id, + package_manager_event_type_e * event_type, + package_manager_event_state_e * event_state) +{ + event_info *tmp; + + tmp = *head; + + if (tmp == NULL) { + _LOGE("tmp is NULL"); + return -1; + } + + _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type); + + while (tmp) { + if (tmp->req_id == req_id) { + *event_type = tmp->event_type; + return 0; + } + tmp = tmp->next; + } + return -1; +} + +static int __update_event_info(event_info ** head, int req_id, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state) +{ + package_manager_event_type_e evt_type; + package_manager_event_state_e evt_state; + event_info *tmp; + + if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0) + __add_event_info(head, req_id, event_type, event_state); + else { + tmp = *head; + + if (tmp == NULL) { + _LOGE("tmp is NULL"); + return -1; + } + + while (tmp) { + if (tmp->req_id == req_id) { + tmp->event_type = event_type; + return 0; + } + tmp = tmp->next; + } + } + + return -1; +} + +/* +static int __remove_event_info(event_info **head request, int req_id) +{ + event_info *current; + event_info *tmp; + + if (* == NULL) + return -1; + + current = *head; + while (current) { + if (current->next) { + if (current->next->req_id == req_id) { + tmp = current->next; + current->next = current->next->next; + free(tmp); + return 0; + } + } + tmp = tmp->next; + } + + return -1; +} +*/ + +static int request_event_handler(int req_id, const char *pkg_type, + const char *pkg_name, const char *key, + const char *val, const void *pmsg, void *data) +{ + int ret = -1; + package_manager_event_type_e event_type = -1; + package_manager_event_state_e event_state = -1; + + _LOGD("request_event_handler is called"); + + package_manager_request_h request = data; + + if (strcasecmp(key, "start") == 0) { + ret = package_manager_get_event_type(val, &event_type); + if (ret != PACKAGE_MANAGER_ERROR_NONE) + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + + __add_event_info(&(request->head), req_id, event_type, + PACKAGE_MANAGER_EVENT_STATE_STARTED); + + if (request->event_cb) + request->event_cb(req_id, pkg_type, pkg_name, + event_type, + PACKAGE_MANAGER_EVENT_STATE_STARTED, + 0, PACKAGE_MANAGER_ERROR_NONE, request->user_data); + + } else if (strcasecmp(key, "install_percent") == 0 + || strcasecmp(key, "progress_percent") == 0) { + if (__find_event_info + (&(request->head), req_id, &event_type, + &event_state) == 0) { + __update_event_info(&(request->head), req_id, + event_type, + PACKAGE_MANAGER_EVENT_STATE_PROCESSING); + if (request->event_cb) + request->event_cb(req_id, pkg_type, pkg_name, + event_type, + PACKAGE_MANAGER_EVENT_STATE_PROCESSING, + atoi(val), + PACKAGE_MANAGER_ERROR_NONE, + request->user_data); + } + + } else if (strcasecmp(key, "error") == 0) { + if (strcasecmp(key, "0") != 0) { + if (__find_event_info + (&(request->head), req_id, &event_type, + &event_state) == 0) { + __update_event_info(&(request->head), req_id, + event_type, + PACKAGE_MANAGER_EVENT_STATE_FAILED); + } + + if (request->event_cb) + request->event_cb(req_id, pkg_type, + pkg_name, event_type, + PACKAGE_MANAGER_EVENT_STATE_FAILED, + 0, + PACKAGE_MANAGER_ERROR_NONE, + request->user_data); + + } + } else if (strcasecmp(key, "end") == 0) { + if (__find_event_info + (&(request->head), req_id, &event_type, + &event_state) == 0) { + if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) { + if (request->event_cb) + request->event_cb(req_id, pkg_type, + pkg_name, event_type, + PACKAGE_MANAGER_EVENT_STATE_COMPLETED, + 100, + PACKAGE_MANAGER_ERROR_NONE, + request->user_data); + } + } else { + if (strcasecmp(key, "ok") != 0) + if (request->event_cb) + request->event_cb(req_id, pkg_type, + pkg_name, event_type, + PACKAGE_MANAGER_EVENT_STATE_FAILED, + 0, + PACKAGE_MANAGER_ERROR_NONE, + request->user_data); + } + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_install(package_manager_request_h request, + const char *path, int *id) +{ + int request_id = 0; + request->pkg_path = path; + request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL, + request->pkg_path, NULL, + request->mode, request_event_handler, + request); + + if (request_id < 0) + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + + *id = request_id; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_uninstall(package_manager_request_h request, + const char *name, int *id) +{ + int request_id = 0; + request->pkg_name = name; + request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type, + request->pkg_name, request->mode, + request_event_handler, request); + + if (request_id < 0) + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + + *id = request_id; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_request_move(package_manager_request_h request, + const char *name, package_manager_move_type_e move_type) +{ + int ret = 0; + request->pkg_name = name; + ret = pkgmgr_client_move(request->pc, request->pkg_name, move_type, request_event_handler, request); + + if (ret < 0) + { + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + } + else + { + return PACKAGE_MANAGER_ERROR_NONE; + } +} +int package_manager_create(package_manager_h * manager) +{ + struct package_manager_s *package_manager = NULL; + + if (manager == NULL) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + package_manager = calloc(1, sizeof(struct package_manager_s)); + if (package_manager == NULL) { + return + package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create a package_manager handle"); + } + + package_manager->ctype = PC_LISTENING; + package_manager->pc = pkgmgr_client_new(PC_LISTENING); + if (package_manager->pc == NULL) { + free(package_manager); + return + package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, + __FUNCTION__, + "failed to create a package_manager client"); + } + + package_manager->handle_id = package_manager_new_id(); + + *manager = package_manager; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +static int package_manager_valiate_handle(package_manager_h manager) +{ + if (manager == NULL || manager->pc == NULL) { + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_destroy(package_manager_h manager) +{ + if (package_manager_valiate_handle(manager)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + pkgmgr_client_free(manager->pc); + manager->pc = NULL; + free(manager); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +static int __add_event(event_info ** head, int req_id, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state) +{ + event_info *evt_info; + + evt_info = (event_info *) calloc(1, sizeof(event_info)); + if (evt_info == NULL) { + _LOGD("calloc failed"); + return -1; + } + evt_info->req_id = req_id; + evt_info->event_type = event_type; + evt_info->next = NULL; + + *head = evt_info; + + return 0; +} + +static int __find_event(event_info ** head, int req_id, + package_manager_event_type_e * event_type, + package_manager_event_state_e * event_state) +{ + event_info *tmp; + + tmp = *head; + + if (tmp == NULL) { + _LOGE("tmp is NULL"); + return -1; + } + + *event_type = tmp->event_type; + return 0; +} + +static int __update_event(event_info ** head, int req_id, + package_manager_event_type_e event_type, + package_manager_event_state_e event_state) +{ + package_manager_event_type_e evt_type; + package_manager_event_state_e evt_state; + event_info *tmp; + + if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0) + __add_event_info(head, req_id, event_type, event_state); + else { + tmp = *head; + + if (tmp == NULL) { + _LOGE("tmp is NULL"); + return -1; + } + + tmp->event_type = event_type; + return 0; + } + + return -1; +} + +static int global_event_handler(int req_id, const char *pkg_type, + const char *pkg_name, const char *key, + const char *val, const void *pmsg, void *data) +{ + int ret = -1; + package_manager_event_type_e event_type = -1; + package_manager_event_state_e event_state = -1; + + _LOGD("global_event_handler is called"); + + package_manager_h manager = data; + + if (strcasecmp(key, "start") == 0) { + ret = package_manager_get_event_type(val, &event_type); + if (ret != PACKAGE_MANAGER_ERROR_NONE) + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + + __add_event(&(manager->head), req_id, event_type, + PACKAGE_MANAGER_EVENT_STATE_STARTED); + + if (manager->event_cb) + manager->event_cb(pkg_type, pkg_name, + event_type, + PACKAGE_MANAGER_EVENT_STATE_STARTED, + 0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data); + + } else if (strcasecmp(key, "install_percent") == 0 + || strcasecmp(key, "progress_percent") == 0) { + if (__find_event + (&(manager->head), req_id, &event_type, + &event_state) == 0) { + __update_event(&(manager->head), req_id, + event_type, + PACKAGE_MANAGER_EVENT_STATE_PROCESSING); + if (manager->event_cb) + manager->event_cb(pkg_type, pkg_name, + event_type, + PACKAGE_MANAGER_EVENT_STATE_PROCESSING, + atoi(val), + PACKAGE_MANAGER_ERROR_NONE, + manager->user_data); + } + + } else if (strcasecmp(key, "error") == 0) { + if (strcasecmp(key, "0") != 0) { + if (__find_event + (&(manager->head), req_id, &event_type, + &event_state) == 0) { + __update_event(&(manager->head), req_id, + event_type, + PACKAGE_MANAGER_EVENT_STATE_FAILED); + } + + if (manager->event_cb) + manager->event_cb(pkg_type, + pkg_name, event_type, + PACKAGE_MANAGER_EVENT_STATE_FAILED, + 0, + PACKAGE_MANAGER_ERROR_NONE, + manager->user_data); + + } + } else if (strcasecmp(key, "end") == 0) { + if (__find_event + (&(manager->head), req_id, &event_type, + &event_state) == 0) { + if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) { + if (manager->event_cb) + manager->event_cb(pkg_type, + pkg_name, event_type, + PACKAGE_MANAGER_EVENT_STATE_COMPLETED, + 100, + PACKAGE_MANAGER_ERROR_NONE, + manager->user_data); + } + } else { + if (strcasecmp(key, "ok") != 0) + if (manager->event_cb) + manager->event_cb(pkg_type, + pkg_name, event_type, + PACKAGE_MANAGER_EVENT_STATE_FAILED, + 0, + PACKAGE_MANAGER_ERROR_NONE, + manager->user_data); + } + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_set_event_status(package_manager_h manager, int status_type) +{ + int retval; + + if (manager == NULL){ + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + retval = pkgmgrinfo_client_set_status_type(manager->pc, status_type); + + if (retval < 0){ + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_set_event_cb(package_manager_h manager, + package_manager_event_cb callback, + void *user_data) +{ + if (package_manager_valiate_handle(manager)) { + return + package_manager_error + (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, + NULL); + } + + manager->event_cb = callback; + manager->user_data = user_data; + + pkgmgr_client_listen_status(manager->pc, global_event_handler, manager); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_unset_event_cb(package_manager_h manager) +{ + // TODO: Please implement this function. + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id) +{ + pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo; + int retval; + char *pkg_id = NULL; + char *pkg_id_dup = NULL; + + if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id); + if (retval != PMINFO_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + pkg_id_dup = strdup(pkg_id); + if (pkg_id_dup == NULL) + { + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); + } + + *package_id = pkg_id_dup; + + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_get_package_info(const char *package_id, package_info_h *package_info) +{ + int retval; + + retval = package_info_get_package_info(package_id, package_info); + + if (retval != PACKAGE_MANAGER_ERROR_NONE) + { + return package_manager_error(retval, __FUNCTION__, NULL); + } + else + { + return PACKAGE_MANAGER_ERROR_NONE; + } +} + +int package_manager_foreach_package_info(package_manager_package_info_cb callback, + void *user_data) +{ + int retval; + + retval = package_info_foreach_package_info(callback, user_data); + + if (retval != PACKAGE_MANAGER_ERROR_NONE) + { + return package_manager_error(retval, __FUNCTION__, NULL); + } + else + { + return PACKAGE_MANAGER_ERROR_NONE; + } +} +int package_manager_compare_package_cert_info(const char *lhs_package_id, const char *rhs_package_id, package_manager_compare_result_type_e *compare_result) +{ + pkgmgrinfo_cert_compare_result_type_e result; + + if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + *compare_result = (package_manager_compare_result_type_e)result; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, package_manager_compare_result_type_e *compare_result) +{ + pkgmgrinfo_cert_compare_result_type_e result; + + if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); + } + + *compare_result = (package_manager_compare_result_type_e)result; + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload) +{ + pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL; + pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL; + + int retval =0; + char *pkg_id = NULL; + bool is_preload = 0; + + if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id); + if (retval != PMINFO_R_OK) + { + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) + { + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo); + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) + { + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo); + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + if (is_preload) + *preload = 1; + else + *preload = 0; + + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type) +{ + int retval = 0; + pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo =NULL; + pkgmgrinfo_permission_type permission = 0; + + if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission); + if (retval != PMINFO_R_OK) + { + return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL); + } + + if (permission == PMINFO_PERMISSION_NORMAL) + *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL; + else if (permission == PMINFO_PERMISSION_SIGNATURE) + *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE; + else if (permission == PMINFO_PERMISSION_PRIVILEGE) + *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE; + else + *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL; + + pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); + return PACKAGE_MANAGER_ERROR_NONE; +} diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt new file mode 100644 index 0000000..02b9dee --- /dev/null +++ b/tool/CMakeLists.txt @@ -0,0 +1,23 @@ +# Test executables +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TEST_CFLAGS}") + +#Verbose +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs_test REQUIRED) +FOREACH(flag ${pkgs_test_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wl,-zdefs" ) +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +ADD_EXECUTABLE(pkgmgr_tool main.c) +TARGET_LINK_LIBRARIES(pkgmgr_tool capi-appfw-package-manager ${pkgs_test_LDFLAGS}) +INSTALL(TARGETS pkgmgr_tool DESTINATION bin) + diff --git a/tool/main.c b/tool/main.c new file mode 100755 index 0000000..08c248c --- /dev/null +++ b/tool/main.c @@ -0,0 +1,142 @@ +/* + * package-manager + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include + + + +static void _print_help(const char *cmd) +{ + fprintf(stderr, "Usage:\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "[Get packageinfo value]\n"); + fprintf(stderr, " %s \n", cmd); + fprintf(stderr, "\n"); + fprintf(stderr, "Ex) %s com.samsung.memo\n", cmd); + fprintf(stderr, "\n"); +} + + +static bool _cert_info_cb(package_info_h handle, package_cert_type_e cert_type, + const char *cert_value, void *user_data) +{ + fprintf(stderr, "cert_info[%d] \t= [%s]\n", cert_type, cert_value); + + return true; +} + +static int _get_packageinfo(const char *package) +{ + package_info_h package_info; + int ret; + char *pkg = NULL; + char *label = NULL; + char *icon = NULL; + char *version = NULL; + char *type = NULL; + package_info_installed_storage_type_e storage; + bool system; + bool removable; + bool preload; + + + ret = package_manager_get_package_info(package, &package_info); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + } + + package_info_get_package(package_info, &pkg); + package_info_get_label(package_info, &label); + package_info_get_icon(package_info, &icon); + package_info_get_version(package_info, &version); + package_info_get_type(package_info, &type); + package_info_get_installed_storage(package_info, &storage); + package_info_is_system_package(package_info, &system); + package_info_is_removable_package(package_info, &removable); + package_info_is_preload_package(package_info, &preload); + + fprintf(stderr, "pkg \t= [%s]\n", pkg); + fprintf(stderr, "label \t= [%s]\n", label); + fprintf(stderr, "icon \t= [%s]\n", icon); + fprintf(stderr, "version \t= [%s]\n", version); + fprintf(stderr, "type \t= [%s]\n", type); + fprintf(stderr, "storage \t= [%d]\n", storage); + fprintf(stderr, "system \t= [%d]\n", system); + fprintf(stderr, "removable \t= [%d]\n", removable); + fprintf(stderr, "preload \t= [%d]\n", preload); + + package_info_foreach_cert_info(package_info, _cert_info_cb, NULL); + + ret = package_info_destroy(package_info); + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + } + + return PACKAGE_MANAGER_ERROR_NONE; +} + +static int _get_appinfo(const char *appid) +{ + int ret = 0; + char *package_id = NULL; + ret = package_manager_get_package_id_by_app_id(appid, &package_id); + if (ret < 0) + fprintf(stderr, "package_manager_get_package_id_by_app_id fail \n"); + + fprintf(stderr, "app_id \t= [%s]\n", appid); + fprintf(stderr, "package_id \t= [%s]\n", package_id); + + return PACKAGE_MANAGER_ERROR_NONE; +} + +int main(int argc, char** argv) +{ + int ret = PACKAGE_MANAGER_ERROR_NONE; + + if (2 == argc) { + ret = _get_packageinfo(argv[1]); + } else if (3 == argc) { + ret = _get_appinfo(argv[1]); + } + + else { + _print_help(argv[0]); + return EXIT_FAILURE; + } + + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + fprintf(stderr, "There are some problems\n"); + } + + return EXIT_SUCCESS; +} + + -- 2.7.4