From 8a2a6325686089b7a535e7d7afabba68476cd168 Mon Sep 17 00:00:00 2001 From: "jk7744.park" Date: Wed, 9 Sep 2015 00:23:52 +0900 Subject: [PATCH] tizen 2.3.1 release --- .gitignore | 41 + CMakeLists.txt | 346 +++ DESCRIPTION | 1 + LICENSE.APLv2 | 203 ++ LICENSE.Flora | 206 ++ NOTICE | 1 + README | 39 + ...gets_Access Request Policy_PAG Report_49839.pdf | Bin 0 -> 420031 bytes build/Options.cmake | 58 + data/DESCRIPTION | 8 + data/Wrt.edc | 380 +++ data/generic_popup.edc | 181 ++ data/generic_popup_horizontal.edc | 52 + dir-struct.py | 140 ++ doxyfile | 1600 +++++++++++++ packaging/wrt.spec | 185 ++ pkgconfig/wrt-core.pc.in | 12 + po/CMakeLists.txt | 43 + po/ar.po | 90 + po/az.po | 90 + po/bg.po | 90 + po/bn.po | 90 + po/ca.po | 90 + po/cs.po | 90 + po/da.po | 90 + po/de_DE.po | 90 + po/el_GR.po | 90 + po/en.po | 90 + po/en_PH.po | 90 + po/en_US.po | 90 + po/es_ES.po | 90 + po/es_MX.po | 90 + po/es_US.po | 90 + po/et.po | 90 + po/eu.po | 90 + po/fi.po | 90 + po/fr_CA.po | 90 + po/fr_FR.po | 90 + po/ga.po | 90 + po/gl.po | 90 + po/gu.po | 90 + po/hi.po | 90 + po/hr.po | 90 + po/hu.po | 90 + po/hy.po | 90 + po/id.po | 90 + po/is.po | 90 + po/it_IT.po | 90 + po/ja_JP.po | 90 + po/ka.po | 90 + po/kk.po | 90 + po/km.po | 90 + po/kn.po | 90 + po/ko_KR.po | 90 + po/lo.po | 90 + po/lt.po | 90 + po/lv.po | 90 + po/mk.po | 90 + po/ml.po | 90 + po/mn_MN.po | 90 + po/mr.po | 90 + po/ms.po | 90 + po/my.po | 90 + po/nb.po | 90 + po/ne.po | 90 + po/nl_NL.po | 90 + po/or.po | 90 + po/pa.po | 90 + po/pl.po | 90 + po/pt_BR.po | 90 + po/pt_PT.po | 90 + po/ro.po | 90 + po/ru_RU.po | 90 + po/si.po | 90 + po/sk.po | 90 + po/sl.po | 90 + po/sr.po | 90 + po/sv.po | 90 + po/ta.po | 90 + po/te.po | 90 + po/th.po | 90 + po/tl.po | 90 + po/tr_TR.po | 90 + po/uk.po | 90 + po/ur.po | 90 + po/uz.po | 90 + po/vi.po | 90 + po/zh_CN.po | 90 + po/zh_HK.po | 90 + po/zh_SG.po | 87 + po/zh_TW.po | 90 + src/CMakeLists.txt | 253 ++ src/DESCRIPTION | 1 + src/api_new/CMakeLists.txt | 99 + src/api_new/core_module.cpp | 175 ++ src/api_new/core_module.h | 71 + src/api_new/i_runnable_widget_object.h | 145 ++ src/api_new/runnable_widget_object.cpp | 305 +++ src/api_new/runnable_widget_object.h | 88 + src/api_new/runnable_widget_object_state.cpp | 246 ++ src/api_new/runnable_widget_object_state.h | 170 ++ src/api_new/security_support.cpp | 150 ++ src/api_new/security_support.h | 31 + src/api_new/user_delegates.h | 88 + src/domain/DESCRIPTION | 1 + src/domain/application_data.cpp | 119 + src/domain/application_data.h | 61 + src/domain/iana_record_types.h | 31 + src/domain/localization_setting.cpp | 37 + src/domain/localization_setting.h | 32 + src/domain/main_thread.cpp | 61 + src/domain/main_thread.h | 44 + src/domain/message_support.h | 61 + src/domain/permission_popup_manager.cpp | 151 ++ src/domain/permission_popup_manager.h | 59 + src/domain/widget_data_types.cpp | 370 +++ src/domain/widget_data_types.h | 294 +++ src/domain/widget_deserialize_model.cpp | 89 + src/domain/widget_deserialize_model.h | 42 + src/domain/widget_model.cpp | 122 + src/domain/widget_model.h | 238 ++ src/domain/widget_string.h | 96 + src/pre-launching/pre_launching_support.cpp | 223 ++ src/pre-launching/pre_launching_support.h | 79 + src/profiling/CMakeLists.txt | 42 + src/profiling/profiling_util.cpp | 174 ++ src/profiling/profiling_util.h | 61 + src/profiling/script/profiling-host-part.pl | 88 + src/profiling/script/profiling-target-part.pl | 308 +++ src/profiling/script/ranges | 5 + src/profiling/script/ranges.py | 68 + .../script/test-widgets/0Jet_Pack_Agent.wgt | Bin 0 -> 1129126 bytes src/profiling/script/test-widgets/UnitTestAuto.wgt | Bin 0 -> 235920 bytes src/profiling/script/test-widgets/minimal.wgt | Bin 0 -> 5563 bytes src/profiling/script/utils/analyse.pl | 135 ++ src/profiling/script/utils/csv-stats.pl | 420 ++++ src/profiling/script/utils/generate-plot.sh | 39 + src/profiling/script/utils/plot-generator.gplot | 33 + src/profiling/script/utils/wrt-preloader | Bin 0 -> 30429 bytes src/view/CMakeLists.txt | 26 + src/view/common/CMakeLists.txt | 102 + src/view/common/application_launcher.cpp | 267 +++ src/view/common/application_launcher.h | 82 + src/view/common/evas_object.cpp | 227 ++ src/view/common/evas_object.h | 647 +++++ src/view/common/scheme.cpp | 84 + src/view/common/scheme.h | 78 + src/view/common/scheme_action_map.cpp | 416 ++++ src/view/common/scheme_action_map.h | 33 + src/view/common/scheme_action_map_data.h | 77 + src/view/common/scheme_action_map_type.h | 36 + src/view/common/view_logic_apps_support.cpp | 411 ++++ src/view/common/view_logic_apps_support.h | 52 + src/view/common/view_logic_certificate_support.cpp | 275 +++ src/view/common/view_logic_certificate_support.h | 81 + .../common/view_logic_custom_header_support.cpp | 66 + src/view/common/view_logic_custom_header_support.h | 35 + .../common/view_logic_get_parent_window_util.h | 57 + src/view/common/view_logic_help_popup_support.cpp | 92 + src/view/common/view_logic_help_popup_support.h | 33 + src/view/common/view_logic_privilege_support.cpp | 150 ++ src/view/common/view_logic_privilege_support.h | 56 + .../common/view_logic_security_origin_support.cpp | 82 + .../common/view_logic_security_origin_support.h | 49 + .../view_logic_security_origin_support_util.cpp | 233 ++ .../view_logic_security_origin_support_util.h | 76 + src/view/common/view_logic_security_support.cpp | 93 + src/view/common/view_logic_security_support.h | 38 + src/view/common/view_logic_storage_support.cpp | 116 + src/view/common/view_logic_storage_support.h | 35 + src/view/common/view_logic_uri_support.cpp | 450 ++++ src/view/common/view_logic_uri_support.h | 46 + src/view/common/view_logic_vibration_support.cpp | 120 + src/view/common/view_logic_vibration_support.h | 47 + src/view/context_manager.cpp | 42 + src/view/i_context_manager.h | 84 + src/view/i_view_module.h | 76 + src/view/view_module.cpp | 32 + src/view/webkit/CMakeLists.txt | 117 + src/view/webkit/ewk_context_manager.cpp | 333 +++ src/view/webkit/ewk_context_manager.h | 71 + src/view/webkit/injected-bundle/CMakeLists.txt | 137 ++ .../injected_bundle_decryption_support.cpp | 70 + .../injected_bundle_decryption_support.h | 56 + .../injected_bundle_decryption_support_impl.cpp | 250 ++ .../injected_bundle_decryption_support_impl.h | 58 + .../injected_bundle_plugin_interface.cpp | 97 + .../injected_bundle_plugin_interface.h | 55 + ...ted_bundle_threaded_decryption_support_impl.cpp | 199 ++ ...ected_bundle_threaded_decryption_support_impl.h | 85 + .../injected_bundle_uri_handling.cpp | 323 +++ .../injected-bundle/injected_bundle_uri_handling.h | 44 + .../injected_bundle_viewmodes_support.cpp | 231 ++ .../injected_bundle_viewmodes_support.h | 46 + .../page_global_context_container.cpp | 74 + .../page_global_context_container.h | 67 + .../webkit/injected-bundle/wrt-injected-bundle.cpp | 1260 ++++++++++ .../webkit/injected-bundle/wrt-injected-bundle.h | 207 ++ .../webkit/injected-bundle/wrt-injected-bundle.map | 17 + src/view/webkit/view_logic.cpp | 2500 ++++++++++++++++++++ src/view/webkit/view_logic.h | 359 +++ ...view_logic_authentication_challenge_support.cpp | 238 ++ .../view_logic_authentication_challenge_support.h | 36 + .../view_logic_authentication_request_support.cpp | 320 +++ .../view_logic_authentication_request_support.h | 36 + .../view_logic_certificate_confirm_support.cpp | 172 ++ .../view_logic_certificate_confirm_support.h | 40 + src/view/webkit/view_logic_geolocation_support.cpp | 202 ++ src/view/webkit/view_logic_geolocation_support.h | 49 + src/view/webkit/view_logic_message_support.cpp | 155 ++ src/view/webkit/view_logic_message_support.h | 52 + src/view/webkit/view_logic_orientation_support.cpp | 75 + src/view/webkit/view_logic_orientation_support.h | 38 + src/view/webkit/view_logic_scheme_support.cpp | 120 + src/view/webkit/view_logic_scheme_support.h | 41 + src/view/webkit/view_logic_user_agent_support.cpp | 131 + src/view/webkit/view_logic_user_agent_support.h | 35 + src/view/webkit/view_logic_usermedia_support.cpp | 177 ++ src/view/webkit/view_logic_usermedia_support.h | 40 + .../webkit/view_logic_web_notification_data.cpp | 72 + src/view/webkit/view_logic_web_notification_data.h | 52 + ...w_logic_web_notification_permission_support.cpp | 182 ++ ...iew_logic_web_notification_permission_support.h | 41 + .../webkit/view_logic_web_notification_support.cpp | 379 +++ .../webkit/view_logic_web_notification_support.h | 46 + src/view/webkit/view_logic_web_storage_support.cpp | 191 ++ src/view/webkit/view_logic_web_storage_support.h | 47 + src/wrt-client/CMakeLists.txt | 83 + src/wrt-client/DESCRIPTION | 1 + src/wrt-client/client_command_line_parser.cpp | 119 + src/wrt-client/client_command_line_parser.h | 31 + src/wrt-client/client_ide_support.cpp | 102 + src/wrt-client/client_ide_support.h | 32 + src/wrt-client/client_orientation_support.cpp | 278 +++ src/wrt-client/client_orientation_support.h | 75 + src/wrt-client/client_submode_support.cpp | 199 ++ src/wrt-client/client_submode_support.h | 47 + .../process_pool/smack_labeling_support.cpp | 217 ++ .../process_pool/smack_labeling_support.h | 28 + src/wrt-client/splash_screen_support.cpp | 301 +++ src/wrt-client/splash_screen_support.h | 57 + src/wrt-client/web_app_manager.cpp | 221 ++ src/wrt-client/web_app_manager.h | 61 + src/wrt-client/widget_state.h | 36 + src/wrt-client/window_data.cpp | 448 ++++ src/wrt-client/window_data.h | 124 + src/wrt-client/wrt-client-lite.cpp | 928 ++++++++ src/wrt-client/wrt-client-lite.h | 136 ++ src/wrt-client/wrt-client.cpp | 1378 +++++++++++ src/wrt-client/wrt-client.h | 171 ++ src/wrt-launcher/CMakeLists.txt | 58 + src/wrt-launcher/wrt-launcher.cpp | 517 ++++ src/wrt-launchpad-daemon/CMakeLists.txt | 124 + src/wrt-launchpad-daemon/data/preload_list_wrt.in | 17 + .../data/preload_list_wrt_lite.in | 8 + .../data/preload_list_wrt_one_ui.in | 4 + src/wrt-launchpad-daemon/include/access_control.h | 27 + src/wrt-launchpad-daemon/include/app_signal.h | 29 + src/wrt-launchpad-daemon/include/app_sock.h | 79 + src/wrt-launchpad-daemon/include/config.h | 27 + .../include/execute_on_whole_thread_util.h | 216 ++ src/wrt-launchpad-daemon/include/launchpad_util.h | 325 +++ src/wrt-launchpad-daemon/include/menu_db_util.h | 265 +++ src/wrt-launchpad-daemon/include/pre_launching.h | 41 + src/wrt-launchpad-daemon/include/preexec.h | 194 ++ src/wrt-launchpad-daemon/include/preload.h | 197 ++ src/wrt-launchpad-daemon/include/process_pool.h | 44 + .../include/process_pool_launchpad_util.h | 164 ++ src/wrt-launchpad-daemon/include/sigchild.h | 281 +++ src/wrt-launchpad-daemon/include/simple_util.h | 69 + src/wrt-launchpad-daemon/include/web_app_core.h | 67 + .../include/web_app_core_data.h | 75 + .../include/web_app_core_tskmgr_util.h | 27 + .../include/web_app_core_x_util.h | 30 + .../include/web_internal_eventloop.h | 74 + src/wrt-launchpad-daemon/src/access_control.cpp | 180 ++ src/wrt-launchpad-daemon/src/app_sock.cpp | 450 ++++ src/wrt-launchpad-daemon/src/launchpad.cpp | 777 ++++++ src/wrt-launchpad-daemon/src/launchpad_lite.cpp | 476 ++++ src/wrt-launchpad-daemon/src/pre_launching.cpp | 333 +++ src/wrt-launchpad-daemon/src/process_pool.cpp | 285 +++ src/wrt-launchpad-daemon/src/simple_util.cpp | 222 ++ src/wrt-launchpad-daemon/src/web_app_core.cpp | 435 ++++ src/wrt-launchpad-daemon/src/web_app_core_data.cpp | 241 ++ .../src/web_app_core_tskmgr_util.cpp | 491 ++++ .../src/web_app_core_x_util.cpp | 148 ++ .../src/web_internal_eventloop.cpp | 129 + src/wrt-launchpad-daemon/wrt_launchpad_daemon.map | 18 + systemd/wrt_launchpad_daemon@.service | 13 + systemd/wrt_launchpad_daemon_1.socket | 10 + systemd/wrt_launchpad_daemon_1.socket.in | 10 + systemd/wrt_launchpad_daemon_1.socket.lite.in | 10 + systemd/wrt_launchpad_daemon_2.socket | 7 + tests/CMakeLists.txt | 19 + tests/widgets/CMakeLists.txt | 87 + tests/widgets/CMakeUtils.txt | 184 ++ tests/widgets/TestCases.cpp | 1052 ++++++++ tests/widgets/TestInit.cpp | 37 + tests/widgets/common/CMakeLists.txt | 45 + tests/widgets/common/include/InstallerWrapper.h | 44 + .../common/include/RunnableObjectStateTester.h | 88 + .../common/include/mock/MockContextManager.h | 37 + tests/widgets/common/include/mock/MockViewModule.h | 57 + tests/widgets/common/src/InstallerWrapper.cpp | 139 ++ .../common/src/RunnableObjectStateTester.cpp | 192 ++ .../widgets/common/src/mock/MockContextManager.cpp | 60 + tests/widgets/common/src/mock/MockViewModule.cpp | 106 + tests/widgets/files/CMakeLists.txt | 22 + tests/widgets/files/any.wgt | Bin 0 -> 1046 bytes tests/widgets/files/minimal.wgt | Bin 0 -> 1957 bytes uncrustify.cfg | 170 ++ uncrustify.sh | 1 + wrt-engine-test.map | 7 + wrt-engine.map | 23 + wrt.manifest | 18 + wrt_env.sh | 7 + wrt_launchpad_daemon.rule.in | 7 + wrt_launchpad_daemon.rule.lite.in | 158 ++ wrt_reset_all.sh | 23 + wrt_reset_db.sh | 21 + 320 files changed, 44964 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 DESCRIPTION create mode 100644 LICENSE.APLv2 create mode 100644 LICENSE.Flora create mode 100644 NOTICE create mode 100755 README create mode 100644 WARP_Widgets_Access Request Policy_PAG Report_49839.pdf create mode 100644 build/Options.cmake create mode 100644 data/DESCRIPTION create mode 100644 data/Wrt.edc create mode 100644 data/generic_popup.edc create mode 100644 data/generic_popup_horizontal.edc create mode 100755 dir-struct.py create mode 100644 doxyfile create mode 100755 packaging/wrt.spec create mode 100644 pkgconfig/wrt-core.pc.in create mode 100755 po/CMakeLists.txt create mode 100755 po/ar.po create mode 100755 po/az.po create mode 100755 po/bg.po create mode 100755 po/bn.po create mode 100755 po/ca.po create mode 100755 po/cs.po create mode 100755 po/da.po create mode 100755 po/de_DE.po create mode 100755 po/el_GR.po create mode 100755 po/en.po create mode 100755 po/en_PH.po create mode 100755 po/en_US.po create mode 100755 po/es_ES.po create mode 100755 po/es_MX.po create mode 100755 po/es_US.po create mode 100755 po/et.po create mode 100755 po/eu.po create mode 100755 po/fi.po create mode 100755 po/fr_CA.po create mode 100755 po/fr_FR.po create mode 100755 po/ga.po create mode 100755 po/gl.po create mode 100755 po/gu.po create mode 100755 po/hi.po create mode 100755 po/hr.po create mode 100755 po/hu.po create mode 100755 po/hy.po create mode 100755 po/id.po create mode 100755 po/is.po create mode 100755 po/it_IT.po create mode 100755 po/ja_JP.po create mode 100755 po/ka.po create mode 100755 po/kk.po create mode 100755 po/km.po create mode 100755 po/kn.po create mode 100755 po/ko_KR.po create mode 100755 po/lo.po create mode 100755 po/lt.po create mode 100755 po/lv.po create mode 100755 po/mk.po create mode 100755 po/ml.po create mode 100755 po/mn_MN.po create mode 100755 po/mr.po create mode 100755 po/ms.po create mode 100755 po/my.po create mode 100755 po/nb.po create mode 100755 po/ne.po create mode 100755 po/nl_NL.po create mode 100755 po/or.po create mode 100755 po/pa.po create mode 100755 po/pl.po create mode 100755 po/pt_BR.po create mode 100755 po/pt_PT.po create mode 100755 po/ro.po create mode 100755 po/ru_RU.po create mode 100755 po/si.po create mode 100755 po/sk.po create mode 100755 po/sl.po create mode 100755 po/sr.po create mode 100755 po/sv.po create mode 100755 po/ta.po create mode 100755 po/te.po create mode 100755 po/th.po create mode 100755 po/tl.po create mode 100755 po/tr_TR.po create mode 100755 po/uk.po create mode 100755 po/ur.po create mode 100755 po/uz.po create mode 100755 po/vi.po create mode 100755 po/zh_CN.po create mode 100755 po/zh_HK.po create mode 100755 po/zh_SG.po create mode 100755 po/zh_TW.po create mode 100644 src/CMakeLists.txt create mode 100644 src/DESCRIPTION create mode 100644 src/api_new/CMakeLists.txt create mode 100644 src/api_new/core_module.cpp create mode 100644 src/api_new/core_module.h create mode 100644 src/api_new/i_runnable_widget_object.h create mode 100644 src/api_new/runnable_widget_object.cpp create mode 100644 src/api_new/runnable_widget_object.h create mode 100644 src/api_new/runnable_widget_object_state.cpp create mode 100644 src/api_new/runnable_widget_object_state.h create mode 100755 src/api_new/security_support.cpp create mode 100644 src/api_new/security_support.h create mode 100755 src/api_new/user_delegates.h create mode 100644 src/domain/DESCRIPTION create mode 100644 src/domain/application_data.cpp create mode 100644 src/domain/application_data.h create mode 100644 src/domain/iana_record_types.h create mode 100644 src/domain/localization_setting.cpp create mode 100644 src/domain/localization_setting.h create mode 100644 src/domain/main_thread.cpp create mode 100644 src/domain/main_thread.h create mode 100644 src/domain/message_support.h create mode 100644 src/domain/permission_popup_manager.cpp create mode 100644 src/domain/permission_popup_manager.h create mode 100755 src/domain/widget_data_types.cpp create mode 100755 src/domain/widget_data_types.h create mode 100644 src/domain/widget_deserialize_model.cpp create mode 100644 src/domain/widget_deserialize_model.h create mode 100644 src/domain/widget_model.cpp create mode 100644 src/domain/widget_model.h create mode 100644 src/domain/widget_string.h create mode 100644 src/pre-launching/pre_launching_support.cpp create mode 100644 src/pre-launching/pre_launching_support.h create mode 100644 src/profiling/CMakeLists.txt create mode 100644 src/profiling/profiling_util.cpp create mode 100644 src/profiling/profiling_util.h create mode 100755 src/profiling/script/profiling-host-part.pl create mode 100755 src/profiling/script/profiling-target-part.pl create mode 100644 src/profiling/script/ranges create mode 100755 src/profiling/script/ranges.py create mode 100644 src/profiling/script/test-widgets/0Jet_Pack_Agent.wgt create mode 100644 src/profiling/script/test-widgets/UnitTestAuto.wgt create mode 100644 src/profiling/script/test-widgets/minimal.wgt create mode 100755 src/profiling/script/utils/analyse.pl create mode 100755 src/profiling/script/utils/csv-stats.pl create mode 100755 src/profiling/script/utils/generate-plot.sh create mode 100644 src/profiling/script/utils/plot-generator.gplot create mode 100755 src/profiling/script/utils/wrt-preloader create mode 100644 src/view/CMakeLists.txt create mode 100644 src/view/common/CMakeLists.txt create mode 100644 src/view/common/application_launcher.cpp create mode 100644 src/view/common/application_launcher.h create mode 100644 src/view/common/evas_object.cpp create mode 100644 src/view/common/evas_object.h create mode 100644 src/view/common/scheme.cpp create mode 100644 src/view/common/scheme.h create mode 100644 src/view/common/scheme_action_map.cpp create mode 100644 src/view/common/scheme_action_map.h create mode 100644 src/view/common/scheme_action_map_data.h create mode 100644 src/view/common/scheme_action_map_type.h create mode 100644 src/view/common/view_logic_apps_support.cpp create mode 100644 src/view/common/view_logic_apps_support.h create mode 100644 src/view/common/view_logic_certificate_support.cpp create mode 100644 src/view/common/view_logic_certificate_support.h create mode 100644 src/view/common/view_logic_custom_header_support.cpp create mode 100644 src/view/common/view_logic_custom_header_support.h create mode 100644 src/view/common/view_logic_get_parent_window_util.h create mode 100644 src/view/common/view_logic_help_popup_support.cpp create mode 100644 src/view/common/view_logic_help_popup_support.h create mode 100644 src/view/common/view_logic_privilege_support.cpp create mode 100644 src/view/common/view_logic_privilege_support.h create mode 100644 src/view/common/view_logic_security_origin_support.cpp create mode 100755 src/view/common/view_logic_security_origin_support.h create mode 100644 src/view/common/view_logic_security_origin_support_util.cpp create mode 100644 src/view/common/view_logic_security_origin_support_util.h create mode 100644 src/view/common/view_logic_security_support.cpp create mode 100644 src/view/common/view_logic_security_support.h create mode 100644 src/view/common/view_logic_storage_support.cpp create mode 100644 src/view/common/view_logic_storage_support.h create mode 100644 src/view/common/view_logic_uri_support.cpp create mode 100644 src/view/common/view_logic_uri_support.h create mode 100644 src/view/common/view_logic_vibration_support.cpp create mode 100644 src/view/common/view_logic_vibration_support.h create mode 100644 src/view/context_manager.cpp create mode 100644 src/view/i_context_manager.h create mode 100644 src/view/i_view_module.h create mode 100644 src/view/view_module.cpp create mode 100644 src/view/webkit/CMakeLists.txt create mode 100644 src/view/webkit/ewk_context_manager.cpp create mode 100644 src/view/webkit/ewk_context_manager.h create mode 100644 src/view/webkit/injected-bundle/CMakeLists.txt create mode 100644 src/view/webkit/injected-bundle/injected_bundle_decryption_support.cpp create mode 100644 src/view/webkit/injected-bundle/injected_bundle_decryption_support.h create mode 100644 src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.cpp create mode 100644 src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.h create mode 100644 src/view/webkit/injected-bundle/injected_bundle_plugin_interface.cpp create mode 100644 src/view/webkit/injected-bundle/injected_bundle_plugin_interface.h create mode 100644 src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.cpp create mode 100644 src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.h create mode 100644 src/view/webkit/injected-bundle/injected_bundle_uri_handling.cpp create mode 100644 src/view/webkit/injected-bundle/injected_bundle_uri_handling.h create mode 100644 src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.cpp create mode 100644 src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.h create mode 100644 src/view/webkit/injected-bundle/page_global_context_container.cpp create mode 100644 src/view/webkit/injected-bundle/page_global_context_container.h create mode 100644 src/view/webkit/injected-bundle/wrt-injected-bundle.cpp create mode 100644 src/view/webkit/injected-bundle/wrt-injected-bundle.h create mode 100644 src/view/webkit/injected-bundle/wrt-injected-bundle.map create mode 100644 src/view/webkit/view_logic.cpp create mode 100644 src/view/webkit/view_logic.h create mode 100644 src/view/webkit/view_logic_authentication_challenge_support.cpp create mode 100644 src/view/webkit/view_logic_authentication_challenge_support.h create mode 100644 src/view/webkit/view_logic_authentication_request_support.cpp create mode 100644 src/view/webkit/view_logic_authentication_request_support.h create mode 100644 src/view/webkit/view_logic_certificate_confirm_support.cpp create mode 100755 src/view/webkit/view_logic_certificate_confirm_support.h create mode 100644 src/view/webkit/view_logic_geolocation_support.cpp create mode 100644 src/view/webkit/view_logic_geolocation_support.h create mode 100644 src/view/webkit/view_logic_message_support.cpp create mode 100644 src/view/webkit/view_logic_message_support.h create mode 100644 src/view/webkit/view_logic_orientation_support.cpp create mode 100644 src/view/webkit/view_logic_orientation_support.h create mode 100644 src/view/webkit/view_logic_scheme_support.cpp create mode 100644 src/view/webkit/view_logic_scheme_support.h create mode 100644 src/view/webkit/view_logic_user_agent_support.cpp create mode 100644 src/view/webkit/view_logic_user_agent_support.h create mode 100644 src/view/webkit/view_logic_usermedia_support.cpp create mode 100644 src/view/webkit/view_logic_usermedia_support.h create mode 100644 src/view/webkit/view_logic_web_notification_data.cpp create mode 100644 src/view/webkit/view_logic_web_notification_data.h create mode 100644 src/view/webkit/view_logic_web_notification_permission_support.cpp create mode 100644 src/view/webkit/view_logic_web_notification_permission_support.h create mode 100644 src/view/webkit/view_logic_web_notification_support.cpp create mode 100644 src/view/webkit/view_logic_web_notification_support.h create mode 100644 src/view/webkit/view_logic_web_storage_support.cpp create mode 100644 src/view/webkit/view_logic_web_storage_support.h create mode 100644 src/wrt-client/CMakeLists.txt create mode 100644 src/wrt-client/DESCRIPTION create mode 100644 src/wrt-client/client_command_line_parser.cpp create mode 100644 src/wrt-client/client_command_line_parser.h create mode 100644 src/wrt-client/client_ide_support.cpp create mode 100644 src/wrt-client/client_ide_support.h create mode 100644 src/wrt-client/client_orientation_support.cpp create mode 100644 src/wrt-client/client_orientation_support.h create mode 100644 src/wrt-client/client_submode_support.cpp create mode 100644 src/wrt-client/client_submode_support.h create mode 100644 src/wrt-client/process_pool/smack_labeling_support.cpp create mode 100644 src/wrt-client/process_pool/smack_labeling_support.h create mode 100644 src/wrt-client/splash_screen_support.cpp create mode 100644 src/wrt-client/splash_screen_support.h create mode 100644 src/wrt-client/web_app_manager.cpp create mode 100644 src/wrt-client/web_app_manager.h create mode 100644 src/wrt-client/widget_state.h create mode 100644 src/wrt-client/window_data.cpp create mode 100644 src/wrt-client/window_data.h create mode 100644 src/wrt-client/wrt-client-lite.cpp create mode 100644 src/wrt-client/wrt-client-lite.h create mode 100644 src/wrt-client/wrt-client.cpp create mode 100755 src/wrt-client/wrt-client.h create mode 100644 src/wrt-launcher/CMakeLists.txt create mode 100755 src/wrt-launcher/wrt-launcher.cpp create mode 100644 src/wrt-launchpad-daemon/CMakeLists.txt create mode 100644 src/wrt-launchpad-daemon/data/preload_list_wrt.in create mode 100644 src/wrt-launchpad-daemon/data/preload_list_wrt_lite.in create mode 100644 src/wrt-launchpad-daemon/data/preload_list_wrt_one_ui.in create mode 100644 src/wrt-launchpad-daemon/include/access_control.h create mode 100644 src/wrt-launchpad-daemon/include/app_signal.h create mode 100644 src/wrt-launchpad-daemon/include/app_sock.h create mode 100644 src/wrt-launchpad-daemon/include/config.h create mode 100644 src/wrt-launchpad-daemon/include/execute_on_whole_thread_util.h create mode 100755 src/wrt-launchpad-daemon/include/launchpad_util.h create mode 100644 src/wrt-launchpad-daemon/include/menu_db_util.h create mode 100644 src/wrt-launchpad-daemon/include/pre_launching.h create mode 100644 src/wrt-launchpad-daemon/include/preexec.h create mode 100644 src/wrt-launchpad-daemon/include/preload.h create mode 100644 src/wrt-launchpad-daemon/include/process_pool.h create mode 100644 src/wrt-launchpad-daemon/include/process_pool_launchpad_util.h create mode 100644 src/wrt-launchpad-daemon/include/sigchild.h create mode 100644 src/wrt-launchpad-daemon/include/simple_util.h create mode 100644 src/wrt-launchpad-daemon/include/web_app_core.h create mode 100644 src/wrt-launchpad-daemon/include/web_app_core_data.h create mode 100755 src/wrt-launchpad-daemon/include/web_app_core_tskmgr_util.h create mode 100755 src/wrt-launchpad-daemon/include/web_app_core_x_util.h create mode 100644 src/wrt-launchpad-daemon/include/web_internal_eventloop.h create mode 100644 src/wrt-launchpad-daemon/src/access_control.cpp create mode 100644 src/wrt-launchpad-daemon/src/app_sock.cpp create mode 100644 src/wrt-launchpad-daemon/src/launchpad.cpp create mode 100644 src/wrt-launchpad-daemon/src/launchpad_lite.cpp create mode 100644 src/wrt-launchpad-daemon/src/pre_launching.cpp create mode 100644 src/wrt-launchpad-daemon/src/process_pool.cpp create mode 100644 src/wrt-launchpad-daemon/src/simple_util.cpp create mode 100644 src/wrt-launchpad-daemon/src/web_app_core.cpp create mode 100644 src/wrt-launchpad-daemon/src/web_app_core_data.cpp create mode 100644 src/wrt-launchpad-daemon/src/web_app_core_tskmgr_util.cpp create mode 100644 src/wrt-launchpad-daemon/src/web_app_core_x_util.cpp create mode 100644 src/wrt-launchpad-daemon/src/web_internal_eventloop.cpp create mode 100644 src/wrt-launchpad-daemon/wrt_launchpad_daemon.map create mode 100644 systemd/wrt_launchpad_daemon@.service create mode 100644 systemd/wrt_launchpad_daemon_1.socket create mode 100644 systemd/wrt_launchpad_daemon_1.socket.in create mode 100644 systemd/wrt_launchpad_daemon_1.socket.lite.in create mode 100644 systemd/wrt_launchpad_daemon_2.socket create mode 100644 tests/CMakeLists.txt create mode 100644 tests/widgets/CMakeLists.txt create mode 100644 tests/widgets/CMakeUtils.txt create mode 100644 tests/widgets/TestCases.cpp create mode 100644 tests/widgets/TestInit.cpp create mode 100644 tests/widgets/common/CMakeLists.txt create mode 100644 tests/widgets/common/include/InstallerWrapper.h create mode 100644 tests/widgets/common/include/RunnableObjectStateTester.h create mode 100644 tests/widgets/common/include/mock/MockContextManager.h create mode 100644 tests/widgets/common/include/mock/MockViewModule.h create mode 100644 tests/widgets/common/src/InstallerWrapper.cpp create mode 100644 tests/widgets/common/src/RunnableObjectStateTester.cpp create mode 100644 tests/widgets/common/src/mock/MockContextManager.cpp create mode 100644 tests/widgets/common/src/mock/MockViewModule.cpp create mode 100644 tests/widgets/files/CMakeLists.txt create mode 100644 tests/widgets/files/any.wgt create mode 100644 tests/widgets/files/minimal.wgt create mode 100644 uncrustify.cfg create mode 100755 uncrustify.sh create mode 100644 wrt-engine-test.map create mode 100644 wrt-engine.map create mode 100644 wrt.manifest create mode 100644 wrt_env.sh create mode 100644 wrt_launchpad_daemon.rule.in create mode 100644 wrt_launchpad_daemon.rule.lite.in create mode 100755 wrt_reset_all.sh create mode 100755 wrt_reset_db.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23e9fb0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +build_log +*.log +*.pyc +usr +opt +*.o +*.os +*.exe +packages +binaries +*.ipk +*~ +*.lo +.libs +.deps +*.la +Makefile.in +Makefile +Documentation/html/ +build-stamp +CMakeFiles +CMakeCache.txt +data/*.edj +cmake_build_tmp/ +.cproject +.project +debian/files +debian/tmp/ +debian/wrt/* +debian/wrt.debhelper.log +debian/wrt.install +debian/wrt.postinst +debian/wrt.postinst.debhelper +debian/wrt.postrm.debhelper +debian/wrt.substvars +debian/wrt-dbg/ +debian/wrt-dbg.substvars +debian/wrt-test/ +debian/wrt-test.debhelper.log +debian/wrt-test.substvars + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..eba7100 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,346 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# @file CMakeLists.txt +# @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) +# @author Pawel Sikorski (p.sikorski@samsung.com) +# @version 1.0 +# @brief +# + +# Check minimum CMake version +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +# Project name +PROJECT(wrt) + +INCLUDE(FindPkgConfig) +INCLUDE (CMakeParseArguments) + +FUNCTION (GROUP_DEPS _name) + CMAKE_PARSE_ARGUMENTS (PARAM "" "" "DEPS" ${ARGN}) + + FOREACH (_dep ${PARAM_DEPS}) + LIST (APPEND ${_name}_LIBRARIES ${${_dep}_LIBRARIES}) + LIST (APPEND ${_name}_INCLUDE_DIRS ${${_dep}_INCLUDE_DIRS}) + LIST (APPEND ${_name}_CFLAGS ${${_dep}_CFLAGS}) + LIST (APPEND ${_name}_CFLAGS_OTHER ${${_dep}_CFLAGS_OTHER}) + LIST (APPEND ${_name}_LIBRARY_DIRS ${${_dep}_LIBRARY_DIRS}) + ENDFOREACH() + + SET (${_name}_INCLUDE_DIRS ${${_name}_INCLUDE_DIRS} PARENT_SCOPE) + SET (${_name}_LIBRARIES ${${_name}_LIBRARIES} PARENT_SCOPE) + SET (${_name}_CFLAGS ${${_name}_CFLAGS} PARENT_SCOPE) + SET (${_name}_CFLAGS_OTHER ${${_name}_CFLAGS_OTHER} PARENT_SCOPE) + SET (${_name}_LIBRARY_DIRS ${${_name}_LIBRARY_DIRS} PARENT_SCOPE) +ENDFUNCTION() + +PKG_SEARCH_MODULE(libsmack REQUIRED libsmack) +PKG_SEARCH_MODULE(dpl-efl REQUIRED dpl-efl) +PKG_SEARCH_MODULE(dpl-dbus-efl REQUIRED dpl-dbus-efl) +PKG_SEARCH_MODULE(dpl-event-efl REQUIRED dpl-event-efl) +PKG_SEARCH_MODULE(dpl-utils-efl REQUIRED dpl-utils-efl) +PKG_SEARCH_MODULE(wrt-popup-ace-runner REQUIRED wrt-popup-ace-runner) +PKG_SEARCH_MODULE(security-core REQUIRED security-core) +PKG_SEARCH_MODULE(security-client REQUIRED security-client) +PKG_SEARCH_MODULE(elementary REQUIRED elementary) +PKG_SEARCH_MODULE(ewebkit2 REQUIRED ewebkit2) +PKG_SEARCH_MODULE(openssl REQUIRED openssl) +PKG_SEARCH_MODULE(libpcrecpp REQUIRED libpcrecpp) +PKG_SEARCH_MODULE(glib REQUIRED glib-2.0) +PKG_SEARCH_MODULE(gthread REQUIRED gthread-2.0) +PKG_SEARCH_MODULE(libsoup REQUIRED libsoup-2.4) +PKG_SEARCH_MODULE(libiri REQUIRED libiri) +PKG_SEARCH_MODULE(appsvc REQUIRED appsvc) +PKG_SEARCH_MODULE(cert-svc-vcore REQUIRED cert-svc-vcore) +PKG_SEARCH_MODULE(edje REQUIRED edje) +PKG_SEARCH_MODULE(ecore REQUIRED ecore) +PKG_SEARCH_MODULE(ecore-x REQUIRED ecore-x) +PKG_SEARCH_MODULE(evas REQUIRED evas) +PKG_SEARCH_MODULE(eina REQUIRED eina) +PKG_SEARCH_MODULE(vconf REQUIRED vconf) +PKG_SEARCH_MODULE(cert-svc REQUIRED cert-svc) +PKG_SEARCH_MODULE(ui-gadget-1 REQUIRED ui-gadget-1) +PKG_SEARCH_MODULE(secure-storage REQUIRED secure-storage) +PKG_SEARCH_MODULE(capi-appfw-app-manager REQUIRED capi-appfw-app-manager) +PKG_SEARCH_MODULE(wrt-commons-custom-handler-dao-ro REQUIRED wrt-commons-custom-handler-dao-ro) +PKG_SEARCH_MODULE(aul REQUIRED aul) +PKG_SEARCH_MODULE(efl-assist REQUIRED efl-assist) +PKG_SEARCH_MODULE(deviced REQUIRED deviced) +PKG_SEARCH_MODULE(libcurl REQUIRED libcurl) +PKG_SEARCH_MODULE(notification REQUIRED notification) +PKG_SEARCH_MODULE(dpl-wrt-dao-ro REQUIRED dpl-wrt-dao-ro) +PKG_SEARCH_MODULE(wrt-commons-security-origin-dao REQUIRED wrt-commons-security-origin-dao) +PKG_SEARCH_MODULE(wrt-commons-certificate-dao REQUIRED wrt-commons-certificate-dao) +PKG_SEARCH_MODULE(wrt-popup-wrt-runner REQUIRED wrt-popup-wrt-runner) +PKG_SEARCH_MODULE(wrt-commons-custom-handler-dao-rw REQUIRED wrt-commons-custom-handler-dao-rw) +PKG_SEARCH_MODULE(wrt-dispatch-event REQUIRED wrt-dispatch-event) +PKG_SEARCH_MODULE(wrt-plugins-ipc-message REQUIRED wrt-plugins-ipc-message) +PKG_SEARCH_MODULE(wrt-plugin-js-overlay REQUIRED wrt-plugin-js-overlay) +PKG_SEARCH_MODULE(wrt-popup-wrt-runner REQUIRED wrt-popup-wrt-runner) +PKG_SEARCH_MODULE(capi-system-system-settings REQUIRED capi-system-system-settings) +PKG_SEARCH_MODULE(libprivilege-control REQUIRED libprivilege-control) +PKG_SEARCH_MODULE(ail REQUIRED ail) +PKG_SEARCH_MODULE(appcore-efl REQUIRED appcore-efl) +PKG_SEARCH_MODULE(capi-appfw-application REQUIRED capi-appfw-application) +PKG_SEARCH_MODULE(libsystemd-daemon REQUIRED libsystemd-daemon) +PKG_SEARCH_MODULE(dpl-db-efl REQUIRED dpl-db-efl) +PKG_SEARCH_MODULE(dpl-wrt-dao-rw REQUIRED dpl-wrt-dao-rw) +PKG_SEARCH_MODULE(dlog REQUIRED dlog) +PKG_SEARCH_MODULE(app-checker REQUIRED app-checker) +PKG_SEARCH_MODULE(bundle REQUIRED bundle) +PKG_SEARCH_MODULE(dbus-glib-1 REQUIRED dbus-glib-1) +PKG_SEARCH_MODULE(x11 REQUIRED x11) +PKG_SEARCH_MODULE(sqlite3 REQUIRED sqlite3) +PKG_SEARCH_MODULE(rua REQUIRED rua) +PKG_SEARCH_MODULE(wrt-plugin-loading REQUIRED wrt-plugin-loading) +PKG_SEARCH_MODULE(pkgmgr-info REQUIRED pkgmgr-info) +PKG_SEARCH_MODULE(privacy-manager-client REQUIRED privacy-manager-client) + +STRING(REGEX MATCH "([^.]*)" PROJECT_API_VERSION "${PROJECT_VERSION}") +ADD_DEFINITIONS("-DPROJECT_API_VERSION=\"$(PROJECT_API_VERSION)\"") +MESSAGE(STATUS "Version from changelog: ${PROJECT_VERSION}") +#ADD_DEFINITIONS("-DWRT_SMACK_ENABLED") + +############################# +# Build type +IF(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "Release") +ENDIF(NOT CMAKE_BUILD_TYPE) + +OPTION(DPL_LOG "DPL logs status" ON) +SET(LOG_TAG "WRT") +OPTION(WITH_TESTS "Build tests" OFF) + +# logs can be only enabled in debug mode +IF(CMAKE_BUILD_TYPE MATCHES "Profiling" AND DPL_LOG) + MESSAGE(STATUS "Logging disabled for DPL") +ELSE(CMAKE_BUILD_TYPE MATCHES "Profiling" AND DPL_LOG) + ADD_DEFINITIONS("-DDPL_LOGS_ENABLED") + MESSAGE(STATUS "Logging enabled for DPL") +ENDIF(CMAKE_BUILD_TYPE MATCHES "Profiling" AND DPL_LOG) + +MESSAGE(STATUS "WITH_TESTS: " ${WITH_TESTS}) +MESSAGE(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") +OPTION(PROFILING "Profiling status" OFF) +IF(CMAKE_BUILD_TYPE MATCHES "Profiling") + MESSAGE(STATUS "PROFILING: ENABLED") + ADD_DEFINITIONS("-DPROFILING_ENABLED") + SET(PROFILING ON) +ELSE(CMAKE_BUILD_TYPE MATCHES "Profiling") + MESSAGE(STATUS "PROFILING: DISABLED") +ENDIF(CMAKE_BUILD_TYPE MATCHES "Profiling") + +SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/build") +INCLUDE(Options) + +SET(Boost_USE_STATIC_LIBS OFF) +SET(Boost_USE_MULTITHREADED ON) +SET(Boost_USE_STATIC_RUNTIME OFF) + +FIND_PACKAGE(Boost 1.51.0 REQUIRED filesystem system) + +# Compiler flags +SET(CMAKE_C_FLAGS_PROFILING "-O2 -Wl,--no-undefined") +SET(CMAKE_CXX_FLAGS_PROFILING "-O2 -std=c++0x -Wl,--no-undefined") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -Wl,--no-undefined") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -std=c++0x -g -Wl,--no-undefined") +SET(CMAKE_C_FLAGS_RELEASE "-O2 -g -Wl,--no-undefined") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -std=c++0x -g -fvisibility-inlines-hidden -Wl,--no-undefined") +SET(CMAKE_CXX_FLAGS_CCOV "-O0 -std=c++0x -g --coverage -Wl,--no-undefined") + +ADD_DEFINITIONS("-fPIC") # If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. (BJ: our ARM too?) +#ADD_DEFINITIONS("-fvisibility=hidden") # Set the default ELF image symbol visibility to hidden - all symbols will be marked with this unless overridden within the code. + +# Set compiler warning flags +#ADD_DEFINITIONS("-Werror") # Make all warnings into errors. +ADD_DEFINITIONS("-Wall") # Generate all warnings +ADD_DEFINITIONS("-Wextra") # Generate even more extra warnings +ADD_DEFINITIONS("-Wno-variadic-macros") # Inhibit variadic macros warnings (needed for ORM) +#ADD_DEFINITIONS("-ansi") # Accept only ANSI code +#ADD_DEFINITIONS("-pedantic") # Accept only pedantic code +#ADD_DEFINITIONS("-Weffc++") # Accept only effective C++ code +#ADD_DEFINITIONS("-Wwrite-strings") # Do not accept writing to contant string memory +#ADD_DEFINITIONS("-Winit-self") # Do not accept initializing variable with itself +#ADD_DEFINITIONS("-Wcast-align") # Do not accept misaligning with casting +#ADD_DEFINITIONS("-Wcast-qual") # Do not accept removing qualifiers with casting +#ADD_DEFINITIONS("-Wold-style-cast") # Do not accept old style casting +#ADD_DEFINITIONS("-Wpointer-arith") # Warn about void pointer arthimetic +#ADD_DEFINITIONS("-Wstrict-aliasing") # Ensure strict aliasing +#ADD_DEFINITIONS("-Wuninitialized") # Do not accept uninitialized variables +#ADD_DEFINITIONS("-Wmissing-declarations") # Warn about global and non-accesible functions +#ADD_DEFINITIONS("-Woverloaded-virtual") # Warn about incidental overiding non-virtual base methods +#ADD_DEFINITIONS("-Wnon-virtual-dtor") # Warn about non-virtual destructor +#ADD_DEFINITIONS("-Wctor-dtor-privacy") # Warn about useless and non-constructible classes +#ADD_DEFINITIONS("-Wlong-long") # Do not allow using long long +#ADD_DEFINITIONS("-Wunreachable-code") # Warn about unreachable code +#ADD_DEFINITIONS("-Wfloat-equal") # Do not accept comparing floating points with equal operator +#ADD_DEFINITIONS("-Wabi") # Warn about possible ABI problems +#ADD_DEFINITIONS("-Wswitch-enum") # Check switch enumeration +#ADD_DEFINITIONS("-Wformat=2") # Check printf formatting +#ADD_DEFINITIONS("-Wundef") # Warn if an undefined identifier is evaluated in an @if directive. +#ADD_DEFINITIONS("-Wshadow") # Warn whenever a local variable shadows another local variable, parameter or global variable or whenever a built-in function is shadowed +#ADD_DEFINITIONS("-Wconversion") # Warn for implicit conversions that may alter a value +#ADD_DEFINITIONS("-Wlogical-op") # Warn about suspicious uses of logical operators in expressions +#ADD_DEFINITIONS("-Waggregate-return") # Warn if any functions that return structures or unions are defined or called. +#ADD_DEFINITIONS("-Wmissing-field-initializers") # Warn if a structure's initializer has some fields missing. +#ADD_DEFINITIONS("-Wredundant-decls") # Warn if anything is declared more than once in the same scope, even in cases where multiple declaration is valid and changes nothing. +#ADD_DEFINITIONS("-Wmissing-include-dirs") # Warn if a user-supplied include directory does not exist. +#ADD_DEFINITIONS("-Wswitch-default") # Warn whenever a switch statement does not have a default case. +#ADD_DEFINITIONS("-Wsync-nand") # Warn when __sync_fetch_and_nand and __sync_nand_and_fetch built-in functions are used. These functions changed semantics in GCC 4.4. +#ADD_DEFINITIONS("-Wunused") # All the above -Wunused options combined. +#ADD_DEFINITIONS("-Wstrict-overflow=5") # Also warn about cases where the compiler reduces the magnitude of a constant involved in a comparison. +#ADD_DEFINITIONS("-Wunsafe-loop-optimizations") # Warn if the loop cannot be optimized because the compiler could not assume anything on the bounds of the loop indices. With -funsafe-loop-optimizations warn if the compiler made such assumptions. +#ADD_DEFINITIONS("-Wmissing-format-attribute") # Warn about function pointers which might be candidates for format attributes. +#ADD_DEFINITIONS("-Wpadded") # Warn if padding is included in a structure, either to align an element of the structure or to align the whole structure. +#ADD_DEFINITIONS("-Winline") # Warn if a function can not be inlined and it was declared as inline. +#ADD_DEFINITIONS("-Wdisabled-optimization") # Warn if a requested optimization pass is disabled. +ADD_DEFINITIONS("-Wno-deprecated") # No warnings about deprecated features +############################# +# Targets names +SET(TARGET_WRT_ENGINE_STATIC "wrt-engine-static") +SET(TARGET_TESTS_COMMON_LIB "wrt-engine-tests-lib") #tests only +SET(TARGET_PROFILING_LIB "wrt-profiling") +SET(TARGET_VIEW_MODULE_LIB "wrt-view-module") +SET(TARGET_VIEW_COMMON_LIB_STATIC "wrt-view-common") +SET(TARGET_CORE_MODULE_LIB "wrt-core-module") +SET(TARGET_INJECTED_BUNDLE_LIB "wrt-injected-bundle") +SET(PROF_LIB "") +SET(TARGET_SMACK_LABELING_SUPPORT_STATIC "smack-labeling-support-static") +SET(TARGET_CLIENT_SUPPORT_STATIC "client-support-static") +SET(TARGET_PRE_LAUNCHING_SUPPORT_STATIC "pre-launching-support-static") +SET(TARGET_LAUNCHER "wrt-launcher") +SET(TARGET_WRT_CLIENT "wrt-client") +SET(TARGET_WRT_LAUNCH_PAD_NAME "wrt_launchpad_daemon") +IF(PROFILING) + SET(PROF_LIB ${TARGET_PROFILING_LIB}) +ENDIF(PROFILING) +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + SET(TARGET_WRT_EVENT_LOOP_LIB "wrt-event-loop") +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +IF(PRODUCT_FEATURE_WRT_LITE) + SET (EDC_DEFINITIONS "-DTIZEN_LITE") +ELSE(PRODUCT_FEATURE_WRT_LITE) + SET (EDC_DEFINITIONS "-DTIZEN") +ENDIF(PRODUCT_FEATURE_WRT_LITE) +############################# +# definitions +ADD_DEFINITIONS("-DSHARE_PREFIX=\"/usr/share/aul\"") +ADD_DEFINITIONS("-DWRT_EDJ_PATH=\"/usr/share/edje/wrt/Wrt.edj\"") + +############################# +# edc build +ADD_CUSTOM_COMMAND( + OUTPUT ${PROJECT_SOURCE_DIR}/data/Wrt.edj + COMMAND edje_cc ${EDC_DEFINITIONS} + ARGS ${PROJECT_SOURCE_DIR}/data/Wrt.edc + ${PROJECT_SOURCE_DIR}/data/Wrt.edj + DEPENDS ${PROJECT_SOURCE_DIR}/data/Wrt.edc +) +ADD_CUSTOM_TARGET(WRT_EDJE ALL + DEPENDS ${PROJECT_SOURCE_DIR}/data/Wrt.edj +) + +ADD_CUSTOM_COMMAND( + OUTPUT ${PROJECT_SOURCE_DIR}/data/generic_popup.edj + COMMAND edje_cc + ARGS ${PROJECT_SOURCE_DIR}/data/generic_popup.edc + ${PROJECT_SOURCE_DIR}/data/generic_popup.edj + DEPENDS ${PROJECT_SOURCE_DIR}/data/generic_popup.edc +) +ADD_CUSTOM_TARGET(WRT_GENERIC_POPUP_EDJE ALL + DEPENDS ${PROJECT_SOURCE_DIR}/data/generic_popup.edj +) + +ADD_CUSTOM_COMMAND( + OUTPUT ${PROJECT_SOURCE_DIR}/data/generic_popup_horizontal.edj + COMMAND edje_cc + ARGS ${PROJECT_SOURCE_DIR}/data/generic_popup_horizontal.edc + ${PROJECT_SOURCE_DIR}/data/generic_popup_horizontal.edj + DEPENDS ${PROJECT_SOURCE_DIR}/data/generic_popup_horizontal.edc +) +ADD_CUSTOM_TARGET(WRT_GENERIC_POPUP_HORIZONTAL_EDJE ALL + DEPENDS ${PROJECT_SOURCE_DIR}/data/generic_popup_horizontal.edj +) + +############################# +# install +INSTALL(FILES + ${PROJECT_SOURCE_DIR}/wrt_reset_db.sh + ${PROJECT_SOURCE_DIR}/wrt_reset_all.sh + DESTINATION /usr/bin/ +) +INSTALL(FILES + ${PROJECT_SOURCE_DIR}/data/Wrt.edj + DESTINATION share/edje/wrt/ +) +INSTALL(FILES + ${PROJECT_SOURCE_DIR}/data/generic_popup.edj + ${PROJECT_SOURCE_DIR}/data/generic_popup_horizontal.edj + DESTINATION share/edje/ace/ +) + +############################# +# install launchpad files +INSTALL(FILES ${CMAKE_SOURCE_DIR}/wrt_env.sh + DESTINATION /etc/profile.d/ +) +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +INSTALL(FILES + ${CMAKE_SOURCE_DIR}/wrt_launchpad_daemon.rule.lite.in + DESTINATION /etc/smack/accesses.d/ + RENAME wrt_launchpad_daemon.rule +) +INSTALL(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/systemd/wrt_launchpad_daemon_1.socket.lite.in + DESTINATION /usr/lib/systemd/system/ + RENAME wrt_launchpad_daemon_1.socket +) +ELSE(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +INSTALL(FILES + ${CMAKE_SOURCE_DIR}/wrt_launchpad_daemon.rule.in + DESTINATION /etc/smack/accesses.d/ + RENAME wrt_launchpad_daemon.rule +) +INSTALL(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/systemd/wrt_launchpad_daemon_1.socket.in + DESTINATION /usr/lib/systemd/system/ + RENAME wrt_launchpad_daemon_1.socket +) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +INSTALL(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/systemd/wrt_launchpad_daemon@.service + ${CMAKE_CURRENT_SOURCE_DIR}/systemd/wrt_launchpad_daemon_2.socket + DESTINATION /usr/lib/systemd/system/ +) + +ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(po) + +SET(WRT_API_NEW_INCLUDES + "${PROJECT_SOURCE_DIR}/src/api_new/" + "${PROJECT_SOURCE_DIR}/src/domain/" + "${PROJECT_SOURCE_DIR}/src/view/") + +SET(PKGCONFIG_DIR ${PROJECT_SOURCE_DIR}/pkgconfig) + +CONFIGURE_FILE(${PKGCONFIG_DIR}/wrt-core.pc.in + ${PKGCONFIG_DIR}/wrt-core.pc @ONLY) +INSTALL(FILES ${PKGCONFIG_DIR}/wrt-core.pc DESTINATION lib/pkgconfig) + +IF(WITH_TESTS) + add_subdirectory(tests) +ENDIF(WITH_TESTS) diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..68aa8f4 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1 @@ +Main package folder diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100644 index 0000000..247c97d --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,203 @@ +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/LICENSE.Flora b/LICENSE.Flora new file mode 100644 index 0000000..4a0af40 --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +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. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +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 +solely as incorporated into a Tizen Certified Platform, 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 solely +as incorporated into a Tizen Certified Platform 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 pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. 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 + 4. 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 + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +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 Flora License to your work + +To apply the Flora 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 Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + 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/NOTICE b/NOTICE new file mode 100644 index 0000000..ded3804 --- /dev/null +++ b/NOTICE @@ -0,0 +1 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. \ No newline at end of file diff --git a/README b/README new file mode 100755 index 0000000..cc937dc --- /dev/null +++ b/README @@ -0,0 +1,39 @@ +README file for WARP PATENT ISSUE + +The files below have been implemented in compliance with W3C WARP SPEC. + +src/domain/efl/view_logic.cpp +src/domain/warp_iri.cpp +src/domain/widget_data_types.h +tests/warp_tests/TestCases.cpp +tests/warp_tests/WarpIriTestBase.cpp + +There are some patent issue between W3C WARP SPEC and APPPLE. +If you want to use this files, refer to the W3C Notices. + +[W3C Notice] +http://www.w3.org/2010/12/cfpa +refer to the WARP_Widgets_Access Request Policy_PAG Report_49839.pdf in root directory or http://www.w3.org/2009/11/widgets-pag/pagreport + + +W3C's Disclaimer +-------------------------------------------------------------------------------------------------------------------------------------- +Although portions of this PAG analysis were drafted by attorneys following review of the facts, +none of the authors is your attorney. No part of this report is intended as legal advice either to W3C or to its members. +It is intended merely as a summary of what the PAG has learned to date. +Rely on this report entirely at your own risk. However, nothing should prevent even +an attorney from expressing his or her personal opinions, and so this analysis includes the personal opinions of the authors. + +With respect to W3C, the publication of the WARP Candidate Recommendation would not, by itself, be patent infringement +of any patents owned by Apple or anyone else. Implementers and distributors of software products, +though, are encouraged to read the analysis below, consult with their own attorneys, and form their own conclusions. + +THESE RECOMMENDATIONS OF THE PATENT ADVISORY GROUP ARE NOT LEGAL ADVICE. +NEITHER W3C NOR ANY OF THE PARTICIPANTS OF THE WIDGET UPDATES PATENT ADVISORY GROUP +OR THEIR RESPECTIVE EMPLOYERS TAKES ANY RESPONSIBILITY FOR THE ACCURACY, LEGAL CORRECTNESS +OR OTHER FITNESS FOR ANY PURPOSE OF THE INFORMATION PROVIDED IN THIS REPORT. ESPECIALLY, +NEITHER W3C NOR ANY OF THE PARTICIPANTS OF THE WIDGET UPDATES PATENT ADVISORY GROUP +OR ANY OF THEIR RESPECTIVE EMPLOYERS MAKE ANY REPRESENTATION THAT FOLLOWING THE RECOMMENDATIONS +HERE WILL AVOID AN INFRINGEMENT OF THE US PATENT NR. 7,743,336 OR ANY OTHER PATENT MENTIONED + IN THE REPORT OR THE PAGE ON PRIOR ART. +-------------------------------------------------------------------------------------------------------------------------------------- diff --git a/WARP_Widgets_Access Request Policy_PAG Report_49839.pdf b/WARP_Widgets_Access Request Policy_PAG Report_49839.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c38b56b4b36173b9f4ee3c5acd72bd418d20d69f GIT binary patch literal 420031 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%0APAnPf<;jf?!oHd@=)idL|QXG0#R#sOV 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

2z3l7UhCA=OKUr4SZz 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%0D7?{|MCmTcqwEWx4;bF8+_6{-rqgPt;Eh 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 z z1+%HCpcbRAG6wqtnH%D|09Z0R#x}k~rWolZ`rKTcY}2%m&W37^wSwwC{w@MarGW}l zbV{aB=P(hduxTGl5fV2GxWqgV6;+Y5>Ix=B4TSr`v14^N#{hqM|12Bu?GX8A+(Mku z50Qk>v8}k6jQi%cjKXMU^uT)_WHLN7XU_SY`3= zM6s+DJ|`cp#VW7Y@E$631=)wOb1>iFZALe(+V=C?8Rh;l9cHTi#EW>OI%Tq&tMkzP zL@K*kr$$e?5{;eIpy^CyI;Znn`(;P2?{9K%A=~+axrU=Cn@;bCwSdj$tFQgXN9JnH zM+E0t<^gnTC~IHa`|)$U>Fe&R46FBwavKk}^aD`2_es#y$;l&AuqsyBV?n*)f{Iva z?A&tC2Xgi=7bg3i;6`j%idI!>&$fNAzMr9b)J>>4{k%qNzq12i&D7hG$gHus{!;~V zIbg2r5i$ah-dv?3PG&-XXo!b!c;=#b$BakgHIY{oGYC|!+wAHrYI(?)=((u=%SA`G zV#ua3-RzwF$Ij_~1}L}e7!2TB)! z`EihUGV)*`ABiG%K+r2H%UK{9sZ>o|(`1xKPO2GKWbjPa*6Qk9F1WAWo4ccr(WWcc zS}PaGb$y23-RR(OhF@G9#{K(!QSpG)KdWyD`GC>tK!?e?#`QDyEFx4-DKpTob{g3* z*62`GNohwO=qfJLT5ZjZfz`4#4{@+IOO;q(d45S_>R7-%GcnKwOe>~AXYU)lOxhsR zG=yZb(vn^_O-0|g`w|XOv!`IVRhRSdIbNY)NU?VZpXI^)S`yF*JhQkk6?poID&kKj z+-)ZIA5(BcG4vCy588gj24pZdj)lHz)#kg$r82*xE_I6O|;Bs^CYZ|?Q zpC@db4;WvP&*{lNkX@mCLcb}?^{pNr#C4lCX0Ti~9v4-e_=orr7pNvCDdQFP6JoWZ+7mK60NE!&;Ea+es~nZVrbfVeKC?v-wp}k& z9J6cdz8n-)w8(ZiGC*A=&i8y{U_!@ z6kNc}Hl<8dvo24mO4h4tQf~F){A@-0tl``wH#jFp7-@U(Gl@anhDzi%|DGhfBHZddXL!&xAP5fB_cGB0`i2QyUYqC8T0nEsPSRL1i6W!J88=dNZlNc z>X$)Cx8R2a{cVyFd_$KCOdG^el9=>5HDyPX%t2o zk7fXbL){A4qJPyD)houyJ6W$;xKJ|%mi6K5J`9}8A_ zf{ubV;Wsj8$lHxl;X>bIV91tE^L`E++xc12Z~8G@IahRbX!d>5tG4SN`*D!-;}9?A z^50%fzeC%hR!=^hK=}eDfvrBke6e?h=m2S6!?oGAT49MfAbOJYE!pdABH2RrvhMJq*fnb=tN1=Nt4- zk_4@5k%}lDzvgk|0RYOL8(brVe;M1^b-fqD0x%ft;51r7RBp=d?E2w%B@@UB5R8Ng z^Nr-ug#ZD72v<)<3=*w)T+8pvXjORd&vS!Xx_-xc(r3q&K@7@mdOQo+)HyU*rlM}s zdU+peGrmQt%+Tp^J%LHLSzWg}u9er7oo?!c;&=akT9uY5u)NJVhQf!ZcQ}TKqA=8% ztpT`F()ZM+2Vb5`TdKfd6*)&7PECLGz&ekQF=c@OM)$$00qar;z2^CouMsV~5c^q= zwN*3Cn9G2&5KEm4Q*OLui(2K8G4DrO2t11c3-$Jpb5(`S0XYwYvSN2GEfNnVU%r+g z!PJ|K&=?IuXGx=ZSKLW!4V5_vWog(K(qozP`n1sj7Q?gwE;_rC-F5cXU+A{?IF7>( z>m#8zr3>3Uo#|-Z0IqhUioL1<32p_eVWXM7eqs+Tx^H3{J96odHW1(mnmYDX`sNcG z>e#XQJi#_c!myZLnxlio)w!{3R%i|K&Wy0W_hdFNG@y3WH0?bp!%~hV57Lb$ODSj? zNtkGy%w9@(Z8Q#C!%E2vdw&7q5!Z>B0UrT4NB<@qCxUcs;=du1Cm((Wb@9kx0F_1@ z7u^3QS=|N(PZ){-dJyMFQ%(aVVh@Ic2C2&Nfq@WMsxKV;ITc?&fk*A-{p{>QD>t_Y z`QgTJfhx+3sAVuP_%3FfHp^LXGw(Z7mYFKe?>>di-}g{1sySt)@lm&B$5CMV?5;z) z&-FC(S$fk=I(tb@MyxN){ZnLg!QBx@u}K|Rhyu`Q8b(CrS!SHzU0t}!H;yhf73!e$ z{!Q(u4-OF=$Vgb5OsYso1}Fn#&2a=$FYk9;{hhpFQLT~a{FK8)xmhT>i>}CE=tMkB z+GaBcMKkXYg)%(rxXz2pF&aeG+a3(WA*R5j?KH(I{1+lLP9jV-LKrvLSDpvrIu3#p zv1nO3EYjzy!t4#ow|Dy5p0#6Fe&j}GI^_5Bs?IgP#{Aa}ulskjYh@P*bTG0T2;2S| z@O4-WBW^Z6ed1&ve5@M1m$k>?a4x#8w-L2JxTr&1{GiK1zDoVG84VW2=cwplNK|dzWLL(M7g6ZmeJlxaoF#Qz3GJggbj{uFl9e+2l^XgGq z+#oy%CO|U8B6xLb@d(|`NE?ENA)><4f@_+nZn$fTs4U((%FQ2-S7*Zs~ApDMl@_K9d^5OF48sS=cJHDH{f%x0+JN_W>6#ULt?tHD0SB5m* zqgYi%OH*sP;LN^pWL=Vbym-EAl62DWN%Dwk3+wanX#yveTTRT)(AK!dbrX|U7#~RK zP2%?XmRXu$S~v@prOJSXF?AcY%*e8+eO1{d!z#m5(+9F4NM}!TPd5Qw^R@H97_(5O ztnp|IP_=`*h@B3WSAtd~d<(%JkR+iAwYg|};A8%{0izzO^%M2bPpYdVEI~k0WQKtf zX;fh_zdj*K4yDp^M=66vE)MhoI`XfozqA1HXl@i5OEeNiC7%;0nlJ?fU$z*9pd&$? zz*-mrHl-=R9T4xnVPH7rJXW2rKQr$eNlYK#EPt*>%B=Z z|DmW?t=)`MLk0Uq*XMJn?^kLaDnFD>Mw9gfY;vsg-y7z3LSDX+`1B>1rDo6 z=g*$ji@WWJ=4d&+uFuu{Ty5SC#Dr)F*dNkN5gPC_% zRNd~ol;$+rtA`|)$?p{q*Cv_gzwlj=RZuwi7$4N#{ysP-eg0I&^eX*M#YmycA~e}Z zfz3fCuyiHoBDWWuZ1X(e3)jQAiNDECEH|z*gX&VphlCz&9+7#F znN;;@coTcW$MiA&h__eTDc+IwAb0Bcav8WB-U!b2&+Zei=wABe5XTpYCA+Fk zH|cf~svIy<`i!xMg@~sQv#yhrDB63qVxWtApi-WMDXVP70?Djh<~Zj90Ul8a*l~e{ zx({P0t}4Zu_32hnsWefLQ4%N$JQbR`n3sidBbB%NyZ?MP2`jk1WUJaAkbHO8xi|KF zb8rqU0k76KYzp8lH}OH98#O+c1PALY`_HssFRv7kKw6`?QDm3$GbDa=j{ zFj!y{Mqsxds47OQMnt=BThb8GE+@g7OhNTL?63o&-e1m}*s?>_`$2#D zc3{#gS)4)`<=5U@{~nPg=r7^iH=oNhDjAk>?)l+(Qu?mteY%!2WrZ}Fv=)Zej9e9C zRg{lzyRofI-j(+<%l5>aBg}LDD81q9-RH#IUHXI!82T^|ITl>Ta6B!pi%8PNfSBjx z`eOC=%8K7(`05{4XbskjDbuSqNp#5J!tUa*6BDK@D3$>@nH#}H^H7Ff76mh9+?;*vj38j=R=DlsCvNpT`&_*& zN<4F*bC+@0xz^$>iKah?;jF}F9w1!Edy;UQfrvr&GD&AL<2jQc?U-IW@?5_(1%lZ~ zJ_Z?QA)J(~ekv*(Ob2f#>Z|`C$$m7J5TiQZ!5i*a4AVNkFM zDLbA2+Z{&C@jBcAKwc}f2J4pyHhX@RGNF6B6Z-1Y{nvZ+o<67QV5(paIb4jUU<469 zlQxMAco|c~q<iCCAw+@d8f@P57ySm* zyC7D9QNcAS^(3wwszOJ;maiPj0dLAZjzr*-jENfPmx7lDlDQ7s0_Xu07lx98S8(4f zJ?`Ta@3-^CZoisMQE-K7BU??u-s-IskN3dvl?4B%^-i)>0JB}-ubWyOt zMo#*x8)MPp$?;+t3PNK;t6VvGM#Hl$DrPM6bo|5CF{3R`!cYupz_uwap-uLNVeFdz zc=`D9^Z^r*AvI34X>Jv1ME|i3Pk5u8%KyU|r*954X*`B7m2=AL{q{RMz&iR55dfHm z&?x#OHi5P_iGDwR{EZDg-=i~=MrEi=IHTAg-wUfB3GFUS8XZW&VBA<{l8#`LaV%P$ zk%`njmFUsah_AT7Jx=9(Jybv_uqWx*A7RX&Y3BK`jR$GZSP<^$Jyk!Sbg& zB^P)*N+eh>ofofJ{SJIy!6V=Dqof{Qw>Lvk5s6ZfQB>Hl9p=pX3eu@#CjJ^ji<=j< z6X{_Gj$@KiUTJX8N|VSY!;ljFE#s1*N#nW!!URg7H-HFNA^^a(2xnUe zrG%Rm+ujkib%f=Q!^|E^L>Vd44*i`>LGH;2N6Bx5_k!R4&XnV(i09%LK-$)m?rdnq zsou7dB99h?8>{tS!KqN!dkOFb_wxh9wA7SS;%X8GD>Km7ov)|)YB%RW1POm23czz-mS(#Bnrs6G(HA9K>F5A33EY z096Wu#*|Y!zfiDGU_{`F(Ac9e>ijbV#{F}5t(A2enkgDcR2Ie?s8^Ot3!xnJjj=xh zxPWcg+ZDki+NLDh{7*e#PUAEmP8JL@cDF1We9)Q#-hdy~BJ$U9!FY#EaV%Nkd7drA zXP=4K)oXQQ_ptpPsGO)OIhW6I5+sjXYxJ82P*z{l^ET|+T*xF1ZyXWeDq7#dqWM^q z#xqf>0JOYYt2nXXqts=hwKo`DuWTAp_;S1(y_veKk}DHPs*T3{ZjLtHmBigZ&2eip zwxF+-B5dxMvqJARc<;9+2BeCx3)u(p?)k{P^}o7A%$}tgWS?a2enOdvE*>s#__z4C zJxAV4&*k4i&q3c-GkTrAx4tPal?Pg{vbh7Pp1N&!YnQUD(N^yF~F0ys^v~0#eVq# z%L766`{YxfAGq}?j6g{2{_Mg^4DwV%8UZZLL}xSr)#+6b6eL7g1+EEyGsI;HX(M71 zVP9;j%;#EZ;_tX}9nhjU&Pu+AQrnBI&RycRpBQXcm)I?5+hLs%WwlwEw@PKdP55Kk z)yUvIGp@HpwwX{`maX(M*V|i#yKbM<3@Uwz+3Bjjo1*fFl~zt<=OfeClkE8EwQ^WJ zRgGH>t{tjf4t=o4Hl+Z-zWd#QuQZH61W19FT8z^$#*3Q`H(QhM`W+Y@B<7E$ zx;-0SL>&w3qxf!#$R==G)f><@DOA?)+hZaCVFQi^8+MqYbX6yEx_|7p|>QFV0WH*u3>hX`I7Jl0RXsY^oSc%6SS6tj>n<* z_(kWt_R;?6%>J448uS>H=`(PXaFg%}OMdUatFx=~4lY|9e9Wv%ECZ2R$ zHiu`P?@c6o?vSdr=abqskJ^jpZsM_z#AUw|l-*8a!lJgKTj34NmDlU+ZYtDgFuCrT z=PjzXOqcjcBvCUEGvY5}zscg%gXz?*8qczU>J_gfjpdibPWPZWWNtI+AmP{~xJ;q1 zwBVz`DE`9JJuZ$h0ctQ|={;Cv5V`4v%X~nt3?WDr^U(nD!5L;aLjeSAAO^sX#S&ES zRDH0{CLpe!iIOE^N%WzFWwW#}N^}&D8dIVGzx6?A(S6BR1{dir0vjiSLH^Db3QL!KcA({?U>|mVprMuT&blXW*|AM)to6(+0kd1bVQ(W<=tqP$Wsx@>8=xI1^6` zn*?_okgs7PHtk4M;4G;8Q$GO0APZ;euTSOnTjJowaN`@Oazb2NW(YO-FK3xpRnF`E zhNvDhr|N2BakB-dN|Wytc@0klepGZdJq{g*n*XS0u!n>tr(+)F#W+fS*=OjA1BFX1JOnCFi_I63+Yv`+#?|5TK zv1hC>$fL>{=46Qq6NfnwKAq}pL~=#Cv%*3S@M?#5t@+n+EBnvVfVo1tY^v@-+IKZ$ z0`|*G%CeA;`xQCDg0gu*8D|%_t{&`JT&Eyru)VH}AxhH=vh1zv0;dFcbV|_x+*d@% zfDTa8AvK=i-9FuQj>$~8hkYzoF&Ki#@mzpPeZ~0@83yQa=0p*~upZsQ%!uTBmeEv0 z(!vFl0J3I;HPMLZiPfQp zMbEa_uIDNf$I+wH>Z&QZ-mkoN%_4*Sqp4Tf+$Pe_G6Q!ai6xaA_daIh!SM4Vk&gJw zR}7!Ol;FZ>*-Lecco+FPV}ZKCCXCGt)o-zS0V9~A0lc{eg`|0Ln>#I^<>4YBkp$hh z|EOs&A(SkhyP@9{04t+kjdWV?yaaLTXIQM8teY81&pHD*bH?}u&ZmPq;SiNNm&oPD zV!)QIGYFgva1DKdb#HD^XT4>R{6PrhhBU;+i5PkS0_Acz^02Wme)U(;C*|>|>a@I0 z_GfCYu>bya>iG^xgHVvUe}u`n2iV2djg#OHbtOqJ;!i1&`z?3#@aFO1YH@wXzvI6C ztn&-^uwY%XT5)5z$%4EM-4pE{?H&J?cW=dCBYKZ;1c<>?Fa&gP2T??h1usM&cR*Yr z5>w$UN{v=RphO_oF`y!n6D4%j8le@Wiyx1B1RKTMMBK&SNL69q4-p;MFk(o4QsSMR zI3O%9pU(0r<7u&VraL$3T-RT&5_h|?dRC32wYtoP6_l%Vki8m5z0K_G6Mlw6bPX?~ zG?~PECda>KTjRa&y&|`et;$?Eu~IW?F;LIG0uXJfR&akBr*d8ZsJT6WB5WT^-8-m) zb;*Pm6Rte!jKM3Yjr}CN z>{iaRbPL6a>RckP@x8N7zGzY;PNxXKoAi3oQt4t<Lw)8c?M5XgijShBFJ$d^Q#J)Ssm$gt)M${ii^IgW;=^ zK8J3|vRmkSvaoV?6{V%>jCG%n67oURg=7wqnhjRV-b)-mj~#7I)ww!2(lnZg8Fb4X z5)$e$07N+#XpW_Cvp^6b{}tebM5|5Np}sF)Rr?(ya5HW_v(o+ikZf9!M;B5B_1ZmH zfPh}K*?kn5m{#ySp=i{?6EA!*As4-uK{Q4j;qj5~fvQ5z*IP4Y>2e zI9!~RFD@^!L6MYNGoYnQ@JsK zf*hO_2WZwf2~vs9u@%PJ^NN0%l2TSP--zcu{+$=Jlsw#>Y*_0JUO(4Ib#i`rey|Ht+XyiS0l&oDMbA&VF%`?15h6%R1x;d=)O7P^RTE#iv(FlM56uP8wc zHm{15h7F|@-3MM3d^;h8HTJyNGu0*fZ@Dsy^IRVUZ!VLZ^B>AF)UKA9IMrT||B{yss zT+kcvP8QzB!KHKJCY7Q17pGGDuT)=wbpg749QZv=<%UauseOa? zT@_r#Z?_V>P*c~Pj%Eo{h^fc;-dJ~yh9!*8BO1c{M>+`e07%Man0EETG-`2 z)Wjfh)77>Mg@j8lxEJxUWaZ-CQ`obhylHxa8URq?QPK-$4?ig?molV!jWsJkI}tp6 z)+A_Qq(3OU1eLAfp^krLHp>Ta4(W2cubx_Qli;itxdi#9Ve)k zdaJeT&wrxZN-tAMD8$PtKK$IDnYi3wWGyJAL@@OLfpi|Z^-o8L?k~|X@2^J1&(hbN z-^Op7Gb-i+`15oM^m8=Lw9R_?x;1S-kjLT{)63E_Dmlm*h+IqiM0EY=IJ0Go_8n$>=C&vT$sKNscsk`h&`y=ic!#bPS&9 zS{3``U=#%PsEItyHd?J?>j0js-COtD#t@T4oe7Q%g?b{OB#O4iWYPkeZl>K2=);(0?mf2C5BZ#(rOu=`~AGwQ94}NHtlWP!xhUZ_8U(v+uO|ph~MXO zp8vyZMq{VzwvS%_@l7{OEROZZ!tq4Em-;<1mAYDeuzas}!j@LeW>;%lo6VZVct(B) z{i0E9G)aBrnl`iK%XIfhvNZ!)Ehbr&ucH4TfTsXnb?0&XMzd*Co?AwtlBj#`6cDhF z>;vl{8PEmz1|0Ua{|V@e=;=AdsxN|e+j63M>MST|9p5F$8#G7?25)GSm#01jB^F#; zjNg$}>7Np}br8%J62MrVqyYf^jl<82-rpQPSP0|*Z^>JfT6Ee)&v!e-ojSdu^U3#w=MF0tGE;-YUh{k0 zJ}%wCej3tm0!fovO~r!XcCbhSfPthP(Y+{^*szfO%^?j)p4ZfvI-F;6#4cSQjb{tGoX|c)JPWktH}VW z`zW)LV`1cj)TEy5;Q)!8D&y^*lqQ}x3+GiJCHs+JH&X5xL9nPt)Zg!luMGd1PU{WF zv-Onsl&&p4X&U&FO*TEX&Qs-yUePefgc^B<()wBH9)OR@0IuCg&_qHd+gSV??IxvOk%1QiSlN(I^??i?wp(WMv}(&H^&y zu3$(;NHgRo!Xs%P#;&tN3b3ppV~M2iqjeiaTapKuW9@isdYBhui!DPJab};`Yx1tf zUKRQ?Yb_hD8<^@oOszd;l20#w2_N8_H!s}4B;W`LVz=ga;Gj^G#&@Nx3dr~0G!xi+Tl4A zl*P5SXH8}`ZZ}nshx{=y&}+vW&THD%UrL^#&(TdXjVE~QR?;(9F08Mn&1U6{IX-3v zD}C>=M;#f?m|~qahb?pMYt+ZWv{t4!!95eHGUk9*0LvZvz#9~5ignoybl)=Ayv-!? zTHR;vk6FKFOK(lC+pg2kL&erLLr*7*fAOp{&z#LvWxwim6=kb+{&EKF&H&Wo2VTn( z3N`V}#QmP|UxI4^HY5{di!1Dp)_o~oc)qJe==-b9uxI=57PxC%$c_z@Yt#{L&y)_) zA=5~eVg!v#%jT1>qrlk;u z+yzb&*RM-hwsw_tfjH{pD2mI--%9D1<{ty8h6^P`A>9PXZYZXZMvXP=t`^e&I}|AQ z$iZE&X}MTVXFo%PHAPnAroo_ZK0cT+aU!EQrn}0^Fn^!|*M-u%u|1%e=#Ap~7|g{b zAn?u9C=OkYExN~!x?6tTSo20)DVgrln-Wf>FOdE1-;2@Wh< zAb(@mdHV|A}CUng;8W5#?rO6?$-@*pE!k%Vt=b&OT*l z){a4K#yOCN+H3@~x&uO>IHBfb8z>R{N>Re&28>E!iK&R31Dmac7NqnEfv#K_F~(JFNJ-OFcK4iwLVJ)TW1&K_6bZnBgQZM; zU*_S6iVdXdFGfN7=uE?tKGsx>ev&xBd)i3o(yv4Ga;VPnPKJu{WzlH>JDo%yBTn*e zp4E%yD@GU7So722{%xmRWJ{kVh^Zz-08t?%fJ;4Jbq;Qp1`i{PHdQiMbURByGHj^6 zF5CMJ@Qcae?s=%{%`))y)C#O`(VfM-Or)*D&1+A2mlLC|h%u0o0uq%ls^PrLIh*}E z37cDN(HKxmX;t~PQ&@0g`M0KZisSR1Sv-)&AI-mMw;K%4=|gebOx{-orB*=%Ci~Cbzi$Fg4#$TV z^jySI4xK%+L{+_?#ujq&e(C{Ty46;`hwPu{oGq#ST!G641FopH7QnX`;H!zfLH=D( zA0@S5b0H^a2hJeGPk9=y0cA@b&Kpx?;&Fb7xGu16;&TFtoKnm|1--~nQKE!DwQUE^ zB?L-T_Ys6wWmSP<7X`MI2R5s!N3gl3L(Z7$OobbdCD#4ZmP{Q|s$`6^1&tnjZq6CN zWPKz%#pDI}0rafy#IEG(I|36ZKI6P$lHo;#eg*?&eU>ftWZPS^oWN_!kT{s-9Q36= zniv?yrcrJ#jPON|{XTn@LRWPLp3Y@%DvV{&HCwl$jVRgyUX{C>X|%R-Cfr+f4bc_0 zbwe5}EBho?5Fj{Wb`RyPT4C)48H{kWQaUHAw>0@jV*#mgVuuy6T+5q+-Mqn$tdFwecR+HWaCX{;; z!7HLEvaim`%sUG71nc783*PjQxAeela3XwjXpB%1ts$PM>O4IDBMH?wFV{KDn_eJ zO;tLUXAvwP=7U%L7co57Pj|`tx7};$4iaiAfYI5%I=0%E&+DAbF0)d`{bNO!4cY57 z40KQBPW34C_}mn)9NNU%%D7?Rv3@at3Fp(q%|t{KVcR@J^dSfgdok?&T(>}jTJP~u z6tueeGzqaTw2-4aQ=@`DL}tfVCdN|A<8i|0imcmTmP8))^Eea67Ff$duvaye0ES>K zXsazd4Vb0G+h9z%2=_$OGtkJrPfQ}a7?Ipt4kaK^HQYy%+6XaSLIt-t9_)rp)ZZ3d zbUCm%m!)$WA!W27gImlT9v-hJkX1{mi_K_ca5c%~uodts<2J!`ANguJjJUO{ut_+} z$)GG}8|0u;M#OqFf4EI99xcz%cf`o6qPVHRw$EsaIsqiGlHtD)e-C#N5RbW1+9oQ| zSMVz-xk9*ZxI)LS_bk=A7@Oe4gl9kkX-#n7(?u{JyH`ytpUw9}5uVkKtXc+95Y?ga zToDRQX%}KZ#}O9$5eMVEmBL|@9^}~|v6bbU?B<#Ll7-yBqyUN52#}){%%{MFVxw*s zuECZ^>r(_)rv!;anXZBiFo94x1g`0fN^hvaqs{8$ZMuKjY&ZOz-Y8hiURC6H|DvwN z8~vo~uJKyOheL_!d7a&Ft&G`;)0~Tc9(c>;;UarhE~g&i)^-(p7R3+Cj`GIdXH{Th zBa-CD=(9n@*$YPNV)rFVu((a}#&H3YiI@jC#jE{IM{JDr`n&hfLT%FD0rnt5tMH7> z*`o;G2q&G*o;fL~wVcEb_68#wkWPpc zX&9u0s0UqWz>7n(6g1A1XM=+QP3a*4g(6ld3^RlWK)64}?dn@1#{D(u4f;0El|4i? z6y3D=*rO)2d+8^P3AR+3?4Q<5&rj}kG+p>;D7MXboMNNb+fW8z>9Xu&_`Yt7Q2U zs2oi2aEOztna2RFmhCD>70+g!HtgoY9=6`ileF!OoOwAk3 z&(D(;GbH63YRjl+o6uJ-QvbEh^wv z>5kj;E&iWL{>h9BV}~PDdHDlOLU-qb z!xH=v7TMrK0tGn43hSo%Afk159B{dV!}CmvuqVseLIu!DF1#LjCB!6S&?)?TaJ}WX z44sv>!{OQ1Id%2XRKWNcXk~uL#70Mp&hyom*7+6F$z&zA*ln%KBlR$QYE;blRAx!l zD&C4Yv~Ri&r=8;E!*t9N_sS+B`{@a>UnX5zs=*|ld==RQsU`AL5Cyf$K75&RRq5#t zR+Od&u_bXmKA)$sNflm+wWLNL4eu8rNxQc?e54F`3~p%g4IawPRtD>JYj#aLb}V&S zV;*KAg?<{|T@kWtc70HaaUt?Po_s6;UJ;+{Y4&A&MBIjMce|rZxDn<=dA7|X^&?GJ zgVWB*sJa$~<#WplU3I$LRGvzus8!WzYvf!mVXH`Y(GA_G$Q@{L=;54>wwgW_J8Nx} z7Ml9Z*1#6BJop13@Zmmdldcd0&5}oAUoC2-WaLWw)}gZmpFp8$BG?}w&NTu{r7ZU1 zF)XFBQhksWEUqMhxWCkhZNF5>k)1Ibq2oZ}^kh`kf#Hes9mUr;zN-M$HI3jzC_+-w z5KjK?LZE`tP}EbHoEp^>d{IyD81m8Czf&a;ln2O}E+#UFAj(UEX``%Y6*y^S7AS5h zZz^&Xmv?US1{Y~okWXjvSpFW}{xQM-ve%ZeGBRCC3N*5eL;yQlxyKei$3nThteV*TbRRLI(#I2gitX zH=Q*-Ie*cf(LPmubKK869O1geVAuRnbF>VbY8NEz6EvbH(P?c|z)N7h zOlrf=<=x!9aWWVOpAy2|7{E}zO!ZvJa^{j|#jnD&r!ssrDJX+AS%o8&)J>ufmk1%@ z*ya(o&XI#Y*kR@*;Sj1vySVC&5xZn?<)L>6w#>gSP7|JWqK=tbdRg^SPub~CN%aTyaxM5JD4NEJ! zM6?pNY!QL;Ai7f}+bIMoziF9PmDS59IEGP08C7Sfbew9lO*@)1``(Rr8>(dqOlkaH ze6{dpv3IBpC^`e{RaQTQgj_AyiuksC1`=r)Aso&b#23Daj*j($DoV`dplnv7MAn~I zCvh!${+R4mi;Q9mtPI8FMv>ZhplCl!hQ-gi6x3$fL{-RJAbRADxRY&!#Ae<+$RKsr zKNjW1^QpYDzpV|$GiQsVd1b_rH7zeYWT}2BH`O@phi*Du@$x-qU3-D)2uf(_`T33Q zKcJ(Buh6p8pkvqC{c#QCp^UnueKi)xO5bT>1u`e2Pyw77~4l9QAfv4k-g_ZWBenf1K6N^ge7Cnk@CGWiF`6&{!7uF6J-bj0{}1 zGvj7GGbW=3Hzc>4jabQ?kWWo#)~48%vRg1(biR$_M>8Zwl(Bpu zdBvmU4~6Kd7i#aF0SfSWq|RgDfl{QtjH8KI4PGz5vdvPIAMI9bzu)Of;rmeBvr(>R;cv-D8&|0;(*)7@0Po}E z$@ZkNnE0>G{z}rXrN8Tm`6BVfzyW4|8W8yAKlMDYuN~|Q%&)iM_)IL?k^O-{J|3X% zd98WM@?RU7d>ObWd7FmsgQgY=YUZjTq`7BkOcE#F%uNl|oFU~t?NAbNS5 z)`~$?RFpG$5e8jVX+@#=M3H&Pnz@^mtgm-Hn!C^I++|9-l3Lh3u!{X&DzTZZs#C!9 zi`iCknw3EW0TH55CrU`QZjk$e`0KP;{#>*yLsJ@(3y5=2ixNNpMTajQclpEoeOh6M z*|tF_;;Fw_v|FOf!E$R$g6mpmyy3H2R_k!;TGTP+l+@VRyNn+_B3`$}-4O!p{acU{ zwfXWi?FxKo42O-dgtm8zoha_l@=4!W5tttG0kN=)o;={=kzIVL1Qg7(n$&ymf-dG@ zq@bP-8B?rHP?mpT>p3@dH!3nGf=zG#OD3Qpzdu4}Sva_3d~P#ng;Coff?&{TO1b84 z6f1Kz1}< zo}tm)qE}HsJ5Ml*(r&xBAN^^NwC*-6v5-A~tZ;(pq;EA*|KTxH!FR2*W zrDB+OU%K~vxEUU7!R;Ych#wYIkR(ppQE%2EhN59e)=y`oAv^fqd1jTd#AtB7sYB7@ z3!>?E4)8Ze7AhN?0uC;}_1BIjQ@U5ng}ps*;9B;G)kwEAN#b=QO3vzUbc}7NW$aZBfsc9*SE#)Lq{Uw$zfnmoP z4qz(*yw<@m9$tdD2ShH$NeRepF{^|(yhL|aodhycLM1N#OLyW!r{-kqF)Fafglg?o za^=|dY$2}|HXCz{!gXibc$yW(gs$lG>vLRQUC%>Fp7b2-VQXZf!^J@!gDV!K5B=O+ z)~STDw@G|T24e*7W_|o6<4doUx_gV9X)^X>H0F|sPPgG&Y#Fj?T0GhQ{JO@f&-|#r6A3)C)!~5) zO`qf4E61jCMONfTG1K4hB^tn%|C!?Wj|BH`iX$f{1KWR79RH(q&cj1M|1TNuf1x-^ z$jPc}2>n;ZQP9rX_}~4!e|dU8QS*P&-2ZooBO~LFhxf0j`45)&|9bozq4+<+1pfgS z{|`Rn-`?pTQt@A}`3GJ6=lFLp@gIiqe*_5sS&jd&`Tn)c|5~vB9w7YBR`);k2Y={6 zS{4TOAAj)YyD&0wvi|?{2U$6o2wXY#y^ zleN3s0AlJh5@7WcNJ;htNMaLWLD3Q1+oh1j#lL)ocgG429~7$r1#4|cveYbG@Tg22 zGx=VlplLo3pZDMkm zx!&?#>=IsJgCuUQz5cnPn!FP8a%`b0imp;3`AXPevaWGVZD^(GN%;9@OwC#Y&60~O zztX9pxnW@C7PF=U1h*DI4R+vCvEe3FkyQ+&UB1u|{R_9%jJ(RG)mWJ~OW~NUslor=*We`$^Domd7IyHd&d~wruixRPmhg(K6`cj8qF~}B#MD(#4=pM2gLNDU7 z(k}?|0{Exc<2sOK&?Z<|#3dJSGGsT1Ui77nA7!5{1P1Xdz>l!68R!<#hnhd~()NoJ zVizWX@FN*e%%vs}%>q$FVxsvkO`rSxoYszUmELpsx);ag$#kL(m~tx$YcEQ#2LxLY zuF+L_pOPeca~%3>ms{?BO?kYzQH(>`C|_9JkoOaX?ri!Yn)pH5t9^YFWeb{)#H>PR zBjce4hi+A@#69PQgp&%ns(RkG&yCk7InA>gy|Nky$90OKF7M5a+f@%Jlc7!wQ5UM9 z%C++9UgHAv(yEfuG}4MmASwd|PUr&`LIV~Ka-H?3)3F;C3hQ)6AuhBv+<&OrER4cc zW|k-ER5noGd!3v-Ep$FDTI z!#B;Fwc-<4xkr_)Pu+NLe$52GQXSeUr~hcl_^1uzgMCjYcqpZB%e$q#lmX&K2tF0s zxopORe%}t%4f%2dB-a0K?`PWgPSm5M|DniFa*7X%^Sw8(#uim$yXFG!*c^=re-r*{ zeS6U9b_3659MtM7TQZ0ZESqeih1aRc%8%m~`?(NUGrll^6TdQROY=}sT_G-(3>%}* z(OBe4>h`KybRCh1U^n9c%6B#UH;xhN*-vRfLHpkg_z6yPsOP^ef4R0ym>};i-sZlx z3^WP#e(81bUSflMtHz%9HCb|%EMu(2RQ{>_@H|pruZw+u3g&ucrW`I>u#MfA3zS}- z9!V+^F^X|*A;>c=Kd%)%KuCVN9;Lpff5GBMeToY`91hllc;jWURJ{^k=<#4~LYxEG z$R`nc{}B~`D`8l5yXYPGYiJl9d`<)*`F#~zACFY#x!zU&xkr--);*%=q0{6zQ!ZI& z^(wLKYv&g@weZ{UMY^}a9Ez-K7|EfUjcn^RYTP@zr0m`=93{d|(h{+7Zc;@#&%1?h z?<&9KUM+OvZ@nYkr@J+u0fXy@+N5_L25+uZvd3^V@fnO$9=gR13+Vdrc*zToqlNP# zB_TygcoeSRG`5#%o!y8;OIF*6`_c^Jx`4IOo}i1sd>XBjVLYly?5aIvt$X5v0Y3O7NGOPX{xT6J94~*3{j`4KC0Zzbp`QsgRf0vWRF_ zkPRL<6x+*i=f5kRCc!%EDzaE+O*n()@I_Z+T^e_&!5FINT}-B;L-J&!!X%X>nW@@| znw@g18S43^-28fO1J)@PWMJr7xVe6Awcyj#MF(A#j*7a!VyaOnfYL*DFv}SgeF?&e zvd$P?Xg1XK*52er(L;QghKn)|Z4onE#?Kgm22Pbw0JidAc4q}tZ&cLjE0}p%ky55g z3jkN$f;K7c8&J<8H;gE$?+ccnca=uv``vL5ln999fYf&s_ZVLXEC%<7axS4wOWIwrWD^DGMYRx&R z!aBux!s}7Wh^Imppp?Wa^?8wcyYe-S$^zYAiN-jYth~!n=PZOeI|E=7+1RxvfL*gV z05>X}9E;m0;D98eE99d&K^&3azhmJL(}BQ4i(+W{Vu0B%X%4n7GjNM^zDzDrh_94t zq0aLhqk!ZXSeKeyLsd2;vkB(yR)(SX(Mf45igHI+F5ZQ9;J$ct!m+TSyr_fUk{xfw^-; zZy`FyR}}zGdJhVZFAmqGNRD8~I)yLh@H~QIW?`b=5HtGWgw;epKgn2#I?f}wXEYvu zzFgB|WYr$8j-cvoh&)X)RKik6`XIn&DDTh_3v)etQ|$UMpw{P}5gsbEz_P&89@4V} z6zO4h>L|r2K&SYj$J`{XBDvCJ=n0rmVu|(?wf(1W%;=13-llT86!uo0wG+Z?^(^)+ zz+2ik7#8lp2nl;iQXMm+7mbi-6wbl_;Zp1gn3n`27$0)#ct><2x(l-tvU*Pe*h?z} z^W@To5gAa9rxkMxPFEg-T)%t-zQ$Kp8j9Jo(&EhPB*tpC{Nj8HY zvOKpIac>dwm*l1d0^yIlkBQs(Q;wL)7~(K<{bBLq)p_%ovXh8a7=oYjMqmKQ_8L7l zexeaeNDG5)%XIhjr;xvzln(1(8FxYE!G zC+4i)!Mn3uiSI5i41#gCrU<=h3L#1RzHDRnk?F@=rd}d%gKcx~v`8{Go*Tyr zOLVAOp|X8{2-`%44<{c``}uI&`V1116|x@kfRGd%CPV7dmn4Uzy2R^|&gq7JG4wq) z>R}1hDb~7Bt`$*reLNoFMCMWl(Zw6N9oE)%_o-Q((BPKXKI9T;;is#es^aKpw@e)Gn-$R z<*#Hj;dN-^n8>CQs1IAT6SDJ!vd+{GcqKN;j`u z$0b;HexwRglZD*x+1uG+8Wro;??v;wm&P_!=VojWt-I)GPPH)B_TNIV+PIx}6V6?N zfZQIh`f3C?@?e_ZKMB)U>cF~VSyc8*;5qi&p5@yjIn4robQRIEc*^E>(eC)w{BdESb(|1L*C)(jUHiU?qcUT^T3g?P=}7+)Tv}($HwV+I!Ai*FlvRRuhFse0OtcnCKCEYK zI?U48y66JCgNVcfSe}1D7tGzud#FA)$2^i)P&lN;b-BWo{E~3J^5-HNYHd8|yeizdc+&WDcp-Mem;i#eO zXHB;&=hF+%mc6UDu*3a6n z%?G=Aa0r`X+}i6N-89cR)01&3zQoTu7LB)Ne2?D4Ult$eH>iY_6H>WP2%H1De+7 zEH}^=GuAS$xk(**)67|lkfm5P70JmpXb!TPN}^1kk)lKsM$E>?Su-#eN0R42HOmH4 zOC5h>d~~LP>UyB44MM&|#~T2?w&AoRB4e6f;k{o_H6Eun3mgCafU>Z17EKKn2*I^tBYjL;{aR0!^XOnO`#YIGTy*}-A|@l={az;=>m z@*Cl{w^cd^xrA*Kj#_=KyIfe%CQDfw2a^wRd>UAbZsF7=+M9(79?k0*?(u<4JSBgdUN0v7ztu%cG!h~)C ztn&**y4M*<%vg{4l)O?SrszKo)Wd5%y=Fd;WFg7*gg7@|+7rzUF&FCfD@&+BsBVl_S?yz1;8x%J@3~gFnj!!N7(*l@2Rn2L1WHYoid7V* z8Dt}v+RMKZ96T(-^`;P*w2sjf#HCcN%xNa@Z5fWWeaBg2@Fk=%>U z-t`ng-gsL<8HpcJEG}B2g>uw1tDGrRV_J9dZ5t>eX;&&%Ckm6yG_b?2+@SeFsj2Oz zIAc0_m_=Uun3*8Qkr}9MI?XLQFXZ<-!Qw(9RB6@eH)Eo5aW?-xD)K3^V$F|+RF%T* z*Eq+)y`<%J%qL?J8D^;*?}c=3x^C_Q_GS{hm&SeEzJSr&%$;AxY*E~8W^Qr<$<=i~ z8M`Ye3!Jbwkyn*0BxW?t+Et$n^4?L)vmcQ!2f5I@Q`yX5U^c&|s?H{44g0=T@Y`AR zzD~}cVS6=Nsy5Di0Ex-Aq5LNR`=5YApR_W|Klt@$=#+nfj{gEy|2O!xxQMK}y!!td zzy1S^{~zPm0QOIaQ{T}^$V}gXfRT~)-|*{y!uR|OEB-&X{zjGm#*{yg|Ak=xgFOE! z**}ryfA06E-)DfK|A9RJXMq1dBhUZobNT-jdHxJ|M6cvzY_0m~1pPO0V{=n8r@sOi z{V$Mbz#o7A8}j_ung5AA1O7nz|AstsFfe^S;}gAhGIsbZt@NFYg^dkujf@F+d7&Jg z9E|m?q1=G~AkRu7T{&q938o3z4KfME*0Qp)vtlbO-o>{9o-1Uu+s5uIb7&fpc_;`_ z-++TFDX1#1zbypEI42n=mDkY_qDU*Kt$`s9oV?WP;IE--UuigZhQSxMesGkA>0J1n zKb$ph@+72fa=$a*MN>cVM8X|4~0&tP)Cr;=oS`#5pY!-di{pw4RUlA68Q})1<1sSUb~Sq86f4iES2mW zos==f&*^SH^t<+bCL^{_;eQ13WD@JON~nSO?6HPRIsqMqG%` zk4(r1A}==V0i+UC0U|Ft90g<*v<8$L7TX9U9aI5KfLMnGG^7Zr7+)IaOYWBgt=A5{ zI(E50u#xWHJm(?K6&W5FOMK(k?kPcDSYX5(lry}2Q}@%c5ZVEc92WsEwm)?bP2C4m z9q36-;FYQlL1Ww4Jevl_uu-|3nDmk5w}^+A7Tm)~o}}dO`JD54{ImIsv-yXI-_)LW z8#>;VXx)CJ{P(#yE+hKIh19cr^2Ha_vk}J1d({+>M9BLLGH?@$it@gI5?`W{ZnhFz z_}``wcbEd+)=YT(%LJbFI5x5UjSfq+p|ktbq@kiCsg=Gwn!a*P?`q4>?#s{i%gic-Vbc;>?jbgYp(qoyjp<)qRy{em9JdG;8Uf z;o1tr;6Syf@KfQqZ2sg67aEqi7kGHvUO*XsQ*U8~)zfa7hqg0pamLX-8C)z_ zuZu1p9IQe5)t;+JPk_7X(4bDI8v+u3ff^i6TH}`H{XyAd#I!vlq|h91x=H$OwRsuCe55 zAPUls0=loEh9KYp04HPIjBEqpN)Z`9D2x*}Yw41c3Vi4`U%#qVV!o!dPhIQ!@$pGV z5sZIKp!Uj+jQjrP9P>S;+7Z(Veifsm{m9nb(_MXqoCoa$MRGy@h#wp7#t`4ian9b4 z3G93;y~BG?wZ!{i#~22t%6IXpFV~9V=%R)V8@oD7>aK+tDX_a~^!V3#|8jzJghuqv13K031gfc}h49n1#Qdx{0_nBq1HG(j z0WFOl;8^To^GvTHcJXd)4GGD;^m(DG0LD`w_Rb^LM#rpGFPY)NYbR626DWeesD{Rq4D(pwGTOZ?clr51Pr!iT`)7`A{%2C_Fu*m|t* zK&;M{+?u?`iPoM}ffrFp=Iuc9Mf?Snn;lWa&dCsR(_G@bympR68G8)di|=z=t+cbQ zwF|tl50&j9qw127S)uMsmI97jc@G9eALJ zBTge4_X6N@Nxy#yqih@|jc85OpaK^q9NQic4;UnYGy9bY z7&2f2!ZC}$ZaR$`-PBv{6m4&3p!PHIUb^mQe{&{OrQ?5coqOX8bDn=Iki@~_u0Q7W zO*yhff79Mt6$8O$)EDEldpOR+<7s( z%01!=JHMH-;&scJ+lPji4D_k(N9Sg7p4zkCJh7bJ?;^W+itDTkS zzH5gE&6wufG6dJutuw;UOUlEyfuZIfZfARA)gJkvh&nI9KMg4mq2(IErAL&<;@i}D zm^C7MhgXY2Py5_{#UjyYK$+y{b0{z{V}_j&B#-k$6A@DYy2}G@z~liko}E58x|v~~ z)+D@bf>{r5(!>7wP@sQ{rh~-u^-vJE4ed;*di(bg2!W}8_HWeIToKaiyzgdE4QpQ> z_MfJA@NPA4zvv)$vU(timIS;*$x|LRqT~7_YW*B=gH;+j4T$Hoqt92X0bUd_6^0j) z6X07e!C8UI=jyQ*;hOP2(q{<}t%Z>Ll$k~pQ0K!Fli$uq*$6fl;2td=$sJK=MywZx z(GWxMH?!;ki>+qEuB^d6zUp2bH;`Qmq5;&5yaeKg9^~oxO@|+9B5AFrxz3;;Nnr$n zX)?w@+kK@QNU(!$>3jsz9~P}kIVC5KOn+i^6hvfuwz)k!0@EW!-v2UGG@TE>K}*)3 zN*PGqa|Tp}CnVRSmGxy%$KN%bZN~G+u%hQXJEn(Zun%aazoQ*-iv&ZJNynE9;0HKf zF+KU9SVFQMD+!}f8S7?@w_eO07i-`h zHlh!GG;n#yxxM5^wnxlPc-q37df@fnz_9FkV#Dh7RiSFowJ?+IfLPLk$osh``qTnN zY2E0uV_vQRua2(_Eqq&iI|+~Uk2vozx`~ZO-{DMX`HSN)jc}KN>7;cG>Qbjr03ua_ ziXD0EV;aj$O~IWJ>p$j7;B=qOoIZ}^l@YUW)^R$?pA~O~+@z%V2h6A{0^Auwj2S{y zE@j)mtRb2~);fFkyZuS=fw?%r9lem&n73pLK7dp={g=6*&%1jDMfDERh=>+=S=Yvp3duN6E7 z?tr1ya&!5g87ZOO9CpAHLk2`}{w=p>*R}a~FKxaOT z>ZxW;(-$-Bip)iM5MEi60(g1OQ={)Qh(_OihN}$J2>WCOkGE*$neDA|uz_Fg8sP2) zDX_h1o~aB$P}zFkx8iZ*>zJ}I^Mz_|nr<7EEyD*gtt2I-862*_y)$LY70MGU0{k-^ zvvsY^nnRgZg~C5K&I4tWiNKAWu@@2b9EMYe-AwtqY~Be+@tj=<8V~J5Ksi8CG!~y) zua-yUn!QfHA~f|Z>EKn4vnZs6kQ=aWdwjnv)UtjK&wA?& z|G4UX&dp8Jd)au-O@JdIE`|-4_Z;nPCz$U+wGFQ>lEarsB#1ML@uS<&r^H;Nelvv% zQovOQa?v&XMo_#0df+fx<;UF?iKDD-NY}c1gkUZoR%8bKBz~m0nGRQ!a|0kWHCivM zVU{gWi|3{v7Oke^egX;yg%H#S}Pf|0O}aS5jn zTY#f1sKV0l3tmNzE))O%WR{)yO5rE_6W?V*`mOB}2t9EjUq ztf9}|rGz8spprd5qgh!)qy3%10tvtjab{8M)``YaC!ccbSHV7i z{HX0BE<(uyKtLKMFema6H~|c?ocxQzG`PJ-p_sqEiGnI1T2LXbZGt)j3lk=pgauIe zX$asusQ?|^o!#~=)^<fejS_rWgkE6e`@JlopRz3BKarmW)OwvOKyhMvKZy*MiF^*NUi=m7Gh% zpZfv~3iQUmTo_Gdb-3}ZzTHhGjAL&a3G$iSDJ?<1kq{!T(}BH2hDOO9=dkb^yU$-9 zHaI3bQtE1U$<9#TNft=hN~WT+Q5R8HQSaY3oY}i#p6~d?)i8V8N($pkFjLhjSST_C zPRP!Ki-1`+xjS*vGI}B*C(JFVK3a5L*31${n{GSKyarCfOda3kV!G;sHtdO(uqCG) z9-yIZ0p?T>Xm66Sr0SUJCBfP`mWN9dIoOF?TPXZZ!r_vB8A)gClu)4;$DuxkB!tFr zb3JEBSzfAf+==m4s9&ll1XJrry*eG#mp_84jLgQ({1D^w+L<~T(vSR9`YfLyS`v2CfRwdPr)ZmZ&S&kKO9s1+rSznT<-8PtKTrSI10K=a}bUO}H%1 z*F`<;hezdBev_YI;LY@I*fP7DN#9+bLg`4gE>&5l-M+qp;_b~v*!kSldnQ*(+>TSF zjbH!RP20M%e*kr-ug^oxy(7@xo^I`8MfFW) z*Yy3h<{Ig_m*z!L{S-FxC{HIE))&iNIZaUuQG%I6^ZIW&!H};j7EsVzCdIvx>zgI);q3iC}9huNpRi-^Ta(iXb5+Wax z?Sp%qywP8z`7E-k9bVdJ4(g3Fs?D*?-NDYiL`OP|bdXUt6Vm3*sd7k3>#U8L^`dFd zd>DD?(Pdt4Gzq0AnU6Le8Zp#I(cYu!H?eaS3~dl|TX0(N#W{_>H)5nD0yJAhwFpjS z40b^?OY4fs%J0^IKX-s;8Uj8U0oF-Llfa=VCvA*Zc_cyoAu4_tcPeb22Es)#u&kcA zgLp2OahG`as=2?*V|Y7Qa@Rnbn9?6pw*npVb?|GmaT>)|wK707mo={i@-bRLTvAHD zR=kM^P)bDI8Cm!(xK)PBHeL0cVl>m&(s1^Bb?rf=*TLNLQqk1-1|v4M#BOSOSf{eA2UFRTK#yMSs3HF zsGi|=<7O_hr`Tdp6qXtpJgQY`F14big<=_Il7!!G;Pa3Dq!)}yk>q%{TMe~VtiHT< zTP{+Wi*#%q6}RJ}jAn!3t(03YW!j2zX-mQ@Vm*%|mZ#LLjhXv&7FE$E5ATWLI2}ia z^F`+)z0Upmi|V z*BU4TrF8YtpG~-JCp~2h89~@9zb#f*EKXK5IwSyUtQ(2i01JI>YinocEqZX4ucfes zMJtum&j*6u#Z?HhkxLkD3f$?G#?&hIm-JcbYzW0L%R8NzP&38%;VVoTz=B}?Kg$(5 z1fYExTwu%_=)i(l>mS73w{4N!r!C9*oj} zx@+YXF|cmxI?CTXWa=TO^Cwm2h=GUhk1h}qi$Hw|@{aZvc?n0g3~r2W z6tRqe2o@O9o6)S_Snf1XaW;rw)zsd1=9+b?5KK_Et?ohfe=G#M$H_#l`L?5iW$dl3kf*o! zd<;m7Pd^yV^viT1|H@H2q`sAyshQcHMf2JiN2pG|*Q#xd9J_co#p9)ipH6J@%f)SJX`ZRs>dRV~6+H$Tq!lOwW*DcT;nBw95=f?l z2Y$c@W0RIqs-X*UP+DT*?S z;%T;6RYrT2)zoP{z<{*^QgF&saO%ZD*?%KRs~EK0v*|p=UdUbUpfl&eJzK+;#GT`- z?8BFJr4aJ^>~SBa!+D%DRRXGj4~LT1SY@o<^nStj&RdG!2sm|kiIG_12?V4pjr^^w z?^MCex@vi4B{dHARD%KyvZ0cawd(Li%RygD=cDjTYb-!U&!*PX$M#eucCGf8$P&3? zceUB$0jCFoYmDdavb`!Q9XEc32i@bQOYG^!R}ooZIA2M&|Z zad)rc*jW9k`ebOUe!Nd5*IVNiOSSYlj{~9#8(lIICM{^wZ`xhxZgy5m==Kt=XI;x` zGUKvzYprdCP8ZsZd~)K9rE8?e%`7j!t&eAuUC~+AeSIe*uMF}T{^B4JFEn}=te*29rSl`_K%SJEDiy@utSSg|4pd=M-M zvp!drg0ld3RcZ&PZ?)f9se|{kNze=>4u?&He$449F}NP&7im+kJC7xgi+zCbChx@k z2Zre{%HR)=0Qh%?>ED;N{~t3<$}-=i6$Jl_VN$fU*0=e4_58nh7br#m)87n*h|MPr zVQypkXSu!MUw!{|M%3KlzgQ(^rhliH0382DF){rmkzir?N09JG4!}V0M}+Vv|Dj9% z?(z5W52^G&^Z$M3lVbWu%J2`Z#6a+e!UB9!HGlG7_NQEe^;6*S$NrQ5deSHH^iLc6 z-!{~r`k#Ibe_i><`XjXX=PHg*y6W$H|2@`!j(?u}hsydhj{hp5{-U-%efekHe^X$8 zYJaRh{{GYQr~EJ9KS%MW^`Dl%M#I1W^>>eddH4U?`hO6Vuzk`|fAW75fc*8Y|DmY< zHH-c=9sZskvijD>pE{iXGAw^pfIm~~zw>Z^&iv!#KMD}QpSS#PJRB1%BlD-e=YL1Ub##19MVVh_@Q_t; zR=d;bypVFfL&Qa3=J`+ysgv5T}krHTg6@&rNAO50;Ogml1gj4Ws{N2AH@J%5Lh z6W(~A$&3PT*MUN4Otnf|mm7fRf8v-@sloos_MN=JR)@p)ZTM|Qf*nqa*LQzs=MhYU zLa1C#ySB-VX7lj-yd_#pKDY5QDDX$wq+%RDI&rrhypH^TS*X0YQWy7rsU2uc-h)F}w{ho2g?tq#nhiDKwQUq6hwKimDY5| zC8l<#EG=Mb>qmeLdcuQ$N$jUkv^FXbo?jpzA(& zTejZ?L{Y%`!(}~dHSg@iy9m>Fmf-!xKa(%6;ud}<<3UzV@G7u#Hs_vA{pyZlQqQeG zh5`=ga@SJ6T+60My;Uow-r=LIGmSmdWnd#DH1}wA)efr1o>Fowi~9aRR>1OZ8_c0@qJ^U9t%miU#Lc2&}LNyW&Ws>I)F})T8KJFts zFNEFB_r3)IDE!-;G3h(s1U#eM{gYb)hyncFz`0q^H+<9F*wgnICdb!qON>LlFKTYq z&y*k3X=ATbfSrylEV;x&L@#?!d${n*ys!!p#X@~oZ z&+Ubl*UuSDI=xA?hem7zV25C#^z6VlGuYU$d?}D0=^@+ioOUo--{Bv zEh)KD&J4(*-3}&{F*b3?H=J30~o*~;>m;K2|Y!t zZuoIA%)(9)gE^q&EfL^1S^RA4@7Or8WMBuqJWqU=CK9j@8_C{hhq&zI4jaz>e{}GG z7#A{~o*mEstR!C9p0ZcKND}P*JG{DLTyEh;$79hN{mI+%Q5#BOo)&f@s)SexMiu=`P z+GvjMW>;s06eGhYij~C(@ zQG&%f_6DDiU!Z+Nz9%!y_?Rtdddb3_fOdSXzizjD$$?=DR3cG=JQ2dIns2!!b1oz{ zvwHc)v&I@iZI7-K#kOtzh%qmnfvL)9{|N3T3Ad#UzbSF~s@9WWBjySMlfysN_rQ9K z?biVnp^V)4ol^?i{Cisd5q_7A+r#Bpe|He30s&7?H*(kRj79^VwFq1P%i4Fie6^WS z1~p$Hq0|BHrhewrA^hEH3SrDrcC9m757f@6jR}GSfdfO4Km)1m+P>25qJCHSZk|^; zH&3YBD28z_RIl=FyeKoM^bn6}BEP#LCZDw!mja$6gr0M6r!U@-A@aa4TRi1<%-O-! zeS8CAm-esl;rVW(@DGtnnk8A6Jkq#7HhyR~q(sjY-Qqmsd62(>I;I%J<;z_W58&;q zoi6nC_2motZm0J}^k?-y!0|DAVPuQ?{UCH)@gMA4l@*xP2T#c@H~MBv+yXjP50C42 zA>dYqJ{@ty&b^91qu$ec0|b!-0|CKL6mio6$JXQ6w57_8HkU2o#yLJEy%u%2i|R() zg|-=nA9N9OMdudtcF7Z@+he=ydS$!q36&Fa!AAi$pa>^fNR%k-+~-Q>b*KbgYCPv) zLF$a{g zsvV9g8Ol_Bs>YkYHl#DkJC@Dw2|UOb==ywaO1Q$mF613iRWt~c)d|dWL0bl5VnDnR ziVrN#6OIS^OaY<&N}^XBB)MH4asdm}kMu}HiS;$~XD-6!O9x)_*m2Ej1zP>cF!n8H zrD)~Ox1xYN0U61r?`Jn(K;qm%q=iq9#N!O@d0ECkWcxe(fmj-SeaHFzGTHFky4Vy0 z;-ucK3zcywwK2Xw@#B_Bk%Cwo=xw1_8t5TRrT>DxTh$oI?&-m7B8t@I<_4+jVqw)GOoBCQ+oC$I$}@d~(>f#s^7 zQV{3u%y!dL1UQ-8v5loOw4fXnho2@|I5c?d61SdsWTxySNE2@M3haX{X-c3GK7X?r z`u7MM%*5#c_d>&`UO-{F)=8GT8 z1sV`1N2XZx!6uYgmhdQ?JlmZU{8q-+_OQ_Kl#W+Kz8>_HCL)IX_lcc4Yw82w@tL{v zPP!3NsaRl^R?liBhf#>qJ;I^J#xFqo@@16s!lN3!_SUtpH}K(S-MrG0LycnZK*oo2 z(009h8#~|J#{GK)pU8-~Em@aot3+4PR6!oMW&^irQ{YQ94y<=A^?1Qi^mSmYUa-dV z-FMPvH*M4Se&xg5=o0^uD8Bh33ImjeRtsX)V01{JD099Mcy-1jyooJbxgkVgeAMcw z7)T*Ht?y2q2@7#W!jcFnPb~qyvR%45(gD^4))b}PKs$~14IFtgXdj6a&GuxZ=S2EM z2kzx~z0YrMw@Y4oZB_|nQ6l!Fhmyfd6JASyU>G$wF@s5nfg~g9aM~ z4E7G|3{UL5?>konq8}RsQ7kY-OhLJ$1RE@vlfi;0YlQ+R!oYatKTvIwz;3a!bZUY= zstL7Rwp+Kyak#D1V79M6QV6uJe7|gueh@>dX}kTp5NN^5ZVl&W|Maz3~pm6c3^ms~Yfv zdQ&6dnv>eME}iKvi=PvBjkeu#Vbz##8&H}XQibVM&=m7VJS6+*_6jt%*Ua9aIt#5c4Y_ zeFU5UkVFT!be1T!N@5&ei>QC|DlO0F@mUPb` zA193Ok8_1%hMOiPER(#DSLp^T%au^i|6s9X5o?gZEzrz6yluwT3PFD=kCckUPd`Yd zO&&>}T|hcPS`}VxzvuV_IK%2!_U&<9Qd+t%6FosTn!P5vKCY@^#r<<2o%^n~{2mMB z-5<+_vE1OG2trXF0%!&Ltr|{$Tz(5i`V7|x!Fc)&s}yzoTY9k;6)6`QG5L>YNwb{a z;v{6*l^G1mY;hmOHedLZL$OXmem~aNP){601~5Wpt1*{@MTO*<^N2m&;X?5p z-affPrc}mX@NUmdQx=S5S5LLb=D4&x%60i>3ScwCJ=w>`gNg7(QIAqP8UxCo4CcS^ zxHScg7LQ_*p-M-HjeX-p9Dzz?>VG93LQmfE%JBida2r#4w2z?fzRKuztKcO4F8T+c+9e^C5=@*4B~ zdwMDCNDJCv4}wf?K9QnqIp>#sRDVW5sW!%Lx?%a5{rx1cw|UNGAW;oD3~&i~i_bPw z`t_5S$x#9`=JkEa)hXt?^e(2^M9*q`aYOvBRDDTVT|PGvc#>+wgsh5ck-hRrd>~GT z@9h^BAW&W_TcEAa6;4pSP=+wyV$?I%lc~$gD(ZxASAG&WjTwXXd=q)=v|1oN+x<}_ z2n!#RRqu88tL&IhLo*M$F4IGAY#zR|vB`6#4^?TG?km0pA{Fued{$QNTA9j(x!mB7 zQ-smgotY=c8%NU#o$j}7wd@Un&CIM?tDO!oC9I2dw=ROlO5Z&<@3&0L1#a0h*QqP; z^w(A0jWyR@GK+HAIB~m+GjN08)>{@S?=faQr$inP=M&s%|} z4>NMhWM-fC991elu|)#62CmQvdu5t_1LsN!bHuLtVvuuRytB)PxPQlo6SWe4V|1p~G;z zkyUBKk*DEK%}swhfH#MMI$7B%;>EU7BlxR{e{#9dg8&)!H#6-WIbqOS<#LZy(94+Y?>qJxp*#`|$c}J7*RISQ>?G<$Uwz@2wufHyE zyJjF!yt+dE%+c1l*4O>H-#W+(n>wH)6vAYgloLz^=*<)&rUMO(~|)Mut>&lJx<-XTYd%6Y>lM^~BG`Ztgwn}U49hN6Ggt@VUcC%+Df&;{wN#_ug-8!xQ;>q2=gQ}DBQx%OlLRVbzE(-%u-M%f z>{pUwg%U8|nms{d(^7xzpE+sLak#U?kly;${ef@-t^0oD%e$^2KllD%DKrEQ1##aQ zz{PO)iqP9G=dT`&>d5a<6`%Q*Jb^}KP}(5Bk_WbiA8^}^R^y96>kFj&y6-swO|zAe z63Iy`!G)G?R?sa;b*4Z*3!5)5=;|>sss1Rm z&RAyyWRMBmJo2a+HG+QuUUIje3{q7qIwj*+WR54q7H0DsMzDZ+Emj{IS+6>OwEq7^ z**ykH)-8&cV zIdYEY4O6P=$6}QsM!&Gf%7Kf)qE1FTDDezgz73ZW4AhdcW9>Qi2K+Ox8!vv2S4Zyj zj`B6Fk*=fm;SdJBMzK@&h`3A6DrjB(eVJ*>(dOW_cKSCZT(zVbGr+H=pMqAJx?>PF zc7N;Qy>YzssN%o`2?CkIrY{JL1_f=>CuLrMrx%+7U)Rx2og|+8@o-4)_fR%q`u^Az zQBtdN^kqJ}x-BC2c^n|3Vx^pS<>fa@9O4G8R_4_d(u?vUF?;Q|_z{Wv{rin}ImShI zK+$>(Ewa(0B}u2hcAKqU%}I_+58mQDaL_=^8427YXHYhyd1=*wvK$$%s$MdM5%{Z9 zkf{wdqs9T(uR_k@WDpU@1CpghG5kuokfh|7QYI)A0KtRrqizC3c-Kjdn@<-azzBSd zAhn$Sfg?a2$op{(2qKUmg=Fy@1@SW-3IG9tX*C)NO8X!4 ziK9K0Nw;q8XJhLKYAJo;fZFh5BmXxP^Hg?;&j%LOpjtB&XKBMvloi>_#6e7F)dmFJ)C&}WVF{Pj2?U<54{E+r4}4DNSa(*}n>&Wb7#{82rbu83^v(}~ z_#PWiNj?!8K>+Y^t40rp;v0v%wQD&%0&Fy5>&Q|}Cb#~w<3xHP#}j|I;W*nd$)Lv( zFlvCD%XgovpT|V zQ+v?zlf4o{cGw~zQYl~&nnP8xA&UYk2sm2RfOjBz7qK{mn3kxi4!lvcS*(sY34EZZ zHo?46B(XJ#lURwZ5CGr>nEhNUI@l2o|h!{F6ICo1%gDx|Y`=6m~|)6r^dU5<38S*Tl%SB_bfSCkpJU)-DRtkV14 zP3tcCGqQtErV|&=jJp3wli(frYScCwsx2Im#9yVm2hmlm+XU1P@u# zD5OYf$30A@-tJgt{%C*a27WRw7!T-p?SAoy#8nZNzHUkVQ7jZxb!j?!~K4sE*Kdr{wj#bqk zrMfGwGDneT?hbznZ-mJ3HhJAXlVVX^ecbhS9;)o@qP_uAx0CeY zuguHJ7R#@O{haBLxKtq8a`w^!8X!?o>VE*TP-(MWeR z7ayc=fV*vw6NRCiKRI|lE;uHuJV*QLEC?tLSt3+R0^t;p7nF<%VQw5=1e=6aVZDQj z9k*n&bEe({2gSQ)l5e38J3;mLG0Mhlh_}KSGo+Bh_&dJ`_fQvzfkP)e1bu@ zf65*D$yoKr@D%ISu%UNoIiM&xmkOWj$336Haw6aNy1yDNt&;B|sMiET&;D^1Z>?jL zDrV?-pa*jQlAlEBGK2c>E6F7GPP^Vl&}?zBg=Di}o-4KoXyoDzz@3b86u|jn_isE3s{RZ>q!I#6 z+z7J5feFRDn;{9}E;~qKmC!~4ze%NB3xAGx!9Rr>16P5F2@H=@Mnb`*%bUQI+YVI{ zg;0#Srqck`j8IixZ}P#LW!HA32-WE_yPmTu53;MPXX`or#?I4zxt}9COe7!Tg?b3Xd3SDtYQKj`A#CX6@U?-KE+}g zi&iR>+r~S$UwS{k7G#4^6fUDMO5eaKhjYc%P3b~5l?d)5pkVxICfN5YzXlFCpfQdr z`S$Dq^TpDmN0FB>yA8fc35?2kItcDfvr55N{}!mVsA_0_mb}oaNp{zQeuhx)W!>{q2Eb^(?COY54>4AQ=r*3B$_J+ui=>YwL z_rnu-)Lcq$fY9lJn~01AOqsN=Lsp!Dh}JD|4n)0C(LM>@vBtNO1|!>d5cVXE21)OzL-qBm3lNcx=XR`AcWG31cCUy{(P)wVXeLc{eRNA8a!R^+qKH)cYkbkI}X z$T%0x+^w&UN1q)6S$a}iKQ(uW8u4kTx_a$BZF71}g~beG0i_MM$-SgHoE@6@Je87H zdJ7z|m(+b?HofvDZR`!rCZwRpaHB#n`lpA5Cw*Mm9reW~cAJka%J_;MgNrP=P#~F1 zdCkJl;Yy7{S%m5ON>@_X^R9&vnjUq}SRyK}T#1~J0cL*ixlTMDFJ7@1U zo6W6BN~lRd0qNU5AlSD`ghWS&OurTz^4o}-&6XvJJQyQXXbN8g$^sT&peg-HA(U9Y z!CB-jUY?3G57hG1%u;7S((0620^QU*LY;e9d78DF3S4w3rfmHs`n zEh8CPfW(^*A;2E!a|8}5k^t+o>T-sPoN8}X=`x6W0(4(eL^8l>)+QtXPvLyDAe|gZ zgmnGmJ4E^?yZy%&Fm!Q9xDp|y3eCGXFs84UO`q7e)OU5kM(Nr*d1-#m|kuf7grlZtSc zp){~VdZ&Pxi2I4znDKhLVKXc(wl2@6>mPJ46kQaoY)cDb6{FlzP~3i+?pHZ-@Hm4; zp!%l${00*nM(hFWcg8!7167_uLNL3GAFS3Sh4mn4sH&kWSD&1=gFSnG$v3grY=zk5 z{*4b!oxh8cW$mjBK^j)n<#CQ4M*~^%bq!G--1}`JBIx=rq9PFcb%4C)MVNPjlU5mF z%;w02cIsy>6&#cchpzVA881P?Ae;zFqN3-jtKE^Bh_NQifruAr$`?fo{efm;yu+oo ziE=dr4gko1O6NO%6c+JQaKQ#YxB#Sk>rpo&scZGrm6X^WuZ8|9=+rEr+5L4etxYn( zs;7HA=oY;)`&45Kk|IpK5o||4rAZ5TIPRU-0jDoy2(h6U4M2uUaz2%vc)~z>3fcxeqJV`1R;`3vFPq z*XDp-!D-BQkDLuzb$b?h%Ts85%DvS}R|hp24NQD?jlRS#?^aMnI!DyPNr4VQ()t5c z8PZlqvKVuwgz4l^p{im_$*%;Xa-()tA+kxQWS1YW8(_QuZy%^?WG_`l(L)qq>*bTU zI~Fm5mny?O3U+RBWSZ16QiTznl%b6#{60YkWytpJatVdi+p2qQ1t<1pw5DXF4!hBQ zC+CjNhwaY!P1^GaO9C^Z-bfYZ=88spNk?Npi2o+CY}-fjr;2BSOQUX-*H5bycZ>bh z>*;wjo>}1^Odm7V&Fy8_rk-ZcY;P?hu5E75x%arY-6tM{Z=qMgN5NN3Z}hpn&p)F4 zRBv7Ot^cUjR^07NO)SE6)vw~fdrfxdT%yreMN>;v&*{@D!0g*g@Zhm~Aluf3t)3;7 z3P*%Vx^H7>B9VSW$=m%K;Y+IE(;YTAq^1bC_GX|n7qkICMD1F=_5=rhkP#S%cmUBN z$Yx0$CplHj2OYS3;SQ2N6UzgS zB3xb&kC2q_ZXwDueFoh~YnN;XgG*^X=zQ=*t`ms_v#&JYE8(8~*3+k_?V^am4mQs5W%=@{dzT*PSbEA?hAJ*jTAY{Gs)mH)8O$5YcI&c6!H1raq z2yw7!+0I&SugnsIaDdHrUgfkFa6P@=g-FjIpf^D^%u}CDU9N& z+gVV6a>=554pvt=?W9$I&`XU|4=GSiCd(Ky3&&1g%M>cx+n25%tysJITq`xpebj{W zvRZ%G;@DAC)j7wB-D?_b6_lvZPK>qtF;qgV zHaG@LAxXDi{lPMwdC~ikfZXH{zRisNDR=|Y2Ul(5oVWDO4SwlL=j2=cqWD$vz#OM2 z6s=pfxUWPPnLMA@|h>Lh3U^-!i*=NX*lLYA}PWx z{FCvMm@T5th(;LPEGpqGlzobGLa_ft=0RO8Y1Kkf$kq`1iLb;DJpVvLEJpQRh{8}Z zLR18*qzLxeG7Dx)5FDb6>OK!n@|C&nf`+s@ zNXnK|Q+DaNBf53@Zg0;I=o@U!2du{KSe~*9>NW6~bN~o@hBxA;aOt{r9~8iGZQU!9 zNnA+TmpXvCIWNURL0yVVvVi(1Fi%5S=xJ_@#~Kj3YO>W9BFggRxS4GvZLsi*`4H5? z#Hy>^tbvXQR8t%30h0M&-Bw#eBTV_XrV1Q6d9rc|TMTj(-kf$a90cdg6kQ4;Kpc0N zJL<-b$Zio-DEqq7?XLL)D8ldK6)>|H76Weq{;mRQfEFXs2Y~Se!_hWO0AKvz%kWSt zYNZ<6Vmqk4lhe~!bmlzhhiO6Ce9=}v#c_I=vzpSmKr}NvmI6h^ej9m-$YfldKcllz z5!v*-SEFAD(OO+WG*N$)p|%7J#Tt`+&T8rzd~=T@5xLL=2$%!P9V8>~T&jIQsi8XE|(gV+w1ONn`$ zu}M6Xr(G<*W(TO-oKQ!6X~Tq%fFjs^8=Yjs~7F=vr6xX zxMD(rmv0<3V5fYlV0H9)KNGP!8;!>Hu*yzpDZBI=V!f}kR>UlQMGZ+2(GV-B-I+aR=3kBf2w+wm zqOg_Mt648yFa2;jZe;j9{!rdIkSsbKYNxtY{Tu01{6jar24|?cxT;O{lu}1mGUZaT zbfb9qszWu?K+CYmx|8ToUA@c{!>?mPn)#$jlFCgDX7?Zwu$|haiwh^ZeVwZ8_xEB+ z9^1T5>~}`aaruM8#)w|B(Efysx^p&)UXQqVtsUm{sMCd zw*qN$zPzVQ0!*u>4 zaxKlDA0_R*EWz2*m3XOaylpn8xU1EgEOg9fCK|S%Dezs3Xh=|daX;GXy%b$~43@uF zc%QlXtR*<_ez4G_6LZ1r$1n%+E4hY8uu^R0Z!Fn%Wqk+crJ4>6)ol(&eIuD-fql5f z1ZWsYGq>v7DLdC8Af<53mMEt!)Po8a9c8ygyeedQ!Z{^o9UYRkI9A&h+kTH>6j;!o zHsJ#u)er;MLWRFCX(!nn=$rI@~S zlyQ6V^zwePxV+;%_3eMF(L*&I%#>_VTpVe!Fl|fiO!G>6%f0_`vKTlCI2`y$s{aV` zAQj$E3~^~M9Si_BC_G?_T&QdjM}-8*aoh;$_#}B<7`m4gK($tC@9o!BFI$$ zj^Aqt{roIJy5s0ikMC}WiwP76ul+{My1UT3y#gL0{>TQPSOLM@ojx@f7%84iQt1&` zraWZ`8D%Opvl{C6Yk#&Fy7?1`S_T6gV3ew7iPLIW9(8*Emrb)OEh?f)t@&5G%v2)x zFI1vFP1bkNPBeWT*o?I&Q$lR~o3&k-e1O;rgA~A8RkgGSWf~Vcw>qa4V5pG!S z7qR)GXT}ZN!Nzx^ol&B#K;g zfEs0PkCsiAcM!}Kl{GB5N-6`C!>m5B9A$zj@Ygp5bTl#KPs#FY?buIT_bGc-pKKh#(XbD)Xu7s(YI~gz$@iIgW$4g;6BHh9Fh4>0|laW5>auD zgvZA7MS3vfx{Stz-+KM|p3Y`+fMX*W*^M|NL@^uqN>n!5-ApHjldVU;>7BzEi&7~_ zoLc{EjAa%wyZu1O$l@=i9n)MZ5EX|991Ko>_NbS9ji580og~9{ns)?-#@8Yy_Wxjy ze22SAvrx)cb#^wd!3eI9NV;j-9fU2}J3{kiHMpC*X#J)fHXA&dK$&O-+mSlV^W#Ua z+=(lTbwT@zgHV4%n}qbZG}D0WXtM2zJRi2!=|^@s`0bEd68234yx0*w9w2OD?8}DU zV~eCN8V#Mvi1M4KdM)Ym%Wgh%?=%QuC|X5j5;(;YG|#Oq8U3Z={54!50s z_Wg<=>Z6BuxM{{v@njf==VeB{93zDc5(aE*ePI8{(k9b<0|1YrOBt;tJQB3z#j$>s zi;(=#)RXUcDc&Tic_ERW_=pGv+eS@M(;>`L>{H?)DU;lpzH(EsJI90j`&7c@Re0ZY zD!syxB$b-F#_Jn}e*gn!jiHrVJC#NTYgyc6pQ@cM!>(-E7V0U3{5v`BHd9(DLb-!5 zmvUW4Fa<`j{ThC#hPU`>+t}+LI5G2@DE$~Gu#uuO zVbKavSAiX(+8)=`zM=yu+xCf&-Q^u2l~jYnQ#cvV2l5Bvk$C3YA}2Z;BF0eVcJqb` z0TnaUT&=4jjnmjr$6<{>*O9td(qyX!Rqd$W&iCqCLO6B)Ttb5nEVI@;+&@o9mCm%G z*%eC?o#ggNA>}%}NFA-xUT7j&IkYqX;!(3%Tn_zp)!TA0GEj-7rF=yf$3?vHFdZ-f z+l@lwNYXSb*fS~>*&Kg^E7~eSs%Q06G0N?@eryMMWqd5CHEMzZnwlV46*eXq4E9Xd zeCb*9Aqa(JM0ilaWW;eTvZlVaI2{JK18WK*J;@jk;JT$qb`lU?PNy`MHr~4qg~8-W)RH*RbKaJtsC^0 zljAaY09N%cRo}BzD?9AQlozu(Qpyw|?#752zn)Lsoz)Eq(Q-;&cD{$R&MUmkb;bNh zhA{vbu9FQ%-?yZNHLdeFd$DMI3_kn!@#prqnmPa2GK~Vw0$p1j+fK=50iToysw}dR zb=>OAR&I*U!Kq3YC>^-)Cpvk>OdhNROSF&elA_0u7uE2aUEUppe$`KGrCfrO4Bh(Y z*f_2eV<97w`m;wUOXLAEdVB#-Kv&D6SsZ~-e>$SFo*PGR?Uu3#QgDU@8IX0dcveBq zpj7`#oCD$0O5l@fb-;`ezyinVxV&zw^Pz^QiRHsp-2KhNapGZbBA7^^;ikPi13Wbm;8b5NYz{| zgRW6`+IG8k!InkW?3ej>BckqWB>!wT)&4G8EZwN|DScMOkIDXlq-GlMQdzR3G(~?* zaB~qu^W=u+K69Nrg-=0of-Gm`3_xUH@(XEq0mSR$UM&71;OW^%CAtBh{!9%5hOzD-nO_tR0lCi;;_l?= zN%3>XkbXo9fkcKaoY8LFj#%ev`#uOC@}dKlztF=C#KDLGsq5kmm;w5PuKh?A>bd%~ zxj$X(a`72C#RIF(1Hs1tq@1qBaJFt(qfpy#4e_=hK9G`fRXiETHIk=S)*@5O@?@ny z%HLA0=d^ZNPl@|)YzN!@mi74VQ^e+5B0CBW3Q~G4>rf|#iziPnqFHk+Fgwr;`;1lC zfjzFL@2mP|r^tTLlr7lq)o~Xe zh%@XNTg2yNL`LppOsF_Y_n4KH_@l~9_qpD0ByQApoxP`u|46I#jVr=>d`x8^{(h$X zO$pC-IuW)Uw?UY_8nKC<}d@f0(_J{OH7AYxF41;3HpNbybMrB62~ca z1X>O$=k+{Vcl5Tj1&B{pG#F7Dv7jRrY4vaSyOJtAFE`H@_(7$h7Em}FGHjjqcO@h6 zQuWTMUuH6vds6V+SzS)Q7nd<+ds^$AzKFw|a;ASZ@vf{qxwP5(ZUxr2`@yL_cRCN> zqs?^?j^dx8#we1aZZKX==(Wx(NxrilSm`RzUW3C}+8qXj>2_IIm)A6_S~0yE?c|D} z>A7zF`8uV&XggJ@M7~}Id49zlJEY;FSpQ}Htmj(Y(0PskzRUbcL(1m4t*1C6(JT6VFSm&YYF^^IDu)t(SVAW zAT^VcO<&BKF3Mp8m~%fb@wep8;<~t$-KuG{Oj_qQQ-meenf6}HCePKwU}37USRLV( z>V`Vv&eEK=7*<7XPE`!;^uyI$OswA4YBVLpgqoyzw5X;XXAAbL!I&mpP0b3D)BpQy zR(1~{27AoWtth;Nh1HyEPe1|&6brz&e(CV%1oGJfcn{LaE$A%_Hf%{jV-LpsQdRgP zAkG80;65BD6RazRS0M)3_{m0L=~@pMJ_wa2#qpIBaT2xZd^P-tuRvX^n=Ig#}t_TTm$04Jv6f;L9JpI3$&klkl<*s>+sBLB0#r zM&+jO>+d=!Jvk)BtSTWcEoe$IPW=yu4D>@m0xWNZMf12oJ2*I$2|b|;HQ<(z@LO@B zfH&PAr(Wi-YjAp9NVO4?l8Rcl43dfl+=aiGLnBhaLzyDxG3&e2btM>Ju*8a-r@CIP zC(apXG=C)ohw!bPHkMjm*Dh=M>3SVMUMNA)79s*AgtR*L`~>YEOqD6>#X&Bhh#S0M zpin-_<358kztH@(XTbfW{Aptke0D3ZUbULu{M<8eVWY422JlGImanD_{6k*d%vi)3 z`gRSNP^+()w|~i;=hp=pF$rg%ey0qqu58nm`NSMdKf$#rkiqydus$W-0fs;hQB8Ed zlnJV_2fB%Xgk9r^VjX(6mageZ2PbHpSW2GgSLM1!p)ynfSIxnnB=k-j}oOGR%*+~L(*GeQ0(FqEX7luMSTXcsjJBW}&&$_eE$8wG}6EfJeHQ}aJD zLts)QK&Z-|KN~-~jYW1spaPIzzMZ>Yj@FUeum-|?k&(e_P5sdp*8p)tw2(?)v1H&N z-;=mHa76g7m?@tzZwTQ*wl}zW{bPZVhEWXjs8OZWsy<@Qb%Fx4e}4E{`1EnrT3!z5 zq2b;>ig{vp!V+{&vwrrg)5Ugu6yjFw`CnlG?YIcuG=w2EVK z3B~edxZD}|o)nuo*r6)h*|=L&LY}Dv%4EuMZEvb!HyDl01f@+8!jG%#ryJ zvy6C_DGfeUbGxnF$pILtTS@^_$QVX_815f<6v?%R9wKlRPJtnEB`R%tz$Y{6W(FKK zy5D@LnWBN;>jx(_OP9yd-Tc~+xgxl_hGijY<5RC_N$tFwgr_oW-Dij{-%w6_SEb@M z4UsH5+N&z=BEGh#uu9)AH+vklP93^=K~ciKUsY9jGN^6s!Co(x!3cX z4g8(l?;cfZ>#>2g3!T%GuEJ2K{cIGg2?wmQ=H-fj6#OND)`De#1pY$YP95UV2ugbD z(Re`eAmWJgj(Rj~qA^)5;HJFXR`-b?h`4}7G$e#3z^NC-FU~w^x7f{=pa)J)utdgq3ebC*+8Mg@ zP?%-gXyw;{NSN?<>E!0h3bK97r)UINpwDIyKss}mbaRgLhS0-(tXN9I4A_CV$R$ML zkRIK`1Wt@y>#I_V?oq$6NdRL(IHFdt4RVRcK)LV%5VUJW3`g$LTJ&7MW)Ajhsk*qx z(Pu2CO4}oep+ub4tJ{CaemwBIXjfY6sxZ{ryj<+`2c?lfR~D3|)EJ!%?jh^fyf{=z zwwG|qe=OgyL(QJmEQbh1E#i>uAa7Oy5nKW0aL2Yt?!`UZt027XrOO-PtXV=ERAmAz zLZn{jc+XuGAs5Ia1PlM!Wd&#RaOlf=P~7b7_FkF+Lf!!Ryb9*TqN+4`a|?<9Y47Z2 z%HkmcXCuqz@-2m*Vw8^*TVc=!Ai_HcZU9nbu`r2pO-7F8fD3s$6&3QEb+q zsB2AAsc&kMoscNm83V~`Gj_D=r?D?dy0L=pM2Xg?RLH=!{7lFdc{p)*@zT>N@D+sy zg^Ao=YuI64%DTr>Ur`OUkYFHYZc%X1(QTFP)NU1M6zEiew$g9NUC;y67~l+g4tvXo zLlTUK=|>71eW4z|K-Bhi_gVlC+g3v=4%S~FWCeGS4ga8eZ)ZZT8cQ*sfT4R=Tdj|B zY<7|{p}-!VcZ9h3)Y(;VZr(8%Gyt|S7dzP20GNB|Jv!!f0dq#mR}f!4a~eYfC;6q9 zOg?PAJnMPjylmLO%OX(y#LW4T3*uw)em_K@4L%t`NEv&#+)iz6j^A=;dEN{CZ3WNlwXEkySeD}c`T!q z+x-?Yv*n49f0k@|nx-jw_NRZTv@)GGYl>sz72G!P0wTI!OQRx zj%J0t70nCd6Jv)Rgl)pZ@D*?`*%#AIFw4)Ri~Ctavlq1n>JRKS@HOyvs@|Epvaalo zks|o;1S~ls0!{u-b}yRWIe2D6lT|8_!FZGbe(VsLBxezo%%R3iQ`mjO0dU2L`>~=B zy^>|&Ye|a}{z3w}%o;8b(ow+%gt*%SuUhI0hESmtp|K1CbI`*Gq(Eq6kMI%$1pWE* z3^po^($q@WB=}SY?XJ8I=;(l?V#tGSn>e~_zffYArUz(Ck}4<8bT*(Wn>(y7ry!Ao zTHxN*UJD9jYHn^Q&5#O(G(s3inh(w6`t=n+RVH+l3SGX}}(tvrmM(LA(faZk7W$B%kXPiv&OX?4vhEBa_i9!AGpo z8O#0ao*whu)?!}b2uFw;-&P~Q7!$iW6N8^}w0Wc(uKECXKV`#F^FjU603MZ-jRpDB zt?PLT7P>n1%;10b`Dtf{qx;SZq!#2-cOla`n4akPmXMBl@d_PXYYB#NS}M=`@+IkU zC9|Ggh@KkD^%ax&nFC!@V*aRU!`)T_#)QZswkFAHJ>2jpAS+iE010EZM^jlrj0RuT zXi-5qJ!5~E@aX$gz|u+zD`_*b6WYZ)*rEAiA9Nl0z_#& zl8GIr9s;jw#sFrtGC|kieo5G)WUHW}(LNb9QGvivc>f^27~4o?08)B0B?Xhv0&?Hs z$1Y?k1tHMS>;hmTp!(o8wmVOJfb`=b{JSB$1-0s@Jn&CZO+Jd(q8@1baCJOR!9)`Y zFcOIj(7~uB|LAcp5C4Z@OaS{MeaU^uaQo2S;%BFC>BfhTA({A+d}X&OXtiW zujX9mhHV&k=rGI@MX8U9Yx+nP^NNADk^mUpB)S;x0jozP$SBgZkJ)C9((UPTAV&N7e^4*&Xbr)Rc(ivFIt{aQ$uA zr$Wsssj$x}!{^B#;*X+iIAu)AD_ZNc&fuNHzQ55-qjvL;@}J6Y@5(E3E*PAzzo%SG zL{iiX4wFxzN^+E{`jKs8sCSl=AKO^b>W~cJwMrAY6@FCml)v+j zuQ8J;Kx(C^tEeENU#K=GQdjkZA?xhz#5A)gdNP|dP411SF4Ut)RJ1TPi|(yyGPSIf zJEuw3Pqp~pA8d1*U_dTBUTd0O4}>=*3YCB4Ry#F8zI2WJ~)vvX#{jWOn$N|GT< zq>StY|DZ!Il~(22Vu!Oq&UT3%4XKK_8!@f^1y?5CGQe+Q=lfN%QF-isjv`5kG6s zL1^cA$*Zv1c`oQ%Csf0q!Ge!G75?4Op@2J<|F8eG zJ!!dh5Tb&HD0FrgmlA4fWLSzE^VRf=Zx{WGU&|CmI`}Iq6-d(ta|@L!gmu>&b~bG} znKV;}*$Qbdo7vQtH2QOI0`u06yWuEpOg+A(7~|LTr33$mx9DdcMERJ4@Pd6N1~jHe zz{z;WlVh)cQOx&*-#dR$(t|$d3IrO8Ur%h9Gy}qH6jBncZL_a82j&Sxt7yZ{slARc zRGOGJqE(v`A7eCm6}hK_rS!DobLUn=Nn0hJC2EX(W7~x;kH9KwD8MzzGzz_Jv<$sS z32pu4sw&-ZJK5TLwrQPpTLQ}u&X@HT*r-Y8Ew9T zNgc&!{Q5dEhk1Yuqnfn`oSulPD!EYpRrsr@u@XN$vSiub@GCLO^DsYmT}l;@Gey(~ z>yFw_zv;1l!QX?7a=*kSEVx=*7=RmFSXyhlbkRFo+LE&>!ldweTe^y?uoWF&fh6Sh z`nc!%7NPrS&BUQWK{x#$3jj&|H%LZW=R7J&jLg79yjZEX3r#gtBv@5dbX5fOC$^QD z-I!SQ>z(Tv0c4jneq&Grc}O$8pTN*4o}WbX2=b$)LByLJS{wA~+klfuqeS~(=yM)A zgRwyp^pp4H%#0C&k>rm9XL1l6rS>I(*JrFj@kE08B?pBj9|VB1HSGap(g2}yZIgg- z(L%DU{0YOMS0~O?I34!vhJY2Z^_685kfntK4xzNj@JU&00KUI(hM{35tA6ck1Mz#; z{eaZQ?jHgB`B1 z3f%TFjBh;TC!Zb%cybI>)v63yB`C-v1?Q50bBx6~&eoyc#&mRrf$LL>(Frg^?*u+- z;|VCiJ@(e)+s5n%>~pdU@;|x`4K(W^@;|x}WfTUMgFgex#eo6J*FY6zh=OJ5McT#Q zK|U_VP0YyBtj12x%Ss0aFdqle{h!3Nzqr$1@rjXxgPHxmqCEeUdj5Y!<;65bWpVP81G7~VeeUoC0Obq|;P(AH;21vlk$i&u}fc@LDqyNjI z{e43F_ejtS8QA~332&+2G}UyQj%iX}mvQm@+TMv=Hso>@?PBxh9et zx$POlFf!s#A0E-i4zdnsh|&;T^XaESG#tkO!XOF+#D>5iCk)*O8w5onC1IQa)hcr9 z5W7wM@_FjKdh5NCsp{zHsI01z&EYz7lT|spg;lHOw`>Ac5La(;9rq;pm|_=jHec^M z$ko>L1t2W7ICxdDa9Son?lFNY_FAD^=XmiYIrO5_XmAy&^%lb(+Icvm>*PtxeFPlBUbRza z)WCb<_Zn(}Fx=iI`C!NP3c^I2btO9d|;C!Irtxdc>zB}jDZ zbZb;Cx;!RxiE~nEZ#IT22(nAKjv#eu=hu&@$Knau1&U|maS9eIT(VAg>Wh=gi`#B&L=2o0Hyk%b#z+R=!}glYrAXX2{}3z_z* z!t)ui2?sD8Nrfqdz(8<^FpP@(K*DLzPi2b1^a59iVSB{6^eA%7q|B0>4~v;U-aV%~ z9x^>ieeoZJPFjoam`fD{UP9y(j?Z3d84_AI3lu%p#cJz!s2Hfquw<^X%-+5;9 z3{Y7-d|#DxB?k42gvv%zXJCju{%C{~^yC3nAd9)F>VU&XThj;fA>=ZJ(tv5ZX;3oX-sQ|`9 zQNEoI8rKc~v}5DLRxPyeg8i`X0`bX;(0yOziTN_G4IdpkwhbToD!T1z7WM5XIdRy6 z+kxa3W@=>@ad!Vx&+#TM*ZC$*50d2;2&y*jkMo{l1<$8n+D%k2azd9A*A7pLPY;(G zgeNZ99E3~OjQZ1?1 zDVNb^A4tG-q6MvX)*)D!36B5xK7p}swN3D@*4R^r>W*k3MulFR76jsY`s4l@fYTX) zt1$?pGYsokFJN;m&&H)P4C^|Nk76B%b(F15sXCBs*QQHabOgE^NX~c;k`L#1O*baU zXGjcy84gdaFil}foJUrnqcx6_re&F<<*u+HxKB@R|hojx=haTV-tj3tQ4^V0`oi;1SQ z!VCj`PYZVtVy0WQ(IbCG)2w`1t%>CWy=-`4dRQi*k?-v52G}ewg!<3C%d%BpsUP4% z=Z)3E%R0KolUMZ{r7G1rBQ_L_1ZZe6kPrqGO!p|93|c)`*wtzJ26NZ!I(Ie#Jy~`) z?x08`FSO@l5|`rQpQgN}NCmrD-+Rmot6b7eu{_oX!JjXRjPbu*i1ZjsQT(}Q_|uGCnT?%S3zD2dus4uRT!d||E?dd? z=taa;Qp8mj%|X05SWsSyINQ@J_aQXDuaU4$Iq1v!F@#N~Z2V!{*dM}|=U3Pzzg>QeIkNVaKNCeXlmawC z!KlFaec_%u|1bmP6)=bcI9Ehw#TT=dO@);H4=3cHaEb5W8EvOu;ma_x%e!{+j z#O@tSRgb8&;koTxJlnpbeTK6rFLt)DB=swy^d$H3-o>sU1rZGdl}r_ww3>J3I0V|L z6%Lv!By{GE-q4wA7zG6GfhNB5VhQaLD`O1Opcys53H$ZCz^AuA50RD;8Q+4Sw~R=c zwmJ3_)hF9xW;65SO?X!LYN!O6Ug+wZ?uy_=KXE41grL=h^TGF@--IzD$J5$rgXHyp zEF||I^o`UFVaE@4>ka!MoHy|H75oWfgCRsd=LaN<7p7Xy2rh;<6GrTB#NVumu}tR; zh}V~OgVu#=H`pqOeKk6}mv+O=Kd!nU^g2f7i2TC&g8CAUL#&s;m*l4iH6d}szt?)A z>iOdXrN{)0ag{+UJ#RvBkG$dJyz6}6od59}gu5VzA{!%pjpZgO0w(&j6^ZmfJd9=x zoERxUAt%hU}d5Bk$Ks5_xYHMoSi!*;r*#Cs3YbKCnLEA7CGlI9p7f zWHZUkP8kPNScgca@$E?-nV1GYOk~FunGht;X&%8I$z0*zSYH31!oE7H%HV4kMM6MC zItA(G1c$?sRzO1OM!H++?vN0WZX}eJF6r*>6p$_{k>4=)(LV;IlYHmS-j*7n?${HG-1kg#SYT|ud#>6o6^62myO^R3rYQ-%;2nk zV$wE|ghTX%CqW~s759fw&PzYAqTOiWMtxCB@(6g5na!(B7%Gm1-I}4>{OkA#xVA0v z*WJBsc4-6aly?b{EqB^Op>}apBc{s0TJNU7q?P<+~ zt!JWM#MwN4_w(Xx6b98BX~}1*3cQN=c4_8HRH3d(9%;*MZv-FHY+}1EUBof!6q`7| z{=OgcZR>N)u(0pO@Qd_kS6*CMluP!Bh%SyV9e`08bT~~`FlMnM_GTM zE%$xTS5G!k{or-Iy5c;S>2*Jg?yUO*(s7TSw1&s#SC`Hg)$B>(oW~qg;-5?HKlOBd zNeY_j)KjNZ+EW+6p%Ug37!rSsv)}v9bZg~o4C*=6MzNmD(2tmYTe?*% zQ+NOibt2YTB~v*gcfa-{;XqHC!w4EFEI4~or!_5fueWFh%A3>G^>_;5-XNWHln%>i zQCAf(A>gk%w$mTEo*Yo-kF@kE6jb5rRIYchUr0CQxYlmcLuM)$|ec-rxq=6)wt_{*USO zp{8=fqj2_SkD&I~?@NY2{UB|Kg8*eP4heBbJwu(r&{FU6}YQpBDAX)cO&i*l4(F{|qG7ZvC)B zaH(@cEG6P7aIFRE^?cCMa=)0ebN!alEgbe8X~X&v7EV$EqHZw9ZIGCmV? zgc->x82*`fGwdZ1Bfc#D?6Inmye#%`16uCF4%rD#6&LkMh4Y0^#+EnX%g&INMP7Rk z$02jxp{?bh0PU{CKB9((SUFj#LX4+AD}D`fZDP?dVfKZPh?g1m6{zTl=?OcLp@TTa zu9D$#Y(Ff;O_a#rDE(=R+RVzHU%w2myeTM(w)*DH6HoHO(+GG9Z(s9s$YP5~>EH~l z*HcnTdz_GH!T3SllVZ4k4+R-L@so`g=r&uvCeMxzaSsC{{u~Y$E;2eR6ZNOFprZ{9 zc*!m&LH7cgEHWx#_yIdNT=HsX>2ftUUZTr^P!55J){n#M=$~5O-2P&ocYhk7dE*8= zL~RD=E_Guh{65w?Z(9F*z|Gyr7y1I&Fd4Ko@eUR}^uaSGya7!Q_Qc5=p%{C(dgv zsmXnhtTFYriIvbwvGq%3a9?;UeP+O0Z#~w(zK6*|{)Rm(C71C2W0%x-Hk|y55(|(+ zVt=QMM8z95m>RVB#jM}Dv_3v3un4!WM553sMA1#(;@Zk05{rD*JhbH>Wmn+Y<27^m zp5Wop&D_$^O=PtuLQ5oa6>=z?llFp%h_bk4AoOYz6)fY&7ysI^`VunY^Jr_o*4!!4P znW3A_oE=j-KsvMPZ*IJ)E#@fHNa~~Rk?C6Rik`yPRUoeggX2o_#u8qh)C)dnVU{+M zQHHDuQTEGW$i{~Xc>neeR@oLxlx@~8dcgO`rgbIMx0>xkzj-NoL&Ms_$Avc*6&Chv zsHh*|lY8>H*vk{j=!tpFgi^6C^Tz7hyv1QfoY{f5l^th^R>fzC!*bug`%oreK7X`8S3T zVDEFDafQ)Yd?9=LrEc$rb;W{IzESvKYBc#21?y5V<071xx;*nc>Q9Usf}k3M36tUz zbnMl($GyQuY`lS$N_KcsAz;!UofV;Fq@nL}G2>&uMm;QNNHx@&ZVmK(CujVGyzfOJ z7snUBXM|w}tg$k&@?z5)v1^I!#(gLe6Z1(%)%jE{j~1HTXe=4fyQ%xtlxUZJK_QtoPgy-=wpNL_^n}jHHyU+`31zg;A?n!2{w$2d?@xs za~T{VmMh|PD`91{`*o$=W|l&j_0Yf!Z~M5NN9_vFMw@U`D9kXMMFgwZwL*73bkG}= z5^p5-$MJirD;mV(&Z$>1myW01R%g%UcGB~`&aG1ZY2#YTuORMWact(H()kA3!5XJ; zWImI}T{Dl}uY0b4pi8sO1WJ2aAurbx2C42aeLv<4L-p-w3$;+TO?LN7d;h(#>d}4M zqo*)qe&5+13p~=82y99&-qiZgnUd}k@8E>bU0va)AE|uIbgONd3L+#)Xh6V&Yj_17 z?kCee-@y`oS0!FHB$o-DwJa;gWe}AV&f2`T6@I}_Qku+*zCly4x9^W*cQ)EXXj3B` zxN2_$Qr*f?oiFESJU!Q(r-OdfX8sy^M6xg`e%evwUoh{E184UJ|G8~@ULWy_0E|&_|eKlAWG3W-*n%|4X!QbLsihmL> z;XAjXnqCHN{l4&5sLd!DuJDm%8f8fcqr-Q)9J|D{)y~v6!KNc(Wuz-`e$Z=KU54ka5b=e*`89msC|Rr7oK}e zZ72EERB!h%Xi{sjUe#ok95Y2+J7~Mg>v3moIM?-_9Z^LH`GKjO?OeuUA3e&i?6avo z=^Zp=*kMb9+i#`?;p~6AqD{b90{I@^lCJyU8=rh`E5`UGaTqspEX|9W~_tS+l z$4Y!tlxMFSqanZ>!eeif`WUwfsd-bvN?MzO#^2hlR;h4ruolBmjd9HG@TG9H1gy&T z)hn^iV&Y(>N3#{K_A$%T+vaWq&z3%6n&cTT^Gm7P*(!VtwY3eBDiiEASskPCK5{ni zoB#ErTc~0)W9_F-Ku_`X;WPf$lk~+#0XMj|8Fp6lcnIZEVQDU|}&7uia{F&J3XPUO1B~O`R-1Z{Z1MqOTHA-Y zlabuNq907_+a{sZt=bnbQ!E=Nxs#aH8amu|u#wQG<7|+yOTRrWe^p%X{`@HFyeZR83q$J<-@Pin`Euxn6 zNf~+~O7bs({kBBOH3wG+W5kEv*El~1HnyRVLmuH7 zl0=tbEUxc53B@ts*{ABoIXaHjYetVPM5b|qx^&xY%ey{DvK2mfo6p1F)jYdSY6zLs zPxX`F`^3T=5?dbgD(5S6&LmsBi@Fb*09U+4J$cjAuTbjetyDyas+GbA1y8FbEG>O9 z9tawXR(%96RE^6+XC_=;ReTs6z!E@TA1&@J;^M9@(;dM4G!W+?oVg*d`D*ua#(Av& z-YAvZnA&rApZ4YlJcY=j28FEgc$iT&9yT~U!YK9v&1P(KTzO~AHci#^b?ozE@`9#{ z>CpLSkC!{%x8!=Q5E!FDv6;&?H@7m}5}wXT?M>{*yO3E_nzhZwG```Jg~n4mcxGPa zyfRxZy8n~Vuo&BxX~>h_O`XPzkX@y6MBfPEFfC2i^p3fPGj+#f$?ga0uEp-)yO-c&hOy)& z^n(I1@k@RQr5%2b+h)plEZBTk`Q7~_d?nG^s{j3D{)8gse(mZfQ}BB%{(AK0n=c7O#9E5Bb`SNU zTzVqM(qHqt#Z6V%v}}><){vqz$xD()Ohi^-F+?yB1V>I@ zC$QauP3ja)CImVyG`T0`y6N&grg&24_83dZbd}^Dq|V6+#>*acC}kAYigUqq`x`qv1P>^o}fL zB4U-P1&@u!Ts*Ua`ly{>q_RY*MA`tMey>|x17)E3=OoGF?8%d`Qd((%o~6%fBUv^Or< zAbgG!(iE9jF3&wB=(8z>NjJZ84V9GUrV5kWofhvhp@d5E<7iL{_tici%Hb(IOyJ=3 zKEq!gG&23v$?~Kk_~?7s(3n0k=Jv5SEeRs!;-|2*dUp(SWsT}ZO?&I(@+Ruqy=&Bu zLOt+l6dHo4eWt}5$K#_!q20lo{gI5JuEUQ0w|)bkPu!+=HP(~DQ)k+8%Dg=GlAY&a zO~4h)wc1b0&78F#mKjKIoh)C5|72!VtEekAy;WGDEb%k`C1Y8rE{z26)#uRf{s??EmkSR2h2{r zS}IIF?ViUFWL%$H@=AVA;pLX<|Ei2dvZP2dJ}qmeR5YNzM*r%I!Fm)*+i|}0k1d}S z4bJ5+C}|-c+3*+C*QW8HSAo3(R7u3w0ZG=^QUl5%ACs;_u9KXIY%Ch5OkwCkMaC7N z>ITmAW}!|uKlEtHZ3EAb1rv{{#AKRMa3w&CZwQibnf-iv&Jh7Wxp4kN6)~*_ z2L&-w5iJ|XZMHE|u&$+Jw+TBO{%MA%)m_w>==z0m4(8)ni1+PyMh?X1^*psgG~DMU z5r16$teFW@3_dfHr@eE-LHA385C;9Gw0cLbkKQY%&#W?<;=7VNLwFSuTk65B(gTzypEGi`#r$*O-E6E&kG~Tw^YqZA zI4E)Ii3WzANS>gTcPHTIB!Gi+zN&|Zii)xMiVH_Xm*H?1z1Mb|Vfnqy>fZ4@jz4%K zWcSOceLvZ)?zg7dKr+Xa-&%d1ZTUaHb?%yLPu$vVAE}`n=M;^r)mEj@8XET{uFs6Ao*9cXi+y;Y+K zJxs?%FaDV%Q+9BI93#O-K{(y#Fdz4*q9@eJDWBBR$NB?9FqzTi5#BxL#bb6D)n-bX z1FyFq278KwV0N_Z&s?q5$ok{(9MEfMB%NN~8wt$FHp9lP4CHj*zUknq*y~>;N+r=Q zFeHRQ%cY{?!xtB>mxeo6@F#}pUkwdw5O#P5KCYy$cU>M*b8&38d6-NflEl;$Ni=x2 z_nU<5zB+oz*BWDKp~v>hZH-}Gn3_5A994qm9KT;&#qW=tdDX0yUHQ0YqAx#Hj@^b0 zDkL+vy=eRljR|8+k@TqetYj2f(6-%r-*0N;n6!2IzB2bVc=I>9j!0g$oPe+fb~O>9 zzvWTMf;HWjo_7-3D4RL`UG}vK7iA?rY@;?4UfDS(7j}e>;RPc1!&EmpbQkXbka=?3 zeik1kWMzxPNam&FE2(>WYt!`%4&mb^4SkaZBG0TLWDzi;RmjY6R|${}$4PFBA4jyk z9DVxJqiNAYUF4JP<=KypWdz3*>`hmWBUcYU@2{@n)#^%PF9+8-qQciRAdUhW9R;CT zr|bLCTohzn16ww)>ge{fT)d8@>7@JW)z>PBLzvuRW@>RQg6Z}#;xOtF+=ma@nx|t{ z>H=WIbCz=obKX`3A4kj_o-5DyC;mQlj>O*nIpXUaPy|_g`m4%1443dx=P&(VF+YkL zG@asq4`vEC3m@!btpHbsBt7+k28=a*7D_^=(y?mroVRkkcTt?NxcJ zTb&!j9;#1PFMkjdcj1wO`(!TYle2uboIE9$L8#J^nvz*5@hr9i*%e&GfTBc@PV}be zfK1k&!aMj!LoR8gkm8Bj)yA1@F3wKLJ@-zY{cH!ztL#1h-~J0c)&gchJ3mKx+uosa zeSpf^=ldk0V2NJ6|Je*XsPx{xjS2OogzG-oyJ@`I!`66Z#Pf zTI`KdIin=g)gekSTp`tPr0{QCt|O%egfDk>M!Lt$}GP>;9(U)t)H%K~fXbd~SAfGH2mVab3t$ zX3`HjGxpF1I!A-CpTO&n6*TiX%bE7RoI+kHioA4bqa2bN(w@>Dx-tC9t>_4HDLK(i zl<&wHd+L{@f+v;ALpo|!-SV?kv#^7HydMkPn9C5!$)dtNncptzCSRbXqW)vW?BQH3 z`Vji#LuZZH%!0Qscul_6d?>zWI`>#|Kb61$wQFhCx`=`goY$XSYjuyHTj5^w;S#<0 zgDqxt*UVH!;tKCyuk4qW{mCLx_*h=+IflL~#nnV%3}JLt9|!(trEWsW2^@QN?wZTy#Q zs=z%}FK5a~qA*$K6}D}wb@FD_hX*kinm-o~l@C9*^!^9=jutP7zR6(weh7ymn6akYIGC75w4&XdbYIMV*yu^N zVgUZ51Nt;B18$W#S-0m896tugM^>*-Y1wu#%z0goP^&sPm7f*4ISuA}EL9Bz6J9Hp z%NCWE`pXH5e`{AcAP6g{R{B zmA<-%9=mk+4LVd7CqsZ&kSLjxiBlYve?`xc(gB`R@X&3T^wwQl&}HpamK1$ZmSFkp zWl07$D0fpqzEML`#ZDD0wbqHiBXl1eHJEeVmp zFb}3``G2={thEUHa(xisu5y0AVFfEJ|8i5N1>aw|Esw~fijV1(4y`{m4`_*7xIX=& z>6*N@zPK_YyLfnRu_8rx&ud%NK7`C0F^9Q0YQm>9FcOz3GLf;#R9eiUk_Um~Dd(Zv ze}NP+t13UJ*L5Wl>!r<;c)nJ|p3hnU6ftQw6g8@Ny)qZB_WP0by?S?XTzg{iLRSCB zuny>l(oOBQ(wcKD7kQtKi8FNfV9lxKL>moUqxEqaYx?<%HeKamh=3LI#zIB{iM9Md z;E`>0%Z@``B<*;2;Ml`aHLVmmGuEB@H+t~u#n6UDVD_1SiUJ*ZZ=DD9>- z$pud7z7xyDb#(+Up0ZEnKLxqan{u}O*{14^493$Yk<0ItF7q7Buze@#)PUg9Dt%#9 zG@u#z{VLp|_;$6AOP5)XJs|k@^K)<6V?7uUq%Gw3FxqAo#!#~_X3Z6C_IA1vW-)?N zULv=sg-qnwXu5W82%8W3Xawm~y|7s&w4~mv$rs=)8QR2GjNQb2i}BaWjL~9PIVz~4 zvcH<;cX-)-yw578C@W^a79UC%gfca zoBF0Is7)1CWRW=WMCSe@=5`~u-0Ixqdj`+-{w(dZevK_eW6R^SX7_*TR0>Tpta|_*QzAo zqQR=IfBSy$+1 zTt=@fG3j-D@;(&IsMt{E%T`RX610-(g?l=;LF2>hPFI3Jp+|3qKPg;0NZyq96?u}; zI)y?c$_rvaG#AB;sbUP%M|KB4#v{u72H8j*QPP!NOSwX9Y|`T;_+KwQN6Wj9(h{%e zw7b#zdIPvx^41LSA+`{=*j?Pjl(Aauy`s~&C>MbxtgK%QG2!K~r{*l2X0?y830cy6 z#+jAE0^(R?Y&`NV!;=y_&86euX!foi?e8-xo1Cp_zm=Nya365aRLtrWr`PUqUx#$k zL~QCYVTnjHHa6wO*M-g#QD-7+LwQ=C{FL}Zu^pz#I26TFuS5_zEM|b zq||N}$}ePR&dq0ix9n5_>0IU52;J)qj~YCc2zXl=n%QUEZ~d6iX^hQZ?Guf+@*x>C zEnjX+X`5B2LA~yKZc$M?84JCrmBPjEdIg5)Pzq!3ppE+t`MN^3C=2uzJ%zkW$Il!E zwjcMoTL#VMjL|-~tjs$WzV=I2BY7d1KKFUdY=XIXBySY0O(T448GS*2!F7R{s%Q)? zHe)FUAN4{4yKlp^xLj8`2JcgOU;hsut6DRqR_Q30p%5+EF9dNc@3FU~qN*}=@fw)p z$LIyv90M}yLygL9@=c3Iyj-S7wD{e^g@kBLR-1_&YgL0>$X>C$=~aZ%q6dtWewlUF z>aq08T2wJbrKT!-?cT=!;K+fP^NDtT5~9deW1v4#wf$S};uC{JjjB=_A$yS!wq)(e z#P3T3W=(0Q9o!RPWYC@Gd^acH{u3?hTg#D}}NB zWM6^;@ZWmN`i6zUfsywqb9k5!q@yLPpMBCLry!pXyto)N)lg4NgIRo!vdWbWB#`=q zfm+@sVl9ng=kv8WrFp+u!u#O^V>U8t8GVHe7uE90mKv zrNSc!3lOyvH!`h>LaR8xZe3~$w{6dbRaxp&mA>604uAgT$r5OOE396m zQf5ohVKeGsJOPCvk*7xhC%gaIJGYt^G&X)~zrHPBWfGBh6uONn*#pm2FzLQDf%DC6 zIi0NS6l9tTdMd{&2gK?$C{jv}cFg7UabXn`T^P9PVtd}g0+u0dr={}YWW3W(C69Nn zQ{r+3+X!#-8R_}C%s)VXMl_)wf8wJzKamuWf9uN?fEKhmBN8B~iBX4XOHSAIRFT!d z{6@-gb)29XwVB8#XMkO&u*!62EN#Qk@N%L&kVjMiCUvf&k+-({CUsD~qx^Zj15Sf_ zk46d=1$lCxIeE7j)Hy3U=YwjV;Y;r5)Za$|kGIaPE%Mm9GGUmqjlC%}84ZIu0%cboiF0|T`t7LJg z=NgAStZrr<75@0me3oMw_g6-J`P}-enGth3Lk53r)zK?megyDUvl*w!6)B1&igwZ6Kepo2HLfANU&W26w+w9HzWopSb5lx;|P*JWqz1qTR zsN~&sNXG9V(w?=E+EnBg3zm}8neQgjoC%54B>HIDa%|tQRFHSV`=Cp|%e9NR%MUj( zt8!2W``e$6o8LDaQBj2jXdEDhXk2evLXNhdnH0{2`)BGT?{FE{EJ-wG zLp3Amsld;lvtp#blSx#ddG|HpVO8M+1>)%`M{!!o&+_B>h(CP2dW7nO2M^pXZ??&; zRC;3CW6>E}Dk0PF=ow{9=2yf!-mj(pId33idsxthxb<(K|sHpIHq&%~fOY<9fM1vL))O@VEVzTvr=8?;z<3GWm8pLbgIh7#lu z(EIdJ89A(H`#J=qN;ycsUGKEEZgwCj^r`L)T?uNBosn=zm#|D&#>e8fM@J9YcWkI2 zOgmO?<`&c`jOZ<>M4+*2YGy_FlK1WV3k4H(_syF)_zi?!F68USzIIexjVrcjD`jOfi7QQiJLRG^wP)zL z#a`F^(S)=NSTHgJuOE3 zVDE+$lRoZ;fD(^ZQe4xRilC7*UZZBF$0WUIcEbdavey#KxSdK)-P8d?HPGx|CILl% z&eKkwP`}02CfI$%x=JZga_)So{fxSiP2!;>wa#}{?+M0}>>AR>t<^*a)e_Q(v}hC! zm3A(wUw)~OpCwY(7})rhj$nLnbpp1?XzqM4_<K1*edg#O=L6SEUrJpExyMcDse2+?2Ek>aKN$A z^pFH1)7eo|x4^c5y1%#2rw41BZFf)oCfllg`t75qdlGZ{v7S`=a2FEIiUlZPs8LzW$+PAvJ16$ErVdxS>x-n1$>3%5Kk62+|=Y{&i9Q0k7OR1 zn!gAygTQwmcB_`1>jm}4gp*9=CMBhE=(SgJJHQu4xM%I_gU!s%Ro3ku4I&1e?mgty zjNuqi+~hMMwvIBq|5;=orQ81}qLND?G4W`3gZ*Vs@`DeQ!)e!)wJ6$dcvaqb2)PSK zinB9Db=CV@jb+bMAUn1cQ2GOmOp*krQ7J-#jXaNo-{-=xiukVS6=b5M{ z3KVb8tj{XQ{!UXRt<}gmR#TRFNz=q!YH3~ZHV?9zJkyd0*BRiG(t9VUv`zHHpm8i9 zHq5cUD~_vtTBzQ>qcSxjLN&3T_0d6QuT3~vPR&oeyf9MC+XPp$V-Z@MZWX~a%lM-|Du$6|Q}Di-79NlqJl>eGJtthyfs z6@y{}lFjw8sy=;q$S)b>`Os}rDAuv&!%oMKkD+`<>_qH^5B;ju3>UCe2G>k6W~tjk z@;-z=WOtX)S2A28#6;yCWkGd*B?fqqib)fN>?UdNw<;odev0_iJ+k7pagi*Ifnrx1 zPn<@)eX0F!!Dx@7<|ym-7aIi94@>*7f}?O_1&-Ud|F~Pcub31V8X{@cxY8Wnm=pQa zFY*Tyo8|1tXMK%I)wJ5;$G$&DEbAi!eG2wR8G-gMo!auz#Sk@Yk7l*t#5)*phi1b4^cv9H5YG4+U^A zmLSvXp@iU)V6RcEJm#vrA`R+-Pji%OK1E{USp~wHx=t*UVzYYzE>GZH!y_I!ar-W{Ixz zd+x`wV+F(5{e1NSlj{Wccg)67|FJOo}ss#qOd+aA*=Z(M&LeP8bW2 zJPabJRPEQPwmU~Hz}_x<6%vNd(59Q8Pg!l{;)%UG&CD=<*yiCyrd{KelollLbi})^ zB;R3R8v8Q*?dgmAH`EVw?aziD8G2Q^7p{U7*SgRFBfgD$=OYfI*yaP6&;>gPyIuD~+6}_)DOI(8$@I<^Og<{O_@t zMV~`JVBiDd0l}dN7>@=B#032O-=_b&;a&NwoUM(agMpDPQ2Tf%6euu!X=|isZ)RgH zs%LKmpm(DJ=o=fuzW_nO{}$|QYh(7>oxBRKfm@0e{`qr~cIr=nF;e3xYv-pntambAu2($bG?3Zt%Z- z?}{{$WWag2k#qsWfPznC89Xq+#((z(^FkopNEirM4sM{Z^Y3}UdH&H41m{H{$pwMn z2%u{8@4mozkpG7aUL^fMU?>y;EbU)%fpX}(`rp4XC^zh%@pyUv(HYE(fFs)q0Re%K zFfbSbh9SuXgCKASvRoKYii~U*2o!;Adk`1_1|#Rkqk^K|`;e{c`^xaYd)zp8@7XssjAg>XyY&`$OFE(3n1@VtfVGuA6@|ttQc#-`cpe8U-dHL7e01N_0T3;xX2Z0>> zP;Oozg#Ydf<>5teBhMGc1L8rN2MEUVpKAL5>Cb>%Ze$Jv+5u+$TLyrEk>eZ!hQkra zy1=>N|ICB;jw$~h@6HX7eGQNS`zL+@KDfJY;BTGbpnr1(9PlEfc04fnKQaJ@g(BOE z2cTl4*arde_D@cM19XMtlOQ;p`yU@ifDydN;~^m2P~^S<9Uyb;9Vdd2)(s4Tf|275 zz@W%$e#f!Ma|19QD3VVC7%wuH-1$B7`T`i>9e>*t!0zrm_-j4x@+z{ez}x`(PdhLV zGT#H90eCdhc(6O7M8=?CCgFGG&4+ywX;%}XSoQ%vlK%VCL$9}wk zt&n2>jwg|03ygsLlaB!G-~0jaDY9G$2ns^Z6#xcB=I6V3L-s$&-R1&mz5vFJ>>GC+ zi@Y8HhCt3`5C{T{oPY1Q7=mO20D~jj3cwJ^b^$mW3`ep(fWeS$3Se+#-o4{kI1;}A z5d%f`Qvl;Z&I>?}haqzl1PH}3Kl&%YRueEw;NK-L8~_W*8* z)DFOqZFP4(`k!;Nx79PVG_u9IJD@3=xdO*9fCab|Y;5dl?x^$bJSJ&vY(oRM;(vY@ zrO~9}hZ*Y|06_&P58*X1*4NWBf`j3}mde-|*cb4^A%a-{|0e%+-Hx3-aLD}6u?|p- O8#vc7Fo?;DWBo7AQ~{j; literal 0 HcmV?d00001 diff --git a/build/Options.cmake b/build/Options.cmake new file mode 100644 index 0000000..e54748b --- /dev/null +++ b/build/Options.cmake @@ -0,0 +1,58 @@ +# Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# @file Options.cmake +# @author Jihoon Chung (jihoon.chung@samsung.com) +# + +# Macro declaration +# - WRT_OPTION() : Wrapper omitting description argument from OPTION() command. +MACRO(WRT_OPTION feature_name on_off) + OPTION(${feature_name} "" ${on_off}) +ENDMACRO(WRT_OPTION) + +# Use Feature +# Use a particular optional platform service or third-party library +# +# Description : +# +# Author : () - +# WRT_OPTION(_USE_ ON/OFF) +WRT_OPTION(WRT_USE_WEBKIT_UPVERSION OFF) + +# Enable Feature +# Turn on a specific feature of WRT +# +# Description : +# +# Author : () - +# WRT_OPTION(_ENABLE_ ON/OFF) + +# Description : Enabling background decryption for encrypted resources +# Author : Tomasz Iwanek(t.iwanek@samsung.com) - 16.12.2013 +WRT_OPTION(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION OFF) + +# Description : Support pre-launching webapp mode +# Author : Tae-Jeong Lee (taejeong.lee@samsung.com) - 12.04.2013 +WRT_OPTION(WRT_ENABLE_PRE_LAUNCH OFF) + +# Description : Enabling one UI process model +# Combine all UI process into the wrt-launchpad-daemon to enhance memory usage of web app +# Author : Jihoon Chung (jihoon.chung@samsung.com) - 14.08.2014 +IF(PRODUCT_FEATURE_WRT_LITE) + WRT_OPTION(WRT_ENABLE_ONE_UI_PROCESS_MODEL OFF) +ELSE(PRODUCT_FEATURE_WRT_LITE) + WRT_OPTION(WRT_ENABLE_ONE_UI_PROCESS_MODEL OFF) +ENDIF(PRODUCT_FEATURE_WRT_LITE) diff --git a/data/DESCRIPTION b/data/DESCRIPTION new file mode 100644 index 0000000..daacea4 --- /dev/null +++ b/data/DESCRIPTION @@ -0,0 +1,8 @@ +!!!options!!! stop +Data files (edc, icons, certificates, UAP) +Various data files: + - edc layouts + - icons etc + - certificates + - User Agent Profile data (XML) + diff --git a/data/Wrt.edc b/data/Wrt.edc new file mode 100644 index 0000000..c3a735c --- /dev/null +++ b/data/Wrt.edc @@ -0,0 +1,380 @@ +collections { +#if defined(TIZEN_LITE) + base_scale: 1.8; +#else + base_scale: 2.4; +#endif + group { + name: "web-application"; + parts { + part { + name: "base"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { relative: 0 0; offset: 0 0; } + rel2 { relative: 1 1; offset: -1 -1; } + color: 255 255 255 255; + } + description { + state: "transparent" 0.0; + inherit: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "elm.swallow.content"; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { relative: 0.0 0.0; to: base; } + rel2 { relative: 1.0 1.0; to: base; } + align: 0.0 0.0; + } + } + part { + name: "elm.swallow.progress"; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 0; + fixed: 0 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 0.0; } + align: 0.5 0.0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + }//end of parts + programs { + program { name: "show,progress"; + signal: "show,progress,signal"; + action: STATE_SET "visible" 0.0; + target: "elm.swallow.progress"; + } + program { name: "hide,progress"; + signal: "hide,progress,signal"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.progress"; + } + program { name: "show,transparent"; + signal: "show,transparent,signal"; + action: STATE_SET "transparent" 0.0; + target: "base"; + } + program { name: "hide,transparent"; + signal: "hide,transparent,signal"; + action: STATE_SET "default" 0.0; + target: "base"; + } + }//end of programs + }//end of group + + group { + name: "popupWithCheck"; + parts { + part { + name: "pad_t"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 1.0 0.0;to_x: "pad_l"; } + rel2 { relative: 0.0 0.0;to_x: "pad_r"; } + } + } + part { + name: "pad_l"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 1.0; } + align: 0.0 0.0; + } + } + part { + name: "pad_r"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 1.0; } + align: 1.0 0.0; + } + } + part { + name:"elm.swallow.label"; + type: SWALLOW; + scale : 1; + description { + state: "default" 0.0; + fixed: 1 0; + rel1 { + relative: 1.0 1.0; + to_x: "pad_l"; + to_y: "pad_t"; + } + rel2 { + relative: 0.0 0.0; + to_x: "pad_r"; + to_y: "pad_b"; + } + } + } + part { + name: "bottom_pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 1.0 1.0; to_x: "pad_l"; } + rel2 { relative: 0.0 1.0; to_x: "pad_r"; } + } + } + part { + name: "pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 84; + fixed: 0 1; + rel1 { relative: 0.0 0.0; to: "bottom_pad"; } + rel2 { relative: 1.0 0.0; to: "bottom_pad"; } + } + } + part { + name: "end_field"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 63; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "pad_b"; } + rel2 { relative: 1.0 1.0; to: "pad_b"; } + } + } + part { + name: "elm.swallow.checkbox"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to: "end_field"; + rel2.to: "end_field"; + } + } + } //end of parts + } //end of group + + group { + name: "authChallengePopup"; + parts { + part { + name: "pad_t"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 1.0 0.0;to_x: "pad_l"; } + rel2 { relative: 0.0 0.0;to_x: "pad_r"; } + } + } + part { + name: "pad_l"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 1.0; } + align: 0.0 0.0; + } + } + part { + name: "pad_r"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 1.0; } + align: 1.0 0.0; + } + } + part { + name:"elm.swallow.label"; + type: SWALLOW; + scale : 1; + description { + state: "default" 0.0; + fixed: 1 0; + rel1 { + relative: 1.0 1.0; + to_x: "pad_l"; + to_y: "pad_t"; + } + rel2 { + relative: 0.0 0.0; + to_x: "pad_r"; + to_y: "pad_b"; + } + } + } + part { + name: "bottom_pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 1.0 1.0; to_x: "pad_l"; } + rel2 { relative: 0.0 1.0; to_x: "pad_r"; } + } + } + part { + name: "pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 200; + fixed: 0 1; + rel1 { relative: 0.0 0.1; to: "bottom_pad"; } + rel2 { relative: 1.0 0.1; to: "bottom_pad"; } + } + } + part { + name: "pad_m1"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 0.0 0.0; to: "pad_b"; } + rel2 { relative: 1.0 0.0; to: "pad_b"; } + } + } + part{ + name:"elm.swallow.idtext"; + type: TEXT; + scale : 1; + description { + state: "default" 0.0; + color: 168 168 168 255; + text { + font: "Tizen:style=Medium"; + size: 35; + align: 0.0 0.5; + } + align: 0.0 0.0; + min: 0 40; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "pad_m1"; } + rel2 { relative: 1.0 1.0; to: "pad_m1"; } + } + } + part { + name: "elm.swallow.idfield"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 63; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "elm.swallow.idtext"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.idtext"; } + } + } + part { + name: "pad_m2"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 32; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "elm.swallow.idfield"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.idfield"; } + } + } + part{ + name:"elm.swallow.pwtext"; + type: TEXT; + scale : 1; + description { + state: "default" 0.0; + color: 168 168 168 255; + text { + font: "Tizen:style=Medium"; + size: 35; + align: 0.0 0.5; + } + align: 0.0 0.0; + min: 0 40; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "pad_m2"; } + rel2 { relative: 1.0 1.0; to: "pad_m2"; } + } + } + part { + name: "elm.swallow.pwfield"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 0 63; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "elm.swallow.pwtext"; } + rel2 { relative: 1.0 1.0; to: "elm.swallow.pwtext"; } + } + } + } //end of parts + } +}//end of collection diff --git a/data/generic_popup.edc b/data/generic_popup.edc new file mode 100644 index 0000000..23d56e1 --- /dev/null +++ b/data/generic_popup.edc @@ -0,0 +1,181 @@ +#define MAIN_W 470 +#define MAIN_H 800 + +#define TITLE_START_Y 72 +#define TITLE_H 90 + +#define FULL_TRANS 0 0 0 0 +#define TXT_SIZE 14 +#define FONT_NAME "system_content" + +images { +} + +collections +group { + + name: "popup_layout1"; + parts { + part { + name: "pad_t"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + + description { + state: "default" 0.0; + align: 0.5 0.0; + min: 0 2; + fixed: 0 1; + rel1 { relative: 1.0 0.0; to_x: "pad_l"; } + rel2 { relative: 0.0 0.0; to_x: "pad_r"; } + } + } + part { + name: "pad_l"; + scale: 1; + + description { + state: "default" 0.0; + min : 10 0; + fixed: 1 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 1.0; } + align: 0.0 0.0; + } + } + part { + name: "pad_r"; + scale: 1; + + description { + state: "default" 0.0; + min : 10 0; + fixed: 1 0; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 1.0; } + align: 1.0 0.0; + } + } + part { + name:"0"; + type: SWALLOW; + scale : 1; + + description { + state: "default" 0.0; + min: 380 0; + align: 0.5 0.5; + fixed: 1 0; + rel1 { relative: 0.5 1.0; to: "pad_t"; } + rel2 { relative: 0.5 0.0; to: "pad_b"; } + } + } + part { + name: "pad_b"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + + description { + state: "default" 0.0; + align: 0.5 1.0; + min: 0 2; + fixed: 0 1; + rel1 { relative: 1.0 1.0;to_x: "pad_l"; } + rel2 { relative: 0.0 1.0;to_x: "pad_r"; } + } + } + } +} + +group { + name: "popup_layout2"; + parts { + part { + name: "pad_t"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + + description { + state: "default" 0.0; + align: 0.5 0.0; + min: 0 14; + fixed: 0 1; + rel1 { relative: 1.0 0.0; to_x: "pad_l"; } + rel2 { relative: 0.0 0.0; to_x: "pad_r"; } + } + } + part { + name: "pad_l"; + scale: 1; + + description { + state: "default" 0.0; + min : 10 0; + fixed: 1 0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 0.0 1.0; } + align: 0.0 0.0; + } + } + part { + name: "pad_r"; + scale: 1; + + description { + state: "default" 0.0; + min : 10 0; + fixed: 1 0; + rel1 { relative: 1.0 0.0; } + rel2 { relative: 1.0 1.0; } + align: 1.0 0.0; + } + } + part { + name:"0"; + type: SWALLOW; + scale : 1; + + description { + state: "default" 0.0; + min: 380 0; + align: 0.5 0.5; + fixed: 1 0; + rel1 { relative: 0.5 1.0; to: "pad_t"; } + rel2 { relative: 0.5 0.0; to: "pad_b"; } + } + } + part { + name: "pad_b"; + scale : 1; + mouse_events: 0; + repeat_events: 1; + + description { + state: "default" 0.0; + align: 0.5 1.0; + min: 0 66; + fixed: 0 1; + rel1 { relative: 1.0 1.0; to_x: "pad_l"; } + rel2 { relative: 0.0 1.0; to_x: "pad_r"; } + } + } + part { + name: "1"; + type: SWALLOW; + scale : 1; + mouse_events: 1; + repeat_events: 1; + + description { + state: "default" 0.0; + align: 0.5 0.5; + fixed: 1 1; + rel1 { relative: 0.0 0.0; to: "pad_b"; } + rel2 { relative: 1.0 1.0; to: "pad_b"; } + } + } + } // parts +} // group diff --git a/data/generic_popup_horizontal.edc b/data/generic_popup_horizontal.edc new file mode 100644 index 0000000..801eef0 --- /dev/null +++ b/data/generic_popup_horizontal.edc @@ -0,0 +1,52 @@ +#define MAIN_W 470 +#define MAIN_H 800 + +#define TITLE_START_Y 72 +#define TITLE_H 90 + +#define FULL_TRANS 0 0 0 0 +#define TXT_SIZE 14 +#define FONT_NAME "system_content" + +images { +} + +collections + group { + name: "popup_h"; + + #define BUTTON_WIDTH 200.0 + #define BUTTON_HEIGHT 78.0 + #define BUTTON_GAP 50.0 + #define PART_MAX 5000 + parts{ + part { + name: "0"; + type: SWALLOW; + scale: 1; + + description { + state: "default" 0.0; + + fixed: 1 1; + rel1 { relative: 0.1 0.0; } + rel2 { relative: 0.5 0.9; } + } + } + + part { + name: "1"; + type: SWALLOW; + scale: 1; + + description { + + fixed: 1 1; + rel1 { relative: 0.5 0.0; } + rel2 { relative: 0.9 0.9; } + } + } + } + } + +} diff --git a/dir-struct.py b/dir-struct.py new file mode 100755 index 0000000..910f153 --- /dev/null +++ b/dir-struct.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os +import re + + +def countLines(path): + with open(path) as f: + return len(f.readlines()) + +# RETURNS: ( +# short description (string or None) +# long decsription (array of strings or None) +# options: stop +def parseDescr(lines): + if len(lines) == 0: + return (None, None, False) + linesRest = None + if re.match( r"!!!options!!!", lines[0] ): + optStop = True + linesRest = lines[1:] + else: + optStop = False + linesRest = lines + if len(linesRest) == 0: + return(None,None,optStop) + short = linesRest[0].rstrip() + long = [] + for l in linesRest[1:]: + ll = l.rstrip() + if re.search( r"\S", ll ): + long.append( ll ) + if len(long) == 0: + long = None + + return (short, long, optStop) + +# RETURNS a tree with nodes like: ( +# path (string) +# short description (string or None) +# long decsription (array of strings or None) +# LOC (integer) +# list of subdirs (child nodes like this one) +def parseDir(path): + short = None + long = None + optStop = False + try: + with open( path+'/DESCRIPTION' ) as f: + short, long, optStop = parseDescr( f.readlines() ) + except IOError: + pass + dirs = [] + cntLines = 0 + for fname in os.listdir(path): + if fname != '.git' and os.path.isdir(path+'/'+fname): + subdir = parseDir(path+'/'+fname) + if optStop == False: + dirs.append(subdir) + (dummy0, dummy1, dummy2, subLines, dummy4) = subdir + cntLines += subLines + + if os.path.isfile(path+'/'+fname) \ + and not os.path.islink(path+'/'+fname): + cntLines += countLines(path+'/'+fname) + + return path, short, long, cntLines, dirs + + +### ##### PRINT AS TEXT +### +### def printTextSub(path,indent,withLongDesc): +### short, long, dirs, loc = parseDir(path) +### if short == None: +### p = re.sub(r"^\./", '', path) +### print '%s%s -- ' % (indent, p) +### else: +### p = re.sub(r"^\./", '', path) +### print '%s%s -- %s' % (indent, p, short) +### if withLongDesc: +### if long != None: +### print '' +### for line in long: +### print '%s%s' % (indent+' ',line) +### print '' +### for dir in dirs: +### printTextSub(path+'/'+dir, indent+' ', withLongDesc) +### +### def printText(path,withLongDesc): +### printTextSub(path,'',withLongDesc) +### +### def printTextWoMain(path,withLongDesc): +### short, long, dirs, loc = parseDir(path) +### for dir in dirs: +### printTextSub(path+'/'+dir, '', withLongDesc) +### + +##### PRINT AS a sort of CSV delimited by '|' + +# indent is a number (0..) +def printTabSub(tree,indent): + path, short, long, loc, subdirs = tree + p = re.sub(r"^\./", '', path) + m = re.search(r"/([^/]*$)", p) + if m != None: p = m.groups()[0] + if short == None: + print '%s%s|%d|' % (" "*indent, p, loc) + else: + print '%s%s|%d|%s' % (" "*indent, p, loc, short) + for dir in subdirs: + printTabSub(dir, indent+1) + +def printTab(tree): + printTabSub(tree,0) + +def printTabWoMain(tree): + path, short, long, loc, dirs = tree + for dir in dirs: + printTabSub(dir, 0) + + +##### MAIN + +tree = parseDir('.') +printTabWoMain(tree) + diff --git a/doxyfile b/doxyfile new file mode 100644 index 0000000..f7d6c5d --- /dev/null +++ b/doxyfile @@ -0,0 +1,1600 @@ +# Doxyfile 1.6.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = WRT-Engine + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./Documentation + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = YES + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set +# FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./src/ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = NO + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/packaging/wrt.spec b/packaging/wrt.spec new file mode 100755 index 0000000..ee87d2b --- /dev/null +++ b/packaging/wrt.spec @@ -0,0 +1,185 @@ +#git:framework/web/wrt +Name: wrt +Summary: web runtime +Version: 0.8.377 +Release: 1 +Group: Development/Libraries +License: Apache-2.0 and Flora-1.1 +URL: N/A +Source0: %{name}-%{version}.tar.gz + +BuildRequires: boost +BuildRequires: cmake +BuildRequires: edje-tools +BuildRequires: gettext +BuildRequires: libcap-devel +BuildRequires: libss-client-devel +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(ail) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(ewebkit2) +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(dpl-efl) +BuildRequires: pkgconfig(libpcrecpp) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(eina) +BuildRequires: pkgconfig(ui-gadget-1) +BuildRequires: pkgconfig(utilX) +BuildRequires: pkgconfig(secure-storage) +BuildRequires: pkgconfig(pkgmgr) +BuildRequires: pkgconfig(libiri) +BuildRequires: pkgconfig(appsvc) +BuildRequires: pkgconfig(cert-svc) +BuildRequires: pkgconfig(cert-svc-vcore) +BuildRequires: pkgconfig(libsoup-2.4) +BuildRequires: pkgconfig(security-core) +BuildRequires: pkgconfig(security-client) +BuildRequires: pkgconfig(notification) +BuildRequires: pkgconfig(libprivilege-control) +BuildRequires: pkgconfig(capi-appfw-app-manager) +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(wrt-plugin-loading) +BuildRequires: pkgconfig(wrt-plugin-js-overlay) +BuildRequires: pkgconfig(wrt-plugins-ipc-message) +BuildRequires: pkgconfig(wrt-popup-wrt-runner) +BuildRequires: pkgconfig(wrt-popup-ace-runner) +BuildRequires: pkgconfig(deviced) +BuildRequires: pkgconfig(capi-system-system-settings) +BuildRequires: pkgconfig(libsmack) +BuildRequires: pkgconfig(efl-assist) +BuildRequires: pkgconfig(pkgmgr-info) +BuildRequires: pkgconfig(libcurl) +BuildRequires: pkgconfig(rua) +BuildRequires: pkgconfig(privacy-manager-client) +Requires: boost-filesystem +Requires: boost-system +Requires: libss-client + +## wrt-launchpad-daemon ####################################################### +BuildRequires: pkgconfig(app-checker) +BuildRequires: pkgconfig(bundle) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(dbus-glib-1) +BuildRequires: pkgconfig(libsmack) +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(libsystemd-daemon) +BuildRequires: pkgconfig(xcomposite) +%{?systemd_requires} + +#Use these macro to avoid hard-coded path +#After upgrading systemd to v204 or higher macro can be deleted +%define _unitdir /usr/lib/systemd/system +############################################################################### + +%description +web runtime + +%package devel +Summary: Wrt header files for external modules +Group: Development/Libraries +Requires: %{name} = %{version} +Requires: pkgconfig(ewebkit2) + +%description devel +wrt library development headers + +%prep +%setup -q + +%define with_tests 0 +%if "%{WITH_TESTS}" == "ON" || "%{WITH_TESTS}" == "Y" || "%{WITH_TESTS}" == "YES" || "%{WITH_TESTS}" == "TRUE" || "%{WITH_TESTS}" == "1" + %define with_tests 1 +%endif + +%build +%if 0%{?sec_build_binary_debug_enable} +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +%endif + +export LDFLAGS+="-Wl,--rpath=/usr/lib" + +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DDPL_LOG="ON" \ + -DPROJECT_VERSION=%{version} \ + -DCMAKE_BUILD_TYPE=%{?build_type:%build_type} \ + -DPRODUCT_FEATURE_WRT_LITE="ON" \ + %{?WITH_TESTS:-DWITH_TESTS=%WITH_TESTS} +make %{?jobs:-j%jobs} + +%install +mkdir -p %{buildroot}/usr/share/license +cp LICENSE.APLv2 %{buildroot}/usr/share/license/%{name} +cat LICENSE.Flora >> %{buildroot}/usr/share/license/%{name} +%make_install + +mkdir -p %{buildroot}%{_unitdir}/tizen-runtime.target.wants +mkdir -p %{buildroot}%{_unitdir}/sockets.target.wants +ln -s %{_unitdir}/wrt_launchpad_daemon@.service %{buildroot}%{_unitdir}/tizen-runtime.target.wants/wrt_launchpad_daemon@app.service +ln -s %{_unitdir}/wrt_launchpad_daemon_1.socket %{buildroot}%{_unitdir}/sockets.target.wants/wrt_launchpad_daemon_1.socket +ln -s %{_unitdir}/wrt_launchpad_daemon_2.socket %{buildroot}%{_unitdir}/sockets.target.wants/wrt_launchpad_daemon_2.socket + +%pre +if [ $1 -eq 2 ] ; then + systemctl stop wrt_launchpad_daemon@app.service wrt_launchpad_daemon_1.socket wrt_launchpad_daemon_2.socket +fi + +%preun +if [ $1 -eq 0 ] ; then + systemctl stop wrt_launchpad_daemon@app.service wrt_launchpad_daemon_1.socket wrt_launchpad_daemon_2.socket +fi + +%clean +rm -rf %{buildroot} + +%post +chmod +s /usr/bin/wrt-launcher + +/sbin/ldconfig +systemctl daemon-reload +if [ $1 -eq 2 ] ; then + systemctl start wrt_launchpad_daemon@app.service +fi + +%postun -p /sbin/ldconfig +systemctl daemon-reload + +%files +%manifest wrt.manifest +%{_libdir}/*.so +%{_libdir}/*.so.* +%attr(755,root,root) %{_bindir}/wrt-client +%attr(755,root,root) %{_bindir}/wrt-launcher +%attr(755,root,root) %{_bindir}/wrt_reset_all.sh +%attr(755,root,root) %{_bindir}/wrt_reset_db.sh +%{_datadir}/* +%{_datadir}/license/%{name} +%attr(644,root,root) %{_datadir}/edje/wrt/* +%attr(644,root,root) %{_datadir}/edje/ace/* +%if %{with_tests} + %attr(755,root,root) %{_bindir}/wrt-tests-general + /opt/share/widget/tests/general/* +%endif +%attr(755,root,root) %{_sysconfdir}/profile.d/wrt_env.sh + +## wrt-launchpad-daemon ####################################################### +%attr(755,root,root) %{_bindir}/wrt_launchpad_daemon +/usr/share/aul/preload_list_wrt.txt +/etc/smack/accesses.d/wrt_launchpad_daemon.rule +#systemd +%{_unitdir}/tizen-runtime.target.wants/wrt_launchpad_daemon@app.service +%{_unitdir}/wrt_launchpad_daemon@.service +%{_unitdir}/sockets.target.wants/wrt_launchpad_daemon_1.socket +%{_unitdir}/wrt_launchpad_daemon_1.socket +%{_unitdir}/sockets.target.wants/wrt_launchpad_daemon_2.socket +%{_unitdir}/wrt_launchpad_daemon_2.socket +############################################################################### + +%files devel +%{_includedir}/* +%{_libdir}/pkgconfig/* + diff --git a/pkgconfig/wrt-core.pc.in b/pkgconfig/wrt-core.pc.in new file mode 100644 index 0000000..8436f7e --- /dev/null +++ b/pkgconfig/wrt-core.pc.in @@ -0,0 +1,12 @@ +prefix=/usr +project_name=@CMAKE_PROJECT_NAME@ +exec_prefix=${prefix} +libdir=${prefix}/lib/ +includedir=${prefix}/include/${project_name} + +Name: WebRuntime wrt core module +Description: WebRuntime core module +Version: @CMAKE_PROJECT_VERSION@ +Requires: +Libs: -L${libdir} -lwrt-core-module +Cflags: -I${includedir} diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100755 index 0000000..09c3dca --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,43 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +SET(POFILES +ar.po ca.po de_DE.po en.po es_MX.po fi.po ga.po hr.po is.po ka.po lt.po nb.po pt_BR.po ru_RU.po sr.po uk.po zh_HK.po +az.po cs.po el_GR.po en_US.po et.po fr_CA.po gl.po hu.po it_IT.po kk.po lv.po nl_NL.po pt_PT.po sk.po sv.po uz.po zh_SG.po +bg.po da.po en_PH.po es_ES.po eu.po fr_FR.po hi.po hy.po ja_JP.po ko_KR.po mk.po pl.po ro.po sl.po tr_TR.po zh_CN.po zh_TW.po +bn.po gu.po mn_MN.po kn.po ml.po mr.po or.po pa.po si.po ta.po te.po ur.po id.po es_US.po km.po lo.po ms.po +my.po th.po tl.po vi.po ne.po +) + +SET(MSGFMT "/usr/bin/msgfmt") +SET(LOCALE_DIR "/usr/share/locale/") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALE_DIR}/${lang}/LC_MESSAGES + RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/po/ar.po b/po/ar.po new file mode 100755 index 0000000..743e4d8 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "مسح" + +msgid "IDS_BR_SK_CANCEL" +msgstr "إلغاء" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "السماح" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "خالي" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "جاري بدء التنزيل..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "إعدادات موقع الويب" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "إعادة الضبط إلى الافتراضي" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "اسم المستخدم" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "مطلوب التوثيق" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "تذكر الأفضلية" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "تحديث تلقائي" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "كلمة المرور" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "توجد مشاكل في شهادة الأمان الخاصة بهذا الموقع" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "إخطار الويب" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "توجد محاولة من %1$s (%2$s) لتخزين كمية كبيرة من البيانات على جهازك للاستخدام عند عدم الاتصال بالإنترنت" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "يوجد طلب من ‎%1$s (%2$s)‎ للحصول على إذن من أجل تخزين بيانات على جهازك للاستخدام عند عدم الاتصال بالإنترنت" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "يوجد طلب من %1$s (%2$s) للحصول على إذن من أجل الوصول إلى موقعك" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "يوجد طلب من %1$s (%2$s) للحصول على إذن من أجل عرض الإخطارات" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "يوجد طلب من %1$s (%2$s) للحصول على إذن من أجل استخدام الكاميرا" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "الشاشة كاملة" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "الوصول لموقع المستخدم" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "إستخدام/حفظ بيانات الويب" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "إستخدام وسائط المستخدم" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "السماح لهذا الموقع بالوصول إلى معلومات موقعك" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "السماح لهذا الموقع بحفظ مجموعة كبيرة من البيانات على جهازك" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "السماح لهذا الموقع بتغيير العرض إلى ملء الشاشة" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "السماح لهذا الموقع باستخدام ملفات الوسائط المخزنة على الجهاز" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "السماح لهذا الموقع بعرض الإخطارات" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "إلغاء تحديد إعدادات التطبيق الافتراضية من خلال الانتقال إلى الضبط > عام > إدارة التطبيقات > الكل" + +msgid "IDS_COM_BODY_DENY" +msgstr "رفض" + diff --git a/po/az.po b/po/az.po new file mode 100755 index 0000000..4e6454b --- /dev/null +++ b/po/az.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Sil" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Ləğv et" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "İcazə ver" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Boşdur" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Yükləmə başladılır..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Vebsayt parametrləri" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "İlkin parametrə təyin et" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "İstifadəçinin adı" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Kimliyin müəyyən edilməsi tələb olunur." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Secimi yadda saxla." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Avtomatik yeniləmə" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Şifrə" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Bu saytın təhlükəsizlik sertifikatı ilə bağlı problemlər var." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Veb bildiriş" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) sizin cihazınızda oflayn istifadə üçün böyük həcmdə məlumat saxlamağa cəhd edir." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) cihazınızda oflayn istifadə üçün məlumat saxlamağa icazə istəyir." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) yerinizə daxil olmaq üçün icazə istəyir." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) bildirişləri göstərmək üçün icazə istəyir." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) kameranızdan istifadə etmək üçün icazə istəyir." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Bötüv ekran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "İstifadəçi yerinə çıxış" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "İnternet məlumatından istifadə et/yadda saxla" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "İstifadəçi mediadan istifadə et" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Bu sayta sizin məkan məlumatınıza çıxış imkanı verin." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Bu sayta çox sayda məlumatı cihazınızda saxlamaq imkanı verin." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Bu sayta displeyi tam ekrana dəyişmək imkanı verin." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Bu sayta cihazınızda saxlanan media fayllarından istifadə etmək imkanı verin." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Bu sayta bildirişləri təsvir etmək imkanı verin." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Parametrlər > Ümumi > Proqramları İdarə et > Hamısı seçməklə defolt proqram parametrlərini silin." + +msgid "IDS_COM_BODY_DENY" +msgstr "İmtina et" + diff --git a/po/bg.po b/po/bg.po new file mode 100755 index 0000000..8db9b6c --- /dev/null +++ b/po/bg.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Изтрий" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Отмени" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Разрешаване" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Празно" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Начало на изтеглянето..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Настройки на уеб сайт" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Нулиране до стойности по подразбиране" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Потребителско име" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Изисква се удостоверяване." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Запомни предпочитанията" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Автоматично опресняване" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Парола" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Има проблеми със сертификата за защита за този сайт." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Уеб уведомяване" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) се опитва да съхранява голямо количество данни на вашето устройство за използване офлайн." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) иска разрешение за съхраняване на данни на вашето устройство за използване офлайн." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) иска разрешение за достъп до вашето местоположение." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) иска разрешение за показване на известия." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) иска разрешение за използване на вашата камера." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Цял екран" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Достъп до местоположението на потребителя" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Използване/съхраняване на уеб данни" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Използване на мултимедия на потребителя" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Позволява на този сайт достъп до информацията за вашето местоположение." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Позволява на този сайт да записва голямо количество данни на вашето устройство." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Позволява на този сайт да променя екрана на цял екран." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Позволява на този сайт да използва мултимедийните файлове, съхранени във вашето устройство." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Позволява на този сайт да показва известия." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Изчистете настройките за приложение по подразбиране, като отидете в Настройки > Общи > Управление на приложения > Всички." + +msgid "IDS_COM_BODY_DENY" +msgstr "Отхвърли" + diff --git a/po/bn.po b/po/bn.po new file mode 100755 index 0000000..fc86542 --- /dev/null +++ b/po/bn.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "মুছুন" + +msgid "IDS_BR_SK_CANCEL" +msgstr "বাতিল" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "অনুমতি" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "খালি" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ডাউনলোড আরম্ভ হচ্ছে..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ওয়েবসাইট সেটিংস" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ডিফল্টে রিসেট করুন" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ব্যবহারকারীর নাম" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "প্রামাণিকরণ দরকার।" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "অগ্রাধিকার মনে রাখা।" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "স্বতঃ রিফ্রেশ" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "পাসওয়ার্ড" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "এই সাইটের সুরক্ষা শংসাপত্র-এ কিছু সমস্যা আছে।" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ওয়েব বিজ্ঞপ্তি" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) অফলাইনে ব্যবহারের জন্য আপনার ডিভাইসে বড় পরিমাণ তথ্য সঞ্চয় করার প্রয়াস করছে।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) অফলাইন ব্যবহারের জন্য আপনার ডিভাইসে তথ্য সঞ্চয় করার অনুমতি অনুরোধ করছে।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) আপনার অবস্থান অ্যাক্সেসের জন্য অনুমতি অনুরোধ করছে।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) বিজ্ঞপ্তি দেখানোর জন্য অনুমতি অনুরোধ করছে।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) আপনার ক্যামেরা ব্যবহারের জন্য অনুমতি অনুরোধ করছে।" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "পূর্ণ স্ক্রিন" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ব্যবহারকারীর অবস্থান অ্যাক্সেস করুন" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ওয়েব তথ্য ব্যবহার করুন/স্টোর করুন" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ব্যবহারকারীর মিডিয়া ব্যবহার করুন" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "এই সাইটটিকে আপনার অবস্থানের তথ্য অ্যাক্সেসের অনুমতি দিন।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "এই সাইটটিকে আপনার ডিভাইসে প্রচুর পরিমাণে তথ্য সংরক্ষণের অনুমতি দিন।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "এই সাইটটিকে প্রদর্শনটি পূর্ণ স্ক্রিনে পরিবর্তন করার অনুমতি দিন।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "এই সাইটটিকে আপনার ডিভাইসে সঞ্চিত মিডিয়া ফাইলগুলি ব্যবহারের অনুমতি দিন।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "এই সাইটটিকে বিজ্ঞপ্তিগুলি প্রদর্শনের অনুমতি দিন।" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "এখানে গিয়ে ডিফল্ট অ্যাপ সেটিংস পরিষ্কার করুন সেটিংস > সাধারণ > অ্যাপ্লিকেশনগুলি পরিচালনা করুন > সমস্ত।" + +msgid "IDS_COM_BODY_DENY" +msgstr "অস্বীকার" + diff --git a/po/ca.po b/po/ca.po new file mode 100755 index 0000000..13b650f --- /dev/null +++ b/po/ca.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Esborrar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancel·lar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permetre" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Buit" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "S'està iniciant la descàrrega..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Ajustaments de lloc web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restablir a predeterminat" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nom d'usuari" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Es requereix autenticació" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Recordar preferència" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualitzar automàticament" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Contrasenya" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Hi ha problemes amb el certificat de seguretat d'aquest lloc" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificació web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) està intentant emmagatzemar una gran quantitat de dades al seu dispositiu per a ús fora de línia" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) està demanant permís per emmagatzemar dades al seu dispositiu per a ús fora de línia" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) està demanant permís per accedir a la seva ubicació" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) està demanant permís per mostrar notificacions" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) està demanant permís per utilitzar la seva càmera" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pantalla completa" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Accedir a la ubicació de l'usuari" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Utilitzar/emmagatzemar dades web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Utilitzar multimèdia d'usuari" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permet a aquest lloc accedir a la informació de la seva ubicació" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permet a aquest lloc desar una gran quantitat de dades al seu dispositiu" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permet a aquest lloc canviar la visualització a pantalla completa" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permet a aquest lloc utilitzar els fitxers multimèdia emmagatzemats al seu dispositiu" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permet a aquest lloc mostrar notificacions" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Esborri els ajustaments d'aplicacions predeterminades anant a Ajustaments > General > Administrar aplicacions > Totes" + +msgid "IDS_COM_BODY_DENY" +msgstr "Denegar" + diff --git a/po/cs.po b/po/cs.po new file mode 100755 index 0000000..d6b3ff2 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Odstranit" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Zrušit" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Povolit" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Prázdný" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Spouští se stahování..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Nastavení webového serveru" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Obnovit výchozí nastavení" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Uživatelské jméno" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Je vyžadováno ověření." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Zapamatovat preference." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatická aktualizace" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Heslo" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Došlo k potížím s certifikátem zabezpečení pro tento server." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Webové oznamování" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) se pokouší uložit do zařízení velké množství dat pro použití offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) žádá o povolení uložit do zařízení data pro použití offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) žádá o povolení přístupu k informacím o vaší poloze." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) žádá o povolení zobrazit oznámení." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) žádá o povolení použít fotoaparát." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Celá obrazovka" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Přístup k poloze uživatele" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Použít/uložit webová data" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Použít uživatelská média" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Umožní stránce přístup k informacím o vaší poloze." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Umožní stránce uložit do zařízení velké množství dat." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Umožní stránce změnit zobrazení na celou obrazovku." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Umožní stránce použít multimediální soubory uložené v zařízení." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Umožní stránce zobrazovat upozornění." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Vymažte výchozí nastavení aplikací pomocí Nastavení > Obecné > Správa aplikací > Vše." + +msgid "IDS_COM_BODY_DENY" +msgstr "Odmítnout" + diff --git a/po/da.po b/po/da.po new file mode 100755 index 0000000..a900044 --- /dev/null +++ b/po/da.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Slet" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Annullér" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Tillad" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tom" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Starter download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Webside indstillinger" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Nulstil til standard" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Brugernavn" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Godkendelse påkrævet." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Husk præference." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatisk opdatering" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Adgangskode" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Der er problemer med sikkerhedscertifikatet for dette websted." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Internetmeddelelse" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) forsøger at gemme en stor mængde data på din enhed til offline-brug." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) anmoder om tilladelse til at gemme en stor mængde data på din enhed til offline-brug." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) anmoder om tilladelse til at få adgang til din placering." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) anmoder om tilladelse til at få vist notifikationer." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) anmoder om tilladelse til at bruge dit kamera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Fuld skærm" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Tilgå din placering" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Brug/gem webdata" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Benyt brugermedier" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Tillader, at denne side får adgang til dine placeringsoplysninger." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Tillader, at denne side gemmer et stort antal data på din enhed." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Tillader, at denne side ændrer visning til fuld skærm." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Tillader, at denne side bruger de mediefiler, der er gemt på din enhed." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Tillader, at denne side viser informationer." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Ryd standardindstillinger for program ved at gå til Indstillinger > Generelt > Administrér programmer > Alle." + +msgid "IDS_COM_BODY_DENY" +msgstr "Afvis" + diff --git a/po/de_DE.po b/po/de_DE.po new file mode 100755 index 0000000..5a5545b --- /dev/null +++ b/po/de_DE.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Löschen" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Abbrechen" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Zulassen" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Leer" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Download wird gestartet..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Website-Einstellungen" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Auf Standard zurücksetzen" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Benutzername" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentifizierung erforderlich" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Voreinstellung merken" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Autom. Aktualisierung" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Passwort" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Probleme mit dem Sicherheitszertifikat für diese Site" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web-Benachrichtigung" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) versucht, eine große Datenmenge für die Offline-Verwendung auf Ihrem Gerät zu speichern." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) möchte die Berechtigung erhalten, Daten für die Offline-Verwendung auf Ihrem Gerät zu speichern." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) möchte die Berechtigung erhalten, um auf Ihren Standort zuzugreifen." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) möchte die Berechtigung erhalten, Benachrichtigungen anzuzeigen." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) möchte die Berechtigung erhalten, Ihre Kamera zu benutzen." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Vollbild" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Auf Benutzerstandortdaten zugreifen" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Internetdaten verwenden/speichern" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Private Medien verwenden" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Erlaubt der Website den Zugriff auf Ihre Standortinformationen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Erlaubt dieser Website, große Datenmengen auf Ihrem Gerät zu speichern." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Erlaubt dieser Website, die Anzeige auf Vollbild zu ändern." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Erlaubt dieser Website, die auf Ihrem Gerät gespeicherten Mediendateien zu verwenden." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Erlaubt dieser Website das Anzeigen von Benachrichtigungen." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Löschen Sie App-Standardeinstellungen unter „Einstellungen > Allgemein > Anwendungsmanager > Alle“." + +msgid "IDS_COM_BODY_DENY" +msgstr "Ablehnen" + diff --git a/po/el_GR.po b/po/el_GR.po new file mode 100755 index 0000000..42d738f --- /dev/null +++ b/po/el_GR.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Διαγραφή" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Άκυρο" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Να επιτρέπεται" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Κενό" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Ξεκινά η λήψη..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Ρυθμίσεις τοποθεσίας Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Επαναφορά της προεπιλογής" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Όνομα χρήστη" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Απαιτείται έλεγχος ταυτότητας." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Απομνημόνευση προτίμησης." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Αυτόματη ανανέωση" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Κωδικός πρόσβασης" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Υπάρχουν προβλήματα με το πιστοποιητικό ασφαλείας αυτής της τοποθεσίας." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Ειδοποίηση Web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "Η ιστοσελίδα %1$s (%2$s) επιχειρεί να αποθηκεύσει ένα μεγάλο όγκο δεδομένων στη συσκευή σας για χρήση εκτός σύνδεσης." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "Η ιστοσελίδα %1$s (%2$s) ζητά δικαίωμα για την αποθήκευση δεδομένων στη συσκευή σας για χρήση εκτός σύνδεσης." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "Η ιστοσελίδα %1$s (%2$s) ζητά δικαίωμα πρόσβασης στα δεδομένα θέσης σας." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "Η ιστοσελίδα %1$s (%2$s) ζητά δικαίωμα για την εμφάνιση ειδοποιήσεων." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "Η ιστοσελίδα %1$s (%2$s) ζητά δικαίωμα για τη χρήση της κάμεράς σας." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Πλήρης οθόνη" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Πρόσβαση στη θέση του χρήστη" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Χρήση/αποθήκευση δεδομένων web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Χρήση πολυμέσων χρήστη" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Επιτρέπει σε αυτήν την τοποθεσία την πρόσβαση στις πληροφορίες τοποθεσίας σας." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Επιτρέπει σε αυτήν την τοποθεσία να αποθηκεύει μεγάλο όγκο δεδομένων στη συσκευή σας." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Επιτρέπει σε αυτήν την τοποθεσία να αλλάζει την προβολή σε πλήρη οθόνη." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Επιτρέπει σε αυτήν την τοποθεσία να χρησιμοποιεί τα αρχεία πολυμέσων που είναι αποθηκευμένα στη συσκευή σας." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Επιτρέπει σε αυτήν την τοποθεσία να εμφανίζει ειδοποιήσεις." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Εκκαθαρίστε τις ρυθμίσεις προεπιλεγμένης εφαρμογής μεταβαίνοντας στις Ρυθμίσεις > Γενικά > Διαχείριση εφαρμογών > Όλα." + +msgid "IDS_COM_BODY_DENY" +msgstr "Απόρριψη" + diff --git a/po/en.po b/po/en.po new file mode 100755 index 0000000..c494671 --- /dev/null +++ b/po/en.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Delete" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancel" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Allow" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Empty" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Starting download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Website settings" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Reset to default" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Username" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentication required." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Remember preference." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Auto refresh" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Password" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "There are problems with the security certificate for this site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web notification" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) is attempting to store a large amount of data on your device for offline use." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) is requesting permission to store data on your device for offline use." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) is requesting permission to access your location." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) is requesting permission to show notifications." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) is requesting permission to use your camera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Full screen" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Access user location" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Use/store web data" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Use user media" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Allows this site to access your location information." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Allows this site to save a large amount of data on your device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Allows this site to change the display to full screen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Allows this site to use the media files stored on your device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Allows this site to display notifications." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Clear default app settings by going to Settings > General > Manage applications > All." + +msgid "IDS_COM_BODY_DENY" +msgstr "Deny" + diff --git a/po/en_PH.po b/po/en_PH.po new file mode 100755 index 0000000..c494671 --- /dev/null +++ b/po/en_PH.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Delete" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancel" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Allow" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Empty" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Starting download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Website settings" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Reset to default" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Username" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentication required." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Remember preference." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Auto refresh" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Password" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "There are problems with the security certificate for this site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web notification" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) is attempting to store a large amount of data on your device for offline use." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) is requesting permission to store data on your device for offline use." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) is requesting permission to access your location." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) is requesting permission to show notifications." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) is requesting permission to use your camera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Full screen" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Access user location" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Use/store web data" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Use user media" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Allows this site to access your location information." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Allows this site to save a large amount of data on your device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Allows this site to change the display to full screen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Allows this site to use the media files stored on your device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Allows this site to display notifications." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Clear default app settings by going to Settings > General > Manage applications > All." + +msgid "IDS_COM_BODY_DENY" +msgstr "Deny" + diff --git a/po/en_US.po b/po/en_US.po new file mode 100755 index 0000000..200f658 --- /dev/null +++ b/po/en_US.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Delete" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancel" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Allow" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Empty" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Starting download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Website settings" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Reset to default" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Username" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentication required." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Remember preference." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Auto refresh" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Password" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "There are problems with the security certificate for this site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web notification" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) is attempting to store a large amount of data on your device for offline use." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) is requesting permission to store data on your device for offline use." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) is requesting permission to access your location." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) is requesting permission to show notifications." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) is requesting permission to use your camera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Full screen" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Access user location" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Use/store Web data" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Use user media" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Allows this website to access your location information." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Allows this website to save a large amount of data on your device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Allows this website to change the display to full screen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Allows this website to use the media files stored on your device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Allows this website to show notifications." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Clear default app settings by going to Settings > General > Manage applications > All." + +msgid "IDS_COM_BODY_DENY" +msgstr "Deny" + diff --git a/po/es_ES.po b/po/es_ES.po new file mode 100755 index 0000000..6dfbd14 --- /dev/null +++ b/po/es_ES.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Eliminar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permitir" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vacío" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Iniciando descarga..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Ajustes del sitio web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restablecer valores" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nombre de usuario" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticación necesaria" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Recordar preferencias" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualizar automáticamente" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Contraseña" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Hay problemas con el certificado de seguridad de este sitio" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificación web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está intentando almacenar una gran cantidad de datos en su dispositivo para su uso fuera de línea" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está solicitando permiso para almacenar datos en su dispositivo para su uso fuera de línea" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) está solicitando permiso para acceder a su ubicación" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) está solicitando permiso para mostrar notificaciones" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) está solicitando permiso para usar su cámara" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pantalla completa" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Acceder a ubicación de usuario" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Usar/almacenar datos web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Usar archivos multimedia del usuario" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite a este sitio acceder a su información de ubicación" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite a este sitio guardar una gran cantidad de datos en su dispositivo" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite a este sitio cambiar a pantalla completa" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite a este sitio utilizar los archivos multimedia almacenados en su dispositivo" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite a este sitio mostrar notificaciones" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Borre ajustes de aplicaciones predeterminados en Ajustes > General > Gestionar aplicaciones > Todas" + +msgid "IDS_COM_BODY_DENY" +msgstr "Rechazar" + diff --git a/po/es_MX.po b/po/es_MX.po new file mode 100755 index 0000000..7b7ac59 --- /dev/null +++ b/po/es_MX.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Eliminar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permitir" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vacío" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Iniciando descarga..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Configuración del sitio Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restablecer valores predeterminados" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nombre de usuario" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticación necesaria." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Preferencias de recordatorio." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualizar automáticamente" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Contraseña" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Hay problemas con el certificado de seguridad de este sitio." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificación web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está intentado almacenar grandes cantidades de datos en su dispositivo para el uso sin conexión." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está solicitando permiso para almacenar grandes cantidades de datos en su dispositivo para el uso sin conexión." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) está solicitando permiso para acceder a su ubicación." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) está solicitando permiso para mostrar notificaciones." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) está solicitando permiso para usar su cámara." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pantalla completa" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Acceder a ubicación de usuario" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Usar/almacenar datos web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Usar archivos multimedia del usuario" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite que este sitio acceda a su información de ubicación." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite que este sitio guarde grandes cantidades de datos en su dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite que este sitio cambie la pantalla a pantalla completa." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite que este sitio utilice archivos multimedia almacenados en su dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite que este sitio muestre notificaciones." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Elimine la configuración predeterminada de la aplicación en Configuración > General > Administrar aplicaciones > Todo." + +msgid "IDS_COM_BODY_DENY" +msgstr "Rechazar" + diff --git a/po/es_US.po b/po/es_US.po new file mode 100755 index 0000000..2d966af --- /dev/null +++ b/po/es_US.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Eliminar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permitir" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vacío" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Iniciando descarga..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Configuración del sitio Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restablecer valores predeterminados" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nombre de usuario" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticación necesaria." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Preferencias de recordatorio." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualizar automáticamente" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Contraseña" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Hay problemas con el certificado de seguridad de este sitio." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificación web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está intentado almacenar una gran cantidad de datos en su dispositivo para el uso sin conexión." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está solicitando permiso para almacenar datos en su dispositivo para el uso sin conexión." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) está solicitando permiso para acceder a su ubicación." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) está solicitando permiso para mostrar notificaciones." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) está solicitando permiso para usar Cámara." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pantalla completa" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Acceder a ubicación de usuario" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Usar/almacenar datos web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Usar archivos multimedia del usuario" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite que este sitio acceda a su información de ubicación." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite que este sitio guarde grandes cantidades de datos en su dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite que este sitio cambie la pantalla a pantalla completa." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite que este sitio utilice archivos multimedia almacenados en su dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite que este sitio muestre notificaciones." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Elimine la configuración predeterminada de la aplicación en Configuración > General > Administrar aplicaciones > Todo." + +msgid "IDS_COM_BODY_DENY" +msgstr "Rechazar" + diff --git a/po/et.po b/po/et.po new file mode 100755 index 0000000..196c6fd --- /dev/null +++ b/po/et.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Kustuta" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Tühista" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Luba" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tühi" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Allalaadimise alustamine..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Veebisaidi seaded" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Lähtesta vaikeväärtusele" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Kasutajanimi" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autentimine on kohustuslik." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Maleta eelistusi." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automaatne värskendamine" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Parool" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Selle saidi turvasertifikaadiga tekkis probleeme." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Veebiteavitus" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) proovib teie seadmesse salvestada suurt hulka andmeid, et kasutada neid vorguuhenduseta." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) taotleb luba salvestada teie seadmesse andmeid, et kasutada neid vorguuhenduseta." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) taotleb luba juurdepaasuks teie asukohale." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) taotleb luba naidata teavitusi." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) taotleb luba kasutada teie kaamerat." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Täisekraan" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Juurdepääs kasutaja asukohale" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Kasuta/salvesta veebiandmeid" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Kasuta kasutaja meediumi" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Lubab sellele saidile juurdepääsu teie asukoha teabele." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Lubab sellel saidil salvestada teie seadmesse suures koguses andmeid." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Lubab sellel saidil muuta kuva täisekraanile." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Lubab sellel saidil kasutada teie seadmesse salvestatud meediumifaile." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Lubab sellel saidil kuvada teavitusi." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Tuhistage vaikerakenduse seaded menuus Seaded > Uldine > Halda rakendusi > Koik." + +msgid "IDS_COM_BODY_DENY" +msgstr "Keeldu" + diff --git a/po/eu.po b/po/eu.po new file mode 100755 index 0000000..efdb568 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Ezabatu" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Ezeztatu" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Onartu" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Hutsik" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Deskarga hasten..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Webgunearen ezarpenak" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Lehenetsira berrezarri" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Erabiltzaile izena" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autentikazioa beharrezkoa" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Gogoratu hobespenak" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Freskatu automatikoki" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Pasahitza" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Arazoak daude gune honen segurtasun ziurtagiriarekin" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web jakinarazpena" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) datu kopuru handia gordetzen saiatzen ari da zure gailua lineaz kanpo erabiltzeko" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) baimena eskatzen ari zaizu datu kopuru handia gordetzeko zure gailuan lineaz kanpoko erabilerarako" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) baimena eskatzen ari zaizu zure kokapenera sartzeko" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) baimena eskatzen ari zaizu jakinarazpenak erakusteko" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) baimena eskatzen ari zaizu zure kamera erabiltzeko" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pantaila osoa" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Sartu erabiltzaile kokapenera" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Erabili/gorde web datuak" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Erabili erabiltzaile multimedia" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Gune honi zure kokapen informaziora sartzen uzten dio" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Gune honi datu kopuru handia zure gailuan gordetzen uzten dio" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Gune honi pantaila osoa aldatzen uzten dio" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Gune honi datu zure gailuan gordetako multimedia fitxategiak erabiltzen uzten dio" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Gune honi jakinarazpenak erakusten uzten dio" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Garbitu lehenetsitako aplikazio ezarpenak Ezarpenak > Orokorra > Kudeatu aplikazioak > Denak aukerara joanda" + +msgid "IDS_COM_BODY_DENY" +msgstr "Ukatu" + diff --git a/po/fi.po b/po/fi.po new file mode 100755 index 0000000..0d443d1 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Poista" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Peruuta" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Salli" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tyhjä" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Lataus käynnistetään..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Sivuston asetukset" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Palauta oletukset" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Käyttäjän nimi" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Todennus vaaditaan." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Muista ensisijainen asetus." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automaattinen päivitys" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Salasana" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Sivuston suojausvarmenteen kanssa on ongelmia." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Verkkoilmoitus" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) yrittää tallentaa suuren määrän tietoja laitteeseen offline-tilassa tapahtuvaa käyttöä varten." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) pyytää lupaa tietojen tallentamiseen laitteeseen offline-tilassa tapahtuvaa käyttöä varten." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) pyytää lupaa sijaintisi käyttämiseen." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) pyytää lupaa ilmoitusten näyttämiseen." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) pyytää lupaa kamerasi käyttämiseen." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Koko näyttö" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Käytä käyttäjän sijaintia" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Käytä/tallenna verkossa olevia tietoja" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Käytä käyttäjän mediaa" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Antaa sivuston käyttää sijaintitietoja." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Antaa sivuston tallentaa suuren määrän tietoja laitteeseen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Antaa sivuston siirtää näytön koko näytön tilaan." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Antaa sivuston käyttää laitteeseen tallennettuja mediatiedostoja." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Antaa sivuston näyttää ilmoituksia." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Poista sovelluksen oletusasetukset käytöstä valitsemalla Asetukset > Yleistä > Sovellusten hallinta > Kaikki." + +msgid "IDS_COM_BODY_DENY" +msgstr "Kieltäydy" + diff --git a/po/fr_CA.po b/po/fr_CA.po new file mode 100755 index 0000000..9850fa4 --- /dev/null +++ b/po/fr_CA.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Supprimer" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Annuler" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Autoriser" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vide" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Début du téléchargement..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Paramètres des sites Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restaurer valeurs par défaut" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nom d'utilisateur" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentification requise" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Mémoriser la préférence." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualisation automatique" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Mot de passe" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Problèmes avec le certificat de sécurité de ce site" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notification Web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) tente d'enregistrer une grande quantité de données sur votre appareil pour une utilisation hors-ligne." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) demande l'autorisation d'enregistrer des données sur votre appareil pour une utilisation hors-ligne." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) demande l'autorisation de se connecter pour connaitre votre position." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) demande l'autorisation de consulter les notifications." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) demande l'autorisation d'utiliser votre appareil photo." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Plein écran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Accéder à la position de l'utilisateur" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Utiliser/stocker les données Web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Utiliser les réseaux sociaux de l'utilisateur" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Autorise ce site à accéder à vos informations de localisation." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Autorise ce site à enregistrer une grande quantité de données sur votre appareil." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Autorise ce site à afficher le mode plein écran." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Autorise ce site à utiliser les fichiers multimédias stockés sur votre appareil." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Autorise ce site à afficher les notifications." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Effacez les paramètres par défaut des applications en accédant à Paramètres > Général > Gérer les applications > Toutes." + +msgid "IDS_COM_BODY_DENY" +msgstr "Refuser" + diff --git a/po/fr_FR.po b/po/fr_FR.po new file mode 100755 index 0000000..251b647 --- /dev/null +++ b/po/fr_FR.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Supprimer" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Annuler" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Autoriser" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vide" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Début du téléchargement..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Paramètres des sites Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restaurer valeurs par défaut" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nom d'utilisateur" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentification obligatoire" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Mémoriser la préférence." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualisation automatique" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Mot de passe" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Problèmes avec le certificat de sécurité de ce site" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notification Web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) tente d'enregistrer une grande quantité de données sur votre appareil pour une utilisation hors-ligne." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) demande l'autorisation d'enregistrer des données sur votre appareil pour une utilisation hors-ligne." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) demande l'autorisation de se connecter pour connaître votre position." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) demande l'autorisation de consulter les notifications." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) demande l'autorisation d'utiliser votre appareil photo." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Plein écran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Accéder à la position de l'utilisateur" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Utiliser/stocker les données Web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Utiliser les réseaux sociaux de l'utilisateur" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Autorise ce site à accéder à vos informations de localisation." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Autorise ce site à enregistrer une grande quantité de données sur votre appareil." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Autorise ce site à afficher le mode plein écran." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Autorise ce site à utiliser les fichiers multimédia stockés sur votre appareil." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Autorise ce site à afficher les notifications." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Effacez les paramètres par défaut des applications en accédant à Paramètres > Général > Gérer les applications > Toutes." + +msgid "IDS_COM_BODY_DENY" +msgstr "Refuser" + diff --git a/po/ga.po b/po/ga.po new file mode 100755 index 0000000..54aba6a --- /dev/null +++ b/po/ga.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Scrios" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cuir ar ceal" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Ceadaigh" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Folamh" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Ag tosú ar íoslódáil..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Socruithe láithreán Gréasáin" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Athshocraigh go réamhshocraithe" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Ainm úsáideora" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Fíordheimhniú de dhíth." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Cuimhnigh ar mo shainrogha" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Uath-athnuaigh" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Pasfhocal" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Tá fadhbanna leis an deimhniú slándála don láithreán seo" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Fógra Gréasáin" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "Tá %1$s (%2$s) ag iarraidh líon mór sonraí a stóráil ar do ghléas le húsáid as líne" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "Tá %1$s (%2$s) ag iarraidh ceada le sonraí a stóráil ar do ghléas le húsáid as líne" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "Tá %1$s (%2$s) ag iarraidh ceada le do shuíomh a rochtain" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "Tá %1$s (%2$s) ag iarraidh ceada le fógraí a thaispeáint" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "Tá %1$s (%2$s) ag iarraidh ceada le do cheamara a úsáid" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Lánscáileán" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Faigh rochtain ar shuíomh úsáideora" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Úsáid/stóráil sonraí gréasáin" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Úsáid meáin úsáideora" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Ceadaítear don láithreán seo faisnéis faoi do shuíomh a rochtain." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Ceadaítear don láithreán seo líon mór sonraí a stóráil ar do ghléas." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Ceadaítear don láithreán seo an taispeáint a athrú go lánscáileán." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Ceadaítear don láithreán seo na comhaid meán atá á stóráil ar do ghléas a úsáid." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Ceadaítear don láithreán seo fógraí a thaispeáint." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Glan réamhshocruithe feidhmchláir trí ghabháil chuig Socruithe > Ginearálta > Bainistigh feidhmchláir > Gach" + +msgid "IDS_COM_BODY_DENY" +msgstr "Séan air" + diff --git a/po/gl.po b/po/gl.po new file mode 100755 index 0000000..631a6e8 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Eliminar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permitir" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Baleiro" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Iniciando descarga..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Axustes do sitio Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restablecer como predeterminado" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nome de usuario" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticación requirida" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Lembrar preferencia" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualización automática" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Contrasinal" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Existen problemas co certificado de seguridade deste sitio" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificación web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está tentando almacenar unha grande cantidade de datos no teu dispositivo para utilizalos fóra de liña" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está solicitando permiso para almacenar datos no teu dispositivo para utilizalos fóra de liña" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) está solicitando permiso para ter acceso á túa situación" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) está solicitando permiso para amosar notificacións" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) está solicitando permiso para usar a túa cámara" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pantalla completa" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Acceder á localización do usuario" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Usar/almacenar datos da Internet" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Usar arquivos multimedia de usuario" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite a este sitio acceder á túa información de localización" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite a este sitio gardar unha grande cantidade de datos no teu dispositivo" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite a este sitio cambiar a pantalla completa" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite a este sitio usar os arquivos multimedia almacenados no teu dispositivo" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite a este sitio amosar notificacións" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Borra os axustes predeterminados das aplicacións en Axustes > Xeral > Xestionar aplicacións > Todo" + +msgid "IDS_COM_BODY_DENY" +msgstr "Denegar" + diff --git a/po/gu.po b/po/gu.po new file mode 100755 index 0000000..9a22a2b --- /dev/null +++ b/po/gu.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "કાઢી નાખો" + +msgid "IDS_BR_SK_CANCEL" +msgstr "રદ" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "છૂટ આપો" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ખાલી" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ડાઉનલોડ પ્રારંભ કરે છે..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "વેબસાઇટ સેટિંગ્સ" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "મૂળભૂત પર ફરીથી ગોઠવો" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ઉપયોગકર્તાનું નામ" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "પ્રમાણીકરણ જરૂરી." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "પ્રાથમિકતા યાદ રાખો." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "સ્વત: તાજું કરો" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "પાસવર્ડ" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "આ સાઇટ માટેનાં સુરક્ષા પ્રમાણપત્રમાં સમસ્યાઓ છે." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "વેબ સૂચના" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ઑફલાઇન ઉપયોગ માટે તમારા ઉપકરણ પર વધુ પ્રમાણમાં ડેટાનો સંગ્રહ કરવાનો પ્રયાસ કરી રહ્યાં છો." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) એ ઑફલાઇન ઉપયોગ માટે તમારા ઉપકરણ પર ડેટા સંગ્રહિત કરવા માટેની પરવાનગીની વિનંતી કરી રહ્યાં છે." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) તમારા સ્થાનને પ્રવેશ કરવાની પરવાનગીની વિનંતી કરી રહ્યાં છે." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) એ સૂચનાઓ બતાવવાની પરવાનગીની વિનંતી કરી રહ્યાં છે." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) તમારા સ્થાનનો ઉપયોગ કરવાની પરવાનગીની વિનંતી કરી રહ્યાં છે." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "પૂર્ણ પડદો" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ઉપયોગકર્તા સ્થળમાં પ્રવેશ કરો" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "વેબ ડેટાનો ઉપયોગ/સંગ્રહ કરો" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ઉપયોગકર્તા મીડિયાનો ઉપયોગ કરો" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "આ સાઇટને તમારી સ્થાન માહિતીમાં પ્રવેશ કરવાની પરવાનગી આપે છે." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "આ સાઇટને તમારા ઉપકરણ પર મોટા પ્રમાણમાં ડેટા સાચવવાની પરવાનગી આપે છે." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "આ સાઇટના પ્રદર્શનને સંપૂર્ણ સ્ક્રીન પર બદલવાની પરવાનગી આપે છે." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "આ સાઇટને તમારા ઉપકરણ પર સંગ્રહિત મીડિયા ફાઇલ્સનો ઉપયોગ કરવાની પરવાનગી આપે છે." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "આ સાઇટને સૂચનાઓ પ્રદર્શિત કરવાની પરવાનગી આપે છે." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "સેટિંગ્સ > સામાન્ય > એપ્લિકેશનોનું સંચાલન કરો > બધું પર જઈને મૂળભૂત એપ્લિકેશનો સેટિંગ્સને સાફ કરો." + +msgid "IDS_COM_BODY_DENY" +msgstr "નકારો" + diff --git a/po/hi.po b/po/hi.po new file mode 100755 index 0000000..abb02a5 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "हटाएँ" + +msgid "IDS_BR_SK_CANCEL" +msgstr "रद्द" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "अनुमति दें" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "खाली" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "डाउनलोड शुरू कर रहे है..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "वेबसाइट सेटिंग्स" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "डिफॉल्‍ट में रीसेट करें" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "उपभोक्ता का नाम" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "प्रमाणीकरण आवश्यक है।" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "प्राथमिकता याद रखें" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "स्वतः रीफ्रेश करना" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "पासवर्ड" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "इस साइट के सुरक्षा प्रमाणपत्र के साथ समस्‍याएँ है" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "वेब सूचना" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) आपके डिवाइस पर ऑफ़लाइन उपयोग करने के लिए बड़ी मात्रा में डाटा स्टोर करने का प्रयास कर रहा है" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) आपके डिवाइस पर ऑफ़लाइन उपयोग करने के लिए डाटा स्टोर करने हेतु अनुरोध कर रहा है" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) आपके स्थान को ऐक्सेस करने की अनुमति का अनुरोध कर रहा है" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) अधिसूचना दिखाने की अनुमति का अनुरोध कर रहा है" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) आपके कैमरा उपयोग करने की अनुमति का अनुरोध कर रहा है" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "पूर्ण स्क्रीन" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "उपयोगकर्ता का स्थान ऍक्सेस करें" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "वेब डाटा उपयोग/स्टोर करें" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "उपयोगकर्ता मीडिया का उपयोग करें" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "इस साइट को आपके स्थान जानकारी तक पहुँच की अनुमति देता है।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "इस साइट को आपके डिवाइस पर बड़ी मात्रा में डाटा सुरक्षित करने की अनुमति देता है।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "इस साइट को प्रदर्शन को पूर्ण स्क्रीन में बदलने की अनुमति देता है।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "इस साइट को आपके डिवाइस पर संग्रहीत मीडिया फ़ाइलों का उपयोग करने की अनुमति देता है।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "इस साइट को अधिसूचनाएँ प्रदर्शित करने की अनुमति देता है।" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "सेटिंग्स > सामान्य > ऐप्लिकेशंस प्रबंधित करें > सभी पर जाकर डिफ़ॉल्ट ऐप सेटिंग्स साफ करें" + +msgid "IDS_COM_BODY_DENY" +msgstr "अस्वीकृत करें" + diff --git a/po/hr.po b/po/hr.po new file mode 100755 index 0000000..f0565f1 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Obriši" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Prekid" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Dopusti" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Prazno" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Pokretanje skidanja..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Postavke web stranice" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Vrati na zadano" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Korisničko ime" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Provjera potrebna." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Spremi postavke." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatsko aktualiziranje" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Šifra" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Greška sigurnosne potvrde za ovu stranicu." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web obavijest" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) pokušava pohraniti veću količinu podataka na vaš uređaj za korištenje izvan mreže." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) traži dopuštenje da pohrani veću količinu podataka na vaš uređaj za korištenje izvan mreže." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) traži dopuštenje da pristupi vašoj lokaciji." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) traži dopuštenje da prikaže obavijesti." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) traži dopuštenje da koristi vašu kameru." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Cijeli zaslon" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Otvori lokaciju korisnika" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Koristite/spremite web-podatke" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Koristite korisnikove medije" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Dopušta ovoj stranici pristup informacijama o vašoj lokaciji." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Dopušta ovoj stranici da spremi veliku količinu podataka na vaš uređaj." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Dopušta ovoj stranici da promjeni prikaz na puni zaslon." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Dopušta ovoj stranici da koristi medijske datoteke spremljene na uređaju." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Dopušta ovoj stranici da prikaže obavijesti." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Obrišite zadane postavke aplikacija tako da odete na Postavke > Općenito > Upravljanje aplikacijama > Sve." + +msgid "IDS_COM_BODY_DENY" +msgstr "Odbijeno" + diff --git a/po/hu.po b/po/hu.po new file mode 100755 index 0000000..d2d774e --- /dev/null +++ b/po/hu.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Töröl" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Mégse" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Engedélyezés" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Üres" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Letöltés indítása..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Webhelybeállítások" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Alapbeállítás visszaállítása" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Felhasználónév" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Hitelesítés szükséges." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Beállítások megjegyzése" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatikus frissítés" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Jelszó" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Probléma merült fel a webhely biztonsági tanúsítványával kapcsolatban." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Webes értesítés" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) nagymennyiségű adatot próbál az eszközön tárolni offline használatra." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) engedélyt kér nagymennyiségű adat tárolására az eszközön offline használatra." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) engedélyt kér az Ön helyadataihoz való hozzáféréshez." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) engedélyt kér értesítések megjelenítésére." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) engedélyt kér a fényképező használatára." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Teljes képernyő" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Felhasználó helyadatainak hozzáférése" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Webes adatok használata, tárolása" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Felhasználói média használata" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Adatai hozzáférhetővé tétele a webhely számára" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Nagymennyiségű adat eszközre mentésének engedélyezése a webhely számára" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Teljes képernyős megjelenítésre kapcsolás engedélyezése a webhely számára" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Az eszközre mentett médiafájlok használatának engedélyezése a webhely számára" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Értesítések megjelenítésének engedélyezése a webhely számára" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "A Beállítások > Általános > Alkalmazások kezelése > Összes pontban törölheti az alapértelmezett alkalmazásbeállításokat." + +msgid "IDS_COM_BODY_DENY" +msgstr "Elutasítás" + diff --git a/po/hy.po b/po/hy.po new file mode 100755 index 0000000..13b7f42 --- /dev/null +++ b/po/hy.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Ջնջել" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Չեղարկել" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Թույլատրել" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Դատարկ է" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Ներբեռնման մեկնարկում..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Կայքի դրվածքներ" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Զրոյացնել լռելյայնի" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Օգտվողի անուն" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Պահանջվում է վավերականացում:" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Հիշել նախապատվությունը:" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Ինքնանորացում" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Գաղտնաբառ" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Այս կայքն ունի անվտանգության վկայագրերի խնդիր:" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Համացանցային ծանուցում" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) փորձում է ցանցից դուրս օգտագործման համար մեծ քանակությամբ տվյալներ պահել Ձեր սարքում:" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) հարցնում է ցանցից դուրս օգտագործման համար Ձեր սարքում տվյալներ պահելու թույլտվություն:" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) հարցնում է Ձեր գտնվելու տեղը մուտք գործելու թույլտվություն:" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) հարցնում է ծանուցումները ցույց տալու թույլտվություն:" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) հարցնում է Ձեր խցիկն օգտագործելու թույլտվություն:" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Ամբողջ էկրանով" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Մուտք գործել դեպի օգտվողի տեղը" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Օգտագործել կամ պահել համացանցային տվյալները" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Օգտագործել օգտվողի միջոցները" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Թույլ է տալիս, որ այս կայքը մուտք գործի դեպի Ձեր տեղի մասին տեղեկատվությունը:" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Թույլ է տալիս, որ այս կայքը Ձեր սարքում պահպանի մեծ քանակությամբ տվյալներ:" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Թույլ է տալիս, որ այս կայքը ցուցադրումը փոխի լրիվ էկրանի:" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Թույլ է տալիս, որ այս կայքն օգտագործի Ձեր սարքում պահված մեդիա ֆայլերը:" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Թույլ է տալիս, որ այս կայքը ցուցադրի ծանուցումներ:" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Մաքրեք կանխադրված ծրագրի դրվածքները՝ գնալով Դրվածքներ > Ընդհանուր > Կառավարել ծրագրերը > Բոլոր:" + +msgid "IDS_COM_BODY_DENY" +msgstr "Մերժել" + diff --git a/po/id.po b/po/id.po new file mode 100755 index 0000000..bfcef78 --- /dev/null +++ b/po/id.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Hapus" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Batal" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Bolehkan" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Kosong" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Mulai mendownload..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Pengaturan situs web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Reset ke default" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nama pemakai" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autentikasi diperlukan." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Ingat preferensi." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Segarkan Otomatis" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Kata sandi" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Sertifikat keamanan situs ini bermasalah." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notifikasi web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) mencoba menyimpan jumlah data yang besar di perangkat untuk penggunaan offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) meminta izin menyimpan data di perangkat Anda untuk penggunaan offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) meminta izin untuk mengakses lokasi Anda." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) meminta izin memperlihatkan notifikasi." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) meminta izin untuk menggunakan kamera Anda." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Layar penuh" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Akses lokasi pengguna" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Gunakan/simpan data web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Gunakan media pengguna" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Izinkan situs ini untuk mengakses informasi lokasi Anda." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Izinkan situs ini untuk menyimpan data dalam jumlah besar di perangkat Anda." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Izinkan situs ini untuk mengubah tampilan ke layar penuh." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Izinkan situs ini untuk menggunakan file media yang disimpan di perangkat Anda." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Izinkan situs ini untuk menampilkan notifikasi." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Hapus pengaturan aplikasi default dengan masuk ke Pengaturan > Umum > Kelola aplikasi > Semua." + +msgid "IDS_COM_BODY_DENY" +msgstr "Deny" + diff --git a/po/is.po b/po/is.po new file mode 100755 index 0000000..9bb2872 --- /dev/null +++ b/po/is.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Eyða" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Hætta við" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Leyfa" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tómt" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Ræsi niðurhal..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Vefsíðustillingar" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Endurstilla á sjálfgildi" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Notandanafn" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Sannprófun er nauðsynleg." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Muna stillingu." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Sjálfvirk uppfærsla" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Aðgangsorð" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Það komu upp vandamál með öryggisvottorðið fyrir þetta svæði." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Veftilkynning" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) er að reyna að geyma mikið magn gagna í tækinu til notkunar án nettengingar." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) biður um leyfi til að geyma mikið magn gagna í tækinu til notkunar án nettengingar." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) biður um leyfi til að fá aðgang að staðsetningunni þinni." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) biður um leyfi til að sýna tilkynningar." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) biður um leyfi til að nota myndavélina þína." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Allur skjárinn" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Fá staðsetninguna notanda" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Nota/geyma vefgögn" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Nota efni notanda" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Leyfir þessu vefsvæði að fá aðgang að staðsetningarupplýsingum þínum." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Leyfir þessu vefsvæði að vista mikið magn gagna í tækinu." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Leyfir þessu vefsvæði að skipta yfir í birtingu á öllum skjánum." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Leyfir þessu vefsvæði að nota margmiðlunarskrár sem vistaðar eru í tækinu." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Leyfir þessu vefsvæði að birta tilkynningar." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Hreinsaðu sjálfgefnar forritastillingar með því að fara í Stillingar > Almennt > Stjórna forritum > Allt." + +msgid "IDS_COM_BODY_DENY" +msgstr "Hafna" + diff --git a/po/it_IT.po b/po/it_IT.po new file mode 100755 index 0000000..bcb8da5 --- /dev/null +++ b/po/it_IT.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Elimina" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Annulla" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Consenti" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vuoto" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Inizio download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Impostazioni sito web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Ripristina impostazioni predefinite" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nome utente" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticazione richiesta." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Ricorda preferenza." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Aggiornamento automatico" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Password" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Problemi con il certificato di sicurezza di questo sito." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notifica Web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) sta tentando di archiviare una grande quantità di dati sul dispositivo in uso per l'utilizzo offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) sta chiedendo il permesso di archiviare i dati sul dispositivo in uso per l'utilizzo offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) sta chiedendo il permesso di accedere alla posizione dell'utente." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) sta chiedendo il permesso di mostrare le notifiche." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) sta chiedendo il permesso di utilizzare la fotocamera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Schermo intero" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Accedi alla posizione utente" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Utilizza/memorizza dati Web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Utilizza elementi multimediali utente" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Consente al sito di accedere alle informazioni sulla posizione dell'utente." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Consente al sito di salvare una grande quantità di dati sul dispositivo in uso." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Consente al sito di passare alla modalità a schermo intero." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Consente al sito di utilizzare i file multimediali memorizzati sul dispositivo in uso." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Consente al sito di visualizzare le notifiche." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Cancellate le impostazioni predefinite delle applicazioni andando in Impostazioni > Generali > Gestisci applicazioni > Tutte." + +msgid "IDS_COM_BODY_DENY" +msgstr "Rifiuta" + diff --git a/po/ja_JP.po b/po/ja_JP.po new file mode 100755 index 0000000..4bfc6f5 --- /dev/null +++ b/po/ja_JP.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "削除" + +msgid "IDS_BR_SK_CANCEL" +msgstr "キャンセル" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "許可する" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "空き" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ダウンロード開始..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Webサイト設定" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "初期値にリセット" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ユーザー名" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "認証が必要です。" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "設定を保存" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "自動更新" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "パスワード" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "このサイトのセキュリティ証明書に問題があります。" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web通知" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s(%2$s)がオフラインで使用するために、端末に容量の大きなデータを保存しようとしています。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s(%2$s)がオフラインで使用するために、端末にデータを保存する権限を要求しています。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s(%2$s)が現在地情報にアクセスする権限を要求しています。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s(%2$s)が通知を表示する権限を要求しています。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s(%2$s)がカメラを使用する権限を要求しています。" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "全画面表示" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ユーザの位置情報にアクセス" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Webデータを使用/保存" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ユーザーメディアを使用" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "このサイトが位置情報にアクセスすることを許可" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "このサイトから端末に大容量のデータを保存することを許可" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "このサイトを全画面表示に変更することを許可" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "このサイトが端末に保存されたメディアファイルを使用することを許可" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "このサイトから通知を表示することを許可" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "標準アプリ設定を解除するには、[設定] > [一般] > [アプリケーション管理] > [全て]に移動してください。" + +msgid "IDS_COM_BODY_DENY" +msgstr "拒否" + diff --git a/po/ka.po b/po/ka.po new file mode 100755 index 0000000..e2defb3 --- /dev/null +++ b/po/ka.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "წაშლა" + +msgid "IDS_BR_SK_CANCEL" +msgstr "გაუქმება" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "დართე ნება" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ცარიელია" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "იწყება ჩამოტვირთვა..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ვებსაიტის პარამეტრები" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ავტო. პარამეტრის დაბრუნება" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "მომხმარებლის სახელი" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ავტორიზაცია აუცილებელია." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "უპირატესობის დამახსოვრება." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ავტომატური განახლება" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "პაროლი" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ამ საიტს აქვს უსაფრთხოების სერთიფიკატთან დაკავშირებული პრობლემა." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ვებ-შეტყობინება" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ცდილობს შეინახოს დიდი მოცულობის მონაცემები თქვენს მოწყობილობაში, ინტერნეტში გამოსაყენებლად." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ითხოვს მონაცემების თქვენს მოწყობილობაში შენახვის ნებართვას, ინტერნეტში მათ გამოსაყენებლად." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) ითხოვს თქვენს ლოკაციაზე წვდომის ნებართვას." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) ითხოვს შეტყობინებების ჩვენების ნებართვას." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) ითხოვს თქვენი კამერის გამოყენების ნებართვას." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "მთლიანი ეკრანი" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "მომხმარებლის ლოკაციაზე წვდომა" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ინტერნეტის მონაცემების გამოყენება/შენახვა" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "მომხმარებლის მედიის გამოყენება" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "საშუალებას აძლევს ამ საიტს გახსნას თქვენი ლოკაციის ინფორმაცია." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "საშუალებას აძლევს ამ საიტს თქვენს მოწყობილობაში შეინახოს მონაცემთა დიდი რაოდენობა." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "საშუალებას აძლევს ამ საიტს გაიხსნას მთელ ეკრანზე." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "საშუალებას აძლევს ამ საიტს გამოიყენოს თქვენს მოწყობილობაში შენახული მედია ფაილები." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "საშუალებას აძლევს ამ საიტს აჩვენოს შეტყობინებები." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "პროგრამის ნაგულისხმევი პარამეტრების წასაშლელად, გახსენით პარამეტრები > ზოგადი > პროგრამების მართვა > ყველა." + +msgid "IDS_COM_BODY_DENY" +msgstr "უარყოფა" + diff --git a/po/kk.po b/po/kk.po new file mode 100755 index 0000000..d6a9456 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Жою" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Тоқтату" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Рұқсат" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Бос" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Жүктеу басталуда..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Веб-сайт параметрлері" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Стандартты бапстапқы мәндеріне баптау" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Тұтынушы аты" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Түпнұсқаны тексеру қажет." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Басымдығын еске сақтау." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Авто жаңарту" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Кілтсөз" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Осы сайтқа арналған қауіпсіздік куәлігінде қателер пайда болады." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Веб-хабарландыру" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) үлкен көлемдегі деректерді құрылғыңызда желіден тыс пайдалану үшін сақтауда." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) желіден тыс пайдалану үшін деректерді құрылғыда сақтау рұқсатын сұрауда." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) орналасқан орныңызға кіру рұқсатын сұрауда." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) хабарландыруларды көрсетуге рұқсат сұрауда." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) камераңызды пайдалану рұқсатын сұрауда." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Толық экран" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Пайдаланушы орнына қатынас" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Веб деректерін пайдалану/сақтау" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Пайдаланушы мультимедиасын қолдану" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Бұл сайтқа орын ақпаратына кіру мүмкіндігін береді." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Бұл сайтқа құрылғыңызда үлкен көлемдегі деректерді сақтау мүмкіндігін береді." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Бұл сайтқа дислейді толық экран режиміне ауыстыру мүмкіндігін береді." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Бұл сайтқа құрылғыңызда сақталған медиа файлдарды пайдалану мүмкіндігін береді." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Бұл сайтқа хабарландыруларды көрсету мүмкіндігін береді." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Әдепкі бағдарлама параметрлерін Параметрлер > Жалпы > Бағдарламаларды басқару > Барлығы мәзіріне өту арқылы өшіріңіз." + +msgid "IDS_COM_BODY_DENY" +msgstr "Бас тарту" + diff --git a/po/km.po b/po/km.po new file mode 100755 index 0000000..a026f24 --- /dev/null +++ b/po/km.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "លុប" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ចោល" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "អនុញ្ញាត" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ទទេ" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "កំពុង​ចាប់​ផ្ដើម​ទាញ​យក..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ការកំណត់​វិបសៃ" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "កំណត់​ទៅ​លំនាំដើម" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ឈ្មោះ​អ្នកប្រើ" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ត្រូវការ​ការផ្ទៀងផ្ទាត់​ភាពពិត។" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ចងចាំ​ចំណូលចិត្ត។" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ស្វ័យ​ធ្វើ​ឲ្យ​ស្រស់" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "ពាក្យ​សម្ងាត់" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "មាន​បញ្ហា​ជាមួយ​វិញ្ញាបនបត្រ​សន្តិសុខ​សម្រាប់​វិបសៃ​នេះ។" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ការ​ជូន​ដំណឹង​វិប" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) កំពុង​ព្យាយាម​រក្សាទុក​បរិមាណ​ទិន្នន័យ​ជាច្រើន​លើ​ឧបករណ៍​របស់​អ្នក​សម្រាប់​ការប្រើ​ក្រៅ​បណ្ដាញ។" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) កំពុង​ស្នើ​ការអនុញ្ញាត​រក្សាទុក​ទិន្នន័យ​លើ​ឧបករណ៍​របស់​អ្នក​សម្រាប់​ការប្រើ​ក្រៅ​បណ្ដាញ។" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) កំពុង​ស្នើ​ការអនុញ្ញាត​ចូលប្រើ​ទីកន្លែង​របស់​អ្នក។" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) កំពុង​ស្នើ​ការអនុញ្ញាត​បង្ហាញ​ការជូនដំណឹង។" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) កំពុង​ស្នើ​ការអនុញ្ញាត​ប្រើ​កាមេរ៉ា​របស់​អ្នក។" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "ពេញ​អេក្រង់" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ចូលប្រើ​ទីកន្លែង​អ្នកប្រើប្រាស់" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ប្រើ/រក្សាទុក​ទិន្នន័យ​វិប" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ប្រើ​មេឌៀ​អ្នកប្រើប្រាស់" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "អនុញ្ញាត​ឲ្យ​វិបសៃ​នេះ​ចូលប្រើ​ព័ត៌មាន​ទីកន្លែង​របស់​អ្នក។" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "អនុញ្ញាត​ឲ្យ​វិបសៃ​នេះ​រក្សាទុក​បរិមាណ​ទិន្នន័យ​ច្រើន​លើ​ឧបករណ៍​របស់​អ្នក។" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "អនុញ្ញាត​ឲ្យ​វិបសៃ​នេះ​ប្ដូរ​ការបង្ហាញ​ទៅ​ពេញអេក្រង់។" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "អនុញ្ញាត​ឲ្យ​វិបសៃ​នេះ​ប្រើ​ឯកសារ​មេឌៀ​ដែល​បាន​រក្សាទុក​លើ​ឧបករណ៍​របស់​អ្នក។" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "អនុញ្ញាត​ឲ្យ​វិបសៃ​នេះ​បង្ហាញ​ការជូនដំណឹង។" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ជម្រះ​ការកំណត់​កម្មវិធី​លំនាំដើម ដោយ​ការចូលទៅ ការកំណត់ > ទូទៅ > គ្រប់គ្រង​កម្មវិធី > ទាំងអស់។" + +msgid "IDS_COM_BODY_DENY" +msgstr "Deny" + diff --git a/po/kn.po b/po/kn.po new file mode 100755 index 0000000..afbbc5e --- /dev/null +++ b/po/kn.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ಅಳಿಸು" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ರದ್ದು" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "ಅನುಮತಿಸು" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ಖಾಲಿ" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ಡೌನ್‌ಲೋಡ್ ಆರಂಭಿಸುತ್ತಿದೆ..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ವೆಬ್‌ಸೈಟ್ ಸಂಯೋಜನೆಗಳು" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ಡೀಫಾಲ್ಟ್‌ಗೆ ರೀಸೆಟ್ ಮಾಡು" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ಬಳಕೆದಾರರಹೆಸರು" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ಪ್ರಮಾಣೀಕರಣ ಅಗತ್ಯವಿದೆ." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ಇಚ್ಛೆ ನೆನಪಿಡಿ." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ಸ್ವಯಂ ರಿಫ್ರೆಶ್" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "ಪಾಸ್‌ವರ್ಡ್" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ಈ ಸೈಟಿನ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರದ ಜೊತೆ ಸಮಸ್ಯೆಗಳಿವೆ." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ವೆಬ್ ಪ್ರಕಟಣೆಗಳು" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ಆಫ್‌ಲೈನ್ ಬಳಕೆಗಾಗಿ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ದೊಡ್ಡ ಪ್ರಮಾಣದ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸಲು %1$s (%2$s) ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ಆಫ್‌ಲೈನ್ ಬಳಕೆಗಾಗಿ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಡೇಟಾ ಸಂಗ್ರಹಿಸಲು ಅನುಮತಿಯನ್ನು %1$s (%2$s) ವಿನಂತಿಸುತ್ತಿದೆ." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು %1$s (%2$s) ವಿನಂತಿಸುತ್ತಿದೆ." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "ಪ್ರಕಟಣೆಗಳನ್ನು ತೋರಿಸಲು ಅನುಮತಿಯನ್ನು %1$s (%2$s) ವಿನಂತಿಸುತ್ತಿದೆ." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಅನುಮತಿಯನ್ನು %1$s (%2$s) ವಿನಂತಿಸುತ್ತಿದೆ." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "ಪೂರ್ಣ ಪರದೆ" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ಬಳಕೆದಾರ ಸ್ಥಳ ಪ್ರವೇಶಿಸಿ" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ವೆಬ್ ಡೇಟಾ ಬಳಸಿ/ಸಂಗ್ರಹಿಸಿ" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ಬಳಕೆದಾರ ಮೀಡಿಯಾ ಬಳಸಿ" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "ನಿಮ್ಮ ಸ್ಥಳೀಯ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಲು ಈ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ದೊಡ್ಡ ಮೊತ್ತದ ಡೇಟಾ ಉಳಿಸಲು ಈ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ಪೂರ್ಣ ಸ್ಕ್ರೀನ್‌ಗೆ ಪ್ರದರ್ಶನವನ್ನು ಬದಲಾಯಿಸಲು ಈ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ಮೀಡಿಯಾ ಫೈಲ್‌ಗಳನ್ನು ಬಳಸಲು ಈ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "ಪ್ರಕಟಣೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ಈ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ಸಂಯೋಜನೆ‌ಗಳು > ಸಾಮಾನ್ಯ > ಅನ್ವಹಿಸುವಿಕೆಗಳನ್ನು ನಿರ್ವಹಿಸು > ಎಲ್ಲಾ ಇಲ್ಲಿಗೆ ಹೋಗುವ ಮೂಲಕ ಡೀಫಾಲ್ಟ್ ಅನ್ವಹಿಸುವಿಕೆ ಸಂಯೋಜನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ." + +msgid "IDS_COM_BODY_DENY" +msgstr "ನಿರಾಕರಿಸು" + diff --git a/po/ko_KR.po b/po/ko_KR.po new file mode 100755 index 0000000..2dcf84e --- /dev/null +++ b/po/ko_KR.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "삭제" + +msgid "IDS_BR_SK_CANCEL" +msgstr "취소" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "허용" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "비어 있음" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "다운로드를 시작하는 중..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "웹사이트 설정" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "기본으로 초기화" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "사용자 이름" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "인증이 필요합니다." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "설정을 기억합니다." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "자동 새로고침" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "비밀번호" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "URL을 검색하거나 입력하세요" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "웹 알림" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s(%2$s)에서 오프라인에서 사용하기 위해 용량이 큰 데이터를 내 디바이스에 저장하려고 합니다." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s(%2$s)에서 오프라인 사용을 위해 내 디바이스에 데이터를 저장할 권한을 요청합니다." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s(%2$s)에서 내 위치정보 접근 권한을 요청합니다." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s(%2$s)에서 알림 표시 권한을 요청합니다." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s(%2$s)에서 카메라 사용 권한을 요청합니다." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "전체 화면" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "사용자 위치정보 접근" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "웹 데이터 사용 및 저장" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "사용자 미디어 사용" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "사이트가 내 위치정보를 수집할 수 있도록 허용합니다." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "사이트가 디바이스에 용량이 큰 데이터를 저장할 수 있도록 허용합니다." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "사이트에서 화면을 전체 화면으로 변경할 수 있도록 허용합니다." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "사이트가 디바이스에 저장된 멀티미디어 파일을 사용할 수 있도록 허용합니다." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "사이트가 알림을 표시할 수 있도록 허용합니다." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "[설정] > [일반] > [애플리케이션 관리] > [전체]에서 기본 애플리케이션 설정을 삭제하세요." + +msgid "IDS_COM_BODY_DENY" +msgstr "거부" + diff --git a/po/lo.po b/po/lo.po new file mode 100755 index 0000000..e80b795 --- /dev/null +++ b/po/lo.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ລຶບ" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ຍົກເລີກ" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "ອະນຸຍາດ" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ຫວ່າງ​ເປົ່າ" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ເລີ່ມການດາວໂຫຼດ..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ການຕັ້ງຄ່າເວັບໄຊທ໌" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ຕັ້ງໃໝ່ໄປເປັນຄ່າມາດຕະຖານ" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ຊື່ຜູ້ໃຊ້" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentication required." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ຈື່ສິ່ງທີ່ມັກໄວ້." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ລີເຟຣຊ໌ອັດຕະໂນມັດ" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "ລະຫັດຜ່ານ" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ມີບັນຫາກັບໃບຢັ້ງຢືນຄວາມປອດໄພສໍາລັບເວັບໄຊທ໌ນີ້." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ການແຈ້ງບອກເວັບ" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ກໍາລັງພະຍາຍາມບັນທຶກປະລິມານຂໍ້ມູນຂະໜາດໃຫຍ່ຢູ່ໃນເຄື່ອງຂອງທ່ານ ເພື່ອໄວ້ໃຊ້ເວລາອອບໄລນ໌." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ກໍາລັງຂໍອະນຸຍາດເກັບຮັກສາຂໍ້ມູນໄວ້ຢູ່ໃນເຄື່ອງຂອງທ່ານ ເພື່ອໄວ້ໃຊ້ເວລາອອບໄລນ໌." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) ກໍາລັງຂໍການອະນຸຍາດເຂົ້າຫາທີ່ຕັ້ງຂອງທ່ານ." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) ກໍາລັງຂໍການອະນຸຍາດສະແດງການແຈ້ງເຕືອນ." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) ກໍາລັງຂໍການອະນຸຍາດໃຊ້ກ້ອງຂອງທ່ານ." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "​ເຕັມໜ້າ​ຈໍ" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ເຂົ້າໃຊ້ທີ່ຕັ້ງຂອງຜູ້ໃຊ້" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ໃຊ້/ເກັບຮັກສາຂໍ້ມູນເວັບ" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ໃຊ້ມີເດຍຂອງຜູ້ໃຊ້" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "ອະນຸຍາດໃຫ້ເວັບໄຊທ໌ນີ້ເຂົ້າໃຊ້ຂໍ້ມູນທີ່ຕັ້ງຂອງທ່ານ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "ອະນຸຍາດໃຫ້ເວັບໄຊທ໌ນີ້ບັນທຶກຂໍ້ມູນຈໍານວນຫຼາຍຢູ່ໃນເຄື່ອງຂອງທ່ານ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ອະນຸຍາດໃຫ້ເວັບໄຊທ໌ນີ້ປ່ຽນແປງການສະແດງຂຶ້ນເຕັມໜ້າຈໍ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "ອະນຸຍາດໃຫ້ເວັບໄຊທ໌ນີ້ໃຊ້ໄຟລ໌ມີເດຍທີ່ເກັບໄວ້ຢູ່ໃນເຄື່ອງຂອງທ່ານ." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "ອະນຸຍາດໃຫ້ເວັບໄຊທ໌ນີ້ສະແດງການແຈ້ງເຕືອນ." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ລຶບການຕັ້ງຄ່າແອັບມາດຕະຖານໂດຍໄປທີ່ ການຕັ້ງຄ່າ > ທົ່ວໄປ > ຈັດການແອພພລິເຄຊັນ > ທັງໝົດ." + +msgid "IDS_COM_BODY_DENY" +msgstr "ປະຕິເສດ" + diff --git a/po/lt.po b/po/lt.po new file mode 100755 index 0000000..3c71862 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Trinti" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Atšaukti" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Leisti" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tuščia" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Pradeda siųsti..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Svetainės nustatymai" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Nustatyti į numatytąjį" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Naudotojo vardas" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Reikalinga patvirtinti autentiškumą." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Įsiminti nuostatą." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatinis atnaujinimas" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Slaptažodis" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Iškilo problemų dėl šios svetainės apsaugos sertifikato." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web pranešimas" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) bando išsaugoti didelį duomenų kiekį jūsų įrenginyje, kad galėtų jais naudotis atsijungus." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) prašo leidimo išsaugoti duomenis jūsų įrenginyje ir naudotis jais atsijungus." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) prašo leidimo nustatyti jūsų vietą." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) prašo leidimo parodyti pranešimus." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) prašo leidimo naudoti jūsų fotoaparatą." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Visas ekranas" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Pasiekti naudotojo vietą" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Naudoti / saugoti žiniatinklio duomenis" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Naudoti naudotojo mediją" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Leidžia šiai svetainei gauti prieigą prie jūsų buvimo vietos informacijos." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Leidžia šiai svetainei išsaugoti didelį duomenų kiekį jūsų įrenginyje." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Leidžia šiai svetainei pakeisti rodymą į visą ekraną." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Leidžia šiai svetainei naudoti jūsų įrenginyje saugomus medijos failus." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Leidžia šiai svetainei atvaizduoti pranešimus." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Eidami į Nustatymai > Bendrieji nustatymai > Tvarkyti programas > Visos, išvalykite numatytuosius programos nustatymus." + +msgid "IDS_COM_BODY_DENY" +msgstr "Atmesti" + diff --git a/po/lv.po b/po/lv.po new file mode 100755 index 0000000..67d8356 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Dzēst" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Atcelt" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Atļaut" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tukšs" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Sāk lejupielādi..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Tīmekļa vietnes iestatījumi" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Atjaunot noklusējumu" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Lietotājvārds" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Nepieciešama autentifikācija." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Atcerēties preferenci." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automātiskā atsvaidzināšana" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Parole" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Šai vietnei ir radušās problēmas ar drošības sertifikātu." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Tīmekļa paziņojums" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) mēģina jūsu ierīcē saglabāt lielu datu apjomu lietošanai bezsaistē." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) pieprasa atļauju jūsu ierīcē saglabāt datus lietošanai bezsaistē." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) pieprasa atļauju piekļūt jūsu atrašanās vietai." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) pieprasa atļauju rādīt paziņojumus." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) pieprasa atļauju izmantot jūsu kameru." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pilnekrāns" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Piekļuve informācijai par lietotāja atrašanās vietu" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Izmantot/saglabāt tīmekļa datus" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Izmantot lietotāja datu nesēja ierīci" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Ļauj šai vietnei piekļūt jūsu atrašanās vietas informācijai." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Ļauj šai vietnei jūsu ierīcē saglabāt lielu daudzumu datu." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Ļauj šai vietnei mainīt displeju uz pilnekrāna režīmu." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Ļauj šai vietnei izmantot jūsu ierīcē saglabātos multivides failus." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Ļauj šai vietnei parādīt paziņojumus." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Lai notīrītu noklusējuma programmu iestatījumus, izvēlieties Iestatījumi > Vispārīgi > Pārvaldīt programmas > Visas." + +msgid "IDS_COM_BODY_DENY" +msgstr "Atteikt" + diff --git a/po/mk.po b/po/mk.po new file mode 100755 index 0000000..e0971d1 --- /dev/null +++ b/po/mk.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Избриши" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Откажи" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Дозволи" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Празно" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Почнува преземање..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Опции за сајт" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Ресетирај на основните вредности" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Корисничко име" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Се бара препознавање." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Запомни преференци." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Автоматско обновување" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Лозинка" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Има проблеми со безбедносниот сертификат на сајтот." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Мрежно известување" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) се обидува да сочува големо количество податоци на уредот за користење без интернет." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) бара дозвола да зачувува податоци на уредот за користење без интернет." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) бара дозвола да пристапи кон Вашата локација." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) бара дозвола да покажува известувања." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) бара дозвола да ја користи Вашата камера." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "На цел екран" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Пристап кон корисничка локација" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Користи/зачувај податоци од интернет" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Користи кориснички медиуми" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Дозволува интернет-страницата да пристапува до Вашите информации за локацијата." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Овозможува интернет-страницата да сочувува големи количества податоци на уредот." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Овозможува интернет-страницата да го менува приказот на цел екран." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Овозможува интернет-страницата да ги користи медиумските фајлови зачувани на уредот." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Овозможува интернет-страницата да прикажува известувања." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Избришете ги основните опции за апликациите во Опции > Општо > Управување со апликации > Сите." + +msgid "IDS_COM_BODY_DENY" +msgstr "Отфрли" + diff --git a/po/ml.po b/po/ml.po new file mode 100755 index 0000000..1ff8a28 --- /dev/null +++ b/po/ml.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ഇല്ലാതാ." + +msgid "IDS_BR_SK_CANCEL" +msgstr "റദ്ദാക്കു." + +msgid "IDS_BR_OPT_ALLOW" +msgstr "അനുവദിക്കൂ" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ശൂന്യം" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ഡൌണ്‍ലോഡ് ആരംഭിക്കുന്നു..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "വെബ്സൈറ്റ് ക്രമീകരണങ്ങള്‍" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "സ്ഥിരസ്ഥിതികളിലേക്ക് പുനസജ്ജമാക്കുക" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ഉപയോക്തൃ നാമം" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ആധാരീകരിക്കല്‍ ആവശ്യമാണ്." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "മുന്‍ഗണന ഓര്‍ക്കുക." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "യാന്ത്രികമായി പുതുക്കല്‍" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "പാസ്‌വേഡ്" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ഈ സൈറ്റിനായുള്ള സുരക്ഷാ സര്‍ട്ടിഫിക്കറ്റില്‍ പ്രശ്നങ്ങളുണ്ട്." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "വെബ് അറിയിപ്പ്" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ഓഫ്‌ലൈന്‍ ഉപയോഗത്തിനായി വലിയ തോതിലുള്ള ഡാറ്റ നിങ്ങളുടെ സാമഗ്രിയില്‍ സംഭരിക്കുന്നതിനായി %1$s (%2$s) ശ്രമിക്കുന്നു." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ഓഫ്‌ലൈന്‍ ഉപയോഗത്തിനായി നിങ്ങളുടെ സാമഗ്രിയില്‍ ഡാറ്റ സംഭരിക്കുന്നതിനുള്ള അനുമതി %1$s (%2$s) അഭ്യര്‍ത്ഥിക്കുന്നു." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "നിങ്ങളുടെ ലൊക്കേഷന്‍ ആക്സസ്സ് ചെയ്യുന്നതിനുള്ള അനുമതി %1$s (%2$s) അഭ്യര്‍ത്ഥിക്കുന്നു." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "അറിയിപ്പുകള്‍ കാണിക്കുന്നതിനുള്ള അനുമതി %1$s (%2$s) അഭ്യര്‍ത്ഥിക്കുന്നു." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "നിങ്ങളുടെ ക്യാമറ ആക്സസ്സ് ചെയ്യുന്നതിനുള്ള അനുമതി %1$s (%2$s) അഭ്യര്‍ത്ഥിക്കുന്നു." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "പൂര്‍‌ണ്ണ സ്‌ക്രീന്‍‌" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ഉപയോക്തൃ സ്ഥാനം ആക്സസ് ചെയ്യുക" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "വെബ് ഡാറ്റ ഉപയോഗിക്കുക/സംഭരിക്കുക" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "നിങ്ങളുടെ മീഡിയ ഉപയോഗിക്കുക" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "നിങ്ങളുടെ സ്ഥാന വിവരങ്ങൾ ആക്സസ് ചെയ്യാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നു." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "വലിയ തോതിലുള്ള ഡാറ്റ നിങ്ങളുടെ ഉപകരണത്തിൽ സംരക്ഷിക്കാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നു." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ഡിസ്പ്ലേ പൂർണ്ണ സ്ക്രീനാക്കി മാറ്റാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നു." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "നിങ്ങളുടെ ഉപകരണത്തിൽ സംഭരിച്ചിട്ടുള്ള മീഡിയ ഫയലുകൾ ഉപയോഗിക്കാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നു." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നു." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ക്രമീകരണങ്ങൾ > പൊതുവായവ > ആപ്ലിക്കേഷനുകൾ മാനേജ് ചെയ്യുക > എല്ലാം തുടങ്ങിയവയിലേക്ക് പോയി ഡിഫോൾട്ട് ആപ്ലിക്കേഷൻ ക്രമീകരണങ്ങൾ മായ്ക്കുക." + +msgid "IDS_COM_BODY_DENY" +msgstr "നിരസിക്കുക" + diff --git a/po/mn_MN.po b/po/mn_MN.po new file mode 100755 index 0000000..24e5502 --- /dev/null +++ b/po/mn_MN.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Устгах" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Цуцлах" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Зөвшөөрөх" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Хоосон" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Татан авалтыг эхлүүлж байна..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Вэбсайтын тохиргоо" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Өгөгдмөл утгыг сэргээх" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Хэрэглэгчийн нэр" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentication required." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Сонголт санах" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Автоматаар сэргээх" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Нууц үг" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Энэ сайтын хамгаалалтын гэрчилгээ асуудалтай байна" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Вэб мэдэгдэл" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) сүлжээнд холбоогүй ашиглах их хэмжээний өгөгдөл таны төхөөрөмж дээр хадгалахыг оролдож байна" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) сүлжээнд холбоогүй ашиглах өгөгдөл таны төхөөрөмж дээр хадгалах зөвшөөрөл хүсэж байна" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) таны байрлалд хандах зөвшөөрөл хүсэж байна" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) мэдэгдлүүд харуулах зөвшөөрөл хүсэж байна" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) таны камерыг ашиглах зөвшөөрөл хүсэж байна" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Бүтэн дэлгэц" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Хэрэглэгчийн байрлалд хандах" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Вэб өгөгдөл ашиглах/хадгалах" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Хэрэглэгчийн медиа ашиглах" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Энэ сайтад таны байрлалын мэдээлэлд нэвтрэхийг зөвшөөрнө" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Энэ сайтад таны төхөөрөмж дээр их хэмжээний өгөгдөл хадгалахыг зөвшөөрнө" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Энэ сайтад дэлгэцийг дүүрэн болгож өөрчлөхийг зөвшөөрнө" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Энэ сайтад таны төхөөрөмж дээр хадгалсан медиа файлууд ашиглахыг зөвшөөрнө" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Энэ сайтад мэдэгдлүүд харуулахыг зөвшөөрнө" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Тохиргоо > Ерөнхий > Програмууд удирдах > Бүгд рүү очиж өгөгдмөл програмын тохиргоог арилга" + +msgid "IDS_COM_BODY_DENY" +msgstr "Татгалзах" + diff --git a/po/mr.po b/po/mr.po new file mode 100755 index 0000000..5e348eb --- /dev/null +++ b/po/mr.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "हटवा" + +msgid "IDS_BR_SK_CANCEL" +msgstr "रद्द" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "अनुमती द्या" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "रिकामा" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "डाऊनलोड सुरू करीत आहे..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "वेबसाईट सेटिंग्स" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "डिफॉल्टमध्ये पुन्हा मांडणी करा." + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "वापरकर्त्याचे नाव" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "प्रमाणीकरण आवश्यक." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "प्राधान्य लक्षात ठेवा." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "स्‍वयं रिफ्रेश" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "पासवर्ड" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "या संकेतस्थळाच्या सुरक्षा प्रमाणपत्रा बाबत समस्या आहेत." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "वेब अधिसूचना" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ऑफलाइन वापरासाठी आपल्‍या उपकरणवर डेटाची मोठी राशी संग्रहित करण्‍याचा प्रयत्‍न करत आहे." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ऑफलाइन वापरासाठी आपल्‍या उपकरणवर डेटा संग्रहित करण्‍याकरिता परवानगीची विनंती करत आहे." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) आपले स्‍थान ऍक्‍सेस करण्‍याकरिता परवानगीसाठी विनंती करत आहे." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) अधिसूचना दर्शविण्‍याकरिता परवानगीची विनंती करत आहे." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) आपला कॅमेरा वापरण्‍याकरिता परवानगीसाठी विनंती करत आहे." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "पूर्ण स्क्रीन" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "प्रयोक्ता स्‍थान ऍक्‍सेस करा" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "वेब डेटा वापरा/संग्रहित करा" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "प्रयोक्‍ता मीडिया वापरा" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "आपली स्‍थान माहिती ऍक्‍सेस करण्‍यासाठी ह्या साइटला अनुमती देते." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "आपल्‍या उपकरणावर डेटाची अधिक मात्रा जतन करण्‍यासाठी ह्या साइटला अनुमती देते." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ह्या साइटला संपूर्ण स्‍क्रीनवर प्रदर्शन बदलण्‍याची अनुमती देते." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "आपल्‍या उपकरणावर जतन केलेल्‍या मिडिया फाइल्‍स वापरण्‍यासाठी ह्या साइटला अनुमती देते." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "ह्या साइटला अधिसूचना प्रदर्शित करण्‍याची अनुमती देते." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "सेटिंग्स > सामान्‍य > अनुप्रयोग व्यवस्थापित करा > सर्व वर जाऊन डीफॉल्ट अनुप्रयोग सेटिंग्स साफ करा." + +msgid "IDS_COM_BODY_DENY" +msgstr "नकार द्या" + diff --git a/po/ms.po b/po/ms.po new file mode 100755 index 0000000..993c6f0 --- /dev/null +++ b/po/ms.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Padam" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Batal" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Benarkan" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Kosong" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Memulakan muat turun..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Aturan laman web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Tetap semula ke lalai" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nama pengguna" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Pengesahan Diperlukan." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Ingat keutamaan." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Auto muat semula" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Kata laluan" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Terdapat masalah dengan sijil keselamatan untuk tapak ini." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Pemberitahuan web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) cuba menyimpan sejumlah besar data pada peranti anda untuk kegunaan luar talian." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) meminta kebenaran menyimpan data pada peranti anda untuk kegunaan luar talian." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) meminta kebenaran mencapai lokasi anda." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) meminta kebenaran menunjukkan pemberitahuan." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) meminta kebenaran menggunakan kamera anda." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Skrin penuh" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Mencapai lokasi pengguna" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Guna/simpan data web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Guna media pengguna" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Membenarkan tapak ini untuk mencapai maklumat lokasi." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Membenarkan tapak ini menjimatkan jumlah data yang banyak pada peranti anda." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Membenarkan tapak ini untuk mengubah paparan ke skrin penuh." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Membenarkan tapak ini untuk menggunakan fail media yang disimpan dalam peranti anda." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Membenarkan tapak ini untuk memaparkan pemberitahuan." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Kosongkan aturan aplikasi lalai dengan pergi ke Aturan > Am > Uruskan aplikasi > Semua." + +msgid "IDS_COM_BODY_DENY" +msgstr "Nafi" + diff --git a/po/my.po b/po/my.po new file mode 100755 index 0000000..d1d781d --- /dev/null +++ b/po/my.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ဖ်က္" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ပယ္ဖ်က္" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "ခြင့္ျပဳပါ" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "အားလုံးရွင္းထုတ္ပစ္ၿပီး" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "လႊဲေျပာင္းကူးယူမႈစတင္ေနပါသည္.." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ဝက္ဆိုက္ သတ္မွတ္ခ်က္မ်ား" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ႀကိဳတင္စီစဥ္ထားမႈသုိ႔ ျပန္လည္သတ္မွတ္ပါ" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "သုံးစြဲသူ အမည္" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Authentication required." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ပိုမိုႏွစ္သက္မႈမ်ားကို မွတ္ထားပါ" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "အလိုလို လန္းဆန္းျခင္း" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "စကား၀ွက္" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ဤဆိုက္အတြက္ လံုျခံဳေရး ေအာင္လက္မွတ္ႏွင့္ပတ္သက္၍ ျပသာနာမ်ား ရွိေနပါသည္။" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ဝဘ္ အေၾကာင္းၾကားစာ" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "အြန္လိုင္းသံုးရန္ သင့္ကိရိယာေပၚတြင္ %1$s (%2$s) က ေဒတာ အေျမာက္အမ်ား သိုေလွာင္ရန္ ၾကိဳးပမ္းေနသည္။" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ေအာ့ဖ္လိုင္း သံုးရန္ သင့္ကိရိယာေပၚ ေဒတာသိုေလွာင္ရန္ %1$s (%2$s) က အခြင့္ေတာင္းခံေနသည္။" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "သင့္တည္ေနရာကို ဝင္ေရာက္ရန္ %1$s (%2$s) က အခြင့္ေတာင္းခံေနသည္။" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "အသိေပးခ်က္မ်ား ျပရန္ %1$s (%2$s) က အခြင့္ေတာင္းခံေနသည္။" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "သင့္ ကင္မရာသံုးရန္ %1$s (%2$s) က အခြင့္ေတာင္းခံေနသည္။" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "ဖန္သားျပင္ အျပည့္" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "သံုးသူ တည္ေနရာ ဝင္ေရာက္ပါ" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ဝဘ္ေဒတာ သံုးပါ/သိမ္းပါ" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "သင့္မီဒီယာ သံုးပါ" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "ဤဆိုက္အား သင့္တည္ေနရာ အခ်က္အလက္သို႔ ဝင္ေရာက္ရန္ ခြင့္ျပဳပါ။" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "ဤဆိုက္အား သင့္ကိရိယာေပၚမွာ ၾကီးမားသည့္ေဒတာ သိမ္းထားရန္ ခြင့္ျပဳပါ။" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ဤဆိုက္အား ျပသခ်က္ကို ဖန္သားျပင္အျပည့္သို ႔ေျပာင္းရန္ ခြင့္ျပဳပါ။" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "ဤဆိုက္အား သင့္ကိရိယာေပၚမွာ မီဒီယာဖိုင္မ်ား သိမ္းထားရန္ ခြင့္ျပဳပါ။" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "ဤဆိုက္အား အသိေပးခ်က္မ်ား ျပသရန္ ခြင့္ျပဳပါ။" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ဆက္တင္မ်ား > အေထြေထြ > အပလီေကးရွင္းမ်ား စီမံပါ > အားလံုး သို႔သြားျပီး အသင့္သြင္းထားသည့္ အက္ပ္ဆက္တင္မ်ား ရွင္းပါ။" + +msgid "IDS_COM_BODY_DENY" +msgstr "ျငင္းဆိုပါ" + diff --git a/po/nb.po b/po/nb.po new file mode 100755 index 0000000..c2df359 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Slett" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Avbryt" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Tillat" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tom" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Starter nedlasting..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Innstillinger for webområde" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Tilbakestill til standard" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Brukernavn" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Krever godkjenning." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Husk preferanse." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatisk oppdatering" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Passord" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Det er problemer med sikkerhetssertifikatet for dette området." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Webvarsel" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) forsøker å lagre store mengder data på enheten din for bruk i frakoblet modus." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ber om tillatelse til å lagre data på enheten din for bruk i frakoblet modus." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) ber om tillatelse til å få tilgang til plasseringen din." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) ber om tillatelse til å vise varsler." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) ber om tillatelse til å bruke kameraet ditt." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Fullskjerm" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Tilgang til brukerens plassering" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Bruk/lagre nettdata" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Bruk brukermedier" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Gir dette området tilgang til plasseringsinformasjonen din." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Gir dette området tillatelse til å lagre en stor mengde data på enheten din." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Gir dette området tillatelse til å endre visningen til fullskjermsvisning." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Gir dette området tillatelse til å bruke mediefilene som er lagret på enheten din." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Gir dette området tillatelse til å vise varsler." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Fjern standard appinnstillinger ved å gå til Innstillinger > Generelt > Administrer apper > Alle." + +msgid "IDS_COM_BODY_DENY" +msgstr "Avslå" + diff --git a/po/ne.po b/po/ne.po new file mode 100755 index 0000000..415573f --- /dev/null +++ b/po/ne.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "मेटाउनु" + +msgid "IDS_BR_SK_CANCEL" +msgstr "रद्द" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "अनुमति दिनुहोस्" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "खाली" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "डाउनलोड सुरू भयो..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "वेबसाइट सेटिङहरु" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "पूर्वनिर्धारितमा रिसेट गर" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "प्रयोगकर्ता नाम" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "प्रमाणीकरण आवश्यक हुन्छ।" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "प्राथमिकता सम्झनुहोस्।" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "स्वत: रिफ्रेश गर्नुहोस्" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "पासवर्ड" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "यस साइटका लागि सुरक्षा प्रमाणपत्रसंग केही समस्याहरू छन्।" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "वेब सूचना" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) अफलाइन प्रयोगको लागि तपाईको यन्त्रमा डाटाको ठूलो मात्रामा भण्डार गर्ने प्रयास गर्दैछ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) अफलाइन प्रयोगको लागि तपाईंको यन्त्रमा डाटा भण्डार गर्न अनुमति को अनुरोध गर्दैछ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) तपाईको स्थान एक्सेस गर्नको लागि अनुमति को अनुरोध गर्दैछ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) सूचनाहरू देखाउन अनुमतिको लागि अनुरोध गर्दैछ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) तपाईको क्यामराको प्रयोग गर्न अनुमतिको लागि अनुरोध गर्दैछ।" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "पूर्ण स्क्रीन" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "प्रयोगकर्ता स्थान एक्सेस गर्नुहोस्" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "प्रयोग/वेब डाटा भण्‍डारण गर्नुहोस्" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "प्रयोगकर्ता मिडिया प्रयोग गर्नुहोस्" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "यो साइटलाई तपाईको स्थान जानकारी एक्सेस गर्न अनुमति दिन्छ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "यो साइटलाई तपाईको यन्त्रमा डाटाको ठूलो मात्रा सुरक्षित गर्न अनुमति दिन्छ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "यो साइटलाई पूरा स्क्रीनमा प्रर्दशन गर्न परिवर्तन गर्न अनुमति दिन्छ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "यो साइटलाई तपाईको यन्त्रमा भण्डारण गरिएका मिडिया फाइलहरू प्रयोग गर्न अनुमति दिन्छ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "यो साइटलाई सूचनाहरू प्रर्दशन गर्न अनुमति दिन्छ।" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "सेटिङ्हरू > सामान्य > अनुप्रयोगहरू व्यवस्थापन गर्नुहोस् > सबै मा गएर पूर्वनिर्धारित एप सेटिङहरू खाली गर्नुहोस्।" + +msgid "IDS_COM_BODY_DENY" +msgstr "नकार" + diff --git a/po/nl_NL.po b/po/nl_NL.po new file mode 100755 index 0000000..b8e643f --- /dev/null +++ b/po/nl_NL.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Wissen" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Annuleren" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Toestaan" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Leeg" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Downloaden starten..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Website-instellingen" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Standaardinstellingen" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Gebruikersnaam" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Verificatie vereist." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Voorkeur onthouden" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Autom. vernieuwen" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Wachtwoord" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Er zijn problemen met het beveiligingscertificaat voor deze site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Webmelding" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) probeert een grote hoeveelheid gegevens op uw apparaat op te slaan voor offline gebruik." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) vraagt toestemming om gegevens op uw apparaat op te slaan voor offline gebruik." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) vraagt toestemming voor toegang tot uw locatie." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) vraagt toestemming voor het weergeven van meldingen." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) vraagt toestemming om uw camera te gebruiken." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Volledig scherm" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Toegang tot gebruikerslocatie" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Webgegevens gebruiken/opslaan" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Media van gebruiker toepassen" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Deze site heeft toegang tot uw locatiegegevens." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Deze site mag een grote hoeveelheid gegevens op uw apparaat opslaan." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Deze site mag de weergave naar volledig scherm wijzigen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Deze site mag de mediabestanden gebruiken die op uw apparaat zijn opgeslagen." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Deze site mag meldingen weergeven." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Wis standaard app-instellingen via Instellingen > Algemeen > Applicaties beheren > Alle." + +msgid "IDS_COM_BODY_DENY" +msgstr "Afwijzen" + diff --git a/po/or.po b/po/or.po new file mode 100755 index 0000000..91d43bf --- /dev/null +++ b/po/or.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ବିଲୋପ" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ବାତିଲ୍" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "ଅନୁମତି" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ଖାଲି" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ଡାଉନ୍‌ଲୋଡ୍‌ ଆରମ୍ଭ କରୁଛି..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ୱେବସାଇଟ୍ ସେଟିଂଗୁଡିକ" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ଡିଫଲ୍ଟକୁ ପୁନଃସେଟ୍ କରନ୍ତୁ" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ଉପଭୋକ୍ତାନାମ" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ପ୍ରାମାଣିକରଣ ଆବଶ୍ୟକ।" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ଅଗ୍ରାଧିକାର ମନେ ରଖନ୍ତୁ।" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ସ୍ଵତଃ ସତେଜ" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "ପାସ୍‌ୱାର୍ଡ୍" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ଏହି ସାଇଟ୍ ପାଇଁ ସୁରକ୍ଷା ସାର୍ଟିଫିକେଟ୍ ସହିତ ଅସୁବିଧା ଅଛି।" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ୱେବ୍ ସୂଚନା" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ଅଫ୍‌ଲାଇନ୍ ବ୍ୟବହାର ପାଇଁ %1$s (%2$s) ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ଏକ ବୃହତ୍ ପରିମାଣର ଡାଟା ଷ୍ଟୋର୍ କରିବାକୁ ଉଦ୍ୟମ କରୁଛି।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "ଅଫ୍‌ଲାଇନ୍ ବ୍ୟବହାର ପାଇଁ %1$s (%2$s) ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ଡାଟା ଷ୍ଟୋର୍ କରିବାକୁ ଅନୁରୋଧ କରୁଛି।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "ଆପଣଙ୍କ ଅବସ୍ଥାନ ପ୍ରବେଶ କରିବାକୁ %1$s (%2$s) ଅନୁମତି ଅନୁରୋଧ କରୁଛି।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "ବିଜ୍ଞପ୍ତି ଦେଖାଇବାକୁ %1$s (%2$s) ଅନୁମତି ଅନୁରୋଧ କରୁଛି।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "ଆପଣଙ୍କ କ୍ୟାମେରା ବ୍ୟବହାର କରିବାକୁ %1$s (%2$s) ଅନୁମତି ଅନୁରୋଧ କରୁଛି।" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "ପୂର୍ଣ୍ଣ ପରଦା" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ଉପଭୋକ୍ତାଙ୍କ ଅବସ୍ଥାନ ଆକସେସ୍ କରନ୍ତୁ" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ୱେବ୍ ଡାଟା ବ୍ୟବହାର/ଷ୍ଟୋର୍ କରନ୍ତୁ" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ଉପଭୋକ୍ତା ମିଡିଆ ବ୍ୟବହାର କରନ୍ତୁ" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "ଆପଣଙ୍କ ଅବସ୍ଥାନ ସୂଚନା ଆକସେସ୍ କରିବାକୁ ଏହି ସାଇ‌ଟ୍‌କୁ ଅନୁମତି ଦିଏ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ବହୁତ ପରିମାଣର ଡାଟା ସଞ୍ଚୟ କରିବାକୁ ଏହି ସାଇଟ୍‌କୁ ଅନୁମତି ଦିଏ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ପ୍ରଦର୍ଶନ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍‌କୁ ପରିବର୍ତ୍ତନ କରିବାକୁ ଏହି ସାଇଟ୍‌କୁ ଅନୁମତି ଦିଏ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ସଞ୍ଚିତ ଥିବା ମିଡିଆ ଫାଇଲ୍‌‌ଗୁଡିକ ବ୍ୟବହାର କରିବାକୁ ଏହି ସାଇଟ୍‌କୁ ଅନୁମତି ଦିଏ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "ବିଜ୍ଞପ୍ତି ପ୍ରଦର୍ଶନ କରିବାକୁ ଏହି ସାଇଟ୍‌କୁ ଅନୁମତି ଦିଏ।" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ସେଟିଂ > ସାଧାରଣ > ଆପ୍ଲିକେସନ୍‌ଗୁଡିକ ପରିଚାଳନା > ସମସ୍ତକୁ ଯାଇ ଡିଫଲ୍ଟ୍ ଆପ୍ଲିକେସନ୍ ସେଟିଂ ଖାଲି କରନ୍ତୁ।" + +msgid "IDS_COM_BODY_DENY" +msgstr "ଅଗ୍ରାହ୍ୟ" + diff --git a/po/pa.po b/po/pa.po new file mode 100755 index 0000000..18c89f1 --- /dev/null +++ b/po/pa.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ਮਿਟਾਓ" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ਰੱਦ ਕਰੋ" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "ਆਗਿਆ ਦਿਉ" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ਖਾਲੀ" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ਵੈੱਬਸਾਈਟ ਸੈੱਟਿੰਗਸ" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "ਡਿਫਾੱਲਟ ਤੇ ਰੀਸੈੱਟ ਕਰੋ" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ਉਪਯੋਗਕਰਤਾ ਦਾ ਨਾਂ" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ਪ੍ਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੈ।" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ਤਰਜੀਹ ਨੂੰ ਯਾਦ ਰੱਖੋ।" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ਸਵੈ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "ਪਾਸਵਰਡ" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ਇਸ ਸਾਈਟ ਦੇ ਲਈ ਸੁਰੱਖਿਆ ਸਰਟੀਫੀਕੇਟ ਵਿੱਚ ਸਮੱਸਿਆਵਾਂ ਹਨ।" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ਵੈੱਬ ਸੂਚਨਾ" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ਔਫਲਾਈਨ ਉਪਯੋਗ ਲਈ ਤੁਹਾਡੇ ਡਿਵਾਈਸ 'ਤੇ ਵੱਡੀ ਮਾਤਰਾ ਵਿੱਚ ਡੈਟਾ ਸੰਭਾਲਣ ਦਾ ਯਤਨ ਕਰ ਰਿਹਾ ਹੈ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ਔਫਲਾਈਨ ਉਪਯੋਗ ਵਾਸਤੇ ਤੁਹਾਡੇ ਡਿਵਾਈਸ 'ਤੇ ਡੈਟਾ ਸੰਭਾਲਣ ਦੀ ਆਗਿਆ ਲੈਣ ਲਈ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) ਤੁਹਾਡੀ ਸਥਿਤੀ 'ਤੇ ਐਕਸੈੱਸ ਕਰਨ ਦੀ ਆਗਿਆ ਲੈਣ ਲਈ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) ਸੂਚਨਾਵਾਂ ਦਿਖਾਉਣ ਦੀ ਆਗਿਆ ਲੈਣ ਲਈ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) ਤੁਹਾਡੇ ਕੈਮਰੇ ਦਾ ਉਪਯੋਗ ਕਰਨ ਦੀ ਆਗਿਆ ਲੈਣ ਲਈ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ।" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "ਪੂਰਨ ਸਕ੍ਰੀਨ" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "ਉਪਯੋਗਕਰਤਾ ਦਾ ਸਥਾਨ ਐਕਸੈੱਸ ਕਰੋ" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ਵੈੱਬ ਡੈਟਾ ਉਪਯੋਗ/ਸਟੋਰ ਕਰੋ" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ਉਪਯੋਗਕਰਤਾ ਮੀਡੀਆ ਉਪਯੋਗ ਕਰੋ" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "ਇਸ ਸਾਈਟ ਨੂੰ ਤੁਹਾਡੀ ਸਥਾਨ ਦੀ ਜਾਣਕਾਰੀ ਐਕਸੈੱਸ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਉ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "ਇਸ ਸਾਈਟ ਨੂੰ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਤੇ ਵੱਡੀ ਮਾਤਰਾ ਵਿੱਚ ਡੈਟਾ ਸੁਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਉ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ਇਸ ਸਾਈਟ ਨੂੰ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿਉ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "ਇਸ ਸਾਈਟ ਨੂੰ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਤੇ ਸਟੋਰ ਕੀਤੀ ਮੀਡੀਆ ਫਾਈਲਾਂ ਨੂੰ ਉਪਯੋਗ ਕਰਨ ਦਈ ਆਗਿਆ ਦਿਉ।" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "ਇਸ ਸਾਈਟ ਨੂੰ ਸੂਚਨਾਵਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਉ।" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ਸੈੱਟਿੰਗਸ > ਸਧਾਰਨ > ਅਨੁਪ੍ਰਯੋਗ ਪ੍ਰਬੰਧਕ > ਸਾਰੇ ਤੇ ਜਾ ਕੇ ਡਿਫਾੱਲਟ ਅਨੁਪ੍ਰਯੋਗ ਸੈੱਟਿੰਗਸ ਨੂੰ ਹਟਾਓ।" + +msgid "IDS_COM_BODY_DENY" +msgstr "ਅਸਵੀਕਾਰ" + diff --git a/po/pl.po b/po/pl.po new file mode 100755 index 0000000..37a263d --- /dev/null +++ b/po/pl.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Usuń" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Anuluj" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Zezwalaj" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Puste" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Rozpoczynanie pobierania..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Ustawienia witryn internetowych" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Przywróć domyślne" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nazwa użytkownika" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Wymagane uwierzytelnianie." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Zapamiętaj preferencje." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatyczne odświeżanie" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Hasło" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Wystąpiły problemy z certyfikatem zabezpieczeń dla tej witryny." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Powiadomienie internetowe" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) próbuje zapisać dużą ilość danych na Twoim urządzeniu do korzystania offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) żąda zezwolenia na zapisanie danych na Twoim urządzeniu do korzystania offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) żąda zezwolenia na dostęp do Twojej lokalizacji." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) żąda zezwolenia na pokazanie powiadomień." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) żąda zezwolenia na korzystanie z Twojego aparatu." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Pełny ekran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Dostęp do lokalizacji użytkownika" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Użyj danych internetowych/zapisz dane internetowe" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Użyj plików multimedialnych użytkownika" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Umożliwia tej stronie dostęp do informacji o lokalizacji." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Umożliwia tej stronie zapisywanie dużej ilość danych na urządzeniu." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Umożliwia tej stronie zmianę trybu wyświetlania na pełnoekranowy." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Umożliwia tej stronie wykorzystywanie plików multimedialnych zapisanych w urządzeniu." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Umożliwia tej stronie wyświetlanie powiadomień." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Wyczyść domyślne ustawienia aplikacji, przechodząc do opcji Ustawienia > Ogólne > Zarządzaj aplikacjami > Wszystkie." + +msgid "IDS_COM_BODY_DENY" +msgstr "Odrzuć" + diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100755 index 0000000..5e2692e --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Apagar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permitir" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vazio" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Iniciando download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Configurações de site da Internet" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Restaurar padrão" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Usuário" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticação solicitada." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Lembrar preferência." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Atualizar automaticamente" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Senha" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Existem problemas com o certificado de segurança para este site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Aviso da web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está tentando armazenar uma grande quantidade de dados no seu dispositivo para uso offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está solicitando permissão para armazenar dados no seu dispositivo para uso offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) está solicitando permissão para acessar sua localização." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) está solicitando permissão para exibir notificações." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) está solicitando permissão para usar a câmera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Tela cheia" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Acesso à localização do usuário" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Usar/armazenar dados da web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Usar mídia do usuário" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite que este site acesse informações da sua localização." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite que este site salve uma grande quantidade de dados no seu dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite que este site altere a exibição para tela cheia." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite que este site use os arquivos de mídia armazenados no seu dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite que este site exiba notificações." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Apagar as configurações padrão do aplicativo indo para Configurações > Gerais > Gerenciar aplicativos > Todos." + +msgid "IDS_COM_BODY_DENY" +msgstr "Declinar" + diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100755 index 0000000..4a76396 --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Eliminar" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Cancelar" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Permitir" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Vazio" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "A iniciar transferência..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Definições de site da Web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Repor padrão" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nome de utilizador" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Autenticação requerida." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Lembrar preferência." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Actualização auto" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Palavra-passe" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Existem problemas com o certificado de segurança para este site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificação Web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está a tentar guardar uma grande quantidade de dados no seu dispositivo para utilização offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) está a pedir permissão para guardar uma grande quantidade de dados no seu dispositivo para utilização offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) está a pedir permissão para aceder à sua localização." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) está a pedir permissão para mostrar notificações." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) está a pedir permissão para utilizar a sua câmara." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Ecrã inteiro" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Aceder à localização do utilizador" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Utilizar/guardar dados da Web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Utilizar multimédia de utilizador" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite a este site aceder às suas informações de localização." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite a este site guardar uma grande quantidade de dados no seu dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite a este site alterar a apresentação para ecrã inteiro." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite a este site utilizar ficheiros multimédia guardados no seu dispositivo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite a este site apresentar notificações." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Limpe as predefinições das aplicações acedendo a Definições > Geral > Gestor de aplicações > Tudo." + +msgid "IDS_COM_BODY_DENY" +msgstr "Declinar" + diff --git a/po/ro.po b/po/ro.po new file mode 100755 index 0000000..d2c0917 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Ştergere" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Anulare" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Se permite" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Liber" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Se începe descărcarea..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Setări pentru site-uri web" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Reiniţializare la valori implicite" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Nume utilizator" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Se solicită autentificare." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Reţinere preferinţe" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Reîmprospătare automată" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Parolă" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Au apărut probleme privind certificatul de securitate pentru acest site." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notificare Web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) încearcă să salveze un volum mare de date pe dispozitivul dvs. pentru utilizarea offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) solicită permisiunea de a salva date pe dispozitivul dvs. pentru utilizarea offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) solicită permisiunea de a vă accesa locaţia." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) solicită permisiunea de a afişa notificări." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) solicită permisiunea de a vă utiliza camera foto." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Ecran complet" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Accesarea locaţiei utilizatorului" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Utilizarea/stocarea datelor web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Utilizarea conţinutului media al utilizatorului" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Permite acestui site să acceseze informaţiile privind locaţia dvs." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Permite acestui site să salveze un volum mare de date pe dispozitivul dvs." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Permite acestui site să treacă la afişarea pe ecran complet." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Permite acestui site să utilizeze fişierele media stocate pe dispozitivul dvs." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Permite acestui site să afişeze notificări." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Ştergeţi setările implicite ale aplicaţiei accesând Setări > General >Gestionare aplicaţii > Toate." + +msgid "IDS_COM_BODY_DENY" +msgstr "Refuzare" + diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100755 index 0000000..8060d06 --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Удалить" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Отмена" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Разрешить" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Пусто" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Начало загрузки..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Настройки веб-сайтов" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Восстановить настройки по умолчанию" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Имя пользователя" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Требуется проверка подлинности." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Запомнить настройки." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Автообновление" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Пароль" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Проблемы с сертификатом безопасности этого сайта." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Веб-уведомление" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) пытается сохранить большой объем данных на устройстве для использования в автономном режиме." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) запрашивает разрешение на хранение данных на устройстве для использования в автономном режиме." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) запрашивает разрешение на доступ к местоположению." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) запрашивает разрешение на отображение уведомлений." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) запрашивает разрешение на использование камеры." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Во весь экран" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Доступ к данным о местонахождении пользователя" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Использование/хранение веб-данных" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Использовать пользовательское мультимедиа" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Позволяет сайту получать доступ к данным о вашем местонахождении." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Позволяет сайту сохранять большой объем данных на устройстве." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Позволяет сайту переключаться в полноэкранный режим." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Позволяет приложению использовать файлы мультимедиа, хранящиеся на устройстве." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Позволяет сайту выводить уведомления." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Чтобы больше не использовать приложение по умолчанию, удалите его назначение в меню “Параметры” > “Общие” > “Управление приложениями” > “Все”." + +msgid "IDS_COM_BODY_DENY" +msgstr "Запретить" + diff --git a/po/si.po b/po/si.po new file mode 100755 index 0000000..90b03a3 --- /dev/null +++ b/po/si.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "මකන්න" + +msgid "IDS_BR_SK_CANCEL" +msgstr "අව. කර" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "ඉඩ දෙන්න" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "හිස්" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "බාගැනුම අරඹමින්..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "වෙබ්අඩවි සැකසුම්" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "පෙරනිමියට නැවත සකසන්න" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "භාවිතා කරනනාගේ නම" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "සත්‍යාපනය අවශ්‍යයයි." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "කැමැත්ත මතක තබා ගන්න." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "ස්වයංව නැවුම් කරන්න" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "මුරපදය" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "මෙම අඩවිය සඳහා ආරක්ෂණ සහතිකයේ ප්‍රශ්න පවතී." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "වෙබ් දැනුම්දීම" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) නොබැඳි භාවිතය සඳහා ඔබගේ උපාංගය මත විශාල දත්ත ප්‍රමාණයක් ගබඩා කිරීමට උත්සාහ කරමින් සිටී." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) නොබැඳි භාවිතය සඳහා ඔබගේ උපාංගය මත දත්ත ගබඩා කිරීමට අවසරය ඉල්ලමින් සිටී." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) ඔබගේ පිහිටීම වෙත ප්‍රවේශ වීමට අවසර ඉල්ලමින් සිටී." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) දැනුම්දීම් පෙන්වීමට අවසර ඉල්ලමින් සිටී." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) ඔබගේ කැමරාව භාවිතා කිරීමට අවසරය ඉල්ලමින් සිටී." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "සම්පූර්ණ තිරය" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "පරිශීලක පිහිටීම ප්‍රවේශ වන්න" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "වෙබ දත්ත භාවිතා කරන්න/ගබඩා කරන්න" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "පරිශීලක මාධ්‍යය භාවිතා කරන්න" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "ඔබගේ පිහිටීම් තොරතුරු ප්‍රවේශ වීමට මෙම අඩවියට ඉඩ දෙයි." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "ඔබගේ උපාංගය මත විශාල දත්ත ප්‍රමාණයක් සුරැකීමට මෙම අඩවියට ඉඩ දෙයි." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "පුන් තිරය වෙත සංදර්ශනය වෙනස් කිරීමට මෙම අඩවියට ඉඩ දෙයි." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "ඔබගේ උපාංගය මත ගබඩා කර ඇති මාධ්‍ය ගොනු භාවිතා කිරීමට මෙම අඩවියට ඉඩ දෙයි." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "දැනුම්දීම් සංදර්ශනය කිරීමට මෙම අඩවියට ඉඩ දෙයි." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "සැකසුම් > සාමාන්‍ය > යෙදුම් කළමනාකරණය කරන්න > සියලු වෙත යාමෙන් පෙරනිමි යෙදුම් සැකසුම් හිස් කරන්න." + +msgid "IDS_COM_BODY_DENY" +msgstr "ප්‍රතික්ෂේප කරන්න" + diff --git a/po/sk.po b/po/sk.po new file mode 100755 index 0000000..8fd9e46 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Odstrániť" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Zrušiť" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Povoliť" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Prázdny" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Spúšťa sa sťahovanie..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Nastavenia webovej lokality" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Obnoviť predvolené" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Užívateľské meno" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Vyžaduje sa overenie." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Zapamätať predvoľbu" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatické obnovenie" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Heslo" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Vyskytli sa problémy s bezpečnostným certifikátom pre túto lokalitu." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Webové oznámenie" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) sa pokúša uložiť veľké množstvo údajov do vášho zariadenia na používanie v režime offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) žiada o povolenie uložiť údaje do vášho zariadenia na používanie v režime offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) žiada o povolenie na prístup k vášmu umiestneniu." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) žiada o povolenie zobrazovať oznámenia." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) žiada o povolenie používať váš fotoaparát." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Celá obrazovka" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Prístup k lokalizačným informáciám používateľa" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Používanie/ukladanie webových údajov" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Používanie používateľských médií" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Umožňuje tejto lokalite prístup k vašim lokalizačným informáciám." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Umožňuje tejto lokalite ukladať veľké objemy údajov do zariadenia." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Umožňuje tejto lokalite prepnúť zobrazenie na celú obrazovku." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Umožňuje tejto lokalite používať mediálne súbory uložené v zariadení." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Umožňuje tejto lokalite zobrazovať oznámenia." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Vymažte predvolené nastavenia aplikácie v menu Nastavenia > Všeobecné > Spravovať aplikácie > Všetky." + +msgid "IDS_COM_BODY_DENY" +msgstr "Odmietnuť" + diff --git a/po/sl.po b/po/sl.po new file mode 100755 index 0000000..d4f0db1 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Izbriši" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Prekliči" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Dovoli" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Prazno" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Začenjam prenos ..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Nastavitve spletnega mesta" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Ponastavi na privzeto" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Uporabniško ime" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Potrebno je overjanje." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Zapomni si prednostne nastavitve." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Samodejno osveževanje" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Geslo" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Za to spletno mesto obstajajo težave z varnostnim certifikatom." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Spletno obvestilo" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) poskuša shraniti veliko količino podatkov v vašo napravo za uporabo brez povezave." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) zahteva dovoljenje za shranjevanje podatkov v vašo napravo za uporabo brez povezave." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) zahteva dovoljenje za dostop do vaše lokacije." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) zahteva dovoljenje za prikaz obvestil." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) zahteva dovoljenje za uporabo kamere." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Celotni zaslon" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Dostop do lokacije uporabnika" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Uporaba/shranjevanje spletnih podatkov" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Uporaba uporabniških medijev" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Temu spletnemu mestu omogoča dostop do lokacijskih podatkov." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Temu spletnemu mestu omogoča shranjevanje velikih količin podatkov v napravo." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Temu spletnemu mestu omogoča spreminjanje v celozaslonski način prikaza." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Temu spletnemu mestu omogoča uporabo predstavnostnih datotek, shranjenih v napravi." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Temu spletnemu mestu omogoča prikaz obvestil." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Izbrišite privzete nastavitve aplikacije v meniju Nastavitve > Splošno > Upravljanje aplikacij > Vse." + +msgid "IDS_COM_BODY_DENY" +msgstr "Zavrnjeno" + diff --git a/po/sr.po b/po/sr.po new file mode 100755 index 0000000..1f26f69 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Obriši" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Poništi" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Dozvoli" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Prazno" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Počinje preuzimanje..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Podešavanja sajta" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Resetuj na podrazumevano" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Korisničko ime" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Potrebna je autentikacija." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Zapamti željenu vrednost." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Automatsko osvežavanje" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Šifra" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Postoje problemi sa bezbednosnim sertifikatom za ovaj sajt." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web obaveštenje" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) pokušava da sačuva veliku količinu podataka na tvoj uređaj za offline korišćenje." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) traži dozvolu da sačuva podatke na tvoj uređaj za offline korišćenje." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) traži dozvolu za pristup tvojoj lokaciji." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) traži dozvolu za prikazivanje obaveštenja." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) traži dozvolu za korišćenje tvoje kamere." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Celi ekran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Pristup lokaciji korisnika" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Korišćenje/čuvanje web podataka" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Koristi korisničke medije" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Dozvoljava ovom sajtu da pristupi informacijama o tvojoj lokaciji." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Dozvoljava ovom sajtu da sačuva veliku količinu podataka na tvoj uređaj." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Dozvoljava ovom sajtu da promeni prikaz na pun ekran." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Dozvoljava ovom sajtu da koristi medijske fajlove koji se čuvaju na tvom uređaju." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Dozvoljava ovom sajtu da prikaže obaveštenja." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Obriši podrazumevana podešavanja aplikacije u okviru Podešavanja > Opšte > Upravljanje aplikacijama > Sve." + +msgid "IDS_COM_BODY_DENY" +msgstr "Odbijeno" + diff --git a/po/sv.po b/po/sv.po new file mode 100755 index 0000000..5ce5937 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Radera" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Avbryt" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Tillåt" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Tom" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Startar hämtning..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Webbplatsinställningar" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Återställ till standard" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Användarnamn" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Verifiering krävs." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Kom ihåg preferens." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Uppdatera automatiskt" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Lösenord" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Det är problem med säkerhetscertifikatet för denna plats." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Webbmeddelande" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) försöker att lagra en stor mängd data på din enhet för användning offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) begär tillstånd för att lagra en stor mängd data på din enhet för användning offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) begär tillstånd om åtkomst till din plats." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) begär tillstånd för att visa meddelanden." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) begär tillstånd för att använda kameran." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Helskärm" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Åtkomst till användarens plats" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Använd/lagra webbdata" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Använd användarmedia" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Gör det möjligt för den här webbplatsen att få åtkomst till din platsinformation." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Gö det möjligt för den här webbplatsen att spara en stor mängd data på din enhet." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Gör det möjligt den här webbplatsen att byta till helskärmsvisning." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Gör det möjligt för den här ewbbplatsen att använda mediefiler som sparats på din enhet." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Gör det möjligt den här webbplatsen att visa meddelanden." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Rensa standardprograminställningarna genom att gå till Inställningar > Allmänt > Hantera program > Alla." + +msgid "IDS_COM_BODY_DENY" +msgstr "Avvisa" + diff --git a/po/ta.po b/po/ta.po new file mode 100755 index 0000000..956c3c2 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "நீக்கு" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ரத்து" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "அனுமதி" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "காலி" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "பதிவிறக்கம் துவங்குகிறது..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "இணைய அமைவுகள்" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "டீஃபால்ட்டிற்கு ரீசெட் செய்க" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "பயனர் பெயர்" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "அங்கீகரிப்பு தேவை." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "முன்னுரிமையை நினைவுகொள்." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "தானியங்கு புதுப்பிப்பு" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "கடவுச்சொல்" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "இந்த இணையதளத்திற்கான பாதுகாப்பு சான்றிதழில் சில சிக்கல்கள் உள்ளன." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "இணைய அறிவிப்பு" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ஆஃப்லைன் உபயோகத்திற்காக உங்கள் சாதனத்தில் அதிகளவு தரவுகளைச் சேமிக்க முயற்சிக்கிறது." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) ஆஃப்லைன் உபயோகத்திற்காக உங்கள் சாதனத்தில் தரவுகளைச் சேமிக்க அனுமதி கோருகிறது." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) உங்கள் இருப்பிடத்தை அணுக அனுமதி கோருகிறது." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) அறிவிக்கைகளைக் காட்டுவதற்கு அனுமதி கோருகிறது." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) உங்கள் கேமராவை உபயோகிக்க அனுமதி கோருகிறது." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "முழு திரை" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "பயனர் இருப்பிடத்தை அணுகுதல்" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "வலை தரவைப் பயன்படுத்தவும்/சேமிக்கவும்" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "பயனர் ஊடகம் பயன்படுத்துக" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "உங்கள் இருப்பிட விபரம் அணுக இந்தத் தளத்தை அனுமதிக்கிறது." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "உங்கள் சாதனத்தில் பெரிய அளவிலான தரவைச் சேமிக்கவென இந்தத் தளத்தை அனுமதிக்கிறது." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "காட்சியை முழுத் திரைக்கு மாற்ற இந்தத் தளத்தை அனுமதிக்கிறது." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "உங்கள் சாதனத்தில் சேமிக்கப்பட்டுள்ள ஊடக கோப்புகளைப் பயன்படுத்த இந்தத் தளத்தை அனுமதிக்கிறது." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "அறிவிப்புகளைக் காண்பிக்க இந்தத் தளத்தை அனுமதிக்கிறது." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "அமைவுகள் > பொது > பயன்பாடுகளை நிர்வகி > அனைத்துக்குச் சென்று இயல்புநிலை பயன்பாடு அமைவுகளை அழிக்கவும்." + +msgid "IDS_COM_BODY_DENY" +msgstr "மறுக்கவும்" + diff --git a/po/te.po b/po/te.po new file mode 100755 index 0000000..84ec023 --- /dev/null +++ b/po/te.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "తొలగించు" + +msgid "IDS_BR_SK_CANCEL" +msgstr "రద్దు" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "అనుమతించు" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ఖాళీ" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "డౌన్లోడ్ ప్రారంభమవుతోంది..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "వెబ్‌సైట్‌ సెట్టింగులు" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "డిఫాల్ట్‌ కు రీసెట్ చేయి" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "యూజర్ పేరు" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ప్రమాణీకరణ అవసరం." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ప్రాధాన్యతను గుర్తుపెట్టుకోండి." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "స్వయంచాలక రీఫ్రెష్" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "పాస్వర్డ్" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "ఈ సైట్ కు సెక్యూరిటీ సర్టిఫికెట్లనుండి సమస్యలు ఉన్నాయి." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "వెబ్ నోటిఫికేషన్" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) మీ పరికరంలో ఆఫ్‌లైన్ ఉపయోగం కోసం అధిక మొత్తంలో డేటాని నిల్వ చేయడానికి ప్రయత్నిస్తోంది." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) మీ పరికరంలో ఆఫ్‌లైన్ ఉపయోగం కోసం డేటాని నిల్వ చేయడానికి అనుమతిని అభ్యర్థిస్తోంది." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) మీ స్థానాన్ని యాక్సెస్ చేయడానికి అనుమతిని అభ్యర్థిస్తోంది." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) నోటిఫికేషన్‌లను చూపడానికి అనుమతిని అభ్యర్థిస్తోంది." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) మీ కెమెరాని ఉపయోగించడానికి అనుమతిని అభ్యర్థిస్తోంది." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "ఫుల్ స్క్రీన్" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "వినియోగదారు స్థానాన్ని యాక్సెస్ చేయి" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "వెబ్ డేటాని ఉపయోగించండి/నిల్వ చేయండి" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "వినియోగదారు మీడియాని ఉపయోగించు" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "మీ స్థానం సమాచారాన్ని యాక్సెస్ చేయడానికి ఈ సైట్‌ని అనుమతిస్తుంది." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "మీ పరికరంలో అధిక మొత్తంలో డేటాని సేవ్ చేయడానికి ఈ సైట్‌ని అనుమతిస్తుంది." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "ప్రదర్శనని పూర్తి స్క్రీన్‌కి మార్చడానికి ఈ సైట్‌ని అనుమతిస్తుంది." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "మీ పరికరంలో నిల్వ చేసిన మీడియా ఫైల్‌లను ఉపయోగించడానికి ఈ సైట్‌ని అనుమతిస్తుంది." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "నోటిఫికేషన్‌లను ప్రదర్శించడానికి ఈ సైట్‌ని అనుమతిస్తుంది." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "సెట్టింగ్‌లు > సాధారణం > అప్లికేషన్‌లను నిర్వహించు > అన్నీకి వెళ్లడం ద్వారా డిఫాల్ట్ అప్లికేషన్ సెట్టింగ్‌లను క్లియర్ చేయండి." + +msgid "IDS_COM_BODY_DENY" +msgstr "నిరాకరించు" + diff --git a/po/th.po b/po/th.po new file mode 100755 index 0000000..cab8310 --- /dev/null +++ b/po/th.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "ลบ" + +msgid "IDS_BR_SK_CANCEL" +msgstr "ยกเลิก" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "อนุญาต" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "ว่าง" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "กำลัง​เริ่ม​ดาวน์​โหลด..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "การ​ตั้ง​ค่า​เว็บ​ไซ​ต์" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "รี​เซ็ท​เป็น​ค่า​พื้น​ฐาน" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "ชื่อ​ผู้​ใช้" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "ต้อง​การ​การ​รับรอง" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "จดจำค่าที่เตรียมไว้" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "รีเฟรชอัตโนมัติ" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "รหัสผ่าน" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "มี​ปัญหา​การ​รับรอง​ความ​ปลอดภัย​สำ​หรับ​ไซ​ต์​นี้" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "การแจ้งเตือนเว็บ" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) กำลังพยายามจัดเก็บข้อมูลจำนวนมาก ลงในอุปกรณ์ของคุณสำหรับใช้งานแบบออฟไลน์" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) กำลังขออนุญาตให้จัดเก็บข้อมูล ลงบนอุปกรณ์ของคุณ สำหรับใช้งานแบบออฟไลน์" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) กำลังขออนุญาต เพื่อเข้าถึงตำแหน่งของคุณ" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) กำลังขออนุญาตให้แสดง การแจ้งเตือน" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) กำลังขออนุญาต เพื่อใช้กล้องของคุณ" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "เต็ม​หน้า​จอ" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "เข้าถึงตำแหน่งของผู้ใช้" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "ใช้/เก็บข้อมูลเว็บ" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "ใช้มีเดียผู้ใช้" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "อนุญาตให้ไซต์นี้เข้าถึง ข้อมูลตำแหน่งของคุณได้" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "อนุญาตให้ไซต์นี้บันทึกข้อมูลจำนวนมาก บนอุปกรณ์ของคุณได้" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "อนุญาตให้ไซต์นี้เปลี่ยนข้อมูล ที่แสดงเป็นเต็มหน้าจอได้" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "อนุญาตให้ไซต์นี้ใช้ไฟล์มีเดีย ที่เก็บอยู่บนอุปกรณ์ของคุณได้" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "อนุญาตให้ไซต์นี้แสดงการแจ้งเตือนได้" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "ล้างการตั้งค่าแอพพื้น​ฐาน​โดยไปที่ การตั้งค่า > ทั่วไป > จัดการแอพพลิเคชั่น > ทั้งหมด" + +msgid "IDS_COM_BODY_DENY" +msgstr "ปฏิเสธ" + diff --git a/po/tl.po b/po/tl.po new file mode 100755 index 0000000..62c7e9e --- /dev/null +++ b/po/tl.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "I-delete" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Ikansela" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Payagan" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Walang laman" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Sinisimulan ang pag-download..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Mga setting ng website" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "I-reset sa default" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Username" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Kailangan ng pagpapatunay" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Tandaan ang preferences." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Auto refresh" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Password" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Mayroong mga problema sa katibayan sa seguridad para sa site na ito." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Notification sa web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "Sinusubukan ni %1$s (%2$s) na mag-store ng malaking halaga ng data sa iyong device para sa paggamit offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "Si %1$s (%2$s) ay humihiling ng pahintulot na mag-store ng data sa iyong device para sa paggamit offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "Si %1$s (%2$s) ay humihiling ng pahintulot na ma-access ang iyong lokasyon." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "Si %1$s (%2$s) ay humihiling ng pahintulot na magpakita ng mga notification." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "Si %1$s (%2$s) ay humihiling ng pahintulot na gamitin ang iyong camera." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Buong screen" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "I-access ang lokasyon ng user" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Gamitin/i-store ang data sa web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Gamitin ang media ng user" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Pinapayagan ang site na ito na ma-access ang impormasyon ng iyong lokasyon." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Pinapayagan ang site na ito na mag-save ng maraming data sa iyong device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Pinapayagan ang site na ito na gawing buong screen ang display." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Pinapayagan ang site na ito na gamitin ang mga media file na naka-store sa iyong device." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Pinapayagan ang site na ito na magpakita ng mga abiso." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "I-clear ang default na mga setting ng app sa pamamagitan ng pagpunta sa Mga Setting > Pangkalahatan > Pamahalaan ang mga application > Lahat." + +msgid "IDS_COM_BODY_DENY" +msgstr "Tanggihan" + diff --git a/po/tr_TR.po b/po/tr_TR.po new file mode 100755 index 0000000..a1438f2 --- /dev/null +++ b/po/tr_TR.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Sil" + +msgid "IDS_BR_SK_CANCEL" +msgstr "İptal" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "İzin ver" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Boş" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "İndirme başlıyor..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Websitesi ayarları" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Varsayılan olarak sıfırla" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Kullanıcı adı" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Kimlik denetimi gerekli" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Tercihi hatırla" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Otomatik yenileme" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Şifre" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Bu siteyle ilgili güvenlik sertifikasında sorunlar var" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Web bildirimi" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) çevrim dışı kullanım için cihazınıza büyük miktarda veri saklamayı deniyor" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) çevrim dışı kullanım için cihazınıza veri depolamak üzere izin istiyor" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) konumunuza erişmek için izin istiyor" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) bildirimleri göstermek için izin istiyor" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) kameranızı kullanmak için izin istiyor" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Tam ekran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Kullanıcı konumuna eriş" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Web verilerini kullan/kaydet" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Kullanıcı ortamını kullan" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Bu sitenin konum bilgilerinize ulaşmasına izin verir" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Bu sitenin cihazınıza büyük miktarda veri kaydetmesine izin verir" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Bu sitenin ekranı tam ekrana değiştirmesine izin verir" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Bu sitenin cihazınıza yüklü ortam dosyalarını kullanmasına izin verir" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Bu sitenin bildirimleri görüntülemesine izin verir" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Ayarlar > Genel > Uygulamaları yönet > Tümü seçeneğine giderek varsayılan uygulama ayarlarını silin" + +msgid "IDS_COM_BODY_DENY" +msgstr "Geri çevir" + diff --git a/po/uk.po b/po/uk.po new file mode 100755 index 0000000..541c026 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Видалити" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Скасувати" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Дозволити" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Пусто" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Початок завантаження..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Установки веб-сайта" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Скинути на стандартні" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Ім'я користувача" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Потрібна аутентифікація." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Запам’ятати параметр." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Автоматичне оновлення" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Пароль" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Проблеми із сертифікатом безпеки для цього сайту." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Веб-сповіщення" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) намагається зберегти великий об'єм даних на пристрої для автономного використання." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) запитує дозвіл на збереження даних на пристрої для автономного використання." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) запитує дозвіл на отримання доступу до вашого розташування." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) запитує дозвіл на відображення сповіщень." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) запитує дозвіл на використання камери." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Повноекранний режим" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Доступ до даних щодо розташування користувача" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Використання/збереження веб-даних" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Використання медіафайлів користувача" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Дозволяє цьому сайту отримувати доступ до відомостей про розташування." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Дозволяє цьому сайту зберігати великий об'єм даних на пристрої." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Дозволяє цьому сайту змінювати режим дисплею на повноекранний." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Дозволяє цьому сайту використовувати медіафайли, збережені на пристрої." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Дозволяє цьому сайту відображати сповіщення." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Щоб очистити стандартні установки програм, перейдіть до розділу «Установки» > «Загальні» > «Керування програмами» > «Усі»." + +msgid "IDS_COM_BODY_DENY" +msgstr "Відмовити" + diff --git a/po/ur.po b/po/ur.po new file mode 100755 index 0000000..8355aff --- /dev/null +++ b/po/ur.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "مٹانا" + +msgid "IDS_BR_SK_CANCEL" +msgstr "منسوخ" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "اجازت دیں" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "خالی" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "ڈاؤن لوڈ شروع کررہا ہے..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "ویب سائٹ سیٹنگز" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "فطری پر پھر سیٹ کریں" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "استمعال کنندہ کا نام" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "اتھینٹیکیشن ضروری۔" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "ترجیح یاد رکھیں" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "خودکار تازہ کریں" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "پاس ورڈ" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "اس سائٹ کے لئے سلامتی کی سند میں مسائل ہیں" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "ویب اعلامیہ" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) آف لائن استعمال کے لئے آپ کے آلہ پر ڈیٹا کی ایک بڑی مقدار ذخیرہ کرنے کی کوشش کررہا ہے" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) آف لائن استعمال کے لئے آپ کے آلہ پر ڈیٹا ذخیرہ کرنے کی اجازت کی درخواست کررہا ہے" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) آپ کے محل وقوع پر رسائی کرنے کی اجازت کی درخواست کررہا ہے" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) اعلانات دکھانے کی اجازت کی درخواست کررہا ہے" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) آپ کا کیمرہ استعمال کرنے کی اجازت کی درخواست کررہا ہے" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "فل سکرین" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "صارف محل وقوع رسائی کریں" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "استعمال/ویب ڈیٹا ذخیرہ کریں" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "صارف میڈیا استعمال کریں" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "اس سائٹ کو اپنی محل وقوع معلومات پر رسائی کرنے کی اجازت دیتا ہے۔" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "اس سائٹ کو آپ کے آلہ پر ڈیٹا کی ایک بڑی مقدار محفوظ کرنے کی اجازت دیتا ہے۔" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "اس سائٹ کو ڈسپلے کو پوری اسکرین پر تبدیل کرنے کی اجازت دیتا ہے۔" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "اس سائٹ کو آپ کے آلہ پر ذخیرہ کردہ میڈیا فائلیں استعمال کرنے کی اجازت دیتا ہے۔" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "اس سائٹ کو اعلانات ڈسپلے کرنے کی اجازت دیتا ہے۔" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "طے شدہ ایپلیکیشن سیٹنگز کو یہاں جا کر صاف کریں سیٹنگز > عمومی > ایپلیکیشنز بندوبست کریں > تمام" + +msgid "IDS_COM_BODY_DENY" +msgstr "انکار کریں" + diff --git a/po/uz.po b/po/uz.po new file mode 100755 index 0000000..e9ff4a0 --- /dev/null +++ b/po/uz.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "O'chirish" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Bekor q." + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Ruxsat" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Bo‘sh" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Yuklab olish boshlanmoqda..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Veb-sayt parametrlari" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Birlamchi o'rnatilgan holatiga tiklash" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Foydalanuvchi nomi" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Haqiqiylik tekshiruvi talab qilinadi." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Eslab qolish afzalligi." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Avtomatik yangilash" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Parol" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Ushbu sayt sertifikati bilan bog‘liq muammolar mavjud." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Veb-bildirishnoma" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) qurilmangizga offlayn foydalanish uchun katta hajmdagi ma’lumotni saqlashga urinmoqda." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) qurilmangizga offlayn foydalanish uchun ma’lumotni saqlashga ruxsat so‘ramoqda." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) joylashuvingizga kirish uchun ruxsat so‘ramoqda." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) bildirishnomalarni ko‘rsatish uchun ruxsat so‘ramoqda." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) kamerangizdan foydalanish uchun ruxsat so‘ramoqda." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "To‘liq ekran" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Foydalanuvchi joylashuviga kirish" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Veb-ma’lumotni ishlatish/saqlash" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Foydalanuvchi mediasidan foydalanish" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Ushbu saytga joylashuvingiz ma’lumotlariga kirish uchun ruxsat beradi." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Ushbu saytga qurilmangizda ko‘p miqdordagi ma’lumotlarni saqlash uchun ruxsat beradi." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Ushbu saytga displeyni to‘liq ekranga o‘zgartirish uchun ruxsat beradi." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Ushbu saytga qurilmangizda saqlangan media fayllardan foydalanish uchun ruxsat beradi." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Ushbu saytga bildirishnomalarni aks ettirish uchun ruxsat beradi." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Parametrlar > Umumiy > Ilovalarni boshqarish > Barchasiga o‘tish orqali birlamchi ilova parametrlarini tozalang." + +msgid "IDS_COM_BODY_DENY" +msgstr "Rad etish" + diff --git a/po/vi.po b/po/vi.po new file mode 100755 index 0000000..565a502 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "Xóa" + +msgid "IDS_BR_SK_CANCEL" +msgstr "Hủy" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "Cho phép" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "Trống" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "Đang bắt đầu tải về..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "Cài đặt website" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Đặt lại về mặc định" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "Tên người dùng" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "Yêu cầu xác thực." + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "Nhớ Cài đặt sở thích." + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "Tự động làm mới" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "Mật mã" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "Có vấn đề về chứng chỉ bảo mật cho site này." + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "Thông báo web" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) đang cố gắng lưu trữ một lượng lớn dữ liệu vào thiết bị để sử dụng offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) đang yêu cầu lưu trữ dữ liệu trên thiết bị của bạn để dùng offline." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) đang yêu cầu quyền truy cập vị trí của bạn." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) đang yêu cầu quyền hiển thị thông báo." + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) đang yêu cầu quyền sử dụng máy ảnh của bạn." + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "Toàn màn hình" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "Truy cập vị trí người dùng" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "Sử dụng/lưu trữ dữ liệu web" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "Sử dụng media của người dùng" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "Cho phép trang này truy cập thông tin vị trí của bạn." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "Cho phép trang này lưu số lượng lớn dữ liệu trên thiết bị." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "Cho phép trang này chuyển sang hiển thị toàn màn hình." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "Cho phép trang này sử dụng file media lưu trên thiết bị." + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "Cho phép trang này hiển thị thông báo." + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "Xóa cài đặt ứng dụng mặc định bằng cách vào Cài đặt > Cài đặt chung > Quản lý ứng dụng > Tất cả." + +msgid "IDS_COM_BODY_DENY" +msgstr "Từ chối" + diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100755 index 0000000..53cecc7 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "删除" + +msgid "IDS_BR_SK_CANCEL" +msgstr "取消" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "允许" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "空白" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "正在开始下载..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "网站设置" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "重置为默认值" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "用户名" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "需要认证" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "记住首选项。" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "自动刷新" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "密码" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "此站点的安全证书存在问题。" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "网络通知" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正在尝试在您的设备上存储大量数据用于离线使用。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正在请求许可在您的设备上存储数据用于离线使用。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) 正在请求许可访问您的位置。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) 正在请求许可显示通知。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) 正在请求许可使用您的相机。" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "全屏显示" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "访问用户位置" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "使用/存储网络数据" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "使用用户媒体" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "请允许此站点访问您的位置数据。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "请允许此站点保存您设备上的大量数据。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "请允许此站点更改为全屏显示。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "请允许此站点使用储存在您设备上的媒体文件。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "请允许此站点显示通知。" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "通过进入设定 > 一般 > 管理应用程序 > 全部清除默认应用程序设置。" + +msgid "IDS_COM_BODY_DENY" +msgstr "拒绝" + diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100755 index 0000000..854a82d --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "刪除" + +msgid "IDS_BR_SK_CANCEL" +msgstr "取消" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "允許" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "空白" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "正在開始下載..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "網址設定" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "重設為預設" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "用戶名稱" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "需要認證" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "記住偏好。" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "自動重新整理" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "密碼" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "此網站的安全性證書存在問題。" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "網絡通知" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正嘗試在您的裝置上儲存大容量數據作為離線使用。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正在請求權限以於您的裝置上儲存數據作為離線使用。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) 正在請求授權以存取您的位置。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) 正在請求授權以顯示通知。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) 正在請求授權以使用您的相機。" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "全螢幕" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "存取用戶位置" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "使用/儲存網頁數據" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "使用用戶媒體" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "允許該網站存取您的位置資訊。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "允許該網站在您的裝置上儲存大量數據。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "允許該網站將顯示畫面變更為全螢幕。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "允許該網站使用儲存在您裝置上的媒體檔案。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "允許該網站顯示通知。" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "通過前往設定 > 一般 > 管理應用程式 > 全部,清除預設的應用程式設定。" + +msgid "IDS_COM_BODY_DENY" +msgstr "拒絕" + diff --git a/po/zh_SG.po b/po/zh_SG.po new file mode 100755 index 0000000..95e5f7b --- /dev/null +++ b/po/zh_SG.po @@ -0,0 +1,87 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "删除" + +msgid "IDS_BR_SK_CANCEL" +msgstr "取消" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "允许" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "空白" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "正在开始下载..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "网络设置" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "Reset to default" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "用户名称" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "需要认证" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "记住首选项" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "密码" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "此站点的安全证书存在问题" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "网络通知" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正在尝试在您的设备上存储大量数据用于离线使用" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正在请求许可在您的设备上存储数据用于离线使用" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) 正在请求许可访问您的位置" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) 正在请求许可显示通知" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) 正在请求许可使用您的相机" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "全屏显示" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "访问用户位置" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "使用/存储网络数据" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "使用用户媒体" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "请允许此站点访问您的位置数据" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "请允许此站点保存您设备上的大量数据" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "请允许此站点更改为全屏显示" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "请允许此站点使用储存在您设备上的媒体文件" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "请允许此站点显示通知" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "通过进入设定 > 一般 > 管理应用程序 > 全部清除默认应用程序设置" + +msgid "IDS_COM_BODY_DENY" +msgstr "否定" + diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100755 index 0000000..c079103 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,90 @@ +msgid "IDS_BR_SK_DELETE" +msgstr "刪除" + +msgid "IDS_BR_SK_CANCEL" +msgstr "取消" + +msgid "IDS_BR_OPT_ALLOW" +msgstr "允許" + +msgid "IDS_BR_BODY_EMPTY" +msgstr "空白" + +msgid "IDS_BR_POP_STARTING_DOWNLOAD_ING" +msgstr "正在開始下載..." + +msgid "IDS_BR_BODY_WEBSITE_SETTINGS" +msgstr "網站設定" + +msgid "IDS_BR_BODY_RESET_TO_DEFAULT" +msgstr "重設為預設值" + +msgid "IDS_BR_BODY_AUTHUSERNAME" +msgstr "使用者名稱" + +msgid "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +msgstr "需要驗證" + +msgid "IDS_BR_BODY_REMEMBER_PREFERENCE" +msgstr "記住偏好。" + +msgid "IDS_BR_HEADER_AUTO_REFRESH" +msgstr "自動重新整理" + +msgid "IDS_BR_BODY_PASSWORD" +msgstr "密碼" + +msgid "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG" +msgstr "此網站的安全憑證有問題。" + +msgid "IDS_BR_HEADER_WEB_NOTIFICATION" +msgstr "網路通知" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正嘗試在您的裝置上儲存大容量資料作為離線使用。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE" +msgstr "%1$s (%2$s) 正在請求權限以於您的裝置上儲存資料作為離線使用。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION" +msgstr "%1$s (%2$s) 正在請求授權以存取您的位置。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS" +msgstr "%1$s (%2$s) 正在請求授權以顯示通知。" + +msgid "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA" +msgstr "%1$s (%2$s) 正在請求授權以使用您的相機。" + +msgid "IDS_BR_BODY_FULL_SCREEN" +msgstr "全螢幕" + +msgid "IDS_WRT_OPT_ACCESS_USER_LOCATION" +msgstr "存取使用者位置" + +msgid "IDS_WRT_OPT_USE_STORE_WEB_DATA" +msgstr "使用/儲存網頁資料" + +msgid "IDS_WRT_OPT_USE_USER_MEDIA" +msgstr "使用使用者媒體" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_ACCESS_YOUR_LOCATION_INFORMATION" +msgstr "允許該網站存取您的位置資訊。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_SAVE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE" +msgstr "允許該網站在您的裝置上儲存大量數據。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_CHANGE_THE_DISPLAY_TO_FULL_SCREEN" +msgstr "允許該網站將顯示畫面變更為全螢幕。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_USE_THE_MEDIA_FILES_STORED_ON_YOUR_DEVICE" +msgstr "允許該網站使用儲存在您裝置上的媒體檔案。" + +msgid "IDS_WRT_BODY_ALLOWS_THIS_SITE_TO_DISPLAY_NOTIFICATIONS" +msgstr "允許該網站顯示通知。" + +msgid "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" +msgstr "前往設定 > 一般 > 管理應用程式來清除預設的應用程式設定。" + +msgid "IDS_COM_BODY_DENY" +msgstr "拒絕" + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..8f3e851 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,253 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# @file CMakeLists.txt +# @author Lukasz Wrzosek (l.wrzosek@samsung.com) +# @version 1.0 +# + +GROUP_DEPS (WRT_BASIC_DEP DEPS + dpl-efl + dpl-dbus-efl + dpl-event-efl + dpl-utils-efl + wrt-popup-ace-runner + ) + +GROUP_DEPS(SYS_WRT_BASIC_DEP DEPS + openssl + libpcrecpp + glib + libsoup + libiri + appsvc + cert-svc-vcore + edje + ecore + ecore-x + evas + eina + ewebkit2 + elementary + vconf + cert-svc + ui-gadget-1 + secure-storage + capi-appfw-app-manager + security-core + security-client + ) +# "smack-labeling-support-static" static library ------------------------------- +SET(SMACK_LABELING_SUPPORT_SOURCES + ${PROJECT_SOURCE_DIR}/src/wrt-client/process_pool/smack_labeling_support.cpp + ) +SET(SMACK_LABELING_SUPPORT_INCLUDES + ${PROJECT_SOURCE_DIR}/src/wrt-client/process_pool/ + ) +INCLUDE_DIRECTORIES( + ${SMACK_LABELING_SUPPORT_INCLUDES} + ${libsmack_INCLUDE_DIRS} + ) +ADD_LIBRARY(${TARGET_SMACK_LABELING_SUPPORT_STATIC} STATIC + ${SMACK_LABELING_SUPPORT_SOURCES} + ) +TARGET_LINK_LIBRARIES(${TARGET_SMACK_LABELING_SUPPORT_STATIC} + ${libsmack_LIBRARIES} + ) + +SET_TARGET_PROPERTIES(${TARGET_SMACK_LABELING_SUPPORT_STATIC} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +# "pre-launching-support-static" static library ------------------------------- +IF(WRT_ENABLE_PRE_LAUNCH) + SET(PRE_LAUNCHING_SUPPORT_SOURCES + ${PROJECT_SOURCE_DIR}/src/pre-launching/pre_launching_support.cpp + ) + SET(PRE_LAUNCHING_SUPPORT_INCLUDES + ${PROJECT_SOURCE_DIR}/src/pre-launching + ) + INCLUDE_DIRECTORIES( + ${PRE_LAUNCHING_SUPPORT_INCLUDES} + ${aul_INCLUDE_DIRS} + ${appcore-efl_INCLUDE_DIRS} + ${bundle_INCLUDE_DIRS} + ${aul_INCLUDE_DIRS} + ) + ADD_LIBRARY(${TARGET_LAUNCHING_SUPPORT_STATIC} STATIC + ${PRE_LAUNCHING_SUPPORT_SOURCES} + ) + TARGET_LINK_LIBRARIES(${PRE_LAUNCHING_SUPPORT_STATIC} + ${aul_LIBRARIES} + ${elementary_LIBRARIES} + ${appcore-efl_LIBRARIES} + ) +ENDIF(WRT_ENABLE_PRE_LAUNCH) + +# "client-support-static" static library ------------------------------- +SET(CLIENT_SUPPORT_SOURCES + ${PROJECT_SOURCE_DIR}/src/wrt-client/client_command_line_parser.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-client/client_ide_support.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-client/client_orientation_support.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-client/client_submode_support.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-client/splash_screen_support.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-client/window_data.cpp + ) +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +LIST(APPEND CLIENT_SUPPORT_SOURCES + ${PROJECT_SOURCE_DIR}/src/wrt-client/web_app_manager.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-client/wrt-client-lite.cpp + ) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +SET(CLIENT_SUPPORT_INCLUDES + ${PROJECT_SOURCE_DIR}/src/api_new + ${PROJECT_SOURCE_DIR}/src/domain + ${PROJECT_SOURCE_DIR}/src/profiling + ${PROJECT_SOURCE_DIR}/src/wrt-client + ) +INCLUDE_DIRECTORIES( + ${CLIENT_SUPPORT_INCLUDES} + ${bundle_INCLUDE_DIRS} + ${efl-assist_INCLUDE_DIRS} + ${elementary_INCLUDE_DIRS} + ) +ADD_LIBRARY(${TARGET_CLIENT_SUPPORT_STATIC} STATIC + ${CLIENT_SUPPORT_SOURCES} + ) +TARGET_LINK_LIBRARIES(${TARGET_CLIENT_SUPPORT_STATIC} + ${bundle_LIBRARIES} + ${efl-assist_LIBRARIES} + ${elementary_LIBRARIES} + ) + +SET_TARGET_PROPERTIES(${TARGET_CLIENT_SUPPORT_STATIC} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}" COMPILE_FLAGS "-include profiling_util.h") +# ------------------------------------------------------------------------------ + +#it is here, so no INCLUDE_DIRS and DEFINITIONS are passed there + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +# "wrt-event-loop" shared library --------------------------------------- +SET(WRT_EVENT_LOOP_SOURCES + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/src/web_internal_eventloop.cpp +) + +SET(WRT_EVENT_LOOP_INCLUDES + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/include +) + +INCLUDE_DIRECTORIES( +${WRT_EVENT_LOOP_INCLUDES} +${elementary_INCLUDE_DIRS} +) + +ADD_LIBRARY(${TARGET_WRT_EVENT_LOOP_LIB} SHARED + ${WRT_EVENT_LOOP_SOURCES} +) + +TARGET_LINK_LIBRARIES(${TARGET_WRT_EVENT_LOOP_LIB} + ${elementary_LIBRARIES} +) + +INSTALL(TARGETS ${TARGET_WRT_EVENT_LOOP_LIB} + DESTINATION lib/ + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) +#--------------------------------------------------------------- +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +SET(WRT_SRC_DIR + ${PROJECT_SOURCE_DIR}/src + ) +SET(WRT_CORE_BASE_SOURCES + ${WRT_SRC_DIR}/domain/application_data.cpp + ${WRT_SRC_DIR}/domain/localization_setting.cpp + ${WRT_SRC_DIR}/domain/main_thread.cpp + ${WRT_SRC_DIR}/domain/permission_popup_manager.cpp + ${WRT_SRC_DIR}/domain/widget_data_types.cpp + ${WRT_SRC_DIR}/domain/widget_deserialize_model.cpp + ${WRT_SRC_DIR}/domain/widget_model.cpp + ) +SET(WRT_CORE_INCLUDES + ${WRT_SRC_DIR}/domain + ${WRT_SRC_DIR}/profiling + ${WRT_SRC_DIR}/view + ) + +IF(SMACK_ENABLED) + LIST(APPEND SYS_WRT_BASIC_DEP libprivilege-control) +ENDIF(SMACK_ENABLED) + +#wrt-engine-static +ADD_DEFINITIONS( + ${WRT_BASIC_DEP_CFLAGS} + ${SYS_WRT_BASIC_DEP_CFLAGS} + ) +ADD_DEFINITIONS( + ${WRT_BASIC_DEP_CFLAGS_OTHER} + ${SYS_WRT_BASIC_DEP_CFLAGS_OTHER} + ) + +SET (PRE_LAUNCHING_SUPPORT_DEPS_LIBRARIES + ${aul_LIBRARIES} + ${appcore-efl_LIBRARIES} + ${bundle_LIBRARIES} + ) + +INCLUDE_DIRECTORIES ( + SYSTEM + ${SYS_WRT_BASIC_DEP_INCLUDE_DIRS} + ) +INCLUDE_DIRECTORIES ( + ${WRT_BASIC_DEP_INCLUDE_DIRS} + ${WRT_CORE_INCLUDES} + ) + +ADD_LIBRARY(${TARGET_WRT_ENGINE_STATIC} STATIC + ${WRT_CORE_BASE_SOURCES} + ) + +SET_TARGET_PROPERTIES(${TARGET_WRT_ENGINE_STATIC} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +SET_TARGET_PROPERTIES(${TARGET_WRT_ENGINE_STATIC} PROPERTIES + SOVERSION ${PROJECT_API_VERSION} + VERSION ${PROJECT_VERSION}) + +SET_TARGET_PROPERTIES(${TARGET_WRT_ENGINE_STATIC} PROPERTIES + COMPILE_FLAGS -fPIC) + +SET_TARGET_PROPERTIES(${TARGET_WRT_ENGINE_STATIC} PROPERTIES + COMPILE_FLAGS "-include profiling_util.h") + +INSTALL(FILES + ${WRT_SRC_DIR}/domain/widget_model.h + DESTINATION include/${PROJECT_NAME} +) + +INSTALL(FILES + ${WRT_SRC_DIR}/domain/widget_data_types.h + DESTINATION include/${PROJECT_NAME} +) + +ADD_SUBDIRECTORY(view) +ADD_SUBDIRECTORY(api_new) +ADD_SUBDIRECTORY(wrt-client) +ADD_SUBDIRECTORY(wrt-launcher) +IF(PROFILING) + ADD_SUBDIRECTORY(profiling) +ENDIF(PROFILING) +ADD_SUBDIRECTORY(wrt-launchpad-daemon) diff --git a/src/DESCRIPTION b/src/DESCRIPTION new file mode 100644 index 0000000..bc2b1d7 --- /dev/null +++ b/src/DESCRIPTION @@ -0,0 +1 @@ +Main source folder diff --git a/src/api_new/CMakeLists.txt b/src/api_new/CMakeLists.txt new file mode 100644 index 0000000..0341a2d --- /dev/null +++ b/src/api_new/CMakeLists.txt @@ -0,0 +1,99 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +GROUP_DEPS(CORE_MODULE_DEP DEPS + dpl-efl + wrt-popup-wrt-runner + ail + ) + +GROUP_DEPS(SYS_CORE_MODULE_DEP DEPS + libprivilege-control + ) + +ADD_LIBRARY(${TARGET_CORE_MODULE_LIB} SHARED + ${PROJECT_SOURCE_DIR}/src/api_new/core_module.cpp + ${PROJECT_SOURCE_DIR}/src/api_new/runnable_widget_object.cpp + ${PROJECT_SOURCE_DIR}/src/api_new/runnable_widget_object_state.cpp + ${PROJECT_SOURCE_DIR}/src/api_new/security_support.cpp +) + +SET_TARGET_PROPERTIES(${TARGET_CORE_MODULE_LIB} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +SET_TARGET_PROPERTIES(${TARGET_CORE_MODULE_LIB} PROPERTIES +# COMPILE_FLAGS "-include profiling_util.h" + OUTPUT_NAME ${TARGET_CORE_MODULE_LIB} +) + +INCLUDE_DIRECTORIES( + ${CORE_MODULE_DEP_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} +) +INCLUDE_DIRECTORIES( + SYSTEM + ${SYS_CORE_MODULE_DEP_INCLUDE_DIRS} +) + +# +#Set libraries that should be linked to the file that is linking wrt-core-module +#Do not set any static libraries as it will be included in wrt-core-module +# +SET(WRT_CORE_MODULE_INTERFACE_LIBRARIES + ${CORE_MODULE_DEP_LIBRARIES} + ${SYS_CORE_MODULE_DEP_LIBRARIES} + ${WRT_BASIC_DEP_LIBRARIES} + ${SYS_WRT_BASIC_DEP_LIBRARIES} + ${Boost_LIBRARIES} +) + +SET(WHOLE_ARCHIVE_LIBS + "-Wl,--whole-archive" + ${TARGET_WRT_ENGINE_STATIC} + ${TARGET_VIEW_COMMON_LIB_STATIC} +) + +IF(WRT_ENABLE_PRE_LAUNCH) + LIST(APPEND WHOLE_ARCHIVE_LIBS ${TARGET_PRE_LAUNCHING_SUPPORT_STATIC}) +ENDIF(WRT_ENABLE_PRE_LAUNCH) + +SET(NO_WHOLE_ARCHIVE_LIBS + "-Wl,--no-whole-archive" + ${TARGET_VIEW_MODULE_LIB} + ${WRT_CORE_MODULE_INTERFACE_LIBRARIES} +) + +TARGET_LINK_LIBRARIES(${TARGET_CORE_MODULE_LIB} + ${WHOLE_ARCHIVE_LIBS} + ${NO_WHOLE_ARCHIVE_LIBS} +) + +SET_TARGET_PROPERTIES(${TARGET_CORE_MODULE_LIB} + PROPERTIES + LINK_INTERFACE_LIBRARIES "${WRT_CORE_MODULE_INTERFACE_LIBRARIES}" +) + +INSTALL(TARGETS ${TARGET_CORE_MODULE_LIB} + DESTINATION lib/ + PERMISSIONS OWNER_READ OWNER_WRITE + GROUP_READ GROUP_EXECUTE WORLD_READ +) + +INSTALL(FILES + ${PROJECT_SOURCE_DIR}/src/api_new/core_module.h + ${PROJECT_SOURCE_DIR}/src/api_new/i_runnable_widget_object.h + ${PROJECT_SOURCE_DIR}/src/api_new/security_support.h + ${PROJECT_SOURCE_DIR}/src/api_new/user_delegates.h + DESTINATION include/${PROJECT_NAME} +) diff --git a/src/api_new/core_module.cpp b/src/api_new/core_module.cpp new file mode 100644 index 0000000..862e991 --- /dev/null +++ b/src/api_new/core_module.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file core_module.cpp + * @author Przemyslaw Ciezkowski (p.ciezkowski@samsung.com) + * @author Andrzej Surdej (a.surdej@samsung.com) + * @version 1.0 + * @brief File contains definitions of wrt core module. + */ + +#include "core_module.h" +#include "runnable_widget_object.h" +#include +#include +#include +#include +#include +#include +#include +#include "localization_setting.h" +#include +#include +#include +#include + +IMPLEMENT_SINGLETON(WRT::CoreModule) + +namespace { +const char* const TEXT_DOMAIN = "wrt"; +const char* const TEXT_LOCALE_PATH = "/usr/share/locale"; + +std::string cutOffFileName(const std::string& path) +{ + size_t found = path.find_last_of("/"); + if (found == std::string::npos) { + return path; + } else { + return path.substr(0, found); + } +} + +bool isDir(const std::string& path) +{ + struct stat st; + if (0 == stat(path.c_str(), &st) && S_ISDIR(st.st_mode)) { + return true; + } + WrtLogE("Cannot access directory [ %s ]", path.c_str()); + return false; +} + +bool checkPaths() +{ + using namespace WrtDB; + using namespace WrtDB::GlobalConfig; + + bool if_ok = true; + if_ok &= (isDir(cutOffFileName(GetWrtDatabaseFilePath()))); + if_ok &= (isDir(GetDevicePluginPath())); + if_ok &= (isDir(GetUserInstalledWidgetPath())); + return if_ok; +} +} // namespace anonymous + +namespace WRT { +class CoreModuleImpl +{ + public: + + CoreModuleImpl() : m_initialized(false) + { + WrtLogD("enter"); + } + + ~CoreModuleImpl() + { + WrtLogD("Core module implementation destroyed"); + } + + bool Init() + { + if (!m_initialized) { + ADD_PROFILING_POINT("CoreModule::Init", "point"); + WrtLogD("Initialize"); + if (!checkPaths()) { + WrtLogE("Required path does not exist"); + return false; + } + Try + { + ADD_PROFILING_POINT("attach databases", "start"); + MainThreadSingleton::Instance().AttachDatabases(); + ADD_PROFILING_POINT("attach databases", "stop"); + WrtLogD("Initialize finished"); + } catch (const DPL::Exception& ex) { + WrtLogE("Internal Error during screen preparation:"); + DPL::Exception::DisplayKnownException(ex); + /* TODO: + * Do deinitialization: check on which step exception occured + * and deinitialize only initialized parts. + */ + return false; + } + bindtextdomain(TEXT_DOMAIN, TEXT_LOCALE_PATH); + m_initialized = true; + } + return true; + } + + void Terminate() + { + MainThreadSingleton::Instance().DetachDatabases(); + m_initialized = false; + } + + RunnableWidgetObjectPtr getRunnableWidgetObject( + const std::string& tizenId) + { + try { + RunnableWidgetObjectPtr runnable; + WidgetModelPtr model = + Domain::deserializeWidgetModel(tizenId); + if (!!model) { + runnable.reset(new RunnableWidgetObject(model)); + } + return runnable; + } catch (WrtDB::WidgetDAOReadOnly::Exception::WidgetNotExist) { + WrtLogE("Widget not found."); + return NULL; + } catch (DPL::Exception) { + WrtLogE("Error creating runnable object"); + return NULL; + } + } + + private: + bool m_initialized; +}; + +CoreModule::CoreModule() : m_impl(new CoreModuleImpl()) +{} + +CoreModule::~CoreModule() +{} + +bool CoreModule::Init() +{ + return m_impl->Init(); +} + +void CoreModule::Terminate() +{ + return m_impl->Terminate(); +} + +RunnableWidgetObjectPtr CoreModule::getRunnableWidgetObject( + const std::string& tizenId) +{ + return m_impl->getRunnableWidgetObject(tizenId); +} + +} /* namespace WRT */ diff --git a/src/api_new/core_module.h b/src/api_new/core_module.h new file mode 100644 index 0000000..ba884dd --- /dev/null +++ b/src/api_new/core_module.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file core_module.cpp + * @author Przemyslaw Ciezkowski (p.ciezkowski@samsung.com) + * @authir Andrzej Surdej (a.surdej@gmail.com) + * @version 1.0 + * @brief File contains declarations of wrt core module. + */ + +#ifndef CORE_MODULE_H_ +#define CORE_MODULE_H_ + +#include +#include "i_runnable_widget_object.h" +#include +#include +#include + +namespace WRT { +class CoreModuleImpl; // forward declaration + +class CoreModule +{ + public: + /** + * Initialize needed by WRT components (database etc). + * Will not throw exception. elm_init() is NOT called in this function. + * You MUST call it before running widget. + * @return true on success, false when it fails + */ + bool Init(); + /** + * Deinitialize CoreModule. If it called without Init() some internal + * asserts will fail. + */ + void Terminate(); + /** + * Create model with given package name. + * Init must be called earlier. You MUST destroy all + * RunnableWidgetObjectPtr before calling Terminate. + * @param packageName + * @return NULL on fail + */ + RunnableWidgetObjectPtr getRunnableWidgetObject( + const std::string& tizenId); + + private: + CoreModule(); + ~CoreModule(); + std::unique_ptr m_impl; + + friend class DPL::Singleton; +}; + +typedef DPL::Singleton CoreModuleSingleton; +} /* namespace WRT */ +#endif /* CORE_MODULE_H_ */ \ No newline at end of file diff --git a/src/api_new/i_runnable_widget_object.h b/src/api_new/i_runnable_widget_object.h new file mode 100644 index 0000000..4570c16 --- /dev/null +++ b/src/api_new/i_runnable_widget_object.h @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file i_runnable_widget_object.h + * @author Przemyslaw Ciezkowski (p.ciezkowski@samsung.com) + * @version 1.0 + * @brief File contains declaration of IRunnableWidgetObject interface. + */ + +#ifndef RUNNABLE_WIDGET_OBJECT_INTERFACE_H_ +#define RUNNABLE_WIDGET_OBJECT_INTERFACE_H_ + +#include +#include +#include +#include + +#include + +namespace WRT { + +/** + * @brief The IRunnableWidgetObject class Runnable object interface + * + * Interface for managing WRT widgets runnable object. + * Methods should be called in approopriatte order. Check graph below. + * + * /----------->(INITIAL) + * | | + * | | PrepareView() + * | V + * | (PREPARED) + * | | + * | Reset() | + * | | + * | | Show() + * | V + * | (SHOWED) + * | / ^ + * | Suspend() | | Resume() + * | V / + * | (SUSPENDED) + * | + * | + * | (any state besides INITIAL) + * | | + * | | Hide() + * | V + * \-------------(HIDDEN) + * + */ +class IRunnableWidgetObject +{ + public: + // IRunnableWidgetObject base exception + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + + // Throwed by any method if it is called in wrong state + DECLARE_EXCEPTION_TYPE(Base, MethodInvocationForbidden) + + /** + * Prepares view to launch. You MUST call elm_init before calling + * this method. + * @param window + * @param callbacks passed to viewLogic + */ + virtual bool PrepareView(const std::string &startUrl, + Evas_Object *window, + Ewk_Context* ewkContext = NULL) = 0; + /** + * Shows widget asynchronously. Callback will be called when + * webkit generates website. + * @param callback + */ + virtual void Show() = 0; + /** + * Hides widget. To show it again Reset must be called. + */ + virtual void Hide() = 0; + /** + * Stops widget's javascript. If widget has set background_enabled + * then this method has no effect. To resume use Resume(); + */ + virtual void Suspend() = 0; + /** + * Resumes widget's javascript after calling Suspend(). Resumes only if + * widget is in suspend state. + */ + virtual void Resume() = 0; + /** + * Reload widgets After resize. + */ + virtual void ReloadUrl(const std::string &startUrl) = 0; + /** + * Resets widgets after calling Hide(). + */ + virtual void Reset() = 0; + /** + * Reload start page on widget. + */ + virtual void ReloadStartPage() = 0; + /** + * Retrieve widget's top level webview + * @return Evas_Object* + */ + virtual Evas_Object* GetCurrentWebview() = 0; + /** + * Register widget's delegates + */ + virtual void SetUserDelegates(const UserDelegatesPtr& cbs) = 0; + /** + * Call goBack() on webkit + */ + virtual void Backward() = 0; + /** + * fire custom javascript event + */ + virtual void FireJavascriptEvent(int event, void* data) = 0; + + virtual void HandleLowMemory() = 0; +#if ENABLE(ONE_UI_PROCESS_MODEL) + virtual void ResetAulConnection() = 0; + + virtual void SendIDEReply(const std::string &msg) = 0; +#endif + virtual ~IRunnableWidgetObject() {} +}; + +typedef std::shared_ptr RunnableWidgetObjectPtr; +} +#endif /* RUNNABLE_WIDGET_OBJECT_INTERFACE_H_ */ + diff --git a/src/api_new/runnable_widget_object.cpp b/src/api_new/runnable_widget_object.cpp new file mode 100644 index 0000000..5e4307b --- /dev/null +++ b/src/api_new/runnable_widget_object.cpp @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file runnable_widget_object.cpp + * @author Przemyslaw Ciezkowski (p.ciezkowski@samsung.com) + * @version 1.0 + * @brief File contains defitinions of RunnableWidgetObject implementation. + */ + +#include "runnable_widget_object.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#endif + +namespace { //Anonymous +const unsigned int UID_ROOT = 0; +} // namespace anonymous + +namespace WRT { +RunnableWidgetObject::RunnableWidgetObject(WidgetModelPtr &model) : + m_widgetModel(model), + m_view(ViewModule::createView()), + m_contextManagerFactoryMethod(ViewModule::makeContextManagerFactoryMethod()) +{ + //set initial state of runnable object + m_guardstate = std::shared_ptr( + new State::InitialState(*this)); + // If current uid is 'root', change privilege to apps + if (UID_ROOT == getuid()) { + // Set privilege by tizen id + // this code prevent that widget launch with "root" permission, + // when developers launch by command in the shell + if (!SecuritySupport::setAppPrivilege( + DPL::ToUTF8String(m_widgetModel->TizenId))) { + Throw(IRunnableWidgetObject::Base); + } + } +} + +#if ENABLE(ONE_UI_PROCESS_MODEL) +static std::string createInitMessage(std::string appid) +{ + bundle* b = ApplicationDataSingleton::Instance().getBundle(appid); + if (!b) { + WrtLogE("Failed to get the bundle"); + std::string retStr; + retStr = "1 " + appid; // 1 specifies argument count + return retStr; + } + char **argv; + int argc = bundle_export_to_argv(b, &argv); + + std::stringstream ssMsg; + ssMsg << argc; + ssMsg << " " << appid; + + for (int ittr = 1; ittr < argc; ++ittr) { + ssMsg << " " << argv[ittr]; + } + bundle_free_exported_argv(argc, &argv); + return ssMsg.str(); +} +#endif + +bool RunnableWidgetObject::PrepareView(const std::string &startUrl, + Evas_Object *window, Ewk_Context* ewkContext) +{ + State::StateChange change = m_guardstate->allowPrepareView(); + if (!window) { + return false; + } + + std::string appId = DPL::ToUTF8String(m_widgetModel->TizenId); + Try { + if(!m_ewkContextManager) { + m_ewkContextManager = m_contextManagerFactoryMethod(appId, ewkContext, m_view); + } else { + if (ewkContext && + ewkContext != m_ewkContextManager->getEwkContext()) + { + m_ewkContextManager = m_contextManagerFactoryMethod(appId, ewkContext, m_view); + } + } + } Catch (DPL::Exception) { + WrtLogE("Internal Error during create or initialize Ewk Context"); + return false; + } + + ADD_PROFILING_POINT("view_logic_init", "start"); + Ewk_Context* context = m_ewkContextManager->getEwkContext(); + +#if ENABLE(ONE_UI_PROCESS_MODEL) + std::string msg = createInitMessage(DPL::ToUTF8String(m_widgetModel->TizenId)); + // plugin init + ewk_context_message_post_to_injected_bundle( + context, + Message::ToInjectedBundle::INIT, + msg.c_str()); +#else + // plugin init + ewk_context_message_post_to_injected_bundle( + context, + Message::ToInjectedBundle::INIT, + DPL::ToUTF8String(m_widgetModel->TizenId).c_str()); +#endif + // view init + if(!m_view->createWebView(context, window)) { + return false; + } + m_view->prepareView(m_widgetModel.get(), startUrl); + ADD_PROFILING_POINT("view_logic_init", "stop"); + + change.commit(); + return true; +} + +void RunnableWidgetObject::Show() +{ + State::StateChange change = m_guardstate->allowShow(); + + m_view->showWidget(); + + change.commit(); +} + +void RunnableWidgetObject::Hide() +{ + State::StateChange change = m_guardstate->allowHide(); + + m_view->hideWidget(); + + change.commit(); +} + +void RunnableWidgetObject::Suspend() +{ + WrtLogD("Suspending widget"); + State::StateChange change = m_guardstate->allowSuspend(); + m_view->suspendWidget(); + + change.commit(); +} + +void RunnableWidgetObject::Resume() +{ + WrtLogD("Resuming widget"); + State::StateChange change = m_guardstate->allowResume(); + m_view->resumeWidget(); + + change.commit(); +} + +void RunnableWidgetObject::ReloadUrl(const std::string &startUrl) +{ + m_view->setWidgetUrl(startUrl); +} + +void RunnableWidgetObject::Reset() +{ + WrtLogD("Reseting widget"); + State::StateChange change = m_guardstate->allowReset(); + if (m_guardstate->toString() == "SUSPENDED") { + m_view->resetWidgetFromSuspend(); + } else { + // PREPARED, SECURITY_CHECKED, SHOWED + m_view->resetWidgetFromResume(); + } + + change.commit(); +} + +void RunnableWidgetObject::ReloadStartPage() +{ + m_view->reloadStartPage(); +} + +Evas_Object* RunnableWidgetObject::GetCurrentWebview() +{ + State::StateChange change = m_guardstate->allowGetCurrentWebview(); + + Evas_Object* cww = m_view->getCurrentWebview(); + + change.commit(); + return cww; +} + +void RunnableWidgetObject::SetUserDelegates(const UserDelegatesPtr& cbs) +{ + State::StateChange change = m_guardstate->allowSetUserDelegates(); + m_view->setUserCallbacks(cbs); + change.commit(); +} + +void RunnableWidgetObject::Backward() +{ + State::StateChange change = m_guardstate->allowBackward(); + m_view->backward(); + + change.commit(); +} + +void RunnableWidgetObject::FireJavascriptEvent(int event, void* data) +{ + State::StateChange change = m_guardstate->allowFireJavascriptEvent(); + m_view->fireJavascriptEvent(event, data); + + change.commit(); +} + +void RunnableWidgetObject::setViewModule(ViewModule::IViewModulePtr ptr) +{ + WrtLogD("Setting ViewModule"); + m_view = ptr; +} + +void RunnableWidgetObject::setContextManagerFactoryMethod( + ViewModule::ContextManagerFactoryMethod method) +{ + WrtLogD("Setting ContextManagerFactoryMethod"); + m_contextManagerFactoryMethod = method; +} + +void RunnableWidgetObject::setNewState( + std::shared_ptr sptr) +{ + WrtLogD("RunnableWidgetObject changes state to: %s", sptr->toString().c_str()); + m_guardstate = sptr; +} + +void RunnableWidgetObject::HandleLowMemory() +{ + WrtLogD("RunnableWidgetObject HandleLowMemory"); + m_ewkContextManager->handleLowMemory(); +} + +#if ENABLE(ONE_UI_PROCESS_MODEL) +void RunnableWidgetObject::ResetAulConnection() +{ + WrtLogD("Reset aul connection"); + Ewk_Context* context = m_ewkContextManager->getEwkContext(); + ewk_context_message_post_to_injected_bundle( + context, + Message::ToInjectedBundle::RESET_AUL_CONNECTION, + DPL::ToUTF8String(m_widgetModel->TizenId).c_str()); +} + +void RunnableWidgetObject::SendIDEReply(const std::string &msg) +{ + WrtLogD("SendIDEReply"); + if (!msg.empty()) { + Ewk_Context* context = m_ewkContextManager->getEwkContext(); + ewk_context_message_post_to_injected_bundle( + context, + Message::ToInjectedBundle::REPLY_CLIENT, + msg.c_str()); + } +} +#endif + +RunnableWidgetObject::~RunnableWidgetObject() +{ + WrtLogD(""); + if(m_ewkContextManager) + { + ewk_context_message_post_to_injected_bundle( + m_ewkContextManager->getEwkContext(), + Message::ToInjectedBundle::SHUTDOWN, + DPL::ToUTF8String(m_widgetModel->TizenId).c_str()); + } + else + { + WrtLogE("ewk context manager is null"); + } +} +} /* namespace WRT */ diff --git a/src/api_new/runnable_widget_object.h b/src/api_new/runnable_widget_object.h new file mode 100644 index 0000000..32e4177 --- /dev/null +++ b/src/api_new/runnable_widget_object.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file core_module.cpp + * @author Przemyslaw Ciezkowski (p.ciezkowski@samsung.com) + * @version 1.0 + * @brief File contains defitinions of RunnableWidgetObject implementation. + */ + +#ifndef RUNNABLE_WIDGET_OBJECT_H_ +#define RUNNABLE_WIDGET_OBJECT_H_ + +//forward declaration +namespace WRT { +namespace State { +class RunnableWidgetObjectState; +class StateChange; +} +} + +#include "i_runnable_widget_object.h" + +#include +#include + +#include +#include +#include +#include + +namespace WRT { +class RunnableWidgetObject : public IRunnableWidgetObject +{ +public: + RunnableWidgetObject(WidgetModelPtr &model); + virtual ~RunnableWidgetObject(); + + bool PrepareView(const std::string &startUrl, + Evas_Object *window, Ewk_Context* ewkContext = NULL); + void Show(); //asynchronous function + void Hide(); + void Suspend(); + void Resume(); + void Reset(); + void ReloadUrl(const std::string &startUrl); + void ReloadStartPage(); + Evas_Object* GetCurrentWebview(); + void SetUserDelegates(const UserDelegatesPtr& cbs); + void Backward(); + void FireJavascriptEvent(int event, void* data); + + void setViewModule(ViewModule::IViewModulePtr ptr); + void setContextManagerFactoryMethod(ViewModule::ContextManagerFactoryMethod method); + void HandleLowMemory(); +#if ENABLE(ONE_UI_PROCESS_MODEL) + void ResetAulConnection(); + void SendIDEReply(const std::string &msg); +#endif + private: + + bool CheckWACTestCertififedWidget(); + void setNewState(std::shared_ptr sptr); + + WidgetModelPtr m_widgetModel; + ViewModule::IViewModulePtr m_view; + std::shared_ptr m_guardstate; + ViewModule::ContextManagerPtr m_ewkContextManager; + + //factor method to be used for creation of context manager when needed + ViewModule::ContextManagerFactoryMethod m_contextManagerFactoryMethod; + + friend class State::StateChange; +}; +} /* namespace WRT */ +#endif /* RUNNABLE_WIDGET_OBJECT_H_ */ diff --git a/src/api_new/runnable_widget_object_state.cpp b/src/api_new/runnable_widget_object_state.cpp new file mode 100644 index 0000000..b227f39 --- /dev/null +++ b/src/api_new/runnable_widget_object_state.cpp @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file core_module.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @version 1.0 + * @brief State classes for runnable object + */ + +#include "runnable_widget_object_state.h" +#include "runnable_widget_object.h" + +namespace WRT { +namespace State { +const StateChange StateChange::NoChange = StateChange(); + +StateChange::StateChange() +{} + +StateChange::StateChange(RunnableWidgetObjectStatePtr sptr) : + m_sptr(sptr) +{} + +void StateChange::commit() +{ + if (m_sptr) { + m_sptr->getObject().setNewState(m_sptr); + } +} + +RunnableWidgetObjectState::RunnableWidgetObjectState( + RunnableWidgetObject & object) : + m_object(object) +{} + +RunnableWidgetObjectState::~RunnableWidgetObjectState() +{} + +RunnableWidgetObject & RunnableWidgetObjectState::getObject() const +{ + return m_object; +} + +StateChange RunnableWidgetObjectState::allowPrepareView() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "PrepareView cannot be called in current state" << toString()); +} + +StateChange RunnableWidgetObjectState::allowShow() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Show cannot be called in current state" << toString()); +} + +StateChange RunnableWidgetObjectState::allowHide() +{ + return StateChange(RunnableWidgetObjectStatePtr(new HiddenState(m_object))); +} + +StateChange RunnableWidgetObjectState::allowSuspend() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Hide cannot be called in current state" << toString()); +} + +StateChange RunnableWidgetObjectState::allowResume() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Resume cannot be called in current state" << toString()); +} + +StateChange RunnableWidgetObjectState::allowReset() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Cannot reset in curretn state"); +} + +StateChange RunnableWidgetObjectState::allowGetCurrentWebview() +{ + return StateChange::NoChange; +} + +StateChange RunnableWidgetObjectState::allowSetUserDelegates() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "SetUserCallbacks cannot be called in current state"); +} + +StateChange RunnableWidgetObjectState::allowBackward() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Backward cannot be called in current state "); +} + +StateChange RunnableWidgetObjectState::allowForward() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Foreward cannot be called in current state "); +} + +StateChange RunnableWidgetObjectState::allowReload() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Reload cannot be called in current state "); +} + +StateChange RunnableWidgetObjectState::allowFireJavascriptEvent() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "FireJavascriptEvent cannot be called in current state "); +} + +InitialState::InitialState(RunnableWidgetObject & object) : + RunnableWidgetObjectState(object) +{} + +std::string InitialState::toString() const +{ + return "INITIAL"; +} + +StateChange InitialState::allowPrepareView() +{ + return StateChange(RunnableWidgetObjectStatePtr(new PreparedState(m_object))); +} + +StateChange InitialState::allowHide() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Cannot hide before RunnableWidgetObject initialization"); +} + +StateChange InitialState::allowGetCurrentWebview() +{ + ThrowMsg( + IRunnableWidgetObject::MethodInvocationForbidden, + "Cannot call GetCurrentWebview before RunnableWidgetObject initialization"); +} + +PreparedState::PreparedState(RunnableWidgetObject & object) : + RunnableWidgetObjectState(object) +{} + +std::string PreparedState::toString() const +{ + return "PREPARED"; +} + +StateChange PreparedState::allowSetUserDelegates() +{ + return StateChange::NoChange; +} + +StateChange PreparedState::allowShow() +{ + return StateChange(RunnableWidgetObjectStatePtr(new ShowedState(m_object))); +} + +ShowedState::ShowedState(RunnableWidgetObject & object) : + RunnableWidgetObjectState(object) +{} + +std::string ShowedState::toString() const +{ + return "SHOWED"; +} + +StateChange ShowedState::allowSuspend() +{ + return StateChange(RunnableWidgetObjectStatePtr(new SuspendedState(m_object))); +} + +StateChange ShowedState::allowBackward() +{ + return StateChange::NoChange; +} + +StateChange ShowedState::allowForward() +{ + return StateChange::NoChange; +} + +StateChange ShowedState::allowReload() +{ + return StateChange::NoChange; +} + +StateChange ShowedState::allowReset() +{ + return StateChange::NoChange; +} + +StateChange ShowedState::allowFireJavascriptEvent() +{ + return StateChange::NoChange; +} + +SuspendedState::SuspendedState(RunnableWidgetObject & object) : + RunnableWidgetObjectState(object) +{} + +std::string SuspendedState::toString() const +{ + return "SUSPENDED"; +} + +StateChange SuspendedState::allowResume() +{ + return StateChange(RunnableWidgetObjectStatePtr(new ShowedState(m_object))); +} + +StateChange SuspendedState::allowReset() +{ + return StateChange(RunnableWidgetObjectStatePtr(new ShowedState(m_object))); +} + +HiddenState::HiddenState(RunnableWidgetObject & object) : + RunnableWidgetObjectState(object) +{} + +std::string HiddenState::toString() const +{ + return "HIDEN"; +} + +StateChange HiddenState::allowHide() +{ + ThrowMsg(IRunnableWidgetObject::MethodInvocationForbidden, + "Hide cannot be called in current state" << toString()); +} +} +} diff --git a/src/api_new/runnable_widget_object_state.h b/src/api_new/runnable_widget_object_state.h new file mode 100644 index 0000000..e6c69b4 --- /dev/null +++ b/src/api_new/runnable_widget_object_state.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file core_module.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @version 1.0 + * @brief State classes for runnable object + */ +#ifndef RUNNABLE_WIDGET_OBJECT_STATE_H +#define RUNNABLE_WIDGET_OBJECT_STATE_H + +//forward declarations +namespace WRT { +class RunnableWidgetObject; + +namespace State { +class RunnableWidgetObjectState; +} +} + +#include + +#include + +namespace WRT { +namespace State { +typedef std::shared_ptr RunnableWidgetObjectStatePtr; + +/** + * @brief The StateChange class + * + * RunnableWidgetObject state change abstraction + */ +class StateChange +{ + public: + static const StateChange NoChange; + + StateChange(); + explicit StateChange(RunnableWidgetObjectStatePtr sptr); + + /** + * @brief commit actually performs change of state + */ + void commit(); + + private: + RunnableWidgetObjectStatePtr m_sptr; +}; + +/** + * @brief The RunnableWidgetObjectState class + * + * Base class for all runnable object states + * + * Allow methods should be called if referenced method are actually + * going to be called effectively. They return next state object. + * Call commit on this object to make change of state of RunnableWidgetObject + */ +class RunnableWidgetObjectState +{ + public: + explicit RunnableWidgetObjectState(RunnableWidgetObject & object); + virtual ~RunnableWidgetObjectState(); + + virtual StateChange allowPrepareView(); + virtual StateChange allowShow(); + virtual StateChange allowHide(); + virtual StateChange allowSuspend(); + virtual StateChange allowResume(); + virtual StateChange allowReset(); + virtual StateChange allowGetCurrentWebview(); + virtual StateChange allowSetUserDelegates(); + virtual StateChange allowBackward(); + virtual StateChange allowForward(); + virtual StateChange allowReload(); + virtual StateChange allowFireJavascriptEvent(); + + virtual std::string toString() const = 0; + virtual RunnableWidgetObject & getObject() const; + + protected: + RunnableWidgetObject & m_object; +}; + +/** + * INITIAL STATE + */ +class InitialState : public RunnableWidgetObjectState +{ + public: + explicit InitialState(RunnableWidgetObject & object); + std::string toString() const; + + StateChange allowPrepareView(); + StateChange allowHide(); + StateChange allowGetCurrentWebview(); +}; + +/** + * PREPARED STATE + */ +class PreparedState : public RunnableWidgetObjectState +{ + public: + explicit PreparedState(RunnableWidgetObject & object); + std::string toString() const; + + StateChange allowSetUserDelegates(); + StateChange allowShow(); +}; + +/** + * SHOWED STATE + */ +class ShowedState : public RunnableWidgetObjectState +{ + public: + explicit ShowedState(RunnableWidgetObject & object); + std::string toString() const; + + StateChange allowSuspend(); + StateChange allowBackward(); + StateChange allowForward(); + StateChange allowReload(); + StateChange allowReset(); + StateChange allowFireJavascriptEvent(); +}; + +/** + * SUSPENDED STATE + */ +class SuspendedState : public RunnableWidgetObjectState +{ + public: + explicit SuspendedState(RunnableWidgetObject & object); + std::string toString() const; + + StateChange allowResume(); + StateChange allowReset(); +}; + +/** + * HIDDEN STATE + */ +class HiddenState : public RunnableWidgetObjectState +{ + public: + explicit HiddenState(RunnableWidgetObject & object); + std::string toString() const; + + StateChange allowHide(); +}; +} +} + +#endif // RUNNABLE_WIDGET_OBJECT_STATE_H diff --git a/src/api_new/security_support.cpp b/src/api_new/security_support.cpp new file mode 100755 index 0000000..4e7882c --- /dev/null +++ b/src/api_new/security_support.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file client_security_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "security_support.h" + +#include + +#include +#include + +#include +#include + +namespace WRT { +namespace { +class Exception +{ +public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, GetAppInfoFailed) + DECLARE_EXCEPTION_TYPE(Base, GetAppInfoStrFailed) + DECLARE_EXCEPTION_TYPE(Base, SetPrivilegeFailed) +}; + +// Function declare +void destroyAppInfoHandle(ail_appinfo_h handle); +void getAppInfo(const std::string& tizenAppId, ail_appinfo_h* handle); +char* getExePath(ail_appinfo_h handle); +char* getPackageId(ail_appinfo_h handle); +char* getPackageType(ail_appinfo_h handle); + +void destroyAppInfoHandle(ail_appinfo_h handle) +{ + if (handle != NULL) + ail_destroy_appinfo(handle); +} + +void getAppInfo(const std::string& tizenAppId, ail_appinfo_h* handle) +{ + ail_error_e ret = ail_get_appinfo(tizenAppId.c_str(), handle); + if (ret != AIL_ERROR_OK) { + WrtLogE("error ail_get_appinfo : %d", ret); + Throw(Exception::GetAppInfoFailed); + } +} + +char* getExePath(ail_appinfo_h handle) +{ + char* str = NULL; + ail_error_e ret = ail_appinfo_get_str(handle, AIL_PROP_X_SLP_EXE_PATH, &str); + if (ret != AIL_ERROR_OK) { + WrtLogE("error ail_appinfo_get_str(%s) : %d", AIL_PROP_X_SLP_EXE_PATH, ret); + Throw(Exception::GetAppInfoStrFailed); + } + return str; +} + +char* getPackageId(ail_appinfo_h handle) +{ + char* str = NULL; + ail_error_e ret = ail_appinfo_get_str(handle, AIL_PROP_X_SLP_PKGID_STR, &str); + if (ret != AIL_ERROR_OK) { + WrtLogE("error ail_appinfo_get_str(%s) : %d", AIL_PROP_X_SLP_PKGID_STR, ret); + Throw(Exception::GetAppInfoStrFailed); + } + return str; +} + +char* getPackageType(ail_appinfo_h handle) +{ + char* str = NULL; + ail_error_e ret = ail_appinfo_get_str(handle, AIL_PROP_X_SLP_PACKAGETYPE_STR, &str); + if (ret != AIL_ERROR_OK) { + WrtLogE("error ail_appinfo_get_str(%s) : %d", AIL_PROP_X_SLP_PACKAGETYPE_STR, ret); + Throw(Exception::GetAppInfoStrFailed); + } + return str; +} +} // namespace anonymous + +bool SecuritySupport::setAppPrivilege(const std::string& tizenAppId) +{ + ail_appinfo_h handle = NULL; + Try + { + getAppInfo(tizenAppId, &handle); + char* path = getExePath(handle); + char* pkgId = getPackageId(handle); + char* type = getPackageType(handle); + + WrtLogD("Package ID : %s", pkgId); + WrtLogD("Package TYPE : %s", type); + WrtLogD("Package PATH : %s", path); + + int ret = perm_app_set_privilege(pkgId, type, path); + if (ret != PC_OPERATION_SUCCESS) { + WrtLogE("error perm_app_set_privilege : (%d)", ret); + Throw(Exception::SetPrivilegeFailed); + } + } + Catch(Exception::Base) + { + destroyAppInfoHandle(handle); + return false; + } + + destroyAppInfoHandle(handle); + return true; +} + +std::string SecuritySupport::getPluginProcessSoftLinkPath(const std::string& tzAppId) +{ + const std::string npruntimePostfix = ".npruntime"; + + ail_appinfo_h handle = NULL; + std::string appBinPath; + + Try + { + getAppInfo(tzAppId, &handle); + char* path = getExePath(handle); + appBinPath = path; + } + Catch(Exception::Base) + { + destroyAppInfoHandle(handle); + return ""; + } + + destroyAppInfoHandle(handle); + return appBinPath + npruntimePostfix; +} +} // WRT diff --git a/src/api_new/security_support.h b/src/api_new/security_support.h new file mode 100644 index 0000000..82de0ba --- /dev/null +++ b/src/api_new/security_support.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file client_security_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ +#ifndef SECURITY_SUPPORT_H_ +#define SECURITY_SUPPORT_H_ + +#include + +namespace WRT { +namespace SecuritySupport { +bool setAppPrivilege(const std::string& tizenAppId); +std::string getPluginProcessSoftLinkPath(const std::string& tzAppId); +} // namespace SecuritySupport +} // namespace WRT +#endif // SECURITY_SUPPORT_H_ diff --git a/src/api_new/user_delegates.h b/src/api_new/user_delegates.h new file mode 100755 index 0000000..37de6a9 --- /dev/null +++ b/src/api_new/user_delegates.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file user_delegates.h + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief user delegates + */ +#ifndef USER_DELEGATES_H +#define USER_DELEGATES_H + +#include +#include +#include + +#include + +namespace WRT { +typedef std::function SetWebviewCallback; +typedef std::function UnsetWebviewCallback; +typedef std::function LoadProgressStartedCallback; +typedef std::function LoadProgressCallback; +typedef std::function LoadProgressFinishedCallback; +typedef std::function LoadStartedCallback; +typedef std::function LoadFinishedCallback; +typedef std::function WebProcessCrashedCallback; +typedef std::function ProcessCrashedCallback; +typedef std::function PolicyNavigationDecideCallback; +typedef std::function ProcessExitCallback; +typedef std::function EnterFullscreenCallback; +typedef std::function ExitFullscreenCallback; +typedef std::function OrientationLockCallback; +typedef std::function KeyCallback; +typedef std::function ConsoleMessageCallback; +typedef std::function RotatePreparedCallback; +typedef std::function EnableVideoHwOverlayCallback; +typedef std::function DisableVideoHwOverlaycallback; +typedef std::function PopupReplyWaitStartCallback; +typedef std::function PopupReplyWaitFinishCallback; +typedef std::function FrameRenderedCallback; +typedef std::function BlockedUrlPolicyCallback; +typedef std::function IsCreateNewWindowAllowedCallback; +typedef std::function CreateContextMenuCallback; + +struct UserDelegates { + SetWebviewCallback setWebviewCallback; + UnsetWebviewCallback unsetWebviewCallback; + LoadProgressStartedCallback loadProgressStartedCallback; + LoadProgressCallback loadProgressCallback; + LoadProgressFinishedCallback loadProgressFinishedCallback; + LoadStartedCallback loadStartedCallback; + LoadFinishedCallback loadFinishedCallback; + WebProcessCrashedCallback webProcessCrashedCallback; + ProcessCrashedCallback processCrashedCallback; + PolicyNavigationDecideCallback policyNavigationDecideCallback; + ProcessExitCallback processExitCallback; + EnterFullscreenCallback enterFullscreenCallback; + ExitFullscreenCallback exitFullscreenCallback; + OrientationLockCallback orientationLockCallback; + KeyCallback keyCallback; + ConsoleMessageCallback consoleMessageCallback; + RotatePreparedCallback rotatePreparedCallback; + EnableVideoHwOverlayCallback enableVideoHwOverlayCallback; + DisableVideoHwOverlaycallback disableVideoHwOverlayCallback; + PopupReplyWaitStartCallback popupReplyWaitStartCallback; + PopupReplyWaitFinishCallback popupReplyWaitFinishCallback; + FrameRenderedCallback frameRenderedCallback; + BlockedUrlPolicyCallback blockedUrlPolicyCallback; + IsCreateNewWindowAllowedCallback isCreateNewWindowAllowedCallback; + CreateContextMenuCallback createContextMenuCallback; +}; + +typedef std::shared_ptr UserDelegatesPtr; +} + +#endif // USER_DELEGATES_H diff --git a/src/domain/DESCRIPTION b/src/domain/DESCRIPTION new file mode 100644 index 0000000..2f8c08b --- /dev/null +++ b/src/domain/DESCRIPTION @@ -0,0 +1 @@ +Collective folder for a number of modules diff --git a/src/domain/application_data.cpp b/src/domain/application_data.cpp new file mode 100644 index 0000000..4186515 --- /dev/null +++ b/src/domain/application_data.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file application_data.cpp + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 1.0 + * @brief implementation file for application_data.h + */ + +#include "application_data.h" + +#include +#include +#include + +IMPLEMENT_SAFE_SINGLETON(ApplicationData) + +ApplicationData::ApplicationData() +{} + +ApplicationData::~ApplicationData() +{} + +bundle* ApplicationData::getBundle(const std::string& appId) const +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_bundleDataMap.find(appId); + if (it == m_bundleDataMap.end()) { + WrtLogE("No data"); + return NULL; + } + + return it->second->originBundle; +} + +const char* ApplicationData::getEncodedBundle(const std::string& appId) const +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_bundleDataMap.find(appId); + if (it == m_bundleDataMap.end()) { + WrtLogE("No data"); + return NULL; + } + + return (const char*)it->second->encodedBundle; +} + +bool ApplicationData::setBundleData(const std::string& appId, bundle* originBundle) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + if (!originBundle) { + WrtLogE("bundle is empty!"); + Assert(false); + } + + auto it = m_bundleDataMap.find(appId); + if (it != m_bundleDataMap.end()) { + WrtLogE("already exist"); + return false; + } + + BundleDataPtr data(new BundleData); + data->originBundle = bundle_dup(originBundle); + + int len, ret; + ret = bundle_encode(originBundle, &data->encodedBundle, &len); + if (ret == -1) { + WrtLogE("Failed to encode bundle data"); + bundle_free(data->originBundle); + return false; + } + + m_bundleDataMap.insert(BundleDataMapPair(appId, data)); + + return true; +} + +void ApplicationData::freeBundleData(const std::string& appId) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_bundleDataMap.find(appId); + if (it == m_bundleDataMap.end()) { + WrtLogE("No data"); + return; + } + + bundle_free(it->second->originBundle); + bundle_free_encoded_rawdata(&it->second->encodedBundle); + m_bundleDataMap.erase(it); +} diff --git a/src/domain/application_data.h b/src/domain/application_data.h new file mode 100644 index 0000000..73590b6 --- /dev/null +++ b/src/domain/application_data.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file application_data.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 1.0 + * @brief Header file for application_data.h + */ + +#ifndef APPLICATION_DATA_H_ +#define APPLICATION_DATA_H_ + +#include +#include +#include + +#include +#include + +class ApplicationData +{ + public: + bundle* getBundle(const std::string& appId) const; + const char* getEncodedBundle(const std::string& appId) const; + bool setBundleData(const std::string& appId, bundle* originBundle); + void freeBundleData(const std::string& appId); + + private: + ApplicationData(); + ~ApplicationData(); + + typedef struct bundleData { + bundle* originBundle; + bundle_raw* encodedBundle; + } BundleData; + + typedef std::shared_ptr BundleDataPtr; + typedef std::map BundleDataMap; + typedef std::pair BundleDataMapPair; + + BundleDataMap m_bundleDataMap; + + friend class DPL::Singleton; +}; + +typedef DPL::Singleton ApplicationDataSingleton; + +#endif // APPLICATION_DATA_H_ \ No newline at end of file diff --git a/src/domain/iana_record_types.h b/src/domain/iana_record_types.h new file mode 100644 index 0000000..8f3bb6d --- /dev/null +++ b/src/domain/iana_record_types.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file iana_record_types.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + */ + +enum iana_record_types_e +{ + RECORD_TYPE_LANGUAGE, + RECORD_TYPE_SCRIPT, + RECORD_TYPE_REGION, + RECORD_TYPE_VARIANT, + RECORD_TYPE_GRANDFATHERED, + RECORD_TYPE_REDUNDANT, + RECORD_TYPE_EXTLANG +}; diff --git a/src/domain/localization_setting.cpp b/src/domain/localization_setting.cpp new file mode 100644 index 0000000..b3c5400 --- /dev/null +++ b/src/domain/localization_setting.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file localization_setting.cpp + * @author Soyoung Kim (sy037.kim@samsung.com) + * @version 1.0 + * @brief Localization setting implementation + */ + +#include "localization_setting.h" +#include + +#include + +namespace LocalizationSetting { +void SetLanguageChangedCallback(LanguageChangedCallback cb, void *data) +{ + WrtLogD("Set language changed callback"); + + appcore_set_event_callback( + APPCORE_EVENT_LANG_CHANGE, + cb, data); +} +} //Namespace LocalizationSetting diff --git a/src/domain/localization_setting.h b/src/domain/localization_setting.h new file mode 100644 index 0000000..573c100 --- /dev/null +++ b/src/domain/localization_setting.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file localization_setting.h + * @author Soyoung Kim (sy037.kim@samsung.com) + * @version 1.0 + * @brief localization setting implementation + */ +#ifndef LOCALIZATION_SETTING_H_ +#define LOCALIZATION_SETTING_H_ + +namespace LocalizationSetting { +typedef int (*LanguageChangedCallback)(void *eventInfo,void *data); + +void SetLanguageChangedCallback(LanguageChangedCallback cb, void *data); +} //LocalizationSetting + +#endif // ifndef LOCALIZATION_SETTING_H_ + diff --git a/src/domain/main_thread.cpp b/src/domain/main_thread.cpp new file mode 100644 index 0000000..6029df6 --- /dev/null +++ b/src/domain/main_thread.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file main_thread.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#include "main_thread.h" +#include +#include +#include +#include +#include +#include +#include +IMPLEMENT_SINGLETON(MainThread) + +using namespace WrtDB; + +MainThread::MainThread() : m_attached(false) {} + +MainThread::~MainThread() +{ + if (m_attached) { + WrtLogE("Destroyed without detach"); + } +} + +void MainThread::AttachDatabases() +{ + Assert(!m_attached); + // Attach databases + ace_return_t ret = ace_client_initialize(Wrt::Popup::run_popup); + Assert(ACE_OK == ret); + WrtDB::WrtDatabase::attachToThreadRO(); + m_attached = true; +} + +void MainThread::DetachDatabases() +{ + Assert(m_attached); + m_attached = false; + // Detach databases + ace_return_t ret = ace_client_shutdown(); + Assert(ACE_OK == ret); + WrtDB::WrtDatabase::detachFromThread(); +} diff --git a/src/domain/main_thread.h b/src/domain/main_thread.h new file mode 100644 index 0000000..df00289 --- /dev/null +++ b/src/domain/main_thread.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file main_thread.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#ifndef WRT_SRC_DOMAIN_MAINTHREAD_H_ +#define WRT_SRC_DOMAIN_MAINTHREAD_H_ + +#include + +class MainThread +{ + public: + void AttachDatabases(); + void DetachDatabases(); + + private: + friend class DPL::Singleton; + + MainThread(); + virtual ~MainThread(); + + bool m_attached; +}; + +typedef DPL::Singleton MainThreadSingleton; + +#endif /* WRT_SRC_DOMAIN_MAINTHREAD_H_ */ diff --git a/src/domain/message_support.h b/src/domain/message_support.h new file mode 100644 index 0000000..c66f64d --- /dev/null +++ b/src/domain/message_support.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file message_support.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @brief definition of messages between UI Process and Injected bundle + */ +#ifndef WRT_SRC_DOMAIN_MESSAGE_SUPPORT_H_ +#define WRT_SRC_DOMAIN_MESSAGE_SUPPORT_H_ + +#include + +namespace Message { + +namespace ToInjectedBundle { +const char * const INIT = "ToInjectedBundle::INIT"; +const char * const START = "ToInjectedBundle::START"; +const char * const SHUTDOWN = "ToInjectedBundle::SHUTDOWN"; +const char * const SET_CUSTOM_PROPERTIES = + "ToInjectedBundle::SET_CUSTOM_PROPERTIES"; +const char * const DISPATCH_JS_EVENT = "ToInjectedBundle::DISPATCH_JS_EVENT"; +const char * const SET_XWINDOW_HANDLE = "ToInjectedBundle::SET_XWINDOW_HANDLE"; +const char * const SET_VIEWMODES = "ToInjectedBundle::SET_VIEWMODES"; +const char * const SET_VIEWMODES_MSGBODY_EXIT = "exit"; +#if ENABLE(ONE_UI_PROCESS_MODEL) +const char * const RESET_AUL_CONNECTION = "ToInjectedBundle::RECONNECT"; +const char * const REPLY_CLIENT = "ToInjectedBundle::REPLYCLIENT"; +#endif +} // namespace ToInectedBundle + +namespace ToUIProcess { +const char * const BLOCKED_URL = "ToUIProcess::BLOCKED_URL"; +const char * const SEND_WEBPROCESS_PID = "ToUIProcess::SEND_WEBPROCESS_PID"; +} // namespace ToUIProcess + +namespace ToWebProcess { +const char * const CHANGE_CMDLINE = "ToWebProcess::ChangeCmdLine"; +} // namespace ToWebProcess + +namespace TizenScheme { +const char * const GET_WINDOW_HANDLE = "tizen://getWindowHandle"; +const char * const CLEAR_ALL_COOKIES = "tizen://clearAllCookies"; +} // namespace ToUIProcess + +} //namespace Message + +#endif // WRT_SRC_DOMAIN_MESSAGE_SUPPORT_H_ diff --git a/src/domain/permission_popup_manager.cpp b/src/domain/permission_popup_manager.cpp new file mode 100644 index 0000000..e2c1a8c --- /dev/null +++ b/src/domain/permission_popup_manager.cpp @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file permission_popup_manager.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "permission_popup_manager.h" + +#include +#include +#include +#include +#include + +IMPLEMENT_SAFE_SINGLETON(PermissionPopupManager) + +PermissionPopupManager::PermissionPopupManager() +{} + +PermissionPopupManager::~PermissionPopupManager() +{} + +void PermissionPopupManager::registerPopup(Evas_Object* webview, Evas_Object* popup) +{ + WrtLogD("register"); + + if (!webview || !popup) + { + WrtLogW("Wrong input argument"); + return; + } + addWebview(webview); + addPopup(popup); + m_pairList.push_back(Pair(webview, popup)); +} + +void PermissionPopupManager::unregisterWebview(Evas_Object* webview) +{ + WrtLogD("unegister"); + + FOREACH(it, m_pairList) + { + if (it->first == webview) + { + removePopup(it->second); + evas_object_del(it->second); + + // erase iterator + PairList::iterator next = it; + ++next; + m_pairList.erase(it); + it = next; + } + } + removeWebview(webview); +} + +void PermissionPopupManager::unregisterPopup(Evas_Object* popup) +{ + WrtLogD("unegister popup"); + + Evas_Object* webview = NULL; + + FOREACH(it, m_pairList) + { + if (it->second == popup) + { + webview = it->first; + removePopup(it->second); + + // erase iterator + PairList::iterator next = it; + ++next; + m_pairList.erase(it); + it = next; + } + } + + if (webview) + { + FOREACH(it, m_pairList) + { + if (it->first == webview) + { + // PairList still has webview usage. + // Do not clean-up webview data. + return; + } + } + removeWebview(webview); + } +} + +void PermissionPopupManager::addWebview(Evas_Object* webview) +{ + evas_object_event_callback_add(webview, EVAS_CALLBACK_DEL, deleteWebviewCallback, this); +} + +void PermissionPopupManager::addPopup(Evas_Object* popup) +{ + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deletePopupCallback, this); +} + +void PermissionPopupManager::removeWebview(Evas_Object* webview) +{ + evas_object_event_callback_del(webview, EVAS_CALLBACK_DEL, deleteWebviewCallback); +} + +void PermissionPopupManager::removePopup(Evas_Object* popup) +{ + evas_object_event_callback_del(popup, EVAS_CALLBACK_DEL, deletePopupCallback); +} + +void PermissionPopupManager::deleteWebviewCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + PermissionPopupManager* This = static_cast(data); + This->unregisterWebview(obj); +} + +void PermissionPopupManager::deletePopupCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + PermissionPopupManager* This = static_cast(data); + This->unregisterPopup(obj); +} + diff --git a/src/domain/permission_popup_manager.h b/src/domain/permission_popup_manager.h new file mode 100644 index 0000000..68cead1 --- /dev/null +++ b/src/domain/permission_popup_manager.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file permission_popup_manager.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef PERMISSION_POPUP_MANAGER_H_ +#define PERMISSION_POPUP_MANAGER_H_ + +#include +#include + +#include +#include + +class PermissionPopupManager +{ + public: + void registerPopup(Evas_Object* webview, Evas_Object* popup); + + private: + PermissionPopupManager(); + ~PermissionPopupManager(); + + void unregisterPopup(Evas_Object* popup); + void unregisterWebview(Evas_Object* webview); + + void addWebview(Evas_Object* webview); + void addPopup(Evas_Object* popup); + void removeWebview(Evas_Object* webview); + void removePopup(Evas_Object* popup); + + static void deleteWebviewCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); + static void deletePopupCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); + + typedef std::pair Pair; // std::pair + typedef std::list PairList; + PairList m_pairList; + + friend class DPL::Singleton; +}; + +typedef DPL::Singleton PermissionPopupManagerSingleton; + +#endif // PERMISSION_POPUP_MANAGER_H_ diff --git a/src/domain/widget_data_types.cpp b/src/domain/widget_data_types.cpp new file mode 100755 index 0000000..7fca8ac --- /dev/null +++ b/src/domain/widget_data_types.cpp @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file have been implemented in compliance with W3C WARP SPEC. + * but there are some patent issue between W3C WARP SPEC and APPLE. + * so if you want to use this file, refer to the README file in root directory + */ +/** + * @file widget_data_types.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @author Tomasz Iwanek (t.iwanek@samsung.com) (implementation moved to + * cpp) + * @version 0.1 + * @brief + */ + +#include + +#include + +#include +#include + +namespace { +const char* const WRT_WIDGET_DATA_TYPES_LOG_ENABLE = + "WRT_WIDGET_DATA_TYPES_LOG_ENABLE"; +} + +WidgetAccessList::WidgetAccessList() : m_isAccessAll(false) +{} + +WidgetAccessList::WidgetAccessList( + const WrtDB::WidgetAccessInfoList &widgetAccessInfoList) : + m_isAccessAll(false) +{ + FOREACH(it, widgetAccessInfoList) + { + if (DPL::FromUTF32String(L"*") == it->strIRI) { + m_isAccessAll = true; + m_warpIriList.clear(); + return; + } + + WarpIRI warpIri; + + warpIri.set(DPL::ToUTF8String(it->strIRI).c_str(), + it->bSubDomains); + + if (warpIri.isAccessDefinition()) { + m_warpIriList.push_back(warpIri); + } + } +} + +bool WidgetAccessList::getIsAccessAll() const +{ + return m_isAccessAll; +} + +const WarpIRIList* WidgetAccessList::getWarpIRIList() const +{ + return &m_warpIriList; +} + +bool WidgetAccessList::isRequiredIRI(const DPL::String &iri) const +{ + if (m_isAccessAll) { + return true; + } + + WarpIRI requestIri; + requestIri.set(iri.c_str(), false); + + FOREACH(it, m_warpIriList) + { + if (it->isSubDomain(requestIri)) { + return true; + } + } + + return false; +} + +bool WidgetAccessList::operator ==(const WidgetAccessList& other) const +{ + return m_warpIriList == other.m_warpIriList && + m_isAccessAll == other.m_isAccessAll; +} + +WidgetSettingList::WidgetSettingList() : + m_RotationLock(Screen_Portrait), + m_IndicatorPresence(Indicator_Enable), + m_BackButtonPresence(BackButton_Disable), + m_ContextMenu(ContextMenu_Enable), + m_Encryption(Encryption_Disable), + m_BackgroundSupport(BackgroundSupport_Disable), + m_ProgressbarPresence(ProgressBar_Disable), + m_HWkeyEvent(HWkeyEvent_Enable), +#if USE(EA_SCREEN_READER) + m_Accessibility(Accessibility_Enable), +#endif + m_SoundMode(SoundMode_Shared), + m_BackgroundVibration(BackgroundVibration_Disable) +{ + m_logEnable = (getenv(WRT_WIDGET_DATA_TYPES_LOG_ENABLE) != NULL); +} + +WidgetSettingList::WidgetSettingList(WrtDB::WidgetSettings &widgetSettings) +{ + using namespace TizenSetting::Name; + using namespace TizenSetting::Value; + + m_logEnable = (getenv(WRT_WIDGET_DATA_TYPES_LOG_ENABLE) != NULL); + + m_RotationLock = Screen_Portrait; + m_IndicatorPresence = Indicator_Enable; + m_BackButtonPresence = BackButton_Disable; + m_ContextMenu = ContextMenu_Enable; + m_Encryption = Encryption_Disable; + m_BackgroundSupport = BackgroundSupport_Disable; + m_ProgressbarPresence = ProgressBar_Disable; + m_HWkeyEvent = HWkeyEvent_Enable; +#if USE(EA_SCREEN_READER) + m_Accessibility = Accessibility_Enable; +#endif + m_SoundMode = SoundMode_Shared; + m_BackgroundVibration = BackgroundVibration_Disable; + + FOREACH(it, widgetSettings) { + DPL::String name = it->settingName; + DPL::String value = it->settingValue; + + if (name == SCREEN_ORIENTATION) { + if (value == SCREEN_ORIENTATION_PORTRAIT) { + m_RotationLock = Screen_Portrait; + } else if (value == SCREEN_ORIENTATION_LANDSCAPE) { + m_RotationLock = Screen_Landscape; + } else if (value == SCREEN_ORIENTATION_AUTO_ROTATION) { + m_RotationLock = Screen_AutoRotation; + } else { + displayError(name, value); + m_RotationLock = Screen_Portrait; + } + } else if (name == INDICATOR_PRESENCE) { + if (value == INDICATOR_PRESENCE_ENALBE) { + m_IndicatorPresence = Indicator_Enable; + } else if (value == INDICATOR_PRESENCE_DISABLE) { + m_IndicatorPresence = Indicator_Disable; + } else { + displayError(name, value); + m_IndicatorPresence = Indicator_Enable; + } + } else if (name == BACKBUTTON_PRESENCE) { + if (value == BACKBUTTON_PRESENCE_ENALBE) { + m_BackButtonPresence = BackButton_Enable; + } else if (value == BACKBUTTON_PRESENCE_DISABLE) { + m_BackButtonPresence = BackButton_Disable; + } else { + displayError(name, value); + m_BackButtonPresence = BackButton_Disable; + } + } else if (name == CONTEXT_MENU) { + if (value == CONTEXT_MENU_ENABLE) { + m_ContextMenu = ContextMenu_Enable; + } else if (value == CONTEXT_MENU_DISABLE) { + m_ContextMenu = ContextMenu_Disable; + } else { + displayError(name, value); + m_ContextMenu = ContextMenu_Enable; + } + } else if (name == ENCRYPTION) { + if (value == ENCRYPTION_ENABLE) { + m_Encryption = Encryption_Enable; + } else if (value == ENCRYPTION_DISABLE) { + m_Encryption = Encryption_Disable; + } else { + displayError(name, value); + m_Encryption = Encryption_Disable; + } + } else if (name == BACKGROUND_SUPPORT) { + if (value == ENABLE) { + m_BackgroundSupport = BackgroundSupport_Enable; + } else if (value == DISABLE) { + m_BackgroundSupport = BackgroundSupport_Disable; + } else { + displayError(name, value); + m_BackgroundSupport = BackgroundSupport_Disable; + } + } +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) + else if (name == USER_AGENT) { + DPL::OptionalString userAgent = value; + if (!!userAgent) { + m_UserAgent = DPL::ToUTF8String(*userAgent); + } + } +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + else if (name == PROGRESSBAR_PRESENCE) { + if (value == PROGRESSBAR_PRESENCE_ENABLE) { + m_ProgressbarPresence = ProgressBar_Enable; + } else if (value == PROGRESSBAR_PRESENCE_DISABLE) { + m_ProgressbarPresence = ProgressBar_Disable; + } else { + displayError(name, value); + m_ProgressbarPresence = ProgressBar_Disable; + } + } else if (name == HWKEY_EVENT) { + if (value == HWKEY_EVENT_ENABLE) { + m_HWkeyEvent = HWkeyEvent_Enable; + } else if (value == HWKEY_EVENT_DISABLE) { + m_HWkeyEvent = HWkeyEvent_Disable; + } else { + displayError(name, value); + m_HWkeyEvent = HWkeyEvent_Enable; + } + } +#if USE(EA_SCREEN_READER) + else if (name == ACCESSIBILITY) { + if (value == ACCESSIBILITY_ENABLE) { + m_Accessibility = Accessibility_Enable; + } else if (value == ACCESSIBILITY_DISABLE) { + m_Accessibility = Accessibility_Disable; + } else { + displayError(name, value); + m_Accessibility = Accessibility_Enable; + } + } +#endif + else if (name == SOUND_MODE) { + if (value == SOUND_MODE_SAHRED) { + m_SoundMode = SoundMode_Shared; + } else if (value == SOUND_MODE_EXCLUSIVE) { + m_SoundMode = SoundMode_Exclusive; + } else { + displayError(name, value); + m_SoundMode = SoundMode_Shared; + } + } else if (name == BACKGROUND_VIBRATION) { + if (value == ENABLE) { + m_BackgroundVibration = BackgroundVibration_Enable; + } else if (value == DISABLE) { + m_BackgroundVibration = BackgroundVibration_Disable; + } else { + displayError(name, value); + m_BackgroundVibration = BackgroundVibration_Disable; + } + } else { + displayError(name, value); + } + } +} + +WidgetSettingScreenLock WidgetSettingList::getRotationValue() const +{ + if (m_logEnable) {WrtLogD("m_RotationLock: %d", m_RotationLock);} + return m_RotationLock; +} + +WidgetSettingIndicatorPresence WidgetSettingList::getIndicatorPresence() const +{ + if (m_logEnable) {WrtLogD("m_IndicatorPresence: %d", m_IndicatorPresence);} + return m_IndicatorPresence; +} + +WidgetSettingBackButtonPresence WidgetSettingList::getBackButtonPresence() +const +{ + if (m_logEnable) {WrtLogD("m_BackButtonPresence: %d", m_BackButtonPresence);} + return m_BackButtonPresence; +} + +WidgetSettingContextMenu WidgetSettingList::getContextMenu() const +{ + if (m_logEnable) {WrtLogD("m_ContextMenu: %d", m_ContextMenu);} + return m_ContextMenu; +} + +WidgetSettingEncryption WidgetSettingList::getEncryption() const +{ + if (m_logEnable) {WrtLogD("m_Encryption: %d", m_Encryption);} + return m_Encryption; +} + +WidgetSettingBackgroundSupport WidgetSettingList::getBackgroundSupport() const +{ + if (m_logEnable) {WrtLogD("m_BackgroundSupport: %d", m_BackgroundSupport);} + return m_BackgroundSupport; +} + +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) +std::string WidgetSettingList::getUserAgent() const +{ + if (m_logEnable) {WrtLogD("m_UserAgent: %s", m_UserAgent.c_str());} + return m_UserAgent; +} +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + +WidgetSettingProgressBarPresence WidgetSettingList::getProgressBarPresence() const +{ + if (m_logEnable) {WrtLogD("m_ProgressbarPresence: %d", m_ProgressbarPresence);} + return m_ProgressbarPresence; +} + +WidgetSettingHWkeyEventPresence WidgetSettingList::getHWkeyEvent() const +{ + if (m_logEnable) {WrtLogD("m_HWkeyEvent: %d", m_HWkeyEvent);} + return m_HWkeyEvent; +} + +#if USE(EA_SCREEN_READER) +WidgetSettingAccessibility WidgetSettingList::getAccessibility() const +{ + if (m_logEnable) {WrtLogD("m_Accessibility: %d", m_Accessibility);} + return m_Accessibility; +} +#endif + +WidgetSettingSoundMode WidgetSettingList::getSoundMode() const +{ + if (m_logEnable) {WrtLogD("m_SoundMode: %d", m_SoundMode);} + return m_SoundMode; +} + +WidgetSettingBackgroundVibration WidgetSettingList::getBackgroundVibration() const +{ + if (m_logEnable) {WrtLogD("m_BackgroundVibration: %d", m_BackgroundVibration);} + return m_BackgroundVibration; +} + +bool WidgetSettingList::operator ==(const WidgetSettingList& other) const +{ + return m_RotationLock == other.m_RotationLock && + m_IndicatorPresence == other.m_IndicatorPresence && + m_BackButtonPresence == other.m_BackButtonPresence && + m_ContextMenu == other.m_ContextMenu && + m_Encryption == other.m_Encryption && + m_BackgroundSupport == other.m_BackgroundSupport && +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) + m_UserAgent == other.m_UserAgent && +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + m_ProgressbarPresence == other.m_ProgressbarPresence && + m_HWkeyEvent == other.m_HWkeyEvent && +#if USE(EA_SCREEN_READER) + m_Accessibility == other.m_Accessibility && +#endif + m_SoundMode == other.m_SoundMode && + m_BackgroundVibration== other.m_BackgroundVibration; + +} + +void WidgetSettingList::displayError(const DPL::String& name, + const DPL::String& value) +{ + WrtLogW("Invalid \"%s\" setting value \"%s\"", + DPL::ToUTF8String(name).c_str(), + DPL::ToUTF8String(value).c_str()); +} diff --git a/src/domain/widget_data_types.h b/src/domain/widget_data_types.h new file mode 100755 index 0000000..126500f --- /dev/null +++ b/src/domain/widget_data_types.h @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file have been implemented in compliance with W3C WARP SPEC. + * but there are some patent issue between W3C WARP SPEC and APPLE. + * so if you want to use this file, refer to the README file in root directory + */ +/** + * @file widget_data_types.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 0.1 + * @brief + */ + +#ifndef WRT_SRC_DOMAIN_WIDGET_DATA_TYPES_H_ +#define WRT_SRC_DOMAIN_WIDGET_DATA_TYPES_H_ + +#include +#include + +#include +#include +#include +#include +#include + +// WidgetIcon, LanguageTagsList, OptionalWidgetStartFileInfo, +// WidgetStartFileInfo +#include + +typedef std::list WarpIRIList; + +/** + * @brief Execution phase according to BONDI + * + * WidgetExecutionPhase_Unknown: + * Execution state is not defined + * + * WidgetExecutionPhase_WidgetInstall: + * Applies to access control queries made by a Widget User Agent during the + * processing of a Widget Resource as part of an installation or update + * operation + * + * WidgetExecutionPhase_WidgetInstantiate: + * Applies to access control queries made by a Widget User Agent during the + * instantiation of a Widget + * + * WidgetExecutionPhase_WebkitBind: + * Applies to access control queries made in response to a call to + * requestFeature() in the course of execution of a Website + * + * WidgetExecutionPhase_Invoke: + * Applies to access control queries made in response to invocation of a + * JavaScript API in the course of execution of a Web Application + */ +//enum WidgetExecutionPhase +//{ +// WidgetExecutionPhase_Unknown = 0, +// WidgetExecutionPhase_WidgetInstall = 1 << 0, +// WidgetExecutionPhase_WidgetInstantiate = 1 << 1, +// WidgetExecutionPhase_WebkitBind = 1 << 2, +// WidgetExecutionPhase_Invoke = 1 << 3 +//}; + +class WidgetModel; + +class WidgetAccessList +{ + public: + WidgetAccessList(); + + WidgetAccessList(const WrtDB::WidgetAccessInfoList &widgetAccessInfoList); + + bool getIsAccessAll() const; + + const WarpIRIList* getWarpIRIList() const; + + bool isRequiredIRI(const DPL::String &iri) const; + + bool operator ==(const WidgetAccessList& other) const; + + private: + WarpIRIList m_warpIriList; + bool m_isAccessAll; +}; + +namespace TizenSetting { +namespace Name { +const DPL::String SCREEN_ORIENTATION = L"screen-orientation"; +const DPL::String INDICATOR_PRESENCE = L"indicator-presence"; +const DPL::String BACKBUTTON_PRESENCE = L"backbutton-presence"; +const DPL::String CONTEXT_MENU = L"context-menu"; +const DPL::String BACKGROUND_SUPPORT = L"background-support"; +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) +const DPL::String USER_AGENT = L"user-agent"; +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) +const DPL::String PROGRESSBAR_PRESENCE = L"progressbar-presence"; +const DPL::String HWKEY_EVENT = L"hwkey-event"; +const DPL::String ACCESSIBILITY = L"accessibility"; +const DPL::String SOUND_MODE = L"sound-mode"; +const DPL::String ENCRYPTION = L"encryption"; +const DPL::String BACKGROUND_VIBRATION = L"background-vibration"; +} // namespace Name +namespace Value { +const DPL::String ENABLE = L"enable"; +const DPL::String DISABLE = L"disable"; +const DPL::String SCREEN_ORIENTATION_PORTRAIT = L"portrait"; +const DPL::String SCREEN_ORIENTATION_LANDSCAPE = L"landscape"; +const DPL::String SCREEN_ORIENTATION_AUTO_ROTATION = L"auto-rotation"; +const DPL::String INDICATOR_PRESENCE_ENALBE = ENABLE; +const DPL::String INDICATOR_PRESENCE_DISABLE = DISABLE; +const DPL::String BACKBUTTON_PRESENCE_ENALBE = ENABLE; +const DPL::String BACKBUTTON_PRESENCE_DISABLE = DISABLE; +const DPL::String CONTEXT_MENU_ENABLE = ENABLE; +const DPL::String CONTEXT_MENU_DISABLE = DISABLE; +const DPL::String ENCRYPTION_ENABLE = ENABLE; +const DPL::String ENCRYPTION_DISABLE = DISABLE; +const DPL::String PROGRESSBAR_PRESENCE_ENABLE = ENABLE; +const DPL::String PROGRESSBAR_PRESENCE_DISABLE = DISABLE; +const DPL::String HWKEY_EVENT_ENABLE = ENABLE; +const DPL::String HWKEY_EVENT_DISABLE = DISABLE; +#if USE(EA_SCREEN_READER) +const DPL::String ACCESSIBILITY_ENABLE = ENABLE; +const DPL::String ACCESSIBILITY_DISABLE = DISABLE; +#endif +const DPL::String SOUND_MODE_SAHRED = L"shared"; +const DPL::String SOUND_MODE_EXCLUSIVE = L"exclusive"; +} // namespace Value +} // namespace TizenSetting + +enum WidgetSettingScreenLock +{ + Screen_Portrait, /* Default */ + Screen_Landscape, + Screen_AutoRotation +}; + +enum WidgetSettingIndicatorPresence +{ + Indicator_Enable, /* Default */ + Indicator_Disable +}; + +enum WidgetSettingBackButtonPresence +{ + BackButton_Enable, + BackButton_Disable /* Default */ +}; + +enum WidgetSettingContextMenu +{ + ContextMenu_Enable, /* Default */ + ContextMenu_Disable +}; + +enum WidgetSettingEncryption +{ + Encryption_Enable, + Encryption_Disable /* Default */ +}; + +enum WidgetSettingBackgroundSupport +{ + BackgroundSupport_Enable, + BackgroundSupport_Disable /* Default */ +}; + +enum WidgetSettingProgressBarPresence +{ + ProgressBar_Enable, + ProgressBar_Disable /* Default */ +}; + +enum WidgetSettingHWkeyEventPresence +{ + HWkeyEvent_Enable, /* Default */ + HWkeyEvent_Disable +}; + +#if USE(EA_SCREEN_READER) +enum WidgetSettingAccessibility +{ + Accessibility_Enable, /* Default */ + Accessibility_Disable +}; +#endif + +enum WidgetSettingSoundMode +{ + SoundMode_Shared, /* Default */ + SoundMode_Exclusive +}; + +enum WidgetSettingBackgroundVibration +{ + BackgroundVibration_Enable, + BackgroundVibration_Disable /* Default */ +}; + +class WidgetSettingList +{ + public: + WidgetSettingList(); + WidgetSettingList(WrtDB::WidgetSettings &widgetSettings); + + WidgetSettingScreenLock getRotationValue() const; + WidgetSettingIndicatorPresence getIndicatorPresence() const; + WidgetSettingBackButtonPresence getBackButtonPresence() const; + WidgetSettingContextMenu getContextMenu() const; + WidgetSettingEncryption getEncryption() const; + WidgetSettingBackgroundSupport getBackgroundSupport() const; +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) + std::string getUserAgent() const; +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + WidgetSettingProgressBarPresence getProgressBarPresence() const; + WidgetSettingHWkeyEventPresence getHWkeyEvent() const; +#if USE(EA_SCREEN_READER) + WidgetSettingAccessibility getAccessibility() const; +#endif + WidgetSettingSoundMode getSoundMode() const; + WidgetSettingBackgroundVibration getBackgroundVibration() const; + bool operator ==(const WidgetSettingList& other) const; + + private: + void displayError(const DPL::String& name, const DPL::String& value); + + bool m_logEnable; + WidgetSettingScreenLock m_RotationLock; + WidgetSettingIndicatorPresence m_IndicatorPresence; + WidgetSettingBackButtonPresence m_BackButtonPresence; + WidgetSettingContextMenu m_ContextMenu; + WidgetSettingEncryption m_Encryption; + WidgetSettingBackgroundSupport m_BackgroundSupport; + WidgetSettingProgressBarPresence m_ProgressbarPresence; + WidgetSettingHWkeyEventPresence m_HWkeyEvent; +#if USE(EA_SCREEN_READER) + WidgetSettingAccessibility m_Accessibility; +#endif + WidgetSettingSoundMode m_SoundMode; + WidgetSettingBackgroundVibration m_BackgroundVibration; +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) + std::string m_UserAgent; +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) +}; +typedef std::shared_ptr WidgetSettingListPtr; + +namespace OrientationAngle { +namespace W3C { +namespace Portrait { +const int PRIMARY = 0; +const int SECONDARY = 180; +} // namespace Portrait +namespace Landscape { +const int PRIMARY = 90; +const int SECONDARY = -90; +} // namespace Landscape +} // namespace W3C +namespace Window { +namespace Portrait { +const int PRIMARY = 0; +const int SECONDARY = 180; +} // namespace Portrait +namespace Landscape { +const int PRIMARY = 270; +const int SECONDARY = 90; +} // namespace Landscape +const int UNLOCK = -1; +} // namespace Window +} // namespace OrientationAngle + +namespace KeyName { +const std::string BACK = "back"; +const std::string MENU = "menu"; +} // KeyName + +enum ConsoleLogLevel { + Debug = 0, + Warning = 1, + Error = 2, +}; +#endif /* WRT_SRC_DOMAIN_WIDGET_DATA_TYPES_H_ */ diff --git a/src/domain/widget_deserialize_model.cpp b/src/domain/widget_deserialize_model.cpp new file mode 100644 index 0000000..842506d --- /dev/null +++ b/src/domain/widget_deserialize_model.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file widget_deserialize_model.h + * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) + * @version 1.0 + * @brief Widget deserialization creates WidgetModel from WidgetDAOReadOnly + */ + +#include "widget_model.h" + +#include +#include +#include +#include +// to apply widget default locales instead of calling localizeWidgetModel() +#include + +namespace Domain { +std::string getTimestamp() +{ + struct timeval tv; + char buff[128]; + + gettimeofday(&tv, NULL); + sprintf(buff, "%lf", (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f); + WrtLogD("timestamp: %s", buff); + return std::string(buff); +} + +std::shared_ptr deserializeWidgetModel(const std::string& tizenId) +{ + std::shared_ptr model; + DPL::String dplTizenId(DPL::FromUTF8String(tizenId)); + if (WrtDB::WidgetDAOReadOnly::isWidgetInstalled(dplTizenId)) { + WrtLogD("Widget installed - creating model"); + model.reset(new WidgetModel(tizenId)); + + WrtDB::WidgetDAOReadOnly dao(dplTizenId); + DPL::String pkgId = dao.getTizenPkgId(); + model->PersistentStoragePath.Set( + DPL::FromUTF8String( + WrtDB::WidgetConfig::GetWidgetPersistentStoragePath(pkgId))); + model->TemporaryStoragePath.Set( + DPL::FromUTF8String( + WrtDB::WidgetConfig::GetWidgetTemporaryStoragePath(pkgId))); + + DPL::OptionalString defloc = model->defaultlocale.Get(); + if (!!defloc) { + LanguageTagsProviderSingleton::Instance().addWidgetDefaultLocales( + *defloc); + } + + WrtDB::WidgetAccessInfoList widgetAccessInfoList; + // widgetAccessInfoList is output parameter + dao.getWidgetAccessInfo(widgetAccessInfoList); + model->AccessList.Set(widgetAccessInfoList); + + // Widget app-control information data + WrtDB::WidgetAppControlList widgetApplicationControlList; + // widgetApplicationControlList is output parameter + dao.getAppControlList(widgetApplicationControlList); + model->AppControlList.Set(widgetApplicationControlList); + + // Set Widget Settings + WrtDB::WidgetSettings widgetSettings; + dao.getWidgetSettings(widgetSettings); + model->SettingList.Set(widgetSettings); + } else { + WrtLogE("Widget is not installed - model not created"); + } + return model; +} + +} //Namespace Domain + diff --git a/src/domain/widget_deserialize_model.h b/src/domain/widget_deserialize_model.h new file mode 100644 index 0000000..5e277ed --- /dev/null +++ b/src/domain/widget_deserialize_model.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file widget_deserialize_model.h + * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) + * @version 1.0 + * @brief Widget deserialization creates WidgetModel from WidgetDAO + */ +#ifndef WRT_ENGINE_SRC_DOMAIN_WIDGET_DESERIALIZE_MODEL_H_ +#define WRT_ENGINE_SRC_DOMAIN_WIDGET_DESERIALIZE_MODEL_H_ + +#include +#include +#include +#include +#include + +namespace Domain { +/** + * @brief Creates widget model associated with selected + * @param[in] tizenId + * @param[in] service index, NULL for widget content + * @retval WidgetModel + */ + std::shared_ptr deserializeWidgetModel(const std::string& tizenId); +} //Namespace Domain + +#endif // ifndef WRT_ENGINE_SRC_DOMAIN_WIDGET_DESERIALIZE_MODEL_H_ + diff --git a/src/domain/widget_model.cpp b/src/domain/widget_model.cpp new file mode 100644 index 0000000..7f806fe --- /dev/null +++ b/src/domain/widget_model.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file widget_model.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief Implementation file for widget model + */ +#include "widget_model.h" + +#include +#include +#include +#include +#include + +using namespace WrtDB; + +template +struct BindToWidgetDAO : + DPL::Event::BindToDAO +{}; + +template +struct BindToWidgetDAOStatic : + DPL::Event::BindToDAO_Static +{}; + +WidgetModel::WidgetModel(const std::string &tizenId) : + TizenId(DPL::FromASCIIString(tizenId)), + TzPkgId(this, &BindToWidgetDAO::Get), + Type(this, &BindToWidgetDAO::Get), + CspPolicy(this, &BindToWidgetDAO::Get), + CspReportOnlyPolicy(this, &BindToWidgetDAO::Get), + StartURL(this), + //localized, so not binded + StartFileInfo(this), +#if ENABLE(APP_SCHEME) + PrefixURL(this, DPL::String(L"app://") + DPL::FromASCIIString(tizenId) + DPL::String(L"/")), +#else + //localized, so not binded + // file:// + / : without "/" path, webkit return security error + PrefixURL(this, DPL::String(L"file:///")), +#endif + InstallPath( + this, + &BindToWidgetDAO::Get), + PersistentStoragePath(this), + TemporaryStoragePath(this), + defaultlocale( + this, + &BindToWidgetDAO::Get), + Name(this), + //localized, so not binded + ShortName(this), + //localized, so not binded + Description(this), + //localized, so not binded + License(this), + //localized, so not binded + LicenseHref(this), + //localized, so not binded + Icon(this), + SplashImg( + this, + &BindToWidgetDAO::Get), + RequiredVersion(this, &BindToWidgetDAO::Get), + WindowModes( + this, + &BindToWidgetDAO::Get), + //localized, so not binded + // AccessNetwork(this, false), + // WarpDefinitionEmpty(this), + BackSupported( + this, + //TODO this type has to be here now, as Property constructor is wrongly + //chosen + (DPL::Event::Property:: + ReadDelegateType) & + BindToWidgetDAO::Get), + AccessList(this), + SettingList(this), + AppControlList(this), + WidgetPrivilegeList(this, &BindToWidgetDAO::Get), + SecurityModelVersion(this, &BindToWidgetDAO::Get) +{} + +DPL::String WidgetModel::getTizenId() const +{ + return TizenId; +} diff --git a/src/domain/widget_model.h b/src/domain/widget_model.h new file mode 100644 index 0000000..48aa76c --- /dev/null +++ b/src/domain/widget_model.h @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file widget_model.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief Header file for widget model + */ +#ifndef SRC_DOMAIN_WIDGET_MODEL_H +#define SRC_DOMAIN_WIDGET_MODEL_H + +#include +#include + +#include +#include +#include +#include // definition of WidgetHandle + +#include "widget_data_types.h" + +/** + * @brief Widget model + * + * Widget model is the core object that hold information about + * properties of widget. After wrt launch each widget contained in database is + * mapped to WidgetModel. + * + * Widget model is a type of MVC model, so it is possible to listen for it's + * changes. + * + */ +class WidgetModel : public DPL::Event::Model +{ + public: + + /** + * @brief Tizen id + * + * ex> "TizenIDabc.appname" + * + * - TizenId / AppId : "TizenIDabc.appname" + * - TzPkgId : "TizenIDabc" + * - App name : "appname" + * + */ + DPL::String TizenId; + DPL::Event::Property TzPkgId; + + /** + * @brief Widget type + * + * Note: This is a readonly property + */ + DPL::Event::Property Type; + + /** + * @brief Config file based csp policy + */ + DPL::Event::Property CspPolicy; + + /** + * @brief Config file based csp policy - report only + */ + DPL::Event::Property + CspReportOnlyPolicy; + + /** + * @brief Start URL for widget + */ + DPL::Event::Property StartURL; + + /** + * @brief Start URL information for widget + */ + DPL::Event::Property StartFileInfo; + + /** + * @brief Prefix URL for widget + * + * This is a prefix address of html file that widget is displaying. + * The whole address is PrefixURL + StartURL. + */ + DPL::Event::Property PrefixURL; + + /** + * @brief Install path for widget + * + * Gets path in which files of widget are being kept + */ + DPL::Event::Property InstallPath; + + /** + * @brief Path to widget's persistent storage. + * + * Gets path in which widget may store its persistent private data. + */ + DPL::Event::Property PersistentStoragePath; + + /** + * @brief Path to widget's temporary storage. + * + * Gets path in which widget may store its temporary private data. + */ + DPL::Event::Property TemporaryStoragePath; + + /** + * @brief Widget defaultlocale + */ + DPL::Event::Property + defaultlocale; + + /** + * @brief Widget name + */ + DPL::Event::Property Name; + + /** + * @brief Widget short name + */ + DPL::Event::Property ShortName; + + /** + * @brief Widget description + */ + DPL::Event::Property Description; + + /** + * @brief Widget license + */ + DPL::Event::Property License; + + /** + * @brief Widget license href + */ + DPL::Event::Property LicenseHref; + + /** + * @brief Widget icon + */ + DPL::Event::Property Icon; + + /** + * @brief Widget splash image src + */ + DPL::Event::Property SplashImg; + + /** + * @brief Widget TizenRequired(minimum) Version + */ + DPL::Event::Property RequiredVersion; + + /** + * @brief window mode + */ + DPL::Event::Property WindowModes; + + // /** + // * @brief Value of network element. + // */ + // DPL::Event::Property AccessNetwork; + + // /** + // * @brief Does widget contain WARP definitions. + // */ + // DPL::Event::Property WarpDefinitionEmpty; + + /** + * @brief Is back supported + */ + DPL::Event::Property + BackSupported; + + /** + * @brief Widget access list + */ + DPL::Event::Property AccessList; + + DPL::Event::Property SettingList; + + /** + * @brief Widget app-control list + */ + DPL::Event::Property AppControlList; + + /** + * @brief Widget Privilege list + */ + DPL::Event::Property WidgetPrivilegeList; + + DPL::Event::Property SecurityModelVersion; + + WidgetModel(const std::string &tizenId); + + private: + DPL::String getTizenId() const; +}; +typedef std::shared_ptr WidgetModelPtr; + +#endif // SRC_DOMAIN_WIDGET_MODEL_H diff --git a/src/domain/widget_string.h b/src/domain/widget_string.h new file mode 100644 index 0000000..419a1c7 --- /dev/null +++ b/src/domain/widget_string.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file widget_string.h + * @author Jihoon Chung(jihoon.chung@samsung.com) + * @version 0.1 + * @brief + */ + +#ifndef WRT_SRC_DOMAIN_WIDGET_STRING_H_ +#define WRT_SRC_DOMAIN_WIDGET_STRING_H_ + +#include +#include +#include + +#include + +#define WRT_PS "%s" +#define WRT_PNS "%d$s" + +namespace WrtText { +inline std::string replacePS(std::initializer_list strs) { + std::size_t size = strs.size(); + if (size <= 1 || size >= 10) { + return std::string(""); + } + + std::initializer_list::iterator it = strs.begin(); + std::string ret = *strs.begin(); + std::string arg = *(++it); + + // %s -> arg + std::size_t ps = ret.find(WRT_PS); + if (ps != std::string::npos) { + ret.replace(ps, std::string(WRT_PS).length(), arg); + return ret; + } + + // %n$s -> n_arg + std::string n = "1"; + for ( ; it != strs.end(); ++it) { + std::string pns = WRT_PNS; + pns.replace(1, 1, n); + n[0]++; + ret.replace(ret.find(pns), 4, (*it).c_str()); + } + return ret; +} +} + +#define WRT_SK_OK dgettext("sys_string", "IDS_COM_SK_OK") +#define WRT_SK_YES dgettext("sys_string", "IDS_COM_SK_YES") +#define WRT_SK_NO dgettext("sys_string", "IDS_COM_SK_NO") +#define WRT_SK_LOGIN dgettext("sys_string", "IDS_COM_BUTTON_LOGIN") +#define WRT_SK_CANCEL dgettext("wrt", "IDS_BR_SK_CANCEL") +#define WRT_OPT_ALLOW dgettext("wrt", "IDS_BR_OPT_ALLOW") +#define WRT_OPT_DENY dgettext("wrt", "IDS_COM_BODY_DENY") + +#define WRT_POP_USERMEDIA_PERMISSION dgettext("wrt", "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_USE_YOUR_CAMERA") +#define WRT_POP_WEB_NOTIFICATION_PERMISSION dgettext("wrt", "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_SHOW_NOTIFICATIONS") +#define WRT_POP_GEOLOCATION_PERMISSION dgettext("wrt", "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_LOCATION") +#define WRT_POP_WEB_STORAGE_PERMISSION dgettext("wrt", "IDS_BR_POP_P1SS_HP2SS_IS_ATTEMPTING_TO_STORE_A_LARGE_AMOUNT_OF_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE") +#define WRT_POP_APPLICATION_CACHE_PERMISSION dgettext("wrt", "IDS_BR_POP_P1SS_HP2SS_IS_REQUESTING_PERMISSION_TO_STORE_DATA_ON_YOUR_DEVICE_FOR_OFFLINE_USE") +#define WRT_POP_STARTING_DOWNLOADING dgettext("wrt", "IDS_BR_POP_STARTING_DOWNLOAD_ING") +#define WRT_POP_CERTIFICATE_PERMISSION dgettext("wrt", "IDS_BR_BODY_SECURITY_CERTIFICATE_PROBLEM_MSG") +#define WRT_BODY_AUTHENTICATION_REQUIRED dgettext("wrt", "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED") +#define WRT_BODY_PASSWORD dgettext("wrt", "IDS_BR_BODY_PASSWORD") +#define WRT_BODY_AUTHUSERNAME dgettext("wrt", "IDS_BR_BODY_AUTHUSERNAME") +#define WRT_BODY_REMEMBER_PREFERENCE dgettext("wrt", "IDS_BR_BODY_REMEMBER_PREFERENCE") +#define WRT_POP_CLEAR_DEFAULT_SETTINGS dgettext("wrt", "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL") + +#define WRT_SK_OK_IDS "IDS_COM_SK_OK" +#define WRT_SK_LOGIN_IDS "IDS_COM_BUTTON_LOGIN" +#define WRT_SK_CANCEL_IDS "IDS_BR_SK_CANCEL" +#define WRT_OPT_ALLOW_IDS "IDS_BR_OPT_ALLOW" +#define WRT_OPT_DENY_IDS "IDS_COM_BODY_DENY" + +#define WRT_BODY_AUTHENTICATION_REQUIRED_IDS "IDS_BR_BODY_DESTINATIONS_AUTHENTICATION_REQUIRED" +#define WRT_BODY_REMEMBER_PREFERENCE_IDS "IDS_BR_BODY_REMEMBER_PREFERENCE" +#define WRT_POP_CLEAR_DEFAULT_SETTINGS_IDS "IDS_ST_POP_CLEAR_DEFAULT_APP_SETTINGS_BY_GOING_TO_SETTINGS_GENERAL_MANAGE_APPLICATIONS_ALL" + +#endif // WRT_SRC_DOMAIN_WIDGET_STRING_H_ diff --git a/src/pre-launching/pre_launching_support.cpp b/src/pre-launching/pre_launching_support.cpp new file mode 100644 index 0000000..27497d1 --- /dev/null +++ b/src/pre-launching/pre_launching_support.cpp @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file pre_launching_support.cpp + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief Implementation for pre-launching support + */ + +#include "pre_launching_support.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_SAFE_SINGLETON(PreLaunchingSupport) + +namespace { +const float PRELAUNCHING_DEFAULT_DEFER_TIME = 2.5; +const float PRELAUNCHING_DEFER_TIME = 1.0; +const int PRELAUNCHING_MAX_WAIT_TIME = 6; +const std::string JS_FLAG_NAME = "tizenPreLaunch"; + +// Function declare +int appcoreOpenCallback(void* data); +Eina_Bool deferredTimerCallback(void* data); + +int appcoreOpenCallback(void* data) +{ + DPL_UNUSED_PARAM(data); + + if (PreLaunchingSupportSingleton::Instance().isPreLaunching()) { + PreLaunchingSupportSingleton::Instance().resume(); + PreLaunchingSupportSingleton::Instance().finalize(); + } + + return 0; +} + +Eina_Bool deferredTimerCallback(void* data) +{ + DPL_UNUSED_PARAM(data); + + if (PreLaunchingSupportSingleton::Instance().isPreLaunching()) { + WrtLogD("suspend()"); + PreLaunchingSupportSingleton::Instance().suspend(); + } + PreLaunchingSupportSingleton::Instance().resetTimer(); + + return EINA_FALSE; +} +} // anonymous namespace + +void PreLaunchingSupport::setPreLaunching(bundle* b) +{ + if (b) { + const char* value = bundle_get_val(b, AUL_K_PRELAUCHING); + + if (value != NULL) { + m_state = IN_PRE_LAUNCHING; + setenv("WRT_PRE_LAUNCHING_MODE", "TRUE", 1); + appcore_set_prelaunching(true); + + WrtLogD("Pre-launching has been enabled!"); + } + } +} + +void PreLaunchingSupport::setJavascriptExecuteFlag(bool flag) +{ + if (!m_jsExecuteFlag && flag) + { + m_jsExecuteFlag = true; + + std::stringstream script; + script << "var " << JS_FLAG_NAME << " = true"; + + WrtLogD("executing javascript : [%s]", script.str().c_str()); + ewk_view_script_execute(m_ewkView, script.str().c_str(), NULL, NULL); + } + else if (m_jsExecuteFlag && !flag) + { + m_jsExecuteFlag = false; + + std::stringstream script; + script << JS_FLAG_NAME << " = false"; + + WrtLogD("executing javascript : [%s]", script.str().c_str()); + ewk_view_script_execute(m_ewkView, script.str().c_str(), NULL, NULL); + } +} + +void PreLaunchingSupport::setEwkViewSuspended(bool suspend) +{ + m_ewkViewSuspended = suspend; +} + +bool PreLaunchingSupport::isPreLaunching(void) +{ + return (m_state != NOT_PRE_LAUNCHING_MODE); +} + +bool PreLaunchingSupport::isEwkViewSuspended() +{ + return m_ewkViewSuspended; +} + +void PreLaunchingSupport::resetTimer(void) +{ + m_pauseTimerStartTime = 0; + + if (m_pauseTimer) + { + ecore_timer_del(m_pauseTimer); + m_pauseTimer = NULL; + } +} + +void PreLaunchingSupport::initialize(Evas_Object* ewkView, Evas_Object* window) +{ + WrtLogD("initialize called"); + + Assert(ewkView); + Assert(window); + + m_ewkView = ewkView; + m_window = window; + appcore_set_open_cb(appcoreOpenCallback, NULL); +} + +void PreLaunchingSupport::updateRender(void) +{ + WrtLogD("updateRender called"); + + if (isPreLaunching()) + { + if (NULL == m_pauseTimer) + { + m_pauseTimer = ecore_timer_add(PRELAUNCHING_DEFAULT_DEFER_TIME, deferredTimerCallback, NULL); + if (NULL == m_pauseTimer) + { + WrtLogW("Fail to add timer"); + // Fail to add timer. Move to suspend with current state. + resetTimer(); + suspend(); + return; + } + m_pauseTimerStartTime = time(NULL); + } + else + { + time_t curTime = time(NULL); + time_t diffTime = curTime - m_pauseTimerStartTime; + + if (diffTime < PRELAUNCHING_MAX_WAIT_TIME) + { + ecore_timer_reset(m_pauseTimer); + WrtLogD("enterAppcorePause() is delayed! + %f sec", PRELAUNCHING_DEFER_TIME); + } + } + } +} + +void PreLaunchingSupport::resume(void) +{ + WrtLogD("resume called"); + + Assert(m_ewkView); + Assert(m_window); + + setJavascriptExecuteFlag(false); + ewk_view_page_visibility_state_set(m_ewkView, EWK_PAGE_VISIBILITY_STATE_VISIBLE, EINA_TRUE); + ewk_view_visibility_set(m_ewkView, EINA_TRUE); + elm_win_render(m_window); + evas_object_show(m_window); +} + +void PreLaunchingSupport::suspend(void) +{ + WrtLogD("suspend called"); + + appcore_efl_goto_pause(); +} + +void PreLaunchingSupport::finalize(void) +{ + WrtLogD("finalize called"); + + m_state = NOT_PRE_LAUNCHING_MODE; + resetTimer(); + m_ewkView = NULL; + m_window = NULL; + + appcore_set_prelaunching(false); + appcore_set_open_cb(NULL, NULL); +} + diff --git a/src/pre-launching/pre_launching_support.h b/src/pre-launching/pre_launching_support.h new file mode 100644 index 0000000..2622855 --- /dev/null +++ b/src/pre-launching/pre_launching_support.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file pre_launching_support.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + */ + +#ifndef PRE_LAUNCGING_SUPPORT_H +#define PRE_LAUNCHING_SUPPORT_H + +#include + +#include +#include +#include +#include + +class PreLaunchingSupport { + enum PreLaunchingState + { + NOT_PRE_LAUNCHING_MODE, + IN_PRE_LAUNCHING, + }; + + public: + void setPreLaunching(bundle* b); + void setJavascriptExecuteFlag(bool flag); + void setEwkViewSuspended(bool suspend); + + bool isPreLaunching(void); + bool isEwkViewSuspended(); + + void initialize(Evas_Object* ewkView, Evas_Object* window); + void updateRender(void); + void resume(void); + void suspend(void); + void finalize(void); + void resetTimer(void); + + private: + PreLaunchingState m_state; + Ecore_Timer* m_pauseTimer; + time_t m_pauseTimerStartTime; + bool m_ewkViewSuspended; + bool m_jsExecuteFlag; + Evas_Object* m_ewkView; + Evas_Object* m_window; + + friend class DPL::Singleton; + + PreLaunchingSupport() : + m_state(NOT_PRE_LAUNCHING_MODE), + m_pauseTimer(NULL), + m_pauseTimerStartTime(0), + m_ewkViewSuspended(false), + m_jsExecuteFlag(false), + m_ewkView(NULL), + m_window(NULL) + { + } +}; + +typedef DPL::Singleton PreLaunchingSupportSingleton; + +#endif // PRE_LAUNCHING_SUPPORT_H diff --git a/src/profiling/CMakeLists.txt b/src/profiling/CMakeLists.txt new file mode 100644 index 0000000..768de1a --- /dev/null +++ b/src/profiling/CMakeLists.txt @@ -0,0 +1,42 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +PKG_SEARCH_MODULE(PROFILING_DEPS REQUIRED dpl-efl) + +ADD_LIBRARY(${TARGET_PROFILING_LIB} SHARED + ${PROJECT_SOURCE_DIR}/src/profiling/profiling_util.cpp +) + +SET_TARGET_PROPERTIES(${TARGET_PROFILING_LIB} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +SET_TARGET_PROPERTIES(${TARGET_PROFILING_LIB} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_API_VERSION}) + +INCLUDE_DIRECTORIES(${PROFILING_DEPS_CFLAGS}) + +SET_TARGET_PROPERTIES(${TARGET_PROFILING_LIB} PROPERTIES + COMPILE_FLAGS -fPIC) + +TARGET_LINK_LIBRARIES(${TARGET_PROFILING_LIB} + ${PROFILING_DEPS_LIBRARIES} +) + +INSTALL(TARGETS ${TARGET_PROFILING_LIB} + DESTINATION lib + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) diff --git a/src/profiling/profiling_util.cpp b/src/profiling/profiling_util.cpp new file mode 100644 index 0000000..aa30eca --- /dev/null +++ b/src/profiling/profiling_util.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief This is implementation file for profiling function. + */ + +#include "profiling_util.h" + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +namespace { +const int PROFILING_OUTPUT_DESCRIPTOR = 3; + +unsigned long long toULong(const struct timeval& value) +{ + unsigned long long ret = static_cast(value.tv_sec) * + 1000000ULL; + ret += static_cast(value.tv_usec); + return ret; +} + +struct PacketResult +{ + unsigned long long time; + const char* name; + const char* prefix; + const char* description; + PacketResult() : + time(0), + name(0), + prefix(0), + description(0) + {} + PacketResult(unsigned long long t, + const char* n, + const char* p, + const char* d) : + time(t), + name(n), + prefix(p), + description(d) + {} + + void Print(FILE *filePtr) + { + if (!prefix) { + prefix = ""; + } + if (!description) { + description = ""; + } + fprintf(filePtr, "%s#%s#%llu#[%s]\n", prefix, name, time, description); + } +}; + +std::vector results; + +void dumpStatistic() +{ + FILE* fp = NULL; + int newfd = dup(PROFILING_OUTPUT_DESCRIPTOR); + if (-1 != newfd) { + fp = fdopen(newfd, "w"); + } + if (!fp) { + if (-1 != newfd) { + close(newfd); + } + fp = stdout; //fallback + } + fprintf(fp, "###PROFILING###START###\n"); + FOREACH(result, results) + { + result->Print(fp); + } + fprintf(fp, "###PROFILING###STOP###\n"); + fflush(fp); + if (stdout != fp) { + fclose(fp); // newfd is also closed + } +} + +void sigUsrHandler(int /*num*/) +{ + dumpStatistic(); +} + +DPL::Mutex* m_mutex = NULL; + +void initialize() +{ + m_mutex = new DPL::Mutex; + results.reserve(64 * 1024); + signal(SIGUSR1, &sigUsrHandler); + signal(SIGUSR2, &sigUsrHandler); + WrtLogD("Initialized profiling"); + AddProfilingMeasurment("Profiling_Started"); +} + +std::string GetFormattedTime() +{ + timeval tv; + tm localNowTime; + + gettimeofday(&tv, NULL); + localtime_r(&tv.tv_sec, &localNowTime); + + char format[64]; + snprintf(format, + sizeof(format), + "%02i:%02i:%02i.%03i", + localNowTime.tm_hour, + localNowTime.tm_min, + localNowTime.tm_sec, + static_cast(tv.tv_usec / 1000)); + return format; +} +} // namespace anonymous + +void AddStdoutProfilingMeasurment(const char* name, bool start) +{ + Assert(m_mutex != NULL); + std::ostringstream output; + output << "[" << GetFormattedTime() << "] [](): " << name << " "; + output << (start ? "profiling##start" : "profiling##stop"); + fprintf(stdout, "%s\n", output.str().c_str()); +} + +#ifdef __cplusplus +extern "C" +#endif +void AddProfilingMeasurment(const char* name, + const char* prefix, + const char* description) +{ + DPL::Mutex::ScopedLock lock(m_mutex); + struct timeval value; + gettimeofday(&value, NULL); + results.push_back( + PacketResult(toULong(value), name, prefix, description)); +} + +STATIC_BLOCK +{ + initialize(); +} + diff --git a/src/profiling/profiling_util.h b/src/profiling/profiling_util.h new file mode 100644 index 0000000..3ce0de5 --- /dev/null +++ b/src/profiling/profiling_util.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief This is header file for profiling function. + */ + +#ifndef WRT_ENGINE_SRC_PROFILING_PROFILING_UTIL_H +#define WRT_ENGINE_SRC_PROFILING_PROFILING_UTIL_H + +#ifdef PROFILING_ENABLED + +#ifndef __cplusplus +#include +#endif //__cplusplus + +#ifdef __cplusplus +extern "C" +void AddProfilingMeasurment(const char* name, + const char* prefix = 0, + const char* description = 0); +#define ADD_PROFILING_POINT(name, ...) AddProfilingMeasurment(name, \ + ##__VA_ARGS__) +#else //__cplusplus +void AddProfilingMeasurment(const char* name, + const char* prefix, + const char* description); +#define ADD_PROFILING_POINT(name, prefix, desc) AddProfilingMeasurment(name, \ + prefix, \ + desc) +#endif //__cplusplus + +void AddStdoutProfilingMeasurment(const char* name, bool start); +// profiling script additional proceeds stdout output +#define LOG_PROFILE_START(x) AddStdoutProfilingMeasurment(x, true) +#define LOG_PROFILE_STOP(x) AddStdoutProfilingMeasurment(x, false) +#else //PROFILING_ENABLED + +#define ADD_PROFILING_POINT(name, ...) (void)1 +#define LOG_PROFILE_START(x) (void)1 +#define LOG_PROFILE_STOP(x) (void)1 + +#endif //PROFILING_ENABLED + +#endif /* WRT_ENGINE_SRC_PROFILING_PROFILING_UTIL_H */ + diff --git a/src/profiling/script/profiling-host-part.pl b/src/profiling/script/profiling-host-part.pl new file mode 100755 index 0000000..fa85be5 --- /dev/null +++ b/src/profiling/script/profiling-host-part.pl @@ -0,0 +1,88 @@ +#!/usr/bin/perl +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +print "Stage 1:\n"; +my @files = `find -name prof-raw-data 2>/dev/null`; +for my $file (@files) { + chomp $file; + my $foutPoints = $file; $foutPoints =~ s/raw-data/-data-points/g; + my $foutRanges = $file; $foutRanges =~ s/raw-data/-data-ranges/g; + #print ">$file< >$fout<\n"; + #print ">>>~/git/wrt-engine/src/profiling/script/analyse.pl $foutPoints $foutRanges <<<\n"; + print "grep -v \"PROFILING\" $file | ./utils/analyse.pl $foutPoints $foutRanges\n"; + `grep -v \"PROFILING\" $file | ./utils/analyse.pl $foutPoints $foutRanges`; +} + +print "Stage 2:\n"; + +for my $dir (qw{OUTPUT/minimal/cold OUTPUT/minimal/warm OUTPUT/minimal/preload OUTPUT/Jet_Pack_Agent/cold OUTPUT/Jet_Pack_Agent/warm OUTPUT/Jet_Pack_Agent/preload OUTPUT/UnitTest/cold OUTPUT/UnitTest/warm OUTPUT/UnitTest/preload}) +{ + print $dir, "\n"; + print "./utils/csv-stats.pl -c -r -s avg \`find $dir -name prof--data-points 2>/dev/null\` > $dir/outpucik-points\n"; + print "`./utils/csv-stats.pl -c -r -s avg \`find $dir -name prof--data-ranges 2>/dev/null\` > $dir/outpucik-ranges\n"; + `./utils/csv-stats.pl -c -r -s avg \`find $dir -name prof--data-points 2>/dev/null\` > $dir/outpucik-points`; + `./utils/csv-stats.pl -c -r -s avg \`find $dir -name prof--data-ranges 2>/dev/null\` > $dir/outpucik-ranges`; +} + +print "Stage 3:\n"; +for my $dir (qw{OUTPUT/minimal OUTPUT/Jet_Pack_Agent OUTPUT/UnitTest}) +{ + my $name = substr($dir, 7); + my $file = "$name.svg"; + my $warm = "$dir/warm/outpucik-points"; + my $cold = "$dir/cold/outpucik-points"; + my $preload = "$dir/preload/outpucik-points"; + my $difffile = "$dir/diff-points"; + `paste -d, $cold $warm $preload > $difffile`; + my $title = "\"Performance profiling of WebRuntime - $name Widget\""; + + my $font = 12; + + my $wheader = 213; + my $hheader = 199; + my $max = 8100; + + print "+++++++++++++++++++++++++++ $name\n"; + + + my $maxtime = `cat $dir/cold/outpucik-points | tail -n1 | cut -d, -f2`; + my $nroftics = int($maxtime/100000 + 1); + my $maxtics = $nroftics * 100000; + print "NROFTIC: $nroftics\n"; + my $height = int(20.7 * $nroftics + $hheader); + if ($height > $max) + { + $height = $max; + } + + my $lines_count = `wc -l $warm`; + $lines_count = $lines_count - 2; + print "lc: $lines_count\n"; + my $width = int(23.5 * $lines_count + $wheader); + print "wi: $width\n"; + if ($width > $max) + { + my $newfont = int ($font * $max/$width); + $width = $max; + $height = $hheader + int (($height - $hheader)*$newfont/$font); + $font = $newfont + } + + print "Generating $file W: $width H: $height F: $font\n\n"; + print "./utils/generate-plot.sh $warm $cold $preload $file $title $font $width $height $maxtics\n\n\n"; + `./utils/generate-plot.sh $warm $cold $preload $file $title $font $width $height $maxtics $difffile`; +} + diff --git a/src/profiling/script/profiling-target-part.pl b/src/profiling/script/profiling-target-part.pl new file mode 100755 index 0000000..e20ece2 --- /dev/null +++ b/src/profiling/script/profiling-target-part.pl @@ -0,0 +1,308 @@ +#!/usr/bin/env perl +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +##### CONFIGURATION begin ##### + +my $WIDGET_PACKAGE_DIR = './test-widgets'; +my @WIDGETS = ( + ['minimal.wgt', 'minimal' ], + ['0Jet_Pack_Agent.wgt', 'Jet Pack Agent'], + ['UnitTestAuto.wgt', 'UnitTest' ], +); +my $WRT_INSTALL_ENV = 'WRT_TEST_MODE=1'; + +my $WRT_CLIENT_LAUNCH = 'wrt-client -l {}'; +my $WRT_CLIENT_QUERY = 'wrt-launcher -l 2>/dev/null'; +my $WRT_CLIENT_INSTALL = "$WRT_INSTALL_ENV wrt-installer -i {}"; +my $WRT_CLIENT_UNINSTALL = "$WRT_INSTALL_ENV wrt-installer -un {}"; +my $COLD_START_PREPARE_COMMAND = '/sbin/sysctl vm.drop_caches=3'; +my $OUTPUT_DIR = './OUTPUT'; +my $PRELOAD_LIBRARIES = './utils/wrt-preloader'; + +##### CONFIGURATION end ##### + + +use strict; +use Time::HiRes; +use Time::Local; +use List::Util; + + +##### Single test runners + +# $stream may be undef - then no output +sub runWidget { + my $widgetTizenId = shift; + my $stream = shift; + my $streamout = shift; + my $fnameerr = shift; + + unless (defined $fnameerr) { + $fnameerr = '/dev/null'; + } + + `mkdir -p $OUTPUT_DIR/tmp`; + + my $fnameerr = "$OUTPUT_DIR/tmp/additional.tmp"; + + my $command = $WRT_CLIENT_LAUNCH; + $command =~ s/\{\}/$widgetTizenId/; + $command .= " 2>$fnameerr 3>$OUTPUT_DIR/tmp/prof.tmp & echo TEST-WIDGET-PID \$\!"; + + print "$command\n"; + + my ($startSec, $startUSec) = Time::HiRes::gettimeofday(); + + my $f; + open $f, "$command |"; + + my $pid = undef; + + my $extralines = ""; + + while (my $line = <$f>) { + print "The line is: $line"; + if (defined $streamout) { + print $streamout $line; + } + chomp $line; + if (my ($p) = $line =~ /^TEST-WIDGET-PID (\d+)/) { + $pid = 0+$p; + } elsif ($line =~ /launched$/) { + print "launched detected $pid\n"; + kill 10, $pid; + my $again = 1; + while ($again) { + my $t = `tail -1 $OUTPUT_DIR/tmp/prof.tmp`; + if ($t =~ /###PROFILING###STOP###/) { + $again = 0; + } + } + kill 9, $pid; + print "killed\n"; + } elsif ($line =~ /\[([0-9]*):([0-9]*):([0-9]*).([0-9]*)\][^)]*\): *([A-Za-z0-9 ]+) *profiling##(start|stop)/) { #additionally take point from debug + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time()); + my $name = $5; + $hour = $1; + $min = $2; + $sec = $3; + my $msec = $4; + my $type = $6; + my $value = timelocal($sec,$min,$hour,$mday,$mon,$year); + my $value = $msec + 1000 * $value; + my $insert = "$type#$name#$value${msec}#[]\n"; + $extralines = "$extralines$insert"; + } + } + + close $f; + + #TODO: do it perl way + `cat $OUTPUT_DIR/tmp/prof.tmp | sort -k3,3 -t"#" -n > $OUTPUT_DIR/tmp/prof.tmp.new && mv $OUTPUT_DIR/tmp/prof.tmp.new $OUTPUT_DIR/tmp/prof.tmp`; + + open my $fin, "<", "$OUTPUT_DIR/tmp/prof.tmp"; + while (my $line = <$fin>) { + chomp $line; + if ($line =~ /^#Profiling_Started#/) { + if (defined $stream) { + printf $stream "#Profiling_Started#%d%06d#[]\n", $startSec, $startUSec; + } + } elsif ($line =~ /###PROFILING###STOP###/) { + if (defined $stream) { + print $stream "$extralines###PROFILING###STOP###\n"; + } + } else { + if (defined $stream) { + print $stream "$line\n"; + } + } + } + close $fin; +} + +# $mode: +# simple - just run the widget, no special preparations +# cold - after cache clean +# warm - the same widget first launched w/o logs for "warm-up" +# double-warm - two warm-up launches prior to proper test +# preload - preloaded webkit library and its dependencies +# TODO - OTHER MODES: +# - warming-up with ANOTHER widget? +# - warming-up by copying all required binaries/libraries to /dev/null +# - running with all binaries/libraries placed on tmpfs (i.e. in cache) +# - first clean cache, then fill it with garbage, by copying lots +# of useless data from disk to /dev/null, until `free' shows small +# enough free memory level +sub runTest { + my $widgetTizenId = shift; + my $mode = shift; + my $stream = shift; + my $streamout = shift; + my $fnameerr = shift; + + if ($mode eq 'simple') { + # no preparations necessary + } elsif ($mode eq 'cold') { + `$COLD_START_PREPARE_COMMAND`; + } elsif ($mode eq 'warm') { + runWidget( $widgetTizenId, undef, undef, undef ); + } elsif ($mode eq 'double-warm') { + runWidget( $widgetTizenId, undef, undef, undef ); + runWidget( $widgetTizenId, undef, undef, undef ); + } elsif ($mode eq 'preload') { + `$COLD_START_PREPARE_COMMAND`; + `$PRELOAD_LIBRARIES`; + } else { + die; + } + runWidget( $widgetTizenId, $stream, $streamout, $fnameerr ); +} + +##### Widget installation + +# returns \% a map: name->tizenId +sub dropAndInstallAll { + my $pwidgets = shift; + + { + print "Uninstalling all widgets\n"; + my @out = `$WRT_CLIENT_QUERY`; + for my $line (@out) { + if (my ($tizenId) = $line =~ /^\s+\d+.*\s+([A-Za-z0-9]+)$/) { + my $command = $WRT_CLIENT_UNINSTALL; + $command =~ s/\{\}/$tizenId/g; + print " uninstalling widget $tizenId [$command]\n"; + `$command > /dev/null 2>/dev/null`; + } + } + } + { + print "Checking if widget list is empty\n"; + my @out = `$WRT_CLIENT_QUERY`; + for my $line (@out) { + if (my ($tizenId) = $line =~ /^\s+\d+.*\s+([A-Za-z0-9]+)$/) { + print "WIDGET LIST NOT EMPTY!!!\n"; + die; + } + } + } + { + print "Installing all test widgets\n"; + for my $pwidgetData (@$pwidgets) { + my ($package, $name) = @$pwidgetData; + my $command = $WRT_CLIENT_INSTALL; + $command =~ s/\{\}/$WIDGET_PACKAGE_DIR\/$package/g; + print " installing $name ($package) [$command]\n"; + `$command > /dev/null 2>/dev/null`; + } + } + { + print "Checking if all widgets are installed, determining tizenIds\n"; + my %widgetMap = (); + for my $pwidgetData (@$pwidgets) { + my ($package, $name) = @$pwidgetData; + $widgetMap{$name} = undef; + } + my @out = `$WRT_CLIENT_QUERY`; + for my $line (@out) { + if (my ($name, $trash, $tizenId) = $line =~ /^\s*\d+\s+(([^ ]| [^ ])+)\s+.*\s+([A-Za-z0-9]{10}\.[^\s]+)\s*$/) { + print " found $name (tizenId $tizenId)\n"; + $widgetMap{$name} = $tizenId; + } + } + for my $name (keys %widgetMap) { + unless (defined $widgetMap{$name}) { + print " MISSING $name\n"; + die; + } + } + return \%widgetMap; +} +} + + +##### Test schemes + +# PARAMS: +# \@ list of widgets (can be undef, then will use @WIDGETS) +# \@ list of modes (modes can be as in runTest) +# number of repetitions of one widget/mode pair +sub fullRandomTest { + my $pwidgets = shift; $pwidgets = \@WIDGETS unless defined $pwidgets; +my $pmodes = shift; +my $repetitions = shift; + +my $pwidgetMap = dropAndInstallAll( $pwidgets ); + +my @testList = (); + +print "Preparing the test list\n"; +for my $pwidget (@$pwidgets) { + my ($package, $name) = @$pwidget; + for my $mode (@$pmodes) { + for (my $number = 0; $number < $repetitions; $number++) { + push @testList, [$name, $mode]; + } + } +} + +@testList = List::Util::shuffle( @testList ); + +print "Clearing the output dir\n"; +`rm -rf $OUTPUT_DIR`; + +print "Running tests\n"; +my %runNumbers = (); +my $globalTestNumber = 0; +my $totalTestCount = @testList; +for my $ptest (@testList) { + # find test parameters + my ($name, $mode) = @$ptest; + my $widgetTizenId = $$pwidgetMap{$name}; + my $runNo = $runNumbers{"$mode|$widgetTizenId"}; + print "next\n"; + if (defined $runNo) + { $runNo += 1; } + else + { $runNo = 0; } + $runNumbers{"$mode|$widgetTizenId"} = $runNo; + $globalTestNumber += 1; + print " Test $globalTestNumber of $totalTestCount: ". + "$name ($widgetTizenId) run $runNo, $mode\n"; + + # remove and create output dir + my $prepName = $name; + $prepName =~ s/ /_/g; + my $dirName = sprintf "$OUTPUT_DIR/$prepName/$mode/run%03d", $runNo; + `mkdir -p $dirName`; + + # create output files + open my $outFile, ">", "$dirName/prof-raw-data" or die; + open my $dumpOutFile, ">", "$dirName/dump-stdout" or die; + + # run test + runTest( $widgetTizenId, $mode, $outFile, $dumpOutFile, "$dirName/dump-stderr" ); + + # close output files + close $outFile; + close $dumpOutFile; + print "Done\n"; +} +} + +##### MAIN ##### + +fullRandomTest( undef, ['cold', 'warm', 'preload'], 10 ); diff --git a/src/profiling/script/ranges b/src/profiling/script/ranges new file mode 100644 index 0000000..0b06207 --- /dev/null +++ b/src/profiling/script/ranges @@ -0,0 +1,5 @@ +Whole startup:Profiling_Started-:wrt_launch-stop +Library loading:Profiling_Started-:main-entered-point +app_core/dpl operations:main-entered-point:wrt_init-start +wrt-init:wrt_init-start:wrt_init-stop +WRT launch:wrt_launch-start:wrt_launch-stop diff --git a/src/profiling/script/ranges.py b/src/profiling/script/ranges.py new file mode 100755 index 0000000..e6ae996 --- /dev/null +++ b/src/profiling/script/ranges.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os,sys + +def main(): + if sys.version[0] != "2": + exit(1) + + f = open('ranges', 'r') + # Array of ranges. + ranges = [] + for line in f: + r = line.rstrip().split(':') + r.append(0) + r.append(0) + r.append(0) + ranges.append(r) + f.close() + + # find directories with results + for root, dirs, files in os.walk('OUTPUT'): + path = root.rsplit('/',1) + if path[len(path)-1] not in ['cold','warm','preload']: + continue + + # open file with measurements + print '\n' + root + output = open(root + '/outpucik-points', 'r') + + # find matching points + for r in ranges: + output.seek(0) + for l in output: + if r[1] in l: + r[3] = l.split(',')[1] + if r[2] in l: + r[4] = l.split(',')[1] + + output.close() + + # calculate the difference + for r in ranges: + r[5] = int(r[4]) - int(r[3]) + + # save calculations + results = open(root + '/outpucik-results','w') + for r in ranges: + print " " + r[0] + ": " + str(float(r[5])/1000) + "ms" + results.write(r[0] + ": " + str(float(r[5])/1000) + "ms\n") + results.close() + +if __name__ == "__main__": + main() + diff --git a/src/profiling/script/test-widgets/0Jet_Pack_Agent.wgt b/src/profiling/script/test-widgets/0Jet_Pack_Agent.wgt new file mode 100644 index 0000000000000000000000000000000000000000..a9b27fa7df5da56af28d18860e67890b052f6d3d GIT binary patch literal 1129126 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

WH$RG4T19o26TO9~*xfA4$j^7HkS* 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

d4C?l=_MqS_TZVZb{8 z#X_6tJ*w+(rdn02frM)ncKg1f1ZvZ(SYS(4LdvZz1dRJ`hIkTc_)IYB35@f2a4M|w-pthIh-fa}Ef znVhN3hY7q%P9j_(s@z>gxRG!d;R(`uPdO2^$#ajGJXeN-l5gi5U&fNw<)wA5s~U{MbkTsHX;t0$SX*@Nh>GJ_1I1wYN-_7Y-~|2F=jr+&7| zNi|S{4zL(l2jS%7Q)2PVYfkqdvimWW0T2s+x6hkUw` zhg=afY1XF@}4rJVYbs8~e|mMQu-pb}~}fEeGJg%I;JrYWI#3_OFYDJ*f`b z=6&`>2({(Jn;9YFW>hF69OGSm+Jj~$X!AP%?~@x(!_T>^&uD;p4^8*XEVYLkTIvM zIZ4nbjR{(v@N%$#*wi!HN`hvy2DNz|};=roG-)iy`S*zO6S>N1IK_T4Z1(tP@dXK5OXiIIfBBO zo|gS7bSJ#tWTFwC*Cv_lt;gwETvqb7xR`|hQolcMgfFvc^2eSLk)+)F)RTm@&nnU4;IYGA&1kD@rSStydZO+u@ z<&dXJ;oNMCXI4SpCQxemVXFz+bbds_*R|sFo!bn4S~y~rGEz-;=Vqt=eEy!PdfX8&@}@HH1>EZaegZkE$<613kQat<5%H-YuQZzUOKRvrd%T?Ng! z1_CdMw4bb(*E^r{NX|0*OUA9L1!$5b zrjs;j&L`=akGhbDr^SM#20f9%UvfSK=d8y*h(c5RzQ>Txd>}wDDROArz0wqvnEj@( zLpKXP#S%Ld_82${4G6lg)dXEtICcf(t~XARc_PeFWiGNJa4F64L8}ScaDEgy)8EM> zd|{Gv7UEoSV~e`ZtA-ue>NAaUt;#kdSVlaq6<^Cm$oBO0#+42=lBOC%i@;4K(4tdR z70hrEbU+^Ry(S*=YsB~20}f|k1BkO)#OwCx-geZ(EfX{MSzrs^-?!+hr^U5Kms4cK zi*CtTEP_2S)w}}-=j()3c%K7$5`q#G1CpjA@b`w}=dNypXwQhGn=|FSAm;-hf@z-m zfY8Vjc<?0Cua#z6 zX~=HX{yR1Z0YDg7CmZ#|BuDqy^lj*H8zHu`g= zJ$C4f?LO^gkK|16aX>gVUl!SpuOgx09oW`4KtRsvV`4zkrsJmzo+c~`vc2Yho7I^x zAZOFXCpQ=R{BG2gSOS5+7s(sL14O+++&hJ-)fwGz!!>Iac6m?GxV+Kglwao2}chz?^?pY0(V zc@Fx!1_~B`|CCvlrjoKOW~MnGfkSfvcHJ2`N_NNhMk5uNckK@_*Py%!)GAcl_*lh>$IOYG1i1fa5DZ{6}1xP zOAZY_juid7oND+~ErZ#$1TxnW%0yTQI_Ms9N(fmAn{usk=3QR(=oOaMlQy_f#jVX5 zvD@o#6k3Q~*DTxdM#4uB*xkqwJFhQJ6OuL~V3&eA?o1(OByFHMd%O5{W5f9vo6l9j zi#45zL?Ly1h|?8MlAyn|3EC@yMt>X7=UO<{FR_}SLnR~b`oP)AAL98Oi0}&^+dQIY zdBTSNg-9Nfws@-8xgLJ3PB6)}f;ld11RYclIUF!!1wr?skgGp9k#iuPTaz1AR7l!J zo$Nqro3SIm0fH{{Fwxh-#Iau%#xYo+)3uGlbo|W7*%LualBUmoV=@QR0w92kyWMq& zG644sEx+j#iizLMal#ZUx}HLj-XlBz+CD{Bu3^)a%DAg49J8EBqig=K*VsNv^ZQEA zcB7}=G-$yPoXqlZTuc%6=cZI|(vBSOfuIlC1nt%QU`<_$Xr_8ZHeF4TKj$qYXp3cp z6*We$_LsiH*_j;LctzD?D?Jf36X_=cz7n+2IJi4)QXPM*_F+&S7t_FUjfclq$Ob z$EA~I1dScK(97{Vi$Xfh#ou)swb?s^+`of{VKqTFbi11)Z4Wg@oDXWtk?YSvKi-WwWI-G-v`mjyVUd<28h7)iy9Rm~MB+4}X z_fQeEA2M=1z*(8MAT#sfK*oX6!yBoMmk7@SFK~azr1lSg$AO~GHiD}v;3)k05j4eF zf94|O@)#mR+q@uWUJRdWbq-vroT<;_*tQ0ahd*iGp=`%3)JLv{$B8v_$RTsAIpd7* z9d2?tZ*X*CvSp9=O`gV&KEEH;)s~@v{3)Zt?*^v?bpZmKT(+XdaS#Za6K~!!S$w>( zevQycm99S?WHDSs>Qso^t24FqSrz;rMUEc_nVB3k7LH@asopk08zWv0)p-Wf=>H+YtSIK zy|6K@LP*aSiU^I!T8rm26MmQYZEEX~uxasgCOdn_k5T{FX8OF^k^gx0(bt@8S_Xx2 z*x7Ip4#d4$r8J|lJA=6KS=b=vz*)Hk8-UY0<30C+&=(`Zb=hgmc_O)l#t<@bxdbeJHrb&Ay(~@H`Kv6P|(>6gn9m8djrAf}I=}aQOA#lO2 zUvhF36C;JI{?$r?wpvC=v;B(9919mr`uijh_uYXIG?i}Hij849z(oDWpE5y*#0E`) z_AfMN8A20$7v=`mC|AI9ya|HQ9LK0-F&^?D{APVNvuWYT^hfN(PhfZUxFa8cecD^W zKY$Rv8RABdR}tU23T>PQc40hbb87mL>a~3&zw1PhJHXA3? z2Hk?=Ad`_pk@QycYIZ+Mf<7wlK|H8M8j#Y%WlA3*l1v=`a7lEXLz5`L zl7-v0ZQHi(?%TF)+qP}nwr|_EZDa16#YDWtEb13jRMyGNlliGAGN{w)QWBk0 zR-0%^%)#%UqUWqs#T^1*KM`aDJQ5EKBR){XQdjx8rFe_+9#EqS)(LIhn;|S5dYZ-$ z5PS;F;aO|a2j=GmqwzAwn`1XHvJedp zr;WIYh2TMIePFO>MEi=_9zir(xxzfaA~bh!qz-jAY>@;Wp32OXCA7TKo}Bw!bGN~J z9NLVNlbd}9G+&670hxV_v~ci>MMlR9XDnX&nIuFUx+#?BmT-~cj}riXKj_MX$f8pH z!b%Dp+ar|*Ge;69JIo1-;y9zGtY{msI2a+SHb`G>Eu47CLASOg=2sM-+ODKS&I-P* zx4uXb$bmBl>Jr_IW(9F=P>bp$xed1%IOPlW!H6F_dYgi?WC#6=ED6)Qdg3*bf_YV5 z-@R#yhLfx19rvh6%IVeTyf|hs&8G;+&N+~RW+B=6gyd!Ws|sx`FpjlWU%$Sr&g))F zWq&019XhApJ&LeRy<<|~1EP5xBoCkbSFBDqUFSdhU`j4Xsc2etTG@5*!Hr375cqI@ z-hEdYy7=N-R`%hVpk2rcI#n{TlaoB>(Fn!w(l&GcU&zyy^QOX$llw#&5f z)8piug>Ut1HY@{oAjyv%MPJ!)tQORjW^X5}R1r3S z^(vGSXyJexq%1uIJJiG}QdDc!)ZSz{IuV4vE!KpvqHLP0!1xwx+N1(n%7-7yctvfV z&GLz~-UBL%Q`sE~der=kMtg=P*VIqM*J$hEi6U1chIc{kA83WPvP@oxgZep7lf z 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%0D?ON~sUr3b(7n2^Hk$^GSzNU`79*nG9f@Dk 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 %1fDRSOwwX&&knzbI*3 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 FFZRULF5AhXl3cOT$P`sba2}t;wVGS=UyjK3-UM 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⁣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 z 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�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�d=tSu&XFZYZZYYiWR(Sm!RQMB}fR{Ei6V@m9;; z*sHCnJ$@!vXp2n(~ejKNLI6NvPCxthKlo4MKih?JJU}`Av^=qWb$cwE-6$$1t z&SulKN$x+~K%RN5n1RI|#;b)Z?QUz3*y=uo?}_IcleK%i^FXJKs`t_U)}je;2{l^^ zSO>Pe%C0HE92Qlbc*+{HiL){8qkwSwZxO(;sa#nlquBeL*IA%isdmi-MyddRS2X~S zJt=$GcFEopiZ_oc6-HRHAmW|{lAXndRR5WZDge_dmXG$LTJ z128oYWf9dNzdoZqPAr{9capONoz!?=e^4Wo?-gHbnQ>{6?oP8yuuXy09t>Xpev#2r^K(O^^;- zUIc}65=a;UEO$pSt0|jJww@Zydf!vrP>N@*0s)glUoAnF{9Se+%jXwK>G)dwoS|t= z#PcQY9^gUmz)3TLob+_3SW~CMB%V#Y55WOX?*%q zNtY4JK(&25A z;Q@Zf4J*l+R}6r3|7GPk-cUww!Q((LRL5vt`N9P?2$LLfeX6yDQTk(Q8ssAQI}!^W zq;CMXcJ|3op}mM46Vxxu|G<<|xGYELdj7AHf3G<@1l0L=- zOLe)9>s#ti^ToIVcm*4=WP8{Eu|+RjlL|#(`7J;sh~O$G>(fI_xwybUA-iH!7(4eG zViNDoI2TEKqzK>!>)jzda7hZ#&Ycpsj4}BFN_oz?*K@7Wzk$&OW0Hm}7{(H$$p!zGxH~rC1UlAsEPgsO` z$zdfiw(|0Bgd{z=|Ij8=Zk~C6-wmMeb@)4~0d7*l%r^!+@fre6AOK82@GAi%zG$+w z4jJ%k?`OUlFz?&;*KiaW@MTv-z1^PjpzkO;daD;qp!x6k#*9X>LVy0RrJz9!oYKD^ zhP!tiFbF6X$(Z4&=8;y=TQ=SuY)U4mme^5ekX(d^hSS`HFACfdDNmrm5qUBtdYgXa zEApW?+L!t)No%>%8Kf8PYHKy7g$F^urSdNXTEDR;pGctMV{_`%mp;I+h<~UdYVV=W zc&|SJzhiEVwHS?d{4*jIjGNbGNWE9=4i|3Z=aOyYvdAdv$w z^GenLuxea)gaq3A4xUUtJeRH*5se-BOrdNn%%49b&1ekYsKK_x6xub@jcuqwmZL#% z3;qu)DwH;wLf?mVcmbWmJn?f7&5gl)hAVLL(k}+>_mT!(9CkbCCMq%ABwk%VRHqfS z@8fiIV(2Ew@RMQ`A_vDs*BcQoTW-E(v1^Qr>(Ii|X0H2L@h@JWV&x$u*tEUr&% zXbNDJ&$QniJf;;%4}jB1Xbt@{H!iZ&bo7%#y2jI|paU+Y!|#Y-vRg0w|IQj#@+5<} z2ni}mq2D$MQ|tjkIk!fP4>PL6qv986lS&3n1(Um+DH#VerBDnG0Z2cdZj~F7`u}RK zzTroka|7@m^|hXwksGrA|(n?c0SyGQ*NZhB9Zj{oIxxlG<$bKxK`cY zlMMJjb?5Ks<7RW|Ve}>jqwr!31*dipN^6pseud=Pmle-p1%?)zb^O0yl_3+R=u|q* z@rT}gvKXZJV-gsEgf+CXM&}fXPYcU>1KcrLM!z+LVY&0olmWH-n(*;C4?ygHIfF&A zgWHF2Orp^~VKlhJ2I~cZy=0n%K7w^Blqru+7%=3otpYOYuOo8qeqN&o~*p)+QLg4_KskRiU{ zOl2$kmp}3!JNMqF%siy_t1Z+y#IqFMR0_nVU`V6Qw_w zvzgj6pi;kAZv-A_C&Jr#SvlW~{5P3~5xP+msNG<>;y2k!2W!O;1>~HY(V>KI{rMm= zF`o;GN=&sN;yD4C%W=BuP@35_s&{zj%jpOOjUYuti2Jt8oxeXaK-)gq2l1@?$;*gd97&F z>_ObvR@1d(SIOL>`hV;KuU`7ePW+B##bVHNIRNH1^~zRC5eAX4{0Q@OWvc@EsSaHn zQnJ#_vdiY?eM~>n9Xp43+(F9GEQnPj`^FG!B!k5tN|WDZLNta6lXOCWVZpbEWd?ES zp!=WMumIvq+iC3QN&KH2si=uCvYn`5!fR3lRM3EZ?l_?l-GZK{Eq&@6^mAb9NGFC2 zqVg&2@H1iBD;-qIJ=i%+jdOtTRFRfOhPkKJw0{^`^p^y(RSXUc)jX7sTCgYmQ5dHB z%<8+Z?R@W10kYb`)dP1R$m4a%O&J=5eI>^F24O9>vfE*`X!afKV?Z&MprZb=WmJ^t z)GL8a0}0?n6e4{QaREmg3gl-m%AvKmVXYashAjVlD>hCHG#RHwT` zsIFfA$Ngc>2^mA5s6{cyuw*0?muhH)i$yZ(Q6g_Q*<^5HyA=r&-UEcndJ3v&skR>s zODwr4ri2dHb=Bv&QehNhnAj*g@?ntR{sKiArXJ5`-CYgcKhInui{<_|m&Rx2kW+p_ zRiD_NKC0C920mW>Xo4()T*MwPK*GrqvVc^96sV{uG*lJGJK?}dsLS2AITK^xi=k4q z@<9DJOjnAs9HI{;P$Abc|BEWF^_zjYN*T`C9?Ne$Y5f}3x{Dlk6jASnz;NAxulo6N zv&_nAOg6*pj}pRS-OZ-G66=t>1cq_5f6U(%WTFF^lFy}>` z-N;B1a?|Xo>xmQ|g?D8=6u5`KcXs^xH4{wB^md$Um#2*oNK=g}{YIf0HX%&womT#0 z+JLXQ;AXWT)x=ayQ;wHqLgvDq?7uOm{!p?@4?S}-5Qyo7-k|^(m4a;$f`b%uEjE&+ z)%+xRYFP5>o&TgaepexzKi&p5=*tniTA@91Xm~c6q>KL>5!OTggp!f<{S*B>g?lgs zRO${>J!}MVO}WHEVex*^^c=xW4dLeXc}mh(2NXz*ZfnKazCVApqRsP#))$qB%e;G9 zJo~vk4`nckA}Z$SFv&Xc9u z7%iW!BCQjFLd)Ax0ZJlBh>=iUDAC zpX`X*4o8_30UA~KbDPg5#9bz;D=Vf-H`V|vGTj#mo*lhHF-mIw*3k&MFBAaO*J`e^ zyfJbqQkqP&M406iQ+~W;=CHg1n(C+gnAK-xDVei2kq9)N9!@Q0`69%J1AGTY@c3V_-TH-E2lQj1hFl4cE^A~qsytPv6;R_`~ zb@;&QDsT9X(beAU!1ly02%kc(Y5iB)z|-cLO`^u`ofIuI5(Q^H^{}5T zu`2q^h&zIFvp~%jV2dx_zT&K~U)gW;U(w1Dz7j&K zHB!@GUK03J75QW|s6D}epmbC?)W=J+E+c{Rgc z$@z_@;+h z^d%L1jK%sH7wS8fK-2S&(>YmPsrVr=RNM}hmfv2X`&mdy9_~HV?T2$tmG}l5{ z4Xj#iUr=R3@a$N}$D^C!0c2MxZ8G~&QEb@kbqN2C@UorPuikNwQ;QFixABp@g3|$K zd%4ek)|Si;;cb5Gx@3uJv*6|P%0Fl~ZNCWrU+|E=^nI3E=-tmk(`wa$-G`L^>fQk{ zn%FqQXETv_11#Uwz9+y-FOpR|zAhKT)r9G4G3XnJhK@yDb>CL&zQf|xlld*p9*_bY zJFwa0xhSyN30#OaZwKYL&;&6tDJz2BCmK;uWJqxPicx2V~VMSt6r@~v9swI0emhvp&j3M5;r z_zA;e5aP!qn+&p-wE&UQ&mpd0ziDxBUSIUxRQD%)k#Avw9|+A2sliAswIw9?kmTyi zrGVUxZnxUY{PRoj7^?IU1-`r!G{skH;LzCYVh8XT#7MKV*dE1)=>9_q;P1>sWRB-c3e+6al z2p_;53&20ARQ;VZ$pqOs(XwfQ2b5cQ-hq-4&MI|(0XLU(-qKeJn&8vQ#-~WU$dkbL zCV9hMSk~=vCuEhTCin9WoHnKJ50*arQXBOA9wiJAilN(ozlJg0T>a9c;duYQ(^->j zu@Duga++<*+1?2?;IP0-^AP$4KO7OqK6;oxm3T&BZ5wT20G1aJ4!6nd55lur4reI3 zRzm#D_^XWfIOo4o=6FGp{@vE5MixWl_iKO4{54JaS@d0jq!5`SgXq^z_5hirh&cZM zvK1A4m2F52=YWH@B-gI9X}!4g(FJ}r9Mnbo%RdN@K0)`W#%{c>Jf{1j&pu;_15$`@ z5@5f>jQaw(glzS;9rzqSiYWuC2OkRLqbW^cwCZClO;aY)!vwo6_%G1@tdqh14Kw8V z9U*O2#m5F1HyJ>zi;f$LSK;xf+1Rs}SKkNz+x(vD~Uw;|>K*P-(NHm;m`m3pJ95SH1s?t@GrosOYP)h>@3IG5A z003dCusq)^lB28>0068L0015U6##N&b1yVFFmQM;Zgp*9WpZ;ZW^ZnEEn;bBE^uyV zRa6N81GeJtO9y|1OjURU000000EtjeM-2)Z3IG5A4M|8uQUCw}KmY&$E(ity003DT zz%&2=6LU#KK~#9!?VV|8T}2zm@0Y^+!G(S)RuHAA)q;u^wHhNXRj6oit4lQ$x40lN zf*3?3L==jm)F5gR#(w_gL4u$GX-%*0t_2uJfMX@y>ncPG;uJoF(^aXW$`i za_^a$XP)Oj&o*;vLWo+VNRc9Kj1-v=DN>{efRQ3aiWC7bQlv|J5db4aiWDgVU!?f;+NqWo;+@*4p#_8$Q-%1;Eq_5r|Y3H2s4 z!tgR^T|)m&XkLl^FLLxfQvZ7{{v~ZjLIa+2b5Ua)p8YN=p-(3t0-Nu6M(X^UQPT5# zXiY*(6Ple^7bqia%B8OS=PLS3+YsCplQK|Jezx^z3V8 zDF2eSIHB>91$Q`0QIpnJfx<}Y3k1Fp9;>w80fNI7&21u~&H(x8OlY)VpKEO(Sm8W% z>Z(wNhJ5j-N_}Zp0PHGbf;s!|tP6ZdUm+G)l^|qQ)H-NXtuX%y0KbU>{R~(vzbfZ8 z>M1{6CHC2CvHZjo(U{ivP|43lKV4_RNnyKLFApgxgx%X7fc^(n;Y9&#?f2h*Z|diZFTU`3 z{#X?tWKdL-<*-Wry{Hh$_UWgeih1+qg#h3r@N@B4Z~O1RzpJmt-^yse{q~#KuwjGf z?Cfmnvr5^OZP#6QRr{Q)^;7CRP3_!s&sF>HudiFf1qH;4G&TiIM;EkOUs?`;E&=-U z&p*Z5wQI#Q&pacZe){S3=WDOMCO-V|L-GCh-yD#|08U{`jN#_~Vb8`uOOh zkFuWMt=Xc(D$4K<~?YH0NwH%hqzu$DzP2z(OJ`gXw@IuN@m7ah8 zdGX$R?}=Z2`Ni1JAAkIjes}fi)#AbnFAQ;kCxM^NV>T6l$JFO%pM56w*=L{J0QmXm zpQrPE=%I(i%9Sg{J@?$>qt-B!q1{zcG+d($Rm#wM<0E3N~fNBs(A9rCsTz*aP)~9KyWBy3=8FF zaiwkThaY|b>{1E@z!mbdx?9BJKKtymnTm<>qQvjN|9&dydfRQc-6pv%O8>p`Z(D7( zl~}ZBQG=H%9e3Pu;_}NcPX%^-e7y1O@4ov^yz#~x;)y4o5cl7IzZe=C3Q2-YtGgOj z@O%CB*VE_nd;nO^4yQ{tgchi!HX;qSP3m9y2z9A9H)~!3V`%cikmc ztXSb(;|nghAZsHt&J#Y-FSy1qz4wpn9<7QXPkzyA8GA=mK!^wUq*0dT~&ZpekN z?7sTyt7$*9Z@&4)8D4Pd3(u%RUs?%(qc#CT5zjmCJgZ=KcXx}?(NW`$W&pu1#~7CA zF)6?o#_Sj?7amcv> zQV0aU>+S7r5?rnSX}(!?1XJB{S&xSwepuXh-+d_oe%d(yA4f5_)h_VEx(EDjzx{SG zFfbs#{`%{5eu-6(?(&k~c>oY={jIm&O8YqZ7v!4n-q1_2f=uDj4>b;4Uf_nK?2@seHE1DXBmtFOeq`|fKE zFPQX2HmtjlK7IA2Rp8gHDxNMtxLd~@bBuG6d+)t>3VVLku8YN0%LG9^F2~O80KbVz zd<;fMzwctAY*=%cCJ9&o?`na@|f95x)j$5;Us?XxqptWE$aOGj1N<$I>} z^s#i4WMgAP!=eq<7rt-PmsSCw)zp=Y!d=r$@_xM_5;T|QweDV;vRYX|SKLJ6C;%|b z;yGV_`DOb5qAoBl2=N)L9%-&$b=6gwyO~rpJ+_3~f|-BD8D}^FP#H^y!bhidHa0ev zS{4rQ>+}UbeSKB%+kX4)8&;HV!4&~OtZbfP$#5331hd>U!ZUZ@eYco7b7pCU&@MT$ z#4Y8Ny>qZ9LDMeyJGO1xHs;v2ZQGh-+cxIdwl&ALZR^ha-QBqN+t?c$+Y$9gM|D#xtA9)5iT3uv>OrUki*#0lM~5PCoW z%tX2FytEi5L@Gp}t*!Xw-R_rEnrmq1?Y|MRgfIo1OQ^6~T4~P&|lkO`|1!Sv2Mr`$)fHF<8B_}glAw!;1`LmIu z0SB0(CZ6wxd55P2hKyX-UVS@qDnu39#R{;7po)iKBLH@D6#c}0JE z#9PI#Iy#`?d7f>E8Q22IiPn={#Ha&ok{rAt0BCK{_%HhouiZ;@wi9atn4iWAX%6h} z3M#`3U3Z|oCL!gAIUS^K2ylM%@I!Wz95>Y}*zv~?B*2BxSDsks{ADF1v!kV+G*VMq zFvR?M6%hZbs|T3!4o%8$vdgKD*YKs}xSk{m!`=6_D$uJ*)C`|G4y-dB(vpFSFKIE_ z()a&jgQG*NUAODJBIm0G0AkCn#RLg@Oj0__htkJfs*bR+LRQrb1ixu_GfqzR%>!`9 zAO5-Vd3ruEU2795#bg$BnOQCoe^_!;S}JB9?qJWf)hJ$X)mC<5zyZ3YHKXa&AcE>w z>9Y}#njoS^L97Ci{~7YU(Nd{>XWh}#2Y8Hl$fcnQSX3Tr7yB$?=n8`N6R?&h`2GMW zCk+VctXI{C6*-T=PqWqoA@IvV9LPk+d&<0Bh*^^Zgy~>DZ;k3Mef#7EL|qmY#o4Gy zG;ngQ*BKkI?OM-x+o_f%Uqk%rDwm?|a!0^%f$D|<8i$L3P6EI_pqD7_`$HBTdmuzL z!ZhGxEPb__4_Z=G_l%jPfjP-k&++$q-CHFgTh43W4C31rJ$aCD94>5Nr|)-_Y=leb5UU>qCX*QpHr^ zLi$rz%{0D!W?`{12r_^U(5G+<65vng=SsrYziN0Yv9 z)vAc!@)H^Xzo8l(@bS92oA4HZOIVV|xf_Xev*l*L9N2cQgqAZ+kNO@+bC zd<@~9qp4{lUV_O>uQ{YMH3BeS6fWPl@Bxs6!bQ+0p0TpBWSUn4ek#!8LaWhzTK0-%_P-K>&< zqY`s8$)Ossp+RO9%`|7t0sU|I==l%KGt5Bo^@XofY=+`{Qc|@b-^kKpH}U-~e?UZb>sbY@u^t!GS;~EPAOmEQJdgoM}K`+%bN9o+b&%{ps=ZyV@ZUi-@%z}7Wd!63TFG(YnBmEEVokt}-G54#?P z4txBCpnK@xtS_|!5TXJHU}CJx3W{-G)(y_f0tiLW0dg5*@!Ywtkrk&Q<&}PhmXjTt zwzgXS$iWMUxLip`7?dCe;Z#*Sue2ANGJvtzp!ot;lg^e+C+XTGLQz27SOf+e)UU4a z00wiTsBItJRu62oz;ipH&<~U-_5ZxYms2BDXWiL8*jN1bKi?{yn%WNf8uHP!c{5qGlsBhQ2_;C&l|N=v48aF_y76$Q1omyQzOujNg|6EX4<}Z z%jI6+7{Mbd;D{!h;}D>x#;uJek{A(vFEpnUqz5dYkDTv~t7VzF>5v0}@(E-2)_;AE zl;&D*5BBrVJtw#12 z^_?|V>tlDouM>uAmfSwevK+NYuyC7%C3Toms?RWF#wy1SYEXbC##PX|!S+N^B>%&d zbEMRgu7gPKH2dyAkXsvqgAmxS_)J|GbqU*lsUQNydRcKHBkpiXxNcyvwy=wI6jK(K zDT!ATfTKHFfCyuRH4@3MaojYq(7$cD-6RzQt4}gDai+yu{Q+!3(n7zP{{3jLH93SX z*35CRfa0H$$Nxkp5ytFWgKj-YWGP!}oJ6;?->H++V>Wh`b38Tyf2Kf@==|Wht@ghV zBai@?A!r5vC?X?O!eoEelqSlfr+YGs89lWqk>`2ti|)qmSM+PI@LmwX-}pUNJzy~~ z322{bXm_EA$a_j7iu|I=QK0*!E!+--LU6lqk=3wW+ZP+g><|rO=)~5|I&>sPc-Y_* z@TR0~>YUJ+SwLFC)cbEQg$|x>#8JdpqK$?D`17H<0_pxdQ->DObOz|~+Ve?Nz!wt^_x zlrsOG5u2<+RKehs&Pfxvy5pYI-6&I7~H`|H#D1hY$3=2mn^U5fi7K{&+-IjShSXV+T~=8}nzE|l^YplGUCTBc8#bMikF(|- zShlO%ZoI$q#=jEp4dkos-v0ue=7rCBX!TjKTU+)WOqydBcJ4p?pkv?hP9qQd_aL%f z>mL|1hXN}MY>|OqU0Dk|VLjVB$zW~3*W_p!>CyW09{3sJr=IWt?6flP!r;DeDy?&<# zg=Q9xQ&^x>aA9i&r4A@ctb0e{=eHucoFZWleh*L$*(nUlAA0fTtyrg&m}0e^8ioUq z)HIBs3Fz*cTU5yBd4yftO0kxP6%B&8mL(iS0~_{YQNW$%wOG{4Nfb|XSSmH;*xHI1 zx(GQ?eHusi;(Thbmj1~3jjbyE8Gi4_7rPbAKRU4 zlrOAAzhGsp-ZBb>;~CjJR&`9Qb|5^`s_`GXh=ObrJXM7(f4$7{1~0v}KA77fFE zZ$_=C0)3mq-TJe*kJ52I>jLaw+pbj@K{v>xzS@E9m~s>rB*xTxXFr!Vo7YP`%`-$Q zie3wx`314hrY_y(XXY~4BL%xN<1xL2e3hO`Sq$~dG+R|N;2D%G10&uG!wl>fK2Lu1 zXt7{I+JLp+FXwH)eMb>ZLBAQ}T=It>aWnLVaTlXR<|^pCr_1O%EUg0zlj8MskvqrO;`c|E0DOW;jz7tX%ah}Sh z5Ol6zhP7~VQbMW`9YweYK;uDhpl-GB1J6<(fKap&xUc#KubrJYgoZfyjYYTw#F2ql zQjgFddAH_{S30X`eyw(6NQhE!*RGB{nYeWL(s{@9J61JXtE2%J9D4xg?p_SaQO|CDMyy{%MpQ6ShIAuF&HBFWe^PFcz zF-Qb^ZnJ%8I=Xj7vep&bWvKy_g_9`X0J$0sySRyVZ^w9*MtGxQb;KN_#JMG}#8Ze9 z3cSV@9rn2ycH>&fJwiK$(MK2odp%F(9J%I7Ii=6Q ziR<{2A-DUY|DRFge_1{<2C>W_EdXFm1@zx7U)j>u)yB}p-s%5j`B%OdP8*yJw?EbE z?tRDNQn9Ae4bE%h5z3;{E`K8E`4cZiD2|kvkZm19(Yrf154Li`c;asP20R09M%6!n z3Fy0a=K&H@GgFKBGs|M+IB+f?7OdD?G3zi*3qRkV6rVqxKA0nho!)DXVqg6;jO;}p zqoxi#`s$_Lr~fGMfLyyr+x^2rFQ#e3r3^NY1{uGRyubz2zn#!TqFT!xH3a_H$J`lV zZP9mk^7y}@!*vgH-`bI|-V%J)Y1H1@UWzsDlHZ!!&pCe83Fs2+e{Yw@bo%60*3NDS z^BRuu*c{Lkgx*Q7a6GTa1(a6BlS7JQfnKm>&0kFCD10Q)|zY#Y)?KOGF}JsOO1 zKHODVv}DNL=`)@Si0H3;f0haSSYmG43fbe)%|X3Gyr*r(Qk! zizmb1!h_eE5`^ecB6Z__~Myf*{1f96gKNCkjKQJ z7RW{phQ(y{MkjXt3m?S0D9G2Ld8=Y&1m)4t8wtAx^xj+qn5GT-CU>B&A&D>ZBT zD-e($P|Hy~eO^){d|LXy&xo`uI1DQJWOYldS_3gieFM8A`fL5yT?TW|_<*`$a#%14 z|9YTXpm>3gICGEc2lZ)-Mh)w#TzX&on6%YK1EfF4-?Si|cLOQ4GB2r7^x4~EXD+yw zGxFWTzgxLqB92Mss9Dj9a6H|&f1>KLVUcJ=MabVR4|WpM(p#gNThm1;qt(Jc>!XFH zMxK6TR)F5>q5p1rt6Y4ePW|KgoAo@0*W5CK@GkHl1|Ouve${*B8VOfLV%bfHD83|d zw)}guOT_TbY&+jpUs*$;>?_@Jg_=8oSKN0)g44+qj1Yd}@+o|lT^wzt5}SwKD~vuq zkpdema&`nYCa0weV||{Cfia23&!x?2EP3R0y5r|R3!0TS4UJa?_P6xIoj3{>-M7Y+ z_1D|_kd_P(HlU^%pYW*etH4c+C^YC3Oze|`N}rHuQ%gx=#3ggV7M)x>$#yVCie=8B zRKFJ7Z|Bu%bjl2@c91d>ge`S|1}DkBUmk33)zR)7dFvDDxu`z^3<}d~(>xit&k5JH z9R(ONc2W64F2}LkG#Z@Amzgvl_m3fL{$|i?(-6+wLwf+|DtIX3NMqAmD>|qqHO7|P zLz8B3r&t7Vmj0?GTw+&qmmI9 zB*E9|A~0tCD*yeyowdE|#12RG8McL}Di(SXy!*hs=M+nwo?Qws%iWb%Z6s|Jf2M0!AocFv3bAzwtHX`U$Em;VUVl+Cc)%J^~c(lvk zyvs5SZuS#gXyVS_!4MER2tTQd)s#VSev*93pV(!ic72SobtGUi+4M}S^}x$#JakBr zvfyUer|nxU4QwMD*PWxdT0|knBVpZyt z%ibJ=IM$OIzXP-+N?c_$12%h7+ecl0+W`aNy>LDHuZeFY1Fq5NI3DPtzJ!awy2v$_(YgFCoTuXLzA(ku&hFa$y}kV% z{ZE;5uAo-$#2(dl-NnWuJILV#>DO4w!vJFK$edZkXlLW&0i3KU!d1jDDXmi3oMZhS zI1}tBWt@3E7OHft23aMgO5`>*a;A$6*{nKmq2G)i)Xpz*=u>AFCGJas{wk+#M3e%S zsX?xKk1VbfW`Wcp8Vat6@o~eH{)oKU8BH9LWfoNywJ{RqqJYYIH3(>0WNrn)_j5rY z%^KT)j-FG&KvyvcZuPXlL#j>XMCWDqT=0(%a>VUl;ewTQN=2Y?g)gVgn}o7OkIl@c zTA`}PVc~%E@@wKVrU#vp6!s#XLi)GH#lP|5yqKk)$GB||5i{)oJ0=(G;ZXR)je4@E zTp8q2_)zV-6H}(=&HaHdi0f<$4Ert!f7X|?{ci?=~*?w#w8EL|dwFskO zPaF2xoNb6!Q{{$KjS46Zkxr|b?qRx(^|5!gYB9N@?-nS9x=#YuuNB(1n7=#h{L4Z0 zcBgypSs`J-1GQiSKbv zoSLA+#hsM!om0}Yx}xXft}%5DoWk6YnR@9NGiV~%KRd9dKV?diM->0eRzlk{FXsuU zpP z7bwLS+U`AjtS-q9VFaee_b{PU0K%TO20lXVM|qZ?GT_{4x2LPlczFuSLW*$~Pxj!u z$l)R!LN?=Bae?zM{|p&5MCKG3Br)6F?HX47V%6!344tikol{9(Z)Bq1uA2@;UOB;Q z!OeI>Zd!HZo{%HQZ_2`Ln zlcl#1ISo1}t(OdcA%(cDTYXJ0D{x2Pk~H^U)+KqelmX+Nd9rr`<5F9W^o~W6j7ued z%7XFr@=kP-S1kBorDaW>@*WI3sLo8R@wQN0Xlv|T+hHTjuLgcXvybMz4_6Qgi`hk8 zglT0_b?egKdJ*A2#Xlc%kVIjddl62Nq$Yb5G#YBbTr;&c zsttq82>5uq^f&pFX!Xw02j8b3&5t$udK`)}cy>*`gfzrDC_xfNdW2$FgFMM#Z^%kD zGG8nco@v9dn3fi7OxcdcNyecm7vJb~<_+j1+alo8__ym`>x;xhP4Y*eh4D|PkOU?G zanr`>6!xo=wL{Ao3DA?w)?PMKG#kr(7?C-p}r)wNmm+y##cmuRb_h4zr|Rkr-`D z*F@LRbl;7PWt4d-|zbkMg^%H=n(sMq_89VN`j7aBZCQ(yy%{HvR*H(w;Y2! zi)i@fHWHsL%Q354(H$S8zaE8GH)I~~#=+SxJxifldvo8NzBT0 z;>}eqxm`}Tc0Qsso$-UmC0O@6pH@yTIvM$gr*%w+&>$iQ)Wd%-!b+**C-2|s;x|m4 znsji!p~nGZW84gM6L?##qDpWDZx0};9UMLi(^J!U8J1Dd7sPlnfCLZwk?jVQdQquL z%ZCfS%hhEJQ{H`i`6hkIMdQCB>u9$RAT|~#+2URu4OHU4Xti02lxBe?R}owLyNF}R zJ^bNwP`!4NV`(WUirQ?7gjI5$sxo$MI0t3{gQ0BlGK8-~K1U7igPB$Hev*Qacu0B6 zYt-OMd5W-3in(!s2cATX(cLj_A)qp$Ssy|lkm)x~GZ}pNmS~I~o-t%pZ+OGE|22GN zjx1uAb8m#{8A~O9C$$Nx(9pQKtA*8PN$Nhcrq9%bwr|h-M8=+{PfhJ`To3D@) zs(daQC_bdh_`pnIk|l)U%;ZhfSns~Z=L#`6jpuO0VY=+IuZi5 zf@e3&is1VbLocbwuIH0qdMcX8@{B~uGj8fC|}Gp(i->r&j# z+PX0z{?yz^rtuW?>Uf8j=KXpxF3lnj&M*o6 z*A`yswOVE-LO%J0hmi|~Ya z2}l;L#0qHWV^PkU7i_WFP6u|4U?6HuIA9e-uf3W!y9UAU%Q0vkvC$54+?c&CoSw)N z-9ewN{OpSbZm^6IMt+a7!)5Ae6(!61Foy(6A)TqSq}xy_R1k_?J2M2A2N$aIgTXZ^ z-^Mi?>;%kI)L?wEJJLiP{0c4K5!Nl+60Uwu;bn1|!ti169YCCUNwh&9SnUTFW*#w= z6vJ8}^_2PzwoIkwGiMW>F+18`Ad07x$9r&~u(jU=3F8EhP3&Rl}Xe-d_ zv}Eh(mqV{4u`P9^c~7tex9GDadk8Zf@46%m14C}9FT>xvnKlW&^CEu?@y+2y_2@APqYS6rWDeNTK!TpBtJclG1nz;gyHIdvKB*!vJE=~M=lq8&} zI>tqbHqYu71Xk1mg1pzY+ff5l|ATTJF;rfNwC|YSM~sC4o;k#gVjXY?BSpN#k+tNQ z+HN@~8q zAMUHdAEWwImU!={8)nQX;KNsD8vPXyD&_gQn+)8T!Qy^U`~7#YJVOwKKr#ixw4PfK zc5OW|a746?qmev^h6Ir;X5g-lO+$7TLMY@l%Hq@V!(eBCd2{yTkFwZun3xD zi<=Mf&Af1Mt7HAwFC?lIwCS5yr)vuTiId5XQJ-`$x02|r78>YUCAR1 z>62JBMg-|JGJC^s1U;-h7U*RwK{-L1eb%cJsP}si$%#!1ovIM0Q3j6Opavn4MM?a5 zTM5o}GAL3SlY-*~(8>+gACEFV!FdJ0o#)<7(~rs7kd-BlrCvMX(JFy&8IP~gTqyf* z2^Jty(Scl3J~La;!IF}$QD!y}C;xR_d*{(=9h1P5MV`XoQ(ulo4OA?)G$;*yZrSKR z_L#*t%YNnR{VzhrAu5`wx|;fHick3oAcGold-(;9zDdkt{s=(}(PJ$@iDZ#x@tU8I z`G5(k280_98i^_r!uWxjyQst&E*ov{?}=)ZH@J2IK0*pLpnu%bUJ~A*_%6Pdy(b3(;@0U?PJN8S8jdo#-a8gc=Q)uCM zYdGNSZ1;f&j{hmrj)mW@bs&_GXZHS-Nj&igZ2^(?wl~+wqo7>}gWtcB3Zf`e+MTV; zNb*hViuRStZZFd253m!faGX)%vzL2duZDQ&@x3sl0kU{P!JHeZF$?mWl>T%-US)y0 zD;)G&hyGSVAy9}IWHsWu!k{X=Cd(pB-J3`EQ7g;;65*SFjo#d=c zW@d>T?FPiOl$obPKiw-G^?jN>5#i0@HYwbqZ$W55U`%E~(hd#1Z*HwE)at4WXoF@- zWE^TxC+dSq%;|~|Yiy&8L)1abQ;RLa*{5Gdm5qN&^7=3E0)Ij3QA70wuG9i2fpz&m zfdY@&-U8oPO@|=2_+3#()7RUAr4}gx1iG`A>^5qb;OE1V8L@7bqD)M!tB>imw<;V9 zCQuI=j=!~&l!1N@`H6rsq-&a*ozq}{KW%-P&rQJI=Mt*?GD~=uOLC#Afnd%l@rL}b4PziqYfZl)ZcD*Y+6aZ29$1p&Qi%;w z_g$#dUyXLRcC-P8-A5(|Hgl1$U9aq`eb)&#*by>DkiPxv&Q@3{Z8-BNm1(F>L;TnoJe$7`xQFW>b_t;)P zER~RM0c`*eLgy9UGrc33{#~8X3t>BZl3!V)f9FoLIl$Y|= zyp#HXk`{y)=Sg=}D{SwRA?M9dL;E91iz&qOrtab|*b4Kbs{+L)!N7LZ#49V*YtLv? zZVr4^*Qi~Cu^*_K3-UUr<5c)?NVp+T@nkhaIYGSYD7LalXF>MWaw;fFX_An|?|84l zc^?3CxzWCcB!%ZPo^5*YAL&LIcS#qRY^aoP5T~JMfwQO2c2hB{9U zv|)SwHc?}qJd)=-XSH*gh$o6`Gu&(dCzVmyZk+EJM4^^&auQ65mLx0eZP|6wG)nR82fk%As0um%!ixgF;=BXhyGoO$7x1}NY+&Iw1(RFi@@@g{abJd*OjxO>3bgs)m*~z91sc zb9rDn9Hg0$#owZGL;4YsAE{zj&O*WL2e=b6x7qt@&$GiTD^=kxJ(|+vs@Z>(AhE;{ zJ*0)NeGbK4q)#6e<8x!=r4)(gtoD=*gkN%aRG~>8RfbQq-5rvjY7O&DbP`jP?F`-}NCY_x>Y z@_ZoU0uR`#R>A|aEtPMbX7Y(>4cRTgJXN$d(-vTJSicaHlhpdSma+K&lEu>7kYFn* zrmYf8V~!C4%ra^2!OWuP9&}=H^r=a`sS+mue-o=uOMljL_v$MMhSS%ac!%NjnynO$ zj~qGg)$5nPWzVPC!)FDg3J7c!5I7*+=sd0a7n%k-EG z&|^gimKlSdK*ns-M8NbfLdR63HYy_G9+R9LR0lYIYGY}VK+Y9hQFPKeQ5m88>0pu4 zO;8+!A`HX;%%1*Q@3xa|6gysjIqo~Ww|4n;5k1~SjJU&LUf(KnC z3gK|#P>``9k5WC2CJg9SCH#oct?hUCI4OSX7=9>v5HTSPy}a3_)L4<-9GWvx!0M#P z5Yx=zErrT+o0Y}AyKAS~V7aTd>l@H&GOzrxuB{#2;j30nGrGQRK9&w>N&&1#%S_02 zZ@fMX$lx^stqL(ginAwh@Plgsq7SkDNRbBYt@^=xMG1~c_h;o}Fzsa&JO$d=Ts=5< z$R}9leg)0I0`yo}O1!}i=1c3{cT?d*JXqO>8h!(BYcqZW@a#k}R-~&#R+i1b^wgCw zmJkDa9Rm7IE(dfvGo|HT<+suPkS4r3&?kYN^gAnT4O^-nwko-3b_u9-r`% zRi?+IYEXw=YA{4N(QA}2%6vjAKiKB{f-_C7tq|JF4h)cxJ9nAq2Io}!GmDY)Ia`{ql#|X&I&%02ieZ%_5#&p}+iL57pe;c;@~PL-bQy_; z_}em=LueAp)JW9l_jPB~5kl%^eb5Mboyzd*1Mbn4B)Ev;#O{FEXz9e=#t|08igBG| zynWxG>~>%JN|xWOAk0nij zK7TQ#z~($Za3N~oVKX^h-}-BwF(6@L8JM^U2nvg1!R^>un6YOLnD21s43_%%*5qDa zo(&NvznFQMAge?Nw@5eOfo0DFOG}gNYxGqmT@z#)Gn_=7mW+?CCayIsuq_j z1swi@@&@+=fXx-|slcR+Szi&#$Cex12VAF()3Y7n80Bh>oi%sPlyBXPf2caXl*ahi zaklmf$Ar#x<54HmrjVDRW}WA!mEXKQie!@19PrlofLV#M*6pN1wE3Ws@*FIv{gOkw zQVCD7v7P$s5*QlL;GE5y8DntQZf9!u{U(>2?VQWIv7z3emT}K)O(~m3HK?%A9_zkI z(+YxJiVB6EwU+PWJ~dz_;TASZk{#+$W#bg78Yxem_K~hW!)`7hNaZLo&^Dx&q&-0&p*zFeb&4`HK@uMO&Gqa0$Kbt%XXT&Sl((13f3q)TVdE2sH zkYOT39S8CGL&qXUJKH>Fa=(mOJytZU+e${n-AXK-_kn>~ws6~V%Rx3kr$fToc@HwgqA&3H}@L}{{heKGg#}Cn_+k`OuI#QChh@?n@clX0(4)mw@g^}KvWQq94MBp@_+U(bD zuGL^;nR-Ex6&xB1UNL5s|}TmNeD4$o+J?{L*Q~Qh~8M-uvw0(nL?z-RBVK0p^{!1 zC?2KZ>mScPPpyIy@$E04F9Yv4uy?^Ug)Jd8iaK1#1dd>j5+`#u20L6j>3IJ(Py?jGfYfZopESx^|Q-Ikx*+bghXPD`6NsaTS3FhPpN&}_J; zj;bR%3&Cw6s?H z5OfO`C3O&k{4)%0UGF933J|~vw(L`Cn6r!*ynQe6`)gm|^_}~H_p;EYh(~~zeL)T| z*qcdYwdw+Dad--Q#DEDY{S)eeN8LQifT1X{!WY{*HnPdvgW+_GT_xmbCzng-!B8QJ zuGa^R@RsQB5W$HG9W__>_TWw(2lqhjdEYrp5$D>Vj$La|&=vNV{>cCC>F{GB8aSzK z-lJM`Ecl4nTbHL&>+U8OiYKE>G|j%p!7!24|CmkIg5Gc0Jbf<)<&w0!BwLe8{K4f0 zMc7&M@-W6BlU58Yg`?LJxD-}o`vMtJu^wYK&dpDqt!{kJUYz;b?)9T0dIQ^{7sAFm zxI4G76l;;ulf`H|%z}?K5g+u6)eE$BQEgReOjlZq)JviRCyk$4OLmxs^z&g5 zM$U`!0!&%kkZx0<)tdz01INxaBoj!ttKwD`bMoPSRld9P%g0R11)Jn9wWYoV^olyAfW!DDt z0$B>r@a|e1hZ9mI!0j{asj!bHJfy5lemSF}R3r>Nq%YFK4I9puYIJQ=D)+PKr4=@m zC8}7ug9kDw5|V68yf^+^i;)aU%~}5t>g@{XPL=nc_r&_Hf^Ba26yl;d@dIE;)g(E16$lMN=8A{J^7`1 z;s>Kj&Tv%n8*bI6OQk0~Wq2LKQ!!=qz%^yNp2BDmC51PDf{6%u@-43(7~yYu0a_te zKHe9J`OYMWzHWUw@6XSFUkV*r3pxi6{GS{Y0D$0sPl6CKH2F^+gpI3 z%`}AFL5oMIQkyJ8p!(_%m7jqBT(1wpLb{`fQ!&Am?L~6)Xfaf)Rg#GYcFy!_8tDna zFP9Qe6A|R|c{;4&IrQQfzBPWa$33$+0{9IaV@MT58*(@`!3>tgBn<*w+dMKKBvy34 zuB02Fb;XK9rPS1?*=|-UnhY*w8t53CVmgW2ZR~rg^bNu?=vTYLV{YUpAwR`t1f{ve7YCMJJSQa+P*qokXd~rM}OfFZZ^jlRzZDxEIDsm*!2Upp(DNnvBg?av3 z3%(3ep|!S=JQBlbmy0FTs4e2Fa$?Tw&L~%BM3ONI{hJi}Bn;G|sksyt8M6B8_;BtD zMdxEq)#L8vlQ%nr(0Flf2u5WbtqtPm`Q$JRmHqeZ?dUxlySh4#ZD(h~?~DiTNB z7p$`N?w3wTf1v-aUku0zHVI$=fDjG;n_87Y2?4|M9~m0S1bdR8{AO@C}mtji+HHEth`&2Vw6NC0Yy|my>&>j!-7`J!=X{)xJm+Ue?u?8b(KE`LW^X;kaV3aN?iV}jTJtaa zzUu=B`|0)(_#5}11YGIY{Is1@@K*nly~rpZ)}0;UnL#<#tjH~AcJCba4%IkhyT!Gl z4$ys?YQQU}5@?OAkk~{Z4Tr7kMz$)U46rVEmj?X2FyiN!8{$(Sh<@$;eawfGO!%&F z_P^&fMeDK`OE0dIr;nu#?FZEGr35_xKvE2C-8Sy>;Uhq32QZqy8^(A;-MuqV^T^Si;XDf<_mTzwuxe4RQO>@Pu6i#tmpLl$9}b5%=GN*LHq4S?f=)4!&NU z;QX+!ToTdAOb8nA%||`i;fb?kS1e=o5m_54gA%wO@m@ywWO;uZCevrTpCW)MK^dU6rz!Gk3NF@3U^evj^(j( zU;~X+c`Jn7K9HfY?E|upYFA6oeUM>!1~X>!xOV24)kl|7Jx-LFWXCczP&yIAgbn_- zI&W;@9RaR*6va&aeT|U3kEH0Uzijfp)38P84V5%FFO3zVI8`}9Q;AU8g&DnV;vB-$ zk?OTP(sRotSZ-UcMCA8mK8%ts9blB5ggTlH8BsBTjmyWLLKeJYI(rOi~d zj^U{hKaT!QAq3H)GYu@;$6^bN2g&|3K*srM(88Na7!8e_Ppf>#NDC}vL%>`^;LaFW zV`a;JU+;ehcQLDV%C_IJ%)4I?Jh=Z1?$X9K&i`Y#plU69$OiWvGvr%Gk=?>>W;XBL z?vSOlQRkG8#C)BjLK!4=Rl<|N)_~mxdB1CWMMP|_fMPQ#jd>Mc>5W4R@(;D*T>Y$W`x`s@&VgU>s3M5&8<)z)u^5Fnz*Nt>Sbzb? zS$>qKX_MFbUcydykFKa7(j#6rkXjGRe&8f3fyTo1s=n0f?qybeYv-M<2WOs)KVT$4 z0)sroz(TXWju5VzY}YPIE);?nHQ{Hb`6ga5?( zm7hqDhEh|M5U*Z6a5Z?=HsT-JOySIx#)KlkCnRFSMs6ZYIekwZmt%S%l*C$nIY&0m zcC_bwciGvIz|=QS6S&8BL{Y`vq?|mZ)xXVqLldoww$Oti-c@9N8o~mMh@Mit41uUv zf>&Vv;*n91Lw{3AsJU>a({sTSS@l^%8wyx3?u8Zrk?Oc&m^u|_0y#?+*y{h|CQgSUV^ zqgh?6g-(}x*~ZBpy3(OG-t|k8O9M=hU?E$S_Olx377`pQumma7 zC&DnJ76S1VqZ~8go}WXo^uU1*z&(rCy460A2CB2iS`2$crNXnlpEenpuAeaBp35)D zGa%DUowq_V`nztNo^+0YZJu;qQIN9NT{0ig=dLG2t><9d>dP(w_3PdLpxdeiN1=fO z`v*&ML-=jkLULp+5Fa+gV)};q`Nj({D#Vgs zGg0T~^Pdq{Czc=IVWKhvK1$6UL5_Bciy=)qLoES$^7^X$;Ko!C zK2lm+sQ^7J7&R81uW^4_3c_&lgpv3TN23`DfdWc{|?~3go0*-UFygx^RwZTII`roN{)p7@fEX% ziV++9r6~<==SOvPN#Jz15yR9nF-osbsQ=p6K23Y! zDf~iTB?15d%72DFF=H#c|6@}tdnkhBBYMD#rG8Pf2%4yLEg0wqK0>Tc6Mj&)P*E|b zCu)7))vkX+)JHYQ76MOeBj#3y)omH`JI^B31 z8+`s~U*%O&_Cf~C=l1D4K(pcL4AKg{ljjFwNU#R!p3n$%Rh5Du7YyhO)4TA+W~h8m zl3#_A0+fz8Hp*2Wjf&h8c2x7`9V)j2=Lo7VOAvEScbY@n^8kJk0oucI#d`fiN_l><_MQpjbj*{+c9` z*j~U<{b70M%GPn1FG^U6XdU1-u(M#xIJ0z50P50yWt^ylzaUa5J}QFN#25)ERrJXp-oIXIyeIwy3-4m*#Bia_)Ic@D_p`s<~gO}`ya zZZz%9X-c;$@2D1{e>=GJ#6-C}4F8lG`6#f%h!V2a`z1=dXt?CC8u5gY&l-WLKDl*& zsg*qR9eYYNZuhX|@ypln^jeUnB~OOd%}e_u#`RrL-axVGa(ltTp$#c&sjBcGAA3BK zIP%*(WAo`_0#J!Z#ephQSpU91k&oYPiPtK@j<_fCOvhIEynqR(dQ=7HT(gjDpv+)K zDC5=UttOPTxl$EkYDN2w=`~Arqyz*J@@~Bg0&%te*I4mUWz;7uJ#97P1Md`9tISw$ zxV!mo)sOdcP4CJ@Cu^r*GVeCuJzws8*yun%{%_ws;vomN7W(EEqdVFWy8+C z*e(}X%etDmhq#v!D{KOd5W-|9J!?vH2K_LSFcGg+Kd>uP3Yg!Z7)lm*Sz(UeR7Me0 zVX;HSSwTK~dysYUMh5dq9dCTCib77FtxAtWceWmhUk)qf0=+EWlki0xJA&1|mCVqs#!D~N4 z?BU#C=#aYxBo5e(xC0#;A6447df;xJ{OQYKXk@;-H*@CJu6BXi$5wed6o$bm4Bp=Q zY6g<#bn3V+#W~*?jp=gy%453}=6hF(z&ngSY0%r`pOY#cH4N?SF0~2;^hmr&6-;@(C-4cfj4$0sCuQUwW9NJBoOU;=YC!LGPLfd;pMC?8Pb;IFUUG0)p+vN)P`R!y&Wr5=@ zJFz+v`H>SN+Qlpiy^W!O`)L3%s<(8N-K%7(gVFy+>D);zg}DAg6Bj%H0LFiYCM9<} zW0_xbjQ;~Xsc70>h`{{^JV{Y2k2Zx5n#LS`Dz?mBT*5YxT87m zrErJsfp>iW88-F80*1+TbQ&9Nq3@r|^Y9%R6|AXMybQ5^2yYY6Cg z@bR-`H_+c)JDTR=+Ljv+3%h5+nY*?(bOAbR<=y$YGK=wyJ5fx=x}o&cAd|=#l97Fx z6XzXb&7T(i#r(O|Ks_lT=8sZ8r+;=_)s%JGpJm=Teo0{_KNWOz5ZQ}*6m;`)HxTne zxLf>eZZX{jvL$>*`06kv%1RSz2ITPrDot%UUJ=O4L&Qh!mcE?5d>F&1K%xeEmhX$* zv_{DeG1Ed$N3AAJh(6(yBEY3e1=N36K1|rNOV?bNupOx;%FBWT#LRr{{EhGb*v~Yh z7a_>8q&-y|cg)P9MOi_FB^pp)9edm;RhV8CW=>XIywS=zFhnewvZ8A$na7*ZppsM< z5Hls3{+_U%B;?q-QN?$lI8CE$`7FgmM8ndaA7R9{bwty}%maSiinIO&kvQDwB8{YW zBL+vLN0I79Nlb2z>>q&hE*zg+-MR{Jtu%f z*kwPl(Bq5~68H_StX(e8el|Vb-g!E9W5U*%v%J=<1SS;(j2{Ez*DOYb4{<7T>4SY3 zUD%`xYnOtk{yV_sS*p>j{#+73qTrAjZbi1 z&ns~TPSL4qexf;~?GuXlI?Y~us6J*I=2R_$^1>OyD-B)hF10ZLdg*GbeU`F^mBP008YjW0<0ymA<3d{{g|&E`M1=xStta`q9u8EjA$Y z+d<+~i6FLMP`ZJlZnB6tL)kjyO-uLHBKf4BFB8;I))1B>oWP^Lo2x4>pMQ1~y#qSD zARbqVNqm*7HJZ|O7~X?tH-dVB!?EGK4?!nMdvzLLKpfA7q4;V9&fd?5e_q5T_I!EC zgmmfmc_L%-N>(2)EJ2tguUV-BHTpL5LjT9N zoUaRQ^rg&t{5`P1g6#IFgusz^ur=jW9;EeONtw1TOBKk}AiY+AJxT9?XCo~=M$dF$ zrg!p;U8?m5yRKlut_@*iFQ*8MW%n>DjLVYu>;B^InKUlpKjl$67kG4~mzy_vMwF)v zF4elyA}#8}B;Ko9=B4pq(UK#Rjx8U7mPFwCEkS398R zn=`BYJFL0cj!TS$_`<3y@(#X0G`EAg5AZ&wp20Tu^iO3IugRDBeNd(Jdp&RZ;A4S) z3R{M*Br_JzV0|@sJI!9V4CN+HC(Xz=M!Xed8N-NeR_ViFJR?w`74&PreX8XqZ|4Hz zYbwX94ngT2u%x${*wDj!up#7Rcqm7TK)Z6&J}Q3m?z0bs`UTQEsDOMx@8W79pwN1i zd8BFQxxFt;Y6j~DxW`eKYBn_SV#=ZB@yJ-ornwxICW>;Q6?pb?iqrVEgR%xcU}@vRSvbc-IN&HQ!u}i0jF8l)>?_k|YJ-qq zq57>4%S_9N0W$FAK*KNw(vv1J=%&@eUhmsLrD)73_`q^|lhc)%)jyJnm&^yM#Yd0U zd8Us+MMpY1&cPOY9=CoZVHl-@YrQG0v(xIlV^BwX9K-d5s2z={sRF!9;>hK>f~DjC zP&`S<%OZTpZ!TOmW+gb0ZsUWz$4Blech2;DLueKmMS+18mp7%yB&axbsesv>r4%!; z?Edy_jyF^f1mTcvIHH9Ik2|O7=8CivI{8CVtxX`@#k(A6#ZZxvRF>1^wRKZ}rs(-Z z^DHX_sau-{KAIW`!g*f@?p@e>)kBCzPuk{#E!a3W+*}%!#1Seb$Nx>c27~1u^@8qg zcOEZIxX7-QZg~v4C<-r7O$59Cmwru96#E%=e*N~mS=Ns>Zjwx6KM^0ONCRsm zqD;KB2>XZ-P;%l5Np55?-0_}NxLRW-rMgy#1J`maby_*Pj$0P*V^NA}+iqB8$0 zhC;yB?SEwA)U6#i#1Ou7Dn3JbDrn#>qogf(t@OH8(Gr6>trYM$Ju@Y=p%(xuz{M#c z3|UTbJ%5foc8caPM=*~Co05mkJl>zqb8=3uz{;L_Q)%yhoOuEcr>~!m?N~x5&uy9Q zv0nRmoK!B?>N4(5K0m3o62CHR^l)sgM}MHOF1>(9Z}AxbT$!S+N~$fIAq1xz#i>F*}3e;y?Nmy`GN%8jxOb$yp7z%YS4m(E)N(g&O-nqUns zGa#5j?21Z@g5YcR9{BHUXxIpSfWF{!9UsL(M_Gu;QveM*EosK<*a%Ao+=3gX2mH`} z3JdIo@>2cGsb>DEi3QAQ^M%?eAzQ{@(zL8StFedy(8QEb*uX1WZp=?&Cl0Dp`j>lK z(8@3?wKMCeZvHqU>Gkt1EAg04=3%>^KTJgjT{Nt9=`U=k2`4~;;d#2dJv2p=91J^%zyt~i~R(vAnM&su~`pzFMbsKZviZ(JW~ zqBT7JjMH*iYSiJaoGOo9L>nx4y&XUyPW3ep?TOK=b9F4h=f95U*X!J ze4@>p7gGf~aI-(II3|>%R25cVwO$yC5XjY(N^QQ2Ak2}kYvdLk2&^H4BwDZ>=O9%_ zV67;a&w63fK{K$SB|QYxf}Ng!yr9!i=-TVi4JC=1x`g;kI(WGsU5+wj+T~L495GVp zb_k=bW0kf;VH#C}_d&q3M%aN%$M*O5!BA!=^gfxL0`<{f^r9}T_;8)Xkk|FQ2*RHx zYqV3~)r{@iS;@G>Z(ubdwOUaA+YKhs{KvvgnLx)mPV~JMd{VVGf^WzbT`BpDNi=us ziL`YPA-nFan~+AuUAxrtxnziX4Hbk9;M8)(`X1L#@InAhP# zR_eR=%m=+;W$LUC!fyS}^(>1u8REh|MGt&i?wL7!^}6^HDtoPyv85COwTzFklfLwi z=iNnU@X%bd4NAEL3y-m&hfN=E9?-TzPptdmT4P`4#p%`M=;NiKyVghQzjI(&SfTAa z+n7?;WBMCfg5B*AaH7aNw99=Tv;H15>zo}gTddHTKdgcCVQOF2O^*UT1*_MHbWI%5 z#2j~oq$iD-1j=Xo$yVsD`Tj$&ueI=8k9T4aLz&%Pi)JbS?Rs=87>>YSnf+!QoHMVm zZXcJPD;W8Su7XgSUM+G?U_iNQfw~Oz)A~hfoDzIg=-mq%2`zPdyoG=%XZulyzd3I} zSvqBcw|{qxjOUK#*i|l~l%@P2%f~G!p4v^ev6(29G;!N(VZs3gnh z9|hG{^pHPPJb0>;GKLKu8V8vwbqf-!1{7nly^Jv!oU*c#p0wWQpN`~{u{O+mNs(tR zzihl5K}>!e7=qqjU-aL1;vECSmVw!$_r5L1(T`?cbVl{6!&?isjdXcW=KcCae~L35 z6vJHvZfR5FE$YB?{p)TUj_cdOS(E~+M@tRH>|leUTe`yb7oMxBFMl?mc6VAguOWL= zT}3l)jnq5h;O3ho%vUO47tKX9AbD_>kq7lW7+FnQfqW4DmZ%OE+Q?VQ|GU#7pkV~m z#2DQb;X{fmtRXOhTaa-I!Roq_cLH?Lh*O{U^lp*P?J#OJR(aj77`4RQMY#pKpnclz z^3XR4cH;vQM%SYvLy3jLco& zmjm-pV%JHMF*ozFJ+EqU(4!LQgY6}v+JFz^n~mP-$osxH2DJ;z*z^CoWPT(dLM$`d zOByc}pk9GBC|V>@Da8uZUJI$Y&uHEe-l;BQsljMl2>X&|5DUT?Mb zQ4449d9M%7jmP(nR$kvUov;^YL76@wdv*IRmq-r5NX>n)cUPVH9RoLkfJFdaY6NpL z9D2{6oSl`1Gl@Hio@$r70fFb$(7eKSxB zjHF;UrJB{wfU5D_uvB)S@Dk?=Cm)dfrx-VZbVosY5*wj-wzSu$P=gLugz=3$ntV@d zzwu%H7b$tiaPhoaNi}V$^~ygnIWXWU3y0R-7T7o91pGt!qF$P11V;APW&%0#2ad9g z!lNc3Qq;u8IIA?p&Jbo+_PM_b`4`a zlYznU9VZ6PLly4b5Iw!?+ro%9c{9R*@i}F?IN9QdTHVmI^7R77gGRT#HKO@u>9ipy z9Kxa47SR_g&4gcy zJGK8UhWXzMNGS5#*;yGo{ZH-MHP)@;hRCz0={v90Tin1fzRbc-vr87{A2yPaJ-{rT zn#Fr?b9#%QA+bLKoZq{*-P_4cmD&*ciIa~fN#@ptt+u&4w=d7(r@n+>UoY3JcRzwU zSce}gp(}0N7uvF7m+u|B*<2WgoN6|LFE%)<*P!n1UZ0HZ4K0oxc!zGsZT&!WI1dMC zKadIdM;i^i>aLGLS|Ez6g-58X?S=M2GlG`BtZz85gsinIV1GGddxg*%7z z2n#Uf$cm>yT^{pR)i)V=39*B2$ZR)L!cnxk%%LuyZc$)e-y9e-#|ZImGUFfimhF#b zQeJb{X6EZjRwp&wr2qOH*}|~dkbLS58tl1asi<(H0=LEKH~J0WUx%P>v^w44Fks!i z$;Y)GM-unX4gt-%j)v*KJw7YgOC;-(cJTzL;1{p)u`tT257fGWPc&)=1~tw;vb6S zlJLJjmL(s_u?52)5~h?Ne>s$?n>b@@GjqAXUJVGb)1PK4dZ zt)@P32ksYf@{mP`cCn4L#_jltc={jbMe2jH4F*j_i!;HhGE3`1w7`_TD!uUKHm_~r0= zde4FG)0j^oj(hw=s1@FkMjqz=PC>m2Ar#>2=1mCDEgcB$X-8Yi$WPUMqt;RLGY;rX zOm+moXDZy($&;tY8Wt>3#dZ#xJ`O{~&vfgWrxA#^1rIoc`TO&bO~_LW2Zw)AEWt0J ztVNH!#Z*|{rZG~dbP-$Zamj6}3_U%2Qz{4*q%$a&JS^fc3dxdS@3sxz?UP!SI%+(< zgFFpiq^25Nf*c%qc_}DWJBU^&sSUvZM~Pw|MIjL6$#g8H8Eu$h7=d7kY!6*P^se6vgdGU#$!LkZlX z@R1%&nJthbKiIW6u+6j(ODGo+s@JZi0AN`&=k08N)m@x;0KLIzOnwAFiCsDbzzqy# z`~p(jbg~?CPw&*2&YjHG@kALQQ%N1pn|J7Z9AV^rtPmwohc#n>ekeT2R$kG-+Lo_P zygM?Z)SBBi79s|{@f#@wTC2!(PF4=G^|Cn=@5OxILB-zf%$!JIDT?z5w>fL=HDYPRTa0uL`{AQg$~QyY zpz8ozmM7|r+kCx~U*YT1tC=HW_?aPt+*f#a=E@pqXg1Va-FYHxKvX1jZ(#WmpSWXt zanQj~085e$W&j5dmB!RSefuUamJ1VosP_2F#Qcm0zCN!_mv1v$ahDM71@~Nb1=xLm zj`tG` z?>VJkFudZ`B2$BsmWHoAzXLtsm-i%(yh#Wp>9-}N&{{>eZ~T73uazn5VZcXFs6b2kM#8L91j^QCQ6IDdLtF{7q#Eg|b^Q`@}&cb<|l9VktKCBr!Sw zFLmgw&Mw`?|0r`WqWL3i8RLEIme8=|n>AFiQQhs6iK>&ZKZEPn^*@Bp&9WE=74W&I z+pupU9%Tt>aF%e=7Djr845+~^?7)E2 zhkT+Ge9&xgHy~OVxSdHbA_9zK>4!R)g6uX$#4Q}>Hu1a>c+y}cMll!-=_>BAR&>h3 zppdh%?0RG_Hz!&3em?cKut*sDB@N&Hq0mIis{DQGcLH(As|-xJ2_TxnQ*Wp!LNVE+ zny&(-LKuMTQ`b=iWSbnI05Dxwgi&K)>Wb7F`S42jF9s*(3c5l$uoH%!!FNtgRQXV_ zPYVO{2AM2FWYnSt+HpeW5X3Vs6NR1@7Z*ZmBbSn36Uw0wJ3!PS>iM4ZtjCEXP`H+g zv|gG-!tMa_DLqAEPcD@;_SY9DdaGlCr(yy=kxk(C36xd{5jWF>VX<*P$!HhW@e%yB zFacG7&I1idr;KNn+>V=$vF#w}uUggfu8yCNie{vHWm$PHf?ARP0H%w8|=b zal<9pMt8B$m?VC}-p5kB0gvD>La#eeOg8otMfnQ8w4)CnV<=uD7mY5E^A%A^Ge`1J znh#azn`9&sNDe@97tuiirU+zIO=P4NLjMyF7%o0SEPqzUXT;F)a0Zw| z5;e@Or?B6!6s9a2>@a4mXFEpk{y@Z-M$%i$*wgnziJxDoWhrEqipK{zXUry~woJtvt$0b*f}8ExNek=X0cUIgf$R4@k&2jYxXw}U*&w+S z%*8E3N(vXxs`y%A<1xb&5yd6-VD)rMVWOH6^38}+9lk6=7>I=PisKO6c2j%skdmtj zcNQ9{D)k?=halDDY^c-{P@CMWl9pP`KrIVZg=YEeZKTj!T&IZ0G>ef!nb;hG5#Y@1 zp~a!D!98m9wJ9n7mxVa%D-;F56xtcHFnEKTz~3+6MfzG{_WWF)8hb>4WKim)R0?4< z4_G{-{EE1{x}*UlhVYVS^{Vc)^aO3fL_1Q>dI+3SFYM#kUQdi@`*DA3!W! zGHZK$O5aYh%u|9*s6+Od&7VF9cnK4ClwFx-jCD>x^Roib8EQqJ-y|Gz2guS7(^Kx! zHms5nvYT2{4O;@rxjN_7c`pR?88Vdic$Re4Vw4d9HkP7XE!fdwQq^%T2jG$p8PX#R zGhlg7Rod?G5NaI_RaC%KZos|$3>)~A#>62J)kZ)Eeh z@pi~?@WsLG;uZ1!SE1fn75e?z1tde?B_{-8X;_vLzBb%s0nNUh3TAAyo_K@Fkxf9Suz}CQl zD9JO&G?aV@taA%43^e3-5CvPg*yc8FF&MS4q;E-Cu%9Q|^d*C27Bbm4Du4#DHT?Z_ z_{ke z`ftGbyh_-aT6It+wQ0ZBb(;Y-ut6d&*)2ojYuu?v2GvdMQ28uz5$h$oz)%ylEMem$ zRfJ1+BBR&@hX0x2YIhG@5QOKv>L+4LK?GrTEE#z=6D}e#LPMdFFky;RxB1(7(*~NS zX{5FHks}c*;bmX~%>Z7(=VQ$8u^{qa#l-q*6sh^^vw+_qCqbGW;bF;;fwCCt-npFz zLAteGu#$;-x$<4H^p&R6-EiOgy?h2kxF?_Wp1a+u9qeB?mSIm46`XYUdAd$W5g)ou zbd7teMU`&T{8ZZpRn0U_+WYhk3P(ayRtN3+CT7@}f{8cG*kZ`3YihL@caMT(n@#&w zE-*hxSqR6$>bqRcCRE6&qPw;@u|#CPk3T~ z0QgU}uB-=C(6y!L#}ioH(0u}@+Z#WsQu4&}#!xYjKUNFKcQVJV!6qEacSbuS8zvy{ zsA-b$qDZh9((snT){*1>4u$9^+~)S1v%$D(V?T}Us&ZOD7kU2=#_yW?g> ztfUdaFJ#SBeQ#>a+vPPM*?wj35LF$Z$>B{RYcNu7$odi>a()Vysl=-N=s`XOaUab} zjkYzDPwysgzSZBjOBe7@WzJ~LGIHMB-QTvZxiwp3B{`;VNThz0Que;%H;Nwxn>|F` z{I(00Po6(E=qIhyg4QP@*M^r_Xrea^Zq63EwvUHr%mquHAL7?#Q%XZ#GNMY-*Hf3F}RZ2|PPYM0g2ZxbMEI?o8GdMStPvRt!OBy`V|{ z@}zHTY~9>{i$&XrZzSp){9B+>_JZl#%3-o2uF0^rHJoNMzo2S+chet;(vFiq_AjB< zh|VbBozt0(zuUK8H9+n;lUUE8D4Aj0HBLNd*GLdbz4XDk^kpB~C>{61Bc;7i-&`hM zm=gC%Ba29e8*ZLl9W;J&Bq^NP*qX#cf{PKS-B_Uis^p#cS&&7rsZKf<96 zwrX)xhD3Qwx|=|fIv7FEwR!Yf<*XfqnMnVQ`=LesNlK7#4Rvdo$R6j#SNe< zO>PYKGu0n5KNH>ieEuILfa#tY!NBi!01qM=O{6p27^u8;R{x{UZxf0I&@olal|Ebb zep=wycU!JNT{PGaZ3pfPXcG43Cidi2e3pKDGe)S1^JQOv|9TNP;6k%0{u^gx4+8*z`u}351Z{0hexvCBr$8eW zYuf`6xNjWtAN?d*IpIA*c_I152~n)Qp-FO zo6x^ww3f4sj2~Q$JI}Oom$#2WG0qzPYq`?4qJbLl!tc@##zh!Dh#V_&D+yj#1cpGWrX?!a|m^sOnNwQ>UlhQA$w0L4j|_61Lw{%#e)C@bMydW zi}>;x?}QN^ic_TGC-$Oj7>5y(v*U3U`+mhqPf=yS(F9e5{ARgYoYIC$)rJmLy%+E4 z=`&oT)y$(D)qIaGM5gg`_5iTp^?HCAm2zVVGS<;q@RT|bng;a{f(wz9oz zHwQjWhtU4S{LXe~QJ{jfs^vqyOw}3vksBVU7v{M+SvimYKm#pbVPucJFGt#&PYrGD zPum*rw=kzmB4b-F0lMARn_JkMH|;{x!<=`rV5u0pLm|YniMZ4eVwpnyD6tudk8qyX za$ruL`_`A;piR@VuIp^+j5t)_8jZ@&1;L4uy84MhmKR3FA5~fLGqt8E(xuT?ot?r?l!|5ikh*A%)TaT zoz^tonf&{<Ayc4bz87tQc!eTsDFzgkp0S@30?8XX&xh0u#g~PwvjO`W?v+PLEbD_pfQVOn`?_* zIm5fUymDL4rk}Ns6Bpj1xflu2J^S_!?SqDMvbaU1O-Z(#1e34al`}EPkPl?HoKYy0ItCoKCi#YD%N)QVGOM zZK<2*RPeL=UrSQ7RhGcwwR?&7IFJV4F`FZrPac-IH?OEJgI>*^;Y6!bjzACcKyiHI4U=xkc*WoXx`U1E zX&`se$0OCk`=18 zn)UBTa#Z390MTTR4WG8O`sVbx3O$^^_723zv|_&h$5PXK)fHra9P!tg;t)X%>%;K^ z#;rVBv8n}{_(HB0Si@S+-K#3Tsz%S)yg8c`iA&S)G@CKv5fOu2&53wESz(x~l*sO+ zS6BA&uc#rfm6Bm%HA#%34ClI16+<#3{2(yD7)qhLL|NQid7*0DC=;FZCdWu|;)PU~ z#;lgMj+V|=P|nmIH&AiBYdqcaHiEYQykZVZ0j(E;q&W^{SaYTO~Tqz2153RTrhEVNn3-*k2`A*nEk zZ2k@AsjzVIvUDhl;+(BqF?TjmZ3{Q1JZuxc; zP1?$##xm_#b4?o}wrw7Hp&^D0WnE)}!(>Gf2}pRog8f)RMegCWE5Wl1I1gV?juenA z{{-{UEoz&?Q0Im#5WqIv4}Vcnz}q=^XP!%l{SvJqL3CWsg6Gc}i{1)nEJwhXButQ+#7v&-sS*@W-yRgJWp z^VzWSGBknSEKg3VsflSBPpH684p06IL8`FTQzq^PH5yax#kl85gZhx}ubu{1`*tH+54*!_NFb;;jhCNzKijU9?eqY{By=~F zP3#~IN;%XgYJi)JZ*-Q7=ujS8hn>0f8N4qlmTfRD(Z!i9k_3$h2R@H{PWfy#|9Jyl z?+T6>H+1co2a_?{%}wF2f&b;I{wtjx!ddYj;Mfl_+}}GOR)U4i$_2!*_->g1hP{8_ zC;sh0bgXZAwnkw*FE#VLcu;Vyule(T7i{PnVOkyg=o=-O;y5LnOq>ga zS4dFoLntS_8E`+v77j`H1`r8nSjcU^jd2emKj7kiv$BSR`}L1R$mvUqWZHaU2_!1q zT_RY;E{qnS4O^2AfWl@L{0kcv3pC>%)#!P zgv*QmW7f&>-aZ{Sycb-NM?0d^47%8?e7zDx1S&o{qs&m)r}e zyHBGVYk};s1UtU=War)c@7(axYVF&0?cBxVlxWLOwRvOY8)lwwYApUp=GsA;B9@?* zm$Y7%i$awpFPYQ4ew|wesDSA2YW~mT`W5tj>H#7({IXFX&lf>>09%_sjV*$zUg(h2 zm22Lnr+LUaHK+%4)PgC5MQR15o(Gh6i=L&O4gs+73|JTTrA*Qu3kGk1<`z!=b0K@@ zs$baT3z>@roZ~zyE+6E8Wu~1pssu%`ow1(RDS-?9~O& z`KmCoo$d{Ox&TV9?-3dXD7j@`R*SA;p_1^fhH1cg)p++I(Sua;YWPDk1yHs1`obKw zM!}^`N2_%uU6N!H8F8X9rYDF54hcpNdK(kctDFuvq*8d^sEs??_*OCKZ*tGqr0k$f zFW7Ws;|{xY7c6G$+uF5D#-D=4H3fze6haiKk6|PCj1S4{s&a^@sXr_s45mGw7#J5@Dx;1I7|tMIU--7Nk$jpN=4f z>N14a1l`+|We;An`*K2g=%woCOO!y^JS4~QB=ofH_wRG4MeP<7q z&*P*HMCp*LOdCb9U3ct1Cm(3p3Zi{xoqV#%miMVZgsI(&!4u}>%da!vgK`IhMH<`; zIKt(~Wx2v-$izL7GNhxtalen)!o($3Nlv%sJw=haBvsPU$u5qKL{*Pf|M;DwNT7surX$4r1ERSdO4T>`FX0~?g*;%PodrOu#D=v|3Jt{eA$IBVE!bJGs zJ%Jjf*{zc!X+zf`mPkvQBpX5$5>wI0Yq}RU87so}!@ui<8zPQ^*IRa}dmu@=CmZ)( zthf)8Q|!FB!>E(H$}Af0!h+i>J9-`(PCEY}HR~trS$hz^@l<#5!_f zCsD%QI+|InvUf~4ao{|s+ul6)r4C3wQJ7EaZs2}pv1KH+w8UO6&i1%e=V+!Y$JwsN z$XjM=SH7kzU%GTJ8I;=xJwX50Ey0+T<>vc$OOU|&|2kMH8rnMi|0Ko!ZvzXv2|-la zC46tq7F1&Mh3S?cilXi60&r*(Kl!NXm}{c4gWg+q#-3G0{x+p zZX^Ur=~B8w8l*!&IP{^rk&qBXN|f$Kq(MrMkdPKoB&4K88j*Y(x&I4?Yux+ZJATWL z^XdMvW@gRIn%OgJDQ0z$rSg7Q(+zr{56<;D@Z9r>m2)Ib+Gf3jRQK6!hV_|>ycu|~ zbjl=mi)4Gmp>2T;IkR+~yvZK;Z-+#baO)wwFRk9z^>0Zv&#lK^z2koMb-c0T{k1Ng zYR~W9q(}pX(_JN~M+mWn=sqbvUK!!~)o1~0&eQ#0N0OyDy6nB$*Q!@CUG#W1bH=^- zqHm3kFAew8v7n`LlcANOHU~uOje<9;dfYrkIKR0Z2Cr)T?1%EEWzZ8jcxkD zH;(!UHKhmpOYTqaMGFr$~tc8^}z0t(%rp5k3k!?5b)5} z{O*D0B$jh^D|`YfZ4Ke*w*qn<4diYmpi&&V#!tZUjstXDG8JARFBDb+d95ojMe-z? zxhd6vJ4!1Xc343Gf84h!{v~{@=b#@Zcj!~X%j6K{pE&poz% zJJsycE0FnM(;DflY6rVAkt`8hd(N`A0r&{CS5OrLv4zEEKRV}Z^dRmVWs%2k58vo_ zzj5>Hc(jzHkZCMmI4CM+g(6jjB0UCe$y8J*1x{S#cHF$1L;y0aY==#cloO)_zIQWO>ESwM9S;u8a4L#6n*!?7(_TXHQwBM!;vLN zp%Km_K8$R>N0CAXOLm_D9qTb-#b*AfqU>N>REDI$Q!=(z)z$=vpa3})8((8CYjK!Z z)DZd(xCbpc#kO)86}3~%sB}J=U}k0S%i|aP?(DuKM^D)mCOAoHD-Q*Z@-SM<3UTCB zUShp$W!%_$p7hXou%rS}Mn{s*`E{kKx2lokCtsIB$MpLGRU*W468HKY^L zf|uJ@u<>SzX^dAtCMjFa)DnFirYj1uChDzgF3^IY0bs?$}Bq-;s8hEQF zt5oym&BDQk?DMi|JQb>Z0^pL!=N|N}WkYq70C$BA$`1;*3@0rU`_V|c@8Ii(=k}#0 zU+fg)E+e5UdAHFKJY8p*V8eT7WE>w~Hiz$V0Gkq4JFK}xT6_E6q!j^2?=uTkj`}%{ z(gqovGC%0o<48_3q6mN zQDv5n0%5i=Zk*rCJl_qFu?Cx&h+9GIez_xX7g$$x5S*?nrkTj^mMe5V(inZUl%omU zYhn&S9?uyV9v(KpWGmRv+7%&o{?@n_&n;je4i?YW(WHbSPr13kyCC4$wzSb_*YDGp zI=w={`gmlCbMkxtvWpF7;KiSAsV$0gvxC~FhHH_3Q&wU=!X^DAaG@Qrvw_(o&G zrvuinSmn2JMxq$Jjh@ZLsm0uUCU20wV{EyJHUse+p^7Su)Ru)ONmmhKV;`Q`z0OEW zy+!&8`yrhIMJ6T@E?zx?g~qFC%Ht{tE6FGz3rlU11T#)M)sWHEz9&jkC^Frxv-2jz zt>v(#PXYwQfn-zb!aXSb;R+54_9Y>08l7~D!VryW7_%*G}j zWvA>^m_;gBPrN^ciCKH9F}o7w)6bNN!LVCc_6avwOUtg{GO%+jFyLP238O2(i{j+U zC=gK4@THC*V4oM@j1In91KU*SK&Bck9cd?P7a>u%UQQqrox_eAQg~y1{XtkmH^p=_ zrL3J*Ir83B(=9Cn`!qx;EtZ{EbDN$UZro4H6-5cUqA0cdgIGHy6az)lU+YaNa}XIi zzFR~_y_YwJ$<$mBOu3AlqZXbe!cnky9ktnzGTSf(nIQ8?k=VCoI!wb9nhrCrToaWB zvmGbn`WJE8Y&3kkth0L_FTW}#3C#W9yPUPCxp+AZ!?m6jbMs8SmHpj?;Bof`9vuM{)%|Q!l+$X zId2w`&eSpZU0mHrtu~VjN5m}7?wS>sJ1QDYs5DYaM&3Pisg1c zNvOQ+-D$?#My1892#*cv5%6=>xLhP4Tx$1TGOufAP_mK|u*Bj#kM=D4s$5$?NV^zgPE2gaFJ+carmDg~ zqk~PKFU|oZ$ji1&?z`P<_j-f61vi0rgP47CzW#**#$vr)BXvIA7w2y@#@n z7g>gre14Bmk@sKvxE!s#mRTq(Yn--#k>gB++e?Yvr8+PujD2SUyv7%gU)Tv`byf zb?LSiFEVhDV(HWKfk>)uJ8O3|YPzmv_IgygEx&13+}n)Sfn;X9{A!nFy&SEZ;l;;r zccufc@WG+x2BW&?5Mu0dJ*{_wIxBZNl`E^~oDEko>5=}9R()wyz5a6Di!B`H>=2U{ z*$?4`_nb@K*qY`xDBUbR-eb)rvOzkwcARQ4aU6j(u~o0_&vCHiI(wo==(Z#jWI5(h z7}e(86Je==h&|4%^qUItsQaCShQda_yYyMB2^-U8kL)H#G|6K4&hGa#u_ZeE(b=L?fV5f zU|a#cn>8P3zrD|zXR9rfVlpdIki93vg(BS_G_UY{g8YkQeR-!wuE;B{iO0K^?oYWk zH?NVb?;kHbH5LSE)9G^kra8sbqKybxpkya zNIt>#saE?zW^mZb4O5Ktb^QF^$oadEI&P>s(9-vc3lER;j>FQEpsU$a>%QzOx2qB2 zUnk(|eGRtqkdP<2xrtCe_;ev{eeJ31g55H$>?!%~D7?NlgS zfl}a8Y^(O=isrW+MMlmVVEk=OAeDM$djw5HqnZ}cj#J_N=V3VBMG_v$1cr5m!d)*v zb94LFwthjfXsChtknJEm?kB`yMd>6Xj!-b?<%+_Tmkk!~@4?g3m20_Qok-U|tb!+o zP{5owLC==fB{qWTbQ1y5RU7$Wni%C65!y}q25wN10j_?d;-6prK6jJUY;CP9A-_B$ zKdk9vJHvJLxKX9CrOv`9k`X;d=OrUIt$oaj1EU@6*BsRkGBz{5#WG2Jihjxa6W>ND zuE6XYS!d}z4(PT#aQ6}Bs?=0kHgiR4>>|A~}@XAAzaQF=xW5g+{(&CN)uJm@+c&X_-^YVFNQ?ITICEMF0a6di?;t6eu zMEw{bDvglejI>gSvKF7llB$`06MsBc{VH}W@-9znpPED%k^;}I71N{d_fq>wmhCHw zuB;k}y;`7xb%Ljf=2OT!F$_01HUzqD!PFtlBpV$Jo~e_-#bR`A#)oDjQx^lR_e-Z;m# zP#Nk}WkI7#(x*a5;HyVxd__I=MYs#T~eH`o~-(ZI;0j=$~(D@2(Z05W( zNfu*JSbnKtX(1u!A3>{|!M385*PYXy!XT39Mkdx9mt;Z03|HbFvN=nvP^}zfp2ozH z^VMoUf683v;N#taNPb;rHG+^Cv?d!lSOi~w* z0^k1LqSQ_**s*#a6$vS1`z689q`$I24PsW?v$!P7091Gu9`%74&epNRg|{&t*hjtH zJ{@1iZpHh*)iS8D7L{~-PrNrFeuO&UEDs;pwW?s{X#26n5zFgY_sI#@y)~m-gYOdh z+oZm2)g6rSI=)KqJRWLms0WT}s%z_*apnmQR_2&B&J)Q{9~>ke)#b11TEC)O?Dpb# zzr0ds8e_tv;csV`W)iX5jwYjyLTLh4lD=Dozl2e7kl|g_&m|-KLj4KfL~9*$MEyOF ztQ4#y^w4p&>gLGY33jxxqbH)6g~!#Nqt^&z43FOEUPnqrP|wPBSA@w|)b;aT#OCGH zi+Fx@xu#!9iGBT}deZ|tQ1u`i$Ah;%ABVqs-FI2w2no&5<1>po9y9c$4qaEQHe#aa z^6^>T^HQVP9ThlST3@W**cw>LYZHfGF58|d+m5nfwNFOv zVSGa#B+!}+tw2&MV^*P8$F&~K5v=YMEu?iZ<-e}6Q@0j&1x|8+uO1159%k(OMCwU0 z`YX+;onf1SVKW{>oX0Kv#jT9m%=oEuIZs@sGbS4Y*mdT$#H^OXx_qwhqe%$_zXgq# zZTt1ufsEYyPy_k|64M9P@0H>ZstCS5oH1#wE@H^<2GQa(?2bNYyOVb-)(~_wW!*0f zQ%xIg7amCM40kn@h#(girU;MY0THAg&9D&GqI2+}QTzt|H<|6L3xm@#y_{JHgTxFp z3j*Tk-{iOO&{%8YnkoqL)4v)baCc3yK0M~!|F&U-cjHMND;X!C)nV1r%9>M3th!%? z&+E^~szntro_iy(JriGr?JclS_VF)AkZZX@>$!VlE#NAj%wXgK75l80U09~2U^ z8=WN9ET>k|p)5j=uW}_GL~r-VTtn_51J=!gGBqX3uJSqBnDis9j82oPJ24qrMFuuj z;^QUZwjT+-EK@hgYjZ!?RO9lp>XV@!@5bmXEKmjTlF^$x6%lj z-|vBYMJBQ2?aDob217V*$4B8q3ByH6yq{V3(L7p<0_G^HgpYeA zrHaD`85g-Y_@zA$UrNGta1(=qo})mem?~q!M>%xcq&#c%=Us1`ry`APOxueEi*>tP zR^7@E-5cQ^Rw!!E9-qAb8-Nq!ZZ8QC;l{2+k9@Y4-TSZL{pVI<~Xb`1f7z2f7RdU% zL9#ZFIQ9{8(Cz;o zF=@t@?Q0rRA{xSIeQE@dnV+V2^6Wdr3mXC05oGgxg{${piv6#@Od|Z=STZQ?16C1roX@;6^ z-pm^&8bi4!Q5qY@axP9d94D+i-^uarI1yQ6P*&MyYzd!0Hh0nMRVb&evkb4a-gFV0ST|4>=m4i;i3fKY z$6f!%Ja_O!{TRDGbk2sAvqvb#S%ck$68n&m&N448KqkJyExY{&U3C$n$io`bFEyCO zW*q79twj_A*cLBjlUFu(W2)UpVoKpTTzX2C(zL)MG?xf=jUI$Yuvs` zkLI@_-}7$aNp{#iMNw>0E6E4)unlLP6T?q2q`6ZaI|XYS4gFfS z!i)?%7*U1?Ue>=s8Eg|G&7-dLuEtAhw*u6U>oj@rIc3ENMe&Qfu+m!$?v|%a7HR#0 z60&Z0B^K3R!0? zb@nB7F2BVM@P{l+kz3(2ZSqzS12M;2H|f=z;oT-kn^1Q&q&2TGHo%fI;xyhNx*Sn05g3T;xG5p=rf*NZrhN{#;HSz07B>@Nt5E+WJ)!d}Rlu+?_ zxl#Q}ufB%R-nmc5{Vd-HBR3()s~-kOW`bS5&^_R_?-XJqxzF>(;6-lnXDJzthUdJx z_aFA&-t~g}KAIt|Vf5BL<@vH&!$~58Ou7h5@~bjb36FjD2@zp3sjAACC?FZdXu`@F zc&Bikw^jKN*HSuXFiCfZ_d8oAcKYza_+4cV>l+Ogf?HjTLV(~#ee4`q6l z+d6zwN82eb4;vF?MVk=SPM}{@oL0!B`Lk*{i9p6C z$FfOj9>J)!boUK(+@$*o9!9a$2#`d6FZ40Cnr4n8sQdLWr&xRWH~2W|MJZK~seWSj z=nDZs^$MZ5N)!ZpLFWY*l2F>=J4vMZ`-XZZd3h_Xu1L4hEn1dPES7h0%V???uDodP zwy%%NtPs|lN2x9-S~WFR(g{T$Bg1sI5dJi68< zFN1}07t+jcd*KaTH%GW8jw2-fnxf>88|iIuiH;}Jw|q~`bYamF6dP0@r5&?}Dd{2$79C_&zdIy3P%Rb)|`G zbm_!}Z0=K?W$ml|MPiIJrnc#l7$50q%y-8}Gb0oal~sLlOJt9(#cCYCtIk#2)y`un z7pH_T$9!FSpq;F+JdT1_{9bH|m0nktcwLmEF5SbTo8oyKLDr;!4Gpe&5iXDI+?_?P zG@j}3mQNbD$D2GM`h{(|lr@>_R3|4ovTt-V=IicZ1YoWV<(4!$!eycA;dzrOIU>FA zjSp~CZM;(BiBHXfsqYz*xKI?u?}m=0X(Q(}=%O2yM>6erqmQipu|i70Je{fWrW$dk z77`7gGqNm9YN*@p1g^DdXs-nDZ@Iz7l$`LP!nfxN1FcIq3~~mRmT2YKl=Fye;zD{b^nf$1J}_8b@~ z6jMYi&!!z@I`!i_2_u+bB1@JKr&Y71y&nj2_rZIVq!=(gf}^IH+-eW7>F_gKAOXjw zydhtw2km~7dqm}DqnU;iD?#mGb|?R3j|j56Qu|))ow%z~{3>6Diy}NN`dC+DR}a7K zXl)5eE`02?I>L$f>3Hv!sp0OUD+* zvwskt!fobx`>T!y<24T@{!X>d zks+M7$tsKSSoq+Q9K|e{Z#I`w&1vInS(Ve89_GQ4#hXkzo5>x*mKK9Y;9_%w1hnqa z&3f`TCvyWOR0}+0EKY zT@3*Q$GAwMy$?bcXo>(Tu>sAn=Qmt%K!qM3ML5s6!PPf<#z+X zLI5DM@sDF(EOs_#KcH1JYjWytAmF_9uSs}NBq}B-60Iir z)GPo5vTy{#9RStc0faj^ubFcd*t*%LA;7PU0fZPzh2*oRT};8wPUbSkCN@qGQ-~4x zG|9}56%+vdnM$YS+VstkrvZSc0$ncEKp>_9*vJxigT~@${>wI-y;LrEsB%>T5a1-o zS;0D?3U+2ZmmmM14yUp2S4F@4_4q9wHaoX7$lISlP7A{MEgw!32-$TiIDhMK+CcO{ zXF8lgOr1@v{@B_fBRL@$U>FdYDGYF6@uE4uiMR+e1L9OL8v>PN=3wh=W6WY<_cP-@ zZ$cOv>alOYRf2X*5Qr3tOSJ*>qoU4~bh33eGG_*Qjgy0|mE$keJ@0)k9fw{1Y#`97 z5JF)gAlM7oAL`n=0PE_X_rh~U31l_&WMx3096<1)h@9*fi6%BC))3&N&d+&g8Yb(} z3If*k_vgGDo;Gp22NdrwQ^{BVc^}B4QPi~tTG#+UlSAo+2sUO0Oz*E`OTW(i_ZKQI0{9By2S)fmX2WA_|!%BMmDrS^8_C9>m>LsiV?CSYR|2WBATr~5Ar z;hfK5OktM`#0xzY=$-&BzQlKeI9Zu6pZ%6U>K(e(p%o8|rKds-rMFhwC9ai;i-{F8 z~{ncC->OJJzM=wDbd zscKm~W-x#~6)5!M6y$<0#nJ{f}Dvq1-6e5dwj10D(rY*&{+X-&vnF zvb8>q&17QyNA$>HMV=uLcOD>_$hM|9D$Yqj7{s{6QkcYzM_ETuNM7`L4 zH~*+^QbO^{Q)v(=5fEs5%fv*2t_f#HU@$fXL#+NqEo^AVRJicLfNX^>yCuO|7qLH- z{SR&l-Ft@ABw!KH0SL6ut?&f-g1Wz*GtRAda9%x@$OHz&2!XlOSZswCan6uG`%dS5 zm{96SK@SlGIu!ya6Ntq|fmYJV)YifJ7maid)Sogh9tAFuoeH$qBzW~A@b7N$3*vdf zw;8MtS!`fHuN`1OxKJvB87>lye)wQNcNWj}lhKD|^#R`5o(i{88ebEQmr7SCXT0Gg46GrzxVFab1pJXY|ec6|L)yQ zU*`Nr?=B;3z(^3N1WiDoy}PuMOBzBAsHZ*YkImlFe81NW@a$^;;oWi6U55WR?~ZTf zjSdUo*_{fsXRy+HiG0a3__;#0|C4ujeY;&(4Ctq)0`1+IZ(QR3-*|W5`H%AL zfMwLFK-)0P-X;A12k-6`BHD%C2H5b$x!}*<9n}=$K?Y!UrvlxE9}F&mFSX&n^X^_4 zSs>mif&pQaT=wn;EHCl@)uc!@*!0k!7X-S)cX?7YC&u`7Mf};jdqT3@k0=TPy#@r@ zyW>~;4fxOA-H>l~DL>HnP6c|ljedFw{9nAgp{pm)owPup?|?w-OPYTPd(k5PU%b0% z7)1nL6>8m*Xc3H@Ka zJ1+1C(K%pg#HiSowmqLtWP2!P@CB0_6wP~M7`L4fA;Q1Xclk{R6!s& zK%nidnhXoN{r>FT0iy!&Io-jUWQxu#1Wfo;pzY1f;Ud=NECxNZDX=}nYzV}k_|sze zaV)+*It&POD$rYF#z7asj^?&bzlAOQcCW807z^a+V01Rc5By}CZu!#VSN?X9PB(&9 z|9bp%lj@A|0g7?%W?c_<5GVt7q7Q*xwEt~R0Yy9A>U(&m!ViWDu=(Tc0IXnsz6W~F z!y%-UZvi%!E$Pok&@&!Y*ae;{#M&8fhiuPIrTk-0^_&Nt{`+kA@QlY&bAk7(WZ=Ic zLnnT|NDi;NK>lYM=-)7*^Nn6)S~gu^D*P||=xwDo@EsoZU&pb4 e$4`%Aof$R)u$TaWw17X&z@_2dYrwJ{^nU>5%$3Xl literal 0 HcmV?d00001 diff --git a/src/profiling/script/test-widgets/UnitTestAuto.wgt b/src/profiling/script/test-widgets/UnitTestAuto.wgt new file mode 100644 index 0000000000000000000000000000000000000000..57fb2e4cd86d443e291837cd6bb1b8d4026088c7 GIT binary patch literal 235920 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 WD4_5Mft~|@G=OsFA<%ON1p0qr8rc&7 literal 0 HcmV?d00001 diff --git a/src/profiling/script/test-widgets/minimal.wgt b/src/profiling/script/test-widgets/minimal.wgt new file mode 100644 index 0000000000000000000000000000000000000000..2406783dce1bc892a32a0604d14cdb14f168b780 GIT binary patch literal 5563 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 Fe*loC61xBZ literal 0 HcmV?d00001 diff --git a/src/profiling/script/utils/analyse.pl b/src/profiling/script/utils/analyse.pl new file mode 100755 index 0000000..25c1527 --- /dev/null +++ b/src/profiling/script/utils/analyse.pl @@ -0,0 +1,135 @@ +#!/usr/bin/env perl +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +use strict; +use warnings; +use diagnostics; + +my ($regular_out_file, $range_out_file) = @ARGV; + +print "Script requires two arguments, +which are file names to store the output\n +Regular points will be stored in first file, +ranges in second one.\n" and exit unless (defined $regular_out_file and defined $range_out_file); + + +print "Starting analysis\n"; +my @lines = ; + +my @packets; +foreach my $line (@lines) +{ + chomp($line); + my @splitted = split(/#/, $line); + my $prefix = $splitted[0]; + my $name = $splitted[1]; + my $time = $splitted[2]; + my $description = $splitted[3]; + my %packet; + $packet{time} = $time; + $packet{prefix} = $prefix; + $packet{name} = $name; + $packet{description} = $description; + push @packets, \%packet; +} + +@packets = sort { $$a{time} <=> $$b{time} } @packets; + +my $starttime; +my %tmps; +my @ranges; + +foreach my $packet (@packets) +{ + my $name = $$packet{name}; + my $prefix = $$packet{prefix}; + + if (not defined $starttime) + { + if (defined $name and $name eq "Profiling_Started") + { + $starttime = $$packet{time}; + } + else + { + print "***** No Profiling Start Point Found *****\n"; + exit(); + } + } + $$packet{time} = $$packet{time} - $starttime; + + if ($prefix eq "start") + { + if (exists($tmps{$name})) + { + print "***** Doubled start point found $name *****\n"; + print "[$name]\n"; + exit(); + } + $tmps{$name} = \%$packet; + } + elsif ($prefix eq "stop") + { + if (not exists($tmps{$name})) + { + print "***** No start point found *****\n"; + exit(); + } + my %tmp = %{$tmps{$name}}; + my %newpacket = %$packet; + $newpacket{time} = $newpacket{time} - $tmp{time}; + delete ($tmps{$name}); + my $found; + foreach my $p (@ranges) + { + if ($$p{name} eq $newpacket{name}) + { + $$p{time} += $newpacket{time}; + $found = 1; + } + } + if (not defined($found)) + { + push(@ranges, \%newpacket); + } + } +} + +open REGULAR_OUT_FILE, ">", $regular_out_file or die $!; + +print REGULAR_OUT_FILE "name,prefix,timestamp[µs],timespan[µs]\n"; +my $lastTime; +foreach my $point (@packets) +{ + if (not defined $lastTime) + { + $lastTime = $$point{time}; + } + my $toPrint = sprintf("%s-%s,%lu,%lu\n", $$point{name}, $$point{prefix}, $$point{time}, $$point{time} - $lastTime); + print REGULAR_OUT_FILE $toPrint; + $lastTime = $$point{time}; +} +close REGULAR_OUT_FILE; + +open RANGE_OUT_FILE, ">", $range_out_file or die $!; +print RANGE_OUT_FILE "range name,timespan[µs]\n"; +foreach my $range (@ranges) +{ + my $res = sprintf("%s,%lu\n", $$range{name}, $$range{time}); + print RANGE_OUT_FILE $res; +} +close RANGE_OUT_FILE; + diff --git a/src/profiling/script/utils/csv-stats.pl b/src/profiling/script/utils/csv-stats.pl new file mode 100755 index 0000000..69a9165 --- /dev/null +++ b/src/profiling/script/utils/csv-stats.pl @@ -0,0 +1,420 @@ +#!/usr/bin/perl -w +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +use warnings; +use diagnostics; +use strict; +use Getopt::Std; + +my %options = (); +my $delimiter = ','; +getopts("crs:d:h", \%options); + +if (defined $options{h}) +{ + print "HELP\n"; + exit; +} + +if (defined $options{d}) +{ + $delimiter = $options{d}; +} + +my $skip_row = defined $options{r}; +my $skip_col = defined $options{c}; +my @stats_names; + +if (defined $options{s}) +{ + @stats_names = split /,/, $options{s}; +} +else +{ + @stats_names = split /,/, "min,max,avg";#,std"; +} + +foreach(@stats_names) +{ + if (not ($_ eq "min" or $_ eq "max" or $_ eq "avg" or $_ eq "std")) + { + print "bad stat name: ", $_, "\n"; + print "Supported stats: min,max,avg,std\n"; + exit; + } +} + +my @FILES = @ARGV; +my $first_file; + +sub ParseCSV { + my($filename, $delimiter) = @_; + + + open FILE, "<", $filename or die $!; + my @file_rows = ; + my @desc_fields; + + if ($skip_col) + { + my $description_row = shift @file_rows; + chomp $description_row; #remove last \n + @desc_fields = split $delimiter, $description_row; + } + + my @description_col; + my $rows = []; + foreach (@file_rows) + { + chomp $_; #remove last \n + my @fields = split $delimiter, $_; + if ($skip_row) + { + push @description_col, shift @fields; + } + push @$rows, \@fields; + } + my $table = Table->new($rows); + my $csv = CSV->new($table); + if ($skip_col) + { + $csv->addColsDescription(\@desc_fields); + } + if ($skip_row) + { + $csv->addRowsDescription(\@description_col); + } + $csv; +} + +my $stats = {}; +foreach my $stat_name (@stats_names) +{ + my $stat_creator = createStatForName($stat_name); + $stats->{$stat_name} = $stat_creator; +} + +foreach (@FILES) +{ +# print "parsing ", $_, "\n"; + my $csv = ParseCSV($_, $delimiter); + while (my ($key, $value) = each (%$stats)) + { +# print "adding ", $key, " stats\n"; + $value->addResults($csv); + } +} + +while (my ($key, $value) = each (%$stats)) +{ +# print "printing ", $key, " stats\n"; + $value->finish(); + $value->writeToFile(*STDOUT); +} + +sub createStatForName { + my ($name) = @_; + if ($name eq "min") { + MinStat->new(); + } elsif ($name eq "max") { + MaxStat->new(); + } elsif ($name eq "avg") { + AvgStat->new(); + } +} + + +package MinStat; +sub new { + my $class = shift; + my $self = {}; + return bless $self, $class; +} + +sub addResults { + my ($self, $csv) = @_; + if (defined $self->{m_base_csv}) { + my $rowNr = 0; + foreach my $row (@{$csv->getTable()->getData()}) + { + my $colNr = 0; + foreach (@$row) + { + my $oldvalue = $self->{m_table}->getData()->[$rowNr][$colNr]; + my $newvalue = $_; + if ($newvalue < $oldvalue) { + $self->{m_table}->getData()->[$rowNr][$colNr] = $newvalue; + } + $colNr ++; + } + $rowNr ++; + } + } else { + my $newcsv = CSV->new(Table->new([])); + $newcsv->addColsDescription($csv->getColsDescription()); + $newcsv->addRowsDescription($csv->getRowsDescription()); + $self->{m_base_csv} = $newcsv; + my $table = []; + foreach(@{$csv->getTable()->getData()}) + { + my $new_row = []; + @$new_row = @$_; #array copy + push @$table, $new_row; + } + $self->{m_table} = Table->new($table); + } +} + +sub writeToFile { + my ($self, $file) = @_; + $self->{m_base_csv}->setTable($self->{m_table}); + $self->{m_base_csv}->writeToFile($file); +} + +sub finish { + my ($self) = @_; + $self->{m_base_csv}->setTable($self->{m_table}); +} + +package MaxStat; +sub new { + my $class = shift; + my $self = {}; + return bless $self, $class; +} + +sub addResults { + my ($self, $csv) = @_; + if (defined $self->{m_base_csv}) { + my $rowNr = 0; + foreach my $row (@{$csv->getTable()->getData()}) + { + my $colNr = 0; + foreach (@$row) + { + my $oldvalue = $self->{m_table}->getData()->[$rowNr][$colNr]; + my $newvalue = $_; + if ($newvalue > $oldvalue) { + $self->{m_table}->getData()->[$rowNr][$colNr] = $newvalue; + } + $colNr ++; + } + $rowNr ++; + } + } else { + my $newcsv = CSV->new(Table->new([])); + $newcsv->addColsDescription($csv->getColsDescription()); + $newcsv->addRowsDescription($csv->getRowsDescription()); + $self->{m_base_csv} = $newcsv; + my $table = []; + foreach(@{$csv->getTable()->getData()}) + { + my $new_row = []; + @$new_row = @$_; #array copy + push @$table, $new_row; + } + $self->{m_table} = Table->new($table); + } +} + +sub finish { + my ($self) = @_; + $self->{m_base_csv}->setTable($self->{m_table}); +} + +sub writeToFile { + my ($self, $file) = @_; + $self->{m_base_csv}->writeToFile($file); +} + +package AvgStat; +sub new { + my $class = shift; + my $self = {}; + return bless $self, $class; +} + +use Scalar::Util 'looks_like_number'; +sub addResults { + my ($self, $csv) = @_; + if (defined $self->{m_base_csv}) { + my $rowNr = 0; + foreach my $row (@{$csv->getTable()->getData()}) + { + my $colNr = 0; + foreach my $coldata (@$row) + { +# if (not $coldata gt 0) { +# die ("LINE: " . $rowNr . " COL: " . $colNr . " DATA: " . $coldata); +# } + $self->{m_table_with_mean}->getData()->[$rowNr][$colNr] += $coldata; + $self->{m_table_with_count}->getData()->[$rowNr][$colNr] ++; + $colNr ++; + } + $rowNr ++; + } + } else { + my $newcsv = CSV->new(Table->new([])); + $newcsv->addColsDescription($csv->getColsDescription()); + $newcsv->addRowsDescription($csv->getRowsDescription()); + $self->{m_base_csv} = $newcsv; + my $table = []; + my $table_2 = []; + foreach(@{$csv->getTable()->getData()}) + { + my $new_row = []; + @$new_row = @$_; #array copy + push @$table, $new_row; + my $new_row_2 = []; + my $len = @$_; + @$new_row_2 = ((1) x $len); + push @$table_2, $new_row_2; + } + $self->{m_table_with_mean} = Table->new($table); + $self->{m_table_with_count} = Table->new($table_2); + foreach my $row (@{$self->{m_table_with_count}->getData()}) + { + foreach my $field (@$row) + { + $field = 1; + } + } + } +} + +sub finish { + my ($self) = @_; + my $rowNr = 0; + foreach my $row (@{$self->{m_table_with_count}->getData()}) + { + my $colNr = 0; + foreach (@$row) + { + my $tmp = $self->{m_table_with_mean}->getData()->[$rowNr][$colNr]; +# print "DIV: ", $tmp, " : ", $_, "\n"; + $tmp = $tmp / $_; + $tmp = sprintf ("%.0f", $tmp); + $self->{m_table_with_mean}->getData()->[$rowNr][$colNr] = $tmp; + $colNr ++; + } + $rowNr ++; + } + $self->{m_base_csv}->setTable($self->{m_table_with_mean}); +} + +sub writeToFile { + my ($self, $file) = @_; + $self->{m_base_csv}->writeToFile($file); +} + + +package Table; +sub new { + my $class = shift; + my $self = { + m_data => shift, + }; + return bless $self, $class; +} + +sub setField { + my ($self, $row, $col, $value) = @_; + $self->{m_data}[$row][$col] = $value; +} + +sub getField { + my ($self, $row, $col) = @_; + $self->{m_data}[$row][$col]; +} + +sub addField { + my ($self, $row, $col, $value) = @_; + $self->{m_data}[$row][$col] += $value; +} + +sub incField { + my ($self, $row, $col) = @_; + $self->{m_data}[$row][$col] ++; +} + +sub getData { + my ($self) = @_; + $self->{m_data}; +} + +package CSV; +sub new { + my $class = shift; + my $self = { m_data => shift, }; + return bless $self, $class; +} + +sub addColsDescription { + my ($self, $desc) = @_; + $self->{m_cols_desc} = $desc; +} + +sub addRowsDescription { + my ($self, $desc) = @_; + $self->{m_rows_desc} = $desc; +} + +sub getColsDescription { + my ($self) = @_; + $self->{m_cols_desc}; +} + +sub getRowsDescription { + my ($self) = @_; + $self->{m_rows_desc}; +} + +sub getNrRows { + my ($self) = @_; + my $ret = @{$self->{m_data}->getData()}; +} + +sub getNrCols { + my ($self) = @_; + my $ret = @{@{$self->{m_data}->getData()}[0]}; +} + +sub getTable { + my ($self) = @_; + $self->{m_data}; +} + +sub setTable { + my ($self, $table) = @_; + $self->{m_data} = $table; +} + +sub writeToFile { + my ($self, $file) = @_; + if (defined $self->{m_cols_desc}) { + print $file join(',', @{$self->{m_cols_desc}}), "\n"; + } + my $rowNr = 0; + foreach(@{$self->{m_data}->getData()}) + { + my @row = @$_; + if (defined $self->{m_rows_desc}) { + print $file $self->{m_rows_desc}->[$rowNr], ','; + } + print $file join(',', @row), "\n"; + $rowNr ++; + } +} diff --git a/src/profiling/script/utils/generate-plot.sh b/src/profiling/script/utils/generate-plot.sh new file mode 100755 index 0000000..7e3b66f --- /dev/null +++ b/src/profiling/script/utils/generate-plot.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +WARM_FILE=$1 +COLD_FILE=$2 +PRELOAD_FILE=$3 +OUTPUT_FILE=$4 +PLOT_TITLE=$5 +FONT_SIZE=$6 +WIDTH=$7 +HEIGHT=$8 +MAXTICS=$9 +DIFFFILE=${10} + +gnuplot \ + -e "warm_file='$WARM_FILE'" \ + -e "cold_file='$COLD_FILE'" \ + -e "preload_file=\"$PRELOAD_FILE\"" \ + -e "output_file='$OUTPUT_FILE'" \ + -e "plot_title='$PLOT_TITLE'" \ + -e "font_size='$FONT_SIZE'" \ + -e "width='$WIDTH'" \ + -e "height='$HEIGHT'" \ + -e "maxtics='$MAXTICS'" \ + -e "difffile='$DIFFFILE'" \ + ./utils/plot-generator.gplot diff --git a/src/profiling/script/utils/plot-generator.gplot b/src/profiling/script/utils/plot-generator.gplot new file mode 100644 index 0000000..21b613b --- /dev/null +++ b/src/profiling/script/utils/plot-generator.gplot @@ -0,0 +1,33 @@ +#cold_file="OUTPUT/1002_WAC_Test/cold/outpucik-points" +#warm_file="OUTPUT/1002_WAC_Test/warm/outpucik-points" +#preload_file="OUTPUT/1002_WAC_Test/preload/outpucik-points" +#output_file="Some.svg" +#plot_title="some title" +#width +#height +#font_size +#tics +#difffile +set terminal svg size width height dynamic fsize font_size +set object 1 rect from screen 0, 0, 0 to screen 1, 1, 0 behind +set object 1 rect fc rgb "white" fillstyle solid 1.0 +set output output_file +set size 1.0,1.0 +set title plot_title +set style fill solid +set grid +set datafile separator "," +set style line 1 +set key top left +set ytics 0,100000,maxtics +set y2tics 0,100000,maxtics +set ylabel "time [us]" +set y2label "time [us]" +set format y "%2.1e" +set format y2 "%2.1e" +set xlabel "Execution points of WRT during launching" +set xtics border in nomirror rotate by -45 offset character 0, 0, 0 +plot warm_file u 2:xtic(1) with lines title " Warm", \ + cold_file u 2 with lines title " Cold", \ + preload_file u 2 with lines title " Preload", \ + difffile u ($3-$6) with fsteps title " Diff" diff --git a/src/profiling/script/utils/wrt-preloader b/src/profiling/script/utils/wrt-preloader new file mode 100755 index 0000000000000000000000000000000000000000..5d2e8fc719b80ab694ae436d4062f4ed5f55cca4 GIT binary patch literal 30429 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 +#include + +#include +#include +#include +#include +#include + +IMPLEMENT_SINGLETON(ApplicationLauncher) + +namespace { +const char * const APP_CONTROL_EXTRA_DATA_KEY_PATH = "path"; +const char * const APP_CONTROL_EXTRA_DATA_KEY_COOKIE = "cookie"; +const char * const APP_CONTROL_EXTRA_DATA_KEY_MODE = "mode"; +const char * const APP_CONTROL_EXTRA_DATA_VALUE_SLIENT = "silent"; + +const char * const SCHEME_TYPE_RTSP = "rtsp"; +const char * const SCHEME_TYPE_HTML5_VIDEO = "html5video"; +} + +ApplicationLauncher::ApplicationLauncher() : + m_windowHandle(0) +{ +} + +ApplicationLauncher::~ApplicationLauncher() +{} + +void ApplicationLauncher::OnEventReceived( + const ApplicationLauncherEvents::LaunchApplicationByAppService &event) +{ + int result; + app_control_h app_control = event.GetArg0(); + app_control_reply_cb responseCallback = event.GetArg1(); + void *userData = event.GetArg2(); + + if (m_windowHandle) { + app_control_set_window(app_control, m_windowHandle); + } + + result = app_control_send_launch_request(app_control, responseCallback, userData); + if (result != APP_CONTROL_ERROR_NONE) { + app_control_destroy(app_control); + WrtLogE("Failed to run app_control : %d", result); + return; + } + app_control_destroy(app_control); + WrtLogD("Success to run app_control"); +} + +void ApplicationLauncher::OnEventReceived( + const ApplicationLauncherEvents::LaunchApplicationByPkgname &event) +{ + using namespace ApplicationLauncherPkgname; + std::string pkgName(event.GetArg0()); + + if (PKG_NAME_DOWNLOAD_PROVIDER == pkgName) { + std::string url(event.GetArg1()); + // This value needs for checking video, music contents later. + //std::string mime_type(event.GetArg2()); + std::string cookie(event.GetArg3()); + + if ("null" == url) { + WrtLogE("url is empty"); + return; + } + + app_control_h app_control = NULL; + int ret = APP_CONTROL_ERROR_NONE; + + // create app_control + ret = app_control_create(&app_control); + if (APP_CONTROL_ERROR_NONE != ret && NULL == app_control) { + WrtLogE("Fail to create app_control"); + return; + } + + // set app_control operation + ret = app_control_set_operation(app_control, APP_CONTROL_OPERATION_DOWNLOAD); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set operation [%d]", ret); + app_control_destroy(app_control); + return; + } + + // set app_control uri + ret = app_control_set_uri(app_control, url.c_str()); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set uri [%d]", ret); + app_control_destroy(app_control); + return; + } + + // set cookie + if (cookie != "null") { + ret = app_control_add_extra_data(app_control, + APP_CONTROL_EXTRA_DATA_KEY_COOKIE, + cookie.c_str()); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogD("Fail to add cookie [%d]", ret); + app_control_destroy(app_control); + return; + } + } + + ret = app_control_add_extra_data(app_control, + APP_CONTROL_EXTRA_DATA_KEY_MODE, + APP_CONTROL_EXTRA_DATA_VALUE_SLIENT); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set app_control extra data [%d]", ret); + app_control_destroy(app_control); + return; + } + + if (m_windowHandle) { + app_control_set_window(app_control, m_windowHandle); + } + + //launch app_control + ret = app_control_send_launch_request(app_control, NULL, NULL); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to launch app_control [%d]", ret); + app_control_destroy(app_control); + return; + } + app_control_destroy(app_control); + notification_status_message_post(WRT_POP_STARTING_DOWNLOADING); + return; + } else if (PKG_NAME_VIDEO_PLAYER == pkgName) { + bool isRunning = false; + if (APP_MANAGER_ERROR_NONE != + app_manager_is_running(PKG_NAME_VT_MAIN.c_str(), &isRunning)) + { + WrtLogE("Fail to get app running information"); + return; + } + if (true == isRunning) { + WrtLogE("video-call is running"); + return; + } + + std::string scheme(event.GetArg1()); + std::string uri(event.GetArg2()); + std::string cookie(event.GetArg3()); + const char* url; + + if ("null" == scheme) { + WrtLogE("scheme is empty"); + return; + } + if ("null" == uri) { + WrtLogE("uri is empty"); + return; + } + + if (SCHEME_TYPE_RTSP == scheme || + SCHEME_TYPE_HTML5_VIDEO == scheme) + { + url = uri.c_str(); + } else { + WrtLogE("scheme is invalid!!"); + return; + } + + app_control_h app_control = NULL; + int ret = APP_CONTROL_ERROR_NONE; + + // create app_control + ret = app_control_create(&app_control); + if (APP_CONTROL_ERROR_NONE != ret && NULL == app_control) { + WrtLogE("Fail to create app_control"); + return; + } + + // set url + if (!url || strlen(url) == 0) { + WrtLogE("Fail to get url"); + app_control_destroy(app_control); + return; + } + ret = app_control_add_extra_data(app_control, + APP_CONTROL_EXTRA_DATA_KEY_PATH, + url); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set url [%d]", ret); + app_control_destroy(app_control); + return; + } + + // set cookie + if (SCHEME_TYPE_HTML5_VIDEO == scheme) { + if ("null" != cookie) { + ret = app_control_add_extra_data(app_control, + APP_CONTROL_EXTRA_DATA_KEY_COOKIE, + cookie.c_str()); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to add cookie [%d]", ret); + app_control_destroy(app_control); + return; + } + } + } + + // set package + ret = app_control_set_app_id(app_control, PKG_NAME_VIDEO_PLAYER.c_str()); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set package app_control [%d]", ret); + app_control_destroy(app_control); + return; + } + + // set window handle when available + if (m_windowHandle) { + app_control_set_window(app_control, m_windowHandle); + } + + //launch app_control + ret = app_control_send_launch_request(app_control, NULL, NULL); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to launch app_control [%d]", ret); + app_control_destroy(app_control); + return; + } + app_control_destroy(app_control); + return; + } else { + WrtLogE("Not implemented application : %s", pkgName.c_str()); + } + + WrtLogD("Success to launch application : %s", pkgName.c_str()); + return; +} + +void ApplicationLauncher::setWidgetTizenId(const std::string& tizenId) +{ + m_tizenId = tizenId; +} + +void ApplicationLauncher::setWindowHandle(unsigned windowHandle) +{ + m_windowHandle = windowHandle; +} diff --git a/src/view/common/application_launcher.h b/src/view/common/application_launcher.h new file mode 100644 index 0000000..440892e --- /dev/null +++ b/src/view/common/application_launcher.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file application_launcher.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief Header file for application launcher + */ + +#ifndef APPLICATION_LAUNCHER_H +#define APPLICATION_LAUNCHER_H + +#include +#include +#include +#include + +#include + +namespace ApplicationLauncherEvents { +DECLARE_GENERIC_EVENT_3(LaunchApplicationByAppService, + app_control_h, + app_control_reply_cb, + void*) +DECLARE_GENERIC_EVENT_4(LaunchApplicationByPkgname, + std::string, + std::string, + std::string, + std::string) +} //namespace ApplicationLauncherEvents + +namespace ApplicationLauncherPkgname { +const std::string PKG_NAME_PREFIX = "com.samsung."; +const std::string PKG_NAME_DOWNLOAD_PROVIDER = PKG_NAME_PREFIX + + "download-provider"; +const std::string PKG_NAME_VIDEO_PLAYER = PKG_NAME_PREFIX + "video-player"; +const std::string PKG_NAME_VT_MAIN = PKG_NAME_PREFIX + "vtmain"; +} // namespace ApplicationLauncherPkgname + +class ApplicationLauncher : + public DPL::Event::Controller::Type> +{ + public: + ApplicationLauncher(); + virtual ~ApplicationLauncher(); + void setWidgetTizenId(const std::string& tizenId); + void setWindowHandle(unsigned windowHandle); + + protected: + virtual void OnEventReceived( + const ApplicationLauncherEvents:: + LaunchApplicationByPkgname &event); + virtual void OnEventReceived( + const ApplicationLauncherEvents:: + LaunchApplicationByAppService &event); + + private: + std::string m_tizenId; + unsigned m_windowHandle; +}; + +typedef DPL::Singleton ApplicationLauncherSingleton; + +#endif //APPLICATION_LAUNCHER_H diff --git a/src/view/common/evas_object.cpp b/src/view/common/evas_object.cpp new file mode 100644 index 0000000..edc33d4 --- /dev/null +++ b/src/view/common/evas_object.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file evas_object.cpp + * @author Lukasz Wrzosek (l.wrzosel@samsung.com) + * @version 1.0 + * @brief This file is the implementation for Evas_Object wrapper from + * Efl. + */ + +#include "evas_object.h" +#include + +Evas_Object* EvasObject::IConnection::GetEvasObject() +{ + return m_object->GetObject(); +} + +void EvasObject::IConnection::Disconnect() +{ + m_object->DisconnectCallback(this); +} + +EvasObject::IConnection::IConnection(EvasObject::EvasObjectShared* object) : + m_object(object) +{} + +void EvasObject::IConnection::SmartCallbackWrapper(void* data, + Evas_Object* /*object*/, + void* event_info) +{ + Assert(data); + IConnection* Calle = static_cast(data); + Calle->Call(event_info); +} + +void EvasObject::IConnection::EvasCallbackWrapper(void* data, + Evas* /*evas*/, + Evas_Object* /*object*/, + void* event_info) +{ + Assert(data); + IConnection* Calle = static_cast(data); + Calle->Call(event_info); +} + +Evas_Object* EvasObject::EvasObjectShared::GetObject() +{ + return m_object; +} + +EvasObject::EvasObjectShared::SmartConnectionBase::SmartConnectionBase( + const std::string& name, + EvasObject::EvasObjectShared* object) : + IConnection(object), + m_callbackName(name) +{} + +void EvasObject::EvasObjectShared::SmartConnectionBase::ConnectPrv() +{ + evas_object_smart_callback_add(GetEvasObject(), + m_callbackName.c_str(), + &IConnection::SmartCallbackWrapper, this); +} + +void EvasObject::EvasObjectShared::SmartConnectionBase::DisconnectPrv() +{ + evas_object_smart_callback_del(GetEvasObject(), + m_callbackName.c_str(), + &IConnection::SmartCallbackWrapper); +} + +EvasObject::EvasObjectShared::EvasConnectionBase::EvasConnectionBase( + Evas_Callback_Type type, + EvasObject::EvasObjectShared* object) : + IConnection(object), + m_callbackType(type) +{} + +void EvasObject::EvasObjectShared::EvasConnectionBase::ConnectPrv() +{ + evas_object_event_callback_add( + GetEvasObject(), m_callbackType, &IConnection::EvasCallbackWrapper, + this); +} + +void EvasObject::EvasObjectShared::EvasConnectionBase::DisconnectPrv() +{ + evas_object_event_callback_del_full( + GetEvasObject(), m_callbackType, &IConnection::EvasCallbackWrapper, + this); +} + +EvasObject::EvasObjectShared::EvasObjectShared() : + m_object(NULL) +{} + +EvasObject::EvasObjectShared::EvasObjectShared(Evas_Object* object) : + m_object(object) +{ + Assert(m_object); + evas_object_event_callback_add(m_object, + EVAS_CALLBACK_DEL, + &StaticOnDelEvent, + this); +} + +void EvasObject::EvasObjectShared::SetObject(Evas_Object* object) +{ + Assert(m_object == NULL); + Assert(object != NULL); + m_object = object; + evas_object_event_callback_add(m_object, + EVAS_CALLBACK_DEL, + &StaticOnDelEvent, + this); +} + +EvasObject::EvasObjectShared::~EvasObjectShared() +{ + if (m_object) { + DisconnectAll(); + evas_object_event_callback_del(m_object, + EVAS_CALLBACK_DEL, + &StaticOnDelEvent); + m_object = NULL; + } +} + +bool EvasObject::EvasObjectShared::DisconnectCallback(IConnection* connection) +{ + IConnectionsSet::iterator it = m_connections.find(connection); + if (it != m_connections.end()) { + (*it)->DisconnectPrv(); + delete connection; + m_connections.erase(it); + return true; + } + return false; +} + +void EvasObject::EvasObjectShared::DisconnectAll() +{ + FOREACH(it, m_connections) + { + (*it)->DisconnectPrv(); + delete *it; + } + m_connections.clear(); +} + +void EvasObject::EvasObjectShared::StaticOnDelEvent(void* data, + Evas* /*e*/, + Evas_Object* /*o*/, + void* /*ev*/) +{ + Assert(data); + EvasObjectShared* This = static_cast(data); + if (This->m_object) { + evas_object_event_callback_del(This->m_object, + EVAS_CALLBACK_DEL, + &StaticOnDelEvent); + This->DisconnectAll(); + This->m_object = NULL; + } +} + +EvasObject::EvasObject() : + m_object(new EvasObjectShared()) +{} + +EvasObject::EvasObject(Evas_Object* object) : + m_object(new EvasObjectShared(object)) +{} + +EvasObject::EvasObject(const EvasObject& other) : + m_object(other.m_object) +{} + +//this destructor must be here to let pimpl with shared_ptr work without warning +EvasObject::~EvasObject() +{} + +EvasObject& EvasObject::operator=(const EvasObject& other) +{ + Assert(m_object); + m_object = other.m_object; + return *this; +} + +EvasObject* EvasObject::operator=(Evas_Object* object) +{ + Assert(m_object); + m_object->SetObject(object); + return this; +} + +bool EvasObject::DisconnectCallback(IConnection* connection) +{ + Assert(m_object); + return m_object->DisconnectCallback(connection); +} + +void EvasObject::DisconnectAll() +{ + Assert(m_object); + m_object->DisconnectAll(); +} + +EvasObject::operator Evas_Object *() +{ + Assert(m_object); + return m_object->GetObject(); +} diff --git a/src/view/common/evas_object.h b/src/view/common/evas_object.h new file mode 100644 index 0000000..5073919 --- /dev/null +++ b/src/view/common/evas_object.h @@ -0,0 +1,647 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file evas_object.h + * @author Lukasz Wrzosek (l.wrzosel@samsung.com) + * @version 1.0 + * @brief This file is the header for Evas_Object wrapper from Efl. + */ +#ifndef WRT_SRC_DOMAIN_EFL_EVAS_OBJECT_H +#define WRT_SRC_DOMAIN_EFL_EVAS_OBJECT_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class EvasObject +{ + class EvasObjectShared; + typedef std::shared_ptr EvasObjectSharedPtr; + + public: + class IConnection + { + public: + Evas_Object* GetEvasObject(); + void Disconnect(); + + private: + IConnection(EvasObjectShared* object); + virtual ~IConnection() + {} + virtual void Call(void* /*event_info*/) = 0; + + static void SmartCallbackWrapper(void* data, + Evas_Object* /*object*/, + void* event_info); + static void EvasCallbackWrapper(void* data, + Evas* /*evas*/, + Evas_Object* /*object*/, + void* event_info); + + virtual void ConnectPrv() = 0; + virtual void DisconnectPrv() = 0; + + friend class EvasObjectShared; + + EvasObjectShared* m_object; + }; + + private: + class EvasObjectShared : DPL::Noncopyable + { + public: + friend class IConnection; + Evas_Object* GetObject(); + + typedef std::set IConnectionsSet; + + class SmartConnectionBase : public IConnection + { + public: + SmartConnectionBase(const std::string& name, + EvasObjectShared* object); + + virtual void ConnectPrv(); + virtual void DisconnectPrv(); + std::string m_callbackName; + }; + + template + class SmartConnection : public SmartConnectionBase + { + public: + typedef void (*CbType)(IConnection* connection, + void* event_info, + Args ... args); + + SmartConnection(const std::string& name, + CbType callback, + EvasObjectShared* object, + Args ... args) : + SmartConnectionBase(name, object), + m_callback(callback), + m_args(args ...) + {} + + virtual ~SmartConnection() + {} + + virtual void Call(void* event_info) + { + DPL::Apply(m_callback, + m_args, + this, + event_info); + } + + private: + CbType m_callback; + std::tuple m_args; + }; + + template + class SmartMemberConnection1 : public SmartConnectionBase + { + public: + typedef void (ThisType::*CbType)(IConnection* connection, + void* event_info, ArgType1 *arg1); + + SmartMemberConnection1(const std::string& name, + CbType callback, + ThisType* callee, + ArgType1* arg1, + EvasObjectShared* object) : + SmartConnectionBase(name, object), + m_callback(callback), + m_callee(callee), + m_arg1(arg1) + {} + + virtual ~SmartMemberConnection1() + {} + + virtual void Call(void* event_info) + { + (m_callee->*m_callback)(this, event_info, m_arg1); + } + + private: + CbType m_callback; + ThisType* m_callee; + ArgType1* m_arg1; + }; + + template + class SmartMemberConnection2 : public SmartConnectionBase + { + public: + typedef void (ThisType::*CbType)(IConnection* connection, + void* event_info, ArgType1 *arg1, + ArgType2* arg2); + + SmartMemberConnection2(const std::string& name, + CbType callback, + ThisType* callee, + ArgType1* arg1, + ArgType2* arg2, + EvasObjectShared* object) : + SmartConnectionBase(name, object), + m_callback(callback), + m_callee(callee), + m_arg1(arg1), + m_arg2(arg2) + {} + + virtual ~SmartMemberConnection2() + {} + + virtual void Call(void* event_info) + { + (m_callee->*m_callback)(this, event_info, m_arg1, m_arg2); + } + + private: + CbType m_callback; + ThisType* m_callee; + ArgType1* m_arg1; + ArgType2* m_arg2; + }; + + class EvasConnectionBase : public IConnection + { + public: + EvasConnectionBase(Evas_Callback_Type type, + EvasObjectShared* object); + + virtual void ConnectPrv(); + virtual void DisconnectPrv(); + + Evas_Callback_Type m_callbackType; + }; + + template + class EvasConnection1 : public EvasConnectionBase + { + public: + typedef void (*CbType)(IConnection* connection, void* event_info, + ArgType1 *arg1); + + EvasConnection1(Evas_Callback_Type type, + CbType callback, + ArgType1* arg1, + EvasObjectShared* object) : + EvasConnectionBase(type, object), + m_callback(callback), + m_arg1(arg1) + {} + + virtual ~EvasConnection1() + {} + + virtual void Call(void* event_info) + { + m_callback(this, event_info, m_arg1); + } + + private: + CbType m_callback; + ArgType1* m_arg1; + }; + + template + class EvasConnection2 : public EvasConnectionBase + { + public: + typedef void (*CbType)(IConnection* connection, void* event_info, + ArgType1 *arg1, ArgType2 *arg2); + + EvasConnection2(Evas_Callback_Type type, + CbType callback, + ArgType1* arg1, + ArgType2* arg2, + EvasObjectShared* object) : + EvasConnectionBase(type, object), + m_callback(callback), + m_arg1(arg1), + m_arg2(arg2) + {} + + virtual ~EvasConnection2() + {} + + virtual void Call(void* event_info) + { + m_callback(this, event_info, m_arg1, m_arg2); + } + + private: + CbType m_callback; + ArgType1* m_arg1; + ArgType2* m_arg2; + }; + + template + class EvasMemberConnection1 : public EvasConnectionBase + { + public: + typedef void (ThisType::*CbType)(IConnection* connection, + void* event_info, ArgType1 *arg1); + + EvasMemberConnection1(Evas_Callback_Type type, + CbType callback, + ThisType* callee, + ArgType1* arg1, + EvasObjectShared* object) : + EvasConnectionBase(type, object), + m_callback(callback), + m_callee(callee), + m_arg1(arg1) + {} + + virtual ~EvasMemberConnection1() + {} + + virtual void Call(void* event_info) + { + (m_callee->*m_callback)(this, event_info, m_arg1); + } + + private: + CbType m_callback; + ThisType* m_callee; + ArgType1* m_arg1; + }; + + template + class EvasMemberConnection2 : public EvasConnectionBase + { + public: + typedef void (ThisType::*CbType)(IConnection* connection, + void* event_info, ArgType1* arg1, + ArgType2* arg2); + + EvasMemberConnection2(Evas_Callback_Type type, + CbType callback, + ThisType* callee, + ArgType1* arg1, + ArgType2* arg2, + EvasObjectShared* object) : + EvasConnectionBase(type, object), + m_callback(callback), + m_callee(callee), + m_arg1(arg1), + m_arg2(arg2) + {} + + virtual ~EvasMemberConnection2() + {} + + virtual void Call(void* event_info) + { + (m_callee->*m_callback)(this, event_info, m_arg1, m_arg2); + } + + private: + CbType m_callback; + ThisType* m_callee; + ArgType1* m_arg1; + ArgType2* m_arg2; + }; + + EvasObjectShared(); + explicit EvasObjectShared(Evas_Object* object); + void SetObject(Evas_Object* object); + ~EvasObjectShared(); + + template + IConnection* ConnectSmartCallback( + const char* callbackName, + typename SmartConnection:: + CbType callback, + Args ... args) + { + Assert(m_object); + Assert(callbackName); + Assert(callback); + IConnection* connection = new SmartConnection( + callbackName, + callback, + this, + args ...); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + template + IConnection* ConnectMemberSmartCallback( + const char* callbackName, + typename SmartMemberConnection2::CbType callback, + ThisType* callee, + ArgType1* arg1, + ArgType2* arg2) + { + Assert(m_object); + Assert(callee); + Assert(callbackName); + Assert(callback); + IConnection* connection = + new SmartMemberConnection2( + callbackName, + callback, + callee, + arg1, + arg2, + this); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + template + IConnection* ConnectMemberSmartCallback( + const char* callbackName, + typename SmartMemberConnection1::CbType callback, + ThisType* callee, + ArgType1* arg1) + { + Assert(m_object); + Assert(callee); + Assert(callbackName); + Assert(callback); + IConnection* connection = + new SmartMemberConnection1(callbackName, + callback, + callee, + arg1, + this); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + template + IConnection* ConnectEvasCallback(Evas_Callback_Type callbackType, + typename EvasConnection2:: + CbType callback, + ArgType1* arg1, + ArgType2* arg2) + { + Assert(m_object); + Assert(callbackType); + Assert(callback); + IConnection* connection = new EvasConnection2( + callbackType, + callback, + arg1, + arg2, + this); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + template + IConnection* ConnectEvasCallback( + Evas_Callback_Type callbackType, + typename EvasConnection1:: + CbType callback, + ArgType1* arg1) + { + Assert(m_object); + Assert(callbackType); + Assert(callback); + IConnection* connection = new EvasConnection1( + callbackType, + callback, + arg1, + this); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + template + IConnection* ConnectMemberEvasCallback( + Evas_Callback_Type callbackType, + typename EvasMemberConnection2::CbType callback, + ThisType* callee, + ArgType1* arg1, + ArgType2* arg2) + { + Assert(m_object); + Assert(callee); + Assert(callbackType); + Assert(callback); + IConnection* connection = + new EvasMemberConnection2( + callbackType, + callback, + callee, + arg1, + arg2, + this); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + template + IConnection* ConnectMemberEvasCallback( + Evas_Callback_Type callbackType, + typename EvasMemberConnection1::CbType callback, + ThisType* callee, + ArgType1* arg1) + { + Assert(m_object); + Assert(callee); + Assert(callbackType); + Assert(callback); + IConnection* connection = + new EvasMemberConnection1(callbackType, + callback, + callee, + arg1, + this); + m_connections.insert(connection); + connection->ConnectPrv(); + return connection; + } + + bool DisconnectCallback(IConnection* connection); + void DisconnectAll(); + + static void StaticOnDelEvent(void* data, + Evas* /*e*/, + Evas_Object* /*o*/, + void* /*ev*/); + + IConnectionsSet m_connections; + Evas_Object* m_object; + }; + + public: + EvasObject(); + explicit EvasObject(Evas_Object* object); + EvasObject(const EvasObject& other); + ~EvasObject(); + + EvasObject& operator=(const EvasObject& other); + EvasObject* operator=(Evas_Object* object); + + operator Evas_Object *(); + + bool IsValid() const + { + Assert(m_object); + return m_object->GetObject() != NULL; + } + + bool DisconnectCallback(IConnection* connection); + void DisconnectAll(); + + template + IConnection* ConnectSmartCallback( + const char* callbackName, + typename EvasObjectShared::SmartConnection::CbType + callback, + Args ... args) + { + Assert(m_object); + return m_object->ConnectSmartCallback(callbackName, callback, args ...); + } + + template + IConnection* ConnectMemberSmartCallback( + const char* callbackName, + typename EvasObjectShared::SmartMemberConnection2::CbType + callback, + ThisType* callee, + ArgType1* arg1, + ArgType2* arg2) + { + Assert(m_object); + Assert(callee); + Assert(callback); + return m_object->ConnectMemberSmartCallback(callbackName, + callback, + callee, + arg1, + arg2); + } + + template + IConnection* ConnectMemberSmartCallback( + const char* callbackName, + typename EvasObjectShared::SmartMemberConnection1::CbType + callback, + ThisType* callee, + ArgType1* arg1) + { + Assert(m_object); + Assert(callee); + Assert(callback); + return m_object->ConnectMemberSmartCallback(callbackName, + callback, + callee, + arg1); + } + + template + IConnection* ConnectEvasCallback( + Evas_Callback_Type callbackType, + typename EvasObjectShared::EvasConnection1::CbType + callback, + ArgType1* arg1, + ArgType2* arg2) + { + Assert(m_object); + return m_object->ConnectEvasCallback(callbackType, callback, arg1, arg2); + } + + template + IConnection* ConnectEvasCallback( + Evas_Callback_Type callbackType, + typename EvasObjectShared::EvasConnection1::CbType + callback, + ArgType1* arg1) + { + Assert(m_object); + return m_object->ConnectEvasCallback(callbackType, callback, arg1); + } + + template + IConnection* ConnectMemberEvasCallback( + Evas_Callback_Type callbackType, + typename EvasObjectShared::EvasMemberConnection1::CbType + callback, + ThisType* callee, + ArgType1* arg1) + { + Assert(m_object); + Assert(callee); + Assert(callback); + return m_object->ConnectMemberEvasCallback(callbackType, + callback, + callee, + arg1); + } + + template + IConnection* ConnectMemberEvasCallback( + Evas_Callback_Type callbackType, + typename EvasObjectShared::EvasMemberConnection2::CbType + callback, + ThisType* callee, + ArgType1* arg1, + ArgType2* arg2) + { + Assert(m_object); + Assert(callee); + Assert(callback); + return m_object->ConnectMemberEvasCallback(callbackType, + callback, + callee, + arg1, + arg2); + } + + private: + EvasObjectSharedPtr m_object; +}; + +#endif //WRT_SRC_DOMAIN_EFL_EVAS_OBJECT_H + diff --git a/src/view/common/scheme.cpp b/src/view/common/scheme.cpp new file mode 100644 index 0000000..bb1daa3 --- /dev/null +++ b/src/view/common/scheme.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file scheme.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#include "scheme.h" +#include +#include +#include +#include + +namespace ViewModule { +namespace { +const char * const type2name[Scheme::COUNT] = { + "file", + "sms", + "smsto", + "mmsto", + "mailto", + "data", + "tel", + "http", + "https", + "widget", +#if ENABLE(APP_SCHEME) + "app", +#endif + "rtsp", + "about" +}; + +typedef std::map SchemeMap; + +SchemeMap PopulateMap() +{ + WrtLogD("Populating scheme map..."); + SchemeMap map; + for (size_t st = Scheme::FILE; st < Scheme::COUNT; ++st) { + WrtLogD(" * %s -> %d", type2name[st], st); + map[type2name[st]] = static_cast(st); + } + return map; +} + +const SchemeMap name2type = PopulateMap(); +} // namespace + +Scheme::Scheme(const std::string& name) : m_name(name), m_type(INVALID) +{ + m_type = GetType(name); +} + +std::string Scheme::GetName (Type type) +{ + Assert(type >= FILE && type < COUNT); + return type2name[type]; +} + +Scheme::Type Scheme::GetType(const std::string& name) +{ + auto it = name2type.find(name); + if (it == name2type.end()) { + WrtLogE("Invalid scheme: %s", name.c_str()); + return INVALID; + } + return it->second; +} +} /* namespace ViewModule */ diff --git a/src/view/common/scheme.h b/src/view/common/scheme.h new file mode 100644 index 0000000..4eed310 --- /dev/null +++ b/src/view/common/scheme.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file scheme.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#ifndef SCHEME_H_ +#define SCHEME_H_ + +#include + +#include + +namespace ViewModule { +class Scheme +{ + public: + enum Type { + INVALID = -1, + FILE = 0, + SMS, + SMSTO, + MMSTO, + MAILTO, + DATA, + TEL, + HTTP, + HTTPS, + WIDGET, +#if ENABLE(APP_SCHEME) + APP, +#endif + RTSP, + ABOUT, + + COUNT + }; + + explicit Scheme(const std::string& name); + virtual ~Scheme() {} + + std::string GetName() const + { + return m_name; + } + Type GetType() const + { + return m_type; + } + + static std::string GetName (Type type); + static std::string GetName (size_t type) + { + return GetName(static_cast(type)); + } + static Type GetType(const std::string& name); + + private: + std::string m_name; + Type m_type; +}; +} /* namespace ViewModule */ +#endif /* SCHEME_H_ */ diff --git a/src/view/common/scheme_action_map.cpp b/src/view/common/scheme_action_map.cpp new file mode 100644 index 0000000..9a2e16e --- /dev/null +++ b/src/view/common/scheme_action_map.cpp @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file scheme_action_map.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#include "scheme_action_map.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "scheme_action_map_data.h" + +namespace ViewModule { +namespace { +/* + * Lazy construction pattern. + * TODO Make it more general. Use variadic template/tuples/lambdas or sth. Move + * to DPL. + */ +template +class Lazy +{ + public: + explicit Lazy(const Arg1& arg1) : + m_arg1(arg1), + m_object(new std::unique_ptr()) + {} + Lazy(const Lazy& other) : + m_arg1(other.m_arg1), + m_object(other.m_object) + {} + + T& operator*() + { + return GetObject(); + } + const T& operator*() const + { + return GetObject(); + } + const T* operator->() const + { + return &GetObject(); + } + T* operator->() + { + return &GetObject(); + } + + Lazy& operator=(const Lazy& other) + { + m_arg1 = other.m_arg1; + m_object = other.m_object; + return *this; + } + + private: + T& GetObject() const + { + if (!(*m_object)) { + (*m_object).reset(new T(m_arg1)); + } + return **m_object; + } + + Arg1 m_arg1; + // single unique_ptr shared among many Lazy copies + mutable std::shared_ptr > m_object; +}; + +/* + * Struct defining conversion of scheme for given appsvc key for example: + * sms:5551212?body=expected%20text => APPSVC_DATA_TEXT + expected%20text + */ +struct AppSvcConversion { + AppSvcConversion(char const * const keyValue, + const std::string& regexStr) : + key(keyValue), + regex(regexStr) {} + char const * const key; + Lazy regex; +}; + +/* + * Struct defining an appsvc operation and a list of scheme conversions used to + * fill in additional appsvc data. + */ +struct ServiceOperation { + const char* operation; + const char* fakeUri; + const char* mime; + std::list conversions; +}; + +typedef std::map ServiceOperationMap; + +// Regular expressions used to extract appsvc data from scheme +// TODO what about multiple recipients? +char const * const REGEX_BODY = ".*[?&]body=([^&]+).*"; +char const * const REGEX_SMS = "sms:([^&]+).*"; +char const * const REGEX_SMSTO = "smsto:([^&]+).*"; +char const * const REGEX_MMSTO = "mmsto:([^&]+).*"; +char const * const REGEX_MAILTO = "mailto:([^&]+).*"; +char const * const REGEX_TO = ".*[?&]to=([^&]+).*"; +char const * const REGEX_CC = ".*[?&]cc=([^&]+).*"; +char const * const REGEX_BCC = ".*[?&]bcc=([^&]+).*"; +char const * const REGEX_SUBJECT = ".*[?&]subject=([^&]+).*"; +char const * const REGEX_DATA_CONTEXT = ".*;phone-context=([^:]+).*"; + +ServiceOperationMap initializeAppSvcOperations() +{ + ServiceOperationMap ret; + + // FILE, HTTP & HTTPS + ServiceOperation viewOp; + viewOp.operation = APP_CONTROL_OPERATION_VIEW; + viewOp.fakeUri = NULL; + viewOp.mime = NULL; + // no additional data + ret.insert(std::make_pair(Scheme::FILE, viewOp)); + ret.insert(std::make_pair(Scheme::HTTP, viewOp)); + ret.insert(std::make_pair(Scheme::HTTPS, viewOp)); + + // SMS + ServiceOperation smsOp; + smsOp.operation = APP_CONTROL_OPERATION_COMPOSE; + smsOp.fakeUri = NULL; + smsOp.mime = "*/*"; + smsOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_TO, REGEX_SMS)); + smsOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_TEXT, REGEX_BODY)); + ret.insert(std::make_pair(Scheme::SMS, smsOp)); + + // SMSTO + ServiceOperation smstoOp; + smstoOp.operation = APP_CONTROL_OPERATION_COMPOSE; + smstoOp.fakeUri = "sms"; + smstoOp.mime = "*/*"; + smstoOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_TO, REGEX_SMSTO)); + smstoOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_TEXT, REGEX_BODY)); + ret.insert(std::make_pair(Scheme::SMSTO, smstoOp)); + + + // MMSTO & MAILTO + ServiceOperation sendOp; + sendOp.operation = APP_CONTROL_OPERATION_COMPOSE; + sendOp.fakeUri = NULL; + sendOp.mime = NULL; + sendOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_TO, REGEX_MMSTO)); + sendOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_TO, REGEX_MAILTO)); + sendOp.conversions.push_back(AppSvcConversion(APP_CONTROL_DATA_CC, REGEX_CC)); + sendOp.conversions.push_back( + AppSvcConversion(APP_CONTROL_DATA_BCC, REGEX_BCC)); + sendOp.conversions.push_back( + AppSvcConversion(APP_CONTROL_DATA_SUBJECT, REGEX_SUBJECT)); + sendOp.conversions.push_back( + AppSvcConversion(APP_CONTROL_DATA_TEXT, REGEX_BODY)); + ret.insert(std::make_pair(Scheme::MAILTO, sendOp)); + sendOp.mime = "*/*"; + ret.insert(std::make_pair(Scheme::MMSTO, sendOp)); + + // TODO what about DATA? + + // TEL + ServiceOperation telOp; + telOp.operation = APP_CONTROL_OPERATION_CALL; + telOp.fakeUri = NULL; + telOp.mime = NULL; + ret.insert(std::make_pair(Scheme::TEL, telOp)); + + return ret; +} + +ServiceOperationMap g_serviceOperationMap = initializeAppSvcOperations(); + +void handleTizenServiceScheme(const char* uri) +{ + // Tizen Service + std::string parameter = std::string(uri); + std::string appId; + size_t start, end = 0; + + if (parameter.find("AppID=") != std::string::npos) { + start = parameter.find("AppID=") + strlen("AppID="); + end = parameter.find(";", start); + appId = parameter.substr(start, end-start); + } else { + WrtLogE("parameter doesn't contain appID"); + return; + } + + app_control_h handle = NULL; + if (app_control_create(&handle) != APP_CONTROL_ERROR_NONE) { + WrtLogE("Fail to create app_control handle"); + return; + } + + if (app_control_set_app_id(handle, appId.c_str()) < 0) { + WrtLogE("Fail to app_control_set_app_id"); + app_control_destroy(handle); + return; + } + + const char* KEY_KEY = "key="; + const char* KEY_VALUE = "value="; + + char* buf = strdup(parameter.c_str()); + const char* ptr = strtok(buf,";"); + while (ptr != NULL) { + std::string string = ptr; + ptr = strtok (NULL, ";"); + + size_t devide = string.find(','); + if (devide == std::string::npos) { + continue; + } + size_t keyPos = string.find(KEY_KEY); + if (keyPos == std::string::npos) { + continue; + } + size_t valuePos = string.find(KEY_VALUE); + if (valuePos == std::string::npos) { + continue; + } + + std::string key = + string.substr(keyPos + std::string(KEY_KEY).size(), + devide - (keyPos + std::string(KEY_KEY).size())); + std::string value = + string.substr(valuePos + std::string(KEY_VALUE).size()); + + if (app_control_add_extra_data(handle, key.c_str(), value.c_str())) { + WrtLogE("app_control_add_extra_data is failed."); + app_control_destroy(handle); + free(buf); + return; + } + } + free(buf); + + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByAppService( + handle, + NULL, + NULL)); +} + +void handleUnknownScheme(const char* scheme, const char* uri) +{ + WrtLogE("Invalid scheme: %s", scheme); + // case of unknown scheme, send to app-control + // This is temporary soultion. "invalid" scheme should be handled by + // scheme map data + + if (!strcmp(scheme, "tizen-service")) { + handleTizenServiceScheme(uri); + return; + } else { + // create app_control + app_control_h app_control = NULL; + if (APP_CONTROL_ERROR_NONE == app_control_create(&app_control)) { + app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW); + app_control_set_uri(app_control, uri); + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByAppService( + app_control, + NULL, + NULL)); + } + } +} + + +} // namespace + +namespace SchemeActionMap { +bool HandleUri(const char* uri, NavigationContext context) +{ + if (!uri) { + WrtLogE("wrong arguments passed"); + return false; + } + WrtLogD("Uri being checked: %s", uri); + + const char *end = strstr(uri, ":"); + if (!end) { + WrtLogE("Lack of scheme - ignoring"); + return false; + } + std::string name(uri, end); + Scheme scheme(name); + WrtLogD("Scheme: %s", name.c_str()); + + Scheme::Type type = scheme.GetType(); + if (type < Scheme::FILE || type >= Scheme::COUNT) { + WrtLogE("Invalid scheme: %s", name.c_str()); + handleUnknownScheme(name.c_str(), uri); + return false; + } + + WrtLogD("Scheme type: %d", type); + WrtLogD("Navigation context: %d", context); + + UriAction action = g_tizenActionMap[type][context]; + + WrtLogD("Uri action: %d", action); + + // execute action if necessary + switch (action) { + case URI_ACTION_APPSVC: + { + // find AppSvcOperation for given scheme type + auto it = g_serviceOperationMap.find(type); + if (it == g_serviceOperationMap.end()) { + WrtLogE("No entry for scheme: %s", name.c_str()); + return false; + } + + // prepare appsvc bundle + app_control_h app_control = NULL; + app_control_create(&app_control); + WrtLogD("appsvc operation %s", it->second.operation); + app_control_set_operation(app_control, it->second.operation); + if (it->second.fakeUri) { + size_t size = strlen(it->second.fakeUri) + strlen(uri) + 1; + char *newUri = new char[size]; + strcpy(newUri, it->second.fakeUri); + const char* uriArgs = strstr(uri, ":"); + strcpy(newUri + strlen(it->second.fakeUri), uriArgs); + app_control_set_uri(app_control, newUri); + delete [] newUri; + } + else { + app_control_set_uri(app_control, uri); + } + if (it->second.mime) { + app_control_set_mime(app_control, it->second.mime); + } + + // this is safe as there are no other threads + CURL* curl = curl_easy_init(); + // unescape the url + int outLength = 0; + char* unescaped = curl_easy_unescape(curl, uri, 0, &outLength); + if (unescaped == NULL) { + WrtLogE("unescaped is null"); + app_control_destroy(app_control); + curl_easy_cleanup(curl); + return false; + } + std::string uUri(unescaped, outLength); + curl_free(unescaped); + curl_easy_cleanup(curl); + WrtLogD("unescaped %s", uUri.c_str()); + + // setup additional appsvc data + FOREACH(cit, it->second.conversions) { + WrtLogD("extracting data for key %s", cit->key); + + std::string match; + pcrecpp::StringPiece input(uUri); + + // convert scheme text to appsvc format + while (cit->regex->Consume(&input, &match)) { + WrtLogD("Adding apssvc data: %s %s", cit->key, match.c_str()); + app_control_add_extra_data(app_control, cit->key, match.c_str()); + } + } + + // TODO do we need a callback? + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByAppService( + app_control, + NULL, + NULL)); + break; + } + + case URI_ACTION_VIDEO: + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByPkgname( + ApplicationLauncherPkgname::PKG_NAME_VIDEO_PLAYER, + name, + uri, + "null")); + break; + default: + break; + } + return (action == URI_ACTION_WRT); +} +} // namespace SchemeActionMap +} /* namespace ViewModule */ diff --git a/src/view/common/scheme_action_map.h b/src/view/common/scheme_action_map.h new file mode 100644 index 0000000..04973df --- /dev/null +++ b/src/view/common/scheme_action_map.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file scheme_action_map.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#ifndef SCHEME_ACTION_MAP_H_ +#define SCHEME_ACTION_MAP_H_ + +#include "scheme_action_map_type.h" + +namespace ViewModule { +namespace SchemeActionMap { +bool HandleUri(const char* uri, + NavigationContext context); +}; +} /* namespace ViewModule */ +#endif /* SCHEME_ACTION_MAP_H_ */ diff --git a/src/view/common/scheme_action_map_data.h b/src/view/common/scheme_action_map_data.h new file mode 100644 index 0000000..3abff0a --- /dev/null +++ b/src/view/common/scheme_action_map_data.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file scheme_action_map_data.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 1.0 + */ + +#include "scheme_action_map.h" + +#include + +#include + +namespace ViewModule { +namespace { +enum UriAction { + URI_ACTION_WRT, // load in WRT + URI_ACTION_APPSVC, // launch in APPSVC + URI_ACTION_VIDEO, // launch in VIDEO player + URI_ACTION_ERROR +}; + +/** + * WS-1501 - No top-level window navigation outside the widget. Deafult browser + * should be used instead. Frames/iframes are allowed to navigate. + * This requirement can't be applied to tizen hosted app as in its + * case the whole widget is "outside". + * + * WS-1502 - When calling window.open() with scheme HTTP/HTTPS and target + * attribute set to "_blank" WRT should open default browser. At the + * moment we can't distinguish target attributes, therefore all new + * windows are opened in the browser regardless of the attribute (the + * value "_new" is also treated this way). Tizen won't satisfy this + * requirement. It should open new windows in WRT. + * + * Video - YOUTUBE and RSTP are handled by video player. + * + * File scheme - FILE scheme has to be handled by WRT + * + * WS-1510/20/30/40/50 - All remaining cases are always handled by appsvc + */ + +// TIZEN +const UriAction g_tizenActionMap[Scheme::COUNT][SchemeActionMap::COUNT] = { + // TOP_LEVEL FRAME_LEVEL NEW_WINDOW + { URI_ACTION_WRT, URI_ACTION_WRT, URI_ACTION_WRT }, // FILE + { URI_ACTION_APPSVC, URI_ACTION_APPSVC, URI_ACTION_APPSVC }, // SMS + { URI_ACTION_APPSVC, URI_ACTION_APPSVC, URI_ACTION_APPSVC }, // SMSTO + { URI_ACTION_APPSVC, URI_ACTION_APPSVC, URI_ACTION_APPSVC }, // MMSTO + { URI_ACTION_APPSVC, URI_ACTION_APPSVC, URI_ACTION_APPSVC }, // MAILTO + { URI_ACTION_WRT, URI_ACTION_WRT, URI_ACTION_WRT }, // DATA + { URI_ACTION_APPSVC, URI_ACTION_APPSVC, URI_ACTION_APPSVC }, // TEL + { URI_ACTION_WRT, URI_ACTION_WRT, URI_ACTION_WRT }, // HTTP + { URI_ACTION_WRT, URI_ACTION_WRT, URI_ACTION_WRT }, // HTTPS + { URI_ACTION_WRT, URI_ACTION_WRT, URI_ACTION_WRT }, // WIDGET +#if ENABLE(APP_SCHEME) + { URI_ACTION_WRT, URI_ACTION_WRT, URI_ACTION_WRT }, // APP +#endif + { URI_ACTION_VIDEO, URI_ACTION_VIDEO, URI_ACTION_VIDEO } // RTSP +}; + +} +} diff --git a/src/view/common/scheme_action_map_type.h b/src/view/common/scheme_action_map_type.h new file mode 100644 index 0000000..334e01e --- /dev/null +++ b/src/view/common/scheme_action_map_type.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file scheme_action_map_type.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 1.0 + */ + +#ifndef SCHEME_ACTION_MAP_TYPE_H_ +#define SCHEME_ACTION_MAP_TYPE_H_ + +namespace ViewModule { +namespace SchemeActionMap { +enum NavigationContext { + TOP_LEVEL = 0, + FRAME_LEVEL, + NEW_WINDOW, + + COUNT +}; +} // namespace SchemeActionMap +} // namespace ViewModule +#endif /* SCHEME_ACTION_MAP_TYPE_H_ */ diff --git a/src/view/common/view_logic_apps_support.cpp b/src/view/common/view_logic_apps_support.cpp new file mode 100644 index 0000000..9809aec --- /dev/null +++ b/src/view/common/view_logic_apps_support.cpp @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_apps_support.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Implementation file of AppsSupport class used by ViewLogic + */ + +#include "view_logic_apps_support.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ViewModule { +namespace { +const char* const SCHEME_TYPE_HTML5_VIDEO = "html5video"; +const char* const HTTP_STREAMING_MPEG_MIMETYPE = "application/x-mpegurl"; +const char* const HTTP_STREAMING_APPLE_MIMETYPE = + "application/vnd.apple.mpegurl"; +const char* const SCHEM_FILE = "file"; +const char* const DOWNLOAD_PATH = "/opt/usr/media/Downloads/"; +} + +//Implementation class +class AppsSupportImplementation +{ + private: + WidgetModel *m_widgetModel; + bool m_initialized; + int m_notiId; + + struct HTML5Video { + const char* path; + const char* cookie; + }; + + bool httpMultimediaRequest(std::string mimeType, std::string uri) + { + WrtLogD("httpMultimediaRequest called"); + + if ("null" == mimeType || "null" == uri) { + WrtLogE("uri/mimeType is null"); + return false; + } + + app_control_h app_control = NULL; + app_control_create(&app_control); + + // ignore case match of string of mime type + // if needed, define appsvc response callback + // and its user data per mimetype + if (!strcasecmp(mimeType.c_str(), HTTP_STREAMING_APPLE_MIMETYPE) || + !strcasecmp(mimeType.c_str(), HTTP_STREAMING_MPEG_MIMETYPE)) + { + app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW); + app_control_set_mime(app_control, mimeType.c_str()); + app_control_set_uri(app_control, uri.c_str()); + } else { + WrtLogD("Not Supported MIME type in WRT"); + app_control_destroy(app_control); + return false; + } + + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByAppService( + app_control, + NULL, + NULL)); + + return true; + } + + bool isFileExist(std::string path, bool isDirectory) + { + struct stat fileState; + if (stat(path.c_str(), &fileState) != 0) { + WrtLogE("Fail to get file stat"); + return false; + } + + if (isDirectory && S_ISDIR(fileState.st_mode)) { + return true; + } + if (!isDirectory && S_ISREG(fileState.st_mode)) { + return true; + } + return false; + } + + bool copyFile(std::string file, std::string dest) + { + std::ifstream in (file); + if (in.is_open() == false) { + WrtLogE("Fail to open input file"); + return false; + } + std::ofstream out(dest); + if (out.is_open() == false) { + WrtLogE("Fail to open output file"); + return false; + } + out << in.rdbuf(); + out.close(); + in.close(); + + return true; + } + + void freeResource(notification_h n, bundle *b) + { + if (n) { + notification_free(n); + } + if (b) { + bundle_free(b); + } + return; + } + + int createCompleteNotification(std::string fileName, std::string filePath, std::string result) + { + // create notification + notification_h noti = NULL; + noti = notification_create(NOTIFICATION_TYPE_NOTI); + if (noti == NULL) { + WrtLogE("Fail to notification_create"); + return -1; + } + + // set notification layout + int ret; + ret = notification_set_layout(noti, NOTIFICATION_LY_ONGOING_EVENT); + if (ret != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to notification_set_layout"); + freeResource(noti, NULL); + return -1; + } + + // set notification title text + ret = notification_set_text(noti, + NOTIFICATION_TEXT_TYPE_TITLE, + fileName.c_str(), + NULL, + NOTIFICATION_VARIABLE_TYPE_NONE); + if (ret != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to notification_set_text title"); + freeResource(noti, NULL); + return -1; + } + + // set notification content text + ret = notification_set_text(noti, + NOTIFICATION_TEXT_TYPE_CONTENT, + result.c_str(), + NULL, + NOTIFICATION_VARIABLE_TYPE_NONE); + if (ret != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to notification_set_text content"); + freeResource(noti, NULL); + return -1; + } + + //set image for notification + ret = notification_set_image(noti, + NOTIFICATION_IMAGE_TYPE_ICON, + filePath.c_str()); + if (ret != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to notification_set_image"); + freeResource(noti, NULL); + return -1; + } + + // set bundle data + bundle *b = bundle_create(); + if (!b) { + WrtLogE("Fail to bundle_create"); + freeResource(noti, NULL); + return -1; + } + if (appsvc_set_operation(b, APPSVC_OPERATION_VIEW) != APPSVC_RET_OK) { + WrtLogE("Fail to appsvc_set_operation"); + freeResource(noti, b); + return -1; + } + if (appsvc_set_uri(b, filePath.c_str()) != APPSVC_RET_OK) { + WrtLogE("Fail to appsvc_set_uri"); + freeResource(noti, b); + return -1; + } + + // set notification execute option + ret = notification_set_execute_option(noti, + NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, + "View", + NULL, + b); + if (ret != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to notification_set_execute_option"); + freeResource(noti, b); + return -1; + } + + int privId; + ret = notification_insert(noti, &privId); + if (ret != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to notification_insert"); + freeResource(noti, b); + return -1; + } + freeResource(noti, b); + return privId; + } + + void localUriRequest(std::string filePath) + { + WrtLogD("file path = [%s]", filePath.c_str()); + + // verify request file path + if (isFileExist(filePath, false) == false) { + WrtLogE("Request file path isn't existed"); + return; + } + + // create destPath + if (isFileExist(DOWNLOAD_PATH, true) == false) { + WrtLogE("Downloads directory isn't existed"); + return; + } + + // create destFileFullPath + std::string fileName = filePath.substr(filePath.rfind('/') + 1); + unsigned int renameSuffixNb = 0; + std::string destFileName = fileName; + while (isFileExist(DOWNLOAD_PATH + destFileName, false)) { + std::ostringstream suffixOstr; + suffixOstr.str(""); + suffixOstr << fileName << "_" << renameSuffixNb++; + + destFileName = fileName; + destFileName.insert(destFileName.find('.'), suffixOstr.str()); + } + std::string destFileFullPath = DOWNLOAD_PATH + destFileName; + + // copy + if (copyFile(filePath, destFileFullPath) == false) { + WrtLogE("Fail to copy file"); + return; + } + m_notiId = createCompleteNotification(destFileName, + destFileFullPath, + "Download Complete"); + } + + public: + AppsSupportImplementation() : + m_widgetModel(NULL), + m_initialized(false) + {} + + ~AppsSupportImplementation() + { + AssertMsg(!m_initialized, + "AppsSupport has to be deinitialized prior destroying!"); + } + + void initialize(WidgetModel *widgetModel, unsigned windowHandle) + { + AssertMsg(!m_initialized, "Already initialized!"); + + WrtLogD("Initializing Apps Support"); + AssertMsg(widgetModel, "Passed widgetModel is NULL!"); + m_widgetModel = widgetModel; + + ApplicationLauncherSingleton::Instance().Touch(); + ApplicationLauncherSingleton::Instance().setWidgetTizenId( + DPL::ToUTF8String(m_widgetModel->TizenId)); + ApplicationLauncherSingleton::Instance().setWindowHandle(windowHandle); + + WrtLogD("Initialized"); + m_initialized = true; + } + + void deinitialize() + { + AssertMsg(m_initialized, "Not initialized!"); + WrtLogD("Deinitialized"); + m_widgetModel = NULL; + m_initialized = false; + } + + void downloadRequest(const char *url, + const char *mimeType, + const char *userParam) + { + WrtLogD("Download info: %s (%s, %s)", url, mimeType, userParam); + + // separate local & host scheme + std::unique_ptr iri(iri_parse(url), iri_destroy); + if (!iri.get()) { + WrtLogD("Fail to get iri"); + return; + } + if (!iri->scheme) { + WrtLogE("Fail to get scheme"); + return; + } + if (std::string(iri->scheme) == SCHEM_FILE) { + WrtLogD("copy to Download directory"); + if (!iri->path) { + WrtLogE("file path is empty"); + return; + } + localUriRequest(iri->path); + return; + } + + // ignore case match of string of mime type + bool isAppServiceable = httpMultimediaRequest( + mimeType ? std::string(mimeType) : "null", + url ? std::string(url) : "null"); + + if (isAppServiceable) { + WrtLogD("Application Service start"); + return; + } + + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByPkgname( + ApplicationLauncherPkgname::PKG_NAME_DOWNLOAD_PROVIDER, + url ? std::string(url) : "null", + mimeType && strlen(mimeType) != 0 ? mimeType : "null", + userParam && strlen(userParam) != 0 ? userParam : "null")); + } + + void html5VideoRequest(void* event_info) + { + WrtLogD("html5VideoRequestCallback called"); + Assert(event_info); + HTML5Video* video = static_cast(event_info); + + WrtLogD("video->path : %s", video->path); + WrtLogD("video->cookie : %s", video->cookie); + if (NULL == video->path) { + WrtLogE("path is null"); + return; + } + CONTROLLER_POST_EVENT( + ApplicationLauncher, + ApplicationLauncherEvents::LaunchApplicationByPkgname( + ApplicationLauncherPkgname::PKG_NAME_VIDEO_PLAYER, + SCHEME_TYPE_HTML5_VIDEO, + video->path ? video->path : "null", + video->cookie ? video->cookie : "null")); + } +}; + +AppsSupport::AppsSupport() : m_impl(new AppsSupportImplementation) +{} + +AppsSupport::~AppsSupport() +{} + +void AppsSupport::initialize(WidgetModel *widgetModel, unsigned windowHandle) +{ + m_impl->initialize(widgetModel, windowHandle); +} + +void AppsSupport::deinitialize() +{ + m_impl->deinitialize(); +} + +void AppsSupport::html5VideoRequest(void* event_info) +{ + m_impl->html5VideoRequest(event_info); +} + +void AppsSupport::downloadRequest(const char *url, + const char *mimeType, + const char *userParam) +{ + m_impl->downloadRequest(url, mimeType, userParam); +} +} //namespace diff --git a/src/view/common/view_logic_apps_support.h b/src/view/common/view_logic_apps_support.h new file mode 100644 index 0000000..505f3ac --- /dev/null +++ b/src/view/common/view_logic_apps_support.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_apps_support.h + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Header file of AppsSupport class used by ViewLogic + */ + +#ifndef VIEW_LOGIC_APPS_SUPPORT_H_ +#define VIEW_LOGIC_APPS_SUPPORT_H_ + +#include +#include + +class WidgetModel; //Forward declaration + +namespace ViewModule { +class AppsSupportImplementation; //Forward declaration + +class AppsSupport +{ + public: + AppsSupport(); + virtual ~AppsSupport(); + + void initialize(WidgetModel *, unsigned); + void deinitialize(); + void html5VideoRequest(void* event_info); + void downloadRequest( + const char *url, + const char *mimeType, + const char *userParam); + + private: + std::unique_ptr m_impl; +}; +} //namespace + +#endif /* VIEW_LOGIC_APPS_SUPPORT_H_ */ diff --git a/src/view/common/view_logic_certificate_support.cpp b/src/view/common/view_logic_certificate_support.cpp new file mode 100644 index 0000000..d76b717 --- /dev/null +++ b/src/view/common/view_logic_certificate_support.cpp @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_certificate_origin_support.cpp + * @author Leerang Song (leerang.song@samsung.com) + * @version 1.0 + * @brief Support certificate dao + */ + +#include "view_logic_certificate_support.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +namespace { +const double MAX_POPUP_HEIGHT = 0.80; +const double MAX_SCROLLER_HEIGHT = 0.5; + +struct CallbackData { + Evas_Smart_Cb eaKeyCallback; +}; + +static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); + +static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + CallbackData* callbackData = static_cast(data); + if (callbackData) { + ea_object_event_callback_del(obj, EA_CALLBACK_BACK, callbackData->eaKeyCallback); + delete callbackData; + } + evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, resizeCallback); +} + +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(data); + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + Evas_Object* popup = obj; + int popupH; + evas_object_geometry_get(popup, 0, 0, 0, &popupH); + + Evas_Object* parent = PopupUtil::getParentWindow(popup); + int parentW, parentH; + evas_object_geometry_get(parent, 0, 0, &parentW, &parentH); + + // compare current popup height with screen height. + // To avoid popup is filled full screen, used magic number to be filled 80% of screen height. + // TODO: Automatically add scroller feature should implement in the elementary + double threshold = parentH * MAX_POPUP_HEIGHT; + double currentH = popupH; + if (threshold < currentH) { + WrtLogD("text is overflow popup height. add scroller"); + Evas_Object* layout = elm_object_content_get(obj); + Evas_Object* label = elm_object_part_content_get(layout, "elm.swallow.label"); + + Evas_Object* scroller = elm_scroller_add(layout); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_TRUE); + int scrollerHeight = parentW > parentH ? parentH : parentW; + evas_object_size_hint_max_set(scroller, -1, scrollerHeight * MAX_SCROLLER_HEIGHT); + + elm_object_part_content_unset(layout, "elm.swallow.label"); + elm_object_content_set(scroller, label); + elm_object_part_content_set(layout, "elm.swallow.label", scroller); + evas_object_show(layout); + } +} +} + +class CertificateSupportImplementation +{ + private: + WidgetModel* m_model; + CertificateDB::CertificateDAOPtr m_certificateDAO; + + public: + CertificateSupportImplementation(WidgetModel* widgetModel) : + m_model(NULL) + { + Assert(widgetModel); + m_model = widgetModel; + } + + ~CertificateSupportImplementation() + {} + + CertificateDB::CertificateDAO* getCertificateDAO(void) + { + Assert(m_model); + if (!m_certificateDAO) { + WrtLogD("initialize CertificateDAO"); + m_certificateDAO = + CertificateDB::CertificateDAOPtr( + new CertificateDB::CertificateDAO(m_model->TzPkgId. + Get())); + // initialize certificate result data. Remove allow, deny for + m_certificateDAO->removeCertificateData( + CertificateDB::RESULT_ALLOW_ONCE); + m_certificateDAO->removeCertificateData( + CertificateDB::RESULT_DENY_ONCE); + } + return m_certificateDAO.get(); + } +}; + +CertificateSupport::CertificateSupport(WidgetModel* widgetModel) : + m_impl(new CertificateSupportImplementation(widgetModel)) +{} + +CertificateSupport::~CertificateSupport() +{} + +CertificateDB::CertificateDAO* CertificateSupport:: + getCertificateDAO(void) +{ + return m_impl->getCertificateDAO(); +} + +Evas_Object* CertificateSupportUtil::createPopup( + Evas_Object* window, + const char* bodyText, + const char* checkText, + Evas_Smart_Cb buttonCallback, + Evas_Smart_Cb keyCallback, + void* data) +{ + WrtLogD("createPopup"); + + Evas_Object* parentWindow = PopupUtil::getParentWindow(window); + Evas_Object* popup = elm_popup_add(parentWindow); + + CallbackData* callbackData = NULL; + if (keyCallback) { + callbackData = new CallbackData; + callbackData->eaKeyCallback = keyCallback; + ea_object_event_callback_add(popup, EA_CALLBACK_BACK, keyCallback, data); + } + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, static_cast(callbackData)); + evas_object_event_callback_add(popup, EVAS_CALLBACK_RESIZE, resizeCallback, NULL); + + elm_object_style_set(popup, "popup/default"); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* layout = elm_layout_add(popup); + elm_layout_file_set(layout, WRT_EDJ_PATH, "popupWithCheck"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* label = elm_label_add(popup); + elm_label_line_wrap_set(label, ELM_WRAP_MIXED); + elm_object_text_set(label, bodyText); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* check = elm_check_add(layout); +#if USE(EFL_LITE) + elm_object_style_set(check, "popup"); +#else + elm_object_style_set(check, "multiline"); +#endif + elm_object_domain_translatable_part_text_set(check, 0, "wrt", checkText); + + elm_object_part_content_set(layout, "elm.swallow.label", label); + elm_object_part_content_set(layout, "elm.swallow.checkbox", check); + elm_object_content_set(popup, layout); + + Evas_Object* btn1 = elm_button_add(popup); + elm_object_style_set(btn1, "popup"); + elm_object_domain_translatable_part_text_set(btn1, 0, "wrt", WRT_OPT_DENY_IDS); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", buttonCallback, data); + Evas_Object* btn2 = elm_button_add(popup); + elm_object_style_set(btn2, "popup"); + elm_object_domain_translatable_part_text_set(btn2, 0, "wrt", WRT_OPT_ALLOW_IDS); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", buttonCallback, data); + + return popup; +} + +Evas_Object* CertificateSupportUtil::getPopup(Evas_Object* button) +{ + Assert(button); + + Evas_Object* popup = button; + while (strcmp(elm_object_widget_type_get(popup), "elm_popup")) { + popup = elm_object_parent_widget_get(popup); + if (!popup) { + return NULL; + } + } + return popup; +} + +Evas_Object* CertificateSupportUtil::getCheck(Evas_Object* popup) +{ + Assert(popup); + if (strcmp(elm_object_widget_type_get(popup), "elm_popup")) { + return NULL; + } + Evas_Object* check = elm_object_part_content_get( + elm_object_content_get(popup), + "elm.swallow.checkbox"); + return check; +} + +CertificateDB::Result CertificateSupportUtil::getResult( + Evas_Object* button) +{ + using namespace CertificateDB; + + Assert(button); + // get popup evas_object + Evas_Object* popup = getPopup(button); + if (popup == NULL) { + return RESULT_UNKNOWN; + } + bool allow = !strcmp(WRT_OPT_ALLOW, elm_object_text_get(button)); + + // get check evas_object + Evas_Object* check = getCheck(popup); + if (check == NULL) { + return RESULT_UNKNOWN; + } + if (allow) { + return elm_check_state_get(check) ? RESULT_ALLOW_ALWAYS : + RESULT_ALLOW_ONCE; + } else { + return elm_check_state_get(check) ? RESULT_DENY_ALWAYS : + RESULT_DENY_ONCE; + } +} +} // namespace ViewModule diff --git a/src/view/common/view_logic_certificate_support.h b/src/view/common/view_logic_certificate_support.h new file mode 100644 index 0000000..15b541b --- /dev/null +++ b/src/view/common/view_logic_certificate_support.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_certificate_origin_support.h + * @author Leerang Song (leerang.song@samsung.com) + * @version 1.0 + * @brief Header file for certificate + */ + +#ifndef VIEW_LOGIC_CERTIFICATE_SUPPORT_H_ +#define VIEW_LOGIC_CERTIFICATE_SUPPORT_H_ + +#include +#include +#include +#include +#include + +class WidgetModel; +namespace CertificateDB { +class CertificateDAO; +} + +namespace ViewModule { +class CertificateSupportImplementation; + +class CertificateSupport +{ + public: + CertificateSupport(WidgetModel* widgetModel); + virtual ~CertificateSupport(); + CertificateDB::CertificateDAO* getCertificateDAO(); + + private: + std::unique_ptr m_impl; +}; + +namespace CertificateSupportUtil { +class PermissionData +{ + public: + CertificateDB::CertificateDAO* m_certiDao; + CertificateDB::CertificateData m_certiData; + void* m_data; + + PermissionData( + CertificateDB::CertificateDAO* certiDao, + CertificateDB::CertificateData certiData, + void* data) : + m_certiDao(certiDao), + m_certiData(certiData), + m_data(data) + {} +}; + +Evas_Object* createPopup(Evas_Object* window, + const char* bodyText, + const char* checkText, + Evas_Smart_Cb buttonCallback, + Evas_Smart_Cb keyCallback, + void* data); +Evas_Object* getPopup(Evas_Object* button); +Evas_Object* getCheck(Evas_Object* popup); +CertificateDB::Result getResult(Evas_Object* button); +}; +} // namespace ViewModule + +#endif // VIEW_LOGIC_CERTIFICATE_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/common/view_logic_custom_header_support.cpp b/src/view/common/view_logic_custom_header_support.cpp new file mode 100644 index 0000000..6ecba87 --- /dev/null +++ b/src/view/common/view_logic_custom_header_support.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_custom_header_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief Implementation file of CustomHeaderSupport API used by ViewLogic + */ + +#include "view_logic_custom_header_support.h" + +#include +#include + +#include +#include +#include + +namespace { +const std::string LANGUAGE_EN = "en"; +}; + +namespace ViewModule { +namespace CustomHeaderSupport { +std::string getValueByField(const std::string &field) +{ + WrtLogD("Field : %s", field.c_str()); + std::string ret; + + if (field == ACCEPT_LANGUAGE) { + char *systemLanguageSet = NULL; + systemLanguageSet = vconf_get_str(VCONFKEY_LANGSET); + WrtLogD("system language = [%s]", systemLanguageSet); + + if (!systemLanguageSet) { + WrtLogE("Failed to get VCONFKEY_LANGSET. set as English"); + ret.append(LANGUAGE_EN); + } else { + // copy first 2bytes of language set (en, ko, po) + ret.append(systemLanguageSet, 2); + } + + if (systemLanguageSet) { + free(systemLanguageSet); + } + } else { + WrtLogE("Wrong field is passed"); + Assert(false); + } + + return ret; +} +} // namespace CustomHeaderSupport +} // namespace ViewModule diff --git a/src/view/common/view_logic_custom_header_support.h b/src/view/common/view_logic_custom_header_support.h new file mode 100644 index 0000000..99ab3e9 --- /dev/null +++ b/src/view/common/view_logic_custom_header_support.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_custom_header_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief Header file of CustomHeaderSupport API used by ViewLogic + */ + +#ifndef VIEW_LOGIC_CUSTOM_HEADER_SUPPORT_H_ +#define VIEW_LOGIC_CUSTOM_HEADER_SUPPORT_H_ + +#include + +namespace ViewModule { +namespace CustomHeaderSupport { +const std::string ACCEPT_LANGUAGE = "Accept-Language"; + +std::string getValueByField(const std::string &field); +} // namespace UserAgentSupport +} // namespace CustomHeaderSupport + +#endif /* VIEW_LOGIC_CUSTOM_HEADER_SUPPORT_H_ */ diff --git a/src/view/common/view_logic_get_parent_window_util.h b/src/view/common/view_logic_get_parent_window_util.h new file mode 100644 index 0000000..8580424 --- /dev/null +++ b/src/view/common/view_logic_get_parent_window_util.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_get_parent_window_util.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + */ + +#ifndef VIEW_LOGIC_GET_PARENT_WINDOW_UTIL_H_ +#define VIEW_LOGIC_GET_PARENT_WINDOW_UTIL_H_ + +#include +#include + +namespace ViewModule { +namespace PopupUtil { + +static Evas_Object* getParentWindow(Evas_Object* object) +{ + Evas_Object* parent = elm_object_parent_widget_get(object); + Evas_Object* win = parent; + + while (parent) { + const char* type = elm_object_widget_type_get(parent); + if (type) { + if (!strncmp(type, "elm_win", strlen("elm_win"))) { + win = parent; + break; + } + } + parent = elm_object_parent_widget_get(parent); + } + + if (!win) + { + WrtLogE("Parent window was not found!"); + win = object; + } + + return win; +} + +} //namespace ViewModule +} //namespace PopupUtil +#endif //VIEW_LOGIC_GET_PARENT_WINDOW_UTIL_H_ diff --git a/src/view/common/view_logic_help_popup_support.cpp b/src/view/common/view_logic_help_popup_support.cpp new file mode 100644 index 0000000..7b86e6e --- /dev/null +++ b/src/view/common/view_logic_help_popup_support.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_help_popup_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#include "view_logic_help_popup_support.h" + +#include +#include +#include +#include +#include + +#include +#include + +namespace ViewModule { +namespace { +Evas_Object* getPopup(Evas_Object* object); +static void buttonClickedCallback(void* data, Evas_Object* obj, void* eventInfo); + +Evas_Object* getPopup(Evas_Object* object) +{ + Assert(object); + + Evas_Object* popup = object; + while (strcmp(elm_object_widget_type_get(popup), "elm_popup")) { + popup = elm_object_parent_widget_get(popup); + if (!popup) { + return NULL; + } + } + return popup; +} + +static void buttonClickedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(data); + DPL_UNUSED_PARAM(eventInfo); + + Evas_Object* popup = getPopup(obj); + if (!popup) { + WrtLogW("Fail to get popup object"); + return; + } + evas_object_hide(popup); + evas_object_del(popup); +} +} // namespace anonymous + +void HelpPopupSupport::showClearDefaultPopup(Evas_Object* object) +{ + WrtLogD("called"); + + Assert(object); + + // create popup + Evas_Object* parentWindow = PopupUtil::getParentWindow(object); + Evas_Object* popup = elm_popup_add(parentWindow); + elm_object_domain_translatable_part_text_set(popup, 0, "wrt", WRT_POP_CLEAR_DEFAULT_SETTINGS_IDS); + ea_object_event_callback_add(popup, EA_CALLBACK_BACK, ea_popup_back_cb, NULL); + + // create button + Evas_Object* button = elm_button_add(popup); + elm_object_style_set(button, "popup"); + elm_object_domain_translatable_part_text_set(button, 0, "sys_string", WRT_SK_OK_IDS); + elm_object_part_content_set(popup, "button1", button); + evas_object_smart_callback_add(button, "clicked", buttonClickedCallback, NULL); + + evas_object_show(popup); +} +} // namespace ViewModule diff --git a/src/view/common/view_logic_help_popup_support.h b/src/view/common/view_logic_help_popup_support.h new file mode 100644 index 0000000..1abbaa9 --- /dev/null +++ b/src/view/common/view_logic_help_popup_support.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_help_popup_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_HELP_POPUP_SUPPORT_H_ +#define VIEW_LOGIC_HELP_POPUP_SUPPORT_H_ + +#include + +namespace ViewModule { +namespace HelpPopupSupport { + +void showClearDefaultPopup(Evas_Object* object); + +} //namespace HelpPopupSupport +} //namespace ViewModule +#endif //VIEW_LOGIC_HELP_POPUP_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/common/view_logic_privilege_support.cpp b/src/view/common/view_logic_privilege_support.cpp new file mode 100644 index 0000000..4748e70 --- /dev/null +++ b/src/view/common/view_logic_privilege_support.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_privilege_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "view_logic_privilege_support.h" + +#include +#include + +#include +#include +#include +#include + +namespace ViewModule { +namespace { +const std::map privilegeTextMap = { + {PrivilegeSupport::Privilege::CAMERA, "http://tizen.org/privilege/camera"}, + {PrivilegeSupport::Privilege::LOCATION, "http://tizen.org/privilege/location"}, + {PrivilegeSupport::Privilege::MEDIACAPTURE, "http://tizen.org/privilege/mediacapture"}, + {PrivilegeSupport::Privilege::RECORDER, "http://tizen.org/privilege/recorder"} +}; +} + +//Implementation class +class PrivilegeSupportImplementation +{ + private: + WidgetModel* m_model; + bool m_isLegacyPolicy; + std::map m_cacheResult; + + void initializePrivilegePolicy(void) + { + Assert(m_model); + + DPL::OptionalString requiredVersionString = m_model->RequiredVersion.Get(); + if (!requiredVersionString) { + // tizen required_version is mandatory element + Assert(false && "Required version is empty"); + } + + double requiredVersion = atof(DPL::ToUTF8String(*requiredVersionString).c_str()); + + if (requiredVersion < 2.3) { + // tizen v1.0 ~ v2.2 + m_isLegacyPolicy = true; + } else { + // tizen v2.3 ~ + m_isLegacyPolicy = false; + } + } + + bool isCached(PrivilegeSupport::Privilege priv) + { + return m_cacheResult.find(priv) != m_cacheResult.end(); + } + + void setCache(PrivilegeSupport::Privilege priv, DPL::OptionalBool result) + { + m_cacheResult[priv] = result; + } + + DPL::OptionalBool getCache(PrivilegeSupport::Privilege priv) + { + return m_cacheResult[priv]; + } + + bool searchPrivilege(PrivilegeSupport::Privilege priv) + { + std::string target = privilegeTextMap.find(priv)->second; + WrtDB::PrivilegeList list = m_model->WidgetPrivilegeList.Get(); + FOREACH(it, list) { + if (target == DPL::ToUTF8String(*it)) { + return true; + } + } + return false; + } + + + public: + PrivilegeSupportImplementation(WidgetModel* model) : + m_model(model), + m_isLegacyPolicy(false) + { + // Distribute required version + initializePrivilegePolicy(); + } + + ~PrivilegeSupportImplementation() + { + } + + DPL::OptionalBool getPrivilegeStatus(PrivilegeSupport::Privilege priv) + { + // ALLOW : return true + // DENY : return false + // ASK : return empty + DPL::OptionalBool ret; + + if (m_isLegacyPolicy) { + return ret; + } + + if (isCached(priv)) { + return getCache(priv); + } + + if (searchPrivilege(priv)) { + setCache(priv, ret); + return ret; + } + + ret = false; + setCache(priv, ret); + return ret; + } +}; + +PrivilegeSupport::PrivilegeSupport(WidgetModel* model) : m_impl(new PrivilegeSupportImplementation(model)) +{ +} + +PrivilegeSupport::~PrivilegeSupport() +{ +} + +DPL::OptionalBool PrivilegeSupport::getPrivilegeStatus(PrivilegeSupport::Privilege priv) +{ + return m_impl->getPrivilegeStatus(priv); +} + +} //namespace ViewModule diff --git a/src/view/common/view_logic_privilege_support.h b/src/view/common/view_logic_privilege_support.h new file mode 100644 index 0000000..8f2e6c7 --- /dev/null +++ b/src/view/common/view_logic_privilege_support.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_privilege_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_PRIVILEGE_SUPPORT_H_ +#define VIEW_LOGIC_PRIVILEGE_SUPPORT_H_ + +#include + +#include + +//Forward declaration +class WidgetModel; + +namespace ViewModule { +//Forward declaration +class PrivilegeSupportImplementation; + +class PrivilegeSupport +{ + public: + enum class Privilege { + CAMERA, // http://tizen.org/privilege/camera + LOCATION, // http://tizen.org/privilege/location + MEDIACAPTURE, // http://tizen.org/privilege/mediacapture + RECORDER // http://tizen.org/privilege/recorder + }; + + PrivilegeSupport(WidgetModel* model); + virtual ~PrivilegeSupport(); + + DPL::OptionalBool getPrivilegeStatus(Privilege pri); + + private: + std::unique_ptr m_impl; +}; + +} // namespace ViewModule + +#endif // VIEW_LOGIC_PRIVILEGE_SUPPORT_H_ diff --git a/src/view/common/view_logic_security_origin_support.cpp b/src/view/common/view_logic_security_origin_support.cpp new file mode 100644 index 0000000..775205e --- /dev/null +++ b/src/view/common/view_logic_security_origin_support.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_security_origin_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief Support security origin dao + */ + +#include "view_logic_security_origin_support.h" + +#include +#include +#include +#include +#include + +namespace ViewModule { + + class SecurityOriginSupportImplementation +{ + private: + WidgetModel* m_model; + SecurityOriginDB::SecurityOriginDAOPtr m_securityOriginDAO; + + public: + SecurityOriginSupportImplementation(WidgetModel* widgetModel) : + m_model(NULL) + { + Assert(widgetModel); + m_model = widgetModel; + } + + ~SecurityOriginSupportImplementation() + {} + + SecurityOriginDB::SecurityOriginDAO* getSecurityOriginDAO(void) + { + Assert(m_model); + if (!m_securityOriginDAO) { + WrtLogD("initialize securityOriginDAO"); + m_securityOriginDAO = + SecurityOriginDB::SecurityOriginDAOPtr( + new SecurityOriginDB::SecurityOriginDAO(m_model->TzPkgId. + Get())); + // initialize security result data. Remove allow, deny for + m_securityOriginDAO->removeSecurityOriginData( + SecurityOriginDB::RESULT_ALLOW_ONCE); + m_securityOriginDAO->removeSecurityOriginData( + SecurityOriginDB::RESULT_DENY_ONCE); + } + return m_securityOriginDAO.get(); + } +}; + +SecurityOriginSupport::SecurityOriginSupport(WidgetModel* widgetModel) : + m_impl(new SecurityOriginSupportImplementation(widgetModel)) +{} + +SecurityOriginSupport::~SecurityOriginSupport() +{} + +SecurityOriginDB::SecurityOriginDAO* SecurityOriginSupport:: + getSecurityOriginDAO(void) +{ + return m_impl->getSecurityOriginDAO(); +} + +} // namespace ViewModule diff --git a/src/view/common/view_logic_security_origin_support.h b/src/view/common/view_logic_security_origin_support.h new file mode 100755 index 0000000..f658b81 --- /dev/null +++ b/src/view/common/view_logic_security_origin_support.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_security_origin_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief Header file for security origin + */ + +#ifndef VIEW_LOGIC_SECURITY_ORIGIN_SUPPORT_H_ +#define VIEW_LOGIC_SECURITY_ORIGIN_SUPPORT_H_ + +#include + +class WidgetModel; +namespace SecurityOriginDB { +class SecurityOriginDAO; +} + +namespace ViewModule { +class SecurityOriginSupportImplementation; + +class SecurityOriginSupport +{ + public: + SecurityOriginSupport(WidgetModel* widgetModel); + virtual ~SecurityOriginSupport(); + SecurityOriginDB::SecurityOriginDAO* getSecurityOriginDAO(); + + private: + std::unique_ptr m_impl; +}; + +} // namespace ViewModule + +#endif // VIEW_LOGIC_SECURITY_ORIGIN_SUPPORT_H_ diff --git a/src/view/common/view_logic_security_origin_support_util.cpp b/src/view/common/view_logic_security_origin_support_util.cpp new file mode 100644 index 0000000..840e380 --- /dev/null +++ b/src/view/common/view_logic_security_origin_support_util.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_security_origin_support_util.cpp + * @author Adam Banasiak (a.banasiak@samsung.com) + * @version 1.0 + * @brief Support security origin utility + */ + +#include "view_logic_security_origin_support_util.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { + +namespace { +const double MAX_POPUP_HEIGHT = 0.80; +const double MAX_SCROLLER_HEIGHT = 0.5; + +struct CallbackData { + Evas_Smart_Cb eaKeyCallback; +}; + +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo); + +static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + CallbackData* callbackData = static_cast(data); + Assert(obj); + if (callbackData) { + ea_object_event_callback_del(obj, EA_CALLBACK_BACK, callbackData->eaKeyCallback); + delete callbackData; + } + evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, resizeCallback); +} +static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(data); + DPL_UNUSED_PARAM(e); + DPL_UNUSED_PARAM(eventInfo); + + Assert(obj); + Evas_Object* popup = obj; + int popupH; + evas_object_geometry_get(popup, 0, 0, 0, &popupH); + + Evas_Object* parent = PopupUtil::getParentWindow(popup); + int parentW, parentH; + evas_object_geometry_get(parent, 0, 0, &parentW, &parentH); + + // compare current popup height with screen height. + // To avoid popup is filled full screen, used magic number to be filled 80% of screen height. + // TODO: Automatically add scroller feature should implement in the elementary + double threshold = parentH * MAX_POPUP_HEIGHT; + double currentH = popupH; + if (threshold < currentH) { + WrtLogD("text is overflow popup height. add scroller"); + Evas_Object* layout = elm_object_content_get(obj); + Evas_Object* label = elm_object_part_content_get(layout, "elm.swallow.label"); + + Evas_Object* scroller = elm_scroller_add(layout); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_TRUE); + int scrollerHeight = parentW > parentH ? parentH : parentW; + evas_object_size_hint_max_set(scroller, -1, scrollerHeight * MAX_SCROLLER_HEIGHT); + + elm_object_part_content_unset(layout, "elm.swallow.label"); + elm_object_content_set(scroller, label); + elm_object_part_content_set(layout, "elm.swallow.label", scroller); + evas_object_show(layout); + } +} +} // anonymous namespace + +Evas_Object* SecurityOriginSupportUtil::createPopup( + Evas_Object* window, + const char* bodyText, + const char* checkText, + Evas_Smart_Cb buttonCallback, + Evas_Smart_Cb keyCallback, + void* data) +{ + WrtLogD("createPopup"); + Evas_Object* parentWindow = PopupUtil::getParentWindow(window); + Evas_Object* popup = elm_popup_add(parentWindow); + + CallbackData* callbackData = NULL; + if (keyCallback) { + callbackData = new CallbackData; + callbackData->eaKeyCallback = keyCallback; + ea_object_event_callback_add(popup, EA_CALLBACK_BACK, keyCallback, data); + } + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, static_cast(callbackData)); + evas_object_event_callback_add(popup, EVAS_CALLBACK_RESIZE, resizeCallback, NULL); + + elm_object_style_set(popup, "popup/default"); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* layout = elm_layout_add(popup); + elm_layout_file_set(layout, WRT_EDJ_PATH, "popupWithCheck"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* label = elm_label_add(popup); + elm_label_line_wrap_set(label, ELM_WRAP_WORD); + elm_object_domain_translatable_part_text_set(label, 0, "wrt", bodyText); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* check = elm_check_add(layout); +#if USE(EFL_LITE) + elm_object_style_set(check, "popup"); +#else + elm_object_style_set(check, "multiline"); +#endif + elm_object_domain_translatable_part_text_set(check, 0, "wrt", checkText); + + elm_object_part_content_set(layout, "elm.swallow.label", label); + elm_object_part_content_set(layout, "elm.swallow.checkbox", check); + elm_object_content_set(popup, layout); + + Evas_Object* btn1 = elm_button_add(popup); + elm_object_style_set(btn1, "popup"); + elm_object_domain_translatable_part_text_set(btn1, 0, "wrt", "IDS_COM_BODY_DENY"); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", buttonCallback, data); + Evas_Object* btn2 = elm_button_add(popup); + elm_object_style_set(btn2, "popup"); + elm_object_domain_translatable_part_text_set(btn2, 0, "wrt", "IDS_BR_OPT_ALLOW"); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", buttonCallback, data); + return popup; +} + +Evas_Object* SecurityOriginSupportUtil::getPopup(Evas_Object* button) +{ + Assert(button); + + Evas_Object* popup = button; + while (strcmp(elm_object_widget_type_get(popup), "elm_popup")) { + popup = elm_object_parent_widget_get(popup); + if (!popup) { + return NULL; + } + } + return popup; +} + +Evas_Object* SecurityOriginSupportUtil::getCheck(Evas_Object* popup) +{ + Assert(popup); + if (strcmp(elm_object_widget_type_get(popup), "elm_popup")) { + return NULL; + } + Evas_Object* check = elm_object_part_content_get( + elm_object_content_get(popup), + "elm.swallow.checkbox"); + return check; +} + +SecurityOriginDB::Result SecurityOriginSupportUtil::getResult( + Evas_Object* button) +{ + using namespace SecurityOriginDB; + + Assert(button); + // get popup evas_object + Evas_Object* popup = getPopup(button); + if (popup == NULL) { + return RESULT_UNKNOWN; + } + bool allow = !strcmp(WRT_OPT_ALLOW, elm_object_text_get(button)); + + // get check evas_object + Evas_Object* check = getCheck(popup); + if (check == NULL) { + return RESULT_UNKNOWN; + } + if (allow) { + return elm_check_state_get(check) ? RESULT_ALLOW_ALWAYS : + RESULT_ALLOW_ONCE; + } else { + return elm_check_state_get(check) ? RESULT_DENY_ALWAYS : + RESULT_DENY_ONCE; + } +} + +bool SecurityOriginSupportUtil::isNeedHelpPopup(Evas_Object* popup) +{ + Assert(popup); + + if (strcmp(elm_object_widget_type_get(popup), "elm_popup")) { + return false; + } + Evas_Object* check = getCheck(popup); + if (check && elm_check_state_get(check)) { + return true; + } + return false; +} + +} // namespace ViewModule diff --git a/src/view/common/view_logic_security_origin_support_util.h b/src/view/common/view_logic_security_origin_support_util.h new file mode 100644 index 0000000..2b39072 --- /dev/null +++ b/src/view/common/view_logic_security_origin_support_util.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_security_origin_support_util.h + * @author Adam Banasiak (a.banasiak@samsung.com) + * @version 1.0 + * @brief Header file for security origin utility + */ + +#ifndef VIEW_LOGIC_SECURITY_ORIGIN_SUPPORT_UTILITY_H +#define VIEW_LOGIC_SECURITY_ORIGIN_SUPPORT_UTILITY_H + +#include +#include +#include + +namespace ViewModule { +namespace SecurityOriginSupportUtil { +class PermissionData +{ + public: + SecurityOriginDB::SecurityOriginDAO* m_originDao; + SecurityOriginDB::SecurityOriginData m_originData; + void* m_data; + DPL::String m_pkgId; + + PermissionData( + SecurityOriginDB::SecurityOriginDAO* originDao, + SecurityOriginDB::SecurityOriginData originData, + void* data) : + m_originDao(originDao), + m_originData(originData), + m_data(data) + {} + + PermissionData( + SecurityOriginDB::SecurityOriginDAO* originDao, + SecurityOriginDB::SecurityOriginData originData, + void* data, + DPL::String& pkgId): + m_originDao(originDao), + m_originData(originData), + m_data(data), + m_pkgId(pkgId) + {} +}; + +Evas_Object* createPopup(Evas_Object* window, + const char* bodyText, + const char* checkText, + Evas_Smart_Cb buttonCallback, + Evas_Smart_Cb keyCallback, + void* data); +Evas_Object* getPopup(Evas_Object* button); +Evas_Object* getCheck(Evas_Object* popup); +SecurityOriginDB::Result getResult(Evas_Object* button); +bool isNeedHelpPopup(Evas_Object* popup); +} // namespace SecurityOriginSupportUtil +} // namespace ViewModule + + +#endif /* VIEW_LOGIC_SECURITY_ORIGIN_SUPPORT_UTILITY_H */ + diff --git a/src/view/common/view_logic_security_support.cpp b/src/view/common/view_logic_security_support.cpp new file mode 100644 index 0000000..c6f1db3 --- /dev/null +++ b/src/view/common/view_logic_security_support.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_keys_support.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Implementation file of SecuritySupport API used by ViewLogic + */ + +#include "view_logic_security_support.h" +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +namespace SecuritySupport { +namespace { +const char *GEOLOCATION_DEV_CAP = "geolocation.position"; +const char *GEOLOCATION_PARAM_NAME = "param:enableHighAccuracy"; +const char *GEOLOCATION_PARAM_VALUE = "true"; + +bool simpleAceCheck( + const DPL::String& tizenId, + const char *devCap, + const char *paramName, + const char *paramValue) +{ + WrtDB::WidgetDAOReadOnly dao(tizenId); + ace_request_t aceRequest; + aceRequest.widget_handle = dao.getHandle(); + aceRequest.session_id = const_cast(""); + aceRequest.feature_list.count = 0; + aceRequest.dev_cap_list.count = 1; + aceRequest.dev_cap_list.items = new ace_dev_cap_t[1]; + aceRequest.dev_cap_list.items[0].name = + const_cast(devCap); + + aceRequest.dev_cap_list.items[0].param_list.count = paramName ? 1 : 0; + aceRequest.dev_cap_list.items[0].param_list.items = NULL; + + if (paramName) { + aceRequest.dev_cap_list.items[0].param_list.items = new ace_param_t[1]; + aceRequest.dev_cap_list.items[0].param_list.items[0].name = + const_cast(paramName); + aceRequest.dev_cap_list.items[0].param_list.items[0].value = + const_cast(paramValue); + } + + WrtLogD("Making ace check with new C-API"); + ace_check_result_t result = ACE_PRIVILEGE_DENIED; + ace_return_t ret = ace_check_access_ex(&aceRequest, &result); + + WrtLogD("Result is: %d", static_cast(result)); + + delete[] aceRequest.dev_cap_list.items[0].param_list.items; + delete[] aceRequest.dev_cap_list.items; + + return ACE_OK == ret && ACE_ACCESS_GRANTED == result; +} +} //TODO copied from view_logic.cpp + +bool geolocationACECheck(const DPL::String& tizenId, bool highAccuracy) +{ + const char *paramName = NULL; + const char *paramValue = NULL; + if (highAccuracy) { + paramName = GEOLOCATION_PARAM_NAME; + paramValue = GEOLOCATION_PARAM_VALUE; + } + return simpleAceCheck( + tizenId, + GEOLOCATION_DEV_CAP, + paramName, + paramValue); +} +} // namespace SecuritySupport +} //namespace ViewModule diff --git a/src/view/common/view_logic_security_support.h b/src/view/common/view_logic_security_support.h new file mode 100644 index 0000000..bcf0e66 --- /dev/null +++ b/src/view/common/view_logic_security_support.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_security_support.h + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Header file of SecuritySupport API used by ViewLogic + */ + +#ifndef VIEW_LOGIC_SECURITY_SUPPORT_H_ +#define VIEW_LOGIC_SECURITY_SUPPORT_H_ + +#include +#include + +//Forward declaration +class WidgetModel; + +namespace ViewModule { +namespace SecuritySupport { +char const * const PARAM_URL = "param:url"; +bool geolocationACECheck(const DPL::String& tizenId, bool highAccuracy); +} // namespace SecuritySupport +} // namespace ViewModule + +#endif /* VIEW_LOGIC_SECURITY_SUPPORT_H_ */ diff --git a/src/view/common/view_logic_storage_support.cpp b/src/view/common/view_logic_storage_support.cpp new file mode 100644 index 0000000..3136003 --- /dev/null +++ b/src/view/common/view_logic_storage_support.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_storage_support.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Implementation file of StorageSupport API used by ViewLogic + */ +#include "view_logic_storage_support.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace bf = boost::filesystem; + +namespace ViewModule { +namespace StorageSupport { +namespace { //anonymous +const bf::perms TEMPORARY_STORAGE_MODE = bf::owner_all; +static bool rootDirectory = true; + +static int removeFile(const char* path, const struct stat* /*sb*/, int tflag) +{ + if (path == NULL) { + WrtLogE("Wrong input path"); + return 0; + } + WrtLogD("%s",path); + bf::path inputPath(path); + + if (rootDirectory) { + WrtLogD("Skip root directory"); + rootDirectory = false; + return 0; + } + + if (tflag == FTW_F || tflag == FTW_D) { + try { + bf::remove_all(inputPath); + } catch (const bf::filesystem_error& ex) { + WrtLogE("Fail to remove! %s", ex.what()); + } + } else if (tflag == FTW_DNR) { + WrtLogE("This is directory which can't be read"); + } else if (tflag == FTW_NS) { + WrtLogE("Unknow error"); + } + return 0; +} + +bool removeDirectory(const char* path) +{ + rootDirectory = true; + if (ftw(path, removeFile, 20) != 0) { + return false; + } + return true; +} +} + +void initializeStorage(WidgetModel *widgetModel) +{ + WrtLogD("initializeStorage"); + AssertMsg(widgetModel, "Passed widgetModel is NULL!"); + + // create temporary storage + bf::path path(DPL::ToUTF8String(widgetModel->TemporaryStoragePath.Get())); + if (!bf::is_directory(path)) { + try { + bf::create_directories(path); + bf::permissions(path,TEMPORARY_STORAGE_MODE); + } catch (const bf::filesystem_error& ex) { + WrtLogE("boost::filesystem::error: %s",ex.what()); + ThrowMsg(DPL::CommonException::InternalError, + "Fail to initialize temporary storage"); + } + } else { + if (!removeDirectory(path.c_str())) { + WrtLogE("Failed to clean temporary storage"); + } + } +} + +void deinitializeStorage(WidgetModel *widgetModel) +{ + WrtLogD("deinitializeStorage"); + AssertMsg(widgetModel, "Passed widgetModel is NULL!"); + + // clean-up temporary storage + std::string path = + DPL::ToUTF8String(widgetModel->TemporaryStoragePath.Get()); + if (!removeDirectory(path.c_str())) { + WrtLogE("Fail to deinitialize temporary storage"); + } +} +} // namespace StorageSupport +} // namespace ViewModule diff --git a/src/view/common/view_logic_storage_support.h b/src/view/common/view_logic_storage_support.h new file mode 100644 index 0000000..c7c9eb1 --- /dev/null +++ b/src/view/common/view_logic_storage_support.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_storage_support.h + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Header file of StorageSupport API used by ViewLogic + */ + +#ifndef VIEW_LOGIC_STORAGE_SUPPORT_H_ +#define VIEW_LOGIC_STORAGE_SUPPORT_H_ + +//Forward declaration +class WidgetModel; + +namespace ViewModule { +namespace StorageSupport { +void initializeStorage(WidgetModel *widgetModel); +void deinitializeStorage(WidgetModel *widgetModel); +} // namespace StorageSupport +} // namespace ViewModule + +#endif /* VIEW_LOGIC_STORAGE_SUPPORT_H_ */ diff --git a/src/view/common/view_logic_uri_support.cpp b/src/view/common/view_logic_uri_support.cpp new file mode 100644 index 0000000..30d99fc --- /dev/null +++ b/src/view/common/view_logic_uri_support.cpp @@ -0,0 +1,450 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_uri_support.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Implementation file of UriSupport API used by ViewLogic + */ + +#include "view_logic_uri_support.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ViewModule { +namespace UriSupport { +namespace { +struct AppControlCompareData { +std::string operation; +std::string uri; +std::string scheme; +std::string mime; +}; +enum ServiceDataType +{ + APP_CONTROL_DATA_TYPE_OPERATION, + APP_CONTROL_DATA_TYPE_URI, + APP_CONTROL_DATA_TYPE_URI_SCHEME, + APP_CONTROL_DATA_TYPE_MIME +}; + +#if ENABLE(APP_SCHEME) +char const * const SCHEME_TYPE_APP = "app"; +#endif +char const * const SCHEME_TYPE_FILE = "file"; +char const * const SCHEME_TYPE_HTTP = "http"; +char const * const SCHEME_TYPE_HTTPS = "https"; +char const * const SCHEME_TYPE_WIDGET = "widget"; +const char * const SCHEME_TYPE_FILE_SLASH = "file://"; + +bool wildcardCompare(const std::string& wildcardString, const std::string& target) +{ + std::string re = wildcardString; + + // replace special character to meaning character + pcrecpp::RE("\\\\").GlobalReplace("\\\\\\\\", &re); + pcrecpp::RE("\\.").GlobalReplace("\\\\.", &re); + pcrecpp::RE("\\+").GlobalReplace("\\\\+", &re); + pcrecpp::RE("\\?").GlobalReplace("\\\\?", &re); + pcrecpp::RE("\\^").GlobalReplace("\\\\^", &re); + pcrecpp::RE("\\$").GlobalReplace("\\\\$", &re); + pcrecpp::RE("\\[").GlobalReplace("\\\\[", &re); + pcrecpp::RE("\\]").GlobalReplace("\\\\]", &re); + pcrecpp::RE("\\{").GlobalReplace("\\\\{", &re); + pcrecpp::RE("\\}").GlobalReplace("\\\\}", &re); + pcrecpp::RE("\\(").GlobalReplace("\\\\(", &re); + pcrecpp::RE("\\)").GlobalReplace("\\\\)", &re); + pcrecpp::RE("\\|").GlobalReplace("\\\\|", &re); + + // replace wildcard character to regex type + pcrecpp::RE("\\*").GlobalReplace(".*", &re); + + return pcrecpp::RE(re).FullMatch(target); +} + +bool compareServiceData(ServiceDataType type, + std::string origin, + std::string other) +{ + if (APP_CONTROL_DATA_TYPE_OPERATION == type) + { + return origin == other; + } + else if (APP_CONTROL_DATA_TYPE_URI == type) + { + return wildcardCompare(origin, other); + } + else if (APP_CONTROL_DATA_TYPE_URI_SCHEME == type) + { + return origin == other; + } + else if (APP_CONTROL_DATA_TYPE_MIME == type) + { + return wildcardCompare(origin, other); + } + else + { + WrtLogE("Wrong data type"); + return false; + } +} + +std::string getAppControlSrc( + WrtDB::WidgetAppControlList appControlLost, + AppControlCompareData data) +{ + WrtLogD(" - operation : %s", data.operation.c_str()); + WrtLogD(" - uri : %s", data.uri.c_str()); + WrtLogD(" - scheme : %s", data.scheme.c_str()); + WrtLogD(" - mimetype : %s", data.mime.c_str()); + + FOREACH(appControlIt, appControlLost) + { + if (compareServiceData(APP_CONTROL_DATA_TYPE_OPERATION, DPL::ToUTF8String(appControlIt->operation), data.operation)) + { + if (compareServiceData(APP_CONTROL_DATA_TYPE_URI_SCHEME, DPL::ToUTF8String(appControlIt->uri), data.scheme) || + compareServiceData(APP_CONTROL_DATA_TYPE_URI, DPL::ToUTF8String(appControlIt->uri), data.uri) ) + { + if (compareServiceData(APP_CONTROL_DATA_TYPE_MIME, DPL::ToUTF8String(appControlIt->mime), data.mime)) + { + WrtLogD("Matched with : %ls", appControlIt->src.c_str()); + WrtLogD(" - operation : %ls", appControlIt->operation.c_str()); + WrtLogD(" - uri : %ls", appControlIt->uri.c_str()); + WrtLogD(" - mimetype : %ls", appControlIt->mime.c_str()); + return DPL::ToUTF8String(appControlIt->src); + } + } + } + } + return std::string(); +} + +} + +std::string prepareUrl(const std::string &url, const std::string &insert) +{ + std::string urlFixed = url; + if (urlFixed.find("file://") == 0) { + urlFixed.erase(0, 6); + } + //replace %s in url with given from appservice + int size = snprintf(NULL, 0, urlFixed.c_str(), insert.c_str()) + 1; + char buffer[size]; + snprintf(buffer, size, urlFixed.c_str(), insert.c_str()); + return std::string(buffer); +} + +std::string getCustomHandlerProtocolUri( + WidgetModel *widgetModel, + const std::string &schemeType, + const std::string &schemeValue) +{ + CustomHandlerDB::Interface::attachDatabaseRO(); + CustomHandlerDB::CustomHandlerDAOReadOnly handlersDao(widgetModel->TizenId); + CustomHandlerDB::CustomHandlerPtr handler = + handlersDao.getActivProtocolHandler( + DPL::FromASCIIString(schemeType)); + CustomHandlerDB::Interface::detachDatabase(); + if (handler) { + WrtLogD("Found handler, url: %ls", handler->url.c_str()); + return prepareUrl(DPL::ToUTF8String(handler->base_url) + + DPL::ToUTF8String(handler->url), schemeValue); + } + return ""; +} + +std::string getCustomHandlerContentUri( + WidgetModel *widgetModel, + const std::string &mime, + const std::string &mimeValue) +{ + CustomHandlerDB::Interface::attachDatabaseRO(); + CustomHandlerDB::CustomHandlerDAOReadOnly handlersDao(widgetModel->TizenId); + CustomHandlerDB::CustomHandlerPtr handler = + handlersDao.getActivContentHandler( + DPL::FromASCIIString(mime)); + CustomHandlerDB::Interface::detachDatabase(); + if (handler) { + WrtLogD("Found handler, url: %ls", handler->url.c_str()); + return prepareUrl(DPL::ToUTF8String(handler->base_url) + + DPL::ToUTF8String(handler->url), mimeValue); + } + return ""; +} + +std::string getAppControlUri(bundle *bundle, WidgetModel *widgetModel) +{ + if (!bundle) + { + WrtLogE("Bundle is empty"); + return std::string(""); + } + + AppControlCompareData data; + // get operation. Operation is mandatory. + const char* value = NULL; + value = appsvc_get_operation(bundle); + data.operation = value ? value : ""; + // ignore operation is NULL case + if (data.operation.empty()) { + WrtLogD("Operation is NULL"); + return std::string(""); + } + + // get mime + value = appsvc_get_mime(bundle); + data.mime = value ? value : ""; + + // get uri + value = appsvc_get_uri(bundle); + data.uri = value ? value : ""; + + WrtLogD("Passed AppControl data"); + WrtLogD(" - operation : %s", data.operation.c_str()); + WrtLogD(" - uri : %s", data.uri.c_str()); + WrtLogD(" - mimetype : %s", data.mime.c_str()); + + + // get scheme and mime + std::string originScheme = ""; + std::string originPath = ""; + if (!data.uri.empty()) { + std::unique_ptr iri(iri_parse(data.uri.c_str()), iri_destroy); + if (!iri.get()) { + WrtLogD("Fail to get iri"); + originScheme = ""; + originPath = ""; + } + if (iri->scheme) { + originScheme = iri->scheme; + } + if (iri->path) { + originPath = iri->path; + } + + // checking condition that mime is empthy and uri is available + if (data.mime.empty() && !data.uri.empty()) { + // checking passed uri is local file + // case 1. uri = file:///xxxx + // case 2. uri = /xxxx + if (!data.scheme.empty() && data.scheme != SCHEME_TYPE_FILE) { + WrtLogD("Passed uri isn't local file"); + } else { + const char* FILE_URI_CASE_1 = "/"; + const char* FILE_URI_CASE_2 = "file:/"; + const char* FILE_URI_CASE_3 = "file:///"; + + char mimetype[128] = {0,}; + int ret = AUL_R_EINVAL; + const char* uri_c_str = data.uri.c_str(); + + if(strncmp(uri_c_str, FILE_URI_CASE_1, 1) == 0){ + ret = aul_get_mime_from_file(uri_c_str, + mimetype, + sizeof(mimetype)); + } else if(strncmp(uri_c_str, FILE_URI_CASE_2, 6) == 0){ + ret = aul_get_mime_from_file(&uri_c_str[5], + mimetype, + sizeof(mimetype)); + } else if(strncmp(uri_c_str, FILE_URI_CASE_3, 8) == 0){ + ret = aul_get_mime_from_file(&uri_c_str[7], + mimetype, + sizeof(mimetype)); + } + + if (AUL_R_OK == ret) { + data.mime = mimetype; + } + } + } + } + + WrtDB::WidgetAppControlList appControlList = + widgetModel->AppControlList.Get(); + if (!appControlList.empty()) { + // case 0, operation only + // scheme = + // uri = + if (data.uri.empty()) { + WrtLogD("AppControl case 0 (NULL, NULL)"); + std::string src = getAppControlSrc(appControlList, data); + if (!src.empty()) { + return src; + } + return std::string(); + } + + // case 1 + // scheme = nfc + // uri = nfc:///xxx/xxx + if (!originScheme.empty()) { + data.scheme = originScheme; + WrtLogD("AppControl case 1 (file, file:///xxx/xxx)"); + std::string src = getAppControlSrc(appControlList, data); + if (!src.empty()) { + return src; + } + } + + // case 2 + // scheme = + // uri = file:///xxx/xxx + data.scheme = ""; + WrtLogD("AppControl case 2 (NULL, file:///xxx/xxx)"); + std::string src = getAppControlSrc(appControlList, data); + if (!src.empty()) { + return src; + } + + // case 3 + // scheme = file + // uri = /xxx/xxx + if (!originScheme.empty() && !originPath.empty()) { + data.scheme = originScheme; + data.uri = originPath; + WrtLogD("AppControl case 3 (file, /xxx/xxx)"); + std::string src = getAppControlSrc(appControlList, data); + if (!src.empty()) { + return src; + } + } + + // case 4 + // scheme = + // uri = /xxx/xxx + if (!originPath.empty()) { + data.scheme = ""; + data.uri = originPath; + WrtLogD("AppControl case 4 (NULL, /xxx/xxx)"); + std::string src = getAppControlSrc(appControlList, data); + if (!src.empty()) { + return src; + } + } + } + + if (!originScheme.empty()) { + WrtLogD("Scheme parts: %s, %s", originScheme.c_str(), originPath.c_str()); + return getCustomHandlerProtocolUri( + widgetModel, originScheme, originPath); + } + if (data.mime != "") { + value = appsvc_get_data(bundle, APPSVC_DATA_SELECTED); + if (value != NULL) { + WrtLogD("Use mime type for: %s", value); + return getCustomHandlerContentUri( + widgetModel, data.mime, std::string(value)); + } else { + WrtLogE("Selected file for mime is null, nothind to do"); + } + } + WrtLogD("no matching result"); + return std::string(""); +} + +std::string getUri(WidgetModel *widgetModel, const std::string &defaultUri, bool* isSelfTarget) +{ + DPL::String uri; + std::string startUri; + WrtLogD("default uri: %s", defaultUri.c_str()); + bundle *originBundle = ApplicationDataSingleton::Instance().getBundle(DPL::ToUTF8String(widgetModel->TizenId)); + + // search app-control data + startUri = getAppControlUri(originBundle, widgetModel).c_str(); + WrtLogD("app-control start uri is %s", startUri.c_str()); + if (startUri == "") { + WrtLogD("app-control data doesn't have matched data"); + startUri = defaultUri; + } else if (startUri == SELF_TARGET) { + startUri = defaultUri; + if (isSelfTarget) { + *isSelfTarget = true; + } + } + + // insert prefix path + std::string preFix = DPL::ToUTF8String(widgetModel->PrefixURL.Get()); + if (strstr(startUri.c_str(), SCHEME_TYPE_HTTP) == startUri.c_str() || + strstr(startUri.c_str(), SCHEME_TYPE_HTTPS) == startUri.c_str() || + strstr(startUri.c_str(), preFix.c_str()) == startUri.c_str()) + { + return startUri; + } else { + return preFix + startUri; + } +} + +DPL::OptionalString localizeURI(const DPL::String& inputURI, + const WidgetModel* model) +{ + auto uri = DPL::ToUTF8String(inputURI); + WrtLogD("localizing url: %s", uri.c_str()); + + auto urlcstr = uri.c_str(); + + const char *end = strstr(urlcstr, ":"); + if (!end) { + WrtLogD("no schema in link, return null"); + // lack of schema + return DPL::OptionalString(); + } + + std::string scheme(urlcstr, end); +#if ENABLE(APP_SCHEME) + if (scheme != SCHEME_TYPE_WIDGET && scheme != SCHEME_TYPE_FILE && scheme != SCHEME_TYPE_APP) { +#else + if (scheme != SCHEME_TYPE_WIDGET && scheme != SCHEME_TYPE_FILE) { +#endif + WrtLogD("scheme doesn't need to localize"); + return DPL::OptionalString(inputURI); + } + + DPL::OptionalString found = + W3CFileLocalization::getFilePathInWidgetPackageFromUrl( + model->TizenId, + DPL::FromUTF8String(uri)); + + if (!found) { + // In this case, path doesn't need to localize. return input uri + WrtLogD("Path not found within current locale in current widget"); + return DPL::OptionalString(inputURI); + } else { + DPL::String uri(L"file://" + *found); + WrtLogD("Will load resource: %ls", uri.c_str()); + WrtLogD("finished"); + return DPL::OptionalString(uri); + } +} +} // namespace UriSupportImplementation +} // namespace ViewModule diff --git a/src/view/common/view_logic_uri_support.h b/src/view/common/view_logic_uri_support.h new file mode 100644 index 0000000..4d64de5 --- /dev/null +++ b/src/view/common/view_logic_uri_support.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_uri_support.h + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @brief Header file of UriSupport API used by ViewLogic + */ + +#ifndef VIEW_LOGIC_URI_SUPPORT_H_ +#define VIEW_LOGIC_URI_SUPPORT_H_ + +#include +#include +#include + +// Forward declare +class WidgetModel; + +namespace { +// Special key for supporting app-control service base on event +const char* const SELF_TARGET = "_self"; +} + +namespace ViewModule { +namespace UriSupport { + +std::string getUri(WidgetModel *widgetModel, const std::string &defaultUri, bool* isSelfTarget=NULL); +DPL::OptionalString localizeURI(const DPL::String& inputURI, + const WidgetModel* model); +} // namespace UriSupport +} // namespace ViewModule + +#endif /* VIEW_LOGIC_URI_SUPPORT_H_ */ diff --git a/src/view/common/view_logic_vibration_support.cpp b/src/view/common/view_logic_vibration_support.cpp new file mode 100644 index 0000000..a1b728c --- /dev/null +++ b/src/view/common/view_logic_vibration_support.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_vibration_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "view_logic_vibration_support.h" +#include + +namespace ViewModule { +VibrationSupport::VibrationSupport() : m_initialized(false), + m_handle(NULL), + m_effect_handle(NULL) +{} + +VibrationSupport::~VibrationSupport() +{} + +void VibrationSupport::initialize(void) +{ + WrtLogD("initialize"); + initializeVibration(); +} + +void VibrationSupport::deinitialize(void) +{ + WrtLogD("deinitialize"); + + if (m_initialized) { + int ret = haptic_close(m_handle); + + if (HAPTIC_ERROR_NONE == ret) { + m_initialized = false; + WrtLogD("deinitialize success"); + } else { + m_initialized = true; + WrtLogD("deinitialize failed - error code : %d", ret); + } + } +} + +void VibrationSupport::startVibration(const long vibrationTime) +{ + WrtLogD("startVibration called"); + + if (m_initialized == false) { + if (initializeVibration() == false) { + return; + } + } + + int time = static_cast(vibrationTime); + int ret = haptic_vibrate_monotone(m_handle, time, &m_effect_handle); + + if (HAPTIC_ERROR_NONE == ret) { + WrtLogD("haptic_vibrate_monotone success"); + } else { + WrtLogD("haptic_vibrate_monotone failed - error code : %d", ret); + } + + return; +} + +void VibrationSupport::stopVibration(void) +{ + WrtLogD("stopVibration called"); + + if (m_initialized == false) { + if (initializeVibration() == false) { + return; + } + } + + int ret = haptic_stop_all_effects(m_handle); + + if (HAPTIC_ERROR_NONE == ret) { + WrtLogD("haptic_stop_all_effects success"); + } else { + WrtLogD("haptic_stop_all_effects failed - error code : %d", ret); + } + + return; +} + +bool VibrationSupport::initializeVibration(void) +{ + WrtLogD("initializeVibration called"); + + if (m_initialized == false) { + haptic_device_h handle = NULL; + int ret = haptic_open(HAPTIC_DEVICE_0, &handle); + + if (ret == HAPTIC_ERROR_NONE) { + WrtLogD("initializeVibration success"); + m_initialized = true; + m_handle = handle; + } else { + WrtLogD("initializeVibration failed - error code : %d", ret); + m_initialized = false; + m_handle = NULL; + } + } + + return m_initialized; +} +} // namespace ViewModule diff --git a/src/view/common/view_logic_vibration_support.h b/src/view/common/view_logic_vibration_support.h new file mode 100644 index 0000000..0a99e32 --- /dev/null +++ b/src/view/common/view_logic_vibration_support.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_vibration_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_VIBRATION_SUPPORT_H_ +#define VIEW_LOGIC_VIBRATION_SUPPORT_H_ + +#include + +namespace ViewModule { +class VibrationSupport +{ + public: + VibrationSupport(); + virtual ~VibrationSupport(); + + void initialize(); + void deinitialize(); + void startVibration(const long vibrationTime); + void stopVibration(void); + + private: + bool m_initialized; + haptic_device_h m_handle; + haptic_effect_h m_effect_handle; + + bool initializeVibration(void); +}; +} // namespace ViewModule + +#endif // VIEW_LOGIC_VIBRATION_SUPPORT_H_ diff --git a/src/view/context_manager.cpp b/src/view/context_manager.cpp new file mode 100644 index 0000000..6465bf7 --- /dev/null +++ b/src/view/context_manager.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file context_manager.cpp + * @author Andrzej Surdej (a.surdej@samsung.com) + * @version 1.0 + * @brief context getter function implementation + */ + +#include "i_context_manager.h" +#include + +namespace ViewModule { + +ContextManagerPtr contextManagerFactoryMethod( + const std::string& id, + Ewk_Context* c, + IViewModulePtr view) +{ + ContextManagerPtr ptr (new EwkContextManager(id, c, view)); + return ptr; +} + +ContextManagerFactoryMethod makeContextManagerFactoryMethod() +{ + return contextManagerFactoryMethod; +} + +} // namespace ViewModule diff --git a/src/view/i_context_manager.h b/src/view/i_context_manager.h new file mode 100644 index 0000000..8700b90 --- /dev/null +++ b/src/view/i_context_manager.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file i_context_manager.h + * @author Iwanek Tomasz (t.iwanek@samsung.com) + * @version 0.1 + * @brief Abstract file for handling operation regarding Ewk_Context. + */ + +#ifndef ABSTRACT_CONTEXT_MANAGER_H +#define ABSTRACT_CONTEXT_MANAGER_H + +#include +#include +#include +#include + +#include + +namespace ViewModule { + +class IContextManager; +typedef std::shared_ptr ContextManagerPtr; + +typedef std::function ContextManagerFactoryMethod; + +/** + * @brief The AbstractContextManager class Factory for ewk context + * + * This is interface class for ewk context factory. + * It's uses tizenId, view module to initialize it approriatly context. + * + * Constructor should create new context only if ewkContext parameter is NULL. + * If ewkContext parameter is not NULL, context should not be destroyed in destructor. + * This means used context is managed by manager only if was created internally. + * + * NOTE: This interface in not visible outside core module and it should not be. + * Reason for this code is not modify RunnableWidgetObject behaviour for mocks. + */ +class IContextManager { +public: + IContextManager( + const std::string& tizenAppId, + Ewk_Context* ewkContext, + ViewModule::IViewModulePtr viewModule) : + m_appId(tizenAppId), m_ewkContext(ewkContext), m_view(viewModule) {} + virtual ~IContextManager() {} + /** + * @brief getEwkContext returns ewk context + * @return ewk context + */ + virtual Ewk_Context* getEwkContext() const = 0; + /** + * @brief handleLowMemory + * + * Handles low memory conditions + */ + virtual void handleLowMemory() = 0; +protected: + std::string m_appId; + Ewk_Context* m_ewkContext; + IViewModulePtr m_view; +}; + +ContextManagerPtr contextManagerFactoryMethod(const std::string& id, Ewk_Context* c, IViewModulePtr view); + +ContextManagerFactoryMethod makeContextManagerFactoryMethod(); + +} // namespace ViewModule + +#endif // ABSTRACT_CONTEXT_MANAGER_H diff --git a/src/view/i_view_module.h b/src/view/i_view_module.h new file mode 100644 index 0000000..91720c5 --- /dev/null +++ b/src/view/i_view_module.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file i_view_module.h + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief Interface for ViewModule + */ + +#ifndef WRT_SRC_VIEW_I_VIEW_MODULE_H_ +#define WRT_SRC_VIEW_I_VIEW_MODULE_H_ + +#include +#include +#include +#include +#include +#include + +class WidgetModel; //FORWARD DECLARATION +namespace ViewModule { +/** \brief Interface to ViewModule. Object of IViewModule type is returned from + * ViewModuleMgr factory. + */ +class IViewModule +{ + public: + virtual bool createWebView(Ewk_Context* context, + Evas_Object* window) = 0; + virtual void prepareView(WidgetModel *, const std::string &) = 0; + virtual void showWidget() = 0; + virtual void hideWidget() = 0; + virtual void suspendWidget() = 0; + virtual void resumeWidget() = 0; + virtual void setWidgetUrl(const std::string &startUrl) = 0; + virtual void resetWidgetFromSuspend() = 0; + virtual void resetWidgetFromResume() = 0; + virtual void backward() = 0; + virtual void reloadStartPage() = 0; + virtual Evas_Object* getCurrentWebview() = 0; + virtual void fireJavascriptEvent(int event, void* data) = 0; + virtual void setUserCallbacks(const WRT::UserDelegatesPtr& cbs) = 0; + virtual void checkSyncMessageFromBundle( + const char* name, + const char* body, + char** returnData) = 0; + virtual void checkAsyncMessageFromBundle( + const char* name, + const char* body) = 0; + virtual void downloadData(const char* url) = 0; + virtual void activateVibration(bool on, uint64_t time) = 0; +}; + +typedef std::shared_ptr IViewModulePtr; + +/** + * \brief This is a function for retrieving View object. It returns a pointer + * to IViewModule object. + */ +IViewModulePtr createView(); +} //namespace + +#endif /* WRT_SRC_VIEW_I_VIEW_MODULE_H_ */ diff --git a/src/view/view_module.cpp b/src/view/view_module.cpp new file mode 100644 index 0000000..79f1993 --- /dev/null +++ b/src/view/view_module.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_module.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief getView function implementation + */ + +#include "i_view_module.h" +#include + +namespace ViewModule { +IViewModulePtr createView() +{ + IViewModulePtr ptr(new ViewLogic()); + return ptr; +} +} //namespace diff --git a/src/view/webkit/CMakeLists.txt b/src/view/webkit/CMakeLists.txt new file mode 100644 index 0000000..9279c77 --- /dev/null +++ b/src/view/webkit/CMakeLists.txt @@ -0,0 +1,117 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# @file src/view/webkit/CMakeLists.txt +# @author Pawel Sikorski (p.sikorski@samsung.com) + +GROUP_DEPS(VIEW_MODULE_DEP DEPS + dpl-dbus-efl + dpl-utils-efl + dpl-wrt-dao-ro + notification + wrt-commons-custom-handler-dao-rw + wrt-dispatch-event + wrt-plugins-ipc-message + wrt-plugin-js-overlay + wrt-popup-wrt-runner + security-core + security-client + deviced + capi-system-system-settings + efl-assist + privacy-manager-client + ) + +GROUP_DEPS(SYS_VIEW_MODULE_DEP DEPS + appsvc + capi-appfw-app-manager + eina + ewebkit2 + ) + +SET(VIEW_MODULE_SOURCES + ${PROJECT_SOURCE_DIR}/src/view/webkit/ewk_context_manager.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_authentication_challenge_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_certificate_confirm_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_geolocation_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_message_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_orientation_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_scheme_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_usermedia_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_web_notification_data.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_web_notification_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_web_notification_permission_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_web_storage_support.cpp + ${VIEW_MODULE_SOURCES} +) +IF(WRT_USE_WEBKIT_UPVERSION) +LIST(REMOVE_ITEM VIEW_MODULE_SOURCES + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_authentication_challenge_support.cpp +) +LIST(APPEND VIEW_MODULE_SOURCES + ${PROJECT_SOURCE_DIR}/src/view/webkit/view_logic_authentication_request_support.cpp +) +ENDIF(WRT_USE_WEBKIT_UPVERSION) + +SET(VIEW_MODULE_INCLUDES + ${PROJECT_SOURCE_DIR}/src/api_new + ${PROJECT_SOURCE_DIR}/src/domain + ${PROJECT_SOURCE_DIR}/src/profiling + ${PROJECT_SOURCE_DIR}/src/view + ${PROJECT_SOURCE_DIR}/src/view/webkit + ${VIEW_MODULE_DEP_INCLUDE_DIRS} +) + +ADD_DEFINITIONS( + ${VIEW_MODULE_DEP_CFLAGS} +) + +INCLUDE_DIRECTORIES(${VIEW_MODULE_INCLUDES}) + +INCLUDE_DIRECTORIES( + SYSTEM + ${SYS_VIEW_MODULE_DEP_INCLUDE_DIRS} +) + +ADD_LIBRARY(${TARGET_VIEW_MODULE_LIB} STATIC + ${VIEW_MODULE_SOURCES} +) + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +TARGET_LINK_LIBRARIES(${TARGET_VIEW_MODULE_LIB} + ${VIEW_MODULE_DEP_LIBRARIES} + ${TARGET_WRT_EVENT_LOOP_LIB} + ${PROF_LIB} +) +ELSE(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +TARGET_LINK_LIBRARIES(${TARGET_VIEW_MODULE_LIB} + ${VIEW_MODULE_DEP_LIBRARIES} + ${PROF_LIB} +) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +SET_TARGET_PROPERTIES(${TARGET_VIEW_MODULE_LIB} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +SET_TARGET_PROPERTIES(${TARGET_VIEW_MODULE_LIB} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_API_VERSION}) +SET_TARGET_PROPERTIES(${TARGET_VIEW_MODULE_LIB} PROPERTIES + COMPILE_FLAGS "-include profiling_util.h" + OUTPUT_NAME ${TARGET_VIEW_MODULE_LIB} +) + +ADD_SUBDIRECTORY(injected-bundle) diff --git a/src/view/webkit/ewk_context_manager.cpp b/src/view/webkit/ewk_context_manager.cpp new file mode 100644 index 0000000..bbc6c5a --- /dev/null +++ b/src/view/webkit/ewk_context_manager.cpp @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file ewk_context_manager.cpp + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief Implementation of EwkContextManager class. + * This file handles operation regarding Ewk_Context + */ + +#include "ewk_context_manager.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace ViewModule { +namespace { +const std::string bundlePath("/usr/lib/libwrt-injected-bundle.so"); + +//Tizen Extensible API String +const char *EXTENSIBLE_API_CSP = "csp"; +const char *EXTENSIBLE_API_BACKGROUND_MUSIC = "background,music"; +const char *EXTENSIBLE_API_SOUND_MODE = "sound,mode"; +const char *EXTENSIBLE_API_VISIBILITY_SUSPEND = "visibility,suspend"; +const char *EXTENSIBLE_API_ROTATION_LOCK = "rotation,lock"; +const char *EXTENSIBLE_API_FULL_SCREEN = "fullscreen"; +const char *EXTENSIBLE_API_BACKGROUND_VIBRATION = "background,vibration"; + +std::map defaultExtensibleAPI = { + { "mediastream,record", EINA_TRUE }, + { "rotate,camera,view", EINA_FALSE }, +#if !USE(WEB_PROVIDER_EXCEPTION_IN_EWK_CONTEXT) + { "media,volume,control", EINA_TRUE }, +#endif + { "encrypted,database", EINA_TRUE }, + { "xwindow,for,fullscreen,video", EINA_TRUE } +}; + + + +} // anonymous namespace + +EwkContextManager::EwkContextManager( + const std::string& tizenAppId, + Ewk_Context* ewkContext, + IViewModulePtr viewModule) + : IContextManager(tizenAppId, ewkContext, viewModule), + m_initialized(false), m_isInternalContext(false) +{ + if (!initialize()) { + ThrowMsg(DPL::Exception, "Fail to intialize EwkContextManager"); + } + // set ewk context callbacks + setCallbacks(); +} + +EwkContextManager::~EwkContextManager() +{ + // unset registered ewk context callbacks + unsetCallbacks(); + destroy(); +} + +Ewk_Context * EwkContextManager::getEwkContext() const +{ + return m_ewkContext; +} + +bool EwkContextManager::initialize() +{ + if (!m_ewkContext) { + m_ewkContext = ewk_context_new_with_injected_bundle_path(bundlePath.c_str()); + + if (!m_ewkContext) { + return false; + } + + m_isInternalContext = true; + } + + // cache model setting + ewk_context_cache_model_set( + m_ewkContext, + EWK_CACHE_MODEL_DOCUMENT_BROWSER); + ADD_PROFILING_POINT("WebProcess fork", "start"); + // To fork a Webprocess as soon as possible, + // the following ewk_api is called explicitly. + ewk_cookie_manager_accept_policy_set( + ewk_context_cookie_manager_get(m_ewkContext), + EWK_COOKIE_ACCEPT_POLICY_ALWAYS); + ADD_PROFILING_POINT("WebProcess fork", "stop"); + + WrtLogD("ewk_context_certificate_file_set() was called."); + const char* caCertPath = cert_svc_get_certificate_crt_file_path(); + if (caCertPath) { + ewk_context_certificate_file_set(m_ewkContext, caCertPath); + } else { + WrtLogE("cert path is null"); + } + + FOREACH(it, defaultExtensibleAPI) { + ewk_context_tizen_extensible_api_string_set(m_ewkContext, + it->first, + it->second); + } + + // ewk storage_path set + ewk_context_storage_path_reset(m_ewkContext); + + // web application dependent settings + WrtDB::WidgetDAOReadOnly dao(DPL::FromUTF8String(m_appId)); + setAutoFullscreenMode(); +#if ENABLE(CONTENT_SECURITY_POLICY) + if (dao.getSecurityModelVersion() == + WrtDB::WidgetSecurityModelVersion::WIDGET_SECURITY_MODEL_V2) + { + ewk_context_tizen_extensible_api_string_set(m_ewkContext, + EXTENSIBLE_API_CSP, + EINA_TRUE); + } +#endif + + // WidgetSettingList dependent settings + WrtDB::WidgetSettings widgetSettings; + dao.getWidgetSettings(widgetSettings); + WidgetSettingList settings(widgetSettings); + + ewk_context_tizen_extensible_api_string_set( + m_ewkContext, + EXTENSIBLE_API_BACKGROUND_MUSIC, + settings.getBackgroundSupport() == BackgroundSupport_Enable ? + EINA_TRUE : EINA_FALSE); + ewk_context_tizen_extensible_api_string_set( + m_ewkContext, + EXTENSIBLE_API_SOUND_MODE, + settings.getSoundMode() == SoundMode_Exclusive ? + EINA_TRUE : EINA_FALSE); + ewk_context_tizen_extensible_api_string_set( + m_ewkContext, + EXTENSIBLE_API_ROTATION_LOCK, + settings.getRotationValue() == Screen_AutoRotation ? + EINA_FALSE : EINA_TRUE); + + // note: EWK_EXTENSIBLE_API_VISIBILITY_SUSPEND - private package only + ewk_context_tizen_extensible_api_string_set( + m_ewkContext, + EXTENSIBLE_API_VISIBILITY_SUSPEND, + settings.getBackgroundSupport() == BackgroundSupport_Enable ? + EINA_TRUE : EINA_FALSE); + + ewk_context_tizen_extensible_api_string_set( + m_ewkContext, + EXTENSIBLE_API_BACKGROUND_VIBRATION, + settings.getBackgroundVibration() == BackgroundVibration_Enable ? + EINA_TRUE : EINA_FALSE); + + std::string pluginsPath = + WrtDB::WidgetConfig::GetWidgetNPRuntimePluginsPath( + dao.getTizenPkgId()); + + // npruntime plugins path set + WrtLogD("ewk_context_additional_plugin_path_set() : %s", pluginsPath.c_str()); + + ewk_context_additional_plugin_path_set(m_ewkContext, pluginsPath.c_str()); + + m_initialized = true; + + return true; +} + +void EwkContextManager::destroy() +{ + // only in the following case, webkit context should be deleted + if (m_initialized && m_isInternalContext) { +#if USE(WEBKIT_UPVERSION) + ewk_object_unref(m_ewkContext); +#else + ewk_context_delete(m_ewkContext); +#endif + } +} + +void EwkContextManager::setCallbacks() +{ + if (!m_initialized) { + return; + } + + ewk_context_message_from_injected_bundle_callback_set( + m_ewkContext, + messageFromInjectedBundleCallback, + this); + + ewk_context_did_start_download_callback_set( + m_ewkContext, + didStartDownloadCallback, + this); + + ewk_context_vibration_client_callbacks_set( + m_ewkContext, + vibrationClientStartCallback, + vibrationClientStopCallback, + this); +} + +void EwkContextManager::unsetCallbacks() +{ + if (!m_initialized) { + return; + } + + ewk_context_message_from_injected_bundle_callback_set( + m_ewkContext, NULL, NULL); + ewk_context_did_start_download_callback_set( + m_ewkContext, NULL, NULL); + ewk_context_vibration_client_callbacks_set( + m_ewkContext, NULL, NULL, NULL); +} + +void EwkContextManager::setAutoFullscreenMode() +{ + using namespace WrtDB; + WrtDB::WidgetDAOReadOnly dao(DPL::FromUTF8String(m_appId)); + if(!m_ewkContext) { + return; + } + std::list widgetPrivilege = dao.getWidgetPrivilege(); + bool fullscreen = false; + + FOREACH(it, widgetPrivilege) { + std::map::const_iterator result = + g_W3CPrivilegeTextMap.find(DPL::ToUTF8String(*it)); + if (result != g_W3CPrivilegeTextMap.end()) { + if (result->second == FEATURE_FULLSCREEN_MODE) { + fullscreen = true; + break; + } + } + } + ewk_context_tizen_extensible_api_string_set(m_ewkContext, + EXTENSIBLE_API_FULL_SCREEN, + fullscreen); +} + +void EwkContextManager::messageFromInjectedBundleCallback( + const char* name, + const char* body, + char** returnData, + void* clientInfo) +{ + WrtLogD("enter"); + + EwkContextManager* This = static_cast(clientInfo); + if (returnData) { + This->m_view->checkSyncMessageFromBundle(name, body, returnData); + } else { + This->m_view->checkAsyncMessageFromBundle(name, body); + } +} + +void EwkContextManager::didStartDownloadCallback(const char* downloadUrl, void* data) +{ + WrtLogD("enter"); + + EwkContextManager* This = static_cast(data); + This->m_view->downloadData(downloadUrl); +} + +void EwkContextManager::vibrationClientStartCallback(uint64_t time, void* data) +{ + WrtLogD("enter"); + + EwkContextManager* This = static_cast(data); + This->m_view->activateVibration(true, static_cast(time)); +} + +void EwkContextManager::vibrationClientStopCallback(void* data) +{ + WrtLogD("enter"); + + EwkContextManager* This = static_cast(data); + This->m_view->activateVibration(false, 0); +} + +void EwkContextManager::handleLowMemory() +{ + WrtLogD("handleLowMemory"); + + if (!m_ewkContext) { + return; + } + ewk_context_cache_clear(m_ewkContext); + ewk_context_notify_low_memory(m_ewkContext); +} + +ContextManagerPtr createEwkContextManager( + std::string& tizenAppId, + Ewk_Context* ewkContext, + ViewModule::IViewModulePtr viewModule) +{ + return ContextManagerPtr(new EwkContextManager(tizenAppId, ewkContext, viewModule)); +} + +} // namespace ViewModule diff --git a/src/view/webkit/ewk_context_manager.h b/src/view/webkit/ewk_context_manager.h new file mode 100644 index 0000000..f643c49 --- /dev/null +++ b/src/view/webkit/ewk_context_manager.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file ewk_context_manager.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief Declaration of EwkContextManager class. + * This file handles operation regarding Ewk_Context. + */ + +#ifndef EWK_CONTEXT_MANAGER_H +#define EWK_CONTEXT_MANAGER_H + +#include +#include + +#include +#include +#include +#include +#include + +namespace ViewModule { + +class EwkContextManager : public IContextManager { + public: + EwkContextManager( + const std::string& tizenAppId, + Ewk_Context* ewkContext, + ViewModule::IViewModulePtr viewModule); + Ewk_Context * getEwkContext() const; + void handleLowMemory(); + ~EwkContextManager(); + + private: + bool initialize(); + void destroy(); + void setCallbacks(); + void unsetCallbacks(); + void setAutoFullscreenMode(); + + // ewk context callback functions + static void messageFromInjectedBundleCallback( + const char* name, + const char* body, + char** returnData, + void* clientInfo); + static void didStartDownloadCallback(const char* downloadUrl, void* data); + static void vibrationClientStartCallback(uint64_t time, void* data); + static void vibrationClientStopCallback(void* data); + + // members + bool m_initialized; + bool m_isInternalContext; +}; +} // namespace ViewModule + +#endif // EWK_CONTEXT_MANAGER_H diff --git a/src/view/webkit/injected-bundle/CMakeLists.txt b/src/view/webkit/injected-bundle/CMakeLists.txt new file mode 100644 index 0000000..350882b --- /dev/null +++ b/src/view/webkit/injected-bundle/CMakeLists.txt @@ -0,0 +1,137 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# @file src/view/webkit/injected-bundle/CMakeLists.txt +# @author Lukasz Wrzosek (l.wrzosek@samsung.com) + +GROUP_DEPS(INJECTED_BUNDLE_DEP DEPS + dpl-efl + dpl-event-efl + dpl-utils-efl + dpl-wrt-dao-ro + ewebkit2 + libprivilege-control + libiri + libpcrecpp + wrt-dispatch-event + wrt-plugins-ipc-message + wrt-plugin-loading + wrt-plugin-js-overlay + pkgmgr-info + appsvc +) + +IF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + # platform's boost does not have pkg-config package, + # therefore it is using provided cmake FindBoost module to locate boost + FIND_PACKAGE(Boost COMPONENTS system filesystem) +ENDIF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + +SET(INJECTED_BUNDLE_SOURCES + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/wrt-injected-bundle.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/injected_bundle_uri_handling.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/page_global_context_container.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/injected_bundle_decryption_support.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.cpp + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.cpp + ${PROJECT_SOURCE_DIR}/src/view/common/scheme.cpp +) + +IF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + SET(INJECTED_BUNDLE_SOURCES + ${INJECTED_BUNDLE_SOURCES} + ${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.cpp + ) +ENDIF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + SET(INJECTED_BUNDLE_SOURCES + ${INJECTED_BUNDLE_SOURCES} + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/src/app_sock.cpp + ) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +SET(INJECTED_BUNDLE_INCLUDES + ${INJECTED_BUNDLE_DEP_INCLUDE_DIRS} + ${PROJECT_SOURCE_DIR}/src/view/common + ${PROJECT_SOURCE_DIR}/src/domain +) + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + SET(INJECTED_BUNDLE_INCLUDES + ${INJECTED_BUNDLE_INCLUDES} + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/include + ${WRT_LAUNCH_PAD_DEPS_INCLUDE_DIRS} + ) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +ADD_DEFINITIONS( + ${INJECTED_BUNDLE_DEP_CFLAGS} +) +INCLUDE_DIRECTORIES( + ${INJECTED_BUNDLE_INCLUDES} + ${TARGET_SMACK_LABELING_SUPPORT_INCLUDES} + ) + +IF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + INCLUDE_DIRECTORIES(${Boost_INCLUDES}) +ENDIF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + +ADD_LIBRARY(${TARGET_INJECTED_BUNDLE_LIB} SHARED + ${INJECTED_BUNDLE_SOURCES} +) + +TARGET_LINK_LIBRARIES( + ${TARGET_INJECTED_BUNDLE_LIB} + ${INJECTED_BUNDLE_DEP_LIBRARIES} + ${TARGET_WRT_ENGINE_STATIC} + ${PROF_LIB} + ${TARGET_SMACK_LABELING_SUPPORT_STATIC} +) + +IF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + TARGET_LINK_LIBRARIES(${TARGET_INJECTED_BUNDLE_LIB} ${Boost_LIBRARIES}) +ENDIF(WRT_ENABLE_BACKGROUND_THREAD_DECRYPTION) + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + TARGET_LINK_LIBRARIES(${TARGET_INJECTED_BUNDLE_LIB} + ${WRT_LAUNCH_PAD_DEPS_LIBRARIES} + "-lcap" + ) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +# for encryption +TARGET_LINK_LIBRARIES(${TARGET_INJECTED_BUNDLE_LIB} "-lss-client") + +# Overriden log tag! +SET_TARGET_PROPERTIES(${TARGET_INJECTED_BUNDLE_LIB} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="WRT_BUNDLE") + +SET_TARGET_PROPERTIES(${TARGET_INJECTED_BUNDLE_LIB} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_API_VERSION}) +SET_TARGET_PROPERTIES(${TARGET_INJECTED_BUNDLE_LIB} PROPERTIES + COMPILE_FLAGS -fPIC) +SET_TARGET_PROPERTIES(${TARGET_INJECTED_BUNDLE_LIB} PROPERTIES + LINK_FLAGS "-Wl,--as-needed -Wl,--hash-style=both -Wl,--version-script=${PROJECT_SOURCE_DIR}/src/view/webkit/injected-bundle/${TARGET_INJECTED_BUNDLE_LIB}.map" + OUTPUT_NAME ${TARGET_INJECTED_BUNDLE_LIB} +) + +INSTALL(TARGETS ${TARGET_INJECTED_BUNDLE_LIB} + DESTINATION lib/ + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) diff --git a/src/view/webkit/injected-bundle/injected_bundle_decryption_support.cpp b/src/view/webkit/injected-bundle/injected_bundle_decryption_support.cpp new file mode 100644 index 0000000..f0d5316 --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_decryption_support.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file injected_bundle_decryption_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#include "injected_bundle_decryption_support.h" + +#include + +#include +#include + +#if ENABLE(BACKGROUND_THREAD_DECRYPTION) +#include "injected_bundle_threaded_decryption_support_impl.h" +#else +#include "injected_bundle_decryption_support_impl.h" +#endif + +namespace InjectedBundle { + +DecryptionSupport::DecryptionSupport() : +#if ENABLE(BACKGROUND_THREAD_DECRYPTION) + m_impl(new BackgroundThreadedDecryptionSupportImpl()) +#else + m_impl(new DecryptionSupportImpl()) +#endif +{ +} + +DecryptionSupport::~DecryptionSupport() +{ +} + +void DecryptionSupport::initialize(const WrtDB::TizenAppId & appId) +{ + m_impl->initialize(appId); +} + +void DecryptionSupport::deinitialize(void) +{ + m_impl->deinitialize(); +} + +bool DecryptionSupport::isNeedDecryption(std::string url) +{ + return m_impl->isNeedDecryption(url); +} + +std::string DecryptionSupport::decryptResource(std::string url) +{ + return m_impl->decryptResource(url); +} + +} // namespace InjectedBundle diff --git a/src/view/webkit/injected-bundle/injected_bundle_decryption_support.h b/src/view/webkit/injected-bundle/injected_bundle_decryption_support.h new file mode 100644 index 0000000..7d64fc8 --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_decryption_support.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_decryption_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ +#ifndef INJECTED_BUNDLE_DECRYPTION_SUPPORT_H_ +#define INJECTED_BUNDLE_DECRYPTION_SUPPORT_H_ + +#include +#include + +#include +#include + +namespace InjectedBundle { +#if ENABLE(BACKGROUND_THREAD_DECRYPTION) +class BackgroundThreadedDecryptionSupportImpl; +#else +class DecryptionSupportImpl; +#endif + +class DecryptionSupport +{ + public: + DecryptionSupport(); + virtual ~DecryptionSupport(); + void initialize(const WrtDB::TizenAppId & appId); + void deinitialize(void); + bool isNeedDecryption(std::string url); + std::string decryptResource(std::string url); + + private: +#if ENABLE(BACKGROUND_THREAD_DECRYPTION) + std::unique_ptr m_impl; +#else + std::unique_ptr m_impl; +#endif +}; +} // namespace InjectedBundle + +#endif // INJECTED_BUNDLE_DECRYPTION_SUPPORT_H_ diff --git a/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.cpp b/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.cpp new file mode 100644 index 0000000..9989116 --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.cpp @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_decryption_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ +#include "injected_bundle_decryption_support_impl.h" + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +namespace { +const char * const SCHEME_FILE_SLASH = "file://"; +const char * const DATA_STRING = "data:"; +const char * const BASE64_STRING = ";base64,"; +const char QUESTION_MARK = '?'; +const char ASTERISK_MARK = '#'; +} + +namespace InjectedBundle { + +std::string DecryptionSupportImpl::getFilePath(const std::string& url) +{ + std::string filePath = url; + + size_t pos = filePath.find_first_not_of(SCHEME_FILE_SLASH); + if (pos != std::string::npos) { + filePath = filePath.substr(pos - 1); + } + + pos = filePath.find_first_of(ASTERISK_MARK); + if (pos != std::string::npos) { + filePath = filePath.substr(0, pos); + } + + pos = filePath.find_first_of(QUESTION_MARK); + if (pos != std::string::npos) { + filePath = filePath.substr(0, pos); + } + + return filePath; +} + +std::string DecryptionSupportImpl::doDecrypt(std::string filePath, int size) +{ + struct stat buf; + if (0 == stat(filePath.c_str(), &buf)) { + const std::size_t fileSize = buf.st_size; + std::unique_ptr inChunk; + + FILE* fp = fopen(filePath.c_str(), "rb"); + if (NULL == fp) { + WrtLogE("Couldnot open file : %s", filePath.c_str()); + return std::string(); + } + + std::unique_ptr DecryptedString(new unsigned + char[fileSize]); + std::string pkgid(DPL::ToUTF8String(m_appId)); + + int writeCount = 0; + do { + unsigned char getDecSize[4]; + memset(getDecSize, 0x00, sizeof(getDecSize)); + + size_t readSize = fread(getDecSize, sizeof(unsigned char), sizeof(getDecSize), fp); + if (0 != readSize) { + unsigned int readBufSize = 0; + std::istringstream(std::string((char*)getDecSize)) >> readBufSize; + if (readBufSize == 0) { + WrtLogE("Failed to read resource"); + fclose(fp); + return std::string(); + } + inChunk.reset(new unsigned char[readBufSize]); + + size_t decReadSize = fread(inChunk.get(), sizeof(unsigned char), readBufSize, fp); + + if (0 != decReadSize) { + char *outChunk = NULL; + int outSize = + ssa_decrypt_web_application((char*)inChunk.get(), + (int)decReadSize, &outChunk, m_isPreload ? 1 : 0); + if (0 >= outSize) { + WrtLogE("Failed to get decrypted resource"); + fclose(fp); + return std::string(); + } + memcpy(DecryptedString.get() + writeCount, outChunk, outSize); + writeCount += outSize; + } + } + } while (0 == std::feof(fp)); + fclose(fp); + memset(DecryptedString.get() + size, '\n', fileSize - size); + + BIO *bmem, *b64; + BUF_MEM *bptr; + + b64 = BIO_new(BIO_f_base64()); + bmem = BIO_new(BIO_s_mem()); + b64 = BIO_push(b64, bmem); + if (BIO_write(b64, DecryptedString.get(), fileSize) <= 0) { + WrtLogE("No data has been written"); + } + BIO_flush(b64); + BIO_get_mem_ptr(b64, &bptr); + + std::string base64Enc((char *)bptr->data, bptr->length - 1); + BIO_free_all(b64); + + return base64Enc; + } + return std::string(); +} + +void DecryptionSupportImpl::initialize(WrtDB::TizenAppId appId) +{ + WrtLogD("called"); + m_initialized = true; + + m_appId = appId; + WrtDB::WidgetDAOReadOnly dao(m_appId); + dao.getEncryptedFileList(m_encryptedFiles); + if (!m_encryptedFiles.empty()) { + WrtLogD("encrypted application"); + } + + bool isPreload = false; + bool isUpdate = false; + pkgmgrinfo_pkginfo_h handle = NULL; + std::string tzPkgId = DPL::ToUTF8String(dao.getTizenPkgId()); + + if (PMINFO_R_OK != pkgmgrinfo_pkginfo_get_pkginfo(tzPkgId.c_str(), &handle)) { + WrtLogE("Can't get package information : %s", tzPkgId.c_str()); + return; + } + if (PMINFO_R_OK != pkgmgrinfo_pkginfo_is_preload(handle, &isPreload)) { + WrtLogE("Can't get package information : %s", tzPkgId.c_str()); + return; + } + if (PMINFO_R_OK != pkgmgrinfo_pkginfo_is_update(handle, &isUpdate)) { + WrtLogE("Can't get package information : %s", tzPkgId.c_str()); + return; + } + + if (isPreload && !isUpdate) { + m_isPreload = true; + WrtLogD("preload application"); + } +} + +void DecryptionSupportImpl::deinitialize() +{ + WrtLogD("called"); + + m_encryptedFiles.clear(); + m_appId = DPL::String(L""); + m_initialized = false; +} + +bool DecryptionSupportImpl::isNeedDecryption(std::string url) +{ + if (!m_initialized) { + WrtLogE("not initialized"); + return false; + } + + if (0 != strncmp(url.c_str(), SCHEME_FILE_SLASH, strlen(SCHEME_FILE_SLASH))) { + return false; + } + + std::set::iterator it; + WrtDB::EncryptedFileInfo info; + std::string filePath = getFilePath(url); + info.fileName = DPL::FromUTF8String(filePath); + if (m_encryptedFiles.end() != (it = m_encryptedFiles.find(info))) { + WrtLogD(" info file name : %s", DPL::ToUTF8String(it->fileName).c_str()); + WrtLogD(" info file size : %d", it->fileSize); + return true; + } + return false; +} + +std::string DecryptionSupportImpl::decryptResource(const std::string & url) +{ + if (!m_initialized) { + WrtLogE("not initialized"); + return std::string(); + } + WrtLogD("Decrypting resource %s...", url.c_str()); + + WrtDB::EncryptedFileInfo info; + std::string filePath = getFilePath(url); + info.fileName = DPL::FromUTF8String(filePath); + auto targetIt = m_encryptedFiles.find(info); + + AssertMsg(targetIt != m_encryptedFiles.end(), "Given url is not encrypted resource"); + + std::string decryptString = + doDecrypt(DPL::ToUTF8String(targetIt->fileName), + targetIt->fileSize); + if (!decryptString.empty()) { + std::string destString = DATA_STRING; + + std::string mimeString = + DPL::ToUTF8String( + MimeTypeUtils::identifyFileMimeType( + DPL::FromUTF8String(url))); + + destString += mimeString; + destString += BASE64_STRING; + + decryptString.insert(0, destString); + } + WrtLogD("Decrypted resource %s.", url.c_str()); + return decryptString; +} + +} diff --git a/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.h b/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.h new file mode 100644 index 0000000..ffab4ea --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_decryption_support_impl.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_decryption_support_impl.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ +#ifndef INJECTED_BUNDLE_DECRYPTION_SUPPORT_IMPLEMENTATION_H +#define INJECTED_BUNDLE_DECRYPTION_SUPPORT_IMPLEMENTATION_H + +#include +#include + +#include + +namespace InjectedBundle { + +class DecryptionSupportImpl +{ + protected: + bool m_initialized; + + WrtDB::TizenAppId m_appId; + WrtDB::EncryptedFileList m_encryptedFiles; + bool m_isPreload; + + std::string getFilePath(const std::string& url); + std::string doDecrypt(std::string filePath, int size); + + public: + DecryptionSupportImpl() : + m_initialized(false), + m_isPreload(false) + { + } + + void initialize(WrtDB::TizenAppId appId); + void deinitialize(); + bool isNeedDecryption(std::string url); + std::string decryptResource(const std::string & url); +}; + +} + +#endif // INJECTED_BUNDLE_DECRYPTION_SUPPORT_IMPLEMENTATION_H diff --git a/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.cpp b/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.cpp new file mode 100644 index 0000000..a08b928 --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_plugin_interface.cpp + * @author Lukasz Marek (l.marek@samgsung.com) + * @author Yunchan Cho (yunchan.cho@samgsung.com) + * @version + * @brief + */ + +#include "injected_bundle_plugin_interface.h" + +#include +#include +#include +#include +#include + +namespace InjectedBundlePluginInterface { +void init(int widgetHandle) +{ + WrtLogD("called"); + PluginLogicSingleton::Instance().initSession(widgetHandle); +} + +void start(int widgetHandle, + JSGlobalContextRef context, + double scale, + const char *encodedBundle, + const char *theme) +{ + PluginLogicSingleton::Instance().startSession(widgetHandle, + context, + scale, + encodedBundle, + theme); +} + +void shutdown() +{ + WrtLogD("called"); + PluginLogicSingleton::Instance().performLibrariesUnload(); +} + +void stop(JSGlobalContextRef context) +{ + WrtLogD("called"); + PluginLogicSingleton::Instance().stopSession(context); +} + +void setCustomProperties(JSGlobalContextRef context, + double scale, + const char* encodedBundle, + const char* theme) +{ + WrtLogD("called"); + PluginLogicSingleton::Instance().setCustomProperties(context, + scale, + encodedBundle, + theme); +} + +void dispatchJavaScriptEvent(JSGlobalContextRef context, + WrtPlugins::W3C::CustomEventType eventType, + void* data) +{ + WrtLogD("called"); + PluginLogicSingleton::Instance().dispatchJavaScriptEvent(context, + eventType, + data); +} + +void loadFrame(JSGlobalContextRef context) +{ + WrtLogD("load frame into web page"); + PluginLogicSingleton::Instance().loadFrame(context); +} + +void unloadFrame(JSGlobalContextRef context) +{ + WrtLogD("unload frame from web page"); + PluginLogicSingleton::Instance().unloadFrame(context); +} +} // namespace InjectedBundlePluginInterface diff --git a/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.h b/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.h new file mode 100644 index 0000000..3ec10cc --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_plugin_interface.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_plugin_interface.h + * @author Lukasz Marek (l.marek@samgsung.com) + * @author Yunchan Cho (yunchan.cho@samgsung.com) + * @version + * @brief + */ + +#ifndef INJECTED_BUNDLE_PLUGIN_INTERFACE_H_ +#define INJECTED_BUNDLE_PLUGIN_INTERFACE_H_ + +#include +#include + +extern "C" { +typedef struct OpaqueJSContext* JSGlobalContextRef; +} + +namespace InjectedBundlePluginInterface { +//forward declaration +void init(int widgetHandle); +void start(int widgetHandle, + JSGlobalContextRef context, + double scale, + const char* encodedBundle, + const char* theme); +void stop(JSGlobalContextRef context); +void shutdown(); +void setCustomProperties(JSGlobalContextRef context, + double scale, + const char* encodedBundle, + const char* theme); +void dispatchJavaScriptEvent(JSGlobalContextRef context, + WrtPlugins::W3C::CustomEventType eventType, + void* data); +void loadFrame(JSGlobalContextRef context); +void unloadFrame(JSGlobalContextRef context); +} // namespace InjectedBundlePluginInterface + +#endif // INJECTED_BUNDLE_PLUGIN_INTERFACE_H_ \ No newline at end of file diff --git a/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.cpp b/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.cpp new file mode 100644 index 0000000..a7c5280 --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.cpp @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_threaded_decryption_support_impl.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @version 1.0 + */ +#include "injected_bundle_threaded_decryption_support_impl.h" + +#include +#include + +#include +#include + +namespace { +const char FILE_SCHEME[] = "file://"; +} + +namespace InjectedBundle { + +void BackgroundThreadedDecryptionSupportImpl::initialize(WrtDB::TizenAppId appId) +{ + namespace bfs = boost::filesystem; + + m_stopped = false; + DecryptionSupportImpl::initialize(appId); + + sortFilesByExtension(); + createDecryptionThreads(); +} + +void BackgroundThreadedDecryptionSupportImpl::sortFilesByExtension() +{ + namespace bfs = boost::filesystem; + namespace ba = boost::algorithm; + + FOREACH(file, m_encryptedFiles) + { + bfs::path pfile(DPL::ToUTF8String(file->fileName)); + std::string ext = pfile.extension().string(); + ba::to_lower(ext); + auto it = m_extmap.find(ext); + + // if no such an extension in extension map + if (it == m_extmap.end()) { + it = m_extmap.insert(std::make_pair(ext, FilesPerExtensionMap::mapped_type())).first; + } + + it->second.push_back(std::string(FILE_SCHEME) + DPL::ToUTF8String(file->fileName)); + } +} + +void BackgroundThreadedDecryptionSupportImpl::decryptionLoop(const std::vector &exts) +{ + std::string url; + WrtLogD("Starting decryption thread"); + FOREACH(ext, exts) + { + WrtLogD("Running decryption for extention: %s", ext->c_str()); + while (!m_stopped && nextFileForExtension(*ext, url)) + { + WrtLogD("Decrypting in background url=%s...", url.c_str()); + decryptResource(url); + WrtLogD("Decrypted in background url=%s", url.c_str()); + } + + if (m_stopped) + break; + } + WrtLogD("Ending decryption thread"); +} + +void BackgroundThreadedDecryptionSupportImpl::createDecryptionThreads() +{ + std::thread htmlDecryptor(&BackgroundThreadedDecryptionSupportImpl::decryptionLoop, this, + std::vector({".html", ".htm", ".xhtml", ".svg", ".xht"})); + + std::thread jsDecryptor(&BackgroundThreadedDecryptionSupportImpl::decryptionLoop, this, + std::vector({".js"})); + + std::thread cssDecryptor(&BackgroundThreadedDecryptionSupportImpl::decryptionLoop, this, + std::vector({".css"})); + + m_threads.push_back(std::move(htmlDecryptor)); + m_threads.push_back(std::move(jsDecryptor)); + m_threads.push_back(std::move(cssDecryptor)); +} + +void BackgroundThreadedDecryptionSupportImpl::deinitialize() +{ + // ask threads to stop + m_stopped = true; + + // wait for them + FOREACH(thread, m_threads) + { + if (thread->joinable()) + thread->join(); + } + + DecryptionSupportImpl::deinitialize(); +} + +bool BackgroundThreadedDecryptionSupportImpl::findInCacheOrRemoveFromTodo(const std::string & url, std::string & data) +{ + std::lock_guard lock(m_extlock); + + if (findInCache(url, data)) { + return true; + } + + // remove so it will not be fetch by decryption thread in future + removeFromTodoMap(url); + return false; +} + + +std::string BackgroundThreadedDecryptionSupportImpl::decryptResource(const std::string & url) +{ + std::string data; + if (findInCacheOrRemoveFromTodo(url, data)) { + return data; + } + + //not found in cache, removed from todo map -> proceed + data = DecryptionSupportImpl::decryptResource(url); + saveInCache(url, data); + + return data; +} + +bool BackgroundThreadedDecryptionSupportImpl::isNeedDecryption(std::string url) +{ + return DecryptionSupportImpl::isNeedDecryption(url); +} + +bool BackgroundThreadedDecryptionSupportImpl::findInCache(const std::string & url, std::string & data) +{ + std::lock_guard lock(m_lock); + auto it = m_scache.find(url); + if (it == m_scache.end()) { + WrtLogD("Decryption cache - file not found: %s", url.c_str()); + return false; + } + + // file found in cache + data = it->second; + WrtLogD("Decryption cache - file present: %s", url.c_str()); + + return true; +} + +void BackgroundThreadedDecryptionSupportImpl::saveInCache(std::string url, std::string data) +{ + namespace bfs = boost::filesystem; + auto pair = std::make_pair(std::move(url), std::move(data)); + std::lock_guard lock(m_lock); + m_scache.insert(pair); +} + +void BackgroundThreadedDecryptionSupportImpl::removeFromTodoMap(const std::string & url) +{ + namespace bfs = boost::filesystem; + namespace ba = boost::algorithm; + + // remove from input positions + std::string ext = bfs::path(url).extension().string(); + ba::to_lower(ext); + m_extmap[ext].remove(url); +} + +bool BackgroundThreadedDecryptionSupportImpl::nextFileForExtension(const std::string & ext, std::string & url) +{ + std::lock_guard lock(m_extlock); + if (m_extmap[ext].empty()) { + return false; + } + + FilesPerExtensionMap::mapped_type & list = m_extmap[ext]; + url = list.front(); + list.pop_front(); + return true; +} + +} diff --git a/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.h b/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.h new file mode 100644 index 0000000..b4e1dbc --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_threaded_decryption_support_impl.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_threaded_decryption_support_impl.h + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @version 1.0 + */ +#ifndef INJECTED_BUNDLE_THREADED_DECRYPTION_SUPPORT_IMPLEMENTATION_H +#define INJECTED_BUNDLE_THREADED_DECRYPTION_SUPPORT_IMPLEMENTATION_H + +#include +#include +#include +#include +#include +#include +#include + +#include "injected_bundle_decryption_support_impl.h" + +namespace InjectedBundle { + +//decryption support with background threads +class BackgroundThreadedDecryptionSupportImpl : private DecryptionSupportImpl +{ +public: + void initialize(WrtDB::TizenAppId appId); + void deinitialize(); + + std::string decryptResource(const std::string & url); + bool isNeedDecryption(std::string url); + +private: + typedef std::map DataSchemeCache; + typedef std::map > FilesPerExtensionMap; + typedef std::vector DecryptionThreadWrapperStorage; + + bool findInCacheOrRemoveFromTodo(const std::string & url, std::string & data); + bool findInCache(const std::string & url, std::string & data); + void saveInCache(std::string url, std::string data); + /** + * @brief removeFromTodoMap + * @param url url (with scheme) + */ + void removeFromTodoMap(const std::string & url); + /** + * @brief nextFileForExtension + * + * Returns next file to be decrypted for given extension + * + * @param ext extension to be checked + * @param url url (with scheme) to be decrypted + * @return true if output parameter was set + */ + bool nextFileForExtension(const std::string & ext, std::string & url); + + void sortFilesByExtension(); + void createDecryptionThreads(); + + void decryptionLoop(const std::vector & exts); + + std::mutex m_lock; //do not make them locked at same time by one thread + std::mutex m_extlock; + DataSchemeCache m_scache; // files that have been cached + FilesPerExtensionMap m_extmap; // files to be cached + DecryptionThreadWrapperStorage m_threads; + std::atomic m_stopped; +}; + +} + +#endif // INJECTED_BUNDLE_THREADED_DECRYPTION_SUPPORT_IMPLEMENTATION_H diff --git a/src/view/webkit/injected-bundle/injected_bundle_uri_handling.cpp b/src/view/webkit/injected-bundle/injected_bundle_uri_handling.cpp new file mode 100644 index 0000000..e507e18 --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_uri_handling.cpp @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file injected_bundle_uri_handling.cpp + * @author Marcin Kaminski (marcin.ka@samsung.com) + * @version 1.0 + */ + +#include "injected_bundle_uri_handling.h" + +#include +#include +#include + +#include +#include +#include +// For dao creation (widget info fetching) +#include +#include +// URI localization +#include +// WARP check +#include +#include +// allow-navigation check +#include +#include + +namespace { +char const * const SCHEME_TYPE_FILE = "file"; +char const * const SCHEME_TYPE_WIDGET = "widget"; +char const * const SCHEME_TYPE_APP = "app"; +char const * const SCHEME_TYPE_HTTP = "http"; +char const * const PARAM_URL = "param:url"; +char const * const ACE_IGNORED_SCHEMA[] = { + "file://", + "widget://", +#if ENABLE(APP_SCHEME) + "app://", +#endif + "data:", + "tel:", + "sms:", + "mmsto:", + "mailto:", + 0 }; + +bool wildcardCompare(std::string wildcardString, std::string target) +{ + std::string re = wildcardString; + + // replace special character to meaning character + pcrecpp::RE("\\\\").GlobalReplace("\\\\\\\\", &re); + pcrecpp::RE("\\.").GlobalReplace("\\\\.", &re); + pcrecpp::RE("\\+").GlobalReplace("\\\\+", &re); + pcrecpp::RE("\\?").GlobalReplace("\\\\?", &re); + pcrecpp::RE("\\^").GlobalReplace("\\\\^", &re); + pcrecpp::RE("\\$").GlobalReplace("\\\\$", &re); + pcrecpp::RE("\\[").GlobalReplace("\\\\[", &re); + pcrecpp::RE("\\]").GlobalReplace("\\\\]", &re); + pcrecpp::RE("\\{").GlobalReplace("\\\\{", &re); + pcrecpp::RE("\\}").GlobalReplace("\\\\}", &re); + pcrecpp::RE("\\(").GlobalReplace("\\\\(", &re); + pcrecpp::RE("\\)").GlobalReplace("\\\\)", &re); + pcrecpp::RE("\\|").GlobalReplace("\\\\|", &re); + + // replace wildcard character to regex type + pcrecpp::RE("\\*").GlobalReplace(".*", &re); + + return pcrecpp::RE(re).FullMatch(target); +} + +bool checkWARP(const char *url, const DPL::String& tizenId) +{ + // ignore WARP in test mode + if (GlobalSettings::WarpTestModeEnabled()) { + return true; + } + + if (WarpIRI::isIRISchemaIgnored(url)) { + // scheme is not supported by WARP + return true; + } + + WrtDB::WidgetDAOReadOnly dao = WrtDB::WidgetDAOReadOnly(tizenId); + WrtDB::WidgetAccessInfoList widgetAccessInfoList; + dao.getWidgetAccessInfo(widgetAccessInfoList); + + // temporary solution for libiri parsing error + // This code will be removed + std::string urlstr = url; + size_t pos = urlstr.find_first_of("#?"); + if (pos != std::string::npos) { + urlstr = urlstr.substr(0, pos); + } + + return (static_cast(widgetAccessInfoList)).isRequiredIRI( + DPL::FromUTF8String(urlstr)); +} + +bool checkWhitelist(const char *url) +{ + if (url == NULL) { + return true; + } + + std::unique_ptr iri(iri_parse(url), iri_destroy); + if (!iri->scheme || !iri->host || strlen(iri->host) == 0) { + return true; + } + std::string scheme = iri->scheme; + std::string host = iri->host; + + if (scheme.find(SCHEME_TYPE_HTTP) == std::string::npos) { + return true; + } + + return false; +} + +bool checkAllowNavigation(const char *url, const DPL::String& tizenId) +{ + if (url == NULL) { + return true; + } + + std::unique_ptr iri(iri_parse(url), iri_destroy); + if (!iri->scheme || !iri->host || strlen(iri->host) == 0) { + return true; + } + std::string scheme = iri->scheme; + std::string host = iri->host; + + if (scheme.find(SCHEME_TYPE_HTTP) == std::string::npos) { + return true; + } + + WrtDB::WidgetDAOReadOnly dao = WrtDB::WidgetDAOReadOnly(tizenId); + WrtDB::WidgetAllowNavigationInfoList list; + dao.getWidgetAllowNavigationInfo(list); + + FOREACH(it, list) { + if (wildcardCompare(DPL::ToUTF8String(it->scheme), scheme) && + wildcardCompare(DPL::ToUTF8String(it->host), host)) + { + return true; + } + } + WrtLogE("deny"); + return false; +} + +bool preventSymlink(const std::string & url) +{ + if(0 != strncmp(url.c_str(), SCHEME_TYPE_FILE, strlen(SCHEME_TYPE_FILE))) + { + return true; + } + + if(url.size() >= strlen(SCHEME_TYPE_FILE) + 3) + { + std::string file = url.substr(strlen(SCHEME_TYPE_FILE) + 3); + struct stat st; + if(0 != stat(file.c_str(), &st)) return true; + return !S_ISLNK(st.st_mode); + } + else + { + return true; + } +} +} // namespace (anonymous) + +namespace InjectedBundleURIHandling { +bool processURI(const std::string& inputURI, + const DPL::String& tizenId, + WrtDB::WidgetSecurityModelVersion version) +{ + if (version == WrtDB::WidgetSecurityModelVersion::WIDGET_SECURITY_MODEL_V1) + { + if (!checkWARP(inputURI.c_str(), tizenId)) { + WrtLogE("Request was blocked by WARP: %s", inputURI.c_str()); + return false; + } + } + + // disable for performance + // if (!preventSymlink(inputURI)) { + // WrtLogW("Request for symlink is invalid: %s", inputURI.c_str()); + // return false; + //} + + return true; +} + +bool processURI(const DPL::String& inputURI, + const DPL::String& tizenId, + WrtDB::WidgetSecurityModelVersion version) +{ + DPL::OptionalString optionalUri(inputURI); + if (!optionalUri) { + WrtLogD("uri is empty"); + return true; + } + + std::string uri = DPL::ToUTF8String(inputURI); + return processURI(uri, tizenId, version); +} + +bool processMainResource(const DPL::String& inputURI, + const DPL::String& tizenId, + WrtDB::WidgetSecurityModelVersion version) +{ + DPL::OptionalString optionalUri(inputURI); + if (!optionalUri) { + WrtLogD("uri is empty"); + return true; + } + + std::string uri = DPL::ToUTF8String(inputURI); + if (version == + WrtDB::WidgetSecurityModelVersion::WIDGET_SECURITY_MODEL_V1) + { + if (!checkWARP(uri.c_str(), tizenId)) { + WrtLogE("Request was blocked by WARP: %s", uri.c_str()); + return false; + } + } else if (version == + WrtDB::WidgetSecurityModelVersion::WIDGET_SECURITY_MODEL_V2) + { +#if ENABLE(ALLOW_NAVIGATION) + if (!checkAllowNavigation(uri.c_str(), tizenId)) { + WrtLogE("Request was blocked by allow-navigation: %s", uri.c_str()); + return false; + } +#else + return false; +#endif + } + + // disable for performance + // if (!preventSymlink(uri)) { + // WrtLogW("Request for symlink is invalid: %s", uri.get().c_str()); + // return false; + // } + return true; +} + +bool processURIForPlugin(const char* url) +{ + return checkWhitelist(url); +} + +std::string localizeURI(const std::string& inputURI, const std::string& tizenId) +{ + if (inputURI.compare(0, strlen(SCHEME_TYPE_WIDGET), SCHEME_TYPE_WIDGET) && + inputURI.compare(0, strlen(SCHEME_TYPE_FILE), SCHEME_TYPE_FILE) && + inputURI.compare(0, strlen(SCHEME_TYPE_APP), SCHEME_TYPE_APP)) + { + WrtLogD("scheme doesn't need to localize"); + return inputURI; + } + + std::string localizedURI = W3CFileLocalization::getFilePathInWidgetPackageFromUrl(tizenId, inputURI); + + if (localizedURI.empty()) { + return inputURI; + } else { + return std::string("file://") + localizedURI; + } +} + +DPL::OptionalString localizeURI(const DPL::String& inputURI, + const DPL::String& tizenId) +{ + std::string uri = DPL::ToUTF8String(inputURI); + const char* urlcstr = uri.c_str(); + const char *end = strstr(urlcstr, ":"); + if (!end) { + WrtLogW("no schema in link, return null"); + return DPL::OptionalString(); + } + std::string scheme(urlcstr, end); + +#if ENABLE(APP_SCHEME) + if (scheme != SCHEME_TYPE_WIDGET && scheme != SCHEME_TYPE_FILE && scheme != SCHEME_TYPE_APP) { +#else + if (scheme != SCHEME_TYPE_WIDGET && scheme != SCHEME_TYPE_FILE) { +#endif + WrtLogD("scheme doesn't need to localize"); + return DPL::OptionalString(inputURI); + } + + DPL::OptionalString found = + W3CFileLocalization::getFilePathInWidgetPackageFromUrl( + tizenId, + DPL::FromUTF8String(uri)); + + if (!found) { + // In this case, path doesn't need to localize. return input uri + WrtLogW("Path not found within current locale in current widget"); + return DPL::OptionalString(inputURI); + } else { + DPL::String uri(L"file://" + *found); + WrtLogD("Will load resource: %s", DPL::ToUTF8String(uri).c_str()); + return DPL::OptionalString(uri); + } +} +} // namespace InjectedBundleURIHandling diff --git a/src/view/webkit/injected-bundle/injected_bundle_uri_handling.h b/src/view/webkit/injected-bundle/injected_bundle_uri_handling.h new file mode 100644 index 0000000..b981c3d --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_uri_handling.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_uri_handling.h + * @author Marcin Kaminski (marcin.ka@samsung.com) + * @version 1.0 + */ +#ifndef INJECTED_BUNDLE_URI_HANDLING_H_ +#define INJECTED_BUNDLE_URI_HANDLING_H_ + +#include +#include +#include + +namespace InjectedBundleURIHandling { +bool processURI(const DPL::String& inputURI, + const DPL::String& tizenId, + WrtDB::WidgetSecurityModelVersion m_securityModelVersion); +bool processURI(const std::string& inputURI, + const DPL::String& tizenId, + WrtDB::WidgetSecurityModelVersion version); +bool processMainResource(const DPL::String& inputURI, + const DPL::String& tizenId, + WrtDB::WidgetSecurityModelVersion m_securityModelVersion); +bool processURIForPlugin(const char* url); +DPL::OptionalString localizeURI(const DPL::String& inputURI, + const DPL::String& tizenId); +std::string localizeURI(const std::string& inputURI, const std::string& tizenId); +} + +#endif // INJECTED_BUNDLE_URI_HANDLING_H_ diff --git a/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.cpp b/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.cpp new file mode 100644 index 0000000..902006a --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.cpp @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file injected_bundle_viewmodes_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#include "injected_bundle_viewmodes_support.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace InjectedBundle { +namespace { +const std::string VIEWMODE_TYPE_MAXIMIZED = "maximized"; +const std::string VIEWMODE_TYPE_FULLSCREEN = "fullscreen"; +const std::string VIEWMODE_TYPE_WINDOWED = "windowed"; + +typedef std::set SupportViewmodesSet; +SupportViewmodesSet g_supportViewmodes = {VIEWMODE_TYPE_MAXIMIZED, + VIEWMODE_TYPE_FULLSCREEN, + VIEWMODE_TYPE_WINDOWED}; +} + +//Implementation class +class ViewmodesSupportImplementation +{ + private: + typedef std::map ViewmodesMap; + typedef ViewmodesMap::iterator ViewmodesIt; + + bool m_initialized; + + WrtDB::TizenAppId m_appId; + WrtDB::WindowModeList m_modeList; + ViewmodesMap m_initialViewmodeMap; + ViewmodesMap m_currentViewmodeMap; + + bool isExisted(WKBundlePageRef page) + { + ViewmodesIt viewmodeIt = m_initialViewmodeMap.find(page); + if (viewmodeIt == m_initialViewmodeMap.end()) { + return false; + } + return true; + } + + std::string getChangedViewmode(void) + { + if (!m_currentViewmodeMap.empty()) { + ViewmodesIt curIt = m_currentViewmodeMap.begin(); + ViewmodesIt initIt = m_initialViewmodeMap.begin(); + if (curIt->second != initIt->second) { + return curIt->second; + } + } + return std::string(); + } + + bool isSupportViewmode(const std::string& mode) + { + if (g_supportViewmodes.find(mode) == g_supportViewmodes.end()) { + return false; + } + return true; + } + + public: + ViewmodesSupportImplementation(WrtDB::TizenAppId appId) : + m_initialized(false), + m_appId(appId) + { + WrtDB::WidgetDAOReadOnly dao(m_appId); + m_modeList = dao.getWindowModes(); + + m_initialized = true; + } + + void initialize(WKBundlePageRef page) + { + WrtLogD("initialize"); + if (!m_initialized) { + Assert(false); + } + + if (isExisted(page)) { + WrtLogW("This page is already initialized"); + return; + } + + // set initial viewmode from manifest + std::string initViewmode = VIEWMODE_TYPE_MAXIMIZED; + FOREACH(it, m_modeList) { + std::string mode = DPL::ToUTF8String(*it); + if (g_supportViewmodes.find(mode) != g_supportViewmodes.end()) { + initViewmode = mode; + } + } + m_initialViewmodeMap[page] = initViewmode; + + // In case of current viewmode of chrome is changed, + // set to changed viewmode + std::string currentViewmode = getChangedViewmode(); + if (currentViewmode.empty()) { + currentViewmode = initViewmode; + } + m_currentViewmodeMap[page] = currentViewmode; + + WKBundlePageSetViewMode(page, + WKStringCreateWithUTF8CString( + currentViewmode.c_str())); + } + + void deinitialize(WKBundlePageRef page) + { + WrtLogD("deinitialize"); + if (!m_initialized) { + Assert(false); + } + m_initialViewmodeMap.erase(page); + m_currentViewmodeMap.erase(page); + } + + void setViewmodes(WKBundlePageRef page, const std::string& mode) + { + if (!m_initialized) { + Assert(false); + } + + m_currentViewmodeMap[page] = mode; + WKBundlePageSetViewMode(page, + WKStringCreateWithUTF8CString( + mode.c_str())); + } + + void enterViewmodesAllPages(const std::string& mode) + { + WrtLogD("setViewmodesAllPages"); + if (!m_initialized) { + Assert(false); + } + if (!isSupportViewmode(mode)) { + WrtLogW("Wrong viewmode : %s", mode.c_str()); + return; + } + + FOREACH(it, m_currentViewmodeMap) { + setViewmodes(it->first, mode); + } + } + + void exitViewmodes(WKBundlePageRef page) + { + if (!m_initialized) { + Assert(false); + } + + std::string mode = m_initialViewmodeMap[page]; + m_currentViewmodeMap[page] = mode; + WKBundlePageSetViewMode(page, + WKStringCreateWithUTF8CString( + mode.c_str())); + } + + void exitViewmodesAllPages(void) + { + WrtLogD("exitViewmodesAllPages"); + if (!m_initialized) { + Assert(false); + } + + FOREACH(it, m_currentViewmodeMap) { + exitViewmodes(it->first); + } + } +}; + +ViewmodesSupport::ViewmodesSupport(WrtDB::TizenAppId appId) : + m_impl(new ViewmodesSupportImplementation(appId)) +{ +} + +ViewmodesSupport::~ViewmodesSupport() +{ +} + +void ViewmodesSupport::initialize(WKBundlePageRef page) +{ + m_impl->initialize(page); +} + +void ViewmodesSupport::deinitialize(WKBundlePageRef page) +{ + m_impl->deinitialize(page); +} + +void ViewmodesSupport::enterViewmodesAllPages(const std::string& mode) +{ + m_impl->enterViewmodesAllPages(mode); +} + +void ViewmodesSupport::exitViewmodesAllPages(void) +{ + m_impl->exitViewmodesAllPages(); +} +} // namespace InjectedBundle diff --git a/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.h b/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.h new file mode 100644 index 0000000..da1521b --- /dev/null +++ b/src/view/webkit/injected-bundle/injected_bundle_viewmodes_support.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file injected_bundle_viewmodes_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ +#ifndef INJECTED_BUNDLE_VIEWMODES_SUPPORT_H_ +#define INJECTED_BUNDLE_VIEWMODES_SUPPORT_H_ + +#include +#include + +#include + +namespace InjectedBundle { +class ViewmodesSupportImplementation; + +class ViewmodesSupport +{ + public: + ViewmodesSupport(WrtDB::TizenAppId appId); + virtual ~ViewmodesSupport(); + void initialize(WKBundlePageRef page); + void deinitialize(WKBundlePageRef page); + void enterViewmodesAllPages(const std::string& mode); + void exitViewmodesAllPages(void); + private: + std::unique_ptr m_impl; +}; +} // namespace InjectedBundle + +#endif // INJECTED_BUNDLE_VIEWMODES_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/webkit/injected-bundle/page_global_context_container.cpp b/src/view/webkit/injected-bundle/page_global_context_container.cpp new file mode 100644 index 0000000..343fb03 --- /dev/null +++ b/src/view/webkit/injected-bundle/page_global_context_container.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file page_global_context_container.cpp + * @author Tomasz Iwanek (t.iwanek@smasung.com) + * @brief Declares container for global context that holds its references + */ +#include "page_global_context_container.h" + +#include + +PageGlobalContextContainer::PageGlobalContextContainer() +{ +} + +PageGlobalContextContainer::~PageGlobalContextContainer() +{ + FOREACH(iter, m_map) + { + JSGlobalContextRelease(iter->second); + } +} + +void PageGlobalContextContainer::insertContextForPage(WKBundlePageRef page, JSGlobalContextRef context) +{ + PageGlobalContext::iterator iter = m_map.find(page); + if(iter != m_map.end()) + { + JSGlobalContextRelease(m_map[page]); + } + JSGlobalContextRetain(context); + m_map[page] = context; +} + +void PageGlobalContextContainer::removeContextForPage(WKBundlePageRef page) +{ + PageGlobalContext::iterator iter = m_map.find(page); + if(iter != m_map.end()) + { + JSGlobalContextRelease(m_map[page]); + } + m_map.erase(iter); +} + +JSGlobalContextRef PageGlobalContextContainer::getContextForPage(WKBundlePageRef page) const +{ + return m_map.find(page)->second; +} + +PageGlobalContextContainer::const_iterator PageGlobalContextContainer::begin() const +{ + return m_map.begin(); +} +PageGlobalContextContainer::const_iterator PageGlobalContextContainer::find(WKBundlePageRef ref) const +{ + return m_map.find(ref); +} +PageGlobalContextContainer::const_iterator PageGlobalContextContainer::end() const +{ + return m_map.end(); +} diff --git a/src/view/webkit/injected-bundle/page_global_context_container.h b/src/view/webkit/injected-bundle/page_global_context_container.h new file mode 100644 index 0000000..1ef3499 --- /dev/null +++ b/src/view/webkit/injected-bundle/page_global_context_container.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file page_global_context_container.h + * @author Tomasz Iwanek (t.iwanek@smasung.com) + * @brief Declares container for global context that holds its references + */ +#ifndef PAGE_GLOBAL_CONTEXT_CONTAINER_H +#define PAGE_GLOBAL_CONTEXT_CONTAINER_H + +#include + +#include +#include + +/** + * @brief The PageGlobalContextContainer class + * + * Container for global contexts that increments reference for holded elements + */ +class PageGlobalContextContainer +{ +public: + typedef std::map PageGlobalContext; + typedef PageGlobalContext::iterator iterator; + typedef PageGlobalContext::const_iterator const_iterator; + typedef PageGlobalContext::value_type value_type; + + PageGlobalContextContainer(); + ~PageGlobalContextContainer(); + + PageGlobalContextContainer(const PageGlobalContextContainer&) = delete; + PageGlobalContextContainer& operator=(const PageGlobalContextContainer&) = delete; + + void insertContextForPage(WKBundlePageRef page, JSGlobalContextRef context); + void removeContextForPage(WKBundlePageRef page); + /** + * @brief getContextForPage gets context for given page + * @param page wk page + * Page should be valid for container. + * If you don't know if page is present in container use find + * + * @return context + */ + JSGlobalContextRef getContextForPage(WKBundlePageRef page) const; + + const_iterator begin() const; + const_iterator find(WKBundlePageRef ref) const; + const_iterator end() const; +private: + PageGlobalContext m_map; +}; + +#endif // PAGE_GLOBAL_CONTEXT_CONTAINER_H diff --git a/src/view/webkit/injected-bundle/wrt-injected-bundle.cpp b/src/view/webkit/injected-bundle/wrt-injected-bundle.cpp new file mode 100644 index 0000000..c6f1425 --- /dev/null +++ b/src/view/webkit/injected-bundle/wrt-injected-bundle.cpp @@ -0,0 +1,1260 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file wrt-injected-bundle.cpp + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @brief Implementation file for injected bundle + */ +#include "wrt-injected-bundle.h" + +#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 +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#include +#include +#include +#endif + +// URI localization on WebProcess side +#include "injected_bundle_uri_handling.h" +#include "injected_bundle_decryption_support.h" +#include "injected_bundle_plugin_interface.h" +#include "injected_bundle_viewmodes_support.h" + +namespace { +const char SCHEME_HTTP[] = "http"; +const char SCHEME_HTTPS[] = "https"; +const char SCHEME_FILE[] = "file"; +const char SCHEME_FILE_SLASH[] = "file://"; +const char SCHEME_BOX_SLASH[] = "box://"; +const char BLANK_PAGE_URL[] = "about:blank"; +const char SRC_DOC_PAGE_URL[] = "about:srcdoc"; +const char HTML_MIME[] = "text/html"; +const char PHP_MIME[] = "application/x-php"; +const char WRT_WILL_SEND_REQUEST_LOG_ENABLE[] = "WRT_WILL_SEND_REQUEST_LOG_ENABLE"; +const std::size_t FILE_BUF_MAX_SIZE = 1024; // bytes +const std::size_t PLAIN_CHUNK_SIZE = 1008; // bytes +const unsigned int UID_ROOT = 0; +const unsigned int DEFAULT_PRIORITY = 0; +const char PRIVILEGE_APP_TYPE[] = "wgt"; +#if ENABLE(CORS_WHITELISTING) +const char * const warpAllowProtocolsForWildcard[] = { "http", "https" }; +#endif +} +#if ENABLE(ONE_UI_PROCESS_MODEL) +extern "C" void aul_finalize(); +#endif // ENABLE(ONE_UI_PROCESS_MODEL) + +Bundle::Bundle(WKBundleRef bundle) : + m_bundle(bundle), + m_scale(0), + m_encodedBundle(""), + m_theme(""), + m_willRemoveContext(NULL), + m_securityModelVersion( + WrtDB::WidgetSecurityModelVersion::WIDGET_SECURITY_MODEL_V1), + m_initialized(false), + m_decryptionSupport(new InjectedBundle::DecryptionSupport()) +{ + Try { + LOG_PROFILE_START("Bundle attachToThread"); + WrtDB::WrtDatabase::attachToThreadRO(); + LOG_PROFILE_STOP("Bundle attachToThread"); + } Catch (DPL::DB::SqlConnection::Exception::Base) { + WrtLogE("## Db attach was failed! Terminate WebProcess by force. ##"); + exit(-1); + } +} + +Bundle::~Bundle() +{ + m_decryptionSupport->deinitialize(); + + WrtDB::WrtDatabase::detachFromThread(); + + if (!m_pagesList.empty()) { + WrtLogE("There are not closed pages!"); + } + WKRelease(m_bundle); +} + +#if ENABLE(ONE_UI_PROCESS_MODEL) +int Bundle::aul_handler(aul_type type, + bundle *b, + void *data) +{ + WrtLogD("aul_handler called"); + int ret; + int dataLen; + + if (b) { + if (!bundle_get_val(b, AUL_K_PKG_NAME)) { + Bundle *This = (Bundle *)data; + bundle_add(b, AUL_K_PKG_NAME, DPL::ToUTF8String(This->m_widgetTizenId).c_str()); + } + } else { + b = bundle_create(); + Bundle *This = (Bundle *)data; + bundle_add(b, AUL_K_PKG_NAME, DPL::ToUTF8String(This->m_widgetTizenId).c_str()); + } + + bundle_raw *bundleData; + bundle_encode(b, &bundleData, &dataLen); + switch (type) { + case AUL_START: + WrtLogD("Aul_handler AUL_START"); + ret = SendMessagetoUI(APP_START, bundleData, dataLen); + break; + case AUL_RESUME: + WrtLogD("Aul_handler AUL_RESUME"); + ret = SendMessagetoUI(APP_RESUME, bundleData, dataLen); + break; + case AUL_TERMINATE: + WrtLogD("Aul_handler AUL_TERMINATE"); + ret = SendMessagetoUI(APP_TERM_BY_PID, bundleData, dataLen); + break; + default: + WrtLogD("Aul_handler Invalid Message"); + /* do nothing */ + break; + } + return 0; +} + +void Bundle::initAULCommunication(std::string appPath, int argc, char** argv) +{ + WrtLogD("initAULCommunication"); + if (aul_launch_init(aul_handler, this) < 0) { + WrtLogE("aul_launch_init() failed"); + } else { + free(argv[0]); + argv[0] = strdup(appPath.c_str()); + aul_launch_argv_handler(argc, argv); + } +} + +void Bundle::dropProcessPoolCapability() +{ + WrtLogD("called"); + cap_user_header_t header; + cap_user_data_t data; + + header = static_cast(malloc(sizeof(*header))); + data = static_cast(calloc(sizeof(*data), _LINUX_CAPABILITY_U32S_3)); + + // check if header and data is allocated normally + Assert(header && data); + + header->pid = getpid(); + header->version = _LINUX_CAPABILITY_VERSION_3; + + // read already granted capabilities of this process + if (capget(header, data) < 0) { + free(header); + free(data); + WrtLogE("capget failed!"); + return; + } + + // remove process capability for CAP_MAC_ADMIN + data[CAP_TO_INDEX(CAP_MAC_ADMIN)].inheritable &= ~CAP_TO_MASK(CAP_MAC_ADMIN); + data[CAP_TO_INDEX(CAP_MAC_ADMIN)].permitted &= ~CAP_TO_MASK(CAP_MAC_ADMIN); + data[CAP_TO_INDEX(CAP_MAC_ADMIN)].effective &= ~CAP_TO_MASK(CAP_MAC_ADMIN); + + if (capset(header, data) < 0) + WrtLogE("capset failed!"); + + free(header); + free(data); +} + +void Bundle::changeProcessPoolSmackLabel(const std::string& appPath) +{ + // check if this process is launched as abnormal way + char *currentExecutablePath = (char *)appPath.c_str(); + WrtLogD("currentExecutablePath: %s", currentExecutablePath); + char* newLabel = NULL; + if (smack_lgetlabel(currentExecutablePath, &newLabel, SMACK_LABEL_EXEC) < 0){ + WrtLogE("smack_lgetlabel failed"); + dropProcessPoolCapability(); + return; + } + + if (smack_set_label_for_self(newLabel) < 0) + WrtLogE("smack_set_label_for_self failed"); + + free(newLabel); + dropProcessPoolCapability(); +} +#endif // ENABLE(ONE_UI_PROCESS_MODEL) + +void Bundle::didCreatePageCallback( + WKBundleRef /*bundle*/, + WKBundlePageRef page, + const void* clientInfo) +{ + LOG_PROFILE_START("didCreatePageCallback"); + Bundle* This = static_cast(const_cast(clientInfo)); + This->didCreatePage(page); + LOG_PROFILE_STOP("didCreatePageCallback"); +} + +void Bundle::didReceiveMessageCallback( + WKBundleRef /*bundle*/, + WKStringRef messageName, + WKTypeRef messageBody, + const void *clientInfo) +{ + Bundle* bundle = static_cast(const_cast(clientInfo)); + bundle->didReceiveMessage(messageName, messageBody); +} + +void Bundle::willDestroyPageCallback( + WKBundleRef /*bundle*/, + WKBundlePageRef page, + const void* clientInfo) +{ + Bundle* This = static_cast(const_cast(clientInfo)); + This->willDestroyPage(page); +} + +void Bundle::didCreatePage(WKBundlePageRef page) +{ + if (!m_initialized) + { + WrtLogE("## Injected-bundle was not initialized! Terminate WebProcess by force. ##"); + willDestroyPage(page); + exit(-1); + } + + auto mainFrame = WKBundlePageGetMainFrame(page); + auto context = WKBundleFrameGetJavaScriptContext(mainFrame); + m_pagesList.push_back(page); + m_pageGlobalContext.insertContextForPage(page, context); + WrtLogD("created Page and JSContext"); + m_viewmodesSupport->initialize(page); + + WKBundlePageResourceLoadClient resourceLoadClient = { + kWKBundlePageResourceLoadClientCurrentVersion, /* version */ + this, /* clientinfo */ + 0, /* didInitiateLoadForResource */ + willSendRequestForFrameCallback, /* willSendRequestForFrame */ + 0, /* didReceiveResponseForResource */ + 0, /* didReceiveContentLengthForResource */ + 0, /* didFinishLoadForResource */ + 0, /* didFailLoadForResource */ + 0, /* shouldCacheResponse */ + 0, /* shouldUseCredentialStorage */ + }; + WKBundlePageSetResourceLoadClient(page, &resourceLoadClient); + + WKBundlePageLoaderClient loaderClient = { + kWKBundlePageLoaderClientCurrentVersion, + this, /* clientinfo */ + didStartProvisionalLoadForFrameCallback, /* didStartProvisionalLoadForFrame */ + 0, /* didReceiveServerRedirectForProvisionalLoadForFrame */ + 0, /* didFailProvisionalLoadWithErrorForFrame */ + didCommitLoadForFrameCallback, /* didCommitLoadForFrame */ + 0, /* didFinishDocumentLoadForFrame */ + 0, /* didFinishLoadForFrame */ + 0, /* didFailLoadWithErrorForFrame */ + 0, /* didSameDocumentNavigationForFrame */ + 0, /* didReceiveTitleForFrame */ + 0, /* didFirstLayoutForFrame */ + 0, /* didFirstVisuallyNonEmptyLayoutForFrame */ + didRemoveFrameFromHierarchyCallback, /* didRemoveFrameFromHierarchy */ + 0, /* didDisplayInsecureContentForFrame */ + 0, /* didRunInsecureContentForFrame */ + 0, /* didClearWindowObjectForFrame */ + 0, /* didCancelClientRedirectForFrame */ + 0, /* willPerformClientRedirectForFrame */ + 0, /* didHandleOnloadEventsForFrame */ + 0, /* didLayoutForFrame */ + 0, /* didNewFirstVisuallyNonEmptyLayout */ + 0, /* didDetectXSSForFrame */ + 0, /* shouldGoToBackForwardListItem */ + 0, /* globalObjectIsAvailableForFrame */ + 0, /* willDisconnectDOMWindowExtensionFromGlobalObject */ + 0, /* didReconnectDOMWindowExtensionToGlobalObject */ + 0, /* willDestroyGlobalObjectForDOMWindowExtension */ + 0, /* didFinishProgress */ + 0, /* shouldForceUniversalAccessFromLocalURL */ + 0, /* didReceiveIntentForFrame */ + 0, /* registerIntentServiceForFrame */ + }; + WKBundlePageSetPageLoaderClient(page, &loaderClient); + + + WKBundlePagePolicyClient policyClient = { + kWKBundlePagePolicyClientCurrentVersion, /* version */ + this, /* clientInfo */ + decidePolicyForNavigationActionCallback, /* decidePolicyForNavigationAction */ + decidePolicyForNewWindowActionCallback, /* decidePolicyForNavigationAction */ + decidePolicyForResponseCallback, /* decidePolicyForResponse */ + 0, /* unableToImplementPolicy */ + }; + WKBundlePageSetPolicyClient(page, &policyClient); +} + +void Bundle::willDestroyPage(WKBundlePageRef page) +{ + WrtLogD("Destroyed page"); + + auto context = m_pageGlobalContext.getContextForPage(page); + m_pagesList.remove(page); + m_pageGlobalContext.removeContextForPage(page); + m_pageContext[page].erase(context); + m_viewmodesSupport->deinitialize(page); + + InjectedBundlePluginInterface::unloadFrame(context); + InjectedBundlePluginInterface::stop(context); +} + +void Bundle::fixWKMessageArgs(std::string & argScale, + std::string & argEncodedBundle, + std::string & argTheme) +{ + if (argScale != "null" && argScale[0] == '_') { + argScale.erase(0, 1); + + std::stringstream ssScale(argScale); + ssScale >> m_scale; + } + + if (argEncodedBundle != "null" && argEncodedBundle[0] == '_') { + argEncodedBundle.erase(0, 1); + + m_encodedBundle = argEncodedBundle; + } + + if (argTheme != "null" && argTheme[0] == '_') { + argTheme.erase(0, 1); + + m_theme = argTheme; + } +} + +#if ENABLE(CORS_WHITELISTING) +void Bundle::bypassCORSforWARPAccessList(WrtDB::WidgetDAOReadOnly & dao) +{ + // bypassing CORS using origin whitelist + WrtDB::WidgetAccessInfoList WAList; + dao.getWidgetAccessInfo(WAList); + FOREACH(it, WAList) + { + const WrtDB::WidgetAccessInfo & access = *it; + WKURLRef url = WKURLCreateWithUTF8CString(DPL::ToUTF8String(access.strIRI).c_str()); + +#if ENABLE(APP_SCHEME) + std::string source = std::string("app://") + DPL::ToUTF8String(m_widgetTizenId) + "/"; +#else + std::string source = DPL::ToUTF8String(dao.getFullPath()); +#endif + + WrtLogD("WARP to WK whitelist position: %s for %s subDomains: %d", + source.c_str(), + DPL::ToUTF8String(access.strIRI).c_str(), + access.bSubDomains); + + WKStringRef wkSource = WKStringCreateWithUTF8CString(source.c_str()); + WKStringRef wkHost; + WKStringRef wkProtocol; + if(access.strIRI == L"*") + { + //wildcard force to explicitly say which protocol is used + // passed wkHost if empty means wildcard -> allow everything but protocol has to be set. + for(unsigned i = 0; i < sizeof(warpAllowProtocolsForWildcard) / sizeof(char*); i++) + { + wkHost = WKStringCreateWithUTF8CString(""); + wkProtocol = WKStringCreateWithUTF8CString(warpAllowProtocolsForWildcard[i]); + WKBundleAddOriginAccessWhitelistEntry(m_bundle, + wkSource, wkProtocol, wkHost, access.bSubDomains); + } + } + else + { + wkHost = WKURLCopyHostName(url); + wkProtocol = WKURLCopyScheme(url); + WKBundleAddOriginAccessWhitelistEntry(m_bundle, + wkSource, wkProtocol, wkHost, access.bSubDomains); + } + + WKRelease(wkHost); + WKRelease(wkProtocol); + WKRelease(wkSource); + } +} +#endif + +#if ENABLE(ONE_UI_PROCESS_MODEL) +static int getInitMessage(std::string inputBuffer, char ***argv) +{ + std::stringstream ssMsg(inputBuffer); + std::string argcStr; + ssMsg >> argcStr; + std::string::size_type sz; + int argc = std::stoi(argcStr, &sz); + + std::string output; + *argv = (char**)calloc(argc + 1, sizeof(char*)); + for (int ittr = 0; ittr < argc; ++ittr) { + ssMsg >> output; + (*argv)[ittr] = strdup(output.c_str()); + } + return argc; +} + +static void decodeAndSendReply(std::string inputBuffer) +{ + if (inputBuffer.empty()) { + return; + } + WrtLogD("Input = %s", inputBuffer.c_str()); + std::stringstream ssMsg(inputBuffer); + // Extract port number + std::string portNum; + ssMsg >> portNum; + + // Extract the argv count + std::string argcStr; + ssMsg >> argcStr; + std::string::size_type sz; + int argc = std::stoi(argcStr, &sz); + + // Generate argv from string buffer to create bundle + std::string output; + char **argv; + argv = (char**)calloc(argc + 1, sizeof(char*)); + for (int ittr = 0; ittr < argc; ++ittr) { + ssMsg >> output; + argv[ittr] = strdup(output.c_str()); + } + bundle* b = bundle_import_from_argv(argc, argv); + + // Free argv as bundle got created + if (argv) { + for (int ittr = 0; ittr < argc; ++ittr) { + free(argv[ittr]); + } + free(argv); + } + + bundle* request = NULL; + if (appsvc_create_result_bundle(b, &request) != APPSVC_RET_OK) { + WrtLogW("Fail to create result bundle"); + return; + } + + if (appsvc_add_data(request, "port", portNum.c_str()) != APPSVC_RET_OK) { + WrtLogW("Fail to add data"); + bundle_free(request); + return; + } + + if (appsvc_send_result(request, APPSVC_RES_OK) != APPSVC_RET_OK) { + WrtLogW("Fail to send result"); + bundle_free(request); + return; + } + + bundle_free(request); + return; +} +#endif + +void Bundle::didReceiveMessage(WKStringRef messageName, WKTypeRef messageBody) +{ + WrtLogD("message name: %s", toString(messageName).c_str()); + if (WKStringIsEqualToUTF8CString(messageName, + Message::ToInjectedBundle::START)) + { + if (!messageBody || WKStringGetTypeID() != WKGetTypeID(messageBody)) { + WrtLogE("Wrong message format received, ignoring"); + return; + } + + std::string msgString = + toString(static_cast(messageBody)); + WrtLogD("message body: %s", msgString.c_str()); + // set information from ui process + std::stringstream ssMsg(msgString); + std::string argScale; + std::string argEncodedBundle; + std::string argTheme; + + std::string id; + ssMsg >> id; + m_widgetTizenId = DPL::FromASCIIString(id); + + ssMsg >> argScale; + ssMsg >> argEncodedBundle; + ssMsg >> argTheme; + + // ** Language tags setting completed ** + fixWKMessageArgs(argScale, argEncodedBundle, argTheme); + } else if (WKStringIsEqualToUTF8CString(messageName, + Message::ToInjectedBundle::SHUTDOWN)) + { + if (m_pagesList.empty()) { + WrtLogD("shutdown plugins"); + InjectedBundlePluginInterface::shutdown(); + } else { + WrtLogD("InjectedBundlePluginInterface shutdown ignored, there are still alive pages!"); + } +#if ENABLE(ONE_UI_PROCESS_MODEL) + // TODO: WebProcess does not disappear even Ewk_Context is removed + // Need to check by Webkit team + ecore_main_loop_quit(); +#endif + } + else if (WKStringIsEqualToUTF8CString(messageName, + Message::ToInjectedBundle::SET_CUSTOM_PROPERTIES)) + { + // set information from ui process + std::string msgString = + toString(static_cast(messageBody)); + WrtLogD("message body: %s", msgString.c_str()); + std::string argScale; + std::string argEncodedBundle; + std::string argTheme; + + std::stringstream ssMsg(msgString); + ssMsg >> argScale; + ssMsg >> argEncodedBundle; + ssMsg >> argTheme; + + fixWKMessageArgs(argScale, argEncodedBundle, argTheme); + + //apply for each context + PageGlobalContextContainer::const_iterator it = m_pageGlobalContext.begin(); + for (; it != m_pageGlobalContext.end(); ++it) { + InjectedBundlePluginInterface::setCustomProperties(it->second, + m_scale, + m_encodedBundle.c_str(), + m_theme.c_str()); + } + } else if (WKStringIsEqualToUTF8CString( + messageName, + Message::ToInjectedBundle::DISPATCH_JS_EVENT)) + { + WrtLogD("dispatch javascript event to created frames"); + using namespace WrtPlugins::W3C; + + // set information from ui process + std::string text = toString(static_cast(messageBody)); + int eventType; + SoftKeyboardChangeArgs softKeyboardArgs; + + std::stringstream ss(text); + ss >> eventType; + + if (eventType == SoftKeyboardChangeCustomEvent) + { + ss >> softKeyboardArgs.state; + ss >> softKeyboardArgs.width; + ss >> softKeyboardArgs.height; + } + + //apply for each context + PageGlobalContextContainer::const_iterator it = m_pageGlobalContext.begin(); + + for (; it != m_pageGlobalContext.end(); ++it) + { + if (eventType == SoftKeyboardChangeCustomEvent) + { + DispatchEventSupport::dispatchSoftKeyboardChangeEvent(it->second, + softKeyboardArgs.state, + softKeyboardArgs.width, + softKeyboardArgs.height); + } + } + } else if (WKStringIsEqualToUTF8CString( + messageName, + Message::ToInjectedBundle::INIT)) + { + if (!m_initialized) { + WrtLogD("initialize"); + std::string msgString = toString(static_cast(messageBody)); +#if ENABLE(ONE_UI_PROCESS_MODEL) + char **argv; + int argc = getInitMessage(msgString, &argv); + m_widgetTizenId = DPL::FromASCIIString(std::string(argv[0])); +#else + m_widgetTizenId = DPL::FromASCIIString(msgString); +#endif + WrtDB::WidgetDAOReadOnly dao(m_widgetTizenId); + + using namespace WrtDB::GlobalConfig; + + std::string appPath; + std::string tzAppId = DPL::ToUTF8String(dao.getTizenAppId()); + std::string tzPkgId = DPL::ToUTF8String(dao.getTizenPkgId()); + DPL::OptionalString installedPath = dao.getWidgetInstalledPath(); + if (!installedPath) { + appPath = std::string(GetUserInstalledWidgetPath()) + "/" + + tzPkgId + GetUserWidgetExecPath() + "/" + tzAppId; + } else { + appPath = DPL::ToUTF8String(*installedPath) + + GetUserWidgetExecPath() + "/" + tzAppId; + } + + // process pool - set app_privilige + if (UID_ROOT == getuid()) { + + WrtLogD("set_app_smack_label(%s)", appPath.c_str()); + if (set_app_smack_label(appPath.c_str()) != 0) { + WrtLogE("set_app_smack_label() failed"); + } + + WrtLogD("perm_app_set_privilege(%s)", appPath.c_str()); + perm_app_set_privilege(tzPkgId.c_str(), PRIVILEGE_APP_TYPE, appPath.c_str()); + + // set process name + const int PR_NAME_LENGTH = 16; + std::string processName = tzAppId.substr(0, PR_NAME_LENGTH); + prctl(PR_SET_NAME, processName.c_str()); + } else { + char procName[17]; + prctl(PR_GET_NAME, procName, 0L, 0L, 0L); + if (!strcmp(procName,"WebProcess")) { + // set process name + const int PR_NAME_LENGTH = 16; + std::string tzAppId = DPL::ToUTF8String(dao.getTizenAppId()); + std::string processName = tzAppId.substr(0, PR_NAME_LENGTH); + prctl(PR_SET_NAME, processName.c_str()); + } + } +#if ENABLE(ONE_UI_PROCESS_MODEL) + changeProcessPoolSmackLabel(appPath); + initAULCommunication(appPath, argc, argv); + if (argv) { + for (int ittr = 0; ittr < argc; ++ittr) { + free(argv[ittr]); + } + free(argv); + } +#endif + /* This type of message is received when widget is restarting + * (proably in other situation too). Widget restart can be + * called after system language change so language tags have to + * be recreated here. + * Do NOT MOVE LanguageTags reset before m_widgetHandle initialization + */ + // reset language tags (create new tags based on system locales) + LanguageTagsProviderSingleton::Instance().resetLanguageTags(); + DPL::OptionalString defaultLocale = dao.getDefaultlocale(); + if (!!defaultLocale) { + LanguageTagsProviderSingleton::Instance().addWidgetDefaultLocales( + *defaultLocale); + } + LanguageTags tags = + LanguageTagsProviderSingleton::Instance().getLanguageTags(); + WrtLogD("Current widget locales (language tags):"); + FOREACH(it, tags) { + WrtLogD("Locale: %s", DPL::ToUTF8String(*it).c_str()); + } + + WrtLogD("Preload PluginLogicSingleton"); + InjectedBundlePluginInterface::init(WrtDB::WidgetDAOReadOnly::getHandle(m_widgetTizenId)); + WrtLogD("Preload PluginLogicSingleton_end"); + + m_securityModelVersion = dao.getSecurityModelVersion(); +#if ENABLE(CORS_WHITELISTING) + bypassCORSforWARPAccessList(dao); +#endif + m_decryptionSupport->initialize(m_widgetTizenId); + m_viewmodesSupport.reset( + new InjectedBundle::ViewmodesSupport(m_widgetTizenId)); + m_initialized = true; + } else { + WrtLogD("already initalized"); + } + } else if (WKStringIsEqualToUTF8CString( + messageName, + Message::ToInjectedBundle::SET_XWINDOW_HANDLE)) + { + std::string msgString = + toString(static_cast(messageBody)); +#if 0 // sub mode disable + WrtLogD("set x window handle [%s]", msgString.c_str()); + IPCMessageSupport::setXwindowHandle(atoi(msgString.c_str())); +#else + WrtLogD("sub mode is disabled, set x window handle [NULL]"); +#endif + + } else if (WKStringIsEqualToUTF8CString( + messageName, + Message::ToInjectedBundle::SET_VIEWMODES)) + { + std::string msgBody = + toString(static_cast(messageBody)); + WrtLogD("set viewmode to [%s]", msgBody.c_str()); + if (msgBody == Message::ToInjectedBundle::SET_VIEWMODES_MSGBODY_EXIT) { + m_viewmodesSupport->exitViewmodesAllPages(); + } else { + m_viewmodesSupport->enterViewmodesAllPages(msgBody); + } + } + else if (WKStringIsEqualToUTF8CString(messageName, IPCMessageSupport::REPLY_ASYNC)) + { + using namespace IPCMessageSupport; + + std::string msgBody = toString(static_cast(messageBody)); + + if (msgBody.find_first_of('_') != std::string::npos) { + std::string strHandle = msgBody.substr(0, msgBody.find_first_of('_')); + std::string strBody = msgBody.substr(msgBody.find_first_of('_')+1); + + WrtLogD("handle: %s, , Body: %s", strHandle.c_str(), strBody.c_str()); + + int handle = atoi(strHandle.c_str()); + + AsyncConnectionPtr connection = AsyncConnectionManager::instance().getConnection(handle); + + if (connection) { + if (connection->replyCallback) { + WrtLogD("connection->replyCallback()"); + (connection->replyCallback)(handle, connection->data, strBody.c_str()); + } + + AsyncConnectionManager::instance().removeConnection(handle); + } else { + WrtLogD("Connection is not available. Ignored."); + } + } + } +#if ENABLE(ONE_UI_PROCESS_MODEL) + else if (WKStringIsEqualToUTF8CString(messageName, Message::ToInjectedBundle::RESET_AUL_CONNECTION)) + { + WrtLogD("reset aul connection"); + aul_finalize(); + aul_launch_init(aul_handler, this); + } else if (WKStringIsEqualToUTF8CString(messageName, Message::ToInjectedBundle::REPLY_CLIENT)) { + WrtLogD("Send Reply to ide client"); + std::string msgBody = toString(static_cast(messageBody)); + decodeAndSendReply(msgBody); + } +#endif +} + +WKURLRequestRef Bundle::willSendRequestForFrameCallback( + WKBundlePageRef /*page*/, + WKBundleFrameRef /*frame*/, + uint64_t /*resourceIdentifier*/, + WKURLRequestRef request, + WKURLResponseRef /*response*/, + const void *clientInfo) +{ + Bundle* This = static_cast(const_cast(clientInfo)); + WKURLRequestRef ret = This->willSendRequestForFrame(request); + + return ret; +} + +void Bundle::didStartProvisionalLoadForFrameCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKTypeRef* /*userData*/, + const void *clientInfo) +{ + WrtLogD("called"); + Bundle* This = static_cast(const_cast(clientInfo)); + + if (This->m_pageGlobalContext.find(page) == This->m_pageGlobalContext.end()) { + return; + } + if (This->m_pageContext.count(page) == 0) { + return; + } + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); + + ContextSet::iterator i = This->m_pageContext[page].find(context); + + if (i == This->m_pageContext[page].end()) { + WrtLogD("Initially attached frame"); + return; + } + + This->m_pageContext[page].erase(i); + This->m_willRemoveContext = context; +} + +void Bundle::didRemoveFrameFromHierarchyCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKTypeRef* /*userData*/, + const void *clientInfo) +{ + WrtLogD("called"); + Bundle* This = static_cast(const_cast(clientInfo)); + + if (This->m_pageContext.count(page) == 0) { + WrtLogD("his->m_pageContext.count(page) == 0"); + return; + } + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); + + ContextSet::iterator i = This->m_pageContext[page].find(context); + + if (i == This->m_pageContext[page].end()) { + WrtLogW("Tried to unload frame which has never been loaded"); + return; + } + + This->m_pageContext[page].erase(i); + + InjectedBundlePluginInterface::unloadFrame(context); +} + +void Bundle::didFinishLoadForResourceCallback( + WKBundlePageRef /*page*/, + WKBundleFrameRef /*frame*/, + uint64_t /*resourceIdentifier*/, + const void* /*clientInfo*/) +{ + WrtLogD("called"); +} + +void Bundle::didCommitLoadForFrameCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKTypeRef* /*userData*/, + const void *clientInfo) +{ + WrtLogD("called"); + LOG_PROFILE_START("didCommitLoadForFrameCallback"); + Bundle* This = static_cast(const_cast(clientInfo)); + + WKURLRef url = WKBundleFrameCopyURL(frame); + + if (url == NULL) { + WrtLogW("url is NULL"); + return; + } + + if (This->m_willRemoveContext) { + InjectedBundlePluginInterface::unloadFrame(This->m_willRemoveContext); + This->m_willRemoveContext = NULL; + } + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); + + This->m_pageContext[page].insert(context); + std::string urlStr = toString(url); + + if (WKBundleFrameIsMainFrame(frame)) { + WrtLogD("Main frame"); + if(This->m_pageGlobalContext.find(page) != This->m_pageGlobalContext.end()) + { + WrtLogD("Previous context: %p", This->m_pageGlobalContext.getContextForPage(page)); + InjectedBundlePluginInterface::stop(This->m_pageGlobalContext.getContextForPage(page)); + } + WrtLogD("New context: %p", context); + //note that since we need old context for unloading plugins it must be sotred + //custom container take care of increamenting and decrementing references + This->m_pageGlobalContext.insertContextForPage(page, context); + } + + if(InjectedBundleURIHandling::processURIForPlugin(urlStr.c_str())){ + WrtLogD("start plugin"); + LOG_PROFILE_START("InjectedBundlePluginInterface start"); + InjectedBundlePluginInterface::start( + WrtDB::WidgetDAOReadOnly::getHandle(This->m_widgetTizenId), + context, + This->m_scale, + This->m_encodedBundle.c_str(), + This->m_theme.c_str() ); + LOG_PROFILE_STOP("InjectedBundlePluginInterface start"); + + InjectedBundlePluginInterface::loadFrame(context); + } + LOG_PROFILE_STOP("didCommitLoadForFrameCallback"); +} + +WKBundlePagePolicyAction Bundle::decidePolicyForNavigationActionCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKBundleNavigationActionRef navigationAction, + WKURLRequestRef request, + WKTypeRef* userData, + const void* clientInfo) +{ + WrtLogD("called"); + Bundle* This = static_cast(const_cast(clientInfo)); + return This->decidePolicyForAction(false, + page, + frame, + navigationAction, + request, + userData); +} + +WKBundlePagePolicyAction Bundle::decidePolicyForNewWindowActionCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKBundleNavigationActionRef navigationAction, + WKURLRequestRef request, + WKStringRef /*frameName*/, + WKTypeRef* userData, + const void* clientInfo) +{ + WrtLogD("called"); + Bundle* This = static_cast(const_cast(clientInfo)); + return This->decidePolicyForAction(true, + page, + frame, + navigationAction, + request, + userData); +} + +WKBundlePagePolicyAction Bundle::decidePolicyForResponseCallback( + WKBundlePageRef /* page */, + WKBundleFrameRef /* frame */, + WKURLResponseRef response, + WKURLRequestRef /* request */, + WKTypeRef* /* userData */, + const void* /* clientInfo */) +{ + WrtLogD("called"); + Assert(response); + WKStringRef contentTypeRef = WKURLResponseEflCopyContentType(response); + + std::string contentType = toString(contentTypeRef); + WrtLogD("contentTypeRef : %s", contentType.c_str()); + WKRelease(contentTypeRef); + + if (contentType == HTML_MIME) { + WrtLogD("Accepting HTML_MIME type"); + return WKBundlePagePolicyActionUse; + } + if (contentType == PHP_MIME) { + WrtLogD("Accepting php type"); + return WKBundlePagePolicyActionUse; + } + + return WKBundlePagePolicyActionPassThrough; +} + +WKURLRequestRef Bundle::willSendRequestForFrame(WKURLRequestRef request) +{ + static bool logEnable = (getenv(WRT_WILL_SEND_REQUEST_LOG_ENABLE) != NULL); + + WKURLRef wkUrl = WKURLRequestCopyURL(request); + WKStringRef wkStr = WKURLCopyString(wkUrl); + + std::string stdUrl = Bundle::toString(wkStr); + std::string localizedUrl; + + WKRelease(wkStr); + WKRelease(wkUrl); + + if (logEnable){ WrtLogD("willSendRequestForFrame : %s", stdUrl.c_str()); } + + std::string scheme = stdUrl.substr(0, stdUrl.find_first_of(':')); + +#if ENABLE(APP_SCHEME) + if (scheme == SCHEME_FILE) { + WrtLogE("File schema blocked for: %s", stdUrl.c_str()); + return NULL; + } +#endif + + // "about:blank"/"about:srcdoc" uri doesn't need uri processing. + if (stdUrl == BLANK_PAGE_URL || stdUrl == SRC_DOC_PAGE_URL) { + WKRetain(request); + return request; + } + + localizedUrl = InjectedBundleURIHandling::localizeURI(stdUrl, DPL::ToUTF8String(m_widgetTizenId)); + bool ret = InjectedBundleURIHandling::processURI(localizedUrl, m_widgetTizenId, m_securityModelVersion); + + if (!ret) { + WrtLogD("Not permitted resource: %s", localizedUrl.c_str()); + return NULL; + } + + // log disabled for performance + scheme = localizedUrl.substr(0, localizedUrl.find_first_of(':')); + + // Return value must contain details information of input + // WKURLRequestRef. Current webkit2 doesn't support api that + // copy WKURLRequestRef or change url only. Before webkit2 + // support api, callback return original WKURLRequestRef in the + // case of external scheme + + // external scheme also need to send message to UI process for + // checking roaming and security + + if (scheme == SCHEME_HTTP || scheme == SCHEME_HTTPS) { + if (logEnable){ WrtLogD("external scheme return original WKURLRequestRef"); } + WKRetain(request); + + return request; + } else { + std::string checkUrl = localizedUrl; + + if (m_decryptionSupport->isNeedDecryption(checkUrl)) { + std::string decryptString = + m_decryptionSupport->decryptResource(checkUrl); + + if (logEnable){ WrtLogD("return value : %s", decryptString.c_str()); } + + WKURLRef destUrl = + WKURLCreateWithUTF8CString(decryptString.c_str()); + WKURLRequestRef req = WKURLRequestCreateWithWKURL(destUrl); + WKRelease(destUrl); + + return req; + } + } + + WKURLRef newUrl = WKURLCreateWithUTF8CString(localizedUrl.c_str()); + WKURLRequestRef req = WKURLRequestCreateWithWKURL(newUrl); + WKRelease(newUrl); + + if (logEnable){ WrtLogD("return value : %s", localizedUrl.c_str()); } + + return req; +} + +WKBundlePagePolicyAction Bundle::decidePolicyForAction( + bool isNewWindow, + WKBundlePageRef /* page */, + WKBundleFrameRef frame, + WKBundleNavigationActionRef /* navigationAction */, + WKURLRequestRef request, + WKTypeRef* /* userData */) +{ + using namespace ViewModule; + using namespace ViewModule::SchemeActionMap; + + char const * const TIZEN_SCHEME = "tizen"; + + std::string request_uri = toString(request); + + WrtLogD("request uri : %s", request_uri.c_str()); + + // exception uri + if (request_uri == BLANK_PAGE_URL) { + return WKBundlePagePolicyActionUse; + } + + // in case of box scheme, unconditionally PassThrough should be returned + if (!request_uri.compare(0, 6, SCHEME_BOX_SLASH)) { + return WKBundlePagePolicyActionPassThrough; + } + + DPL::String dplUrl = DPL::FromUTF8String(request_uri); + bool ret = + InjectedBundleURIHandling::processMainResource(dplUrl, + m_widgetTizenId, + m_securityModelVersion); + if (!ret) { + std::string blockedUrl = DPL::ToUTF8String(dplUrl); + WrtLogD("URI is blocked: %s", blockedUrl.c_str()); + + // Send information about blocked URI to UIProcess + WKStringRef urlStr = WKStringCreateWithUTF8CString(blockedUrl.c_str()); + WKStringRef blockMessage = + WKStringCreateWithUTF8CString(Message::ToUIProcess::BLOCKED_URL); + WKBundlePostMessage(m_bundle, blockMessage, urlStr); + WKRelease(urlStr); + WKRelease(blockMessage); + return WKBundlePagePolicyActionPassThrough; + } + + // get scheme string + std::string request_scheme = getScheme(request_uri); + + // is tizen schem? + if (request_scheme == TIZEN_SCHEME) { + return WKBundlePagePolicyActionPassThrough; + } + + // scheme action + Scheme scheme(request_scheme); + Scheme::Type type = scheme.GetType(); + if (type < Scheme::FILE || type >= Scheme::COUNT) { + WrtLogD("Unknown scheme : %s", request_scheme.c_str()); + return WKBundlePagePolicyActionPassThrough; + } + + bool mainFrame = WKBundleFrameIsMainFrame(frame); + NavigationContext ctx = mainFrame ? TOP_LEVEL : FRAME_LEVEL; + if (isNewWindow) { + ctx = NEW_WINDOW; + } + + UriAction action = g_tizenActionMap[type][ctx]; + WrtLogD("Scheme type: %d, Navigation context: %d, Action: %d", + type, + ctx, + action); + + if (action != URI_ACTION_WRT) { + return WKBundlePagePolicyActionPassThrough; + } + + return WKBundlePagePolicyActionUse; +} + +std::string Bundle::toString(WKStringRef str) +{ + if (WKStringIsEmpty(str)) { + return ""; + } else { + size_t size = WKStringGetMaximumUTF8CStringSize(str); + + char buffer[size + 1]; + WKStringGetUTF8CString(str, buffer, sizeof(buffer)); + + return buffer; + } +} + +std::string Bundle::toString(WKURLRef url) +{ + WKStringRef urlStr = WKURLCopyString(url); + std::string str = toString(urlStr); + WKRelease(urlStr); + return str; +} + +std::string Bundle::toString(WKURLRequestRef req) +{ + WKURLRef reqUrl = WKURLRequestCopyURL(req); + std::string str = toString(reqUrl); + WKRelease(reqUrl); + return str; +} + +std::string Bundle::toString(WKErrorRef err) +{ + WKStringRef domErr = WKErrorCopyDomain(err); + WKStringRef desc = WKErrorCopyLocalizedDescription(err); + std::string str = toString(domErr) + "\n" + toString(desc); + WKRelease(domErr); + WKRelease(desc); + return str; +} + +std::string Bundle::getScheme(std::string uri) +{ + std::size_t found = uri.find(':'); + std::string str; + + if (found != std::string::npos) { + str = uri.substr(0, found); + } + + return str; +} + +#if ENABLE(ONE_UI_PROCESS_MODEL) +int Bundle::SendMessagetoUI(int cmd, unsigned char *data, int dataLen) +{ + int uiProcessPid = getppid(); + WrtLogD("SendMessagetoUI uiProcessPid = %d cmd = %d, datalen = %d", uiProcessPid, cmd, dataLen); + return __app_send_raw(WRT_LAUNCHPAD_PID, cmd, data, dataLen); +} +#endif + +extern "C" +{ +WK_EXPORT +void WKBundleInitialize(WKBundleRef bundle, + WKTypeRef) +{ + WrtLogD("Bundle initialized"); + +#if ENABLE(ONE_UI_PROCESS_MODEL) + if (0 != setpgid(0, getpid())) { + WrtLogE("Fail to set PGID"); + } +#endif + DPL::Event::GetMainEventDispatcherInstance().ResetCrossEventCallHandler(); + WrtLogD("ResetCrossEventCallHandler()"); + + static Bundle s_bundle(bundle); + + WKBundleClient client = { + kWKBundleClientCurrentVersion, + &s_bundle, + &Bundle::didCreatePageCallback, + &Bundle::willDestroyPageCallback, + 0, /* didInitializePageGroup */ + &Bundle::didReceiveMessageCallback + }; + WKBundleSetClient(bundle, &client); + + // process pool - restore process priority + if (UID_ROOT == getuid()) { + setpriority(PRIO_PROCESS, 0, DEFAULT_PRIORITY); + } + IPCMessageSupport::setWKBundleRef(bundle); +} +} diff --git a/src/view/webkit/injected-bundle/wrt-injected-bundle.h b/src/view/webkit/injected-bundle/wrt-injected-bundle.h new file mode 100644 index 0000000..5d6e287 --- /dev/null +++ b/src/view/webkit/injected-bundle/wrt-injected-bundle.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file wrt-injected-bundle.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief declare injected bundle + */ +#ifndef WRT_SRC_VIEW_WEBKIT_WRT_INJECTED_BUNDLE_H_ +#define WRT_SRC_VIEW_WEBKIT_WRT_INJECTED_BUNDLE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "page_global_context_container.h" +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#endif + +extern "C" { +WK_EXPORT void WKBundleInitialize(WKBundleRef bundle, WKTypeRef); +} + +namespace InjectedBundle { +class DecryptionSupport; +class ViewmodesSupport; +} + +class Bundle +{ + public: + Bundle(WKBundleRef bundle); + ~Bundle(); + + Bundle(const Bundle&) = delete; + Bundle& operator=(const Bundle&) = delete; + + // WKBundleClient callback + static void didCreatePageCallback( + WKBundleRef bundle, + WKBundlePageRef page, + const void* clientInfo); + static void willDestroyPageCallback( + WKBundleRef bundle, + WKBundlePageRef page, + const void* clientInfo); + static void didReceiveMessageCallback( + WKBundleRef, + WKStringRef messageName, + WKTypeRef messageBody, + const void *clientInfo); +#if ENABLE(ONE_UI_PROCESS_MODEL) + static int aul_handler(aul_type type, + bundle *b, + void *data); + static int SendMessagetoUI(int cmd, + unsigned char *data, + int dataLen); +#endif + + private: + WKBundleRef m_bundle; + + typedef std::list PagesList; + PagesList m_pagesList; + typedef std::set ContextSet; + typedef std::map PageContextList; + PageContextList m_pageContext; + PageGlobalContextContainer m_pageGlobalContext; + DPL::String m_widgetTizenId; + double m_scale; + std::string m_encodedBundle; + std::string m_theme; + std::set m_loadedContext; + JSGlobalContextRef m_willRemoveContext; + WrtDB::WidgetSecurityModelVersion m_securityModelVersion; + bool m_initialized; + + std::unique_ptr m_decryptionSupport; + std::unique_ptr m_viewmodesSupport; + + // WKBundlePageResourceLoadClient callback + static WKURLRequestRef willSendRequestForFrameCallback( + WKBundlePageRef, + WKBundleFrameRef, + uint64_t resourceIdentifier, + WKURLRequestRef request, + WKURLResponseRef, + const void *clientInfo); + static void didFinishLoadForResourceCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + uint64_t resourceIdentifier, + const void* clientInfo); + + // WKBundlePageDidStartProvisionalLoadForFrame callback + static void didStartProvisionalLoadForFrameCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKTypeRef* userData, + const void *clientInfo); + + // WKBundlePageDidRemoveFrameFromHierarchy callback + static void didRemoveFrameFromHierarchyCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKTypeRef* userData, + const void *clientInfo); + + // WKBundlePageLoaderClient callback + static void didCommitLoadForFrameCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKTypeRef*, + const void *clientInfo); + + // WKBundlePageDecidePolicyForNavigationActionCallback + static WKBundlePagePolicyAction decidePolicyForNavigationActionCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKBundleNavigationActionRef navigationAction, + WKURLRequestRef request, + WKTypeRef* userData, + const void* clientInfo); + + // WKBundlePageDecidePolicyForNewWindowActionCallback + static WKBundlePagePolicyAction decidePolicyForNewWindowActionCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKBundleNavigationActionRef navigationAction, + WKURLRequestRef request, + WKStringRef frameName, + WKTypeRef* userData, + const void* clientInfo); + + // WKBundlePageDecidePolicyForResponseCallback + static WKBundlePagePolicyAction decidePolicyForResponseCallback( + WKBundlePageRef page, + WKBundleFrameRef frame, + WKURLResponseRef response, + WKURLRequestRef request, + WKTypeRef* userData, + const void* clientInfo); + + // WKBundleClient + void didCreatePage(WKBundlePageRef page); + void willDestroyPage(WKBundlePageRef page); + void didReceiveMessage( + WKStringRef messageName, + WKTypeRef messageBody); + + // WKBundlePageResourceLoadClient + WKURLRequestRef willSendRequestForFrame(WKURLRequestRef request); + WKBundlePagePolicyAction decidePolicyForAction( + bool isNewWindow, + WKBundlePageRef page, + WKBundleFrameRef frame, + WKBundleNavigationActionRef navigationAction, + WKURLRequestRef request, + WKTypeRef* userData); + + // basic + inline static std::string toString(WKStringRef str); + inline static std::string toString(WKURLRef url); + inline static std::string toString(WKURLRequestRef req); + inline static std::string toString(WKErrorRef err); + static std::string getScheme(std::string uri); + + bool isEncryptedResource(std::string Url, int &size); + std::string DecryptResource(std::string resource, int size); + + void fixWKMessageArgs(std::string & argScale, + std::string & argEncodedBundle, + std::string & argTheme); + +#if ENABLE(CORS_WHITELISTING) + void bypassCORSforWARPAccessList(WrtDB::WidgetDAOReadOnly &dao); +#endif +#if ENABLE(ONE_UI_PROCESS_MODEL) + void dropProcessPoolCapability(); + void changeProcessPoolSmackLabel(const std::string& appPath); + void initAULCommunication(std::string appPath, int argc, char** argv); +#endif +}; + +#endif // WRT_SRC_VIEW_WEBKIT_WRT_INJECTED_BUNDLE_H_ diff --git a/src/view/webkit/injected-bundle/wrt-injected-bundle.map b/src/view/webkit/injected-bundle/wrt-injected-bundle.map new file mode 100644 index 0000000..e236c95 --- /dev/null +++ b/src/view/webkit/injected-bundle/wrt-injected-bundle.map @@ -0,0 +1,17 @@ +{ + global: + WKBundleInitialize; + _Jv_RegisterClasses; + __bss_end__; + __bss_start; + __bss_start__; + __cxa_finalize; + __end__; + __gmon_start__; + _bss_end__; + _edata; + _end; + _fini; + _init; + local: *; +}; diff --git a/src/view/webkit/view_logic.cpp b/src/view/webkit/view_logic.cpp new file mode 100644 index 0000000..860a7b8 --- /dev/null +++ b/src/view/webkit/view_logic.cpp @@ -0,0 +1,2500 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic.cpp + * @author Pawel Sikorski (p.sikorsk@samsung.com) + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @brief View logic for Webkit2 + */ +#include "view_logic.h" + +#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 +#include +#include +#include +#include +#include +#if USE(WEBKIT_UPVERSION) +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if ENABLE(PRE_LAUNCH) +#include +#endif + +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#endif + +namespace { +// IME State value +const char * const IME_STATE_ON = "on"; +const char * const IME_STATE_OFF = "off"; + +const char PROTOCOL_HANDLER_ASK_MSG[] = "Add protocol?"; +const char PROTOCOL_HANDLER_ASK_TITLE[] = "Add protocol"; +const char PROTOCOL_HANDLER_ASK_REMEMBER[] = "Remember dicision"; +const char CONTENT_HANDLER_ASK_MSG[] = "Add content?"; +const char CONTENT_HANDLER_ASK_TITLE[] = "Add content"; +const char CONTENT_HANDLER_AKS_REMEMBER[] = "Remember dicision"; + +const char* const DEFAULT_ENCODING = "UTF-8"; +#if ENABLE(CONTENT_SECURITY_POLICY) +const char* const DEFAULT_CSP_POLICY = + "default-src *; script-src 'self'; style-src 'self'; object-src 'none';"; +#endif +// SCHEME +const char * const SCHEME_BOX_SLASH = "box://"; +const double ORIENTATION_THRESHOLD = 0.5; + +//Tizen Extensible API String +const char *EXTENSIBLE_API_ROTATION_LOCK = "rotation,lock"; + +} // anonymous namespace + +std::map ViewLogic::m_ewkCallbacksMap = { + { "load,started", &ViewLogic::loadStartedCallback }, + { "load,finished", &ViewLogic::loadFinishedCallback }, + { "load,progress,started", &ViewLogic::loadProgressStartedCallback }, + { "load,progress", &ViewLogic::loadProgressCallback }, + { "load,progress,finished", &ViewLogic::loadProgressFinishedCallback }, + { "webprocess,crashed", &ViewLogic::webProcessCrashedCallback }, + { "process,crashed", &ViewLogic::processCrashedCallback }, + // WKPageUIClient + { "create,window", &ViewLogic::createWindowCallback }, + { "close,window", &ViewLogic::closeWindowCallback }, + // WKPagePolicyClient + { "policy,navigation,decide", &ViewLogic::policyNavigationDecideCallback }, + { "policy,newwindow,decide", &ViewLogic::policyNewWindowDecideCallback }, + { "policy,response,decide", &ViewLogic::pageResponseDecideCallback }, + // WKPageContextMenuClient + { "contextmenu,customize", &ViewLogic::contextmenuCustomizeCallback }, + // EWK Notification Callback + { "notification,show", &ViewLogic::notificationShowCallback }, + { "notification,cancel", &ViewLogic::notificationCancelCallback }, + { "fullscreen,enterfullscreen", &ViewLogic::enterFullscreenCallback }, + { "fullscreen,exitfullscreen", &ViewLogic::exitFullscreenCallback }, + // IME Callback + // when ime start to be showed on the webview, + // this callback will be called + { "inputmethod,changed", &ViewLogic::imeChangedCallback }, + // this callback will be called + // when ime finishes to be showed on the webview + // "event_info" arg of this callback is always NULL point + // if web content should know size of ime, + // use "inputmethod,changed" instead of this. + // + { "editorclient,ime,opened", &ViewLogic::imeOpenedCallback }, + // when ime finished to be hidden, + // this callback will be called + { "editorclient,ime,closed", &ViewLogic::imeClosedCallback }, + // Custom handlers + { "protocolhandler,registration,requested", + &ViewLogic::protocolHandlerRegistrationCallback }, + { "protocolhandler,isregistered", + &ViewLogic::protocolHandlerIsRegisteredCallback }, + { "protocolhandler,unregistration,requested", + &ViewLogic::protocolHandlerUnregistrationCallback }, + { "contenthandler,registration,requested", + &ViewLogic::contentHandlerRegistrationCallback }, + { "contenthandler,isregistered", + &ViewLogic::contentHandlerIsRegisteredCallback }, + { "contenthandler,unregistration,requested", + &ViewLogic::contentHandlerUnregistrationCallback }, + { "request,certificate,confirm", + &ViewLogic::certificateConfirmRequestCallback }, +#if USE(WEBKIT_UPVERSION) + { "authentication,request", + &ViewLogic::authenticationRequestCallback }, +#else + { "authentication,challenge", + &ViewLogic::authenticationChallengeRequestCallback }, +#endif + { "frame,rendered", + &ViewLogic::viewFrameRenderedCallback }, + { "mediacontrol,rotate,horizontal", + &ViewLogic::mediacontrolRotateHorizontal }, + { "mediacontrol,rotate,vertical", + &ViewLogic::mediacontrolRotateVertical }, + { "mediacontrol,rotate,exit", + &ViewLogic::mediacontrolRotateExit }, + { "popup,reply,wait,start", + &ViewLogic::popupReplyWaitStart }, + { "popup,reply,wait,finish", + &ViewLogic::popupReplyWaitFinish }, + { "console,message", + &ViewLogic::consoleMessageCallback }, + { "rotate,prepared", &ViewLogic::rotatePreparedCallback }, + { "video,hwoverlay,enabled", + &ViewLogic::enabledVideoHwOverlayCallback }, + { "video,hwoverlay,disabled", + &ViewLogic::disabledVideoHwOverlayCallback }, +}; + +ViewLogic::ViewLogic() : + m_ewkContext(0), + m_attachedToCustomHandlerDao(false), + m_currentEwkView(0), + m_closedEwkView(NULL), + m_window(NULL), + m_model(0), + m_cbs(new WRT::UserDelegates), + m_imeWidth(0), + m_imeHeight(0), + m_isBackgroundReload(false), + m_isBackgroundSupport(false), + m_rotateAngle(0), + m_deferredRotateAngle( + ViewModule::OrientationSupport::DEFERRED_ORIENTATION_EMPTY), + m_orientationThresholdTimer(NULL), + m_isPopupReplyWait(false), + m_isFullscreenByPlatform(false), + m_appsSupport(new ViewModule::AppsSupport()), + m_vibrationSupport(new ViewModule::VibrationSupport()), + m_webNotificationSupport(new ViewModule::WebNotificationSupport()) +{ + ApplicationLauncherSingleton::Instance().Touch(); +} + +ViewLogic::~ViewLogic() +{ + detachFromCustomHandlersDao(); +} + +bool ViewLogic::createWebView(Ewk_Context* context, + Evas_Object* window) +{ + WrtLogD("enter"); + if (!context || !window) { + return false; + } + + // theme setting + const char *theme = elm_theme_get(NULL); + if (theme) { + m_theme = theme; + WrtLogD("theme is %s", m_theme.c_str()); + } + + // set members + m_ewkContext = context; + m_window = window; + + Evas* canvas = evas_object_evas_get(m_window); + + if (!createEwkView(canvas)) { + return false; + } + + return true; +} + +void ViewLogic::prepareView(WidgetModel* m, const std::string &startUrl) +{ + WrtLogD("View prepare"); + + Assert(m); + m_model = m; + m_startUrl = startUrl; + Assert(NULL != m_ewkContext); + Assert(m_window); + + ADD_PROFILING_POINT("initializeSupport", "start"); + initializeSupport(); + ADD_PROFILING_POINT("initializeSupport", "stop"); + ewkClientInit(m_currentEwkView); + ADD_PROFILING_POINT("prepareEwkView", "start"); + prepareEwkView(m_currentEwkView); + ADD_PROFILING_POINT("prepareEwkView", "stop"); + initializePluginLoading(); + initializeXwindowHandle(); +} + +void ViewLogic::showWidget() +{ + WrtLogD("showing widget"); + AssertMsg(NULL != m_currentEwkView, "ewk_view not created at this point"); + std::string url = + ViewModule::UriSupport::getUri(m_model, m_startUrl); + if (url.empty()) { + WrtLogE("Localized current URI doesn't exist"); + return; + } + WrtLogD("url : %s", url.c_str()); + + if (m_cbs->setWebviewCallback) { + m_cbs->setWebviewCallback(m_currentEwkView); + } + + // load page + ewk_view_url_set(m_currentEwkView, url.c_str()); +} + +void ViewLogic::setWidgetUrl(const std::string &startUrl) +{ + WrtLogD("reload widget"); + std::string url = + ViewModule::UriSupport::getUri(m_model, startUrl); + if (url.empty()) { + WrtLogE("Localized current URI doesn't exist"); + return; + } + + m_startUrl = startUrl; + WrtLogD("url : %s ", url.c_str()); + + if (m_cbs->setWebviewCallback) { + m_cbs->setWebviewCallback(m_currentEwkView); + } + ewk_view_url_set(m_currentEwkView, url.c_str()); +} + +void ViewLogic::hideWidget() +{ + WrtLogD("hiding widget"); + ViewModule::StorageSupport::deinitializeStorage(m_model); + m_appsSupport->deinitialize(); + m_vibrationSupport->deinitialize(); + m_webNotificationSupport->deinitialize(); + system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_FONT_TYPE); + + while (!m_ewkViewList.empty()) { + WrtLogD("pop webview"); + removeEwkView(m_ewkViewList.back()); + } + m_ewkViewList.clear(); +} + +void ViewLogic::suspendWidget() +{ + WrtLogD("Pausing widget"); + Assert(m_model); + + if (!m_currentEwkView) { + WrtLogW("Cannot suspend widget without view"); + } else { + setEwkViewInvisible(m_currentEwkView); + + if (!m_isBackgroundSupport) { + FOREACH(it, m_ewkViewList) { + if (*it != m_currentEwkView) { + suspendWebkit(*it); + } + } + + suspendWebkit(m_currentEwkView); + } +#if ENABLE(PRE_LAUNCH) + else if(PreLaunchingSupportSingleton::Instance().isPreLaunching()) + { + suspendWebkit(m_currentEwkView); + PreLaunchingSupportSingleton::Instance().setEwkViewSuspended(true); + } +#endif + } +} + +void ViewLogic::resumeWidget() +{ + WrtLogD("Resume widget"); + Assert(m_model); + + if (m_currentEwkView) + { + setEwkViewVisible(m_currentEwkView); + + if (!m_isBackgroundSupport) { + FOREACH(it, m_ewkViewList) { + if (*it != m_currentEwkView) { + resumeWebkit(*it); + } + } + + resumeWebkit(m_currentEwkView); + } +#if ENABLE(PRE_LAUNCH) + else if(PreLaunchingSupportSingleton::Instance().isEwkViewSuspended()) { + resumeWebkit(m_currentEwkView); + PreLaunchingSupportSingleton::Instance().setEwkViewSuspended(false); + } + + PreLaunchingSupportSingleton::Instance().setJavascriptExecuteFlag(false); +#endif + } +} + +void ViewLogic::resetWidgetFromSuspend() +{ + WrtLogD("Reset widget from suspend"); + Assert(m_currentEwkView); + + if (m_isPopupReplyWait) { + setEwkViewVisible(m_currentEwkView); + + if (!m_isBackgroundSupport) { + FOREACH(it, m_ewkViewList) { + if (*it != m_currentEwkView) { + resumeWebkit(*it); + } + } + + resumeWebkit(m_currentEwkView); + } + } +#if ENABLE(JAVASCRIPT_ONBEFOREUNLOAD_EVENT) + else { + setEwkViewVisible(m_currentEwkView); + + if (!m_isBackgroundSupport) { + FOREACH(it, m_ewkViewList) { + if (*it != m_currentEwkView) { + resumeWebkit(*it); + } + } + + resumeWebkit(m_currentEwkView); + } + } +#endif + resetWidgetCommon(); +} + +void ViewLogic::resetWidgetFromResume() +{ + WrtLogD("Reset widget from resume"); + + resetWidgetCommon(); +} + +void ViewLogic::resetWidgetCommon() +{ + Assert(m_currentEwkView); + + if (m_isPopupReplyWait) { + // Current WebProcess is blocked by some reason, js alert. + // This case "reset" event cannot pass to application(javascript layer). + // Free bundle data to use next "reset" event. + WrtLogD("Webkit is blocked. do resume"); + ApplicationDataSingleton::Instance().freeBundleData(DPL::ToUTF8String(m_model->TizenId)); + } else { + bool isSelfTarget = false; + std::string url = ViewModule::UriSupport::getUri(m_model, m_startUrl, &isSelfTarget); + + if (isSelfTarget) { + ViewLogicMessageSupport::setCustomProperties(m_ewkContext, NULL, + ApplicationDataSingleton::Instance().getEncodedBundle(DPL::ToUTF8String(m_model->TizenId))); + DispatchEventSupport::dispatchAppControlEvent(m_currentEwkView); + } + else + { +#if ENABLE(JAVASCRIPT_ONBEFOREUNLOAD_EVENT) + initializePluginLoading(); + ewk_view_url_set(m_currentEwkView, url.c_str()); +#else + while (!m_ewkViewList.empty()) { + removeEwkView(m_ewkViewList.back()); + } + m_currentEwkView = NULL; + + createEwkView(evas_object_evas_get(m_window)); + ewkClientInit(m_currentEwkView); + prepareEwkView(m_currentEwkView); + + initializePluginLoading(); + + if (m_cbs->setWebviewCallback) { + m_cbs->setWebviewCallback(m_currentEwkView); + } + ewk_view_url_set(m_currentEwkView, url.c_str()); +#endif + } + } + + elm_win_activate(m_window); +} + +void ViewLogic::backward() +{ + if (ewk_view_back_possible(m_currentEwkView)) { + ewk_view_back(m_currentEwkView); + } else { + if (1 >= m_ewkViewList.size()) { + // If there is no previous page, widget move to backgroud. + WrtLogD("Widget move to backgroud"); + elm_win_lower(m_window); + } else { + // Back to previous webview + WrtLogD("Widget move to previous webview"); + m_closedEwkView = m_currentEwkView; + ecore_idler_add(windowCloseIdlerCallback, this); + } + } +} + +void ViewLogic::reloadStartPage() +{ + WrtLogD("Reload Start Page"); + // prevent fail to load plugin bundle side + m_isBackgroundReload = true; + + if (!m_ewkViewList.empty()) { + while (!m_ewkViewList.empty()) { + if (m_cbs->unsetWebviewCallback) { + m_cbs->unsetWebviewCallback(m_currentEwkView); + } + removeEwkView(m_currentEwkView); + } + } + + // create new webview + createEwkView(evas_object_evas_get(m_window)); + ewkClientInit(m_currentEwkView); + + prepareEwkView(m_currentEwkView); + initializePluginLoading(); + + // load page + std::string url = ViewModule::UriSupport::getUri(m_model, m_startUrl); + + // show ewkView + if (m_cbs->setWebviewCallback) { + m_cbs->setWebviewCallback(m_currentEwkView); + } + ewk_view_url_set(m_currentEwkView, url.c_str()); + WrtLogD("Reloading Start Page is done!"); +} + +Evas_Object* ViewLogic::getCurrentWebview() +{ + WrtLogD("get current webview"); + return m_currentEwkView; +} + +void ViewLogic::fireJavascriptEvent(int event, void* data) +{ + ViewLogicMessageSupport::dispatchJavaScriptEvent( + m_ewkContext, + static_cast(event), + data); +} + +void ViewLogic::setUserCallbacks(const WRT::UserDelegatesPtr& cbs) +{ + m_cbs = cbs; +} + +void ViewLogic::checkSyncMessageFromBundle( + const char* name, + const char* /*body*/, + char** returnData) +{ + WrtLogD("didReceiveSynchronousMessage called"); + Assert(name); + + WrtLogD("received : %s", name); + if (!strcmp(name, Message::TizenScheme::GET_WINDOW_HANDLE)) { + if (m_window) { + Ecore_X_Window handle = elm_win_xwindow_get(m_window); + if (handle != 0) { + std::stringstream ss; + ss << handle; + std::string ret = ss.str(); + if (returnData) { + *returnData = strdup(ret.c_str()); + } + } else { + WrtLogD("X window isn't exist"); + } + } + } +} + +void ViewLogic::checkAsyncMessageFromBundle(const char* name, const char* body) +{ + Assert(name); + WrtLogD("received : %s", name); + + if (!strcmp(name, Message::ToUIProcess::BLOCKED_URL)) { + // Currently WebProcess informs obly about blocked + // URI - URI localization and security chekcs are + // done by WebProcess itself (see: wrt-injected-bundle.cpp + // and bundle_uri_handling.cpp) + std::string msgBody = (body) ? (body) : ""; + if (!msgBody.empty() && m_cbs->blockedUrlPolicyCallback) { + m_cbs->blockedUrlPolicyCallback(msgBody); + m_blockedUri = msgBody; + } + } else if (!strcmp(name, Message::TizenScheme::CLEAR_ALL_COOKIES)) { + Ewk_Cookie_Manager* cookieManager = + ewk_context_cookie_manager_get(m_ewkContext); + if (!cookieManager) { + WrtLogE("Fail to get cookieManager"); + return; + } + ewk_cookie_manager_cookies_clear(cookieManager); + } else if (!strcmp(name, IPCMessageSupport::TIZEN_CHANGE_USERAGENT)) { + std::string msgBody = (body) ? (body) : ""; + + std::string strId = msgBody.substr(0, msgBody.find_first_of('_')); + std::string strBody = msgBody.substr(msgBody.find_first_of('_')+1); + WrtLogD("Id: %s , Body %s", strId.c_str(), strBody.c_str()); + + ewk_view_user_agent_set(m_currentEwkView, strBody.c_str()); + WrtLogD("get UA: %s", ewk_view_user_agent_get(m_currentEwkView)); + + IPCMessageSupport::replyAsyncMessageToWebProcess(m_ewkContext, + atoi(strId.c_str()), + "success"); + return; + } else if (!strcmp(name, IPCMessageSupport::TIZEN_DELETE_ALL_COOKIES)) { + std::string msgBody = (body) ? (body) : ""; + std::string strId = msgBody.substr(0, msgBody.find_first_of('_')); + std::string strBody = msgBody.substr(msgBody.find_first_of('_')+1); + + Ewk_Cookie_Manager* cookieManager = + ewk_context_cookie_manager_get(m_ewkContext); + if (!cookieManager) { + WrtLogE("Fail to get cookieManager"); + IPCMessageSupport::replyAsyncMessageToWebProcess( + m_ewkContext, + atoi(strId.c_str()), + "error"); + return; + } + ewk_cookie_manager_cookies_clear(cookieManager); + IPCMessageSupport::replyAsyncMessageToWebProcess(m_ewkContext, + atoi(strId.c_str()), + "success"); + return; + } +#if ENABLE(ONE_UI_PROCESS_MODEL) + else if (!strcmp(name, IPCMessageSupport::TIZEN_HIDE)) +#else + else if (!strcmp(name, IPCMessageSupport::TIZEN_EXIT) || + !strcmp(name, IPCMessageSupport::TIZEN_HIDE)) +#endif + { + bool ret = + ViewModule::SchemeSupport::HandleTizenScheme(name, + m_window, + m_currentEwkView); + if (ret == false) { + WrtLogE("Fail to handle tizen scheme %s", name); + } + // Not need to send reply + return; + } +#if ENABLE(ONE_UI_PROCESS_MODEL) + else if (!strcmp(name, IPCMessageSupport::TIZEN_EXIT)) { + WrtLogE("PSM exit called %s", name); + char *appId = strdup(DPL::ToUTF8String(m_model->TizenId).c_str()); + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().WEB_APP_TERMINATE, appId); + } +#endif + else { + WrtLogW("Not defined message"); + } +} + +void ViewLogic::downloadData(const char* url) +{ + WrtLogD("enter"); + if (!url) { + return; + } + m_appsSupport->downloadRequest(url, NULL, NULL); +} + +void ViewLogic::activateVibration(bool on, uint64_t time) +{ + WrtLogD("enter"); + if (on) { + m_vibrationSupport->startVibration(static_cast(time)); + } else { + m_vibrationSupport->stopVibration(); + } +} + +void ViewLogic::initializeSupport() +{ + // background support + if (m_model->SettingList.Get().getBackgroundSupport() + == BackgroundSupport_Enable) + { + WrtLogD("Background support enabled, set process active"); + deviced_inform_active(getpid()); + m_isBackgroundSupport = true; + } + system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_FONT_TYPE, + systemSettingsChangedCallback, + this); + + ViewModule::StorageSupport::initializeStorage(m_model); + m_appsSupport->initialize(m_model, elm_win_xwindow_get(m_window)); + m_securityOriginSupport.reset(new ViewModule::SecurityOriginSupport(m_model)); + m_certificateSupport.reset(new ViewModule::CertificateSupport(m_model)); + m_privilegeSupport.reset(new ViewModule::PrivilegeSupport(m_model)); + m_webNotificationSupport->initialize(m_model->TzPkgId.Get()); +} + +void ViewLogic::initializePluginLoading() +{ + // inform wrt information for plugin loading to web process + ViewLogicMessageSupport::start( + m_ewkContext, + m_model->TizenId, + elm_config_scale_get(), + ApplicationDataSingleton::Instance().getEncodedBundle(DPL::ToUTF8String(m_model->TizenId)), + m_theme.c_str()); +} + +void ViewLogic::initializeXwindowHandle() +{ + if (m_window) { + unsigned int handle = elm_win_xwindow_get(m_window); + ViewLogicMessageSupport::setXwindowHandle( + m_ewkContext, + handle); + } +} + +void ViewLogic::ewkClientInit(Evas_Object *wkView) +{ + AssertMsg(NULL != wkView, "ewk_view not created at this point"); + + FOREACH(it, m_ewkCallbacksMap) + { + evas_object_smart_callback_add( + wkView, + it->first.c_str(), + it->second, + this); + } + // EWK Orientation Callback +#if !USE(WEBKIT_UPVERSION) + ewk_view_orientation_lock_callback_set( + wkView, + orientationLockCallback, + this); +#endif + ewk_view_exceeded_database_quota_callback_set( + wkView, + exceededDatabaseQuotaCallback, + this); + ewk_view_exceeded_indexed_database_quota_callback_set( + wkView, + exceededIndexedDatabaseQuotaCallback, + this); + ewk_view_exceeded_local_file_system_quota_callback_set( + wkView, + exceededLocalFileSystemQuotaCallback, + this); + ewk_view_geolocation_permission_callback_set( + wkView, + geolocationPermissionRequestCallback, + this); + ewk_view_user_media_permission_callback_set( + wkView, + usermediaPermissionRequestCallback, + this); + ewk_view_notification_permission_callback_set( + wkView, + notificationPermissionRequestCallback, + this); + ea_object_event_callback_add(wkView, + EA_CALLBACK_BACK, + eaKeyCallback, + this); + ea_object_event_callback_add(wkView, + EA_CALLBACK_MORE, + eaKeyCallback, + this); + // Always register access object even application doesn't support + // accessibility. In case of accessibility isn't supported, efl_assist + // shows warning message by syspopup. + // initScreenReaderSupport is related method. (window_data.cpp) +#if USE(EA_SCREEN_READER) + elm_access_object_register(wkView, m_window); +#endif +} + +void ViewLogic::ewkClientDeinit(Evas_Object *wkView) +{ + WrtLogD("ewkClientDeinit"); + AssertMsg(NULL != wkView, "ewk_view not created at this point"); + + FOREACH(it, m_ewkCallbacksMap) + { + evas_object_smart_callback_del( + wkView, + it->first.c_str(), + it->second); + } +#if !USE(WEBKIT_UPVERSION) + ewk_view_orientation_lock_callback_set(wkView, NULL, NULL); +#endif + ewk_view_exceeded_database_quota_callback_set(wkView, NULL, NULL); + ewk_view_exceeded_indexed_database_quota_callback_set(wkView, NULL, NULL); + ewk_view_exceeded_local_file_system_quota_callback_set(wkView, NULL, NULL); + ewk_view_geolocation_permission_callback_set(wkView, NULL, NULL); + ewk_view_user_media_permission_callback_set(wkView, NULL, NULL); + ewk_view_notification_permission_callback_set(wkView, NULL, NULL); + ea_object_event_callback_del(wkView, + EA_CALLBACK_BACK, + eaKeyCallback); + ea_object_event_callback_del(wkView, + EA_CALLBACK_MORE, + eaKeyCallback); + if (m_orientationThresholdTimer) { + ecore_timer_del(m_orientationThresholdTimer); + m_orientationThresholdTimer = NULL; + } +#if USE(EA_SCREEN_READER) + elm_access_object_unregister(wkView); +#endif +} + +bool ViewLogic::createEwkView(Evas* canvas) +{ + WrtLogD("createEwkView"); + Assert(canvas); + ADD_PROFILING_POINT("ewk_view_add_with_context", "start"); + Evas_Object* newEwkView = ewk_view_add_with_context( + canvas, + m_ewkContext); + ADD_PROFILING_POINT("ewk_view_add_with_context", "stop"); + + if (!newEwkView) { + WrtLogE("View creation failed"); + Wrt::Popup::PopupInvoker().showInfo( + "Info", "View creation failed", "close"); + return false; + } + + // set cookie policy + // even arguments pass the ewkContext, this API should be called + // after webkit Evas_Object is created + Ewk_Cookie_Manager *ewkCookieManager; + ewkCookieManager = + ewk_context_cookie_manager_get(m_ewkContext); + ewk_cookie_manager_accept_policy_set(ewkCookieManager, + EWK_COOKIE_ACCEPT_POLICY_ALWAYS); + + if (m_currentEwkView) { + setEwkViewInvisible(m_currentEwkView); + } + + WrtLogD("push webview"); + m_ewkViewList.push_back(newEwkView); + m_currentEwkView = newEwkView; + return true; +} + +void ViewLogic::prepareEwkView(Evas_Object *wkView) +{ + WrtLogD("prepareEwkView called"); + Assert(wkView); + Ewk_Settings* settings = ewk_view_settings_get(wkView); + + // set user agent +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) + std::string customUserAgent = m_model->SettingList.Get().getUserAgent(); + if (!customUserAgent.empty()) { + WrtLogD("Setting custom user agent as: %s", customUserAgent.c_str()); + ewk_view_user_agent_set(wkView, customUserAgent.c_str()); + } else +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + { + WrtLogD("Setting user agent as: default"); + ewk_view_user_agent_set(wkView, NULL); + std::string defaultUA = ewk_view_user_agent_get(wkView); + WrtLogD("webkit's UA: %s", defaultUA.c_str()); + } + + // set custom header : language + using namespace ViewModule::CustomHeaderSupport; + std::string customHeaderString = getValueByField(ACCEPT_LANGUAGE); + if (!customHeaderString.empty()) { + WrtLogD("custom field=[%s]", ACCEPT_LANGUAGE.c_str()); + WrtLogD("custom value=[%s]", customHeaderString.c_str()); + ewk_view_custom_header_add(wkView, + ACCEPT_LANGUAGE.c_str(), + customHeaderString.c_str()); + } + + // webkit NPAPI plugins is always on in wrt + ewk_settings_plugins_enabled_set(settings, EINA_TRUE); + ewk_settings_javascript_enabled_set(settings, EINA_TRUE); + ewk_settings_loads_images_automatically_set(settings, EINA_TRUE); + // WRT should not fit web contents to device width automatically as default. + // Fitting to device width should be handled by web content using viewport meta tag. + ewk_settings_auto_fitting_set(settings, EINA_FALSE); + ewk_settings_autofill_password_form_enabled_set(settings, EINA_TRUE); + ewk_settings_form_candidate_data_enabled_set(settings, EINA_TRUE); + ewk_settings_uses_keypad_without_user_action_set(settings, EINA_TRUE); + +#if ENABLE(PRE_LAUNCH) + if (PreLaunchingSupportSingleton::Instance().isPreLaunching()) + { + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_HIDDEN, + EINA_FALSE); + } + else + { + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_VISIBLE, + EINA_TRUE); + } +#else + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_VISIBLE, + EINA_TRUE); +#endif + + std::string encoding = DEFAULT_ENCODING; + OptionalWidgetStartFileInfo fileInfo = + W3CFileLocalization::getStartFileInfo(m_model->TizenId); + if (!!fileInfo) { + std::string file_encoding = DPL::ToUTF8String((*fileInfo).encoding); + + if(EINA_TRUE == ewk_settings_is_encoding_valid( + file_encoding.c_str())){ + encoding = file_encoding; + WrtLogD("Found custom encoding in DB: %s", encoding.c_str()); + } + + } + WrtLogD("Setting encoding: %s", encoding.c_str()); + if (ewk_settings_default_encoding_set(settings,encoding.c_str())) { + WrtLogD("Encoding set properly"); + } else { + WrtLogE("Error while setting encoding"); + } + +#if ENABLE(CONTENT_SECURITY_POLICY) + if (m_model->SecurityModelVersion.Get() == + WrtDB::WidgetSecurityModelVersion::WIDGET_SECURITY_MODEL_V2) + { + // setting CSP policy rules + DPL::OptionalString policy = m_model->CspReportOnlyPolicy.Get(); + if (!!policy) { + WrtLogD("CSP report only policy present in manifest: %ls", (*policy).c_str()); + ewk_view_content_security_policy_set( + wkView, + DPL::ToUTF8String(*policy).c_str(), + EWK_REPORT_ONLY); + } + + policy = m_model->CspPolicy.Get(); + if (!!policy) { + WrtLogD("CSP policy present in manifest: %ls", (*policy).c_str()); + ewk_view_content_security_policy_set( + wkView, + DPL::ToUTF8String(*policy).c_str(), + EWK_ENFORCE_POLICY); + } else { + ewk_view_content_security_policy_set( + wkView, + DEFAULT_CSP_POLICY, + EWK_ENFORCE_POLICY); + } + } +#endif +} + +void ViewLogic::removeEwkView(Evas_Object *wkView) +{ + WrtLogD("removeEwkView called"); + Assert(wkView); + Assert(0 != m_ewkViewList.size()); + + // unregister webview callbacks + ewkClientDeinit(wkView); + + // suspend NPAPI plugin - Not implemented by Webkit2 + // ewk_view_pause_or_resume_plugins(); + evas_object_del(wkView); + m_ewkViewList.remove(wkView); +} + +void ViewLogic::setEwkViewInvisible(Evas_Object *wkView) +{ + WrtLogD("setEwkViewInvisible called"); + Assert(wkView); + + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_HIDDEN, + EINA_FALSE); + ewk_view_visibility_set(wkView, EINA_FALSE); +} + +void ViewLogic::setEwkViewVisible(Evas_Object *wkView) +{ + WrtLogD("setEwkViewVisible called"); + Assert(wkView); + + ewk_view_page_visibility_state_set(wkView, + EWK_PAGE_VISIBILITY_STATE_VISIBLE, + EINA_FALSE); + ewk_view_visibility_set(wkView, EINA_TRUE); +} + +void ViewLogic::resumeWebkit(Evas_Object *wkView) +{ + WrtLogD("resumeWebkit"); + Assert(wkView); + + ewk_view_resume(wkView); + ewk_view_foreground_set(wkView, true); + + return; +} + +void ViewLogic::suspendWebkit(Evas_Object *wkView) +{ + WrtLogD("suspendWebkit"); + Assert(wkView); + + ewk_view_suspend(wkView); + ewk_view_foreground_set(wkView, false); + + return; +} + +void ViewLogic::loadStartedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->loadStartedCallback) { + This->m_cbs->loadStartedCallback(obj, eventInfo); + } +} + +void ViewLogic::loadFinishedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + + // Fill id/password + const char* url = ewk_view_url_get(This->m_currentEwkView); + if (NULL == url || strlen(url) == 0) { + WrtLogE("url is empty"); + return; + } + + if (This->m_cbs->loadFinishedCallback) { + This->m_cbs->loadFinishedCallback(obj, eventInfo); + } + + // set only encoded bundle + double scale = elm_config_scale_get(); + ViewLogicMessageSupport::setCustomProperties( + This->m_ewkContext, + &scale, + ApplicationDataSingleton::Instance().getEncodedBundle(DPL::ToUTF8String(This->m_model->TizenId))); + + // In this case, widget is reloaded in the background. + // After finished load, bundle should disconnent callback. + if (This->m_isBackgroundReload) { + ewk_view_suspend(This->m_currentEwkView); + This->m_isBackgroundReload = false; + } +} + +void ViewLogic::loadProgressStartedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->loadProgressStartedCallback) { + This->m_cbs->loadProgressStartedCallback(obj, eventInfo); + } +} + +void ViewLogic::loadProgressCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + Assert(eventInfo); + + ViewLogic* This = static_cast(data); + double* progress = static_cast(eventInfo); + WrtLogD("progress = %f", *progress); + if (This->m_cbs->loadProgressCallback) { + This->m_cbs->loadProgressCallback(obj, eventInfo); + } +} + +void ViewLogic::loadProgressFinishedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->loadProgressFinishedCallback) { + This->m_cbs->loadProgressFinishedCallback(obj, eventInfo); + } +} + +void ViewLogic::processCrashedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->processCrashedCallback) { + This->m_cbs->processCrashedCallback(obj, eventInfo); + } + + // This flag will prevent exit() call in the Webkit side + if (NULL != eventInfo) { + *(static_cast(eventInfo)) = EINA_TRUE; + } +} + +void ViewLogic::webProcessCrashedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->webProcessCrashedCallback) { + This->m_cbs->webProcessCrashedCallback(obj, eventInfo); + } + + // This flag will prevent recreation of webProces + if (NULL != eventInfo) { + *(static_cast(eventInfo)) = EINA_TRUE; + } +} + +void ViewLogic::createWindowCallback( + void* data, + Evas_Object* obj, + void* eventInfo) +{ + WrtLogD("createWindowCallback"); + Assert(data); + ViewLogic* This = static_cast(data); + + // Blocks "window.open" and "target='_blank'" + // defined for href link in anchor element in case of Dynamic box + if (This->m_cbs->isCreateNewWindowAllowedCallback) { + if (!This->m_cbs->isCreateNewWindowAllowedCallback()) { + WrtLogD("Returning from window create callback"); + return; + } + } + + // First, current webview should be handled by user callback + if (This->m_cbs->unsetWebviewCallback) { + This->m_cbs->unsetWebviewCallback(obj); + } + + // create new ewkview + This->createEwkView(evas_object_evas_get(This->m_window)); + Evas_Object* newEwkView = This->m_currentEwkView; + + // initialize new ewkview + This->ewkClientInit(newEwkView); + This->prepareEwkView(newEwkView); + + // Lastly, new webview should be handled by user callback + if (This->m_cbs->setWebviewCallback) { + This->m_cbs->setWebviewCallback(newEwkView); + } + *(static_cast(eventInfo)) = newEwkView; +} + +void ViewLogic::closeWindowCallback( + void* data, + Evas_Object* obj, + void* /*eventInfo*/) +{ + WrtLogD("closeWindowCallback"); + ViewLogic* This = static_cast(data); + This->m_closedEwkView = obj; + ecore_idler_add(windowCloseIdlerCallback, This); +} + +void ViewLogic::policyNavigationDecideCallback( + void* data, + Evas_Object* obj, + void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + Assert(obj); + Assert(eventInfo); + + ViewLogic* This = static_cast(data); + Ewk_Policy_Decision* policyDecision = + static_cast(eventInfo); + + // handle blocked url + const char* url = ewk_policy_decision_url_get(policyDecision); + + // call user delegate callback + if (This->m_cbs->policyNavigationDecideCallback) { + if(!This->m_cbs->policyNavigationDecideCallback(obj, eventInfo)) { + WrtLogD(" URI is blocked for DynamicBox"); + ewk_policy_decision_ignore(policyDecision); + return; + } + std::string navigationUri(url); + if (!navigationUri.compare(0, 6, SCHEME_BOX_SLASH)) { + ewk_policy_decision_ignore(policyDecision); + return; + } + } + + if (url && strlen(url) != 0) { + if (This->m_blockedUri == url) { + WrtLogD("Blocked url = %s", url); + This->m_blockedUri = std::string(); + ewk_policy_decision_ignore(policyDecision); + return; + } + } + + if (ViewModule::SchemeSupport::filterURIByScheme(policyDecision, + false, + This->m_window, + This->m_currentEwkView)) + { + WrtLogD("use"); + ewk_policy_decision_use(policyDecision); + } else { + // check whether this is new empty window + const char* activeUrl = ewk_view_url_get(This->m_currentEwkView); + if (!activeUrl || 0 == strlen(activeUrl)) { + /* + * The view is empty and scheme has been handled externally. When + * user gets back from the external application he'd see blank page + * and won't be able to navigate back. This happens when window.open + * is used to handle schemes like sms/mms/mailto (for example in + * WAC web standards tests: WS-15XX). + * + * To solve the problem, the empty view is removed from the stack + * and the previous one is shown. This is not an elegant solution + * but we don't have a better one. + */ + WrtLogD("Scheme has been handled externally. Removing empty view."); + if (ewk_view_back_possible(This->m_currentEwkView)) { + // go back to previous WKPage + ewk_view_back(This->m_currentEwkView); + } else { + // stop current WKPage + ewk_view_stop(This->m_currentEwkView); + This->m_closedEwkView = This->m_currentEwkView; + ecore_idler_add(windowCloseIdlerCallback, This); + } + } + + WrtLogD("ignore"); + ewk_policy_decision_ignore(policyDecision); + } +} + +void ViewLogic::policyNewWindowDecideCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("policyNewWindowDecideCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); + Assert(eventInfo); + Ewk_Policy_Decision* policyDecision = + static_cast(eventInfo); + + // handle blocked url + const char* url = ewk_policy_decision_url_get(policyDecision); + if (url && strlen(url) != 0) { + if (This->m_blockedUri == url) { + WrtLogD("Blocked url = %s", url); + This->m_blockedUri = std::string(); + ewk_policy_decision_ignore(policyDecision); + return; + } + } + + if (ViewModule::SchemeSupport::filterURIByScheme(policyDecision, + true, + This->m_window, + This->m_currentEwkView)) + { + ewk_policy_decision_use(policyDecision); + } else { + // scheme handled + ewk_policy_decision_ignore(policyDecision); + } +} + +void ViewLogic::pageResponseDecideCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("pageResponseDecideCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); + Assert(eventInfo); + Ewk_Policy_Decision* policyDecision = + static_cast(eventInfo); + Ewk_Policy_Decision_Type policyDecisionType = + ewk_policy_decision_type_get(policyDecision); + + if (policyDecisionType == EWK_POLICY_DECISION_USE) { + WrtLogD("use"); + ewk_policy_decision_use(policyDecision); + } else if (policyDecisionType == EWK_POLICY_DECISION_DOWNLOAD) { + WrtLogD("download"); + ewk_policy_decision_suspend(policyDecision); + + // get uri information + const char* url = ewk_policy_decision_url_get(policyDecision); + if (NULL == url || strlen(url) == 0) { + WrtLogD("url data is empty"); + ewk_policy_decision_use(policyDecision); + return; + } + WrtLogD("url = [%s]", url); + + // get content information + const char* content = + ewk_policy_decision_response_mime_get(policyDecision); + WrtLogD("content type = [%s]", content); + + // get cookie information + const char* cookie = ewk_policy_decision_cookie_get(policyDecision); + WrtLogD("cookie = [%s]", cookie); + + WrtLogD("Content not supported, will be opened in external app"); + This->m_appsSupport->downloadRequest( + url, + content, + cookie); + ewk_policy_decision_ignore(policyDecision); + } else if (policyDecisionType == EWK_POLICY_DECISION_IGNORE) { + WrtLogD("ignore"); + ewk_policy_decision_ignore(policyDecision); + } else { + WrtLogD("Type isn't handled"); + ewk_policy_decision_ignore(policyDecision); + } +} + +void ViewLogic::contextmenuCustomizeCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("contextmenuCustomizeCallback called"); + Assert(data); + Assert(eventInfo); + ViewLogic* This = static_cast(const_cast(data)); + Ewk_Context_Menu* menu = static_cast(eventInfo); + if ((This->m_model->Type.Get().appType == WrtDB::APP_TYPE_TIZENWEBAPP) && + (This->m_model->SettingList.Get().getContextMenu() + == ContextMenu_Disable)) + { + WrtLogD("ContextMenu Disable!!"); + for (unsigned int idx = 0; idx < ewk_context_menu_item_count(menu);) { + Ewk_Context_Menu_Item* item = ewk_context_menu_nth_item_get(menu, + idx); + Assert(item); + ewk_context_menu_item_remove(menu, item); + } + } else { + WrtLogD("ContextMenu Enable!!"); + if(This->m_cbs->createContextMenuCallback) + This->m_cbs->createContextMenuCallback(eventInfo); + } +} + +Eina_Bool ViewLogic::geolocationPermissionRequestCallback( + Evas_Object* obj, + Ewk_Geolocation_Permission_Request* geolocationPermissionRequest, + void* userData) +{ + Assert(userData); + Assert(geolocationPermissionRequest); + + ViewLogic* This = static_cast(userData); + DPL::OptionalBool ret = + This->m_privilegeSupport->getPrivilegeStatus(ViewModule::PrivilegeSupport::Privilege::LOCATION); + if (ret) { + ewk_geolocation_permission_reply(geolocationPermissionRequest, (*ret) ? EINA_TRUE : EINA_FALSE); + return EINA_TRUE; + } + + ViewModule::GeolocationSupport::GeoLocationData geoData; + geoData.data = userData; + geoData.permissionRequest = geolocationPermissionRequest; + geoData.pkgId = This->m_model->TzPkgId.Get(); + ViewModule::GeolocationSupport::geolocationPermissionRequest( + This->m_currentEwkView, + This->m_securityOriginSupport->getSecurityOriginDAO(), + &geoData); + return EINA_TRUE; +} + +void ViewLogic::notificationShowCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + Assert(eventInfo); + Ewk_Notification* ewkNotification = + static_cast(eventInfo); + ViewModule::WebNotificationDataPtr notiData( + new ViewModule::WebNotificationData(ewkNotification)); + + WrtLogD("notification id : %llu", notiData->getEwkNotiId()); + WrtLogD("notification iconURL : %s", notiData->getIconUrl()); + WrtLogD("notification title : %s", notiData->getTitle()); + WrtLogD("notification body : %s", notiData->getBody()); + + Assert(data); + ViewLogic* This = static_cast(data); + if (This->m_webNotificationSupport->show(notiData)) { + ewk_notification_showed(This->m_ewkContext, notiData->getEwkNotiId()); + } +} + +void ViewLogic::notificationCancelCallback( + void* data, + Evas_Object* obj, + void* eventInfo) +{ + Assert(eventInfo); + uint64_t ewkNotiId = *static_cast(eventInfo); + + Assert(data); + ViewLogic* This = static_cast(data); + Ewk_Notification* ewkNotification = + static_cast( + This->m_webNotificationSupport->hide(ewkNotiId)); + if (ewkNotification) { + Assert(obj); + Eina_List* list = NULL; + list = eina_list_append(list, ewkNotification); + ewk_view_notification_closed(obj, list); + eina_list_free(list); + } +} + +Eina_Bool ViewLogic::notificationPermissionRequestCallback( + Evas_Object* obj, + Ewk_Notification_Permission_Request* request, + void* userData) +{ + WrtLogD("notificationPermissionRequestCallback called"); + Assert(userData); + ViewLogic* This = static_cast(userData); + + Assert(request); + ViewModule::WebNotificationPermissionSupport::permissionRequest( + This->m_currentEwkView, + This->m_securityOriginSupport->getSecurityOriginDAO(), + request); + return EINA_TRUE; +} + +// EWK Orientation Callback +Eina_Bool ViewLogic::orientationLockCallback( + Evas_Object*, + Eina_Bool needLock, + int orientation, + void* data) +{ + WrtLogD("orientationLockCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); + + if (This->m_orientationThresholdTimer) { + WrtLogD("previous orientationLock isn't finished"); + // Previous API call isn't finished. Keep angle and run it. + if (needLock == EINA_TRUE) { + // Screen.lockOrientation + This->m_deferredRotateAngle = orientation; + } else { + // Screen.unlockOrientation + This->m_deferredRotateAngle = + ViewModule::OrientationSupport::DEFERRED_ORIENTATION_UNLOCK; + } + return EINA_TRUE; + } + + This->m_rotateAngle = orientation; + + if (needLock == EINA_TRUE) { + // Screen.lockOrientation + int winAngle = + ViewModule::OrientationSupport::getWinOrientationAngle(orientation); + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(winAngle); + } + ewk_context_tizen_extensible_api_string_set( + This->m_ewkContext, + EXTENSIBLE_API_ROTATION_LOCK, + EINA_TRUE); + This->m_orientationThresholdTimer = + ecore_timer_add(ORIENTATION_THRESHOLD, + orientationThresholdTimerCallback, + This); + } else { + // Screen.unlockOrientation + if (This->m_model->SettingList.Get().getRotationValue() == + Screen_AutoRotation) + { + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(OrientationAngle::Window::UNLOCK); + } + This->m_rotateAngle = 0; + ewk_context_tizen_extensible_api_string_set( + This->m_ewkContext, + EXTENSIBLE_API_ROTATION_LOCK, + EINA_FALSE); + } + } + return EINA_TRUE; +} + +// Fullscreen API callbacks +void ViewLogic::enterFullscreenCallback( + void* data, + Evas_Object* obj, + void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + ViewLogicMessageSupport::setViewmodes( + This->m_ewkContext, + "fullscreen"); + + if (eventInfo) { + This->m_isFullscreenByPlatform = + *static_cast(eventInfo) == EINA_TRUE; + } + if (This->m_cbs->enterFullscreenCallback) { + This->m_cbs->enterFullscreenCallback(obj, eventInfo); + } +} + +void ViewLogic::exitFullscreenCallback( + void* data, + Evas_Object* obj, + void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + ViewLogicMessageSupport::setViewmodes( + This->m_ewkContext, + Message::ToInjectedBundle::SET_VIEWMODES_MSGBODY_EXIT); + + This->m_isFullscreenByPlatform = false; + if (This->m_cbs->exitFullscreenCallback) { + This->m_cbs->exitFullscreenCallback(obj, eventInfo); + } +} + +void ViewLogic::enabledVideoHwOverlayCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->enableVideoHwOverlayCallback) { + This->m_cbs->enableVideoHwOverlayCallback(obj, eventInfo); + } +} + +void ViewLogic::disabledVideoHwOverlayCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->disableVideoHwOverlayCallback) { + This->m_cbs->disableVideoHwOverlayCallback(obj, eventInfo); + } +} + +void ViewLogic::imeChangedCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("enter"); + Assert(data); + Assert(eventInfo); + ViewLogic* This = static_cast(data); + Eina_Rectangle *rect = static_cast(eventInfo); + This->m_imeWidth = rect->w; + This->m_imeHeight = rect->h; +} + +void ViewLogic::imeOpenedCallback( + void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("enter"); + Assert(data); + ViewLogic* This = static_cast(data); + + using namespace WrtPlugins::W3C; + SoftKeyboardChangeArgs args; + args.state = IME_STATE_ON; + args.width = This->m_imeWidth; + args.height = This->m_imeHeight; + This->fireJavascriptEvent( + static_cast(SoftKeyboardChangeCustomEvent), + &args); +} + +void ViewLogic::imeClosedCallback( + void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("enter"); + Assert(data); + ViewLogic* This = static_cast(data); + + using namespace WrtPlugins::W3C; + SoftKeyboardChangeArgs args; + args.state = IME_STATE_OFF; + This->fireJavascriptEvent( + static_cast(SoftKeyboardChangeCustomEvent), + &args); +} + +Eina_Bool ViewLogic::usermediaPermissionRequestCallback( + Evas_Object* /*obj*/, + Ewk_User_Media_Permission_Request* request, + void* userData) +{ + WrtLogD("called"); + + Assert(userData); + + ViewLogic* This = static_cast(userData); + DPL::OptionalBool ret = + This->m_privilegeSupport->getPrivilegeStatus(ViewModule::PrivilegeSupport::Privilege::MEDIACAPTURE); + if (ret) { + ewk_user_media_permission_reply(request, (*ret) ? EINA_TRUE : EINA_FALSE); + return EINA_TRUE; + } + + ViewModule::UsermediaSupport::usermediaPermissionRequest( + This->m_currentEwkView, + This->m_securityOriginSupport->getSecurityOriginDAO(), + request); + return EINA_TRUE; +} + +// helper method +CustomHandlerDB::CustomHandlerPtr getCustomHandlerFromData(void* data) +{ + Assert(data); + Ewk_Custom_Handlers_Data* handler = + static_cast(data); + CustomHandlerDB::CustomHandlerPtr customHandler( + new CustomHandlerDB::CustomHandler()); + const char* base_url = ewk_custom_handlers_data_base_url_get(handler); + if (base_url) { + WrtLogD("base url: %s", base_url); + customHandler->base_url = DPL::FromASCIIString(string(base_url)); + } + const char* url = ewk_custom_handlers_data_url_get(handler); + if (url) { + WrtLogD("url: %s", url); + customHandler->url = DPL::FromASCIIString(string(url)); + } + const char* target = ewk_custom_handlers_data_target_get(handler); + if (target) { + WrtLogD("target: %s", target); + customHandler->target = DPL::FromASCIIString(string(target)); + } + const char* title = ewk_custom_handlers_data_title_get(handler); + if (title) { + WrtLogD("title: %s", title); + customHandler->title = DPL::FromASCIIString(string(title)); + } + return customHandler; +} + +void ViewLogic::attachToCustomHandlersDao() +{ + if (!m_attachedToCustomHandlerDao) { + CustomHandlerDB::Interface::attachDatabaseRW(); + } +} + +void ViewLogic::detachFromCustomHandlersDao() +{ + if (m_attachedToCustomHandlerDao) { + CustomHandlerDB::Interface::detachDatabase(); + } +} + +const int protocolWhiteListLenth = 15; +char const * const protocolWhiteList[protocolWhiteListLenth] = { + "irc", + "geo", + "mailto", + "magnet", + "mms", + "news", + "nntp", + "sip", + "sms", + "smsto", + "ssh", + "tel", + "urn", + "webcal", + "xmpp" +}; + +const int contentBlackListLenth = 14; +char const * const contentBlackList[contentBlackListLenth] = { + "application/x-www-form-urlencoded", + "application/xhtml+xml", + "application/xml", + "image/gif", + "image/jpeg", + "image/png", + "image/svg+xml", + "multipart/x-mixed-replace", + "text/cache-manifest", + "text/css", + "text/html", + "text/ping", + "text/plain", + "text/xml" +}; + +/** + * Saves user's response from popup to custom handler. Saves Yes/No and remember + * state. + * @param response + * @param customHandler + */ +void saveUserResponse(Wrt::Popup::PopupResponse response, + CustomHandlerDB::CustomHandlerPtr customHandler) +{ + switch (response) { + case Wrt::Popup::YES_DO_REMEMBER: + WrtLogD("User allowed, remember"); + customHandler->user_decision = + static_cast + (CustomHandlerDB::Agreed | CustomHandlerDB::DecisionSaved); + break; + case Wrt::Popup::YES_DONT_REMEMBER: + WrtLogD("User allowed, don't remember"); + customHandler->user_decision = CustomHandlerDB::Agreed; + break; + case Wrt::Popup::NO_DO_REMEMBER: + WrtLogD("User didn't allow, remember"); + customHandler->user_decision = + static_cast + (CustomHandlerDB::Declined | CustomHandlerDB::DecisionSaved); + break; + case Wrt::Popup::NO_DONT_REMEMBER: + WrtLogD("User didn't allow, don't remember"); + customHandler->user_decision = CustomHandlerDB::Declined; + break; + } +} + +//TODO registration, checking if registered and unregistration can be done in +//common functions for both types of handlers. Only white and black lists +//have to be separated +//TODO attach database only one at the start (not in every callback?) +void ViewLogic::protocolHandlerRegistrationCallback(void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + Assert(data); + WrtLogD("enter"); + CustomHandlerDB::CustomHandlerPtr customHandler = + getCustomHandlerFromData(eventInfo); + + std::string scheme = DPL::ToUTF8String(customHandler->target); + if (scheme.empty()) { + WrtLogE("No scheme provided"); + //TODO what about securityError? + return; + } + bool matched = false; + //scheme on whiteList + for (int i = 0; i < protocolWhiteListLenth; ++i) { + if (0 == strcmp(protocolWhiteList[i], scheme.c_str())) { + WrtLogD("Match found, protocol can be handled"); + matched = true; + } + } + if (!matched) { + //starts with web+ and have at least 5 chars (lowercase ASCII) + if (strncmp("web+", scheme.c_str(), 4) || scheme.length() < 5) { + WrtLogW("Scheme neither on whitelist nor starts with \"web+\""); + //throw SecurityException + return; + } + int l = 4; + char c = scheme[l]; + while (c != '\0') { + if (c < 'a' || c > 'z') { + WrtLogW("Wrong char inside scheme. Only lowercase ASCII letters accepted"); + //throw SecurityException + return; + } + c = scheme[++l]; + } + } + + ViewLogic* This = static_cast(data); + WrtLogD("Creating handlers dao"); + This->attachToCustomHandlersDao(); + CustomHandlerDB::CustomHandlerDAO handlersDao(This->m_model->TizenId); + CustomHandlerDB::CustomHandlerPtr handler = + handlersDao.getProtocolHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + if (handler && (handler->user_decision & CustomHandlerDB::DecisionSaved)) { + WrtLogD("Protocol already registered - nothing to do"); + } else { + WrtLogD("Protocol handler not found"); + Wrt::Popup::PopupResponse response = + GlobalSettings::PopupsTestModeEnabled() ? Wrt::Popup:: + YES_DO_REMEMBER : + Wrt::Popup::PopupInvoker().askYesNoCheckbox( + PROTOCOL_HANDLER_ASK_TITLE, + PROTOCOL_HANDLER_ASK_MSG, + PROTOCOL_HANDLER_ASK_REMEMBER); + saveUserResponse(response, customHandler); + if (customHandler->user_decision == CustomHandlerDB::Declined) { + return; + } + if (customHandler->user_decision & CustomHandlerDB::Agreed) { + //TODO remove old default handler somehow from appsvc + WrtLogD("Registering appservice entry"); + int ret = appsvc_set_defapp(APPSVC_OPERATION_VIEW, + NULL, + DPL::ToUTF8String( + customHandler->target).c_str(), + DPL::ToUTF8String(This->m_model-> + TizenId).c_str()); + if (APPSVC_RET_OK != ret) { + WrtLogW("Appsvc entry failed: %d", ret); + //no database change + return; + } + } + handlersDao.registerProtocolHandler(*(customHandler.get())); + + WrtLogD("Protocal saved"); + } + + This->detachFromCustomHandlersDao(); +} + +void ViewLogic::protocolHandlerIsRegisteredCallback(void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("enter"); + CustomHandlerDB::CustomHandlerPtr customHandler = getCustomHandlerFromData( + eventInfo); + ViewLogic* This = static_cast(data); + WrtLogD("Creating handlers dao"); + This->attachToCustomHandlersDao(); + CustomHandlerDB::CustomHandlerDAO handlersDao(This->m_model->TizenId); + CustomHandlerDB::CustomHandlerPtr handler = + handlersDao.getProtocolHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + if (handler) { + if (handler->user_decision & CustomHandlerDB::Agreed) { + ewk_custom_handlers_data_result_set( + static_cast(eventInfo), + EWK_CUSTOM_HANDLERS_REGISTERED); + } else { + ewk_custom_handlers_data_result_set( + static_cast(eventInfo), + EWK_CUSTOM_HANDLERS_DECLINED); + } + } else { + ewk_custom_handlers_data_result_set( + static_cast(eventInfo), + EWK_CUSTOM_HANDLERS_NEW); + } + This->detachFromCustomHandlersDao(); +} + +void ViewLogic::protocolHandlerUnregistrationCallback(void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("enter"); + CustomHandlerDB::CustomHandlerPtr customHandler = + getCustomHandlerFromData(eventInfo); + ViewLogic* This = static_cast(data); + WrtLogD("Creating handlers dao"); + This->attachToCustomHandlersDao(); + CustomHandlerDB::CustomHandlerDAO handlersDao(This->m_model->TizenId); + CustomHandlerDB::CustomHandlerPtr handlerCheck = + handlersDao.getProtocolHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + This->detachFromCustomHandlersDao(); + if (handlerCheck) { + if (handlerCheck->user_decision & CustomHandlerDB::Agreed) { + int ret = appsvc_unset_defapp( + DPL::ToUTF8String(This->m_model->TizenId).c_str()); + if (APPSVC_RET_OK != ret) { + WrtLogW("Failed to unregister appsvc entry"); + return; + } + } + //if appsvc ok change custom_handlers_db + handlersDao.unregisterProtocolHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + } else { + WrtLogD("Nothing to unregister"); + } +} + +void ViewLogic::contentHandlerRegistrationCallback(void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + Assert(data); + WrtLogD("enter"); + CustomHandlerDB::CustomHandlerPtr customHandler = + getCustomHandlerFromData(eventInfo); + + std::string mimeType = DPL::ToUTF8String(customHandler->target); + if (mimeType.empty()) { + WrtLogE("No mimeType provided."); + return; + } + for (int i = 0; i < contentBlackListLenth; ++i) { + if (0 == strcmp(contentBlackList[i], mimeType.c_str())) { + WrtLogW("mimeType blacklisted"); + //throw SecurityException + return; + } + } + + ViewLogic* This = static_cast(data); + WrtLogD("Creating handlers dao"); + This->attachToCustomHandlersDao(); + CustomHandlerDB::CustomHandlerDAO handlersDao(This->m_model->TizenId); + CustomHandlerDB::CustomHandlerPtr handler = + handlersDao.getContentHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + if (handler && (handler->user_decision & CustomHandlerDB::DecisionSaved)) { + WrtLogD("Protocol already registered - nothing to do"); + } else { + WrtLogD("Protocol handler not found"); + Wrt::Popup::PopupResponse response = + GlobalSettings::PopupsTestModeEnabled() ? Wrt::Popup:: + YES_DO_REMEMBER : + Wrt::Popup::PopupInvoker().askYesNoCheckbox( + CONTENT_HANDLER_ASK_TITLE, + CONTENT_HANDLER_ASK_MSG, + CONTENT_HANDLER_AKS_REMEMBER); + saveUserResponse(response, customHandler); + if (customHandler->user_decision == CustomHandlerDB::Declined) { + return; + } + if (customHandler->user_decision & CustomHandlerDB::Agreed) { + //TODO remove old default handler somehow from appsvc + WrtLogD("Registering appservice entry"); + int ret = appsvc_set_defapp(APPSVC_OPERATION_VIEW, + DPL::ToUTF8String( + customHandler->target).c_str(), + NULL, + DPL::ToUTF8String(This->m_model-> + TizenId).c_str()); + if (APPSVC_RET_OK != ret) { + WrtLogW("Appsvc entry failed: %d", ret); + return; + } + } + handlersDao.registerContentHandler(*(customHandler.get())); + WrtLogD("Content saved"); + } + This->detachFromCustomHandlersDao(); +} + +void ViewLogic::contentHandlerIsRegisteredCallback(void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("enter"); + CustomHandlerDB::CustomHandlerPtr customHandler = + getCustomHandlerFromData(eventInfo); + ViewLogic* This = static_cast(data); + WrtLogD("Creating handlers dao"); + + This->attachToCustomHandlersDao(); + CustomHandlerDB::CustomHandlerDAO handlersDao(This->m_model->TizenId); + CustomHandlerDB::CustomHandlerPtr handler = + handlersDao.getContentHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + if (handler) { + if (handler->user_decision & CustomHandlerDB::Agreed) { + ewk_custom_handlers_data_result_set( + static_cast(eventInfo), + EWK_CUSTOM_HANDLERS_REGISTERED); + } else { + ewk_custom_handlers_data_result_set( + static_cast(eventInfo), + EWK_CUSTOM_HANDLERS_DECLINED); + } + } else { + ewk_custom_handlers_data_result_set( + static_cast(eventInfo), + EWK_CUSTOM_HANDLERS_NEW); + } + This->detachFromCustomHandlersDao(); +} + +void ViewLogic::contentHandlerUnregistrationCallback(void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("enter"); + CustomHandlerDB::CustomHandlerPtr customHandler = + getCustomHandlerFromData(eventInfo); + ViewLogic* This = static_cast(data); + WrtLogD("Creating handlers dao"); + This->attachToCustomHandlersDao(); + CustomHandlerDB::CustomHandlerDAO handlersDao(This->m_model->TizenId); + CustomHandlerDB::CustomHandlerPtr handlerCheck = + handlersDao.getContentHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + This->detachFromCustomHandlersDao(); + if (handlerCheck) { + if (handlerCheck->user_decision & CustomHandlerDB::Agreed) { + int ret = appsvc_unset_defapp( + DPL::ToUTF8String(This->m_model->TizenId).c_str()); + if (APPSVC_RET_OK != ret) { + WrtLogW("Failed to unregister mime handler from appsvc"); + return; + } + } + handlersDao.unregisterContentHandler(customHandler->target, + customHandler->url, + customHandler->base_url); + } else { + WrtLogD("Nothing to unregister"); + } +} + +void ViewLogic::didRunJavaScriptCallback( + Evas_Object* /*obj*/, + const char* result, + void* /*userData*/) +{ + WrtLogD("didRunJavaScriptCallback called"); + WrtLogD("result = %s", result); +} + +void ViewLogic::eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + Assert(obj); + + ViewLogic* This = static_cast(data); + + Ea_Callback_Type keyType = + static_cast(reinterpret_cast(eventInfo)); + + WrtLogD("Key = [%d]", keyType); + + std::string keyName; + if (keyType == EA_CALLBACK_BACK) { + Assert(obj); + // Call fullscreen exit API + // In case of fullscreen is entered by platform(default video tag), + // automatically exit fullscreen when backkey is selected + if (This->m_isFullscreenByPlatform) { + ewk_view_fullscreen_exit(obj); + return; + } + + // Call text selection clear API + // In case of current state is selection mode, + // application doesn't need to handle back key + if (EINA_TRUE == ewk_view_text_selection_clear(obj)) { + return; + } + keyName = KeyName::BACK; + } else if (keyType == EA_CALLBACK_MORE) { + keyName = KeyName::MENU; + } else { + return; + } + + if (This->m_model->SettingList.Get().getHWkeyEvent() == HWkeyEvent_Enable) + { + DispatchEventSupport::dispatchHwKeyEvent(obj, keyName); + } + if (This->m_cbs->keyCallback) { + This->m_cbs->keyCallback(obj, eventInfo); + } + + return; +} + +Eina_Bool ViewLogic::windowCloseIdlerCallback(void* data) +{ + WrtLogD("closeIdlerCallback"); + ViewLogic* This = static_cast(data); + This->windowClose(); + return ECORE_CALLBACK_CANCEL; +} + +Eina_Bool ViewLogic::exceededDatabaseQuotaCallback(Evas_Object* obj, + Ewk_Security_Origin* origin, + const char* , + unsigned long long , + void* data) +{ + WrtLogD("exceededDatabaseQuotaCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); + ViewModule::WebStorageSupport::createPermissionRequest( + This->m_currentEwkView, + This->m_securityOriginSupport->getSecurityOriginDAO(), + obj, + origin, + ewk_view_exceeded_database_quota_reply); + return EINA_TRUE; +} + +Eina_Bool ViewLogic::exceededIndexedDatabaseQuotaCallback(Evas_Object* obj, + Ewk_Security_Origin* origin, + long long , + void* data) +{ + WrtLogD("exceededIndexedDatabaseQuotaCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); + ViewModule::WebStorageSupport::createPermissionRequest( + This->m_currentEwkView, + This->m_securityOriginSupport->getSecurityOriginDAO(), + obj, + origin, + ewk_view_exceeded_indexed_database_quota_reply); + return EINA_TRUE; +} + +Eina_Bool ViewLogic::exceededLocalFileSystemQuotaCallback(Evas_Object* obj, + Ewk_Security_Origin* origin, + long long , + void* data) +{ + WrtLogD("exceededLocalFileSystemQuotaCallback called"); + Assert(data); + ViewLogic* This = static_cast(data); + ViewModule::WebStorageSupport::createPermissionRequest( + This->m_currentEwkView, + This->m_securityOriginSupport->getSecurityOriginDAO(), + obj, + origin, + ewk_view_exceeded_local_file_system_quota_reply); + return EINA_TRUE; +} + +void ViewLogic::certificateConfirmRequestCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("certificateConfirmRequestCallback called"); + + Assert(data); + ViewLogic* This = static_cast(data); + Assert(eventInfo); + ViewModule::CertificateConfirmSupport::certificatePermissionRequest( + This->m_currentEwkView, + This->m_certificateSupport->getCertificateDAO(), + eventInfo); +} + +#if USE(WEBKIT_UPVERSION) +void ViewLogic::authenticationRequestCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("authenticationRequestCallback called"); + Assert(data); + Assert(eventInfo); + + ViewLogic* This = static_cast(data); + const char* url = ewk_view_url_get(This->m_currentEwkView); + if (!url || strlen(url) == 0) { + Ewk_Auth_Request* authRequest = static_cast(eventInfo); + ewk_auth_request_cancel(authRequest); + return; + } + ViewModule::AuthenticationRequestSupport::authenticationRequest( + This->m_currentEwkView, + url, + eventInfo); +} +#else +void ViewLogic::authenticationChallengeRequestCallback( + void* data, + Evas_Object* /*obj*/, + void* eventInfo) +{ + WrtLogD("authenticationChallengeRequestCallback called"); + Assert(data); + Assert(eventInfo); + + ViewLogic* This = static_cast(data); + const char* url = ewk_view_url_get(This->m_currentEwkView); + if (!url || strlen(url) == 0) { + Ewk_Auth_Challenge* authChallenge = static_cast(eventInfo); + ewk_auth_challenge_credential_cancel(authChallenge); + return; + } + ViewModule::AuthenticationChallengeSupport::authenticationChallengeRequest( + This->m_currentEwkView, + url, + eventInfo); +} +#endif // USE(WEBKIT_UPVERSION) + +void ViewLogic::viewFrameRenderedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + static bool logEnable = (getenv("WRT_FRAME_RENDERED_LOG_ENABLE") != NULL); + if (logEnable) { + WrtLogD("enter"); + } + Assert(data); + ViewLogic* This = static_cast(data); + if (This->m_cbs->frameRenderedCallback) { + This->m_cbs->frameRenderedCallback(obj, eventInfo); + } +} + +void ViewLogic::mediacontrolRotateHorizontal(void* data, + Evas_Object* obj, + void* /*eventInfo*/) +{ + WrtLogD("mediacontrolRotateHorizontal called"); + Assert(data); + Assert(obj); + ViewLogic* This = static_cast(data); + ViewModule::OrientationSupport::setEwkOrientation( + obj, + OrientationAngle::W3C::Landscape::PRIMARY); + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(OrientationAngle::Window::Landscape::PRIMARY); + } +} + +void ViewLogic::mediacontrolRotateVertical(void* data, + Evas_Object* obj, + void* /*eventInfo*/) +{ + WrtLogD("mediacontrolRotateVertical called"); + Assert(data); + Assert(obj); + ViewLogic* This = static_cast(data); + ViewModule::OrientationSupport::setEwkOrientation( + obj, + OrientationAngle::W3C::Portrait::PRIMARY); + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(OrientationAngle::Window::Portrait::PRIMARY); + } +} + +void ViewLogic::mediacontrolRotateExit(void* data, + Evas_Object* obj, + void* /*eventInfo*/) +{ + WrtLogD("mediacontrolRotateExit called"); + Assert(data); + Assert(obj); + ViewLogic* This = static_cast(data); + + int w3cAngle = 0; + int winAngle = 0; + if (This->m_rotateAngle == 0) { + // application hasn't call orientation lock + WidgetSettingScreenLock screenLock = + This->m_model->SettingList.Get().getRotationValue(); + if (screenLock == Screen_Portrait) { + w3cAngle = OrientationAngle::W3C::Portrait::PRIMARY; + winAngle = OrientationAngle::Window::Portrait::PRIMARY; + } else if (screenLock == Screen_Landscape) { + w3cAngle = OrientationAngle::W3C::Landscape::PRIMARY; + winAngle = OrientationAngle::Window::Landscape::PRIMARY; + } else if (screenLock == Screen_AutoRotation) { + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(OrientationAngle::Window::UNLOCK); + } + return; + } + } else { + // Restore previous orientation + w3cAngle = + ViewModule::OrientationSupport::getW3COrientationAngle( + This->m_rotateAngle); + winAngle = + ViewModule::OrientationSupport::getWinOrientationAngle( + This->m_rotateAngle); + } + + ViewModule::OrientationSupport::setEwkOrientation(obj, w3cAngle); + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(winAngle); + } + +} + +Eina_Bool ViewLogic::orientationThresholdTimerCallback(void* data) +{ + WrtLogD("orientationThresholdTimerCallback"); + ViewLogic* This = static_cast(data); + + if (This->m_deferredRotateAngle == + ViewModule::OrientationSupport::DEFERRED_ORIENTATION_EMPTY) + { + // There is no defered orientation API call + This->m_orientationThresholdTimer = NULL; + return ECORE_CALLBACK_CANCEL; + } + + if (This->m_deferredRotateAngle != This->m_rotateAngle) { + This->m_rotateAngle = This->m_deferredRotateAngle; + int w3cAngle = 0; + int winAngle = 0; + if (This->m_rotateAngle == 0) { + WidgetSettingScreenLock screenLock = + This->m_model->SettingList.Get().getRotationValue(); + if (screenLock == Screen_Portrait) { + w3cAngle = OrientationAngle::W3C::Portrait::PRIMARY; + winAngle = OrientationAngle::Window::Portrait::PRIMARY; + } else if (screenLock == Screen_Landscape) { + w3cAngle = OrientationAngle::W3C::Landscape::PRIMARY; + winAngle = OrientationAngle::Window::Landscape::PRIMARY; + } else if (screenLock == Screen_AutoRotation) { + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(OrientationAngle::Window::UNLOCK); + } + This->m_orientationThresholdTimer = NULL; + return ECORE_CALLBACK_CANCEL; + } + } else { + // Restore previous orientation + w3cAngle = + ViewModule::OrientationSupport::getW3COrientationAngle( + This->m_rotateAngle); + winAngle = + ViewModule::OrientationSupport::getWinOrientationAngle( + This->m_rotateAngle); + } + + ViewModule::OrientationSupport::setEwkOrientation( + This->m_currentEwkView, + w3cAngle); + if (This->m_cbs->orientationLockCallback) { + This->m_cbs->orientationLockCallback(winAngle); + } + This->m_deferredRotateAngle = + ViewModule::OrientationSupport::DEFERRED_ORIENTATION_EMPTY; + return ECORE_CALLBACK_RENEW; + } + + This->m_orientationThresholdTimer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +void ViewLogic::popupReplyWaitStart(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + This->m_isPopupReplyWait = true; + if (This->m_cbs->popupReplyWaitStartCallback) { + This->m_cbs->popupReplyWaitStartCallback(obj, eventInfo); + } +} + +void ViewLogic::popupReplyWaitFinish(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + + ViewLogic* This = static_cast(data); + This->m_isPopupReplyWait = false; + if (This->m_cbs->popupReplyWaitFinishCallback) { + This->m_cbs->popupReplyWaitFinishCallback(obj, eventInfo); + } +} + +void ViewLogic::consoleMessageCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->consoleMessageCallback) { + This->m_cbs->consoleMessageCallback(obj, eventInfo); + } +} + +void ViewLogic::rotatePreparedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + + ViewLogic* This = static_cast(data); + if (This->m_cbs->rotatePreparedCallback) { + This->m_cbs->rotatePreparedCallback(obj, eventInfo); + } +} + +void ViewLogic::windowClose() +{ + WrtLogD("windowClose"); + AssertMsg(m_closedEwkView, "no closed webview"); + + if (1 >= m_ewkViewList.size()) { + if (m_cbs->processExitCallback) { + m_cbs->processExitCallback(m_closedEwkView, NULL); + } + } else { + // call user callbacks + if (m_cbs->unsetWebviewCallback) { + m_cbs->unsetWebviewCallback(m_currentEwkView); + } + removeEwkView(m_closedEwkView); + + // get latest ewkView + m_currentEwkView = m_ewkViewList.back(); + + setEwkViewVisible(m_currentEwkView); + + // show ewkView + if (m_cbs->setWebviewCallback) { + m_cbs->setWebviewCallback(m_currentEwkView); + } + } +} + +void ViewLogic::systemSettingsChangedCallback(system_settings_key_e key, + void* data) +{ + WrtLogD("systemSettingsChanged"); + WrtLogD("System setting Key is [%d]", key); + + Assert(data); + ViewLogic* This = static_cast(data); + + if (SYSTEM_SETTINGS_KEY_FONT_TYPE == key) { + if (!This->m_currentEwkView) { + WrtLogE("ewkView isn't initialized"); + return; + } + ewk_view_use_settings_font(This->m_currentEwkView); + } else { + WrtLogE("Unregister system callback is called"); + } +} + diff --git a/src/view/webkit/view_logic.h b/src/view/webkit/view_logic.h new file mode 100644 index 0000000..f952cb0 --- /dev/null +++ b/src/view/webkit/view_logic.h @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @brief Declaration file for view logic for Webkit2 + */ + +#ifndef VIEW_LOGIC_H_ +#define VIEW_LOGIC_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace ViewModule { +class CertificateSupport; +class PrivilegeSupport; +class SecurityOriginSupport; +class WebNotificationSupport; +} + +class ViewLogic : public ViewModule::IViewModule +{ + public: + ViewLogic(); + virtual ~ViewLogic(); + + // IViewModule Impl + bool createWebView(Ewk_Context* context, + Evas_Object* window); + void destroyWebView(); + void prepareView(WidgetModel* m, const std::string &startUrl); + void showWidget(); + void hideWidget(); + void suspendWidget(); + void resumeWidget(); + void setWidgetUrl(const std::string &startUrl); + void resetWidgetFromSuspend(); + void resetWidgetFromResume(); + void backward(); + void reloadStartPage(); + Evas_Object* getCurrentWebview(); + void fireJavascriptEvent(int event, void* data); + void setUserCallbacks(const WRT::UserDelegatesPtr& cbs); + void checkSyncMessageFromBundle( + const char* name, + const char* body, + char** returnData); + void checkAsyncMessageFromBundle( + const char* name, + const char* body); + void downloadData(const char* url); + void activateVibration(bool on, uint64_t time); + + + private: + void initializeSupport(); + void initializePluginLoading(); + void initializeXwindowHandle(); + void resetWidgetCommon(); + + // EwkView operations + void ewkClientInit(Evas_Object *wkView); + void ewkClientDeinit(Evas_Object *wkView); + bool createEwkView(Evas* canvas); + void prepareEwkView(Evas_Object *wkView); + void removeEwkView(Evas_Object *wkView); + void setEwkViewVisible(Evas_Object *wkView); + void setEwkViewInvisible(Evas_Object *wkView); + void resumeWebkit(Evas_Object *wkView); + void suspendWebkit(Evas_Object *wkView); + + // WKPageLoaderClient + static void loadStartedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void loadFinishedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void loadProgressStartedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void loadProgressCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void loadProgressFinishedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void processCrashedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void webProcessCrashedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + // EWK Callback + static void createWindowCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void closeWindowCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + // EWK PolicyDecide Callback + static void policyNavigationDecideCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void policyNewWindowDecideCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void pageResponseDecideCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + // EWK ContextMenu Callback + static void contextmenuCustomizeCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + // EWK Geolocation Callback + static Eina_Bool geolocationPermissionRequestCallback( + Evas_Object* obj, + Ewk_Geolocation_Permission_Request* geolocationPermissionRequest, + void* userData); + + // EWK Notification Callback + static void notificationShowCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void notificationCancelCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static Eina_Bool notificationPermissionRequestCallback( + Evas_Object* obj, + Ewk_Notification_Permission_Request* request, + void* userData); + + // EWK Orientation Callback + static Eina_Bool orientationLockCallback( + Evas_Object* obj, + Eina_Bool needLock, + int orientation, + void* data); + + // EWK Fullscreen API callbacks + static void enterFullscreenCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void exitFullscreenCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + static void enabledVideoHwOverlayCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + static void disabledVideoHwOverlayCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + // EWK IME Change/Show/Hide Callback + static void imeChangedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void imeOpenedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + static void imeClosedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + // EWK Usermedia Callback + static Eina_Bool usermediaPermissionRequestCallback( + Evas_Object* obj, + Ewk_User_Media_Permission_Request* request, + void* userData); + + // custom content/scheme handlers + static void protocolHandlerRegistrationCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void protocolHandlerIsRegisteredCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void protocolHandlerUnregistrationCallback(void* data, + Evas_Object* obj, + void* eventInfo); + + static void contentHandlerRegistrationCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void contentHandlerIsRegisteredCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void contentHandlerUnregistrationCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static Eina_Bool exceededDatabaseQuotaCallback(Evas_Object* obj, + Ewk_Security_Origin* origin, + const char* databaseName, + unsigned long long expectedQuota, + void* data); + static Eina_Bool exceededIndexedDatabaseQuotaCallback(Evas_Object* obj, + Ewk_Security_Origin* origin, + long long expectedQuota, + void* data); + static Eina_Bool exceededLocalFileSystemQuotaCallback(Evas_Object* obj, + Ewk_Security_Origin* origin, + long long expectedQuota, + void* data); + static void certificateConfirmRequestCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + +#if USE(WEBKIT_UPVERSION) + static void authenticationRequestCallback( + void* data, + Evas_Object* obj, + void* eventInfo); +#else + static void authenticationChallengeRequestCallback( + void* data, + Evas_Object* obj, + void* eventInfo); +#endif + static void viewFrameRenderedCallback( + void* data, + Evas_Object* obj, + void* eventInfo); + + static void mediacontrolRotateHorizontal(void* data, + Evas_Object* obj, + void* eventInfo); + static void mediacontrolRotateVertical(void* data, + Evas_Object* obj, + void* eventInfo); + static void mediacontrolRotateExit(void* data, + Evas_Object* obj, + void* eventInfo); + static void popupReplyWaitStart(void* data, + Evas_Object* obj, + void* eventInfo); + static void popupReplyWaitFinish(void* data, + Evas_Object* obj, + void* eventInfo); + static void consoleMessageCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void rotatePreparedCallback(void* data, Evas_Object* obj, void* eventInfo); + + void attachToCustomHandlersDao(); + void detachFromCustomHandlersDao(); + + // JS execute callback + static void didRunJavaScriptCallback( + Evas_Object* obj, + const char* result, + void* userData); + + // event callback + static void eaKeyCallback(void* data, + Evas_Object* obj, + void* eventInfo); + + // idler callback + static Eina_Bool windowCloseIdlerCallback(void *data); + + // timer callback + static Eina_Bool orientationThresholdTimerCallback(void* data); + + // window + void windowClose(void); + + // system settings + static void systemSettingsChangedCallback(system_settings_key_e key, void* data); + + Ewk_Context* m_ewkContext; + bool m_attachedToCustomHandlerDao; + std::list m_ewkViewList; + Evas_Object* m_currentEwkView; + Evas_Object* m_closedEwkView; + Evas_Object* m_window; + WidgetModel* m_model; + std::string m_blockedUri; + std::string m_theme; + std::string m_startUrl; + WRT::UserDelegatesPtr m_cbs; + size_t m_imeWidth; + size_t m_imeHeight; + bool m_isBackgroundReload; + bool m_isBackgroundSupport; + int m_rotateAngle; + int m_deferredRotateAngle; + Ecore_Timer* m_orientationThresholdTimer; + // TODO: change name to m_isWebkitBlocked + bool m_isPopupReplyWait; + bool m_isFullscreenByPlatform; + + std::unique_ptr m_appsSupport; + std::unique_ptr m_vibrationSupport; + std::unique_ptr m_securityOriginSupport; + std::unique_ptr m_certificateSupport; + std::unique_ptr m_privilegeSupport; + std::unique_ptr m_webNotificationSupport; + + static std::map m_ewkCallbacksMap; +}; + +#endif //VIEW_LOGIC_H_ diff --git a/src/view/webkit/view_logic_authentication_challenge_support.cpp b/src/view/webkit/view_logic_authentication_challenge_support.cpp new file mode 100644 index 0000000..f9da82a --- /dev/null +++ b/src/view/webkit/view_logic_authentication_challenge_support.cpp @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_authentication_challenge_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "view_logic_authentication_challenge_support.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace ViewModule { +namespace { +struct authenticationData { + Ewk_Auth_Challenge* m_authChallenge; + std::string m_bodyText; + Evas_Object* m_navi; + Evas_Object* m_idEdit; + Evas_Object* m_pwEdit; +}; + +// function declare +void askUserInformation(authenticationData* authData); +void loginAuthentication(authenticationData* authData); +void cancelAuthentication(authenticationData* authData); +Evas_Object* getEvasObjectByWidgetName(Evas_Object* obj, const char* name); +Evas_Object* createEdit(Evas_Object* parent, bool isIdEdit); +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); +void buttonClickedCallback(void* data, Evas_Object* obj, void* eventInfo); +void editActivatedCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserInformation(authenticationData* authData) +{ + Evas_Object* popup = elm_popup_add(authData->m_navi); + + elm_object_style_set(popup, "popup/default"); + evas_object_size_hint_weight_set(popup , EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup , EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_domain_translatable_part_text_set(popup, "title,text", "wrt", WRT_BODY_AUTHENTICATION_REQUIRED_IDS); + + ea_object_event_callback_add(popup, EA_CALLBACK_BACK, eaKeyCallback, authData); + + Evas_Object* layout = elm_layout_add(popup); + elm_layout_file_set(layout, WRT_EDJ_PATH, "authChallengePopup"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* label = elm_label_add(layout); + elm_label_line_wrap_set(label , ELM_WRAP_WORD); + elm_object_text_set(label, authData->m_bodyText.c_str()); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object* idEdit = createEdit(layout, true); + authData->m_idEdit = idEdit; + + Evas_Object* pwEdit = createEdit(layout, false); + authData->m_pwEdit = pwEdit; + + elm_object_part_content_set(layout, "elm.swallow.label", label); + elm_object_part_content_set(layout, "elm.swallow.idfield", idEdit); + elm_object_part_content_set(layout, "elm.swallow.pwfield", pwEdit); + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.swallow.idtext", WRT_BODY_AUTHUSERNAME); + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.swallow.pwtext", WRT_BODY_PASSWORD); + elm_object_content_set(popup, layout); + + Evas_Object* cancelButton = elm_button_add(popup); + elm_object_domain_translatable_part_text_set(cancelButton, 0, "wrt", WRT_SK_CANCEL_IDS); + elm_object_style_set(cancelButton, "popup"); + elm_object_part_content_set(popup, "button1", cancelButton); + evas_object_smart_callback_add(cancelButton, "clicked", buttonClickedCallback, static_cast(authData)); + + Evas_Object* loginButton = elm_button_add(popup); + elm_object_domain_translatable_part_text_set(loginButton, 0, "sys_string", WRT_SK_LOGIN_IDS); + elm_object_style_set(loginButton, "popup"); + elm_object_part_content_set(popup, "button2", loginButton); + evas_object_smart_callback_add(loginButton, "clicked", buttonClickedCallback, static_cast(authData)); + + evas_object_show(popup); +} + +void loginAuthentication(authenticationData* authData) +{ + WrtLogD("called"); + + Assert(authData); + + const char* id = elm_entry_entry_get(authData->m_idEdit); + const char* pw = elm_entry_entry_get(authData->m_pwEdit); + ewk_auth_challenge_credential_use(authData->m_authChallenge, const_cast(id), const_cast(pw)); + + Evas_Object* popup = getEvasObjectByWidgetName(authData->m_idEdit, "elm_popup"); + if (popup) { + evas_object_hide(popup); + evas_object_del(popup); + } +} + +void cancelAuthentication(authenticationData* authData) +{ + WrtLogD("called"); + + Assert(authData); + + ewk_auth_challenge_credential_cancel(authData->m_authChallenge); + + Evas_Object* popup = getEvasObjectByWidgetName(authData->m_idEdit, "elm_popup"); + if (popup) { + evas_object_hide(popup); + evas_object_del(popup); + } +} + +Evas_Object* getEvasObjectByWidgetName(Evas_Object* obj, const char* name) +{ + Assert(obj); + Evas_Object* current = elm_object_parent_widget_get(obj); + while (strcmp(elm_object_widget_type_get(current), name)) { + current = elm_object_parent_widget_get(current); + if (!current) { + return NULL; + } + } + return current; +} + +Evas_Object* createEdit(Evas_Object* parent, bool isIdEdit) +{ + Evas_Object* edit = ea_editfield_add(parent, EA_EDITFIELD_SCROLL_SINGLELINE); + elm_entry_cnp_mode_set(edit, ELM_CNP_MODE_PLAINTEXT); + elm_object_style_set(edit, "editfield/password/popup"); + elm_entry_single_line_set(edit, EINA_TRUE); + elm_entry_scrollable_set(edit, EINA_TRUE); + elm_entry_prediction_allow_set(edit, EINA_FALSE); + elm_object_signal_emit(edit, "elm,action,hide,search_icon", ""); + elm_entry_autocapital_type_set(edit, ELM_AUTOCAPITAL_TYPE_NONE); + + if (isIdEdit) { + evas_object_smart_callback_add(edit, "activated", editActivatedCallback, NULL); + } else { + elm_entry_password_set(edit, EINA_TRUE); + elm_entry_input_panel_layout_set(edit, ELM_INPUT_PANEL_LAYOUT_PASSWORD); + } + + return edit; +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + Assert(data); + + authenticationData* authData = static_cast(data); + cancelAuthentication(authData); +} + +void buttonClickedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(eventInfo); + + Assert(data); + Assert(obj); + + bool isLogin = !strcmp(WRT_SK_LOGIN, elm_object_text_get(obj)); + + authenticationData* authData = static_cast(data); + if (isLogin) { + loginAuthentication(authData); + } else { + cancelAuthentication(authData); + } +} + +void editActivatedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(eventInfo); + DPL_UNUSED_PARAM(data); + + Assert(obj); + elm_object_focus_set(obj, EINA_TRUE); +} +} // namespace + +void AuthenticationChallengeSupport::authenticationChallengeRequest( + Evas_Object* webview, + std::string url, + void* data) +{ + WrtLogD("called"); + authenticationData* authData = new authenticationData(); + Assert(webview); + authData->m_navi = getEvasObjectByWidgetName(webview, "elm_naviframe"); + + Assert(data); + authData->m_authChallenge = static_cast(data); + + const char* authRealm = + ewk_auth_challenge_realm_get(authData->m_authChallenge); + authData->m_bodyText = url; + if (authRealm != NULL) { + authData->m_bodyText += "
"; + authData->m_bodyText += std::string(authRealm); + } + ewk_auth_challenge_suspend(authData->m_authChallenge); + + // ask to user + askUserInformation(authData); +} +} // namespace ViewModule diff --git a/src/view/webkit/view_logic_authentication_challenge_support.h b/src/view/webkit/view_logic_authentication_challenge_support.h new file mode 100644 index 0000000..8aa9b0d --- /dev/null +++ b/src/view/webkit/view_logic_authentication_challenge_support.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_authentication_challenge_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_AUTHENTICATION_CHALLENGE_SUPPORT_H_ +#define VIEW_LOGIC_AUTHENTICATION_CHALLENGE_SUPPORT_H_ + +#include +#include + +namespace ViewModule { +namespace AuthenticationChallengeSupport { +void authenticationChallengeRequest( + Evas_Object* webview, + std::string url, + void* data); +} // namespace AuthenticationChallengeSupport +} // namespace ViewModule + +#endif // VIEW_LOGIC_AUTHENTICATION_CHALLENGE_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/webkit/view_logic_authentication_request_support.cpp b/src/view/webkit/view_logic_authentication_request_support.cpp new file mode 100644 index 0000000..d62c7f6 --- /dev/null +++ b/src/view/webkit/view_logic_authentication_request_support.cpp @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_authentication_request_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "view_logic_authentication_request_support.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace ViewModule { +namespace { + +const char* const EVAS_SMART_CALLBACK_CLICKED = "clicked"; +const char* const EVAS_SMART_CALLBACK_CHANGED = "changed"; +const char* const EVAS_SMART_CALLBACK_PREEDIT_CHANGED = "preedit,changed"; +const char* const EVAS_SMART_CALLBACK_FOCUSED = "focused"; +const char* const EVAS_SMART_CALLBACK_UNFOCUSED = "unfocused"; +const char* const ELM_SIGNAL_ERASER_CLICKED = "elm,eraser,clicked"; +const char* const ELM_SIGNAL_STATE_GUIDETEXT_HIDE = "elm,state,guidetext,hide"; +const char* const ELM_SIGNAL_STATE_ERASER_SHOW = "elm,state,eraser,show"; +const char* const ELM_SIGNAL_STATE_HIDE_SHOW = "elm,state,eraser,hide"; +const char* const ELM_SWALLOW_CONTENT = "elm.swallow.content"; +const char* const ELM_SWALLOW_LABEL = "elm.swallow.label"; +const char* const ELM_SWALLOW_IDFIELD = "elm.swallow.idfield"; +const char* const ELM_SWALLOW_PASSWDFIELD = "elm.swallow.passwdfield"; + +const char* const GROUP_NAME_AUTHENTICATION_REQUEST_POPUP = + "authChallengePopup"; +const char* const THEME_EDITFIELD = "editfield"; +const char* const THEME_DEFAULT = "default"; + +const char* const STYLE_POPUP_BUTTON_DEFAULT = "popup_button/default"; +const char* const STYLE_DEFAULT_EDITFIELD = + "DEFAULT='font_size=34 color=#808080 ellipsis=1'"; + +const char* const PART_IDFIELD_TEXT = "idfield_text"; +const char* const PART_PASSWORDFIELD_TEXT = "passwdfield_text"; +const char* const PART_BUTTON1 = "button1"; +const char* const PART_BUTTON2 = "button2"; + +const char* const ELM = "elm"; +const char* const TITLE_TEXT = "title,text"; +const char* const LAYOUT = "layout"; +const char* const ERASER = "eraser"; +const char* const WIDGET_NAME_POPUP = "elm_popup"; +const char* const WIDGET_NAME_NAVIFRAME = "elm_naviframe"; + +const char* const AUTHENTICATION_REQUEST_TITLE_TEXT = + "Authentication Requested"; +const char* const AUTHENTICATION_REQUEST_BODY_PRETEXT = + "A username and password are being requested by "; +const char* const AUTHENTICATION_REQUEST_BODY_MIDDLETEXT = + ". The site says: "; + +const char* const TEXT_DOUBLE_QUOTATION_MARKS = " \""; +const char* const TEXT_ID_FIELD = " User Name: "; +const char* const TEXT_PASSWORD_FIELD = " Password: "; +const char* const TEXT_OK = "Ok"; +const char* const TEXT_CANCEL = "Cancel"; + +struct authenticationData { + Ewk_Auth_Request* m_authRequest; + std::string m_bodyText; + Evas_Object* m_navi; + Evas_Object* m_idEdit; + Evas_Object* m_pwEdit; +}; + +// function declare +void askUserInformation(authenticationData* authData); +void loginAuthentication(authenticationData* authData); +void cancelAuthentication(authenticationData* authData); +Evas_Object* getEvasObjectByWidgetName(Evas_Object* obj, const char* name); +Evas_Object* createEdit(Evas_Object* parent, bool isIdEdit = false); +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); +void buttonClickedCallback(void* data, Evas_Object* obj, void* eventInfo); +void editActivatedCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserInformation(authenticationData* authData) +{ + Evas_Object* popup = elm_popup_add(authData->m_navi); + evas_object_size_hint_weight_set(popup, + EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_text_set(popup, + TITLE_TEXT, + AUTHENTICATION_REQUEST_TITLE_TEXT); + + Evas_Object* label = elm_label_add(popup); + evas_object_size_hint_weight_set(label, + EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + elm_label_line_wrap_set(label , ELM_WRAP_WORD); + elm_object_text_set(label, authData->m_bodyText.c_str()); + + authData->m_idEdit = createEdit(popup); + authData->m_pwEdit = createEdit(popup, true); + + Evas_Object* popupLayout = elm_layout_add(popup); + elm_layout_file_set(popupLayout, + WRT_EDJ_PATH, + GROUP_NAME_AUTHENTICATION_REQUEST_POPUP); + evas_object_size_hint_weight_set(popupLayout, + EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + /* FIXME : The text should be translated. */ + edje_object_part_text_set(elm_layout_edje_get(popupLayout), + PART_IDFIELD_TEXT, + TEXT_ID_FIELD); + edje_object_part_text_set(elm_layout_edje_get(popupLayout), + PART_PASSWORDFIELD_TEXT, + TEXT_PASSWORD_FIELD); + + elm_object_part_content_set(popupLayout, ELM_SWALLOW_LABEL, label); + elm_object_part_content_set(popupLayout, + ELM_SWALLOW_IDFIELD, + authData->m_idEdit); + elm_object_part_content_set(popupLayout, + ELM_SWALLOW_PASSWDFIELD, + authData->m_pwEdit); + elm_object_content_set(popup, popupLayout); + + Evas_Object* lButton = elm_button_add(popup); + elm_object_text_set(lButton, TEXT_OK); + elm_object_style_set(lButton, STYLE_POPUP_BUTTON_DEFAULT); + elm_object_part_content_set(popup, PART_BUTTON1, lButton); + evas_object_smart_callback_add(lButton, + EVAS_SMART_CALLBACK_CLICKED, + buttonClickedCallback, + static_cast(authData)); + + Evas_Object* rButton= elm_button_add(popup); + elm_object_text_set(rButton, TEXT_CANCEL); + elm_object_style_set(rButton, STYLE_POPUP_BUTTON_DEFAULT); + elm_object_part_content_set(popup, PART_BUTTON2, rButton); + evas_object_smart_callback_add(rButton, + EVAS_SMART_CALLBACK_CLICKED, + buttonClickedCallback, + static_cast(authData)); + + evas_object_show(popup); +} + +void loginAuthentication(authenticationData* authData) +{ + WrtLogD("called"); + + Assert(authData); + + const char* id = elm_entry_entry_get(authData->m_idEdit); + const char* pw = elm_entry_entry_get(authData->m_pwEdit); + ewk_auth_request_authenticate(authData->m_authRequest, const_cast(id), const_cast(pw)); + + Evas_Object* popup = getEvasObjectByWidgetName(authData->m_idEdit, "elm_popup"); + if (popup) { + evas_object_hide(popup); + evas_object_del(popup); + } +} + +void cancelAuthentication(authenticationData* authData) +{ + WrtLogD("called"); + + Assert(authData); + + ewk_auth_request_cancel(authData->m_authRequest); + + Evas_Object* popup = getEvasObjectByWidgetName(authData->m_idEdit, "elm_popup"); + if (popup) { + evas_object_hide(popup); + evas_object_del(popup); + } +} + +Evas_Object* getEvasObjectByWidgetName(Evas_Object* obj, const char* name) +{ + Assert(obj); + Evas_Object* current = elm_object_parent_widget_get(obj); + while (strcmp(elm_object_widget_type_get(current), name)) { + current = elm_object_parent_widget_get(current); + if (!current) { + return NULL; + } + } + return current; +} + +Evas_Object* createEdit(Evas_Object* parent, bool isIdEdit) +{ + Evas_Object* edit = ea_editfield_add(parent, EA_EDITFIELD_SCROLL_SINGLELINE); + elm_entry_cnp_mode_set(edit, ELM_CNP_MODE_PLAINTEXT); + elm_object_style_set(edit, "editfield/password/popup"); + elm_entry_single_line_set(edit, EINA_TRUE); + elm_entry_scrollable_set(edit, EINA_TRUE); + elm_entry_prediction_allow_set(edit, EINA_FALSE); + elm_object_signal_emit(edit, "elm,action,hide,search_icon", ""); + elm_entry_autocapital_type_set(edit, ELM_AUTOCAPITAL_TYPE_NONE); + + if (isIdEdit) { + evas_object_smart_callback_add(edit, "activated", editActivatedCallback, NULL); + } else { + elm_entry_password_set(edit, EINA_TRUE); + elm_entry_input_panel_layout_set(edit, ELM_INPUT_PANEL_LAYOUT_PASSWORD); + } + + return edit; +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + Assert(data); + + authenticationData* authData = static_cast(data); + cancelAuthentication(authData); +} + +void buttonClickedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(eventInfo); + + Assert(data); + Assert(obj); + + authenticationData* authData = static_cast(data); + Evas_Object* popup = getEvasObjectByWidgetName(obj, WIDGET_NAME_POPUP); + + bool allow = !strcmp(TEXT_OK, elm_object_text_get(obj)); + if (allow) { + const char* id = + elm_entry_entry_get( + elm_object_part_content_get(authData->m_idEdit, + ELM_SWALLOW_CONTENT)); + const char* pw = + elm_entry_entry_get( + elm_object_part_content_get(authData->m_pwEdit, + ELM_SWALLOW_CONTENT)); + ewk_auth_request_authenticate(authData->m_authRequest, + const_cast(id), + const_cast(pw)); + } else { + ewk_auth_request_cancel(authData->m_authRequest); + } +} + +void editActivatedCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(eventInfo); + DPL_UNUSED_PARAM(data); + + Assert(obj); + elm_object_focus_set(obj, EINA_TRUE); +} +} // namespace + +void AuthenticationRequestSupport::authenticationRequest( + Evas_Object* webview, + std::string url, + void* data) +{ + WrtLogD("authenticationRequest called"); + authenticationData* authData = new authenticationData(); + Assert(webview); + authData->m_navi = getEvasObjectByWidgetName(webview, "elm_naviframe"); + + Assert(data); + authData->m_authRequest = static_cast(data); + + // create body text + // TODO : The text should be translated + const char* authRealm = ewk_auth_request_realm_get(authData->m_authRequest); + if (authRealm != NULL) { + authData->m_bodyText = + std::string(AUTHENTICATION_REQUEST_BODY_PRETEXT) + + std::string(url) + + std::string(AUTHENTICATION_REQUEST_BODY_MIDDLETEXT) + + std::string(TEXT_DOUBLE_QUOTATION_MARKS) + + std::string(authRealm) + + std::string(TEXT_DOUBLE_QUOTATION_MARKS); + } + ewk_auth_request_suspend(authData->m_authRequest); + + // ask to user + askUserInformation(authData); +} +} // namespace ViewModule diff --git a/src/view/webkit/view_logic_authentication_request_support.h b/src/view/webkit/view_logic_authentication_request_support.h new file mode 100644 index 0000000..26a649f --- /dev/null +++ b/src/view/webkit/view_logic_authentication_request_support.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_authentication_request_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_AUTHENTICATION_REQUEST_SUPPORT_H_ +#define VIEW_LOGIC_AUTHENTICATION_REQUEST_SUPPORT_H_ + +#include +#include + +namespace ViewModule { +namespace AuthenticationRequestSupport { +void authenticationRequest( + Evas_Object* webview, + std::string url, + void* data); +} // namespace AuthenticationSupport +} // namespace ViewModule + +#endif // VIEW_LOGIC_AUTHENTICATION_REQUEST_SUPPORT_H_ diff --git a/src/view/webkit/view_logic_certificate_confirm_support.cpp b/src/view/webkit/view_logic_certificate_confirm_support.cpp new file mode 100644 index 0000000..98fe845 --- /dev/null +++ b/src/view/webkit/view_logic_certificate_confirm_support.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_certificate_confirm_support.cpp + * @author Leerang Song (leerang.song@samsung.com) + */ + +#include "view_logic_certificate_confirm_support.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +namespace CertificateConfirmSupport { +using namespace CertificateDB; +using namespace ViewModule::CertificateSupportUtil; + +namespace { + +// function declare +void askUserForCertificatePermission( + Evas_Object* window, + PermissionData* data); +void setPermissionResult(PermissionData* permData, Result result); +static void popupCallback(void* data, Evas_Object* obj, void* eventInfo); +static void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserForCertificatePermission( + Evas_Object* window, + PermissionData* data) +{ + WrtLogD("askUserForCertificatePermission called"); + Ewk_Certificate_Policy_Decision* certificatePolicyDecision = + static_cast(data->m_data); + Assert(certificatePolicyDecision); + + std::string msg = std::string(WRT_POP_CERTIFICATE_PERMISSION) + + " " + ewk_certificate_policy_decision_url_get(certificatePolicyDecision); + Evas_Object* popup = createPopup(window, + msg.c_str(), + WRT_BODY_REMEMBER_PREFERENCE_IDS, + popupCallback, + eaKeyCallback, + data); + + if (popup == NULL) { + WrtLogE("Fail to create popup object"); + delete data; + return; + } else { + evas_object_show(popup); + } +} + +void setPermissionResult(PermissionData* permData, Result result) +{ + Assert(permData); + Ewk_Certificate_Policy_Decision* certificatePolicyDecision = + static_cast(permData->m_data); + + if (result != RESULT_UNKNOWN) { + permData->m_certiDao->setCertificateData(permData->m_certiData, result); + } + + Eina_Bool ret = (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? EINA_TRUE : EINA_FALSE; + ewk_certificate_policy_decision_allowed_set(certificatePolicyDecision, ret); +} + +void popupCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, getResult(obj)); + delete permData; + + Evas_Object* popup = getPopup(obj); + evas_object_hide(popup); + evas_object_del(popup); +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, RESULT_DENY_ONCE); + delete permData; + + evas_object_hide(obj); + evas_object_del(obj); +} +} // namespace + +void certificatePermissionRequest( + Evas_Object* window, + CertificateDB::CertificateDAO* certificateDAO, + void* data) +{ + WrtLogD("certificationPermissionRequest called"); + Assert(certificateDAO); + Assert(data); + + Ewk_Certificate_Policy_Decision* certificatePolicyDecision = + static_cast(data); + ewk_certificate_policy_decision_suspend(certificatePolicyDecision); + Assert(certificatePolicyDecision); + + CertificateData certificateData( + DPL::FromUTF8String( + ewk_certificate_policy_decision_certificate_pem_get( + certificatePolicyDecision))); + + // check cache database + Result result = certificateDAO->getResult(certificateData); + + if (RESULT_ALLOW_ONCE == result || RESULT_ALLOW_ALWAYS == result) { + WrtLogD("allow"); + ewk_certificate_policy_decision_allowed_set( + certificatePolicyDecision, + EINA_TRUE); + return; + } else if (RESULT_DENY_ONCE == result || RESULT_DENY_ALWAYS == result) { + WrtLogD("Deny"); + ewk_certificate_policy_decision_allowed_set( + certificatePolicyDecision, + EINA_FALSE); + return; + } + // ask to user + PermissionData* permissionData = + new PermissionData(certificateDAO, + certificateData, + certificatePolicyDecision); + askUserForCertificatePermission(window, permissionData); + return; +} +} +} // namespace ViewModule diff --git a/src/view/webkit/view_logic_certificate_confirm_support.h b/src/view/webkit/view_logic_certificate_confirm_support.h new file mode 100755 index 0000000..8bd42ba --- /dev/null +++ b/src/view/webkit/view_logic_certificate_confirm_support.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_certificate_confirm_support.h + * @author Leerang Song (leerang.song@samsung.com) + */ + +#ifndef VIEW_LOGIC_CERTIFICATE_CONFIRM_SUPPORT_H_ +#define VIEW_LOGIC_CERTIFICATE_CONFIRM_SUPPORT_H_ + +#include +#include + +namespace CertificateDB { +class CertificateDAO; +} + +namespace ViewModule { +namespace CertificateConfirmSupport { +void certificatePermissionRequest( + Evas_Object* window, + CertificateDB::CertificateDAO* certificateDAO, + void* data); +} +} // namespace ViewModule + +#endif diff --git a/src/view/webkit/view_logic_geolocation_support.cpp b/src/view/webkit/view_logic_geolocation_support.cpp new file mode 100644 index 0000000..39e0cd1 --- /dev/null +++ b/src/view/webkit/view_logic_geolocation_support.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_geolocation_support.cpp + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + */ + +#include "view_logic_geolocation_support.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +namespace GeolocationSupport { +using namespace SecurityOriginDB; +using namespace ViewModule::SecurityOriginSupportUtil; + +namespace { +// function declare +void askUserForGeolocationPermission( + Evas_Object* window, + PermissionData* data); +void setPermissionResult(PermissionData* permData, Result result); +static void popupCallback(void* data, Evas_Object* obj, void* eventInfo); +static void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserForGeolocationPermission( + Evas_Object* window, + PermissionData* data) +{ + WrtLogD("askUserForGeolocationPermission called"); + std::string origin = DPL::ToUTF8String(data->m_originData.origin.host); + if (origin.empty()) { + origin = "local"; + } + std::string appname; + char* name = NULL; + if (app_get_name(&name) == APP_ERROR_NONE) { + appname = name; + free(name); + } else { + appname = "application"; + } + + std::string body = + WrtText::replacePS({WRT_POP_GEOLOCATION_PERMISSION, appname, origin}); + Evas_Object* popup = createPopup(window, + body.c_str(), + WRT_BODY_REMEMBER_PREFERENCE_IDS, + popupCallback, + eaKeyCallback, + data); + + if (popup == NULL) { + WrtLogE("Fail to create popup object"); + delete data; + return; + } else { + evas_object_show(popup); + } +} + +void setPermissionResult(PermissionData* permData, Result result) +{ + Assert(permData); + if (result != RESULT_UNKNOWN) { + permData->m_originDao->setSecurityOriginData(permData->m_originData, result); + } + + Ewk_Geolocation_Permission_Request* permissionRequest = + static_cast(permData->m_data); + + Eina_Bool ret = (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? EINA_TRUE : EINA_FALSE; + + const char* package_id = DPL::ToUTF8String(permData->m_pkgId).c_str(); + char* location_privacy = "http://tizen.org/privilege/location"; + const char *privacy_list[] = { + location_privacy, + "\0" + }; + + WrtLogD("packageId %s", package_id); + int privacy_ret = privacy_manager_client_install_privacy(package_id, privacy_list, false); + WrtLogD("privacy manager ret val: %i", privacy_ret); + + ewk_geolocation_permission_reply(permissionRequest, ret); +} + +void popupCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + Assert(data); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, getResult(obj)); + delete permData; + + Evas_Object* popup = getPopup(obj); + if (isNeedHelpPopup(popup)) { + ViewModule::HelpPopupSupport::showClearDefaultPopup(popup); + } + evas_object_hide(popup); + evas_object_del(popup); +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + DPL_UNUSED_PARAM(eventInfo); + + Assert(data); + Assert(obj); + + PermissionData* permData = static_cast(data); + Evas_Object* popup = getPopup(obj); + setPermissionResult(permData, RESULT_DENY_ONCE); + + delete permData; + evas_object_hide(popup); + evas_object_del(popup); +} +} // namespace + +void geolocationPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + void* data) +{ + WrtLogD("geolocationPermissionRequest called"); + Assert(securityOriginDAO); + Assert(data); + GeoLocationData *geoData = static_cast(data); + Ewk_Geolocation_Permission_Request* permissionRequest = + static_cast(geoData->permissionRequest); + + const Ewk_Security_Origin* ewkOrigin = + ewk_geolocation_permission_request_origin_get( + permissionRequest); + Assert(ewkOrigin); + + SecurityOriginData securityOriginData( + WrtDB::FEATURE_GEOLOCATION, + Origin( + DPL::FromUTF8String(ewk_security_origin_protocol_get(ewkOrigin)), + DPL::FromUTF8String(ewk_security_origin_host_get(ewkOrigin)), + ewk_security_origin_port_get(ewkOrigin))); + + // check cache database + Result result = securityOriginDAO->getResult(securityOriginData); + if (RESULT_ALLOW_ONCE == result || RESULT_ALLOW_ALWAYS == result) { + WrtLogD("allow"); + ewk_geolocation_permission_reply(permissionRequest, EINA_TRUE); + return; + } else if (RESULT_DENY_ONCE == result || RESULT_DENY_ALWAYS == result) { + WrtLogD("deny"); + ewk_geolocation_permission_reply(permissionRequest, EINA_FALSE); + return; + } + + DPL::String pkgId = geoData->pkgId; + // ask to user + PermissionData* permissionData = + new PermissionData(securityOriginDAO, + securityOriginData, + permissionRequest, + pkgId); + askUserForGeolocationPermission(window, permissionData); + return; +} +} // namespace GeolocationSupport +} // namespace ViewModule diff --git a/src/view/webkit/view_logic_geolocation_support.h b/src/view/webkit/view_logic_geolocation_support.h new file mode 100644 index 0000000..d97e5ce --- /dev/null +++ b/src/view/webkit/view_logic_geolocation_support.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_geolocation_support.h + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + */ + +#ifndef VIEW_LOGIC_GEOLOCATION_SUPPORT_H_ +#define VIEW_LOGIC_GEOLOCATION_SUPPORT_H_ + +#include +#include +#include +#include + +namespace SecurityOriginDB { +class SecurityOriginDAO; +} + +namespace ViewModule { +namespace GeolocationSupport { + +typedef struct { + void* data; + Ewk_Geolocation_Permission_Request* permissionRequest; + DPL::String pkgId; +}GeoLocationData; + +void geolocationPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + void* data); +} // namespace GeolocationSupport +} // namespace ViewModule + +#endif diff --git a/src/view/webkit/view_logic_message_support.cpp b/src/view/webkit/view_logic_message_support.cpp new file mode 100644 index 0000000..36d409b --- /dev/null +++ b/src/view/webkit/view_logic_message_support.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_message_support.cpp + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @brief View logic message support - implementation + */ +#include "view_logic_message_support.h" + +#include +#include +#include +#include +#include + +namespace ViewLogicMessageSupport { +void init(Ewk_Context* ewkContext, const std::string& tizenId) +{ + const char* name = Message::ToInjectedBundle::INIT; + const char* msg = tizenId.c_str(); + + ewk_context_message_post_to_injected_bundle(ewkContext, name, msg); +} + +void start(Ewk_Context* ewkContext, + const DPL::String& tizenId, + double scale, + const char *encodedBundle, + const char *theme) +{ + std::stringstream ssMsg; + + std::string id = DPL::ToUTF8String(tizenId); + ssMsg << id << " "; + + ssMsg << "_" << scale << " "; + + if (encodedBundle) { + ssMsg << "_" << encodedBundle << " "; + } else { + ssMsg << "null" << " "; + } + + if (theme) { + ssMsg << "_" << theme; + } else { + ssMsg << "null"; + } + + std::string msgString = ssMsg.str(); + + const char* msg = msgString.c_str(); + const char* name = Message::ToInjectedBundle::START; + + ewk_context_message_post_to_injected_bundle(ewkContext, name, msg); +} + +void shutdown(Ewk_Context* ewkContext) +{ + const char* name = Message::ToInjectedBundle::SHUTDOWN; + ewk_context_message_post_to_injected_bundle(ewkContext, name, name); +} + +void setCustomProperties( + Ewk_Context* ewkContext, + double* scale, + const char* encodedBundle, + const char* theme) +{ + std::stringstream ssMsg; + + if (scale) { + ssMsg << "_" << *scale << " "; + } else { + ssMsg << "null" << " "; + } + + if (encodedBundle) { + ssMsg << "_" << encodedBundle << " "; + } else { + ssMsg << "null" << " "; + } + + if (theme) { + ssMsg << "_" << theme; + } else { + ssMsg << "null"; + } + + std::string msgString = ssMsg.str(); + + const char* msg = msgString.c_str(); + const char* name = Message::ToInjectedBundle::SET_CUSTOM_PROPERTIES; + + ewk_context_message_post_to_injected_bundle(ewkContext, name, msg); +} + +void dispatchJavaScriptEvent( + Ewk_Context* ewkContext, + WrtPlugins::W3C::CustomEventType eventType, + void *data) +{ + using namespace WrtPlugins::W3C; + std::stringstream str; + str << eventType; + + // if needed, arguments for event should be set here + if (eventType == SoftKeyboardChangeCustomEvent) { + if (data) { + SoftKeyboardChangeArgs* args = + static_cast(data); + str << " " << args->state; + str << " " << args->width; + str << " " << args->height; + } + } + + std::string msgString = str.str(); + const char* msg = msgString.c_str(); + const char* name = Message::ToInjectedBundle::DISPATCH_JS_EVENT; + + ewk_context_message_post_to_injected_bundle(ewkContext, name, msg); +} + +void setXwindowHandle(Ewk_Context* ewkContext, const unsigned int handle) +{ + const char* name = Message::ToInjectedBundle::SET_XWINDOW_HANDLE; + std::stringstream ssMsg; + ssMsg << handle; + std::string msgString = ssMsg.str(); + const char* msg = msgString.c_str(); + + ewk_context_message_post_to_injected_bundle(ewkContext, name, msg); +} + +void setViewmodes(Ewk_Context* ewkContext, const char* msg) +{ + const char* name = Message::ToInjectedBundle::SET_VIEWMODES; + ewk_context_message_post_to_injected_bundle(ewkContext, name, msg); +} +} // namespace ViewLogicMessageSupport diff --git a/src/view/webkit/view_logic_message_support.h b/src/view/webkit/view_logic_message_support.h new file mode 100644 index 0000000..341fa54 --- /dev/null +++ b/src/view/webkit/view_logic_message_support.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_message_support.h + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @brief View logic message support - declaration + */ +#ifndef VIEW_LOGIC_MESSAGE_SUPPORT_H_ +#define VIEW_LOGIC_MESSAGE_SUPPORT_H_ + +#include +#include +#include +#include + +namespace ViewLogicMessageSupport { +void init(Ewk_Context* ewkContext, + const std::string& tizenId); +void start(Ewk_Context* ewkContext, + const DPL::String& tizenId, + double scale, + const char *encodedBundle, + const char *theme); +void shutdown(Ewk_Context* ewkContext); +void setCustomProperties( + Ewk_Context* ewkContext, + double* scale = NULL, + const char* encodedBundle = NULL, + const char* theme = NULL); +void dispatchJavaScriptEvent( + Ewk_Context* ewkContext, + WrtPlugins::W3C::CustomEventType eventType, + void* data); +void setXwindowHandle(Ewk_Context* ewkContext, const unsigned int handle); +void setViewmodes(Ewk_Context* ewkContext, const char* msg); +} // namespace ViewLogicMessageSupport + +#endif // VIEW_LOGIC_MESSAGE_SUPPORT_H_ diff --git a/src/view/webkit/view_logic_orientation_support.cpp b/src/view/webkit/view_logic_orientation_support.cpp new file mode 100644 index 0000000..3046c93 --- /dev/null +++ b/src/view/webkit/view_logic_orientation_support.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file view_logic_orientation_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + + #include "view_logic_orientation_support.h" + +#include +#include +#include + +#include +#include + +namespace ViewModule { + +int OrientationSupport::getWinOrientationAngle(int ewkOrientation) +{ + int angle; + if (ewkOrientation & EWK_SCREEN_ORIENTATION_PORTRAIT_PRIMARY) { + angle = OrientationAngle::Window::Portrait::PRIMARY; + } else if (ewkOrientation & EWK_SCREEN_ORIENTATION_LANDSCAPE_PRIMARY) { + angle = OrientationAngle::Window::Landscape::PRIMARY; + } else if (ewkOrientation & EWK_SCREEN_ORIENTATION_PORTRAIT_SECONDARY) { + angle = OrientationAngle::Window::Portrait::SECONDARY; + } else if (ewkOrientation & EWK_SCREEN_ORIENTATION_LANDSCAPE_SECONDARY) { + angle = OrientationAngle::Window::Landscape::SECONDARY; + } else { + WrtLogD("Wrong orientation value is passed"); + Assert(false); + } + return angle; +} + +int OrientationSupport::getW3COrientationAngle(int ewkOrientation) +{ + int angle; + if (ewkOrientation & EWK_SCREEN_ORIENTATION_PORTRAIT_PRIMARY) { + angle = OrientationAngle::W3C::Portrait::PRIMARY; + } else if (ewkOrientation & EWK_SCREEN_ORIENTATION_LANDSCAPE_PRIMARY) { + angle = OrientationAngle::W3C::Landscape::PRIMARY; + } else if (ewkOrientation & EWK_SCREEN_ORIENTATION_PORTRAIT_SECONDARY) { + angle = OrientationAngle::W3C::Portrait::SECONDARY; + } else if (ewkOrientation & EWK_SCREEN_ORIENTATION_LANDSCAPE_SECONDARY) { + angle = OrientationAngle::W3C::Landscape::SECONDARY; + } else { + WrtLogD("Wrong orientation value is passed"); + Assert(false); + } + return angle; +} + +void OrientationSupport::setEwkOrientation(Evas_Object* ewk, + int angle) +{ + WrtLogD("setOrientation called"); + ewk_view_orientation_send(ewk, angle); +} +} // ViewModule diff --git a/src/view/webkit/view_logic_orientation_support.h b/src/view/webkit/view_logic_orientation_support.h new file mode 100644 index 0000000..2512afc --- /dev/null +++ b/src/view/webkit/view_logic_orientation_support.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file view_logic_orientation_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#ifndef VIEW_LOGIC_ORIENTATION_SUPPORT_H_ +#define VIEW_LOGIC_ORIENTATION_SUPPORT_H_ + +#include + +namespace ViewModule { +namespace OrientationSupport { +const int DEFERRED_ORIENTATION_EMPTY = -1; +const int DEFERRED_ORIENTATION_UNLOCK = 0; + +int getWinOrientationAngle(int ewkOrientation); +int getW3COrientationAngle(int ewkOrientation); +void setEwkOrientation(Evas_Object* ewk, int angle); +} // namespace OrientationSupport +} // namespace ViewModule + +#endif // VIEW_LOGIC_ORIENTATION_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/webkit/view_logic_scheme_support.cpp b/src/view/webkit/view_logic_scheme_support.cpp new file mode 100644 index 0000000..f7c1fa9 --- /dev/null +++ b/src/view/webkit/view_logic_scheme_support.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file view_logic_scheme_support.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#include "view_logic_scheme_support.h" + +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +namespace { +char const * const TIZEN_SCHEME = "tizen"; +char const * const TIZEN_EXIT = "tizen://exit"; +char const * const TIZEN_HIDE = "tizen://hide"; +char const * const TIZEN_CHANGE_USERAGNET = "tizen://changeUA"; + +static Eina_Bool exitAppIdlerCallback(void* /*data*/) +{ + elm_exit(); + return ECORE_CALLBACK_CANCEL; +} +} // namespace + +bool SchemeSupport::HandleTizenScheme(const char* uri, + Evas_Object* window, + Evas_Object* wkView) +{ + if (!uri) { + WrtLogW("Empty uri"); + return false; + } + if (!window) { + WrtLogW("Empty window data"); + return false; + } + + if (strncmp(uri, TIZEN_EXIT, strlen(TIZEN_EXIT)) == 0) { + WrtLogD("%s : exit", uri); + ecore_idler_add(exitAppIdlerCallback, NULL); + return true; + } else if (strncmp(uri, TIZEN_HIDE, strlen(TIZEN_HIDE)) == 0) { + WrtLogD("%s : hide", uri); + elm_win_lower(window); + return true; + } else if (strncmp(uri, + TIZEN_CHANGE_USERAGNET, + strlen(TIZEN_CHANGE_USERAGNET)) == 0) + { + WrtLogD("%s : change UA", uri); + const char* userAgentString = strstr(uri, "="); + if (NULL == userAgentString) { + WrtLogW("UA string is NULL"); + } else { + userAgentString++; + WrtLogD("Setting custom user agent as: %s", userAgentString); + ewk_view_user_agent_set(wkView, userAgentString); + } + return true; + } + return false; +} + +bool SchemeSupport::filterURIByScheme(Ewk_Policy_Decision* policyDecision, + bool newWindow, + Evas_Object* window, + Evas_Object* wkView) +{ + WrtLogD("called"); + Assert(policyDecision); + + const char* url = ewk_policy_decision_url_get(policyDecision); + if (NULL == url) { + // URI is null + // There is no reason, security by scheme block null uri + return true; + } + + bool mainFrame = + ewk_frame_is_main_frame(ewk_policy_decision_frame_get(policyDecision)); + + using namespace ViewModule::SchemeActionMap; + if (HandleTizenScheme(url, window, wkView)) { + WrtLogD("Scheme is tizen scheme"); + return false; + } + + NavigationContext ctx; + ctx = (mainFrame ? TOP_LEVEL : FRAME_LEVEL); + if (newWindow) { + // In case of Tizen, + // policy of new window should be applied, + // regardless level of this frame + ctx = NEW_WINDOW; + } + + return SchemeActionMap::HandleUri(url, ctx); +} +} // namespace ViewModule + diff --git a/src/view/webkit/view_logic_scheme_support.h b/src/view/webkit/view_logic_scheme_support.h new file mode 100644 index 0000000..1c2cb64 --- /dev/null +++ b/src/view/webkit/view_logic_scheme_support.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file view_logic_scheme_support.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + */ + +#ifndef VIEW_LOGIC_SCHEME_SUPPORT_H_ +#define VIEW_LOGIC_SCHEME_SUPPORT_H_ + +#include +#include +#include +#include + +namespace ViewModule { +namespace SchemeSupport { +bool HandleTizenScheme(const char* uri, + Evas_Object* window, + Evas_Object* wkView); +bool filterURIByScheme(Ewk_Policy_Decision* policyDecision, + bool newWindow, + Evas_Object* window, + Evas_Object* wkView); +} // SchemeSupport +} // namespace ViewModule +#endif // VIEW_LOGIC_SCHEME_SUPPORT_H_ diff --git a/src/view/webkit/view_logic_user_agent_support.cpp b/src/view/webkit/view_logic_user_agent_support.cpp new file mode 100644 index 0000000..3ee03be --- /dev/null +++ b/src/view/webkit/view_logic_user_agent_support.cpp @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file view_logic_user_agent_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#include "view_logic_user_agent_support.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace ViewModule { +namespace { +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) +void setCustomUA(std::string customUA); +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) +bool setAppInfo(WidgetModel* model, Evas_Object* wkView); +void printUA(Evas_Object* wkView); + +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) +bool setCustomUA(WidgetModel* model, Evas_Object* wkView) +{ + std::string customUserAgent = model->SettingList.Get().getUserAgent(); + if (customUserAgent.empty()) { + return false; + } else { + ewk_view_user_agent_set(wkView, customUserAgent.c_str()); + return true; + } + return false; +} +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + +bool setAppInfo(WidgetModel* model, Evas_Object* wkView) +{ + std::string appInfo; // appname/appversion + char* name = NULL; + if (app_get_name(&name) == APP_ERROR_NONE) { + appInfo = name; + free(name); + } else { + WrtLogW("Fail to get app name"); + if (name) { + free(name); + } + return false; + } + + DPL::OptionalString version = model->Version.Get(); + if (!!version) { + std::string versionStr = DPL::ToUTF8String(*version); + if (versionStr.empty()) { + // version is empty + // skip to set version field + } else { + appInfo += "/"; + appInfo += versionStr; + } + } + if (ewk_view_application_name_for_user_agent_set(wkView, appInfo.c_str()) + == EINA_TRUE) + { + // verify + const char* info = + ewk_view_application_name_for_user_agent_get(wkView); + if (!info || !strlen(info) || appInfo != info) { + WrtLogW("Fail to verify app info in the UA"); + return false; + } + return true; + } else { + WrtLogW("Fail to set app info to UA"); + return false; + } +} + +void printUA(Evas_Object* wkView) +{ + const char* ua = ewk_view_user_agent_get(wkView); + WrtLogD("%s", ua); +} +} // anonymous namespace + +void UserAgentSupport::setUserAgent(WidgetModel* model, Evas_Object* wkView) +{ + Assert(model); + Assert(wkView); + +#if ENABLE(CUSTOM_USER_AGENT_SUPPORT) + // set custom UA + if (setCustomUA(model, wkView)) { + printUA(wkView); + return; + } +#endif // ENABLE(CUSTOM_USER_AGENT_SUPPORT) + + // In case of default UA, add appname/appversion + if (setAppInfo(model, wkView)) { + printUA(wkView); + } else { + // default UA + printUA(wkView); + } + return; +} + +} // ViewModule diff --git a/src/view/webkit/view_logic_user_agent_support.h b/src/view/webkit/view_logic_user_agent_support.h new file mode 100644 index 0000000..1bb7643 --- /dev/null +++ b/src/view/webkit/view_logic_user_agent_support.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file view_logic_user_agent_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#ifndef VIEW_LOGIC_USER_AGENT_SUPPORT_H_ +#define VIEW_LOGIC_USER_AGENT_SUPPORT_H_ + +#include + +class WidgetModel; + +namespace ViewModule { +namespace UserAgentSupport { +void setUserAgent(WidgetModel* model, Evas_Object* wkView); +} // namespace UserAgentSupport +} // namespace ViewModule + +#endif // VIEW_LOGIC_USER_AGENT_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/webkit/view_logic_usermedia_support.cpp b/src/view/webkit/view_logic_usermedia_support.cpp new file mode 100644 index 0000000..40828ec --- /dev/null +++ b/src/view/webkit/view_logic_usermedia_support.cpp @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_usermedia_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "view_logic_usermedia_support.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +using namespace SecurityOriginDB; +using namespace ViewModule::SecurityOriginSupportUtil; +namespace { +// function declare +void askUserForUsermediaPermission(Evas_Object* window, PermissionData* data); +static void popupCallback(void* data, Evas_Object* obj, void* eventInfo); +void setPermissionResult(PermissionData* permData, Result result); +static void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserForUsermediaPermission(Evas_Object* window, PermissionData* data) +{ + WrtLogD("called"); + std::string origin = DPL::ToUTF8String(data->m_originData.origin.host); + if (origin.empty()) { + origin = "local"; + } + std::string appname; + char* name = NULL; + if (app_get_name(&name) == APP_ERROR_NONE) { + appname = name; + free(name); + } else { + appname = "application"; + } + + std::string body = + WrtText::replacePS({WRT_POP_USERMEDIA_PERMISSION, appname, origin}); + + Evas_Object* popup = createPopup(window, + body.c_str(), + WRT_BODY_REMEMBER_PREFERENCE_IDS, + popupCallback, + eaKeyCallback, + data); + + if (popup == NULL) { + WrtLogE("Fail to create popup object"); + delete data; + return; + } else { + evas_object_show(popup); + } +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + DPL_UNUSED_PARAM(eventInfo); + + Assert(data); + Assert(obj); + + PermissionData* permData = static_cast(data); + Evas_Object* popup = getPopup(obj); + setPermissionResult(permData, RESULT_DENY_ONCE); + + delete permData; + evas_object_hide(popup); + evas_object_del(popup); +} + +void popupCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + Assert(data); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, getResult(obj)); + delete permData; + + Evas_Object* popup = getPopup(obj); + + evas_object_hide(popup); + evas_object_del(popup); +} + +void setPermissionResult(PermissionData* permData, Result result) +{ + Assert(permData); + if (result != RESULT_UNKNOWN) { + permData->m_originDao->setSecurityOriginData(permData->m_originData, result); + } + + Ewk_User_Media_Permission_Request* permissionRequest = + static_cast(permData->m_data); + + Eina_Bool ret = (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? EINA_TRUE : EINA_FALSE; + + ewk_user_media_permission_reply(permissionRequest, ret); +} +} // namespace + +void UsermediaSupport::usermediaPermissionRequest(Evas_Object* window, + SecurityOriginDAO* securityOriginDAO, + void* data) +{ + WrtLogD("called"); + Assert(securityOriginDAO); + Assert(data); + + Ewk_User_Media_Permission_Request* permissionRequest = + static_cast(data); + + const Ewk_Security_Origin* ewkOrigin = + ewk_user_media_permission_request_origin_get(permissionRequest); + Assert(ewkOrigin); + + SecurityOriginData securityOriginData( + WrtDB::FEATURE_USER_MEDIA, + Origin( + DPL::FromUTF8String(ewk_security_origin_protocol_get(ewkOrigin)), + DPL::FromUTF8String(ewk_security_origin_host_get(ewkOrigin)), + ewk_security_origin_port_get(ewkOrigin))); + + // In case of usermedia ewk doesn't support origin data + // cache data also only store allow data by privilege + Result result = securityOriginDAO->getResult(securityOriginData); + if (RESULT_ALLOW_ONCE == result || RESULT_ALLOW_ALWAYS == result) { + WrtLogD("allow"); + ewk_user_media_permission_reply(permissionRequest, EINA_TRUE); + return; + } else if (RESULT_DENY_ONCE == result || RESULT_DENY_ALWAYS == result) { + WrtLogD("deny"); + ewk_user_media_permission_reply(permissionRequest, EINA_FALSE); + return; + } + + // ask to user + PermissionData* permissionData = + new PermissionData(securityOriginDAO, + securityOriginData, + permissionRequest); + askUserForUsermediaPermission(window, permissionData); + return; +} +} // namespace ViewModule diff --git a/src/view/webkit/view_logic_usermedia_support.h b/src/view/webkit/view_logic_usermedia_support.h new file mode 100644 index 0000000..89670ea --- /dev/null +++ b/src/view/webkit/view_logic_usermedia_support.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_usermedia_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_USERMEDIA_SUPPORT_H_ +#define VIEW_LOGIC_USERMEDIA_SUPPORT_H_ + +#include + +//Forward declarations +namespace SecurityOriginDB { +class SecurityOriginDAO; +} + +namespace ViewModule { +namespace UsermediaSupport { +void usermediaPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + void* data); +} // namespace UsermediaSupport +} // namespace ViewModule + +#endif // VIEW_LOGIC_USERMEDIA_SUPPORT_H_ \ No newline at end of file diff --git a/src/view/webkit/view_logic_web_notification_data.cpp b/src/view/webkit/view_logic_web_notification_data.cpp new file mode 100644 index 0000000..8ef96da --- /dev/null +++ b/src/view/webkit/view_logic_web_notification_data.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file view_logic_web_notification_data.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * + */ + +#include "view_logic_web_notification_data.h" + +#include +#include +#include + +namespace ViewModule { +WebNotificationData::WebNotificationData(Ewk_Notification* ewkNotification) : + m_notificaionId(0), + m_data(ewkNotification) +{} + +WebNotificationData::~WebNotificationData() +{} + +int WebNotificationData::getNotiId() +{ + return m_notificaionId; +} + +void WebNotificationData::setNotiId(const int notiId) +{ + m_notificaionId = notiId; +} + +uint64_t WebNotificationData::getEwkNotiId() +{ + return ewk_notification_id_get(m_data); +} + +const char* WebNotificationData::getIconUrl() +{ + return ewk_notification_icon_url_get(m_data); +} + +const char* WebNotificationData::getTitle() +{ + return ewk_notification_title_get(m_data); +} + +const char* WebNotificationData::getBody() +{ + return ewk_notification_body_get(m_data); +} + +Ewk_Notification* WebNotificationData::getData() +{ + return m_data; +} +} //namespace ViewModule diff --git a/src/view/webkit/view_logic_web_notification_data.h b/src/view/webkit/view_logic_web_notification_data.h new file mode 100644 index 0000000..9c53fca --- /dev/null +++ b/src/view/webkit/view_logic_web_notification_data.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file view_logic_web_notification_data.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * + */ + +#ifndef VIEW_LOGIC_WEB_NOTIFICATION_DATA_H_ +#define VIEW_LOGIC_WEB_NOTIFICATION_DATA_H_ + +#include +#include +#include +#include + +namespace ViewModule { +class WebNotificationData +{ + public: + WebNotificationData(Ewk_Notification* ewkNotification); + virtual ~WebNotificationData(); + + int getNotiId(void); + void setNotiId(const int notiId); + uint64_t getEwkNotiId(void); + const char* getIconUrl(void); + const char* getTitle(void); + const char* getBody(void); + Ewk_Notification* getData(void); + + private: + int m_notificaionId; + Ewk_Notification* m_data; +}; +typedef std::shared_ptr WebNotificationDataPtr; +} // namespace ViewModule +#endif // VIEW_LOGIC_WEB_NOTIFICATION_DATA_H_ diff --git a/src/view/webkit/view_logic_web_notification_permission_support.cpp b/src/view/webkit/view_logic_web_notification_permission_support.cpp new file mode 100644 index 0000000..ee0197d --- /dev/null +++ b/src/view/webkit/view_logic_web_notification_permission_support.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_web_notification_permission_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief Implementation file of web Notification permission API + */ + +#include "view_logic_web_notification_permission_support.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace ViewModule { +namespace WebNotificationPermissionSupport { +using namespace SecurityOriginDB; +using namespace ViewModule::SecurityOriginSupportUtil; + +namespace { +// Function declare +bool askUserPermission(Evas_Object* parent, PermissionData* data); +void setPermissionResult(PermissionData* permData, Result result); +static void popupCallback(void* data, Evas_Object* obj, void* eventInfo); +static void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); + +bool askUserPermission(Evas_Object* parent, PermissionData* data) +{ + WrtLogD("called"); + std::string origin = DPL::ToUTF8String(data->m_originData.origin.host); + if (origin.empty()) { + origin = "local"; + } + std::string appname; + char* name = NULL; + if (app_get_name(&name) == APP_ERROR_NONE) { + appname = name; + free(name); + } else { + appname = "application"; + } + + std::string body = + WrtText::replacePS({WRT_POP_WEB_NOTIFICATION_PERMISSION, + appname, + origin}); + Evas_Object* popup = createPopup(parent, + body.c_str(), + WRT_BODY_REMEMBER_PREFERENCE_IDS, + popupCallback, + eaKeyCallback, + data); + if (popup == NULL) { + delete data; + return false; + } else { + evas_object_show(popup); + } + return true; +} + +void setPermissionResult(PermissionData* permData, Result result) +{ + Assert(permData); + if (result != RESULT_UNKNOWN) { + permData->m_originDao->setSecurityOriginData(permData->m_originData, result); + } + + Ewk_Notification_Permission_Request* permissionRequest = + static_cast(permData->m_data); + Eina_Bool ret = (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? EINA_TRUE : EINA_FALSE; + ewk_notification_permission_reply(permissionRequest, ret); +} + +void popupCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, getResult(obj)); + delete permData; + + Evas_Object* popup = getPopup(obj); + if (isNeedHelpPopup(popup)) { + ViewModule::HelpPopupSupport::showClearDefaultPopup(popup); + } + evas_object_hide(popup); + evas_object_del(popup); +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, RESULT_DENY_ONCE); + delete permData; + + evas_object_hide(obj); + evas_object_del(obj); +} +} // anonymous namespace + +void permissionRequest( + Evas_Object* parent, + SecurityOriginDAO* securityOriginDAO, + void* data) +{ + Assert(securityOriginDAO); + Assert(data); + Ewk_Notification_Permission_Request* request = + static_cast(data); + const Ewk_Security_Origin* ewkOrigin = + ewk_notification_permission_request_origin_get(request); + Assert(ewkOrigin); + + SecurityOriginData securityOriginData( + WrtDB::FEATURE_WEB_NOTIFICATION, + Origin( + DPL::FromUTF8String(ewk_security_origin_protocol_get(ewkOrigin)), + DPL::FromUTF8String(ewk_security_origin_host_get(ewkOrigin)), + ewk_security_origin_port_get(ewkOrigin))); + + // check cache database + Result result = securityOriginDAO->getResult(securityOriginData); + if (RESULT_ALLOW_ONCE == result || RESULT_ALLOW_ALWAYS == result) { + WrtLogD("allow"); + ewk_notification_permission_reply(request, EINA_TRUE); + return; + } else if (RESULT_DENY_ONCE == result || RESULT_DENY_ALWAYS == result) { + WrtLogD("deny"); + ewk_notification_permission_reply(request, EINA_FALSE); + return; + } + + // ask to user + PermissionData* permissionData = + new PermissionData(securityOriginDAO, + securityOriginData, + request); + + if (!askUserPermission(parent, permissionData)) { + WrtLogW("Fail to create user permission popup"); + ewk_notification_permission_reply(request, RESULT_DENY_ONCE); + } + return; +} +} // namespace WebNotificationPermissionSupport +} //namespace ViewModule diff --git a/src/view/webkit/view_logic_web_notification_permission_support.h b/src/view/webkit/view_logic_web_notification_permission_support.h new file mode 100644 index 0000000..22bb21c --- /dev/null +++ b/src/view/webkit/view_logic_web_notification_permission_support.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_web_notification_permission_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief Header file of web Notification permission API + */ + +#ifndef VIEW_LOGIC_WEB_NOTIFICATION_PERMISSION_SUPPORT_H_ +#define VIEW_LOGIC_WEB_NOTIFICATION_PERMISSION_SUPPORT_H_ + +#include + +//Forward declarations +namespace SecurityOriginDB { +class SecurityOriginDAO; +} + +namespace ViewModule { +namespace WebNotificationPermissionSupport { +void permissionRequest( + Evas_Object* parent, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + void* data); +} // namespace WebNotificationPermissionSupport +} // namespace ViewModule +#endif // VIEW_LOGIC_WEB_NOTIFICATION_PERMISSION_SUPPORT_H_ + diff --git a/src/view/webkit/view_logic_web_notification_support.cpp b/src/view/webkit/view_logic_web_notification_support.cpp new file mode 100644 index 0000000..e5a4b3d --- /dev/null +++ b/src/view/webkit/view_logic_web_notification_support.cpp @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_web_notification_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief Implementation file of web Notification API used by ViewLogic + */ + +#include "view_logic_web_notification_support.h" +#include "view_logic_web_notification_data.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace ViewModule { +namespace { +const char* PATTERN_CHECK_EXTERNAL = "^http(s)?://\\w+.*$"; + +// Function declare +bool isExternalUri(const std::string &uri); +size_t curlWriteData(void* ptr, size_t size, size_t nmemb, FILE* stream); + +bool isExternalUri(const std::string &uri) +{ + pcrecpp::RE_Options pcreOpt; + pcreOpt.set_caseless(true); + pcrecpp::RE re(PATTERN_CHECK_EXTERNAL, pcreOpt); + + return re.FullMatch(uri); +} + +size_t curlWriteData(void* ptr, size_t size, size_t nmemb, FILE* stream) +{ + size_t written = fwrite(ptr, size, nmemb, stream); + return written; +} +} // anonymous namespace + +// Implementation class +class WebNotificationSupportImplementation +{ + private: + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, InitError) + DECLARE_EXCEPTION_TYPE(Base, NotificationShowError) + DECLARE_EXCEPTION_TYPE(Base, DownloadImageError) + }; + + bool m_initialized; + std::string m_persistentPath; + + typedef std::map NotiMap; + typedef std::map::iterator NotiMapIt; + NotiMap m_notiDataMap; + + std::string createDownloadPath(const std::string& iconUrl) + { + // Make valid filename + // If there is already exist filename, rename to "filename_%d" + + std::string downloadPath = m_persistentPath; + std::string fileName = iconUrl.substr(iconUrl.rfind('/') + 1); + WrtLogD("fileName from URL: %s", fileName.c_str()); + std::string rename = fileName; + unsigned int renameSuffixNb = 0; + while (0 == access((m_persistentPath + rename).c_str(), F_OK)) { + std::ostringstream suffixOstr; + suffixOstr.str(""); + suffixOstr << fileName << "_" << renameSuffixNb++; + + rename = fileName; + rename.insert(rename.find('.'), suffixOstr.str()); + } + + downloadPath += rename; + WrtLogD("Valid file path : %s", downloadPath.c_str()); + return downloadPath; + } + + std::string downloadImage(const std::string& iconUrl) + { + if (iconUrl.empty()) { + WrtLogW("Icon url is empty"); + return std::string(); + } + std::string downloadPath = createDownloadPath(iconUrl); + + // Download image by curl + FILE *fp = NULL; + CURL *curl = NULL; + + Try { + curl = curl_easy_init(); + if (NULL == curl) { + WrtLogW("fail to curl_easy_init"); + Throw(Exception::InitError); + } + fp = fopen(downloadPath.c_str(), "wb"); + if (fp == NULL) { + WrtLogW("fail to open"); + Throw(Exception::InitError); + } + + curl_easy_setopt(curl, CURLOPT_URL, iconUrl.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlWriteData); + + CURLcode err = curl_easy_perform(curl); + if (0 != err) { + WrtLogW("fail to curl_easy_perform: %d", err); + Throw(Exception::DownloadImageError); + } + fclose(fp); + curl_easy_cleanup(curl); + } Catch(DPL::Exception) { + fclose(fp); + curl_easy_cleanup(curl); + return std::string(); + } + WrtLogD("Download success"); + return downloadPath; + } + + int showNotification(WebNotificationDataPtr notiData) + { + Assert(notiData); + notification_h noti_h = NULL; + int error = NOTIFICATION_ERROR_NONE; + + Try { + // create notification + noti_h = notification_new( + NOTIFICATION_TYPE_NOTI, + NOTIFICATION_GROUP_ID_DEFAULT, + NOTIFICATION_PRIV_ID_NONE); + if (!noti_h) { + WrtLogE("Fail to notification_new"); + Throw(Exception::NotificationShowError); + } + + // set notification title + error = notification_set_text( + noti_h, + NOTIFICATION_TEXT_TYPE_TITLE, + notiData->getTitle(), + NULL, + NOTIFICATION_VARIABLE_TYPE_NONE); + if (error != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to set title"); + Throw(Exception::NotificationShowError); + } + + // set notification content + error = notification_set_text( + noti_h, + NOTIFICATION_TEXT_TYPE_CONTENT, + notiData->getBody(), + NULL, + NOTIFICATION_VARIABLE_TYPE_NONE); + if (error != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to set content: %d", error); + Throw(Exception::NotificationShowError); + } + + //check uri is "http", https" or not + if (notiData->getIconUrl()) { + std::string iconPath; + if (isExternalUri(notiData->getIconUrl())) { + //download image from url + iconPath = downloadImage(notiData->getIconUrl()); + } + + //set image + // If fail to download external image, skip to set image. + // In this case, set to default package image. + if (!iconPath.empty()) { + error = notification_set_image( + noti_h, + NOTIFICATION_IMAGE_TYPE_ICON, + iconPath.c_str()); + if (error != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to free notification: %d", error); + Throw(Exception::NotificationShowError); + } + } + } + + // insert notification + int privId = NOTIFICATION_PRIV_ID_NONE; + error = notification_insert(noti_h, &privId); + if (error != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to insert notification : %d", error); + Throw(Exception::NotificationShowError); + } + WrtLogD("ewkId=[%llu], notiId=[%d]", notiData->getEwkNotiId(), privId); + + if (noti_h) { + error = notification_free(noti_h); + if (error != NOTIFICATION_ERROR_NONE) { + WrtLogE("Fail to free notification : %d", error); + Throw(Exception::NotificationShowError); + } + noti_h = NULL; + } + notiData->setNotiId(privId); + } Catch(Exception::NotificationShowError) { + notification_free(noti_h); + noti_h = NULL; + return false; + } Catch(DPL::Exception) { + WrtLogE("Fail to show notification"); + return false; + } + return true; + } + + bool hideNotification(uint64_t ewkNotiId) + { + int error = NOTIFICATION_ERROR_NONE; + NotiMapIt it = m_notiDataMap.find(ewkNotiId); + error = + notification_delete_by_priv_id(NULL, + NOTIFICATION_TYPE_NOTI, + it->second->getNotiId()); + if (error == NOTIFICATION_ERROR_NONE) { + WrtLogD("Success to hide"); + return true; + } else if (error == NOTIFICATION_ERROR_NOT_EXIST_ID) { + WrtLogD("Success to hide. Not exist noti"); + return true; + } else { + WrtLogW("Error to hide : %d", error); + return false; + } + } + + // manage noti data + bool isExistData(uint64_t ewkNotiId) + { + if (m_notiDataMap.find(ewkNotiId) == m_notiDataMap.end()) { + return false; + } + return true; + } + + void insertData(WebNotificationDataPtr notiData) + { + m_notiDataMap[notiData->getEwkNotiId()] = notiData; + } + + void removeData(uint64_t ewkNotiId) + { + m_notiDataMap.erase(ewkNotiId); + } + + WebNotificationDataPtr getData(uint64_t ewkNotiId) + { + return m_notiDataMap.find(ewkNotiId)->second; + } + + public: + WebNotificationSupportImplementation() : + m_initialized(false) + { + } + + void initialize(WrtDB::TizenPkgId pkgId) + { + // icon download path + // /opt/apps/tizen_id/data + '/' + filename + m_persistentPath = + WrtDB::WidgetConfig::GetWidgetPersistentStoragePath(pkgId) + '/'; + WrtLogD("path %s", m_persistentPath.c_str()); + m_initialized = true; + } + + void deinitialize(void) + { + WrtLogD("called"); + m_initialized = false; + } + + bool show(WebNotificationDataPtr notiData) + { + Assert(m_initialized); + if (isExistData(notiData->getEwkNotiId())) { + // Web Notifications (http://www.w3.org/TR/notifications/) + // 4.7 Replacing a notification + // 3. If old is in the list of pending notifications, queue a + // task to replace old with new, in the same position, in the + // list of pending notifications, and fire an event named + // close on old. + // 4. Otherwise, queue a task to replace old with new, in the + // same position, in the list of active notifications, fire + // an event named close on old, and fire an event named show + // on new. + hideNotification(notiData->getEwkNotiId()); + removeData(notiData->getEwkNotiId()); + } + if (showNotification(notiData)) { + insertData(notiData); + return true; + } + return false; + } + + void* hide(uint64_t ewkNotiId) + { + Assert(m_initialized); + if (!isExistData(ewkNotiId)) { + WrtLogW("Noti isn't exist"); + return NULL; + } + if (!hideNotification(ewkNotiId)) { + return NULL; + } + WebNotificationDataPtr data = getData(ewkNotiId); + removeData(ewkNotiId); + return static_cast(data->getData()); + } +}; + +WebNotificationSupport::WebNotificationSupport() : + m_impl(new WebNotificationSupportImplementation()) +{ +} + +WebNotificationSupport::~WebNotificationSupport() +{ +} + +void WebNotificationSupport::initialize(WrtDB::TizenAppId appId) +{ + m_impl->initialize(appId); +} + +void WebNotificationSupport::deinitialize(void) +{ + m_impl->deinitialize(); +} + +bool WebNotificationSupport::show(WebNotificationDataPtr notiData) +{ + return m_impl->show(notiData); +} + +void* WebNotificationSupport::hide(uint64_t ewkNotiId) +{ + return m_impl->hide(ewkNotiId); +} +} //namespace ViewModule diff --git a/src/view/webkit/view_logic_web_notification_support.h b/src/view/webkit/view_logic_web_notification_support.h new file mode 100644 index 0000000..893e771 --- /dev/null +++ b/src/view/webkit/view_logic_web_notification_support.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_web_notification_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @brief Header file of web Notification API used by ViewLogic + */ + +#ifndef VIEW_LOGIC_WEB_NOTIFICATION_SUPPORT_H_ +#define VIEW_LOGIC_WEB_NOTIFICATION_SUPPORT_H_ + +#include +#include +#include "view_logic_web_notification_data.h" + +namespace ViewModule { +class WebNotificationSupportImplementation; +class WebNotificationSupport +{ + public: + WebNotificationSupport(); + virtual ~WebNotificationSupport(); + void initialize(WrtDB::TizenPkgId pkgId); + void deinitialize(void); + + bool show(WebNotificationDataPtr notiData); + void* hide(uint64_t ewkNotiId); + + private: + std::unique_ptr m_impl; +}; +} // namespace ViewModule +#endif /* VIEW_LOGIC_WEB_NOTIFICATION_H_ */ diff --git a/src/view/webkit/view_logic_web_storage_support.cpp b/src/view/webkit/view_logic_web_storage_support.cpp new file mode 100644 index 0000000..0441a94 --- /dev/null +++ b/src/view/webkit/view_logic_web_storage_support.cpp @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_web_storage_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "view_logic_web_storage_support.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ViewModule { +using namespace SecurityOriginDB; +using namespace ViewModule::SecurityOriginSupportUtil; + +namespace { +struct WebStoragePermissionData { + WebStorageSupport::ewkQuotaReply m_replyEAPI; + Evas_Object* m_ewkView; + WebStoragePermissionData(WebStorageSupport::ewkQuotaReply replyEAPI, + Evas_Object* ewkView) : + m_replyEAPI(replyEAPI), + m_ewkView(ewkView) + {} +}; + +// function declare +void askUserForWebStorageCreatePermission( + Evas_Object* window, + PermissionData* data); +void setPermissionResult(PermissionData* permData, Result result); +static void popupCallback(void* data, Evas_Object* obj, void* eventInfo); +static void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo); + +void askUserForWebStorageCreatePermission( + Evas_Object* window, + PermissionData* data) +{ + WrtLogD("called"); + std::string origin = DPL::ToUTF8String(data->m_originData.origin.host); + if (origin.empty()) { + origin = "local"; + } + std::string appname; + char* name = NULL; + if (app_get_name(&name) == APP_ERROR_NONE) { + appname = name; + free(name); + } else { + appname = "application"; + } + + std::string body = + WrtText::replacePS({WRT_POP_WEB_STORAGE_PERMISSION, appname, origin}); + Evas_Object* popup = createPopup(window, + body.c_str(), + WRT_BODY_REMEMBER_PREFERENCE_IDS, + popupCallback, + eaKeyCallback, + data); + + if (popup == NULL) { + WrtLogE("Fail to create popup object"); + delete data; + return; + } else { + evas_object_show(popup); + } +} + +void setPermissionResult(PermissionData* permData, Result result) +{ + Assert(permData); + WebStoragePermissionData* webStoragePermissionData = + static_cast(permData->m_data); + + if (result != RESULT_UNKNOWN) { + permData->m_originDao->setSecurityOriginData(permData->m_originData, result); + } + Eina_Bool ret = (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? EINA_TRUE : EINA_FALSE; + webStoragePermissionData->m_replyEAPI(webStoragePermissionData->m_ewkView, ret); +} + +void popupCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, getResult(obj)); + WebStoragePermissionData* webStoragePermissionData = + static_cast(permData->m_data); + delete webStoragePermissionData; + delete permData; + + Evas_Object* popup = getPopup(obj); + if (isNeedHelpPopup(popup)) { + ViewModule::HelpPopupSupport::showClearDefaultPopup(popup); + } + evas_object_hide(popup); + evas_object_del(popup); +} + +void eaKeyCallback(void* data, Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(data); + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + PermissionData* permData = static_cast(data); + setPermissionResult(permData, RESULT_DENY_ONCE); + + WebStoragePermissionData* webStoragePermissionData = + static_cast(permData->m_data); + delete webStoragePermissionData; + delete permData; + + evas_object_hide(obj); + evas_object_del(obj); +} +} // namespace + +void WebStorageSupport::createPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + Evas_Object* ewkView, + Ewk_Security_Origin* ewkOrigin, + ewkQuotaReply replyEAPI) +{ + WrtLogD("called"); + Assert(securityOriginDAO); + Assert(ewkOrigin); + Assert(ewkView); + SecurityOriginData securityOriginData( + WrtDB::FEATURE_WEB_DATABASE, + Origin( + DPL::FromUTF8String(ewk_security_origin_protocol_get(ewkOrigin)), + DPL::FromUTF8String(ewk_security_origin_host_get(ewkOrigin)), + ewk_security_origin_port_get(ewkOrigin))); + + // check cache database + Result result = securityOriginDAO->getResult(securityOriginData); + if (result != RESULT_UNKNOWN) { + Eina_Bool ret = + (result == RESULT_ALLOW_ALWAYS || result == RESULT_ALLOW_ONCE) ? + EINA_TRUE : EINA_FALSE; + replyEAPI(ewkView, ret); + return; + } + + // ask to user + WebStoragePermissionData* webStoragePermissionData = + new WebStoragePermissionData(replyEAPI, ewkView); + PermissionData* permissionData = + new PermissionData(securityOriginDAO, + securityOriginData, + webStoragePermissionData); + askUserForWebStorageCreatePermission(window, permissionData); + return; +} +} // namespace ViewModule diff --git a/src/view/webkit/view_logic_web_storage_support.h b/src/view/webkit/view_logic_web_storage_support.h new file mode 100644 index 0000000..845f591 --- /dev/null +++ b/src/view/webkit/view_logic_web_storage_support.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file view_logic_web_storage_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef VIEW_LOGIC_WEB_STORAGE_SUPPORT_H_ +#define VIEW_LOGIC_WEB_STORAGE_SUPPORT_H_ + +#include +#include +#include +#include + +namespace SecurityOriginDB { +class SecurityOriginDAO; +} + +namespace ViewModule { +namespace WebStorageSupport { +typedef void (*ewkQuotaReply)(Evas_Object* ewkView, Eina_Bool allow); +bool isNeedPermissionRequest(void); +void createPermissionRequest( + Evas_Object* window, + SecurityOriginDB::SecurityOriginDAO* securityOriginDAO, + Evas_Object* ewkView, + Ewk_Security_Origin* ewkOrigin, + ewkQuotaReply replyEAPI); + +} // namespace WebStorageSupport +} // namespace ViewModule + +#endif // VIEW_LOGIC_WEB_STORAGE_SUPPORT_H_ diff --git a/src/wrt-client/CMakeLists.txt b/src/wrt-client/CMakeLists.txt new file mode 100644 index 0000000..c7a34ba --- /dev/null +++ b/src/wrt-client/CMakeLists.txt @@ -0,0 +1,83 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +GROUP_DEPS(CLIENT_DEP DEPS + appcore-efl + capi-appfw-application + dpl-wrt-dao-ro + wrt-popup-wrt-runner + appsvc + efl-assist + libsystemd-daemon +) + +SET(WRT_CLIENT_SRCS + ${PROJECT_SOURCE_DIR}/src/wrt-client/wrt-client.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/src/access_control.cpp + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/src/process_pool.cpp +) + +INCLUDE_DIRECTORIES( + ${PROJECT_SOURCE_DIR}/src/wrt-client + ${PROJECT_SOURCE_DIR}/src/api_new + ${PROJECT_SOURCE_DIR}/src/domain + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/include + ${CLIENT_DEP_INCLUDE_DIRS} +) + +ADD_DEFINITIONS("-fPIE") + +ADD_EXECUTABLE(${TARGET_WRT_CLIENT} + ${WRT_CLIENT_SRCS} +) + +SET_TARGET_PROPERTIES(${TARGET_WRT_CLIENT} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + + + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +TARGET_LINK_LIBRARIES(${TARGET_WRT_CLIENT} + ${CLIENT_DEP_LIBRARIES} + ${TARGET_CLIENT_SUPPORT_STATIC} + ${TARGET_CORE_MODULE_LIB} + ${TARGET_SMACK_LABELING_SUPPORT_STATIC} + ${TARGET_WRT_EVENT_LOOP_LIB} + ${PROF_LIB} + "-lcap" + "-pie" +) +ELSE(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +TARGET_LINK_LIBRARIES(${TARGET_WRT_CLIENT} + ${CLIENT_DEP_LIBRARIES} + ${TARGET_CLIENT_SUPPORT_STATIC} + ${TARGET_CORE_MODULE_LIB} + ${TARGET_SMACK_LABELING_SUPPORT_STATIC} + ${PROF_LIB} + "-lcap" + "-pie" +) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +SET_TARGET_PROPERTIES(${TARGET_WRT_CLIENT} PROPERTIES + LINK_FLAGS "-Wl,--as-needed -Wl,--hash-style=both -Wl,--version-script=${PROJECT_SOURCE_DIR}/wrt-engine.map" + BUILD_WITH_INSTALL_RPATH ON + INSTALL_RPATH_USE_LINK_PATH ON +) + +SET_TARGET_PROPERTIES(${TARGET_WRT_CLIENT} PROPERTIES + COMPILE_FLAGS "-include profiling_util.h" ) + +INSTALL(TARGETS ${TARGET_WRT_CLIENT} DESTINATION bin) + diff --git a/src/wrt-client/DESCRIPTION b/src/wrt-client/DESCRIPTION new file mode 100644 index 0000000..dd6f294 --- /dev/null +++ b/src/wrt-client/DESCRIPTION @@ -0,0 +1 @@ +The official WRT command-line interface diff --git a/src/wrt-client/client_command_line_parser.cpp b/src/wrt-client/client_command_line_parser.cpp new file mode 100644 index 0000000..ef452e4 --- /dev/null +++ b/src/wrt-client/client_command_line_parser.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file client_command_line_parser.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "client_command_line_parser.h" + +#include +#include +#include + +#include +#include +#include + +namespace ClientModule { +namespace { + +std::string parseIdField(int argc, char **argv) +{ + if (argv[0] == NULL) { + return ""; + } + + std::string arg = argv[0]; + if (arg.empty()) { + return ""; + } + + if (arg.find("wrt-client") != std::string::npos) { + if (argc <= 1) { + return ""; + } + + arg = argv[1]; + + if (arg == "-h" || arg == "--help") { + return ""; + } else if (arg == "-l" || + arg == "--launch" || + arg == "-t" || + arg == "--tizen") + { + if (argc != 3) { + return ""; + } + return argv[2]; + } else { + return ""; + } + } else { + std::size_t pos = arg.find_last_of('/'); + if (pos != std::string::npos) { + arg = arg.erase(0, pos + 1); + } + return arg; + } +} + +DPL::OptionalUInt getIndex(const std::string& tizenId) +{ + std::size_t pos = + tizenId.find(WrtDB::AppControlPrefix::PROCESS_PREFIX); + if (pos != std::string::npos) { + std::string index = tizenId.substr(pos); + index.erase(strlen(WrtDB::AppControlPrefix::PROCESS_PREFIX)); + std::stringstream s(index); + unsigned int appControlIndex; + s >> appControlIndex; + return appControlIndex; + } + return DPL::OptionalUInt(); +} + +std::string removeIndex(const std::string& tizenId) +{ + std::string id = tizenId; + std::size_t pos = + id.find(WrtDB::AppControlPrefix::PROCESS_PREFIX); + if (pos != std::string::npos) { + id.erase(pos); + } + return id; +} +} + +std::string CommandLineParser::getTizenId(int argc, char **argv) +{ + std::string id = parseIdField(argc, argv); + if (id.empty()) { + return ""; + } + return removeIndex(id); +} + +DPL::OptionalUInt CommandLineParser::getAppControlIndex(int argc, char **argv) +{ + std::string id = parseIdField(argc, argv); + if (id.empty()) { + return DPL::OptionalUInt(); + } + return getIndex(id); +} +} // ClientModule diff --git a/src/wrt-client/client_command_line_parser.h b/src/wrt-client/client_command_line_parser.h new file mode 100644 index 0000000..615e442 --- /dev/null +++ b/src/wrt-client/client_command_line_parser.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file client_command_line_parser.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ +#ifndef CLIENT_COMMAND_LINE_PARSER_H_ +#define CLIENT_COMMAND_LINE_PARSER_H_ + +#include + +namespace ClientModule { +namespace CommandLineParser { +std::string getTizenId(int argc, char **argv); +DPL::OptionalUInt getAppControlIndex(int argc, char **argv); +} // CommandLineParser +} // ClientModule +#endif // CLIENT_COMMAND_LINE_PARSER_H_ \ No newline at end of file diff --git a/src/wrt-client/client_ide_support.cpp b/src/wrt-client/client_ide_support.cpp new file mode 100644 index 0000000..85c5084 --- /dev/null +++ b/src/wrt-client/client_ide_support.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file client_ide_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "client_ide_support.h" +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace ClientModule { +namespace { +const char* const KEY_DEBUG = "debug"; +const char* const KEY_PORT = "port"; +const char* const VALUE_TRUE = "true"; + +const char* const CONSOLE_MESSAGE_LOG_TAG = "ConsoleMessage"; +} + +bool IDESupport::getDebugMode(bundle* b) +{ + if (!b) { + WrtLogW("bundle is empty"); + return false; + } + + const char* value = bundle_get_val(b, KEY_DEBUG); + if (value != NULL && !strcmp(value, VALUE_TRUE)) { + return true; + } else { + return false; + } +} + +bool IDESupport::sendReply(bundle* b, unsigned int portNum) +{ + bundle* request = NULL; + if (appsvc_create_result_bundle(b, &request) != APPSVC_RET_OK) { + WrtLogW("Fail to create result bundle"); + return false; + } + + char port[10] = {0,}; + sprintf(port, "%u", portNum); + if (appsvc_add_data(request, KEY_PORT, port) != APPSVC_RET_OK) { + WrtLogW("Fail to add data"); + bundle_free(request); + return false; + } + + if (appsvc_send_result(request, APPSVC_RES_OK) != APPSVC_RET_OK) { + WrtLogW("Fail to send result"); + bundle_free(request); + return false; + } + + bundle_free(request); + return true; +} + +void IDESupport::consoleMessage(int level, const char* format, ...) +{ + va_list args; + va_start(args, format); + switch (level) { + case ConsoleLogLevel::Debug: + ALOG_VA(LOG_DEBUG, CONSOLE_MESSAGE_LOG_TAG, format, args); + break; + case ConsoleLogLevel::Warning: + ALOG_VA(LOG_WARN, CONSOLE_MESSAGE_LOG_TAG, format, args); + break; + case ConsoleLogLevel::Error: + ALOG_VA(LOG_ERROR, CONSOLE_MESSAGE_LOG_TAG, format, args); + break; + default: + ALOG_VA(LOG_DEBUG, CONSOLE_MESSAGE_LOG_TAG, format, args); + break; + } + va_end(args); +} +} // ClientModule diff --git a/src/wrt-client/client_ide_support.h b/src/wrt-client/client_ide_support.h new file mode 100644 index 0000000..e52c1d1 --- /dev/null +++ b/src/wrt-client/client_ide_support.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file client_ide_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ +#ifndef CLIENT_IDE_SUPPORT_H_ +#define CLIENT_IDE_SUPPORT_H_ + +#include + +namespace ClientModule { +namespace IDESupport { +bool getDebugMode(bundle* b); +bool sendReply(bundle* b, unsigned int portNum); +void consoleMessage(int level, const char* format, ...); +} // IDESupport +} // ClientModule +#endif // CLIENT_IDE_SUPPORT_H_ \ No newline at end of file diff --git a/src/wrt-client/client_orientation_support.cpp b/src/wrt-client/client_orientation_support.cpp new file mode 100644 index 0000000..ac9830f --- /dev/null +++ b/src/wrt-client/client_orientation_support.cpp @@ -0,0 +1,278 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ +/** + * @file client_orientation_support.cpp + * @author Grzegorz Rynkowski (g.rynkowski@samsung.com) + * @brief source file to support window orientation of web application + */ + +#include "client_orientation_support.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ClientModule { + +namespace { +const char* const WM_ROTATION_CHANGED_CALLBACK = "wm,rotation,changed"; +const int ANGLE_PORTRAIT = 0; +const int ANGLE_LANDSCAPE = 270; +} + +OrientationSupport::OrientationSupport(const WindowDataPtr& windowData, + const WRT::RunnableWidgetObjectPtr& widget) + : m_windowData(windowData), + m_widget(widget), + m_rotationAngle(0) +{ +} + +void OrientationSupport::setWindowOrientation(int angle) +{ + Assert(m_windowData); + m_windowData->setOrientation(angle); +} + +void OrientationSupport::setInitialWindowOrientation( + WidgetSettingScreenLock rotationValue) +{ + switch(rotationValue) { + case Screen_AutoRotation: + break; + case Screen_Landscape: + setWindowOrientation(OrientationAngle::Window::Landscape::PRIMARY); + break; + case Screen_Portrait: + default: + setWindowOrientation(OrientationAngle::Window::Portrait::PRIMARY); + break; + } +} + +bool OrientationSupport::setAutoRotation() +{ + Assert(m_windowData); + Evas_Object* window = m_windowData->getEvasObject(Layer::WINDOW); + + if (elm_win_wm_rotation_supported_get(window)) { + const int rots[4] = {OrientationAngle::Window::Portrait::PRIMARY, + OrientationAngle::Window::Portrait::SECONDARY, + OrientationAngle::Window::Landscape::PRIMARY, + OrientationAngle::Window::Landscape::SECONDARY}; + elm_win_wm_rotation_available_rotations_set(window, rots, 4); + registerRotationCallback(&OrientationSupport::autoRotationCallback, this); +#if USE(WEBKIT_MANUAL_ROTATION) + m_rotationAngle = elm_win_rotation_get(window); +#endif + return true; + } + return false; +} + +#if USE(WEBKIT_MANUAL_ROTATION) +void OrientationSupport::setRotationDone(void) +{ + WrtLogD("called"); + + Assert(m_windowData); + Evas_Object* win = m_windowData->getEvasObject(Layer::WINDOW); + Assert(win); + if (EINA_TRUE == elm_win_wm_rotation_manual_rotation_done_get(win)) { + elm_win_wm_rotation_manual_rotation_done(win); + } +} + +void OrientationSupport::setManualRotation(bool enable) +{ + WrtLogD("called"); + + Assert(m_windowData); + Evas_Object* win = m_windowData->getEvasObject(Layer::WINDOW); + + Assert(win); + elm_win_wm_rotation_manual_rotation_done_set(win, enable ? EINA_TRUE : EINA_FALSE); +} +#endif + +bool OrientationSupport::isOrientationPrepared(WidgetSettingScreenLock rotationValue) +{ + WrtLogD("called"); + + Assert(m_windowData); + Evas_Object* win = m_windowData->getEvasObject(Layer::WINDOW); + Assert(win); + int currentAngle = elm_win_rotation_get(win); + if (currentAngle == -1) { + WrtLogE("elm_win_rotation_get failed"); + Assert(false); + } + + switch(rotationValue) { + case Screen_Landscape: + return currentAngle == ANGLE_LANDSCAPE; + case Screen_Portrait: + return currentAngle == ANGLE_PORTRAIT; + case Screen_AutoRotation: + default: + return true; + } +} + +void OrientationSupport::registerRotationCallback(const Evas_Smart_Cb callback, + const void *data) +{ + Assert(m_windowData); + Evas_Object* window = m_windowData->getEvasObject(Layer::WINDOW); + WrtLogD("add rotation callback"); + evas_object_smart_callback_add(window, + WM_ROTATION_CHANGED_CALLBACK, + callback, + data); + m_registeredCallbacks.push_back( + Callback(WM_ROTATION_CHANGED_CALLBACK, callback)); +} + +void OrientationSupport::unregisterRotationCallback(const Evas_Smart_Cb callback) +{ + FOREACH(it, m_registeredCallbacks) + { + if (it->second == callback) { + Assert(m_windowData); + Evas_Object* win = m_windowData->getEvasObject(Layer::WINDOW); + Assert(win); + WrtLogD("remove rotation callback: %s (%p)", WM_ROTATION_CHANGED_CALLBACK, callback); + evas_object_smart_callback_del(win, it->first.c_str(), it->second); + m_registeredCallbacks.erase(it); + return; + } + } +} + +void OrientationSupport::unregisterRotationCallbacks() +{ + Assert(m_windowData); + Evas_Object* wkView = m_windowData->getEvasObject(Layer::WINDOW); + FOREACH(it, m_registeredCallbacks) + { + WrtLogD("remove rotation callback: %s", it->first.c_str()); + evas_object_smart_callback_del(wkView, it->first.c_str(), it->second); + } +} + +void OrientationSupport::setEwkInitialOrientation( + WidgetSettingScreenLock rotationValue) +{ + Assert(m_widget); + + Evas_Object* obj = m_widget->GetCurrentWebview(); + switch(rotationValue) { + case Screen_Landscape: + ewk_view_orientation_send(obj, + OrientationAngle::W3C::Landscape::PRIMARY); + break; + case Screen_Portrait: + case Screen_AutoRotation: + default: + ewk_view_orientation_send(obj, + OrientationAngle::W3C::Portrait::PRIMARY); + break; + } +} + +void OrientationSupport::rotatePrepared(Evas_Object* obj) +{ + WrtLogD("rotatePrepared"); + Assert(m_windowData); + int winAngle = elm_win_rotation_get( + m_windowData->getEvasObject(Layer::WINDOW)); + int w3cAngle; + + switch(winAngle) { + case OrientationAngle::Window::Portrait::PRIMARY: + w3cAngle = OrientationAngle::W3C::Portrait::PRIMARY; + break; + case OrientationAngle::Window::Portrait::SECONDARY: + w3cAngle = OrientationAngle::W3C::Portrait::SECONDARY; + break; + case OrientationAngle::Window::Landscape::PRIMARY: + w3cAngle = OrientationAngle::W3C::Landscape::PRIMARY; + break; + case OrientationAngle::Window::Landscape::SECONDARY: + w3cAngle = OrientationAngle::W3C::Landscape::SECONDARY; + break; + default: + WrtLogW("unknown angle"); + return; + } + ewk_view_orientation_send(obj, w3cAngle); +} + +void OrientationSupport::updateRotationAngle(void) +{ + Evas_Object* win = m_windowData->getEvasObject(Layer::WINDOW); + int newAngle = elm_win_rotation_get(win); + if (newAngle == -1) { + WrtLogW("elm_win_rotation_get failed"); + return; + } + +#if USE(WEBKIT_MANUAL_ROTATION) + if (EINA_FALSE == elm_win_wm_rotation_manual_rotation_done_get(win)) { + WrtLogD("Rotate by platform"); + m_rotationAngle = newAngle; + return; + } + + if ((m_rotationAngle + newAngle) % 180 == 0) + { + WrtLogD("Rotate by wrt"); + // In case of rotate 180 degress, setRotationDone by WRT instead of webkit. + // Webkit doesn't call "rotate,prepared" callback. + setRotationDone(); + } + m_rotationAngle = newAngle; +#endif +} + +//static +void OrientationSupport::autoRotationCallback(void* data, + Evas_Object* obj, + void* event) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(event); + WrtLogD("entered"); + OrientationSupport* This = static_cast(data); + Assert(This->m_widget); + This->rotatePrepared(This->m_widget->GetCurrentWebview()); + This->updateRotationAngle(); +} + +void OrientationSupport::resetOrientation() +{ + Assert(m_widget); + rotatePrepared(m_widget->GetCurrentWebview()); + updateRotationAngle(); +} + +} // namespace ClientModule diff --git a/src/wrt-client/client_orientation_support.h b/src/wrt-client/client_orientation_support.h new file mode 100644 index 0000000..081bf61 --- /dev/null +++ b/src/wrt-client/client_orientation_support.h @@ -0,0 +1,75 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +/** + * @file client_orientation_support.h + * @author Grzegorz Rynkowski (g.rynkowski@samsung.com) + * @brief header file to support window orientation of web application + */ + +#ifndef CLIENT_ORIENTATION_SUPPORT_H_ +#define CLIENT_ORIENTATION_SUPPORT_H_ + +#include +#include +#include + +#include +#include +#include +#include + +#include "window_data.h" + +namespace ClientModule { + +class OrientationSupport { + public: + OrientationSupport(const WindowDataPtr& windowData, + const WRT::RunnableWidgetObjectPtr& widget); + + void setInitialWindowOrientation(WidgetSettingScreenLock rotationValue); + void setEwkInitialOrientation(WidgetSettingScreenLock rotationValue); + bool setAutoRotation(); +#if USE(WEBKIT_MANUAL_ROTATION) + void setRotationDone(void); + void setManualRotation(bool enable); +#endif + bool isOrientationPrepared(WidgetSettingScreenLock rotationValue); + + void registerRotationCallback(const Evas_Smart_Cb callback, const void *data); + void unregisterRotationCallback(const Evas_Smart_Cb callback); + void unregisterRotationCallbacks(); + void resetOrientation(); + + private: + void setWindowOrientation(int angle); + void rotatePrepared(Evas_Object* obj); + void updateRotationAngle(void); + static void autoRotationCallback(void* data, Evas_Object* obj, void* event); + + WindowDataPtr m_windowData; + WRT::RunnableWidgetObjectPtr m_widget; + // TODO: separate by base class(OrientationManualRotationSupport) + int m_rotationAngle; + + typedef std::pair Callback; + typedef std::vector CallbacksList; + CallbacksList m_registeredCallbacks; +}; + +} // namespace ClientModule +#endif // CLIENT_ORIENTATION_SUPPORT_H_ diff --git a/src/wrt-client/client_submode_support.cpp b/src/wrt-client/client_submode_support.cpp new file mode 100644 index 0000000..278555e --- /dev/null +++ b/src/wrt-client/client_submode_support.cpp @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file client_submode_support.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#include "client_submode_support.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#endif + +namespace ClientModule { +namespace { +const unsigned int EMPTY = 0; +const unsigned int INLINE_MODE = 1; +const unsigned int TRANSIENT_WINDOW = 1 << 1; +} + + //Implementation class +class SubmodeSupportImplementation +{ + private: + bool m_initialized; + WrtDB::TizenAppId m_appId; + unsigned int m_mode; + + void setMode(const int mode) + { + m_mode |= mode; + } + + bool getMode(const int mode) + { + return m_mode & mode; + } + + static Eina_Bool destoryCallback(void* data, int /*type*/, void* event) + { + WrtLogD("called"); + Ecore_X_Window callerId = reinterpret_cast(data); + + Assert(event); + Ecore_X_Event_Window_Hide* ev = + static_cast(event); + + if(ev->win == callerId) { +#if ENABLE(ONE_UI_PROCESS_MODEL) + char* appId = ecore_x_window_prop_string_get(ev->win, ECORE_X_ATOM_UTF8_STRING); + if (appId) { + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().WEB_APP_TERMINATE, + appId); + } +#else + elm_exit(); +#endif + } + return ECORE_CALLBACK_CANCEL; + } + + public: + SubmodeSupportImplementation() : + m_initialized(false), + m_mode(EMPTY) + { + } + + void initialize(WrtDB::TizenAppId appId) + { + WrtLogD("called"); + + m_appId = appId; + WrtDB::WidgetDAOReadOnly dao(m_appId); + WrtDB::WidgetAppControlList widgetApplicationControlList; + dao.getAppControlList(widgetApplicationControlList); + FOREACH(it, widgetApplicationControlList) { + if (it->disposition == + WrtDB::WidgetAppControl::Disposition::INLINE) + { + WrtLogD("disposition"); + setMode(INLINE_MODE); + } + } + + m_initialized = true; + } + + void deinitialize(void) + { + WrtLogD("called"); + m_initialized = false; + } + + bool isInlineMode(void) + { + return getMode(INLINE_MODE); + } + + bool isNeedTerminateOnSuspend(void) + { + if (isInlineMode()) { + return !getMode(TRANSIENT_WINDOW); + } + return false; + } + + bool transientWindow(Ecore_X_Window calleeId) + { + WrtLogD("called"); + if (!m_initialized) { + WrtLogE("not initialized"); + return false; + } + + bundle* b = ApplicationDataSingleton::Instance().getBundle(DPL::ToUTF8String(m_appId)); + if (!b) { + WrtLogW("Service data is empty"); + return false; + } + const char* callerIdPtr = bundle_get_val(b, "__APP_SVC_K_WIN_ID__"); + if (callerIdPtr) { + Ecore_X_Window callerId = atoi(callerIdPtr); + WrtLogD("Caller x handle = %u", callerId); + ecore_x_icccm_transient_for_set(calleeId, callerId); + ecore_x_window_client_manage(callerId); + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, + destoryCallback, + reinterpret_cast(callerId)); + setMode(TRANSIENT_WINDOW); + } else { + WrtLogW("Service data is empty"); + return false; + } + + return true; + } +}; + +SubmodeSupport::SubmodeSupport() : + m_impl(new SubmodeSupportImplementation()) +{ +} + +SubmodeSupport::~SubmodeSupport() +{ +} + +void SubmodeSupport::initialize(WrtDB::TizenAppId appId) +{ + m_impl->initialize(appId); +} + +void SubmodeSupport::deinitialize(void) +{ + m_impl->deinitialize(); +} + +bool SubmodeSupport::isInlineMode(void) +{ + return m_impl->isInlineMode(); +} + +bool SubmodeSupport::isNeedTerminateOnSuspend(void) +{ + return m_impl->isNeedTerminateOnSuspend(); +} + +bool SubmodeSupport::transientWindow(Ecore_X_Window calleeId) +{ + return m_impl->transientWindow(calleeId); +} +} // namespace ClientModule diff --git a/src/wrt-client/client_submode_support.h b/src/wrt-client/client_submode_support.h new file mode 100644 index 0000000..4fdcf66 --- /dev/null +++ b/src/wrt-client/client_submode_support.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file client_submode_support.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + */ + +#ifndef CLIENT_SUBMODE_SUPPORT_H_ +#define CLIENT_SUBMODE_SUPPORT_H_ + +#include +#include + +#include + +namespace ClientModule { +class SubmodeSupportImplementation; +class SubmodeSupport +{ + public: + SubmodeSupport(); + virtual ~SubmodeSupport(); + void initialize(WrtDB::TizenAppId appId); + void deinitialize(void); + bool isInlineMode(void); + bool isNeedTerminateOnSuspend(void); + bool transientWindow(Ecore_X_Window win); + + private: + std::unique_ptr m_impl; +}; +} // namespace ClientModule +#endif // CLIENT_SUBMODE_SUPPORT_H_ \ No newline at end of file diff --git a/src/wrt-client/process_pool/smack_labeling_support.cpp b/src/wrt-client/process_pool/smack_labeling_support.cpp new file mode 100644 index 0000000..a5e2957 --- /dev/null +++ b/src/wrt-client/process_pool/smack_labeling_support.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file smack_labeling_support.cpp + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief API to support smack labeling for whole threads in a process. + */ + +#include "smack_labeling_support.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SMACK_LABEL_LEN 255 +#define FILE_MAX_LEN 1024 +#define MAX_RETRY_CNT 1000 +#define UID_ROOT 0 + +static char s_smack_label[SMACK_LABEL_LEN + 1] = {0,}; +static int s_waiting_task_cnt = 0; + +static int smack_set_label_for_tid(const char *label) +{ + int len, fd, ret; + char curren_path[FILE_MAX_LEN + 1] = {0,}; + + len = strnlen(label, SMACK_LABEL_LEN + 1); + + if (len > SMACK_LABEL_LEN) + { + return -1; + } + + snprintf(curren_path, sizeof(curren_path), "/proc/%d/attr/current", (int)syscall(__NR_gettid)); + + fd = open(curren_path, O_WRONLY); + + if (fd < 0) + { + return -1; + } + + ret = write(fd, label, len); + close(fd); + + return (ret < 0) ? -1 : 0; +} + +static void SIGUSR1_handler(int /*signo*/) +{ + if (smack_set_label_for_tid(s_smack_label) != 0) + { + WrtLogE("## [tid: %d] smack_set_label_for_tid() failed! ##", (int)syscall(__NR_gettid)); + } + s_waiting_task_cnt--; +} + +static int set_SIGUSR1_handler() +{ + if (signal(SIGUSR1, SIGUSR1_handler) == SIG_ERR) + { + WrtLogE("## signal(SIGUSR1, SIGUSR1_handler) failed! ##"); + return -1; + } + + return 0; +} + +static int set_SIGUSR1_to_default() +{ + if (signal(SIGUSR1, SIG_DFL) == SIG_ERR) + { + WrtLogE("## signal(SIGUSR1, SIG_ERR) failed! ##"); + return -1; + } + + return 0; +} + +static int send_SIGUSR1_to_threads() +{ + int ret; + DIR *dir; + struct dirent entry, *result; + char proc_self_task_path[FILE_MAX_LEN + 1] = {0, }; + + sprintf(proc_self_task_path, "/proc/self/task"); + + dir = opendir(proc_self_task_path); + + if (dir) + { + for (ret = readdir_r(dir, &entry, &result); + result != NULL && ret == 0; + ret = readdir_r(dir, &entry, &result)) + { + if (strncmp(entry.d_name, ".", 2) == 0 || + strncmp(entry.d_name, "..", 3) == 0) + { + continue; + } + + s_waiting_task_cnt++; + if (syscall(__NR_tkill, atoi(entry.d_name), SIGUSR1) != 0) + { + WrtLogE("## tkill(%dSIGUSR1) failed! ##", atoi(entry.d_name)); + s_waiting_task_cnt--; + } + } + + closedir(dir); + } + else + { + WrtLogE("## opendir(\"/proc/self/task\") failed! ##"); + return -1; + } + + return 0; +} + +int set_app_smack_label(const char* app_path) +{ + assert(s_waiting_task_cnt == 0); + + if (UID_ROOT != getuid() || app_path == NULL) + { + WrtLogE("## parameter error! ##"); + return -1; + } + + // set SIGUSR1 signal handler + if (set_SIGUSR1_handler() != 0) + { + return -1; + } + + // get smack label from app_path + char *smack_label = NULL; + + if (smack_lgetlabel(app_path, &smack_label, SMACK_LABEL_EXEC) != 0) + { + WrtLogE("## smack_lgetlabel() failed! ##"); + goto err_set_app_smack_label; + } + + if (smack_label) + { + strncpy(s_smack_label, smack_label, sizeof(s_smack_label)); + s_smack_label[SMACK_LABEL_LEN] = '\0'; + + free(smack_label); + smack_label = NULL; + } + else + { + WrtLogE("## smack_label is NULL! ##"); + strcpy(s_smack_label, ""); + } + + if (send_SIGUSR1_to_threads() != 0) + { + WrtLogE("## send_SIGUSR1_to_threads() timeout! ##"); + goto err_set_app_smack_label; + } + + // wait for labeling on each tasks + int i; + + for (i=0; s_waiting_task_cnt && i < MAX_RETRY_CNT; i++) + { + usleep(100); // 0.1ms + } + + if (i == MAX_RETRY_CNT) + { + WrtLogE("## set_app_smack_label() timeout! ##"); + } + + // set SIGUSR1 signal defualt handler + set_SIGUSR1_to_default(); + + return 0; + +err_set_app_smack_label: + s_waiting_task_cnt = 0; + set_SIGUSR1_to_default(); + + return -1; +} + + diff --git a/src/wrt-client/process_pool/smack_labeling_support.h b/src/wrt-client/process_pool/smack_labeling_support.h new file mode 100644 index 0000000..09ef1a5 --- /dev/null +++ b/src/wrt-client/process_pool/smack_labeling_support.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file smack_labeling_support.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief API to support smack labeling for whole threads in a process. + */ + +#ifndef SMACK_LABELING_SUPPORT_H +#define SMACK_LABELING_SUPPORT_H + +int set_app_smack_label(const char* app_path); + +#endif // SMACK_LABELING_SUPPORT_H diff --git a/src/wrt-client/splash_screen_support.cpp b/src/wrt-client/splash_screen_support.cpp new file mode 100644 index 0000000..eff3875 --- /dev/null +++ b/src/wrt-client/splash_screen_support.cpp @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file splash_screen_support.cpp + * @author Andrzej Surdej (a.surdej@samsung.com) + * @brief Implementation file for splash screen support + */ + +#include "splash_screen_support.h" +#include + +const short SPLASH_SCREEN_LAYER = 10; +const double SPLASH_SCREEN_MAXIUM_TIMER = 5.0; // sec +const double SPLASH_SCREEN_BUFFER_TIMER = 0.3; // sec +const int INDICATOR_H = 60; + +static void evas_object_reposition(Evas_Object* obj, int x, int y, int w, int h) +{ + evas_object_resize(obj,w, h); + evas_object_move(obj, x, y); +} + +SplashScreenSupport::SplashScreenSupport(Evas_Object* parent, const char* image_path, bool indicator, bool landscape) : + m_parent(parent), + m_splashScreen(NULL), + m_splashScreenBg(NULL), + m_timer(NULL), + m_deviceWidth(0), + m_deviceHeight(0), + m_imageWidth(0), + m_imageHeight(0), + m_initialized(false), + m_isShowing(false), + m_indicator(indicator) +{ + WrtLogD("enter"); + + if (!m_parent || !image_path) + { + WrtLogE("Invalid parameter"); + return; + } + + // create evas object + m_splashScreenBg = evas_object_rectangle_add(evas_object_evas_get(m_parent)); + evas_object_color_set(m_splashScreenBg, 255, 255, 255, 255); + + m_splashScreen = elm_image_add(m_splashScreenBg); + elm_image_no_scale_set(m_splashScreen, FALSE); + + if (elm_image_file_set(m_splashScreen, image_path, NULL)) + { + // check animation + if (elm_image_animated_available_get(m_splashScreen)) + { + elm_image_animated_set(m_splashScreen, EINA_TRUE); + elm_image_animated_play_set(m_splashScreen, EINA_FALSE); + } + + // get contents area + Evas_Coord x, y, w, h; + evas_object_geometry_get(m_parent, &x, &y, &w, &h); + + m_deviceWidth = (w < h) ? w : h; + m_deviceHeight = (w > h) ? w : h; + + if (!landscape) + { + x = 0; + y = 0; + w = m_deviceWidth; + h = m_deviceHeight; + + if (m_indicator) + { + int indicator_h = ELM_SCALE_SIZE(INDICATOR_H); + + y += indicator_h; + h -= indicator_h; + } + } + else + { + x = 0; + y = 0; + w = m_deviceHeight; + h = m_deviceWidth; + } + + // fit to width + elm_image_object_size_get(m_splashScreen, &m_imageWidth, &m_imageHeight); + + if (m_imageWidth == 0 || m_imageHeight == 0) + { + WrtLogE("Splash screen image size error!"); + + m_imageWidth = w; + m_imageHeight = h; + } + + double ratio_win = (double)w/h; + double ratio_image = (double)m_imageWidth/m_imageHeight; + + // set evas position + evas_object_reposition(m_splashScreenBg, x, y, w, h); + evas_object_reposition(m_splashScreen, x, y, w, h); + + double scaled_image_w = w; + double scaled_image_h = (w/ratio_image); + + Evas_Object* imageObject = elm_image_object_get(m_splashScreen); + + if (ratio_image <= ratio_win) + { + evas_object_image_fill_set(imageObject, 0, 0-((scaled_image_h-h)/2), scaled_image_w, scaled_image_h); + evas_object_reposition(imageObject, x, y, w, h); + } + else + { + evas_object_image_fill_set(imageObject, 0, 0, scaled_image_w, scaled_image_h); + evas_object_reposition(imageObject, 0, y+(h-scaled_image_h)/2, scaled_image_w, scaled_image_h); + } + + m_initialized = true; + } +} + +SplashScreenSupport::~SplashScreenSupport() +{ + WrtLogD("enter"); + + if (m_initialized) + { + evas_object_del(m_splashScreen); + evas_object_del(m_splashScreenBg); + } + + if (m_timer) + { + ecore_timer_del(m_timer); + m_timer = NULL; + } +} + +Eina_Bool SplashScreenSupport::timerCallback(void *data) +{ + WrtLogD("enter"); + + SplashScreenSupport* This = static_cast(data); + + if (This->isShowing()) + { + This->stopSplashScreen(); + } + + return ECORE_CALLBACK_CANCEL; +} + +void SplashScreenSupport::startSplashScreen() +{ + WrtLogD("splashImageOn"); + + if (m_initialized) + { + if (elm_image_animated_get(m_splashScreen) == EINA_TRUE) + { + elm_image_animated_play_set(m_splashScreen, EINA_TRUE); + } + + evas_object_layer_set(m_splashScreenBg, SPLASH_SCREEN_LAYER); + evas_object_layer_set(m_splashScreen, SPLASH_SCREEN_LAYER); + + evas_object_show(m_splashScreenBg); + evas_object_show(m_splashScreen); + + m_isShowing = true; + + if (m_timer) + { + ecore_timer_del(m_timer); + } + + m_timer = ecore_timer_add(SPLASH_SCREEN_MAXIUM_TIMER, timerCallback, this); + } +} + + +void SplashScreenSupport::stopSplashScreenBuffered() +{ + if (m_isShowing) + { + if (m_timer) + { + ecore_timer_del(m_timer); + } + + m_timer = ecore_timer_add(SPLASH_SCREEN_BUFFER_TIMER, timerCallback, this); + } +} + +void SplashScreenSupport::stopSplashScreen() +{ + WrtLogD("splashImageOff"); + + if (m_isShowing) + { + if (elm_image_animated_get(m_splashScreen) == EINA_TRUE) + { + elm_image_animated_play_set(m_splashScreen, EINA_FALSE); + } + + evas_object_hide(m_splashScreen); + evas_object_hide(m_splashScreenBg); + + evas_object_del(m_splashScreen); + evas_object_del(m_splashScreenBg); + + m_initialized = false; + m_isShowing = false; + + if (m_timer) + { + ecore_timer_del(m_timer); + m_timer = NULL; + } + } +} + +bool SplashScreenSupport::isShowing() +{ + return m_isShowing; +} + +void SplashScreenSupport::resizeSplashScreen() +{ + if (m_initialized && m_isShowing) + { + int x, y, w, h; + int angle = elm_win_rotation_get(m_parent); + + if (angle == 0 || angle == 180) + { + x = 0; + y = 0; + w = m_deviceWidth; + h = m_deviceHeight; + + if (m_indicator) + { + int indicator_h =ELM_SCALE_SIZE(INDICATOR_H); + + y += indicator_h; + h -= indicator_h; + } + } + else + { + x = 0; + y = 0; + w = m_deviceHeight; + h = m_deviceWidth; + } + + // fit to width + double ratio_win = (double)w/h; + double ratio_image = (double)m_imageWidth/m_imageHeight; + + evas_object_reposition(m_splashScreenBg, x, y, w, h); + evas_object_reposition(m_splashScreen, x, y, w, h); + + double scaled_image_w = w; + double scaled_image_h = (w/ratio_image); + + Evas_Object* imageObject = elm_image_object_get(m_splashScreen); + + if (ratio_image <= ratio_win) + { + evas_object_image_fill_set(imageObject, 0, 0-((scaled_image_h-h)/2), scaled_image_w, scaled_image_h); + evas_object_reposition(imageObject, x, y, w, h); + } + else + { + evas_object_image_fill_set(imageObject, 0, 0, scaled_image_w, scaled_image_h); + evas_object_reposition(imageObject, 0, y+(h-scaled_image_h)/2, scaled_image_w, scaled_image_h); + } + + } +} diff --git a/src/wrt-client/splash_screen_support.h b/src/wrt-client/splash_screen_support.h new file mode 100644 index 0000000..553b863 --- /dev/null +++ b/src/wrt-client/splash_screen_support.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file splash_screen_support.h + * @author Andrzej Surdej (a.surdej@samsung.com) + * @brief Header file for supporting splash screen handling + */ + +#ifndef WRT_SPLASH_SCREEN_SUPPORT_H +#define WRT_SPLASH_SCREEN_SUPPORT_H + +#include +#include + +class SplashScreenSupport +{ + public: + SplashScreenSupport(Evas_Object* parent, const char* image_path, bool indicator = true, bool landscape = false); + ~SplashScreenSupport(); + + void startSplashScreen(); + void stopSplashScreen(); + void stopSplashScreenBuffered(); + bool isShowing(); + void resizeSplashScreen(); + static Eina_Bool timerCallback(void *data); + + private: + Evas_Object* m_parent; + Evas_Object* m_splashScreen; + Evas_Object* m_splashScreenBg; + Ecore_Timer* m_timer; + + int m_deviceWidth; + int m_deviceHeight; + int m_imageWidth; + int m_imageHeight; + + bool m_initialized; + bool m_isShowing; + bool m_indicator; +}; + +#endif /* WRT_SPLASH_SCREEN_SUPPORT_H */ diff --git a/src/wrt-client/web_app_manager.cpp b/src/wrt-client/web_app_manager.cpp new file mode 100644 index 0000000..90caca5 --- /dev/null +++ b/src/wrt-client/web_app_manager.cpp @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "web_app_manager.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char* const BUNDLE_PATH = "/usr/lib/libwrt-injected-bundle.so"; + +WebAppManager::WebAppManager() : + m_nextLaunchContext(NULL), + m_nextLaunchWindowData(NULL) +{ + WrtLogD("called"); + +#ifndef TIZEN_PUBLIC + setenv("COREGL_FASTPATH", "1", 1); +#endif + setenv("CAIRO_GL_COMPOSITOR", "msaa", 1); + setenv("CAIRO_GL_LAZY_FLUSHING", "yes", 1); + setenv("ELM_IMAGE_CACHE", "0", 1); + setenv("IGNORE_WEBPROCESS_MEM_TRACKING", "1", 1); + + WRT::CoreModuleSingleton::Instance().Init(); + ewk_init(); + if(!getenv("WRT_PROCESS_POOL_DISABLE")) { + WebInternalEventSingleton::Instance().addListner(WebInternalEvent::WEB_APP_START_POOL_PROCESS, + createPoolProcessCallback, + this); + } +} + +WebAppManager::~WebAppManager() +{ + WrtLogD("called"); + + ewk_shutdown(); + WRT::CoreModuleSingleton::Instance().Terminate(); +} + +bool WebAppManager::create(std::string appId, bundle* b) +{ + WrtLogD("create"); + + WrtClientLitePtr clientPtr = findWrtClientLitePtr(appId); + if (clientPtr) { + WrtLogW("wrtClientLitePtr already exists"); + clientPtr->OnReset(b); + return true; + } + + WrtClientLitePtr ptr(new WrtClientLite(appId, m_nextLaunchContext, m_nextLaunchWindowData)); + + if (!ptr) { + WrtLogE("Fail to create wrt-client-lite"); + return false; + } + + if (!setWebProcessCmdlineEnv(appId, m_nextLaunchContext && m_nextLaunchWindowData)) { + WrtLogE("Fail to change web process cmdline"); + return false; + } + ptr->OnCreate(b); + unsetWebProcessCmdlineEnv(); + m_nextLaunchContext = NULL; + m_nextLaunchWindowData = NULL; + + m_wrtClientLitePtrMap.insert(WrtClientLitePtrMapPair(appId, ptr)); + + return true; +} + +void WebAppManager::service(std::string appId, bundle* b) +{ + WrtLogD("service"); + + WrtClientLitePtr ptr = findWrtClientLitePtr(appId); + if (ptr) { + ptr->OnReset(b); + } +} + +void WebAppManager::resume(std::string appId) +{ + WrtLogD("resume"); + + WrtClientLitePtr ptr = findWrtClientLitePtr(appId); + if (ptr) { + ptr->OnResume(); + } +} + +void WebAppManager::suspend(std::string appId) +{ + WrtLogD("suspend"); + + WrtClientLitePtr ptr = findWrtClientLitePtr(appId); + if (ptr) { + ptr->OnSuspend(); + } +} + +void WebAppManager::terminate(std::string appId) +{ + WrtLogD("terminate"); + + WrtClientLitePtr ptr = findWrtClientLitePtr(appId); + if (ptr) { + ptr->OnTerminate(); + m_wrtClientLitePtrMap.erase(appId); + } +} + +WrtClientLitePtr WebAppManager::findWrtClientLitePtr(std::string appId) +{ + WrtClientLitePtr ptr; + auto it = m_wrtClientLitePtrMap.find(appId); + if (it != m_wrtClientLitePtrMap.end()) { + WrtLogD("found WrtClientLitePtr: %s", it->first.c_str()); + ptr = it->second; + } + + return ptr; +} + +bool WebAppManager::setWebProcessCmdlineEnv(const std::string& appId, bool isPooledProcess) +{ + ail_appinfo_h handle = NULL; + ail_error_e ret = ail_get_appinfo(appId.c_str(), &handle); + if (AIL_ERROR_OK != ret) { + WrtLogE("error ail_get_appinfo : %d", ret); + return false; + } + + char* path; + ret = ail_appinfo_get_str(handle, AIL_PROP_X_SLP_EXE_PATH, &path); + if (AIL_ERROR_OK != ret) { + WrtLogE("error ail_appinfo_get_str(%s) : %d", AIL_PROP_X_SLP_EXE_PATH, ret); + ail_destroy_appinfo(handle); + return false; + } + + std::string pluginProcessPath = WRT::SecuritySupport::getPluginProcessSoftLinkPath(appId); + if (!isPooledProcess) { + setenv("WEB_PROCESS_EXECUTABLE_PATH", path, 1); + setenv("PLUGIN_PROCESS_EXECUTABLE_PATH", pluginProcessPath.c_str(), 1); + } else { + ewk_context_message_post_to_injected_bundle(m_nextLaunchContext, Message::ToWebProcess::CHANGE_CMDLINE, path); + setenv("PLUGIN_PROCESS_EXECUTABLE_PATH_FOR_PROCESS_POOL", pluginProcessPath.c_str(), 1); + } + + ail_destroy_appinfo(handle); + return true; +} + +void WebAppManager::unsetWebProcessCmdlineEnv(void) +{ + unsetenv("WEB_PROCESS_EXECUTABLE_PATH"); + unsetenv("PLUGIN_PROCESS_EXECUTABLE_PATH"); +} + +Eina_Bool WebAppManager::createPoolProcessCallback(void* data, int type, void* event) +{ + WrtLogD("Create Pooled process"); + + Assert(data); + + DPL_UNUSED_PARAM(type); + DPL_UNUSED_PARAM(event); + + setenv("WEB_PROCESS_EXECUTABLE_PATH", "/usr/bin/WebProcess", 1); // To make sure WebContext is created + setenv("WEB_PROCESS_EXECUTABLE_PATH_FOR_PROCESS_POOL","1", 1); // To ensure WebProcess is created + + WebAppManager* This = static_cast(data); + if (This->m_nextLaunchContext == NULL) { + This->m_nextLaunchContext = ewk_context_new_with_injected_bundle_path(BUNDLE_PATH); + if (This->m_nextLaunchContext == NULL) { + WrtLogW("Creating webkit context was failed!"); + return ECORE_CALLBACK_RENEW; + } + } + + if (This->m_nextLaunchWindowData == NULL) { + This->m_nextLaunchWindowData = new WindowData(static_cast(getpid())); + } + + unsetenv("WEB_PROCESS_EXECUTABLE_PATH"); + unsetenv("WEB_PROCESS_EXECUTABLE_PATH_FOR_PROCESS_POOL"); + return ECORE_CALLBACK_RENEW; +} + +void WebAppManager::resetAulConnection(std::string appId) +{ + WrtLogD("reset aul connection"); + WrtClientLitePtr ptr = findWrtClientLitePtr(appId); + if (ptr) { + ptr->OnResetAulConnection(); + } +} diff --git a/src/wrt-client/web_app_manager.h b/src/wrt-client/web_app_manager.h new file mode 100644 index 0000000..8b4ecc7 --- /dev/null +++ b/src/wrt-client/web_app_manager.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WEB_APP_MANAGER_H_ +#define WEB_APP_MANAGER_H_ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include "window_data.h" +#include "wrt-client-lite.h" + +class WebAppManager +{ + public: + WebAppManager(); + virtual ~WebAppManager(); + + bool create(std::string appId, bundle *b); + void service(std::string appId, bundle* b); + void resume(std::string appId); + void suspend(std::string appId); + void terminate(std::string appId); + static Eina_Bool createPoolProcessCallback(void *data, int type, void *event); + void resetAulConnection(std::string appId); + + private: + WrtClientLitePtr findWrtClientLitePtr(std::string appId); + + // WebProcess cmdline change + bool setWebProcessCmdlineEnv(const std::string& appId, bool isPooledProcess); + void unsetWebProcessCmdlineEnv(void); + + typedef std::map WrtClientLitePtrMap; + typedef std::pair WrtClientLitePtrMapPair; + WrtClientLitePtrMap m_wrtClientLitePtrMap; + + Ewk_Context* m_nextLaunchContext; + WindowData* m_nextLaunchWindowData; +}; + +#endif // WEB_APP_MANAGER_H_ diff --git a/src/wrt-client/widget_state.h b/src/wrt-client/widget_state.h new file mode 100644 index 0000000..2c3c061 --- /dev/null +++ b/src/wrt-client/widget_state.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file core_module.cpp + * @author Przemyslaw Ciezkowski (p.ciezkowski@samsung.com) + * @version 1.0 + * @brief File contains declaration of WidgetState enum. + */ + +#ifndef WIDGET_STATE_H +#define WIDGET_STATE_H + +enum WidgetState +{ + WidgetState_Stopped, + WidgetState_Created, + WidgetState_Running, + WidgetState_Suspended, + WidgetState_Stopping +}; + +#endif /* WIDGET_STATE_H */ + diff --git a/src/wrt-client/window_data.cpp b/src/wrt-client/window_data.cpp new file mode 100644 index 0000000..ef5021e --- /dev/null +++ b/src/wrt-client/window_data.cpp @@ -0,0 +1,448 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file window_data.cpp + * @author Jaroslaw Osmanski (j.osmanski@samsung.com) + * @version 1.0 + * @brief Window data class implementation + */ +#include "window_data.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#endif + +namespace { +const unsigned int UID_ROOT = 0; +const char* const DELETE_REQUEST = "delete,request"; +const char* const PROFILE_CHANGED = "profile,changed"; +const char* const DESKTOP_ICON_PATH = + "/opt/share/icons/default/small/tizenScmgz.png"; +const std::string DESKTOP_PROFILE("desktop"); +const int PROGRESS_H = 10; +} // anonymous namespace + +WindowData::WindowData(unsigned long pid, bool manualInit) : + m_win(NULL), + m_bg(NULL), + m_conformant(NULL), + m_conformantBg(NULL), + m_topLayout(NULL), + m_naviframe(NULL), + m_mainLayout(NULL), + m_progressbar(NULL), + m_initialized(false), + m_currentViewModeFullScreen(false) +{ + m_win = createWindow(pid); + + if (!manualInit) { + init(); + } +} + +WindowData::~WindowData() +{ + WrtLogD(""); + evas_object_del(m_win); +} + +void WindowData::init() +{ + AssertMsg(m_win != NULL, "m_win is null"); + + if (m_initialized == true) { + WrtLogD("Already initilized"); + return; + } + + ea_theme_changeable_ui_enabled_set(EINA_TRUE); + m_bg = createBg(m_win); + evas_object_show(m_bg); + m_conformant = createConformant(m_win); + evas_object_show(m_conformant); + m_conformantBg = createConformantBg(m_conformant); + evas_object_show(m_conformantBg); + m_topLayout = createTopLayout(m_conformant); + evas_object_show(m_topLayout); + m_naviframe = createNaviframe(m_topLayout); + evas_object_show(m_naviframe); + m_mainLayout = createMainLayout(m_naviframe); + evas_object_show(m_mainLayout); + m_focus = createFocus(m_mainLayout); + evas_object_show(m_focus); + m_progressbar = createProgressBar(m_win, m_mainLayout); + evas_object_show(m_progressbar); + + UG_INIT_EFL(m_win, UG_OPT_INDICATOR_ENABLE); + m_initialized = true; +} + +void WindowData::postInit() +{ + AssertMsg(m_win != NULL, "m_win is null"); + AssertMsg(m_initialized, "Not init"); + + // postInit should called after process permission is changed to app + if (UID_ROOT == getuid()) { + Assert(!"Cannot do with root permission"); + } + elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW); +} + +#if USE(EA_SCREEN_READER) +bool WindowData::initScreenReaderSupport(bool isSupportAccessibility) +{ + WrtLogD("called"); + AssertMsg(m_win != NULL, "x window is Null"); + return ea_screen_reader_support_set( + m_win, + isSupportAccessibility ? EINA_TRUE : EINA_FALSE); +} +#endif + +Evas_Object* WindowData::getEvasObject(Layer layer) +{ + EvasObjectDataIt it = m_evasObjectData.find(layer); + if (it == m_evasObjectData.end()) { + return NULL; + } + return it->second; +} + +void WindowData::setWebview(Evas_Object* webview) +{ + elm_object_part_content_set(m_focus, "elm.swallow.content", webview); + elm_object_focus_set(m_focus, EINA_TRUE); +} + +void WindowData::unsetWebview() +{ + elm_object_part_content_unset(m_focus, "elm.swallow.content"); +} + +void WindowData::smartCallbackAdd( + Layer layer, + const char* event, + Evas_Smart_Cb callback, + const void* data) +{ + Evas_Object* obj = getEvasObject(layer); + if (!obj) { + WrtLogE("Fail to get Evas_Object"); + return; + } + evas_object_smart_callback_add(obj, event, callback, data); + return; +} + +void WindowData::smartCallbackDel( + Layer layer, + const char* event, + Evas_Smart_Cb callback) +{ + Evas_Object* obj = getEvasObject(layer); + if (!obj) { + WrtLogE("Fail to get Evas_Object"); + return; + } + evas_object_smart_callback_del(obj, event, callback); +} + +void WindowData::signalEmit(Layer layer, + const char* emission, + const char* source) +{ + Evas_Object* obj = getEvasObject(layer); + if (!obj) { + WrtLogE("Fail to get Evas_Object"); + return; + } + edje_object_signal_emit(elm_layout_edje_get(obj), emission, source); +} + +#if ENABLE(ONE_UI_PROCESS_MODEL) +void WindowData::setAppId(const std::string& appId) +{ + Assert(m_win); + if (appId.empty()) { + WrtLogE("appId is empty"); + return; + } + ecore_x_window_prop_string_set(elm_win_xwindow_get(m_win), ECORE_X_ATOM_UTF8_STRING, appId.c_str()); +} +#endif + +void WindowData::setViewMode(bool fullscreen, bool backbutton) +{ + WrtLogD("fullscreen: %d", fullscreen); + WrtLogD("backbutton: %d", backbutton); + + m_currentViewModeFullScreen = fullscreen; + toggleIndicator(fullscreen); +} + +void WindowData::setOrientation(int angle) +{ + WrtLogD("setOrientation"); + Assert(m_win); + elm_win_wm_rotation_preferred_rotation_set(m_win, angle); +} + +void WindowData::toggleFullscreen(bool fullscreen) +{ + toggleIndicator(fullscreen || m_currentViewModeFullScreen); +} + +void WindowData::toggleTransparent(bool transparent) +{ + if (transparent) { + edje_object_signal_emit(elm_layout_edje_get(m_mainLayout), + "show,transparent,signal", + ""); + evas_object_render_op_set(m_bg, EVAS_RENDER_COPY); + } else { + edje_object_signal_emit(elm_layout_edje_get(m_mainLayout), + "hide,transparent,signal", + ""); + evas_object_render_op_set(m_bg, EVAS_RENDER_BLEND); + } +} + +void WindowData::updateProgress(double value) +{ + elm_progressbar_value_set(m_progressbar, ELM_SCALE_SIZE(value)); +} + +void WindowData::setEvasObjectData(Layer layer, Evas_Object* obj) +{ + m_evasObjectData[layer] = obj; +} + +Evas_Object* WindowData::createWindow(unsigned long pid) +{ +#if USE(WEBKIT_HW_BACKEND) + elm_config_preferred_engine_set("opengl_x11"); +#else // WEBKIT_HW_BACKEND + elm_config_preferred_engine_set("software_x11"); +#endif // WEBKIT_HW_BACKEND + ADD_PROFILING_POINT("elm_win_add", "start"); + Evas_Object* window = elm_win_add(NULL, "wrt-widget", ELM_WIN_BASIC); + ADD_PROFILING_POINT("elm_win_add", "stop"); + ecore_x_window_prop_property_set( + elm_win_xwindow_get(window), + ECORE_X_ATOM_NET_WM_PID, + ECORE_X_ATOM_CARDINAL, 32, &pid, 1); + elm_win_conformant_set(window, EINA_TRUE); + int w, h; + ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + evas_object_resize(window, w, h); + elm_win_autodel_set(window, EINA_TRUE); + evas_object_smart_callback_add(window, + DELETE_REQUEST, + winDeleteRequestCallback, + this); + evas_object_smart_callback_add(window, + PROFILE_CHANGED, + winProfileChangedCallback, + this); + setEvasObjectData(Layer::WINDOW, window); + return window; +} + +Evas_Object* WindowData::createBg(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object* obj = evas_object_rectangle_add(evas_object_evas_get(parent)); + evas_object_color_set(obj, 0, 0, 0, 0); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(parent, obj); + evas_object_render_op_set(obj, EVAS_RENDER_BLEND); + setEvasObjectData(Layer::BG, obj); + return obj; +} + +Evas_Object* WindowData::createConformant(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object* obj = elm_conformant_add(parent); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(parent, obj); + setEvasObjectData(Layer::CONFORMANT, obj); + return obj; +} + +Evas_Object* WindowData::createConformantBg(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object *obj = elm_bg_add(parent); + elm_object_style_set(obj, "indicator/headerbg"); + elm_object_part_content_set(parent, "elm.swallow.indicator_bg", obj); + evas_object_show(obj); + return obj; +} + +Evas_Object* WindowData::createTopLayout(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object* obj = elm_layout_add(parent); + elm_layout_theme_set(obj, "layout", "application", "default"); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(parent, obj); + setEvasObjectData(Layer::TOP_LAYOUT, obj); + return obj; +} + +Evas_Object* WindowData::createNaviframe(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object* obj = elm_naviframe_add(parent); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(parent, "elm.swallow.content", obj); + setEvasObjectData(Layer::NAVIFRAME, obj); + return obj; +} + +Evas_Object* WindowData::createMainLayout(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object* obj = elm_layout_add(parent); + elm_layout_file_set(obj, WRT_EDJ_PATH, "web-application"); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + ADD_PROFILING_POINT("elm_naviframe_item_push", "start"); + Elm_Object_Item* naviIt = + elm_naviframe_item_push( + parent, // Evas_Object* obj + NULL, // const char* title_label + NULL, // Evas_Object* prev_btn + NULL, // Evas_Object* next_btn + obj, // Evas_Object* content + "empty/transparent"); // const char* item_style + ADD_PROFILING_POINT("elm_naviframe_item_push", "stop"); + elm_naviframe_item_pop_cb_set(naviIt, naviframeItemPopCallback, NULL); + setEvasObjectData(Layer::MAIN_LAYOUT, obj); + return obj; +} + +Evas_Object* WindowData::createFocus(Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + // ewkview isn't elementary widget style. This is reason why ewkview focus + // doesn't restore after focus-out and focus-in. To support focus restore + // for ewkview, WRT add selectable elementary(button) to manage focus + Evas_Object* obj = elm_button_add(parent); + elm_object_style_set(obj, "transparent"); + elm_object_part_content_set(parent, "elm.swallow.content", obj); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); +#if USE(EA_SCREEN_READER) + elm_access_object_unregister(obj); +#endif + setEvasObjectData(Layer::FOCUS, obj); + return obj; +} + +Evas_Object* WindowData::createProgressBar(Evas_Object* window, Evas_Object* parent) +{ + AssertMsg(parent != NULL, "Parent is null"); + Evas_Object *obj = elm_progressbar_add(parent); + elm_object_style_set(obj, "custom"); + elm_progressbar_horizontal_set(obj, EINA_TRUE); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_value_set(obj, 0.0); + + evas_object_size_hint_min_set(obj, -1, ELM_SCALE_SIZE(1)); + elm_object_part_content_set(parent, "elm.swallow.progress", obj); + setEvasObjectData(Layer::PROGRESSBAR, obj); + return obj; +} + +void WindowData::toggleIndicator(bool fullscreen) +{ + WrtLogD("fullscreen=%s", (fullscreen ? "true" : "false")); + + if (!fullscreen) { + elm_win_indicator_opacity_set(m_win, ELM_WIN_INDICATOR_OPAQUE); + } else { + elm_win_indicator_opacity_set(m_win, ELM_WIN_INDICATOR_TRANSPARENT); + } +} + +void WindowData::winDeleteRequestCallback(void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + DPL_UNUSED_PARAM(data); + WrtLogD("call"); + +#if ENABLE(ONE_UI_PROCESS_MODEL) + WindowData* This = (WindowData*)data; + char* appId = ecore_x_window_prop_string_get(elm_win_xwindow_get(This->m_win), ECORE_X_ATOM_UTF8_STRING); + if (appId) { + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().WEB_APP_TERMINATE, + appId); + } +#else + elm_exit(); +#endif +} + +void WindowData::winProfileChangedCallback(void *data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("winProfileChangedCallback"); + if (data == NULL) { + return; + } + WindowData* This = static_cast(data); + const char* profile = elm_config_profile_get(); + + if (DESKTOP_PROFILE == profile) { + elm_win_indicator_mode_set(This->m_win, ELM_WIN_INDICATOR_HIDE); + // set desktop icon + Evas_Object* icon = + evas_object_image_add(evas_object_evas_get(This->m_win)); + evas_object_image_file_set(icon, DESKTOP_ICON_PATH, NULL); + elm_win_icon_object_set(This->m_win, icon); + } +} + +Eina_Bool WindowData::naviframeItemPopCallback(void* /*data*/, + Elm_Object_Item* /*it*/) +{ + WrtLogD("naviframeItemPopCallback"); + // This return value makes naviframe not to perform a pop operation + // about this item. + return EINA_FALSE; +} + diff --git a/src/wrt-client/window_data.h b/src/wrt-client/window_data.h new file mode 100644 index 0000000..287bfb1 --- /dev/null +++ b/src/wrt-client/window_data.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file window_data.h + * @author Jaroslaw Osmanski (j.osmanski@samsung.com) + * @version 1.0 + * @brief Window data header file. + */ + +#ifndef WINDOW_INITIALIZE_H_ +#define WINDOW_INITIALIZE_H_ + +#include +#include +#include +#include + +#include +#include +#include + +enum class Layer { + WINDOW = 0, + BG = 1, + CONFORMANT = 2, + TOP_LAYOUT = 3, + NAVIFRAME = 4, + MAIN_LAYOUT = 5, + FOCUS = 6, + PROGRESSBAR = 7 +}; + +class WindowData : private DPL::Noncopyable +{ + public: + explicit WindowData(unsigned long pid, bool manualInit = false); + virtual ~WindowData(); + + void init(); + void postInit(); +#if USE(EA_SCREEN_READER) + bool initScreenReaderSupport(bool isSupportAccessibility); +#endif + + Evas_Object* getEvasObject(Layer layer); + void setWebview(Evas_Object* evas_object); + void unsetWebview(); + + void smartCallbackAdd( + Layer layer, + const char* event, + Evas_Smart_Cb callback, + const void* data); + void smartCallbackDel( + Layer layer, + const char* event, + Evas_Smart_Cb callback); + void signalEmit(Layer layer, const char* emission, const char* source); + +#if ENABLE(ONE_UI_PROCESS_MODEL) + void setAppId(const std::string& appId); +#endif + void setViewMode(bool fullscreen, bool backbutton); + void setOrientation(int angle); + void toggleFullscreen(bool fullscreen); + void toggleTransparent(bool transparent); + void updateProgress(double value); + + private: + Evas_Object* m_win; + Evas_Object* m_bg; + Evas_Object* m_conformant; + Evas_Object* m_conformantBg; + Evas_Object* m_topLayout; + Evas_Object* m_naviframe; + Evas_Object* m_mainLayout; + Evas_Object* m_focus; + Evas_Object* m_progressbar; + bool m_initialized; + bool m_currentViewModeFullScreen; + + typedef std::map EvasObjectData; + typedef std::map::iterator EvasObjectDataIt; + EvasObjectData m_evasObjectData; + void setEvasObjectData(Layer layer, Evas_Object* obj); + + Evas_Object* createWindow(unsigned long pid); + Evas_Object* createBg(Evas_Object* parent); + Evas_Object* createConformant(Evas_Object* parent); + Evas_Object* createConformantBg(Evas_Object* parent); + Evas_Object* createTopLayout(Evas_Object* parent); + Evas_Object* createNaviframe(Evas_Object* parent); + Evas_Object* createMainLayout(Evas_Object* parent); + Evas_Object* createFocus(Evas_Object* parent); + Evas_Object* createProgressBar(Evas_Object* window, Evas_Object* parent); + + void toggleIndicator(bool fullscreen); + static void winDeleteRequestCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void winProfileChangedCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static Eina_Bool naviframeItemPopCallback(void *data, + Elm_Object_Item *it); + + }; + +typedef std::shared_ptr WindowDataPtr; + +#endif /* WINDOW_INITIALIZE_H_ */ diff --git a/src/wrt-client/wrt-client-lite.cpp b/src/wrt-client/wrt-client-lite.cpp new file mode 100644 index 0000000..db5de74 --- /dev/null +++ b/src/wrt-client/wrt-client-lite.cpp @@ -0,0 +1,928 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "wrt-client-lite.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#if ENABLE(ONE_UI_PROCESS_MODEL) +#include +#include +#endif + +#include "client_command_line_parser.h" +#include "client_ide_support.h" +#include "client_orientation_support.h" + +#define POOL_PROCESS_TIMER 2 +//W3C PACKAGING enviroment variable name +#define W3C_DEBUG_ENV_VARIABLE "DEBUG_LOAD_FINISH" + +//Tizen Extensible API String +const char* const EXTENSIBLE_API_PRERENDERING_FOR_ROTATION = "prerendering,for,rotation"; +const char* const EXTENSIBLE_API_MEDIA_VOLUME_CONTROL = "media,volume,control"; + +// window signal callback +const char* const EDJE_SHOW_PROGRESS_SIGNAL = "show,progress,signal"; +const char* const EDJE_HIDE_PROGRESS_SIGNAL = "hide,progress,signal"; +const std::string VIEWMODE_TYPE_FULLSCREEN = "fullscreen"; +const std::string VIEWMODE_TYPE_MAXIMIZED = "maximized"; +const std::string VIEWMODE_TYPE_WINDOWED = "windowed"; +const char* const ELM_SWALLOW_CONTENT = "elm.swallow.content"; +const char* const BUNDLE_PATH = "/usr/lib/libwrt-injected-bundle.so"; + +// env +const char* const WRT_CONSOLE_LOG_ENABLE = "WRT_CONSOLE_LOG_ENABLE"; + +WrtClientLite::WrtClientLite(const std::string& appId, Ewk_Context* context, WindowData* winData) : + m_tizenId(appId), + m_debugMode(false), + m_widgetState(WidgetState_Stopped), + m_initialViewMode(VIEWMODE_TYPE_MAXIMIZED), + m_currentViewMode(VIEWMODE_TYPE_MAXIMIZED), +#if USE(WEBKIT_MANUAL_ROTATION) + m_isWebkitHandleManualRotationDone(false), +#endif + m_isWebkitFullscreen(false), + m_savedContext(context), + m_savedWindowData(winData), + m_didCreatePool(false), + m_processPoolTimer(NULL) +{ + if (m_savedContext) { + WrtLogD("init injected bundle"); + std::string msg = "1 " + m_tizenId; // 1 specifies argument count + ewk_context_message_post_to_injected_bundle( + m_savedContext, + Message::ToInjectedBundle::INIT, + msg.c_str()); + } +} + +WrtClientLite::~WrtClientLite() +{ +} + +bool WrtClientLite::OnCreate(bundle *b) +{ + WrtLogD("create"); + + ApplicationDataSingleton::Instance().setBundleData(m_tizenId, b); + m_widget = WRT::CoreModuleSingleton::Instance().getRunnableWidgetObject(m_tizenId); + if (!m_widget) { + WrtLogE("RunnableWidgetObject is NULL"); + return false; + } + + m_dao.reset(new WrtDB::WidgetDAOReadOnly(DPL::FromASCIIString(m_tizenId))); + WrtDB::WidgetSettings widgetSettings; + m_dao->getWidgetSettings(widgetSettings); + m_settingList.reset(new WidgetSettingList(widgetSettings)); + + DPL::OptionalString defloc = m_dao->getDefaultlocale(); + if (!!defloc) { + LanguageTagsProviderSingleton::Instance().addWidgetDefaultLocales(*defloc); + } + + setInitialViewMode(); + + /* remove language change callback */ + /* + LocalizationSetting::SetLanguageChangedCallback( + languageChangedCallback, this); + */ + + if (m_savedWindowData) { + m_windowData.reset(m_savedWindowData); + } else { + m_windowData.reset(new WindowData(static_cast(getpid()), true)); + } +#if USE(EA_SCREEN_READER) + if (!m_windowData->initScreenReaderSupport( + m_settingList->getAccessibility() == Accessibility_Enable)) + { + WrtLogW("Fail to set screen reader support set"); + } +#endif + + // rotate window to initial value + initWindowOrientation(); + + WRT::UserDelegatesPtr cbs(new WRT::UserDelegates); + + DPL::OptionalString startUrl = W3CFileLocalization::getStartFile(m_dao); +#if USE(WEB_PROVIDER_EXCEPTION_IN_EWK_CONTEXT) + // TODO: need api to get Ewk_Context + //ewk_context_tizen_extensible_api_string_set(s_preparedEwkContext, EXTENSIBLE_API_MEDIA_VOLUME_CONTROL, EINA_TRUE); +#endif + if (!m_widget->PrepareView(DPL::ToUTF8String(*startUrl), m_windowData->getEvasObject(Layer::WINDOW), m_savedContext)) { + return false; + } + // send rotate information to ewk + m_orientationSupport->setEwkInitialOrientation(m_settingList->getRotationValue()); + + //you can't show window with splash screen before PrepareView + //ewk_view_add_with_context() in viewLogic breaks window + m_windowData->init(); + m_windowData->postInit(); + m_windowData->setAppId(m_tizenId); + m_windowData->smartCallbackAdd(Layer::FOCUS, "focused", focusedCallback, this); + m_windowData->smartCallbackAdd(Layer::FOCUS, "unfocused", unfocusedCallback, this); + + WrtDB::WidgetLocalizedInfo localizedInfo = + W3CFileLocalization::getLocalizedInfo(m_dao); + std::string name = ""; + if (!!localizedInfo.name) { + name = DPL::ToUTF8String(*(localizedInfo.name)); + } + elm_win_title_set(m_windowData->getEvasObject(Layer::WINDOW), + name.c_str()); + + // window show + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); + + initializeWindowModes(); + + cbs->loadProgressStartedCallback = DPL::Bind(&WrtClientLite::loadProgressStartedCallback, this); + cbs->loadProgressCallback = DPL::Bind(&WrtClientLite::loadProgressCallback, this); + cbs->loadProgressFinishedCallback = DPL::Bind(&WrtClientLite::loadProgressFinishedCallback, this); + cbs->loadStartedCallback = DPL::Bind(&WrtClientLite::loadStartedCallback, this); + cbs->loadFinishedCallback = DPL::Bind(&WrtClientLite::loadFinishedCallback, this); + cbs->setWebviewCallback = DPL::Bind(&WrtClientLite::setLayout, this); + cbs->unsetWebviewCallback = DPL::Bind(&WrtClientLite::unsetLayout, this); + cbs->processExitCallback = DPL::Bind(&WrtClientLite::processExitCallback, this); + cbs->webProcessCrashedCallback = DPL::Bind(&WrtClientLite::webProcessCrashedCallback, this); + cbs->processCrashedCallback = DPL::Bind(&WrtClientLite::processCrashedCallback, this); + cbs->enterFullscreenCallback = DPL::Bind(&WrtClientLite::enterFullscreenCallback, this); + cbs->exitFullscreenCallback = DPL::Bind(&WrtClientLite::exitFullscreenCallback, this); + cbs->orientationLockCallback = DPL::Bind(&WrtClientLite::setWindowOrientation, this); + cbs->keyCallback = DPL::Bind(&WrtClientLite::keyCallback, this); + cbs->consoleMessageCallback = DPL::Bind(&WrtClientLite::consoleMessageCallback, this); + cbs->rotatePreparedCallback = DPL::Bind(&WrtClientLite::rotatePreparedCallback, this); + cbs->enableVideoHwOverlayCallback = DPL::Bind(&WrtClientLite::enableVideoHwOverlayCallback, this); + cbs->disableVideoHwOverlayCallback = DPL::Bind(&WrtClientLite::disableVideoHwOverlayCallback, this); + cbs->popupReplyWaitStartCallback = DPL::Bind(&WrtClientLite::popupReplyWaitStartCallback, this); + cbs->popupReplyWaitFinishCallback = DPL::Bind(&WrtClientLite::popupReplyWaitFinishCallback, this); + cbs->frameRenderedCallback = DPL::Bind(&WrtClientLite::frameRenderedCallback, this); + cbs->blockedUrlPolicyCallback = DPL::Bind(&WrtClientLite::blockedUrlPolicyCallback, this); + cbs->isCreateNewWindowAllowedCallback = DPL::Bind(&WrtClientLite::isCreateNewWindowAllowedCallback, this); + cbs->createContextMenuCallback = DPL::Bind(&WrtClientLite::createContextMenuCallback, this); + + m_widget->SetUserDelegates(cbs); + + vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, WrtClientLite::appcoreLowMemoryCallback, this); + + // TODO: Need to check how to gurantee width & height of screen + //if (!m_orientationSupport->isOrientationPrepared(m_settingList->getRotationValue())) { + // m_orientationSupport->registerRotationCallback(initialOrientationCheckCallback, this); + //} + + // As AUL registration is done is WebProcess so the reset event is reaching WLD with delay. + // Due to this window is shown but there is delay in screen paint. So add show in create + // and change only the state when reset event is called + m_widget->Show(); + m_widgetState = WidgetState_Created; + + return true; +} + +void WrtClientLite::OnResume() +{ + WrtLogD("resume"); + + if (m_widgetState != WidgetState_Suspended) { + WrtLogW("Widget is not suspended, resuming was skipped"); + return; + } + m_widget->Resume(); + m_widgetState = WidgetState_Running; +} + +void WrtClientLite::OnSuspend() +{ + WrtLogD("pause"); + + if (m_widgetState != WidgetState_Running) { + WrtLogW("Widget is not running to be suspended"); + return; + } + m_widget->Suspend(); + m_widgetState = WidgetState_Suspended; +} + +void WrtClientLite::OnReset(bundle *b) +{ + WrtLogD("OnReset"); + + setDebugMode(b); + + if (m_widgetState == WidgetState_Created) { + m_widgetState = WidgetState_Running; + } else if (m_widgetState == WidgetState_Running || m_widgetState == WidgetState_Suspended) { + ApplicationDataSingleton::Instance().setBundleData(m_tizenId, b); + m_widget->Reset(); + m_orientationSupport->resetOrientation(); + m_widgetState = WidgetState_Running; + } else { + WrtLogW("Unexpected life-cycle"); + } +} + +void WrtClientLite::OnTerminate() +{ + WrtLogD("Wrt Shutdown now"); + vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, + WrtClientLite::appcoreLowMemoryCallback); + if (m_processPoolTimer) { + ecore_timer_del(m_processPoolTimer); + } + + if (m_widgetState == WidgetState_Stopped) { + WrtLogW("Not yet started"); + return; + } + + m_widgetState = WidgetState_Stopped; + // (un)focusCallback MUST be detached before hiding widget starts + m_windowData->smartCallbackDel(Layer::FOCUS, "focused", focusedCallback); + m_windowData->smartCallbackDel(Layer::FOCUS, "unfocused", unfocusedCallback); + m_widget->Hide(); + // AutoRotation use m_widget pointer internally. + // It must be unset before m_widget is released. + deinitWindowOrientation(); + m_widget.reset(); + m_windowData.reset(); +} + +void WrtClientLite::OnResetAulConnection() +{ + WrtLogD("reset aul connection"); + m_widget->ResetAulConnection(); +} + +void WrtClientLite::setDebugMode(bundle* b) +{ + m_debugMode = ClientModule::IDESupport::getDebugMode(b); + WrtLogD("debug mode : %s", m_debugMode ? "ture" : "false"); +} + +void WrtClientLite::loadStartedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_SHOW_PROGRESS_BAR_EARLIER) + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + m_windowData->signalEmit(Layer::MAIN_LAYOUT, + EDJE_SHOW_PROGRESS_SIGNAL, + ""); + m_windowData->updateProgress(0); + } +#endif +} + +#if ENABLE(ONE_UI_PROCESS_MODEL) +std::string WrtClientLite::createInitMessage(bundle* b, unsigned int portNum) +{ + DPL::OptionalString installedPath = m_dao->getWidgetInstalledPath(); + std::string appPath; + std::string tzPkgId = DPL::ToUTF8String(m_dao->getTizenPkgId()); + if (!installedPath) { + appPath = std::string(WrtDB::GlobalConfig::GetUserInstalledWidgetPath()) + "/" + + tzPkgId + WrtDB::GlobalConfig::GetUserWidgetExecPath() + "/" + m_tizenId; + } else { + appPath = DPL::ToUTF8String(*installedPath) + + WrtDB::GlobalConfig::GetUserWidgetExecPath() + "/" + m_tizenId; + } + + if (!b) { + return std::string(); + } + char **argv; + int argc = bundle_export_to_argv(b, &argv); + + std::stringstream ssMsg; + ssMsg << portNum; // Add port number + ssMsg << " " << argc; // count for argv + ssMsg << " " << appPath; // argv[0] + + for (int ittr = 1; ittr < argc; ++ittr) { + ssMsg << " " << argv[ittr]; + } + return ssMsg.str(); +} +#endif + +void WrtClientLite::loadFinishedCallback(Evas_Object* obj, void* eventInfo) +{ + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + WrtLogD("Post result of launch"); + + //w3c packaging test debug (message on 4>) + const char * makeScreen = getenv(W3C_DEBUG_ENV_VARIABLE); + if (makeScreen != NULL && strcmp(makeScreen, "1") == 0) { + FILE* doutput = fdopen(4, "w"); + fprintf(doutput, "didFinishLoadForFrameCallback: ready\n"); + fclose(doutput); + } + + WrtLogD("Launch succesfull"); + + setlinebuf(stdout); + printf("launched\n"); + fflush(stdout); + + if (m_debugMode) { + Ewk_Context* ewkContext = ewk_view_context_get(obj); + Assert(ewkContext); + unsigned int portNum = + ewk_context_inspector_server_start(ewkContext, 0); + WrtLogD("Port for inspector : %u", portNum); +#if ENABLE(ONE_UI_PROCESS_MODEL) + m_widget->SendIDEReply(createInitMessage(ApplicationDataSingleton::Instance().getBundle(m_tizenId), portNum)); +#else + bool ret = ClientModule::IDESupport::sendReply( + ApplicationDataSingleton::Instance().getBundle(m_tizenId), + portNum); + if (!ret) { + WrtLogW("Fail to send reply"); + } +#endif + } + ApplicationDataSingleton::Instance().freeBundleData(m_tizenId); + if (!m_didCreatePool) { + if (m_processPoolTimer) { + ecore_timer_del(m_processPoolTimer); + } + m_processPoolTimer = ecore_timer_add(POOL_PROCESS_TIMER, sendRequestForPoolProcess, this); + } +} + +void WrtClientLite::loadProgressStartedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if !USE(WEBKIT_SHOW_PROGRESS_BAR_EARLIER) + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + m_windowData->signalEmit(Layer::MAIN_LAYOUT, + EDJE_SHOW_PROGRESS_SIGNAL, + ""); + m_windowData->updateProgress(0); + } +#endif +} + +void WrtClientLite::loadProgressCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + Assert(eventInfo); + double* progress = static_cast(eventInfo); + m_windowData->updateProgress(*progress); + } +} + +void WrtClientLite::loadProgressFinishedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + m_windowData->signalEmit(Layer::MAIN_LAYOUT, + EDJE_HIDE_PROGRESS_SIGNAL, + ""); + } +} + +void WrtClientLite::processExitCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("process exit"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + char *appId = strdup(m_tizenId.c_str()); + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().WEB_APP_TERMINATE, appId); + m_widgetState = WidgetState_Stopping; +} + +void WrtClientLite::webProcessCrashedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogE("webProcess crashed"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + char *appId = strdup(m_tizenId.c_str()); + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().WEB_APP_TERMINATE, appId); + m_widgetState = WidgetState_Stopping; +} + +void WrtClientLite::processCrashedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogE("Process crashed"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); +} + +void WrtClientLite::enterFullscreenCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + // enter fullscreen + m_windowData->toggleFullscreen(true); + m_currentViewMode = VIEWMODE_TYPE_FULLSCREEN; + m_isWebkitFullscreen = true; +} + +void WrtClientLite::exitFullscreenCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + // exit fullscreen + m_windowData->toggleFullscreen(false); + m_currentViewMode = m_initialViewMode; + m_isWebkitFullscreen = false; +} + +void WrtClientLite::enableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + ewk_view_draws_transparent_background_set(obj, EINA_TRUE); + m_windowData->toggleTransparent(true); +} + +void WrtClientLite::disableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + m_windowData->toggleTransparent(false); + ewk_view_draws_transparent_background_set(obj, EINA_FALSE); +} + +void WrtClientLite::popupReplyWaitStartCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + char *appId = strdup(m_tizenId.c_str()); + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().POPUP_REPLY_WAIT_START, appId); + +#if USE(WEBKIT_MANUAL_ROTATION) + m_orientationSupport->setManualRotation(false); + Ewk_Context* ewkContext = ewk_view_context_get(obj); + Assert(ewkContext); + ewk_context_tizen_extensible_api_string_set(ewkContext, EXTENSIBLE_API_PRERENDERING_FOR_ROTATION, EINA_FALSE); +#endif +} + +void WrtClientLite::popupReplyWaitFinishCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + char *appId = strdup(m_tizenId.c_str()); + WebInternalEventSingleton::Instance().sendEvent(WebInternalEventSingleton::Instance().POPUP_REPLY_WAIT_FINISH, appId); + +#if USE(WEBKIT_MANUAL_ROTATION) + m_orientationSupport->setManualRotation(true); + Ewk_Context* ewkContext = ewk_view_context_get(obj); + Assert(ewkContext); + ewk_context_tizen_extensible_api_string_set(ewkContext, EXTENSIBLE_API_PRERENDERING_FOR_ROTATION, EINA_TRUE); +#endif +} + +void WrtClientLite::frameRenderedCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_MANUAL_ROTATION) + if (m_isWebkitHandleManualRotationDone == false) { + WrtLogD("start manual roatation"); + m_orientationSupport->setManualRotation(true); + m_isWebkitHandleManualRotationDone = true; + Ewk_Context* ewkContext = ewk_view_context_get(obj); + Assert(ewkContext); + ewk_context_tizen_extensible_api_string_set(ewkContext, EXTENSIBLE_API_PRERENDERING_FOR_ROTATION, EINA_TRUE); + } +#endif +} + +void WrtClientLite::blockedUrlPolicyCallback (const std::string& blockedUrl) +{ + // block this page and open it in browser + WrtLogD("Request was blocked : %s", blockedUrl.c_str()); + + app_control_h app_control = NULL; + app_control_create(&app_control); + app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW); + app_control_set_uri(app_control, blockedUrl.c_str()); + + if(APP_CONTROL_ERROR_NONE != app_control_send_launch_request(app_control, NULL, NULL)) { + WrtLogE("Failed to run app_control"); + } + + app_control_destroy(app_control); + return; +} + +bool WrtClientLite::isCreateNewWindowAllowedCallback (void) +{ + return true; +} + +void WrtClientLite::createContextMenuCallback(void* eventInfo) +{ + WrtLogD("createContextMenuCallback"); + Ewk_Context_Menu* menu = static_cast(eventInfo); + unsigned int menu_num = ewk_context_menu_item_count(menu); + unsigned int idx = 0; + do { + Ewk_Context_Menu_Item* item = ewk_context_menu_nth_item_get(menu, idx); + if (!item) { + idx++; + continue; + } + Ewk_Context_Menu_Item_Tag tag = ewk_context_menu_item_tag_get(item); + + switch (tag) { + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW: + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW: + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_FRAME_IN_NEW_WINDOW: + ewk_context_menu_item_remove(menu, item); + continue; +#if USE(WEBKIT_UPVERSION) + case EWK_CONTEXT_MENU_ITEM_OPEN_MEDIA_IN_NEW_WINDOW: +#else + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_MEDIA_IN_NEW_WINDOW: +#endif + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK: + ewk_context_menu_item_remove(menu, item); + continue; + + default: + idx++; + break; + } + } while (idx < menu_num); + + return; +} + +void WrtClientLite::initializeWindowModes() +{ + Assert(m_windowData); + bool backbutton = + (m_settingList->getBackButtonPresence() == BackButton_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED); + m_windowData->setViewMode(m_currentViewMode == VIEWMODE_TYPE_FULLSCREEN, + backbutton); +} + +void WrtClientLite::appcoreLowMemoryCallback(keynode_t* node, void* userData) +{ + WrtLogD("appcoreLowMemoryCallback"); + + Assert(userData); + + char* key = vconf_keynode_get_name(node); + if (NULL == key) { + WrtLogE("key is null"); + return; + } + + WrtClientLite* This = static_cast(userData); + if (!strcmp(key, VCONFKEY_SYSMAN_LOW_MEMORY)) { + if (This->m_widget) { + This->m_widget->HandleLowMemory(); + } + } +} + +void WrtClientLite::setInitialViewMode(void) +{ + Assert(m_dao); + WrtDB::WindowModeList windowModes = m_dao->getWindowModes(); + FOREACH(it, windowModes) { + std::string viewMode = DPL::ToUTF8String(*it); + switch(viewMode[0]) { + case 'f': + if (viewMode == VIEWMODE_TYPE_FULLSCREEN) { + m_initialViewMode = viewMode; + m_currentViewMode = m_initialViewMode; + break; + } + break; + case 'm': + if (viewMode == VIEWMODE_TYPE_MAXIMIZED) { + m_initialViewMode = viewMode; + m_currentViewMode = m_initialViewMode; + break; + } + break; + case 'w': + if (viewMode == VIEWMODE_TYPE_WINDOWED) { + m_initialViewMode = viewMode; + m_currentViewMode = m_initialViewMode; + break; + } + break; + default: + break; + } + } +} + +void WrtClientLite::initWindowOrientation(void) +{ + Assert(m_windowData); + + m_orientationSupport.reset( + new ClientModule::OrientationSupport(m_windowData, m_widget)); + m_orientationSupport->setInitialWindowOrientation( + m_settingList->getRotationValue()); + if (!m_orientationSupport->setAutoRotation()) { + WrtLogE("Fail to set rotation callback"); + } +} + +void WrtClientLite::deinitWindowOrientation(void) +{ + Assert(m_orientationSupport); + + m_orientationSupport->unregisterRotationCallbacks(); + m_orientationSupport.reset(); +} + +void WrtClientLite::setWindowOrientation(int angle) +{ + Assert(m_windowData); + m_windowData->setOrientation(angle); +} + +void WrtClientLite::keyCallback(Evas_Object* obj, void* eventInfo) +{ + Ea_Callback_Type keyType = static_cast(reinterpret_cast(eventInfo)); + + // TODO: Remove keycallback when application moves to suspend + if (m_widgetState == WidgetState_Suspended) { + // Key event is faster than resume event + WrtLogW("Application is not ready to handle key"); + return; + } + if (m_settingList->getBackButtonPresence() == BackButton_Enable + || m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + // windowed UX - hosted application + if (keyType == EA_CALLBACK_BACK) { + if (m_isWebkitFullscreen) { + ewk_view_fullscreen_exit(obj); + } else { + m_widget->Backward(); + } + } else if (keyType == EA_CALLBACK_MORE) { + // UX isn't confirmed + } + } +} + +void WrtClientLite::consoleMessageCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + + static bool logEnable = (getenv(WRT_CONSOLE_LOG_ENABLE) != NULL); + + if (m_debugMode || logEnable) { + Assert(eventInfo); + Ewk_Console_Message* consoleMessage = static_cast(eventInfo); + + std::stringstream buf; + unsigned int lineNumber = ewk_console_message_line_get(consoleMessage); + const char* text = ewk_console_message_text_get(consoleMessage); + const char* source = ewk_console_message_source_get(consoleMessage); + if (lineNumber) { + buf << source << ":"; + buf << lineNumber << ":"; + } + buf << text; + + ConsoleLogLevel level; + switch (ewk_console_message_level_get(consoleMessage)) { + case EWK_CONSOLE_MESSAGE_LEVEL_TIP: + case EWK_CONSOLE_MESSAGE_LEVEL_LOG: + case EWK_CONSOLE_MESSAGE_LEVEL_DEBUG: + level = ConsoleLogLevel::Debug; + break; + case EWK_CONSOLE_MESSAGE_LEVEL_WARNING: + level = ConsoleLogLevel::Warning; + break; + case EWK_CONSOLE_MESSAGE_LEVEL_ERROR: + level = ConsoleLogLevel::Error; + break; + default: + level = ConsoleLogLevel::Debug; + break; + } + ClientModule::IDESupport::consoleMessage( + level, + "%s", + buf.str().c_str()); + } +} + +void WrtClientLite::rotatePreparedCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_MANUAL_ROTATION) + WrtLogD("Rotate by webkit"); + m_orientationSupport->setRotationDone(); +#endif +} + + +void WrtClientLite::setLayout(Evas_Object* webview) +{ + WrtLogD("add new webkit buffer to window"); + + Assert(webview); + m_windowData->setWebview(webview); + + evas_object_show(webview); + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); +} + +void WrtClientLite::unsetLayout(Evas_Object* webview) +{ + WrtLogD("remove current webkit buffer from window"); + Assert(webview); + evas_object_hide(webview); + m_windowData->unsetWebview(); +} + +void WrtClientLite::autoRotationCallback(void* data, + Evas_Object* obj, + void* event) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(event); + //WrtLogD("entered"); + //Assert(data); + //WrtClientLite* This = static_cast(data); + // TODO - To be implemented when splash screen is added +} + +void WrtClientLite::initialOrientationCheckCallback(void* data, Evas_Object* obj, void* event) +{ + WrtLogD("entered"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(event); + + Assert(data); + WrtClientLite* This = static_cast(data); + if (This->m_orientationSupport->isOrientationPrepared(This->m_settingList->getRotationValue())) { + WrtLogD("initial orientation is ready"); + This->m_orientationSupport->unregisterRotationCallback(initialOrientationCheckCallback); + } +} + +void WrtClientLite::focusedCallback(void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("entered"); + Assert(data); + WrtClientLite* This = static_cast(data); + elm_object_focus_set(This->m_widget->GetCurrentWebview(), EINA_TRUE); +} + +void WrtClientLite::unfocusedCallback(void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("entered"); + Assert(data); + WrtClientLite* This = static_cast(data); + elm_object_focus_set(This->m_widget->GetCurrentWebview(), EINA_FALSE); +} + +int WrtClientLite::languageChangedCallback(void *data) +{ + WrtLogD("Language Changed"); + if (!data) { + return 0; + } + WrtClientLite* wrtClient = static_cast(data); + if (!(wrtClient->m_dao)) { + return 0; + } + + // reset function fetches system locales and recreates language tags + LanguageTagsProviderSingleton::Instance().resetLanguageTags(); + // widget default locales are added to language tags below + DPL::OptionalString defloc = wrtClient->m_dao->getDefaultlocale(); + if (!!defloc) { + LanguageTagsProviderSingleton::Instance().addWidgetDefaultLocales( + *defloc); + } + + if (wrtClient->m_widgetState != WidgetState_Stopped) { + wrtClient->m_widget->ReloadStartPage(); + } + return 0; +} + +Eina_Bool WrtClientLite::sendRequestForPoolProcess(void* data) +{ + Assert(data); + WrtClientLite *This = static_cast(data); + char *appId = strdup(This->m_tizenId.c_str()); + WebInternalEventSingleton::Instance().sendEvent(WebInternalEvent::WEB_APP_START_POOL_PROCESS, appId); + This->m_didCreatePool = true; + This->m_processPoolTimer = NULL; + + return ECORE_CALLBACK_CANCEL; +} diff --git a/src/wrt-client/wrt-client-lite.h b/src/wrt-client/wrt-client-lite.h new file mode 100644 index 0000000..b92d349 --- /dev/null +++ b/src/wrt-client/wrt-client-lite.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef WRT_CLIENT_LITE_H_ +#define WRT_CLIENT_LITE_H_ + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "widget_state.h" +#include "window_data.h" + +namespace ClientModule { +class SubmodeSupport; +class OrientationSupport; +} +class SplashScreenSupport; +namespace WrtDB { +class WidgetDAOReadOnly; +} +class WidgetSettingList; + +class WrtClientLite +{ + public: + WrtClientLite(const std::string& appId, Ewk_Context* context, WindowData* winData); + virtual ~WrtClientLite(); + + static std::string getTizenIdFromArgument(int argc, char **argv); + + bool OnCreate(bundle *b); + void OnResume(); + void OnSuspend(); + void OnReset(bundle *b); + void OnTerminate(); + static Eina_Bool sendRequestForPoolProcess(void* data); + void OnResetAulConnection(); + + private: + void setDebugMode(bundle* b); + void initializeWindowModes(); + + // static Callback + static void appcoreLowMemoryCallback(keynode_t* node, void* userData); + static int languageChangedCallback(void *data); + static void autoRotationCallback(void* data, Evas_Object* obj, void* event); + static void initialOrientationCheckCallback(void* data, Evas_Object* obj, void* event); + static void focusedCallback(void* data, Evas_Object* obj, void* eventInfo); + static void unfocusedCallback(void* data, Evas_Object* obj, void* eventInfo); + + //view-mode + void setInitialViewMode(); + + //orientation + void setWindowOrientation(int angle); + void initWindowOrientation(); + void deinitWindowOrientation(); + + // hwkey + void keyCallback(Evas_Object* obj, void* eventInfo); + + void consoleMessageCallback(Evas_Object* obj, void* eventInfo); + void rotatePreparedCallback(Evas_Object* obj, void* eventInfo); + + // launching steps + void loadStartedCallback(Evas_Object* obj, void* eventInfo); + void loadFinishedCallback(Evas_Object* obj, void* eventInfo); + void loadProgressStartedCallback(Evas_Object* obj, void* eventInfo); + void loadProgressCallback(Evas_Object* obj, void* eventInfo); + void loadProgressFinishedCallback(Evas_Object* obj, void* eventInfo); + void processExitCallback(Evas_Object* obj, void* eventInfo); + void webProcessCrashedCallback(Evas_Object* obj, void* eventInfo); + void processCrashedCallback(Evas_Object* obj, void* eventInfo); + void enterFullscreenCallback(Evas_Object* obj, void* eventInfo); + void exitFullscreenCallback(Evas_Object* obj, void* eventInfo); + void enableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo); + void disableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo); + void setLayout(Evas_Object* newBuffer); + void unsetLayout(Evas_Object* currentBuffer); + void popupReplyWaitStartCallback(Evas_Object* obj, void* eventInfo); + void popupReplyWaitFinishCallback(Evas_Object* obj, void* eventInfo); + void frameRenderedCallback(Evas_Object* obj, void* eventInfo); + void blockedUrlPolicyCallback(const std::string& blockedUrl) ; + bool isCreateNewWindowAllowedCallback(void); + void createContextMenuCallback(void* eventInfo); +#if ENABLE(ONE_UI_PROCESS_MODEL) + std::string createInitMessage(bundle* b, unsigned int portNum); +#endif + + // Private data + std::string m_tizenId; + + bool m_debugMode; + WRT::RunnableWidgetObjectPtr m_widget; + WrtDB::WidgetDAOReadOnlyPtr m_dao; + WidgetSettingListPtr m_settingList; + WidgetState m_widgetState; + WindowDataPtr m_windowData; + std::string m_initialViewMode; + std::string m_currentViewMode; +#if USE(WEBKIT_MANUAL_ROTATION) + bool m_isWebkitHandleManualRotationDone; +#endif + bool m_isWebkitFullscreen; + std::unique_ptr m_orientationSupport; + Ewk_Context* m_savedContext; // For Pooled process + WindowData* m_savedWindowData; // For Pooled process + bool m_didCreatePool; // For Pooled process + Ecore_Timer *m_processPoolTimer; // For Pooled process Timer handle +}; + +typedef std::shared_ptr WrtClientLitePtr; + +#endif // WRT_CLIENT_LITE_H_ diff --git a/src/wrt-client/wrt-client.cpp b/src/wrt-client/wrt-client.cpp new file mode 100644 index 0000000..3d96460 --- /dev/null +++ b/src/wrt-client/wrt-client.cpp @@ -0,0 +1,1378 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "wrt-client.h" + +#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 +#include +#include +#if ENABLE(PRE_LAUNCH) +#include +#endif +#include +#include +#include +#include +#include +#include "client_command_line_parser.h" +#include "client_ide_support.h" +#include "client_orientation_support.h" +#include "client_submode_support.h" +#include "splash_screen_support.h" + +//W3C PACKAGING enviroment variable name +#define W3C_DEBUG_ENV_VARIABLE "DEBUG_LOAD_FINISH" + +//Tizen Extensible API String +const char *EXTENSIBLE_API_PRERENDERING_FOR_ROTATION = "prerendering,for,rotation"; +const char *EXTENSIBLE_API_MEDIA_VOLUME_CONTROL = "media,volume,control"; + +// window signal callback +const char *EDJE_SHOW_PROGRESS_SIGNAL = "show,progress,signal"; +const char *EDJE_HIDE_PROGRESS_SIGNAL = "hide,progress,signal"; +const std::string VIEWMODE_TYPE_FULLSCREEN = "fullscreen"; +const std::string VIEWMODE_TYPE_MAXIMIZED = "maximized"; +const std::string VIEWMODE_TYPE_WINDOWED = "windowed"; +char const* const ELM_SWALLOW_CONTENT = "elm.swallow.content"; +const char* const BUNDLE_PATH = "/usr/lib/libwrt-injected-bundle.so"; +const unsigned int UID_ROOT = 0; + +// process pool +const char* const DUMMY_PROCESS_PATH = "/usr/bin/wrt_launchpad_daemon_candidate"; +static Ewk_Context* s_preparedEwkContext = NULL; +static WindowData* s_preparedWindowData = NULL; +static int app_argc = 0; +static char** app_argv = NULL; + +// env +const char* const HOME = "HOME"; +const char* const APP_HOME_PATH = "/opt/home/app"; +const char* const ROOT_HOME_PATH = "/opt/home/root"; +const char* const WRT_CONSOLE_LOG_ENABLE = "WRT_CONSOLE_LOG_ENABLE"; + +WrtClient::WrtClient(int argc, char **argv) : + Application(argc, argv, "wrt-client", false), + DPL::TaskDecl(this), + m_launched(false), + m_initializing(false), + m_initialized(false), + m_debugMode(false), + m_returnStatus(ReturnStatus::Succeeded), + m_widgetState(WidgetState::WidgetState_Stopped), + m_initialViewMode(VIEWMODE_TYPE_MAXIMIZED), + m_currentViewMode(VIEWMODE_TYPE_MAXIMIZED), + m_isWebkitFullscreen(false), +#if USE(WEBKIT_MANUAL_ROTATION) + m_isWebkitHandleManualRotationDone(false), +#endif + m_submodeSupport(new ClientModule::SubmodeSupport()) +{ + Touch(); + WrtLogD("App Created"); +} + +WrtClient::~WrtClient() +{ + WrtLogD("App Finished"); +} + +WrtClient::ReturnStatus::Type WrtClient::getReturnStatus() const +{ + return m_returnStatus; +} + +void WrtClient::OnStop() +{ + WrtLogD("Stopping Dummy Client"); +} + +void WrtClient::OnCreate() +{ + WrtLogD("On Create"); + ADD_PROFILING_POINT("OnCreate callback", "point"); + ewk_init(); +} + +void WrtClient::OnResume() +{ + if (m_widgetState != WidgetState_Suspended) { + WrtLogW("Widget is not suspended, resuming was skipped"); + return; + } + m_widget->Resume(); + m_widgetState = WidgetState_Running; +} + +void WrtClient::OnPause() +{ + if (m_widgetState != WidgetState_Running) { + WrtLogW("Widget is not running to be suspended"); + return; + } + if (m_submodeSupport->isNeedTerminateOnSuspend()) { + WrtLogD("Current mode cannot support suspend"); + elm_exit(); + return; + } + m_widget->Suspend(); + m_widgetState = WidgetState_Suspended; +} + +void WrtClient::OnReset(bundle *b) +{ + WrtLogD("OnReset"); + + if (true == m_initializing) { + WrtLogD("can not handle reset event"); + return; + } + if (true == m_launched) { + if (m_widgetState == WidgetState_Stopped) { + WrtLogE("Widget is not running to be reset"); + return; + } +#if ENABLE(PRE_LAUNCH) + if (PreLaunchingSupportSingleton::Instance().isPreLaunching()) + { + if (m_widget->GetCurrentWebview()) + { + PreLaunchingSupportSingleton::Instance().setJavascriptExecuteFlag(false); + } + + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); + PreLaunchingSupportSingleton::Instance().finalize(); + } +#endif + ApplicationDataSingleton::Instance().setBundleData(m_tizenId, b); + m_widget->Reset(); + m_orientationSupport->resetOrientation(); + m_widgetState = WidgetState_Running; + } else { + m_tizenId = + ClientModule::CommandLineParser::getTizenId(m_argc, m_argv); + if (m_tizenId.empty()) { + showHelpAndQuit(); + } else { + setDebugMode(b); +#if ENABLE(PRE_LAUNCH) + PreLaunchingSupportSingleton::Instance().setPreLaunching(b); +#endif + ApplicationDataSingleton::Instance().setBundleData(m_tizenId, b); + setStep(); + } + } + + // low memory callback set + appcore_set_event_callback( + APPCORE_EVENT_LOW_MEMORY, + WrtClient::appcoreLowMemoryCallback, + this); +} + +void WrtClient::OnTerminate() +{ + WrtLogD("Wrt Shutdown now"); + shutdownStep(); +} + +void WrtClient::showHelpAndQuit() +{ + printf("Usage: wrt-client [OPTION]... [WIDGET: ID]...\n" + "launch widgets.\n" + "Mandatory arguments to long options are mandatory for short " + "options too.\n" + " -h, --help show this help\n" + " -l, --launch " + "launch widget with given tizen ID\n" + " -t, --tizen " + "launch widget with given tizen ID\n" + "\n"); + + Quit(); +} + +void WrtClient::setStep() +{ + WrtLogD("setStep"); + + AddStep(&WrtClient::initStep); + AddStep(&WrtClient::launchStep); + AddStep(&WrtClient::showStep); + AddStep(&WrtClient::shutdownStep); + + m_initializing = true; + + DPL::Event::ControllerEventHandler::PostEvent(NextStepEvent()); +} + +void WrtClient::setDebugMode(bundle* b) +{ + m_debugMode = ClientModule::IDESupport::getDebugMode(b); + WrtLogD("debug mode : %d", m_debugMode); +} + +void WrtClient::OnEventReceived(const NextStepEvent& /*event*/) +{ + size_t count = GetStepCount(); + WrtLogD("Step Count : %d", count); + + if (count) { + WrtLogD("Executing next step"); + NextStep(); + } +} + +void WrtClient::initStep() +{ + WrtLogD(""); + if (WRT::CoreModuleSingleton::Instance().Init()) { + m_initialized = true; + } else { + m_returnStatus = ReturnStatus::Failed; + switchToShutdownStep(); + return; + } + + DPL::Event::ControllerEventHandler::PostEvent(NextStepEvent()); +} + +void WrtClient::loadStartedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_SHOW_PROGRESS_BAR_EARLIER) + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + m_windowData->signalEmit(Layer::MAIN_LAYOUT, + EDJE_SHOW_PROGRESS_SIGNAL, + ""); + m_windowData->updateProgress(0); + } +#endif + +#if ENABLE(PRE_LAUNCH) + if (PreLaunchingSupportSingleton::Instance().isPreLaunching()) + { + PreLaunchingSupportSingleton::Instance().setJavascriptExecuteFlag(true); + } +#endif +} +void WrtClient::loadFinishedCallback(Evas_Object* obj, void* eventInfo) +{ + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + ADD_PROFILING_POINT("loadFinishedCallback", "start"); + + // Splash screen + if (m_splashScreen && m_splashScreen->isShowing()) + { + m_splashScreen->stopSplashScreenBuffered(); + } + + WrtLogD("Post result of launch"); + + //w3c packaging test debug (message on 4>) + const char * makeScreen = getenv(W3C_DEBUG_ENV_VARIABLE); + if (makeScreen != NULL && strcmp(makeScreen, "1") == 0) { + FILE* doutput = fdopen(4, "w"); + if (doutput == NULL) { + WrtLogW("Fail to load output file"); + } else { + fprintf(doutput, "didFinishLoadForFrameCallback: ready\n"); + fclose(doutput); + } + } + + WrtLogD("Launch succesfull"); + + m_launched = true; + m_initializing = false; + setlinebuf(stdout); + ADD_PROFILING_POINT("loadFinishedCallback", "stop"); + printf("launched\n"); + fflush(stdout); + + if (m_debugMode) { + Ewk_Context* ewkContext = ewk_view_context_get(obj); + Assert(ewkContext); + unsigned int portNum = + ewk_context_inspector_server_start(ewkContext, 0); + WrtLogD("Port for inspector : %d", portNum); + bool ret = ClientModule::IDESupport::sendReply( + ApplicationDataSingleton::Instance().getBundle(m_tizenId), + portNum); + if (!ret) { + WrtLogW("Fail to send reply"); + } + } + ApplicationDataSingleton::Instance().freeBundleData(m_tizenId); +} + +void WrtClient::loadProgressStartedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if !USE(WEBKIT_SHOW_PROGRESS_BAR_EARLIER) + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + m_windowData->signalEmit(Layer::MAIN_LAYOUT, + EDJE_SHOW_PROGRESS_SIGNAL, + ""); + m_windowData->updateProgress(0); + } +#endif +} + +void WrtClient::loadProgressCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + Assert(eventInfo); + double* progress = static_cast(eventInfo); + m_windowData->updateProgress(*progress); + } +} + +void WrtClient::loadProgressFinishedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + if (m_settingList->getProgressBarPresence() == ProgressBar_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + m_windowData->signalEmit(Layer::MAIN_LAYOUT, + EDJE_HIDE_PROGRESS_SIGNAL, + ""); + } +} + +void WrtClient::processExitCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("process exit"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + elm_exit(); +} + +void WrtClient::webProcessCrashedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogE("webProcess crashed"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + switchToShutdownStep(); +} + +void WrtClient::processCrashedCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogE("Process crashed"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); +} + +void WrtClient::enterFullscreenCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + // enter fullscreen + m_windowData->toggleFullscreen(true); + m_currentViewMode = VIEWMODE_TYPE_FULLSCREEN; + m_isWebkitFullscreen = true; +} + +void WrtClient::exitFullscreenCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + // exit fullscreen + m_windowData->toggleFullscreen(false); + m_currentViewMode = m_initialViewMode; + m_isWebkitFullscreen = false; +} + +void WrtClient::enableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + ewk_view_draws_transparent_background_set(obj, EINA_TRUE); + m_windowData->toggleTransparent(true); +} + +void WrtClient::disableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo) +{ + WrtLogD("called"); + + Assert(obj); + + DPL_UNUSED_PARAM(eventInfo); + + m_windowData->toggleTransparent(false); + ewk_view_draws_transparent_background_set(obj, EINA_FALSE); +} + +void WrtClient::popupReplyWaitStartCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_MANUAL_ROTATION) + m_orientationSupport->setManualRotation(false); + ewk_context_tizen_extensible_api_string_set(s_preparedEwkContext, + EXTENSIBLE_API_PRERENDERING_FOR_ROTATION, + EINA_FALSE); +#endif +} + +void WrtClient::popupReplyWaitFinishCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_MANUAL_ROTATION) + m_orientationSupport->setManualRotation(true); + ewk_context_tizen_extensible_api_string_set(s_preparedEwkContext, + EXTENSIBLE_API_PRERENDERING_FOR_ROTATION, + EINA_TRUE); +#endif +} + +void WrtClient::frameRenderedCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_MANUAL_ROTATION) + if (m_isWebkitHandleManualRotationDone == false) { + WrtLogD("start manual roatation"); + m_orientationSupport->setManualRotation(true); + m_isWebkitHandleManualRotationDone = true; + ewk_context_tizen_extensible_api_string_set(s_preparedEwkContext, + EXTENSIBLE_API_PRERENDERING_FOR_ROTATION, + EINA_TRUE); + } +#endif +#if ENABLE(PRE_LAUNCH) + PreLaunchingSupportSingleton::Instance().updateRender(); +#endif +} + +void WrtClient::blockedUrlPolicyCallback (const std::string& blockedUrl) +{ + // block this page and open it in browser + WrtLogD("Request was blocked : %s", blockedUrl.c_str()); + + m_launched = true; + m_initializing = false; + + app_control_h app_control = NULL; + app_control_create(&app_control); + app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW); + app_control_set_uri(app_control, blockedUrl.c_str()); + + if(APP_CONTROL_ERROR_NONE != app_control_send_launch_request(app_control, NULL, NULL)) { + WrtLogE("Failed to run app_control"); + } + + app_control_destroy(app_control); + return; +} + +bool WrtClient::isCreateNewWindowAllowedCallback (void) +{ + return true; +} + +void WrtClient::createContextMenuCallback(void* eventInfo) +{ + WrtLogD("createContextMenuCallback"); + Ewk_Context_Menu* menu = static_cast(eventInfo); + unsigned int menu_num = ewk_context_menu_item_count(menu); + unsigned int idx = 0; + do { + Ewk_Context_Menu_Item* item = ewk_context_menu_nth_item_get(menu, idx); + if (!item) { + idx++; + continue; + } + Ewk_Context_Menu_Item_Tag tag = ewk_context_menu_item_tag_get(item); + + switch (tag) { + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW: + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW: + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_FRAME_IN_NEW_WINDOW: + ewk_context_menu_item_remove(menu, item); + continue; +#if USE(WEBKIT_UPVERSION) + case EWK_CONTEXT_MENU_ITEM_OPEN_MEDIA_IN_NEW_WINDOW: +#else + case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_MEDIA_IN_NEW_WINDOW: +#endif + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: + ewk_context_menu_item_remove(menu, item); + continue; + + case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK: + ewk_context_menu_item_remove(menu, item); + continue; + + default: + idx++; + break; + } + } while (idx < menu_num); + + return; +} + +void WrtClient::launchStep() +{ + ADD_PROFILING_POINT("launchStep", "start"); + WrtLogD("Launching widget ..."); + + ADD_PROFILING_POINT("getRunnableWidgetObject", "start"); + m_widget = WRT::CoreModuleSingleton::Instance() + .getRunnableWidgetObject(m_tizenId); + ADD_PROFILING_POINT("getRunnableWidgetObject", "stop"); + + if (!m_widget) { + WrtLogE("RunnableWidgetObject is NULL, stop launchStep"); + switchToShutdownStep(); + elm_exit(); + return; + } + + if (m_widgetState == WidgetState_Running) { + WrtLogW("Widget already running, stop launchStep"); + switchToShutdownStep(); + return; + } + + m_dao.reset(new WrtDB::WidgetDAOReadOnly(DPL::FromASCIIString(m_tizenId))); + WrtDB::WidgetSettings widgetSettings; + m_dao->getWidgetSettings(widgetSettings); + m_settingList.reset(new WidgetSettingList(widgetSettings)); + m_submodeSupport->initialize(DPL::FromASCIIString(m_tizenId)); + + DPL::OptionalString defloc = m_dao->getDefaultlocale(); + if (!!defloc) { + LanguageTagsProviderSingleton::Instance().addWidgetDefaultLocales( + *defloc); + } + + setInitialViewMode(); + + /* remove language change callback */ + /* + LocalizationSetting::SetLanguageChangedCallback( + languageChangedCallback, this); + */ + + ADD_PROFILING_POINT("CreateWindow", "start"); + if (s_preparedWindowData == NULL) { + m_windowData.reset(new WindowData(static_cast(getpid()), true)); + } else { + m_windowData.reset(s_preparedWindowData); + s_preparedWindowData = NULL; + } + ADD_PROFILING_POINT("CreateWindow", "stop"); +#if USE(EA_SCREEN_READER) + if (!m_windowData->initScreenReaderSupport( + m_settingList->getAccessibility() == Accessibility_Enable)) + { + WrtLogW("Fail to set screen reader support set"); + } +#endif + + // rotate window to initial value + initWindowOrientation(); + + WRT::UserDelegatesPtr cbs(new WRT::UserDelegates); + + ADD_PROFILING_POINT("Create splash screen", "start"); + DPL::OptionalString splashImgSrc = m_dao->getSplashImgSrc(); + if (!!splashImgSrc) + { + m_splashScreen.reset( + new SplashScreenSupport( + m_windowData->getEvasObject(Layer::WINDOW), + (DPL::ToUTF8String(*splashImgSrc)).c_str(), + m_currentViewMode != VIEWMODE_TYPE_FULLSCREEN, + m_settingList->getRotationValue() == Screen_Landscape)); + m_splashScreen->startSplashScreen(); + } + ADD_PROFILING_POINT("Create splash screen", "stop"); + + DPL::OptionalString startUrl = W3CFileLocalization::getStartFile(m_dao); +#if USE(WEB_PROVIDER_EXCEPTION_IN_EWK_CONTEXT) + ewk_context_tizen_extensible_api_string_set(s_preparedEwkContext, EXTENSIBLE_API_MEDIA_VOLUME_CONTROL, EINA_TRUE); +#endif + if (!m_widget->PrepareView( + DPL::ToUTF8String(*startUrl), + m_windowData->getEvasObject(Layer::WINDOW), + s_preparedEwkContext)) + { + switchToShutdownStep(); + return; + } + // send rotate information to ewk + m_orientationSupport->setEwkInitialOrientation( + m_settingList->getRotationValue()); + + //you can't show window with splash screen before PrepareView + //ewk_view_add_with_context() in viewLogic breaks window + m_windowData->init(); + m_windowData->postInit(); + + // sub-mode support + if (m_submodeSupport->isInlineMode()) { + if (m_submodeSupport->transientWindow( + elm_win_xwindow_get( + m_windowData->getEvasObject(Layer::WINDOW)))) + { + WrtLogD("Success to set submode"); + } else { + WrtLogW("Fail to set submode"); + } + } + m_windowData->smartCallbackAdd(Layer::FOCUS, + "focused", + focusedCallback, + this); + m_windowData->smartCallbackAdd(Layer::FOCUS, + "unfocused", + unfocusedCallback, + this); + + WrtDB::WidgetLocalizedInfo localizedInfo = + W3CFileLocalization::getLocalizedInfo(m_dao); + std::string name = ""; + if (!!localizedInfo.name) { + name = DPL::ToUTF8String(*(localizedInfo.name)); + } + elm_win_title_set(m_windowData->getEvasObject(Layer::WINDOW), + name.c_str()); + + // window show +#if ENABLE(PRE_LAUNCH) + if (PreLaunchingSupportSingleton::Instance().isPreLaunching()) { + PreLaunchingSupportSingleton::Instance().initialize( + m_widget->GetCurrentWebview(), + m_windowData->getEvasObject(Layer::WINDOW)); + } else { + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); + } +#else + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); +#endif + + initializeWindowModes(); + + m_widgetState = WidgetState_Running; + + cbs->loadProgressStartedCallback = DPL::Bind(&WrtClient::loadProgressStartedCallback, this); + cbs->loadProgressCallback = DPL::Bind(&WrtClient::loadProgressCallback, this); + cbs->loadProgressFinishedCallback = DPL::Bind(&WrtClient::loadProgressFinishedCallback, this); + cbs->loadStartedCallback = DPL::Bind(&WrtClient::loadStartedCallback, this); + cbs->loadFinishedCallback = DPL::Bind(&WrtClient::loadFinishedCallback, this); + cbs->setWebviewCallback = DPL::Bind(&WrtClient::setLayout, this); + cbs->unsetWebviewCallback = DPL::Bind(&WrtClient::unsetLayout, this); + cbs->processExitCallback = DPL::Bind(&WrtClient::processExitCallback, this); + cbs->webProcessCrashedCallback = DPL::Bind(&WrtClient::webProcessCrashedCallback, this); + cbs->processCrashedCallback = DPL::Bind(&WrtClient::processCrashedCallback, this); + cbs->enterFullscreenCallback = DPL::Bind(&WrtClient::enterFullscreenCallback, this); + cbs->exitFullscreenCallback = DPL::Bind(&WrtClient::exitFullscreenCallback, this); + cbs->orientationLockCallback = DPL::Bind(&WrtClient::setWindowOrientation, this); + cbs->keyCallback = DPL::Bind(&WrtClient::keyCallback, this); + cbs->consoleMessageCallback = DPL::Bind(&WrtClient::consoleMessageCallback, this); + cbs->rotatePreparedCallback = DPL::Bind(&WrtClient::rotatePreparedCallback, this); + cbs->enableVideoHwOverlayCallback = DPL::Bind(&WrtClient::enableVideoHwOverlayCallback, this); + cbs->disableVideoHwOverlayCallback = DPL::Bind(&WrtClient::disableVideoHwOverlayCallback, this); + cbs->popupReplyWaitStartCallback = DPL::Bind(&WrtClient::popupReplyWaitStartCallback, this); + cbs->popupReplyWaitFinishCallback = DPL::Bind(&WrtClient::popupReplyWaitFinishCallback, this); + cbs->frameRenderedCallback = DPL::Bind(&WrtClient::frameRenderedCallback, this); + cbs->blockedUrlPolicyCallback = DPL::Bind(&WrtClient::blockedUrlPolicyCallback, this); + cbs->isCreateNewWindowAllowedCallback = DPL::Bind(&WrtClient::isCreateNewWindowAllowedCallback, this); + cbs->createContextMenuCallback = DPL::Bind(&WrtClient::createContextMenuCallback, this); + + m_widget->SetUserDelegates(cbs); + + if (m_orientationSupport->isOrientationPrepared(m_settingList->getRotationValue())) { + DPL::Event::ControllerEventHandler::PostEvent(NextStepEvent()); + } else { + m_orientationSupport->registerRotationCallback(initialOrientationCheckCallback, this); + } + ADD_PROFILING_POINT("launchStep", "stop"); +} + +void WrtClient::showStep() +{ + WrtLogD("Show widget ..."); + m_widget->Show(); +} + +void WrtClient::switchToShutdownStep() +{ + WrtLogD("switchToShutdownStep"); + // webProcessCrashedCallback was called twice by webkit which called NexStepEvent + // again while no step was left in the Queue and Assert failed in Task.h + if(WidgetState_Stopped == m_widgetState){ + WrtLogE("shutdownStep was called already!"); + return; + } + SwitchToStep(&WrtClient::shutdownStep); + DPL::Event::ControllerEventHandler::PostEvent(NextStepEvent()); +} + +void WrtClient::initializeWindowModes() +{ + Assert(m_windowData); + bool backbutton = + (m_settingList->getBackButtonPresence() == BackButton_Enable || + m_initialViewMode == VIEWMODE_TYPE_WINDOWED); + m_windowData->setViewMode(m_currentViewMode == VIEWMODE_TYPE_FULLSCREEN, + backbutton); +} + +Eina_Bool WrtClient::naviframeBackButtonCallback(void* data, + Elm_Object_Item* /*it*/) +{ + WrtLogD("BackButtonCallback"); + Assert(data); + + WrtClient* This = static_cast(data); + This->m_widget->Backward(); + return EINA_FALSE; +} + +int WrtClient::appcoreLowMemoryCallback(void* /* event_info*/, void* data) +{ + WrtLogD("appcoreLowMemoryCallback"); + Assert(data); + WrtClient* This = static_cast(data); + + if (This->m_widget) { + This->m_widget->HandleLowMemory(); + } + + return 0; +} + +void WrtClient::setInitialViewMode(void) +{ + Assert(m_dao); + WrtDB::WindowModeList windowModes = m_dao->getWindowModes(); + FOREACH(it, windowModes) { + std::string viewMode = DPL::ToUTF8String(*it); + switch(viewMode[0]) { + case 'f': + if (viewMode == VIEWMODE_TYPE_FULLSCREEN) { + m_initialViewMode = viewMode; + m_currentViewMode = m_initialViewMode; + break; + } + break; + case 'm': + if (viewMode == VIEWMODE_TYPE_MAXIMIZED) { + m_initialViewMode = viewMode; + m_currentViewMode = m_initialViewMode; + break; + } + break; + case 'w': + if (viewMode == VIEWMODE_TYPE_WINDOWED) { + m_initialViewMode = viewMode; + m_currentViewMode = m_initialViewMode; + break; + } + break; + default: + break; + } + } +} + +void WrtClient::initWindowOrientation(void) +{ + Assert(m_windowData); + + m_orientationSupport.reset( + new ClientModule::OrientationSupport(m_windowData, m_widget)); + m_orientationSupport->setInitialWindowOrientation( + m_settingList->getRotationValue()); + if (!m_orientationSupport->setAutoRotation()) { + WrtLogE("Fail to set rotation callback"); + } else { + m_orientationSupport->registerRotationCallback(autoRotationCallback, + this); + } +} + +void WrtClient::deinitWindowOrientation(void) +{ + Assert(m_orientationSupport); + + m_orientationSupport->unregisterRotationCallbacks(); + m_orientationSupport.reset(); +} + +void WrtClient::setWindowOrientation(int angle) +{ + Assert(m_windowData); + m_windowData->setOrientation(angle); +} + +void WrtClient::keyCallback(Evas_Object* obj, void* eventInfo) +{ + Ea_Callback_Type keyType = static_cast(reinterpret_cast(eventInfo)); + + // TODO: Remove keycallback when application moves to suspend + if (m_widgetState == WidgetState_Suspended) { + // Key event is faster than resume event + WrtLogW("Application is not ready to handle key"); + return; + } + if (m_settingList->getBackButtonPresence() == BackButton_Enable + || m_initialViewMode == VIEWMODE_TYPE_WINDOWED) + { + // windowed UX - hosted application + if (keyType == EA_CALLBACK_BACK) { + if (m_isWebkitFullscreen) { + ewk_view_fullscreen_exit(obj); + } else { + m_widget->Backward(); + } + } else if (keyType == EA_CALLBACK_MORE) { + // UX isn't confirmed + } + } +} + +void WrtClient::consoleMessageCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + + static bool logEnable = (getenv(WRT_CONSOLE_LOG_ENABLE) != NULL); + + if (m_debugMode || logEnable) { + Assert(eventInfo); + Ewk_Console_Message* consoleMessage = static_cast(eventInfo); + + std::stringstream buf; + unsigned int lineNumber = ewk_console_message_line_get(consoleMessage); + const char* text = ewk_console_message_text_get(consoleMessage); + const char* source = ewk_console_message_source_get(consoleMessage); + if (lineNumber) { + buf << source << ":"; + buf << lineNumber << ":"; + } + buf << text; + + ConsoleLogLevel level; + switch (ewk_console_message_level_get(consoleMessage)) { + case EWK_CONSOLE_MESSAGE_LEVEL_TIP: + case EWK_CONSOLE_MESSAGE_LEVEL_LOG: + case EWK_CONSOLE_MESSAGE_LEVEL_DEBUG: + level = ConsoleLogLevel::Debug; + break; + case EWK_CONSOLE_MESSAGE_LEVEL_WARNING: + level = ConsoleLogLevel::Warning; + break; + case EWK_CONSOLE_MESSAGE_LEVEL_ERROR: + level = ConsoleLogLevel::Error; + break; + default: + level = ConsoleLogLevel::Debug; + break; + } + ClientModule::IDESupport::consoleMessage( + level, + "%s", + buf.str().c_str()); + } +} + +void WrtClient::rotatePreparedCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + +#if USE(WEBKIT_MANUAL_ROTATION) + WrtLogD("Rotate by webkit"); + m_orientationSupport->setRotationDone(); +#endif +} + + +void WrtClient::setLayout(Evas_Object* webview) +{ + WrtLogD("add new webkit buffer to window"); + + Assert(webview); + m_windowData->setWebview(webview); + + evas_object_show(webview); + +#if ENABLE(PRE_LAUNCH) + if (PreLaunchingSupportSingleton::Instance().isPreLaunching() == false) { + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); + } +#else + evas_object_show(m_windowData->getEvasObject(Layer::WINDOW)); +#endif +} + +void WrtClient::unsetLayout(Evas_Object* webview) +{ + WrtLogD("remove current webkit buffer from window"); + Assert(webview); + evas_object_hide(webview); + m_windowData->unsetWebview(); +} + +void WrtClient::shutdownStep() +{ + WrtLogD("Closing Wrt connection ..."); + + if (m_widget && m_widgetState) { + m_widgetState = WidgetState_Stopped; + Abort(); + // (un)focusCallback MUST be detached before hiding widget starts + m_windowData->smartCallbackDel(Layer::FOCUS, + "focused", + focusedCallback); + m_windowData->smartCallbackDel(Layer::FOCUS, + "unfocused", + unfocusedCallback); + m_widget->Hide(); + // AutoRotation use m_widget pointer internally. + // It must be unset before m_widget is released. + m_submodeSupport->deinitialize(); + deinitWindowOrientation(); + m_widget.reset(); +#if USE(WEBKIT_UPVERSION) + ewk_object_unref(s_preparedEwkContext); +#else + ewk_context_delete(s_preparedEwkContext); +#endif + WRT::CoreModuleSingleton::Instance().Terminate(); + } + if (m_initialized) { + m_initialized = false; + } + m_windowData.reset(); + Quit(); +} + +void WrtClient::autoRotationCallback(void* data, + Evas_Object* obj, + void* event) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(event); + WrtLogD("entered"); + Assert(data); + WrtClient* This = static_cast(data); + // Splash screen + if (This->m_splashScreen && This->m_splashScreen->isShowing()) { + This->m_splashScreen->resizeSplashScreen(); + } +} + +void WrtClient::initialOrientationCheckCallback(void* data, Evas_Object* obj, void* event) +{ + WrtLogD("entered"); + + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(event); + + Assert(data); + WrtClient* This = static_cast(data); + if (This->m_orientationSupport->isOrientationPrepared(This->m_settingList->getRotationValue())) { + WrtLogD("initial orientation is ready"); + This->m_orientationSupport->unregisterRotationCallback(initialOrientationCheckCallback); + This->DPL::Event::ControllerEventHandler::PostEvent(NextStepEvent()); + } +} + +void WrtClient::focusedCallback(void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("entered"); + Assert(data); + WrtClient* This = static_cast(data); + elm_object_focus_set(This->m_widget->GetCurrentWebview(), EINA_TRUE); +} + +void WrtClient::unfocusedCallback(void* data, + Evas_Object* /*obj*/, + void* /*eventInfo*/) +{ + WrtLogD("entered"); + Assert(data); + WrtClient* This = static_cast(data); + elm_object_focus_set(This->m_widget->GetCurrentWebview(), EINA_FALSE); +} + +int WrtClient::languageChangedCallback(void *data) +{ + WrtLogD("Language Changed"); + if (!data) { + return 0; + } + WrtClient* wrtClient = static_cast(data); + if (!(wrtClient->m_dao)) { + return 0; + } + + // reset function fetches system locales and recreates language tags + LanguageTagsProviderSingleton::Instance().resetLanguageTags(); + // widget default locales are added to language tags below + DPL::OptionalString defloc = wrtClient->m_dao->getDefaultlocale(); + if (!!defloc) { + LanguageTagsProviderSingleton::Instance().addWidgetDefaultLocales( + *defloc); + } + + if (wrtClient->m_launched && + wrtClient->m_widgetState != WidgetState_Stopped) + { + wrtClient->m_widget->ReloadStartPage(); + } + return 0; +} + +void WrtClient::Quit() +{ + ewk_shutdown(); + DPL::Application::Quit(); +} + +static Eina_Bool proces_pool_fd_handler(void* /*data*/, Ecore_Fd_Handler *handler) +{ + int fd = ecore_main_fd_handler_fd_get(handler); + + if (fd == -1) + { + WrtLogD("ECORE_FD_GET"); + exit(-1); + } + + if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR)) + { + WrtLogD("ECORE_FD_ERROR"); + close(fd); + exit(-1); + } + + if (ecore_main_fd_handler_active_get(handler, ECORE_FD_READ)) + { + WrtLogD("ECORE_FD_READ"); + { + app_pkt_t* pkt = (app_pkt_t*) malloc(sizeof(char) * AUL_SOCK_MAXBUFF); + if (pkt == NULL) { + WrtLogD("malloc is failed"); + close(fd); + exit(-1); + } + memset(pkt, 0, AUL_SOCK_MAXBUFF); + + int recv_ret = recv(fd, pkt, AUL_SOCK_MAXBUFF, 0); + close(fd); + + if (recv_ret == -1) + { + WrtLogD("recv error!"); + free(pkt); + exit(-1); + } + + WrtLogD("recv_ret : %d, pkt->len : %d", recv_ret, pkt->len); + ecore_main_fd_handler_del(handler); + process_pool_launchpad_main_loop(pkt, app_argv[0], &app_argc, &app_argv); + free(pkt); + } + ecore_main_loop_quit(); + } + + return ECORE_CALLBACK_CANCEL; +} + +static void vconf_changed_handler(keynode_t* /*key*/, void* /*data*/) +{ + WrtLogD("VCONFKEY_LANGSET vconf-key was changed!"); + + // When system language is changed, the candidate process will be created again. + exit(-1); +} + +void set_env() +{ +#ifndef TIZEN_PUBLIC + setenv("COREGL_FASTPATH", "1", 1); +#endif + setenv("CAIRO_GL_COMPOSITOR", "msaa", 1); + setenv("CAIRO_GL_LAZY_FLUSHING", "yes", 1); + setenv("ELM_IMAGE_CACHE", "0", 1); +} + +int main(int argc, + char *argv[]) +{ + // process pool - store arg's value + app_argc = argc; + app_argv = argv; + + UNHANDLED_EXCEPTION_HANDLER_BEGIN + { + ADD_PROFILING_POINT("main-entered", "point"); + + // Set environment variables + set_env(); + + if (argc > 1 && argv[1] != NULL && !strcmp(argv[1], "-d")) + { + WrtLogD("Entered dummy process mode"); + sprintf(argv[0], "%s", DUMMY_PROCESS_PATH); + + // Temporarily change HOME path to app + // This change is needed for getting elementary profile + // /opt/home/app/.elementary/config/mobile/base.cfg + setenv(HOME, APP_HOME_PATH, 1); + WrtLogD("elm_init()"); + elm_init(argc, argv); +#if USE(EFL_LITE) + elm_app_base_scale_set(1.8); +#else + elm_app_base_scale_set(2.4); +#endif + + // Set 'root' home directory + setenv(HOME, ROOT_HOME_PATH, 1); + + WrtLogD("Prepare ewk_context"); + appcore_set_i18n("wrt-client", NULL); + ewk_set_arguments(argc, argv); + // Temporary block until fix crash issue in Webkit side + //setenv("WRT_LAUNCHING_PERFORMANCE", "1", 1); + setenv("WEB_PROCESS_EXECUTABLE_PATH", "/usr/bin/WebProcess", 1); + setenv("WEB_PROCESS_EXECUTABLE_PATH_FOR_PROCESS_POOL","1", 1); + s_preparedEwkContext = ewk_context_new_with_injected_bundle_path(BUNDLE_PATH); + + if (s_preparedEwkContext == NULL) + { + WrtLogD("Creating webkit context was failed!"); + exit(-1); + } + + int client_fd = __connect_process_pool_server(); + + if (client_fd == -1) + { + WrtLogD("Connecting process_pool_server was failed!"); + exit(-1); + } + + // register language changed callback + vconf_notify_key_changed(VCONFKEY_LANGSET, vconf_changed_handler, NULL); + + Ecore_Fd_Handler* fd_handler = ecore_main_fd_handler_add(client_fd, + (Ecore_Fd_Handler_Flags)(ECORE_FD_READ|ECORE_FD_ERROR), + proces_pool_fd_handler, NULL, NULL, NULL); + + if (fd_handler == NULL) + { + WrtLogD("fd_handler is NULL"); + exit(-1); + } + + setpriority(PRIO_PROCESS, 0, 0); + + WrtLogD("ecore_main_loop_begin()"); + ecore_main_loop_begin(); + WrtLogD("ecore_main_loop_begin()_end"); + + // deregister language changed callback + vconf_ignore_key_changed(VCONFKEY_LANGSET, vconf_changed_handler); + + std::string tizenId = + ClientModule::CommandLineParser::getTizenId(argc, argv); + + // CapabilitySupport + std::string pluginProcessPath = + WRT::SecuritySupport::getPluginProcessSoftLinkPath(tizenId); + + if (pluginProcessPath.empty()) { + WrtLogE("Failed to get plugin process path"); + exit(-1); + } + + setenv("PLUGIN_PROCESS_EXECUTABLE_PATH_FOR_PROCESS_POOL", + pluginProcessPath.c_str(), 1); + WrtLogD("PLUGIN_PROCESS_EXECUTABLE_PATH_FOR_PROCESS_POOL = %s", + pluginProcessPath.c_str()); + ewk_context_message_post_to_injected_bundle( + s_preparedEwkContext, + Message::ToInjectedBundle::INIT, + tizenId.c_str()); + + // Process Pool cannot initialize elm_win because of thread blocked signal to change label of samck + s_preparedWindowData = new WindowData(static_cast(getpid())); + + } + else + { + // This code is to fork a web process without exec. + std::string tizenId = + ClientModule::CommandLineParser::getTizenId(argc, argv); + + if (!tizenId.empty()) { + if (UID_ROOT == getuid()) { + // Drop root permission + // Only launch web application by console command case has root permission + if (!WRT::SecuritySupport::setAppPrivilege(tizenId)) { + WrtLogE("Fail to set app privilege : [%s]", tizenId.c_str()); + exit(-1); + } + } + + WrtLogD("Launching by fork mode"); + // Language env setup + appcore_set_i18n("wrt-client", NULL); + ewk_set_arguments(argc, argv); + // Temporary block until fix crash issue in Webkit side + //setenv("WRT_LAUNCHING_PERFORMANCE", "1", 1); + + elm_init(argc, argv); +#if USE(EFL_LITE) + elm_app_base_scale_set(1.8); +#else + elm_app_base_scale_set(2.4); +#endif + // CapabilitySupport + std::string pluginProcessPath = + WRT::SecuritySupport::getPluginProcessSoftLinkPath(tizenId); + + if (pluginProcessPath.empty()) { + WrtLogE("Failed to get plugin process path"); + exit(-1); + } + + setenv("PLUGIN_PROCESS_EXECUTABLE_PATH", + pluginProcessPath.c_str(), 1); + WrtLogD("PLUGIN_PROCESS_EXECUTABLE_PATH = %s", + pluginProcessPath.c_str()); + + s_preparedEwkContext = ewk_context_new_with_injected_bundle_path( + BUNDLE_PATH); + + if (s_preparedEwkContext == NULL) + { + WrtLogD("Creating webkit context was failed!"); + Wrt::Popup::PopupInvoker().showInfo("Error", "Creating webkit context was failed.", "OK"); + exit(-1); + } + + // plugin init + ewk_context_message_post_to_injected_bundle( + s_preparedEwkContext, + Message::ToInjectedBundle::INIT, + tizenId.c_str()); + } + } + + // Output on stdout will be flushed after every newline character, + // even if it is redirected to a pipe. This is useful for running + // from a script and parsing output. + // (Standard behavior of stdlib is to use full buffering when + // redirected to a pipe, which means even after an end of line + // the output may not be flushed). + setlinebuf(stdout); + + WrtClient app(app_argc, app_argv); + + ADD_PROFILING_POINT("Before appExec", "point"); + int ret = app.Exec(); + WrtLogD("App returned: %d", ret); + ret = app.getReturnStatus(); + WrtLogD("WrtClient returned: %d", ret); + return ret; + } + UNHANDLED_EXCEPTION_HANDLER_END +} diff --git a/src/wrt-client/wrt-client.h b/src/wrt-client/wrt-client.h new file mode 100755 index 0000000..35ba249 --- /dev/null +++ b/src/wrt-client/wrt-client.h @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef WRT_CLIENT_H +#define WRT_CLIENT_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "widget_state.h" +#include "window_data.h" + +DECLARE_GENERIC_EVENT_0(NextStepEvent) + +namespace ClientModule { +class SubmodeSupport; +class OrientationSupport; +} +class SplashScreenSupport; +namespace WrtDB { +class WidgetDAOReadOnly; +} +class WidgetSettingList; + +class WrtClient : + public DPL::Application, + private DPL::Event::Controller::Type>, + public DPL::TaskDecl +{ + public: + WrtClient(int argc, + char **argv); + virtual ~WrtClient(); + + class ReturnStatus + { + public: + enum Type + { + Failed = -1, + Succeeded = 0 + }; + }; + + ReturnStatus::Type getReturnStatus() const; + virtual void Quit(); + static std::string getTizenIdFromArgument(int argc, char **argv); + + protected: + virtual void OnStop(); + virtual void OnCreate(); + virtual void OnResume(); + virtual void OnPause(); + virtual void OnReset(bundle *b); + virtual void OnTerminate(); + + void setStep(); + + private: + void showHelpAndQuit(); + void setDebugMode(bundle* b); + void initializeWindowModes(); + + // Events + virtual void OnEventReceived(const NextStepEvent& event); + + // static Callback + static Eina_Bool naviframeBackButtonCallback(void* data, + Elm_Object_Item* it); + static int appcoreLowMemoryCallback(void* eventInfo, void* data); + static int languageChangedCallback(void *data); + static void autoRotationCallback(void* data, Evas_Object* obj, void* event); + static void initialOrientationCheckCallback(void* data, Evas_Object* obj, void* event); + static void focusedCallback(void* data, + Evas_Object* obj, + void* eventInfo); + static void unfocusedCallback(void* data, + Evas_Object* obj, + void* eventInfo); + + //view-mode + void setInitialViewMode(); + + //orientation + void setWindowOrientation(int angle); + void initWindowOrientation(); + void deinitWindowOrientation(); + + // hwkey + void keyCallback(Evas_Object* obj, void* eventInfo); + + void consoleMessageCallback(Evas_Object* obj, void* eventInfo); + void rotatePreparedCallback(Evas_Object* obj, void* eventInfo); + + // launching steps + void initStep(); + void launchStep(); + void shutdownStep(); + void showStep(); + void switchToShutdownStep(); + void loadStartedCallback(Evas_Object* obj, void* eventInfo); + void loadFinishedCallback(Evas_Object* obj, void* eventInfo); + void loadProgressStartedCallback(Evas_Object* obj, void* eventInfo); + void loadProgressCallback(Evas_Object* obj, void* eventInfo); + void loadProgressFinishedCallback(Evas_Object* obj, void* eventInfo); + void processExitCallback(Evas_Object* obj, void* eventInfo); + void webProcessCrashedCallback(Evas_Object* obj, void* eventInfo); + void processCrashedCallback(Evas_Object* obj, void* eventInfo); + void enterFullscreenCallback(Evas_Object* obj, void* eventInfo); + void exitFullscreenCallback(Evas_Object* obj, void* eventInfo); + void enableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo); + void disableVideoHwOverlayCallback(Evas_Object* obj, void* eventInfo); + void setLayout(Evas_Object* newBuffer); + void unsetLayout(Evas_Object* currentBuffer); + void popupReplyWaitStartCallback(Evas_Object* obj, void* eventInfo); + void popupReplyWaitFinishCallback(Evas_Object* obj, void* eventInfo); + void frameRenderedCallback(Evas_Object* obj, void* eventInfo); + void blockedUrlPolicyCallback(const std::string& blockedUrl) ; + bool isCreateNewWindowAllowedCallback(void); + void createContextMenuCallback(void* eventInfo); + + // Private data + std::string m_tizenId; + + bool m_launched; + bool m_initializing; + bool m_initialized; + bool m_debugMode; + ReturnStatus::Type m_returnStatus; + WRT::RunnableWidgetObjectPtr m_widget; + WrtDB::WidgetDAOReadOnlyPtr m_dao; + WidgetSettingListPtr m_settingList; + WidgetState m_widgetState; + WindowDataPtr m_windowData; + std::unique_ptr m_splashScreen; + std::string m_initialViewMode; + std::string m_currentViewMode; + bool m_isWebkitFullscreen; +#if USE(WEBKIT_MANUAL_ROTATION) + bool m_isWebkitHandleManualRotationDone; +#endif + std::unique_ptr m_submodeSupport; + std::unique_ptr m_orientationSupport; +}; + +#endif // WRT_CLIENT_H diff --git a/src/wrt-launcher/CMakeLists.txt b/src/wrt-launcher/CMakeLists.txt new file mode 100644 index 0000000..2e30846 --- /dev/null +++ b/src/wrt-launcher/CMakeLists.txt @@ -0,0 +1,58 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +GROUP_DEPS(LAUNCHER_PKGS DEPS + dpl-efl + dpl-db-efl + dpl-wrt-dao-rw + dpl-wrt-dao-ro + capi-appfw-app-manager + capi-appfw-application + appsvc + libsmack +) + +SET(LAUNCHER_SRCS + wrt-launcher.cpp +) + +INCLUDE_DIRECTORIES( + ${LAUNCHER_PKGS_INCLUDE_DIRS} +) + +ADD_DEFINITIONS("-fPIE") + +ADD_EXECUTABLE(${TARGET_LAUNCHER} + ${LAUNCHER_SRCS} +) + +TARGET_LINK_LIBRARIES(${TARGET_LAUNCHER} + ${LAUNCHER_PKGS_LIBRARIES} +) + +SET_TARGET_PROPERTIES(${TARGET_LAUNCHER} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +SET_TARGET_PROPERTIES(${TARGET_LAUNCHER} PROPERTIES + LINK_FLAGS "-Wl,--as-needed -pie -Wl,--hash-style=both -Wl,--version-script=${PROJECT_SOURCE_DIR}/wrt-engine.map" + BUILD_WITH_INSTALL_RPATH ON + INSTALL_RPATH_USE_LINK_PATH ON +) + +INSTALL(TARGETS ${TARGET_LAUNCHER} + DESTINATION bin + PERMISSIONS OWNER_READ + OWNER_WRITE + OWNER_EXECUTE +) diff --git a/src/wrt-launcher/wrt-launcher.cpp b/src/wrt-launcher/wrt-launcher.cpp new file mode 100755 index 0000000..04473a1 --- /dev/null +++ b/src/wrt-launcher/wrt-launcher.cpp @@ -0,0 +1,517 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TIMEOUT_DEFAULT 10 +#define ROOT_DEFAULT_UID 0 +#define ROOT_DEFAULT_GID 0 +#define WEBAPP_DEFAULT_UID 5000 +#define WEBAPP_DEFAULT_GID 5000 +#define LOGGING_DEFAULT_GID 6509 +#define RETURN_ERROR -1 +#define BUF_SIZE 1024 +#define PKG_ID_LENGTH 11 +#define DEBUG_NETWORK "system::debugging_network" + +static const char *program; + +class DBConnection +{ + public: + void AttachDatabase() + { + WrtDB::WrtDatabase::attachToThreadRW(); + } + + void DetachDatabase() + { + WrtDB::WrtDatabase::detachFromThread(); + } +}; + +static std::unique_ptr g_dbConnection; + +static bool attachDbConnection() +{ + if (NULL == g_dbConnection.get()) { + Try { + g_dbConnection.reset(new DBConnection()); + g_dbConnection->AttachDatabase(); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + WrtLogD("Fail to connect DB"); + return FALSE; + } + } + return TRUE; +} + +static bool display_widget_info() +{ + if (!attachDbConnection()) { + return FALSE; + } + + WidgetDAOReadOnlyList widgetList; + + Try { + widgetList = WrtDB::WidgetDAOReadOnly::getWidgetList(); + } Catch (WrtDB::WidgetDAOReadOnly::Exception::DatabaseError) { + WrtLogE("Fail to get WidgetList"); + return FALSE; + } + + printf("%3s %32s %16s %64s %16s %24s\n", + "No", "Name", "Version", "GUID", "Package ID", "App ID"); + printf("%3s %32s %16s %64s %16s %24s\n", + "--", "--", "----", "-------", "-----", "-----"); + + int number = 1; + const char *null_str = "[NULL]"; + FOREACH(dao, widgetList) { + Try { + + WrtDB::WidgetGUID guid = (*dao)->getGUID(); + DPL::OptionalString version = (*dao)->getVersion(); + WrtDB::TizenAppId appid = (*dao)->getTizenAppId(); + WrtDB::TizenPkgId pkgid = (*dao)->getTizenPkgId(); + + /*get WidgetName*/ + DPL::OptionalString widget_name; + DPL::OptionalString dl = (*dao)->getDefaultlocale(); + WrtDB::WidgetLocalizedInfo localizedInfo; + if (!dl) { + DPL::String languageTag(L""); + localizedInfo = (*dao)->getLocalizedInfo(languageTag); + } else { + localizedInfo = (*dao)->getLocalizedInfo(*dl); + } + + widget_name = localizedInfo.name; + /*end get WidgetName*/ + + std::string widget_name_disp; + if (widget_name) + widget_name_disp = DPL::ToUTF8String(*widget_name); + + std::string version_disp; + if (version) + version_disp = DPL::ToUTF8String(*version); + + std::string guid_disp; + if (guid) + guid_disp = DPL::ToUTF8String(*guid); + + std::string pkgid_disp; + pkgid_disp = DPL::ToUTF8String(pkgid); + + std::string appid_disp; + appid_disp = DPL::ToUTF8String(appid); + + printf("%3i %32s %16s %64s %16s %24s\n", + number++, + widget_name_disp.empty() ? null_str : widget_name_disp.c_str(), + version_disp.c_str(), + guid_disp.empty() ? null_str : guid_disp.c_str(), + pkgid_disp.empty() ? null_str : pkgid_disp.c_str(), + appid_disp.empty() ? null_str : appid_disp.c_str()); + + } Catch (WrtDB::WidgetDAOReadOnly::Exception::WidgetNotExist) { + WrtLogE("Installed application list is updated"); + } + } + + return 1; +} + +static void print_help(FILE *stream, int /*exit_code*/) +{ + fprintf(stream, "Usage : %s [ ... ]\n", program); + fprintf( + stream, + " -h --help Display this usage information.\n" + " -l --list Display installed widgets list\n" + " -s [tizen application ID] --start Launch widget with tizen application ID\n" + " -k [tizen application ID] --kill Kill widget with tizen application ID\n" + " -r [tizen application ID] --is-running Check whether widget is running by tizen application ID,\n" + " If widget is running, 0(zero) will be returned.\n" + " -d --debug Activate debug mode\n" + " -t [second] --timeout Set timeout of response from widget in debug mode\n" + " if you emit this option, 5 seconds is set in debug mode\n" + ); +} + +extern "C" int app_control_to_bundle(app_control_h app_control, bundle** data); + +static void app_control_ReplyCallback(app_control_h /*request*/, + app_control_h reply, + app_control_result_e /*result*/, + void* data) +{ + Ecore_Timer* app_control_Timer = static_cast(data); + if (app_control_Timer != NULL) { + ecore_timer_del(app_control_Timer); + } + + bundle* b = NULL; + app_control_to_bundle(reply, &b); + const char* port = appsvc_get_data(b, "port"); + if (port != NULL && strlen(port) > 0) { + printf("port: %s\n", port); + printf("result: %s\n", "launched"); + } else { + printf("result: %s\n", "failed"); + } + ecore_main_loop_quit(); + return; +} + +static Eina_Bool timerCallback(void* /*data*/) +{ + printf("result: %s\n", "failed"); + ecore_main_loop_quit(); + return EINA_FALSE; +} + + +static int add_smack_rule(const char* subject, const char* object, const char *access){ + int ret = 0; + struct smack_accesses *rules = NULL; + if((ret = smack_accesses_new(&rules)) != 0 ){ + WrtLogE("error smack_accesses_new %d", ret); + return ret; + } + if((ret = smack_accesses_add(rules, subject, object, access)) != 0){ + WrtLogE("error smack_accesses_add %d", ret); + smack_accesses_free(rules); + return ret; + } + if((ret = smack_accesses_apply(rules)) != 0){ + WrtLogE("error smack_accesses_apply %d", ret); + smack_accesses_free(rules); + return ret; + } + smack_accesses_free(rules); + return ret; +} + +static int set_debug_network_smack_rule(const char *pkg_id) +{ + int ret = 0; + WrtLogD("Add system::debugging_network smack rule"); + ret = add_smack_rule(pkg_id, DEBUG_NETWORK, "rw"); + if(!ret){ + ret = add_smack_rule(DEBUG_NETWORK, pkg_id, "w"); + } + return ret; +} + + +int main(int argc, char* argv[]) +{ + UNHANDLED_EXCEPTION_HANDLER_BEGIN + { + int next_opt, opt_idx = 0; + int timeout = TIMEOUT_DEFAULT; + char applicationId[BUF_SIZE] = ""; + char temp_arg[BUF_SIZE] = ""; + char pid[6] = ""; + char op = '\0'; + bool isDebugMode = false; + bool dispHelp = false; + bool dispList = false; + Ecore_Timer* app_control_Timer = NULL; + + app_control_h app_control = NULL; + int ret = APP_CONTROL_ERROR_NONE; + + program = argv[0]; + + static struct option long_options[] = { + { "help", no_argument, 0, 'h' }, + { "list", no_argument, 0, 'l' }, + { "start", required_argument, 0, 's' }, + { "kill", required_argument, 0, 'k' }, + { "is-running", required_argument, 0, 'r' }, + { "debug", no_argument, 0, 'd' }, + { "timeout", required_argument, 0, 't' }, + { 0, 0, 0, 0 } + }; + + if (argv[1] == NULL) { + /* exit if any argument doesn't exist */ + print_help(stdout, 0); + return -1; + } + + if (ROOT_DEFAULT_UID == geteuid()) { + if (RETURN_ERROR == setuid(ROOT_DEFAULT_UID)) { + perror("Fail to set uid"); + } + } + if (ROOT_DEFAULT_GID == getegid()) { + if (RETURN_ERROR == setgid(ROOT_DEFAULT_GID)) { + perror("Fail to set gid"); + } + } + + do { + next_opt = getopt_long(argc, + argv, + "hls:k:r:dt:v:c:i:m:", + long_options, + &opt_idx); + + switch (next_opt) { + case 'h': + if (!dispHelp) { + print_help(stdout, 0); + dispHelp = true; + } + break; + + case 'l': + if (dispList) { + break; + } + if (!display_widget_info()) { + printf("Fail to display the list of installed widgets"); + return -1; + } + dispList = true; + break; + + case 's': + case 'k': + case 'r': + strncpy(temp_arg, optarg, BUF_SIZE); + temp_arg[BUF_SIZE-1] = '\0'; + op = next_opt; + break; + + case 't': + timeout = atoi(optarg); + if (timeout < 0) { + timeout = TIMEOUT_DEFAULT; + } + break; + + case 'd': + isDebugMode = true; + break; + + case -1: + break; + + default: + print_help(stdout, 0); + break; + } + } while (next_opt != -1); + + if ((op == 's') || (op == 'k') || (op == 'r')) { + std::string temp; + + if (NULL == g_dbConnection.get()) { + Try { + g_dbConnection.reset(new DBConnection()); + g_dbConnection->AttachDatabase(); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + WrtLogD("Fail to connect DB"); + return FALSE; + } + } + DPL::OptionalString normal_str = DPL::FromUTF8String(temp_arg); + WrtDB::NormalizeAndTrimSpaceString(normal_str); + std::string normal_arg = DPL::ToUTF8String(*normal_str); + + WidgetDAOReadOnlyList widgetList = + WrtDB::WidgetDAOReadOnly::getWidgetList(); + FOREACH(dao, widgetList) { + WrtDB::TizenAppId tizenAppId = (*dao)->getTizenAppId(); + if (!strcmp(DPL::ToUTF8String(tizenAppId).c_str(), + normal_arg.c_str())) + { + temp = DPL::ToUTF8String(tizenAppId); + break; + } + } + if (!temp.empty()) { + strncpy(applicationId, temp.c_str(), BUF_SIZE); + applicationId[BUF_SIZE-1] = '\0'; + } else { + printf("result: %s\n", "failed"); + return -1; + } + } + + if (op == 's') { + if (strlen(applicationId) <= 0) { + printf("result: %s\n", "failed"); + return -1; + } + + // create app_control + ret = app_control_create(&app_control); + if (APP_CONTROL_ERROR_NONE != ret && NULL == app_control) { + printf("result: %s\n", "failed"); + return -1; + } + + // set package + ret = app_control_set_app_id(app_control, applicationId); + if (APP_CONTROL_ERROR_NONE != ret) { + printf("result: %s\n", "failed"); + app_control_destroy(app_control); + return -1; + } + + if (true == isDebugMode) { + + char pkg_id[PKG_ID_LENGTH]; + memset(pkg_id, '\0', PKG_ID_LENGTH); + snprintf(pkg_id, PKG_ID_LENGTH, "%s", applicationId); + + //set SMACK label for debugging + if (set_debug_network_smack_rule((const char *)pkg_id)){ + WrtLogE("Add system::debugging_network smack rule failed"); + app_control_destroy(app_control); + return FALSE; + } + + // set debug mode + ret = app_control_add_extra_data(app_control, "debug", "true"); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set debug mode [%d]", ret); + app_control_destroy(app_control); + return FALSE; + } + + // set pid + snprintf(pid, sizeof(pid), "%d", getpid()); + ret = app_control_add_extra_data(app_control, "pid", pid); + if (APP_CONTROL_ERROR_NONE != ret) { + WrtLogE("Fail to set pid [%d]", ret); + app_control_destroy(app_control); + return FALSE; + } + + ecore_init(); + app_control_Timer = ecore_timer_add(timeout, timerCallback, NULL); + ret = app_control_send_launch_request(app_control, + app_control_ReplyCallback, + app_control_Timer); + } else { + ret = app_control_send_launch_request(app_control, NULL, NULL); + } + + if (APP_CONTROL_ERROR_NONE != ret) { + printf("result: %s\n", ""); + app_control_destroy(app_control); + return -1; + } + + app_control_destroy(app_control); + + if (true == isDebugMode) { + // wait response from callee + ecore_main_loop_begin(); + return 0; + } else { + // This text should be showed for IDE + printf("result: %s\n", "launched"); + } + return 0; + } else if (op == 'k') { + bool isRunning = false; + + //checks whether the application is running + ret = app_manager_is_running(applicationId, &isRunning); + if (APP_MANAGER_ERROR_NONE != ret) { + printf("result: %s\n", "failed"); + return -1; + } + + if (true == isRunning) { + // get app_context for running application + // app_context must be released with app_context_destroy + app_context_h appCtx = NULL; + ret = app_manager_get_app_context(applicationId, &appCtx); + if (APP_MANAGER_ERROR_NONE != ret) { + printf("result: %s\n", "failed"); + return -1; + } + + // terminate app_context_h + ret = app_manager_terminate_app(appCtx); + if (APP_MANAGER_ERROR_NONE != ret) { + printf("result: %s\n", "failed"); + app_context_destroy(appCtx); + return -1; + } else { + printf("result: %s\n", "killed"); + app_context_destroy(appCtx); + return 0; + } + } else { + printf("result: %s\n", "App isn't running"); + return 0; + } + } else if (op == 'r') { + bool isRunning = false; + ret = app_manager_is_running(applicationId, &isRunning); + + if (APP_MANAGER_ERROR_NONE != ret) { + printf("result: %s\n", "failed"); + return -1; + } + + if (true == isRunning) { + printf("result: %s\n", "running"); + return 0; + } else { + printf("result: %s\n", "not running"); + return -1; + } + } + + return 0 ; + } + UNHANDLED_EXCEPTION_HANDLER_END +} + diff --git a/src/wrt-launchpad-daemon/CMakeLists.txt b/src/wrt-launchpad-daemon/CMakeLists.txt new file mode 100644 index 0000000..0e1ad0b --- /dev/null +++ b/src/wrt-launchpad-daemon/CMakeLists.txt @@ -0,0 +1,124 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# @file CMakeLists.txt +# @author Tae-Jeong Lee (taejeong.lee@samsung.com) +# @version 0.1 +# +GROUP_DEPS(WRT_LAUNCH_PAD_DEPS DEPS + aul + dlog + app-checker + bundle + dbus-glib-1 + glib + libsmack + libprivilege-control + x11 + sqlite3 + libsystemd-daemon + capi-appfw-application + rua +) + +SET(WRT_LAUNCH_PAD_INCLUDE_DIRS + ${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/include + ${WRT_LAUNCH_PAD_DEPS_INCLUDE_DIRS} +) + +INCLUDE_DIRECTORIES(${WRT_LAUNCH_PAD_INCLUDE_DIRS}) + +SET(WRT_LAUNCH_PAD_SRCS + src/access_control.cpp + src/app_sock.cpp + src/process_pool.cpp + src/simple_util.cpp +) + +IF(WRT_ENABLE_PRE_LAUNCH) +SET(WRT_LAUNCH_PAD_SRCS + ${WRT_LAUNCH_PAD_SRCS} + src/pre_launching.cpp +) +ENDIF(WRT_ENABLE_PRE_LAUNCH) + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +SET(WRT_LAUNCH_PAD_SRCS + ${WRT_LAUNCH_PAD_SRCS} + src/launchpad_lite.cpp + src/web_app_core.cpp + src/web_app_core_data.cpp + src/web_app_core_tskmgr_util.cpp + src/web_app_core_x_util.cpp +) +ELSE(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +SET(WRT_LAUNCH_PAD_SRCS + ${WRT_LAUNCH_PAD_SRCS} + src/launchpad.cpp +) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +ADD_DEFINITIONS("-fPIE") + +#build executable +ADD_EXECUTABLE( ${TARGET_WRT_LAUNCH_PAD_NAME} + ${WRT_LAUNCH_PAD_SRCS} +) + +IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +#link libraries +TARGET_LINK_LIBRARIES( ${TARGET_WRT_LAUNCH_PAD_NAME} + ${WRT_LAUNCH_PAD_DEPS_LIBRARIES} + ${TARGET_CLIENT_SUPPORT_STATIC} + ${TARGET_CORE_MODULE_LIB} + ${TARGET_WRT_EVENT_LOOP_LIB} + ${CMAKE_DL_LIBS} + "-lcap" + "-lXext" +) +ELSE(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +#link libraries +TARGET_LINK_LIBRARIES( ${TARGET_WRT_LAUNCH_PAD_NAME} + ${WRT_LAUNCH_PAD_DEPS_LIBRARIES} + ${CMAKE_DL_LIBS} + "-lcap" +) +ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + +#target properties +SET_TARGET_PROPERTIES(${TARGET_WRT_LAUNCH_PAD_NAME} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") + +SET_TARGET_PROPERTIES(${TARGET_WRT_LAUNCH_PAD_NAME} PROPERTIES + LINK_FLAGS "-Wl,--as-needed -pie -Wl,--hash-style=both -Wl,--version-script=${PROJECT_SOURCE_DIR}/src/wrt-launchpad-daemon/${TARGET_WRT_LAUNCH_PAD_NAME}.map" + BUILD_WITH_INSTALL_RPATH ON + INSTALL_RPATH_USE_LINK_PATH ON +) + +#install +INSTALL(TARGETS ${TARGET_WRT_LAUNCH_PAD_NAME} DESTINATION bin) +IF(PRODUCT_FEATURE_WRT_LITE) + IF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt_one_ui.in + ${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt.txt) + ELSE(WRT_ENABLE_ONE_UI_PROCESS_MODEL) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt_lite.in + ${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt.txt) + ENDIF(WRT_ENABLE_ONE_UI_PROCESS_MODEL) +ELSE(PRODUCT_FEATURE_WRT_LITE) +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt.in + ${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt.txt) +ENDIF(PRODUCT_FEATURE_WRT_LITE) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/preload_list_wrt.txt DESTINATION /usr/share/aul) diff --git a/src/wrt-launchpad-daemon/data/preload_list_wrt.in b/src/wrt-launchpad-daemon/data/preload_list_wrt.in new file mode 100644 index 0000000..52d38bc --- /dev/null +++ b/src/wrt-launchpad-daemon/data/preload_list_wrt.in @@ -0,0 +1,17 @@ +/usr/lib/libappcore-efl.so.1 +/usr/lib/libappcore-common.so.1 +/usr/lib/ecore/immodules/libisf-imf-module.so +/usr/bin/wrt-client +/usr/lib/libwrt-injected-bundle.so +/usr/lib/wrt-plugins/w3c-widget-interface/libwrt-plugins-w3c-widget-interface.so +/usr/lib/wrt-plugins/tizen-tizen/libwrt-plugins-tizen-tizen.so +/usr/lib/wrt-plugins/mfc/libwrt-plugins-mfc.so +/usr/lib/wrt-plugins/samsung-samsung/libwrt-plugins-samsung-samsung.so +/usr/lib/wrt-plugins/sec-webapis/libwrt-plugins-sec-webapis.so +/usr/lib/wrt-plugins/tizen-datacontrol/libwrt-plugins-tizen-datacontrol.so +/usr/lib/wrt-plugins/tizen-application/libwrt-plugins-tizen-application.so +/usr/lib/wrt-plugins/tizen-filesystem/libwrt-plugins-tizen-filesystem.so +/usr/lib/wrt-plugins/tizen-timeutil/libwrt-plugins-tizen-timeutil.so +/usr/lib/wrt-plugins/tizen-systeminfo/libwrt-plugins-tizen-systeminfo.so +/usr/lib/wrt-plugins/tizen-messageport/libwrt-plugins-tizen-messageport.so +/usr/lib/wrt-plugins/tizen-calendar/libwrt-plugins-tizen-calendar.so diff --git a/src/wrt-launchpad-daemon/data/preload_list_wrt_lite.in b/src/wrt-launchpad-daemon/data/preload_list_wrt_lite.in new file mode 100644 index 0000000..1e2b849 --- /dev/null +++ b/src/wrt-launchpad-daemon/data/preload_list_wrt_lite.in @@ -0,0 +1,8 @@ +/usr/lib/libappcore-efl.so.1 +/usr/lib/libappcore-common.so.1 +/usr/lib/ecore/immodules/libisf-imf-module.so +/usr/bin/wrt-client +/usr/lib/libwrt-injected-bundle.so +/usr/lib/wrt-plugins/w3c-widget-interface/libwrt-plugins-w3c-widget-interface.so +/usr/lib/wrt-plugins/tizen-tizen/libwrt-plugins-tizen-tizen.so +/usr/lib/wrt-plugins/tizen-systeminfo/libwrt-plugins-tizen-systeminfo.so diff --git a/src/wrt-launchpad-daemon/data/preload_list_wrt_one_ui.in b/src/wrt-launchpad-daemon/data/preload_list_wrt_one_ui.in new file mode 100644 index 0000000..a974718 --- /dev/null +++ b/src/wrt-launchpad-daemon/data/preload_list_wrt_one_ui.in @@ -0,0 +1,4 @@ +/usr/lib/libappcore-efl.so.1 +/usr/lib/libappcore-common.so.1 +/usr/lib/ecore/immodules/libisf-imf-module.so +/usr/lib/libewebkit2.so diff --git a/src/wrt-launchpad-daemon/include/access_control.h b/src/wrt-launchpad-daemon/include/access_control.h new file mode 100644 index 0000000..929a5fa --- /dev/null +++ b/src/wrt-launchpad-daemon/include/access_control.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ACCESS_CONTROL_H_ +#define ACCESS_CONTROL_H_ + +namespace AccessControl { +int setPriviledge(const char* pkg_name, const char* pkg_type, const char* app_path); +int setWLDPrivilege(void); +int setWLDCapability(void); +} // namespace AccessControl + +#endif //ACCESS_CONTROL_H_ + diff --git a/src/wrt-launchpad-daemon/include/app_signal.h b/src/wrt-launchpad-daemon/include/app_signal.h new file mode 100644 index 0000000..70bc099 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/app_signal.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __APP_DBUS_H__ +#define __APP_DBUS_H__ + +#include +#include +#include + +#define AUL_DBUS_PATH "/aul/dbus_handler" +#define AUL_DBUS_SIGNAL_INTERFACE "org.tizen.aul.signal" +#define AUL_DBUS_APPDEAD_SIGNAL "app_dead" +#define AUL_DBUS_APPLAUNCH_SIGNAL "app_launch" + +#endif diff --git a/src/wrt-launchpad-daemon/include/app_sock.h b/src/wrt-launchpad-daemon/include/app_sock.h new file mode 100644 index 0000000..b10a709 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/app_sock.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __APP_PKT_H_ +#define __APP_PKT_H_ + +#include +#ifndef __USE_GNU +#define __USE_GNU +#endif +#include +#include + +// forward declare +struct ucred; + +enum app_cmd { + APP_START, + APP_OPEN, + APP_RESUME, + APP_RESUME_BY_PID, + APP_TERM_BY_PID, + APP_RESULT, + APP_START_RES, + APP_CANCEL, + APP_KILL_BY_PID, + APP_ADD_HISTORY, + APP_RUNNING_INFO, + APP_RUNNING_INFO_MEMORY, + APP_RUNNING_INFO_RESULT, + APP_IS_RUNNING, + APP_GET_APPID_BYPID, + APP_GET_PKGID_BYPID, + APP_GET_INFO_OK, + APP_GET_INFO_ERROR, + APP_KEY_EVENT, + APP_KEY_RESERVE, + APP_KEY_RELEASE, + APP_STATUS_UPDATE, + APP_RELEASED, + APP_RUNNING_LIST_UPDATE, + APP_TERM_REQ_BY_PID, + APP_START_ASYNC +}; + +#define AUL_SOCK_PREFIX "/tmp/alaunch" +#define AUL_SOCK_MAXBUFF 65535 +#define LAUNCHPAD_PID -1 +#define WRT_LAUNCHPAD_PID -3 +#define ELOCALLAUNCH_ID 128 + +typedef struct _app_pkt_t { + int cmd; + int len; + unsigned char data[1]; +} app_pkt_t; + +int __create_server_sock(int pid); +int __create_client_sock(int pid); +int __app_send_raw(int pid, int cmd, unsigned char *kb_data, int datalen); +int __app_send_result_to_launchpad(int fd, int res); +app_pkt_t *__app_recv_raw(int fd, int *clifd, struct ucred *cr); +app_pkt_t *__app_send_cmd_with_result(int pid, int cmd); + +#endif + diff --git a/src/wrt-launchpad-daemon/include/config.h b/src/wrt-launchpad-daemon/include/config.h new file mode 100644 index 0000000..355de2f --- /dev/null +++ b/src/wrt-launchpad-daemon/include/config.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LAUNCHPAD_CONFIG_H_ +#define __LAUNCHPAD_CONFIG_H_ + +#define DAC_ACTIVATE +#define PRELOAD_ACTIVATE +#define PREEXEC_ACTIVATE +/*#define GL_ACTIVATE*/ +/*#define HEAPDGB_ACTIVATE*/ +/*#define PERF_ACTIVATE*/ + +#endif // __LAUNCHPAD_CONFIG_H_ diff --git a/src/wrt-launchpad-daemon/include/execute_on_whole_thread_util.h b/src/wrt-launchpad-daemon/include/execute_on_whole_thread_util.h new file mode 100644 index 0000000..fde4e68 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/execute_on_whole_thread_util.h @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file execute_on_whole_thread_util.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 1.0 + */ + +#ifndef __EXECUTE_ON_WHOLE_THREAD_UTIL_H__ +#define __EXECUTE_ON_WHOLE_THREAD_UTIL_H__ + +#include +#include +#include +#include +#include + +// define +#define _EXEC_FILE_MAX_LEN 1024 +#define _EXEC_MAX_RETRY_CNT 1000 + +// typedef +typedef void (*exec_func_t)(); + +// static variable +static exec_func_t _s_exec_func = NULL; +static sighandler_t _s_prev_handler = NULL; +static int _s_exec_waiting_task_cnt = 0; + +// internal function +static void _exec_signal_handler(int signum) +{ + (void) signum; + + if (_s_exec_func) + { + _s_exec_func(); + } + + _s_exec_waiting_task_cnt--; +} + +static int _set_exec_signal_handler(int signum) +{ + sighandler_t ret; + + ret = signal(signum, _exec_signal_handler); + + if (ret == SIG_ERR) + { + return -1; + } + else + { + _s_prev_handler = ret; + } + + return 0; +} + +static int _restore_signal_handler(int signum) +{ + if (_s_prev_handler) + { + if (signal(signum, _s_prev_handler) == SIG_ERR) + { + return -1; + } + + _s_prev_handler = NULL; + } + else + { + if (signal(signum, SIG_DFL) == SIG_ERR) + { + return -1; + } + } + + return 0; +} + +static int _send_signal_to_whole_thread(int signum) +{ + int ret; + DIR *dir; + struct dirent entry, *result; + char proc_self_task_path[_EXEC_FILE_MAX_LEN + 1] = {0, }; + + sprintf(proc_self_task_path, "/proc/self/task"); + + dir = opendir(proc_self_task_path); + + if (dir) + { + for (ret = readdir_r(dir, &entry, &result); + result != NULL && ret == 0; + ret = readdir_r(dir, &entry, &result)) + { + if (strncmp(entry.d_name, ".", 2) == 0 || + strncmp(entry.d_name, "..", 3) == 0) + { + continue; + } + + _s_exec_waiting_task_cnt++; + if (syscall(__NR_tkill, atoi(entry.d_name), signum) != 0) + { + // syscall failed + _s_exec_waiting_task_cnt--; + } + } + + closedir(dir); + } + else + { + return -1; + } + + return 0; +} + +static int _is_main_thread() +{ + int pid = getpid(); + int tid = syscall(__NR_gettid); + + return (pid == tid); +} + +static int _waiting_for_done() +{ + int i; + + for (i=0; _s_exec_waiting_task_cnt && i < _EXEC_MAX_RETRY_CNT; i++) + { + usleep(100); // 0.1ms + } + + if (i == _EXEC_MAX_RETRY_CNT) + { + // time over + return -1; + } + + return 0; +} + +// external API +int EXECUTE_ON_WHOLE_THREAD(exec_func_t exec_func, int using_signum) +{ + int signum; + + assert(_s_exec_waiting_task_cnt == 0 && exec_func != NULL); + assert(using_signum == SIGUSR1 || using_signum == SIGUSR2); + + // check main thread + if (!_is_main_thread()) + { + return -1; + } + + signum = using_signum; + _s_exec_func = exec_func; + + // set signal handler + if (_set_exec_signal_handler(signum) != 0) + { + goto onerr_EXECUTE_ON_WHOLE_THREAD; + } + + // send signal + if (_send_signal_to_whole_thread(signum) != 0) + { + goto onerr_EXECUTE_ON_WHOLE_THREAD; + } + + // waiting + if (_waiting_for_done() != 0) + { + goto onerr_EXECUTE_ON_WHOLE_THREAD; + } + + // restore signal handler to previous + _restore_signal_handler(signum); + _s_exec_waiting_task_cnt = 0; + _s_exec_func = NULL; + _s_prev_handler = NULL; + + return 0; + + +onerr_EXECUTE_ON_WHOLE_THREAD: + _restore_signal_handler(signum); + _s_exec_waiting_task_cnt = 0; + _s_exec_func = NULL; + _s_prev_handler = NULL; + + return -1; +} + +#endif // __EXECUTE_ON_WHOLE_THREAD_UTIL_H__ diff --git a/src/wrt-launchpad-daemon/include/launchpad_util.h b/src/wrt-launchpad-daemon/include/launchpad_util.h new file mode 100755 index 0000000..af40a53 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/launchpad_util.h @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file launchpad_util.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief Api library to support launchpad operation. + */ + +#ifndef __LAUNCHPAD_UTIL_H_ +#define __LAUNCHPAD_UTIL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "app_sock.h" +#include "menu_db_util.h" +#include "simple_util.h" +#include "access_control.h" + +#define _static_ static inline +#define WRT_AUL_PR_NAME 16 +#define PKG_ID_LENGTH 11 +#define SDK_CODE_COVERAGE "CODE_COVERAGE" +#define SDK_DYNAMIC_ANALYSIS "DYNAMIC_ANALYSIS" +#define PATH_DA_SO "/home/developer/sdk_tools/da/da_probe.so" +#define PATH_APP_ROOT "/opt/usr/apps" +#define PATH_DATA "/data" + +// Prototype +_static_ char** __create_argc_argv(bundle * kb, int *margc); +_static_ void __set_sdk_env(app_info_from_db* menu_info, char* str); +_static_ int __parser(const char *arg, char *out, int out_size); +_static_ void __modify_bundle(bundle * kb, int caller_pid, app_info_from_db * menu_info, int cmd); +_static_ void __set_env(app_info_from_db * menu_info, bundle * kb); +_static_ void __set_inherit_bit_for_CAP_MAC_ADMIN(); + +// Implementation +_static_ char** __create_argc_argv(bundle * kb, int *margc) +{ + char **argv; + int argc; + + argc = bundle_export_to_argv(kb, &argv); + + *margc = argc; + return argv; +} + +_static_ void __set_sdk_env(app_info_from_db* menu_info, char* str) +{ + char buf[MAX_LOCAL_BUFSZ]; + int ret; + + WrtLogD("key : %s / value : %s", AUL_K_SDK, str); + /* http://gcc.gnu.org/onlinedocs/gcc/Cross_002dprofiling.html*/ + /* GCOV_PREFIX contains the prefix to add to the absolute paths in the + *object file. */ + /* Prefix can be absolute, or relative. The default is no prefix. + * */ + /* GCOV_PREFIX_STRIP indicates the how many initial directory names */ + /* to stripoff the hardwired absolute paths. Default value is 0. */ + if (strncmp(str, SDK_CODE_COVERAGE, strlen(str)) == 0) { + snprintf(buf, + MAX_LOCAL_BUFSZ, + PATH_APP_ROOT "/%s"PATH_DATA, + _get_pkgname(menu_info)); + ret = setenv("GCOV_PREFIX", buf, 1); + WrtLogD("GCOV_PREFIX : %d", ret); + ret = setenv("GCOV_PREFIX_STRIP", "4096", 1); + WrtLogD("GCOV_PREFIX_STRIP : %d", ret); + } else if (strncmp(str, SDK_DYNAMIC_ANALYSIS, strlen(str)) == 0) { + ret = setenv("LD_PRELOAD", PATH_DA_SO, 1); + WrtLogD("LD_PRELOAD : %d", ret); + } +} + + +/* + * Parsing original app path to retrieve default bundle + * + * -1 : Invalid sequence + * -2 : Buffer overflow + * + */ +_static_ int __parser(const char *arg, char *out, int out_size) +{ + register int i; + int state = 1; + char *start_out = out; + + if (arg == NULL || out == NULL) { + /* Handles null buffer*/ + return 0; + } + + for (i = 0; out_size > 1; i++) { + switch (state) { + case 1: + switch (arg[i]) { + case ' ': + case '\t': + state = 5; + break; + case '\0': + state = 7; + break; + case '\"': + state = 2; + break; + case '\\': + state = 4; + break; + default: + *out = arg[i]; + out++; + out_size--; + break; + } + break; + case 2: /* escape start*/ + switch (arg[i]) { + case '\0': + state = 6; + break; + case '\"': + state = 1; + break; + default: + *out = arg[i]; + out++; + out_size--; + break; + } + break; + case 4: /* character escape*/ + if (arg[i] == '\0') { + state = 6; + } else { + *out = arg[i]; + out++; + out_size--; + state = 1; + } + break; + case 5: /* token*/ + if (out != start_out) { + *out = '\0'; + out_size--; + return i; + } + i--; + state = 1; + break; + case 6: + return -1; /* error*/ + case 7: /* terminate*/ + *out = '\0'; + out_size--; + return 0; + default: + state = 6; + break; /* error*/ + } + } + + if (out_size == 1) { + *out = '\0'; + } + /* Buffer overflow*/ + return -2; +} + + +_static_ void __modify_bundle(bundle * kb, int caller_pid, + app_info_from_db * menu_info, int cmd) +{ + // warning: unused parameter + (void) caller_pid; + +#if !ENABLE(ONE_UI_PROCESS_MODEL) + bundle_del(kb, AUL_K_PKG_NAME); +#endif + bundle_del(kb, AUL_K_EXEC); + bundle_del(kb, AUL_K_PACKAGETYPE); + bundle_del(kb, AUL_K_HWACC); + + /* Parse app_path to retrieve default bundle*/ + if (cmd == APP_START || cmd == APP_START_RES || cmd == APP_OPEN || cmd == + APP_RESUME) + { + char *ptr; + char exe[MAX_PATH_LEN]; + int flag; + + ptr = _get_original_app_path(menu_info); + + flag = __parser(ptr, exe, sizeof(exe)); + if (flag > 0) { + char key[256]; + char value[256]; + + ptr += flag; + WrtLogD("parsing app_path: EXEC - %s\n", exe); + + do { + flag = __parser(ptr, key, sizeof(key)); + if (flag <= 0) { + break; + } + ptr += flag; + + flag = __parser(ptr, value, sizeof(value)); + if (flag < 0) { + break; + } + ptr += flag; + + /*bundle_del(kb, key);*/ + bundle_add(kb, key, value); + } while (flag > 0); + } else if (flag == 0) { + WrtLogD("parsing app_path: No arguments\n"); + } else { + WrtLogD("parsing app_path: Invalid argument\n"); + } + } +} + +_static_ void __set_env(app_info_from_db * menu_info, bundle * kb) +{ + const char *str; + const char **str_array; + int len; + int i; + + if (menu_info->pkg_name == NULL) { + WrtLogE("menu_info's pkg_name is null"); + return; + } + + setenv("PKG_NAME", _get_pkgname(menu_info), 1); + + str = bundle_get_val(kb, AUL_K_STARTTIME); + if (str != NULL) { + setenv("APP_START_TIME", str, 1); + } + + if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) { + str_array = bundle_get_str_array(kb, AUL_K_SDK, &len); + if (str_array != NULL) { + for (i = 0; i < len; i++) { + WrtLogD("index : [%d]", i); + __set_sdk_env(menu_info, (char *)str_array[i]); + } + } + } else { + str = bundle_get_val(kb, AUL_K_SDK); + if (str != NULL) { + __set_sdk_env(menu_info, (char *)str); + } + } + if (menu_info->hwacc != NULL) { + setenv("HWACC", menu_info->hwacc, 1); + } +} + +_static_ void __set_inherit_bit_for_CAP_MAC_ADMIN() +{ + cap_t caps = NULL; + cap_value_t target_caps[] = { CAP_MAC_ADMIN }; + + caps = cap_init(); + + if (caps == NULL) { + goto err_set_inherit_bit_for_CAP_MAC_ADMIN; + } + + if (cap_set_flag(caps, CAP_INHERITABLE, + sizeof(target_caps)/sizeof(cap_value_t), + target_caps, CAP_SET)) { + WrtLogE("cap_set_flag() failed!! : %s", strerror(errno)); + goto err_set_inherit_bit_for_CAP_MAC_ADMIN; + } + + if (cap_set_proc(caps)) { + WrtLogE("cap_set_proc() failed!! : %s", strerror(errno)); + goto err_set_inherit_bit_for_CAP_MAC_ADMIN; + } + + if (cap_free(caps)) { + WrtLogE("cap_free() failed!!"); + } + + return; + +err_set_inherit_bit_for_CAP_MAC_ADMIN: + if (caps != NULL) { + cap_free(caps); + } + + return; +} + +#endif // __LAUNCHPAD_UTIL_H_ diff --git a/src/wrt-launchpad-daemon/include/menu_db_util.h b/src/wrt-launchpad-daemon/include/menu_db_util.h new file mode 100644 index 0000000..7d56233 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/menu_db_util.h @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MENU_DB_UTIL_H_ +#define __MENU_DB_UTIL_H_ + +#include +#include +#include "simple_util.h" + +#define MAX_PATH_LEN 1024 + +#define AUL_APP_INFO_FLD_PKG_NAME "package" +#define AUL_APP_INFO_FLD_APP_PATH "exec" +#define AUL_APP_INFO_FLD_APP_TYPE "x_slp_packagetype" +#define AUL_APP_INFO_FLD_WIDTH "x_slp_baselayoutwidth" +#define AUL_APP_INFO_FLD_HEIGHT "x_slp_baselayoutheight" +#define AUL_APP_INFO_FLD_VERTICAL "x_slp_ishorizontalscale" +#define AUL_APP_INFO_FLD_MULTIPLE "x_slp_multiple" +#define AUL_APP_INFO_FLD_TASK_MANAGE "x_slp_taskmanage" +#define AUL_APP_INFO_FLD_MIMETYPE "mimetype" +#define AUL_APP_INFO_FLD_SERVICE "x_slp_service" + +#define AUL_RETRIEVE_PKG_NAME "package = '?'" +#define AUL_RETRIEVE_APP_PATH "exec = '?'" +#define AUL_RETRIEVE_MIMETYPE "mimetype like '?'" +#define AUL_RETRIEVE_SERVICE "x_slp_service like '?'" + +typedef struct { + char *pkg_name; /* package */ + char *app_path; /* exec */ + char *original_app_path; /* exec */ + char *pkg_type; /* x_slp_packagetype */ + char *hwacc; /* hwacceleration */ +} app_info_from_db; + +static inline char *_get_pkgname(app_info_from_db *menu_info) +{ + if (menu_info->pkg_name == NULL) { + return NULL; + } + return menu_info->pkg_name; +} + +static inline char *_get_app_path(app_info_from_db *menu_info) +{ + int i = 0; + int path_len = -1; + + if (menu_info->app_path == NULL) { + return NULL; + } + + while (menu_info->app_path[i] != 0) { + if (menu_info->app_path[i] == ' ' + || menu_info->app_path[i] == '\t') + { + path_len = i; + break; + } + i++; + } + + if (path_len == 0) { + free(menu_info->app_path); + menu_info->app_path = NULL; + } else if (path_len > 0) { + char *tmp_app_path = (char *)malloc(sizeof(char) * (path_len + 1)); + if (tmp_app_path == NULL) { + return NULL; + } + snprintf(tmp_app_path, path_len + 1, "%s", menu_info->app_path); + free(menu_info->app_path); + menu_info->app_path = tmp_app_path; + } + + return menu_info->app_path; +} + +static inline char *_get_original_app_path(app_info_from_db *menu_info) +{ + if (menu_info->original_app_path == NULL) { + return NULL; + } + return menu_info->original_app_path; +} + +static inline void _free_app_info_from_db(app_info_from_db *menu_info) +{ + if (menu_info != NULL) { + if (menu_info->pkg_name != NULL) { + free(menu_info->pkg_name); + } + if (menu_info->app_path != NULL) { + free(menu_info->app_path); + } + if (menu_info->original_app_path != NULL) { + free(menu_info->original_app_path); + } + if (menu_info->hwacc != NULL) { + free(menu_info->hwacc); + } + free(menu_info); + } +} + +static inline app_info_from_db *_get_app_info_from_db_by_pkgname( + const char *pkgname) +{ + app_info_from_db *menu_info; + ail_appinfo_h handle; + ail_error_e ret; + char *str = NULL; + + menu_info = (app_info_from_db *)calloc(1, sizeof(app_info_from_db)); + if (menu_info == NULL) { + return NULL; + } + + ret = ail_get_appinfo(pkgname, &handle); + if (ret != AIL_ERROR_OK) { + _free_app_info_from_db(menu_info); + return NULL; + } + + ret = ail_appinfo_get_str(handle, AIL_PROP_PACKAGE_STR, &str); + if (str) { + menu_info->pkg_name = strdup(str); + str = NULL; + } + + ret = ail_appinfo_get_str(handle, AIL_PROP_EXEC_STR, &str); + if (str) { + menu_info->app_path = strdup(str); + str = NULL; + } + + if (menu_info->app_path != NULL) { + menu_info->original_app_path = strdup(menu_info->app_path); + } + + ret = ail_appinfo_get_str(handle, AIL_PROP_X_SLP_PACKAGETYPE_STR, &str); + if (str) { + menu_info->pkg_type = strdup(str); + str = NULL; + } + + ret = ail_destroy_appinfo(handle); + if (ret != AIL_ERROR_OK) { + WrtLogE("ail_destroy_appinfo failed"); + } + + if (!_get_app_path(menu_info)) { + _free_app_info_from_db(menu_info); + return NULL; + } + + return menu_info; +} + +static inline ail_cb_ret_e __appinfo_func(const ail_appinfo_h appinfo, + void *user_data) +{ + app_info_from_db *menu_info = (app_info_from_db *)user_data; + char *package; + + ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package); + + menu_info->pkg_name = strdup(package); + + return AIL_CB_RET_CANCEL; /*return AIL_CB_RET_CONTINUE;*/ +} + +static inline app_info_from_db *_get_app_info_from_db_by_apppath( + const char *apppath) +{ + app_info_from_db *menu_info = NULL; + ail_filter_h filter; + ail_error_e ret; + int count; + + if (apppath == NULL) { + return NULL; + } + + menu_info = (app_info_from_db *)calloc(1, sizeof(app_info_from_db)); + if (menu_info == NULL) { + return NULL; + } + + ret = ail_filter_new(&filter); + if (ret != AIL_ERROR_OK) { + _free_app_info_from_db(menu_info); + return NULL; + } + + ret = ail_filter_add_str(filter, AIL_PROP_X_SLP_EXE_PATH, apppath); + if (ret != AIL_ERROR_OK) { + ail_filter_destroy(filter); + _free_app_info_from_db(menu_info); + return NULL; + } + + ret = ail_filter_count_appinfo(filter, &count); + if (ret != AIL_ERROR_OK) { + ail_filter_destroy(filter); + _free_app_info_from_db(menu_info); + return NULL; + } + if (count < 1) { + ail_filter_destroy(filter); + _free_app_info_from_db(menu_info); + return NULL; + } + + ail_filter_list_appinfo_foreach(filter, __appinfo_func, (void *)menu_info); + + ail_filter_destroy(filter); + + menu_info->app_path = strdup(apppath); + menu_info->original_app_path = strdup(apppath); + + return menu_info; +} + + +static inline app_info_from_db *_get_app_info_from_bundle_by_pkgname( + const char *pkgname, bundle *kb) +{ + app_info_from_db *menu_info; + + menu_info = (app_info_from_db*)calloc(1, sizeof(app_info_from_db)); + if (menu_info == NULL) { + return NULL; + } + + menu_info->pkg_name = strdup(pkgname); + menu_info->app_path = strdup(bundle_get_val(kb, AUL_K_EXEC)); + if (menu_info->app_path != NULL) { + menu_info->original_app_path = strdup(menu_info->app_path); + } + menu_info->pkg_type = strdup(bundle_get_val(kb, AUL_K_PACKAGETYPE)); + menu_info->hwacc = strdup(bundle_get_val(kb, AUL_K_HWACC)); + + if (!_get_app_path(menu_info)) { + _free_app_info_from_db(menu_info); + return NULL; + } + + return menu_info; +} +#endif //__MENU_DB_UTIL_H_ diff --git a/src/wrt-launchpad-daemon/include/pre_launching.h b/src/wrt-launchpad-daemon/include/pre_launching.h new file mode 100644 index 0000000..db9ab38 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/pre_launching.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file pre_launching.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 1.0 + * @brief wrt pre-launching model api prototypes + */ + +#ifndef __PRE_LAUNCHING_H_ +#define __PRE_LAUNCHING_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif //__cplusplus + +void pre_launch_webapps(); +void add_to_pre_launching_info_list(const char* app_id, int pid); +int re_pre_launch_by_pid(int pid, bool isCrashed); +int is_pre_launching_appid(const char* app_id); + +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif //__PRE_LAUNCHING_H_ + diff --git a/src/wrt-launchpad-daemon/include/preexec.h b/src/wrt-launchpad-daemon/include/preexec.h new file mode 100644 index 0000000..02f7114 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/preexec.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef PREEXEC_ACTIVATE + +#include +#include +#define PREEXEC_FILE SHARE_PREFIX "/preexec_list.txt" + +static int preexec_initialized = 0; + +GSList *preexec_list = NULL; + +typedef struct _preexec_list_t { + char *pkg_type; + char *so_path; + int (*dl_do_pre_exe)(char *, char *); + void *handle; +} preexec_list_t; + +static void __preexec_list_free() +{ + GSList *iter = NULL; + preexec_list_t *type_t; + + for (iter = preexec_list; iter != NULL; iter = g_slist_next(iter)) { + type_t = static_cast(iter->data); + if (type_t) { + if (type_t->pkg_type) { + free(type_t->pkg_type); + } + if (type_t->so_path) { + free(type_t->so_path); + } + if (type_t->handle) { + dlclose(type_t->handle); + } + free(type_t); + } + } + g_slist_free(preexec_list); + return; +} + +static inline void __preexec_init(int argc, char **argv) +{ + void *handle = NULL; + FILE *preexec_file; + char *saveptr = NULL; + char line[MAX_LOCAL_BUFSZ] = { 0, }; + char *type = NULL; + char *sopath = NULL; + char *symbol = NULL; + int (*func)(char *, char *) = NULL; + preexec_list_t *type_t = NULL; + + // warning: unused parameter + argc = argc; + argv = argv; + + preexec_file = fopen(PREEXEC_FILE, "rt"); + if (preexec_file == NULL) { + WrtLogE("no preexec\n"); + return; + } + + WrtLogD("preexec start\n"); + + while (fgets(line, MAX_LOCAL_BUFSZ, preexec_file) > (char*)0) { + /* Parse each line */ + if (line[0] == '#' || line[0] == '\0') { + continue; + } + + type = strtok_r(line, ":\f\n\r\t\v ", &saveptr); + if (type == NULL) { + continue; + } + sopath = strtok_r(NULL, ",\f\n\r\t\v ", &saveptr); + if (sopath == NULL) { + continue; + } + symbol = strtok_r(NULL, ",\f\n\r\t\v ", &saveptr); + if (symbol == NULL) { + continue; + } + + type_t = (preexec_list_t *) calloc(1, sizeof(preexec_list_t)); + if (type_t == NULL) { + WrtLogE("no available memory\n"); + __preexec_list_free(); + fclose(preexec_file); + return; + } + + handle = dlopen(sopath, RTLD_NOW); + if (handle == NULL) { + free(type_t); + continue; + } + WrtLogD("preexec %s %s# - handle : %p\n", type, sopath, handle); + + func = reinterpret_cast(dlsym(handle, symbol)); + if (func == NULL) { + WrtLogE("failed to get symbol type:%s path:%s\n", + type, sopath); + free(type_t); + dlclose(handle); + handle = NULL; + continue; + } + + type_t->pkg_type = strdup(type); + if (type_t->pkg_type == NULL) { + WrtLogE("no available memory\n"); + free(type_t); + dlclose(handle); + handle = NULL; + __preexec_list_free(); + fclose(preexec_file); + return; + } + type_t->so_path = strdup(sopath); + if (type_t->so_path == NULL) { + WrtLogE("no available memory\n"); + free(type_t->pkg_type); + free(type_t); + dlclose(handle); + handle = NULL; + __preexec_list_free(); + fclose(preexec_file); + return; + } + type_t->handle = handle; + type_t->dl_do_pre_exe = func; + + preexec_list = g_slist_append(preexec_list, (void *)type_t); + } + + fclose(preexec_file); + preexec_initialized = 1; +} + +static inline void __preexec_run(const char *pkg_type, const char *pkg_name, + const char *app_path) +{ + GSList *iter = NULL; + preexec_list_t *type_t; + + if (!preexec_initialized) { + return; + } + + for (iter = preexec_list; iter != NULL; iter = g_slist_next(iter)) { + type_t = static_cast(iter->data); + if (type_t) { + if (!strcmp(pkg_type, type_t->pkg_type)) { + if (type_t->dl_do_pre_exe != NULL) { + type_t->dl_do_pre_exe((char *)pkg_name, + (char *)app_path); + WrtLogD("called dl_do_pre_exe() type: %s", + pkg_type); + } else { + WrtLogE("no symbol for this type: %s", + pkg_type); + } + } + } + } +} + +#else + +static inline void __preexec_init(int argc, char **argv) +{} + +static inline void __preexec_run(const char *pkg_type, const char *pkg_name, + const char *app_path) +{} + +#endif diff --git a/src/wrt-launchpad-daemon/include/preload.h b/src/wrt-launchpad-daemon/include/preload.h new file mode 100644 index 0000000..86b9961 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/preload.h @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef PRELOAD_ACTIVATE + +#include + +#define PRELOAD_FILE SHARE_PREFIX "/preload_list.txt" +#define PRELOAD_FILE_WRT SHARE_PREFIX "/preload_list_wrt.txt" + +#define EFL_PREINIT_FUNC "elm_quicklaunch_init" +#define EFL_SHUTDOWN_FUNC "elm_quicklaunch_shutdown" + +static int preload_initialized = 0; +static int g_argc; +static char **g_argv; +static size_t max_cmdline_size = 0; + +typedef struct handle_list_t { + int (*dl_einit)(); + int (*dl_efini)(); + void *handle; +} handle_list_t; + +static inline void __preload_init(int argc, char **argv) +{ + int i; + + g_argc = argc; + g_argv = argv; + for (i = 0; i < argc; i++) { + max_cmdline_size += (strlen(argv[i]) + 1); + } + WrtLogD("max_cmdline_size = %d", max_cmdline_size); + + preload_initialized = 1; +} + +/* TODO : how to set cmdline gracefully ?? */ +static inline int __change_cmdline(char *cmdline) +{ + if (strlen(cmdline) > max_cmdline_size + 1) { + WrtLogE("cmdline exceed max size : %d", max_cmdline_size); + return -1; + } + + memset(g_argv[0], '\0', max_cmdline_size); + snprintf(g_argv[0], max_cmdline_size, "%s", cmdline); + + return 0; +} + +static inline void __preload_exec(int argc, char **argv) +{ + void *handle = NULL; + int (*dl_main)(int, char **); + + if (!preload_initialized) { + return; + } + + handle = dlopen(argv[0], RTLD_LAZY | RTLD_GLOBAL); + if (handle == NULL) { + WrtLogE("dlopen failed. bad preloaded app - check fpie pie"); + return; + } + + dl_main = reinterpret_cast(dlsym(handle, "main")); + if (dl_main != NULL) { +#ifndef NATIVE_LAUNCHPAD + /* do nothing */ +#else + if (__change_cmdline(argv[0]) < 0) { + WrtLogE("change cmdline fail"); + return; + } +#endif + dl_main(argc, argv); + } else { + WrtLogE("dlsym not founded. bad preloaded app - check fpie pie"); + } + + exit(0); +} + +static int g_wrt_dlopen_size = 5; +static int g_wrt_dlopen_count = 0; +static void** g_wrt_dlopen_handle_list = NULL; + +static inline int __preload_save_dlopen_handle(void *handle) +{ + if (!handle) { + return 1; + } + if (g_wrt_dlopen_count == g_wrt_dlopen_size || !g_wrt_dlopen_handle_list) { + void** tmp = static_cast(realloc(g_wrt_dlopen_handle_list, 2 * g_wrt_dlopen_size * sizeof(void *))); + if (NULL == tmp) { + WrtLogE("out of memory\n"); + dlclose(handle); + return 1; + } + g_wrt_dlopen_size *= 2; + g_wrt_dlopen_handle_list = tmp; + } + g_wrt_dlopen_handle_list[g_wrt_dlopen_count++] = handle; + return 0; +} + +static inline void __preload_fini_for_wrt() +{ + int i = 0; + if (!g_wrt_dlopen_handle_list) { + return; + } + for (i = 0; i < g_wrt_dlopen_count; ++i) + { + void *handle = g_wrt_dlopen_handle_list[i]; + if (handle) { + if (0 != dlclose(handle)) { + WrtLogE("dlclose failed\n"); + } + } + } + free(g_wrt_dlopen_handle_list); + g_wrt_dlopen_handle_list = NULL; + g_wrt_dlopen_size = 5; + g_wrt_dlopen_count = 0; +} + +static inline void __preload_init_for_wrt() +{ + if (0 != atexit(__preload_fini_for_wrt)) { + WrtLogE("Cannot register atexit callback. Libraries will not be unloaded"); + } + void *handle = NULL; + FILE *preload_list; + char *soname =(char*)malloc(sizeof(char)*MAX_LOCAL_BUFSZ); + char soname_untaint[MAX_LOCAL_BUFSZ] = {0}; + + if (!soname) { + WrtLogE("Error allocating mem for soname\n"); + return; + } + + preload_list = fopen(PRELOAD_FILE_WRT, "rt"); + if (preload_list == NULL) { + WrtLogE("no wrt preload\n"); + free(soname); + return; + } + + while (fgets(soname, MAX_LOCAL_BUFSZ, preload_list) != NULL) { + strcpy(soname_untaint,soname); + memset(soname,'\0',MAX_LOCAL_BUFSZ); + size_t len = strnlen(soname_untaint, MAX_LOCAL_BUFSZ); + if (len > 0) { + soname_untaint[len - 1] = '\0'; + } + handle = dlopen(soname_untaint, RTLD_NOW | RTLD_GLOBAL); + if (handle == NULL) { + WrtLogE("dlopen(\"%s\") was failed!", soname_untaint); + memset(soname_untaint,'\0',MAX_LOCAL_BUFSZ); + continue; + } + if (0 != __preload_save_dlopen_handle(handle)) { + WrtLogE("Cannot save handle, no more preloads"); + break; + } + WrtLogD("preload %s# - handle : %p\n", soname_untaint, handle); + memset(soname_untaint,'\0',MAX_LOCAL_BUFSZ); + } + + fclose(preload_list); + free(soname); +} + +#else + +static inline void __preload_init(int argc, char **argv); +static inline void __preload_exec(int argc, char **argv); +static inline void __preload_init_for_wrt(); + +#endif + diff --git a/src/wrt-launchpad-daemon/include/process_pool.h b/src/wrt-launchpad-daemon/include/process_pool.h new file mode 100644 index 0000000..4a1ed38 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/process_pool.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file process_pool.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief process pool socket api prototypes + */ + +#ifndef __PROCESS_POOL_H_ +#define __PROCESS_POOL_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif //__cplusplus + +#include + +int __create_process_pool_server(); +int __connect_process_pool_server(); +int __accept_dummy_process(int server_fd, int* out_client_fd, int* out_client_pid); +void __refuse_dummy_process(int server_fd); +int __send_pkt_raw_data(int client_fd, app_pkt_t* pkt); + +#ifdef __cplusplus +} +#endif //__cplusplus + +#endif //__PROCESS_POOL_H_ + diff --git a/src/wrt-launchpad-daemon/include/process_pool_launchpad_util.h b/src/wrt-launchpad-daemon/include/process_pool_launchpad_util.h new file mode 100644 index 0000000..979723b --- /dev/null +++ b/src/wrt-launchpad-daemon/include/process_pool_launchpad_util.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file process_pool_launchpad_util.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief Api library to support launchpad operation. + */ + +#ifndef __PROCESS_POOL_LAUNCHPAD_UTIL_H_ +#define __PROCESS_POOL_LAUNCHPAD_UTIL_H_ + +#include +#include +#include +#include + +// Prototype +_static_ int __process_pool_prepare_exec(const char *pkg_name, const char *app_path, app_info_from_db * menu_info, bundle * kb); +_static_ void process_pool_launchpad_main_loop(app_pkt_t* pkt, char* out_app_path, int* out_argc, char ***out_argv); + +// Implementation +_static_ int __process_pool_prepare_exec(const char *pkg_name, + const char *app_path, app_info_from_db * menu_info, + bundle * kb) +{ + const char *file_name; + char process_name[WRT_AUL_PR_NAME]; + + /* SET PRIVILEGES*/ + char pkg_id[PKG_ID_LENGTH]; + memset(pkg_id, '\0', PKG_ID_LENGTH); + snprintf(pkg_id, PKG_ID_LENGTH, "%s", pkg_name); + + if (set_app_smack_label(app_path) != 0) + { + WrtLogE("set_app_smack_label() failed"); + } + + if (AccessControl::setPriviledge(pkg_id, menu_info->pkg_type, app_path) < 0) { + WrtLogD("fail to set privileges - check your package's credential\n"); + return -1; + } + + /* SET INHERIT BIT FOR CAP_MAC_ADMIN TO WHOLE THREAD */ + EXECUTE_ON_WHOLE_THREAD(__set_inherit_bit_for_CAP_MAC_ADMIN, SIGUSR1); + + /* SET PROCESS NAME*/ + if (app_path == NULL) { + WrtLogD("app_path should not be NULL - check menu db"); + return -1; + } + file_name = strrchr(app_path, '/'); + if (file_name == NULL) { + WrtLogD("can't locate file name to execute"); + return -1; + } + + memset(process_name, '\0', WRT_AUL_PR_NAME); + snprintf(process_name, WRT_AUL_PR_NAME, "%s", file_name + 1); + prctl(PR_SET_NAME, process_name); + + /* SET ENVIROMENT*/ + __set_env(menu_info, kb); + + return 0; +} + + +static bundle *_s_bundle = NULL; +static void __at_exit_to_release_bundle() +{ + if (_s_bundle) { + bundle_free(_s_bundle); + _s_bundle = NULL; + } +} + +_static_ void process_pool_launchpad_main_loop(app_pkt_t* pkt, char* out_app_path, int* out_argc, char ***out_argv) + +{ + bundle *kb = NULL; + app_info_from_db *menu_info = NULL; + + const char *pkg_name = NULL; + const char *app_path = NULL; + + kb = bundle_decode(pkt->data, pkt->len); + if (!kb) { + WrtLogE("bundle decode error"); + exit(-1); + } + + if (_s_bundle != NULL) { + bundle_free(_s_bundle); + } + _s_bundle = kb; + atexit(__at_exit_to_release_bundle); + + pkg_name = bundle_get_val(kb, AUL_K_PKG_NAME); + SECURE_LOGD("pkg name : %s", pkg_name); + + menu_info = _get_app_info_from_bundle_by_pkgname(pkg_name, kb); + if (menu_info == NULL) { + WrtLogD("such pkg no found"); + exit(-1); + } + + app_path = _get_app_path(menu_info); + + if (app_path == NULL) { + WrtLogE("app_path is NULL"); + exit(-1); + } + + if (app_path[0] != '/') { + WrtLogE("app_path is not absolute path"); + exit(-1); + } + + __modify_bundle(kb, /*cr.pid - unused parameter*/ 0, menu_info, pkt->cmd); + pkg_name = _get_pkgname(menu_info); + SECURE_LOGD("pkg name : %s", pkg_name); + + __process_pool_prepare_exec(pkg_name, app_path, menu_info, kb); + + if (out_app_path != NULL && out_argc != NULL && out_argv != NULL) + { + int i; + + sprintf(out_app_path, "%s", app_path); + + *out_argv = __create_argc_argv(kb, out_argc); + (*out_argv)[0] = out_app_path; + + for (i = 0; i < *out_argc; i++) + { + WrtLogD("input argument %d : %s##", i, (*out_argv)[i]); + } + } + else + { + exit(-1); + } + + if (menu_info != NULL) { + _free_app_info_from_db(menu_info); + } +} + +#endif // __PROCESS_POOL_LAUNCHPAD_UTIL_H_ diff --git a/src/wrt-launchpad-daemon/include/sigchild.h b/src/wrt-launchpad-daemon/include/sigchild.h new file mode 100644 index 0000000..5f62b5f --- /dev/null +++ b/src/wrt-launchpad-daemon/include/sigchild.h @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SIG_CHILD_H +#define SIG_CHILD_H + +#include +#include + +#include + +#include "app_signal.h" +#if ENABLE(PRE_LAUNCH) +#include "pre_launching.h" +#endif + +static struct sigaction old_sigchild; +static DBusConnection *bus = NULL; +static sigset_t oldmask; + +static inline void __socket_garbage_collector() +{ + DIR *dp; + struct dirent dentry; + struct dirent *result; + char tmp[MAX_LOCAL_BUFSZ]; + + dp = opendir(AUL_SOCK_PREFIX); + if (dp == NULL) { + return; + } + + while (readdir_r(dp, &dentry, &result) == 0 && result != NULL) { + if (!isdigit(dentry.d_name[0])) { + continue; + } + + snprintf(tmp, MAX_LOCAL_BUFSZ, "/proc/%s", dentry.d_name); + if (access(tmp, F_OK) < 0) { /* Flawfinder: ignore */ + snprintf(tmp, MAX_LOCAL_BUFSZ, "%s/%s", AUL_SOCK_PREFIX, + dentry.d_name); + unlink(tmp); + continue; + } + } + closedir(dp); +} + +static inline int __send_app_dead_signal(int dead_pid) +{ + DBusMessage *message; + + if (bus == NULL) { + return -1; + } + + message = dbus_message_new_signal(AUL_DBUS_PATH, + AUL_DBUS_SIGNAL_INTERFACE, + AUL_DBUS_APPDEAD_SIGNAL); + + if (dbus_message_append_args(message, + DBUS_TYPE_UINT32, &dead_pid, + DBUS_TYPE_INVALID) == FALSE) + { + WrtLogE("Failed to load data error"); + return -1; + } + + if (dbus_connection_send(bus, message, NULL) == FALSE) { + WrtLogE("dbus send error"); + return -1; + } + + dbus_connection_flush(bus); + dbus_message_unref(message); + + WrtLogD("send dead signal done\n"); + + return 0; +} + +static inline int __send_app_launch_signal(int launch_pid) +{ + DBusMessage *message; + + if (bus == NULL) { + return -1; + } + + message = dbus_message_new_signal(AUL_DBUS_PATH, + AUL_DBUS_SIGNAL_INTERFACE, + AUL_DBUS_APPLAUNCH_SIGNAL); + + if (dbus_message_append_args(message, + DBUS_TYPE_UINT32, &launch_pid, + DBUS_TYPE_INVALID) == FALSE) + { + WrtLogE("Failed to load data error"); + return -1; + } + + if (dbus_connection_send(bus, message, NULL) == FALSE) { + WrtLogE("dbus send error"); + return -1; + } + + dbus_connection_flush(bus); + dbus_message_unref(message); + + WrtLogD("send launch signal done\n"); + + return 0; +} + +static int __sigchild_action(void *data) +{ + pid_t dead_pid; + char buf[MAX_LOCAL_BUFSZ]; + + dead_pid = (pid_t) data; + if (dead_pid <= 0) { + goto end; + } + + __send_app_dead_signal(dead_pid); + + snprintf(buf, MAX_LOCAL_BUFSZ, "%s/%d", AUL_SOCK_PREFIX, dead_pid); + unlink(buf); + + __socket_garbage_collector(); +end: + return 0; +} + +static void __launchpad_sig_child(int signo, siginfo_t *info, void *data) +{ + int status; + pid_t child_pid; + pid_t child_pgid; + + // warning: unused parameter + (void)signo; + (void)data; + + child_pgid = getpgid(info->si_pid); + WrtLogD("dead_pid = %d pgid = %d", info->si_pid, child_pgid); + + while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) { + if (child_pid == child_pgid) { + killpg(child_pgid, SIGKILL); + } + __sigchild_action((void *)child_pid); + } + +#if ENABLE(PRE_LAUNCH) + re_pre_launch_by_pid(child_pgid, (info->si_code==CLD_DUMPED)); +#endif + + return; +} + +static inline int __signal_init(void) +{ + int i; + for (i = 0; i < _NSIG; i++) { + switch (i) { + /* controlled by sys-assert package*/ + case SIGQUIT: + case SIGILL: + case SIGABRT: + case SIGBUS: + case SIGFPE: + case SIGSEGV: + case SIGPIPE: + break; + default: + signal(i, SIG_DFL); + break; + } + } + + return 0; +} + +static inline int __signal_set_sigchld(void) +{ + struct sigaction act; + DBusError error; + + dbus_error_init(&error); + dbus_threads_init_default(); + bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error); + if (!bus) { + WrtLogE("Failed to connect to the D-BUS daemon: %s", error.message); + dbus_error_free(&error); + return -1; + } + /* TODO: if process stop mechanism is included, + * should be modified (SA_NOCLDSTOP)*/ + act.sa_handler = NULL; + act.sa_sigaction = __launchpad_sig_child; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_NOCLDSTOP | SA_SIGINFO; + + if (sigaction(SIGCHLD, &act, &old_sigchild) < 0) { + return -1; + } + + return 0; +} + +static inline int __signal_unset_sigchld(void) +{ + struct sigaction dummy; + + if (bus == NULL) { + return 0; + } + + dbus_connection_close(bus); + dbus_connection_unref(bus); + if (sigaction(SIGCHLD, &old_sigchild, &dummy) < 0) { + return -1; + } + + return 0; +} + +static inline int __signal_block_sigchld(void) +{ + sigset_t newmask; + + sigemptyset(&newmask); + sigaddset(&newmask, SIGCHLD); + + if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) { + WrtLogE("SIG_BLOCK error"); + return -1; + } + + WrtLogD("SIGCHLD blocked"); + + return 0; +} + +static inline int __signal_unblock_sigchld(void) +{ + if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) { + WrtLogE("SIG_SETMASK error"); + return -1; + } + + WrtLogD("SIGCHLD unblocked"); + return 0; +} + +static inline int __signal_fini(void) +{ +#ifndef PRELOAD_ACTIVATE + int i; + for (i = 0; i < _NSIG; i++) { + signal(i, SIG_DFL); + } +#endif + return 0; +} + +#endif // #ifndef SIG_CHILD_H diff --git a/src/wrt-launchpad-daemon/include/simple_util.h b/src/wrt-launchpad-daemon/include/simple_util.h new file mode 100644 index 0000000..f9c9fd5 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/simple_util.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SIMPLE_UTIL__ +#define __SIMPLE_UTIL__ + +#include +#include +#include + +#define MAX_LOCAL_BUFSZ 128 +#define MAX_PID_STR_BUFSZ 20 + +#define retvm_if(expr, val, fmt, arg ...) do { \ + if (expr) { \ + WrtLogE(fmt,##arg); \ + WrtLogE("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +#define retv_if(expr, val) do { \ + if (expr) { \ + WrtLogE("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +int __proc_iter_cmdline(int (*iterfunc) + (const char *dname, const char *cmdline, void *priv), + void *priv); +int __proc_iter_pgid(int pgid, int (*iterfunc)(int pid, void *priv), + void *priv); +char *__proc_get_cmdline_bypid(int pid); + +static inline const char *FILENAME(const char *filename) +{ + const char *p; + const char *r; + + if (!filename) { + return NULL; + } + + r = p = filename; + while (*p) { + if (*p == '/') { + r = p + 1; + } + p++; + } + + return r; +} + +#endif diff --git a/src/wrt-launchpad-daemon/include/web_app_core.h b/src/wrt-launchpad-daemon/include/web_app_core.h new file mode 100644 index 0000000..f6a6ae5 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/web_app_core.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file web_app_core.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ +#ifndef WEB_APP_CORE_H_ +#define WEB_APP_CORE_H_ + +#include +#include +#include + +#include +#include + +#include +#include +#include + +class WebAppCore { + public: + WebAppCore(); + virtual ~WebAppCore(); + + bool initialize(); + bool launchRequest(int argc, char* argv[]); + void setPidToAppID(const char* appId, unsigned int pid); + void aulSocketHandler(app_pkt_t* pkt, int clifd, ucred cr); + + private: + + bool addEcoreXWindowHandlers(); + static Eina_Bool ecoreXWindowShowCallback(void* data, int type, void* event); + static Eina_Bool ecoreXWindowHideCallback(void* data, int type, void* event); + static Eina_Bool ecoreXWindowVisibilityChangeCallback(void* data, int type, void* event); + static Eina_Bool ecoreXWindowEventClientCallback(void *data, int type, void *event); + static Eina_Bool terminateEventCallback(void *data, int type, void *event); + static Eina_Bool popupReplyWaitEventAulHandler(void* data, Ecore_Fd_Handler* handler); + static Eina_Bool popupReplyWaitStartEventCallback(void *data, int type, void *event); + static Eina_Bool popupReplyWaitFinishEventCallback(void *data, int type, void *event); + + bool m_initialized; + std::unique_ptr m_manager; + std::unique_ptr m_webAppCoreDataManager; + + Ecore_X_Atom m_atomParent; + Ecore_Event_Handler* m_ecoreEventWindowShowHandler; + Ecore_Event_Handler* m_ecoreEventHideWindowShowHandler; + Ecore_Event_Handler* m_ecoreEventVisibilityChangeHandler; + Ecore_Event_Handler* m_ecoreEventTaskMgrImageCreationHandler; +}; + +#endif // WEB_APP_CORE_H_ diff --git a/src/wrt-launchpad-daemon/include/web_app_core_data.h b/src/wrt-launchpad-daemon/include/web_app_core_data.h new file mode 100644 index 0000000..a923956 --- /dev/null +++ b/src/wrt-launchpad-daemon/include/web_app_core_data.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file web_app_core_data.h + * @author Leerang Song (leerang.song@samsung.com) + */ +#ifndef WEB_APP_CORE_DATA_H_ +#define WEB_APP_CORE_DATA_H_ + +#include +#include +#include + +#include + +class WebAppCoreDataManager { + public: + enum class Status { + CREATED, + RUNNING, + SUSPENDED + }; + + WebAppCoreDataManager(); + virtual ~WebAppCoreDataManager(); + + bool add(const std::string& appId); + bool remove(const std::string& appId); + + void show(const std::string& appId); + void hide(const std::string& appId); + void resume(const std::string& appId); + void suspend(const std::string& appId); + + bool isResumed(const std::string& appId); + bool isSuspended(const std::string& appId); + bool isAppIdFound(const std::string& appId); + + void setPid(const std::string& appId, pid_t pid); + pid_t getPid(const std::string& appId); + void setFd(const std::string& appId, Ecore_Fd_Handler* fd); + Ecore_Fd_Handler* getFd(const std::string& appId); + std::string getAppIdFromFd(int fd); + + private: + typedef struct webAppCoreData { + Status status; + pid_t pid; + Ecore_Fd_Handler* fd; + } WebAppCoreData; + + typedef std::map WebAppCoreDataMap; + typedef std::pair WebAppCoreDataPair; + + WebAppCoreDataMap m_webAppCoreDataMap; + + Status getStatus(const std::string& appId); + void setStatus(const std::string& appId, Status status); + bool compareStatus(const std::string& appId, Status status); +}; + +#endif // WEB_APP_CORE_DATA_H_ diff --git a/src/wrt-launchpad-daemon/include/web_app_core_tskmgr_util.h b/src/wrt-launchpad-daemon/include/web_app_core_tskmgr_util.h new file mode 100755 index 0000000..92c5f5b --- /dev/null +++ b/src/wrt-launchpad-daemon/include/web_app_core_tskmgr_util.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file web_app_core_tskmgr_util.h + * @author prathmesh (prathmesh.m@samsung.com) + */ +#ifndef WEB_APP_CORE_TSKMGR_UTIL_H_ +#define WEB_APP_CORE_TSKMGR_UTIL_H_ + +#include + +void captureAndMakeFileForTaskMgr(Ecore_X_Window win, const char* package); + +#endif //WEB_APP_CORE_TSKMGR_UTIL_H_ \ No newline at end of file diff --git a/src/wrt-launchpad-daemon/include/web_app_core_x_util.h b/src/wrt-launchpad-daemon/include/web_app_core_x_util.h new file mode 100755 index 0000000..a054f5f --- /dev/null +++ b/src/wrt-launchpad-daemon/include/web_app_core_x_util.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file web_app_core_x_util.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#ifndef WEB_APP_CORE_X_UTIL_H_ +#define WEB_APP_CORE_X_UTIL_H_ + +#include + +namespace WebAppCoreXUtil { +bool raiseWin(pid_t pid); +} // napespace WebAppCoreXUtil + +#endif // WEB_APP_CORE_X_UTIL_H_ \ No newline at end of file diff --git a/src/wrt-launchpad-daemon/include/web_internal_eventloop.h b/src/wrt-launchpad-daemon/include/web_internal_eventloop.h new file mode 100644 index 0000000..521259b --- /dev/null +++ b/src/wrt-launchpad-daemon/include/web_internal_eventloop.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file web_internal_eventloop.h + * @author Prathmesh (prathmesh.m@samsung.com) + */ +#ifndef WEB_INTERNAL_EVENTLOOP_H_ +#define WEB_INTERNAL_EVENTLOOP_H_ + +#define SUPPORT_MULTIPLE_REQUEST 1 + +#include +#include +#include +#ifdef SUPPORT_MULTIPLE_REQUEST +#include +#endif + + +class WebInternalEvent +{ + public: + enum webInternalEventType { + POPUP_REPLY_WAIT_START, + POPUP_REPLY_WAIT_FINISH, + WEB_APP_TERMINATE, + WEB_APP_START_POOL_PROCESS, + WEB_APP_MAX // TODO - Add more events if required before this SUPPORT_MULTIPLE_REQUEST + }; + void addListner(webInternalEventType type, Ecore_Event_Handler_Cb cbFunc, void *data); + void deleteListner(webInternalEventType type); + void sendEvent(webInternalEventType type, void *eventInfo); + static void freeEventInfo(void *user_data, void *func_data); + static Eina_Bool eventTriggeredCallback(void *data, int type, void *event); + + private: + WebInternalEvent(); + ~WebInternalEvent(); + +#ifdef SUPPORT_MULTIPLE_REQUEST + typedef struct callbackData { + int m_event; + Ecore_Event_Handler_Cb m_callerCallback; + void *m_data; + }WebInternalUserCBData; + + typedef std::map WebInternalEventMap; + typedef std::pair WebInternalEventPair; + WebInternalEventMap m_webInternalEventMap; +#else + int m_backEvent; + void *m_callerData; + Ecore_Event_Handler_Cb m_callerCallback; +#endif // SUPPORT_MULTIPLE_REQUEST + Ecore_Event_Handler *m_customEventHandler; + friend class DPL::Singleton; +}; + +typedef DPL::Singleton WebInternalEventSingleton; + +#endif // WEB_INTERNAL_EVENTLOOP_H_ diff --git a/src/wrt-launchpad-daemon/src/access_control.cpp b/src/wrt-launchpad-daemon/src/access_control.cpp new file mode 100644 index 0000000..f616339 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/access_control.cpp @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "access_control.h" +#include "config.h" +#include "simple_util.h" + +namespace { +const char* const APP_USER_NAME = "app"; +const char* const APP_HOME_DIR = "/home/app"; +const char* const APP_GROUP_PATH = "/usr/share/privilege-control/2.2.1/app_group_list"; +const int APP_UID = 5000; +const int APP_GID = 5000; +} // anonymous namespace + +#ifdef DAC_ACTIVATE + +int AccessControl::setPriviledge(const char* pkg_name, const char* pkg_type, const char* app_path) +{ + return perm_app_set_privilege(pkg_name, pkg_type, app_path); +} + +#else + +int AccessControl::setPriviledge(const char* pkg_name, const char* pkg_type, const char* app_path) +{ + return 0; +} + +#endif + +int AccessControl::setWLDPrivilege(void) +{ + WrtLogD("setAccessForWLD"); + + // get app group info + FILE* fp = NULL; + if(!(fp = fopen(APP_GROUP_PATH, "r"))) { + WrtLogE("fopen failed."); + return -1; + } + + int cnt = 0; + gid_t* glist = NULL; + char buf[10] = {0, }; + while(fgets(buf, 10, fp) != NULL) { + errno = 0; + gid_t temp = strtoul(buf, 0, 10); + if(errno != 0) { + WrtLogE("Cannot change string to integer: %s", buf); + goto error; + } + + glist = (gid_t*)realloc(glist, sizeof(gid_t) * (cnt + 1)); + if(!glist) { + WrtLogE("Cannot allocate memory"); + goto error; + } + glist[cnt] = temp; + cnt++; + } + fclose(fp); + fp = NULL; + + // setgroups() + if(setgroups(cnt, glist) != 0) { + WrtLogE("setgroups failed"); + goto error; + } + if(glist != NULL) { + free(glist); + glist = NULL; + } + + // setuid() & setgid() + if(setgid(APP_GID) != 0) { + WrtLogE("Failed to execute setgid()."); + goto error; + } + if(setuid(APP_UID) != 0) { + WrtLogE("Failed to execute setuid()."); + goto error; + } + + // setenv() + if(setenv("USER", APP_USER_NAME, 1) != 0) { + WrtLogE("Failed to execute setenv() USER"); + goto error; + } + if(setenv("HOME", APP_HOME_DIR, 1) != 0) { + WrtLogE("Failed to execute setenv() HOME"); + goto error; + } + + return 0; + +error: + if(fp != NULL) { + fclose(fp); + } + if(glist != NULL) { + free(glist); + } + + return -1; +} + +int AccessControl::setWLDCapability(void) +{ + cap_user_header_t header; + cap_user_data_t data; + + header = static_cast(malloc(sizeof(*header))); + if (header == NULL) { + WrtLogE("memory allocation error"); + return -1; + } + + data = static_cast(calloc(sizeof(*data), _LINUX_CAPABILITY_U32S_3)); + if (data == NULL) { + WrtLogE("memory allocation error"); + free(header); + return -1; + } + + header->pid = getpid(); + header->version = _LINUX_CAPABILITY_VERSION_3; + + // read already granted capabilities of this process + if (capget(header, data) < 0) { + WrtLogE("capget error"); + free(header); + free(data); + return -1; + } + + // set only inheritable bit for CAP_MAC_ADMIN to '1' + data[CAP_TO_INDEX(CAP_MAC_ADMIN)].inheritable |= CAP_TO_MASK(CAP_MAC_ADMIN); + + // remove capabilities not needed any more + data[CAP_TO_INDEX(CAP_MAC_ADMIN)].permitted &= ~CAP_TO_MASK(CAP_MAC_ADMIN); + data[CAP_TO_INDEX(CAP_MAC_ADMIN)].effective &= ~CAP_TO_MASK(CAP_MAC_ADMIN); + data[CAP_TO_INDEX(CAP_SETPCAP)].permitted &= ~CAP_TO_MASK(CAP_SETPCAP); + data[CAP_TO_INDEX(CAP_SETPCAP)].effective &= ~CAP_TO_MASK(CAP_SETPCAP); + + int ret = 0; + if (capset(header, data) < 0) { + WrtLogE("capset error"); + ret = -1; + } + + free(header); + free(data); + + return ret; +} + diff --git a/src/wrt-launchpad-daemon/src/app_sock.cpp b/src/wrt-launchpad-daemon/src/app_sock.cpp new file mode 100644 index 0000000..ba5bd6b --- /dev/null +++ b/src/wrt-launchpad-daemon/src/app_sock.cpp @@ -0,0 +1,450 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "app_sock.h" +#include "simple_util.h" + +static int __connect_client_sock(int sockfd, + const struct sockaddr *saptr, + socklen_t salen, + int nsec); + +static inline int __set_sock_option(int fd, int cli) +{ + int size; + struct timeval tv = { 3, 200 * 1000 }; /* 3.2 sec */ + + size = AUL_SOCK_MAXBUFF; + if (0 != setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) || + 0 != setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size))) + { + return 1; + } + if (cli && 0 != setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) { + return 1; + } + return 0; +} + +int __create_server_sock(int pid) +{ + struct sockaddr_un saddr; + struct sockaddr_un p_saddr; + int fd; + + fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + // support above version 2.6.27 + if (fd < 0) { + if (errno == EINVAL) { + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + WrtLogE("second chance - socket create error"); + return -1; + } + } else { + WrtLogE("socket error"); + return -1; + } + } + + memset(&saddr, 0, sizeof(saddr)); + saddr.sun_family = AF_UNIX; + snprintf(saddr.sun_path, UNIX_PATH_MAX, "%s/%d", AUL_SOCK_PREFIX, pid); + unlink(saddr.sun_path); + + // labeling to socket for SMACK + if(getuid() == 0) { + // this is meaningful iff current user is ROOT + if(smack_fsetlabel(fd, "@", SMACK_LABEL_IPOUT) != 0) { + // in case of unsupported filesystem on 'socket' + // or permission error by using 'emulator', bypass + if((errno != EOPNOTSUPP) && (errno != EPERM)) { + WrtLogE("labeling to socket(IPOUT) error"); + close(fd); + return -1; + } + } + if(smack_fsetlabel(fd, "*", SMACK_LABEL_IPIN) != 0) { + // in case of unsupported filesystem on 'socket' + // or permission error by using 'emulator', bypass + if((errno != EOPNOTSUPP) && (errno != EPERM)) { + WrtLogE("labeling to socket(IPIN) error"); + close(fd); + return -1; + } + } + } + + if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { + WrtLogE("bind error"); + close(fd); + return -1; + } + + if (chmod(saddr.sun_path, (S_IRWXU | S_IRWXG | S_IRWXO)) < 0) { + // Flawfinder: ignore + WrtLogE("failed to change the socket permission"); + close(fd); + return -1; + } + + if (0 != __set_sock_option(fd, 0)) { + close(fd); + return -1; + } + + if (listen(fd, 128) == -1) { + WrtLogE("listen error"); + close(fd); + return -1; + } + + // support app launched by shell script + if (pid != WRT_LAUNCHPAD_PID) { + int pgid; + pgid = getpgid(pid); + if (pgid > 1) { + snprintf(p_saddr.sun_path, UNIX_PATH_MAX, "%s/%d", AUL_SOCK_PREFIX, pgid); + if (link(saddr.sun_path, p_saddr.sun_path) < 0) { + if (errno == EEXIST) { + WrtLogD("pg path - already exists"); + } else { + WrtLogE("pg path - unknown create error"); + } + } + } + } + + return fd; +} + +int __create_client_sock(int pid) +{ + int fd = -1; + struct sockaddr_un saddr; + int retry = 1; + int ret = -1; + + memset(&saddr, 0x00, sizeof(struct sockaddr_un)); + + fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + /* support above version 2.6.27*/ + if (fd < 0) { + if (errno == EINVAL) { + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + WrtLogE("second chance - socket create error"); + return -1; + } + } else { + WrtLogE("socket error"); + return -1; + } + } + + saddr.sun_family = AF_UNIX; + snprintf(saddr.sun_path, UNIX_PATH_MAX, "%s/%d", AUL_SOCK_PREFIX, pid); + + while ((ret = __connect_client_sock(fd, (struct sockaddr *)&saddr, sizeof(saddr), + 100 * 1000)) < -1) { + WrtLogE("maybe peer not launched or peer daed\n"); + if (retry > 0) { + struct timespec duration = { 0, 100 * 1000 * 1000 }; + nanosleep(&duration, NULL); /* 100ms sleep*/ + retry--; + } + else break; + } + + if (ret < 0) { + close(fd); + return -1; + } + + if (0 != __set_sock_option(fd, 1)) { + close(fd); + return -1; + } + + return fd; +} + +static int __connect_client_sock(int fd, + const struct sockaddr *saptr, + socklen_t salen, + int nsec) +{ + int flags; + int ret; + int error; + socklen_t len; + fd_set readfds; + fd_set writefds; + struct timeval timeout; + + flags = fcntl(fd, F_GETFL, 0); + if (0 != fcntl(fd, F_SETFL, flags | O_NONBLOCK)) { + return -1; + } + + error = 0; + if ((ret = connect(fd, (struct sockaddr *)saptr, salen)) < 0) { + if (errno != EAGAIN && errno != EINPROGRESS) { + (void) fcntl(fd, F_SETFL, flags); + return (-2); + } + } + + /* Do whatever we want while the connect is taking place. */ + if (ret == 0) { + goto done; /* connect completed immediately */ + } + FD_ZERO(&readfds); + FD_SET(fd, &readfds); + writefds = readfds; + timeout.tv_sec = 0; + timeout.tv_usec = nsec; + + if ((ret = select(fd + 1, &readfds, &writefds, NULL, + nsec ? &timeout : NULL)) == 0) { + close(fd); /* timeout */ + errno = ETIMEDOUT; + return (-1); + } + + if (FD_ISSET(fd, &readfds) || FD_ISSET(fd, &writefds)) { + len = sizeof(error); + if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { + return (-1); /* Solaris pending error */ + } + } + else { + return (-1); /* select error: sockfd not set*/ + } + +done: + (void) fcntl(fd, F_SETFL, flags); + if (error) { + close(fd); + errno = error; + return (-1); + } + return (0); +} + +/** + * @brief Send data (in raw) to the process with 'pid' via socket + */ +int __app_send_raw(int pid, int cmd, unsigned char *kb_data, int datalen) +{ + int fd; + int len; + int res = 0; + app_pkt_t *pkt = NULL; + + if (kb_data == NULL || datalen > AUL_SOCK_MAXBUFF - 8) { + WrtLogE("keybundle error\n"); + return -EINVAL; + } + + fd = __create_client_sock(pid); + if (fd < 0) { + return -ECOMM; + } + + pkt = (app_pkt_t *) malloc(sizeof(char) * AUL_SOCK_MAXBUFF); + if (NULL == pkt) { + WrtLogE("Malloc Failed!"); + return -ENOMEM; + } + memset(pkt, 0, AUL_SOCK_MAXBUFF); + + pkt->cmd = cmd; + pkt->len = datalen; + memcpy(pkt->data, kb_data, datalen); + + if ((len = send(fd, pkt, datalen + 8, 0)) != datalen + 8) { + WrtLogE("sendto() failed - %d %d (errno %d)", len, datalen + 8, errno); + if (errno == EPIPE) { + WrtLogE("pid:%d, fd:%d\n", pid, fd); + } + close(fd); + if (pkt) { + free(pkt); + pkt = NULL; + } + return -ECOMM; + } + if (pkt) { + free(pkt); + pkt = NULL; + } + + len = recv(fd, &res, sizeof(int), 0); + if (len == -1) { + if (errno == EAGAIN) { + WrtLogE("recv timeout \n"); + res = -EAGAIN; + } else { + WrtLogE("recv error\n"); + res = -ECOMM; + } + } + close(fd); + + return res; +} + +int __app_send_result_to_launchpad(int fd, int res) +{ + if (send(fd, &res, sizeof(int), MSG_NOSIGNAL) < 0) { + if (errno == EPIPE) { + WrtLogE("send failed due to EPIPE."); + close(fd); + return -1; + } + WrtLogE("send fail to client"); + } + close(fd); + return 0; +} + +app_pkt_t *__app_recv_raw(int fd, int *clifd, struct ucred *cr) +{ + int len; + struct sockaddr_un aul_addr; + int sun_size; + app_pkt_t *pkt = NULL; + int cl = sizeof(struct ucred); + + memset(&aul_addr, 0x00, sizeof(struct sockaddr_un)); + sun_size = sizeof(struct sockaddr_un); + + if ((*clifd = accept(fd, (struct sockaddr *)&aul_addr, + (socklen_t *) &sun_size)) == -1) + { + if (errno != EINTR) { + WrtLogE("accept error"); + } + return NULL; + } + + if (getsockopt(*clifd, SOL_SOCKET, SO_PEERCRED, cr, + (socklen_t *) &cl) < 0) + { + WrtLogE("peer information error"); + close(*clifd); + return NULL; + } + + pkt = (app_pkt_t *) malloc(sizeof(char) * AUL_SOCK_MAXBUFF); + if(pkt == NULL) { + close(*clifd); + return NULL; + } + memset(pkt, 0, AUL_SOCK_MAXBUFF); + + if (0 != __set_sock_option(*clifd, 1)) { + free(pkt); + close(*clifd); + return NULL; + } + +retry_recv: + /* receive single packet from socket */ + len = recv(*clifd, pkt, AUL_SOCK_MAXBUFF, 0); + if (len < 0) { + if (errno == EINTR) { + goto retry_recv; + } + } + + if ((len < 8) || (len != (pkt->len + 8))) { + WrtLogE("recv error %d %d", len, pkt->len); + free(pkt); + close(*clifd); + return NULL; + } + + return pkt; +} + +app_pkt_t *__app_send_cmd_with_result(int pid, int cmd) +{ + int fd; + int len; + app_pkt_t *pkt = NULL; + + fd = __create_client_sock(pid); + if (fd < 0) { + return NULL; + } + + pkt = (app_pkt_t *) malloc(sizeof(char) * AUL_SOCK_MAXBUFF); + if (NULL == pkt) { + WrtLogE("Malloc Failed!"); + return NULL; + } + memset(pkt, 0, AUL_SOCK_MAXBUFF); + + pkt->cmd = cmd; + pkt->len = 0; + + if ((len = send(fd, pkt, 8, 0)) != 8) { + WrtLogE("sendto() failed - %d", len); + if (errno == EPIPE) { + WrtLogE("pid:%d, fd:%d\n", pid, fd); + } + close(fd); + + free(pkt); + return NULL; + } + +retry_recv: + /* receive single packet from socket */ + len = recv(fd, pkt, AUL_SOCK_MAXBUFF, 0); + if (len == -1) { + if (errno == EAGAIN) { + WrtLogE("recv timeout \n"); + free(pkt); + return NULL; + } else if (errno == EINTR) { + goto retry_recv; + } else { + WrtLogE("recv error %s\n", strerror(errno)); + free(pkt); + return NULL; + } + } else { + WrtLogD("recv result = %d", len); + } + close(fd); + + return pkt; +} + diff --git a/src/wrt-launchpad-daemon/src/launchpad.cpp b/src/wrt-launchpad-daemon/src/launchpad.cpp new file mode 100644 index 0000000..cb8f521 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/launchpad.cpp @@ -0,0 +1,777 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * simple AUL daemon - launchpad + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "app_sock.h" +#include + +#include "config.h" + +#include "menu_db_util.h" +#include "simple_util.h" +#include "access_control.h" +#include "preload.h" +#include "preexec.h" +#include "sigchild.h" + +#include +#include + +#include "process_pool.h" +#include "launchpad_util.h" + +#if ENABLE(PRE_LAUNCH) +#include "pre_launching.h" +#endif + +#define _static_ static inline +#define SQLITE_FLUSH_MAX (1048576) /* (1024*1024) */ +#define AUL_POLL_CNT 15 +#define AUL_PR_NAME 16 +#define PKG_ID_LENGTH 11 + +#define EXEC_DUMMY_EXPIRED 5 +#define DIFF(a,b) (((a)>(b))?(a)-(b):(b)-(a)) +#define WRT_CLIENT_PATH "/usr/bin/wrt-client" +#define LOWEST_PRIO 20 +#define DUMMY_NONE 0 + +static char *launchpad_cmdline; +static int initialized = 0; +static int dummy_process_pid = DUMMY_NONE; +static int dummy_process_fd = -1; +static int last_dummy_exec_time = 0; +static int process_pool_disable = 0; + +_static_ int __prepare_exec(const char *pkg_name, + const char *app_path, app_info_from_db * menu_info, + bundle * kb); +_static_ int __fake_launch_app(int cmd, int pid, bundle * kb); +_static_ char **__create_argc_argv(bundle * kb, int *margc); +_static_ void __real_launch(const char *app_path, bundle * kb); +_static_ int __dummy_launch(int dummy_client_fd, app_pkt_t* pkt); +_static_ int __send_to_sigkill(int pid); +_static_ int __term_app(int pid); +_static_ int __real_send(int clifd, int ret); +_static_ void __send_result_to_caller(int clifd, int ret); +_static_ void __launchpad_exec_dummy(int main_fd, int pool_fd, int client_fd); +_static_ void __launchpad_main_loop(int main_fd, int pool_fd); +_static_ int __launchpad_pre_init(int argc, char **argv); +_static_ int __launchpad_post_init(); + +extern ail_error_e ail_db_close(void); + +_static_ int __prepare_exec(const char *pkg_name, + const char *app_path, app_info_from_db * menu_info, + bundle * kb) +{ + const char* file_name; + char process_name[AUL_PR_NAME]; + + /* Set new session ID & new process group ID*/ + /* In linux, child can set new session ID without check permission */ + /* TODO : should be add to check permission in the kernel*/ + setsid(); + + __preexec_run(menu_info->pkg_type, pkg_name, app_path); + + /* SET PRIVILEGES*/ + char pkg_id[PKG_ID_LENGTH]; + memset(pkg_id, '\0', PKG_ID_LENGTH); + snprintf(pkg_id, PKG_ID_LENGTH, "%s", pkg_name); + + /* SET PR_SET_KEEPCAPS */ + if (prctl(PR_SET_KEEPCAPS, 1) < 0) { + WrtLogE("prctl(PR_SET_KEEPCAPS) failed."); + } + + if (AccessControl::setPriviledge(pkg_id, menu_info->pkg_type, app_path) < 0) { + WrtLogD("fail to set privileges - check your package's credential\n"); + return -1; + } + + __set_inherit_bit_for_CAP_MAC_ADMIN(); + + /* SET DUMPABLE - for coredump*/ + prctl(PR_SET_DUMPABLE, 1); + + /* SET PROCESS NAME*/ + if (app_path == NULL) { + WrtLogD("app_path should not be NULL - check menu db"); + return -1; + } + file_name = strrchr(app_path, '/'); + if (file_name == NULL) { + WrtLogD("can't locate file name to execute"); + return -1; + } + memset(process_name, '\0', AUL_PR_NAME); + snprintf(process_name, AUL_PR_NAME, "%s", file_name + 1); + prctl(PR_SET_NAME, process_name); + + /* SET ENVIROMENT*/ + __set_env(menu_info, kb); + + return 0; +} + +_static_ int __fake_launch_app(int cmd, int pid, bundle * kb) +{ + int datalen; + int ret; + bundle_raw *kb_data; + + bundle_encode(kb, &kb_data, &datalen); + if ((ret = __app_send_raw(pid, cmd, kb_data, datalen)) < 0) { + WrtLogE("error request fake launch - error code = %d", ret); + } + free(kb_data); + return ret; +} + +_static_ void __real_launch(const char *app_path, bundle * kb) +{ + int app_argc; + char **app_argv; + int i; + + app_argv = __create_argc_argv(kb, &app_argc); + +#ifndef NATIVE_LAUNCHPAD + if (__change_cmdline((char *)app_path) < 0) { + WrtLogE("change cmdline fail"); + return; + } + + app_argv[0] = g_argv[0]; +#else + app_argv[0] = strdup(app_path); +#endif + + for (i = 0; i < app_argc; i++) { + WrtLogD("input argument %d : %s##", i, app_argv[i]); + } + + WrtLogE("lock up test log(no error) : setup argument done"); + + /* Temporary log: launch time checking */ + LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:launchpad:done]", app_path); + + __preload_exec(app_argc, app_argv); +} + +_static_ int __dummy_launch(int dummy_client_fd, app_pkt_t* pkt) +{ + return __send_pkt_raw_data(dummy_client_fd, pkt); +} + +_static_ int __send_to_sigkill(int pid) +{ + int pgid; + + pgid = getpgid(pid); + if (pgid <= 1) { + return -1; + } + + if (killpg(pgid, SIGKILL) < 0) { + return -1; + } + + return 0; +} + +_static_ int __term_app(int pid) +{ + int dummy; + if (__app_send_raw + (pid, APP_TERM_BY_PID, (unsigned char *)&dummy, sizeof(int)) < 0) + { + WrtLogD("terminate packet send error - use SIGKILL"); + if (__send_to_sigkill(pid) < 0) { + WrtLogE("fail to killing - %d\n", pid); + return -1; + } + } + WrtLogD("term done\n"); + return 0; +} + +static int __get_caller_pid(bundle *kb) +{ + const char *pid_str; + int pid; + + pid_str = bundle_get_val(kb, AUL_K_ORG_CALLER_PID); + if (pid_str) { + goto end; + } + + pid_str = bundle_get_val(kb, AUL_K_CALLER_PID); + if (pid_str == NULL) { + return -1; + } + +end: + pid = atoi(pid_str); + if (pid <= 1) { + return -1; + } + + return pid; +} + +_static_ int __foward_cmd(int cmd, bundle *kb, int cr_pid) +{ + int pid; + char tmp_pid[MAX_PID_STR_BUFSZ]; + int datalen; + bundle_raw *kb_data; + int res; + + if ((pid = __get_caller_pid(kb)) < 0) { + return AUL_R_ERROR; + } + + snprintf(tmp_pid, MAX_PID_STR_BUFSZ, "%d", cr_pid); + + bundle_add(kb, AUL_K_CALLEE_PID, tmp_pid); + + bundle_encode(kb, &kb_data, &datalen); + if ((res = __app_send_raw(pid, cmd, kb_data, datalen)) < 0) { + res = AUL_R_ERROR; + } + + free(kb_data); + + return res; +} + +_static_ int __real_send(int clifd, int ret) +{ + if (send(clifd, &ret, sizeof(int), MSG_NOSIGNAL) < 0) { + if (errno == EPIPE) { + WrtLogE("send failed due to EPIPE.\n"); + close(clifd); + return -1; + } + WrtLogE("send fail to client"); + } + + close(clifd); + return 0; +} + +_static_ void __send_result_to_caller(int clifd, int ret) +{ + char *cmdline; + int wait_count; + int cmdline_changed = 0; + int cmdline_exist = 0; + int r; + + if (clifd == -1) { + return; + } + + if (ret <= 1) { + __real_send(clifd, ret); + return; + } + /* check normally was launched?*/ + wait_count = 1; + do { + cmdline = __proc_get_cmdline_bypid(ret); + if (cmdline == NULL) { + WrtLogE("error founded when being launched with %d", ret); + } else if (strcmp(cmdline, launchpad_cmdline)) { + free(cmdline); + cmdline_changed = 1; + break; + } else { + cmdline_exist = 1; + free(cmdline); + } + + WrtLogD("-- now wait to change cmdline --"); + struct timespec duration = { 0, 50 * 1000 * 1000 }; + nanosleep(&duration, NULL); /* 50ms sleep*/ + wait_count++; + } while (wait_count <= 20); /* max 50*20ms will be sleep*/ + + if ((!cmdline_exist) && (!cmdline_changed)) { + __real_send(clifd, -1); /* abnormally launched*/ + return; + } + + if (!cmdline_changed) { + WrtLogE("process launched, but cmdline not changed"); + } + + if (__real_send(clifd, ret) < 0) { + r = kill(ret, SIGKILL); + if (r == -1) { + WrtLogE("send SIGKILL: %s", strerror(errno)); + } + } + + return; +} + +_static_ void __launchpad_exec_dummy(int main_fd, int pool_fd, int client_fd) +{ + int pid; + + last_dummy_exec_time = time(NULL); + + pid = fork(); + + if (pid == 0) // child + { + setpriority(PRIO_PROCESS, 0, LOWEST_PRIO); + WrtLogD("Launch dummy process..."); + + //temp - this requires some optimization. + sleep(1); + WrtLogD("sleeping 1 sec..."); + + /* Set new session ID & new process group ID*/ + /* In linux, child can set new session ID without check permission */ + /* TODO : should be add to check permission in the kernel*/ + setsid(); + + if (main_fd != -1) + { + close(main_fd); + } + + if (pool_fd != -1) + { + close(pool_fd); + } + + if (client_fd != -1) + { + close(client_fd); + } + + __signal_unset_sigchld(); + __signal_fini(); + + /* SET PR_SET_KEEPCAPS */ + if (prctl(PR_SET_KEEPCAPS, 1) < 0) { + WrtLogE("prctl(PR_SET_KEEPCAPS) failed."); + } + + /* SET DUMPABLE - for coredump*/ + prctl(PR_SET_DUMPABLE, 1); + + { + void *handle = NULL; + int (*dl_main) (int, char **); + + handle = dlopen(WRT_CLIENT_PATH, RTLD_NOW | RTLD_GLOBAL); + + if (handle == NULL) + { + WrtLogE("dlopen failed."); + exit(-1); + } + + dl_main = reinterpret_cast(dlsym(handle, "main")); + + sprintf(g_argv[1], "%s", "-d"); + + if (dl_main != NULL) + { + dl_main(g_argc, g_argv); + } + else + { + WrtLogE("dlsym not founded. bad preloaded app - check fpie pie"); + } + + exit(0); + } + } +} + +_static_ void __launchpad_main_loop(int main_fd, int pool_fd) +{ + bundle *kb = NULL; + app_pkt_t *pkt = NULL; + app_info_from_db *menu_info = NULL; + + const char *pkg_name = NULL; + const char *app_path = NULL; + int pid = -1; + int clifd = -1; + struct ucred cr; + int is_real_launch = 0; + + char sock_path[UNIX_PATH_MAX] = { 0, }; + + pkt = __app_recv_raw(main_fd, &clifd, &cr); + if (!pkt) { + WrtLogD("packet is NULL"); + goto end; + } + + kb = bundle_decode(pkt->data, pkt->len); + if (!kb) { + WrtLogD("bundle decode error"); + goto end; + } + + pkg_name = bundle_get_val(kb, AUL_K_PKG_NAME); + SECURE_LOGD("pkg name : %s\n", pkg_name); + + menu_info = _get_app_info_from_bundle_by_pkgname(pkg_name, kb); + if (menu_info == NULL) { + WrtLogD("such pkg no found"); + goto end; + } + + app_path = _get_app_path(menu_info); + if (app_path == NULL) { + WrtLogE("app_path is NULL"); + goto end; + } + if (app_path[0] != '/') { + WrtLogD("app_path is not absolute path"); + goto end; + } + + __modify_bundle(kb, cr.pid, menu_info, pkt->cmd); + pkg_name = _get_pkgname(menu_info); + + if (dummy_process_pid != DUMMY_NONE) + { + snprintf(sock_path, UNIX_PATH_MAX, "%s/%d", AUL_SOCK_PREFIX, dummy_process_pid); + unlink(sock_path); + + __dummy_launch(dummy_process_fd, pkt); + + pid = dummy_process_pid; + is_real_launch = 1; + close(dummy_process_fd); + + dummy_process_pid = DUMMY_NONE; + dummy_process_fd = -1; + + /* Temporary log: launch time checking */ + LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:launchpad:done]", app_path); + + __launchpad_exec_dummy(main_fd, pool_fd, clifd); + + WrtLogD("==> dummy launch pid : %d %s\n", pid, app_path); + } + else + { + pid = fork(); + + if (pid == 0) + { + WrtLogE("lock up test log(no error) : fork done"); + + close(clifd); + close(main_fd); + __signal_unset_sigchld(); + __signal_fini(); + + snprintf(sock_path, UNIX_PATH_MAX, "%s/%d", AUL_SOCK_PREFIX, getpid()); + unlink(sock_path); + + WrtLogE("lock up test log(no error) : prepare exec - first done"); + + if (__prepare_exec(pkg_name, app_path, + menu_info, kb) < 0) + { + SECURE_LOGE("preparing work fail to launch - " + "can not launch %s\n", pkg_name); + exit(-1); + } + + WrtLogE("lock up test log(no error) : prepare exec - second done"); + + __real_launch(app_path, kb); + + exit(-1); + } + WrtLogD("==> real launch pid : %d %s\n", pid, app_path); + is_real_launch = 1; + } + +end: + __send_result_to_caller(clifd, pid); + + if (pid > 0) { + if (is_real_launch) { + /*TODO: retry*/ + __signal_block_sigchld(); + __send_app_launch_signal(pid); + +#if ENABLE(PRE_LAUNCH) + if (is_pre_launching_appid(pkg_name)) { + add_to_pre_launching_info_list(pkg_name, pid); + } +#endif + __signal_unblock_sigchld(); + } + } + + if (menu_info != NULL) { + _free_app_info_from_db(menu_info); + } + + if (kb != NULL) { + bundle_free(kb); + } + if (pkt != NULL) { + free(pkt); + } + + /* Active Flusing for Daemon */ + if (initialized > AUL_POLL_CNT) { + sqlite3_release_memory(SQLITE_FLUSH_MAX); + malloc_trim(0); + initialized = 1; + } +} + +_static_ int __launchpad_pre_init(int argc, char **argv) +{ + int fd; + + /* signal init*/ + __signal_init(); + + /* get my(launchpad) command line*/ + launchpad_cmdline = __proc_get_cmdline_bypid(getpid()); + if (launchpad_cmdline == NULL) { + WrtLogE("launchpad cmdline fail to get"); + return -1; + } + WrtLogD("launchpad cmdline = %s", launchpad_cmdline); + + /* create launchpad sock */ + fd = __create_server_sock(WRT_LAUNCHPAD_PID); + if (fd < 0) { + WrtLogE("server sock error"); + return -1; + } + + __preload_init(argc, argv); + + __preload_init_for_wrt(); + + __preexec_init(argc, argv); + + return fd; +} + +_static_ int __launchpad_post_init() +{ + /* Setting this as a global variable to keep track + * of launchpad poll cnt */ + /* static int initialized = 0;*/ + + if (initialized) { + initialized++; + return 0; + } + + if (__signal_set_sigchld() < 0) { + return -1; + } + + initialized++; + + return 0; +} + +int main(int argc, char **argv) +{ + enum { + LAUNCH_PAD = 0, + POOL_SERVER, + DUMMY_PROCESS, + POLLFD_MAX + }; + + int main_fd = -1, pool_fd = -1; + struct pollfd pfds[POLLFD_MAX]; + + memset(pfds, 0x00, sizeof(pfds)); + +#if ENABLE(PRE_LAUNCH) + pre_launch_webapps(); +#endif + + // process pool feature disable + if (getenv("WRT_PROCESS_POOL_DISABLE")) + { + process_pool_disable = 1; + } + + /* init without concerning X & EFL*/ + main_fd = __launchpad_pre_init(argc, argv); + + if (main_fd < 0) + { + WrtLogE("launchpad pre init failed"); + goto exit_main; + } + + pfds[LAUNCH_PAD].fd = main_fd; + pfds[LAUNCH_PAD].events = POLLIN; + pfds[LAUNCH_PAD].revents = 0; + + pool_fd = __create_process_pool_server(); + + if (pool_fd == -1) + { + WrtLogE("Error creationg pool server!"); + goto exit_main; + } + + pfds[POOL_SERVER].fd = pool_fd; + pfds[POOL_SERVER].events = POLLIN; + pfds[POOL_SERVER].revents = 0; + + + // This is temporary code to delay creating dummy process. + // It will make that a dummy_process is created on first webapp launching. + last_dummy_exec_time = time(NULL); + + while (1) + { + if (dummy_process_pid == DUMMY_NONE) + { + pfds[DUMMY_PROCESS].fd = -1; + pfds[DUMMY_PROCESS].events = 0; + pfds[DUMMY_PROCESS].revents = 0; + + if ( !process_pool_disable && + DIFF(last_dummy_exec_time, time(NULL)) > EXEC_DUMMY_EXPIRED) + { + __launchpad_exec_dummy(main_fd, pool_fd, -1); + } + } + + if (poll(pfds, POLLFD_MAX, -1) < 0) + { + continue; + } + + WrtLogD("pfds[LAUNCH_PAD].revents : 0x%x", pfds[LAUNCH_PAD].revents) ; + WrtLogD("pfds[POOL_SERVER].revents : 0x%x", pfds[POOL_SERVER].revents) ; + WrtLogD("pfds[DUMMY_PROCESS].revents : 0x%x", pfds[DUMMY_PROCESS].revents) ; + + /* init with concerning X & EFL (because of booting + * sequence problem)*/ + if (__launchpad_post_init() < 0) + { + WrtLogE("launcpad post init failed"); + goto exit_main; + } + + if ((pfds[LAUNCH_PAD].revents & POLLIN) != 0) + { + WrtLogD("pfds[LAUNCH_PAD].revents & POLLIN"); + __launchpad_main_loop(pfds[LAUNCH_PAD].fd, pfds[POOL_SERVER].fd); + } + + if ((pfds[POOL_SERVER].revents & POLLIN) != 0) + { + int server_fd, client_fd, client_pid; + + server_fd = pfds[POOL_SERVER].fd; + + WrtLogD("pfds[POOL_SERVER].revents & POLLIN"); + + if (dummy_process_pid == DUMMY_NONE) + { + __accept_dummy_process(server_fd, &client_fd, &client_pid); + + dummy_process_pid = client_pid; + dummy_process_fd = client_fd; + + pfds[DUMMY_PROCESS].fd = dummy_process_fd; + pfds[DUMMY_PROCESS].events = POLLIN|POLLHUP; + pfds[DUMMY_PROCESS].revents = 0; + + WrtLogD("Dummy process was connected! (pid:%d)", dummy_process_pid); + } + else + { + __refuse_dummy_process(server_fd); + + WrtLogE("Refused dummy process connection!"); + } + } + + if ((pfds[DUMMY_PROCESS].revents & (POLLHUP|POLLNVAL)) != 0) + { + WrtLogD("pfds[DUMMY_PROCESS].revents & (POLLHUP|POLLNVAL) (pid:%d)", dummy_process_pid); + + if (pfds[DUMMY_PROCESS].fd > -1) + { + close(pfds[DUMMY_PROCESS].fd); + } + + dummy_process_pid = DUMMY_NONE; + dummy_process_fd = -1; + + pfds[DUMMY_PROCESS].fd = -1; + pfds[DUMMY_PROCESS].events = 0; + pfds[DUMMY_PROCESS].revents = 0; + } + } + + return 0; + + exit_main: + if (main_fd != -1) + { + close(main_fd); + } + + if (pool_fd != -1) + { + close(pool_fd); + } + + return -1; +} + diff --git a/src/wrt-launchpad-daemon/src/launchpad_lite.cpp b/src/wrt-launchpad-daemon/src/launchpad_lite.cpp new file mode 100644 index 0000000..f2f7697 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/launchpad_lite.cpp @@ -0,0 +1,476 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// system header +#include +#include + +// platform header +#include +#include +#include +#include +#include + +// internal header +// Must define top of internal header +#include "config.h" + +#include "access_control.h" +#include "app_sock.h" +#include "launchpad_util.h" +#include "menu_db_util.h" +#include "sigchild.h" +#include "simple_util.h" +#include "preexec.h" +#include "preload.h" +#include "web_app_core.h" + +#define _static_ static inline +#define AUL_PR_NAME 16 +#define PKG_ID_LENGTH 11 +#define MAX_WAIT_CNT 1000 + +static char *launchpad_cmdline; +static WebAppCore* webappcore; + +_static_ int __prepare_exec(const char *pkg_name, + const char *app_path, app_info_from_db * menu_info, + bundle * kb); +_static_ char **__create_argc_argv(bundle * kb, int *margc); +_static_ void __real_launch(const char *app_path, bundle * kb); +_static_ int __real_send(int clifd, int ret); +_static_ void __send_result_to_caller(int clifd, int ret); +_static_ void __launchpad_request_handle(app_pkt_t* pkt, int clifd, ucred cr); +_static_ Eina_Bool __launchpad_main_loop(void* data, Ecore_Fd_Handler* handler); +_static_ int __launchpad_pre_init(void); +_static_ int __launchpad_init(int argc, char **argv); + +_static_ int __prepare_exec(const char *pkg_name, + const char *app_path, app_info_from_db * menu_info, + bundle * kb) +{ + const char* file_name; + char process_name[AUL_PR_NAME]; + + /* Set new session ID & new process group ID*/ + /* In linux, child can set new session ID without check permission */ + /* TODO : should be add to check permission in the kernel*/ + setsid(); + + __preexec_run(menu_info->pkg_type, pkg_name, app_path); + + /* SET PRIVILEGES*/ + char pkg_id[PKG_ID_LENGTH]; + memset(pkg_id, '\0', PKG_ID_LENGTH); + snprintf(pkg_id, PKG_ID_LENGTH, "%s", pkg_name); + + /* SET PR_SET_KEEPCAPS */ + if (prctl(PR_SET_KEEPCAPS, 1) < 0) { + WrtLogE("prctl(PR_SET_KEEPCAPS) failed."); + } + + if (AccessControl::setPriviledge(pkg_id, menu_info->pkg_type, app_path) < 0) { + WrtLogD("fail to set privileges - check your package's credential\n"); + return -1; + } + + __set_inherit_bit_for_CAP_MAC_ADMIN(); + + /* SET DUMPABLE - for coredump*/ + prctl(PR_SET_DUMPABLE, 1); + + /* SET PROCESS NAME*/ + if (app_path == NULL) { + WrtLogD("app_path should not be NULL - check menu db"); + return -1; + } + file_name = strrchr(app_path, '/') + 1; + if (file_name == NULL) { + WrtLogD("can't locate file name to execute"); + return -1; + } + memset(process_name, '\0', AUL_PR_NAME); + snprintf(process_name, AUL_PR_NAME, "%s", file_name); + prctl(PR_SET_NAME, process_name); + + /* SET ENVIROMENT*/ + __set_env(menu_info, kb); + + return 0; +} + +_static_ void __real_launch(const char *app_path, bundle * kb) +{ + int app_argc; + char **app_argv; + int i; + + app_argv = __create_argc_argv(kb, &app_argc); + +#ifdef PRELOAD_ACTIVATE + if (__change_cmdline((char *)app_path) < 0) { + WrtLogE("change cmdline fail"); + return; + } + + app_argv[0] = g_argv[0]; +#else + app_argv[0] = strdup(app_path); +#endif + + for (i = 0; i < app_argc; i++) { + WrtLogD("input argument %d : %s##", i, app_argv[i]); + } + + WrtLogE("lock up test log(no error) : setup argument done"); + + /* Temporary log: launch time checking */ + LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:launchpad:done]", app_path); + + __preload_exec(app_argc, app_argv); +} + +static int __get_caller_pid(bundle *kb) +{ + const char *pid_str; + int pid; + + pid_str = bundle_get_val(kb, AUL_K_ORG_CALLER_PID); + if (pid_str) { + goto end; + } + + pid_str = bundle_get_val(kb, AUL_K_CALLER_PID); + if (pid_str == NULL) { + return -1; + } + +end: + pid = atoi(pid_str); + if (pid <= 1) { + return -1; + } + + return pid; +} + +_static_ int __foward_cmd(int cmd, bundle *kb, int cr_pid) +{ + int pid; + char tmp_pid[MAX_PID_STR_BUFSZ]; + int datalen; + bundle_raw *kb_data; + int res; + + if ((pid = __get_caller_pid(kb)) < 0) { + return AUL_R_ERROR; + } + + snprintf(tmp_pid, MAX_PID_STR_BUFSZ, "%d", cr_pid); + + bundle_add(kb, AUL_K_CALLEE_PID, tmp_pid); + + bundle_encode(kb, &kb_data, &datalen); + if ((res = __app_send_raw(pid, cmd, kb_data, datalen)) < 0) { + res = AUL_R_ERROR; + } + + free(kb_data); + + return res; +} + +_static_ int __real_send(int clifd, int ret) +{ + if (send(clifd, &ret, sizeof(int), MSG_NOSIGNAL) < 0) { + if (errno == EPIPE) { + WrtLogE("send failed due to EPIPE.\n"); + close(clifd); + return -1; + } + WrtLogE("send fail to client"); + } + + close(clifd); + return 0; +} + +_static_ void __send_result_to_caller(int clifd, int ret) +{ + char *cmdline; + int wait_count; + int cmdline_changed = 0; + int cmdline_exist = 0; + int r; + + if (clifd == -1) { + return; + } + + if (ret <= 1) { + __real_send(clifd, ret); + return; + } + /* check normally was launched?*/ + wait_count = 1; + do { + cmdline = __proc_get_cmdline_bypid(ret); + if (cmdline == NULL) { + WrtLogE("error founded when being launched with %d", ret); + } else if (strcmp(cmdline, launchpad_cmdline)) { + free(cmdline); + cmdline_changed = 1; + break; + } else { + cmdline_exist = 1; + free(cmdline); + } + + WrtLogD("-- now wait to change cmdline --"); + struct timespec duration = { 0, 50 * 1000 * 1000 }; + nanosleep(&duration, NULL); /* 50ms sleep*/ + wait_count++; + } while (wait_count <= 20); /* max 50*20ms will be sleep*/ + + if ((!cmdline_exist) && (!cmdline_changed)) { + __real_send(clifd, -1); /* abnormally launched*/ + return; + } + + if (!cmdline_changed) { + WrtLogE("process launched, but cmdline not changed"); + } + + if (__real_send(clifd, ret) < 0) { + r = kill(ret, SIGKILL); + if (r == -1) { + WrtLogE("send SIGKILL: %s", strerror(errno)); + } + } + + return; +} + +_static_ void __launchpad_request_handle(app_pkt_t* pkt, int clifd, ucred cr) +{ + app_info_from_db *menu_info = NULL; + const char *pkg_name = NULL; + const char *app_path = NULL; + int pid = -1; + int is_real_launch = 0; + int argc; + char** argv; + int waitCnt = 0; + + bundle* kb = bundle_decode(pkt->data, pkt->len); + if (!kb) { + WrtLogD("bundle decode error"); + goto end; + } + + pkg_name = bundle_get_val(kb, AUL_K_PKG_NAME); + WrtLogD("pkg name : %s\n", pkg_name); + + menu_info = _get_app_info_from_bundle_by_pkgname(pkg_name, kb); + if (menu_info == NULL) { + WrtLogD("such pkg no found"); + goto end; + } + + app_path = _get_app_path(menu_info); + if (app_path == NULL) { + WrtLogE("app_path is NULL"); + goto end; + } + if (app_path[0] != '/') { + WrtLogD("app_path is not absolute path"); + goto end; + } + + __modify_bundle(kb, cr.pid, menu_info, pkt->cmd); + pkg_name = _get_pkgname(menu_info); + argv = __create_argc_argv(kb, &argc); + if(!webappcore->launchRequest(argc, argv)) + goto end; + + while (waitCnt < MAX_WAIT_CNT) { + pid = __proc_iter_cmdline(NULL, (void*)app_path); + if (pid > 0) { + break; + } + waitCnt++; + } + + webappcore->setPidToAppID(pkg_name, pid); + WrtLogD("==> real launch pid : %d %s\n", pid, app_path); + + is_real_launch = 1; + +end: + __send_result_to_caller(clifd, pid); + + if (pid > 0) { + if (is_real_launch) { + /*TODO: retry*/ + __signal_block_sigchld(); + __send_app_launch_signal(pid); + __signal_unblock_sigchld(); + } + } + + if (menu_info != NULL) { + _free_app_info_from_db(menu_info); + } + + if (kb != NULL) { + bundle_free(kb); + } + if (pkt != NULL) { + free(pkt); + } + + return; +} + +_static_ Eina_Bool __launchpad_main_loop(void* data, Ecore_Fd_Handler* handler) +{ + DPL_UNUSED_PARAM(data); + + int main_fd = ecore_main_fd_handler_fd_get(handler); + int clifd = -1; + struct ucred cr; + + app_pkt_t* pkt = __app_recv_raw(main_fd, &clifd, &cr); + if (!pkt) { + WrtLogD("packet is NULL"); + return ECORE_CALLBACK_RENEW; + } + + if (cr.uid == 5000) { + // From WebProcess + webappcore->aulSocketHandler(pkt, clifd, cr); + } else if (cr.uid == 0) { + // From AMD + __launchpad_request_handle(pkt, clifd, cr); + } else { + // From Unknown + WrtLogW("Unknown sender"); + } + + return ECORE_CALLBACK_RENEW; +} + +_static_ int __launchpad_pre_init(void) +{ + // Drop permission - socket between AMD and WLD + char path[UNIX_PATH_MAX] = {0,}; + snprintf(path, UNIX_PATH_MAX, "%s/%d", AUL_SOCK_PREFIX, WRT_LAUNCHPAD_PID); + if (0 != chown(path, 5000, 5000)) { + WrtLogE("Fail to change owner"); + return -1; + } + + if (AccessControl::setWLDCapability() < 0) { + WrtLogD("fail set capability"); + return -1; + } + + // Drop permission - WLD Process permission + if (AccessControl::setWLDPrivilege() < 0) { + WrtLogD("fail to drop root"); + return -1; + } + + return 0; +} + +_static_ int __launchpad_init(int argc, char **argv) +{ + int fd; + + /* signal init*/ + __signal_init(); + + /* get my(launchpad) command line*/ + launchpad_cmdline = __proc_get_cmdline_bypid(getpid()); + if (launchpad_cmdline == NULL) { + WrtLogE("launchpad cmdline fail to get"); + return -1; + } + WrtLogD("launchpad cmdline = %s", launchpad_cmdline); + + /* create launchpad sock */ + fd = __create_server_sock(WRT_LAUNCHPAD_PID); + if (fd < 0) { + WrtLogE("server sock error"); + return -1; + } + + __preload_init(argc, argv); + __preload_init_for_wrt(); + __preexec_init(argc, argv); + + ecore_init(); + + if (__signal_set_sigchld() < 0) { + return -1; + } + + if (!webappcore) { + webappcore = new WebAppCore(); + if (!webappcore->initialize()) { + WrtLogE("Fail to initialize webappcore"); + return -1; + } + } + + return fd; +} + +int main(int argc, char **argv) +{ + UNHANDLED_EXCEPTION_HANDLER_BEGIN + { + if (-1 == __launchpad_pre_init()) { + WrtLogE("Fail to pre init"); + return -1; + } + + int main_fd = -1; + main_fd = __launchpad_init(argc, argv); + if (main_fd < 0) { + WrtLogE("launchpad init failed"); + return -1; + } + + Ecore_Fd_Handler* main_fd_handler = + ecore_main_fd_handler_add(main_fd, (Ecore_Fd_Handler_Flags)(ECORE_FD_READ|ECORE_FD_ERROR), __launchpad_main_loop, NULL, NULL, NULL); + if (main_fd_handler == NULL) { + WrtLogE("main_fd_handler is NULL"); + return -1; + } + + ecore_main_loop_begin(); + + ecore_main_fd_handler_del(main_fd_handler); + close(main_fd); + + return 0; + } + UNHANDLED_EXCEPTION_HANDLER_END +} + diff --git a/src/wrt-launchpad-daemon/src/pre_launching.cpp b/src/wrt-launchpad-daemon/src/pre_launching.cpp new file mode 100644 index 0000000..8bbd645 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/pre_launching.cpp @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file pre_launching.cpp + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 1.0 + * @brief wrt pre-launching model api + */ + +#include "pre_launching.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include "simple_util.h" + +namespace { +const char* const PRE_LAUNCHING_LIST_DIR = "/opt/usr/etc/wrt_launchpad_daemon/pre_launching_list"; +const char* const PKGMGR_PARSER_DB_PATH = "/opt/dbspace/.pkgmgr_parser.db"; +const char* const APP_INFO_DB_PATH = "/opt/dbspace/.app_info.db"; +const int SHORT_TERM_COUNTER = 2; +const int RE_LAUNCHING_LIMIT_TIME = 3; // sec +const int TIME_FOR_PRE_LAUNCHING_AFTER_BOOTING = 10; // sec +const int TIME_FOR_NEXT_PRE_LAUNCHING = 2; // sec + +struct PreLaunchingInfo +{ + int pid; + time_t launchedTime; + int shortTermCounter; + + PreLaunchingInfo() : + pid(0), launchedTime(0), shortTermCounter(SHORT_TERM_COUNTER) + {}; + + explicit PreLaunchingInfo(int processID, time_t time = 0) : + pid(processID), launchedTime(time), shortTermCounter(SHORT_TERM_COUNTER) + {}; +}; + +std::map s_InfoList; + +int update_task_manage_field(const char* app_id, int task_manage) +{ + sqlite3 *db = NULL; + char *sqlite3_error_msg = NULL; + + if (sqlite3_open(PKGMGR_PARSER_DB_PATH, &db) != SQLITE_OK) { + WrtLogE("sqlite3_open() failed! -> %s\n", sqlite3_errmsg(db)); + return -1; + } + + if (sqlite3_exec(db, "PRAGMA journal_mode = PERSIST", NULL, NULL, &sqlite3_error_msg) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"PRAGMA journal_mode = PERSIST\") failed! -> %s", sqlite3_error_msg); + sqlite3_free(sqlite3_error_msg); + sqlite3_close(db); + return -1; + } + + if (sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, &sqlite3_error_msg) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"BEGIN EXCLUSIVE\") failed! -> %s", sqlite3_error_msg); + sqlite3_free(sqlite3_error_msg); + sqlite3_close(db); + return -1; + } + + char query[1024] = {0, }; + sprintf(query, "update package_app_info set app_taskmanage='%s' where app_id='%s'", + task_manage ? "true" : "false", app_id); + + if (sqlite3_exec(db, query, NULL, NULL, &sqlite3_error_msg) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"%s\") failed! -> %s", query, sqlite3_error_msg); + sqlite3_free(sqlite3_error_msg); + sqlite3_close(db); + return -1; + } + + if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"COMMIT\") failed!"); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(db); + return -1; + } + + sqlite3_close(db); + + return 0; +} + +int update_x_slp_taskmanage_field(const char* app_id, int x_slp_taskmanage) +{ + sqlite3 *db = NULL; + char *sqlite3_error_msg = NULL; + + if (sqlite3_open(APP_INFO_DB_PATH, &db) != SQLITE_OK) { + WrtLogE("sqlite3_open() failed! -> %s\n", sqlite3_errmsg(db)); + return -1; + } + + if (sqlite3_exec(db, "PRAGMA journal_mode = PERSIST", NULL, NULL, &sqlite3_error_msg) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"PRAGMA journal_mode = PERSIST\") failed! -> %s", sqlite3_error_msg); + sqlite3_free(sqlite3_error_msg); + sqlite3_close(db); + return -1; + } + + if (sqlite3_exec(db, "BEGIN EXCLUSIVE", NULL, NULL, &sqlite3_error_msg) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"BEGIN EXCLUSIVE\") failed! -> %s", sqlite3_error_msg); + sqlite3_free(sqlite3_error_msg); + sqlite3_close(db); + return -1; + } + + char query[1024] = {0, }; + sprintf(query, "update app_info set x_slp_taskmanage=%d where package='%s'", + x_slp_taskmanage ? 1 : 0, app_id); + + if (sqlite3_exec(db, query, NULL, NULL, &sqlite3_error_msg) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"%s\") failed! -> %s", query, sqlite3_error_msg); + sqlite3_free(sqlite3_error_msg); + sqlite3_close(db); + return -1; + } + + if (sqlite3_exec(db, "COMMIT", NULL, NULL, NULL) != SQLITE_OK) { + WrtLogE("sqlite3_exec(\"COMMIT\") failed!"); + sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); + sqlite3_close(db); + return -1; + } + + sqlite3_close(db); + + return 0; +} + +int pre_launching_request(const char* app_id) +{ + bundle *kb = bundle_create(); + + if (kb == NULL){ + WrtLogE("bundle_create() failed!"); + return -1; + } + + if (bundle_add(kb, AUL_K_PRELAUCHING, "TRUE") != 0) { + WrtLogE("bundle_add() failed!"); + bundle_free(kb); + return -1; + } + + aul_launch_app(app_id, kb); + bundle_free(kb); + + if (rua_init() == 0) { + if (rua_is_latest_app(app_id) != 0) { + WrtLogD("update_task_manage_field(%s, %d)", app_id, 0); + update_task_manage_field(app_id, 0); + update_x_slp_taskmanage_field(app_id, 0); + } + + rua_fini(); + } + + return 0; +} + +} // anonymous namespace + +void add_to_pre_launching_info_list(const char* app_id, int pid) +{ + WrtLogD("enter"); + std::string appId = app_id; + + if (s_InfoList.find(appId) == s_InfoList.end()) { + s_InfoList[appId] = PreLaunchingInfo(pid, time(NULL)); + } + else { + time_t curTime = time(NULL); + time_t pastTime = curTime - s_InfoList[appId].launchedTime; + + s_InfoList[appId].pid = pid; + s_InfoList[appId].launchedTime = curTime; + + if (pastTime <= RE_LAUNCHING_LIMIT_TIME) { + --s_InfoList[appId].shortTermCounter; + WrtLogD("s_InfoList[%s].shortTermCounter = %d -> %d ", app_id, + s_InfoList[appId].shortTermCounter+1, + s_InfoList[appId].shortTermCounter); + } + else { + s_InfoList[appId].shortTermCounter = SHORT_TERM_COUNTER; + } + } +} + +int re_pre_launch_by_pid(int pid, bool isCrashed) +{ + using namespace std; + WrtLogD("enter"); + + if (!isCrashed) { + map::iterator it = s_InfoList.begin(); + + while (it != s_InfoList.end()) { + if (pid == it->second.pid) { + WrtLogD("matched!!"); + break; + } + ++it; + } + + if (it != s_InfoList.end()) { + WrtLogD("pre_launching_requeset"); + + if (it->second.shortTermCounter > 1) { + if (is_pre_launching_appid(it->first.c_str())) { + int fork_pid = fork(); + + if (fork_pid == 0) { + pre_launching_request(it->first.c_str()); + _exit(0); + } + } + else { + it->second.pid = 0; + } + } + else { + WrtLogD("blocked by shortTermCounter"); + } + } + } + + return 0; +} + +int is_pre_launching_appid(const char* app_id) +{ + int ret_value = 0; + struct stat file_status; + + if (stat(PRE_LAUNCHING_LIST_DIR, &file_status) == 0) { + if (S_ISDIR(file_status.st_mode)) { + int ret; + DIR *dir = NULL; + struct dirent entry, *result; + + dir = opendir(PRE_LAUNCHING_LIST_DIR); + + if (dir) { + for (ret = readdir_r(dir, &entry, &result); + result != NULL && ret == 0; + ret = readdir_r(dir, &entry, &result)) { + if (strncmp(entry.d_name, ".", 2) == 0 || + strncmp(entry.d_name, "..", 3) == 0) { + continue; + } + + if (strcmp(app_id, entry.d_name) == 0) { + ret_value = 1; + break; + } + } + + closedir(dir); + } + } + } + + return ret_value; +} + +void pre_launch_webapps() +{ + if (fork() == 0) { + // new process + sleep(TIME_FOR_PRE_LAUNCHING_AFTER_BOOTING); + + struct stat file_status; + if (stat(PRE_LAUNCHING_LIST_DIR, &file_status) == 0) { + if (S_ISDIR(file_status.st_mode)) { + int ret; + DIR *dir = NULL; + struct dirent entry, *result; + + dir = opendir(PRE_LAUNCHING_LIST_DIR); + + if (dir) { + for (ret = readdir_r(dir, &entry, &result); + result != NULL && ret == 0; + ret = readdir_r(dir, &entry, &result)) { + if (strncmp(entry.d_name, ".", 2) == 0 || + strncmp(entry.d_name, "..", 3) == 0) { + continue; + } + + WrtLogD("Try to pre-launching : %s", entry.d_name); + pre_launching_request(entry.d_name); + sleep(TIME_FOR_NEXT_PRE_LAUNCHING); + } + + closedir(dir); + } + } + } + + _exit(0); + } +} diff --git a/src/wrt-launchpad-daemon/src/process_pool.cpp b/src/wrt-launchpad-daemon/src/process_pool.cpp new file mode 100644 index 0000000..471cb2d --- /dev/null +++ b/src/wrt-launchpad-daemon/src/process_pool.cpp @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file process_pool.c + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + * @version 0.1 + * @brief process pool socket apis + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "process_pool.h" +#include "simple_util.h" + +#define TMP_PATH "/tmp" +#define PROCESS_POOL_SERVER "wrt_process_pool_server" +#define MAX_PENDING_CONNECTIONS 10 +#define CONNECT_RETRY_TIME 100 * 1000 +#define CONNECT_RETRY_COUNT 3 + +int __create_process_pool_server() +{ + struct sockaddr_un addr; + int fd = -1; + int listen_fds=0; + int i; + + memset(&addr, 0x00, sizeof(struct sockaddr_un)); + addr.sun_family = AF_UNIX; + snprintf(addr.sun_path, UNIX_PATH_MAX, "%s/%s", TMP_PATH, PROCESS_POOL_SERVER); + + listen_fds = sd_listen_fds(0); + if (listen_fds < 0) + { + WrtLogE("invalid systemd environment"); + return -1; + } + else if (listen_fds > 0) + { + for (i = 0; i < listen_fds; i++) + { + fd = SD_LISTEN_FDS_START + i; + if (sd_is_socket_unix(fd, SOCK_STREAM, 1, addr.sun_path, 0)) + return fd; + } + WrtLogE("socket not found: %s", addr.sun_path); + return -1; + } + + fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + + if (fd < 0) + { + WrtLogE("socket error"); + goto err_create_process_pool_server; + } + + unlink(addr.sun_path); + + WrtLogD("bind to %s", addr.sun_path); + if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + WrtLogE("bind error"); + goto err_create_process_pool_server; + } + + WrtLogD("chmod to %s", addr.sun_path); + if (chmod(addr.sun_path, (S_IRWXU | S_IRWXG | S_IRWXO)) < 0) + { + WrtLogE("chmod error"); + goto err_create_process_pool_server; + } + + WrtLogD("listen to %s", addr.sun_path); + if (listen(fd, MAX_PENDING_CONNECTIONS) == -1) + { + WrtLogE("listen error"); + goto err_create_process_pool_server; + } + + WrtLogD("__create_process_pool_server done : %d", fd); + return fd; + + +err_create_process_pool_server: + + if (fd != -1) + { + close(fd); + } + + return -1; +} + + +int __connect_process_pool_server() +{ + struct sockaddr_un addr; + int fd = -1; + int retry = CONNECT_RETRY_COUNT; + int send_ret = -1; + int client_pid = getpid(); + + memset(&addr, 0x00, sizeof(struct sockaddr_un)); + + fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + + if (fd < 0) + { + WrtLogE("socket error"); + + goto err_connect_process_pool_server; + } + + addr.sun_family = AF_UNIX; + snprintf(addr.sun_path, UNIX_PATH_MAX, "%s/%s", TMP_PATH, PROCESS_POOL_SERVER); + + + WrtLogD("connect to %s", addr.sun_path); + while (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + if (errno != ETIMEDOUT || retry <= 0) + { + WrtLogE("connect error : %d", errno); + + goto err_connect_process_pool_server; + } + + usleep(CONNECT_RETRY_TIME); + retry--; + WrtLogD("re-connect to %s (%d)", addr.sun_path, retry); + } + + send_ret = send(fd, &client_pid, sizeof(client_pid), 0); + WrtLogD("send(%d) : %d", client_pid, send_ret); + + if (send_ret == -1) + { + WrtLogE("send error"); + + goto err_connect_process_pool_server; + } + + WrtLogD("__connect_process_pool_server done : %d", fd); + return fd; + +err_connect_process_pool_server: + + if (fd != -1) + { + close(fd); + } + + return -1; +} + + +int __accept_dummy_process(int server_fd, int* out_client_fd, int* out_client_pid) +{ + int client_fd = -1, client_pid = 0, recv_ret = 0; + + if (server_fd == -1 || out_client_fd == NULL || out_client_pid == NULL) + { + WrtLogE("arguments error!"); + + goto err__accept_dummy_process; + } + + client_fd = accept(server_fd, NULL, NULL); + + if (client_fd == -1) + { + WrtLogE("accept error!"); + + goto err__accept_dummy_process; + } + + recv_ret = recv(client_fd, &client_pid, sizeof(client_pid), MSG_WAITALL); + + if (recv_ret == -1) + { + WrtLogE("recv error!"); + + goto err__accept_dummy_process; + } + + *out_client_fd = client_fd; + *out_client_pid = client_pid; + + return *out_client_fd; + +err__accept_dummy_process: + + if (client_fd != -1) + { + close(client_fd); + } + + return -1; +} + +void __refuse_dummy_process(int server_fd) +{ + int client_fd = -1; + + if (server_fd == -1) + { + WrtLogE("arguments error!"); + + goto err__refuse_dummy_process; + } + + client_fd = accept(server_fd, NULL, NULL); + + if (client_fd == -1) + { + WrtLogE("accept error!"); + + goto err__refuse_dummy_process;; + } + + close(client_fd); + WrtLogD("refuse connection!"); + +err__refuse_dummy_process: + return; +} + + +int __send_pkt_raw_data(int client_fd, app_pkt_t* pkt) +{ + int send_ret = 0; + int pkt_size = 0; + + if (client_fd == -1 || pkt == NULL) + { + WrtLogE("arguments error!"); + + goto err__send_pkt_raw_data; + } + + pkt_size = sizeof(pkt->cmd) + sizeof(pkt->len) + pkt->len; + + send_ret = send(client_fd, pkt, pkt_size, 0); + WrtLogD("send(%d) : %d / %d", client_fd, send_ret, pkt_size); + + if (send_ret == -1) + { + WrtLogE("send error!"); + + goto err__send_pkt_raw_data; + } + else if (send_ret != pkt_size) + { + WrtLogE("send byte fail!"); + + goto err__send_pkt_raw_data; + } + + return 0; + +err__send_pkt_raw_data: + + return -1; +} diff --git a/src/wrt-launchpad-daemon/src/simple_util.cpp b/src/wrt-launchpad-daemon/src/simple_util.cpp new file mode 100644 index 0000000..5fc93d4 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/simple_util.cpp @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "simple_util.h" + +#define BINSH_NAME "/bin/sh" +#define BINSH_SIZE 7 + +#define PROC_STAT_GID_POS 5 + +static inline int __read_proc(const char *path, char *buf, int size); +static inline int __find_pid_by_cmdline(const char *dname, + const char *cmdline, void *priv); +static inline int __get_pgid_from_stat(int pid); + +static inline int __read_proc(const char *path, char *buf, int size) +{ + int fd; + int ret; + + if (buf == NULL || path == NULL) { + return -1; + } + + fd = open(path, O_RDONLY); + if (fd < 0) { + return -1; + } + + ret = read(fd, buf, size - 1); + if (ret <= 0) { + close(fd); + return -1; + } else { + buf[ret] = 0; + } + + close(fd); + + return ret; +} + +static inline int __find_pid_by_cmdline(const char *dname, + const char *cmdline, void *priv) +{ + char *apppath; + int pid = 0; + + apppath = (char *)priv; + if (strncmp(cmdline, apppath, MAX_LOCAL_BUFSZ - 1) == 0) { + pid = atoi(dname); +#if !ENABLE(ONE_UI_PROCESS_MODEL) + if (pid != getpgid(pid)) { + pid = 0; + } +#endif + } + + return pid; +} + +int __proc_iter_cmdline( + int (*iterfunc)(const char *dname, const char *cmdline, void *priv), + void *priv) +{ + DIR *dp; + struct dirent dentry; + struct dirent *result; + int pid; + int ret; + char buf[MAX_LOCAL_BUFSZ]; + + dp = opendir("/proc"); + if (dp == NULL) { + return -1; + } + + if (iterfunc == NULL) { + iterfunc = __find_pid_by_cmdline; + } + + while (readdir_r(dp, &dentry, &result) == 0 && result != NULL) { + if (!isdigit(dentry.d_name[0])) { + continue; + } + + snprintf(buf, sizeof(buf), "/proc/%s/cmdline", dentry.d_name); + ret = __read_proc(buf, buf, sizeof(buf)); + if (ret <= 0) { + continue; + } + + /* support app launched by shell script*/ + if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0) { + pid = + iterfunc(dentry.d_name, &buf[BINSH_SIZE + 1], + priv); + } else { + pid = iterfunc(dentry.d_name, buf, priv); + } + + if (pid > 0) { + closedir(dp); + return pid; + } + } + + closedir(dp); + return -1; +} + +char *__proc_get_cmdline_bypid(int pid) +{ + char buf[MAX_LOCAL_BUFSZ]; + int ret; + + snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid); + ret = __read_proc(buf, buf, sizeof(buf)); + if (ret <= 0) { + return NULL; + } + + /* support app launched by shell script*/ + if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0) { + return strdup(&buf[BINSH_SIZE + 1]); + } else { + return strdup(buf); + } +} + +static inline int __get_pgid_from_stat(int pid) +{ + char buf[MAX_LOCAL_BUFSZ] = { 0, }; + char *str = NULL; + int ret; + int i; + int count = 0; + + if (pid <= 1) { + return -1; + } + + snprintf(buf, sizeof(buf), "/proc/%d/stat", pid); + ret = __read_proc(buf, buf, sizeof(buf)); + if (ret < 0) { + return -1; + } + + for (i = 0; i < (ret - 1); i++) { + if (buf[i] == ' ') { + count++; + if (count == PROC_STAT_GID_POS - 1) { + str = &(buf[i + 1]); + } else if (count == PROC_STAT_GID_POS) { + buf[i] = 0; + break; + } + } + } + + if (count == PROC_STAT_GID_POS && str != NULL) { + pid = atoi(str); + } else { + pid = -1; + } + + return pid; +} + +int __proc_iter_pgid(int pgid, int (*iterfunc)(int pid, void *priv), + void *priv) +{ + DIR *dp; + struct dirent dentry; + struct dirent *result; + int _pgid; + int ret = -1; + + dp = opendir("/proc"); + if (dp == NULL) { + return -1; + } + + while (readdir_r(dp, &dentry, &result) == 0 && result != NULL) { + if (!isdigit(dentry.d_name[0])) { + continue; + } + + _pgid = __get_pgid_from_stat(atoi(dentry.d_name)); + if (pgid == _pgid) { + ret = iterfunc(atoi(dentry.d_name), priv); + if (ret >= 0) { + break; + } + } + } + + closedir(dp); + return ret; +} + diff --git a/src/wrt-launchpad-daemon/src/web_app_core.cpp b/src/wrt-launchpad-daemon/src/web_app_core.cpp new file mode 100644 index 0000000..4cb2bd9 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/web_app_core.cpp @@ -0,0 +1,435 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file web_app_core.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "web_app_core.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#define WEBAPP_DEFAULT_UID 5000 + +namespace { +} // anonymous namespace + +WebAppCore::WebAppCore() : + m_initialized(false) +{ +} + +WebAppCore::~WebAppCore() +{ +} + +bool WebAppCore::initialize() +{ + WrtLogD("initialize"); + + if (m_initialized) { + WrtLogD("Already initialized"); + return false; + } + elm_init(0, NULL); +#if USE(EFL_LITE) + elm_app_base_scale_set(1.8); +#else + elm_app_base_scale_set(2.4); +#endif + m_manager.reset(new WebAppManager()); + m_webAppCoreDataManager.reset(new WebAppCoreDataManager()); + if (!addEcoreXWindowHandlers()) { + WrtLogE("Error creating X Window Handlers"); + return false; + } + WebInternalEventSingleton::Instance().addListner(WebInternalEventSingleton::Instance().WEB_APP_TERMINATE, + terminateEventCallback, this); + WebInternalEventSingleton::Instance().addListner(WebInternalEventSingleton::Instance().POPUP_REPLY_WAIT_START, + popupReplyWaitStartEventCallback, this); + WebInternalEventSingleton::Instance().addListner(WebInternalEventSingleton::Instance().POPUP_REPLY_WAIT_FINISH, + popupReplyWaitFinishEventCallback, this); + m_initialized = true; + return true; +} + +bool WebAppCore::launchRequest(int argc, char* argv[]) +{ + WrtLogD("launchRequest"); + + bundle* b = bundle_import_from_argv(argc, argv); + if (b == NULL) { + WrtLogE("bundle for APP_START is NULL"); + return false; + } + + const char* appid = bundle_get_val(b, AUL_K_PKG_NAME); + WrtLogD("appid : %s", appid); + m_webAppCoreDataManager->add(appid); + if (!appid || strlen(appid) == 0) { + WrtLogE("empty app name"); + bundle_free(b); + m_webAppCoreDataManager->remove(appid); + return false; + } + + if (!m_manager->create(appid, b)) { + WrtLogE("Terminate by app"); + bundle_free(b); + m_webAppCoreDataManager->remove(appid); + return false; + } + + return true; +} + +void WebAppCore::setPidToAppID(const char* appId, unsigned int pid) +{ + WrtLogD("setPidToAppID Appid : %s Pid : %d", appId, pid); + m_webAppCoreDataManager->setPid(appId, pid); +} + +void WebAppCore::aulSocketHandler(app_pkt_t* pkt, int clifd, ucred cr) +{ + WrtLogD("called"); + + if (pkt->cmd != APP_RESULT && pkt->cmd != APP_CANCEL) { + int ret = __app_send_result_to_launchpad(clifd, 0); + if (ret < 0) { + free(pkt); + return; + } + } else { + close(clifd); + } + WrtLogD("Received command : %d", pkt->cmd); + + bundle* b = bundle_decode(pkt->data, pkt->len); + std::string appId = bundle_get_val(b, AUL_K_PKG_NAME); + WrtLogD("Web app : %s", appId.c_str()); + pid_t pid = m_webAppCoreDataManager->getPid(appId); + + switch (pkt->cmd) { + case APP_START: + case APP_START_RES: + case APP_START_ASYNC: + WrtLogD("[WebAppCore] APP_START"); + m_manager->service(appId, b); + if (m_webAppCoreDataManager->isSuspended(appId)) { + m_webAppCoreDataManager->resume(appId); + } + break; + + case APP_OPEN: + case APP_RESUME: + WrtLogD("[WebAppCore] APP_RESUME"); + m_manager->resume(appId); + case APP_RESUME_BY_PID: + WrtLogD("[WebAppCore] APP_RESUME_BY_PID"); + if (pid < 0) { + WrtLogE("Wrong pid"); + } + if (!WebAppCoreXUtil::raiseWin(pid)) { + WrtLogE("Fail to raise win"); + } + break; + + case APP_TERM_BY_PID: + WrtLogD("[WebAppCore] APP_TERM"); + m_manager->terminate(appId); + m_webAppCoreDataManager->remove(appId); + break; + + case APP_TERM_REQ_BY_PID: + WrtLogD("[WebAppCore] APP_TERM_REQ_BY_PID"); + m_manager->terminate(appId); + m_webAppCoreDataManager->remove(appId); + break; + + case APP_RESULT: + case APP_CANCEL: + WrtLogD("[WebAppCore] APP_RESULT & APP_CANCEL"); + break; + + case APP_KEY_EVENT: + WrtLogD("[WebAppCore] APP_KEY_EVENT"); + //app_key_event(b); + break; + + default: + WrtLogW("no support packet"); + } + bundle_free(b); + free(pkt); + + return; +} + +Eina_Bool WebAppCore::ecoreXWindowShowCallback(void* data, int type, void* event) +{ + Assert(data); + Assert(event); + + DPL_UNUSED_PARAM(type); + + WebAppCore* This = static_cast(data); + Ecore_X_Event_Window_Show* ev = static_cast(event); + + WrtLogD("GET SHOW EVENT [%u]", ev->win); + + Ecore_X_Window parent; + int ret = ecore_x_window_prop_window_get(ev->win, This->m_atomParent, &parent, 1); + if (ret != 1) { + WrtLogD("Ignore Event"); + return ECORE_CALLBACK_RENEW; + } + + char* appId = ecore_x_window_prop_string_get(ev->win, ECORE_X_ATOM_UTF8_STRING); + if (!appId || strlen(appId) == 0) { + WrtLogW("appId is NULL"); + return ECORE_CALLBACK_RENEW; + } + + pid_t pid = This->m_webAppCoreDataManager->getPid(appId); + if (pid < 0) { + WrtLogE("Wrong pid"); + } else { + ecore_x_window_prop_property_set(ev->win, ECORE_X_ATOM_NET_WM_PID, ECORE_X_ATOM_CARDINAL, 32, &pid, 1); + } + + This->m_webAppCoreDataManager->show(appId); + + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool WebAppCore::ecoreXWindowHideCallback(void* data, int type, void* event) +{ + Assert(data); + Assert(event); + + DPL_UNUSED_PARAM(type); + + WebAppCore* This = static_cast(data); + Ecore_X_Event_Window_Hide* ev = static_cast(event); + + WrtLogD("GET HIDE EVENT [%u]", ev->win); + + char* appId = ecore_x_window_prop_string_get(ev->win, ECORE_X_ATOM_UTF8_STRING); + if (!appId || strlen(appId) == 0) { + WrtLogW("appid is null"); + return ECORE_CALLBACK_RENEW; + } + + This->m_manager->suspend(appId); + This->m_webAppCoreDataManager->hide(appId); + captureAndMakeFileForTaskMgr(ev->win, appId); + free(appId); + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool WebAppCore::ecoreXWindowVisibilityChangeCallback(void* data, int type, void* event) +{ + Assert(data); + Assert(event); + + DPL_UNUSED_PARAM(type); + + WebAppCore* This = static_cast(data); + Ecore_X_Event_Window_Visibility_Change* ev = static_cast(event); + + WrtLogD("GET Change Visiblity EVENT [%u]", ev->win); + + char* appId = ecore_x_window_prop_string_get(ev->win, ECORE_X_ATOM_UTF8_STRING); + if (!appId || strlen(appId) == 0) { + WrtLogW("appid is null"); + return ECORE_CALLBACK_RENEW; + } + if (!This->m_webAppCoreDataManager->isAppIdFound(appId)) { + return ECORE_CALLBACK_RENEW; + } + + //check status + if(ev->fully_obscured == 0) { + WrtLogD("Resume Visiblity EVENT [%u]", ev->win); + if (This->m_webAppCoreDataManager->isSuspended(appId)) { + This->m_manager->resume(appId); + This->m_webAppCoreDataManager->resume(appId); + } + } else if(ev->fully_obscured == 1) { + WrtLogD("Suspend Visiblity EVENT [%u]", ev->win); + if (This->m_webAppCoreDataManager->isResumed(appId)) { + This->m_manager->suspend(appId); + This->m_webAppCoreDataManager->suspend(appId); + captureAndMakeFileForTaskMgr(ev->win, appId); + } + } else { + WrtLogD("Ignore Visiblity EVENT"); + } + + free(appId); + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool WebAppCore::ecoreXWindowEventClientCallback(void *data, int type, void *event) +{ + Assert(data); + Assert(event); + + DPL_UNUSED_PARAM(type); + + WebAppCore* This = static_cast(data); + Ecore_X_Event_Client_Message* ev = static_cast(event); + + char* appId = ecore_x_window_prop_string_get(ev->win, ECORE_X_ATOM_UTF8_STRING); + if (!appId || strlen(appId) == 0) { + WrtLogW("appid is null"); + return ECORE_CALLBACK_PASS_ON; + } + if (ev->message_type == This->m_atomParent && appId) { + WrtLogD("_E_ILLUME_ATOM_APPCORE_RECAPTURE_REQUEST win(%x)", ev->win); + captureAndMakeFileForTaskMgr(ev->win, appId); + } + free(appId); + return ECORE_CALLBACK_PASS_ON; +} + +bool WebAppCore::addEcoreXWindowHandlers() +{ + WrtLogD("addEcoreXWindowHandlers"); + + m_atomParent = ecore_x_atom_get("_E_PARENT_BORDER_WINDOW"); + if (!m_atomParent) { + WrtLogE("Error getting x atom from parent"); + return false; + } + + m_ecoreEventWindowShowHandler = + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, ecoreXWindowShowCallback, this); + m_ecoreEventHideWindowShowHandler = + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, ecoreXWindowHideCallback, this); + m_ecoreEventVisibilityChangeHandler = + ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, ecoreXWindowVisibilityChangeCallback, this); + m_ecoreEventTaskMgrImageCreationHandler = + ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, ecoreXWindowEventClientCallback, this); + return true; +} + +Eina_Bool WebAppCore::terminateEventCallback(void *data, int type, void *event) +{ + char *appId = (char*)event; + if (appId) { + WrtLogD("Terminate APP with ID : %s", appId); + WebAppCore *This = (WebAppCore*)data; + This->m_manager->terminate(appId); + This->m_webAppCoreDataManager->remove(appId); + free(appId); + } + return ECORE_CALLBACK_CANCEL; +} + +Eina_Bool WebAppCore::popupReplyWaitEventAulHandler(void* data, Ecore_Fd_Handler* handler) +{ + WrtLogD("AUL handler"); + Assert(data); + + WebAppCore* This = static_cast(data); + int fd = ecore_main_fd_handler_fd_get(handler); + int clifd = -1; + struct ucred cr; + + app_pkt_t* pkt = __app_recv_raw(fd, &clifd, &cr); + if (!pkt) { + WrtLogD("packet is NULL"); + return ECORE_CALLBACK_RENEW; + } + + bundle* b = bundle_decode(pkt->data, pkt->len); + if (!b) { + std::string appId = This->m_webAppCoreDataManager->getAppIdFromFd(fd); + if(appId.empty()){ + WrtLogW("appid is null"); + return ECORE_CALLBACK_RENEW; + } + bundle_raw *bundleData; + b = bundle_create(); + bundle_add(b, AUL_K_PKG_NAME, appId.c_str()); + bundle_encode(b, &bundleData, &pkt->len); + memcpy(pkt->data, bundleData, pkt->len); + } + This->aulSocketHandler(pkt, clifd, cr); + bundle_free(b); + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool WebAppCore::popupReplyWaitStartEventCallback(void *data, int type, void *event) +{ + WrtLogD("wait popup reply"); + Assert(data); + + char *appId = (char*)event; + if (!appId || strlen(appId) == 0) { + WrtLogW("appid is null"); + return ECORE_CALLBACK_CANCEL; + } + + WebAppCore *This = (WebAppCore*)data; + int fd = __create_server_sock(This->m_webAppCoreDataManager->getPid(appId)); + if (fd < 0) { + WrtLogE("create sock failed"); + return false; + } + + Ecore_Fd_Handler* fdHandler = ecore_main_fd_handler_add(fd, + (Ecore_Fd_Handler_Flags)(ECORE_FD_READ|ECORE_FD_ERROR), + popupReplyWaitEventAulHandler, This, NULL, NULL); + This->m_webAppCoreDataManager->setFd(appId, fdHandler); + free(appId); + + return ECORE_CALLBACK_CANCEL; +} + +Eina_Bool WebAppCore::popupReplyWaitFinishEventCallback(void *data, int type, void *event) +{ + WrtLogD("finish popup reply"); + + char *appId = (char*)event; + if (!appId || strlen(appId) == 0) { + WrtLogW("appid is null"); + return ECORE_CALLBACK_CANCEL; + } + + WebAppCore *This = (WebAppCore*)data; + Ecore_Fd_Handler* fdHandler = This->m_webAppCoreDataManager->getFd(appId); + int fd = ecore_main_fd_handler_fd_get(fdHandler); + ecore_main_fd_handler_del(fdHandler); + close(fd); + + This->m_webAppCoreDataManager->setFd(appId, NULL); + This->m_manager->resetAulConnection(appId); + return ECORE_CALLBACK_CANCEL; +} diff --git a/src/wrt-launchpad-daemon/src/web_app_core_data.cpp b/src/wrt-launchpad-daemon/src/web_app_core_data.cpp new file mode 100644 index 0000000..a7f2838 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/web_app_core_data.cpp @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file web_app_core_data.cpp + * @author Leerang Song (leerang.song@samsung.com) + */ + +#include "web_app_core_data.h" + +#include +#include + +#include +#include +#include +#include + +namespace { +} // anonymous namespace + +WebAppCoreDataManager::WebAppCoreDataManager() +{ +} + +WebAppCoreDataManager::~WebAppCoreDataManager() +{ +} + +bool WebAppCoreDataManager::add(const std::string& appId) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + return false; + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it != m_webAppCoreDataMap.end()) { + WrtLogE("already exist"); + return false; + } + + WebAppCoreData* data = new WebAppCoreData(); + data->status = WebAppCoreDataManager::Status::CREATED; + data->pid = -1; + m_webAppCoreDataMap.insert(WebAppCoreDataPair(appId, data)); + + return true; +} + +bool WebAppCoreDataManager::remove(const std::string& appId) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + return false; + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data"); + return false; + } + + m_webAppCoreDataMap.erase(it); + + return true; +} + +void WebAppCoreDataManager::show(const std::string& appId) +{ + setStatus(appId, WebAppCoreDataManager::Status::RUNNING); +} + +void WebAppCoreDataManager::hide(const std::string& appId) +{ + DPL_UNUSED_PARAM(appId); + // TODO sth +} + +void WebAppCoreDataManager::resume(const std::string& appId) +{ + setStatus(appId, WebAppCoreDataManager::Status::RUNNING); +} + +void WebAppCoreDataManager::suspend(const std::string& appId) +{ + setStatus(appId, WebAppCoreDataManager::Status::SUSPENDED); +} + +bool WebAppCoreDataManager::isResumed(const std::string& appId) +{ + return compareStatus(appId, WebAppCoreDataManager::Status::RUNNING); +} + +bool WebAppCoreDataManager::isSuspended(const std::string& appId) +{ + return compareStatus(appId, WebAppCoreDataManager::Status::SUSPENDED); +} + +bool WebAppCoreDataManager::isAppIdFound(const std::string& appId) +{ + if (appId.empty()) + return false; + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("appid not found in map"); + return false; + } + return true; +} + +WebAppCoreDataManager::Status WebAppCoreDataManager::getStatus(const std::string& appId) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data found for given pid"); + Assert(false); + } + + return it->second->status; +} + +void WebAppCoreDataManager::setStatus(const std::string& appId, Status status) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data"); + Assert(false); + } + + it->second->status = status; + return; +} + +bool WebAppCoreDataManager::compareStatus(const std::string& appId, Status status) +{ + return getStatus(appId) == status ? true : false; +} + +void WebAppCoreDataManager::setPid(const std::string& appId, pid_t pid) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data"); + Assert(false); + } + + it->second->pid = pid; +} + +pid_t WebAppCoreDataManager::getPid(const std::string& appId) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data"); + Assert(false); + } + + return it->second->pid; +} + +void WebAppCoreDataManager::setFd(const std::string& appId, Ecore_Fd_Handler* fd) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data"); + Assert(false); + } + + it->second->fd = fd; +} + +Ecore_Fd_Handler* WebAppCoreDataManager::getFd(const std::string& appId) +{ + if (appId.empty()) { + WrtLogE("appid is empty"); + Assert(false); + } + + auto it = m_webAppCoreDataMap.find(appId); + if (it == m_webAppCoreDataMap.end()) { + WrtLogE("No data"); + Assert(false); + } + + return it->second->fd; +} + +std::string WebAppCoreDataManager::getAppIdFromFd(int fd) +{ + if (fd < 0) { + WrtLogE("fail to get fd"); + Assert(false); + } + std::string str=""; + + for (auto it = m_webAppCoreDataMap.begin(); it != m_webAppCoreDataMap.end(); ++it) { + if (ecore_main_fd_handler_fd_get(it->second->fd) == fd) { + str = it->first; + break; + } + } + return str; +} diff --git a/src/wrt-launchpad-daemon/src/web_app_core_tskmgr_util.cpp b/src/wrt-launchpad-daemon/src/web_app_core_tskmgr_util.cpp new file mode 100644 index 0000000..35c4b85 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/web_app_core_tskmgr_util.cpp @@ -0,0 +1,491 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file web_app_core_tskmgr_util.cpp + * @author Prathmesh Manurkar (prathmesh.m@samsung.com) + */ + +#include "web_app_core_tskmgr_util.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define QUALITY_N_COMPRESS "quality=100 compress=1" + +static Evas *createVirtualCanvas(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) { + WrtLogW("Failed to create a new canvas buffer"); + 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); + WrtLogW("Faield to get Evas object"); + return NULL; + } + + return internal_e; +} + + + +static bool flushDataToFile(Evas *e, void *data, const char *filename, int w, int h) +{ + Evas_Object *output; + + output = evas_object_image_add(e); + if (!output) { + WrtLogW("Failed to create an image object"); + 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); + WrtLogW("Faild to save a captured image (%s)", filename); + return false; + } + + evas_object_del(output); + + if (access(filename, F_OK) != 0) { + WrtLogW("File %s is not found", filename); + return false; + } + + return true; +} + + + +static bool flushVirtualCanvasToFile(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) { + WrtLogW("Failed to get ecore evas"); + 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) { + WrtLogW("Failed to get pixel data"); + return false; + } + + return flushDataToFile(e, data, filename, w, h); +} + + + +static bool destroyVirtualCanvas(Evas *e) +{ + Ecore_Evas *ee; + + ee = ecore_evas_ecore_evas_get(e); + if (!ee) { + WrtLogW("Failed to ecore evas object"); + return false; + } + + ecore_evas_free(ee); + return true; +} + +static Window getParentWindow(Window id) +{ + Window root; + Window parent; + Window *children; + unsigned int num; + + if (!XQueryTree((Display*)ecore_x_display_get(), id, &root, &parent, &children, &num)) { + return 0; + } + + if (children) { + XFree(children); + } + + return parent; +} + +static Window findCaptureWindow(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((Display*)ecore_x_display_get(), id, &attr)) { + return (Window)-1; + } + + parent = getParentWindow(id); + + if (attr.map_state == IsViewable + && attr.override_redirect == true + && attr.c_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((Display*)ecore_x_display_get(), orig_id, &attr); + *depth = attr.depth; + *width = attr.width; + *height = attr.height; + *visual = attr.visual; + + return (Window) 0; + +} + +static char *captureWindow(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) { + WrtLogW("shmget"); + return NULL; + } + + si.readOnly = False; + si.shmaddr = (char*)shmat(si.shmid, NULL, 0); + + if (si.shmaddr == (char *)-1) { + shmdt(si.shmaddr); + shmctl(si.shmid, IPC_RMID, 0); + return NULL; + } + + xim = XShmCreateImage((Display*)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((Display*)ecore_x_display_get(), False); + XShmAttach((Display*)ecore_x_display_get(), &si); + XShmGetImage((Display*)ecore_x_display_get(), id, xim, 0, 0, 0xFFFFFFFF); + XSync((Display*)ecore_x_display_get(), False); + + captured_img = (char*)calloc(1, img_size); + if (captured_img) { + memcpy(captured_img, xim->data, img_size); + } else { + WrtLogD("calloc"); + } + + XShmDetach((Display*)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 +int getAngle(Ecore_X_Window win) +{ + WrtLogD("getAngle called"); + + int after = -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]; + } while (0); + + if (-1 == after) after = 0; + + return after; +} + +static void rotateImg(Evas_Object *image_object, int angle, int cx, int cy) +{ + Evas_Map *em; + + if (NULL == image_object) + return; + + em = evas_map_new(4); + if(NULL == em) + return; + + 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/usr/share/app_capture" +static bool makeCaptureFile(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; + + if (NULL == package) + return false; + + len = strlen(package) + EXTENSION_LEN; + filename = (char*)malloc(len); + if(NULL == filename) + return 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 = createVirtualCanvas(canvas_width, canvas_height); + if (NULL == e) + goto error; + + image_object = evas_object_image_add(e); + if (NULL == image_object) + goto 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); + rotateImg(image_object, angle, cx, cy); + evas_object_show(image_object); + + if (access(CAPTURE_FILE_PATH, F_OK) != 0) { + mkdir(CAPTURE_FILE_PATH, 0777); + } + if(false == flushVirtualCanvasToFile(e, filename, canvas_width, canvas_height)) + goto error; + + evas_object_del(image_object); + destroyVirtualCanvas(e); + free(filename); + + return true; + +error: + do { + free(filename); + + if (!e) break; + destroyVirtualCanvas(e); + + if (!image_object) break; + evas_object_del(image_object); + } while (0); + + return false; +} + +static int resizeTo8888(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 = (int*)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; +} + +void captureAndMakeFileForTaskMgr(Ecore_X_Window win, 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 = findCaptureWindow(win, &visual, &depth, &width, &height); + if (redirected_id == (Window) -1 || redirected_id == (Window) 0) { + return; + } + + WrtLogD("Capture : win[%x] -> redirected win[%x] for %s", win, redirected_id, package); + + img = captureWindow(redirected_id, visual, width, height, depth, &size); + if (NULL == img) { + return; + } + + width_out = width/2; + height_out = height/2; + + if ( width_out < 1 || height_out < 1 ) { + free(img); + return; + } + + resizeTo8888(img, img, width, height, width_out, height_out); + + angle = getAngle(win); + if (false == makeCaptureFile(package, width_out, height_out, img, angle)) { + WrtLogW("cannot a capture file for the package of [%s]", package); + } + + free(img); +} diff --git a/src/wrt-launchpad-daemon/src/web_app_core_x_util.cpp b/src/wrt-launchpad-daemon/src/web_app_core_x_util.cpp new file mode 100644 index 0000000..25e3706 --- /dev/null +++ b/src/wrt-launchpad-daemon/src/web_app_core_x_util.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file web_app_core_x_util.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + */ + +#include "web_app_core_x_util.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace { +pid_t getWinByPid(Display* d, Window win) +{ + XWindowAttributes attr; + if (!XGetWindowAttributes(d, win, &attr)) { + return -1; + } + + if (attr.override_redirect || attr.c_class == InputOnly) { + return -1; + } + + Atom atomType; + int format; + unsigned long nItems; + unsigned long afterBytes; + unsigned char* ret = NULL; + Atom atomPid = XInternAtom(d, "_NET_WM_PID", True); + int r = XGetWindowProperty(d, win, atomPid, 0, 1, False, XA_CARDINAL, &atomType, &format, &nItems, &afterBytes, &ret); + if (r != Success || ret == NULL) { + return -1; + } + + pid_t pid; + if (atomType == XA_CARDINAL && format == 32) { + pid = *reinterpret_cast(ret); + } else { + pid = -1; + } + + XFree(ret); + + return pid; +} + +int findWin(Display* d, Window* win, pid_t pid) +{ + pid_t p = getWinByPid(d, *win); + if (p == pid) { + return 1; + } + + Window root, parent, *child; + unsigned int n; + int r = XQueryTree(d, *win, &root, &parent, &child, &n); + if (r) { + int found = 0; + for (unsigned int i = 0; i < n; i++) { + found = findWin(d, &child[i], pid); + if (found) { + *win = child[i]; + break; + } + } + XFree(child); + + if (found) { + return 1; + } + } + + return 0; +} + +void internalRaiseWin(Display* d, Window win) +{ + XEvent xev; + xev.xclient.type = ClientMessage; + xev.xclient.display = d; + xev.xclient.window = win; + xev.xclient.message_type = XInternAtom(d, "_NET_ACTIVE_WINDOW", False); + 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; + Window root = XDefaultRootWindow(d); + XSendEvent(d, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); +} +} // anonymous namespace + +bool WebAppCoreXUtil::raiseWin(pid_t pid) +{ + WrtLogD("raise win pid[%d]", pid); + + if (pid < 1) { + WrtLogE("Wrong pid"); + return false; + } + + int ret = kill(pid, 0); + if (ret == -1) { + WrtLogE("No process"); + return false; + } + + Display* d = XOpenDisplay(NULL); + Window win = XDefaultRootWindow(d); + + int found = findWin(d, &win, pid); + if (!found) { + WrtLogE("Fail to find win"); + XCloseDisplay(d); + return false; + } + + internalRaiseWin(d, win); + + XCloseDisplay(d); + + return true; +} + diff --git a/src/wrt-launchpad-daemon/src/web_internal_eventloop.cpp b/src/wrt-launchpad-daemon/src/web_internal_eventloop.cpp new file mode 100644 index 0000000..cf9fb4e --- /dev/null +++ b/src/wrt-launchpad-daemon/src/web_internal_eventloop.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @file web_internal_eventloop.cpp + * @author Prathmesh (prathmesh.m@samsung.com) + */ + +#include "web_internal_eventloop.h" +#include + +IMPLEMENT_SAFE_SINGLETON(WebInternalEvent) + +WebInternalEvent::WebInternalEvent() +{ +} + +#ifdef SUPPORT_MULTIPLE_REQUEST +WebInternalEvent::~WebInternalEvent() +{ + for (auto it = m_webInternalEventMap.begin(); it != m_webInternalEventMap.end(); ++it) { + delete it->second; + } + m_webInternalEventMap.clear(); +} + +void WebInternalEvent::addListner(webInternalEventType type, Ecore_Event_Handler_Cb cbFunc, void *data) +{ + auto it = m_webInternalEventMap.find(type); + if (it != m_webInternalEventMap.end()) + return; + + WebInternalUserCBData* cbData = new WebInternalUserCBData(); + cbData->m_event = ecore_event_type_new(); + cbData->m_callerCallback = cbFunc; + cbData->m_data = data; + m_customEventHandler = ecore_event_handler_add(cbData->m_event, eventTriggeredCallback, this); + m_webInternalEventMap.insert(WebInternalEventPair(type, cbData)); +} + +void WebInternalEvent::deleteListner(webInternalEventType type) +{ + auto it = m_webInternalEventMap.find(type); + if (it != m_webInternalEventMap.end()) { + delete it->second; + m_webInternalEventMap.erase(it); + } +} + +void WebInternalEvent::sendEvent(webInternalEventType type, void *eventInfo) +{ + auto it = m_webInternalEventMap.find(type); + if (it != m_webInternalEventMap.end()) { + WebInternalUserCBData* cbData = it->second; + ecore_event_add(cbData->m_event, eventInfo, freeEventInfo, NULL); + } +} + +void WebInternalEvent::freeEventInfo(void *user_data, void *func_data) +{ + // Do nothing. Added here else the default free is called. + // Need to override the default free and insteed free after + // its done for us +} + +Eina_Bool WebInternalEvent::eventTriggeredCallback(void *data, int type, void *eventInfo) +{ + WebInternalEvent* This = (WebInternalEvent*)data; + + for (auto it = This->m_webInternalEventMap.begin(); it != This->m_webInternalEventMap.end(); ++it) { + WebInternalUserCBData* cbData = it->second; + if (cbData->m_event == type) { + cbData->m_callerCallback(cbData->m_data, it->first, eventInfo); + break; + } + } + return ECORE_CALLBACK_PASS_ON; +} + +#else // SUPPORT_MULTIPLE_REQUEST + +WebInternalEvent::~WebInternalEvent() +{ +} + +void WebInternalEvent::addListner(webInternalEventType type, Ecore_Event_Handler_Cb cbFunc, void *data) +{ + if (WEB_APP_TERMINATE == type) { + m_backEvent = ecore_event_type_new(); + m_customEventHandler = ecore_event_handler_add(m_backEvent, eventTriggeredCallback, this); + m_callerData = data; + m_callerCallback = cbFunc; + } +} + +void WebInternalEvent::deleteListner(webInternalEventType type) +{ + +} + +void WebInternalEvent::sendEvent(webInternalEventType type, void *eventInfo) +{ + if (WEB_APP_TERMINATE == type) { + ecore_event_add(m_backEvent, eventInfo, NULL, NULL); + } +} + +Eina_Bool WebInternalEvent::eventTriggeredCallback(void *data, int type, void *eventInfo) +{ + WebInternalEvent* This = (WebInternalEvent*)data; + if (This->m_backEvent == type) { + Ecore_Event_Handler_Cb cb = This->m_callerCallback; + cb(This->m_callerData, WEB_APP_TERMINATE, eventInfo); + } + return ECORE_CALLBACK_PASS_ON; +} +#endif // SUPPORT_MULTIPLE_REQUEST diff --git a/src/wrt-launchpad-daemon/wrt_launchpad_daemon.map b/src/wrt-launchpad-daemon/wrt_launchpad_daemon.map new file mode 100644 index 0000000..a15ae6e --- /dev/null +++ b/src/wrt-launchpad-daemon/wrt_launchpad_daemon.map @@ -0,0 +1,18 @@ +{ + global: + main; + _Jv_RegisterClasses; + __bss_end__; + __bss_start; + __bss_start__; + __cxa_finalize; + __end__; + __gmon_start__; + _bss_end__; + _edata; + _end; + _fini; + _init; + local: *; +}; + diff --git a/systemd/wrt_launchpad_daemon@.service b/systemd/wrt_launchpad_daemon@.service new file mode 100644 index 0000000..5863a1a --- /dev/null +++ b/systemd/wrt_launchpad_daemon@.service @@ -0,0 +1,13 @@ +[Unit] +Description=Start the wrt_launchpad_daemon +After=tizen-system.target + +[Service] +EnvironmentFile=/run/tizen-mobile-env +ExecStart=/usr/bin/wrt_launchpad_daemon " " +KillSignal=SIGKILL +Restart=always +RestartSec=0 + +[Install] +WantedBy=tizen-runtime.target diff --git a/systemd/wrt_launchpad_daemon_1.socket b/systemd/wrt_launchpad_daemon_1.socket new file mode 100644 index 0000000..9989eef --- /dev/null +++ b/systemd/wrt_launchpad_daemon_1.socket @@ -0,0 +1,10 @@ +[Socket] +ListenStream=/tmp/alaunch/-3 +DirectoryMode=0777 +SocketMode=0777 +SmackLabelIPIn=* +SmackLabelIPOut=@ +Service=wrt_launchpad_daemon@app.service + +[Install] +WantedBy=sockets.target diff --git a/systemd/wrt_launchpad_daemon_1.socket.in b/systemd/wrt_launchpad_daemon_1.socket.in new file mode 100644 index 0000000..9989eef --- /dev/null +++ b/systemd/wrt_launchpad_daemon_1.socket.in @@ -0,0 +1,10 @@ +[Socket] +ListenStream=/tmp/alaunch/-3 +DirectoryMode=0777 +SocketMode=0777 +SmackLabelIPIn=* +SmackLabelIPOut=@ +Service=wrt_launchpad_daemon@app.service + +[Install] +WantedBy=sockets.target diff --git a/systemd/wrt_launchpad_daemon_1.socket.lite.in b/systemd/wrt_launchpad_daemon_1.socket.lite.in new file mode 100644 index 0000000..57e89bb --- /dev/null +++ b/systemd/wrt_launchpad_daemon_1.socket.lite.in @@ -0,0 +1,10 @@ +[Socket] +ListenStream=/tmp/alaunch/-3 +DirectoryMode=0777 +SocketMode=0777 +SmackLabelIPIn=* +SmackLabelIPOut=wrt_launchpad_daemon +Service=wrt_launchpad_daemon@app.service + +[Install] +WantedBy=sockets.target diff --git a/systemd/wrt_launchpad_daemon_2.socket b/systemd/wrt_launchpad_daemon_2.socket new file mode 100644 index 0000000..dff27df --- /dev/null +++ b/systemd/wrt_launchpad_daemon_2.socket @@ -0,0 +1,7 @@ +[Socket] +ListenStream=/tmp/wrt_process_pool_server +SocketMode=0777 +Service=wrt_launchpad_daemon@app.service + +[Install] +WantedBy=sockets.target diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..da45ba9 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Karol Pawlowski (k.pawlowski@samsung.com) +# + +ADD_SUBDIRECTORY(widgets) diff --git a/tests/widgets/CMakeLists.txt b/tests/widgets/CMakeLists.txt new file mode 100644 index 0000000..db1f03e --- /dev/null +++ b/tests/widgets/CMakeLists.txt @@ -0,0 +1,87 @@ +# Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Karol Pawlowski (k.pawlowski@samsung.com) +# +INCLUDE(CMakeUtils.txt) + +PKG_SEARCH_MODULE(dpl-test-efl REQUIRED dpl-test-efl) +PKG_SEARCH_MODULE(dbus-1 REQUIRED dbus-1) +PKG_SEARCH_MODULE(libidn REQUIRED libidn) +PKG_SEARCH_MODULE(wrt-plugins-widgetdb REQUIRED wrt-plugins-widgetdb) +PKG_SEARCH_MODULE(ecore-imf REQUIRED ecore-imf) +PKG_SEARCH_MODULE(ecore-ipc REQUIRED ecore-ipc) +PKG_SEARCH_MODULE(ecore-evas REQUIRED ecore-evas) +PKG_SEARCH_MODULE(ecore-file REQUIRED ecore-file) +PKG_SEARCH_MODULE(ecore-input REQUIRED ecore-input) + +GROUP_DEPS(COMMON_LIB_PKGS DEPS + dbus-1 + libpcrecpp + dpl-efl + dpl-test-efl + dpl-utils-efl + dpl-wrt-dao-ro + dpl-event-efl + wrt-plugins-widgetdb + glib + gthread + ewebkit2 + edje + ecore + ecore-x + ecore-imf + ecore-ipc + ecore-evas + ecore-file + ecore-input + evas + eina + elementary + vconf + aul + libidn + libiri +) + +SET(WRT_TEST_LIBRARY "wrt-tests-libs") + +INCLUDE_DIRECTORIES( + ${ewebkit2_INCLUDE_DIRS} + ${dpl-efl_INCLUDE_DIRS} + ${dpl-test-efl_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/common + ${PROJECT_SOURCE_DIR}/src/view + ${WRT_API_NEW_INCLUDES} +) + + +ADD_SUBDIRECTORY(files) +ADD_SUBDIRECTORY(common) + +SET(TESTS_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/TestInit.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/TestCases.cpp +) + +SET(TESTS_TARGET "wrt-tests-general") + +WRT_TEST_BUILD(${TESTS_TARGET} ${TESTS_SOURCES}) +WRT_TEST_INSTALL(${TESTS_TARGET}) +TARGET_LINK_LIBRARIES(${TESTS_TARGET} + ${COMMON_LIB_PKGS_LIBRARIES} + ${WRT_TEST_LIBRARY} + ${TARGET_CORE_MODULE_LIB} +) diff --git a/tests/widgets/CMakeUtils.txt b/tests/widgets/CMakeUtils.txt new file mode 100644 index 0000000..6af08ff --- /dev/null +++ b/tests/widgets/CMakeUtils.txt @@ -0,0 +1,184 @@ +# @file CMakeUtils.txt +# @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) +# @author Pawel Sikorski (p.sikorski@samsung.com) +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +# +# Discovers target's INCLUDE_DIRECTORIES and LINK_DIRECTORIES. +# This is done by retrieving the directory target was built in and +# fetching appropriate properties of that directory. +FUNCTION(WRT_INTROSPECT_TARGET PREFIX TARGET_NAME) + GET_TARGET_PROPERTY(LOCATION ${TARGET_NAME} LOCATION) + IF(${LOCATION} STREQUAL "LOCATION-NOTFOUND") + MESSAGE(FATAL_ERROR "Target '${TARGET_NAME}' introspection failed") + ELSE(${LOCATION} STREQUAL "LOCATION-NOTFOUND") + STRING(FIND ${LOCATION} "/" LAST_SLASH_POSITION REVERSE) + STRING(SUBSTRING ${LOCATION} 0 ${LAST_SLASH_POSITION} LOCATION) + + GET_DIRECTORY_PROPERTY(INCLUDE_DIRS DIRECTORY ${LOCATION} INCLUDE_DIRECTORIES) + SET("${PREFIX}_INCLUDE_DIRS" ${INCLUDE_DIRS} PARENT_SCOPE) + + GET_DIRECTORY_PROPERTY(LIBRARY_DIRS DIRECTORY ${LOCATION} LINK_DIRECTORIES) + SET("${PREFIX}_LIBRARY_DIRS" ${LIBRARY_DIRS} PARENT_SCOPE) + ENDIF(${LOCATION} STREQUAL "LOCATION-NOTFOUND") +ENDFUNCTION(WRT_INTROSPECT_TARGET) + +FUNCTION(WRT_TEST_LIBRARY) + SET_PROPERTY(GLOBAL APPEND PROPERTY COMMON_TESTS_LIBRARY ${ARGV}) +ENDFUNCTION(WRT_TEST_LIBRARY) + +# +# Replacement functions for standard (w/o "WRT_" prefix) CMake functions. +# They store supplied arguments in global properties to assign them to tests. +# Anything added with this functions is used by all targets that are built with +# WRT_TEST_BUILD function. + +# +# Appends directories to global property TESTS_INCLUDE_DIRS which is +# then read by WRT_TEST_BUILD and its content is forwarded to +# command INCLUDE_DIRECTORIES() (for all targets). +FUNCTION(WRT_INCLUDE_DIRECTORIES) + SET_PROPERTY(GLOBAL APPEND PROPERTY TESTS_INCLUDE_DIRS ${ARGV}) +ENDFUNCTION(WRT_INCLUDE_DIRECTORIES) + +# +# Appends directories to global property TESTS_LIBRARY_DIRS which is +# then read by WRT_TEST_BUILD and its content is forwarded to +# command LINK_DIRECTORIES() (for all targets). +FUNCTION(WRT_LINK_DIRECTORIES) + SET_PROPERTY(GLOBAL APPEND PROPERTY TESTS_LIBRARY_DIRS ${ARGV}) +ENDFUNCTION(WRT_LINK_DIRECTORIES) + +# +# Appends directories to global property TESTS_LIBRARIES which is +# then read by WRT_TEST_BUILD and its content is forwarded to +# command TARGET_LINK_LIBRARIES() (for all targets). +FUNCTION(WRT_TARGET_LINK_LIBRARIES) + SET_PROPERTY(GLOBAL APPEND PROPERTY TESTS_LIBRARIES ${ARGV}) +ENDFUNCTION(WRT_TARGET_LINK_LIBRARIES) + +# +# Convenience method that fills TESTS_INCLUDE_DIRS, TESTS_LIBRARY_DIRS +# and TESTS_LIBRARIES with values discovered from introspecting supplied +# targets. +# Function takes arbitrary number of targets. +FUNCTION(WRT_ADD_INTERNAL_DEPENDENCIES) + FOREACH(DEPENDENCY ${ARGV}) + WRT_INTROSPECT_TARGET(prefix ${DEPENDENCY}) + WRT_INCLUDE_DIRECTORIES(${prefix_INCLUDE_DIRS}) + WRT_LINK_DIRECTORIES(${prefix_LIBRARY_DIRS}) + WRT_TARGET_LINK_LIBRARIES(${DEPENDENCY}) + ENDFOREACH(DEPENDENCY) +ENDFUNCTION(WRT_ADD_INTERNAL_DEPENDENCIES) + + +# +# Replacement functions for standard (w/o "WRT_" prefix) CMake functions. +# They store supplied arguments in global properties to assign them to specific +# tests. Properties names are based on the test target name. +# Anything added with this functions is used only by the specified target that +# is built with WRT_TEST_BUILD function. + +# +# Appends directories to global property ${TARGET_NAME}_INCLUDE_DIRS +# which is then read by WRT_TEST_BUILD and its content is forwarded to +# command INCLUDE_DIRECTORIES() (for specified target). +FUNCTION(WRT_TEST_INCLUDE_DIRECTORIES TARGET_NAME) + SET_PROPERTY(GLOBAL APPEND PROPERTY ${TARGET_NAME}_INCLUDE_DIRS ${ARGN}) +ENDFUNCTION(WRT_TEST_INCLUDE_DIRECTORIES) + +# +# Appends directories to global property ${TARGET_NAME}_LIBRARY_DIRS +# which is then read by WRT_TEST_BUILD and its content is forwarded to +# command LINK_DIRECTORIES() (for specified target). +FUNCTION(WRT_TEST_LINK_DIRECTORIES TARGET_NAME) + SET_PROPERTY(GLOBAL APPEND PROPERTY ${TARGET_NAME}_LIBRARY_DIRS ${ARGN}) +ENDFUNCTION(WRT_TEST_LINK_DIRECTORIES) + +# +# Appends directories to global property ${TARGET_NAME}_LIBRARIES +# which is then read by WRT_TEST_BUILD and its content is forwarded to +# command TARGET_LINK_LIBRARIES() (for specified target). +FUNCTION(WRT_TEST_TARGET_LINK_LIBRARIES TARGET_NAME) + SET_PROPERTY(GLOBAL APPEND PROPERTY ${TARGET_NAME}_LIBRARIES ${ARGN}) +ENDFUNCTION(WRT_TEST_TARGET_LINK_LIBRARIES) + +# +# Convenience method that fills ${TARGET_NAME}_INCLUDE_DIRS, +# ${TARGET_NAME}_LIBRARY_DIRS and ${TARGET_NAME}_LIBRARIES with +# values discovered from introspecting supplied targets. +# Function takes arbitrary number of targets. +FUNCTION(WRT_TEST_ADD_INTERNAL_DEPENDENCIES TARGET_NAME) + FOREACH(DEPENDENCY ${ARGN}) + WRT_INTROSPECT_TARGET(prefix ${DEPENDENCY}) + WRT_TEST_INCLUDE_DIRECTORIES(${TARGET_NAME} ${prefix_INCLUDE_DIRS}) + WRT_TEST_LINK_DIRECTORIES(${TARGET_NAME} ${prefix_LIBRARY_DIRS}) + WRT_TEST_TARGET_LINK_LIBRARIES(${TARGET_NAME} ${DEPENDENCY}) + ENDFOREACH(DEPENDENCY) +ENDFUNCTION(WRT_TEST_ADD_INTERNAL_DEPENDENCIES) + +# Functions used to build test targets (proper sources, includes, libs are +# added automatically) +FUNCTION(WRT_TEST_BUILD TARGET_NAME) + SET(SOURCES "${ARGN}") + ADD_EXECUTABLE("${TARGET_NAME}" ${SOURCES}) + + # get include dirs global property + GET_PROPERTY(INCLUDE_DIRS GLOBAL PROPERTY TESTS_INCLUDE_DIRS) + GET_PROPERTY(TEST_INCLUDE_DIRS GLOBAL PROPERTY ${TARGET_NAME}_INCLUDE_DIRS) + INCLUDE_DIRECTORIES( + ${INCLUDE_DIRS} + ${TEST_INCLUDE_DIRS} + ) + + # get library dirs global property + GET_PROPERTY(LIBRARY_DIRS GLOBAL PROPERTY TESTS_LIBRARY_DIRS) + GET_PROPERTY(TEST_LIBRARY_DIRS GLOBAL PROPERTY ${TARGET_NAME}_LIBRARY_DIRS) + LINK_DIRECTORIES( + ${LIBRARY_DIRS} + ${TEST_LIBRARY_DIRS} + ) + + # get link libraries global property + GET_PROPERTY(LINK_LIBRARIES GLOBAL PROPERTY TESTS_LIBRARIES) + GET_PROPERTY(TEST_LIBRARIES GLOBAL PROPERTY ${TARGET_NAME}_LIBRARIES) + TARGET_LINK_LIBRARIES("${TARGET_NAME}" + ${LINK_LIBRARIES} + ${TEST_LIBRARIES} + ) + SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") +ENDFUNCTION(WRT_TEST_BUILD) + +FUNCTION(WRT_TEST_INSTALL) + SET_TARGET_PROPERTIES(${ARGV} PROPERTIES + BUILD_WITH_INSTALL_RPATH ON + INSTALL_RPATH_USE_LINK_PATH ON + ) + INSTALL(TARGETS ${ARGV} + DESTINATION bin + PERMISSIONS OWNER_READ + OWNER_WRITE + OWNER_EXECUTE + GROUP_READ + GROUP_EXECUTE + WORLD_READ + WORLD_EXECUTE + ) +ENDFUNCTION(WRT_TEST_INSTALL) + +# Takes arbitrary number of arguments and concatenates them using ':' character. +# Rationale: +# CMake list when converted to a string is joined with ';' character. However, +# GCC takes strings with multiple elements separated with ':' (e.g. list of +# paths). Used typically when generating DB schemas with ORM mechanism. +FUNCTION(WRT_CONVERT_TO_GCC_LIST OUTPUT_VARIABLE) + FOREACH(ITEM ${ARGN}) + LIST(APPEND ITEMS ${ITEM}) + ENDFOREACH(ITEM) + STRING(REPLACE ";" ":" OUTPUT "${ITEMS}") + SET("${OUTPUT_VARIABLE}" "${OUTPUT}" PARENT_SCOPE) +ENDFUNCTION(WRT_CONVERT_TO_GCC_LIST) diff --git a/tests/widgets/TestCases.cpp b/tests/widgets/TestCases.cpp new file mode 100644 index 0000000..48f005b --- /dev/null +++ b/tests/widgets/TestCases.cpp @@ -0,0 +1,1052 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file TestCases.cpp + * @author Karol Pawłowski (k.pawlowski@samsung.com) + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @version 1.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace { + +struct Result { + bool m_exc; + bool m_exd; + bool m_exs; + std::string message; + Result(bool exc = false, bool exd = false, bool exs = false) + : m_exc(exc), m_exd(exd), m_exs(exs) {} +}; + +} + +RUNNER_TEST_GROUP_INIT(RunnableWidgetObjectState) + +//for call methods to get starting state or do clean up after test +#define CALL_TESTER( ARGUMENT ) \ + tester.perform##ARGUMENT(); \ + +//for performing test and catch excpeted and unexpected exceptions +#define RUNNABLE_TESTER( ARGUMENT ) \ + Result res; \ + Try \ + { \ + WrtLogD("perform start"); \ + CALL_TESTER( ARGUMENT ) \ + WrtLogD("perform stop"); \ + } \ + Catch(WRT::IRunnableWidgetObject::MethodInvocationForbidden) \ + { \ + res.m_exc = true; \ + res.message = _rethrown_exception.DumpToString(); \ + res.message += "(MethodInvocationForbidden)"; \ + } \ + Catch(DPL::Exception) \ + { \ + res.m_exd = true; \ + res.message = _rethrown_exception.DumpToString(); \ + res.message += "(DPL::Exception)"; \ + } \ + Catch(std::exception) \ + { \ + res.m_exs = true; \ + res.message = _rethrown_exception.what(); \ + res.message += "(std::exception)"; \ + } \ + + +//check of function success +#define SHOULD_BE_ALLOWED( ARGUMENT ) \ + { \ + RUNNABLE_TESTER( ARGUMENT ) \ + if(res.m_exc || res.m_exs || res.m_exd) \ + { \ + ok = false; \ + reason = "Exception throwed when not expected in "; \ + reason += __FUNCTION__; \ + reason += " calling "; \ + reason += #ARGUMENT; \ + reason += "message "; \ + reason += res.message; \ + } \ + } \ + + +//check of function failure +#define SHOULD_BE_FORBIDDEN( ARGUMENT ) \ + { \ + RUNNABLE_TESTER( ARGUMENT ) \ + if(!res.m_exc) \ + { \ + ok = false; \ + reason = "MethodInvocationForbidden should be throwed"; \ + reason += " when calling "; \ + reason += #ARGUMENT; \ + } \ + } \ + + +//marcos for hiding lamdba expression and and presenting it as if it is test body +#define RUNNABLE_TESTER_START \ + bool ok = true; \ + std::string reason; \ + auto func = [&ok,&reason](RunnableObjectStateTester & tester) \ + { \ + Try \ + { \ + + +#define RUNNABLE_TESTER_STOP \ + } \ + Catch(DPL::Exception) \ + { \ + ok = false; \ + reason = _rethrown_exception.DumpToString(); \ + reason += "(DPL::Exception)"; \ + } \ + Catch(std::exception) \ + { \ + reason = "Unknown exception"; \ + ok = false; \ + } \ + }; \ + RunnableObjectStateTester & instance = RunnableObjectStateTesterSingleton::Instance(); \ + instance.runTest(func); \ + RUNNER_ASSERT_MSG(ok, reason); \ + +//Initial +/* +Name: state_Initial_PrepareView +Description: Checks if RunnableWidgetObject + correctly reacts to calling method PrepareView in state Initial +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Initial_PrepareView) +{ + RUNNABLE_TESTER_START + SHOULD_BE_ALLOWED( PrepareView ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_Show +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Show in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_Show) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( Show ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_Hide +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Hide in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_Hide) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_Suspend +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Suspend in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_Suspend) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( Suspend ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_Resume +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Resume in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_Resume) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( Resume ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_Reset +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Reset in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_Reset) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( Reset ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_GetCurrentWebview +Description: Checks if RunnableWidgetObject + correctly reacts to calling method GetCurrentWebview in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_GetCurrentWebview) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( GetCurrentWebview ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_SetUserDelegates +Description: Checks if RunnableWidgetObject + correctly reacts to calling method SetUserDelegates in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_SetUserDelegates) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( SetUserDelegates ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Initial_Backward +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Backward in state Initial +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Initial_Backward) +{ + RUNNABLE_TESTER_START + SHOULD_BE_FORBIDDEN( Backward ); + RUNNABLE_TESTER_STOP +} + + +//Prepared +/* +Name: state_Prepared_PrepareView +Description: Checks if RunnableWidgetObject + correctly reacts to calling method PrepareView in state Prepared +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Prepared_PrepareView) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_FORBIDDEN( PrepareView ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_Show +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Show in state Prepared +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Prepared_Show) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_ALLOWED( Show ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_Hide +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Hide in state Prepared +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Prepared_Hide) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_ALLOWED( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_Suspend +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Suspend in state Prepared +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Prepared_Suspend) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_FORBIDDEN( Suspend ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_Resume +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Resume in state Prepared +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Prepared_Resume) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_FORBIDDEN( Resume ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_Reset +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Reset in state Prepared +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Prepared_Reset) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_FORBIDDEN( Reset ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_GetCurrentWebview +Description: Checks if RunnableWidgetObject + correctly reacts to calling method GetCurrentWebview in state Prepared +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Prepared_GetCurrentWebview) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_ALLOWED( GetCurrentWebview ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_SetUserDelegates +Description: Checks if RunnableWidgetObject + correctly reacts to calling method SetUserDelegates in state Prepared +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Prepared_SetUserDelegates) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_ALLOWED( SetUserDelegates ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Prepared_Backward +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Backward in state Prepared +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Prepared_Backward) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + SHOULD_BE_FORBIDDEN( Backward ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +//Showed +/* +Name: state_Showed_PrepareView +Description: Checks if RunnableWidgetObject + correctly reacts to calling method PrepareView in state Showed +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Showed_PrepareView) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_FORBIDDEN( PrepareView ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_Show +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Show in state Showed +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Showed_Show) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_FORBIDDEN( Show ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_Hide +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Hide in state Showed +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Showed_Hide) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_ALLOWED( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_Suspend +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Suspend in state Showed +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Showed_Suspend) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_ALLOWED( Suspend ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_Resume +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Resume in state Showed +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Showed_Resume) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_FORBIDDEN( Resume ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_Reset +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Reset in state Showed +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Showed_Reset) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_ALLOWED( Reset ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_GetCurrentWebview +Description: Checks if RunnableWidgetObject + correctly reacts to calling method GetCurrentWebview in state Showed +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Showed_GetCurrentWebview) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_ALLOWED( GetCurrentWebview ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_SetUserDelegates +Description: Checks if RunnableWidgetObject + correctly reacts to calling method SetUserDelegates in state Showed +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Showed_SetUserDelegates) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_FORBIDDEN( SetUserDelegates ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Showed_Backward +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Backward in state Showed +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Showed_Backward) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + SHOULD_BE_ALLOWED( Backward ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +//Suspended +/* +Name: state_Suspended_PrepareView +Description: Checks if RunnableWidgetObject + correctly reacts to calling method PrepareView in state Suspended +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Suspended_PrepareView) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_FORBIDDEN( PrepareView ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_Show +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Show in state Suspended +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Suspended_Show) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_FORBIDDEN( Show ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_Hide +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Hide in state Suspended +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Suspended_Hide) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_ALLOWED( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_Suspend +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Suspend in state Suspended +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Suspended_Suspend) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_FORBIDDEN( Suspend ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_Resume +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Resume in state Suspended +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Suspended_Resume) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_ALLOWED( Resume ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_Reset +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Reset in state Suspended +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Suspended_Reset) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_ALLOWED( Reset ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_GetCurrentWebview +Description: Checks if RunnableWidgetObject + correctly reacts to calling method GetCurrentWebview in state Suspended +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Suspended_GetCurrentWebview) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_ALLOWED( GetCurrentWebview ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_SetUserDelegates +Description: Checks if RunnableWidgetObject + correctly reacts to calling method SetUserDelegates in state Suspended +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Suspended_SetUserDelegates) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_FORBIDDEN( SetUserDelegates ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Suspended_Backward +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Backward in state Suspended +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Suspended_Backward) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + SHOULD_BE_FORBIDDEN( Backward ); + CALL_TESTER( Hide ); + RUNNABLE_TESTER_STOP +} + +//Hidden +/* +Name: state_Hidden_PrepareView +Description: Checks if RunnableWidgetObject + correctly reacts to calling method PrepareView in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_PrepareView) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( PrepareView ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_Show +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Show in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_Show) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( Show ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_Hide +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Hide in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_Hide) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( Hide ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_Suspend +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Suspend in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_Suspend) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( Suspend ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_Resume +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Resume in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_Resume) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( Resume ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_Reset +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Reset in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_Reset) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( Reset ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_GetCurrentWebview +Description: Checks if RunnableWidgetObject + correctly reacts to calling method GetCurrentWebview in state Hidden +Expected: Transistion should pass +*/ +RUNNER_TEST(state_Hidden_GetCurrentWebview) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_ALLOWED( GetCurrentWebview ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_SetUserDelegates +Description: Checks if RunnableWidgetObject + correctly reacts to calling method SetUserDelegates in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_SetUserDelegates) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( SetUserDelegates ); + RUNNABLE_TESTER_STOP +} + +/* +Name: state_Hidden_Backward +Description: Checks if RunnableWidgetObject + correctly reacts to calling method Backward in state Hidden +Expected: Transistion should fail +*/ +RUNNER_TEST(state_Hidden_Backward) +{ + RUNNABLE_TESTER_START + CALL_TESTER( PrepareView ); + CALL_TESTER( Show ); + CALL_TESTER( Suspend ); + CALL_TESTER( Hide ); + SHOULD_BE_FORBIDDEN( Backward ); + RUNNABLE_TESTER_STOP +} + + +RUNNER_TEST_GROUP_INIT(CommandLineParameters) + + +struct PassAllParserPolicy +{ + static bool SkipLine(const std::vector & ) { return false; } + static bool Validate(std::shared_ptr > > &) { return true; } +}; + +struct ListTokenizerPolicy +{ + static std::string GetSeperators() { return " "; } + static bool SkipEmpty() { return true; } + static void PrepareValue(std::string & value) { DPL::Trim(value, " "); } + static bool TryAgainAtEnd(int) { return false; } +}; + +typedef DPL::VSReader LListReader; + +RUNNER_TEST(CommandLineParameters_ListWidgets) +{ + int status = system("wrt_reset_all.sh"); + RUNNER_ASSERT_MSG(WIFEXITED(status) == TRUE, "wrt_reset_all.sh not exited properly"); + RUNNER_ASSERT_MSG(WEXITSTATUS(status) == 0, "wrt_reset_all.sh failed"); + + //reset database connection + WrtDB::WrtDatabase::detachFromThread(); + WrtDB::WrtDatabase::attachToThreadRW(); + + std::string tizenId; + RUNNER_ASSERT(InstallerWrapper::install("/opt/share/widget/tests/general/minimal.wgt", tizenId) == InstallerWrapper::Success); + + try + { + DPL::ProcessPipe pipe(DPL::ProcessPipe::PipeErrorPolicy::OFF); + pipe.Open("DPL_USE_OLD_STYLE_LOGS=0 wrt-launcher -l"); + LListReader launcher(std::make_shared(&pipe)); + DPL::VSResultPtr result = launcher.ReadInput(); + pipe.Close(); + + RUNNER_ASSERT_MSG((*result)[2][0] == "1", " Wrong position number"); + RUNNER_ASSERT_MSG((*result)[2][1] == "Minimal", "Wrong name"); + RUNNER_ASSERT_MSG((*result)[2][2] == "1.0", "Wrong version"); + RUNNER_ASSERT_MSG((*result)[2][3] == "http://test.samsung.com/widget/minimalTest", "Wrong GUID"); + RUNNER_ASSERT_MSG((*result)[2][4] == "aHFQwMDkmC", "Wrong pkgID"); + RUNNER_ASSERT_MSG((*result)[2][5] == "aHFQwMDkmC.minimal", "Wrong appID"); + } + catch(...) + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + throw; + } + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); +} + + +struct ResultTokenizerPolicy +{ + static std::string GetSeperators() { return ":"; } + static bool SkipEmpty() { return true; } + static void PrepareValue(std::string & value) { DPL::Trim(value, " "); } + static bool TryAgainAtEnd(int) { return false; } +}; + +typedef DPL::VSReader LResultReader; + +RUNNER_TEST(CommandLineParameters_SimpleLaunch) +{ + bool launched = false; + bool running = false; + bool stopped = false; + std::string tizenId; + RUNNER_ASSERT(InstallerWrapper::install("/opt/share/widget/tests/general/minimal.wgt", tizenId) == InstallerWrapper::Success); + + //start + { + DPL::ProcessPipe pipe(DPL::ProcessPipe::PipeErrorPolicy::OFF); + pipe.Open(std::string("DPL_USE_OLD_STYLE_LOGS=0 wrt-launcher -s ") + tizenId); + LResultReader launcher(std::make_shared(&pipe)); + DPL::VSResultPtr result = launcher.ReadInput(); + pipe.Close(); + + FOREACH(row, *result) + { + if(row->at(0) == "result") + { + if(row->at(1) == "launched") + { + launched = true; + break; + } + else + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "Launch failed"); + } + } + } + } + if(!launched) + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "Result not returned"); + } + + //is-running + { + DPL::ProcessPipe pipe(DPL::ProcessPipe::PipeErrorPolicy::OFF); + pipe.Open(std::string("DPL_USE_OLD_STYLE_LOGS=0 wrt-launcher -r ") + tizenId); + LResultReader launcher(std::make_shared(&pipe)); + DPL::VSResultPtr result = launcher.ReadInput(); + pipe.Close(); + + FOREACH(row, *result) + { + if(row->at(0) == "result") + { + if(row->at(1) == "running") + { + running = true; + break; + } + else + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "App launched but not running"); + } + } + } + } + if(!running) + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "Result not returned"); + } + + //stop + { + DPL::ProcessPipe pipe(DPL::ProcessPipe::PipeErrorPolicy::OFF); + pipe.Open(std::string("DPL_USE_OLD_STYLE_LOGS=0 wrt-launcher -k ") + tizenId); + LResultReader launcher(std::make_shared(&pipe)); + DPL::VSResultPtr result = launcher.ReadInput(); + pipe.Close(); + + FOREACH(row, *result) + { + if(row->at(0) == "result") + { + if(row->at(1) == "killed") + { + stopped = true; + break; + } + else + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "Stop failed"); + } + } + } + } + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + if(stopped) + { + return; + } + RUNNER_ASSERT_MSG(false, "Result not returned"); +} + +RUNNER_TEST(CommandLineParameters_WebDebuggerPort) +{ + std::string tizenId; + RUNNER_ASSERT(InstallerWrapper::install("/opt/share/widget/tests/general/minimal.wgt", tizenId) == InstallerWrapper::Success); + + DPL::ProcessPipe pipe(DPL::ProcessPipe::PipeErrorPolicy::OFF); + pipe.Open(std::string("DPL_USE_OLD_STYLE_LOGS=0 wrt-launcher -d -t 5 -s ") + tizenId); + LResultReader launcher(std::make_shared(&pipe)); + DPL::VSResultPtr result = launcher.ReadInput(); + pipe.Close(); + + FOREACH(row, *result) + { + if(row->at(0) == "port") + { + int value = DPL::lexical_cast(row->at(1)); + if(value >= 1024 && value <= 65535) + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + return; + } + else + { + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "Wrong port number"); + } + } + } + RUNNER_ASSERT(InstallerWrapper::uninstall(tizenId)); + RUNNER_ASSERT_MSG(false, "Port number not returned"); +} + diff --git a/tests/widgets/TestInit.cpp b/tests/widgets/TestInit.cpp new file mode 100644 index 0000000..d7bff2d --- /dev/null +++ b/tests/widgets/TestInit.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file TestInit.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @version 1.0 + * @brief main for misc tests + */ + +#include +#include +#include + +int main (int argc, char *argv[]) +{ + WrtLogD("Starting tests"); + + WrtDB::WrtDatabase::attachToThreadRW(); + int status = + DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); + WrtDB::WrtDatabase::detachFromThread(); + + return status; +} diff --git a/tests/widgets/common/CMakeLists.txt b/tests/widgets/common/CMakeLists.txt new file mode 100644 index 0000000..a41b284 --- /dev/null +++ b/tests/widgets/common/CMakeLists.txt @@ -0,0 +1,45 @@ +# Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Tomasz Iwanek (t.iwanek@samsung.com) +# @version 1.0 +# @brief +# + +SET(COMMON_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/include") + +WRT_TEST_LIBRARY(${WRT_TEST_LIBRARY}) + +WRT_INCLUDE_DIRECTORIES( + ${COMMON_LIB_PKGS_INCLUDE_DIRS} + ${COMMON_INCLUDES} + ${WRT_API_NEW_INCLUDES} + ) + +WRT_LINK_DIRECTORIES(${COMMON_LIB_PKGS_LIBRARY_DIRS}) +WRT_TARGET_LINK_LIBRARIES(${COMMON_LIB_PKGS_LIBRARIES}) + +SET(WRT_DETAIL_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/src/InstallerWrapper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/RunnableObjectStateTester.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/mock/MockViewModule.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/mock/MockContextManager.cpp +) + +INCLUDE_DIRECTORIES(${COMMON_INCLUDES}) +INCLUDE_DIRECTORIES(${COMMON_LIB_PKGS_INCLUDE_DIRS}) +ADD_LIBRARY(${WRT_TEST_LIBRARY} STATIC ${WRT_DETAIL_SOURCES}) +SET_TARGET_PROPERTIES(${WRT_TEST_LIBRARY} PROPERTIES + COMPILE_DEFINITIONS LOG_TAG="${LOG_TAG}") diff --git a/tests/widgets/common/include/InstallerWrapper.h b/tests/widgets/common/include/InstallerWrapper.h new file mode 100644 index 0000000..7bce1cd --- /dev/null +++ b/tests/widgets/common/include/InstallerWrapper.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WRT_TESTS_W3C_TESTS_INSTALLER_WRAPPER_H +#define WRT_TESTS_W3C_TESTS_INSTALLER_WRAPPER_H + +#include + +namespace InstallerWrapper +{ + +typedef int InstallResult; +const InstallResult WrongWidgetPackage = -2; +const InstallResult OtherError = -1; +const InstallResult Success = 0; + +InstallResult install( + const std::string& path, + std::string& tizenId, + const std::string& user = ""); +bool uninstall(const std::string& tizenId); +bool uninstallByGuid(const std::string& guid); +/** + * @brief killWrtClients kills processes that matches 'wrt-client' + * @return True if any client was killed + */ +bool sigintWrtClients(); + +} + +#endif//WRT_TESTS_W3C_TESTS_INSTALLER_WRAPPER_H diff --git a/tests/widgets/common/include/RunnableObjectStateTester.h b/tests/widgets/common/include/RunnableObjectStateTester.h new file mode 100644 index 0000000..c0a8bc7 --- /dev/null +++ b/tests/widgets/common/include/RunnableObjectStateTester.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file RunnableObjectStateTester.h + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief Tester for RunnableWidgetObject's states + */ + +#ifndef WRT_EXTRA_AUTO_TESTS_COMMON_INCLUDE_RUNNABLE_OBJECT_STATE_TESTER_H +#define WRT_EXTRA_AUTO_TESTS_COMMON_INCLUDE_RUNNABLE_OBJECT_STATE_TESTER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +DECLARE_GENERIC_EVENT_0(NextStepEvent) + +class RunnableObjectStateTester : public DPL::ApplicationExt, + private DPL::Event::Controller::Type>, + public DPL::TaskDecl +{ +public: + typedef std::function Test; + + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, CoreModuleFailure) + DECLARE_EXCEPTION_TYPE(Base, CallbackFailure) + + RunnableObjectStateTester(); + ~RunnableObjectStateTester(); + + void performPrepareView(); + + void performShow(); + void performHide(); + void performSuspend(); + void performResume(); + void performReset(); + + void performGetCurrentWebview(); + void performSetUserDelegates(); + void performBackward(); + + void performTest(); + + void runTest(Test func); + + void OnEventReceived(const NextStepEvent& /*event*/); + + void loadFinishCallback(Evas_Object* obj, void* eventInfo); + +private: + std::string m_handle; + WRT::RunnableWidgetObjectPtr m_widget; + Test m_func; + const std::string m_widgetPath; +}; + +typedef DPL::Singleton RunnableObjectStateTesterSingleton; + +#endif // WRT_EXTRA_AUTO_TESTS_COMMON_INCLUDE_RUNNABLE_OBJECT_STATE_TESTER_H diff --git a/tests/widgets/common/include/mock/MockContextManager.h b/tests/widgets/common/include/mock/MockContextManager.h new file mode 100644 index 0000000..c1734df --- /dev/null +++ b/tests/widgets/common/include/mock/MockContextManager.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file MockContextManager.h + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief Mock for view module + */ +#ifndef MOCKCONTEXTMANAGER_H +#define MOCKCONTEXTMANAGER_H + +#include + +class MockContextManager : public ViewModule::IContextManager +{ +public: + MockContextManager(const std::string& tizenAppId, + Ewk_Context* ewkContext, + ViewModule::IViewModulePtr viewModule); + virtual ~MockContextManager(); + Ewk_Context* getEwkContext() const; + void handleLowMemory(); +}; + +#endif // MOCKCONTEXTMANAGER_H diff --git a/tests/widgets/common/include/mock/MockViewModule.h b/tests/widgets/common/include/mock/MockViewModule.h new file mode 100644 index 0000000..7930fdf --- /dev/null +++ b/tests/widgets/common/include/mock/MockViewModule.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file MockViewModule.h + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief Mock for view module + */ + +#ifndef MOCKVIEWMODULE_H +#define MOCKVIEWMODULE_H + +#include + +class MockViewModule : public ViewModule::IViewModule +{ +public: + MockViewModule(); + bool createWebView(Ewk_Context* context, + Evas_Object* window); + void prepareView(WidgetModel *, const std::string &); + void showWidget(); + void hideWidget(); + void suspendWidget(); + void resumeWidget(); + void setWidgetUrl(const std::string &); + void resetWidgetFromSuspend(); + void resetWidgetFromResume(); + void backward(); + void reloadStartPage(); + Evas_Object* getCurrentWebview(); + void fireJavascriptEvent(int event, void* data); + void setUserCallbacks(const WRT::UserDelegatesPtr& cbs); + void checkSyncMessageFromBundle( + const char* name, + const char* body, + char** returnData); + void checkAsyncMessageFromBundle( + const char* name, + const char* body); + void downloadData(const char* url); + void activateVibration(bool on, uint64_t time); +}; + +#endif // MOCKVIEWMODULE_H diff --git a/tests/widgets/common/src/InstallerWrapper.cpp b/tests/widgets/common/src/InstallerWrapper.cpp new file mode 100644 index 0000000..1bdad1d --- /dev/null +++ b/tests/widgets/common/src/InstallerWrapper.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "InstallerWrapper.h" + +#include + +#include + +namespace +{ + +const std::string params = "DPL_USE_OLD_STYLE_LOGS=0 " + "DPL_USE_OLD_STYLE_PEDANTIC_LOGS=0 WRT_TEST_MODE=1 "; +const std::string installCmd = params + "wrt-installer -i "; +const std::string uninstallCmd = params + "wrt-installer -un "; +const std::string uninstallByGuidCmd = params + "wrt-installer -ug \""; +const std::string redirection = " 2>&1"; +const std::string INSTALLER_MESSAGE_ID_LINE = + "## wrt-installer : %s installation was successful.\n"; +const std::string INSTALLER_MESSSGE_START = "## wrt-installer : "; + +std::string getAndCutInstallerLogLine(std::string &src) +{ + size_t startIndex = src.find(INSTALLER_MESSSGE_START); + if (startIndex == std::string::npos) + { + WrtLogW("Installer message can not be found"); + return std::string(); + } + size_t newLineIndex = src.find("\n", startIndex); + std::string line = src.substr(startIndex, newLineIndex - startIndex + 1); + src.erase(0, newLineIndex + 1); + return line; +} + +} + +namespace InstallerWrapper +{ + +InstallResult install( + const std::string& path, + std::string& tizenId, + const std::string& user) +{ + std::string msg; + + auto cmd = installCmd + path + redirection; + if(user.length()) //if other user should be used + { + cmd = "su " + user + " -c '" + cmd + "'"; + } + WrtLogD("executing: %s", cmd.c_str()); + auto filehandle = popen(cmd.c_str(), "r"); + if (!filehandle) { + return OtherError; + } + + char buffer[1024] = ""; + while (fread_unlocked(buffer, sizeof(char), sizeof(buffer)/sizeof(char), + filehandle) > 0) + { + msg += buffer; + } + WrtLogD("%s", msg.c_str()); + auto err = pclose(filehandle); + if (!WIFEXITED(err)) { + return OtherError; + } + if (0 != WEXITSTATUS(err)) { + if (1 == WEXITSTATUS(err)) { + return WrongWidgetPackage; + } + return OtherError; + } + + char* id = NULL; + std::string line; + + while ((line = getAndCutInstallerLogLine(msg)) != "") + { + if (line.find("successful") != std::string::npos) + { + id = new char[line.length()]; + int nr = sscanf(line.c_str(), INSTALLER_MESSAGE_ID_LINE.c_str(), id); + + if (1 != nr) + { + WrtLogW("Can not read widget ID from message: %s", line.c_str()); + delete[] id; + return OtherError; + } + tizenId = id; + delete[] id; + if (tizenId != "plugin") + { + return Success; + } + } + } + + return OtherError; +} + +bool uninstall(const std::string& tizenId) +{ + std::string cmd = uninstallCmd + tizenId + " > /dev/null 2>/dev/null"; + WrtLogD("executing: %s", cmd.c_str()); + return (system(cmd.c_str()) == EXIT_SUCCESS); +} + +bool uninstallByGuid(const std::string& guid) +{ + std::string cmd = uninstallByGuidCmd + guid + "\" > /dev/null 2>/dev/null"; + WrtLogD("executing: %s", cmd.c_str()); + return (system(cmd.c_str()) == EXIT_SUCCESS); +} + +bool sigintWrtClients() +{ + return (system("pkill -2 wrt-client") == 0); +} + +} + diff --git a/tests/widgets/common/src/RunnableObjectStateTester.cpp b/tests/widgets/common/src/RunnableObjectStateTester.cpp new file mode 100644 index 0000000..cac9233 --- /dev/null +++ b/tests/widgets/common/src/RunnableObjectStateTester.cpp @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file RunnableObjectStateTester.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief Tester for RunnableWidgetObject's states + */ + +#include "RunnableObjectStateTester.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +IMPLEMENT_SINGLETON(RunnableObjectStateTester) + +namespace { +const std::string widgetPathMnimal = "/opt/share/widget/tests/general/any.wgt"; +const int widgetInitializationTimeBounding = 3; +} + +RunnableObjectStateTester::RunnableObjectStateTester() + : DPL::ApplicationExt(1, NULL, "test-app"), + DPL::TaskDecl(this), + m_widgetPath(widgetPathMnimal) +{ + WrtLogD("enter"); + + int argc = 0; + const char * argv[] = { "wrt-tests-wrt" }; + if (!getenv("ELM_ENGINE")) { + if (setenv("ELM_ENGINE", "gl", 1)) { + WrtLogD("Enable backend"); + } + } + setenv("COREGL_FASTPATH", "1", 1); + + Touch(); + + //initialize + elm_init(argc, const_cast(argv)); +#if USE(EFL_LITE) + elm_app_base_scale_set(1.8); +#else + elm_app_base_scale_set(2.4); +#endif + if(!WRT::CoreModuleSingleton::Instance().Init()) + { + ThrowMsg(CoreModuleFailure, "Init() fails"); + } + + InstallerWrapper::install(m_widgetPath, m_handle); + WrtLogD("Widget Installed: %s", m_handle.c_str()); + + AddStep(&RunnableObjectStateTester::performTest); +} + +RunnableObjectStateTester::~RunnableObjectStateTester() +{ + WrtLogD("enter"); + WRT::CoreModuleSingleton::Instance().Terminate(); + InstallerWrapper::uninstall(m_handle); + elm_shutdown(); +} + +void RunnableObjectStateTester::performPrepareView() +{ + //this address is invalid but we use mock (may be problematic when implementation'll change) + Evas_Object * fakeWindowAddress = reinterpret_cast(0x01); + m_widget->PrepareView(DPL::ToUTF8String(DPL::String()), + fakeWindowAddress); +} + +void RunnableObjectStateTester::performShow() +{ + m_widget->Show(); +} + +void RunnableObjectStateTester::performHide() +{ + m_widget->Hide(); +} + +void RunnableObjectStateTester::performSuspend() +{ + m_widget->Suspend(); +} + +void RunnableObjectStateTester::performResume() +{ + m_widget->Resume(); +} + +void RunnableObjectStateTester::performReset() +{ + m_widget->Reset(); +} + +void RunnableObjectStateTester::performGetCurrentWebview() +{ + m_widget->GetCurrentWebview(); +} + +void RunnableObjectStateTester::performSetUserDelegates() +{ + WRT::UserDelegatesPtr dlgs(new WRT::UserDelegates); + dlgs->loadFinishedCallback = + std::bind(&RunnableObjectStateTester::loadFinishCallback, + this, + std::placeholders::_1, + std::placeholders::_2); + m_widget->SetUserDelegates(dlgs); +} + +void RunnableObjectStateTester::performBackward() +{ + m_widget->Backward(); +} + +void RunnableObjectStateTester::OnEventReceived(const NextStepEvent& /*event*/) +{ + NextStep(); +} + +void RunnableObjectStateTester::loadFinishCallback(Evas_Object* obj, void* eventInfo) +{ + DPL_UNUSED_PARAM(obj); + DPL_UNUSED_PARAM(eventInfo); + + WrtLogD("enter"); +} + +void RunnableObjectStateTester::runTest(RunnableObjectStateTester::Test func) +{ + m_widget = WRT::CoreModuleSingleton::Instance().getRunnableWidgetObject(m_handle); + //as we know we uses specific implementation + WRT::RunnableWidgetObject * m_widget_impl = dynamic_cast(m_widget.get()); + Assert(m_widget_impl); + m_widget_impl->setViewModule(ViewModule::IViewModulePtr(new MockViewModule())); + m_widget_impl->setContextManagerFactoryMethod(ViewModule::makeContextManagerFactoryMethod()); + if(!m_widget) + { + ThrowMsg(CoreModuleFailure, "getRunnableWidgetObject() fails"); + } + + m_func = func; + SwitchToStep(&RunnableObjectStateTester::performTest); + DPL::Event::ControllerEventHandler::PostTimedEvent(NextStepEvent(), 1.0); //TODO: time hazard + + elm_run(); //elm_run should be called instead of ecore_main_loop +} + +void RunnableObjectStateTester::performTest() +{ + WrtLogD("enter"); + + Try { + m_func(*this); + } Catch(DPL::Exception) { + WrtLogD("Test broken not at condition to be checked. Check other tests"); + WrtLogD("%s", _rethrown_exception.DumpToString().c_str()); + } + + Quit(); + m_widget.reset(); + + WrtLogD("leave"); +} diff --git a/tests/widgets/common/src/mock/MockContextManager.cpp b/tests/widgets/common/src/mock/MockContextManager.cpp new file mode 100644 index 0000000..1e94d57 --- /dev/null +++ b/tests/widgets/common/src/mock/MockContextManager.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file MockContextManager.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief Mock for view module + */ +#include "mock/MockContextManager.h" + +MockContextManager::MockContextManager( + const std::string& tizenAppId, + Ewk_Context* ewkContext, + ViewModule::IViewModulePtr viewModule) : + ViewModule::IContextManager(tizenAppId, ewkContext, viewModule) +{ +} + +MockContextManager::~MockContextManager() +{ +} + +Ewk_Context* MockContextManager::getEwkContext() const +{ + return NULL; +} + +void MockContextManager::handleLowMemory() +{ +} + +namespace ViewModule { + +ContextManagerPtr contextManagerFactoryMethod( + const std::string& id, + Ewk_Context* c, + IViewModulePtr view) +{ + ContextManagerPtr ptr (new MockContextManager(id, c, view)); + return ptr; +} + +ContextManagerFactoryMethod makeContextManagerFactoryMethod() +{ + return contextManagerFactoryMethod; +} + +} // namespace ViewModule \ No newline at end of file diff --git a/tests/widgets/common/src/mock/MockViewModule.cpp b/tests/widgets/common/src/mock/MockViewModule.cpp new file mode 100644 index 0000000..1bc72a0 --- /dev/null +++ b/tests/widgets/common/src/mock/MockViewModule.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file MockViewModule.cpp + * @author Tomasz Iwanek (t.iwanek@samsung.com) + * @brief Mock for view module + */ + +#include "mock/MockViewModule.h" + +MockViewModule::MockViewModule() +{ +} + +bool MockViewModule::createWebView(Ewk_Context* /*context*/, + Evas_Object* /*window*/) +{ + return true; +} + +void MockViewModule::prepareView(WidgetModel *, const std::string &) +{ +} + +void MockViewModule::showWidget() +{ +} + +void MockViewModule::hideWidget() +{ +} + +void MockViewModule::suspendWidget() +{ +} + +void MockViewModule::resumeWidget() +{ +} + +void MockViewModule::setWidgetUrl(const std::string &) +{ +} + +void MockViewModule::resetWidgetFromSuspend() +{ +} + +void MockViewModule::resetWidgetFromResume() +{ +} + +void MockViewModule::backward() +{ +} + +void MockViewModule::reloadStartPage() +{ +} + +Evas_Object* MockViewModule::getCurrentWebview() +{ + return NULL; +} + +void MockViewModule::fireJavascriptEvent(int /*event*/, void* /*data*/) +{ +} + +void MockViewModule::setUserCallbacks(const WRT::UserDelegatesPtr& /*cbs*/) +{ +} + +void MockViewModule::checkSyncMessageFromBundle( + const char* /*name*/, + const char* /*body*/, + char** /*returnData*/) +{ +} + +void MockViewModule::checkAsyncMessageFromBundle( + const char* /*name*/, + const char* /*body*/) +{ +} + +void MockViewModule::downloadData(const char* /*url*/) +{ +} + +void MockViewModule::activateVibration(bool /*on*/, uint64_t /*time*/) +{ +} diff --git a/tests/widgets/files/CMakeLists.txt b/tests/widgets/files/CMakeLists.txt new file mode 100644 index 0000000..5f87442 --- /dev/null +++ b/tests/widgets/files/CMakeLists.txt @@ -0,0 +1,22 @@ +# Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Tomasz Iwanek (t.iwanek@samsung.com) +# + +SET(WRT_TESTS_GENERAL_WIDGETS_PATH "/opt/share/widget/tests/general/") + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/any.wgt DESTINATION ${WRT_TESTS_GENERAL_WIDGETS_PATH}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/minimal.wgt DESTINATION ${WRT_TESTS_GENERAL_WIDGETS_PATH}) diff --git a/tests/widgets/files/any.wgt b/tests/widgets/files/any.wgt new file mode 100644 index 0000000000000000000000000000000000000000..8157660c3a1d8fb08f4da4216a8c74755c6862c9 GIT binary patch literal 1046 zcmWIWW@Zs#U|`^2IN2TR>~%?ZzC0rX0}B%a0~dn~LvnszT4uUlMQ%=L2qy#c%t!e_ zAY59(&A`a=f*Gg~M8r|XNp z^5Z{&uGSHscK^Qn`Eul2zkRLpTo+5%eDuo^=vck3>`q2a{q6Pgh2d+iJb2Y66j9Xc zEA`%d=I6fa*C$`sIC~Mnx+%R z(ABHnv5ni3e{RqF=tGO17~7n8IyrI1g;`0WG4qSI1u{<&P-ja!K5?S?1f%0q&Nl8T zTP)N(n zNd@XR0_xHS>js*l4>latDSB0mOJ#tu4Z?yTrvRh7SUq50@YytpLItY(TQOs_F}nVkvg=4B-HR8jh3>AfL0qBeEE%{yGqMGNuWJ5WwljWWZZLj(jQ@_hPxmC{k{8X zxzvUd)=MmRW-*zG2Pm!Td~sk_bprPZ)+u-5Ubpb+#4^6xu!UE8V_knzHsc?SYh9-z z=0!6ej9|-K{PN>Of#tu;>k=3feYISEMJzQaS$9srrDW2SqEkLAJm<7jO5ft>s43;y zSv%p6kb}-TrFxb#VvQ%BwZB;~?QyI4soMcsPAikX$V6nEnSZWPSD{Pz@D>+~3zsK? z@(F{dtDnm{r-Y^eZ$>6LW?WfE0;H4y7_JOk8bK`NjKm7bNNAY|WS$7vJnZQNWC{pu rX-ozhi%2!-`p_d4q6?(&9Y`N~6bE>-f+CZF83>O9X-i;!W?%pSCAx6@ literal 0 HcmV?d00001 diff --git a/tests/widgets/files/minimal.wgt b/tests/widgets/files/minimal.wgt new file mode 100644 index 0000000000000000000000000000000000000000..86466afd3e588b871b7d2f523435863b4bb101e2 GIT binary patch literal 1957 zcmbtVeNYoe6u%IHF^VGi4b||5C=gUcAZnsm1U+(_v}-uu1x z_WjZ-+Ub_=5lM@7%A!yISu~x>W&T=|(wR6!3G9fQ89IGS4)nO!n ztc9Z))}|xPruoxmk#qGbmDbJBHYft5%?dyVNV_PyW@|KVw_EL=uI6}~h7~luN&*QO zdVr1y1yLi~;Te~R_{F&ZAQB)hP{we| zF{L60FhkEz4s4KxJSCzEz`53V8PHN0BFa3l^Uw+guXYNQFMv}qijjdvsT z(ROG_2QZ5fkY5V~oV7or6iWk7I)IgNK!lILaY$%nMI#yS3q?r;8Sh2~ovs=iCnE^j z2Zs_eplQvf!GwHL;*BLLBpF#l2$}Cq)Y;Oou1uFG4N|y(O2ZRB7}W7y-hq^fr^{++ z+kxgiwf^OQgodA#?-^Iz_38Y{H%?CBj&@MzEvE9eWnHIM%IhDN$H=N1qnl4O{8=4e zbuRhBh*7Vf%a}7hdgbU1`s)vW?_AxK()Q8PkP7RPh6Tf?bQM>u2)rCNyge*D=+Tbz z%Zk=+9Mt}C@S^3dajW(R_%)crBUUfh9ZKE%;9{%pUQUc(WM_3m_nhy+^~de=Z?`|a zvZASR!k**ZK7DlbenZtcvbqpN2bK}IGQ8_e%sPdRteL*0d0S7APu|tLPoG@9w{QGmQE|cdN|n!yF-G$9%{Nb0y}xG2 z8AbV()LVtarl!cc4mbG+AIU9EOPBRb{;{Mb>9b_nw@H3%ZRg#xfPIhMxoc!pe5m2? zq`ENiU~7Ou+*Z!FEZ!fxvoJgOXXU1~8AFe)+u9R2Z|XsEz3eKFrB-zjIYR#VpN`ji3471K(ER$}Z*q8*v!KgI_#yFYJNcqbzBy?)&Y0AeF z%52~D + + + + + + + + + + + + + + + diff --git a/wrt_env.sh b/wrt_env.sh new file mode 100644 index 0000000..7dbf0bc --- /dev/null +++ b/wrt_env.sh @@ -0,0 +1,7 @@ +#export WRT_PROCESS_POOL_DISABLE=ON +#export WRT_WILL_SEND_REQUEST_LOG_ENABLE=ON +#export WRT_LOAD_PLUGINS_LOG_ENABLE=ON +#export WRT_FRAME_RENDERED_LOG_ENABLE=ON +#export WRT_CONSOLE_LOG_ENABLE=ON +#export WRT_WIDGET_DATA_TYPES_LOG_ENABLE=ON + diff --git a/wrt_launchpad_daemon.rule.in b/wrt_launchpad_daemon.rule.in new file mode 100644 index 0000000..db9d2e5 --- /dev/null +++ b/wrt_launchpad_daemon.rule.in @@ -0,0 +1,7 @@ +wrt_launchpad_daemon system::share rwx +wrt_launchpad_daemon system::homedir rwx +wrt_launchpad_daemon device::app_logging w +wrt_launchpad_daemon xorg rw +wrt_launchpad_daemon webkit2-efl rwxa +wrt_launchpad_daemon sys-assert::core rwxat +wrt_launchpad_daemon location_fw::client rwx diff --git a/wrt_launchpad_daemon.rule.lite.in b/wrt_launchpad_daemon.rule.lite.in new file mode 100644 index 0000000..60ff8da --- /dev/null +++ b/wrt_launchpad_daemon.rule.lite.in @@ -0,0 +1,158 @@ +wrt_launchpad_daemon * t +wrt_launchpad_daemon ^ xrw +wrt_launchpad_daemon _ l +wrt_launchpad_daemon 57r43275q7 xrw +wrt_launchpad_daemon activesync-ui::eas-appsvc rwxa +wrt_launchpad_daemon ail::db rwxa +wrt_launchpad_daemon alarm-server rwxa +wrt_launchpad_daemon aospd00043 rx +wrt_launchpad_daemon app-svc::db rwxa +wrt_launchpad_daemon atd-server xrw +wrt_launchpad_daemon aul rwxa +wrt_launchpad_daemon aul::launch x +wrt_launchpad_daemon brcm_daemon xrw +wrt_launchpad_daemon browser-provider rwxa +wrt_launchpad_daemon browser-scrap-service xrw +wrt_launchpad_daemon bt_firmware rx +wrt_launchpad_daemon bt_share rwxa +wrt_launchpad_daemon bt-service xrw +bt-service wrt_launchpad_daemon rwxa +wrt_launchpad_daemon calendar-service xrw +wrt_launchpad_daemon cbhm rwxa +wrt_launchpad_daemon com.samsung.browser::vconf_public rw +wrt_launchpad_daemon com.samsung.dailybriefing-weather-lite xrw +wrt_launchpad_daemon com.samsung.data-provider-slave xrw +wrt_launchpad_daemon com.samsung.facebook xrw +wrt_launchpad_daemon com.samsung.homescreen xrw +wrt_launchpad_daemon com.samsung.indicator rwx +com.samsung.indicator wrt_launchpad_daemon rwx +wrt_launchpad_daemon com.samsung.lockscreen xrw +wrt_launchpad_daemon com.samsung.mobileprint rwxa +wrt_launchpad_daemon com.samsung.quickpanel rwx +com.samsung.quickpanel wrt_launchpad_daemon rwx +wrt_launchpad_daemon com.samsung.setting::default-resources rx +wrt_launchpad_daemon com.samsung.task-mgr xrw +wrt_launchpad_daemon com.samsung.volume xrw +wrt_launchpad_daemon connman rwxa +wrt_launchpad_daemon contacts-service xrw +wrt_launchpad_daemon coord xrw +wrt_launchpad_daemon crash-worker rwxa +wrt_launchpad_daemon csc-manager rwxa +wrt_launchpad_daemon data-provider-master rwxa +wrt_launchpad_daemon data-provider-master::notification rwx +wrt_launchpad_daemon data-provider-master::notification.client rwx +wrt_launchpad_daemon data-router xrw +wrt_launchpad_daemon dbus rwxa +dbus wrt_launchpad_daemon rwxa +wrt_launchpad_daemon device::app_logging rw +wrt_launchpad_daemon device::bklight rwxa +wrt_launchpad_daemon device::camera rw +wrt_launchpad_daemon device::hwcodec rw +wrt_launchpad_daemon device::joystick r +wrt_launchpad_daemon device::radio rw +wrt_launchpad_daemon device::sys_logging w +wrt_launchpad_daemon device::video rw +wrt_launchpad_daemon deviced rwxa +wrt_launchpad_daemon deviced::display rw +wrt_launchpad_daemon deviced::haptic rw +wrt_launchpad_daemon download-provider rwxa +wrt_launchpad_daemon drmfw rw +wrt_launchpad_daemon e17 rwxa +e17 wrt_launchpad_daemon rw +wrt_launchpad_daemon eas-engine::docsearch rx +wrt_launchpad_daemon email-service rwx +email-service wrt_launchpad_daemon rw +wrt_launchpad_daemon immvibed rwxa +wrt_launchpad_daemon isf rwxa +wrt_launchpad_daemon key-manager xrw +wrt_launchpad_daemon launchpad xrw +wrt_launchpad_daemon livebox.web-provider rwx +livebox.web-provider wrt_launchpad_daemon rwx +wrt_launchpad_daemon location_fw rwx +wrt_launchpad_daemon location_fw::client rw +wrt_launchpad_daemon location_fw::dbus rw +wrt_launchpad_daemon location_fw::vconf rl +wrt_launchpad_daemon media-data::db rw +wrt_launchpad_daemon media-server rwxa +media-server wrt_launchpad_daemon rwxa +wrt_launchpad_daemon messageportd xrw +wrt_launchpad_daemon mm_qcamera_daemon rwx +wrt_launchpad_daemon mobex-agent rwxa +wrt_launchpad_daemon mobicore-daemon rwxa +wrt_launchpad_daemon msg-service xrw +wrt_launchpad_daemon mtp-responder rwxa +wrt_launchpad_daemon nas9xepmna rwxa +nas9xepmna wrt_launchpad_daemon rwxa +wrt_launchpad_daemon net-config rwxa +wrt_launchpad_daemon nfc-manager w +nfc-manager wrt_launchpad_daemon w +wrt_launchpad_daemon notification rwxa +wrt_launchpad_daemon notification::db rw +wrt_launchpad_daemon Odnp xrw +wrt_launchpad_daemon oma-dm-agent xrw +wrt_launchpad_daemon pkgmgr::db rlw +wrt_launchpad_daemon pkgmgr-client rwx +wrt_launchpad_daemon privacy-manager::db rl +wrt_launchpad_daemon pulseaudio rwxat +wrt_launchpad_daemon pulseaudio::record r +wrt_launchpad_daemon push-service rwxa +wrt_launchpad_daemon resman rwxa +wrt_launchpad_daemon samsung-account-front rwxa +wrt_launchpad_daemon samsung-log-manager xrw +wrt_launchpad_daemon sdbd xrw +wrt_launchpad_daemon sdbd::home rx +wrt_launchpad_daemon secure-storage rwxa +wrt_launchpad_daemon security-server xrw +wrt_launchpad_daemon sensord xrw +wrt_launchpad_daemon sensor-framework rwxa +wrt_launchpad_daemon sjjevolsjk xrw +wrt_launchpad_daemon sound_server rwxa +wrt_launchpad_daemon spreadtrum-utils xrw +wrt_launchpad_daemon starter rwxa +wrt_launchpad_daemon stt-server rwxa +wrt_launchpad_daemon svi-data rwx +wrt_launchpad_daemon sys-assert::core rwxat +wrt_launchpad_daemon syslogd xrw +wrt_launchpad_daemon system::clipboard wrxat +wrt_launchpad_daemon system::debugging_network rw +system::debugging_network wrt_launchpad_daemon w +wrt_launchpad_daemon system::ext_storage rwxat +wrt_launchpad_daemon system::ext_storage_appdata r-x +wrt_launchpad_daemon system::homedir rwxat +wrt_launchpad_daemon system::media rwxat +wrt_launchpad_daemon system::media::root rwxat +wrt_launchpad_daemon system::share rwxat +wrt_launchpad_daemon system::use_internet xwtr +system::use_internet wrt_launchpad_daemon xwtr +wrt_launchpad_daemon system::vconf rwxat +wrt_launchpad_daemon system::vconf_inhouse arwx +wrt_launchpad_daemon system::vconf_misc arwx +wrt_launchpad_daemon system::vconf_multimedia arwx +wrt_launchpad_daemon system::vconf_network arwx +wrt_launchpad_daemon system::vconf_privacy arwx +wrt_launchpad_daemon system::vconf_setting arwx +wrt_launchpad_daemon system::vconf_system arwx +wrt_launchpad_daemon telephony_framework xrw +wrt_launchpad_daemon telephony_framework::api_modem r +wrt_launchpad_daemon trm xrw +wrt_launchpad_daemon tts-server rwx +wrt_launchpad_daemon ug-setting-call-efl::vconf rwx +wrt_launchpad_daemon usbotg-syspopup rwxa +wrt_launchpad_daemon usb-server rwxa +wrt_launchpad_daemon usb-syspopup rwxa +wrt_launchpad_daemon webkit2-efl rwxa +webkit2-efl wrt_launchpad_daemon rwxa +wrt_launchpad_daemon webkit2-efl::vconf rl +wrt_launchpad_daemon webkit2-extension rwxa +webkit2-extension wrt_launchpad_daemon rwxa +wrt_launchpad_daemon wifi-direct xrw +wrt_launchpad_daemon wpasupplicant xrw +wrt_launchpad_daemon wrt::db_origin rxwl +wrt_launchpad_daemon wrt_launchpad_daemon rwxa +wrt_launchpad_daemon wrt-commons::db_wrt rwxa +wrt_launchpad_daemon wrt-popup-wrt-runtime rwxa +wrt_launchpad_daemon wrt-security-daemon rwxa +wrt_launchpad_daemon wrt-security-daemon::db rlwx +wrt_launchpad_daemon xorg rwxa +com.samsung.setting wrt_launchpad_daemon rwx +notification wrt_launchpad_daemon rwxa diff --git a/wrt_reset_all.sh b/wrt_reset_all.sh new file mode 100755 index 0000000..cda1c3e --- /dev/null +++ b/wrt_reset_all.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# resets all databases and security daemon +wrt_reset_db.sh "$@" +pkill -9 wrt-security +pkill -9 security-serv +security-server /dev/null 2>/dev/null & +wrt-security-daemon /dev/null 2>/dev/null & + diff --git a/wrt_reset_db.sh b/wrt_reset_db.sh new file mode 100755 index 0000000..e54b69d --- /dev/null +++ b/wrt_reset_db.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# resets all databases +# wrt_commons_reset_db.sh is trying to uninstall all widgets first +# so should be called first +wrt_commons_reset_db.sh "$@" +wrt_security_create_clean_db.sh -- 2.7.4