From b0a4824bae9bff3a4d3dd32632200c80f15ddbb2 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:28:38 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- .gitignore | 27 + AUTHORS | 3 + CMakeLists.txt | 90 ++ LICENSE | 204 +++ TC/build.sh | 20 + TC/execute.sh | 20 + TC/tet_code | 12 + TC/tet_scen | 7 + TC/tetbuild.cfg | 3 + TC/tetclean.cfg | 2 + TC/tetexec.cfg | 1 + TC/unit/Makefile | 33 + TC/unit/tc_gen.sh | 28 + TC/unit/tslist | 11 + TC/unit/utc_ApplicationFW_appcore_efl_main_func.c | 132 ++ TC/unit/utc_ApplicationFW_appcore_exit_func.c | 58 + ...ApplicationFW_appcore_get_rotation_state_func.c | 83 ++ TC/unit/utc_ApplicationFW_appcore_init_func.c | 131 ++ .../utc_ApplicationFW_appcore_measure_start_func.c | 58 + ..._ApplicationFW_appcore_measure_time_from_func.c | 87 ++ .../utc_ApplicationFW_appcore_measure_time_func.c | 66 + ...ApplicationFW_appcore_set_event_callback_func.c | 97 ++ TC/unit/utc_ApplicationFW_appcore_set_i18n_func.c | 83 ++ ...tc_ApplicationFW_appcore_set_rotation_cb_func.c | 88 ++ ..._ApplicationFW_appcore_unset_rotation_cb_func.c | 65 + TC/unit/utc_MODULE_API_func.c.in | 76 ++ app-core.manifest | 5 + appcore-common.pc.in | 13 + appcore-efl.pc.in | 13 + debian/app-template.install.in | 3 + debian/changelog | 864 ++++++++++++ debian/compat | 1 + debian/control | 44 + debian/dirs | 2 + debian/docs | 1 + debian/libappcore-common-0.install.in | 1 + debian/libappcore-common-dev.install.in | 3 + debian/libappcore-efl-0.install.in | 1 + debian/libappcore-efl-dev.install.in | 2 + debian/rules | 115 ++ include/SLP_Appcore_PG.h | 557 ++++++++ include/appcore-common.h | 721 ++++++++++ include/appcore-efl.h | 170 +++ include/appcore-internal.h | 189 +++ include/image/SLP_Appcore_PG_events.png | Bin 0 -> 98265 bytes include/image/SLP_Appcore_PG_lifecycle.png | Bin 0 -> 32877 bytes include/image/SLP_Appcore_PG_overview.png | Bin 0 -> 70991 bytes include/image/SLP_Appcore_PG_rotation.png | Bin 0 -> 42198 bytes include/virtual_canvas.h | 34 + packaging/app-core.spec | 156 +++ packaging/core-efl.target | 15 + src/appcore-X.c | 171 +++ src/appcore-efl.c | 1407 ++++++++++++++++++++ src/appcore-i18n.c | 156 +++ src/appcore-measure.c | 93 ++ src/appcore-noti.c | 181 +++ src/appcore-pmcontrol.c | 57 + src/appcore-rotation.c | 418 ++++++ src/appcore-util.c | 65 + src/appcore.c | 563 ++++++++ src/virtual_canvas.c | 139 ++ 61 files changed, 7645 insertions(+) create mode 100755 .gitignore create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100755 TC/build.sh create mode 100755 TC/execute.sh create mode 100644 TC/tet_code create mode 100644 TC/tet_scen create mode 100644 TC/tetbuild.cfg create mode 100644 TC/tetclean.cfg create mode 100644 TC/tetexec.cfg create mode 100644 TC/unit/Makefile create mode 100755 TC/unit/tc_gen.sh create mode 100644 TC/unit/tslist create mode 100644 TC/unit/utc_ApplicationFW_appcore_efl_main_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_exit_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_get_rotation_state_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_init_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_measure_start_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_measure_time_from_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_measure_time_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_set_event_callback_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_set_i18n_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_set_rotation_cb_func.c create mode 100644 TC/unit/utc_ApplicationFW_appcore_unset_rotation_cb_func.c create mode 100644 TC/unit/utc_MODULE_API_func.c.in create mode 100644 app-core.manifest create mode 100644 appcore-common.pc.in create mode 100644 appcore-efl.pc.in create mode 100644 debian/app-template.install.in create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/dirs create mode 100644 debian/docs create mode 100644 debian/libappcore-common-0.install.in create mode 100644 debian/libappcore-common-dev.install.in create mode 100644 debian/libappcore-efl-0.install.in create mode 100644 debian/libappcore-efl-dev.install.in create mode 100755 debian/rules create mode 100755 include/SLP_Appcore_PG.h create mode 100755 include/appcore-common.h create mode 100755 include/appcore-efl.h create mode 100755 include/appcore-internal.h create mode 100644 include/image/SLP_Appcore_PG_events.png create mode 100644 include/image/SLP_Appcore_PG_lifecycle.png create mode 100644 include/image/SLP_Appcore_PG_overview.png create mode 100755 include/image/SLP_Appcore_PG_rotation.png create mode 100644 include/virtual_canvas.h create mode 100644 packaging/app-core.spec create mode 100644 packaging/core-efl.target create mode 100755 src/appcore-X.c create mode 100755 src/appcore-efl.c create mode 100755 src/appcore-i18n.c create mode 100755 src/appcore-measure.c create mode 100755 src/appcore-noti.c create mode 100755 src/appcore-pmcontrol.c create mode 100755 src/appcore-rotation.c create mode 100755 src/appcore-util.c create mode 100755 src/appcore.c create mode 100755 src/virtual_canvas.c diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..6ab0cd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +build_log +*.log +*.pyc +usr +opt +*.o +*.os +*.exe +packages +binaries +*.ipk +*~ +build-stamp +cmake_build_tmp/ +configure-stamp +debian/files +debian/*.install +debian/*.substvars +debian/*.debhelper +debian/app-template/ +debian/libappcore-common-0/ +debian/libappcore-common-dev/ +debian/libappcore-dbg/ +debian/libappcore-efl-0/ +debian/libappcore-efl-dev/ +debian/libappcore-gtk-0/ +debian/libappcore-gtk-dev/ diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..064881e --- /dev/null +++ b/AUTHORS @@ -0,0 +1,3 @@ +Jayoun Lee +Sewook Park +Jaeho Lee diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bad7798 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,90 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(appcore C) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(LIBDIR "\${prefix}/lib") +SET(INCLUDEDIR "\${prefix}/include") +SET(VERSION_MAJOR 1) +SET(VERSION "${VERSION_MAJOR}.1") + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +IF(DEVICE_PROFILE STREQUAL "wearable") + ADD_DEFINITIONS("-DWEARABLE_PROFILE") +ELSEIF(DEVICE_PROFILE STREQUAL "mobile") + ADD_DEFINITIONS("-DMOBILE_PROFILE") +ENDIF() + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -Wall") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +SET(CMAKE_SKIP_BUILD_RPATH TRUE) + +################################################################# +# Build appcore-common Library +# ------------------------------ +SET(APPCORE_COMMON "appcore-common") +SET(SRCS_common src/appcore.c src/appcore-i18n.c src/appcore-measure.c +# src/appcore-noti.c src/appcore-pmcontrol.c + src/appcore-rotation.c +# src/appcore-util.c + src/appcore-X.c) +SET(HEADERS_common appcore-common.h) + +INCLUDE(FindPkgConfig) +#pkg_check_modules(pkg_common REQUIRED pmapi vconf sensor aul rua dlog x11) +pkg_check_modules(pkg_common REQUIRED vconf sensor aul dlog x11 ecore-x) +FOREACH(flag ${pkg_common_CFLAGS}) + SET(EXTRA_CFLAGS_common "${EXTRA_CFLAGS_common} ${flag}") +ENDFOREACH(flag) + +ADD_LIBRARY(${APPCORE_COMMON} SHARED ${SRCS_common}) +SET_TARGET_PROPERTIES(${APPCORE_COMMON} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${APPCORE_COMMON} PROPERTIES VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${APPCORE_COMMON} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS_common}) +TARGET_LINK_LIBRARIES(${APPCORE_COMMON} ${pkg_common_LDFLAGS} "-ldl") + +CONFIGURE_FILE(${APPCORE_COMMON}.pc.in ${APPCORE_COMMON}.pc @ONLY) + +INSTALL(TARGETS ${APPCORE_COMMON} DESTINATION lib COMPONENT RuntimeLibraries) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPCORE_COMMON}.pc DESTINATION lib/pkgconfig) +FOREACH(hfile ${HEADERS_common}) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${hfile} DESTINATION include/appcore) +ENDFOREACH(hfile) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/SLP_Appcore_PG.h DESTINATION include) + +################################################################# +# Build appcore-efl Library +# ------------------------------ +SET(APPCORE_EFL "appcore-efl") +SET(SRCS_efl src/appcore-efl.c src/virtual_canvas.c) + +SET(HEADERS_efl appcore-efl.h) + +INCLUDE(FindPkgConfig) +IF(DEVICE_PROFILE STREQUAL "wearable") +pkg_check_modules(pkg_efl REQUIRED elementary dlog ecore ecore-x gobject-2.0 glib-2.0 x11 xcomposite ecore-evas ecore-input aul system-resource) +ELSE() +pkg_check_modules(pkg_efl REQUIRED elementary dlog ecore ecore-x gobject-2.0 glib-2.0 x11 xcomposite ecore-evas ecore-input aul) +ENDIF() +FOREACH(flag ${pkg_efl_CFLAGS}) + SET(EXTRA_CFLAGS_efl "${EXTRA_CFLAGS_efl} ${flag}") +ENDFOREACH(flag) + +ADD_LIBRARY(${APPCORE_EFL} SHARED ${SRCS_efl}) +SET_TARGET_PROPERTIES(${APPCORE_EFL} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${APPCORE_EFL} PROPERTIES VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${APPCORE_EFL} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS_efl}) +TARGET_LINK_LIBRARIES(${APPCORE_EFL} ${pkg_efl_LDFLAGS} ${APPCORE_COMMON}) + +CONFIGURE_FILE(${APPCORE_EFL}.pc.in ${APPCORE_EFL}.pc @ONLY) + +INSTALL(TARGETS ${APPCORE_EFL} DESTINATION lib COMPONENT RuntimeLibraries) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPCORE_EFL}.pc DESTINATION lib/pkgconfig) +FOREACH(hfile ${HEADERS_efl}) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${hfile} DESTINATION include/appcore) +ENDFOREACH(hfile) + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9c13a9b --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ +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..98ebeff --- /dev/null +++ b/TC/build.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +export TET_INSTALL_PATH=/scratchbox/tetware # 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/execute.sh b/TC/execute.sh new file mode 100755 index 0000000..2d9df79 --- /dev/null +++ b/TC/execute.sh @@ -0,0 +1,20 @@ +#!/bin/sh +#export TET_INSTALL_PATH=/mnt/nfs/tetware +export TET_INSTALL_PATH=/scratchbox/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 100644 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 100644 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 100644 index 0000000..6192c78 --- /dev/null +++ b/TC/tetbuild.cfg @@ -0,0 +1,3 @@ +TET_OUTPUT_CAPTURE=False +TET_BUILD_TOOL=make +TET_PASS_TC_NAME=True diff --git a/TC/tetclean.cfg b/TC/tetclean.cfg new file mode 100644 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 100644 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..f967994 --- /dev/null +++ b/TC/unit/Makefile @@ -0,0 +1,33 @@ +CC ?= gcc + +TARGETS = \ + utc_ApplicationFW_appcore_efl_main_func \ + utc_ApplicationFW_appcore_init_func \ + utc_ApplicationFW_appcore_exit_func \ + utc_ApplicationFW_appcore_set_rotation_cb_func \ + utc_ApplicationFW_appcore_unset_rotation_cb_func \ + utc_ApplicationFW_appcore_get_rotation_state_func \ + utc_ApplicationFW_appcore_set_i18n_func \ + utc_ApplicationFW_appcore_measure_start_func \ + utc_ApplicationFW_appcore_measure_time_func \ + utc_ApplicationFW_appcore_measure_time_from_func \ + utc_ApplicationFW_appcore_set_event_callback_func + +PKGS = appcore-efl + +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 + +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 100755 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..91c8d1a --- /dev/null +++ b/TC/unit/tslist @@ -0,0 +1,11 @@ +/unit/utc_ApplicationFW_appcore_efl_main_func +/unit/utc_ApplicationFW_appcore_init_func +/unit/utc_ApplicationFW_appcore_exit_func +/unit/utc_ApplicationFW_appcore_set_rotation_cb_func +/unit/utc_ApplicationFW_appcore_unset_rotation_cb_func +/unit/utc_ApplicationFW_appcore_get_rotation_state_func +/unit/utc_ApplicationFW_appcore_set_i18n_func +/unit/utc_ApplicationFW_appcore_measure_start_func +/unit/utc_ApplicationFW_appcore_measure_time_func +/unit/utc_ApplicationFW_appcore_measure_time_from_func +/unit/utc_ApplicationFW_appcore_set_event_callback_func diff --git a/TC/unit/utc_ApplicationFW_appcore_efl_main_func.c b/TC/unit/utc_ApplicationFW_appcore_efl_main_func.c new file mode 100644 index 0000000..eacd09e --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_efl_main_func.c @@ -0,0 +1,132 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_ApplicationFW_appcore_efl_main_func_01(void); +static void utc_ApplicationFW_appcore_efl_main_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_efl_main_func_01, POSITIVE_TC_IDX }, + { utc_ApplicationFW_appcore_efl_main_func_02, NEGATIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +static int app_reset(bundle *b, void *data) +{ + elm_exit(); + return 0; +} + +/** + * @brief Positive test case of appcore_efl_main() + */ +static void utc_ApplicationFW_appcore_efl_main_func_01(void) +{ + int r = 0; + int argc = 1; + char *_argv[] = { + "Testcase", + NULL, + }; + char **argv; + struct appcore_ops ops = { + .reset = app_reset, + }; + + argv = _argv; + r = appcore_efl_main("Testcase", &argc, &argv, &ops); + printf("Return %d\n", r); + if (r) { + tet_infoline("appcore_efl_main() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init appcore_efl_main() + */ +static void utc_ApplicationFW_appcore_efl_main_func_02(void) +{ + int r = 0; + int argc = 1; + char *_argv[] = { + "Testcase", + NULL, + }; + char **argv; + struct appcore_ops ops = { + .reset = app_reset, + }; + + argv = _argv; + r = appcore_efl_main("Testcase", &argc, &argv, NULL); + if (!r) { + tet_infoline("appcore_efl_main() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_efl_main(NULL, &argc, &argv, &ops); + if (!r) { + tet_infoline("appcore_efl_main() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_efl_main("Testcase", NULL, &argv, &ops); + if (!r) { + tet_infoline("appcore_efl_main() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_efl_main("Testcase", &argc, NULL, &ops); + if (!r) { + tet_infoline("appcore_efl_main() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_appcore_exit_func.c b/TC/unit/utc_ApplicationFW_appcore_exit_func.c new file mode 100644 index 0000000..b74e9a6 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_exit_func.c @@ -0,0 +1,58 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_exit_func_01(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_exit_func_01, POSITIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_exit() + */ +static void utc_ApplicationFW_appcore_exit_func_01(void) +{ + appcore_exit(); + tet_result(TET_PASS); +} + diff --git a/TC/unit/utc_ApplicationFW_appcore_get_rotation_state_func.c b/TC/unit/utc_ApplicationFW_appcore_get_rotation_state_func.c new file mode 100644 index 0000000..45c0226 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_get_rotation_state_func.c @@ -0,0 +1,83 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_get_rotation_state_func_01(void); +static void utc_ApplicationFW_appcore_get_rotation_state_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_get_rotation_state_func_01, POSITIVE_TC_IDX }, + { utc_ApplicationFW_appcore_get_rotation_state_func_02, NEGATIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_get_rotation_state() + */ +static void utc_ApplicationFW_appcore_get_rotation_state_func_01(void) +{ + int r = 0; + enum appcore_rm curr; + + r = appcore_get_rotation_state(&curr); + if (r) { + tet_infoline("appcore_get_rotation_state() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init appcore_get_rotation_state() + */ +static void utc_ApplicationFW_appcore_get_rotation_state_func_02(void) +{ + int r = 0; + + r = appcore_get_rotation_state(NULL); + if (!r) { + tet_infoline("appcore_get_rotation_state() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_appcore_init_func.c b/TC/unit/utc_ApplicationFW_appcore_init_func.c new file mode 100644 index 0000000..3c0e283 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_init_func.c @@ -0,0 +1,131 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 + +struct ui_ops { + void *data; + void (*cb_app)(int, void *, bundle *); +}; + + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_ApplicationFW_appcore_init_func_01(void); +static void utc_ApplicationFW_appcore_init_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_init_func_01, POSITIVE_TC_IDX }, + { utc_ApplicationFW_appcore_init_func_02, NEGATIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ + appcore_exit(); +} + +static void ui_cb(int evt, void *data, bundle *b) +{ +} + +/** + * @brief Positive test case of appcore_init() + */ +static void utc_ApplicationFW_appcore_init_func_01(void) +{ + int r = 0; + int argc = 1; + char *argv[] = { + "Testcase", + NULL, + }; + const struct ui_ops ops = { + .cb_app = ui_cb, + }; + + r = appcore_init("Testcase", &ops, argc, argv); + if (r) { + tet_infoline("appcore_init() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init appcore_init() + */ +static void utc_ApplicationFW_appcore_init_func_02(void) +{ + int r = 0; + int argc = 1; + char *argv[] = { + "Testcase", + NULL, + }; + const struct ui_ops ops = { + .cb_app = ui_cb, + }; + + r = appcore_init(NULL, &ops, argc, argv); + if (!r) { + tet_infoline("appcore_init() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_init("Testcase", NULL, argc, argv); + if (!r) { + tet_infoline("appcore_init() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_init("Testcase", &ops, -1, argv); + if (!r) { + tet_infoline("appcore_init() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_init("Testcase", &ops, argc, NULL); + if (!r) { + tet_infoline("appcore_init() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_appcore_measure_start_func.c b/TC/unit/utc_ApplicationFW_appcore_measure_start_func.c new file mode 100644 index 0000000..30eb144 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_measure_start_func.c @@ -0,0 +1,58 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_measure_start_func_01(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_measure_start_func_01, POSITIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_measure_start() + */ +static void utc_ApplicationFW_appcore_measure_start_func_01(void) +{ + appcore_measure_start(); + tet_result(TET_PASS); +} + diff --git a/TC/unit/utc_ApplicationFW_appcore_measure_time_from_func.c b/TC/unit/utc_ApplicationFW_appcore_measure_time_from_func.c new file mode 100644 index 0000000..8af350b --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_measure_time_from_func.c @@ -0,0 +1,87 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 + +#define APPCORE_TESTCASE "APPCORE_TESTCASE" + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_ApplicationFW_appcore_measure_time_from_func_01(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_measure_time_from_func_01, POSITIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ + struct timeval tv; + char buf[1024]; + + gettimeofday(&tv, NULL); + + snprintf(buf, sizeof(buf), "%d %d", (int)tv.tv_sec, (int)tv.tv_usec); + setenv(APPCORE_TESTCASE, buf, 1); +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_measure_time_from() + */ +static void utc_ApplicationFW_appcore_measure_time_from_func_01(void) +{ + int r = 0; + + r = appcore_measure_time_from(APPCORE_TESTCASE); + if (!r) { + tet_infoline("appcore_measure_time_from() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + unsetenv(APPCORE_TESTCASE); + + r = appcore_measure_time_from(APPCORE_TESTCASE); + if (r) { + tet_infoline("appcore_measure_time_from() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + diff --git a/TC/unit/utc_ApplicationFW_appcore_measure_time_func.c b/TC/unit/utc_ApplicationFW_appcore_measure_time_func.c new file mode 100644 index 0000000..245cd9f --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_measure_time_func.c @@ -0,0 +1,66 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_measure_time_func_01(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_measure_time_func_01, POSITIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ + appcore_measure_start(); +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_measure_time() + */ +static void utc_ApplicationFW_appcore_measure_time_func_01(void) +{ + int r = 0; + + r = appcore_measure_time(); + if (r == 0) { + tet_infoline("appcore_measure_time() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + diff --git a/TC/unit/utc_ApplicationFW_appcore_set_event_callback_func.c b/TC/unit/utc_ApplicationFW_appcore_set_event_callback_func.c new file mode 100644 index 0000000..6cb792c --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_set_event_callback_func.c @@ -0,0 +1,97 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_set_event_callback_func_01(void); +static void utc_ApplicationFW_appcore_set_event_callback_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_set_event_callback_func_01, POSITIVE_TC_IDX }, + { utc_ApplicationFW_appcore_set_event_callback_func_02, NEGATIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +static int cb(void *data) +{ + + return 0; +} + + +/** + * @brief Positive test case of appcore_set_event_callback() + */ +static void utc_ApplicationFW_appcore_set_event_callback_func_01(void) +{ + int r = 0; + + r = appcore_set_event_callback(APPCORE_EVENT_LOW_MEMORY, cb, NULL); + if (r) { + tet_infoline("appcore_set_event_callback() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + r = appcore_set_event_callback(APPCORE_EVENT_LOW_MEMORY, NULL, NULL); + if (r) { + tet_infoline("appcore_set_event_callback() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init appcore_set_event_callback() + */ +static void utc_ApplicationFW_appcore_set_event_callback_func_02(void) +{ + int r = 0; + + r = appcore_set_event_callback(-1, cb, NULL); + if (!r) { + tet_infoline("appcore_set_event_callback() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_appcore_set_i18n_func.c b/TC/unit/utc_ApplicationFW_appcore_set_i18n_func.c new file mode 100644 index 0000000..6ec6522 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_set_i18n_func.c @@ -0,0 +1,83 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_set_i18n_func_01(void); +static void utc_ApplicationFW_appcore_set_i18n_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_set_i18n_func_01, POSITIVE_TC_IDX }, + { utc_ApplicationFW_appcore_set_i18n_func_02, NEGATIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_set_i18n() + */ +static void utc_ApplicationFW_appcore_set_i18n_func_01(void) +{ + int r = 0; + + r = appcore_set_i18n("Testcase", NULL); + if (r) { + tet_infoline("appcore_set_i18n() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init appcore_set_i18n() + */ +static void utc_ApplicationFW_appcore_set_i18n_func_02(void) +{ + int r = 0; + + r = appcore_set_i18n(NULL, NULL); + if (!r) { + tet_infoline("appcore_set_i18n() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_appcore_set_rotation_cb_func.c b/TC/unit/utc_ApplicationFW_appcore_set_rotation_cb_func.c new file mode 100644 index 0000000..79a3738 --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_set_rotation_cb_func.c @@ -0,0 +1,88 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_set_rotation_cb_func_01(void); +static void utc_ApplicationFW_appcore_set_rotation_cb_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_set_rotation_cb_func_01, POSITIVE_TC_IDX }, + { utc_ApplicationFW_appcore_set_rotation_cb_func_02, NEGATIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +static int rot_cb(enum appcore_rm rm, void *data) +{ + + return 0; +} + +/** + * @brief Positive test case of appcore_set_rotation_cb() + */ +static void utc_ApplicationFW_appcore_set_rotation_cb_func_01(void) +{ + int r = 0; + + r = appcore_set_rotation_cb(rot_cb, NULL); + if (r) { + tet_infoline("appcore_set_rotation_cb() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init appcore_set_rotation_cb() + */ +static void utc_ApplicationFW_appcore_set_rotation_cb_func_02(void) +{ + int r = 0; + + r = appcore_set_rotation_cb(NULL, NULL); + if (!r) { + tet_infoline("appcore_set_rotation_cb() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_ApplicationFW_appcore_unset_rotation_cb_func.c b/TC/unit/utc_ApplicationFW_appcore_unset_rotation_cb_func.c new file mode 100644 index 0000000..493315c --- /dev/null +++ b/TC/unit/utc_ApplicationFW_appcore_unset_rotation_cb_func.c @@ -0,0 +1,65 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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_appcore_unset_rotation_cb_func_01(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_ApplicationFW_appcore_unset_rotation_cb_func_01, POSITIVE_TC_IDX }, + { NULL, 0}, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of appcore_unset_rotation_cb() + */ +static void utc_ApplicationFW_appcore_unset_rotation_cb_func_01(void) +{ + int r = 0; + + r = appcore_unset_rotation_cb(); + if (r) { + tet_infoline("appcore_unset_rotation_cb() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + diff --git a/TC/unit/utc_MODULE_API_func.c.in b/TC/unit/utc_MODULE_API_func.c.in new file mode 100644 index 0000000..bf9f90c --- /dev/null +++ b/TC/unit/utc_MODULE_API_func.c.in @@ -0,0 +1,76 @@ +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_@MODULE@_@API@_func_01(void); +static void utc_@MODULE@_@API@_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_@MODULE@_@API@_func_01, POSITIVE_TC_IDX }, + { utc_@MODULE@_@API@_func_02, NEGATIVE_TC_IDX }, +}; + +static void startup(void) +{ + int r; +/* + char *err; + r = initailze...; + if (r) { + err = "Error message......."; + tet_infoline(err); + tet_delete(POSITIVE_TC_IDX, err); + tet_delete(NEGATIVE_TC_IDX, err); + } +*/ + +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of @API@() + */ +static void utc_@MODULE@_@API@_func_01(void) +{ + int r = 0; + +/* + r = @API@(...); +*/ + if (r) { + tet_infoline("@API@() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init @API@() + */ +static void utc_@MODULE@_@API@_func_02(void) +{ + int r = 0; + +/* + r = @API@(...); +*/ + if (!r) { + tet_infoline("@API@() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/app-core.manifest b/app-core.manifest new file mode 100644 index 0000000..97e8c31 --- /dev/null +++ b/app-core.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/appcore-common.pc.in b/appcore-common.pc.in new file mode 100644 index 0000000..233ccde --- /dev/null +++ b/appcore-common.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: app-core-common +Description: SAMSUNG Linux platform application library +Version: @VERSION@ +Requires: sensor vconf aul dlog x11 +Libs: -L${libdir} -lappcore-common +Cflags: -I${includedir} -I${includedir}/appcore diff --git a/appcore-efl.pc.in b/appcore-efl.pc.in new file mode 100644 index 0000000..9f6895c --- /dev/null +++ b/appcore-efl.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: app-core-efl +Description: SAMSUNG Linux platform efl application library +Version: @VERSION@ +Requires: elementary appcore-common dlog +Libs: -L${libdir} -lappcore-efl +Cflags: -I${includedir} -I${includedir}/appcore diff --git a/debian/app-template.install.in b/debian/app-template.install.in new file mode 100644 index 0000000..aaa2e86 --- /dev/null +++ b/debian/app-template.install.in @@ -0,0 +1,3 @@ +@PREFIX@/bin/app-gen.sh +@PREFIX@/bin/app3D-gen.sh +@PREFIX@/share/app-template/* diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..7357e83 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,864 @@ +app-core (1.2-22) unstable; urgency=low + + * Add error handle for ecore_x_window_prop_card32_get + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-22 + + -- Jaeho Lee Sun, 13 May 2012 17:50:08 +0900 + +app-core (1.2-21) unstable; urgency=low + + * Updated rotation code + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-21 + + -- Jaeho Lee Tue, 17 Apr 2012 16:47:13 +0900 + +app-core (1.2-20) unstable; urgency=low + + * Add appcore_set_system_resource_reclaiming API + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-20 + + -- Jaeho Lee Thu, 29 Mar 2012 10:42:28 +0900 + +app-core (1.2-19) unstable; urgency=low + + * Fixed compile warnings + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-19 + + -- Jaeho Lee Tue, 20 Mar 2012 13:51:26 +0900 + +app-core (1.2-18) unstable; urgency=low + + * API Changes in elementary + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-18 + + -- Jaeho Lee Tue, 13 Mar 2012 17:45:24 +0900 + +app-core (1.2-17) unstable; urgency=low + + * Added window checking in __get_win_pid() + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-17 + + -- Sewook Park Mon, 05 Mar 2012 17:21:51 +0900 + +app-core (1.2-16) unstable; urgency=low + + * Add aul_finalize() + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-16 + + -- Jaeho Lee Tue, 28 Feb 2012 16:57:59 +0900 + +app-core (1.2-15) unstable; urgency=low + + * Remove rua + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-15 + + -- Jaeho Lee Wed, 15 Feb 2012 19:06:18 +0900 + +app-core (1.2-14) unstable; urgency=low + + * About elm_all_flush issue + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-14 + + -- Jaeho Lee Thu, 26 Jan 2012 17:33:57 +0900 + +app-core (1.2-13) unstable; urgency=low + + * Change window raise to send active request + * Git: slp/pkgs/a/app-core + * Tag: app-core_1.2-13 + + -- Jaeho Lee Wed, 18 Jan 2012 19:31:33 +0900 + +app-core (1.2-12) unstable; urgency=low + + * Add appcore_set_pre_resume_cb API + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-12 + + -- Jaeho Lee Tue, 10 Jan 2012 15:37:07 +0900 + +app-core (1.2-11) unstable; urgency=low + + * remove app-template + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-11 + + -- Jaeho Lee Tue, 06 Dec 2011 11:15:26 +0900 + +app-core (1.2-10) unstable; urgency=low + + * Changed boilerplate + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-10 + + -- Jaeho Lee Mon, 05 Dec 2011 16:40:38 +0900 + +app-core (1.2-9) unstable; urgency=low + + * Change XInternAtom function arg + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-9 + + -- Jaeho Lee Tue, 15 Nov 2011 17:41:00 +0900 + +app-core (1.2-8) unstable; urgency=low + + * Modify XInternAtom function arg + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-8 + + -- Jaeho Lee Tue, 08 Nov 2011 11:22:50 +0900 + +app-core (1.2-7) unstable; urgency=low + + * Changed Boilerplate as per the guideline + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-7 + + -- Jaeho Lee Mon, 07 Nov 2011 16:55:09 +0900 + +app-core (1.2-6) unstable; urgency=low + + * Modify appcore-roration.c + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-6 + + -- Jaeho Lee Mon, 24 Oct 2011 16:39:12 +0900 + +app-core (1.2-5) unstable; urgency=low + + * Fix rotation bug + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-5 + + -- Jaeho Lee Tue, 11 Oct 2011 19:24:34 +0900 + +app-core (1.2-4) unstable; urgency=low + + * Code cleanup + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-4 + + -- Jaeho Lee Tue, 06 Sep 2011 11:31:50 +0900 + +app-core (1.2-3) unstable; urgency=low + + * Code cleanup + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-3 + + -- Jaeho Lee Mon, 05 Sep 2011 20:18:22 +0900 + +app-core (1.2-2) unstable; urgency=low + + * Include stdbool.h + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-2 + + -- Jaeho Lee Mon, 05 Sep 2011 15:58:21 +0900 + +app-core (1.2-1) unstable; urgency=low + + * Fix set i18n bug + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-1 + + -- Jaeho Lee Wed, 31 Aug 2011 19:29:14 +0900 + +app-core (1.2-0) unstable; urgency=low + + * Remove gtk package and sglib dependency + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.2-0 + + -- Jaeho Lee Tue, 30 Aug 2011 22:18:52 +0900 + +app-core (1.1-64) unstable; urgency=low + + * Fix TC build error + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-64 + + -- Jaeho Lee Fri, 19 Aug 2011 15:18:54 +0900 + +app-core (1.1-63) unstable; urgency=low + + * Fix hide callback + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-63 + + -- Jaeho Lee Wed, 17 Aug 2011 15:16:41 +0900 + +app-core (1.1-62) unstable; urgency=low + + * Modify Tc Makefile + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-62 + + -- Jaeho Lee Tue, 16 Aug 2011 14:45:31 +0900 + +app-core (1.1-61) unstable; urgency=low + + * Apply code cleanup + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-61 + + -- Jaeho Lee Wed, 03 Aug 2011 15:55:14 +0900 + +app-core (1.1-60) unstable; urgency=low + + * Fix resume rotation callback on rotation lock state + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-60 + + -- Sewook Park Thu, 28 Jul 2011 12:36:54 +0900 + +app-core (1.1-59) unstable; urgency=low + + * Paunse & resume + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-59 + + -- Jaeho Lee Fri, 22 Jul 2011 13:11:13 +0900 + +app-core (1.1-58) unstable; urgency=low + + * Code cleanup + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-58 + + -- Jaeho Lee Wed, 13 Jul 2011 16:05:54 +0900 + +app-core (1.1-57) unstable; urgency=low + + * Add time format change event + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-57 + + -- Jaeho Lee Fri, 17 Jun 2011 14:48:31 +0900 + +app-core (1.1-56) unstable; urgency=low + + * Modify setlocale call in _set_i18n + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-56 + + -- Jaeho Lee Mon, 06 Jun 2011 15:23:05 +0900 + +app-core (1.1-55) unstable; urgency=low + + * Add region format change event + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-55 + + -- Jaeho Lee Fri, 03 Jun 2011 10:52:16 +0900 + +app-core (1.1-54) unstable; urgency=low + + * Modify appcore-gtk build error + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-54 + + -- Yoonkyong Lee Thu, 28 Apr 2011 20:54:25 +0900 + +app-core (1.1-53) unstable; urgency=low + + * Modify gtk-template + * Deleting ecore event handlers before elm_shutdown + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-53 + + -- Yoonkyong Lee Thu, 28 Apr 2011 14:17:37 +0900 + +app-core (1.1-52) unstable; urgency=low + + * Modify app-template - remove deb. from pkgname + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-52 + + -- Noha Park Thu, 21 Apr 2011 10:38:16 +0900 + +app-core (1.1-51) unstable; urgency=low + + * Modify app-template - remove deb. from pkgname + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-51 + + -- Noha Park Thu, 21 Apr 2011 09:15:02 +0900 + +app-core (1.1-50) unstable; urgency=low + + * Modify app-template for sb2 + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-50 + + -- Noha Park Tue, 05 Apr 2011 14:29:12 +0900 + +app-core (1.1-49) unstable; urgency=low + + * Modify app-template for sb2 + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-49 + + -- Noha Park Tue, 05 Apr 2011 12:09:20 +0900 + +app-core (1.1-48) unstable; urgency=low + + * Disable forcefully setting window focus + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-48 + + -- Yoonkyong Lee Tue, 08 Mar 2011 08:37:58 +0900 + +app-core (1.1-47) unstable; urgency=low + + * disable stack_trim + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-47 + + -- Yoonkyong Lee Fri, 04 Mar 2011 00:21:57 +0900 + +app-core (1.1-46) unstable; urgency=low + + * changelog update + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-46 + + -- Yoonkyong Lee Thu, 03 Mar 2011 22:39:15 +0900 + +app-core (1.1-45) unstable; urgency=low + + * Add appcore_flush_memory() - request from Memory TF + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-45 + + -- Yoonkyong Lee Thu, 03 Mar 2011 16:12:27 +0900 + +app-core (1.1-44) unstable; urgency=low + + * Fix tut-tut message + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-44 + + -- Yoonkyong Lee Mon, 21 Feb 2011 16:09:24 +0900 + +app-core (1.1-43) unstable; urgency=low + + * Enable elm_flush_all + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-43 + + -- Yoonkyong Lee Mon, 14 Feb 2011 10:51:52 +0900 + +app-core (1.1-42) unstable; urgency=low + + * Rollback elm_flush_all temporarily for MWC + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-42 + + -- Yoonkyong Lee Tue, 08 Feb 2011 09:58:20 +0900 + +app-core (1.1-41) unstable; urgency=low + + * Enable elm_flush_all + * Remove deprecated PM-related APIs + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-41 + + -- Yoonkyong Lee Mon, 07 Feb 2011 14:13:48 +0900 + +app-core (1.1-40) unstable; urgency=low + + * Modify default action for low battery + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-40 + + -- Yoonkyong Lee Wed, 26 Jan 2011 08:16:17 +0900 + +app-core (1.1-39) unstable; urgency=low + + * Modify app template + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-39 + + -- Noha Park Mon, 24 Jan 2011 11:29:24 +0900 + +app-core (1.1-38) unstable; urgency=low + + * Modify app template + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-38 + + -- Noha Park Mon, 24 Jan 2011 11:16:09 +0900 + +app-core (1.1-37) unstable; urgency=low + + * Modify app template + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-37 + + -- Noha Park Mon, 24 Jan 2011 11:03:17 +0900 + +app-core (1.1-36) unstable; urgency=low + + * Modify app template + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-36 + + -- Noha Park Wed, 19 Jan 2011 10:45:13 +0900 + +app-core (1.1-35) unstable; urgency=low + + * Modify app template + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-35 + + -- Noha Park Mon, 17 Jan 2011 08:33:26 +0900 + +app-core (1.1-34) unstable; urgency=low + + * Modify measure time and tc + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-34 + + -- Yoonkyong Lee Fri, 07 Jan 2011 20:23:51 +0900 + +app-core (1.1-33) unstable; urgency=low + + * Modify log typo: request from Jayoun Lee + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-33 + + -- Yoonkyong Lee Thu, 06 Jan 2011 19:13:21 +0900 + +app-core (1.1-32) unstable; urgency=low + + * Modify history information + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-32 + + -- Noha Park Thu, 16 Dec 2010 11:01:03 +0900 + +app-core (1.1-31) unstable; urgency=low + + * Remove vconf set for security + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-31 + + -- Noha Park Mon, 13 Dec 2010 12:27:29 +0900 + +app-core (1.1-30) unstable; urgency=low + + * Remove vconf set for security + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-30 + + -- Noha Park Mon, 13 Dec 2010 11:37:06 +0900 + +app-core (1.1-29) unstable; urgency=low + + * add time log: from Jayoun Lee + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-29 + + -- Youmin Ha Sat, 11 Dec 2010 16:56:33 +0900 + +app-core (1.1-28) unstable; urgency=low + + * Modify Low battery level + * Git: slp-source.sec.samsung.net:slp/pkgs/a/app-core + * Tag: app-core_1.1-28 + + -- Noha Park Thu, 09 Dec 2010 12:01:44 +0900 + +app-core (1.1-27) unstable; urgency=low + + * Modify template generation code + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-27 + + -- Noha Park Fri, 03 Dec 2010 17:28:48 +0900 + +app-core (1.1-26) unstable; urgency=low + + * Remove sysman internal dev dependency + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-26 + + -- Noha Park Wed, 01 Dec 2010 13:23:13 +0900 + +app-core (1.1-25) unstable; urgency=low + + * Remove sysman internal dev dependency + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-25 + + -- Noha Park Wed, 01 Dec 2010 10:28:00 +0900 + +app-core (1.1-24) unstable; urgency=low + + * Modify Doxyzen + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-24 + + -- Noha Park Tue, 16 Nov 2010 15:40:30 +0900 + +app-core (1.1-23) unstable; urgency=low + + * add stk_watch_property_notify_for_root API + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-23 + + -- Noha Park Fri, 12 Nov 2010 10:13:37 +0900 + +app-core (1.1-22) unstable; urgency=low + + * update_rua + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-22 + + -- Suchang Woo Mon, 25 Oct 2010 11:10:11 +0900 + +app-core (1.1-21) unstable; urgency=low + + * add VERSION property and set major to SOVERSION + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-21 + + -- Suchang Woo Tue, 19 Oct 2010 18:39:47 +0900 + +app-core (1.1-20) unstable; urgency=low + + * change debug messages + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-20 + + -- Suchang Woo Thu, 14 Oct 2010 16:00:14 +0900 + +app-core (1.1-19) unstable; urgency=low + + * bug fix: get pid from client message + * add STK ISE init + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-19 + + -- Suchang Woo Wed, 13 Oct 2010 15:38:18 +0900 + +app-core (1.1-18) unstable; urgency=low + + * bug fix: GTK build script + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-18 + + -- Suchang Woo Thu, 07 Oct 2010 14:15:01 +0900 + +app-core (1.1-17) unstable; urgency=low + + * add sysman foreground/background API + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-17 + + -- Suchang Woo Wed, 06 Oct 2010 16:10:37 +0900 + +app-core (1.1-16) unstable; urgency=low + + * add GLES template + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-16 + + -- Suchang Woo Tue, 05 Oct 2010 17:18:58 +0900 + +app-core (1.1-15) unstable; urgency=low + + * update PG and doxygen + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-15 + + -- Suchang Woo Fri, 01 Oct 2010 14:24:52 +0900 + +app-core (1.1-14) unstable; urgency=low + + * add rotation lock + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-14 + + -- Suchang Woo Tue, 28 Sep 2010 19:19:52 +0900 + +app-core (1.1-13) unstable; urgency=low + + * add quickpanel state + * check aul API return value + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-13 + + -- Suchang Woo Mon, 20 Sep 2010 13:07:17 +0900 + +app-core (1.1-12) unstable; urgency=low + + * EFL upgrade + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-12 + + -- Suchang Woo Fri, 10 Sep 2010 20:56:34 +0900 + +app-core (1.1-11) unstable; urgency=low + + * print launch time which is from aul to first idle + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-11 + + -- Suchang Woo Tue, 07 Sep 2010 11:19:57 +0900 + +app-core (1.1-10) unstable; urgency=low + + * check a value when Battery low vconf changed + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-10 + + -- Suchang Woo Fri, 27 Aug 2010 16:52:59 +0900 + +app-core (1.1-9) unstable; urgency=low + + * add Programming Guide + * code cleanup + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-9 + + -- Suchang Woo Fri, 27 Aug 2010 15:34:13 +0900 + +app-core (1.1-8) unstable; urgency=low + + * use dlog + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-8 + + -- Suchang Woo Mon, 23 Aug 2010 14:05:29 +0900 + +app-core (1.1-7) unstable; urgency=low + + * increase version for upload + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-7 + + -- Suchang Woo Fri, 20 Aug 2010 20:28:06 +0900 + +app-core (1.1-6) unstable; urgency=low + + * add measure time example to the header file and template code + * change Raise window API: XRaiseWindow() -> XMapRaised() for raising hided + window + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-6 + + -- Suchang Woo Fri, 20 Aug 2010 14:13:19 +0900 + +app-core (1.1-5) unstable; urgency=low + + * print error messages + * set START TIME to environment variable + * bug fix - if appcore_i18n_set failed, i18n_init did not work + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-5 + + -- Wonguk Jeong Fri, 20 Aug 2010 11:01:11 +0900 + +app-core (1.1-4) unstable; urgency=low + + * gtk template has been updated + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-4 + + -- Wonguk Jeong Thu, 19 Aug 2010 09:18:43 +0900 + +app-core (1.1-3) unstable; urgency=low + + * bug fix - appcore_i18n_set did not work + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-3 + + -- Wonguk Jeong Mon, 16 Aug 2010 13:09:49 +0900 + +app-core (1.1-2) unstable; urgency=low + + * app history update routine added + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-2 + + -- Wonguk Jeong Tue, 10 Aug 2010 11:07:54 +0900 + +app-core (1.1-1) unstable; urgency=low + + * Bug fixed - PAUSE/RESUME state handling + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-1 + + -- Wonguk Jeong Fri, 06 Aug 2010 20:49:03 +0900 + +app-core (1.1-0) unstable; urgency=low + + * Re-design: change API, implementation, etc... + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.1-0 + + -- Wonguk Jeong Sat, 31 Jul 2010 11:22:38 +0900 + +app-core (1.0-19) unstable; urgency=low + + * Modify header file + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.0-19 + + -- Sangjung Woo Fri, 16 Jul 2010 14:04:14 +0900 + +app-core (1.0-18) unstable; urgency=low + + * Modify header file for documentation + * Git: 165.213.180.234:/git/slp/pkgs/app-core + * Tag: app-core_1.0-18 + + -- Sangjung Woo Fri, 16 Jul 2010 10:04:14 +0900 + +app-core (1.0-17) unstable; urgency=low + + * Change maintainers + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-17 + + -- Youmin Ha Thu, 08 Jul 2010 16:04:14 +0900 + +app-core (1.0-16) unstable; urgency=low + + * remove dlog-module-name.h and dlog.h + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-16 + + -- Hojun lee Mon, 14 Jun 2010 21:32:33 -0700 + +app-core (1.0-15) unstable; urgency=low + + * bug fix that APPCORE_EVENT_TERMINATE happpens twice + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-15 + + -- Hojun lee Fri, 11 Jun 2010 20:11:27 +0900 + +app-core (1.0-14) unstable; urgency=low + + * Remove utilx_raise_window and utilx dependancy + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-14 + + -- Sangjung Woo Fri, 11 Jun 2010 10:07:10 +0900 + +app-core (1.0-13) unstable; urgency=low + + * Remove utilx_raise_window and utilx dependancy + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-13 + + -- Hojun lee Thu, 10 Jun 2010 20:07:10 +0900 + +app-core (1.0-12) unstable; urgency=low + + * bug fix for heynoti_get_pnoti_name and snoti_name API + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-12 + + -- Hojun lee Wed, 09 Jun 2010 03:38:22 -0700 + +app-core (1.0-11) unstable; urgency=low + + * Remove return_result aul + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-11 + + -- Hojun lee Mon, 07 Jun 2010 05:15:25 -0700 + +app-core (1.0-10) unstable; urgency=low + + * Remove free(t->name) for fixing bugs + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-10 + + -- Hojun lee Sat, 05 Jun 2010 15:17:44 +0000 + +app-core (1.0-9) unstable; urgency=low + + * add XB-Generate-Docs flag to control file + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-9 + + -- Hojun lee Fri, 04 Jun 2010 21:31:49 -0700 + +app-core (1.0-8) unstable; urgency=low + + * modify pc file + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-8 + + -- Hojun lee Fri, 04 Jun 2010 11:29:23 +0900 + +app-core (1.0-7) unstable; urgency=low + + * change for appcore-rotation.c (replace by New sensor APIs) + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-7 + + -- Yongsul Oh Thu, 03 Jun 2010 14:50:56 +0900 + +app-core (1.0-6) unstable; urgency=low + + * update xxx_snoti_name() and xxxx_snoti_name() + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-6 + + -- Hojun Lee Mon, 31 May 2010 21:00:25 -0700 + +app-core (1.0-5) unstable; urgency=low + + * add new APPCORE_EVENT_RESULT_FOR_LAUNCH_SERVICE interface + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-5 + + -- Hojun Lee Mon, 31 May 2010 07:24:03 -0700 + +app-core (1.0-4) unstable; urgency=low + + * modify sensor rotation data type and enum value(rotmode_t->appcore_rotmode_t) + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-4 + + -- Hojun Lee Tue, 25 May 2010 03:37:06 -0700 + +app-core (1.0-3) unstable; urgency=low + + * modify control file + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-3 + + -- Hojun Lee Mon, 24 May 2010 19:13:45 +0900 + +app-core (1.0-2) unstable; urgency=low + + * modify doxygen and change lowmemory and lowbattery event + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-2 + + -- Hojun Lee Wed, 19 May 2010 18:30:23 -0700 + +app-core (1.0-1) unstable; urgency=low + + * Initial Release. + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/app-core-0 + * Tag: app-core_1.0-1 + + -- Hojun Lee Tue, 18 May 2010 07:13:19 -0700 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..6f8c020 --- /dev/null +++ b/debian/control @@ -0,0 +1,44 @@ +Source: app-core +Section: libs +Priority: extra +Maintainer: Jayoun Lee , Sewook Park , Jaeho Lee , Yoonkyong Lee +Uploaders: Wonguk Jeong , Knhoon Baik , Sangjung Woo , Youmin Ha , Noha Park +Build-Depends: debhelper (>= 5), libslp-sensor-dev, libslp-setting-dev, libelm-dev, libaul-1-dev, dlog-dev, libslp-sysman-dev, libglib2.0-dev +Standards-Version: 3.7.2 + +Package: libappcore-common-dev +Section: libs +Architecture: any +Depends: libappcore-common-0 (= ${Source-Version}), libslp-sensor-dev, libslp-setting-dev, libaul-1-dev +XB-Generate-Docs: yes +Description: Samsung Linux platform common application basic (dev) + Samsung Linux platform application basic. + +Package: libappcore-common-0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Samsung Linux platform common application basic + Samsung Linux platform application basic. + +Package: libappcore-efl-dev +Section: libs +Architecture: any +Depends: libappcore-common-0 (= ${Source-Version}), libappcore-common-dev, libelm-dev, libappcore-efl-0 +XB-Generate-Docs: yes +Description: Samsung Linux platform efl application basic (dev) + Samsung Linux platform application basic. + +Package: libappcore-efl-0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Samsung Linux platform efl application basic + Samsung Linux platform application basic. + +Package: libappcore-dbg +Section: debug +Architecture: any +Depends: ${misc:Depends}, libappcore-common-0 (= ${Source-Version}), libappcore-efl-0 (= ${Source-Version}) +Description: Samsung Linux platform application basic (unstripped) + Samsung Linux platform application basic. diff --git a/debian/dirs b/debian/dirs new file mode 100644 index 0000000..ca882bb --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..a0f0008 --- /dev/null +++ b/debian/docs @@ -0,0 +1 @@ +CMakeLists.txt diff --git a/debian/libappcore-common-0.install.in b/debian/libappcore-common-0.install.in new file mode 100644 index 0000000..d39d2b6 --- /dev/null +++ b/debian/libappcore-common-0.install.in @@ -0,0 +1 @@ +@PREFIX@/lib/libappcore-common.so* diff --git a/debian/libappcore-common-dev.install.in b/debian/libappcore-common-dev.install.in new file mode 100644 index 0000000..d3270ad --- /dev/null +++ b/debian/libappcore-common-dev.install.in @@ -0,0 +1,3 @@ +@PREFIX@/include/appcore/appcore-common.h +@PREFIX@/lib/pkgconfig/appcore-common.pc +@PREFIX@/include/SLP_Appcore_PG.h diff --git a/debian/libappcore-efl-0.install.in b/debian/libappcore-efl-0.install.in new file mode 100644 index 0000000..41d479d --- /dev/null +++ b/debian/libappcore-efl-0.install.in @@ -0,0 +1 @@ +@PREFIX@/lib/libappcore-efl.so* diff --git a/debian/libappcore-efl-dev.install.in b/debian/libappcore-efl-dev.install.in new file mode 100644 index 0000000..69bffd7 --- /dev/null +++ b/debian/libappcore-efl-dev.install.in @@ -0,0 +1,2 @@ +@PREFIX@/include/appcore/appcore-efl.h +@PREFIX@/lib/pkgconfig/appcore-efl.pc diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..82be125 --- /dev/null +++ b/debian/rules @@ -0,0 +1,115 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +CFLAGS ?= -Wall -g +CXXFLAGS ?= -Wall -g +LDFLAGS ?= +PREFIX ?= /usr +DATADIR ?= /opt + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 + CXXFLAGS += -O0 +else + CFLAGS += -O2 + CXXFLAGS += -O2 +endif + +LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed + +CMAKE_BUILD_DIR ?= $(CURDIR)/cmake_build_tmp + +configure: configure-stamp +configure-stamp: + dh_testdir + mkdir -p $(CMAKE_BUILD_DIR) && cd $(CMAKE_BUILD_DIR) && \ + CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + + touch configure-stamp + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + cd $(CMAKE_BUILD_DIR) && $(MAKE) + + #docbook-to-man debian/wavplayer.sgml > wavplayer.1 + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + rm -rf $(CMAKE_BUILD_DIR) + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/wavplayer. + cd $(CMAKE_BUILD_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip --dbg-package=libappcore-dbg + dh_compress + dh_fixperms +# dh_perl + 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/SLP_Appcore_PG.h b/include/SLP_Appcore_PG.h new file mode 100755 index 0000000..df4823a --- /dev/null +++ b/include/SLP_Appcore_PG.h @@ -0,0 +1,557 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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. + * + */ + + +/** + @ingroup SLP_PG + @defgroup SLP_PG_APPCORE Application Model and Appcore + @{ + +

Introduction

+ +

Purpose of this document

+ This document demonstrates the basic steps needed to develop application(EFL or GTK) using appcore module in the SLP(Samsung Linux Platform). The document provides a brief introduction to the appcore architecture and explains application life-cycle of appcore. Programmers should develop their applications(EFL or GTK) based on the appcore module. The sample applications can be studied and can be used to develop other applications. + +

Features

+- Support EFL and GTK(including STK) application's basic function +- Support internalization +- Support rotation function +- Support power state function + + + +

Components of Appcore

+@image html SLP_Appcore_PG_overview.png + +- Appcore EFL(libappcore-efl.so) + - It provides appcore_efl_main() which includes elm_init(), elm_run(), and other initializations for EFL application + - Refer to appcore-efl.h +- Appcore common(libappcore-common.so) + - It provides useful rotation function to control sensor’s rotation operation in application + - It provides useful function to process internalization based on GNU gettext + - It provides useful function to control power-state in application + - Refer to appcore-common.h +- Libraries used by Appcore + - EFL and GTK(STK) is a graphic widget library + - Sensor for supporting rotation + - AUL for application's life-cycle + - RUA for task manager + - Vconf for system events (such as low battery, low memory). +@} + @defgroup SLP_PG_APPCORE1 1.Application's life-cycle + @ingroup SLP_PG_APPCORE + @{ + +

Application's life-cycle

+Appcore provides basic life-cycle like the following to manage application in SLP + + + + + +
@image html SLP_Appcore_PG_lifecycle.png + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationDescription
CREATECalled once before the main loop. Initialize the application such as window creation, data structure allocation, and etc.
RESETCalled at the first idler and every "relaunch" message. Reset the application states and data structures.
PAUSECalled when the entire window in this application are invisible. Recommend to suspend the actions related to the visibility.
RESUMECalled when one of the windows in this application is visible. Resume the paused actions.
TERMINATECalled once after the main loop. Release the resources.
+
+Call the main function (appcore_efl_main() with struct appcore_ops filled with the proper function pointers. The functions are called by Appcore at the proper situation. +@code +struct appcore_ops { + void *data; // Callback data + int (*create)(void *); // Called before main loop + int (*terminate)(void *); // Called after main loop + int (*pause)(void *); // Called when every window goes back + int (*resume)(void *); // Called when any window comes on top + int (*reset)(bundle *, void *); // Called at the first idler and every relaunching +}; +@endcode + +@} + @defgroup SLP_PG_APPCORE2 2.Appcore event handling + @ingroup SLP_PG_APPCORE + @{ + +

Appcore event handling

+An Application should perform an action when a system change occurs, such as the battery level goes low. Appcore provides APIs to handle the system changes notified by other frameworks and managers. The following figure shows the relationship between events and callback functions. + +@image html SLP_Appcore_PG_events.png + +Appcore provides appcore_set_event_callback() to handle events from the system. If you set the callback function, it will be called when the event received. Otherwise, Appcore does default behavior which is defined as following. + + + + + + + + + + + + + + + + + + + + + +
EventDescriptionDefault behavior
APPCORE_EVENT_LOW_MEMORYA system memory goes lowcall malloc_trim() to enforce giving back the freed memory
APPCORE_EVENT_LOW_BATTERYA system is out of batteryQuit the main loop
APPCORE_EVENT_LANG_CHANGEA system's language setting is changedReset the environment variable "LANG". This has influence on the function related to internationalization
+ + +@} + @defgroup SLP_PG_APPCORE3 3.Internationalization + @ingroup SLP_PG_APPCORE + @{ + +

Internationalization

+SLP platform uses GNU gettext for Internationalization. +The process of using gettext is as follows: +-# Marking any phrases to be translated using gettext(“phrase”) or gettext_noop(“phrase”) +-# Generating a po file by extracting marked phrases using a xgettext command. +-# Modifying the po file and entering a translated phrase for the corresponding phrase. +-# Compiling a po file into a mo file using a msgfmt command. +-# Installing mo files into proper locale directories. +-# gettext() returns a properly translated phrase while an application is running. + +For example, we have the following source code +@code +printf(“%s\n”, gettext(“Hello”)); +@endcode + +Then, as you can see, we can have the following po file using xgettext, +@code +#: hello.c:41 +msgid "Hello" +msgstr "" +@endcode + +And we can enter a translated phrase as the following, +@code +#: hello.c:41 +msgid "Hello" +msgstr "안녕하세요" // Hello in Korean +@endcode + +Finally we generate and install a mo file. In doing so, an application will print out "안녕하세요" instead of "Hello", if the applied language is Korean. + +appcore_set_i18n() has been introduced to achieve an internationalization which requires information on a mo file's name and its installed directory. +@code +int appcore_set_i18n(const char *domainname, const char *dirname) +@endcode + +The first parameter, domainname, a mo file’s name and the second one, dirname, is the directory.
+In general, a mo file will be installed in the following fashion, dirname/locale/category/domainname.mo. locale is a locale’s name, such as ‘ko’ and ‘ja’, and category is LC_MESSAGES. For instance, a mo file has been installed in /usr/share/locale/ko/LC_MESSAGES/example.mo, and then dirname becomes /usr/share/locale.
+Typically, mo files will be installed in ${prefix}/share/locale. + +Generally the following macros are defined for easy to use gettext() +@code +#define _(str) gettext(str) +#define gettext_noop(str) (str) +#define N_(str) gettext_noop(str) +@endcode + +N_() macro only extracts any marked phrases using xgettext command, it will not do anything in the action. This macro is used to handle an array of phrases. Since gettext() cannot be called in declaration of an array, we let N_() macro extract phrases and then call gettext(). Let’s look at the following example. + +@code +static const char *messages[] = { + N_(“Hello”), + N_(“World”) +}; +… +printf(“Message: %s\n”, _(messages[0]); +… +@endcode + +In doing so, we now can handle phrases in an array as same as we do for the following. + +@code +printf(“Message: %s\n”, _(“Hello”); +@endcode + +For more details, refer to GNU gettext manual (http://www.gnu.org/software/gettext/manual/gettext.html) + +@} + @defgroup SLP_PG_APPCORE4 4.Rotation + @ingroup SLP_PG_APPCORE + @{ + +

Rotation

+An Application can display its UI in either landscape or portrait mode. The application registers to receive rotation events from the system with the appcore_set_rotation_cb() API. The system automatically calls the registered user's callback whenever the sensor framework detects that the current rotation status has changed. This continues until appcore_unset_rotation_cb() is called. + +@code +enum appcore_rm { + APPCORE_RM_UNKNOWN, + APPCORE_RM_PORTRAIT_NORMAL , // Portrait mode + APPCORE_RM_PORTRAIT_REVERSE , // Portrait upside down mode + APPCORE_RM_LANDSCAPE_NORMAL , // Left handed landscape mode + APPCORE_RM_LANDSCAPE_REVERSE , // Right handed landscape mode +}; + +int appcore_set_rotation_cb(int (*cb)(enum appcore_rm, void *), void *data); +int appcore_unset_rotation_cb(void); +int appcore_get_rotation_state(enum appcore_rm *curr); +@endcode + +enum appcore_rm has portrait, portrait upside down, left handed landscape, and right handed landscape mode. The following is an each mode. +@image html SLP_Appcore_PG_rotation.png + +When the registered callback is called, it receives the current mode state as the first argument. According to the received mode state, the application should rotate the window, resize window to changed screen size and composite the screen. + +@} + @defgroup SLP_PG_APPCORE5 5.Using code template + @ingroup SLP_PG_APPCORE + @{ + +

Using code template

+We provide a code template for reference and convenience. You can generate a code template using the script "app-gen.sh" which is included in the app-template package. + +The usage as follow: +@code +# app-gen.sh +Usage) app-gen.sh dest app_name [EFL|GTK] + app_name does not support _ string because of debian usage." + +ex) + EFL application: + # app-gen.sh ~/efl_app MyApp + + GTK application: + # app-gen.sh /home/app/gtk_app TestApp GTK + +@endcode + +Let's make a simple application using template +-# Install app-template package +@code +# apt-get install app-template +@endcode +-# Generate a code template +@code +# app-gen.sh ~/apps/simple simple EFL +@endcode +-# Build a package +@code +# cd ~/apps/simple +# dpkg-buildpackage -sa -rfakeroot +@endcode +@} + @defgroup SLP_PG_APPCORE6 6.Example: EFL Apps + @ingroup SLP_PG_APPCORE + @{ + +

Example: EFL application

+ +Header example +@code +12 #ifndef __APP_COMMON_H__ +13 #define __APP_COMMON_H__ +14 +15 #include +16 +17 #if !defined(PACKAGE) +18 # define PACKAGE "example" // for appcore_set_i18n() +19 #endif +20 +21 #if !defined(LOCALEDIR) +22 # define LOCALEDIR "/opt/apps/com.slp.example/share/locale" // for appcore_set_i18n() +23 #endif +24 +25 #if !defined(EDJDIR) +26 # define EDJDIR "/opt/apps/com.slp.example/share/edje" +27 #endif +28 +29 #define EDJ_FILE EDJDIR "/" PACKAGE ".edj" +30 #define GRP_MAIN "main" +31 +32 struct appdata +33 { +34 Evas_Object *win; +35 Evas_Object *ly_main; +36 +37 // add more variables here +38 }; +39 +40 #endif // __APP_COMMON_H__ +@endcode + +Source example +@code +12 #include +13 #include +14 #include +15 +16 #include "example.h" +17 +18 struct text_part { // this for internationalization +19 char *part; +20 char *msgid; +21 }; +22 +23 static struct text_part main_txt[] = { +24 { "txt_title", N_("Application template"), }, +25 { "txt_mesg", N_("Click to exit"), }, // N_() is do nothing. Only for extracting the string +26 }; +27 +28 +29 static void win_del(void *data, Evas_Object *obj, void *event) +30 { +31 elm_exit(); +32 } +33 +34 static void main_quit_cb(void *data, Evas_Object *obj, +35 const char *emission, const char *source) +36 { +37 elm_exit(); +38 } +39 +40 static void update_ts(Evas_Object *eo, struct text_part *tp, int size) +41 { +42 int i; +43 +44 if (eo == NULL || tp == NULL || size < 0) +45 return; +46 +47 for (i = 0; i < size; i++) { +48 if (tp[i].part && tp[i].msgid) +49 edje_object_part_text_set(eo, +50 tp[i].part, _(tp[i].msgid)); // _() return translated string +51 } +52 } +53 +54 static int lang_changed(void *data) // language changed callback +55 { +56 struct appdata *ad = data; +57 +58 if (ad->ly_main == NULL) +59 return 0; +60 +61 update_ts(elm_layout_edje_get(ad->ly_main), main_txt, +62 sizeof(main_txt)/sizeof(main_txt[0])); +63 +64 return 0; +65 } +66 +67 static int rotate(enum appcore_rm m, void *data) // rotation callback +68 { +69 struct appdata *ad = data; +70 int r; +71 +72 if (ad == NULL || ad->win == NULL) +73 return 0; +74 +75 switch(m) { +76 case APPCORE_RM_PORTRAIT_NORMAL: +77 r = 0; +78 break; +79 case APPCORE_RM_PORTRAIT_REVERSE: +80 r = 180; +81 break; +82 case APPCORE_RM_LANDSCAPE_NORMAL: +83 r = 270; +84 break; +85 case APPCORE_RM_LANDSCAPE_REVERSE: +86 r = 90; +87 break; +88 default: +89 r = -1; +90 break; +91 } +92 +93 if (r >= 0) // Using this API, you can implement the rotation mode easily +94 elm_win_rotation_with_resize_set(ad->win, r); +95 +96 return 0; +97 } +98 +99 static Evas_Object* create_win(const char *name) +100 { +101 Evas_Object *eo; +102 int w, h; +103 +104 eo = elm_win_add(NULL, name, ELM_WIN_BASIC); +105 if (eo) { +106 elm_win_title_set(eo, name); +107 elm_win_borderless_set(eo, EINA_TRUE); +108 evas_object_smart_callback_add(eo, "delete,request", +109 win_del, NULL); +110 ecore_x_window_size_get(ecore_x_window_root_first_get(), // get root window(screen) size +111 &w, &h); +112 evas_object_resize(eo, w, h); +113 } +114 +115 return eo; +116 } +117 +118 static Evas_Object* load_edj(Evas_Object *parent, const char *file, +119 const char *group) +120 { +121 Evas_Object *eo; +122 int r; +123 +124 eo = elm_layout_add(parent); +125 if (eo) { +126 r = elm_layout_file_set(eo, file, group); +127 if (!r) { +128 evas_object_del(eo); +129 return NULL; +130 } +131 +132 evas_object_size_hint_weight_set(eo, +133 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); +134 } +135 +136 return eo; +137 } +138 +139 static int app_create(void *data) +140 { +141 struct appdata *ad = data; +142 Evas_Object *win; +143 Evas_Object *ly; +144 int r; +145 +146 // create window +147 win = create_win(PACKAGE); +148 if (win == NULL) +149 return -1; +150 ad->win = win; +151 +152 // load edje +153 ly = load_edj(win, EDJ_FILE, GRP_MAIN); +154 if (ly == NULL) +155 return -1; +156 elm_win_resize_object_add(win, ly); // This can make the EDJE object fitted in window size +157 edje_object_signal_callback_add(elm_layout_edje_get(ly), +158 "EXIT", "*", main_quit_cb, NULL); +159 ad->ly_main = ly; +160 evas_object_show(ly); +161 +166 lang_changed(ad); // call the language changed callback to update strings +167 +168 evas_object_show(win); +169 +170 // add system event callback +171 appcore_set_event_callback(APPCORE_EVENT_LANG_CHANGE, +172 lang_changed, ad); +173 +174 appcore_set_rotation_cb(rotate, ad); // set rotation callback +175 +176 // appcore measure time example +177 printf("from AUL to %s(): %d msec\n", __func__, +178 appcore_measure_time_from("APP_START_TIME")); +179 +180 appcore_measure_start(); +181 return 0; +182 } +183 +184 static int app_terminate(void *data) // terminate callback +185 { +186 struct appdata *ad = data; +187 +188 if (ad->ly_main) +189 evas_object_del(ad->ly_main); +190 +191 if (ad->win) +192 evas_object_del(ad->win); +193 +194 return 0; +195 } +196 +197 static int app_pause(void *data) // pause callback +198 { +199 struct appdata *ad = data; +200 +201 return 0; +202 } +203 +204 static int app_resume(void *data) // resume callback +205 { +206 struct appdata *ad = data; +207 +208 return 0; +209 } +210 +211 static int app_reset(bundle *b, void *data) // reset callback +212 { +213 struct appdata *ad = data; +214 +215 // appcore measure time example +216 printf("from AUL to %s(): %d msec\n", __func__, +217 appcore_measure_time_from("APP_START_TIME")); +218 printf("from create to %s(): %d msec\n", __func__, +219 appcore_measure_time()); +220 +221 if (ad->win) +222 elm_win_activate(ad->win); // You should make one of the window on top +223 +224 return 0; +225 } +226 +227 int main(int argc, char *argv[]) +228 { +229 struct appdata ad; +230 struct appcore_ops ops = { // fill the appcore_ops with callback functions +231 .create = app_create, +232 .terminate = app_terminate, +233 .pause = app_pause, +234 .resume = app_resume, +235 .reset = app_reset, +236 }; +237 +238 // appcore measure time example +239 printf("from AUL to %s(): %d msec\n", __func__, +240 appcore_measure_time_from("APP_START_TIME")); +241 +242 memset(&ad, 0x0, sizeof(struct appdata)); +243 ops.data = &ad; +244 +245 return appcore_efl_main(PACKAGE, &argc, &argv, &ops); // start mainloop +246 } +@endcode + + @} +**/ diff --git a/include/appcore-common.h b/include/appcore-common.h new file mode 100755 index 0000000..8559511 --- /dev/null +++ b/include/appcore-common.h @@ -0,0 +1,721 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 __APPCORE_COMMON_H__ +#define __APPCORE_COMMON_H__ + +/** + * @file appcore-common.h + * @version 1.1 + * @brief This file contains APIs of the Appcore library + */ + +/** + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup Appcore Appcore + * @version 1.1 + * @brief A base library for application + * + */ + +/** + * @addtogroup Appcore + * @{ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ +#define _(str) gettext(str) /**< gettext alias */ +#endif +#define gettext_noop(str) (str) /**< keyword for xgettext + to extract translatable strings */ +#define N_(str) gettext_noop(str) /**< gettext_noop alias */ + +/** + * System global events related to the application + * @see appcore_set_event_callback() + */ +enum appcore_event { + APPCORE_EVENT_UNKNOWN, + /**< Unknown event */ + APPCORE_EVENT_LOW_MEMORY, + /**< Low memory */ + APPCORE_EVENT_LOW_BATTERY, + /**< Low battery */ + APPCORE_EVENT_LANG_CHANGE, + /**< Language setting is changed */ + APPCORE_EVENT_REGION_CHANGE, + /**< Region setting is changed */ +}; + +/** + * Rotaion modes + * @see appcore_set_rotation_cb(), appcore_get_rotation_state() + */ +enum appcore_rm { + APPCORE_RM_UNKNOWN, + /**< Unknown mode */ + APPCORE_RM_PORTRAIT_NORMAL, + /**< Portrait mode */ + APPCORE_RM_PORTRAIT_REVERSE, + /**< Portrait upside down mode */ + APPCORE_RM_LANDSCAPE_NORMAL, + /**< Left handed landscape mode */ + APPCORE_RM_LANDSCAPE_REVERSE, + /**< Right handed landscape mode */ +}; + +/** + * Time format + * @see appcore_get_timeformat() + */ +enum appcore_time_format { + APPCORE_TIME_FORMAT_UNKNOWN, + APPCORE_TIME_FORMAT_12, + APPCORE_TIME_FORMAT_24, +}; + +/** + * Appcore operations which are called during the application life-cycle + * @see appcore_efl_main() + */ +struct appcore_ops { + void *data; + /**< Callback data */ + int (*create) (void *); + /**< Called before main loop \n + If this returns non-zero, Appcore does not run the main loop. */ + int (*terminate) (void *); + /**< Called after main loop */ + int (*pause) (void *); + /**< Called when every window goes back */ + int (*resume) (void *); + /**< Called when any window comes on top */ + int (*reset) (bundle *, void *); + /**< Called at the first idler + and every relaunching */ + void *reserved[6]; + /**< Reserved */ + }; + +/** + * @par Description: + * Set the callback function which is called when the event occurs. + * + * @par Purpose: + * This function sets a callback function for events from the system. + * Callback function is invoked every time the event occurs. + * + * @par Typical use case: + * To do something when predefined events (enum appcore_event) occur, use this API + * + * @par Method of function operation: + * Using Heynoti subscription, Vconf changed callback, and AUL, Appcore invokes the registered callback function. + * + * @par Important notes: + * Only one callback function can be set. If cb is NULL, unset the callback function about the event.\n + * Default behavior is performed when the specified event callback doesn't have registered. + * + * @param[in] event System event + * @param[in] cb callback function + * @param[in] data callback function data + * + * @return 0 on success, -1 on error (errno set) + * + * @par Errors: + * EINVAL - Invalid event type + * + * @pre None. + * @post Callback is set/unset. + * @see None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +static int _lang_changed(void *); +static int _low_battery(void *); +static int _low_memory(void *); +static int _region_changed(void *); + +int add_callbacks(struct appdata *data) +{ + int r; + + r = appcore_set_event_callback(APPCORE_EVENT_LANG_CHANGE, _lang_changed, + data); + if (r == -1) { + // add exception handling + } + + r = appcore_set_event_callback(APPCORE_EVENT_LOW_BATTERY, _low_battery, + data); + if (r == -1) { + // add exception handling + } + + r = appcore_set_event_callback(APPCORE_EVENT_LOW_MEMORY, _low_memory, + data); + if (r == -1) { + // add exception handling + } + + r = appcore_set_event_callback(APPCORE_EVENT_REGION_CHANGE, + _region_changed, data); + if (r == -1) { + // add exception handling + } + + return 0; +} + * @endcode + * + */ +int appcore_set_event_callback(enum appcore_event event, + int (*cb)(void *), void *data); + +/** + * @par Description: + * Set a rotation callback + * + * @par Purpose: + * This function sets a callback function for rotation events. Callback function is invoked every time the rotation mode is changed. + * + * @par Typical use case: + * To do something when the rotation mode is changed, use this API + * + * @par Method of function operation: + * Appcore receives rotation change from Sensor framework. When Appcore receive the change, it invokes the registered callback function. + * + * @par Important notes: + * Locks the rotation mode, the registered callback is not invoked. + * + * @param[in] cb callback function + * @param[in] data callback function data + * + * @return 0 on success, -1 on error (errno set) + * + * @par Errors: + * EINVAL - cb is NULL + * EALREADY - rotation callback function already registered + * + * @pre Callback is not set. + * @post None. + * @see appcore_unset_rotation_cb(), appcore_get_rotation_state() + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +static int _rot_cb(enum appcore_rm, void *); + +... +{ + int r; + + r = appcore_set_rotation_cb(_rot_cb, data); + if (r == -1) { + // add exception handling + } + + ... +} + * @endcode + * + */ +int appcore_set_rotation_cb(int (*cb) (enum appcore_rm, void *), + void *data); + +/** + * @par Description: + * Unset a rotation callback + * + * @par Purpose: + * This function unsets a callback function for rotation events. + * + * @return 0 on success, -1 on error + * + * @pre Callback is set by appcore_set_rotation_cb(). + * @post None. + * @see appcore_set_rotation_cb(), appcore_get_rotation_state() + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + int r; + + ... + + r = appcore_unset_rotation_cb(); + if (r == -1) { + // add exception handling + } + ... +} + * @endcode + * + */ +int appcore_unset_rotation_cb(void); + +/** + * @par Description: + * Get the current rotation mode. + * + * @par Purpose: + * To get the current rotation mode, use this API. + * + * @par Method of function operation: + * This function gets the current rotation mode from Sensor framework. + * + * @param[out] curr current rotation mode\n + * If Sensor framework is not working, curr is set to APPCORE_RM_UNKNOWN. + * + * @return 0 on success, -1 on error (errno set) + * + * @par Errors: + * EINVAL - curr is NULL + * + * @pre None. + * @post None. + * @see appcore_set_rotation_cb(), appcore_unset_rotation_cb() + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + int r; + enum appcore_rm curr; + + ... + + r = appcore_get_rotation_state(&curr); + if (r == -1) { + // add exception handling + } + ... +} + * @endcode + * + */ +int appcore_get_rotation_state(enum appcore_rm *curr); + +/** + * @par Description: + * Get the current time format. + * + * @par Purpose: + * To get the current time format, use this API. + * + * @par Method of function operation: + * This function gets the current time format from vconf. + * + * @param[out] timeformat current time format\n + * If vconf is not working, timeformat is set to APPCORE_TIME_FORMAT_UNKNOWN. + * + * @return 0 on success, -1 on error (errno set) + * + * @par Errors: + * EINVAL - timeformat is NULL + * + * @pre None. + * @post None. + * @see None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + int r; + enum appcore_time_format timeformat; + + ... + + r = appcore_get_timeformat(&timeformat); + if (r == -1) { + // add exception handling + } + ... +} + * @endcode + * + */ +int appcore_get_timeformat(enum appcore_time_format *timeformat); + +/** + * @par Description: + * Set the information for the internationalization. + * + * @par Purpose: + * This function prepares to internationalize. To use gettext, use this API. + * + * @par Typical use case: + * This function provides convenience for using gettext. + * + * @par Method of function operation: + * Calls setlocale(), bindtextdomain() and textdomain() internally. + * + * @par Corner cases/exceptions: + * If dirname is NULL, the previously set base directory is used. Typically, it is /usr/share/locale. + * + * @param[in] domainname a message domain name(text domain name) \n Must be a non-empty string. + * @param[in] dirname the base directory for message catalogs belonging to the specified domain \n + * + * @return 0 on success, -1 on error (errno set) + * + * @par Errors: + * EINVAL - domain is NULL + * + * @pre None. + * @post The environment variable LANG is set or changed. + * @see None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + int r; + + ... + + r = appcore_set_i18n("i18n_example", NULL); + if (r == -1) { + // add exception handling + } + ... +} + * @endcode + * + */ +int appcore_set_i18n(const char *domainname, const char *dirname); + +/** + * @par Description: + * Set the measuring start time + * + * @par Purpose: + * To measure the time, the start time should be set. This function set the start point. + * + * @par Typical use case: + * It is used to measure the time for doing something. \n + * This function set the start point. And, appcore_measure_time() returns + * the elapsed time from the start point. + * + * @see appcore_measure_time() + * + * @par Method of function operation: + * Store the current time to the internal variable. + * + * @pre None. + * @post Current time is saved to the internal space. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + ... + appcore_measure_start(); + + // do something + + printf("it takes %d msec to do something\n", appcore_measure_time()); + ... +} + * @endcode + * + */ +void appcore_measure_start(void); + +/** + * @par Description: + * Measure the time from appcore_measure_start() + * + * @par Purpose: + * To measure the elapsed time from the start point. + * + * @par Typical use case: + * It is used to measure the time for doing something. \n + * This function returns the elapsed time from the start point set by appcore_measure_start(). + * + * @see appcore_measure_start() + * + * @par Method of function operation: + * This function subtracts the current time from the start point. + * + * @par Corner cases/exceptions: + * If the start point is not set, returns 0. + * + * @return Milliseconds from appcore_measure_start() + * + * @pre None. + * @post None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + ... + appcore_measure_start(); + + // do something + + printf("it takes %d msec to do something\n", appcore_measure_time()); + ... +} + * @endcode + * + */ +int appcore_measure_time(void); + +/** + * @par Description: + * Measure the time from a time specified in environment variable. + * + * @par Purpose: + * To measure the elapsed time from a time specified in environment variable. + * + * @par Typical use case: + * It is used to measure the time from a time set by external. + * This function returns the elapsed time from a time specified in environment variable. + * + * @see appcore_measure_start() + * + * @par Method of function operation: + * This function subtracts the current time from a time specified in environment variable. + * + * @par Corner cases/exceptions: + * If envnm is NULL, "APP_START_TIME" set by launcher is used. + * If the environment variable is not set or invalid format, returns 0. + * + * @param[in] envnm environment variable name which has + * the start time (format: "%u %u", seconds, micro seconds) + * + * @return Milliseconds from a time specified in environment variable + * + * @pre None. + * @post None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + ... + + // do something + + printf("it takes %d msec from APP_START\n", + appcore_measure_time_from("APP_START_TIME")); + ... +} + * @endcode + * + */ +int appcore_measure_time_from(const char *envnm); + +/** + * Appcore UI operaions. Internal use only. + */ +struct ui_ops; + +/** + * @par Description: + * Appcore init. Internal use only + * + * @par Important notes: + * Except special case, NEVER use this. Use the appcore EFL or GTK instead of this. + * + * @param[in] name Application name used for text domain name + * @param[in] ops UI operations + * @param[in] argc a count of the arguments + * @param[in] argv an array of pointers to the strings which are those arguments + * + * @return 0 on succes, -1 on error (errno set) + * + * @par Errors: + * EINVAL - ops or ops's callback is NULL \n + * EALREADY - Appcore already in operation \n + * + * @pre None. + * @post None. + * @see appcore_exit() + * @remarks Internal use only. + * + */ +int appcore_init(const char *name, const struct ui_ops *ops, + int argc, char **argv); + +/** + * @par Description: + * Appcore exit. Internal use only. + * + * @par Important notes: + * Except special case, NEVER use this. + * + * @pre None. + * @post None. + * @see appcore_init() + * @remarks Internal use only. + * + */ +void appcore_exit(void); + + +/** + * @par Description: + * Utility function for memory flushing + * + * @par Purpose: + * To flush memory + * + * @par Method of function operation: + * Calls application-specific memory flushing tool (e.g., elm_flush_all() for EFL), + * sqlite3_release_memory() if sqlite3 is used, and malloc_trim(). Also, trims native stack. + * + * @par Important notes: + * Currently, this function is automatically called in the following 2 cases:\n + * (1) when the application enters into the pause state and\n + * (2) when low memory event is invoked and the application is on pause.\n + * Developers can use this function when they want extra memory flush utility. + * + * @return 0 on success, -1 on error + * + * @pre Appcore is already initialized. + * @post Memory for the application is flushed. + * @see None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +{ + int r; + + ... + r = appcore_flush_memory(); + if (r == -1) { + // add exception handling + } + + ... +} + * @endcode + * + */ +int appcore_flush_memory(void); + +/** + * @par Description: + * Set a open callback + * Only when application is running, if aul_open api is called, then this callback function is called. + * If your open_cb function return -1, then appcore doesn't raise window. + * + * @param[in] cb callback function + * @param[in] data callback function data + * + * @return 0 on success, -1 on error (errno set) + * + * @pre None + * @post None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +... + +static int _open_cb(enum appcore_rm, void *); + +... +{ + int r; + + r = appcore_set_open_cb(_open_cb, data); + if (r == -1) { + // add exception handling + } + + ... +} + * @endcode + * + */ +int appcore_set_open_cb(int (*cb) (void *), void *data); + +char *appcore_get_caller_appid(void); + +#ifdef __cplusplus +} +#endif +/** + * @} + */ +/** + * @} + */ +#endif /* __APPCORE_COMMON_H__ */ diff --git a/include/appcore-efl.h b/include/appcore-efl.h new file mode 100755 index 0000000..794734a --- /dev/null +++ b/include/appcore-efl.h @@ -0,0 +1,170 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 __APPCORE_ELF_H__ +#define __APPCORE_ELF_H__ + +/** + * @file appcore-efl.h + * @version 1.1 + * @brief This file contains APIs of the Appcore EFL library + */ + +/** + * @addtogroup APPLICATION_FRAMEWORK + * @{ + * + * @defgroup Appcore_EFL Appcore EFL + * @version 1.1 + * @brief A base library for EFL application based on Appcore + * + */ + +/** + * @addtogroup Appcore_EFL + * @{ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @par Description: + * This is a main function for EFL application on SLP platform. \n + * Refer to programming guide for the details. + * + * @par Purpose: + * To develop an application using EFL on this platform. + * + * @par Method of function operation: + * Initialize the EFL, internationalization, and notifications + * for receiving system events such as rotation, low battery, etc.\n + * And, start an ecore mainloop. + * + * @param[in] name Application name + * @param[in] argc A count of the arguments + * @param[in] argv An array of pointers to the strings which are those arguments + * @param[in] ops Appcore operations + * + * @return 0 on success, -1 on error (errno set) + * + * @par Errors: + * EALREADY - mainloop already started \n + * EINVAL - one of parameters is NULL \n + * ECANCELED - create() callback returns error (none zero value) \n + * + * @par Corner cases/exceptions: + * If ops has no callback function, this function just starts a mainloop. + * + * @par Known issues/bugs: + * If errno set another value, check the dlog message. + * This doesn't care internal errno set. + * + * @pre None. + * @post None. + * @see None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +static int _create(void *); +static int _reset(bundle *, void *); + +int main(int argc, char *argv[]) +{ + int r; + const char *name; + struct appcore_ops ops = { + .create = _create, + .reset = _reset, + ... + }; + + ... + + r = appcore_efl_main(name, &argc, &argv, &ops); + if (r) { + // add exception handling + perror("Appcore EFL main"); + } +} + * @endcode + * + */ +int appcore_efl_main(const char *name, int *argc, char ***argv, + struct appcore_ops *ops); + +/** + * @par Description: + * This API sets system resource reclaiming. + * + * @par Purpose: + * When this is not enabled, the application doesn't reclaim system resource. + * + * @param[in] enable Application name + * + * @return 0 on success, -1 on error (errno set) + * + * + * @pre None. + * @post None. + * @see None. + * @remarks None. + * + * @par Sample code: + * @code +#include + +int _create(void *data) +{ + int r; + + ... + r = appcore_set_system_resource_reclaiming(FALSE); + if (r) { + // add exception handling + perror("appcore_set_system_resource_reclaiming"); + } + ... +} + * @endcode + * + */ +int appcore_set_system_resource_reclaiming(bool enable); + +#ifdef __cplusplus +} +#endif +/** + * @} + */ +/** + * @} + */ +#endif /* __APPCORE_ELF_H__ */ diff --git a/include/appcore-internal.h b/include/appcore-internal.h new file mode 100755 index 0000000..d22ddee --- /dev/null +++ b/include/appcore-internal.h @@ -0,0 +1,189 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 __APPCORE_INTERNAL_H__ +#define __APPCORE_INTERNAL_H__ + +#define LOG_TAG "APP_CORE" + +#include +#include +#include "appcore-common.h" + + +#ifndef EXPORT_API +# define EXPORT_API __attribute__ ((visibility("default"))) +#endif + +# define _ERR(fmt, arg...) LOGE(fmt, ##arg) +# define _INFO(...) LOGI(__VA_ARGS__) +# define _DBG(...) LOGD(__VA_ARGS__) + +#define _warn_if(expr, fmt, arg...) do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + } \ + } while (0) + +#define _ret_if(expr) do { \ + if (expr) { \ + return; \ + } \ + } while (0) + +#define _retv_if(expr, val) do { \ + if (expr) { \ + return (val); \ + } \ + } while (0) + +#define _retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + return; \ + } \ + } while (0) + +#define _retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + _ERR(fmt, ##arg); \ + return (val); \ + } \ + } while (0) + +#define goto_if(expr, val) do { \ + if(expr) { \ + _ERR("(%s) -> goto", #expr); \ + goto val; \ + } \ + } while (0) + +#define break_if(expr) { \ + if(expr) { \ + _ERR("(%s) -> break", #expr); \ + break; \ + } \ + } + +#define continue_if(expr) { \ + if(expr) { \ + _ERR("(%s) -> continue", #expr); \ + continue; \ + } \ + } + +/** + * Appcore internal state + */ +enum app_state { + AS_NONE, + AS_CREATED, + AS_RUNNING, + AS_PAUSED, + AS_DYING, +}; + +/** + * Appcore internal event + */ +enum app_event { + AE_UNKNOWN, + AE_CREATE, + AE_TERMINATE, + AE_PAUSE, + AE_RESUME, + AE_RESET, + AE_LOWMEM_POST, + AE_MEM_FLUSH, + AE_MAX +}; + +/** + * Appcore internal system event + */ +enum sys_event { + SE_UNKNOWN, + SE_LOWMEM, + SE_LOWBAT, + SE_LANGCHG, + SE_REGIONCHG, + SE_MAX +}; + +/** + * Appcore system event operation + */ +struct sys_op { + int (*func) (void *); + void *data; +}; + +/** + * Appcore internal structure + */ +struct appcore { + int state; + + const struct ui_ops *ops; + struct sys_op sops[SE_MAX]; +}; + +/** + * Appcore UI operation + */ +struct ui_ops { + void *data; + void (*cb_app) (enum app_event evnt, void *data, bundle *b); +}; + +/* appcore-i18n.c */ +extern void update_lang(void); +extern int set_i18n(const char *domainname, const char *dirname); +void update_region(void); + + +/* appcore-X.c */ +extern int x_raise_win(pid_t pid); + +/* appcore-util.c */ +/* extern void stack_trim(void);*/ + +int appcore_pause_rotation_cb(void); +int appcore_resume_rotation_cb(void); + +struct ui_wm_rotate { + int (*set_rotation_cb) (int (*cb) (enum appcore_rm, void *), void *data); + int (*unset_rotation_cb) (void); + int (*get_rotation_state) (enum appcore_rm *curr); + int (*pause_rotation_cb) (void); + int (*resume_rotation_cb) (void); +}; +int appcore_set_wm_rotation(struct ui_wm_rotate* wm_rotate); + +#define ENV_START "APP_START_TIME" + +#define MEMORY_FLUSH_ACTIVATE + +#define APPID_MAX 256 + +#endif /* __APPCORE_INTERNAL_H__ */ diff --git a/include/image/SLP_Appcore_PG_events.png b/include/image/SLP_Appcore_PG_events.png new file mode 100644 index 0000000000000000000000000000000000000000..03a1547a2a5827625f6f3990abb744099e86d35a GIT binary patch literal 98265 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 literal 0 HcmV?d00001 diff --git a/include/image/SLP_Appcore_PG_lifecycle.png b/include/image/SLP_Appcore_PG_lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..0b12db430bfb2615877cee3fdd05f11e439e78f5 GIT binary patch literal 32877 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 ZP^2ziI1RJf)UTgITv$e^T0qbL{{WccbZ`Iw literal 0 HcmV?d00001 diff --git a/include/image/SLP_Appcore_PG_overview.png b/include/image/SLP_Appcore_PG_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3fbc99ce557e3fdc04b038c3219a164b78cebe GIT binary patch literal 70991 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 QSO5S307*qoM6N<$f`p?&%m4rY literal 0 HcmV?d00001 diff --git a/include/image/SLP_Appcore_PG_rotation.png b/include/image/SLP_Appcore_PG_rotation.png new file mode 100755 index 0000000000000000000000000000000000000000..444d7ba1b3e9c9408ae069ece527a8a448d03d79 GIT binary patch literal 42198 zcmd3Ng;O0%ur~xaxCcFGumpE^ch>}m;O_438X#D3cgexs-QC@tgY&rezV|15RbSQa z&Tj2&PxtI}_w@8{!WHEukP+|^ARr)+r6fg_As{}%f80;Nefqdw($6t`6p)U}62cIb z;{-<^574GUazYRgHL-{<1~4Db@OF|~jt~$iJ^!4L1GdG+5D@v6QldhtZn|eWFoIZG zD=s&#IxTVM%5mp5pj8=HSB|i?HA7cdSN(-$o&40rwT8EeG{>edCx59UnKwt<$59-q zHXQeP56%D=O~E@51CTLL1hAYaUZeg10ufFWJAzHlPJ6!{K`a!z#ZG7V|K8dW6c0n9 z073j+AFuxVhTYEl|88OV2O#Bb9tc7~8(jYqxZJV#>j@#Q8f)U%|Cd_l0q3Q;m1gyg z;dvC_YV;dhYrVodDtA-fe1ww&`o!=9sRde|A~L7 zPS}S%Xa4uK01+&w)x*_thNsd03h_~}d&P*XUi>4H9l^sDXQx3=?85#k@PBE36xCaf z1lv9b|M3+&@FA8@EBnEE>VGt||7kRP2Mx^gU(fjPe)PlTP6HRX|9@$I6juMr`rhS# zkb)9L%mSWHblu42;D{;5~5*wE6`$>5lWHy&5&L}aVydA=`5oE=lo{}Bol_uqLx z32wiC`I|CUV1ED@Pn7rCp4Djiz4cc>O~DInUm9C?N<7xvOvmtajlPOwI{ zZpm`jvJaka8m$Yfp!d1Ez@gJgmqAh86nKhAM?}?${~4j;YmfJESLAbq2ip%w7;rp% zE}&u@AjHQJ9j`sRQ!}++R8%=Fojc(b$Wvqbt@`vn0c6ksmsDCu5jVEtQ!z*{bU}e) zmcDVj?u9)#>oGB^?_}L3;ownrY|WD?tUdQqtiMnMZjd97tM5cs-D5IQQI^F6!n54Z zBN-g$!pwzrm;JOB0rnIi^gPM?YTZ|OO$Y4#%~bsV$ZbOG(LT; zzM9~)w1^&4e?M!=PN^i5({?u3kyr3=e!*e3TG4sPAaHSaBz8c~^rL#eu|ef=KJj@} zxjt$plILtlz8I`Bxx~q~bFx6PnVNN6#K{&y;bo^oF=cZheo-@h9qGzgRaD7%xnFR% zm(NB*vw$^A@pk-8CBrW>=l5+61inU+%b+>C$@ZLXF@!OZ#e25>Mp$;`r{_D|^1Ua7 zwR;3`dch6s#tT)b4v{G&@q+Y1P8D400(JUcIn z<)=0JeW&@5by2BJ+wOK{D5a#ehc~gavJioQXv-_E;H#{u_;T5|a-cvYC&kp&gmA7i zJTg+XF|c((kAs7gqTQQxBIRzcG{ja~=HYzeVQ+raH=Q8!m;Wn&)@r-DrlQ>mJc_&X z`wKfE-X|3A1-&-=hVs&glfA%zfPj&Oi&weq%L@$+1}r1k1~}d(M?zGWGsr23q+h?1 zetk|6c##BNKDlt6>ndxj8VEl;k2lDGHuIz<*1mOUN9-YxhbKzA#l-G~oCJ#%=t~~; z*)C(gVF7jZ=&1p)47zPn*;{vY5;$Om7sA-(#-3&)jjFXT%#(RM8g<%x)f3E?<845V zbKVMOTKK(?rhjwqaoMj@$_SucRbi>}&jvjwbc*%BtG3+&wFyVtx9% z1=K3X3$eqIT@MK|X2W5H#>+ZdHg0ZB<J?kwBG5zQd56xmvp<{wvjT}D)=Eet3or~E#Vu+=4T;2BNIBv<5xdOSbTIzVPf!)?#M zI67;iLrGgx(ZP23BetG)7_#(Zx6uCUFZt#}aH_C~<=&x;L)qqDWA9wj9&&$Aqk6s31sd_`iJY#-0pl2P< zSd#MX_eC3Jb|Z-`JgZC@|FzTgmXBHDalawe6^l$CxWgF(+SrUGntkQ1YG{w1evfZN zH|V*}xzDwHE8T1ZH&6EZdak%hi7WR`OK*rbZMn{VQ?h#K`;#BQV-WEkN|CD+6c8}Z%L~fA^Zlj$ z%_ABN4tXk8&$ufp}?@v=G)w6 zsE#Q;j1@_?LHezM3O0i-GxI>8OGJB-UWcz+Jy#u_>Gm%);)|YJ3^Q6V^KbCCEx_#{ zHesglC&T#+P@|J-h}LssKGo1ka47Ws50s+FFOLzr``Fmncr(Ox_(dDQdRG)_X<6ym zYwK>O@#s+wM!tk7Q6EhCR$m8J?#_m}?A@9u=y-$pDOg*t-tm+c*ljBF9fYC%b9*_5 zAMO@S8F<#R7fXtL^z@`tYl<0K{t98a7s`CFWlQj`mB zVA2KBxSb&hczE4c=@W*V`2lTRMSSq|E_8GXVGsDjPkMz zLTkW=)&T-<3(u1Cm;Xe^OE@SST4)!4wvRSryzdn`-I$!gTcLZe>Y6B}m$D}<9SdK5 z2z3FFK?qzWQAn^`m|~=%W#h_vItT6}vGWSF1jrux)V2(3`-(Fv@lw*!1}PqndDTSs zMv-A`CkmGzX~}U}J%|%?l`$Y%q4{*w1NC*kV6)iKWVvhTF>8)!9VFNc(qaY<4d}0j zzi>x)g@kPTCnJMe0EzVL{K~tQPU105`4^o!UnqH7JYSzOc@(mEpP$bH-$p-|&j140 zKLfpPP#7iFnKUQ^mq!&!tlOc1J~L9qag`Tb%*0a5*O3=hDpqETmUE9OqXUnrUgF?y z?7Qez?kDnD4@F5O!Z>N6E3ok_ATCJgT#Hs#3?I2@%?1jED82rX!ZJNG z>yb_DU|?rN9j0|?^(S`9#9D-?3hRiCHtJN}Rty$#)H8{oQ^y0oDLA6uNVW2@$D?QW z22<8~(p(N)BoM-1z8Rq#27-9zEOj%9V*=BMA5;w9?sj-IY*z(kTHT+WY)bKbuJK%v zp1-lPnvLbjt5r3EyY!-aGymXuxjIlA*g%E%V4-N_1xf;ytu*5Vd2hUK?)h3Bcb3O^ zU=Q{-+m-9|3h0K=a5iswrq-ZM&)bC2YdjJsZe zTQVy*9Yb;jkD~{LCJkk)IHn==m?2bo^Z2Dz2?r?O2i>W_J5&;4M%zJ~Q@nGLCvKhc z*X{65J%3~)1^wr*=x;xqc<&*vRwA(;SP}Lxy^~K zNAh-6%o(@S73wUlx%?p((i`x3H;K&B%L&FEhmaa|Vm=gLSlPN4N*`RUj_y~QRur~M z)z}hd{}NQa&^$o-g1wqSuxQyK*>lTY%9NHfPVMu4I+}!?ZMZR7#*j!p#Kd2mk#(QmjWt$JzE?+`D5AH~rAt&RH??vqiG98qrj3_@YeNaW7jkoa1_GH% zn|Ly^aKoRO3HI4%xi_EG21T57p1X)$3|&BpmEEqcVfC7( zcsrr_LQ^Z?JsOpo$H=}g1>PBsMX?%E^Dfv|CY#zO8h61J$n5S>VA)$ZvNs-~zy8;* zK3`fjZ%x?8#6Y7$Oz|LAD&)U^x(~wjeQ2WdP%k6VfQ1^M0u*=>H;a|XQH)wiSo63> z*~9n8w^wr*=2MQ;@U2oW8gv=_rk5M8+PkpSxLQ%Cc{~d7vRj>+obL5%-ymRWfc}qVG5! z5(M0b{{BTtjeIx8;(ui^VA(iv=eN)HefSn0)AYB2_z?qtFlOE3<-THtiaqwHtP?UN zv+(t-fU@Rf<4BN54DQH5k?^wJU=H$p5sLIN*tWYnb#myE_E@w`Vqt zJ%GdMBonAn_VBHZPOB4%vjR}XcmFVSqgyHZ<2wwH5e`|~^S-MG$f8^^6x&gH-go-; zLU1tqO~ZD>;|lz24&Uqb<$?!#TA(k4NmTZoXWY+=a4a8coY(!K`oXUaJMVKmD`)J{ z`rgk`Z(jtw`u(S|6OECP1!VZsnx`M`G)h)*_%(O)6_$s61qFQ^M6Dgk8`17dF0bl@ zon+b_?mrz$Z$?!{$-yd%j11wD<{doF-d+b!@7F3AeH?H#29(_hmFT8yqk9Y3{O;Q9 z-HC@x`1NnDRwVtSKe=WR=Inn8ExrEWcn(HbgDmVp2d`mKiKkTTP5(VyuPD=~%3fq0 z7f1m~GfWgvei_?4U|8?)uJcW0zc~Q+g`oOKqmum`{8Nc19QAUMjd+F}ym@uUrh0pI z+PZt(=IIKS%b$3RZ`<-U=ovZ7H)6BmaQ8HL9OKEp|A#wOeW;|0$2NF~7vq$hS8$;d~d|6O-lNK%xbrrZEfWxKoQKF_wD(3TO16O7 zYHHfV$qtjgD@yV5?ICrTr)Er(gGjU(4c&8*bpPd*m@p3yQ-qafj3>iG&}VgVpmG@N z#l)M&Dy%AZx~p8pzZg!OYpUw4r~41Sc;!!H4b0@csKO|EiW^aW7UZ|BA}4>38re!X zrjs3cMrJ1r17kgvT(le+l{#FNR6$=2{ft?J5_L=E;KS(&kx#zAU9?2b!JCZH4TU4N z`{#{O_5mTf0&R>(c?bQ(<03<-u`%jC3wmR#R^cB(np@#i``vZ9F|v`jI*-y7Oe<$g zSd(ucKTl5Ms!-$aZ&^Q`gb+oFB|_}NN5VuyZFe~E1(GXFKQosS39B9Cy+)n4$A3Ll zG;0`W|4_<`V^QeykWZtkW_9SKJ1Oj5oT$7jEVC-?O+D3)NoTP4tbUO`?DNA8tD zPW`#Y)}6>$F>!XQueYC^Tnr8?Q#yX`$h2zs0A{FCtdx_)sHXM7Xz-%&2;N446MAf11zti1*}LsMR#`& zjwgSUP-KXIEgWEbK0Lrax`TB9kJ~Qte%ZE~w_6CXS_I(R*#tXcJq0j1NHj}la%67K z`AX_q={#$FLZmZ0PA|vDn_)33Ui+DCeHO!p1}`5Fv9YJeafx>-N+_gav* zD;f}fO_F^&b@Me+vGdE;(|=e-O(7@3N9TXbAr(T;4AlUk^QW!RL{GS`eZk+=%bMsC zYG3c+=#+P07)U10SOS+Gt`WcQ?H>V&h_E+-%$6Dj2B1QqnNO_U`=80n2nx=@zc-!8 zw`mu|spoq@G$NwoljM4d-j&dS+(#Qy^EP_#Q+&NvpSZtzaUFjL1YVMCZX=Mc?on5D z43NKb)FcX`aXPxd;3R6=KiO>#-S2KeK6e449FK;%~>>0%ib{DHBC#&N~HY!E<-M(%P){JWT>!cWZ ziW?@iRBen8D|xYv=}z70uJI=W_bJ0py$hys>>QTS7>F4}73Dg;G`X!sg=O>M@*ahj{YF<}Bv^`u;wO=kETs?ab(EC~8HT`=lh9 z%wByOgaDpt@ohp_B~#(it58(oUFR9XB;;a!9IOLR#L&ZG!C?$oqw$R$?Y(-v1orfZ zwDLJnE7)b7W_M>KI~@)^9}Hk`mp}04U_5kieELz{WmK<7^}RlqWyfqIL!Pd~#=Sj0 z<4J*zAbm;dNEFBY8D!qbH$-RkmhZ=+PQwXEfB0kH{hVlO#vw}7hv zqTH@{f7?D9wu8*Gdfj_>gPdYo6E}DQc`GxZa{R4Ht)(j0Ml;9lAqYS}P_miGacSu2u}#po7O(dR^by&;I>GF}>J~8Yw$I;~dbeuA zdqPv1(ip^M

STeO!XVJ*_Nydj~XVQRi6}NnC1$iIWHP1JwsthY7eiDP|WK7&*yD z7y95JZpw60P#6DPh>R`LI7(4--yKFgOfVdLbtV5Vr*X^=yBL7Xk68-%o$(_bR!@5~W&9nr1SQ<*X>epm6JxUemsh?YQ@On+ zax^LK+m;me=VR=bMyi)rtB#|p4w>JNNpBa-UpMaIkB{ew@2(ghU%`4*ge6@F1*WvV zuWgy_BWV^OvjsJF^_`~dSfs|cSMWy2S+P*no{US!%ewf?wtn*GusOHpW=90i8c5#J zT8eWRfxnZev9V%@P*7ONUj3M{g`pDtKA(W=DU40a_=ntXeRsHlNH#lA{2wdlFf)T% z9V9)5#@e*8`*ANjDvNf;-^rm^9Fzn=+0!%DrfP zp9e+j$5+L&38Ts&R;z3#xx-@**A4yJx`M5OSj)4@bD`-sMiKri75sDIgh}%~gu3D# z>`1^AuG1nlYvXQW{&(ct8Ms9Pau`1R!4*VP04ibtO>NfOq>uE3OWc)Ye|cCUu>HKw zGs#4flfzgK*|5hR!)RUo#tm6MtmC}kxOZy8a~Y%0egT;+RkJ4Pp^G(nMTH06+amO= zAr^VCNHwg~81+q}oZ$;{q~c^L63j1~NM^;vPlmD5h=?*(s}H6DktZ68)aB3u{&}&s zIz4@5ocKCo-gVp4&%L^@w}whW=3MX|f-X9rqp4feOGama%G71`pu^C66_19$$a4q>~ykD4~P*a!Yd=>9(b z?kB-S&^Ui(FRz>;4IS9y_THvA+kd#7$F(?3zx-k3Smr85P3UeK8PCoO1{Y^ni}8wr`-BK@_E0!2KIQUF)7L( zrr_g#-UZIRZm--d6OSMdP~L;#MOBLzf-;Gd;nq0G#~Hq|4lYFT85>#}8<`oKxo}!DEB4jzDPzIQ z;wLr8X*V#J5WN{$z%hKZ5gO9bZ{ZSQR(^PX+E)ct!)^GCS4a7El5A9;CV(|0k8`CR zM7lBz)**!kIar*$3s@N>qdDl;I2g$nCt6(liu^6H#tCBrdqh69GMj|sdRkB2N5ZP3TPs10|zOFCfaa!rS3cQ~yEF?<+N(!e*4~PUnu4k&bOe~*< zQn5r1!1`1wJ7tgzuIJG|{#GTO)=|yR1Nt+ibQLhf7yoo=_m`Cyg&SKkC1lL~{5mwn z&Jn+RPEe1SJ)DPI_|*)GDKI&dfsbLMtmpG;?Rcqg`~k6nNY}QN&;F{ZtzMhQv(Eyj z@;BK83ErZO4PCi9u9u;UyX~VHof($Y^4#cOEO}%4dfh#G=}nnFPnYL+j+tj^n-h({ zsq~+}rA=f|H5H!jt!OZyjt-yJqVLS#Sk3GkSCRVqPPL`)?Kx82>N>^*Vc%cYXMoC1 z??zHCi1iSd$cAK}&%Ug~$gotTov?=Ccbv?(Jr|`onZ7+0Y|N)$=w+LU7>3nTcZWwZ zg}s#$Xa{1i+s?EIbcakgwCQY9@w$Vb_R_%vCW)m)*5%4!#`hK})rSpg^O2?ssC4H; zg2(S;oHC1SOaVhgFNt?Url=Q5I4HOJfXhM$Ptu>-2FJ{7X0`RZd+7^R}c zE@HEV!$Z?36L+ua`$7h}x|32Ky`}n%qN`h*yK@+P#!I;iwz1Oq+aZNWb0E*>g9ZRf zNbKdL`je`!mrx#CD=2619Rmp&O$=v}tP1JwrlJOq&w~#zP5!;-7ln77`AE}w$`95A>7U9JS-P&7Fn^HmY zUZT~1|0?Lm;WX`3VR$at#8#B5P;ab8+VOL;4i3cIsm`Q4sI{6@=j4pC=bTKb=y_io zb)4l>K#xh4Me%&4#&Gh}*bf|O2Z85$ z{R!A-p>a;e*s{(jSYFgUOvNmgidMp{NQ`2*MzZ+N7p*??zxJGD;ZJx`+B|$AB1{XZ zq$6T%Hgji3gGM-oB=>H!+B%y#TuK;X*?Gc?I~^&Rg$j} zVmuW=IM0C;RlXhMQDjb3WwIp6!NMUrJqzxg;qS^ZKtEcOSvnu1?G3R3O5sWp1Fw$} z`sMv0{oBtQcTvwEzTmg6i=j0)ZTsX9I87}0&4vu?g#H4F^#;8sYJ*8lUE$-&MDIg> zcqRt$itQ;hSNL9SPa9sR4I=R0|NgAD`Pjq5ihH z0_mD+|LI4V!r1l?8LYSa%O~bRZKx`DUrI-RI)yI}4Hy#7wT+HM&`|OJWSxY$@(ix>eKBN3M1w(eYfu-C2B@!t3ed@cw> z3j8++zCL93xdoW^U9c12a5?isIQ?#AEe~oC*Cy?9U#kgS=$C+mO+_){^ELnS!KS9N ztptOHX1GB+aY=&)9uWVqUzPEwoh}WFbx_y-@%1q+%3>t zG*L!s;6;Iboj5W+%>@pMx&S$Q>)J3b7XGq(NZ$bb;Nh!dpkDMx>g2sMM94Et+RNj! z(uk1DrJPj6jic4%?)zYqHJgGk)u-@^a6?TiSwrb&Yft84GibT~Z%_}i2K9grP%wFK zpQseg5FLYeM*(7@C&)Q;c2`uwTijd?1}OPU3f$X^>!@X-Xkn-<7?OLUE(P7*E-W<@S7 z)8pv#t4OL@Y2mQ>P zF%3#@eXSB$?=`mTpFZrrBlbcAFv(L>1EkJctLbZjb@b+2jMyL>JN^^kQ>?eBIIMp< zkGh@+{>u^|7N}R4^+$_vm=4dV0VE;@*$4jXMG>aU-kgj3`dj-No!ycA2<2qKK_H-H zY0VK9Z;xa5aoRtxs|tapv5Mq3F@->gNMsti&^20e-n#a*5$8Nzw*0(pXp4s3v*}s` z%%gGdgH*umvzObjS|}v~No0ctXi$-hZAiPm!(Z18-DILFvQ5^^c?+dNp zbW(Uw_LSM-8q3{gOrA6fi{2uuXj0aeL4q4Da@!)?|tT!@@*h`a5V{$|$SWFD3inj{Q??R_VTUFI<$3RSX73{mw5rbg|wOd z$sHgT7O}UpS3;lq)8VZd1KaYN#EQ`e2wvn`?1!hIpopbmWA)DO&fR9#uFl`}QL}zp zxZL3(^6Vh+q6Xt6fr-To^( zE0~~vS!1u-zd^2t4|l-dcHF!OXIP)zWM$d?6xPG?}3C{z)cdwNrj{ zKP%!tAZf$U2eQ;6@p-lFKTK?={6B!&ahI+C&nr~p1K-|Suv72BEv~)`!_k&oI%Vq^ z4D{a*ZEe?E-JfocUZ24it4)s2_txdMYt4ODt3MC3%(|E~iFn=o?%GA@11#ThvBhw4tsiRg3H~Z#Dyxo9o>u6;PoUJq)j6KfBK3PRx=vet^cp>##);v zc)L&L1Gd2Lb~!nmTy`*_$7+6D-)g@Di-Nyg_1>x5_T+LhpJ%ynp2_1nGIlmyqGDRk z<9d!TJXSDE!SR>H=WMw_qDt5M>7JO=ZLs0_mKF|B(IT{222+J>&-U$_~Lob8>M&j7x;RcetBdmRD3|t8Z);)gvoAYL}mu1~ZSn|0`EO zPHwCw+DKJx&K_<;%@321Ak*rMpuF6AjINxPwxYuNl(wQAIa=1q$!TwI&%UBB5@(LK zYRQWY0zwgThaU>Hsw`^uV?p;ryo>d=mXwr~n3%@YRLwkbxwnh=w})472r`h}V)bFd zWbF5cT(xRt>Y9JerdrKsC>P&Ps*rtO@80p*U+SDs<|85^)Ya9)!^7R(-9N@n(4|ru z5cF-*ACqu#RRm=EJjL0GV5Q#+LwW#dvv5`T42t>Hgl?+DwqK zx;nOZxrcz&77Qekrv9hSXJPMp+YNt6C_qzF6V2DJZ06JD_B$pOKmLAjmXN5TsIIQ0 zaWUE629OjHsS|-kekmy}1t_bi46wVnoEGO*6qHp|z)sJehLK$*1_b2h=Q~AWS1i|? zmlYHc5)rZaz6B&COiSw#K0y{~KTU~~o_jA1LN@9{?TtOyC(1?91qKK!tIQxGL{#c^ zD0y5>FFE4KXK_O@KAd#sv^~EqH<)hBTl28nE;SqM>^q-ujHPmM(DE)%2#}L7s^(L6 zf4z{{Bwg&8nHXC`9R30;VXD#oL)qcGi8?(L{I?o=sdy!O^!OUmocJzMbWXy7=LbN* z>S~+ZSb0W<8#Oic>(iZ)QOn#aOL){o9MEo#$Ms@7l?fBgQePiB4!~sOEm5AFq?%vw zv#*b$uebN;w@tkz73r5|%-KTZe8j6p>lH{P!Ntz_PAn`eHth-{i8B;JR(m1s`NhT0 z+#+z8leDjJjM|QJ13KY5ogBLmG}Zp&!?6Thg=RvBO>;ADwpT-Z5k$(+!&C@ ze)h0NBs3bI(+rnM3w*xPCQ)^ou^Kfh@BM^Az;7t)AT7RN)8+xj6RhbHAb}PR`K#a; zTEtM@wbnB*J32ixBcrU0aeQsN_^H9$T-*$ESyf-yPiJ6cW}vSR>pN%hrm^uZek;It&qF3K_5tI z6k|~;Q=F{GKPpA^95$=v);@ONf4555`C%>k9e}(Z5n=}v!W4!^2b;W4&XZ{tBJl2} zj#v(2vN@d}25X>@$WPbnP**zP^?QCdoTSj{HQ7zoayjCR{bsX0zST;kR3PNBc^Qn) z3q>O2x0}4=e+AqfuXX(Rn{}!Fp&Ar)nTPQSi8FW&$|gMEt%~&GN&~>3#pMuBqvD?gc4} zI1rPazX%bG@gn!vdZUTL7Z?f*g;*hwa!cf(a?C}0T zCq-TPaW5)U4Hgzhfer``jtTDBT)n&EYKWbOg{t-aJvj(F;m7%03V&#}yZhraHdO;L zMa!!E^3w9$kcNa@X0%VxZfH`dexdtgKf2#G@+7K090B-*gM^%MJ|=4sFzC28LEyNSy1(K(USgV;Ei(&&~*qcD4L<>sa&Wv1rm{eq7`p_yY~?#DhfGZKq{T*A3>2I*G|iTb`=9b9ga zrO@l3NHC|O=?nNZnLXcUnvI!^eOI(9jzaK*re@U-r2Z{R0vTn#AkRxj!9vIOyxliq zwTTKwB7pVLM5%@WmRFp4dA%^R)Da8#AmrqLK)2n&-7Kc#nVio1gHt=508RYHi$$0m z|L-{(mEY^E9!rPE?vEdP7K3)n>G@(#H#i)6&0dnS5;ph7)7gEQ92aT6$`2Aej-~&J zW7HQ>b<#G|{Okv*ZWb>Lj{)Tei9jJirQr!{3JYs0Az_N-J`h7#<*O6KUHV0tl!=s$ zk)+%i$V6wYGZwQ<(kb$c@|%S14khW2dH^2YB1D=XG)6Q&n{KT!o-w}`9v4Y*42pI_ zeK9pWlYL|3y(m-PB2hKAe~{z|bP$?9^cn>3SL#x7%0eN8Ez!`Yg*^~QsmMPWyiTpY z1r7-N5maLSkjW24`ji9N2@#wyI1ORt7dqW9_ha665n85an_>i4yr(Hx5(#XheOhef zcDq}m0t*)53*dv~59o6&;%Mkjd3v$dKYx0Y>FDe%a%uY&Hr5OciZ=-Y2@Suv zz+mCL4dUY`Lm*93(rGn&9o1qbS8uIt*k-MPRBXzNc%2(+hhSvJpH9CaA=K_W( zm>y#+i)a``=rYmBvwZMAWvV&7aLAwB#yB}K^g9<})xr}JuCw@BEPq|lHZ5=UNNlDC zaU>^d%udb0Dh2)d1U<)~g!c(fC?B>nu#|fg^^bbR3cYr#)A;IRNPnTreGD8abmz$t zUZ((-Fd%AF@dO^)Mv*{i%Kta9C^lSt+jnE1;%Yv$zZ!7yu&6}(@F}2yP0mXw2S2(+ zKPH&pukVnoan^J-K}{G#raF17J)HLva*B zx5wqZ>gr1aC|HGb_Pa#7h(lNiC|cy))DY=k0664IxR5_eGmY#nod7c>m(xWp1|HZT zfPXqq)TqZ(ND?&}G&G#FA8b65&=#a+jSGh0;gnH7K3;nB<%1t=Pzo@y(}9orM}~kN z8ZIsp4-3-5mksp@K^#b{!{vgN zvlZ7IxquVuAOHju7QTJ}c3%r5FwAorV>?ULXJ^0R12L%G9-$vrrcs$NYUBD5|NESs zR{$5P)>@T)5M3g31G)ol#16)FKz5avFHJW^^4Tb#SVen-g2a_%pu)>d4Dt1YUACHd zc%XpVr#W)9j@1U$kZ->qAAg*PI{KW6^!HPev_deL8Csys#lZocobDhnmbsf%J4E~7 zBvEH&_5=UyXjCNorvvn5g&JE{$8|p9Gacpc z>OMR3$z=-+zjVa2qK2iI_2WZ;G;8M;LID{MeOWoLz#;8lho_ismdCMZpIPWLa4 zjtlGcbdMtNmy>XD_1&Ft%y#f!efXM71c0&ZO%6(~HVivjCH`+=I0)XuV?6T{T)+By zNQ`RL6AQCrr%68~A;~sx2`w%Pd-!iKVm~EuJpcgir{=IYOB#AWx_@hHLhdI5-Q>Nk z8|o?~_F*WZd{X|w!Qnw^Dd8$|1~NJZx^Gkz^fVMGJ@u@YLJ4qa%zm)s+RYw!-(QV* zz~Th3$I!5gfym2YJUzFVi;PZ-VdB2*@j*1?hL#5XNx%A>Fji832{#Jvs~UIpWT(0% zXcc9&=9gzAWwd@abi(WQG1sb9Q4V>bCaWSLqe9)|91o7glr79`agvdjl97}ZFV;|Y zu#lDIbujPkrx4^wz|EYlFx@CW*O_rmfu?eWoE6;r)MPOB+u1pntK*ndDFZg9C^f6+ zYPNs*9tx0-OIB0SPKq`wsIj2=1NKsXQE5a_1hexG?6IJqzZTR)$e-WQay+ zMAXqDt{(q-H=96Yl9F@=ZODl&Pa(LTk;#7uasaRGc&AIkd2{< zg_T8s(@}qaNdI8Ejj@@rnZB%YF)+cJtS1Igc+3qrUIrXDhgf_^GB>jRQ&^xNIiM)5 zi{1$PH7_c93;_{wsfYetiWB8U@n73fdvUfC`uN=TjOuZJhG_Kw|IV-L^ENv^9IDD+ zFnp9N;A_(OX7)fcAC3RE+^UsF?Hd2ta!Oscd?*`vZe^rv-7g1oIBsvmoK~#uyUkjA z4-TlOuQ;y|n*@@L4h{c|8V!V?tqo(h*SFj^HwJS>z-F(i23%?; zsE0&!b<#5Xq?d2~(ZIdEg({sEmt@+7O6{iM$z+)nda@NV9eQ^CATD)RSfh>#Ki-#f8@#r6Jt#Y^B1 zx275ztjElAGpCV{S?QS!imQS&5RWC!>){2Y(|nA-pes}&Wri1q?-teF^fc95M|B5- z^L`P0T1!oTZGWMrH8fT@HU>;U;C19ow+9xyhA1Z7;*lTmge?)#o(X6U+lEDL2&!EW zUAMpXwE@CBZ&)Bwl`jawR0&-Z zLH*EMk8=@qsdvtlwz^w699a1cd@XNMY{sO29gfzOIqJKDEbd~=0uj4q%$A` zjfKYw^7AE&NifC2_`0n^WF52}5adJa*yzJNNu_J}PE8sA2oWuaCDRVt6}s_$l_Z7b z`BRhWUYQC5x5~$>SUChcMNZ-bqo?PaZz_Spq^I{1-f*e#5)tS>|Ftq0Gch4yAUfU8 zPf^LskWSsXLV1gT2wSk_W2utN(D!)O+-*FZQC~h2(APO@&Vu_prow#2L^hqB&^-ML zH7&h{$!MQ;@)ob|@?f?^rHFAPUn-GGK7-ewyZ35`DhiL~S5B)^UcX=53?}{mkaX7J zbpL-JcN~s9934k@Pq$5XGi|z$n3~*lu%;O_)L_>}bYLD;*?Q&J4yOVi0x3r9?QC+W*r>074#4HtyehaKGN;t-`5h zYG0h1!_|$A`N<8k=IZTq)I{xZM(IfMdqKB>p|RH-88~l+vAu=pX|7zR-+c@`2_e^g zNSCPO;5lx>gu}2?qM^MnL2fkW5|6Sk3tt@k&b9V5{H;-j$j}^nqrJ(O(QPgqoaBhF zv|O|{X31uFVOeqFm4liLJHSio4gEI16s-Md>9kiz+OyekKX7q^-`8B`D)dC0v1K}V z;(VWbE#KwXwXm@~;Er-fI$VnvQDJH&h4*4*LDVDk#{|^Ab8R8KiC))c!p1I@n$f-`;*a zsFqqN#M|s*qonr2A)+E1twrLiB!idiPwg{ZAT?=``pBYXbYX$~tBmZ5;6O-7h=_0& z&SN(i!@IC$F9rsN&53+EbZz(<=RL(MdmW7yvNg%33!zKF$3Wj7{%t9^$gJl&iQ*R|2 z0yoAs?^9ab9V5)5LM{NUy8rdp=JKL=(sXn)61`oSD@n~)TH?T3>QJm5n=K?R&R{Z< zyBu^}0cXmhQJu8i!}|4`a|ZV@l7E{g7pZPm`D}K*rGxD}CgN*s1|A32-JL2E80>%` zv!P!8kqcE)>e5LCf!-B!JL$50-(|676~Mi=kMjCDb|{XEgSLUh%I`8w1x*SPMMvAF z%+HGqiRHbe-ErDEO1QRYa>ToLe2|ewVZu}CpMWfd_F^xSYqh8d{!FZ_vG`|O4G1?5 zwepj;x2dnsv2gdP*kjwheaOq&5`M0=Hk2}{wEyB+pxxgkEv2P5mp0)q(MJRsWNFvW zEJgjiZ{u~|bn!j;;`#KjvQC1H^?Ty57irq(2E~(IA9~;ZeT`dBQi%jk1X~5Zmm?qI^W68hKYp@5)-Bc* zwXiS?yU54i$mG*-&z{H=OeML2lBY7RAh_T^6*aZVGxxrYc1Z(co>t&|=d#A)&+qGF z93haV)3100`?W#K1c6;S88lNe)`_bcN%j|i$j~pFQD&Akl+mOAc9xzTT~<@F8~ggxo6b&)Z{^y`($vyxlr4kVU|v2*fx!^(1f#_SN9oVMs;s1j`4HGbBEQRF3nGxDy9Txr zQbI!5X9a~DcuVu^>r)yU+?15!n5JpGZ#>ZbX%x#oe{b+Q7(nF_P^a?p`;ofzt3oc_ zp_taDgwK1VZ$7j0ztOc|E>u_NNPumiErg%92JO-wE(G|Fd5{~L@|M?|=vwj@cAH2C zw;Em;ertJZI95Y$^rgC@jzrIlGo!^sI5@^}4u6LhPB_M1o33NU{HDe5@pGC^gA0z% z8x@|^Vq>rLoSe5JE~o9(9`3*MjlGZ^v3R&P+dI1h|CW}wC;TXj>^;Kry|oj)wKGkX zF-K)sW;un&9&s#6a7f9Dsab0=E+ZpI-_M_a<l6mYt3Zrvm22rBbwZ)_~j zr-Z3u!RR?^g$&JBS2Od9#P%aTtisz2w=c=`_O>~6Agv!kns3%-?OeF2dat%1CStDtZ<3;PF zjm@)AaZ5WzDw6W}iDgVUv3jZvD%ln@uKkl~wdG}w>h%VT`c+}mEd&w3*MCL z)kYx=^}>(#!$*lUKO}08ELK((+TTA87DpT$?3G=jW?YN-m_XyA6CZ>&Mi$^kzLm4K zx=QPhn@*J;kElZvaCXUO%Wfg^Ww^uf$ve~mF{}wdrv5(nD+C?{MpN>42J40N<=@zU#y60J^gIAbR^Yae)bEhWlp$#Nu-t4(YeB7x5#4` zcg`W+OV9%+y}q$0wXvtIF)FnYyd;^s;xm-b{MRw9aH4;JH@?0!P3}V$oxHR&5&dKV zzm879#MRDA@GXf=lDc8d#%#Cq&zC>;`OoNnQ5jDmUsIEl&anT(DV%fp2BG47_d2P< zRNcx--5=pYxOCoMlzUTD*-=z!rmt*o5y~%T3yzht1=q}N85Zx{oI9MoZ)<)bBr5FS z+ex7BNts7OPuCdOj}aXoQY+L+sI7fz=BN6It2?DE(Qucvyt3+oq`Ad2*elnjt3&F7 zPq5iP@VUR^XdX^HGflU87p0~^bb-}zVL>BDC@KQ{SmS!)<%CTQY2eGq<6M`&^2wpJ zN~vv*PplT{3jda5T6O=evtGZPsB4`>NLwsxsgJR|v?d>#!e!ruJz~;h16D-E_v2NC zBjJRyn*5XcOZN`Ri3cu5Ev@C=msehUqm73&d1r;lQw1d@f-WjBm)|zer)bswzNys_ zB2`M6P)%5DX zP&LMlOiaE^K2DyXTUIvUsx|UzU!U5*ppXl>R>^YmMh7yaG01XO$$O|Iun z>{_NwUkAsZdVHx}X$rm{hr-)Emphz-A2M1$>Upic2>f;02m6&YYU7xrG=+y zLqq=vz0=sDga?H!i_#s_*V5sd%SfXI@blJl(!u7xf~MT7t9N$|0qN~1jb3Jip?8)$ zH?3X5`I3wC^zfUWRyZ=fgDUzt&YApZo{OC;>`lR;pws)N*RST=H1P`qTeLQp#RD3; zUf6ixIH(b;nNs<@H9P$GCL@;i?40+j2*hZhg7`yUVk(JsN&(A_L`!{`eT)ljfUe)S z&TUVujKjj4omuhTh>%oSeoM}9nRi(Blq6x8g-=y5tu3a~7Jhmx$#O_PX5+#Pw3W8L ze%FX|XIQH9c(sxP3MCEx^mHAnt*L)lO>u)ixdson8`I%WT!^8ytxe4`SCc%!5 z$ZgMlSQl+tTx$|92OpZyMN@FzH2rl{^J~D1mK&X&1?}zOhBf;6qgpxXzijqrTv~@J z23}tS&SyHsY(k@*1A!=@6Jf89jE_JbV=$Rf@_E)Wf5t!o?lWJVg5%)&Tx2HA(tghV zz7Kq+Sx_u{jw~K~!h^h{Dflw~{c5!!L-vz@*P(;&dhW8UyCR1am2;3723Gj9Afh|7 z(vkk&@K*}2uzOZM=)k%2O&a)@W1#VZlCMq?&o=e7EalW*s7X$oS)W*OpVRj;cS?7> zWC}GkRWt1^&E{W7Qf|jpfVX-qi>NOyyvBgr`bF^&OGBUZ$!8XipkwKf=QM=iHgp1=aksn!4pmuZb{XlOww7*($~dR zC%sDG_Clue1>qU-$<`~RYoyJI!Qocpj@TTchb5tHn~Q>m;p-3jvsD; zbU%z*pO3~#C?lMx+-rME3GeJ|yPx$&p9T((i;a~>R|ihJkcit7y)7v4Ju;q+&v*^< ziy4CvSEby@y2K($x3UUu>zP6bTufh3NtkNM5KtFw^I$;t=gO}Hdw2HhWX@8e2rwQq z$1mb)+$=52bM*aFtQYWlhmIwp_7MEhzm5~$w<`D1S+C6N7jWaL)^>DuQW!m6N;9FV zP;qqA;9}TS2yz_pa&&t~2Z~W928W+G?~XUE$gFYHX6vq2?#|O6!k@>B&{UgAT7;ux z<@>zI#=6cp^#zY#bH>u~G+QdIOu5=I#p&@Kbi@9cxyc+h;|0SVfe8J)?8Vs3^Je~$>1YG5~e9@`Beub)-h~U z4aY9BO3uMlUmqR+eDRhRSkyPUsfW zKVh@7886S!79Zo(;jk;>;=<%{i*q!#-Mqi!e#wm!H^dh-b(sWqZ!fYw191;aKQX^VsJ!d4IFkUKtUuOMLV05( zMsW+MyynYz1`Y18=o@}k{50w0|2}K94gDpYOX=0+DBhltJqn~<`>yoM@J$jf)ol zI-=uK0peio1xD+nv4b79xID{1G8n}4ybelBWUzdTq;pGL2vZ! zuOG$h$QwwtQBzA(LTZAVm2RB_nB`S512O_<6;HBQsm~_m@qLPJ@ZDdU3#`F;vP?>M zB@jboG;~GAp@NT`#<} z_F|!Pc`_E2mT1b24|S4;yMuaoi-HE{gvunCuP~XJl!_Q=vEq$fraYHXc+$km39Rf! zSNVYRgCQY#kY#WG_4-6c&}Rm=_fV@+NQwf{d;^00J;~u8CvCy1(zZ$ntIW7J?PPSu z?oTWBcD^ksG=mlE1&5f*32RV05BE3;8r(44zkj2)|1nUckP{?S@)2Ol7R54Auwsxh z1){MB6%~(Zy6h%Ko(i}w!kN=THFwMZwmQiIcFr+u8_j!cI zj^@lrF-$0fJeN-|`^QV8BvBZqh^+FW0?ym~{Md6`vM_geWtEB}8ktH3@fo^jE|pQ% zc6u7XmWZR^kCdVvqGn){rapq_vg|gUjslMPv>)Z!w$BfQQ~mK~x#zg^CEX}g=jp`D zf8Si9_xt6j#AYz?ZY|rR^!f52a`BG1NUX9rATs9gEGgZMO}m!izjx}{tV%LF3KXmx z_;VA7SC)mwg9Kh_)Y%y$HOGML%N?02kZKP3>-5XK-D?96H&SPj_?g`~9{1+v<0%9h zl0roN0(L;~eG*VDQE?FxUYm;bn7CN-m>5dB74<;cDH0>XwQ2^%Rqa#~2<%28rMnl= znky@2Pe&lb(vi@5ufLU-bYIfV2-46*CR6lv!FS?l2=;;#rg;2#`26}SmQK)Du?H;K z<&_l!F^SCNC0hbTIRI24B_)MsF2d~9Q72Rn2id~LpoHT3lbOZ!z0V7q07OX?dU))P z72(R|ZR?DP*IvvWE6xF(VJy0ed#W~lI*Ct+!ibRj`1=^_48#a7Q4XI3jL1Yfe6zDj z+8f>ZYSECr3Y9j>gDe)-(ig|;^9}!)hLTbE@bsT3+6kvy?$Oa?N6lxCU&ik$FkW0= z`PF+`iu!AgVu29IbtG2=80W#Bm^h;l1J852jGQ6jSX=`}ySw|ESsppSYCkxDr;Y*q ziBI*8x1@fXE_s0BRSUZ`JC6icGXp%{kEx_PSb#a9Dso#;gsQi`ys#H)zh&i=zNA5$ zr0)e|#;Uv0QNiKDfECo%*8bh@2e;5$e_4nu`+jNI)>b((%BGpAc4|&>gEDL-rJ%38 zM8^}|SxBQK7MLwBD;gD~J=FXHv<|Ym{7;BN!TxV8FWQT_E>;8JNZ8wUL^&=f2!jWW z3BuGxKLX56=tJG&*C)IvP+ICU>`uVT@?1;py@xE+>sB?bV?2~lu{_eey7|1{tS^hP zk|)>GO-~C&?#CMQ zH=Vd(>^IJBQKEB#Ch_FkcExqcqR0{c5?p2IOU!t=p~V?*yYN^Qe0zM~BW`B7tR|jG zmYBjLeNEC*(RkwMNmIu+VD|A0`aU} zVCl^NrG3!yZI20y)0vs1VF-2In9QmW9UvMf{{s`A{+{v{_s`{F+5{UP8X|Ht2z*pf zQKstuuM0nIWR?TNrcd(d)L~>nEpTe=QOA^Ed?hFmxISJPWPqG*v@?p06u(kxYi;o_ zv;MJA>SDw71_EV>^c5mAz;eFG!qcY7+glLDN^1EzL(=&pU;MVYs)P3L{Et-ryZK)p zj%pYs0JmY#}y`Y7V2dT3?RnnB9qEhhk`i(@(v(eXBKVh#nQtZUEjY>$60$wq`(kRfo zs?oIkcNyS9QW$2!)$e~w=ZnoRydBL{F22VkAtgkVt>(^VrwL{qFXXf|1Uv(Xcfj*)@`v;32OTQ0R)|TqUzd>xl)oyutZ+chGRg$2MBzwKk-=}e-e2&2%1Mg#d-+2wTjqghRdHbo>{awe? zu?of?;b#Bh*3oggc$ra|k#tq}7_4++nn{@St{q@ZqWBRF3x;epk`E?U+84JA3%<9) z8So-&e;%E`w_b)(!&-b7^H1eM7Q5E>)w{ z*e*A@qe9C_;W(d7XX0st2zDtcihIy-=eENpH`Q~Mja@Rsf2%LjW%srkwx{*px4qix zuf%8KY`}e?6gI8HzW7b%WSe-)VL7~_fb-8+IIvzuvy-@``ytpA+aUjYB&f_L#$Jt0 zUf)lY4d@>k*DeM9y)n?x(6JvZ*TRAyAJZ8~C}QchD3TOmE@LE+x!DUfJHsOFmDH3^ z77P&jmj|0XcHzHJ-wbKiENkADK5BL6Bx2mj?T9Yd$`M&C7GhSw!b`wWrijZE*%vVD z@E;y;%`v&Qv&-OuWas5UhmEctvryWB#|4=wc-@%;er$eTih%k?aUWafa@sS91|D}D zoxhoMVdjEdxd{!bUWQ?i zM3Wr0s_ntr^C*>H*s@$+NT{$d{!Hssp$y|wCw&jX{&w6rN<5f$2Ut@iWBdBz;s@2E z%sm>hRt)&F-mnyns4_OZ0q~B1u|I~ad|^z7>(H%IbyR6ZephTrXx%lvXl}gjk}9pq zw?L;(h1e~XkH6ogvmUb2sdm+?yd4f;YV(Dqr!r711q5;sHk!!M`Y{ zZ90Yq2E>_#uqUG}ie0Pzw~mm))j;RtV6_z|(RrbSKYy0{TxU|-_NU?$v91(N46$hR4p&u^GC zjtzo-MR3UsrT4SiA&}FAd~tmbmqte1{N=}!G+K##v2;0sKg_@TYqB7K=7FKHzWbsf zVm!-@RW(^tU7c3ipIY>_t=3>{in2zIVAYqI8Ly4%tJ`1SKMO3@_Us%L%KQdu3rgFujZ!S4e=gy$rs=2`>&ZADaA6hj zR#)5Q{GOkFBKF$EJG({7bAJ}e&B=BvcSI*H=vC`8{*AY)x+oCrc$bysU;S878cZGi z`*7HI5fY1CM>Zn+V`Z-i4aKh5&=A6YLA9t~H#w1tiYrA% zN0o~tcc98Ep`TOJTZTrD{%kdX5$HD%C3Q!~+Jvfa+sv$YSB&eOMri|n*jjJ+eq?Qo zt&TebgGR%%K3WlHUt8Dcl4>4+WGzhpw)}WBH(cCxTtnl_X@G9UB?xYuW#>&qgclQm zpIQw&F7jv37#pvqMs8Oq*Uh8kG2pZkUWAQ5@2-CQEBsZ$yX}r!<*``J-ksqivra&& z1YBFqO}Azt(k$Y+1}-$;d0aVS$F#kFDVQ;3Sgj*D#s z!S&zA*n@o^HEVjAwYrP3`TOwk@K9cr#HEeGMT3I8en0-C_dY!6-+nhu@DI}|_+wY} z#>d|yI`1gR84?y|XD~3}7V1?+2bO*1-!rKSD84Vsg+}4Rw{fETpNI=k4#Uo^<$tE- zag$T!4!roW1eUQYgvbIiQ626wD*VrNeo8p+qep7nmPwTS3yX_FQ4n!??TBt+k0m-Y zNj|<>+b7M9t!i(a=hQfu$T3V9Z^*tFghrJaaXwUnHz*mh$5vJp^K8NPTiah@w6s!g z!eeJ`?w^;!)l#2?Uv6(k;S4(g?>hR7Hxe%|vfScBqV(uV;}&obXn71<`GoBizkSx% z`yKduH90m zcl(yZ;P&>rDLQ;3dnt^M?FrYP>M_V9tjUGwHthlLkzYfNWPTr}fdM00w+gz*t3tjY%RM17Bmb5JO9QnWO`Ml1(49Jo7=v zlAhkvR_W!-$Ev?*5lL_fFAO;B=0kCD!i=jeSkwZA@omq)g#CMRiavN@U~ZLi3iBK< zVYI!h_QNTbtGw|G`b)cP|FKra=b|s?iYYZLEvn5k=r-(k@e{`@qoqA}%K)g#{)dr= z$Gt=*Z8B|MJz*yn?<1mAlWFAw*OgIBfDIo>&$c1`NCE>s(~g7!H3S9ajzR~|)e<}J zBHyU4E(ogxS2C?wHRPkDmH;rY8FC(tW5Q#hj5M^A1|P2>DEj(A^&&iMRv^M057@4b zcnxRNXGKx%l6Oi7K2$&AxC5_L?fVst;2A<;r*pmnbN%M|4uGF~+3vlOE9b!BNWe}Z zwp{Y+7VjF8vc&zCl!Ni|y{}2+R!_Y>cndnFTU-w4Pa>ZPH&!XZurL}V89FvAOY}xb z>235m?R9J_eXC%kQiXA|?;sExHsEN}csU*HI$Gr z!fr;Ys+|C3I?{K05m*~7;`VMl;# zf8eA4Jekh?Nh9da-WJSrnnEYV!N)RJY;vEayo~%w$4X=z{9~!E;aU3wr3(mNsf)L4 z>u3*o4?_IaFN zQko}=c`PEz$a6#j_Iz^Vsihix86BNHT4yuOf+)I%OlUg*ixY)Z8U-Sg3>(ca;= zDA7nrWyStPb7R|ZJfV{42$Q2>iEcSc8fZoqJAI}Erh;;sba(fN*rUtCc{D^vN5_2) zL(F^AcW-nScPCnvAfKHuK0YJ%w>845AU8-RT1zBE8SFEsyBV7#%AsOtXxvEMX55 z`rmdcL@F%;D7(2mH#8*9Vi=+=#3VuemKp@-*^A8(TkKo$qd&+>&mlaA+S%>Qyi-$F zT@(;Uo_I0Tb72!Bkk0Z}Rv`fE>_g-&rM4>QnQBE@TEo=Dfcsst`Mk^26kMjNvgqdF zeof(2;QKWFdl`?plpm&4Q#M)YSv&)=`*ZXboL&dAKb1$5{dUic>_a!&UrmirhXQ*t zfh()H)ZiyZ1YY(Cv&79EHdA1Df20cTqatjIN+`y?rgkm=5gPEG%OPvKy(l zCr!6$m~BE@GabvSsJU~jCg9BCh z<8vDvbx}#uo^N}5_R0`JeFX9VNh4=Gw5+-Y`37zhE{RNZl7H+ zIcZ$y#$a-`^m(n}RUh*s8&U+?_tzLf?R3H8w|Vbk%GV`$*w)VT%te9dqB%TjtjGm^`3t@HC=$x77XN@Hi`X8 za&xh2{564-Oev5SfD78XCU!fIT8lW1Pec;LOi(23&zS|P}JWSx=!j=iCTWe8Gr zJsNDg=;HCmOU6m=$Gi8Lqj40soU1Qp486AuR85E|PAIaCY42CC5?^wRk&am?e1mkf zU~&q!zB=1BaC0*Uc!K4hsop<%6+7p3;j6jOrjV35SA;(*ke6o;TtGBpzS=U+@q(o? z@A0^c3Jg9}0yGm;y8i@zZcqq%g!jVD!?KEm(L~TnL1TDhu;#_|%SSYw5r@9&Z_ghV z#zcVpfOS`((lb1AI^`*LTd==ov&(c1Ake9J6(xFCW&`1(+|2wD9t1Mp!sb4!C=YvW zP;n422aKQY~YAC+jFeX?iVpJQqQMUTXUMP!uZzn!J2gEr^liP8AhV zCzzo#23(yMyf>;nIhtccIS%D7Tl^-{-WqTIg~u+cNpDNK+GrQgDx;lfc*D%J!CN*_&?yb1d#ev5IddZ%(m0>^d~!hl&~`HN0xztvc&WzC)^zk^Bp=gmJAwY~Li z`>!h=ZKK`2e=f9o{5DnWRLK2CvP2*B$;olw|8%bK(HW|xWp-&!LtEXV$v^l%ugDkN zMbCjkC8g44$4LkBof-K8*(>Ef99QPOrf2rxMQ#NXrMbhyc^8#WBa2L-nl}gDS1)={J~9v7J81Oy^7)Z&^2?FF?)pN;&fNiE-EQz@PP}Ul7%~vcO{41DSFebN<}5w^2KRCZ1aB_Z55o zRjoRv*C9`qc5l(s)>P3@P=5J6@Z|4)A=gJ%n!kDlvJrZcV*CW`75XUPeF}+HeSV(c zvE)^`wv2>5?kHqdrAoc7tRI$~SolE9OIHF-A)NUMyui1_Lj3OmLGUL{{U8t%1#*3< zPI%%6Kl&%Y4Z#OEX6zDZ3alJKTd-z3m_gsdW8+STt3N)GwQ@9`)SGKY()&Tt*j+h5 zwaoP%37w!5`(QInsc1pl>bk+0{9A?HXuB`S6m{zH-Ats|xEcimP zQS39!Z~oO^>iUMwE2ayyw5EsN;31Y9{UmtWey+FT!~~yn@^m&lYbIifpta=sNz@6V z>CX85;pvaI`0zhW5@mb5U#vSL`XTW|7!YzJB?V_5Idl@18Gv^4I0!!L5e4Qi4YOJN zc$1p`wj$F%KN|YB(fEVJa}9~)n#P^V0h%qj(FJr>IB}wNvM!&)$;#ru!s5_~BV7&x#|8e_lwlU4 z2v9Qkgb8bktI{${iQ$)K&((oQlp`kB7+{Yq+FGvngi@ITO$Q$PAA)bAfAUe#BJo*DffZ3=0>l}VP8g-6cwJ0G zA8)08xBtGod%VAYaJr-Hh`U=qsTg!)0I%E2$yz&(616 zLw~lN$h3Q{fe5g0QJ~0?Dw}^1o~vz2-+smR-QQJYbTMj;wX!GUA{ z5_!YKT2bV1Sn2t-#M90Dn9T>8h^sZW9U3Cpx!k!#k6`kRDu~ESh-girKQd%Gf{`le z`uCo{uemOf^tUvcfB3IPy;?3noR{-HLR6oDpl5rUYWTS`5 z9ItJ`r00VKPV*d;c7tC(>4jV$L!G{4vVR7ilc5J^2I|BBcLWzx-B>jqU@j2T%96Jo zAd$8=Wn_hAkMb>ytg+L}CjGCH1N7SzEZbRmBwXDiD%a&za5V6^xw49; z^Msx7dt=%s45Jva>ml9!*qqwAxZfx)`dC;j_Nv(~TqyGC937qXO)XT3mWy0I%{K)K z?gUHX#Ku)Pb_9n?%dDa3;k6TXNnUDyv&7Y1P7o|Ewq+Ib6+bav5bJ62$~^f8v*}}E z+>(Ft&o&Wo61faijBNF}{53NS8ozw5F@Kf-RMHQrv*2745d*_$={?1&aD?DOTn+f{ zeMH1LP@eKYB{lCEwtJBP?lTg7_wBO@J6rjJw0K7_e&sp_0`1c0M38jU+XMXcBpRs@ zgzEf7Sc~VqVJv^0(cn}XUc~GZG6eGdoNm~T=iJ59p3oKZ zx4+i)3u~9`U-T~d#WJMv5XGvFgxskLN*x>=C7?i*ZW!QfhN7K_9oPtRFir#NIjjH7 zh@Jr;B9PWY{6x#hI(S+UD~b5fZ2Fw|8H@-8)n|}z9A)49`RQajB|j}TQG+}u_a26suW=GT}2leNmfDp$76HZfuIemJIYRGN4CoA$nTJq#6G z9wj7`lHeKa|>Qt%F0H0zTt2fDV=M8XZBujJycV#ZlN23pi@| z-;s;~XQGZc!F^}d=&NHWOn~Z-A{NmLy&^I(X{)nnb)pcrwN*6WABC#x8(I0D?^TH) zak$>3(#gHN85KfeG1+ZBfaP(EhT}6zcPiKtz0;>xW;tGlueF4U{e0Kfwl8pcmQ%b* z84$~)%}Q&$HKVTf1y&N(MihZ#MjuV2bt1Msg3rm$Hqg}U*8vQWSx>g9pMn+_B5MG} zzt``3YH=}%RkmOR29rW8I)5CBCaku}%*c72tw`!^8)byU`z}gvrby`PfMIjgE)v?S ztDDL<4B6F=Ia(4RLPOdGJdMPYhP~6rR%g}w&6=#&0LE8-ZoZ|(T2RPsXXs5(&>bcN zm%2O>Ll=Wh9*IM&$GFfpXqITa2?QE|BizI_E48VmR40IeK~$JSq2FYio}F?jIku4_y{?97XY(HYn9$ zMb?nAXKR8LeoOi&?L4W zLeE=qO(~%JvfpU`(FJY_k;b^suZ!otzP69V(~p+O;a!R4h=?KX*F9f}RagU@R7Oj; zyIWfe(UWT1```9Ybx1Jv6-Y3Ju~cxQM}^uBI=*=0eynZ;0u2QPRzMwSVv-LiVK7im zQ6iAz*mqF>-%@_ndEg#eor?|K;$`H(WA)xNLYPndK5Azx@6|S1K|9f4{loFaqThFd zZ4jok-|0Zr{C6hR`0bsEm0#-jn1z}8Ug@VyZ<}BD$MRRF!x8bic)sAT@)`jZ$D9|H zBOgZ87fLI z@%!(eTQ7Wk!H6`X$j4MAs{ zYG#H@`+KoQ$e)~vQx7XIc^9-8_Z|i_VA^71PVY}zD0vl?L~*T03=L_hYiVu&6F#$B zZ1fdsp<3?x^9x)u@Va?jwx`gXSE8d!62yQdKqS6D&QMtPTB7(SPWif?GSQiSmG|aG z&4uIJL0*2xnR+rL@w~VmB9D27Q2=9(ZYTB^T)KlmWCD*d=BwjofJZDol!s}*&@LL07&WNixU&#;t?lFh2IedSPv_D zg2mRt7LpYjI)lzhZQjd=hQ6_RbzhiY>gH@hd&&fIG5M>40zIys>H@yG(+6FJjAD&E zFJrH567a|PJeyX775&SfocR2=+4%{y*D7L~ykayQLjqG6kar)O<9h0Pdb`!O0^L3W zLSE+h>a6CNw!*We2~B=!IjyZ_%r-38p+s5Xdd(Cg4a=kf6)S@EEt4j}$c z1Apt{ya&OKlRkI1@tToXP;;e5f!fkz2x{`aw>dva&hJ?TSSZZT!SJRg--}=E73D61 zPF)^S{~b{O$hL*>gHF~vo1JZL`>axk{8Us_;-{1%2Q*$+$c9|*0Z_)#LHrUR90pV$ z0RCH6)%?yyT0vRLKLlHSbxlUkGj6vO=K=iiPlBMWjlqrCN%~>Ubp=cbiQczw(e&_B zvtQU=Ovh!)FYSp2bxr?9%T0iyd36215!_%#@W$&cU79YqfinsnpD+%6C6MXQwO zl0N(0kDafdzDh-r)#v&}(QH$iix~OD@;tCT3D@4^gneDmieI_$5x8#^#*;(x3h>Il znYd9=u4n416>%do7TG*y*u{SN&3W{$Dz#eyH|U!Z1ERcBWr#fP6iYx zkrfS2N3W=CPYik#y@&C?uF4a`pN@`+dFuS-OW@14QRuVH$D`z)2*;dv8D!LSikt0$ zU*YL|tMbHCv$$8${Ep|lA@NWufr2;&jNy{zW*N_|UO?5BG4yH>Zv?$(ABHG*wRrIZ zVizpj0%)oW2@9trBrpouFZ6^Gzn2XT{5taAufwr|dG$ex;Day)l1r^3hfjKF@$l{C zn4Y+)y?+7jKi}O0!J1YVmzNK1J#WRmw@@T`;^GY!DOvSDwt3pHr2bGovPAie0mIGr zDa+_NUlEr{K;r}e7$W+-R9A0CQs0V(Ox$FYUZ|$hirDW_voZeH$|?d-dBoI_JQwPf zGavQ-G06S#|FKE1P_9M1XY+Y{YI0&+#cQhNvNkI#IVrtBaWi<)N#cUp2d zZjhegSsE7?#P|1Epx^HS^x^Tu3m^Z+7d~x`0T>p8p`<0??TA^vJZkE^%GRGVCfb;v zD$1ObsWX1xQE;=#57PF=C{|q@sFuf-3}jv|9ACB&?rqg3h+L5AZ8}eD`If&Tqqr!@*?7Zkye= zjSiox`9-&tfqMymnxz)>i^NPBj2TsE?M?$@7X?Nz-cWOI<0~xhrb&5&+fh`@uob0+!Xs zKsi3xe>hg6h9%ZdsdQ3-9V`c+=fuE~v-Q#AOX`VbyZ2h+KXK2^F1x{f0DrSvo6T$b z$fno#aPC_Y)gxfOJO6u2@O`R~m~kaf#06lF`T_9}fIs?9(2kVrk@s<~kb@eDI<;Kb z&1f;u9;Fq#e&43*+B^*`uYzqsq3Jw;$KimI!lIZFa&y3md z{-AWk)g$n+gNI(0K8tC}WEo?O*%hd~C@HCprDGthib_wQd`J;|8VNfou3rMxzo3`) zS7yfqen=A>Q;@(ygykpAqPU%0Q{fWbt?+-{o#{W+Vc-5|j5WLL>)1mkOD3|7T|_9d zr0hE(Bui!tW8cc2We}lcNVcM}Z`p;AosbmS6Zh%5eh+?s!u`5Eop~@{-|ak)&vCpD z%3>Lm3OOuATq(kB-1QmbY3OrObgo)s&A;-^#419M2uD5t{TF{nCJR$GN(W|A7xIHZ}`2~=ts zDb_#JKXCls0Q^M6@6ZPRYjqOO^OKnH%Yq_u&CJW3@L^vF?M{1}GqTAuWbC^!9;78l) zFAFf!kt|ft&Nkn_KdZ}%)@(4c<)3CZc1C66ZvI@1_1O2jN92^(i=tw{JxtXiX=$Ky z*W?1IMRng=2{9O*IhaK{X687yamy&GBu#{4;L+E8_ z4JtQ*Bo5>P7{>XFG+fY;S0I0H z3#}X>Dt!sv?9Uuq}Zdw zg<^Eq+8=)Yf7Ynx^mh+>* z(?2D1NTT+kFWvMYZng_bcRjy2jG&|26=+rV6IG7O8^~#GGYrxRftQ}*fC)hT2i{dk zNT{Ns;$X9k!}SHwD4xbJ2WQr5cC}AjN1_@q<5Bs%l8ES8g6~T2*=*?7fJkBebQ2Gh zV=|T^kpSf)2FS|VVDoZ$mT>_9!RNp=s^U6>?V33HL*_jU7L>by3S-p3M#gFDDj#ri z2p)m}A1f#Fkb6u~L7_q6YXjlrcJF6qFXAjVpMWcIIXyZ0Ju~;-{o1Z;D#75aJqYCR z)54f|unUm3-PxwU>{GXD%!3bpeuXu}dHmAoo%}>+1ds#PblghbzZnFO1Wcgv>I9Y| zGvVLgGbX0mo_uq@_DVbu3|UxNTQd&qzo?4*N_Dd>6LZCR&st)mr&}C#uqer*1vZkZtDJk})PKilWDWgg%%SgC|k&%&u1M_ZFU%DilX+uMFzLPAy$!I! zQ(wf4Gw8c%51piXBJ-IPSIC{RPi&7`%>)KA;?INy*Pd(D7>_>9dvK_EwkM@j8%=$- zXE}EovT+jY5SnJN@|kymq*8pC zGeJ}p+6mYizF&IPysXK1mZdAfaMHgJ2huDTSOV0uLort8?S6-+=j1Tra%6dj)K`r; zQSZO2lSXoBv;x5@BF$WUc_iM6OL$$=6cRw9W(Rej78R z1G8oj`YQUW_XCDEi!l#1GoeQ6ACqK}fm@V|((eUSWQpX`(lPd3@*amf`^$;T@(aTpnbUp|A8R4Bae?gF5$(>%8JoEA(a18^S{J~@-TN^y zAvE#TM-uShxQ_SNAA~I2Jn$+*8j1vLy``)oeH7>wjeUgr_xzzQi72neTOmw5Htt34 zyBDv;c8F_S#vbxdPe>KbJCw<~FnozHu%$grQ1e2|@j>P1pj_++vd%i4bMb+>4Lg+E z_i_S1bFR{1P*yr@TW4S(LQilrRo=a=&SMly`|p_k(xqlFjO4R=q@R~ih0Sef%1vu( z5~e)mNJNesBFFu#pI}dqu0-4}&#_vu308F1ORS~5_`cfbYJh*$JJ~v<)Yb4N=+^hH zq~}CKuLXIc&-~vKoTOW{%)e`E3Y-}I{0TuLwP?{#etPYa71z5%zi`XCmAH(Bax z_D`<*8gtoHGkfQ>)k7f) zb1XPFc8mDii_|kW43t!=Lqjz@;4B*-n@r(KA{2&8+fm)FdHr-DFu1i*cUE^E1S-=nPcaIDAgjAsINVcsD#@)AJ{I5(hYE3bKN3I zCYzfWks$V{))zI$M9B9{M;>M*a9tbM`x7$y0%7@)baI}e!FFhVCys2PDBx<`WGVXx zbET*L(-8(0OV`j-oez&i-`|)V6PJD<6VyX|FI+Ui=9m50<8XDv@KItQ&D89pqXxCt zv5&szZ&kk`^i}_98c%yqmp_MmT4a7w62`O@9=C+}xj0d)J2i#y$-OgW7Wzs`)?QHa zX|22H)5G5>4|}0oi|6$lCs)q#xF0`;E-hY6xeHN;$xs6%6Wn#^EZ63wCctmY#kJD0 zZM4?+H%%N}w84d2J-bPUGJXte3RLmAM{Yd+!dc>2DFctGnzGZqg4_=QMTa!LLNvTG zyZc}ChwTGuq6gUqCnd9LO|MHn5ci}O_RxPNJ8dq@mATqi;>mPtx;*)vzPLX&a3?6? z{@;$<6Gf|zA0qZHX^qJE#DyG_uf)r3vYZlNjVQox2f7OLdP+^ z@TiCztKW+)k7CJ+|f2*_Oa+wWj5e^ZE^KB(zV>?o5=v7;AIS^xhkuS zW0O{DpIb5Dr0+qL;xo{{f#F;}Kj^X&hNtl}<}^t8!e;VR{Y!ye%tPJ*kuLB2}m$6+{(jXQEK}6X4GmWZ9q5w0w1;TEek&2gHv$JloguoL+x+RN*gXY5bB&)-~`SuOS> zj21#Ex>2cL2%44>5)S!V0k(IfoPDjbI5=Juc|_)^^nT$q9vN5rD#o)+7}+fCU_jO| z-b0icqPqYnYk)G zHC;oGs+%^td%DWr`QHytdOl?n)7v_zo*`R7Uezb$4L_5#4UEdkVny^ME#I%>3(`_^ z#>MKW+v7_5t!i!e>s&==8<~c&({R4(%s`2%0LhLi+x|^P_u*>)*~#t4TeCVJ;(4wy z9<3%5I17GtTYLj`0>(vu(l1*lI=K8hPL!6JK<@24R@%;EWA=1&p-~3HfX2D%Hr$$13@Z}X}W5#74_Tw0%L!T8hxWrR9RszKT9K;&1EDB1C5CvL+o@R#=#mcg>B}7_$;?q}$_`S6(`@ z3y^g=3OQ;PqqS=35^X{~?bIOR49Gl=bq(evhgiQE^N?lSiRZTlri^@WQio=4+!a~eK;WzgUsuTbb=h~qWyVNW8 z?DD8QW8sYeLy%>O!P}aK--`~hpv3BESXoTN|9Az{8a#AP+C?;tT;J1W&-&i;2Pub) zY=S0uuYUeo86nQ$CGt8Cf?j--~>K88<<-Xgy|e$>}M3%4vFl`np&BH zYs*8#{q8)Zw;3`q9VJpG`3kd#8W{**M@>h|gDb?fPM!zr$73o{>}VG@3NL~HuPB zAw*`+{`BehfhHD-yY}|GnN{$T<>fVgji|OJmWwCA4u}cb-TYP&e2Y1_yLUY`Ju5dS zJtZfbH$Rn$FX>)aOsOC%BMS=?F9$m(BRdl=oI6?fW9W%;Q;6{iL#&Do&4rtVA0_>8 z#(>VnJUHLa1?x5gh{~wqu#%@!o!q2N)}yy<#M@jaw;O^lL)hZ3q(}3G82HEwGqs65n3cz zM&DdPV{WEuP&ojJnPPN^|p?5^=*te|jIzh+n#l5R(KDCco9qqvx*%xD|r9UH=_ye*5%jBCldP zz+)=slh;4(`L5~}5cdE?{;$0qaT$_1p91&aD7-4&LD6d!hZ`n%JV9JCarwjI0_^6Xi9 ziN>A0tjwHz6;Fk;u<7mx_3BF|`^$eQJ=q~Wflh-;gs{H@ z%Hq;F@=uOI84u`VDOQKoH$Lebr{%g0F#5vKZt0vk-8)%ruOY_XFjNii6@a;dG!zSI@93dz;A zzKlxZDK{er8!IpEFh5+1xe(YLp}hBwc)f1~_-aoIj_D0B?9I28zkGSmETHVZZ(gui zB5d>fc{h%mXsy>bUbYti^A5a3q+BplftDIn|G*I3IQ$JtzfO>yM3cJS{-$c!sXBuY zy}f+1Wg%LALr*~QHjo$X?U(5IRHh2GB)Byq$zw?cTA%7MbCo7Qr@``fsi7YBwzseH z-6#In+Yy6#${LPNsXdW~>n&IvVPUqo3vq+FA0WeEiu#_Zob(qcohj5f9skL7%@c!k z1=S2JlfU=>1rPo8{K4wVX_+I@DDQldnNrkcmy{J_J3DlLi{FQo^YrQ7zOq_W-(AGt zl$|5^72IP7d;B5X`=y7pJ;&h?||$8Ya7oz7Ogn0TA9^s1lhT7Q<}i&*Ny zmGPg`pelG+Iwr-KPm{tW9dAaWgsNzdrrXl=^Y+Ee%!8VX3#tGuY%ltw{uNjc{8Bit zzY@uGkZSNf3ewho)&7#%k;T*{R&$Xgg=I{USc894NN!_f7Xj>CLweYGY{W31Y(I#l z;$u0k>ayQEKH!sg9bul#FGGS76P|xsB~EVEctszYZ=IcdVJBr370?)6KvW*qsn(gG-#3W#}~rh(3xjgH{LV3M=}(d?aqdVwb)Yi3hUC3CHQZBBm)-PEG5Uz_L$os&BQ6|JC@v{aZJNL z^X}H%+i!nYSNFSnx6-q6Kmdi8FN2ANgO8VkHa70og(SS!8)GSjXadIaWtmgYS28n- zytK6UuO-5WXy}7I#7xWi^*jcr07HR5;FwS2MWk8x{Tx#kP(n&ckvhRR(b`dgXeb=R zRGXDdwwN9(_g<>)B9)*@%?*H$A%htG2-l6#tOBv_Nn9%AHYsH~)lBzf_t@N(_PHzd zw<=HTyk-k-nPNAcriDm?IXnO+@z1<;uiN@c znW{h7Gq64qMohMC)9LCEJ@}zouRoCoqDz;J<3OfjsJ%e0aLN*Y80g@P{MDf2orc@6~ zJ)V^4LMG97C6XbU2@J_v^TQEV>@5_dGb4k8VY4S>#Ij>a>FC+5nXiA+Sp%epsl>!w zzYnqj#BR^RXNA(V(l#K@6~bJ)2EJV-@%pmy{6of$!))fiPl`0_Epo0?70A20Agsquk9glk^+D@;QQ{#IFfM!x+~F>BrT1=0Ei~# z+2xn8X@5AI(+$OgWX<9&4;$4;Xbv4(?PgATI^s8ktz~^O2}a;Eiv`+t3=Pel=&~+q z!P1lit4~kk8na7YiAs-LzW;G||L2Fgt(gzz0UU@5BZMhZPmtMbsifZs(a~89|5eZs znUK{Ww@90^L^`}lG`o0PA{oPPl9$PUg*ALyji9RGrK@L{bW0aA19=WyQFqOG)NKQQ z@9xyq`VeY;98Qw_ZHT1@>Q>5ImNT!vz~~4Ux$b`w>Z496JOepta2EkyI)ljG_3Mpx zc6J8YS6##Z#ZleY=>kfLq~xQS zdaB!?CPwzLO0S-vmH4hM1Ka$ont*ROK*oU^N?yGxfJ8!jQtj-QmKK>%+uJeH(%Yqf z6L#K4%g4mWQqdsUOmd^+9S%C7oxs7a3Qi0{%7JOuTs#z zj{O&}o?vU#mDx4x@0Mn81CJNVFYwQ5|Bs2vxn|*~yM<&H=;X#HdmCTcaI|rWi2;6o z!xPuSo3dlvvC13*;q2p{Q#DW;8^(+7IxIR;2GpeC?d|O!KPrv+eDGdq9es66E2Bdw zTUX+!GFI-sO4%GFJI&>fvE$XDBggso&7DOm+aAmz(1wm;HoI zbaHCSFh?Gm)BnKDUA?viOxxG589wga)0Cj^J3? zkBt{Nra>MAIKmJJM0il_M%ih@{2~f|xt^>xjJRIj{Ta53hJktWgZFNd%Q#-;pccL4 zl$1z$XG)4oYdjgr5hE1<-BVV!zP_I2>dH}8#vye_Nc5F0y|9OlS4qxFY6!6SF_B?Z5xI|QD>cWKiq7x?3 z1s94mRwB1r=IK6hPQtuq>M;eR;;zf zs2s2j+^+{42RtO~L4)rK0RI7oa{FbL3>JQdreXSN<5M<-fE(ux1HHap2v<}Rx3c&A z{MNT%(3e`}{{uOH#pRC^N`{hadGO?V!p+KqDc`t9==kH$sua`Id zyq7l}NpoQSf9wk(oLsD%A2St~bnCu$$uELk5BmHca@>VM$R^QQ`ffZRL_OznW6W%@ zI`|fdR!);Lrc|FPzcOHs;lbhWPVAz~2omL(RA9HsSvR DZqWi! literal 0 HcmV?d00001 diff --git a/include/virtual_canvas.h b/include/virtual_canvas.h new file mode 100644 index 0000000..2d523f8 --- /dev/null +++ b/include/virtual_canvas.h @@ -0,0 +1,34 @@ +/* + * starter + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Seungtaek Chung , Mi-Ju Lee , Xi Zhichan + * + * 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 __STARTER_VIRTUAL_CANVAS_H__ +#define __STARTER_VIRTUAL_CANVAS_H__ + +#include +#include + +extern Evas *virtual_canvas_create(int w, int h); +extern bool virtual_canvas_flush_to_file(Evas *e, const char *filename, int w, int h); +extern bool virtual_canvas_destroy(Evas *e); + +#endif //__STARTER_VIRTUAL_CANVAS_H__ + +// End of a file diff --git a/packaging/app-core.spec b/packaging/app-core.spec new file mode 100644 index 0000000..e7f79a1 --- /dev/null +++ b/packaging/app-core.spec @@ -0,0 +1,156 @@ + +Name: app-core +Summary: Application basic +Version: 1.3.11 +Release: 1 +VCS: framework/appfw/app-core#app-core_1.2-47-52-ge28693cc5d9eabf1943bc165ba686d9336334e6c +Group: TO_BE/FILLED_IN +License: Apache License, Version 2.0 +Source0: app-core-%{version}.tar.gz +Source101: packaging/core-efl.target +BuildRequires: pkgconfig(sensor) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(rua) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xcomposite) +BuildRequires: pkgconfig(xext) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(ecore-x) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(eet) +BuildRequires: pkgconfig(eina) +BuildRequires: pkgconfig(gobject-2.0) +BuildRequires: pkgconfig(glib-2.0) +%if %{_repository} == "wearable" +BuildRequires: pkgconfig(system-resource) +%endif +BuildRequires: cmake + + +%description +SLP common application basic + + + +%package efl +Summary: App basic EFL +Group: Development/Libraries +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description efl +Application basic EFL + +%package efl-devel +Summary: App basic EFL (devel) +Group: Development/Libraries +Requires: %{name}-efl = %{version}-%{release} +Requires: %{name}-common-devel = %{version}-%{release} + +%description efl-devel +Application basic EFL (devel) + +%package common +Summary: App basics common +Group: Development/Libraries +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description common +Application basics common + +%package common-devel +Summary: App basics common (devel) +Group: Development/Libraries +Requires: %{name}-common = %{version}-%{release} +Requires: pkgconfig(sensor) +Requires: pkgconfig(vconf) +Requires: pkgconfig(elementary) +Requires: pkgconfig(aul) + +%description common-devel +Application basics common (devel) + +%package template +Summary: App basics template +Group: Development/Libraries + +%description template +Application basics template + + +%prep +%setup -q + +%build +%if 0%{?sec_build_binary_debug_enable} +export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE" +export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE" +%endif +%if %{_repository} == "wearable" +cmake -DDEVICE_PROFILE=wearable -DCMAKE_INSTALL_PREFIX=%{_prefix} -DENABLE_GTK=OFF . +%else +cmake -DDEVICE_PROFILE=mobile -DCMAKE_INSTALL_PREFIX=%{_prefix} -DENABLE_GTK=OFF . +%endif + +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install +install -d %{buildroot}%{_libdir}/systemd/user/core-efl.target.wants +install -m0644 %{SOURCE101} %{buildroot}%{_libdir}/systemd/user/ +mkdir -p %{buildroot}/usr/share/license +cp LICENSE %{buildroot}/usr/share/license/%{name}-efl +cp LICENSE %{buildroot}/usr/share/license/%{name}-common + + +%post efl + +/sbin/ldconfig +mkdir -p /opt/share/app_capture +chmod 777 /opt/share/app_capture +chsmack -a "system::homedir" /opt/share/app_capture +chsmack -t /opt/share/app_capture + +%postun efl -p /sbin/ldconfig + +%post common -p /sbin/ldconfig + +%postun common -p /sbin/ldconfig + + + + + +%files efl +%manifest app-core.manifest +%defattr(-,root,root,-) +%{_libdir}/libappcore-efl.so.* +/usr/share/license/%{name}-efl + +%files efl-devel +%defattr(-,root,root,-) +%{_includedir}/appcore/appcore-efl.h +%{_libdir}/libappcore-efl.so +%{_libdir}/pkgconfig/appcore-efl.pc + +%files common +%manifest app-core.manifest +%defattr(-,root,root,-) +%{_libdir}/libappcore-common.so.* +%{_libdir}/systemd/user/core-efl.target +%{_libdir}/systemd/user/core-efl.target.wants/ +/usr/share/license/%{name}-common + +%files common-devel +%defattr(-,root,root,-) +%{_libdir}/libappcore-common.so +%{_libdir}/pkgconfig/appcore-common.pc +%{_includedir}/appcore/appcore-common.h +%{_includedir}/SLP_Appcore_PG.h + diff --git a/packaging/core-efl.target b/packaging/core-efl.target new file mode 100644 index 0000000..67ec56e --- /dev/null +++ b/packaging/core-efl.target @@ -0,0 +1,15 @@ +# +# This virtual unit maps the default core components and their dependencies. +# +# The real desktop services should go into the final desktop target +# folder, which should require this virtual target. While starting +# up, systemd will assure that the core EFL and daemons start before +# anything else. After the core target finishes, dependencies should +# not matter too much anymore and less fine-grained dependencies can +# be used. +# + +[Unit] +Description=Core EFL UI target +After=xorg.target +Requires=xorg.target diff --git a/src/appcore-X.c b/src/appcore-X.c new file mode 100755 index 0000000..8595860 --- /dev/null +++ b/src/appcore-X.c @@ -0,0 +1,171 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +static Atom a_pid; +static Atom a_active_win; + +static pid_t __get_win_pid(Display *d, Window win) +{ + int r; + pid_t pid; + + Atom a_type; + int format; + unsigned long nitems; + unsigned long bytes_after; + unsigned char *prop_ret; + XWindowAttributes attr; + + _retv_if(d == NULL || !a_pid, -1); + + if (!XGetWindowAttributes(d, win, &attr)) + return -1; + + if (attr.override_redirect || attr.class == InputOnly) + return -1; + + prop_ret = NULL; + r = XGetWindowProperty(d, win, a_pid, 0, 1, False, XA_CARDINAL, + &a_type, &format, &nitems, &bytes_after, + &prop_ret); + if (r != Success || prop_ret == NULL) + return -1; + + if (a_type == XA_CARDINAL && format == 32) + pid = *(unsigned long *)prop_ret; + else + pid = -1; + + XFree(prop_ret); + + return pid; +} + +static int __find_win(Display *d, Window *win, pid_t pid) +{ + int r; + pid_t p; + unsigned int n; + Window root, parent, *child; + + p = __get_win_pid(d, *win); + if (p == pid) + return 1; + + r = XQueryTree(d, *win, &root, &parent, &child, &n); + if (r) { + int i; + int found = 0; + + for (i = 0; i < n; i++) { + found = __find_win(d, &child[i], pid); + if (found) { + *win = child[i]; + break; + } + } + XFree(child); + + if (found) + return 1; + } + + return 0; +} + +static int __raise_win(Display *d, Window win) +{ + XEvent xev; + Window root; + + if (!a_active_win) + a_active_win = XInternAtom(d, "_NET_ACTIVE_WINDOW", False); + + root = XDefaultRootWindow(d); + + xev.xclient.type = ClientMessage; + xev.xclient.display = d; + xev.xclient.window = win; + xev.xclient.message_type = a_active_win; + xev.xclient.format = 32; + xev.xclient.data.l[0] = 1; + xev.xclient.data.l[1] = CurrentTime; + xev.xclient.data.l[2] = 0; + xev.xclient.data.l[3] = 0; + xev.xclient.data.l[4] = 0; + XSendEvent(d, root, False, + SubstructureRedirectMask | SubstructureNotifyMask, &xev); + + return 0; +} + +int x_raise_win(pid_t pid) +{ + + int r; + int found; + Display *d; + Window win; + + if (pid < 1) { + errno = EINVAL; + return -1; + } + + r = kill(pid, 0); + if (r == -1) { + errno = ESRCH; /* No such process */ + return -1; + } + + d = XOpenDisplay(NULL); + _retv_if(d == NULL, -1); + + win = XDefaultRootWindow(d); + + if (!a_pid) + a_pid = XInternAtom(d, "_NET_WM_PID", True); + + found = __find_win(d, &win, pid); + if (!found) { + XCloseDisplay(d); + errno = ENOENT; + return -1; + } + + r = __raise_win(d, win); + + XCloseDisplay(d); + + return r; +} diff --git a/src/appcore-efl.c b/src/appcore-efl.c new file mode 100755 index 0000000..06d4903 --- /dev/null +++ b/src/appcore-efl.c @@ -0,0 +1,1407 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef WEARABLE_PROFILE +#include +#endif +#include "appcore-internal.h" +#include "appcore-efl.h" +#include "virtual_canvas.h" + +#define SYSMAN_MAXSTR 100 +#define SYSMAN_MAXARG 16 +#define SYSNOTI_SOCKET_PATH "/tmp/sn" +#define RETRY_READ_COUNT 10 + +#define PREDEF_BACKGRD "backgrd" +#define PREDEF_FOREGRD "foregrd" + +enum sysnoti_cmd { + ADD_SYSMAN_ACTION, + CALL_SYSMAN_ACTION +}; + +struct sysnoti { + int pid; + int cmd; + char *type; + char *path; + int argc; + char *argv[SYSMAN_MAXARG]; +}; + +static pid_t _pid; + +static bool resource_reclaiming = TRUE; +static int tmp_val = 0; + + +struct ui_priv { + const char *name; + enum app_state state; + + Ecore_Event_Handler *hshow; + Ecore_Event_Handler *hhide; + Ecore_Event_Handler *hvchange; + Ecore_Event_Handler *hcmsg; /* WM_ROTATE */ + + Ecore_Timer *mftimer; /* Ecore Timer for memory flushing */ + + struct appcore_ops *ops; + void (*mfcb) (void); /* Memory Flushing Callback */ + + /* WM_ROTATE */ + int wm_rot_supported; + int rot_started; + int (*rot_cb) (enum appcore_rm, void *); + void *rot_cb_data; + enum appcore_rm rot_mode; +}; + +static struct ui_priv priv; + +static const char *_ae_name[AE_MAX] = { + [AE_UNKNOWN] = "UNKNOWN", + [AE_CREATE] = "CREATE", + [AE_TERMINATE] = "TERMINATE", + [AE_PAUSE] = "PAUSE", + [AE_RESUME] = "RESUME", + [AE_RESET] = "RESET", + [AE_LOWMEM_POST] = "LOWMEM_POST", + [AE_MEM_FLUSH] = "MEM_FLUSH", +}; + +static const char *_as_name[] = { + [AS_NONE] = "NONE", + [AS_CREATED] = "CREATED", + [AS_RUNNING] = "RUNNING", + [AS_PAUSED] = "PAUSED", + [AS_DYING] = "DYING", +}; + +static bool b_active = 0; +struct win_node { + unsigned int win; + bool bfobscured; +}; + +static struct ui_wm_rotate wm_rotate; + +static inline int send_int(int fd, int val) +{ + return write(fd, &val, sizeof(int)); +} + +static inline int send_str(int fd, char *str) +{ + int len; + int ret; + if (str == NULL) { + len = 0; + ret = write(fd, &len, sizeof(int)); + } else { + len = strlen(str); + if (len > SYSMAN_MAXSTR) + len = SYSMAN_MAXSTR; + write(fd, &len, sizeof(int)); + ret = write(fd, str, len); + } + return ret; +} + +static int sysnoti_send(struct sysnoti *msg) +{ + int client_len; + int client_sockfd; + int result; + int r; + int retry_count = 0; + struct sockaddr_un clientaddr; + int i; + + client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (client_sockfd == -1) { + _ERR("%s: socket create failed\n", __FUNCTION__); + return -1; + } + bzero(&clientaddr, sizeof(clientaddr)); + clientaddr.sun_family = AF_UNIX; + strncpy(clientaddr.sun_path, SYSNOTI_SOCKET_PATH, sizeof(clientaddr.sun_path) - 1); + client_len = sizeof(clientaddr); + + if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < + 0) { + _ERR("%s: connect failed\n", __FUNCTION__); + close(client_sockfd); + return -1; + } + + send_int(client_sockfd, msg->pid); + send_int(client_sockfd, msg->cmd); + send_str(client_sockfd, msg->type); + send_str(client_sockfd, msg->path); + send_int(client_sockfd, msg->argc); + for (i = 0; i < msg->argc; i++) + send_str(client_sockfd, msg->argv[i]); + + while (retry_count < RETRY_READ_COUNT) { + r = read(client_sockfd, &result, sizeof(int)); + if (r < 0) { + if (errno == EINTR) { + _ERR("Re-read for error(EINTR)"); + retry_count++; + continue; + } + _ERR("Read fail for str length"); + result = -1; + break; + + } + break; + } + if (retry_count == RETRY_READ_COUNT) { + _ERR("Read retry failed"); + } + + close(client_sockfd); + return result; +} + +static int _call_predef_action(const char *type, int num, ...) +{ + struct sysnoti *msg; + int ret; + va_list argptr; + + int i; + char *args = NULL; + + if (type == NULL || num > SYSMAN_MAXARG) { + errno = EINVAL; + return -1; + } + + msg = malloc(sizeof(struct sysnoti)); + + if (msg == NULL) { + /* Do something for not enought memory error */ + return -1; + } + + msg->pid = getpid(); + msg->cmd = CALL_SYSMAN_ACTION; + msg->type = (char *)type; + msg->path = NULL; + + msg->argc = num; + va_start(argptr, num); + for (i = 0; i < num; i++) { + args = va_arg(argptr, char *); + msg->argv[i] = args; + } + va_end(argptr); + + ret = sysnoti_send(msg); + free(msg); + + return ret; +} + +static int _inform_foregrd(void) +{ + char buf[255]; + snprintf(buf, sizeof(buf), "%d", getpid()); + return _call_predef_action(PREDEF_FOREGRD, 1, buf); +} + +static int _inform_backgrd(void) +{ + char buf[255]; + snprintf(buf, sizeof(buf), "%d", getpid()); + return _call_predef_action(PREDEF_BACKGRD, 1, buf); +} + + + +char appid[APPID_MAX]; +bool taskmanage; + +static void _capture_and_make_file(Ecore_X_Window win, int pid, const char *package); + +static int WIN_COMP(gconstpointer data1, gconstpointer data2) +{ + struct win_node *a = (struct win_node *)data1; + struct win_node *b = (struct win_node *)data2; + return (int)((a->win)-(b->win)); +} + +GSList *g_winnode_list = NULL; + +#if defined(MEMORY_FLUSH_ACTIVATE) +static Eina_Bool __appcore_memory_flush_cb(void *data) +{ + struct ui_priv *ui = (struct ui_priv *)data; + + appcore_flush_memory(); + ui->mftimer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static int __appcore_low_memory_post_cb(struct ui_priv *ui) +{ + if (ui->state == AS_PAUSED) { + // appcore_flush_memory(); + } else { + malloc_trim(0); + } + + return 0; +} + +static void __appcore_timer_add(struct ui_priv *ui) +{ + ui->mftimer = ecore_timer_add(5, __appcore_memory_flush_cb, ui); +} + +static void __appcore_timer_del(struct ui_priv *ui) +{ + if (ui->mftimer) { + ecore_timer_del(ui->mftimer); + ui->mftimer = NULL; + } +} + +#else + +static int __appcore_low_memory_post_cb(ui_priv *ui) +{ + return -1; +} + +#define __appcore_timer_add(ui) 0 +#define __appcore_timer_del(ui) 0 + +#endif + +static void __appcore_efl_memory_flush_cb(void) +{ + //_DBG("[APP %d] __appcore_efl_memory_flush_cb()", _pid); + elm_cache_all_flush(); +} + +static void __do_app(enum app_event event, void *data, bundle * b) +{ + int r = -1; + struct ui_priv *ui = data; + + _ret_if(ui == NULL || event >= AE_MAX); + _DBG("[APP %d] Event: %s State: %s", _pid, _ae_name[event], + _as_name[ui->state]); + + if (event == AE_MEM_FLUSH) { + ui->mfcb(); + return; + } + + if (event == AE_LOWMEM_POST) { + if (__appcore_low_memory_post_cb(ui) == 0) + return; + } + + if (!(ui->state == AS_PAUSED && event == AE_PAUSE)) + __appcore_timer_del(ui); + + if (event == AE_TERMINATE) { + _DBG("[APP %d] TERMINATE", _pid); + ui->state = AS_DYING; + elm_exit(); + return; + } + + _ret_if(ui->ops == NULL); + + switch (event) { + case AE_RESET: + _DBG("[APP %d] RESET", _pid); + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:start]", + ui->name); + if (ui->ops->reset) + r = ui->ops->reset(b, ui->ops->data); + ui->state = AS_RUNNING; + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:done]", + ui->name); + break; + case AE_PAUSE: + if (ui->state == AS_RUNNING) { + _DBG("[APP %d] PAUSE", _pid); + if (ui->ops->pause) + r = ui->ops->pause(ui->ops->data); + ui->state = AS_PAUSED; + if(r >= 0 && resource_reclaiming == TRUE) + __appcore_timer_add(ui); + } + /* TODO : rotation stop */ + //r = appcore_pause_rotation_cb(); +#ifdef WEARABLE_PROFILE + proc_group_change_status(PROC_CGROUP_SET_BACKGRD, getpid(), NULL); +#else + _inform_backgrd(); +#endif + + break; + case AE_RESUME: + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:start]", + ui->name); + if (ui->state == AS_PAUSED) { + _DBG("[APP %d] RESUME", _pid); + if (ui->ops->resume) + r = ui->ops->resume(ui->ops->data); + ui->state = AS_RUNNING; + } + /*TODO : rotation start*/ + //r = appcore_resume_rotation_cb(); + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:done]", + ui->name); + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:Launching:done]", + ui->name); +#ifdef WEARABLE_PROFILE + proc_group_change_status(PROC_CGROUP_SET_FOREGRD, getpid(), NULL); +#else + _inform_foregrd(); +#endif + + break; + default: + /* do nothing */ + break; + } +} + +static struct ui_ops efl_ops = { + .data = &priv, + .cb_app = __do_app, +}; + + +static bool __check_visible(void) +{ + GSList *iter = NULL; + struct win_node *entry = NULL; + + for (iter = g_winnode_list; iter != NULL; iter = g_slist_next(iter)) { + entry = iter->data; + //_DBG("win : %x obscured : %d\n", entry->win, entry->bfobscured); + if(entry->bfobscured == FALSE) + return TRUE; + } + return FALSE; +} + +static bool __check_skip(Ecore_X_Window xwin) +{ + unsigned int i, num; + Ecore_X_Window_State *state; + int ret; + + ret = ecore_x_netwm_window_state_get(xwin, &state, &num); + _DBG("ret(%d), win(%x), state(%x), num(%d)", ret, xwin, state, num); + if (state) { + for (i = 0; i < num; i++) { + _DBG("state[%d] : %d", i, state[i]); + switch (state[i]) { + case ECORE_X_WINDOW_STATE_SKIP_TASKBAR: + free(state); + return TRUE; + break; + case ECORE_X_WINDOW_STATE_SKIP_PAGER: + free(state); + return TRUE; + break; + default: + /* Ignore */ + break; + } + } + } + free(state); + return FALSE; +} + +static bool __exist_win(unsigned int win) +{ + struct win_node temp; + GSList *f; + + temp.win = win; + + f = g_slist_find_custom(g_winnode_list, &temp, WIN_COMP); + if (f == NULL) { + return FALSE; + } else { + return TRUE; + } + +} + +static bool __add_win(unsigned int win) +{ + struct win_node *t; + GSList *f; + + t = calloc(1, sizeof(struct win_node)); + if (t == NULL) + return FALSE; + + t->win = win; + t->bfobscured = FALSE; + + _DBG("[EVENT_TEST][EVENT] __add_win WIN:%x\n", win); + + f = g_slist_find_custom(g_winnode_list, t, WIN_COMP); + + if (f) { + errno = ENOENT; + _DBG("[EVENT_TEST][EVENT] ERROR There is already window : %x \n", win); + free(t); + return 0; + } + + g_winnode_list = g_slist_append(g_winnode_list, t); + + return TRUE; + +} + +static bool __delete_win(unsigned int win) +{ + struct win_node temp; + GSList *f; + + temp.win = win; + + f = g_slist_find_custom(g_winnode_list, &temp, WIN_COMP); + if (f == NULL) { + errno = ENOENT; + _DBG("[EVENT_TEST][EVENT] ERROR There is no window : %x \n", + win); + return 0; + } + + g_winnode_list = g_slist_remove_link(g_winnode_list, f); + + free(f->data); + + return TRUE; +} + +static bool __update_win(unsigned int win, bool bfobscured) +{ + struct win_node temp; + GSList *f; + + struct win_node *t; + + _DBG("[EVENT_TEST][EVENT] __update_win WIN:%x fully_obscured %d\n", win, + bfobscured); + + temp.win = win; + + f = g_slist_find_custom(g_winnode_list, &temp, WIN_COMP); + + if (f == NULL) { + errno = ENOENT; + _DBG("[EVENT_TEST][EVENT] ERROR There is no window : %x \n", win); + return FALSE; + } + + g_winnode_list = g_slist_remove_link(g_winnode_list, f); + + free(f->data); + + t = calloc(1, sizeof(struct win_node)); + if (t == NULL) + return FALSE; + + t->win = win; + t->bfobscured = bfobscured; + + g_winnode_list = g_slist_append(g_winnode_list, t); + + return TRUE; + +} + +/* WM_ROTATE */ +static Ecore_X_Atom _WM_WINDOW_ROTATION_SUPPORTED = 0; +static Ecore_X_Atom _WM_WINDOW_ROTATION_CHANGE_REQUEST = 0; + +static int __check_wm_rotation_support(void) +{ + _DBG("Disable window manager rotation"); + return -1; +#if 0 + Ecore_X_Window root, win, win2; + int ret; + + if (!_WM_WINDOW_ROTATION_SUPPORTED) { + _WM_WINDOW_ROTATION_SUPPORTED = + ecore_x_atom_get("_E_WINDOW_ROTATION_SUPPORTED"); + } + + if (!_WM_WINDOW_ROTATION_CHANGE_REQUEST) { + _WM_WINDOW_ROTATION_CHANGE_REQUEST = + ecore_x_atom_get("_E_WINDOW_ROTATION_CHANGE_REQUEST"); + } + + root = ecore_x_window_root_first_get(); + ret = ecore_x_window_prop_xid_get(root, + _WM_WINDOW_ROTATION_SUPPORTED, + ECORE_X_ATOM_WINDOW, + &win, 1); + if ((ret == 1) && (win)) + { + ret = ecore_x_window_prop_xid_get(win, + _WM_WINDOW_ROTATION_SUPPORTED, + ECORE_X_ATOM_WINDOW, + &win2, 1); + if ((ret == 1) && (win2 == win)) + return 0; + } + + return -1; +#endif +} + +static void __set_wm_rotation_support(unsigned int win, unsigned int set) +{ + GSList *iter = NULL; + struct win_node *entry = NULL; + + if (0 == win) { + for (iter = g_winnode_list; iter != NULL; iter = g_slist_next(iter)) { + entry = iter->data; + if (entry->win) { + ecore_x_window_prop_card32_set(entry->win, + _WM_WINDOW_ROTATION_SUPPORTED, + &set, 1); + } + } + } else { + ecore_x_window_prop_card32_set(win, + _WM_WINDOW_ROTATION_SUPPORTED, + &set, 1); + } +} + +Ecore_X_Atom atom_parent; + +static Eina_Bool __show_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Show *ev; + int ret; + Ecore_X_Window parent; + + ev = event; + + ret = ecore_x_window_prop_window_get(ev->win, atom_parent, &parent, 1); + if (ret != 1) + { + // This is child window. Skip!!! + return ECORE_CALLBACK_PASS_ON; + } + + _DBG("[EVENT_TEST][EVENT] GET SHOW EVENT!!!. WIN:%x\n", ev->win); + + if (!__exist_win((unsigned int)ev->win)) { + /* WM_ROTATE */ + if ((priv.wm_rot_supported) && (1 == priv.rot_started)) { + __set_wm_rotation_support(ev->win, 1); + } + __add_win((unsigned int)ev->win); + } + else + __update_win((unsigned int)ev->win, FALSE); + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __hide_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Hide *ev; + int bvisibility = 0; + + ev = event; + + _DBG("[EVENT_TEST][EVENT] GET HIDE EVENT!!!. WIN:%x\n", ev->win); + + if (__exist_win((unsigned int)ev->win)) { + __delete_win((unsigned int)ev->win); + + bvisibility = __check_visible(); + if (!bvisibility && b_active == 1) { + _DBG(" Go to Pasue state \n"); + b_active = 0; + __do_app(AE_PAUSE, data, NULL); + if(taskmanage) { + _capture_and_make_file(ev->win, getpid(), appid); + } else if ( aul_is_subapp() ) { + _capture_and_make_file(ev->win, getpid(), appcore_get_caller_appid()); + } + } + } + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool __visibility_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Visibility_Change *ev; + int bvisibility = 0; + + ev = event; + + __update_win((unsigned int)ev->win, ev->fully_obscured); + bvisibility = __check_visible(); + + if (bvisibility && b_active == 0) { + _DBG(" Go to Resume state\n"); + b_active = 1; + + __do_app(AE_RESUME, data, NULL); + + } else if (!bvisibility && b_active == 1) { + _DBG(" Go to Pasue state \n"); + b_active = 0; + __do_app(AE_PAUSE, data, NULL); + if(taskmanage) { + _capture_and_make_file(ev->win, getpid(), appid); + } else if ( aul_is_subapp() ) { + _capture_and_make_file(ev->win, getpid(), appcore_get_caller_appid()); + } + } else + _DBG(" No change state \n"); + + return ECORE_CALLBACK_RENEW; + +} + +/* WM_ROTATE */ +static Eina_Bool __cmsg_cb(void *data, int type, void *event) +{ + struct ui_priv *ui = (struct ui_priv *)data; + Ecore_X_Event_Client_Message *e = event; + + if (!ui) return ECORE_CALLBACK_PASS_ON; + if (e->format != 32) return ECORE_CALLBACK_PASS_ON; + if (e->message_type == _WM_WINDOW_ROTATION_CHANGE_REQUEST) { + if ((0 == ui->wm_rot_supported) || + (0 == ui->rot_started) || + (NULL == ui->rot_cb)) { + return ECORE_CALLBACK_PASS_ON; + } + + enum appcore_rm rm; + switch (e->data.l[1]) + { + case 0: rm = APPCORE_RM_PORTRAIT_NORMAL; break; + case 90: rm = APPCORE_RM_LANDSCAPE_REVERSE; break; + case 180: rm = APPCORE_RM_PORTRAIT_REVERSE; break; + case 270: rm = APPCORE_RM_LANDSCAPE_NORMAL; break; + default: rm = APPCORE_RM_UNKNOWN; break; + } + + ui->rot_mode = rm; + + if (APPCORE_RM_UNKNOWN != rm) { + ui->rot_cb(rm, ui->rot_cb_data); + } + } + + return ECORE_CALLBACK_PASS_ON; +} + +static void __add_climsg_cb(struct ui_priv *ui) +{ + _ret_if(ui == NULL); + + atom_parent = ecore_x_atom_get("_E_PARENT_BORDER_WINDOW"); + if (!atom_parent) + { + // Do Error Handling + } + + ui->hshow = + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, __show_cb, ui); + ui->hhide = + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, __hide_cb, ui); + ui->hvchange = + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, + __visibility_cb, ui); + + /* Add client message callback for WM_ROTATE */ + if(!__check_wm_rotation_support()) + { + ui->hcmsg = + ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, __cmsg_cb, ui); + ui->wm_rot_supported = 1; + appcore_set_wm_rotation(&wm_rotate); + } +} + +static int __before_loop(struct ui_priv *ui, int *argc, char ***argv) +{ + int r; + char *hwacc = NULL; + char *tm_tmp = NULL; + + if (argc == NULL || argv == NULL) { + _ERR("argc/argv is NULL"); + errno = EINVAL; + return -1; + } + + g_type_init(); + elm_init(*argc, *argv); + + hwacc = getenv("HWACC"); + if(hwacc == NULL) { + _DBG("elm_config_preferred_engine_set is not called"); + } else if(strcmp(hwacc, "USE") == 0) { + elm_config_preferred_engine_set("opengl_x11"); + _DBG("elm_config_preferred_engine_set : opengl_x11"); + } else if(strcmp(hwacc, "NOT_USE") == 0) { + elm_config_preferred_engine_set("software_x11"); + _DBG("elm_config_preferred_engine_set : software_x11"); + } else { + _DBG("elm_config_preferred_engine_set is not called"); + } + + tm_tmp = getenv("TASKMANAGE"); + if(tm_tmp == NULL) { + _DBG("taskmanage is null"); + taskmanage = 1; + } else if(strcmp(tm_tmp, "false") == 0) { + _DBG("taskmanage is false"); + taskmanage = 0; + } else { + _DBG("taskmanage is true %s", tm_tmp); + taskmanage = 1; + } + + r = appcore_init(ui->name, &efl_ops, *argc, *argv); + _retv_if(r == -1, -1); + + LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:appcore_init:done]", ui->name); + if (ui->ops && ui->ops->create) { + r = ui->ops->create(ui->ops->data); + if (r == -1) { + _ERR("create() return error"); + appcore_exit(); + errno = ECANCELED; + return -1; + } + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:create:done]", + ui->name); + } + ui->state = AS_CREATED; + + __add_climsg_cb(ui); + + return 0; +} + +static void __after_loop(struct ui_priv *ui) +{ + appcore_unset_rotation_cb(); + appcore_exit(); + + if (ui->ops && ui->ops->terminate) + ui->ops->terminate(ui->ops->data); + + if (ui->hshow) + ecore_event_handler_del(ui->hshow); + if (ui->hhide) + ecore_event_handler_del(ui->hhide); + if (ui->hvchange) + ecore_event_handler_del(ui->hvchange); + + __appcore_timer_del(ui); + + elm_shutdown(); +} + +static int __set_data(struct ui_priv *ui, const char *name, + struct appcore_ops *ops) +{ + if (ui->name) { + _ERR("Mainloop already started"); + errno = EINPROGRESS; + return -1; + } + + if (name == NULL || name[0] == '\0') { + _ERR("Invalid name"); + errno = EINVAL; + return -1; + } + + if (ops == NULL) { + _ERR("ops is NULL"); + errno = EINVAL; + return -1; + } + + ui->name = strdup(name); + _retv_if(ui->name == NULL, -1); + + ui->ops = ops; + + ui->mfcb = __appcore_efl_memory_flush_cb; + + _pid = getpid(); + + /* WM_ROTATE */ + ui->wm_rot_supported = 0; + ui->rot_started = 0; + ui->rot_cb = NULL; + ui->rot_cb_data = NULL; + ui->rot_mode = APPCORE_RM_UNKNOWN; + + return 0; +} + +static void __unset_data(struct ui_priv *ui) +{ + if (ui->name) + free((void *)ui->name); + + memset(ui, 0, sizeof(struct ui_priv)); +} + +/* WM_ROTATE */ +static int __wm_set_rotation_cb(int (*cb) (enum appcore_rm, void *), void *data) +{ + if (cb == NULL) { + errno = EINVAL; + return -1; + } + + if ((priv.wm_rot_supported) && (0 == priv.rot_started)) { + __set_wm_rotation_support(0, 1); + } + + priv.rot_cb = cb; + priv.rot_cb_data = data; + priv.rot_started = 1; + + return 0; +} + +static int __wm_unset_rotation_cb(void) +{ + if ((priv.wm_rot_supported) && (1 == priv.rot_started)) { + __set_wm_rotation_support(0, 0); + } + + priv.rot_cb = NULL; + priv.rot_cb_data = NULL; + priv.rot_started = 0; + + return 0; +} + +static int __wm_get_rotation_state(enum appcore_rm *curr) +{ + if (curr == NULL) { + errno = EINVAL; + return -1; + } + + *curr = priv.rot_mode; + + return 0; +} + +static int __wm_pause_rotation_cb(void) +{ + if ((1 == priv.rot_started) && (priv.wm_rot_supported)) { + __set_wm_rotation_support(0, 0); + } + + priv.rot_started = 0; + + return 0; +} + +static int __wm_resume_rotation_cb(void) +{ + if ((0 == priv.rot_started) && (priv.wm_rot_supported)) { + __set_wm_rotation_support(0, 1); + } + + priv.rot_started = 1; + + return 0; +} + +static struct ui_wm_rotate wm_rotate = { + __wm_set_rotation_cb, + __wm_unset_rotation_cb, + __wm_get_rotation_state, + __wm_pause_rotation_cb, + __wm_resume_rotation_cb +}; + +static Window _get_parent_window(Window id) +{ + Window root; + Window parent; + Window *children; + unsigned int num; + + if (!XQueryTree(ecore_x_display_get(), id, &root, &parent, &children, &num)) { + return 0; + } + + if (children) { + XFree(children); + } + + return parent; +} + +static Window _find_capture_window(Window id, Visual **visual, int *depth, int *width, int *height) +{ + XWindowAttributes attr; + Window parent = id; + Window orig_id = id; + + if (id == 0) { + return (Window)-1; + } + + do { + id = parent; + + if (!XGetWindowAttributes(ecore_x_display_get(), id, &attr)) { + return (Window)-1; + } + + parent = _get_parent_window(id); + + if (attr.map_state == IsViewable + && attr.override_redirect == True + && attr.class == InputOutput && parent == attr.root) { + *depth = attr.depth; + *width = attr.width; + *height = attr.height; + *visual = attr.visual; + return id; + } + } while (parent != attr.root && parent != 0); + + XGetWindowAttributes(ecore_x_display_get(), orig_id, &attr); + *depth = attr.depth; + *width = attr.width; + *height = attr.height; + *visual = attr.visual; + + return (Window) 0; + +} + +static char *_capture_window(Window id, Visual *visual, int width, int height, int depth, int *size) +{ + XShmSegmentInfo si; + XImage *xim; + int img_size; + char *captured_img = NULL; + + /* (depth >> 3) + 1 == 4 byte */ + si.shmid = + shmget(IPC_PRIVATE, width * height * ((depth >> 3) + 1), + IPC_CREAT | 0666); + + if (si.shmid < 0) { + _ERR("shmget"); + return NULL; + } + + si.readOnly = False; + si.shmaddr = shmat(si.shmid, NULL, 0); + + if (si.shmaddr == (char *)-1) { + shmdt(si.shmaddr); + shmctl(si.shmid, IPC_RMID, 0); + return NULL; + } + + xim = XShmCreateImage(ecore_x_display_get(), visual, depth, ZPixmap, NULL, &si, + width, height); + + if (xim == 0) { + shmdt(si.shmaddr); + shmctl(si.shmid, IPC_RMID, 0); + + return NULL; + } + + img_size = xim->bytes_per_line * xim->height; + xim->data = si.shmaddr; + + XSync(ecore_x_display_get(), False); + XShmAttach(ecore_x_display_get(), &si); + XShmGetImage(ecore_x_display_get(), id, xim, 0, 0, 0xFFFFFFFF); + XSync(ecore_x_display_get(), False); + + captured_img = calloc(1, img_size); + if (captured_img) { + memcpy(captured_img, xim->data, img_size); + } else { + _ERR("calloc"); + } + + XShmDetach(ecore_x_display_get(), &si); + XDestroyImage(xim); + + + shmdt(si.shmaddr); + shmctl(si.shmid, IPC_RMID, 0); + + *size = img_size; + + return captured_img; + +} + +#define _WND_REQUEST_ANGLE_IDX 0 +#define _WND_CURR_ANGLE_IDX 1 +int _get_angle(Ecore_X_Window win) +{ + int after = -1; + int before = -1; + + do { + int ret, count; + int angle[2] = {-1, -1}; + unsigned char* prop_data = NULL; + + ret = ecore_x_window_prop_property_get(win, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, + 32, + &prop_data, + &count); + if (ret <= 0) { + if (prop_data) free(prop_data); + break; + } + + if (prop_data) { + memcpy(&angle, prop_data, sizeof (int) *count); + free(prop_data); + } + + after= angle[_WND_REQUEST_ANGLE_IDX]; + before = angle[_WND_CURR_ANGLE_IDX]; + } while (0); + + if (-1 == after) after = 0; + + return after; +} + +static void _rotate_img(Evas_Object *image_object, int angle, int cx, int cy) +{ + Evas_Map *em; + + _ret_if(NULL == image_object); + + em = evas_map_new(4); + _ret_if(NULL == em); + + evas_map_util_points_populate_from_object(em, image_object); + evas_map_util_rotate(em, (double) angle, cx, cy); + + evas_object_map_set(image_object, em); + evas_object_map_enable_set(image_object, EINA_TRUE); + + evas_map_free(em); +} + +#define EXTENSION_LEN 128 +#define CAPTURE_FILE_PATH "/opt/share/app_capture" +bool _make_capture_file(const char *package, int width, int height, char *img, int angle) +{ + int len; + char *filename; + Evas *e; + Evas_Object *image_object; + int canvas_width, canvas_height; + int cx = 0, cy = 0; + int mx = 0; + + _retv_if(NULL == package, false); + + len = strlen(package) + EXTENSION_LEN; + filename = malloc(len); + _retv_if(NULL == filename, false); + snprintf(filename, len, CAPTURE_FILE_PATH"/%s.jpg", package); + + if (90 == angle || 270 == angle) { + canvas_width = height; + canvas_height = width; + } else { + canvas_width = width; + canvas_height = height; + } + + e = virtual_canvas_create(canvas_width, canvas_height); + goto_if(NULL == e, error); + + image_object = evas_object_image_add(e); + goto_if(NULL == image_object, error); + + evas_object_image_size_set(image_object, width, height); + evas_object_image_data_set(image_object, img); + evas_object_image_data_update_add(image_object, 0, 0, width, height); + evas_object_resize(image_object, width, height); + evas_object_image_filled_set(image_object, EINA_TRUE); + switch (angle) { + case 90: + cx = canvas_width - width / 2; + cy = canvas_height / 2; + mx = canvas_width - width; + break; + case 180: + cx = width / 2; + cy = height / 2; + break; + case 270: + cx = width / 2; + cy = canvas_height / 2; + break; + default: + break; + } + evas_object_move(image_object, mx, 0); + _rotate_img(image_object, angle, cx, cy); + evas_object_show(image_object); + + if (access(CAPTURE_FILE_PATH, F_OK) != 0) { + mkdir(CAPTURE_FILE_PATH, 0777); + } + goto_if(false == virtual_canvas_flush_to_file(e, filename, canvas_width, canvas_height), error); + + evas_object_del(image_object); + virtual_canvas_destroy(e); + free(filename); + + return true; + +error: + do { + free(filename); + + if (!e) break; + virtual_canvas_destroy(e); + + if (!image_object) break; + evas_object_del(image_object); + } while (0); + + return false; +} + +int __resize8888(const char* pDataIn, char* pDataOut, int inWidth, int inHeight, int outWidth, int outHeight) +{ + int scaleX = 0; + int scaleY = 0; + int i = 0; + int j = 0; + int iRow = 0; + int iIndex = 0; + char* pOutput = pDataOut; + char* pOut = pDataOut; + const char* pIn = NULL; + int *pColLUT = malloc(sizeof(int) * outWidth); + + /* Calculate X Scale factor */ + scaleX = inWidth * 256 / outWidth; + /* Calculate Y Scale factor, aspect ratio is not maintained */ + scaleY = inHeight * 256 / outHeight; + for (j = 0; j < outWidth; j++) + { + /* Get input index based on column scale factor */ + /* To get more optimization, this is calculated once and + * is placed in a LUT and used for indexing + */ + pColLUT [j] = ((j * scaleX) >> 8) * 4; + } + pOut = pOutput; + for (i = 0; i < outHeight; i++) + { + /* Get input routWidth index based on routWidth scale factor */ + iRow = (i * scaleY >> 8) * inWidth * 4; + /* Loop could be unrolled for more optimization */ + for (j = 0; j < (outWidth); j++) + { + /* Get input index based on column scale factor */ + iIndex = iRow + pColLUT [j]; + pIn = pDataIn + iIndex; + *pOut++ = *pIn++; + *pOut++ = *pIn++; + *pOut++ = *pIn++; + *pOut++ = *pIn++; + } + } + + free(pColLUT); + return 0; +} + + +static void _capture_and_make_file(Ecore_X_Window win, int pid, const char *package) +{ + Visual *visual; + Window redirected_id; + + int width, height, depth; + int width_out, height_out; + int size = 0; + int angle; + + char *img; + + redirected_id = _find_capture_window(win, &visual, &depth, &width, &height); + _ret_if(redirected_id == (Window) -1 || + redirected_id == (Window) 0); + + SECURE_LOGD("Capture : win[%x] -> redirected win[%x] for %s[%d]", win, redirected_id, package, pid); + + img = _capture_window(redirected_id, visual, width, height, depth, &size); + _ret_if(NULL == img); + + width_out = width/2; + height_out = height/2; + + if ( width_out < 1 || height_out < 1 ) { + free(img); + return; + } + + __resize8888(img, img, width, height, width_out, height_out); + + angle = _get_angle(win); + if (false == _make_capture_file(package, width_out, height_out, img, angle)) { + _ERR("cannot a capture file for the package of [%s]", package); + } + + free(img); +} + + +EXPORT_API int appcore_efl_main(const char *name, int *argc, char ***argv, + struct appcore_ops *ops) +{ + int r; + GSList *iter = NULL; + struct win_node *entry = NULL; + int pid; + int ret; + + LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:main:done]", name); + + pid = getpid(); + aul_app_get_appid_bypid(pid, appid, APPID_MAX); + + r = __set_data(&priv, name, ops); + _retv_if(r == -1, -1); + + r = __before_loop(&priv, argc, argv); + if (r == -1) { + __unset_data(&priv); + return -1; + } + + elm_run(); + + aul_status_update(STATUS_DYING); + + for (iter = g_winnode_list; iter != NULL; iter = g_slist_next(iter)) { + entry = iter->data; + if(__check_skip(entry->win) == FALSE) + break; + } + if(iter) { + entry = iter->data; + if(taskmanage) { + _capture_and_make_file(entry->win, pid, appid); + } + } + + __after_loop(&priv); + + __unset_data(&priv); + + return 0; +} + +EXPORT_API int appcore_set_system_resource_reclaiming(bool enable) +{ + resource_reclaiming = enable; + + return 0; +} + +EXPORT_API int appcore_set_app_state(int state) +{ + priv.state = state; + + return 0; +} diff --git a/src/appcore-i18n.c b/src/appcore-i18n.c new file mode 100755 index 0000000..6dc1a53 --- /dev/null +++ b/src/appcore-i18n.c @@ -0,0 +1,156 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +static int _set; + +void update_lang(void) +{ + char *lang; + char *r; + + lang = vconf_get_str(VCONFKEY_LANGSET); + if (lang) { + setenv("LANG", lang, 1); + setenv("LC_MESSAGES", lang, 1); + r = setlocale(LC_ALL, ""); + if (r == NULL) { + r = setlocale(LC_ALL, vconf_get_str(VCONFKEY_LANGSET)); + if (r) + _DBG("*****appcore setlocale=%s\n", r); + } + free(lang); + } +} + +void update_region(void) +{ + char *region; + char *r; + + region = vconf_get_str(VCONFKEY_REGIONFORMAT); + if (region) { + setenv("LC_CTYPE", region, 1); + setenv("LC_NUMERIC", region, 1); + setenv("LC_TIME", region, 1); + setenv("LC_COLLATE", region, 1); + setenv("LC_MONETARY", region, 1); + setenv("LC_PAPER", region, 1); + setenv("LC_NAME", region, 1); + setenv("LC_ADDRESS", region, 1); + setenv("LC_TELEPHONE", region, 1); + setenv("LC_MEASUREMENT", region, 1); + setenv("LC_IDENTIFICATION", region, 1); + r = setlocale(LC_ALL, ""); + if (r != NULL) { + _DBG("*****appcore setlocale=%s\n", r); + } + free(region); + } +} + +static int __set_i18n(const char *domain, const char *dir) +{ + char *r; + + if (domain == NULL) { + errno = EINVAL; + return -1; + } + + r = setlocale(LC_ALL, ""); + /* if locale is not set properly, try again to set as language base */ + if (r == NULL) { + r = setlocale(LC_ALL, vconf_get_str(VCONFKEY_LANGSET)); + if (r) + _DBG("*****appcore setlocale=%s\n", r); + } + if (r == NULL) { + _ERR("appcore: setlocale() error"); + } + //_retvm_if(r == NULL, -1, "appcore: setlocale() error"); + + r = bindtextdomain(domain, dir); + if (r == NULL) { + _ERR("appcore: bindtextdomain() error"); + } + //_retvm_if(r == NULL, -1, "appcore: bindtextdomain() error"); + + r = textdomain(domain); + if (r == NULL) { + _ERR("appcore: textdomain() error"); + } + //_retvm_if(r == NULL, -1, "appcore: textdomain() error"); + + return 0; +} + + +EXPORT_API int appcore_set_i18n(const char *domainname, const char *dirname) +{ + int r; + + update_lang(); + update_region(); + + r = __set_i18n(domainname, dirname); + if (r == 0) + _set = 1; + + return r; +} + +int set_i18n(const char *domainname, const char *dirname) +{ + _retv_if(_set, 0); + + update_lang(); + update_region(); + + return __set_i18n(domainname, dirname); +} + +EXPORT_API int appcore_get_timeformat(enum appcore_time_format *timeformat) +{ + int r; + + if (timeformat == NULL) { + errno = EINVAL; + return -1; + } + + r = vconf_get_int(VCONFKEY_REGIONFORMAT_TIME1224, (int *)timeformat); + + if (r < 0) { + *timeformat = APPCORE_TIME_FORMAT_UNKNOWN; + return -1; + } else + return 0; +} diff --git a/src/appcore-measure.c b/src/appcore-measure.c new file mode 100755 index 0000000..aa379fd --- /dev/null +++ b/src/appcore-measure.c @@ -0,0 +1,93 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +static struct timeval tv_s; /* measure start */ + +static inline int __get_msec(struct timeval *s, struct timeval *e) +{ + return (e->tv_sec - s->tv_sec) * 1000 + + (e->tv_usec - s->tv_usec + 500) / 1000; +} + +static int __get_time(struct timeval *s) +{ + struct timeval t; + + _retv_if(s == NULL || (s->tv_sec == 0 && s->tv_usec == 0), 0); + + gettimeofday(&t, NULL); + + return __get_msec(s, &t); +} + +static int __get_envtime(const char *name, struct timeval *t) +{ + int r; + char *s; + + s = getenv(name ? : ENV_START); + /*_retvm_if(s == NULL, -1, "%s is not set", name);*/ + _retv_if(s == NULL, -1); + + r = sscanf(s, "%u/%u", (int *)&t->tv_sec, (int *)&t->tv_usec); + if (r != 2) + r = sscanf(s, "%u %u", (int *)&t->tv_sec, (int *)&t->tv_usec); + + _retv_if(r != 2, -1); + + return 0; +} + +static int __get_time_from(const char *name) +{ + int r; + struct timeval s; + struct timeval t; + + gettimeofday(&t, NULL); + + r = __get_envtime(name, &s); + _retv_if(r == -1, 0); + + return __get_msec(&s, &t); +} + +EXPORT_API int appcore_measure_time_from(const char *envnm) +{ + return __get_time_from(envnm); +} + +EXPORT_API int appcore_measure_time(void) +{ + return __get_time(&tv_s); +} + +EXPORT_API void appcore_measure_start(void) +{ + gettimeofday(&tv_s, NULL); +} diff --git a/src/appcore-noti.c b/src/appcore-noti.c new file mode 100755 index 0000000..c3af2aa --- /dev/null +++ b/src/appcore-noti.c @@ -0,0 +1,181 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +#define NOTI_COMP(a, b) (strcmp(a->name, b->name)) + +struct noti_s { + const char *name; + void *data; + int (*cb_pre) (void *); + int (*cb) (void *); + int (*cb_post) (void *); + + struct noti_s *next; +}; +typedef struct noti_s notis; + + +SGLIB_DEFINE_LIST_PROTOTYPES(notis, NOTI_COMP, next); +SGLIB_DEFINE_LIST_FUNCTIONS(notis, NOTI_COMP, next); + +static struct noti_s *noti_h; + +static void __main_handle(void *data) +{ + struct noti_s *n = data; + + _ret_if(n == NULL || n->name == NULL); + + _DBG("[APP %d] noti: %s", getpid(), n->name); + + if (n->cb_pre) + n->cb_pre(n->data); + + if (n->cb) + n->cb(n->data); + + if (n->cb_post) + n->cb_post(n->data); +} + +static int __del_noti(int fd, struct noti_s *t) +{ + int r; + + r = heynoti_unsubscribe(fd, t->name, __main_handle); + if (r == 0) { + sglib_notis_delete(¬i_h, t); + free((void *)t->name); + free(t); + } + + return r; +} + +static int __del_notis(int fd) +{ + struct sglib_notis_iterator it; + struct noti_s *t; + + t = sglib_notis_it_init(&it, noti_h); + while (t) { + __del_noti(fd, t); + t = sglib_notis_it_next(&it); + } + + return 0; +} + +int add_noti(int fd, const char *name, int (*cb_pre) (void *), + int (*cb) (void *), int (*cb_post) (void *), void *data) +{ + int r; + struct noti_s *t; + + if (fd < 0) { + errno = EBADF; + return -1; + } + + if (name == NULL || name[0] == '\0') { + errno = EINVAL; + return -1; + } + + t = calloc(1, sizeof(struct noti_s)); + if (t == NULL) + return -1; + + t->name = strdup(name); + if (t->name == NULL) { + free(t); + return -1; + } + + t->cb_pre = cb_pre; + t->cb = cb; + t->cb_post = cb_post; + t->data = data; + + r = heynoti_subscribe(fd, name, __main_handle, t); + if (r != 0) { + free((void *)t->name); + free(t); + return -1; + } + + sglib_notis_add(¬i_h, t); + + return r; +} + +int del_noti(int fd, const char *name) +{ + struct noti_s t; + struct noti_s *f; + + if (fd < 0) { + errno = EBADF; + return -1; + } + + t.name = name; + f = sglib_notis_find_member(noti_h, &t); + if (f == NULL) { + errno = ENOENT; + return -1; + } + + return __del_noti(fd, f); +} + +int noti_start(int fd) +{ + return heynoti_attach_handler(fd); +} + +int noti_init(void) +{ + return heynoti_init(); +} + +void noti_exit(int *fd) +{ + _ret_if(fd == NULL || *fd < 0); + + __del_notis(*fd); + + heynoti_close(*fd); + + *fd = -1; +} diff --git a/src/appcore-pmcontrol.c b/src/appcore-pmcontrol.c new file mode 100755 index 0000000..b2c02bb --- /dev/null +++ b/src/appcore-pmcontrol.c @@ -0,0 +1,57 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +EXPORT_API int appcore_lock_power_state(int s_bits) +{ + switch (s_bits) { + case LCD_NORMAL: + return pm_lock_state(s_bits, GOTO_STATE_NOW, 0); + + case LCD_DIM: + if (pm_lock_state(s_bits, STAY_CUR_STATE, 0) < 0) + return -1; + return pm_change_state(LCD_NORMAL); + + case LCD_OFF: + return pm_lock_state(s_bits, STAY_CUR_STATE, 0); + + default: + break; + } + + return -1; +} + +EXPORT_API int appcore_unlock_power_state(int s_bits) +{ + return pm_unlock_state(s_bits, STAY_CUR_STATE); +} diff --git a/src/appcore-rotation.c b/src/appcore-rotation.c new file mode 100755 index 0000000..5c493d4 --- /dev/null +++ b/src/appcore-rotation.c @@ -0,0 +1,418 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +#define _MAKE_ATOM(a, s) \ + do { \ + a = ecore_x_atom_get(s); \ + if (!a) \ + _ERR("##s creation failed.\n"); \ + } while(0) + +#define STR_ATOM_ROTATION_LOCK "_E_ROTATION_LOCK" + +static Ecore_X_Atom ATOM_ROTATION_LOCK = 0; +static Ecore_X_Window root; + +struct rot_s { + int handle; + int (*callback) (enum appcore_rm, void *); + enum appcore_rm mode; + int lock; + void *cbdata; + int cb_set; + int sf_started; + + struct ui_wm_rotate* wm_rotate; +}; +static struct rot_s rot; + +struct rot_evt { + enum accelerometer_rotate_state re; + enum appcore_rm rm; +}; + +static struct rot_evt re_to_rm[] = { + { + ROTATION_EVENT_0, + APPCORE_RM_PORTRAIT_NORMAL, + }, + { + ROTATION_EVENT_90, + APPCORE_RM_LANDSCAPE_NORMAL, + }, + { + ROTATION_EVENT_180, + APPCORE_RM_PORTRAIT_REVERSE, + }, + { + ROTATION_EVENT_270, + APPCORE_RM_LANDSCAPE_REVERSE, + }, +}; + +static enum appcore_rm __get_mode(int event_data) +{ + int i; + enum appcore_rm m; + + m = APPCORE_RM_UNKNOWN; + + for (i = 0; i < sizeof(re_to_rm) / sizeof(re_to_rm[0]); i++) { + if (re_to_rm[i].re == event_data) { + m = re_to_rm[i].rm; + break; + } + } + + return m; +} + +static void __changed_cb(unsigned int event_type, sensor_event_data_t *event, + void *data) +{ + int *cb_event_data; + enum appcore_rm m; + int ret; + + if (rot.lock) + return; + + if (event_type != ACCELEROMETER_EVENT_ROTATION_CHECK) { + errno = EINVAL; + return; + } + + cb_event_data = (int *)(event->event_data); + + m = __get_mode(*cb_event_data); + + _DBG("[APP %d] Rotation: %d -> %d", getpid(), rot.mode, m); + + if (rot.callback) { + if (rot.cb_set && rot.mode != m) { + _DBG("[APP %d] Rotation: %d -> %d", getpid(), rot.mode, m); + rot.callback(m, data); + rot.mode = m; + } + } +} + +static void __lock_cb(keynode_t *node, void *data) +{ + int r; + enum appcore_rm m; + int ret; + + rot.lock = !vconf_keynode_get_bool(node); + + if (rot.lock) { + m = APPCORE_RM_PORTRAIT_NORMAL; + if (rot.mode != m) { + rot.callback(m, data); + rot.mode = m; + } + _DBG("[APP %d] Rotation locked", getpid()); + return; + } + + _DBG("[APP %d] Rotation unlocked", getpid()); + if (rot.callback) { + if (rot.cb_set) { + r = appcore_get_rotation_state(&m); + _DBG("[APP %d] Rotmode prev %d -> curr %d", getpid(), + rot.mode, m); + if (!r && rot.mode != m) { + rot.callback(m, data); + rot.mode = m; + } + } + } +} + +static void __add_rotlock(void *data) +{ + int r; + int lock; + + lock = 0; + r = vconf_get_bool(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &lock); + if (r) { + _DBG("[APP %d] Rotation vconf get bool failed", getpid()); + } + + rot.lock = !lock; + + vconf_notify_key_changed(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, __lock_cb, + data); +} + +static void __del_rotlock(void) +{ + vconf_ignore_key_changed(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, __lock_cb); + rot.lock = 0; +} + +EXPORT_API int appcore_set_rotation_cb(int (*cb) (enum appcore_rm, void *), + void *data) +{ + if (rot.wm_rotate) { + return rot.wm_rotate->set_rotation_cb(cb, data); + } + else { + int r; + int handle; + + if (cb == NULL) { + errno = EINVAL; + return -1; + } + + if (rot.callback != NULL) { + errno = EALREADY; + return -1; + } + + handle = sf_connect(ACCELEROMETER_SENSOR); + if (handle < 0) { + _ERR("sf_connect failed: %d", handle); + return -1; + } + + r = sf_register_event(handle, ACCELEROMETER_EVENT_ROTATION_CHECK, + NULL, __changed_cb, data); + if (r < 0) { + _ERR("sf_register_event failed: %d", r); + sf_disconnect(handle); + return -1; + } + + rot.cb_set = 1; + rot.callback = cb; + rot.cbdata = data; + + r = sf_start(handle, 0); + if (r < 0) { + _ERR("sf_start failed: %d", r); + r = sf_unregister_event(handle, ACCELEROMETER_EVENT_ROTATION_CHECK); + if (r < 0) { + _ERR("sf_unregister_event failed: %d", r); + } + rot.callback = NULL; + rot.cbdata = NULL; + rot.cb_set = 0; + rot.sf_started = 0; + sf_disconnect(handle); + return -1; + } + rot.sf_started = 1; + + rot.handle = handle; + __add_rotlock(data); + + _MAKE_ATOM(ATOM_ROTATION_LOCK, STR_ATOM_ROTATION_LOCK ); + root = ecore_x_window_root_first_get(); + XSelectInput(ecore_x_display_get(), root, PropertyChangeMask); + } + return 0; +} + +EXPORT_API int appcore_unset_rotation_cb(void) +{ + if (rot.wm_rotate) { + return rot.wm_rotate->unset_rotation_cb(); + } + else { + int r; + + _retv_if(rot.callback == NULL, 0); + + __del_rotlock(); + + if (rot.cb_set) { + r = sf_unregister_event(rot.handle, + ACCELEROMETER_EVENT_ROTATION_CHECK); + if (r < 0) { + _ERR("sf_unregister_event failed: %d", r); + return -1; + } + rot.cb_set = 0; + } + rot.callback = NULL; + rot.cbdata = NULL; + + if (rot.sf_started == 1) { + r = sf_stop(rot.handle); + if (r < 0) { + _ERR("sf_stop failed: %d", r); + return -1; + } + rot.sf_started = 0; + } + + r = sf_disconnect(rot.handle); + if (r < 0) { + _ERR("sf_disconnect failed: %d", r); + return -1; + } + rot.handle = -1; + } + return 0; +} + +EXPORT_API int appcore_get_rotation_state(enum appcore_rm *curr) +{ + if (rot.wm_rotate) { + return rot.wm_rotate->get_rotation_state(curr); + } + else { + int r; + unsigned long event; + + if (curr == NULL) { + errno = EINVAL; + return -1; + } + + r = sf_check_rotation(&event); + if (r < 0) { + _ERR("sf_check_rotation failed: %d", r); + *curr = APPCORE_RM_UNKNOWN; + return -1; + } + + *curr = __get_mode(event); + } + return 0; +} + +EXPORT_API int appcore_pause_rotation_cb(void) +{ + if (rot.wm_rotate) { + return rot.wm_rotate->pause_rotation_cb(); + } + else { + int r; + + _retv_if(rot.callback == NULL, 0); + _DBG("[APP %d] appcore_pause_rotation_cb is called", getpid()); + + __del_rotlock(); + + if (rot.cb_set) { + r = sf_unregister_event(rot.handle, + ACCELEROMETER_EVENT_ROTATION_CHECK); + if (r < 0) { + _ERR("sf_unregister_event in appcore_internal_sf_stop failed: %d", r); + return -1; + } + rot.cb_set = 0; + } + + if (rot.sf_started == 1) { + r = sf_stop(rot.handle); + if (r < 0) { + _ERR("sf_stop in appcore_internal_sf_stop failed: %d", + r); + return -1; + } + rot.sf_started = 0; + } + } + + return 0; +} + +EXPORT_API int appcore_resume_rotation_cb(void) +{ + if (rot.wm_rotate) { + return rot.wm_rotate->resume_rotation_cb(); + } + else { + int r; + enum appcore_rm m; + + _retv_if(rot.callback == NULL, 0); + _DBG("[APP %d] appcore_resume_rotation_cb is called", getpid()); + + if (rot.cb_set == 0) { + r = sf_register_event(rot.handle, + ACCELEROMETER_EVENT_ROTATION_CHECK, NULL, + __changed_cb, rot.cbdata); + if (r < 0) { + _ERR("sf_register_event in appcore_internal_sf_start failed: %d", r); + return -1; + } + rot.cb_set = 1; + } + + if (rot.sf_started == 0) { + r = sf_start(rot.handle, 0); + if (r < 0) { + _ERR("sf_start in appcore_internal_sf_start failed: %d", + r); + r = sf_unregister_event(rot.handle, + ACCELEROMETER_EVENT_ROTATION_CHECK); + if (r < 0) { + _ERR("sf_unregister_event failed: %d", r); + } + rot.cb_set = 0; + return -1; + } + rot.sf_started = 1; + } + + __add_rotlock(rot.cbdata); + + r = appcore_get_rotation_state(&m); + _DBG("[APP %d] Rotmode prev %d -> curr %d", getpid(), rot.mode, m); + if (!r && rot.mode != m && rot.lock == 0) { + rot.callback(m, rot.cbdata); + rot.mode = m; + } + } + return 0; +} + +EXPORT_API int appcore_set_wm_rotation(struct ui_wm_rotate* wm_rotate) +{ + if (!wm_rotate) return -1; + + if (rot.callback) { + wm_rotate->set_rotation_cb(rot.callback, rot.cbdata); + appcore_unset_rotation_cb(); + } + rot.wm_rotate = wm_rotate; + _DBG("[APP %d] Support wm rotate:%p", getpid(), wm_rotate); + return 0; +} diff --git a/src/appcore-util.c b/src/appcore-util.c new file mode 100755 index 0000000..8d175bc --- /dev/null +++ b/src/appcore-util.c @@ -0,0 +1,65 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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 "appcore-internal.h" + +#define GETSP() ({ unsigned int sp; asm volatile ("mov %0,sp " : "=r"(sp) ); sp;}) +#define BUF_SIZE 256 +#define PAGE_SIZE (1 << 12) +#define _ALIGN_UP(addr , size) (((addr)+((size)-1))&(~((size)-1))) +#define _ALIGN_DOWN(addr , size) ((addr)&(~((size)-1))) +#define PAGE_ALIGN(addr) _ALIGN_DOWN(addr, PAGE_SIZE) + +void stack_trim(void) +{ + unsigned int sp; + char buf[BUF_SIZE]; + FILE *file; + unsigned int stacktop; + int found = 0; + + sp = GETSP(); + + sprintf(buf, "/proc/%d/maps", getpid()); + file = fopen(buf, "r"); + while (fgets(buf, BUF_SIZE, file) != NULL) { + if (strstr(buf, "[stack]")) { + found = 1; + break; + } + } + fclose(file); + + if (found) { + sscanf(buf, "%x-", &stacktop); + if (madvise + ((void *)PAGE_ALIGN(stacktop), PAGE_ALIGN(sp) - stacktop, + MADV_DONTNEED) < 0) + perror("stack madvise fail"); + } +} diff --git a/src/appcore.c b/src/appcore.c new file mode 100755 index 0000000..c9ae214 --- /dev/null +++ b/src/appcore.c @@ -0,0 +1,563 @@ +/* + * app-core + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * 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. + * + */ + + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "appcore-internal.h" + +#define SQLITE_FLUSH_MAX (1024*1024) + +#define PKGNAME_MAX 256 +#define PATH_APP_ROOT "/opt/usr/apps" +#define PATH_RO_APP_ROOT "/usr/apps" +#define PATH_RES "/res" +#define PATH_LOCALE "/locale" + +static struct appcore core; +static pid_t _pid; +char caller_appid[APPID_MAX]; + +static enum appcore_event to_ae[SE_MAX] = { + APPCORE_EVENT_UNKNOWN, /* SE_UNKNOWN */ + APPCORE_EVENT_LOW_MEMORY, /* SE_LOWMEM */ + APPCORE_EVENT_LOW_BATTERY, /* SE_LOWBAT */ + APPCORE_EVENT_LANG_CHANGE, /* SE_LANGCGH */ + APPCORE_EVENT_REGION_CHANGE, +}; + + +enum cb_type { /* callback */ + _CB_NONE, + _CB_SYSNOTI, + _CB_APPNOTI, + _CB_VCONF, +}; + +struct evt_ops { + enum cb_type type; + union { + enum appcore_event sys; + enum app_event app; + const char *vkey; + } key; + + int (*cb_pre) (void *); + int (*cb) (void *); + int (*cb_post) (void *); + + int (*vcb_pre) (void *, void *); + int (*vcb) (void *, void *); + int (*vcb_post) (void *, void *); +}; + +struct open_s { + int (*callback) (void *); + void *cbdata; +}; + +static struct open_s open; + +static int __app_terminate(void *data); +static int __app_resume(void *data); +static int __app_reset(void *data, bundle *k); + +static int __sys_lowmem_post(void *data, void *evt); +static int __sys_lowmem(void *data, void *evt); +static int __sys_lowbatt(void *data, void *evt); +static int __sys_langchg_pre(void *data, void *evt); +static int __sys_langchg(void *data, void *evt); +static int __sys_regionchg_pre(void *data, void *evt); +static int __sys_regionchg(void *data, void *evt); +extern void aul_finalize(); + + +static struct evt_ops evtops[] = { + { + .type = _CB_VCONF, + .key.vkey = VCONFKEY_SYSMAN_LOW_MEMORY, + .vcb_post = __sys_lowmem_post, + .vcb = __sys_lowmem, + }, + { + .type = _CB_VCONF, + .key.vkey = VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, + .vcb = __sys_lowbatt, + }, + { + .type = _CB_VCONF, + .key.vkey = VCONFKEY_LANGSET, + .vcb_pre = __sys_langchg_pre, + .vcb = __sys_langchg, + }, + { + .type = _CB_VCONF, + .key.vkey = VCONFKEY_REGIONFORMAT, + .vcb_pre = __sys_regionchg_pre, + .vcb = __sys_regionchg, + }, + { + .type = _CB_VCONF, + .key.vkey = VCONFKEY_REGIONFORMAT_TIME1224, + .vcb = __sys_regionchg, + }, +}; + +static int __get_dir_name(char *dirname) +{ + char pkg_name[PKGNAME_MAX]; + int r; + int pid; + + pid = getpid(); + if (pid < 0) + return -1; + + if (aul_app_get_pkgname_bypid(pid, pkg_name, PKGNAME_MAX) != AUL_R_OK) + return -1; + + r = snprintf(dirname, PATH_MAX, PATH_APP_ROOT "/%s" PATH_RES PATH_LOCALE,pkg_name); + if (r < 0) + return -1; + if (access(dirname, R_OK) == 0) return 0; + r = snprintf(dirname, PATH_MAX, PATH_RO_APP_ROOT "/%s" PATH_RES PATH_LOCALE,pkg_name); + if (r < 0) + return -1; + + return 0; +} + +static int __app_terminate(void *data) +{ + struct appcore *ac = data; + + _retv_if(ac == NULL || ac->ops == NULL, -1); + _retv_if(ac->ops->cb_app == NULL, 0); + + ac->ops->cb_app(AE_TERMINATE, ac->ops->data, NULL); + + return 0; +} + +static gboolean __prt_ltime(gpointer data) +{ + int msec; + + msec = appcore_measure_time_from(NULL); + if (msec) + _DBG("[APP %d] first idle after reset: %d msec", _pid, msec); + + return FALSE; +} + +static int __app_reset(void *data, bundle * k) +{ + struct appcore *ac = data; + _retv_if(ac == NULL || ac->ops == NULL, -1); + _retv_if(ac->ops->cb_app == NULL, 0); + + g_idle_add(__prt_ltime, ac); + + ac->ops->cb_app(AE_RESET, ac->ops->data, k); + + return 0; +} + +static int __app_resume(void *data) +{ + x_raise_win(getpid()); + return 0; +} + +static int __sys_do_default(struct appcore *ac, enum sys_event event) +{ + int r; + + switch (event) { + case SE_LOWBAT: + /*r = __def_lowbatt(ac);*/ + r = 0; + break; + default: + r = 0; + break; + }; + + return r; +} + +static int __sys_do(struct appcore *ac, enum sys_event event) +{ + struct sys_op *op; + + _retv_if(ac == NULL || event >= SE_MAX, -1); + + op = &ac->sops[event]; + + if (op->func == NULL) + return __sys_do_default(ac, event); + + return op->func(op->data); +} + +static int __sys_lowmem_post(void *data, void *evt) +{ + keynode_t *key = evt; + int val; + + val = vconf_keynode_get_int(key); + + if (val >= VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING) { +#if defined(MEMORY_FLUSH_ACTIVATE) + struct appcore *ac = data; + ac->ops->cb_app(AE_LOWMEM_POST, ac->ops->data, NULL); +#else + malloc_trim(0); +#endif + } + return 0; +} + +static int __sys_lowmem(void *data, void *evt) +{ + keynode_t *key = evt; + int val; + + val = vconf_keynode_get_int(key); + + if (val >= VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING) + return __sys_do(data, SE_LOWMEM); + + return 0; +} + +static int __sys_lowbatt(void *data, void *evt) +{ + keynode_t *key = evt; + int val; + + val = vconf_keynode_get_int(key); + + /* VCONFKEY_SYSMAN_BAT_CRITICAL_LOW or VCONFKEY_SYSMAN_POWER_OFF */ + if (val <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) + return __sys_do(data, SE_LOWBAT); + + return 0; +} + +static int __sys_langchg_pre(void *data, void *evt) +{ + update_lang(); + return 0; +} + +static int __sys_langchg(void *data, void *evt) +{ + return __sys_do(data, SE_LANGCHG); +} + +static int __sys_regionchg_pre(void *data, void *evt) +{ + update_region(); + return 0; +} + +static int __sys_regionchg(void *data, void *evt) +{ + return __sys_do(data, SE_REGIONCHG); +} + +static void __vconf_do(struct evt_ops *eo, keynode_t * key, void *data) +{ + _ret_if(eo == NULL); + + if (eo->vcb_pre) + eo->vcb_pre(data, key); + + if (eo->vcb) + eo->vcb(data, key); + + if (eo->vcb_post) + eo->vcb_post(data, key); +} + +static void __vconf_cb(keynode_t *key, void *data) +{ + int i; + const char *name; + + name = vconf_keynode_get_name(key); + _ret_if(name == NULL); + + _DBG("[APP %d] vconf changed: %s", _pid, name); + + for (i = 0; i < sizeof(evtops) / sizeof(evtops[0]); i++) { + struct evt_ops *eo = &evtops[i]; + + switch (eo->type) { + case _CB_VCONF: + if (!strcmp(name, eo->key.vkey)) + __vconf_do(eo, key, data); + break; + default: + /* do nothing */ + break; + } + } +} + +static int __add_vconf(struct appcore *ac) +{ + int i; + int r; + + for (i = 0; i < sizeof(evtops) / sizeof(evtops[0]); i++) { + struct evt_ops *eo = &evtops[i]; + + switch (eo->type) { + case _CB_VCONF: + r = vconf_notify_key_changed(eo->key.vkey, __vconf_cb, + ac); + break; + default: + /* do nothing */ + break; + } + } + + return 0; +} + +static int __del_vconf(void) +{ + int i; + int r; + + for (i = 0; i < sizeof(evtops) / sizeof(evtops[0]); i++) { + struct evt_ops *eo = &evtops[i]; + + switch (eo->type) { + case _CB_VCONF: + r = vconf_ignore_key_changed(eo->key.vkey, __vconf_cb); + break; + default: + /* do nothing */ + break; + } + } + + return 0; +} + +static int __aul_handler(aul_type type, bundle *b, void *data) +{ + int ret; + char *str = NULL; + + switch (type) { + case AUL_START: + _DBG("[APP %d] AUL event: AUL_START", _pid); + __app_reset(data, b); + str = bundle_get_val(b, AUL_K_CALLER_APPID); + SECURE_LOGD("caller_appid : %s", str); + if(str) { + strncpy(caller_appid, str, APPID_MAX-1); + caller_appid[APPID_MAX-1] = '\0'; + } + break; + case AUL_RESUME: + _DBG("[APP %d] AUL event: AUL_RESUME", _pid); + if(open.callback) { + ret = open.callback(open.cbdata); + if (ret == 0) + __app_resume(data); + } else { + __app_resume(data); + } + break; + case AUL_TERMINATE: + _DBG("[APP %d] AUL event: AUL_TERMINATE", _pid); + __app_terminate(data); + break; + default: + _DBG("[APP %d] AUL event: %d", _pid, type); + /* do nothing */ + break; + } + + return 0; +} + + +static void __clear(struct appcore *ac) +{ + memset(ac, 0, sizeof(struct appcore)); +} + +EXPORT_API char *appcore_get_caller_appid() +{ + return caller_appid; +} + +EXPORT_API int appcore_set_open_cb(int (*cb) (void *), + void *data) +{ + open.callback = cb; + open.cbdata = data; + + return 0; +} + +EXPORT_API int appcore_set_event_callback(enum appcore_event event, + int (*cb) (void *), void *data) +{ + struct appcore *ac = &core; + struct sys_op *op; + enum sys_event se; + + for (se = SE_UNKNOWN; se < SE_MAX; se++) { + if (event == to_ae[se]) + break; + } + + if (se == SE_UNKNOWN || se >= SE_MAX) { + _ERR("Unregistered event"); + errno = EINVAL; + return -1; + } + + op = &ac->sops[se]; + + op->func = cb; + op->data = data; + + return 0; +} + + + +EXPORT_API int appcore_init(const char *name, const struct ui_ops *ops, + int argc, char **argv) +{ + int r; + char dirname[PATH_MAX]; + + if (core.state != 0) { + _ERR("Already in use"); + errno = EALREADY; + return -1; + } + + if (ops == NULL || ops->cb_app == NULL) { + _ERR("ops or callback function is null"); + errno = EINVAL; + return -1; + } + + r = __get_dir_name(dirname); + r = set_i18n(name, dirname); + _retv_if(r == -1, -1); + + r = __add_vconf(&core); + if (r == -1) { + _ERR("Add vconf callback failed"); + goto err; + } + + r = aul_launch_init(__aul_handler, &core); + if (r < 0) { + _ERR("Aul init failed: %d", r); + goto err; + } + + r = aul_launch_argv_handler(argc, argv); + if (r < 0) { + _ERR("Aul argv handler failed: %d", r); + goto err; + } + + core.ops = ops; + core.state = 1; /* TODO: use enum value */ + + _pid = getpid(); + + return 0; + err: + __del_vconf(); + __clear(&core); + return -1; +} + +EXPORT_API void appcore_exit(void) +{ + if (core.state) { + __del_vconf(); + __clear(&core); + } + aul_finalize(); +} + +EXPORT_API int appcore_flush_memory(void) +{ + int (*flush_fn) (int); + int size = 0; + + struct appcore *ac = &core; + + if (!core.state) { + _ERR("Appcore not initialized"); + return -1; + } + + //_DBG("[APP %d] Flushing memory ...", _pid); + + if (ac->ops->cb_app) { + ac->ops->cb_app(AE_MEM_FLUSH, ac->ops->data, NULL); + } + + flush_fn = dlsym(RTLD_DEFAULT, "sqlite3_release_memory"); + if (flush_fn) { + size = flush_fn(SQLITE_FLUSH_MAX); + } + + malloc_trim(0); + /* + *Disabled - the impact of stack_trim() is unclear + *stack_trim(); + */ + + //_DBG("[APP %d] Flushing memory DONE", _pid); + + return 0; +} diff --git a/src/virtual_canvas.c b/src/virtual_canvas.c new file mode 100755 index 0000000..3b8308f --- /dev/null +++ b/src/virtual_canvas.c @@ -0,0 +1,139 @@ +/* + * starter + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Seungtaek Chung , Mi-Ju Lee , Xi Zhichan + * + * 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 "appcore-internal.h" +#include "virtual_canvas.h" + + +#define QUALITY_N_COMPRESS "quality=100 compress=1" + + + +Evas *virtual_canvas_create(int w, int h) +{ + Ecore_Evas *internal_ee; + Evas *internal_e; + + // Create virtual canvas + internal_ee = ecore_evas_buffer_new(w, h); + if (!internal_ee) { + _DBG("Failed to create a new canvas buffer\n"); + return NULL; + } + + ecore_evas_alpha_set(internal_ee, EINA_TRUE); + ecore_evas_manual_render_set(internal_ee, EINA_TRUE); + + // Get the "Evas" object from a virtual canvas + internal_e = ecore_evas_get(internal_ee); + if (!internal_e) { + ecore_evas_free(internal_ee); + _DBG("Faield to get Evas object\n"); + return NULL; + } + + return internal_e; +} + + + +static bool _flush_data_to_file(Evas *e, char *data, const char *filename, int w, int h) +{ + Evas_Object *output; + + output = evas_object_image_add(e); + if (!output) { + _DBG("Failed to create an image object\n"); + return false; + } + + evas_object_image_data_set(output, NULL); + evas_object_image_colorspace_set(output, EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(output, EINA_TRUE); + evas_object_image_size_set(output, w, h); + evas_object_image_smooth_scale_set(output, EINA_TRUE); + evas_object_image_data_set(output, data); + evas_object_image_data_update_add(output, 0, 0, w, h); + + if (evas_object_image_save(output, filename, NULL, QUALITY_N_COMPRESS) == EINA_FALSE) { + evas_object_del(output); + _DBG("Faild to save a captured image (%s)\n", filename); + return false; + } + + evas_object_del(output); + + if (access(filename, F_OK) != 0) { + _DBG("File %s is not found\n", filename); + return false; + } + + return true; +} + + + +bool virtual_canvas_flush_to_file(Evas *e, const char *filename, int w, int h) +{ + void *data; + Ecore_Evas *internal_ee; + + internal_ee = ecore_evas_ecore_evas_get(e); + if (!internal_ee) { + _DBG("Failed to get ecore evas\n"); + return false; + } + + ecore_evas_manual_render(internal_ee); + + // Get a pointer of a buffer of the virtual canvas + data = (void *) ecore_evas_buffer_pixels_get(internal_ee); + if (!data) { + _DBG("Failed to get pixel data\n"); + return false; + } + + return _flush_data_to_file(e, data, filename, w, h); +} + + + +bool virtual_canvas_destroy(Evas *e) +{ + Ecore_Evas *ee; + + ee = ecore_evas_ecore_evas_get(e); + if (!ee) { + _DBG("Failed to ecore evas object\n"); + return false; + } + + ecore_evas_free(ee); + return true; +} + + + +// End of a file -- 2.7.4