From: jihoon.chung Date: Wed, 22 Aug 2012 14:28:47 +0000 (+0900) Subject: Update wrt-plugins-common_0.3.53 X-Git-Tag: 2.0_alpha~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=078de8647f9c6321fd32e7c3b7594466eb6d65f8;hp=da854ef348cf918993a95adeeffa616db2dca6f7;p=framework%2Fweb%2Fwrt-plugins-common.git Update wrt-plugins-common_0.3.53 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9fdb538 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +CMakeCache.txt +CMakeFiles/ +build-stamp +cmake_install.cmake +config.guess +config.sub +configure-stamp +debian/files +debian/tmp/ +install_manifest.txt +Makefile +debian/wrt-plugins-dev.install +debian/wrt-plugins.install +debian/wrt-plugins.postinst +debian/wrt-plugins-common-dbg.debhelper.log +debian/wrt-plugins-common-dbg.substvars +debian/wrt-plugins-common-dbg/ +debian/wrt-plugins-common.debhelper.log +debian/wrt-plugins-common.substvars +debian/wrt-plugins-common/ +src/Makefile + +debian/wrt-plugins-common-dev.debhelper.log +debian/wrt-plugins-common-dev.install +debian/wrt-plugins-common-dev.substvars +debian/wrt-plugins-common-dev/ +debian/wrt-plugins-common.install +debian/wrt-plugins-common.postinst +debian/wrt-plugins-common.postinst.debhelper +debian/wrt-plugins-common.postrm.debhelper + +pkgconfigs/*.pc + +*~ +*.swp +cmake_build/* + +src/modules/slp2.0/WidgetInterfaceDAO/.widget_interface.db +src/modules/slp2.0/WidgetInterfaceDAO/.widget_interface.db-journal +src/modules/slp2.0/WidgetInterfaceDAO/widget_interface_db.sql + +/bin \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 8217e67..54639ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,15 +30,22 @@ include_directories( ${dpl_INCLUDE_DIRS} ) + + ############################################################################## +# Build type +IF(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "Release") +ENDIF(NOT CMAKE_BUILD_TYPE) + # Compiler flags -SET(CMAKE_BUILD_TYPE Release) SET(CMAKE_C_FLAGS_PROFILING "-O0 -g -pg") SET(CMAKE_CXX_FLAGS_PROFILING "-O0 -std=c++0x -g -pg") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -std=c++0x -g") SET(CMAKE_C_FLAGS_RELEASE "-O2 -g") SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -std=c++0x -g") +SET(CMAKE_CXX_FLAGS_CCOV "-O0 -std=c++0x -g --coverage") #### OPTION(DPL_LOG "DPL logs status" ON) @@ -49,6 +56,7 @@ ELSE(DPL_LOG) MESSAGE(STATUS "Logging disabled for DPL") ENDIF(DPL_LOG) +ADD_DEFINITIONS("-fPIC") ADD_DEFINITIONS("-fvisibility=default") # mark all exported symbols as visible ADD_DEFINITIONS("-fPIC") # If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding ADD_DEFINITIONS("-DEXPORT_API=") @@ -56,15 +64,10 @@ ADD_DEFINITIONS("-Wall") #ADD_DEFINITIONS("-Werror") ADD_DEFINITIONS("-Wextra") ADD_DEFINITIONS("-Wno-deprecated") -ADD_DEFINITIONS("-DSEPARATED_SINGLETON_IMPLEMENTATION") -#ADD_DEFINITIONS("-DW3C_TEST") #ADD_DEFINITIONS("-DDEVPKG") ############################################################################## # CMake flags -IF (W3C_TEST) - SET(W3C_TEST "ON") -ENDIF(W3C_TEST) IF (DEVPKG) SET(DEVPKG "ON") ENDIF(DEVPKG) @@ -80,6 +83,7 @@ set(DESTINATION_HEADER_PREFIX include/${PROJECT_NAME}) set(DESTINATION_HEADERS_NON_JS ${DESTINATION_HEADER_PREFIX}/Commons) set(DESTINATION_HEADERS_JS ${DESTINATION_HEADER_PREFIX}/CommonsJavaScript) +set(DESTINATION_HEADERS_JS_OVERLAY ${DESTINATION_HEADER_PREFIX}/js-overlay) ################################################################################ # Target platform @@ -128,6 +132,8 @@ configure_and_install_pkg(wrt-plugins-cpu.pc) configure_and_install_pkg(wrt-plugins-widget-interface-dao.pc) configure_and_install_pkg(wrt-plugins-widgetdb.pc) configure_and_install_pkg(wrt-plugins-plugin-manager.pc) +configure_and_install_pkg(wrt-plugin-loading.pc) +configure_and_install_pkg(wrt-plugin-js-overlay.pc) ################################################################################ # Cache @@ -141,4 +147,3 @@ set(CMAKE_CONFIG_FILE_NAME "${CMAKE_CONFIG_FILE_NAME}" CACHE # Summary message(STATUS "PLATFORM = ${PLATFORM}") -message(STATUS "W3C_TEST = ${W3C_TEST}") diff --git a/debian/changelog b/debian/changelog old mode 100755 new mode 100644 index 67c2734..aa39f4a --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,271 @@ +wrt-plugins-common (0.3.53) unstable; urgency=low + + * Removed a unnecessary dependency. + * Add thread pool enum for new tizen download module. + * Added new build type for code coverage + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.53 + + -- Tae-Jeong Lee Wed, 08 Aug 2012 15:42:43 +0900 + +wrt-plugins-common (0.3.52) unstable; urgency=low + + * Update tag for adding "SEL Verification" + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.52 + + -- Jihoon Chung Wed, 01 Aug 2012 17:46:57 +0900 + +wrt-plugins-common (0.3.51) unstable; urgency=low + + * Support for multiple contexts in plugin logic + * Cleaned up loading plugin into iframes + * Added support for dispatch event and set properties in JS + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.51 + + -- Jihoon Chung Wed, 01 Aug 2012 13:28:24 +0900 + +wrt-plugins-common (0.3.50) unstable; urgency=low + + * Re-upload package + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.50 + + -- Jihoon Chung Tue, 31 Jul 2012 11:35:52 +0900 + +wrt-plugins-common (0.3.49) unstable; urgency=low + + * Revert "Update dependency". + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.49 + + -- Bartlomiej Grzelewski Mon, 30 Jul 2012 15:30:00 +0200 + +wrt-plugins-common (0.3.48) unstable; urgency=low + + * Re-upload package + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.48 + + -- Jihoon Chung Mon, 30 Jul 2012 10:09:01 +0900 + +wrt-plugins-common (0.3.47) unstable; urgency=low + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.47 + + -- Leerang Song Fri, 27 Jul 2012 12:16:45 +0900 + +wrt-plugins-common (0.3.46-1) unstable; urgency=low + + * Fix tag for auto SR + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.46-1 + + -- Zbigniew Kostrzewa Wed, 25 Jul 2012 15:44:54 +0200 + +wrt-plugins-common (0.3.46) unstable; urgency=low + + * Upgrade dependencies to wrt-security and security-server + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.46 + + -- Zbigniew Kostrzewa Wed, 25 Jul 2012 15:34:13 +0200 + +wrt-plugins-common (0.3.45) unstable; urgency=low + + * readFeatures - performance improvement + * Upgrade dependencies + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.45 + + -- Jihoon Chung Wed, 25 Jul 2012 10:02:39 +0900 + +wrt-plugins-common (0.3.44) natty; urgency=low + + * fix build error in Plugin_property_support + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.44 + + -- Taejeong.lee Wed, 18 Jul 2012 19:35:41 +0900 + +wrt-plugins-common (0.3.43) unstable; urgency=low + + * "window.navigator.theme" property support. + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.43 + + -- Taejeong.lee Wed, 18 Jul 2012 17:45:56 +0900 + +wrt-plugins-common (0.3.42) unstable; urgency=low + + * Fixed CCR(#65374), jira(#WEB-1201) + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.42 + + -- Jihoon Chung Mon, 16 Jul 2012 11:06:24 +0900 + +wrt-plugins-common (0.3.41-1) unstable; urgency=low + + * Add tag for auto SR + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.41-1 + + -- Jihoon Chung Thu, 12 Jul 2012 15:59:21 +0900 + +wrt-plugins-common (0.3.41) unstable; urgency=low + + * Filesystem copy and move permission check fix + * Fix format of debian changelog entry + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.41 + + -- Jihoon Chung Thu, 12 Jul 2012 14:20:57 +0900 + +wrt-plugins-common (0.3.40) unstable; urgency=low + + * Revision to prevent a crash when Web process is terminated by OOM + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.40 + + -- Jihoon Chung Thu, 05 Jul 2012 09:40:36 +0900 + +wrt-plugins-common (0.3.39) unstable; urgency=low + + * Add TimeUtils API + * Change dependency to webkit2 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.39 + + -- Tae Jeong Lee Mon, 02 Jul 2012 15:01:03 +0900 + +wrt-plugins-common (0.3.38) unstable; urgency=low + + * Implementation of InjectedJavascript + * Changed ACE client usage to new C-API + * Klocwork fixes + * Add load and unload event for frame + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.38 + + -- Jihoon Chung Thu, 28 Jun 2012 16:34:35 +0900 + +wrt-plugins-common (0.3.37) unstable; urgency=low + + * Seperate js overlay module from widget interface and support new requirment of tizen appservice + * clear event listeners for custom event and its JSObject in case of page switch + * Fix for w3c-packaging-v9 test + * Move classes regarding management of js object to src/Commons + * add checking code on event dispatch handler of plugin logic + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.37 + + -- Jihoon Chung Mon, 11 Jun 2012 15:10:39 +0900 + +wrt-plugins-common (0.3.36) unstable; urgency=low + + * Removing DSEPARATED_SINGLETON_IMPLEMENTATION flag + * Fix generating database for WidgetInterfaceDAO + * signalEventByDispatcher() crash fix + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.36 + + -- Jihoon Chung Thu, 31 May 2012 14:19:20 +0900 + +wrt-plugins-common (0.3.35) unstable; urgency=low + + * Debianize for wrt-plugins-common_0.3.35 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.35 + + -- Tae-Jeong Lee Thu, 24 May 2012 18:16:08 +0900 + +wrt-plugins-common (0.3.34) unstable; urgency=low + + * Debianize for wrt-plugins-common_0.3.34 + * Include below changes. + - [Security] WrtAccess class implementation changed to safe one. + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.34 + + -- Tae-Jeong Lee Thu, 17 May 2012 18:41:37 +0900 + +wrt-plugins-common (0.3.33) unstable; urgency=low + + * Fix toLong, toInt, toChar, toSizeT converters + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.33 + + -- Jihoon Chung Thu, 03 May 2012 10:18:10 +0900 + +wrt-plugins-common (0.3.32) unstable; urgency=low + + * Debianized for wrt-plugins-common_0.3.32 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.32 + + -- Tae-Jeong Lee Thu, 19 Apr 2012 15:48:10 +0900 + +wrt-plugins-common (0.3.31) unstable; urgency=low + + * Debianized for wrt-plugins-common_0.3.31 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.31 + + -- Jihoon Chung Mon, 09 Apr 2012 11:41:21 +0900 + +wrt-plugins-common (0.3.30) unstable; urgency=low + + * Debianized for wrt-plugins-common_0.3.30 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.30 + + -- Tae-Jeong Lee Mon, 09 Apr 2012 10:25:40 +0900 + +wrt-plugins-common (0.3.29) unstable; urgency=low + + * Debianized for wrt-plugins-common_0.3.29 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.29 + + -- Tae-Jeong Lee Fri, 23 Mar 2012 10:15:50 +0900 + +wrt-plugins-common (0.3.28) unstable; urgency=low + + * Debianized for wrt-plugins-common_0.3.28 + + * Git : slp/pkgs/w/wrt-plugins-common + * Tag : wrt-plugins-common_0.3.28 + + -- Tae-Jeong Lee Tue, 20 Mar 2012 20:32:02 +0900 + wrt-plugins-common (0.3.27) unstable; urgency=low * Filesystem export API is changed. diff --git a/debian/control b/debian/control index 623731a..1b7e1af 100644 --- a/debian/control +++ b/debian/control @@ -2,19 +2,19 @@ Source: wrt-plugins-common Section: devel Priority: extra Maintainer: Piotr Fatyga , Grzegorz Krawczyk , Zbigniew Kostrzewa , Taehee Lee -Build-Depends: debhelper (>= 5), wrt-dev (>=0.8.27), libwebkit-engine-dev, wrt-commons-dev (>=0.2.6), libmm-player-dev, libmm-sound-dev, libpcre-dev, libglib2.0-dev, iniparser-dev, wrt-security-dev(>= 0.0.12) +Build-Depends: debhelper (>= 5), libwebkit2-efl-dev, wrt-commons-dev (>=0.2.7), libmm-player-dev, libmm-sound-dev, libpcre-dev, libglib2.0-dev, iniparser-dev, wrt-security-dev(>= 0.0.28) Uploaders: Hoseon LEE , Taejeong Lee , Jaehyun Park Package: wrt-plugins-common Architecture: any Section: libs -Depends: ${shlibs:Depends}, ${misc:Depends}, wrt, wrt-security(>= 0.0.12) +Depends: ${shlibs:Depends}, ${misc:Depends}, wrt-security(>= 0.0.28) Description: Common modules for creation JavaScript's plugins Package: wrt-plugins-common-dev Architecture: any Section: libs -Depends: wrt-plugins-common (= ${Source-Version}), libwebkit-engine-dev, wrt-commons-dev (>=0.2.6), wrt-dev (>=0.8.27) +Depends: wrt-plugins-common (= ${Source-Version}), libwebkit2-efl-dev, wrt-commons-dev (>=0.2.7) Description: Common modules for creation JavaScript's plugins -dev Package: wrt-plugins-common-dbg diff --git a/debian/wrt-plugins-common.postinst.in b/debian/wrt-plugins-common.postinst.in index e1a12e9..d808af0 100644 --- a/debian/wrt-plugins-common.postinst.in +++ b/debian/wrt-plugins-common.postinst.in @@ -1,5 +1,6 @@ #!/bin/sh mkdir -p /usr/lib/wrt-plugins +mkdir -p /usr/etc/wrt/injected-javascript touch /opt/apps/widget/plugin-installation-required \ No newline at end of file diff --git a/packaging/wrt-plugins-common.spec b/packaging/wrt-plugins-common.spec index f05429c..398079d 100644 --- a/packaging/wrt-plugins-common.spec +++ b/packaging/wrt-plugins-common.spec @@ -1,25 +1,24 @@ -#sbs-git:public/pkgs/w/wrt-plugins-common wrt-plugins-common 0.3.27 +#sbs-git:slp/pkgs/w/wrt-plugins-common wrt-plugins-common 0.3.53 Name: wrt-plugins-common Summary: wrt-plugins common library -Version: 0.3.27 +Version: 0.3.53 Release: 1 Group: Development/Libraries License: Apache License, Version 2.0 -Source0: %{name}-%{version}.tar.gz +Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: pkgconfig(dpl-efl) -BuildRequires: pkgconfig(wrt-plugin-api) +BuildRequires: pkgconfig(wrt-plugins-types) BuildRequires: pkgconfig(ace-client) BuildRequires: pkgconfig(dpl-event-efl) -BuildRequires: pkgconfig(ewebkit) +BuildRequires: pkgconfig(ewebkit2) BuildRequires: pkgconfig(dpl-wrt-dao-ro) BuildRequires: pkgconfig(dpl-db-efl) BuildRequires: pkgconfig(libpcrecpp) -BuildRequires: pkgconfig(wrt-plugin-loading) BuildRequires: pkgconfig(mm-sound) BuildRequires: pkgconfig(mm-player) -BuildRequires: ug-picker-efl +BuildRequires: pkgconfig(icu-i18n) Requires: ldconfig %description @@ -41,7 +40,8 @@ export LDFLAGS+="-Wl,--rpath=/usr/lib -Wl,--as-needed -Wl,--hash-style=both" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ -DDPL_LOG="ON" \ - -DCMAKE_PROJECT_VERSION=%{version} + -DCMAKE_PROJECT_VERSION=%{version} \ + -DCMAKE_BUILD_TYPE=%{?build_type:%build_type} make %{?jobs:-j%jobs} %install @@ -50,17 +50,17 @@ make %{?jobs:-j%jobs} %clean rm -rf %{buildroot} -%post -mkdir -p /usr/lib/wrt-plugins +%post +mkdir -p /usr/lib/wrt-plugins +mkdir -p /usr/etc/wrt/injected-javascript touch /opt/apps/widget/plugin-installation-required -%files +%files /usr/etc/wrt-plugins/config.dtd %{_libdir}/*.so %{_libdir}/*.so.* %{_libdir}/wrt-plugins/w3c-widget-interface/libwrt-plugins-w3c-widget-interface.so %attr(644,root,root) %{_libdir}/wrt-plugins/standard-features-list -%attr(644,root,root) %{_libdir}/wrt-plugins/w3c-widget-interface/config.xml %attr(644,root,root) /usr/share/wrt-plugins-common/widget_interface_db.sql %files devel diff --git a/pkgconfigs/wrt-plugin-js-overlay.pc.in b/pkgconfigs/wrt-plugin-js-overlay.pc.in new file mode 100644 index 0000000..7b28b87 --- /dev/null +++ b/pkgconfigs/wrt-plugin-js-overlay.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +project_name=@CMAKE_PROJECT_NAME@ +exec_prefix=${prefix} +includedir=${prefix}/include/${project_name} + +Name: wrt-plugin-js-overlay +Description: header for enum value of supported custom js event types +Version: @CMAKE_PROJECT_VERSION@ +Requires: +Libs: +Cflags: -I${includedir}/js-overlay diff --git a/pkgconfigs/wrt-plugin-loading.pc.in b/pkgconfigs/wrt-plugin-loading.pc.in new file mode 100644 index 0000000..69b9f8f --- /dev/null +++ b/pkgconfigs/wrt-plugin-loading.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: wrt-plugin-loading +Description: wrt-plugin-loading +Version: @PROJECT_VERSION@ +Requires: dpl-efl dpl-wrt-dao-ro ewebkit2 +Libs: -lwrt-plugin-loading -L${libdir} +Cflags: -I${includedir}/wrt-plugin-loading -I${includedir}/wrt-plugins-common diff --git a/pkgconfigs/wrt-plugins-commons-javascript.pc.in b/pkgconfigs/wrt-plugins-commons-javascript.pc.in index 73a3dd0..b522b22 100644 --- a/pkgconfigs/wrt-plugins-commons-javascript.pc.in +++ b/pkgconfigs/wrt-plugins-commons-javascript.pc.in @@ -7,6 +7,6 @@ includedir=${prefix}/include/${project_name} Name: WrtDeviceApis commons with JavaScrpt dependencies Description: Commons for DeviceApis with JavaScrpt dependencies Version: @CMAKE_PROJECT_VERSION@ -Requires: dpl-efl ewebkit wrt-plugins-commons +Requires: dpl-efl ewebkit2 wrt-plugins-commons Libs: -L${libdir} -lwrt-plugins-commons-javascript Cflags: -I${includedir} diff --git a/pkgconfigs/wrt-plugins-plugin-manager.pc.in b/pkgconfigs/wrt-plugins-plugin-manager.pc.in index 9ed0170..c6a3faa 100644 --- a/pkgconfigs/wrt-plugins-plugin-manager.pc.in +++ b/pkgconfigs/wrt-plugins-plugin-manager.pc.in @@ -7,6 +7,6 @@ includedir=${prefix}/include/${project_name} Name: WebRuntime DeviceApis Plugin Manager module Description: WebRuntime Plugin Manager module Version: @CMAKE_PROJECT_VERSION@ -Requires: dpl-efl wrt-plugins-commons wrt-plugins-commons-javascript dpl-wrt-dao-ro ewebkit +Requires: dpl-efl wrt-plugins-commons wrt-plugins-commons-javascript dpl-wrt-dao-ro ewebkit2 Libs: -L${libdir} -lwrt-plugins-plugin-manager Cflags: -I${includedir}/PluginManager diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 04ed299..8ab7022 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,12 +40,20 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/modules/API ${CMAKE_CURRENT_SOURCE_DIR}/Commons ${CMAKE_CURRENT_SOURCE_DIR}/CommonsJavaScript + ${CMAKE_CURRENT_SOURCE_DIR}/plugin-loading + ${CMAKE_CURRENT_SOURCE_DIR}/js-overlay ) #target names +set(TARGET_PLUGIN_LOADING_LIB "wrt-plugin-loading") set(TARGET_COMMONS "wrt-plugins-commons") set(TARGET_COMMONS_JAVASCRIPT "wrt-plugins-commons-javascript") +set(TARGET_JS_OVERLAY "wrt-plugins-js-overlay") +set(PLUGIN_LOADING_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/plugin-loading) + +add_subdirectory(plugin-loading) +add_subdirectory(js-overlay) add_subdirectory(Commons) add_subdirectory(CommonsJavaScript) add_subdirectory(modules) diff --git a/src/Commons/CMakeLists.txt b/src/Commons/CMakeLists.txt old mode 100755 new mode 100644 index 33b126a..a195bc9 --- a/src/Commons/CMakeLists.txt +++ b/src/Commons/CMakeLists.txt @@ -29,14 +29,16 @@ endmacro() include_config_file(WrtAccess) -pkg_search_module(wrt-plugin-api REQUIRED wrt-plugin-api>=0.7.0) +pkg_search_module(plugin-types REQUIRED wrt-plugins-types) pkg_search_module(ace-client REQUIRED ace-client) pkg_search_module(dpl-event REQUIRED dpl-event-efl) +pkg_search_module(icu REQUIRED icu-i18n) set(WRT_COMMONS_DEPENDECIES_INCLUDES - ${INCLUDE_JS_INDEPENDENT} ${wrt-plugin-api_INCLUDE_DIRS} ${ace-client_INCLUDE_DIRS} + ${plugin-types_INCLUDE_DIRS} + ${icu_INCLUDE_DIRS} ) include_directories(${WRT_COMMONS_DEPENDECIES_INCLUDES}) @@ -52,6 +54,9 @@ set(SRCS ${CMAKE_CURRENT_SOURCE_DIR}/StringBuilder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/StringUtils.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ThreadPool.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/JSObjectDeclaration.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/JSObject.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/TimeUtils.cpp #PARENT_SCOPE ) @@ -60,7 +65,9 @@ target_link_libraries(${TARGET_NAME} ${LIBS_COMMONS} ${ace-client_LIBRARIES} ${dpl-event_LIBRARIES} + ${icu_LIBRARIES} ) + set_target_properties(${TARGET_NAME} PROPERTIES SOVERSION ${CMAKE_PROJECT_API_VERSION} VERSION ${CMAKE_PROJECT_VERSION} @@ -92,4 +99,7 @@ install_header_file(ThreadPool.h) install_header_file(TypesDeclaration.h) install_header_file(TypeTraits.h) install_header_file(plugin_initializer_def.h) +install_header_file(JSObjectDeclaration.h) +install_header_file(JSObject.h) +install_header_file(TimeUtils.h) install_wrtaccess_header_file(WrtAccess/WrtAccess.h) diff --git a/src/Commons/EventReceiver.h b/src/Commons/EventReceiver.h index 5506695..0768e05 100644 --- a/src/Commons/EventReceiver.h +++ b/src/Commons/EventReceiver.h @@ -71,9 +71,18 @@ class EventReceiver : void signalEventByDispatcher(const DPL::SharedPtr &event) { LogDebug("in"); - DPL::Event::AbstractEventDispatcher *dispatcher = - ThreadPool::getInstance().getDispatcher(m_threadDispatcher); - dispatcher->AddEventCall(new SignalEventCall(event)); + Try { + DPL::Event::AbstractEventDispatcher *dispatcher = + ThreadPool::getInstance().getDispatcher(m_threadDispatcher); + dispatcher->AddEventCall(new SignalEventCall(event)); + } + Catch(DPL::Thread::Exception::UnmanagedThread) { + // if called on unmanaged thread, + // call signalSynchronousEventFlag() directly + LogDebug("signalSynchronousEventFlag() is called" + "by unmanaged thread"); + event->signalSynchronousEventFlag(); + } } virtual ~EventReceiver() diff --git a/src/Commons/IEvent.h b/src/Commons/IEvent.h index 9abfb23..6ff743f 100644 --- a/src/Commons/IEvent.h +++ b/src/Commons/IEvent.h @@ -77,6 +77,7 @@ class IEvent : /*private DPL::WaitableEvent, */ public IEventController friend class EventRequestReceiver; friend class EventAnswerReceiver; friend class SignalEventCall; + friend class EventReceiver; enum HandlingType { diff --git a/src/modules/tizen/Filesystem/System.h b/src/Commons/JSObject.cpp similarity index 65% rename from src/modules/tizen/Filesystem/System.h rename to src/Commons/JSObject.cpp index 7d274c6..70488f1 100644 --- a/src/modules/tizen/Filesystem/System.h +++ b/src/Commons/JSObject.cpp @@ -13,22 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef WRTDEVICEAPIS_FILESYSTEM_SYSTEM_H_ -#define WRTDEVICEAPIS_FILESYSTEM_SYSTEM_H_ - -namespace WrtDeviceApis { -namespace Filesystem { +/** + * @file js_object.cpp + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ - class Command; +#include "JSObject.h" +#include -// TODO Refactor - make it a singleton. -class System +JSObject::JSObject(RealObject object) : m_object(object) { - public: - static void run(Command* cmd); -}; + if (!object) { + LogError("Object is NULL"); + } +} -} //Filesystem -} //WrtDeviceApis - -#endif /* WRTDEVICEAPIS_FILESYSTEM_SYSTEM_H_ */ +JSObject::RealObject JSObject::getObject() const +{ + return m_object; +} diff --git a/src/modules/tizen/Filesystem/RemoveCommand.h b/src/Commons/JSObject.h similarity index 53% rename from src/modules/tizen/Filesystem/RemoveCommand.h rename to src/Commons/JSObject.h index a7928ba..a5ef354 100644 --- a/src/modules/tizen/Filesystem/RemoveCommand.h +++ b/src/Commons/JSObject.h @@ -14,35 +14,40 @@ * limitations under the License. */ /** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @file js_object.h + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief */ -#ifndef WRTDEVICEAPIS_FILESYSTEM_REMOVECOMMAND_H_ -#define WRTDEVICEAPIS_FILESYSTEM_REMOVECOMMAND_H_ +#ifndef WRT_SRC_PLUGIN_SERVICE_JS_OBJECT_H_ +#define WRT_SRC_PLUGIN_SERVICE_JS_OBJECT_H_ -#include "Command.h" -#include +#include +#include -namespace WrtDeviceApis { -namespace Filesystem { - -class RemoveCommand : public Command +class JSObject : private DPL::Noncopyable { public: - explicit RemoveCommand(const Api::IPathPtr& path); - void setRecursive(bool recursive); - void setForce(bool force); + typedef void* RealObject; + + public: + explicit JSObject(RealObject object); + + /** + * returns javascript engine object + * @throw NullPtrException + * */ + virtual RealObject getObject() const; - protected: - std::string prepare(); + virtual ~JSObject() + { + } private: - Api::IPathPtr m_path; - bool m_recursive; - bool m_force; + RealObject m_object; }; -} // Filesystem -} // WrtDeviceApis +typedef DPL::SharedPtr JSObjectPtr; -#endif // WRTDEVICEAPIS_FILESYSTEM_REMOVECOMMAND_H_ +#endif diff --git a/src/Commons/JSObjectDeclaration.cpp b/src/Commons/JSObjectDeclaration.cpp new file mode 100644 index 0000000..46a3da3 --- /dev/null +++ b/src/Commons/JSObjectDeclaration.cpp @@ -0,0 +1,141 @@ +/* + * 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 js_object_declaration.cpp + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ + +#include +#include +#include "JSObjectDeclaration.h" + +JSObjectDeclaration::JSObjectDeclaration(js_entity_definition_ptr_t classD) : + m_name(classD->object_name), + m_parentName(classD->parent_name), + m_interfaceName(classD->interface_name), + m_classTemplate(NULL), + m_constructorCallback(classD->js_class_constructor_cb) +{ + if (NULL != classD->js_class_template_getter_fun) + { + m_classTemplate = classD->js_class_template_getter_fun(); + } + if(classD->class_options){ + LogDebug("class options is not a null"); + m_options = OptionsPtr(new Options(classD->class_options)); + } +} + +JSObjectDeclaration::~JSObjectDeclaration() +{ +} + +bool JSObjectDeclaration::checkIframesSupported() const{ + LogDebug("Check iframe supported"); + if(!m_options || + m_options->getIframeObject() == Options::IFrameObject::None) + { + LogDebug("Iframe NOT supported for object: " << getName()); + return false; + } + + LogDebug("Iframe supported for object: " << getName()); + + return true; +} + +JSObjectDeclaration::Options::ClassType + JSObjectDeclaration::Options::getType() const +{ + LogDebug("Get type field from declaration's option"); + Assert(m_options && "Pointer to options is NULL"); + + switch(m_options->type){ + case JS_CLASS: return ClassType::Class; + case JS_FUNCTION: return ClassType::Function; + case JS_INTERFACE: return ClassType::Interface; + default: Assert(0 && "Wrong value of type"); + } +} + +JSObjectDeclaration::Options::IFrameObject + JSObjectDeclaration::Options::getIframeObject() const +{ + LogDebug("Get Frame Option"); + Assert(m_options && "Options object is NULL"); + + switch(m_options->iframe_option){ + case NONE: return IFrameObject::None; + case REFERENCE: return IFrameObject::Reference; + case CREATE_INSTANCE: return IFrameObject::CreateInstance; + default: + Assert(0 && "Wrong value of behaviour type"); + } +} + +JSObjectDeclaration::Options::IFrameNotice + JSObjectDeclaration::Options::getIframeNotice() const +{ + LogDebug("Get Frame Option"); + Assert(m_options && "Pointer to options is null"); + + switch(m_options->iframe_notice){ + case NONE_NOTICE: return IFrameNotice::None; + case ALWAYS_NOTICE: return IFrameNotice::AlwaysNotice; + default: + Assert(0 && "Wrong value of notice option"); + } +} + +JSObjectDeclaration::Options::IFrameOverlay + JSObjectDeclaration::Options::getIframeOverlay() const +{ + LogDebug("Get Frame Option"); + Assert(m_options && "Pointer to options is null"); + + switch(m_options->iframe_overlay){ + case IGNORED: return IFrameOverlay::Ignored; + case USE_OVERLAYED: return IFrameOverlay::UseOverlayed; + case OVERLAYED_BEFORE_ORIGINAL: + return IFrameOverlay::OverlayedBeforeOriginal; + default: + Assert(0 && "Wrong value of overlay option"); + } +} + +js_function_impl JSObjectDeclaration::Options::getFunctionImpl() const +{ + Assert(m_options && "Pointer to options is null"); + return m_options->function; +} + +void JSObjectDeclaration::Options::invokeCallback(JsContext ctx, + ObjectInstance iframe, + ObjectInstance object) const +{ + LogDebug("JS Object create, notice."); + Assert(m_options && m_options->cb && "Empty callback pointer"); + m_options->cb(ctx, iframe, object); +} + +JSObjectDeclaration::Options::PrivateData + JSObjectDeclaration::Options::getPrivateData() const +{ + Assert(m_options && m_options->private_data && "empty private data"); + return m_options->private_data; +} diff --git a/src/Commons/JSObjectDeclaration.h b/src/Commons/JSObjectDeclaration.h new file mode 100644 index 0000000..fa14dce --- /dev/null +++ b/src/Commons/JSObjectDeclaration.h @@ -0,0 +1,151 @@ +/* + * 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 js_object_declaration.h + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ + +#ifndef WRT_SRC_PLUGIN_SERVICE_JS_OBJECT_DECLARATION_H_ +#define WRT_SRC_PLUGIN_SERVICE_JS_OBJECT_DECLARATION_H_ + +#include +#include +#include +#include +#include +#include +#include + +class JSObjectDeclaration : private DPL::Noncopyable +{ + public: + typedef const void* ConstClassTemplate; + typedef void* ClassTemplate; + typedef js_class_constructor_cb_t ConstructorCallback; + typedef class_definition_options_t ClassOptions; + + + class Options : DPL::Noncopyable { + public: + enum class ClassType{ + Class, + Function, + Interface + }; + + enum class IFrameObject{ + None, + Reference, + CreateInstance + }; + + enum class IFrameNotice{ + None, + AlwaysNotice + }; + + //only for function + enum class IFrameOverlay{ + Ignored, + UseOverlayed, + OverlayedBeforeOriginal + }; + + typedef js_object_instance_t ObjectInstance; + typedef java_script_context_t JsContext; + typedef void* PrivateData; + + public: + ClassType getType() const; + + IFrameObject getIframeObject() const; + IFrameNotice getIframeNotice() const; + IFrameOverlay getIframeOverlay() const; + js_function_impl getFunctionImpl() const; + + void invokeCallback(JsContext ctx, + ObjectInstance iframe, + ObjectInstance object) const; + + PrivateData getPrivateData() const; + + private: + const ClassOptions* m_options; + + private: + explicit Options(const ClassOptions* options) : m_options(options) + { + assert(options && "Dont create empty options"); + } + + friend class JSObjectDeclaration; + + }; + + typedef std::shared_ptr OptionsPtr; + + public: + + explicit JSObjectDeclaration(js_entity_definition_ptr_t declaration); + + virtual const std::string& getName() const + { + return m_name; + } + + virtual const std::string& getParentName() const + { + return m_parentName; + } + + virtual ConstClassTemplate getClassTemplate() const + { + return m_classTemplate; + } + + virtual const std::string& getInterfaceName() const + { + return m_interfaceName; + } + + virtual ConstructorCallback getConstructorCallback() const + { + return m_constructorCallback; + } + + + const OptionsPtr getOptions() const{ + return m_options; + } + + bool checkIframesSupported() const; + + virtual ~JSObjectDeclaration(); + + private: + std::string m_name; + std::string m_parentName; + std::string m_interfaceName; + ConstClassTemplate m_classTemplate; + ConstructorCallback m_constructorCallback; + OptionsPtr m_options; +}; + +typedef DPL::SharedPtr JSObjectDeclarationPtr; + +#endif diff --git a/src/Commons/StringUtils.cpp b/src/Commons/StringUtils.cpp index 4795131..1fe0b7a 100644 --- a/src/Commons/StringUtils.cpp +++ b/src/Commons/StringUtils.cpp @@ -17,8 +17,6 @@ #include #include #include -#include -#include #include "StringUtils.h" namespace WrtDeviceApis { @@ -106,7 +104,7 @@ char* strdup(const char* str) } std::string merge(const std::vector& strs, - std::string::value_type delim) + std::string::value_type delim) { typedef std::vector Strings; @@ -138,16 +136,11 @@ std::vector split(const std::string& str, return result; } -int toInt(const std::string &text) +int toInt(const std::string& str) { - int result; - std::stringstream ss(text); - if (!(ss >> result)) { - Throw(ConversionException); - } - return result; + return convertTo(str); } } } -} // WrtDeviceApisCommon +} diff --git a/src/Commons/StringUtils.h b/src/Commons/StringUtils.h index be6bcc8..ee7cbe8 100644 --- a/src/Commons/StringUtils.h +++ b/src/Commons/StringUtils.h @@ -13,11 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/** + * @file StringUtils.h + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + */ + #ifndef WRTDEVICEAPIS_COMMONS_STRINGUTILS_H_ #define WRTDEVICEAPIS_COMMONS_STRINGUTILS_H_ #include #include +#include +#include +#include +#include namespace WrtDeviceApis { namespace Commons { @@ -50,8 +59,7 @@ std::string trim(const std::string& str); * @param startStr String to be found at the beginning of str. * @return true when str starts with startStr, false otherwise. */ -bool startsWith(const std::string& str, - const std::string& startStr); +bool startsWith(const std::string& str, const std::string& startStr); /** * Checks if str ends with startStr @@ -59,8 +67,7 @@ bool startsWith(const std::string& str, * @param endStr String to be found at the end of str. * @return true when str starts with startStr, false otherwise. */ -bool endsWith(const std::string& str, - const std::string& endStr); +bool endsWith(const std::string& str, const std::string& endStr); /** * Merges consecutive groups of duplicate characters into one. @@ -75,8 +82,7 @@ bool endsWith(const std::string& str, * ... * @endcode */ -std::string unique(const std::string& str, - const char needle); +std::string unique(const std::string& str, const char needle); /** * Checks if supplied string exists in specified array of c-strings. @@ -86,8 +92,7 @@ std::string unique(const std::string& str, * @remarks Last element of array should be NULL, otherwise there is no * way to calculate its number of elements. */ -bool inCStringArray(const std::string& needle, - const char* stack[]); +bool inCStringArray(const std::string& needle, const char* stack[]); /** * Duplicates a string. @@ -104,15 +109,61 @@ inline char* strdup(const std::string& str) } std::string merge(const std::vector& strs, - std::string::value_type delim); + std::string::value_type delim); std::vector split(const std::string& str, - std::string::value_type delim); + std::string::value_type delim); -int toInt(const std::string &text); +/** + * @deprecated Use convertTo(). + */ +int toInt(const std::string& str) WRT_PLUGINS_DEPRECATED; -} // String +/** + * Converts string to specified type. + * + * @tparam T Type to convert to. + * @param str String to convert. + * @return Converted value. + * @throw ConversionException If conversion fails. + * + * @remarks T must implement default constructor and an implementation + * of input string operator for T must exist. + */ +template +T convertTo(const std::string& str) +{ + T result; + std::istringstream iss(str); + if (!(iss >> result)) { + Throw(ConversionException); + } + return std::move(result); +} + +/** + * Converts a given value to string. + * + * @tparam T Type of the value to convert. It is deduced by the compiler. + * @param data Value to convert. + * @return Value converted to string. + * @throw ConversionException If operation fails. + * + * @remarks Output stream operator for type T must exist. + */ +template +std::string parse(const T& data) +{ + std::ostringstream oss; + if (!(oss << data)) + { + Throw(ConversionException); + } + return oss.str(); +} + +} +} } -} // WrtDeviceApisCommon -#endif // WRTDEVICEAPIS_COMMONS_STRINGUTILS_H_ +#endif diff --git a/src/Commons/ThreadPool.cpp b/src/Commons/ThreadPool.cpp index d074cb3..748e20c 100755 --- a/src/Commons/ThreadPool.cpp +++ b/src/Commons/ThreadPool.cpp @@ -187,6 +187,9 @@ DPL::Thread *ThreadPool::getThreadRef(ThreadEnum::Enumeration type) case ThreadEnum::MEDIACONTENT_THREAD: thandle = getThreadHandleCreateIfNotExists(ThreadEnum::MEDIACONTENT_THREAD); break; + case ThreadEnum::SE_THREAD: + thandle = getThreadHandleCreateIfNotExists(ThreadEnum::SE_THREAD); + break; // ..... default: LogError("no case statement for ThreadEnum"); diff --git a/src/Commons/ThreadPool.h b/src/Commons/ThreadPool.h index 6a27a7c..86fb475 100755 --- a/src/Commons/ThreadPool.h +++ b/src/Commons/ThreadPool.h @@ -72,6 +72,8 @@ class ThreadEnum ACCOUNT_THREAD, NFC_THREAD, MEDIACONTENT_THREAD, + SE_THREAD, + DOWNLOAD_THREAD, //.... size }; diff --git a/src/Commons/TimeUtils.cpp b/src/Commons/TimeUtils.cpp new file mode 100644 index 0000000..0467c03 --- /dev/null +++ b/src/Commons/TimeUtils.cpp @@ -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 TimeUtils.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + */ + +#include "TimeUtils.h" +#include + +namespace WrtDeviceApis { +namespace Commons { +namespace Time { + +struct tm* localtime_r(long long int* timep, struct tm* result) +{ + UErrorCode status = U_ZERO_ERROR; + UCalendar *cal; + + if( !result || !timep ) + { + return NULL; + } + + cal = ucal_open(NULL, 0, NULL, UCAL_DEFAULT, &status); + + if(U_FAILURE(status)) + { + return NULL; + } + + ucal_setMillis(cal, (*timep * (double)1000.0), &status); + + result->tm_sec = ucal_get(cal, UCAL_SECOND, &status); + result->tm_min = ucal_get(cal, UCAL_MINUTE, &status); + result->tm_hour = ucal_get(cal, UCAL_HOUR, &status); + result->tm_mday = ucal_get(cal, UCAL_DAY_OF_MONTH, &status); + result->tm_mon = ucal_get(cal, UCAL_MONTH, &status); + result->tm_year = ucal_get(cal, UCAL_YEAR, &status); + result->tm_wday = ucal_get(cal, UCAL_DAY_OF_WEEK, &status); + result->tm_yday = ucal_get(cal, UCAL_DAY_OF_YEAR, &status); + result->tm_isdst= ucal_get(cal, UCAL_DST_OFFSET, &status); + + ucal_close(cal); + + if(U_FAILURE(status)) + { + return NULL; + } + else + { + return result; + } +} + +} +} +} diff --git a/src/modules/tizen/Filesystem/System.cpp b/src/Commons/TimeUtils.h similarity index 69% rename from src/modules/tizen/Filesystem/System.cpp rename to src/Commons/TimeUtils.h index be68d97..27e4038 100644 --- a/src/modules/tizen/Filesystem/System.cpp +++ b/src/Commons/TimeUtils.h @@ -13,18 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "System.h" -#include -#include -#include "Command.h" +/** + * @file TimeUtils.h + * @author Tae-Jeong Lee (taejeong.lee@samsung.com) + */ + +#ifndef WRTDEVICEAPIS_COMMONS_TIMEUTILS_H_ +#define WRTDEVICEAPIS_COMMONS_TIMEUTILS_H_ + +#include namespace WrtDeviceApis { -namespace Filesystem { +namespace Commons { +namespace Time { -void System::run(Command* cmd) -{ - cmd->execute(); -} +struct tm* localtime_r(long long int* timep, struct tm* result); -} // Filesystem -} // WrtDeviceApis +} +} +} +#endif diff --git a/src/Commons/WrtAccess/WrtAccess.cpp b/src/Commons/WrtAccess/WrtAccess.cpp index ce55e8e..67b2979 100644 --- a/src/Commons/WrtAccess/WrtAccess.cpp +++ b/src/Commons/WrtAccess/WrtAccess.cpp @@ -20,25 +20,57 @@ */ #include +#include +#include +#include +#include #include #include #include #include -#include #include #include "WrtAccess.h" -#include -#include +#include +#include -IMPLEMENT_SINGLETON(WrtDeviceApis::Commons::WrtAccess) +IMPLEMENT_SAFE_SINGLETON(WrtDeviceApis::Commons::WrtAccess) -namespace WrtDeviceApis { -namespace Commons { +namespace { + +/** + * Helper class - single parameter and its value + */ +struct AceParam +{ + const char *name; + const char *value; + + AceParam(): + name(NULL), value(NULL) + {} + + AceParam(const char *name, const char *value): + name(name), value(value) + {} +}; + +/** + * Helper class - list of params for single dev cap + */ +struct AceParamList +{ + size_t count; + AceParam* param; + AceParamList(): + count(0), + param(NULL) + {} +}; struct DeviceCapParamPolicy { - typedef AceClient::AceParamList* Type; + typedef AceParamList* Type; static Type NullValue() { return NULL; @@ -58,13 +90,13 @@ struct DeviceCapParamPolicy class ScopedDeviceCapArray : public DPL::ScopedResource { public: - explicit ScopedDeviceCapArray(AceClient::AceParamList *ptr = + explicit ScopedDeviceCapArray(AceParamList *ptr = DeviceCapParamPolicy::NullValue()) : DPL::ScopedResource(ptr) { } - AceClient::AceParamList & operator [](std::ptrdiff_t k) const + AceParamList & operator [](std::ptrdiff_t k) const { Assert(this->m_value != DeviceCapParamPolicy::NullValue() && "Dereference of scoped NULL array!"); @@ -73,32 +105,66 @@ class ScopedDeviceCapArray : public DPL::ScopedResource return this->m_value[k]; } }; +} // namespace + +namespace WrtDeviceApis { +namespace Commons { -WrtAccess::WrtAccess() +WrtAccess::WrtAccess() : + m_initialized(false), + m_sessionId(GenerateSessionId()) { - DPL::Log::LogSystemSingleton::Instance().SetTag("WRT_PLUGINS"); } WrtAccess::~WrtAccess() { } +WrtAccess::SessionId WrtAccess::GenerateSessionId() +{ + const size_t SESSION_ID_LENGTH = 32; + + std::ostringstream pid; + pid << static_cast (getpid()); + + std::string session_id = pid.str(); + + session_id.reserve(session_id.length() + SESSION_ID_LENGTH); + + for (size_t i = 0; i < SESSION_ID_LENGTH; ++i) + { + int c = random() % 16; + + session_id += (c < 10 ? + static_cast('0' + c) : + static_cast('A' + c - 10)); + } + return session_id; +} + void WrtAccess::initialize(int widgetId) { LogDebug("initialize"); - if (widgetId < 0) { LogDebug("Invalid widget id"); Throw(Exception); } - + // TODO: implement UI handler + ace_return_t ret = ace_client_initialize(NULL); + // Assert(ACE_OK == ret); // This is commented because UI handler is not + // implemented, ace client will work, but initialization will return + // ACE_INVALID_ARGUMENTS + m_initialized = true; m_widgetId = widgetId; } -void WrtAccess::deinitialize(int widgetId) +void WrtAccess::deinitialize(int /*widgetId*/) { LogDebug("deinitialize"); + m_initialized = false; + ace_return_t ret = ace_client_shutdown(); + Assert(ACE_OK == ret); } int WrtAccess::getWidgetId() const @@ -108,6 +174,8 @@ int WrtAccess::getWidgetId() const bool WrtAccess::checkAccessControl(const AceFunction& aceFunction) const { + Assert(m_initialized && "WrtAccessSingleton needs to be initialized with" + "WidgetId during on_widget_start_callback in each plugin"); size_t deviceCount = aceFunction.deviceCapabilities.size(); DPL::ScopedArray deviceScopedArray; @@ -115,7 +183,7 @@ bool WrtAccess::checkAccessControl(const AceFunction& aceFunction) const if (deviceCount) { deviceScopedArray.Reset(new const char*[deviceCount]); - paramsScopedArray.Reset(new AceClient::AceParamList[deviceCount]); + paramsScopedArray.Reset(new AceParamList[deviceCount]); for (size_t i = 0; i < deviceCount; ++i) { deviceScopedArray[i] = @@ -124,7 +192,7 @@ bool WrtAccess::checkAccessControl(const AceFunction& aceFunction) const aceFunction.deviceCapabilities.at(i).devCapParams.size(); paramsScopedArray[i].param = - new AceClient::AceParam[paramsScopedArray[i].count]; + new AceParam[paramsScopedArray[i].count]; for (size_t j = 0; j < paramsScopedArray[i].count; ++j) { paramsScopedArray[i].param[j].name = @@ -149,19 +217,48 @@ bool WrtAccess::checkAccessControl(const AceFunction& aceFunction) const } } - AceClient::AceRequest aceRequest; - aceRequest.sessionId = ""; // TODO for now empty session - aceRequest.widgetHandle = getWidgetId(); - aceRequest.apiFeatures.count = featuresCount; - aceRequest.apiFeatures.apiFeature = featureScopedArray.Get(); - aceRequest.functionName = aceFunction.name.c_str(); - aceRequest.deviceCapabilities.devcapsCount = deviceCount; - aceRequest.deviceCapabilities.devCapNames = deviceScopedArray.Get(); - aceRequest.deviceCapabilities.paramsCount = deviceCount; - aceRequest.deviceCapabilities.params = paramsScopedArray.Get(); - - return AceClient::AceThinClientSingleton:: - Instance().checkFunctionCall(aceRequest); + LogDebug("constructing ACE request"); + + ace_request_t aceRequest; + aceRequest.session_id = const_cast(m_sessionId.c_str()); + aceRequest.widget_handle = getWidgetId(); + aceRequest.feature_list.count = featuresCount; + aceRequest.feature_list.items = const_cast(featureScopedArray.Get()); + aceRequest.dev_cap_list.count = deviceCount; + aceRequest.dev_cap_list.items = new ace_dev_cap_t[deviceCount]; + + const char** devCapNames = deviceScopedArray.Get(); + AceParamList* paramList = paramsScopedArray.Get(); + + unsigned int i; + for (i = 0; i < deviceCount; ++i) { + aceRequest.dev_cap_list.items[i].name = + const_cast(devCapNames[i]); + aceRequest.dev_cap_list.items[i].param_list.count = paramList[i].count; + aceRequest.dev_cap_list.items[i].param_list.items = + new ace_param_t[paramList[i].count]; + unsigned int j; + for (j = 0; j < paramList[i].count; ++j) { + aceRequest.dev_cap_list.items[i].param_list.items[j].name = + const_cast(paramList[i].param[j].name); + aceRequest.dev_cap_list.items[i].param_list.items[j].value = + const_cast(paramList[i].param[j].value); + } + } + + ace_bool_t aceCheckResult = ACE_FALSE; + ace_return_t ret = ace_check_access(&aceRequest, &aceCheckResult); + + for (i = 0; i < deviceCount; ++i) { + delete [] aceRequest.dev_cap_list.items[i].param_list.items; + } + delete [] aceRequest.dev_cap_list.items; + + if (ACE_OK != ret) { + LogError("Error in ace check: " << static_cast(ret)); + return false; + } + return ACE_TRUE == aceCheckResult; } } diff --git a/src/Commons/WrtAccess/WrtAccess.h b/src/Commons/WrtAccess/WrtAccess.h index 0c21374..574324f 100644 --- a/src/Commons/WrtAccess/WrtAccess.h +++ b/src/Commons/WrtAccess/WrtAccess.h @@ -22,6 +22,8 @@ #ifndef WRT_PLUGINS_WRT_ACCESS_H_ #define WRT_PLUGINS_WRT_ACCESS_H_ +#include + #include #include @@ -37,11 +39,16 @@ public: bool checkAccessControl(const AceFunction &aceFunction) const; private: + + typedef std::string SessionId; + SessionId GenerateSessionId(); + WrtAccess(); virtual ~WrtAccess(); bool m_initialized; int m_widgetId; + SessionId m_sessionId; friend class DPL::Singleton; }; diff --git a/src/Commons/plugin_initializer_def.h b/src/Commons/plugin_initializer_def.h index 84bd4b7..f2429f9 100755 --- a/src/Commons/plugin_initializer_def.h +++ b/src/Commons/plugin_initializer_def.h @@ -73,6 +73,21 @@ typedef java_script_context_t JavaScriptContext; #define PLUGIN_ON_WIDGET_START(CALLBACK_NAME) extern "C" const on_widget_start_proc PLUGIN_WIDGET_START_PROC EXPORT_SYMBOL = CALLBACK_NAME; /* + * You have to(!) call this macro in your plugin_initializer.cpp(!) file + * providing callback that will be called while loading each widget + * (for every loaded widget this function will be called) + * Example: + * plugin_initializer.cpp + * void on_widget_init_callback(feature_mapping_interface_t *mapping) + * { + * //... + * } + * PLUGIN_ON_WIDGET_INIT(on_widget_init_callback) + */ +#define PLUGIN_ON_WIDGET_INIT(CALLBACK_NAME) extern "C" \ +const on_widget_init_proc PLUGIN_WIDGET_INIT_PROC EXPORT_SYMBOL = CALLBACK_NAME; + +/* * You have to(!) call this macro in your plugin_initializer.cpp(!) file providing callback that will be called while unloading each widget (for every unloaded widget this function will be called) * Example: * void on_widget_stop_callback(int widgetId) @@ -84,6 +99,28 @@ typedef java_script_context_t JavaScriptContext; #define PLUGIN_ON_WIDGET_STOP(CALLBACK_NAME) extern "C" const on_widget_stop_proc PLUGIN_WIDGET_STOP_PROC EXPORT_SYMBOL = CALLBACK_NAME; /* + * You have to(!) call this macro in your plugin_initializer.cpp(!) file providing callback that will be called while unloading each page (for every loaded page, including nested page, this function will be called) + * Example: + * void on_frame_load_callback(java_script_context_t context) + * { + * //... + * } + * PLUGIN_ON_FRAME_LOAD(on_frame_load_callback) + */ +#define PLUGIN_ON_FRAME_LOAD(CALLBACK_NAME) extern "C" const on_frame_load_proc PLUGIN_FRAME_LOAD_PROC EXPORT_SYMBOL = CALLBACK_NAME; + +/* + * You have to(!) call this macro in your plugin_initializer.cpp(!) file providing callback that will be called while ununloading each page (for every unloaded page, including nested page, this function will be called) + * Example: + * void on_frame_unload_callback(java_script_context_t context) + * { + * //... + * } + * PLUGIN_ON_FRAME_UNLOAD(on_frame_unload_callback) + */ +#define PLUGIN_ON_FRAME_UNLOAD(CALLBACK_NAME) extern "C" const on_frame_unload_proc PLUGIN_FRAME_UNLOAD_PROC EXPORT_SYMBOL = CALLBACK_NAME; + +/* * You have to(!) define an array of structures in your plugin_initializer.cpp(!) file describing a JS class (class_definition) and it's parent class name (parent_name). * JS class will be bind to a parent class name (parent_name.jsclass_name). * Example: @@ -94,11 +131,29 @@ typedef java_script_context_t JavaScriptContext; * PLUGIN_CLASS_MAP_END * */ -#define PLUGIN_CLASS_MAP_BEGIN extern "C" const class_definition_t PLUGIN_CLASS_MAP[] EXPORT_SYMBOL = { -#define PLUGIN_CLASS_MAP_ADD_CLASS(PARENTNAME,CLASSNAME,JSCLASSTEMPLATE,PRIVDATA) {PARENTNAME,CLASSNAME,JSCLASSTEMPLATE,PRIVDATA}, -#define PLUGIN_CLASS_MAP_END {NULL,NULL,NULL,NULL} }; +#define PLUGIN_CLASS_MAP_BEGIN extern "C" const js_entity_definition_t\ + PLUGIN_CLASS_MAP[] EXPORT_SYMBOL = { + +#define PLUGIN_CLASS_MAP_ADD_INTERFACE(PARENTNAME,INTERFACENAME,\ + JSPRODUCTCLASSTEMPLATE,PRODUCTCONSTRUCTORCB,PRIVDATA) \ + {PARENTNAME,INTERFACENAME,"",JSPRODUCTCLASSTEMPLATE,\ + PRODUCTCONSTRUCTORCB,PRIVDATA}, + +#define PLUGIN_CLASS_MAP_ADD_INTERFACE_PRODUCT(PARENTNAME,OBJECTNAME,\ + INTERFACENAME,PRIVDATA)\ + {PARENTNAME,OBJECTNAME,INTERFACENAME,NULL,NULL,PRIVDATA}, + +#define PLUGIN_CLASS_MAP_ADD_CLASS(PARENTNAME,CLASSNAME,JSCLASSTEMPLATE,\ + PRIVDATA)\ + {PARENTNAME,CLASSNAME,"",JSCLASSTEMPLATE,NULL,PRIVDATA}, + +#define PLUGIN_CLASS_MAP_END {NULL,NULL,NULL,NULL,NULL,NULL} }; + +#define PLUGIN_CLASS_MAP_BEGIN_STATIC static const js_entity_definition_t\ + PLUGIN_CLASS_MAP[] = { -#define PLUGIN_CLASS_MAP_BEGIN_STATIC static const class_definition_t PLUGIN_CLASS_MAP[] = { -#define PLUGIN_GET_CLASS_MAP(CALLBACK_NAME) extern "C" const get_widget_class_map_proc PLUGIN_GET_CLASS_PROC_MAP EXPORT_SYMBOL = CALLBACK_NAME; +#define PLUGIN_GET_CLASS_MAP(CALLBACK_NAME) extern "C" const\ + get_widget_entity_map_proc\ + PLUGIN_GET_CLASS_PROC_MAP EXPORT_SYMBOL = CALLBACK_NAME; #endif // WRTDEVICEAPIS_COMMONS_PLUGIN_INITIALIZER_DEF_H_ diff --git a/src/CommonsJavaScript/CMakeLists.txt b/src/CommonsJavaScript/CMakeLists.txt index 88611bb..ecd0317 100755 --- a/src/CommonsJavaScript/CMakeLists.txt +++ b/src/CommonsJavaScript/CMakeLists.txt @@ -18,16 +18,13 @@ macro(install_header_file HEADER_FILE) endmacro() -#TODO fix it -pkg_search_module(wrt-plugin-api REQUIRED wrt-plugin-api>=1.1.1) -pkg_search_module(webkit REQUIRED ewebkit>=0.1.0) +pkg_search_module(webkit2 REQUIRED ewebkit2) set(TARGET_NAME ${TARGET_COMMONS_JAVASCRIPT}) include_directories(${DIR_JS_COMMONS} - ${INCLUDE_JS_INDEPENDENT} ${wrt-plugin-api_INCLUDE_DIRS} - ${webkit_INCLUDE_DIRS}} + ${webkit2_INCLUDE_DIRS}} ) @@ -52,10 +49,10 @@ set(SRCS add_library(${TARGET_NAME} SHARED ${SRCS}) target_link_libraries(${TARGET_NAME} ${LIBS_COMMONS} - ${webkit_LIBRARIES} + ${webkit2_LIBRARIES} ${TARGET_COMMONS} ) -set_target_properties(${TARGET_NAME} PROPERTIES +set_target_properties(${TARGET_NAME} PROPERTIES SOVERSION ${CMAKE_PROJECT_API_VERSION} VERSION ${CMAKE_PROJECT_VERSION} ) diff --git a/src/CommonsJavaScript/Converter.cpp b/src/CommonsJavaScript/Converter.cpp old mode 100755 new mode 100644 index 1d97810..60d58e1 --- a/src/CommonsJavaScript/Converter.cpp +++ b/src/CommonsJavaScript/Converter.cpp @@ -244,6 +244,11 @@ JSValueRef Converter::toJSValueRefLong(const long arg) { return JSValueMakeNumber(m_context, arg); } +JSValueRef Converter::toJSValueRef(long long int arg) +{ + return JSValueMakeNumber(m_context, arg); +} + JSValueRef Converter::toJSValueRef(double arg) { return JSValueMakeNumber(m_context, arg); @@ -347,20 +352,14 @@ std::string Converter::toString_(const JSValueRef& arg) JSValueRef exception = NULL; JSStringRef str = JSValueToStringCopy(m_context, arg, &exception); - if ((NULL == str) || (NULL != exception)) { + if (NULL == str) { ThrowMsg(ConversionException, "Couldn't cast to a string."); } size_t jsSize = JSStringGetMaximumUTF8CStringSize(str); if (jsSize > 0) { - jsSize = jsSize + 1; DPL::ScopedArray buffer(new char[jsSize]); - size_t written = JSStringGetUTF8CString(str, buffer.Get(), jsSize); - if (written > jsSize) { - JSStringRelease(str); - ThrowMsg(ConversionException, - "Conversion could not be fully performed."); - } + JSStringGetUTF8CString(str, buffer.Get(), jsSize); result = buffer.Get(); } JSStringRelease(str); diff --git a/src/CommonsJavaScript/Converter.h b/src/CommonsJavaScript/Converter.h old mode 100755 new mode 100644 index 47e308d..b18635c --- a/src/CommonsJavaScript/Converter.h +++ b/src/CommonsJavaScript/Converter.h @@ -277,6 +277,14 @@ class Converter : private DPL::Noncopyable */ JSValueRef toJSValueRefLong(const long arg); + /** + * Converts unsigned long value to JSValueRef. + * @param arg long long int value to convert. + * @return JSValueRef object. + * @throw ConversionException Thrown when conversion fails. + */ + JSValueRef toJSValueRef(long long int arg); + /** * Converts STL string to JSValueRef. * @param arg STL string to convert. diff --git a/src/CommonsJavaScript/JSCallbackManager.cpp b/src/CommonsJavaScript/JSCallbackManager.cpp index db5dce7..21d278a 100644 --- a/src/CommonsJavaScript/JSCallbackManager.cpp +++ b/src/CommonsJavaScript/JSCallbackManager.cpp @@ -68,6 +68,7 @@ JSCallbackManager::JSCallbackManager(JSContextRef context, JSObjectRef onError) : m_onSuccess(NULL), m_onError(NULL), + m_object(NULL), m_context(context) { LogDebug("entered"); @@ -87,21 +88,27 @@ JSCallbackManager::~JSCallbackManager() if (m_onError) { JSValueUnprotect(m_context, m_onError); } + + if (m_object) { + JSValueUnprotect(m_context, m_object); + } } void JSCallbackManager::setOnSuccess(JSValueRef onSuccess) { LogDebug("entered"); - if (onSuccess) { - if (m_onSuccess != NULL) { - JSValueUnprotect(m_context, m_onSuccess); - } + if (m_onSuccess != NULL) { + JSValueUnprotect(m_context, m_onSuccess); + } + if (onSuccess) { m_onSuccess = JSValueToObject(m_context, onSuccess, NULL); + } else { + m_onSuccess = NULL; + } - if (m_onSuccess != NULL) { - JSValueProtect(m_context, m_onSuccess); - } + if (m_onSuccess != NULL) { + JSValueProtect(m_context, m_onSuccess); } } @@ -114,16 +121,18 @@ JSValueRef JSCallbackManager::getOnSuccess() const void JSCallbackManager::setOnError(JSValueRef onError) { LogDebug("entered"); - if (onError) { - if (m_onError != NULL) { - JSValueUnprotect(m_context, m_onError); - } + if (m_onError != NULL) { + JSValueUnprotect(m_context, m_onError); + } + if (onError) { m_onError = JSValueToObject(m_context, onError, NULL); + } else { + m_onError = NULL; + } - if (m_onError != NULL) { - JSValueProtect(m_context, m_onError); - } + if (m_onError != NULL) { + JSValueProtect(m_context, m_onError); } } @@ -133,6 +142,26 @@ JSValueRef JSCallbackManager::getOnError() const return m_onError; } +void JSCallbackManager::setObject(JSObjectRef object) +{ + LogDebug("entered"); + if (m_object != NULL) { + JSValueUnprotect(m_context, m_object); + } + + m_object = object; + + if (m_object != NULL) { + JSValueProtect(m_context, m_object); + } +} + +JSObjectRef JSCallbackManager::getObject() const +{ + LogDebug("entered"); + return m_object; +} + void JSCallbackManager::setContext(JSContextRef context) { LogDebug("entered"); diff --git a/src/CommonsJavaScript/JSCallbackManager.h b/src/CommonsJavaScript/JSCallbackManager.h index 00e4ab8..9eb7ea5 100644 --- a/src/CommonsJavaScript/JSCallbackManager.h +++ b/src/CommonsJavaScript/JSCallbackManager.h @@ -81,6 +81,8 @@ class JSCallbackManager : public WrtDeviceApis::Commons::IEventPrivateData JSValueRef getOnSuccess() const; void setOnError(JSValueRef onError); JSValueRef getOnError() const; + void setObject(JSObjectRef object); + JSObjectRef getObject() const; void callOnSuccess(); void callOnSuccess(JSValueRef obj); diff --git a/src/CommonsJavaScript/Security/StaticDeclaration.h b/src/CommonsJavaScript/Security/StaticDeclaration.h index 53c04a9..736b14a 100644 --- a/src/CommonsJavaScript/Security/StaticDeclaration.h +++ b/src/CommonsJavaScript/Security/StaticDeclaration.h @@ -20,11 +20,12 @@ #include #include #include +#include #include #include #include #include - +#include namespace WrtDeviceApis { namespace CommonsJavaScript { @@ -207,6 +208,108 @@ class StaticDeclarations : public DPL::Noncopyable } } + static feature_mapping_t* getFeaturesToDevCapMapping() + { + feature_mapping_t* mapping = new feature_mapping_t; + + mapping->featuresCount = m_features.size(); + mapping->features = new feature_devcaps_t[mapping->featuresCount]; + + size_t i = 0; + + FOREACH(featureIt, m_features) + { + mapping->features[i].feature_name = + strndup(featureIt->first.c_str(), featureIt->first.size() + 1); + + mapping->features[i].devCaps.devCapsCount = + featureIt->second.size(); + + mapping->features[i].devCaps.deviceCaps = + new char*[mapping->features[i].devCaps.devCapsCount]; + + for (size_t j = 0; + j < mapping->features[i].devCaps.devCapsCount; + ++j) + { + std::string dc = getDevCapNameById(featureIt->second[j]); + + mapping->features[i].devCaps.deviceCaps[j] = + strndup(dc.c_str(), dc.size() + 1); + } + + ++i; + } + + return mapping; + } + + static const devcaps_t* devcapsGetter(pfeature_mapping_t feats, + const char* featureName) + { + Assert(featureName && "Trying to extract info about NULL api feature"); + + std::string feature(featureName); + + devcaps_t* ret = NULL; + + for (size_t i = 0; i < feats->featuresCount ; ++i) + { + Assert(feats->features && + feats->features[i].feature_name && + "NULL api feature in feature mapping"); + + std::string feat(feats->features[i].feature_name); + + if (feature == feat) + { + ret = &(feats->features[i].devCaps); + break; + } + } + + return ret; + } + + static void featuresDeinitializer(feature_mapping_t* mapping) + { + if (mapping) + { + if (mapping->features) + { + for (size_t i = 0; i < mapping->featuresCount; ++i) + { + free(mapping->features[i].feature_name); + + devcaps_t& dc = mapping->features[i].devCaps; + + if (dc.deviceCaps) + { + for (size_t j = 0; j < dc.devCapsCount; ++j) + { + free(dc.deviceCaps[j]); + } + + delete []dc.deviceCaps; + } + } + delete []mapping->features; + } + delete mapping; + } + } + + static void getMappingInterface(feature_mapping_interface_t *mapping) + { + if (mapping) + { + mapping->featGetter = + StaticDeclarations::getFeaturesToDevCapMapping; + mapping->dcGetter = StaticDeclarations::devcapsGetter; + mapping->release = StaticDeclarations::featuresDeinitializer; + } + } + private: static ParamsMap m_params; static DeviceCapsMaps m_deviceCaps; diff --git a/src/js-overlay/CMakeLists.txt b/src/js-overlay/CMakeLists.txt new file mode 100644 index 0000000..7553aaa --- /dev/null +++ b/src/js-overlay/CMakeLists.txt @@ -0,0 +1,73 @@ +# 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 Yunchan Cho (yunchan.cho@samsung.com) +# @version 1.0 +# +MACRO(INSTALL_HEADER_FILE HEADER_FILE) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_FILE} + DESTINATION ${DESTINATION_HEADERS_JS_OVERLAY}) +ENDMACRO() + +pkg_search_module(webkit2 REQUIRED ewebkit2) +pkg_search_module(plugin-types REQUIRED wrt-plugins-types) + +SET(TARGET_NAME ${TARGET_JS_OVERLAY}) + +SET(SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/js_overlay_support.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/js_function_manager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/js_overlay_addEventListener.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/js_overlay_functions.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/js_iframe_support.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/JSClass/JSStorageEvent.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/JSClass/JSTizenServiceEvent.cpp +) + +INCLUDE_DIRECTORIES( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/JSClass + ${webkit2_INCLUDE_DIRS} + ${plugin-types_INCLUDE_DIRS} +) + +ADD_LIBRARY(${TARGET_NAME} SHARED ${SRCS}) + +TARGET_LINK_LIBRARIES(${TARGET_NAME} + ${webkit2_LIBRARIES} + ${TARGET_COMMONS} + ${TARGET_COMMONS_JAVASCRIPT} + wrt-plugins-tizen-service-event +) + +SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + COMPILE_FLAGS -fPIC + LINK_FLAGS "-Wl,--as-needed -Wl,--hash-style=both" +) + +SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + SOVERSION ${CMAKE_PROJECT_API_VERSION} + VERSION ${CMAKE_PROJECT_VERSION} +) + +INSTALL(TARGETS ${TARGET_NAME} + DESTINATION ${DESTINATION_LIB_PREFIX} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) + +INSTALL_HEADER_FILE(js_overlay_types.h) + diff --git a/src/standards/W3C/Widget/JSStorageEvent.cpp b/src/js-overlay/JSClass/JSStorageEvent.cpp similarity index 99% rename from src/standards/W3C/Widget/JSStorageEvent.cpp rename to src/js-overlay/JSClass/JSStorageEvent.cpp index db0f8d3..09c49ce 100644 --- a/src/standards/W3C/Widget/JSStorageEvent.cpp +++ b/src/js-overlay/JSClass/JSStorageEvent.cpp @@ -26,7 +26,6 @@ #include #include #include -#include "JSPreferences.h" using namespace WrtDeviceApis; using namespace WrtDeviceApis::Commons; diff --git a/src/standards/W3C/Widget/JSStorageEvent.h b/src/js-overlay/JSClass/JSStorageEvent.h similarity index 100% rename from src/standards/W3C/Widget/JSStorageEvent.h rename to src/js-overlay/JSClass/JSStorageEvent.h diff --git a/src/js-overlay/JSClass/JSTizenServiceEvent.cpp b/src/js-overlay/JSClass/JSTizenServiceEvent.cpp new file mode 100644 index 0000000..ac4c5ad --- /dev/null +++ b/src/js-overlay/JSClass/JSTizenServiceEvent.cpp @@ -0,0 +1,193 @@ +/* + * 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 JSTizenServiceEvent.cpp + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + */ + +#include "JSTizenServiceEvent.h" +#include +#include +#include +#include +#include + +using namespace WrtDeviceApis; +using namespace WrtDeviceApis::Commons; +using namespace WrtDeviceApis::CommonsJavaScript; +using namespace WrtDeviceApis::TizenServiceEvent::Api; + +#define WIDGET_PLUGIN_NAME "TizenServiceEvent" + +#define TIZEN_SERVICE_EVENT_PROPERTY_SCALE "scale" +#define TIZEN_SERVICE_EVENT_PROPERTY_BUNDLE "__bundle" + +#define CATCH_EXCEPTION_CONVERSION \ + Catch(Commons::ConversionException) {\ + LogError("Error on conversion");\ + return JSDOMExceptionFactory::\ + UnknownException.make(context, exception);\ + } + +#define CATCH_EXCEPTION_NULL_PTR \ + Catch(Commons::NullPointerException) {\ + LogError("Error on pointer, null value");\ + return JSDOMExceptionFactory::\ + UnknownException.make(context, exception);\ + } + +#define CATCH_EXCEPTION_PLATFORM_ERROR \ + Catch(Commons::PlatformException){\ + LogError("PlatformException occured");\ + return JSDOMExceptionFactory::\ + UnknownException.make(context, exception);\ + } + +#define CATCH_EXCEPTION_SECURITY \ + Catch(Commons::SecurityException){\ + LogError("Security exception occured");\ + return JSDOMExceptionFactory::\ + SecurityException.make(context, exception);\ + } + +namespace WrtPlugins { +namespace Tizen { +JSClassDefinition JSTizenServiceEvent::m_classInfo = { + 0, + kJSClassAttributeNone, + WIDGET_PLUGIN_NAME, + 0, + m_property, + NULL, + initialize, + finalize, + NULL, //HasProperty, + NULL, //GetProperty, + NULL, //SetProperty, + NULL, //DeleteProperty, + NULL, //GetPropertyNames, + NULL, //CallAsFunction, + NULL, //CallAsConstructor, + NULL, //HasInstance, + NULL, //ConvertToType, +}; + +JSStaticValue JSTizenServiceEvent::m_property[] = { + { TIZEN_SERVICE_EVENT_PROPERTY_SCALE, JSTizenServiceEvent::getScale, + 0, kJSPropertyAttributeReadOnly }, + { TIZEN_SERVICE_EVENT_PROPERTY_BUNDLE, JSTizenServiceEvent::getBundle, + 0, kJSPropertyAttributeReadOnly }, + { 0, 0, 0, 0 } +}; + +const JSClassRef JSTizenServiceEvent::getClassRef() +{ + if (!m_jsClassRef) { + m_jsClassRef = JSClassCreate(&m_classInfo); + } + return m_jsClassRef; +} + +const JSClassDefinition* JSTizenServiceEvent::getClassInfo() +{ + return &m_classInfo; +} + +JSClassRef JSTizenServiceEvent::m_jsClassRef = JSClassCreate(JSTizenServiceEvent::getClassInfo()); + +void JSTizenServiceEvent::initialize(JSContextRef context, + JSObjectRef object) +{ + LogDebug("entered"); + + JSTizenServiceEventPrivateObject* priv = + static_cast(JSObjectGetPrivate(object)); + + Assert(priv && "Missing private object"); +} + +void JSTizenServiceEvent::finalize(JSObjectRef object) +{ + LogDebug("entered"); + JSTizenServiceEventPrivateObject* priv = + static_cast(JSObjectGetPrivate(object)); + + delete priv; + LogDebug("private object is realised"); + +} + +JSValueRef JSTizenServiceEvent::getScale( + JSContextRef context, + JSObjectRef object, + JSStringRef propertyName, + JSValueRef* exception) +{ + LogDebug("entered"); + + Try + { + Converter converter(context); + return converter.toJSValueRef(getPrivateObject(object)->getScale()); + } + CATCH_EXCEPTION_CONVERSION + CATCH_EXCEPTION_NULL_PTR + CATCH_EXCEPTION_PLATFORM_ERROR + CATCH_EXCEPTION_SECURITY +} + +JSValueRef JSTizenServiceEvent::getBundle( + JSContextRef context, + JSObjectRef object, + JSStringRef propertyName, + JSValueRef* exception) +{ + LogDebug("entered"); + + Try + { + Converter converter(context); + return converter.toJSValueRef(getPrivateObject(object)->getBundle()); + } + CATCH_EXCEPTION_CONVERSION + CATCH_EXCEPTION_NULL_PTR + CATCH_EXCEPTION_PLATFORM_ERROR + CATCH_EXCEPTION_SECURITY +} + +ITizenServiceEventPtr JSTizenServiceEvent::getPrivateObject(JSObjectRef arg) +{ + JSTizenServiceEventPrivateObject* priv = + static_cast(JSObjectGetPrivate(arg)); + + if (!priv) { + LogError("Private object not initialized"); + ThrowMsg(Commons::NullPointerException, + "Private object not initialized"); + } + + return priv->getObject(); +} + +#undef CATCH_EXCEPTION_CONVERSION +#undef CATCH_EXCEPTION_NULL_PTR +#undef CATCH_EXCEPTION_PLATFORM_ERROR +#undef CATCH_EXCEPTION_SECURITY + +} +} diff --git a/src/js-overlay/JSClass/JSTizenServiceEvent.h b/src/js-overlay/JSClass/JSTizenServiceEvent.h new file mode 100644 index 0000000..cb7fbb3 --- /dev/null +++ b/src/js-overlay/JSClass/JSTizenServiceEvent.h @@ -0,0 +1,94 @@ +/* + * 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 JSTizenServiceEvent.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief + */ + +#ifndef _WRT_PLUGIN_JS_TIZEN_SERVICE_EVENT_H_ +#define _WRT_PLUGIN_JS_TIZEN_SERVICE_EVENT_H_ + +#include +#include +#include + +namespace WrtPlugins { +namespace Tizen { + +typedef WrtDeviceApis::CommonsJavaScript::PrivateObjectT< + WrtDeviceApis::TizenServiceEvent::Api::ITizenServiceEventPtr>::Type + JSTizenServiceEventPrivateObject; + +class JSTizenServiceEvent +{ + public: + /** + * This method initializes this in the JS Engine. + */ + static const JSClassRef getClassRef(); + + /** + * Gets object's class description. + */ + static const JSClassDefinition* getClassInfo(); + + private: + /** + * The callback invoked when an object is first created. + */ + static void initialize(JSContextRef context, + JSObjectRef object); + + /** + * The callback invoked when an object is finalized. + */ + static void finalize(JSObjectRef object); + + /** + * This structure describes a statically declared value property. + */ + static JSStaticValue m_property[]; + + /** + * This structure contains properties and callbacks that define a type of object. + */ + static JSClassDefinition m_classInfo; + + static JSClassRef m_jsClassRef; + + // getters for properties + static JSValueRef getScale( + JSContextRef context, + JSObjectRef object, + JSStringRef propertyName, + JSValueRef* exception); + + static JSValueRef getBundle( + JSContextRef context, + JSObjectRef object, + JSStringRef propertyName, + JSValueRef* exception); + + static WrtDeviceApis::TizenServiceEvent::Api::ITizenServiceEventPtr + getPrivateObject(JSObjectRef arg); +}; +} // Tizen +} // WrtPlugins + +#endif // _WRT_PLUGIN_JS_TIZEN_SERVICE_EVENT_H_ diff --git a/src/js-overlay/js_function_manager.cpp b/src/js-overlay/js_function_manager.cpp new file mode 100644 index 0000000..d1be598 --- /dev/null +++ b/src/js-overlay/js_function_manager.cpp @@ -0,0 +1,138 @@ +/* + * 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 js_function_manager.cpp + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @author Yunchan Cho (yunchan.cho@samgsung.com) + * @version + * @brief + */ + +#include +#include +#include +#include +#include +#include + +using namespace WrtPlugins::W3C; + +IMPLEMENT_SAFE_SINGLETON(JsFunctionManager) + +namespace { +const char* JSPRINT_NAME = "jsPrint"; +const char* JSGLOBAL_OBJECT = "GLOBAL_OBJECT"; +const char* JSHOOK_NAME = "jsHook"; +const char* ADD_EVENT_LISTENER_NAME = "addEventListener"; +} + +namespace JavaScriptFunctions +{ +//options + class_definition_options_t jsHookfunctionsOptions = + { + JS_FUNCTION, + CREATE_INSTANCE, + NONE_NOTICE, + USE_OVERLAYED, //ignored + NULL, + NULL, + reinterpret_cast(JSCFunctions::JavaScriptHookProc) + }; + + class_definition_options_t jsPrintfunctionsOptions = + { + JS_FUNCTION, + CREATE_INSTANCE, + NONE_NOTICE, + USE_OVERLAYED, //ignored + NULL, + NULL, + reinterpret_cast(JSCFunctions::JavaScriptPrintProc) + }; + + class_definition_options_t addEventListenerOptions = + { + JS_FUNCTION, + CREATE_INSTANCE, + ALWAYS_NOTICE, + OVERLAYED_BEFORE_ORIGINAL, + IFrameSupport::RegisterAddEventListener, + NULL, + reinterpret_cast(AddEventListenerSupport::AddEventListener) + }; + + js_entity_definition_t jsPrint = + { + JSGLOBAL_OBJECT, + JSPRINT_NAME, + "", + NULL, + NULL, + &jsPrintfunctionsOptions + }; + + js_entity_definition_t jsHook = + { + JSGLOBAL_OBJECT, + JSHOOK_NAME, + "", + NULL, + NULL, + &jsHookfunctionsOptions + }; + + js_entity_definition_t addEventListener = + { + JSGLOBAL_OBJECT, + ADD_EVENT_LISTENER_NAME, + "", + NULL, + NULL, + &addEventListenerOptions + }; + const js_entity_definition_ptr_t jsPrintPtr = &jsPrint; + const js_entity_definition_ptr_t jsHookPtr = &jsHook; + const js_entity_definition_ptr_t addEventListenerPtr = &addEventListener; +} + + +bool JsFunctionManager::initialize() +{ + LogInfo("JSObjectDeclaration for js functions are intialized"); + JSObjectDeclarationPtr jsPrintObj( + new JSObjectDeclaration(JavaScriptFunctions::jsPrintPtr)); + + JSObjectDeclarationPtr jsHookObj( + new JSObjectDeclaration(JavaScriptFunctions::jsHookPtr)); + + JSObjectDeclarationPtr addEventListenerObj( + new JSObjectDeclaration(JavaScriptFunctions::addEventListenerPtr)); + + m_functions.push_back(jsPrintObj); + m_functions.push_back(jsHookObj); + m_functions.push_back(addEventListenerObj); + + return true; +} + +JsFunctionManager::Functions JsFunctionManager::getFunctions() +{ + LogInfo("get standard js fucntions"); + static bool initialized = initialize(); + (void) initialized; + return m_functions; +} diff --git a/src/js-overlay/js_function_manager.h b/src/js-overlay/js_function_manager.h new file mode 100644 index 0000000..d6bd80e --- /dev/null +++ b/src/js-overlay/js_function_manager.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 js_function_manager.h + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ + +#ifndef WRT_SRC_PLUGIN_SERVICE_JS_FUNCTION_MANGER_H_ +#define WRT_SRC_PLUGIN_SERVICE_JS_FUNCTION_MANGER_H_ + +#include +#include +#include + +#include + +class JsFunctionManager : private DPL::Noncopyable +{ + public: + typedef std::list Functions; + + public: + Functions getFunctions(); + + private: + JsFunctionManager() + {} + + bool initialize(); + + private: + Functions m_functions; + + friend class DPL::Singleton; +}; + +typedef DPL::Singleton JsFunctionManagerSingleton; + +#endif + diff --git a/src/standards/W3C/Widget/IFrameSupport.cpp b/src/js-overlay/js_iframe_support.cpp similarity index 98% rename from src/standards/W3C/Widget/IFrameSupport.cpp rename to src/js-overlay/js_iframe_support.cpp index 45c4d41..782fc0e 100644 --- a/src/standards/W3C/Widget/IFrameSupport.cpp +++ b/src/js-overlay/js_iframe_support.cpp @@ -21,10 +21,10 @@ * @brief */ -#include "IFrameSupport.h" #include #include #include +#include namespace WrtPlugins { namespace W3C { diff --git a/src/standards/W3C/Widget/IFrameSupport.h b/src/js-overlay/js_iframe_support.h similarity index 100% rename from src/standards/W3C/Widget/IFrameSupport.h rename to src/js-overlay/js_iframe_support.h diff --git a/src/standards/W3C/Widget/AddEventListenerSupport.cpp b/src/js-overlay/js_overlay_addEventListener.cpp similarity index 59% rename from src/standards/W3C/Widget/AddEventListenerSupport.cpp rename to src/js-overlay/js_overlay_addEventListener.cpp index 0f57035..8ec4ae6 100644 --- a/src/standards/W3C/Widget/AddEventListenerSupport.cpp +++ b/src/js-overlay/js_overlay_addEventListener.cpp @@ -17,17 +17,20 @@ * * @file AddEventListenerSupport.cpp * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @author Yunchan Cho (yunchan.cho@samsung.com) * @version 0.1 * @brief */ -#include "AddEventListenerSupport.h" #include #include #include #include +#include +#include #include "JSStorageEvent.h" +#include "JSTizenServiceEvent.h" namespace WrtPlugins { namespace W3C { @@ -38,12 +41,25 @@ AddEventListenerSupport::IFramesListeners JSContextRef AddEventListenerSupport::m_context = NULL; -void AddEventListenerSupport::initializeContext(JSContextRef context) +void AddEventListenerSupport::initialize(JSContextRef context) { if(!m_context) m_context = context; } -bool AddEventListenerSupport::isInitialized() {return m_context!=NULL;} +void AddEventListenerSupport::deinitialize() +{ + if(!m_context) { + LogDebug("Not yet initialized"); + } + + m_listeners.clear(); + m_context = NULL; +} + +bool AddEventListenerSupport::isInitialized() +{ + return m_context!=NULL; +} JSValueRef AddEventListenerSupport:: AddEventListener(JSContextRef context, @@ -64,8 +80,10 @@ AddEventListener(JSContextRef context, std::string eventName = WrtDeviceApis::CommonsJavaScript:: Converter(context).toString(arguments[0]); + LogDebug("Event name: " << eventName); - if(eventName != "storage"){ + if(eventName != "storage" && + eventName != "appservice"){ LogDebug("Event type not supported"); return JSValueMakeUndefined(context); } @@ -81,17 +99,32 @@ AddEventListener(JSContextRef context, return JSValueMakeUndefined(context); } //add object to Listeners - CallbackData data = {objectCb, thisObject}; - getIFrameListeners(thisObject)->push_back(data); + + //set event information according to each event type + if(eventName == "storage") { + CallbackData data = { + StorageCustomEvent, + objectCb, + thisObject}; + getIFrameListeners(thisObject)->push_back(data); + } else if (eventName == "appservice") { + CallbackData data = { + ServiceCustomEvent, + objectCb, + thisObject}; + getIFrameListeners(thisObject)->push_back(data); + } return JSValueMakeUndefined(context); } -void AddEventListenerSupport::CallListenersFromDifferentIFrames( +void AddEventListenerSupport:: +CallStorageListenersFromDifferentIFrames( JSObjectRef iframe, const WrtDeviceApis::StorageEvent::Api::IStorageEventPtr& event) { LogDebug("Invoked callbacks"); + LogInfo("Context: " << m_context); FOREACH(it, m_listeners) { @@ -113,18 +146,63 @@ void AddEventListenerSupport::CallListenersFromDifferentIFrames( { LogDebug("Call"); + if (listener->eventType == + StorageCustomEvent) + { + JSObjectCallAsFunction( + m_context, + listener->object, + NULL, + argc, + argv, + NULL); + } + } + + JSValueUnprotect(m_context, eventObject); + } + + LogDebug("Done"); +}; + +void AddEventListenerSupport:: +CallServiceListenersFromIFrame(JSObjectRef iframe, + const WrtDeviceApis::TizenServiceEvent::Api::ITizenServiceEventPtr& event) +{ + using namespace WrtPlugins::Tizen; + LogDebug("Invoked callbacks"); + + IFramesListeners::iterator it = m_listeners.find(iframe); + if (it == m_listeners.end()) { + LogDebug("This frame object not existed"); + return; + } + + auto eventPriv = + new JSTizenServiceEventPrivateObject(m_context, event); + + JSObjectRef eventObject = + JSObjectMake(m_context, JSTizenServiceEvent::getClassRef(), eventPriv); + const size_t argc = 1; + JSValueRef argv[argc] = {eventObject}; + + JSValueProtect(m_context, eventObject); + FOREACH(listener, *it->second) + { + if (listener->eventType == + ServiceCustomEvent) + { + LogDebug("Call"); JSObjectCallAsFunction( m_context, listener->object, - NULL, + iframe, argc, argv, NULL); } - - JSValueUnprotect(m_context, eventObject); } - + JSValueUnprotect(m_context, eventObject); LogDebug("Done"); }; diff --git a/src/standards/W3C/Widget/AddEventListenerSupport.h b/src/js-overlay/js_overlay_addEventListener.h similarity index 80% rename from src/standards/W3C/Widget/AddEventListenerSupport.h rename to src/js-overlay/js_overlay_addEventListener.h index 44f39cd..dbdd1fb 100644 --- a/src/standards/W3C/Widget/AddEventListenerSupport.h +++ b/src/js-overlay/js_overlay_addEventListener.h @@ -15,8 +15,9 @@ */ /** * - * @file AddEventListenerSupport.h + * @file js_overlay_addEventListener.h * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @author Yunchan Cho (yunchan.cho@samsung.com) * @version 0.1 * @brief */ @@ -29,6 +30,8 @@ #include #include #include +#include +#include namespace WrtPlugins { namespace W3C { @@ -36,7 +39,8 @@ namespace W3C { class AddEventListenerSupport { public: - static void initializeContext(JSContextRef context); + static void initialize(JSContextRef context); + static void deinitialize(); static bool isInitialized(); @@ -47,12 +51,18 @@ class AddEventListenerSupport const JSValueRef arguments[], JSValueRef* exception); - static void CallListenersFromDifferentIFrames( + static void CallStorageListenersFromDifferentIFrames( JSObjectRef iframe, const WrtDeviceApis::StorageEvent::Api::IStorageEventPtr& event); + static void CallServiceListenersFromIFrame( + JSObjectRef iframe, + const WrtDeviceApis::TizenServiceEvent::Api::ITizenServiceEventPtr& event); + private: + struct CallbackData{ + CustomEventType eventType; JSObjectRef object; JSObjectRef thisObject; }; diff --git a/src/js-overlay/js_overlay_functions.cpp b/src/js-overlay/js_overlay_functions.cpp new file mode 100644 index 0000000..69b1263 --- /dev/null +++ b/src/js-overlay/js_overlay_functions.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 javascript_functions.cpp + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ + +#include +#include +#include + +namespace JSCFunctions { + +std::string ConvertJSStringToStdString(JSStringRef value) +{ + int nSize = JSStringGetLength(value) + 1; + DPL::ScopedArray textStr(new char[nSize]); + JSStringGetUTF8CString(value, textStr.Get(), nSize); + std::string ret = textStr.Get(); + return ret; +} + +JSValueRef JavaScriptPrintProc(JSContextRef context, + JSObjectRef /*object*/, + JSObjectRef /*thisObject*/, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception) +{ + if (argumentCount == 0 || !JSValueIsString(context, arguments[0])) { + LogError("Argument is not string"); + return JSValueMakeUndefined(context); + } + + JSStringRef textRef = JSValueToStringCopy(context, arguments[0], exception); + int nSize = JSStringGetLength(textRef) + 1; + + DPL::ScopedArray textStr(new char[nSize]); + + JSStringGetUTF8CString(textRef, textStr.Get(), nSize); + LogDebug("\033[00;35m[jsPrint] " << textStr.Get()); + + JSStringRelease(textRef); + return JSValueMakeBoolean(context, true); +} + +JSValueRef JavaScriptHookProc( + JSContextRef context, + JSObjectRef /*object*/, + JSObjectRef /*thisObject*/, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception) +{ + bool inError = false; + if (argumentCount < 2 || + argumentCount > 3 || + !JSValueIsString(context, arguments[0]) || + !JSValueIsString(context, arguments[1])) { + + inError = true; + } + + if (inError) { + LogError("*********************************************"); + LogError("*********************************************"); + LogError("Cannot print test Result"); + LogError("*********************************************"); + LogError("*********************************************"); + return JSValueMakeUndefined(context); + } + + std::string id, result, message; + JSStringRef idRef = JSValueToStringCopy(context, arguments[0], exception); + id = ConvertJSStringToStdString(idRef); + JSStringRelease(idRef); + JSStringRef idResult = JSValueToStringCopy(context, + arguments[1], + exception); + result = ConvertJSStringToStdString(idResult); + JSStringRelease(idResult); + + if (argumentCount == 3 && !JSValueIsString(context, arguments[2])) { + JSStringRef idMessage = JSValueToStringCopy(context, + arguments[0], + exception); + message = ConvertJSStringToStdString(idMessage); + JSStringRelease(idMessage); + } + + LogDebug("\033[00;35m***********************************************"); + LogDebug("\033[00;35m***********************************************"); + LogDebug("\033[00;35m TEST ID: " << id); + LogDebug("\033[00;35m RESULT: " << result); + LogDebug("\033[00;35m MESSAGE: " << message); + LogDebug("\033[00;35m***********************************************"); + LogDebug("\033[00;35m***********************************************"); + + return JSValueMakeBoolean(context, true); +} +} diff --git a/src/js-overlay/js_overlay_functions.h b/src/js-overlay/js_overlay_functions.h new file mode 100644 index 0000000..7dbad59 --- /dev/null +++ b/src/js-overlay/js_overlay_functions.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 javascript_functions.h + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ + +#ifndef WRT_SRC_PLUGIN_SERVICE_EFL_JAVASCRIPT_FUNCTIONS_H_ +#define WRT_SRC_PLUGIN_SERVICE_EFL_JAVASCRIPT_FUNCTIONS_H_ + +#include + +namespace JSCFunctions { +JSValueRef JavaScriptPrintProc( + JSContextRef context, + JSObjectRef /*object*/, + JSObjectRef /*thisObject*/, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef * exception); +JSValueRef JavaScriptHookProc( + JSContextRef context, + JSObjectRef /*object*/, + JSObjectRef /*thisObject*/, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception); +} + +#endif + diff --git a/src/js-overlay/js_overlay_support.cpp b/src/js-overlay/js_overlay_support.cpp new file mode 100644 index 0000000..7e2ca84 --- /dev/null +++ b/src/js-overlay/js_overlay_support.cpp @@ -0,0 +1,203 @@ +/* + * 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 js_overlay_support.cpp + * @author + * @version 1.0 + * @brief + */ +#include +#include +#include +#include + +#include + +namespace JSOverlaySupport +{ + +class JSFunctionDispatcher +{ + public: + struct PrivateData + { + //required to unprotect object in destructor; + JSContextRef context; + JSObjectPtr originalFunction; + JSObjectPtr overlayFunction; + }; + + static JSClassRef getClassRef(); + + private: + static JSClassDefinition m_classInfo; + + private: + static void initialize(JSContextRef context, JSObjectRef object); + + static void finalize(JSObjectRef object); + + static JSValueRef callAsFunction(JSContextRef ctx, + JSObjectRef function, + JSObjectRef thisObject, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception); +}; + + + +JSObjectPtr createWrappedFunction( + JSGlobalContextRef ctx, + const JSObjectPtr& originalFunction, + const JSObjectPtr& overlayFunction, + const std::string& name) +{ + LogDebug("Creation overlay for function: " << name); + JSStringRef name_js = JSStringCreateWithUTF8CString(name.c_str()); + + JSFunctionDispatcher::PrivateData* priv = + new JSFunctionDispatcher::PrivateData; + priv->context = ctx; + priv->overlayFunction = overlayFunction; + priv->originalFunction = originalFunction; + + auto fun = JSObjectMake(ctx, JSFunctionDispatcher::getClassRef(), priv); + + JSStringRelease(name_js); + + LogDebug("JSValueProtect invoked for: " + << overlayFunction->getObject() << " " + << originalFunction->getObject() << " Wrapper:" + << fun); + + //the value is unprotected in finalize of the JSFunctionDispatcher object + JSValueProtect(ctx, + static_cast( + overlayFunction->getObject())); + + return JSObjectPtr(new JSObject(fun)); +} + + + +JSClassDefinition JSFunctionDispatcher::m_classInfo = { + 0, + kJSClassAttributeNone, + "IGNORED", + 0, + 0, + 0, + initialize, + finalize, + NULL, + NULL, + NULL, + NULL, + NULL, + callAsFunction, + NULL, + NULL, + NULL +}; + +JSClassRef JSFunctionDispatcher::getClassRef() +{ + static auto classRef = JSClassCreate(&m_classInfo); + return classRef; +} + + +void JSFunctionDispatcher::initialize(JSContextRef /*context*/, + JSObjectRef /*object*/) +{ + LogDebug("Initialize"); +} + +void JSFunctionDispatcher::finalize(JSObjectRef object) +{ + LogDebug("finalize"); + + PrivateData* priv = static_cast (JSObjectGetPrivate(object)); + if(priv) + { + JSValueUnprotect(priv->context, + static_cast( + priv->overlayFunction->getObject())); + delete priv; + } +} + + + +JSValueRef JSFunctionDispatcher::callAsFunction( + JSContextRef context, + JSObjectRef object, + JSObjectRef thisObject, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception) +{ + LogDebug("Dispatcher invoked"); + + JSValueRef result = JSValueMakeUndefined(context); + + JSFunctionDispatcher::PrivateData* priv = + static_cast + (JSObjectGetPrivate(object)); + + if(!priv) + { + LogError("Private object is NULL"); + return result; + } + + //call overlayed function + if (priv->overlayFunction->getObject()) + { + LogDebug("Overlayed function will be invoked..."); + result = JSObjectCallAsFunction( + context, + static_cast( + priv->overlayFunction->getObject()), + thisObject, + argumentCount, + arguments, + exception); + } + + //call original function + if (priv->originalFunction->getObject()) + { + LogDebug("Original function will be invoked.."); + result = JSObjectCallAsFunction( + context, + static_cast( + priv->originalFunction->getObject()), + thisObject, + argumentCount, + arguments, + exception); + } + + LogDebug("Done"); + return result; +} + + + + +} diff --git a/src/js-overlay/js_overlay_support.h b/src/js-overlay/js_overlay_support.h new file mode 100644 index 0000000..3d7cd04 --- /dev/null +++ b/src/js-overlay/js_overlay_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 js_function_wrapper.h + * @author + * @version 1.0 + * @brief + */ + +#ifndef _JAVASCRIPT_OVERLAY_SUPPORT_H +#define _JAVASCRIPT_OVERLAY_SUPPORT_H + +#include +#include +#include +#include +#include + +namespace JSOverlaySupport +{ +JSObjectPtr createWrappedFunction( + JSGlobalContextRef ctx, + const JSObjectPtr& originalFunction, + const JSObjectPtr& overlayFunction, + const std::string& name); +} + +#endif diff --git a/src/js-overlay/js_overlay_types.h b/src/js-overlay/js_overlay_types.h new file mode 100644 index 0000000..199a2b5 --- /dev/null +++ b/src/js-overlay/js_overlay_types.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file js_overlay_types.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief + */ + +#ifndef _WRT_PLUGINS_JS_OVERLAY_TYPES_H_ +#define _WRT_PLUGINS_JS_OVERLAY_TYPES_H_ + +namespace WrtPlugins { +namespace W3C { + +enum CustomEventType { + StorageCustomEvent, + ServiceCustomEvent, +}; + +} // W3C +} // WrtPlugins +#endif // _WRT_PLUGINS_JS_OVERLAY_TYPES_H_ diff --git a/src/modules/API/CMakeLists.txt b/src/modules/API/CMakeLists.txt index b9e2f69..f93e3d7 100644 --- a/src/modules/API/CMakeLists.txt +++ b/src/modules/API/CMakeLists.txt @@ -18,6 +18,7 @@ include_config_file(Cpu) include_config_file(Widget) include_config_file(LocalStorage) include_config_file(StorageEvent) +include_config_file(TizenServiceEvent) include_config_file(WidgetDB) include_config_file(PluginManager) #DEPRACATED modules diff --git a/src/modules/API/LocalStorage/ILocalStorage.h b/src/modules/API/LocalStorage/ILocalStorage.h index 80fb5f5..d1a4db7 100644 --- a/src/modules/API/LocalStorage/ILocalStorage.h +++ b/src/modules/API/LocalStorage/ILocalStorage.h @@ -73,9 +73,9 @@ class ILocalStorage virtual size_t getStorageSize() const = 0; /** - * Get value for key + * Get key name for index */ - virtual std::string getValueByIndex(size_t index) const = 0; + virtual std::string getKeyByIndex(size_t index) const = 0; /** * virtual destructor diff --git a/src/modules/API/TizenServiceEvent/ITizenServiceEvent.h b/src/modules/API/TizenServiceEvent/ITizenServiceEvent.h new file mode 100644 index 0000000..6a6831d --- /dev/null +++ b/src/modules/API/TizenServiceEvent/ITizenServiceEvent.h @@ -0,0 +1,51 @@ +/* + * 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 ITizenServiceEvent.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief Tizen Service event interfece + */ + +#ifndef _WRT_PLUGIN_TIZEN_SERVICE_EVENT_INTERFACE_H_ +#define _WRT_PLUGIN_TIZEN_SERVICE_EVENT_INTERFACE_H_ + +#include +#include + +namespace WrtDeviceApis { +namespace TizenServiceEvent { +namespace Api { + +class ITizenServiceEvent +{ + public : + virtual float getScale() const = 0; + virtual std::string getBundle() const = 0; + + virtual void setScale(const float scale) = 0; + virtual void setBundle(const std::string &bundle) = 0; + virtual ~ITizenServiceEvent() {}; +}; + +typedef DPL::SharedPtr ITizenServiceEventPtr; + +} // Api +} // TizenServiceEvent +} // WrtDeviceApis + +#endif // _WRT_PLUGIN_TIZEN_SERVICE_EVENT_INTERFACE_H_ diff --git a/src/modules/tizen/Filesystem/CopyCommand.h b/src/modules/API/TizenServiceEvent/TizenServiceEvent.cpp similarity index 50% rename from src/modules/tizen/Filesystem/CopyCommand.h rename to src/modules/API/TizenServiceEvent/TizenServiceEvent.cpp index b676718..ba07076 100644 --- a/src/modules/tizen/Filesystem/CopyCommand.h +++ b/src/modules/API/TizenServiceEvent/TizenServiceEvent.cpp @@ -14,37 +14,47 @@ * limitations under the License. */ /** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * + * @file TizenServiceEvent.cpp + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief Tizen appservice event class implementation */ -#ifndef WRTDEVICEAPIS_FILESYSTEM_COPYCOMMAND_H_ -#define WRTDEVICEAPIS_FILESYSTEM_COPYCOMMAND_H_ - -#include "Command.h" -#include +#include "TizenServiceEvent.h" namespace WrtDeviceApis { -namespace Filesystem { +namespace TizenServiceEvent { +namespace Api { + +TizenServiceEvent::TizenServiceEvent() +{ +} -class CopyCommand : public Command +TizenServiceEvent::~TizenServiceEvent() { - public: - CopyCommand(const Api::IPathPtr& src, - const Api::IPathPtr& dest); - void setRecursive(bool recursive); - void setForce(bool force); - - protected: - std::string prepare(); - - private: - Api::IPathPtr m_src; - Api::IPathPtr m_dest; - bool m_recursive; - bool m_force; -}; +} +float TizenServiceEvent::getScale() const +{ + return m_scale; } + +std::string TizenServiceEvent::getBundle() const +{ + return m_bundle; +} + +void TizenServiceEvent::setScale(const float scale) +{ + m_scale = scale; +} + +void TizenServiceEvent::setBundle(const std::string& bundle) +{ + m_bundle = bundle; } -#endif // WRTDEVICEAPIS_FILESYSTEM_COPYCOMMAND_H_ +} // Api +} // TizenServiceEvent +} // WrtDeviceApis diff --git a/src/modules/API/TizenServiceEvent/TizenServiceEvent.h b/src/modules/API/TizenServiceEvent/TizenServiceEvent.h new file mode 100644 index 0000000..3bceb3b --- /dev/null +++ b/src/modules/API/TizenServiceEvent/TizenServiceEvent.h @@ -0,0 +1,56 @@ +/* + * 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 TizenServiceEvent.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 0.1 + * @brief Tizen Service event class + */ + +#ifndef _WRT_PLUGIN_TIZEN_SERVICE_EVENT_CLASS_H_ +#define _WRT_PLUGIN_TIZEN_SERVICE_EVENT_CLASS_H_ + +#include +#include "ITizenServiceEvent.h" + +namespace WrtDeviceApis { +namespace TizenServiceEvent { +namespace Api { + +class TizenServiceEvent : public ITizenServiceEvent +{ + public : + + TizenServiceEvent(); + ~TizenServiceEvent(); + + float getScale() const; + std::string getBundle() const; + + void setScale(const float scale); + void setBundle(const std::string &bundle); + + private : + float m_scale; + std::string m_bundle; +}; + +} // Api +} // TizenServiceEvent +} // WrtDeviceApis + +#endif // _WRT_PLUGIN_TIZEN_SERVICE_EVENT_CLASS_H_ diff --git a/src/modules/API/TizenServiceEvent/config.cmake b/src/modules/API/TizenServiceEvent/config.cmake new file mode 100644 index 0000000..5a64dcd --- /dev/null +++ b/src/modules/API/TizenServiceEvent/config.cmake @@ -0,0 +1,11 @@ +get_current_path() + +set(API_TIZEN_SERVICE_EVENT_PATH + ${CURRENT_PATH} + PARENT_SCOPE + ) + +set(SRCS_API_TIZEN_SERVICE_EVENT + ${CURRENT_PATH}/TizenServiceEvent.cpp + PARENT_SCOPE +) diff --git a/src/modules/API/WidgetDB/IWidgetFeature.h b/src/modules/API/WidgetDB/IWidgetFeature.h index 97a90ca..7ee91eb 100644 --- a/src/modules/API/WidgetDB/IWidgetFeature.h +++ b/src/modules/API/WidgetDB/IWidgetFeature.h @@ -22,7 +22,7 @@ #ifndef WRT_PLUGINS_WRT_ENGINE_WIDGET_FEATURE_INTERFACE_H_ #define WRT_PLUGINS_WRT_ENGINE_WIDGET_FEATURE_INTERFACE_H_ -#include +#include #include #include @@ -33,7 +33,8 @@ namespace Api { class IWidgetFeature { public: - typedef std::map Params; + typedef std::pair Param; + typedef std::list Params; typedef Params::const_iterator ParamsIterator; public: diff --git a/src/modules/packages/CMakeLists.txt b/src/modules/packages/CMakeLists.txt index d0e7100..0f387c2 100644 --- a/src/modules/packages/CMakeLists.txt +++ b/src/modules/packages/CMakeLists.txt @@ -32,6 +32,7 @@ set(TARGET_MODULE_SYSTEMINFO "wrt-plugins-systeminfo") set(TARGET_MODULE_LOCALSTORAGE "wrt-plugins-localstorage") set(TARGET_MODULE_WIDGET_INTERFACE_DAO "wrt-plugins-widget-interface-dao") set(TARGET_MODULE_STORAGEEVENT "wrt-plugins-storageevent") +set(TARGET_MODULE_TIZEN_SERVICE_EVENT "wrt-plugins-tizen-service-event") set(TARGET_MODULE_WIDGETDB "wrt-plugins-widgetdb") set(TARGET_MODULE_PLUGIN_MANAGER "wrt-plugins-plugin-manager") @@ -42,5 +43,6 @@ add_subdirectory(Widget) add_subdirectory(LocalStorage) add_subdirectory(WidgetInterfaceDAO) add_subdirectory(StorageEvent) +add_subdirectory(TizenServiceEvent) add_subdirectory(WidgetDB) add_subdirectory(PluginManager) diff --git a/src/modules/packages/PluginManager/CMakeLists.txt b/src/modules/packages/PluginManager/CMakeLists.txt index 696216b..a66bbfd 100644 --- a/src/modules/packages/PluginManager/CMakeLists.txt +++ b/src/modules/packages/PluginManager/CMakeLists.txt @@ -25,8 +25,11 @@ endmacro() set(TARGET_NAME ${TARGET_MODULE_PLUGIN_MANAGER}) +pkg_search_module(webkit2 REQUIRED ewebkit2) + include_directories( ${INCLUDES_PLATFORM_IMPLEMENTATION_PLUGIN_MANAGER} + ${webkit2_INCLUDE_DIRS}} ) set(SRCS @@ -37,12 +40,13 @@ set(SRCS add_library(${TARGET_NAME} SHARED ${SRCS}) target_link_libraries(${TARGET_NAME} ${LIBS_COMMONS} + ${TARGET_PLUGIN_LOADING_LIB} ${TARGET_COMMONS} ${TARGET_COMMONS_JAVASCRIPT} ${LIBS_PLATFORM_IMPLEMENTATION_PLUGIN_MANAGER} ) -set_target_properties(${TARGET_NAME} PROPERTIES +set_target_properties(${TARGET_NAME} PROPERTIES SOVERSION ${CMAKE_PROJECT_API_VERSION} VERSION ${CMAKE_PROJECT_VERSION} ) diff --git a/src/modules/packages/TizenServiceEvent/CMakeLists.txt b/src/modules/packages/TizenServiceEvent/CMakeLists.txt new file mode 100644 index 0000000..e8efc16 --- /dev/null +++ b/src/modules/packages/TizenServiceEvent/CMakeLists.txt @@ -0,0 +1,26 @@ +# 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 Yunchan Cho (yunchan.cho@samsung.com) +# @version 0.1 + +set(TARGET_NAME ${TARGET_MODULE_TIZEN_SERVICE_EVENT}) + +set(SRCS + ${SRCS_API_TIZEN_SERVICE_EVENT} +) + +add_library(${TARGET_NAME} STATIC ${SRCS}) diff --git a/src/modules/tizen/DEPRACATED/AppLauncher/AppLauncherManager.cpp b/src/modules/tizen/DEPRACATED/AppLauncher/AppLauncherManager.cpp new file mode 100644 index 0000000..f4ec621 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/AppLauncher/AppLauncherManager.cpp @@ -0,0 +1,836 @@ +/* + * 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 AppLauncherManager.cpp + * @author Lukasz Marek (l.marek@samsung.com) + * @author Yujie Zeng (yj.zeng@samsung.com) + * @version 0.1 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "AppLauncherManager.h" + +using namespace WrtPlugins::Api; +using namespace WrtPlugins::Api::AppLauncher; + +namespace { +const char* EMPTY_STRING_PATTERN = "^\\s*$"; +const char* EMAIL_PATTERN = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+$"; +//According to RFC1738,any character is possible in http address +const char* HTTP_ADDRESS_PATTERN = "^(http(s)?://)?\\w+.*$"; +const char* FILE_ADDRESS_PATTERN = "^.*\\..*$"; + +const char* APPLICATION_ALARM = "org.tizen.clock"; // alarm has been included in clock app +const char* APPLICATION_BROWSER = "org.tizen.browser"; +const char* APPLICATION_CALCULATOR = "org.tizen.calculator"; +const char* APPLICATION_CALENDAR = "org.tizen.efl-calendar"; +const char* APPLICATION_CAMERA = "org.tizen.camera-app"; +const char* APPLICATION_CONTACTS = "org.tizen.contacts"; +const char* APPLICATION_FILES = "org.tizen.myfile"; +const char* APPLICATION_GAMES = ""; +const char* APPLICATION_MAIL = "org.tizen.email"; +const char* APPLICATION_MEDIAPLAYER = "org.tizen.music-player"; +const char* APPLICATION_MESSAGING = "org.tizen.message"; +const char* APPLICATION_PHONECALL = "org.tizen.dialer"; +const char* APPLICATION_PHONECALL_CALLING = "org.tizen.call"; +const char* APPLICATION_PICTURES = "org.tizen.gallery"; +const char* APPLICATION_PICTURES_IMG_PATH = "org.tizen.image-viewer"; +const char* APPLICATION_PROG_MANAGER = "org.tizen.taskmgr"; +const char* APPLICATION_SETTINGS = "org.tizen.setting"; +const char* APPLICATION_TASKS = "org.tizen.dailybriefing"; +const char* APPLICATION_WIDGET_MANAGER = "org.tizen.wrt-test-ui"; +const char* APPLICATION_WIDGET = "org.tizen."; +const char* APPLICATION_EMPTY = ""; + +const char* WIDGET_URI_PREFIX = "widget://"; + +const int SUCCESS_LAUNCHER = 0; +const int ERROR_LAUNCHER_INVALID_URI = 1; +const int ERROR_LAUNCHER_INVALID_PARAMETER = 2; +const int ERROR_LAUNCHER_EXECUTION_ERROR = 3; +} + +namespace WrtPlugins { +namespace Platform { +std::map AppLauncherManager::m_applicationTypesByPath; +std::map AppLauncherManager::m_applicationTypesByName; +std::vector AppLauncherManager::m_installedApplications; +std::vector AppLauncherManager::m_installedApplicationsNames; + +AppLauncherManager::AppLauncherManager() +{ + LogDebug("entered"); + static bool initialized = initializeApplicationList(); + (void) initialized; +} + +AppLauncherManager::~AppLauncherManager() +{ + LogDebug("entered"); +} + +bool AppLauncherManager::initializeApplicationList() +{ + //application paths + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_ALARM, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_BROWSER, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_CALCULATOR, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_CALENDAR, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_CAMERA, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_CONTACTS, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_FILES, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_GAMES, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_MAIL, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_MEDIAPLAYER, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_MESSAGING, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_PHONECALL, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_PICTURES, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_PROG_MANAGER, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_SETTINGS, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_TASKS, + APPLICATION_EMPTY)); + m_applicationTypesByPath.insert(std::pair( + APPLICATION_TYPE_WIDGET_MANAGER, + APPLICATION_EMPTY)); + //application names + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_ALARM, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_BROWSER, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_CALCULATOR, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_CALENDAR, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_CAMERA, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_CONTACTS, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_FILES, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_GAMES, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_MAIL, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_MEDIAPLAYER, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_MESSAGING, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_PHONECALL, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_PICTURES, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_PROG_MANAGER, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_SETTINGS, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_TASKS, + APPLICATION_EMPTY)); + m_applicationTypesByName.insert(std::pair( + APPLICATION_TYPE_WIDGET_MANAGER, + APPLICATION_EMPTY)); + + bool registered_application = false; // A variable that gets set if the current pkg_name is needed by WAC spec, needless of weather the package is visible or not. + app_info info = {}; + unsigned int count = record_count(COUNT_MENU, &info); + LogDebug("number of registered applications: " << count); + + DPL::ScopedFree infoAll(static_cast(calloc( + count, + sizeof( + app_info)))); + if (infoAll.Get()) { + if (!record_get(GET_MENU, infoAll.Get())) { + LogError("error during executing record_get() function"); + return false; + } + for (unsigned int i = 0; i < count; i++) { + LogDebug("pkg_name " << infoAll.Get()[i].pkg_name); + LogDebug("app_path " << infoAll.Get()[i].app_path); + LogDebug("app_name " << infoAll.Get()[i].app_name); + registered_application = false; + if (infoAll.Get()[i].app_path == NULL || + infoAll.Get()[i].app_name == NULL) { + LogDebug("Not Registered."); + LogDebug("-----"); + continue; + } + if (0 == + strncmp(APPLICATION_ALARM, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_ALARM] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_ALARM] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_BROWSER, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_BROWSER] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_BROWSER] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_CALCULATOR, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_CALCULATOR] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_CALCULATOR] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_CALENDAR, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_CALENDAR] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_CALENDAR] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_CAMERA, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_CAMERA] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_CAMERA] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_CONTACTS, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_CONTACTS] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_CONTACTS] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_FILES, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_FILES] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_FILES] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_GAMES, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_GAMES] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_GAMES] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_MAIL, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_MAIL] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_MAIL] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_MEDIAPLAYER, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_MEDIAPLAYER] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_MEDIAPLAYER] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_MESSAGING, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_MESSAGING] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_MESSAGING] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_PHONECALL, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_PHONECALL] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_PHONECALL] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_PICTURES, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_PICTURES] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_PICTURES] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_PROG_MANAGER, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_PROG_MANAGER] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_PROG_MANAGER] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_SETTINGS, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_SETTINGS] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_SETTINGS] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_TASKS, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_TASKS] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_TASKS] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (0 == + strncmp(APPLICATION_WIDGET_MANAGER, infoAll.Get()[i].pkg_name, + NAME_LEN)) { + m_applicationTypesByPath[APPLICATION_TYPE_WIDGET_MANAGER] = + infoAll.Get()[i].app_path; + m_applicationTypesByName[APPLICATION_TYPE_WIDGET_MANAGER] = + infoAll.Get()[i].app_name; + registered_application = true; + } + if (infoAll.Get()[i].visible == 0 && registered_application == + false) { + LogDebug("Not Registered."); + LogDebug("-----"); + continue; + } + m_installedApplications.push_back(infoAll.Get()[i].app_path); + m_installedApplicationsNames.push_back(infoAll.Get()[i].app_name); + LogDebug("Registered."); + LogDebug("-----"); + } + } + return true; +} + +ApplicationType AppLauncherManager::getRegisteredApplicationType( + const std::string &name) const +{ + if (!name.empty()) { + std::map::const_iterator it; + for (it = m_applicationTypesByPath.begin(); + it != m_applicationTypesByPath.end(); + ++it) { + if (it->second == name) { + return it->first; + } + } + } + return APPLICATION_TYPE_UNDEFINED; +} + +bool AppLauncherManager::isRegisteredApplication(const std::string &name) const +{ + if (name.empty()) { + return false; + } + std::vector::const_iterator pos = + find(m_installedApplications.begin(), + m_installedApplications.end(), name); + return pos != m_installedApplications.end(); +} + +bool AppLauncherManager::validateHttpAddress(const std::string &value) const +{ + if (!pcrecpp::RE(HTTP_ADDRESS_PATTERN).FullMatch(value)) { + LogDebug("not valid paterrn of http address"); + return false; + } + return true; +} + +bool AppLauncherManager::isFilePath(const std::string &value) const +{ + if (!pcrecpp::RE(FILE_ADDRESS_PATTERN).FullMatch(value)) { + return false; + } + return true; +} + +bool AppLauncherManager::validateEmailAddress(const std::string &value) const +{ + if (!pcrecpp::RE(EMAIL_PATTERN).FullMatch(value)) { + LogDebug("not valid paterrn of email address"); + return false; + } + return true; +} + +std::string AppLauncherManager::getRealPath(const std::string &path) const +{ + Try + { + Api::Filesystem::IPathPtr currentPath = Api::Filesystem::IPath::create( + path); + return currentPath->getFullPath(); + } + Catch(Commons::Exception) + { + LogError("invalid path"); + } + return std::string(); +} + +std::string AppLauncherManager::getPathFromApplicationName( + const std::string &applicationName) const +{ + if (0 == applicationName.find(WIDGET_URI_PREFIX) && std::string::npos != + applicationName.find("?")) { + //uri format is: widget://{widgetId}?wname={WidgetName} + LogDebug("found widget:// URI"); + std::string uri = applicationName; + uri.erase(0, strlen(WIDGET_URI_PREFIX)); //remove widget://part + std::string widgetId = uri.substr(0, uri.find("?")); + uri.erase(0, widgetId.size() + 7); //remove widget id and "?wname=" string, so uri contains only widget name now + std::string packageName = APPLICATION_WIDGET + widgetId; + LogDebug( + "Widget id: " << widgetId << ", widget name: " << uri << + ", package: " << packageName); + app_info info = { 0, }; + strncpy(info.pkg_name, packageName.c_str(), NAME_LEN); + if (record_get(GET_ONE_RECORD_BY_PKG_NAME, &info)) { + if (info.app_path && info.app_name && uri == info.app_name) { + return std::string(info.app_path); + } + } + } + for (size_t i = 0; i < m_installedApplicationsNames.size(); ++i) { + if (m_installedApplicationsNames[i] == applicationName) { + return m_installedApplications[i]; + } + } + return std::string(); +} + +std::string AppLauncherManager::getPathFromPackageName( + const std::string &packageName) const +{ + app_info info = { 0, }; + strncpy(info.pkg_name, packageName.c_str(), NAME_LEN); + if (record_get(GET_ONE_RECORD_BY_PKG_NAME, &info)) { + LogDebug("pkg_name " << info.pkg_name); + LogDebug("app_path " << info.app_path); + LogDebug("app_name " << info.app_name); + if (info.app_path) { + return std::string(info.app_path); + } + } + return std::string(); +} + +std::string AppLauncherManager::getPackageNameFromPath(const std::string &path) +const +{ + app_info info = { 0, }; + strncpy(info.app_path, path.c_str(), PATH_LEN); + if (record_get(GET_ONE_RECORD_BY_APP_PATH, &info)) { + LogDebug("pkg_name " << info.pkg_name); + LogDebug("app_path " << info.app_path); + LogDebug("app_name " << info.app_name); + if (info.app_path) { + return std::string(info.pkg_name); + } + } + return std::string(); +} + +int AppLauncherManager::launchApplicationFileInternal( + const std::string &uriParameter, + const std::vector &applicationParams) +{ + LogDebug("entered with uriParameter: '" << uriParameter << "'"); + ApplicationType appType = getRegisteredApplicationType(uriParameter); + if (!isRegisteredApplication(uriParameter)) { + LogDebug("Its not registered application"); + return ERROR_LAUNCHER_INVALID_URI; + } + //try to launch as package using aul + std::string packageName = getPackageNameFromPath(uriParameter); + if (!packageName.empty()) { + LogDebug("executing as package, package name " << packageName); + //check parameters for empty or extra spaces + std::vector params; + std::vector::const_iterator it; + for (it = applicationParams.begin(); + it != applicationParams.end(); + ++it) { + std::string param(Commons::String::trim(*it)); + if (param.empty()) { + continue; + } + params.push_back(param); + } + bundle *kb = NULL; + if (params.size() > 0) { + if (appType == APPLICATION_TYPE_PHONECALL) { + //phone number is provided. + //replace package to make a call, not run application with this functionality + + packageName = APPLICATION_PHONECALL_CALLING; + kb = bundle_create(); + if (!kb) { + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + if (bundle_add(kb, "launch-type", "MO") < 0) { // "MO" : normal call, "EMERGENCY" : emergency call + bundle_free(kb); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + if (bundle_add(kb, "number", params.front().c_str()) < 0) { + bundle_free(kb); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + LogDebug("running with number: " << params.front()); + } else if (appType == APPLICATION_TYPE_BROWSER) { + if (!validateHttpAddress(params.front())) { + return ERROR_LAUNCHER_INVALID_PARAMETER; + } + kb = bundle_create(); + if (!kb) { + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + if (bundle_add(kb, "url", params.front().c_str()) < 0) { + bundle_free(kb); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + LogDebug("running with url: " << params.front().c_str()); + } else if (appType == APPLICATION_TYPE_MEDIAPLAYER) { + LogDebug("opening file: " << getRealPath(params.front()).c_str()); + int result = aul_open_file(getRealPath(params.front()).c_str()); + if (result < 0) { + LogError("Cannot open file, launch application only"); + } else { + return SUCCESS_LAUNCHER; + } + } else if (appType == APPLICATION_TYPE_FILES) { + struct stat sb; + if (stat(getRealPath(params.front()).c_str(), &sb) == -1) { + LogError( + "The selected path does not exist: " << + getRealPath(params.front()).c_str()); + } else { + if (!S_ISDIR(sb.st_mode)) { + LogDebug("opening file: " << getRealPath( + params.front()).c_str()); + int result = aul_open_file(getRealPath( + params.front()).c_str()); + if (result < 0) { + LogError( + "Cannot open file, launch application only"); + } else { + return SUCCESS_LAUNCHER; + } + } else { + kb = bundle_create(); + if (!kb) { + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + if (bundle_add(kb, "path", + getRealPath(params.front()).c_str()) < + 0) { + bundle_free(kb); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + LogDebug("running with folder path: " << + getRealPath(params.front()).c_str()); + } + } + } else if (appType == APPLICATION_TYPE_PICTURES) { + //open photo with image path + //replace package to show only one picture with given image path + packageName = APPLICATION_PICTURES_IMG_PATH; + kb = bundle_create(); + if (!kb) { + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + if (bundle_add(kb, "View Mode", "SINGLE") < 0) { + bundle_free(kb); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + if (bundle_add(kb, "Path", + getRealPath(params.front()).c_str()) < 0) { + bundle_free(kb); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + LogDebug("running with img file path: " << + getRealPath(params.front()).c_str()); + } + //TODO: add more parameters when needed + } + int result = aul_launch_app(packageName.c_str(), kb); + if (kb) { + bundle_free(kb); + } + if (result > 0) { + return SUCCESS_LAUNCHER; + } + LogError("aul_launch_app result " << result); + return ERROR_LAUNCHER_EXECUTION_ERROR; + } + return ERROR_LAUNCHER_EXECUTION_ERROR; +} + +int AppLauncherManager::launchApplicationInternal( + const ApplicationUriType uriType, + const std::string &uriParameter, + const std::vector &applicationParams) +{ + LogDebug( + "entered with uriType: " << uriType << ", uriParameter: " << + uriParameter); + if (APPLICATION_URI_TYPE_HTTP == uriType) { + std::string application = + m_applicationTypesByPath[APPLICATION_TYPE_BROWSER]; + std::vector params; + if (Commons::String::startsWith(uriParameter, "http://")) { + params.push_back(uriParameter); + } else if (!pcrecpp::RE(EMPTY_STRING_PATTERN).FullMatch(uriParameter)) + { + params.push_back("http://" + uriParameter); + } + return launchApplicationFileInternal(application, params); + } else if (APPLICATION_URI_TYPE_HTTPS == uriType) { + std::string application = + m_applicationTypesByPath[APPLICATION_TYPE_BROWSER]; + std::vector params; + if (Commons::String::startsWith(uriParameter, "https://")) { + params.push_back(uriParameter); + } else if (!pcrecpp::RE(EMPTY_STRING_PATTERN).FullMatch(uriParameter)) + { + params.push_back("https://" + uriParameter); + } + return launchApplicationFileInternal(application, params); + } else if (APPLICATION_URI_TYPE_TEL == uriType) { + std::string application = + m_applicationTypesByPath[APPLICATION_TYPE_PHONECALL]; + std::vector params; + params.push_back(uriParameter); + return launchApplicationFileInternal(application, params); + } else if (APPLICATION_URI_TYPE_MAILTO == uriType) { + std::string application = + m_applicationTypesByPath[APPLICATION_TYPE_MAIL]; + std::vector params; + params.push_back(uriParameter); + return launchApplicationFileInternal(application, params); + } else if (APPLICATION_URI_TYPE_SMS == uriType) { + std::string application = + m_applicationTypesByPath[APPLICATION_TYPE_MESSAGING]; + std::vector params; + params.push_back(uriParameter); + return launchApplicationFileInternal(application, params); + } else if (APPLICATION_URI_TYPE_FILE == uriType) { + return launchApplicationFileInternal(uriParameter, applicationParams); + } else if (APPLICATION_URI_TYPE_APPLICATION_BY_NAME == uriType) { + std::string application = getPathFromApplicationName(uriParameter); + return launchApplicationFileInternal(application, applicationParams); + } else { + return ERROR_LAUNCHER_INVALID_URI; + } + return SUCCESS_LAUNCHER; +} + +std::string AppLauncherManager::getDefaultApplicationByMimeInternal( + const std::string &mime) const +{ + LogDebug("entered with mime: " << mime); + const int bufferSize = 1024; + char buffer[bufferSize] = { 0 }; + int result = aul_get_defapp_from_mime(mime.c_str(), buffer, bufferSize - 1); + if (AUL_R_OK == result) { + LogDebug("returning default application"); + return std::string(buffer); + } else { + LogError("aul_get_defapp_from_mime failed, error code " << result); + Throw(Commons::PlatformException); + } + return std::string(); +} + +void AppLauncherManager::OnRequestReceived( + const EventGetDefaultApplicationPtr &event) +{ + LogDebug("entered"); + Try + { + std::string result = getDefaultApplicationByMimeInternal(event->getMime()); + event->setApplicationFullPath(result); + event->setExceptionCode(Commons::ExceptionCodes::None); + } + Catch(Commons::PlatformException) + { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + } +} + +void AppLauncherManager::OnRequestReceived( + const EventGetInstalledApplicationsPtr &event) +{ + LogDebug("entered"); + std::vector::const_iterator it1; + for (it1 = m_installedApplications.begin(); + it1 != m_installedApplications.end(); + ++it1) { + event->addApplicationFullPath(*it1); + } + for (it1 = m_installedApplicationsNames.begin(); + it1 != m_installedApplicationsNames.end(); + ++it1) { + event->addApplicationName(*it1); + } + std::map::const_iterator it2; + for (it2 = m_applicationTypesByPath.begin(); + it2 != m_applicationTypesByPath.end(); + ++it2) { + event->addApplicationTypeByPath(*it2); + } + for (it2 = m_applicationTypesByName.begin(); + it2 != m_applicationTypesByName.end(); + ++it2) { + event->addApplicationTypeByName(*it2); + } + event->setExceptionCode(Commons::ExceptionCodes::None); +} + +void AppLauncherManager::OnRequestReceived( + const EventLaunchApplicationPtr &event) +{ + LogDebug("entered"); + ApplicationUriType uriType = event->getApplicationUriType(); + std::string uriParam = event->getApplicationUriParam(); + std::vector parameters = event->getApplicationParameters(); + int result = launchApplicationInternal(uriType, uriParam, parameters); + if (result == SUCCESS_LAUNCHER) { + event->setExceptionCode(Commons::ExceptionCodes::None); + } else if (result == ERROR_LAUNCHER_INVALID_PARAMETER || + result == ERROR_LAUNCHER_INVALID_URI) { + event->setExceptionCode( + Commons::ExceptionCodes::InvalidArgumentException); + } else { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + } +} +} +} diff --git a/src/modules/tizen/DEPRACATED/AppLauncher/AppLauncherManager.h b/src/modules/tizen/DEPRACATED/AppLauncher/AppLauncherManager.h new file mode 100644 index 0000000..d540831 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/AppLauncher/AppLauncherManager.h @@ -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. + */ +/** + * @file AppLauncherManager.h + * @author Lukasz Marek (l.marek@samsung.com) + * @author Yujie Zeng (yj.zeng@samsung.com) + * @version 0.1 + */ + +#ifndef _SLP20__APPLAUNCHER_MANAGER_H_ +#define _SLP20__APPLAUNCHER_MANAGER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace WrtPlugins { +namespace Platform { +class AppLauncherManager : public Api::AppLauncher::IAppLauncherManager +{ + public: + AppLauncherManager(); + virtual ~AppLauncherManager(); + protected: + virtual void OnRequestReceived( + const Api::AppLauncher::EventGetDefaultApplicationPtr &event); + virtual void OnRequestReceived( + const Api::AppLauncher::EventGetInstalledApplicationsPtr &event); + virtual void OnRequestReceived( + const Api::AppLauncher::EventLaunchApplicationPtr &event); + virtual bool isRegisteredApplication(const std::string &name) const; + virtual Api::AppLauncher::ApplicationType getRegisteredApplicationType( + const std::string &name) const; + virtual std::string getRealPath(const std::string &path) const; + virtual bool validateHttpAddress(const std::string &value) const; + virtual bool validateEmailAddress(const std::string &value) const; + virtual bool isFilePath(const std::string &value) const; + + private: + bool initializeApplicationList(); + std::string getPathFromApplicationName(const std::string &applicationName) + const; + std::string getPathFromPackageName(const std::string &packageName) const; + std::string getPackageNameFromPath(const std::string &path) const; + std::string getDefaultApplicationByMimeInternal(const std::string &mime) + const; + int launchApplicationInternal( + const Api::AppLauncher::ApplicationUriType uriType, + const std::string &uriParameter, + const std::vector &applicationParams); + int launchApplicationFileInternal(const std::string &uriParameter, + const std::vector &applicationParam); + static std::map m_applicationTypesByPath; + static std::map m_applicationTypesByName; + static std::vector m_installedApplications; + static std::vector m_installedApplicationsNames; +}; + +typedef DPL::SharedPtr AppLauncherManagerPtr; +} +} + +#endif /* _SLP20__APPLAUNCHER_MANAGER_H_ */ diff --git a/src/modules/tizen/DEPRACATED/AppLauncher/config.cmake b/src/modules/tizen/DEPRACATED/AppLauncher/config.cmake new file mode 100644 index 0000000..4b6dddb --- /dev/null +++ b/src/modules/tizen/DEPRACATED/AppLauncher/config.cmake @@ -0,0 +1,48 @@ +get_current_path() + +pkg_search_module(glib REQUIRED glib-2.0) +pkg_search_module(aul REQUIRED aul) +pkg_search_module(pcre REQUIRED libpcrecpp) +pkg_search_module(dmi REQUIRED desktop-manager-internal) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_APPLAUNCHER + ${glib_INCLUDE_DIRS} + ${pcre_INCLUDE_DIRS} + ${aul_INCLUDE_DIRS} + ${dmi_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_APPLAUNCHER + ${glib_LIBRARIES} + ${pcre_LIBRARIES} + ${aul_LIBRARIES} + ${dmi_LIBRARIES} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_APPLAUNCHER + ${CURRENT_PATH}/../../API/Filesystem/IManager.cpp + ${CURRENT_PATH}/../../API/Filesystem/IPath.cpp + ${CURRENT_PATH}/../../API/Filesystem/INode.cpp + ${CURRENT_PATH}/../../API/Filesystem/IStream.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventCopy.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventFind.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventResolve.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventMove.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventRemove.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventOpen.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventListNodes.cpp + ${CURRENT_PATH}/../../API/Filesystem/EventReadText.cpp + ${CURRENT_PATH}/../../API/Filesystem/NodeFilter.cpp + ${CURRENT_PATH}/../../API/Filesystem/PathUtils.cpp + ${CURRENT_PATH}/../Filesystem/System.cpp + ${CURRENT_PATH}/../Filesystem/Manager.cpp + ${CURRENT_PATH}/../Filesystem/Utils.cpp + ${CURRENT_PATH}/../Filesystem/Path.cpp + ${CURRENT_PATH}/../Filesystem/Node.cpp + ${CURRENT_PATH}/../Filesystem/Stream.cpp + ${CURRENT_PATH}/../Filesystem/NodeFilterMatcher.cpp + ${CURRENT_PATH}/AppLauncherManager.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Camera-Webkit/Camera.cpp b/src/modules/tizen/DEPRACATED/Camera-Webkit/Camera.cpp new file mode 100644 index 0000000..33e4ded --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Camera-Webkit/Camera.cpp @@ -0,0 +1,482 @@ +/* + * 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. + */ +/* + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 0.1 + * @brief + */ + +#include "Camera.h" +#include +#include +#include +#include +#include +#include + + +namespace WrtDeviceApis { +namespace Camera { + +template +class CameraPrivateData +{ +public: + Camera* camera; + EventPtr event; +}; + +enum EventTypeId +{ + BeginRecordingType, + TakePictureType, + CreatePreviewType +}; + +class OpaquePrivateData +{ +public: + EventTypeId eventTypeId; + void* cameraPrivateData; +}; + + +//GetEventTypeId +template +EventTypeId getEventTypeId(const T& event){ Assert(0); } + +template<> +EventTypeId getEventTypeId( + const Api::EventBeginRecordingSharedPtr& /*event*/) +{ + return BeginRecordingType; +} + +template<> +EventTypeId getEventTypeId( + const Api::EventTakePictureSharedPtr& /*event*/) +{ + return TakePictureType; +} + +template<> +EventTypeId getEventTypeId( + const Api::EventGetPreviewNodeSharedPtr& /*event*/) +{ + return CreatePreviewType; +} + +template +OpaquePrivateData* createPrivateOpaqueData(Camera* camera, + const EventPtr& event) +{ + //create private opaque data + OpaquePrivateData* opaqueData = new OpaquePrivateData; + + CameraPrivateData* privateData = new CameraPrivateData; + privateData->camera = camera; + privateData->event = event; + + opaqueData->eventTypeId = getEventTypeId(event); + opaqueData->cameraPrivateData = privateData; + + return opaqueData; +} + +template +CameraPrivateData* getPrivateData(void* data) +{ + OpaquePrivateData* opaqueData = static_cast (data); + + CameraPrivateData* privateData = + static_cast *> + (opaqueData->cameraPrivateData); + + return privateData; +} + +template +void deletePrivateData(void* data) +{ + OpaquePrivateData* opaqueData = static_cast (data); + + CameraPrivateData* privateData = + static_cast *> + (opaqueData->cameraPrivateData); + + delete privateData; + delete opaqueData; +} + + +template +EventType createEvent(const EventArg& arg1) +{ + return EventType(arg1); +} + + +template +class BaseCallbackHandler : private DPL::Noncopyable +{ +public: + explicit BaseCallbackHandler(void* data) : + m_camera(NULL) + { + Assert(data); + CameraPrivateData* privateData = + getPrivateData(data); + m_camera = privateData->camera; + m_event = privateData->event; + + deletePrivateData(data); + } + + virtual void handleErrorCallback(int error) + { + LogError("Error: " << error); + m_event->setExceptionCode(Commons::ExceptionCodes::UnknownException); + this->post(); + } + + virtual void handleSuccessCallback(void* data) + { + setPrivate(data); + this->post(); + } + + virtual void post() = 0; + + virtual ~BaseCallbackHandler(){ } + + protected: + virtual void setPrivate(void* /*data*/) {}; + +protected: + Camera* m_camera; + EventType m_event; +}; + +template +class CallbackHandler : public BaseCallbackHandler +{ + static_assert(WrtDeviceApis::Commons::AlwaysFalse::value, + "Error, no specialization found for given type"); + + public: + explicit CallbackHandler(void* data) : + BaseCallbackHandler(data) + { + } + + //virtual void post(){ } +}; + +template<> +class CallbackHandler + : public BaseCallbackHandler +{ + public: + explicit CallbackHandler(void* data) : + BaseCallbackHandler(data) + {} + + virtual void post(){ + this->m_camera->setRecordingState(Camera::COMPLETED); + this->m_camera-> + DPL::Event::ControllerEventHandler::PostEvent( + createEvent(this->m_event)); + } + + virtual void handleSuccessCallback(void* data) + { + this->m_camera->setRecordingState(Camera::COMPLETED); + BaseCallbackHandler:: + handleSuccessCallback(data); + } +}; + +template<> +class CallbackHandler + : public BaseCallbackHandler +{ + public: + explicit CallbackHandler(void* data) : + BaseCallbackHandler(data) + {} + + virtual void post(){ + this->m_camera-> + DPL::Event::ControllerEventHandler::PostEvent( + createEvent(this->m_event)); + } + + virtual void setPrivate(void* data) + { + m_event->getCaptureOptionsRef()->setFileName(static_cast(data)); + } +}; + +template<> +class CallbackHandler + : public BaseCallbackHandler +{ + public: + explicit CallbackHandler(void* data) : + BaseCallbackHandler(data) + {} + + virtual void post(){ + this->m_camera-> + DPL::Event::ControllerEventHandler::PostEvent( + createEvent(this->m_event)); + } + + virtual void setPrivate(void* data) + { + LogDebug("Enter"); + m_event->setPreviewNode(data); + } +}; + +Camera::Camera(const Commons::IWrtCameraPtr& wrtCamera) : + m_wrtCamera(wrtCamera), + m_stateRecordingVideo (Camera::IDLE) +{ + CameraJobDoneController::Touch(); +} + +Camera::~Camera() +{ + LogDebug("enter"); + + CameraJobDoneController::SwitchToThread(NULL); +} + + +void Camera::OnRequestReceived( + const Api::EventTakePictureSharedPtr & event) +{ + LogDebug("enter"); + + event->switchToManualAnswer(); + + m_wrtCamera->captureImage(event->getCaptureOptionsRef()->getFileName(), + checkHighResolutionRequired(event), + camCaptureImageSuccessCallback, + camCaptureImageErrorCallback, + setPendingOperation, + createPrivateOpaqueData(this,event)); + + LogDebug("leaving"); +} + +void Camera::OnRequestReceived( + const Api::EventBeginRecordingSharedPtr & event) +{ + LogDebug("enter"); + + if (m_stateRecordingVideo != Camera::IDLE) { + event->setExceptionCode(Commons::ExceptionCodes::AlreadyInUseException); + return; + } + m_stateRecordingVideo = Camera::PROCESSING; + + //from now on we will have to call answer manually + event->switchToManualAnswer(); + + m_wrtCamera->startVideoCapture(event->getCaptureOptionsRef()->getFileName(), + checkHighResolutionRequired(event), + camCaptureVideoSuccessCallback, + camCaptureVideoErrorCallback, + setPendingOperation, + createPrivateOpaqueData(this,event)); + + LogDebug("leaving"); +} + +void Camera::OnRequestReceived( + const Api::EventEndRecordingSharedPtr & event) +{ + LogDebug("end request"); + if (m_stateRecordingVideo == Camera::PROCESSING) { + m_wrtCamera->stopVideoCapture(); + } else { + LogDebug("stopVideo has been called but no recording is in progress"); + event->setExceptionCode(Commons::ExceptionCodes::UnknownException); + } +} + +void Camera::OnRequestReceived( + const Api::EventGetPreviewNodeSharedPtr & event) +{ + LogDebug("enter"); + + event->switchToManualAnswer(); + + LogDebug("start createPreview"); + + m_wrtCamera->createPreviewNode(camPreviewSuccessCallback, + camPreviewErrorCallback, + setPendingOperation, + createPrivateOpaqueData(this,event)); + LogDebug("leaving"); +} + +void Camera::camCaptureImageSuccessCallback( + const char* filename, void* data) +{ + LogDebug("*Picture* Captured. !!!"); + + CallbackHandler handler(data); + handler.handleSuccessCallback(const_cast(filename)); +} + +void Camera::camCaptureVideoSuccessCallback(const char* filename, void* data) +{ + LogDebug("*Video* Captured. !!!"); + + CallbackHandler handler(data); + handler.handleSuccessCallback(const_cast(filename)); +} + +void Camera::camPreviewSuccessCallback( + Commons::IWrtCamera::CameraPreviewNode node, void* data) +{ + LogDebug("enter"); + + CallbackHandler handler(data); + handler.handleSuccessCallback(node); +} + +void Camera::camPreviewErrorCallback(int errorCode, void* data) +{ + LogDebug("enter"); + + CallbackHandler handler(data); + handler.handleErrorCallback(errorCode); +} + +void Camera::camCaptureImageErrorCallback(int errorCode, void* data) +{ + LogDebug("enter"); + + CallbackHandler handler(data); + handler.handleErrorCallback(errorCode); +} + +void Camera::camCaptureVideoErrorCallback(int errorCode, void* data) +{ + LogDebug("enter"); + + CallbackHandler handler(data); + handler.handleErrorCallback(errorCode); +} + +void Camera::OnEventReceived(const JobDoneVideoRecordingEvent &event) +{ + LogDebug("enter"); + if (m_stateRecordingVideo == COMPLETED && event.GetArg0()) { + EventRequestReceiver:: + ManualAnswer(event.GetArg0()); + //event.Reset(); + } + m_stateRecordingVideo = Camera::IDLE; +} + +void Camera::OnEventReceived(const JobDoneCreatePreviewEvent &event) +{ + OnJobDoneReceived(event.GetArg0()); +} + +void Camera::OnEventReceived(const JobDoneTakePictureEvent &event) +{ + OnJobDoneReceived(event.GetArg0()); +} + +void Camera::OnCancelEvent( + const Api::EventBeginRecordingSharedPtr& event) +{ + LogDebug(__FUNCTION__); + + if (Camera::PROCESSING == m_stateRecordingVideo) { + if (event->checkPendingOperation()) { + m_wrtCamera->cancelAsyncOperation(event->getPendingOperation()); + } + setRecordingState(Camera::IDLE); + } else { + LogError("Cancel invoked, but the state is wrong"); + } +} + +void Camera::OnCancelEvent(const Api::EventTakePictureSharedPtr& event) +{ + cancelEvent(event); +} + +void Camera::OnCancelEvent( + const Api::EventGetPreviewNodeSharedPtr& event) +{ + cancelEvent(event); +} + +void Camera::setRecordingState(CameraState state) +{ + m_stateRecordingVideo = state; +} + +void Camera::setPendingOperation( + Commons::IWrtCamera::CameraPendingOperation pendingOperation, void* data) +{ + LogDebug("Set pending operation callback invoked"); + + Assert(data); + OpaquePrivateData* opaqueData = static_cast (data); + Assert(opaqueData->cameraPrivateData); + + switch (opaqueData->eventTypeId) { + case BeginRecordingType: + { + static_cast* > ( + opaqueData->cameraPrivateData) + ->event->setPendingOperation(pendingOperation); + break; + } + case CreatePreviewType: + { + static_cast* > ( + opaqueData->cameraPrivateData) + ->event->setPendingOperation(pendingOperation); + break; + } + case TakePictureType: + { + static_cast* > ( + opaqueData->cameraPrivateData) + ->event->setPendingOperation(pendingOperation); + break; + } + default: + Assert(0); + } +} + + +} +} diff --git a/src/modules/tizen/DEPRACATED/Camera-Webkit/Camera.h b/src/modules/tizen/DEPRACATED/Camera-Webkit/Camera.h new file mode 100644 index 0000000..27201fe --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Camera-Webkit/Camera.h @@ -0,0 +1,142 @@ +/* + * 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. + */ +/* + * @author Grzegorz Krawczyk(g.krawczyk@samsung.com) + * @version 0.1 + * @brief + */ + +#ifndef WRT_PLUGINS_CAMERA_H_ +#define WRT_PLUGINS_CAMERA_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace WrtDeviceApis{ +namespace Camera{ + +DECLARE_GENERIC_EVENT_1(JobDoneTakePictureEvent, + Camera::Api::EventTakePictureSharedPtr) +DECLARE_GENERIC_EVENT_1(JobDoneVideoRecordingEvent, + Camera::Api::EventBeginRecordingSharedPtr) +DECLARE_GENERIC_EVENT_1(JobDoneCreatePreviewEvent, + Camera::Api::EventGetPreviewNodeSharedPtr) + + +typedef DPL::TypeListDecl::Type JobDoneEvents; + +typedef DPL::Event::Controller CameraJobDoneController; + +class Camera: public Api::ICamera, + public CameraJobDoneController +{ +public: + enum CameraState{ + IDLE, + PROCESSING, + COMPLETED + }; + +public: + explicit Camera(const Commons::IWrtCameraPtr& wrtCamera); + + virtual ~Camera(); + + virtual void OnRequestReceived( + const Api::EventTakePictureSharedPtr &event); + virtual void OnRequestReceived( + const Api::EventBeginRecordingSharedPtr &event); + virtual void OnRequestReceived( + const Api::EventEndRecordingSharedPtr &event); + virtual void OnRequestReceived( + const Api::EventGetPreviewNodeSharedPtr &event); + + virtual void OnEventReceived(const JobDoneVideoRecordingEvent &event); + virtual void OnEventReceived(const JobDoneCreatePreviewEvent &event); + virtual void OnEventReceived(const JobDoneTakePictureEvent &event); + + void OnCancelEvent(const Api::EventBeginRecordingSharedPtr& event); + void OnCancelEvent(const Api::EventTakePictureSharedPtr& event); + void OnCancelEvent(const Api::EventGetPreviewNodeSharedPtr& event); + + void setRecordingState(CameraState state); + +private: + static void camCaptureImageSuccessCallback(const char* filename, + void* data); + static void camCaptureVideoSuccessCallback(const char* filename, + void* data); + static void camPreviewSuccessCallback( + Commons::IWrtCamera::CameraPreviewNode node, void* data); + + static void camCaptureImageErrorCallback(int errorCode, void* data); + static void camCaptureVideoErrorCallback(int errorCode, void* data); + static void camPreviewErrorCallback(int errorCode, void* data); + + template + bool checkHighResolutionRequired(const EventType& event) const + { + return event->getCaptureOptionsRef()->getImageResolution() + == Api::ICaptureOptions::IMAGE_RESOLUTION_HIGH; + } + + template + void OnJobDoneReceived(DPL::SharedPtr event) + { + LogDebug("enter"); + if (event) { + EventRequestReceiver::ManualAnswer(event); + } + LogDebug("post"); + } + + template + void cancelEvent(const EventType& event) + { + LogDebug(__FUNCTION__); + + if (event->checkPendingOperation()) { + m_wrtCamera->cancelAsyncOperation(event->getPendingOperation()); + } + } + + static void setPendingOperation( + Commons::IWrtCamera::CameraPendingOperation pendingOperation, void* data); + +private: + Commons::IWrtCameraPtr m_wrtCamera; + + CameraState m_stateRecordingVideo; +}; + +} +} +#endif /* WRTPLUGINSCAMERA_H_ */ diff --git a/src/modules/tizen/DEPRACATED/Camera-Webkit/CameraManager.cpp b/src/modules/tizen/DEPRACATED/Camera-Webkit/CameraManager.cpp new file mode 100644 index 0000000..53d26dd --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Camera-Webkit/CameraManager.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. + */ +/* + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 0.1 + * @brief + */ +#include +#include "CameraManager.h" +#include +#include +#include +#include "Camera.h" + +namespace WrtDeviceApis { +namespace Camera { + +void CameraManager::OnRequestReceived( + const Api::EventGetCamerasPtr &event) +{ + LogDebug(__FUNCTION__); + try + { + if (m_cameras.empty()) { + DPL::Mutex::ScopedLock lock(&m_accessMutex); + + if (m_cameras.empty()) { + Commons::IWrtCameraManager::WrtCamerasPtr cameras; + cameras = event-> + getConfiguration()-> + getWrtWrapper()-> + getCameraManagerInterface()-> + getCameras(); + + FOREACH(it, *cameras) + { + Api::ICameraSharedPtr icamera(new Camera(*it)); + m_cameras.push_back(icamera); + } + } + } + event->setCamerasRef(m_cameras,0); + LogDebug("Nr of cameras: " << m_cameras.size()); + } + catch(const Commons::Exception &exc) + { + LogError("Exception has occurred: " << std::hex << exc.getCode()); + event->setExceptionCode(exc.getCode()); + } +} + +} +} diff --git a/src/modules/tizen/Filesystem/MoveCommand.h b/src/modules/tizen/DEPRACATED/Camera-Webkit/CameraManager.h similarity index 55% rename from src/modules/tizen/Filesystem/MoveCommand.h rename to src/modules/tizen/DEPRACATED/Camera-Webkit/CameraManager.h index be356ef..6fce3eb 100644 --- a/src/modules/tizen/Filesystem/MoveCommand.h +++ b/src/modules/tizen/DEPRACATED/Camera-Webkit/CameraManager.h @@ -13,36 +13,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) +/* + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 0.1 + * @brief */ -#ifndef WRTDEVICEAPIS_FILESYSTEM_MOVECOMMAND_H_ -#define WRTDEVICEAPIS_FILESYSTEM_MOVECOMMAND_H_ +#ifndef WRT_PLUGINS_CAMERA_MANAGER_H_ +#define WRT_PLUGINS_CAMERA_MANAGER_H_ + +#include -#include "Command.h" -#include +#include +#include namespace WrtDeviceApis { -namespace Filesystem { +namespace Camera { -class MoveCommand : public Command +class CameraManager : public Api::ICameraManager { - public: - MoveCommand(const Api::IPathPtr& src, - const Api::IPathPtr& dest); - void setForce(bool force); +protected: + virtual void OnRequestReceived( + const Api::EventGetCamerasPtr &event); - protected: - std::string prepare(); - - private: - Api::IPathPtr m_src; - Api::IPathPtr m_dest; - bool m_force; +private: + DPL::Mutex m_accessMutex; }; } } - -#endif // WRTDEVICEAPIS_FILESYSTEM_MOVECOMMAND_H_ +#endif /* */ diff --git a/src/modules/tizen/DEPRACATED/Camera-Webkit/config.cmake b/src/modules/tizen/DEPRACATED/Camera-Webkit/config.cmake new file mode 100644 index 0000000..6efbb40 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Camera-Webkit/config.cmake @@ -0,0 +1,15 @@ +get_current_path() + +set(INCLUDES_PLATFORM_IMPLEMENTATION_CAMERA + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_CAMERA + ${CURRENT_PATH}/Camera.cpp + ${CURRENT_PATH}/CameraManager.cpp + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_CAMERA + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Device/Manager.cpp b/src/modules/tizen/DEPRACATED/Device/Manager.cpp new file mode 100644 index 0000000..f77c660 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Device/Manager.cpp @@ -0,0 +1,74 @@ +/* + * 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 "Manager.h" +#include + +namespace { +const bool CLAMSHELL_SUPPORTED = false; +const bool KEYPAD_SUPPORTED = false; +} // anonymous + +namespace WrtPlugins { +namespace Platform { +namespace Device { +Manager& Manager::getInstance() +{ + static Manager instance; + return instance; +} + +Manager::~Manager() +{ +} + +bool Manager::hasClamshell() const +{ + return CLAMSHELL_SUPPORTED; +} + +Api::Device::IClamshell* Manager::getClamshell() const +{ + ThrowMsg(Commons::UnsupportedException, + "Device is not equipped with clamshell."); +} + +bool Manager::hasKeypad() const +{ + return KEYPAD_SUPPORTED; +} + +Api::Device::IKeypad* Manager::getKeypad() const +{ + ThrowMsg(Commons::UnsupportedException, + "Device is not equipped with keypad."); +} + +std::string Manager::getImei() const +{ + Try { + return m_imei.getString(); + } + Catch(Commons::ConversionException) { + ReThrow(Commons::PlatformException); + } +} + +Manager::Manager() : m_imei(VCONFKEY_TELEPHONY_IMEI) +{ +} +} // Device +} // Platform +} // WrtPlugins diff --git a/src/modules/tizen/DEPRACATED/Device/Manager.h b/src/modules/tizen/DEPRACATED/Device/Manager.h new file mode 100644 index 0000000..8edab78 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Device/Manager.h @@ -0,0 +1,73 @@ +/* + * 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. + */ +/** + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + */ + +#ifndef WRTDEVICEAPIS_DEVICE_MANAGER_H_ +#define WRTDEVICEAPIS_DEVICE_MANAGER_H_ + +#include +#include + +namespace WrtPlugins { +namespace Platform { +namespace Device { +class Manager : public Api::Device::IManager +{ + public: + static Manager& getInstance(); + + public: + virtual ~Manager(); + + /** + * @see WrtPlugins::Api::Device::IManager::hasClamshell() + */ + bool hasClamshell() const; + + /** + * @see WrtPlugins::Api::Device::IManager::getClamshell() + */ + + Api::Device::IClamshell* getClamshell() const; + + /** + * @see WrtPlugins::Api::Device::IManager::hasKeypad() + */ + bool hasKeypad() const; + + /** + * @see WrtPlugins::Api::Device::IManager::getKeypad() + */ + Api::Device::IKeypad* getKeypad() const; + + /** + * @see WrtPlugins::Api::Device::IManager::getImei() + */ + std::string getImei() const; + + protected: + Manager(); + + private: + VConf::Key m_imei; +}; +} // Device +} // Platform +} // WrtPlugins + +#endif // WRTDEVICEAPIS_DEVICE_MANAGER_H_ diff --git a/src/modules/tizen/DEPRACATED/Device/config.cmake b/src/modules/tizen/DEPRACATED/Device/config.cmake new file mode 100644 index 0000000..1a31471 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Device/config.cmake @@ -0,0 +1,21 @@ +get_current_path() + +pkg_search_module(devman REQUIRED devman) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_DEVICE + ${INCLUDES_PLATFORM_IMPLEMENTATION_VCONF} + ${devman_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_DEVICE + ${LIBS_PLATFORM_IMPLEMENTATION_VCONF} + ${devman_LIBRARIES} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_DEVICE + ${CURRENT_PATH}/Manager.cpp + ${SRCS_PLATFORM_IMPLEMENTATION_VCONF} + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Display/Manager.cpp b/src/modules/tizen/DEPRACATED/Display/Manager.cpp new file mode 100644 index 0000000..3bdb2c1 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Display/Manager.cpp @@ -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. + */ +#include "Manager.h" +#include +#include "Screen.h" + +namespace { +const std::size_t NUMBER_OF_AVAILABLE_SCREENS = 1; +const std::size_t INDEX_OF_DEFAULT_SCREEN = 1; +} // anonymous + +namespace WrtPlugins { +namespace Platform { +namespace Display { +Manager& Manager::getInstance() +{ + static Manager instance; + return instance; +} + +Api::Display::IScreen* Manager::getScreen(std::size_t index) const +{ + if (index == 0) { + index = INDEX_OF_DEFAULT_SCREEN; + } + + if (index > NUMBER_OF_AVAILABLE_SCREENS) { + ThrowMsg(Commons::OutOfRangeException, "Screen is not available."); + } + + Screens::iterator it = m_screens.find(index); + if (it == m_screens.end()) { + Api::Display::IScreen* screen = new Screen(index); + m_screens.insert(Screens::value_type(index, screen)); + return screen; + } + return it->second; +} + +std::size_t Manager::getScreensCount() const +{ + return NUMBER_OF_AVAILABLE_SCREENS; +} + +Manager::~Manager() +{ + Screens::iterator it = m_screens.begin(); + for (; it != m_screens.end(); ++it) { + delete it->second; + } +} + +Manager::Manager() +{ +} +} // Display +} // Platform +} // WrtPlugins diff --git a/src/modules/tizen/DEPRACATED/Display/Manager.h b/src/modules/tizen/DEPRACATED/Display/Manager.h new file mode 100644 index 0000000..7180925 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Display/Manager.h @@ -0,0 +1,60 @@ +/* + * 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. + */ +/** + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + */ + +#ifndef WRTDEVICEAPIS_DISPLAY_MANAGER_H_ +#define WRTDEVICEAPIS_DISPLAY_MANAGER_H_ + +#include +#include + +namespace WrtPlugins { +namespace Platform { +namespace Display { +class Manager : public Api::Display::IManager +{ + public: + static Manager& getInstance(); + + public: + ~Manager(); + + /** + * @see WrtPlugins::Api::Display::IManager::getScreen() + */ + Api::Display::IScreen* getScreen(std::size_t index) const; + + /** + * @see WrtPlugins::Api::Display::IManager::getScreensCount() + */ + std::size_t getScreensCount() const; + + protected: + typedef std::map Screens; + + protected: + Manager(); + + protected: + mutable Screens m_screens; ///< Available screen interfaces. +}; +} // Display +} // Platform +} // WrtPlugins + +#endif // WRTDEVICEAPIS_DISPLAY_MANAGER_H_ diff --git a/src/modules/tizen/DEPRACATED/Display/Screen.cpp b/src/modules/tizen/DEPRACATED/Display/Screen.cpp new file mode 100644 index 0000000..214bb6f --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Display/Screen.cpp @@ -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. + */ +#include "Screen.h" +#include +#include +#include +#include +#include + +// TODO: attach to platform event informing about changed size! + +namespace { +const char* COMMAND_XDPYINFO = "xdpyinfo"; +const char* PATTERN_COLOR_DEPTH = "depth of root window:\\s+(\\d+)\\s+planes"; +const char* PATTERN_SIZE = "dimensions:\\s+(\\d+)x(\\d+)"; +} // anonymous + +namespace WrtPlugins { +namespace Platform { +namespace Display { +unsigned short Screen::getColorDepth() const +{ + unsigned short colorDepth = 0; + if (!getXDpyProperty(PATTERN_COLOR_DEPTH, &colorDepth)) { + ThrowMsg(Commons::PlatformException, "Could not read color depth."); + } + return colorDepth; +} + +Dimension Screen::getSize() const +{ + unsigned int width = 0, height = 0; + if (!getXDpyProperty(PATTERN_SIZE, &width, &height)) { + ThrowMsg(Commons::PlatformException, "Could not read size."); + } + return Dimension(width, height); +} + +Dimension Screen::getActualSize() const +{ + unsigned int width = 0, height = 0; + if (!getXDpyProperty(PATTERN_SIZE, &width, &height)) { + ThrowMsg(Commons::PlatformException, "Could not read size."); + } + if (getOrientation() == Api::Display::O_LANDSCAPE) { + std::swap(width, height); + } + return Dimension(width, height); +} + +Api::Display::Orientation Screen::getOrientation() const +{ + appcore_rm rot = APPCORE_RM_UNKNOWN; + if (appcore_get_rotation_state(&rot) != 0) { + ThrowMsg(Commons::PlatformException, "Could not get orientation."); + } + switch (rot) { + case APPCORE_RM_LANDSCAPE_NORMAL: + case APPCORE_RM_LANDSCAPE_REVERSE: + return Api::Display::O_LANDSCAPE; + default: + return Api::Display::O_PORTRAIT; + } +} + +Api::Display::State Screen::getState() const +{ + Try { + int state = m_powerState.getInt(); + switch (state) { + case VCONFKEY_PM_STATE_NORMAL: + return Api::Display::ST_ON; + case VCONFKEY_PM_STATE_LCDDIM: + return Api::Display::ST_DIM; + default: + return Api::Display::ST_OFF; + } + } + Catch(Commons::ConversionException) { + ReThrowMsg(Commons::PlatformException, + "Could not get device's power state."); + } +} + +void Screen::addOnChangeOrientation( + const Api::Display::EventChangeOrientationEmitterPtr& emitter) +{ + m_onChangeOrientation.attach(emitter); + ChangeOrientationEmitters::LockType lock = m_onChangeOrientation.getLock(); + if (m_onChangeOrientation.size() == 1) { + if (appcore_set_rotation_cb(onChangeOrientation, this) != 0) { + ThrowMsg(Commons::PlatformException, + "Could not attach to platform event."); + } + } +} + +void Screen::removeOnChangeOrientation( + Api::Display::EventChangeOrientationEmitter::IdType id) +{ + m_onChangeOrientation.detach(id); + ChangeOrientationEmitters::LockType lock = m_onChangeOrientation.getLock(); + if (m_onChangeOrientation.size() == 0) { + if (appcore_unset_rotation_cb() != 0) { + ThrowMsg(Commons::PlatformException, + "Could not detach from platform event."); + } + } +} + +void Screen::addOnChangeState( + const Api::Display::EventChangeStateEmitterPtr& emitter) +{ + m_onChangeState.attach(emitter); + ChangeStateEmitters::LockType lock = m_onChangeState.getLock(); + if (m_onChangeState.size() == 1) { + m_powerState.attachCallback(onChangeState, this); + } +} + +void Screen::removeOnChangeState( + Api::Display::EventChangeStateEmitter::IdType id) +{ + m_onChangeState.detach(id); + ChangeStateEmitters::LockType lock = m_onChangeState.getLock(); + if (m_onChangeState.size() == 0) { + m_powerState.detachCallback(); + } +} + +Screen::Screen(std::size_t index) : + m_index(index), + m_powerState(VCONFKEY_PM_STATE) +{ +} + +bool Screen::getXDpyProperty(const char* pattern, + const pcrecpp::Arg& arg1, + const pcrecpp::Arg& arg2) +{ + FILE* pipe = popen(COMMAND_XDPYINFO, "r"); + if (pipe == NULL) { + ThrowMsg(Commons::PlatformException, + "Could not initialize pipe to xdpyinfo."); + } + + bool matched = false; + pcrecpp::RE re(pattern); + char line[LINE_MAX] = { 0 }; + while (fgets(line, LINE_MAX, pipe)) { + if (re.PartialMatch(line, arg1, arg2)) { + matched = true; + break; + } + } + pclose(pipe); + + return matched; +} + +void Screen::onChangeState(const VConf::Node* /*node*/, + void* data) +{ + Screen* this_ = static_cast(data); + Api::Display::EventChangeStatePtr event(new Api::Display::EventChangeState()); + Try { + event->setState(this_->getState()); + } + Catch(Commons::PlatformException) { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + } + this_->m_onChangeState.emit(event); +} + +int Screen::onChangeOrientation(appcore_rm rot, + void* data) +{ + Screen* this_ = static_cast(data); + Api::Display::EventChangeOrientationPtr event( + new Api::Display::EventChangeOrientation()); + Try { + event->setOrientation(this_->getOrientation()); + } + Catch(Commons::PlatformException) { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + } + this_->m_onChangeOrientation.emit(event); + //TODO check returned value + return 0; +} +} // Display +} // Platform +} // WrtPlugins + diff --git a/src/modules/tizen/DEPRACATED/Display/Screen.h b/src/modules/tizen/DEPRACATED/Display/Screen.h new file mode 100644 index 0000000..143a66d --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Display/Screen.h @@ -0,0 +1,133 @@ +/* + * 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. + */ +/** + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + */ + +#ifndef WRTDEVICEAPIS_DISPLAY_SCREEN_H_ +#define WRTDEVICEAPIS_DISPLAY_SCREEN_H_ + +#include +#include +#include +#include +#include +#include + +namespace WrtPlugins { +namespace Platform { +namespace Display { +class Manager; + +class Screen : public Api::Display::IScreen +{ + friend class Manager; + + public: + /** + * @see WrtPlugins::Api::Display::IScreen::getColorDepth() + */ + unsigned short getColorDepth() const; + + /** + * @see WrtPlugins::Api::Display::IScreen::getSize() + */ + Dimension getSize() const; + + /** + * @see WrtPlugins::Api::Display::IScreen::getActualSize() + */ + Dimension getActualSize() const; + + /** + * @see WrtPlugins::Api::Display::IScreen::getOrientation() + */ + Api::Display::Orientation getOrientation() const; + + /** + * @see WrtPlugins::Api::Display::IScreen::getState() + */ + Api::Display::State getState() const; + + /** + * @see WrtPlugins::Api::Display::IScreen::addOnChangeOrientation() + */ + void addOnChangeOrientation( + const Api::Display::EventChangeOrientationEmitterPtr& emitter); + + /** + * @see WrtPlugins::Api::Display::IScreen::removeOnChangeOrientation() + */ + void removeOnChangeOrientation( + Api::Display::EventChangeOrientationEmitter::IdType id); + + /** + * @see WrtPlugins::Api::Display::IScreen::addOnChangeState() + */ + void addOnChangeState( + const Api::Display::EventChangeStateEmitterPtr& emitter); + + /** + * @see WrtPlugins::Api::Display::IScreen::removeOnChangeState() + */ + void removeOnChangeState(Api::Display::EventChangeStateEmitter::IdType id); + + protected: + typedef Emitters + ChangeOrientationEmitters; + typedef Emitters ChangeStateEmitters; + + protected: + /** + * Gets data matching specified pattern from output of xdpyinfo program. + * @param pattern Pattern to search for. + * @return Zero or positive value on success, -1 on failure. + */ + static bool getXDpyProperty(const char* pattern, + const pcrecpp::Arg& arg1 = pcrecpp::RE::no_arg, + const pcrecpp::Arg& arg2 = pcrecpp::RE::no_arg); + + /** + * Callback run when device's power state changes. + * @param node Node object (unused). + * @param data User data. + */ + static void onChangeState(const VConf::Node* node, + void* data); + + /** + * Callback run when device's orientation changes. + * @param rot Rotation mode. + * @param data User data. + * @return Error code (?) - not specified in documentation. + */ + static int onChangeOrientation(appcore_rm rot, + void* data); + + protected: + explicit Screen(std::size_t index); + + protected: + std::size_t m_index; ///< Index of the screen. + ChangeOrientationEmitters m_onChangeOrientation; ///< Change orientation emitters. + ChangeStateEmitters m_onChangeState; ///< Change state emitters. + VConf::Key m_powerState; ///< Key for power manager state. +}; +} // Display +} // Platform +} // WrtPlugins + +#endif // WRTDEVICEAPIS_DISPLAY_SCREEN_H_ diff --git a/src/modules/tizen/DEPRACATED/Display/config.cmake b/src/modules/tizen/DEPRACATED/Display/config.cmake new file mode 100644 index 0000000..1911b25 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Display/config.cmake @@ -0,0 +1,25 @@ +get_current_path() + +pkg_search_module(pcrecpp REQUIRED libpcrecpp) +pkg_search_module(appcore REQUIRED appcore-common) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_DISPLAY + ${pcrecpp_INCLUDE_DIRS} + ${appcore_INCLUDE_DIRS} + ${INCLUDES_PLATFORM_IMPLEMENTATION_VCONF} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_DISPLAY + ${pcrecpp_LIBRARIES} + ${appcore_LIBRARIES} + ${LIBS_PLATFORM_IMPLEMENTATION_VCONF} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_DISPLAY + ${CURRENT_PATH}/Manager.cpp + ${CURRENT_PATH}/Screen.cpp + ${SRCS_PLATFORM_IMPLEMENTATION_VCONF} + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/FeatureLoader/FeatureManager.cpp b/src/modules/tizen/DEPRACATED/FeatureLoader/FeatureManager.cpp new file mode 100644 index 0000000..35b08ac --- /dev/null +++ b/src/modules/tizen/DEPRACATED/FeatureLoader/FeatureManager.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ +/* + * @author Bartlomiej Grzelewski + */ + +#include +#include +#include +#include "FeatureManager.h" + +using namespace WrtPlugins::Api; + +namespace WrtPlugins { +namespace Platform { +//static void wrtPlatformCallback(int widgetHandler, JSObjectRef object, void* userParam) +//{ +// FeatureManager::platformCallback(widgetHandler, static_cast(object), userParam); +//} + +void FeatureManager::OnRequestReceived(const Api::EventLoadFeaturePtr &event) +{ + //TODO commented + //EventWrapper *eventWrapper = new EventWrapper(this, event); + LogDebug("Call for dynamic feature: " << event->getFeature().c_str()); + JSCallbackManagerPtr jsCallbackManager = + DPL::StaticPointerCast( + event->getPrivateData()); + /* TODO uncomment - this function _will_ be available in new wrt-engine API */ + LogError("*** CRITICAL wrt_dynamic_feature_request is disable!"); + // wrt_dynamic_feature_request(jsCallbackManager->getContext(), event->getFeature().c_str(), wrtPlatformCallback, eventWrapper); +} + +void FeatureManager::platformCallback(int, + void* object, + void* userParam) +{ + if (object == NULL) { + LogError("Request has been rejected."); + } else { + LogDebug("Request has been approved."); + } + EventWrapper *eventWrapper = static_cast(userParam); + eventWrapper->m_event->setObject(object); + eventWrapper->m_event->setStatus((object == 0) ? false : true); + eventWrapper->m_featureManager->Platform::EventRequestReceiver< + EventLoadFeature>::ManualAnswer(eventWrapper->m_event); + delete eventWrapper; +} +} // namespace Platform +} // namespace WrtPlugins diff --git a/src/modules/tizen/DEPRACATED/FeatureLoader/FeatureManager.h b/src/modules/tizen/DEPRACATED/FeatureLoader/FeatureManager.h new file mode 100644 index 0000000..ffa419a --- /dev/null +++ b/src/modules/tizen/DEPRACATED/FeatureLoader/FeatureManager.h @@ -0,0 +1,63 @@ +/* + * 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 _SLP20_FEATUREMANAGER_H_ +#define _SLP20_FEATUREMANAGER_H_ + +/* + * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) + */ + +#include "API/FeatureLoader/IFeatureManager.h" + +namespace WrtPlugins { +namespace Platform { +class FeatureManager : + public Api::IFeatureManager +{ + public: + FeatureManager() + { + } + virtual ~FeatureManager() + { + } + static void platformCallback(int, + void* object, + void* userParam); + protected: + virtual void OnRequestReceived(const Api::EventLoadFeaturePtr &event); + private: + struct EventWrapper + { + EventWrapper(FeatureManager *featureManager, + const Api::EventLoadFeaturePtr &event) : + m_featureManager(featureManager), + m_event(event) + { + } + + ~EventWrapper() + { + } + + FeatureManager *m_featureManager; + Api::EventLoadFeaturePtr m_event; + }; +}; +} // namespace Platform +} // namespace WrtPlugins + +#endif // _SLP20_FEATUREMANAGER_H_ diff --git a/src/modules/tizen/DEPRACATED/FeatureLoader/config.cmake b/src/modules/tizen/DEPRACATED/FeatureLoader/config.cmake new file mode 100644 index 0000000..2c9325e --- /dev/null +++ b/src/modules/tizen/DEPRACATED/FeatureLoader/config.cmake @@ -0,0 +1,6 @@ +get_current_path() + +set(SRCS_PLATFORM_IMPLEMENTATION_FEATURE_MANAGER + ${CURRENT_PATH}/FeatureManager.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Gallery/Gallery.cpp b/src/modules/tizen/DEPRACATED/Gallery/Gallery.cpp new file mode 100644 index 0000000..5132aec --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Gallery/Gallery.cpp @@ -0,0 +1,279 @@ +/* + * 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 Gallery.cpp + * @author Wojciech Bielawski (w.bielawski@samsung.com) + * @version 0.1 + */ + +#include +#include +#include +#include +#include "Gallery.h" + +using namespace std; +using namespace DPL; +using namespace WrtPlugins::Api::Gallery; +using namespace WrtPlugins::Api::Filesystem; + +namespace WrtPlugins { +namespace Platform { +using namespace Filesystem; + +namespace { +//Map file extension to IMediaItem type +map &createExtToTypeMap() +{ + static map retMap; + retMap["jpg"] = IMediaItem::IMAGE; + retMap["jpeg"] = IMediaItem::IMAGE; + retMap["gif"] = IMediaItem::IMAGE; + retMap["bmp"] = IMediaItem::IMAGE; + retMap["png"] = IMediaItem::IMAGE; + retMap["wav"] = IMediaItem::AUDIO; + retMap["mp3"] = IMediaItem::AUDIO; + retMap["wmv"] = IMediaItem::VIDEO; + retMap["3gp"] = IMediaItem::VIDEO; + return retMap; +} + +//Map file extension to MIME type +map &createExtToMimeMap() +{ + static map retMap; + retMap["jpg"] = "image/jpeg"; + retMap["jpeg"] = "image/jpeg"; + retMap["gif"] = "image/gif"; + retMap["bmp"] = "image/bmp"; + retMap["png"] = "image/png"; + retMap["wav"] = "audio/wav"; + retMap["mp3"] = "audio/mpeg3"; + retMap["wmv"] = "video/x - ms - wmv"; + retMap["3gp"] = "video/3gpp"; + return retMap; +} + +bool compareByFilename(const IMediaItemPtr &lpm, + const IMediaItemPtr &rpm) +{ + return lpm->getFileName().compare(rpm->getFileName()) < 0; +} + +bool compareByFileDate(const IMediaItemPtr &lpm, + const IMediaItemPtr &rpm) +{ + return lpm->getDate() < rpm->getDate(); +} + +bool compareByType(const IMediaItemPtr &lpm, + const IMediaItemPtr &rpm) +{ + return lpm->getType() < rpm->getType(); +} + +class SearchIdObj +{ + unsigned long m_id; + public: + SearchIdObj(unsigned long id) : m_id(id) + { + } + bool operator ()(const IMediaItemPtr &elem) + { + return elem->getId() == m_id; + } +}; +} //private namespace + +map &Gallery::m_extensionToType = createExtToTypeMap(); +map &Gallery::m_extensionToMime = createExtToMimeMap(); + +unsigned int Gallery::getNumberOfItems() const +{ + if (!m_opened) { + Throw(Commons::PlatformWrongStateException); + } + //if gallery is opened m_view always stores an object + return m_view->size(); +} + +std::string Gallery::getName() const +{ + LogDebug("Gallery name: " << m_name); + return m_name; +} + +void Gallery::open() +{ + if (m_opened) { + Throw(Commons::PlatformWrongStateException); + } + m_mediaItems.clear(); + m_lastId = 0; + Path path("/"); + SharedPtr node(Node::resolve(path)); + node->setPermissions(PERM_READ); + searchFiles(node); + //Destroy previous view and store new one + m_view = IMediaItemsSetPtr(new IMediaItemsSet(m_mediaItems)); + m_opened = true; + LogDebug("Gallery contains " << m_mediaItems.size() << " items"); +} + +void Gallery::searchFiles(const SharedPtr &node) +{ + if (Api::Filesystem::NT_FILE == node->getType()) { + string fileName = node->getPath().getName(); + size_t dotPos = fileName.find_last_of("."); + if (dotPos == string::npos) { + //Not supported file + return; + } + string fileExt = fileName.substr(dotPos + 1); + //Check if file has supported type + map::iterator it = m_extensionToMime.find(fileExt); + if (it != m_extensionToMime.end()) { + IMediaItemPtr mediaItem(new IMediaItem()); + mediaItem->setId(getFreeId()); + mediaItem->setFileName(fileName); + mediaItem->setType(m_extensionToType[fileExt]); + mediaItem->setMimeType(m_extensionToMime[fileExt]); + mediaItem->setDate(node->getCreated()); + m_mediaItems.push_back(mediaItem); + } + return; + } + + //else get recurrent on NT_DIRECTORY + NodeList nodes = node->getChildNodes(); + NodeList::iterator it = nodes.begin(), end = nodes.end(); + while (it != end) { + //Warning: '*it' element will be deleted after out of scope (next iteration) + (*it)->setPermissions(PERM_READ); + searchFiles(SharedPtr(*it)); + ++it; + } +} + +unsigned long Gallery::getFreeId() +{ + return ++m_lastId; +} + +bool Gallery::isOpen() const +{ + return m_opened; +} + +void Gallery::close() +{ + if (!m_opened) { + Throw(Commons::PlatformWrongStateException); + } + m_mediaItems.clear(); + m_view.Reset(); + m_lastId = 0; + m_opened = false; +} + +void Gallery::refresh() +{ + if (!m_opened) { + Throw(Commons::PlatformWrongStateException); + } + m_mediaItems.clear(); + m_view->clear(); + m_lastId = 0; + Path path("/"); + SharedPtr node(Node::resolve(path)); + node->setPermissions(PERM_READ); + searchFiles(DynamicPointerCast(node)); + changeView(m_viewProperties); + LogDebug("Gallery contains " << m_mediaItems.size() << " items"); +} + +void Gallery::changeView(const IViewProperties &props) +{ + if (!m_opened) { + Throw(Commons::PlatformWrongStateException); + } + m_viewProperties = props; + m_view->clear(); + + //Copy elements within date period to view struct + for (IMediaItemsSetIterator it = m_mediaItems.begin(), + end = m_mediaItems.end(); + it != end; ++it) { + if ((m_viewProperties.getStartDate() <= (*it)->getDate()) && + ((*it)->getDate() <= m_viewProperties.getEndDate())) { + m_view->push_back(*it); + } + } + + //sort elements + IViewProperties::SortOrder sortOrder[] = { + m_viewProperties.getSecondarySortOrder(), + m_viewProperties.getPrimarySortOrder() + }; + for (size_t i = 0; i < (sizeof(sortOrder) / sizeof(sortOrder[0])); ++i) { + switch (sortOrder[i]) { + case IViewProperties::BY_FILEDATE: + m_view->sort(compareByFileDate); + break; + case IViewProperties::BY_FILENAME: + m_view->sort(compareByFilename); + break; + case IViewProperties::BY_TYPE: + m_view->sort(compareByType); + break; + default: + break; + } + } + + //reverse order if necessary + if (IViewProperties::DESCENDING == m_viewProperties.getSortOrder()) { + m_view->reverse(); + } + LogDebug("View contains " << m_view->size() << " items"); +} + +const IMediaItemsSetPtr Gallery::getMediaItems() const +{ + if (!m_opened) { + Throw(Commons::PlatformWrongStateException); + } + LogError("View contains " << m_view->size() << " entries"); + return m_view; +} + +const IMediaItemPtr Gallery::getMediaItemById(unsigned long id) const +{ + if (!m_opened) { + Throw(Commons::PlatformWrongStateException); + } + SearchIdObj searchObj(id); + IMediaItemsSetConstIterator elem = find_if( + m_mediaItems.begin(), m_mediaItems.end(), searchObj); + if (elem == m_mediaItems.end()) { + Throw(Commons::InvalidArgumentException); + } + return *elem; +} +} +} diff --git a/src/modules/tizen/DEPRACATED/Gallery/Gallery.h b/src/modules/tizen/DEPRACATED/Gallery/Gallery.h new file mode 100644 index 0000000..122e1db --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Gallery/Gallery.h @@ -0,0 +1,152 @@ +/* + * 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 WRTDEVICEAPIS_PLATFORM_GALLERY_GALLERY_H_ +#define WRTDEVICEAPIS_PLATFORM_GALLERY_GALLERY_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace WrtPlugins { +namespace Platform { +class Gallery : public Api::Gallery::IGallery +{ + /* + * Gallery name + */ + std::string m_name; + /* + * Stores state of the gallery + */ + bool m_opened; + /* + * Last ID field is used to give for an MediaItem unique ID + */ + unsigned long m_lastId; + /* + * Set of all media items found on device + */ + Api::Gallery::IMediaItemsSet m_mediaItems; + /* + * Set of media items selected by changeView method + */ + Api::Gallery::IMediaItemsSetPtr m_view; + /* + * Properties to manage view of media items + */ + Api::Gallery::IViewProperties m_viewProperties; + + /* + * Map to convert from file extension to media type + */ + static std::map &m_extensionToType; + /* + * Map to convert from file extension to MIME type + */ + static std::map &m_extensionToMime; + + /* + * Recurrent search files trough whole tree exposed by file manager + * \param node - node to start from + * \exception - Filesystem related + */ + void searchFiles(const DPL::SharedPtr &node); + /* + * Gets free ID + */ + unsigned long getFreeId(); + + public: + /* + * Constructor of the gallery + * \param name - the gallery name + */ + Gallery(const std::string &name) : + IGallery(), + m_name(name), + m_opened(false), + m_lastId(0) + { + } + /* + * Destructor of the gallery + */ + virtual ~Gallery() + { + } + + /* + * Gets number of media items selected by current view + * \exception Commons::PlatformWrongStateException when gallery not open + * \return number of media items + */ + virtual unsigned int getNumberOfItems() const; + /* + * Gets name of the gallery + * \return name of the gallery + */ + virtual std::string getName() const; + /* + * Opens the gallery + * \exception Commons::PlatformWrongStateException when gallery is already open + */ + virtual void open(); + /* Gets the current state of the gallery + * \return true if the gallery is open + */ + virtual bool isOpen() const; + /* + * Closes the gallery + * \exception Commons::PlatformWrongStateException when gallery is not open + */ + virtual void close(); + /* + * Refreshes files in the gallery + * \exception Commons::PlatformWrongStateException when gallery is not open + */ + virtual void refresh(); + /* + * Changes current view with given properties + * \param props - view properties + * \exception Commons::PlatformWrongStateException when gallery is not open + */ + virtual void changeView(const Api::Gallery::IViewProperties &props); + /* + * Gets media items selected by current view + * \return set of media items + * \exception Commons::PlatformWrongStateException when gallery is not open + */ + virtual const Api::Gallery::IMediaItemsSetPtr getMediaItems() const; + /* + * Gets specified media item + * \param id of wanted item + * \return an media item + * \exception Commons::PlatformWrongStateException when gallery is not open + */ + virtual const Api::Gallery::IMediaItemPtr getMediaItemById(unsigned long id) + const; +}; +} // Platform +} // WrtPlugins + +#endif // WRTDEVICEAPIS_PLATFORM_GALLERY_GALLERY_H_ diff --git a/src/modules/tizen/DEPRACATED/Gallery/GalleryRequestManager.cpp b/src/modules/tizen/DEPRACATED/Gallery/GalleryRequestManager.cpp new file mode 100644 index 0000000..eec5a02 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Gallery/GalleryRequestManager.cpp @@ -0,0 +1,147 @@ +/* + * 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 GalleryRequestManager.cpp + * @author Wojciech Bielawski (w.bielawski@samsung.com) + * @version 0.1 + */ + +#include +#include +#include "GalleryRequestManager.h" +#include "Gallery.h" + +using namespace WrtPlugins::Commons; +using namespace WrtPlugins::Api::Gallery; + +namespace WrtPlugins { +namespace Platform { +void GalleryRequestManager::OnRequestReceived( + const IEventGetGalleriesPtr &event) +{ + IGallerySetPtr galleries(new IGallerySet()); + galleries->push_back(IGalleryPtr(new Gallery("Device"))); + event->setGalleries(galleries); + event->setResult(ExceptionCodes::None); +} + +void GalleryRequestManager::OnRequestReceived(const IEventOpenPtr &event) +{ + Try + { + IGalleryPtr gallery(event->getGallery()); + gallery->open(); + event->setResult(ExceptionCodes::None); + } + Catch(Exception) + { + LogError("Gallery exception message: " << + _rethrown_exception.GetMessage() << + " Code: " << _rethrown_exception.getCode()); + event->setResult(_rethrown_exception.getCode()); + } +} + +void GalleryRequestManager::OnRequestReceived(const IEventRefreshPtr &event) +{ + Try + { + IGalleryPtr gallery(event->getGallery()); + gallery->refresh(); + event->setResult(ExceptionCodes::None); + } + Catch(Exception) + { + LogError("Gallery exception message: " << + _rethrown_exception.GetMessage() << + " Code: " << _rethrown_exception.getCode()); + event->setResult(_rethrown_exception.getCode()); + } +} + +void GalleryRequestManager::OnRequestReceived(const IEventClosePtr &event) +{ + Try + { + IGalleryPtr gallery(event->getGallery()); + gallery->close(); + event->setResult(ExceptionCodes::None); + } + Catch(Exception) + { + LogError("Gallery exception message: " << + _rethrown_exception.GetMessage() << + " Code: " << _rethrown_exception.getCode()); + event->setResult(_rethrown_exception.getCode()); + } +} + +void GalleryRequestManager::OnRequestReceived(const IEventChangeViewPtr &event) +{ + Try + { + IGalleryPtr gallery(event->getGallery()); + gallery->changeView(event->getProperties()); + event->setResult(ExceptionCodes::None); + } + Catch(Exception) + { + LogError("Gallery exception message: " << + _rethrown_exception.GetMessage() << + " Code: " << _rethrown_exception.getCode()); + event->setResult(_rethrown_exception.getCode()); + } +} + +void GalleryRequestManager::OnRequestReceived( + const IEventGetMediaItemsPtr &event) +{ + Try + { + IGalleryPtr gallery(event->getGallery()); + IMediaItemsSetPtr mediaItems(gallery->getMediaItems()); + event->setMediaItems(mediaItems); + event->setResult(ExceptionCodes::None); + } + Catch(Exception) + { + LogError("Gallery exception message: " << + _rethrown_exception.GetMessage() << + " Code: " << _rethrown_exception.getCode()); + event->setResult(_rethrown_exception.getCode()); + } +} + +void GalleryRequestManager::OnRequestReceived( + const IEventGetMediaItemByIdPtr &event) +{ + Try + { + IGalleryPtr gallery(event->getGallery()); + IMediaItemPtr mediaItem(gallery->getMediaItemById(event->getId())); + event->setMediaItem(mediaItem); + event->setResult(ExceptionCodes::None); + } + Catch(Exception) + { + LogError("Gallery exception message: " << + _rethrown_exception.GetMessage() << + " Code: " << _rethrown_exception.getCode()); + event->setResult(_rethrown_exception.getCode()); + } +} +} +} diff --git a/src/modules/tizen/DEPRACATED/Gallery/GalleryRequestManager.h b/src/modules/tizen/DEPRACATED/Gallery/GalleryRequestManager.h new file mode 100644 index 0000000..da344b1 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Gallery/GalleryRequestManager.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 GalleryRequestManager.h + * @author Wojciech Bielawski (w.bielawski@samsung.com) + * @version 0.1 + */ + +#ifndef WRT_PLUGINS_GALLERYREQUESTMANAGER_H_ +#define WRT_PLUGINS_GALLERYREQUESTMANAGER_H_ + +#include + +namespace WrtPlugins { +namespace Platform { +class GalleryRequestManager : public Api::Gallery::IGalleryRequestManager +{ + public: + + protected: + virtual void OnRequestReceived( + const Api::Gallery::IEventGetGalleriesPtr &event); + virtual void OnRequestReceived(const Api::Gallery::IEventOpenPtr &event); + virtual void OnRequestReceived(const Api::Gallery::IEventRefreshPtr &event); + virtual void OnRequestReceived(const Api::Gallery::IEventClosePtr &event); + virtual void OnRequestReceived( + const Api::Gallery::IEventChangeViewPtr &event); + virtual void OnRequestReceived( + const Api::Gallery::IEventGetMediaItemsPtr &event); + virtual void OnRequestReceived( + const Api::Gallery::IEventGetMediaItemByIdPtr &event); +}; +} +} + +#endif //WRT_PLUGINS_GALLERYREQUESTMANAGER_H_ diff --git a/src/modules/tizen/DEPRACATED/Gallery/config.cmake b/src/modules/tizen/DEPRACATED/Gallery/config.cmake new file mode 100644 index 0000000..e6f7e22 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Gallery/config.cmake @@ -0,0 +1,19 @@ +get_current_path() + +pkg_search_module(libpcrecpp REQUIRED libpcrecpp) + +set(SRCS_PLATFORM_IMPLEMENTATION_GALLERY + ${CURRENT_PATH}/Gallery.cpp + ${CURRENT_PATH}/GalleryRequestManager.cpp + PARENT_SCOPE +) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_GALLERY + ${libpcrecpp_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_GALLERY + ${libpcrecpp_LIBRARIES} + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Geolocation/Geolocation.cpp b/src/modules/tizen/DEPRACATED/Geolocation/Geolocation.cpp new file mode 100644 index 0000000..53a94c2 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Geolocation/Geolocation.cpp @@ -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. + */ +/* + * @author Wojciech Bielawski (w.bielawski@samsung.com) + */ + +#include "Geolocation.h" +#include +#include +#include + +using namespace WrtPlugins::Api::Geolocation; +using namespace DPL; + +namespace WrtPlugins { +namespace Platform { +namespace Geolocation { +namespace { +static void positionChangedCallback(LocationObject *obj, + guint type, + gpointer data, + gpointer accuracy, + Geolocation* this_) +{ + if (this_) { + this_->positionHasChanged(obj, type, data, accuracy); + } else { + LogError("Callback private data is NULL."); + } +} +} //private namespace + +Geolocation::Geolocation() : + m_location(NULL), + m_currentLocationMethod(METHOD_GPS), + m_initialized(false) +{ + LogDebug("Enter"); +} + +Geolocation::~Geolocation() +{ + LogDebug("Enter"); + stop(); +} + +void Geolocation::getCurrentPosition(const EventGetCurrentPositionPtr& event) +{ + initialize(); + EventRequestReceiver::PostRequest(event); +} + +void Geolocation::OnRequestReceived(const EventGetCurrentPositionPtr& event) +{ + LogDebug("Entered"); + gint ret; + LocationPosition* pos = NULL; + LocationAccuracy* acc = NULL; + ret = location_get_position(m_location, &pos, &acc); + if (LOCATION_ERROR_NONE != ret) { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + return; + } else if (LOCATION_ACCURACY_LEVEL_NONE != acc->level) { + location_position_free(pos); + location_accuracy_free(acc); + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + return; + } + event->setTimestamp(static_cast(pos->timestamp)); + event->setLatitude(static_cast(pos->latitude)); + event->setLongitude(static_cast(pos->longitude)); + event->setAltitude(static_cast(pos->altitude)); + event->setAccuracy(static_cast(acc->horizontal_accuracy)); + event->setAltitudeAccuracy(static_cast(acc->vertical_accuracy)); + location_position_free(pos); + location_accuracy_free(acc); + + LocationVelocity* velocity = NULL; + ret = location_get_velocity(m_location, &velocity, &acc); + if (LOCATION_ERROR_NONE != ret) { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + return; + } else if (LOCATION_ACCURACY_LEVEL_NONE != acc->level) { + location_velocity_free(velocity); + location_accuracy_free(acc); + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + return; + } + event->setSpeed(static_cast(velocity->speed)); + event->setDirection(static_cast(velocity->direction)); + event->setAltitudeSpeed(static_cast(velocity->climb)); + event->setMethod(m_currentLocationMethod); + location_velocity_free(velocity); + location_accuracy_free(acc); +} + +long Geolocation::watchPosition(const EventPositionChangedEmitterPtr& emitter, + long timeout, + long maximumAge, + bool highAccuracy) +{ + initialize(); + m_positionEmitters.attach(emitter); + return static_cast(emitter->getId()); +} + +void Geolocation::clearWatch(EventPositionChangedEmitter::IdType id) +{ + m_positionEmitters.detach(id); +} + +void Geolocation::positionHasChanged(LocationObject *obj, + guint type, + gpointer data, + gpointer accuracy) +{ + LogDebug("Enter"); + if (POSITION_UPDATED != type) { + //nothing to do + return; + } + + //convert data from platform to API form + LocationPosition *pos = static_cast(data); + LocationAccuracy *acc = static_cast(accuracy); + LocationVelocity* velocity = NULL; + + EventPositionChangedPtr event(new EventPositionChanged()); + PositionProperties props; + props.altitude = static_cast(pos->altitude); + props.latitude = static_cast(pos->latitude); + props.longitude = static_cast(pos->longitude); + props.timestamp = static_cast(pos->timestamp); + props.accuracy = static_cast(acc->horizontal_accuracy); + props.altitudeAccuracy = static_cast(acc->vertical_accuracy); + + gint ret = location_get_velocity(m_location, &velocity, &acc); + if (LOCATION_ERROR_NONE != ret) { + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + return; + } else if (LOCATION_ACCURACY_LEVEL_NONE != acc->level) { + location_velocity_free(velocity); + location_accuracy_free(acc); + event->setExceptionCode(Commons::ExceptionCodes::PlatformException); + return; + } + props.speed = static_cast(velocity->speed); + props.direction = static_cast(velocity->direction); + props.altitudeSpeed = static_cast(velocity->climb); + location_velocity_free(velocity); + location_accuracy_free(acc); + + event->setPositionProperties(props); + m_positionEmitters.emit(event); +} + +void Geolocation::changeLocationMethod(ApiLocationMethod method) +{ + LogDebug("Enter"); + if (method != m_currentLocationMethod) { + m_currentLocationMethod = method; + if (m_location) { + restart(); + } + } +} + +void Geolocation::initialize() +{ + LogDebug("ENTER"); + if (!m_initialized) { + DPL::Mutex::ScopedLock lock(&m_initializationMutex); + if (!m_initialized) { + if (LOCATION_ERROR_NONE != location_init()) { + ThrowMsg(Commons::PlatformException, + "Couldn't init location module."); + } + m_initialized = true; + start(); + } + } +} + +void Geolocation::restart() +{ + stop(); + start(); +} + +void Geolocation::start() +{ + LogDebug("ENTER"); + assert(m_initialized && "Geolocation has not been initialized."); + if (m_location) { + return; + } + + m_location = location_new(convertMethodToPlatform(m_currentLocationMethod)); //may return NULL + if (NULL == m_location) { + ThrowMsg(Commons::PlatformException, + "Couldn't create new location object."); + } + + if (LOCATION_ERROR_NONE != location_start(m_location)) { + location_free(m_location); + m_location = NULL; + ThrowMsg(Commons::PlatformException, "Couldn't start localizing."); + } + m_signalId = g_signal_connect(m_location, "service-updated", + G_CALLBACK(positionChangedCallback), this); +} + +void Geolocation::stop() +{ + LogDebug("ENTER"); + if (!m_initialized || !m_location) { + return; + } + + g_signal_handler_disconnect(m_location, m_signalId); + if (LOCATION_ERROR_NONE != location_stop(m_location)) { + ThrowMsg(Commons::PlatformException, "Couldn't stop location object."); + } + if (LOCATION_ERROR_NONE != location_free(m_location)) { + ThrowMsg(Commons::PlatformException, "Couldn't free location module."); + } + m_location = NULL; +} + +LocationMethod Geolocation::convertMethodToPlatform(ApiLocationMethod method) +const +{ + switch (method) { + case METHOD_GPS: + return LOCATION_METHOD_GPS; + case METHOD_AGPS: + return LOCATION_METHOD_HYBRID; + case METHOD_CPS: + return LOCATION_METHOD_CPS; + case METHOD_IPS: + return LOCATION_METHOD_IPS; + case METHOD_WPS: + return LOCATION_METHOD_WPS; + case METHOD_BEST: + return LOCATION_METHOD_HYBRID; + } + LogError("Unknown location method"); + return LOCATION_METHOD_HYBRID; +} +} +} +} diff --git a/src/modules/tizen/DEPRACATED/Geolocation/Geolocation.h b/src/modules/tizen/DEPRACATED/Geolocation/Geolocation.h new file mode 100644 index 0000000..b13bcc5 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Geolocation/Geolocation.h @@ -0,0 +1,105 @@ +/* + * 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. + */ +/* + * @author Wojciech Bielawski (w.bielawski@samsung.com) + * @version 0.1 + * @brief + */ + +#ifndef WRTDEVICEAPIS_PLATFORM_GEOLOCATION_H_ +#define WRTDEVICEAPIS_PLATFORM_GEOLOCATION_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace WrtPlugins { +namespace Platform { +namespace Geolocation { +class Geolocation : public Api::Geolocation::IGeolocation +{ + LocationObject *m_location; + gulong m_signalId; + Api::Geolocation::IGeolocation::ApiLocationMethod m_currentLocationMethod; + + friend class WrtPlugins::Api::Geolocation::GeolocationFactory; + + public: + virtual ~Geolocation(); + + /** + * @See: IGelocation::getCurrentPosition + */ + virtual void getCurrentPosition( + const Api::Geolocation::EventGetCurrentPositionPtr& event); + + /** + * @See: IGelocation::watchPosition + */ + virtual long watchPosition( + const Api::Geolocation::EventPositionChangedEmitterPtr& emitter, + long timeout, + long maximumAge, + bool highAccuracy); + + /** + * @See: IGelocation::clearWatch + */ + virtual void clearWatch( + Api::Geolocation::EventPositionChangedEmitter::IdType id); + + /** + * @See: IGelocation::changeLocationMethod + */ + virtual void changeLocationMethod(ApiLocationMethod method); + + /** + * Method to run from platform's callback function + */ + void positionHasChanged(LocationObject *obj, + guint type, + gpointer data, + gpointer accuracy); + + protected: + Geolocation(); + virtual void OnRequestReceived( + const Api::Geolocation::EventGetCurrentPositionPtr& event); + + private: + typedef Emitters + PositionChangedEmitters; + + void initialize(); + void start(); + void stop(); + void restart(); + LocationMethod convertMethodToPlatform(ApiLocationMethod method) const; + + PositionChangedEmitters m_positionEmitters; + DPL::Mutex m_initializationMutex; + bool m_initialized; +}; +} +} +} + +#endif /* WRTDEVICEAPIS_PLATFORM_GEOLOCATION_H_ */ diff --git a/src/modules/tizen/DEPRACATED/Geolocation/config.cmake b/src/modules/tizen/DEPRACATED/Geolocation/config.cmake new file mode 100644 index 0000000..d952110 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Geolocation/config.cmake @@ -0,0 +1,21 @@ +get_current_path() + +pkg_search_module(location REQUIRED location) +pkg_search_module(glib REQUIRED glib-2.0) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_GEOLOCATION + ${location_INCLUDE_DIRS} + ${glib_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_GEOLOCATION + ${location_LIBRARIES} + ${glib_LIBRARIES} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_GEOLOCATION + ${CURRENT_PATH}/Geolocation.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Memory/Manager.cpp b/src/modules/tizen/DEPRACATED/Memory/Manager.cpp new file mode 100644 index 0000000..2bde62d --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Memory/Manager.cpp @@ -0,0 +1,80 @@ +/* + * 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 "Manager.h" + +namespace { +const char* MEMINFO_FILE = "/proc/meminfo"; +const char* MEMORY_TOTAL_PATTERN = "^MemTotal:\\s+(\\d+)\\s*kB$"; +const char* MEMORY_FREE_PATTERN = "^MemFree:\\s+(\\d+)\\s*kB$"; +} + +namespace WrtPlugins { +namespace Platform { +namespace Memory { +Manager& Manager::getInstance() +{ + static Manager instance; + return instance; +} + +unsigned long Manager::getTotal() const +{ + return getMeminfoValue(MEMORY_TOTAL_PATTERN); +} + +unsigned long Manager::getFree() const +{ + return getMeminfoValue(MEMORY_FREE_PATTERN); +} + +Manager::Manager() +{ +} + +unsigned long Manager::getMeminfoValue(const char* pattern) const +{ + assert(pattern && "Pattern not set."); + + std::ifstream file(MEMINFO_FILE); + if (!file) { + ThrowMsg(Commons::PlatformException, "Memory info file not found."); + } + + unsigned long result = 0; + bool matched = false; + std::string line; + while ((std::getline(file, line).rdstate() & + (std::ifstream::failbit | std::ifstream::eofbit)) == 0) { + if (pcrecpp::RE(pattern).FullMatch(line, &result)) { + matched = true; + break; + } + } + file.close(); + + if (!matched) { + ThrowMsg(Commons::UnsupportedException, "Total memory data not found."); + } + + return result; +} +} // Memory +} // Platform +} // WrtPlugins diff --git a/src/modules/tizen/DEPRACATED/Memory/Manager.h b/src/modules/tizen/DEPRACATED/Memory/Manager.h new file mode 100644 index 0000000..a40608c --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Memory/Manager.h @@ -0,0 +1,50 @@ +/* + * 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 WRTDEVICEAPIS_MEMORY_MANAGER_H_ +#define WRTDEVICEAPIS_MEMORY_MANAGER_H_ + +#include + +namespace WrtPlugins { +namespace Platform { +namespace Memory { +class Manager : public Api::Memory::IManager +{ + public: + static Manager& getInstance(); + + public: + unsigned long getTotal() const; + unsigned long getFree() const; + + private: + Manager(); + + /** + * Reads value from meminfo file looking it up using specified regex pattern. + * Function matches each (whole!) line against specified pattern. + * @param pattern Perl-like regular expresion used to search through meminfo. + * @return Found value. + * @throw PlatformException If could not find meminfo file. + * @throw UnsupportedException If pattern didn't match any line in meminfo file. + */ + unsigned long getMeminfoValue(const char* pattern) const; +}; +} // Memory +} // Platform +} // WrtPlugins + +#endif /* WRTDEVICEAPIS_MEMORY_MANAGER_H_ */ diff --git a/src/modules/tizen/DEPRACATED/Memory/config.cmake b/src/modules/tizen/DEPRACATED/Memory/config.cmake new file mode 100644 index 0000000..7d9157a --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Memory/config.cmake @@ -0,0 +1,18 @@ +get_current_path() + +pkg_search_module(pcrecpp REQUIRED libpcrecpp) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_MEMORY + ${pcrecpp_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_MEMORY + ${pcrecpp_LIBRARIES} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_MEMORY + ${CURRENT_PATH}/Manager.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/System/Date.cpp b/src/modules/tizen/DEPRACATED/System/Date.cpp new file mode 100644 index 0000000..308de72 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/System/Date.cpp @@ -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. + */ +#include "Date.h" +#include +#include + +namespace { +const std::size_t MAX_BUFFER_SIZE = 80; +} // anonymous + +namespace WrtPlugins { +namespace Platform { +namespace System { +Api::System::IDate::Format Date::m_defualtFormat = "%c"; + +Date::Date() +{ + m_timestamp = time(NULL); +} + +std::string Date::toString() const +{ + return toString(m_defualtFormat); +} + +std::string Date::toString(const Format& format) const +{ + if (format.empty()) { + ThrowMsg(Commons::PlatformException, "Format is not set."); + } + + char buffer[MAX_BUFFER_SIZE] = { 0 }; + struct tm* tm = std::localtime(&m_timestamp); + if (std::strftime(buffer, MAX_BUFFER_SIZE, format.c_str(), tm) == 0) { + ThrowMsg(Commons::PlatformException, "Could not get date string."); + } + + return buffer; +} +} // System +} // Platform +} // WrtPlugins diff --git a/src/modules/tizen/DEPRACATED/System/Date.h b/src/modules/tizen/DEPRACATED/System/Date.h new file mode 100644 index 0000000..8097694 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/System/Date.h @@ -0,0 +1,54 @@ +/* + * 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. + */ +/** + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + */ + +#ifndef WRTDEVICEAPIS_SYSTEM_DATE_H_ +#define WRTDEVICEAPIS_SYSTEM_DATE_H_ + +#include +#include + +namespace WrtPlugins { +namespace Platform { +namespace System { +class Date : public Api::System::IDate +{ + public: + Date(); + + /** + * @see WrtPlugins::Api::System::IDate::toString() + */ + std::string toString() const; + + /** + * @see WrtPlugins::Api::System::IDate::toString() + */ + std::string toString(const Format& format) const; + + protected: + static Format m_defualtFormat; ///< Default format for to string conversion. + + protected: + std::time_t m_timestamp; ///< Timestamp, number of seconds since UNIX epoch. +}; +} // System +} // Platform +} // WrtPlugins + +#endif // WRTDEVICEAPIS_SYSTEM_DATE_H_ diff --git a/src/modules/tizen/DEPRACATED/System/Environment.cpp b/src/modules/tizen/DEPRACATED/System/Environment.cpp new file mode 100644 index 0000000..b75dfa9 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/System/Environment.cpp @@ -0,0 +1,128 @@ +/* + * 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 "Environment.h" +#include +#include +#include +#include +extern "C" { + #include +} +#include +#include +#include + +namespace { +const char* VARIABLE_LANGUAGE_NAME = "LANG"; +const char* VENDOR_NAME = "Samsung"; +const char* FILE_INFO_INI = "/etc/info.ini"; +const char* FILE_CPUINFO = "/proc/cpuinfo"; +const char* PATTERN_CPUINFO_HARDWARE = "^Hardware\\s*:\\s+(\\w+)\\s*$"; +} // anonymous + +namespace WrtPlugins { +namespace Platform { +namespace System { +// TODO: Most of those values (if not any) doesn't have to be recalculated every +// time someone request them. Optimalization could be introduced to do it +// only once, e.g. on first request. + +Environment& Environment::getInstance() +{ + static Environment instance; + return instance; +} + +std::string Environment::getLanguage() const +{ + return getVariable(VARIABLE_LANGUAGE_NAME); +} + +std::string Environment::getOsVersion() const +{ + struct utsname buf; + if (uname(&buf) != 0) { + ThrowMsg(Commons::PlatformException, "Could not get uname data."); + } + return buf.sysname; +} + +std::string Environment::getSoftwareVersion() const +{ + dictionary* dict = iniparser_load(FILE_INFO_INI); + if (dict == NULL) { + ThrowMsg(Commons::PlatformException, "Could not get SW version."); + } + char* major = + iniparser_getstring(dict, ("Version:Major"), const_cast("")); + + const char* minor = + iniparser_getstring(dict, "Version:Minor", const_cast("")); + + std::stringstream ss; + ss << major; + if ((*major != '\0') && (*minor != '\0')) { + ss << "-"; + } + ss << minor; + iniparser_freedict(dict); + + return ss.str(); +} + +std::string Environment::getHardwareName() const +{ + FILE* file = fopen(FILE_CPUINFO, "r"); + if (file == NULL) { + ThrowMsg(Commons::UnsupportedException, "Could not open cpuinfo file."); + } + + std::string result; + char line[LINE_MAX] = { 0 }; + pcrecpp::RE re(PATTERN_CPUINFO_HARDWARE); + while (fgets(line, LINE_MAX, file) && !re.FullMatch(line, &result)) { + } + fclose(file); + + if (result.empty()) { + ThrowMsg(Commons::UnsupportedException, "Hardware name not found."); + } + + return result; +} + +std::string Environment::getVendorName() const +{ + return VENDOR_NAME; +} + +std::string Environment::getVariable(const char* name) +{ + char* value = getenv(name); + if (value == NULL) { + std::stringstream ss; + ss << "Could not read variable " << name << "."; + ThrowMsg(Commons::PlatformException, ss.str()); + } + return value; +} + +Environment::Environment() +{ +} +} // System +} // Platform +} // WrtPlugins diff --git a/src/modules/tizen/DEPRACATED/System/Environment.h b/src/modules/tizen/DEPRACATED/System/Environment.h new file mode 100644 index 0000000..a135e96 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/System/Environment.h @@ -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. + */ +/** + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + */ + +#ifndef WRTDEVICEAPIS_SYSTEM_ENVIRONMENT_H_ +#define WRTDEVICEAPIS_SYSTEM_ENVIRONMENT_H_ + +#include + +namespace WrtPlugins { +namespace Platform { +namespace System { +class Environment : public Api::System::IEnvironment +{ + public: + static Environment& getInstance(); + + public: + /** + * @see WrtPlugins::Api::System::IEnvironment::getLanguage() + */ + std::string getLanguage() const; + + /** + * @see WrtPlugins::Api::System::IEnvironment::getOsVersion() + */ + std::string getOsVersion() const; + + /** + * @see WrtPlugins::Api::System::IEnvironment::getSoftwareVersion() + */ + std::string getSoftwareVersion() const; + + /** + * @see WrtPlugins::Api::System::IEnvironment::getHardwareName() + */ + std::string getHardwareName() const; + + /** + * @see WrtPlugins::Api::System::IEnvironment::getVendorName() + */ + std::string getVendorName() const; + + protected: + /** + * Gets value of specified environment variable. + * @param name Name of the variable. + * @return Value of the variable. + * @throw PlatformException If specified variable doesn't exist. + */ + static std::string getVariable(const char* name); + + protected: + Environment(); +}; +} // System +} // Platform +} // WrtPlugins + +#endif // WRTDEVICEAPIS_SYSTEM_ENVIRONMENT_H_ diff --git a/src/modules/tizen/DEPRACATED/System/config.cmake b/src/modules/tizen/DEPRACATED/System/config.cmake new file mode 100644 index 0000000..5185d77 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/System/config.cmake @@ -0,0 +1,19 @@ +get_current_path() + +pkg_search_module(iniparser REQUIRED iniparser) + +set(INCLUDES_PLATFORM_IMPLEMENTATION_SYSTEM + ${iniparser_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_SYSTEM + ${iniparser_LIBRARIES} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_SYSTEM + ${CURRENT_PATH}/Environment.cpp + ${CURRENT_PATH}/Date.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/Telephony/LogEntryWrapper.cpp b/src/modules/tizen/DEPRACATED/Telephony/LogEntryWrapper.cpp new file mode 100644 index 0000000..7d8bd57 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Telephony/LogEntryWrapper.cpp @@ -0,0 +1,143 @@ +/* + * 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 LogEntryWrapper.cpp + * @author Lukasz Marek (l.marek@samsung.com) + * @version 0.2 + */ + +#include +#include +#include +#include "LogEntryWrapper.h" +#include "commons/Exception.h" + +using namespace WrtPlugins::Api; + +namespace WrtPlugins { +namespace Platform { +LogEntryWrapper::LogEntryWrapper(CTSvalue *log) : + m_logEntry(new LogEntry()) +{ + LogDebug("entered"); + convertPlatformStructToAbstractStruct(log); +} + +LogEntryWrapper::~LogEntryWrapper() +{ + LogDebug("entered"); +} + +bool LogEntryWrapper::matchFilters(const LogFilterPtr &filter) +{ + LogDebug("entered"); + if (!m_logEntry) { + Throw(WrtPlugins::Commons::NullPointerException); + } + if (!filter) { + return true; + } + if (filter->getIdIsSet() && filter->getIdFilter() != m_logEntry->getId()) { + return false; + } + if (filter->getStartTimeIsSet() && + (filter->getStartTimeMinFilter() > m_logEntry->getStartTime() || + filter->getStartTimeMaxFilter() < m_logEntry->getStartTime())) { + return false; + } + if (filter->getDurationIsSet() && + (filter->getDurationMinFilter() > m_logEntry->getDuration() || + filter->getDurationMaxFilter() < m_logEntry->getDuration())) { + return false; + } + if (filter->getPhoneNumberIsSet() && + !pcrecpp::RE(filter->getPhoneNumberFilter()).FullMatch(m_logEntry-> + getPhoneNumber())) + { + return false; + } + if (filter->getDescriptionIsSet() && + !pcrecpp::RE(filter->getDescriptionFilter()).FullMatch(m_logEntry-> + getDescription())) + { + return false; + } + if (filter->getFolderIsSet() && + !filter->checkIfFolderIsSet(m_logEntry->getFolder())) { + return false; + } else if (m_logEntry->getFolder() == LogEntry::INVALID_FOLDER) { + return false; + } + return true; +} + +bool LogEntryWrapper::convertPlatformStructToAbstractStruct(CTSvalue *log) +{ + LogDebug("entered"); + if (!m_logEntry) { + return false; + } + if (!log) { + return true; + } + const char *charVal = + contacts_svc_value_get_str(log, CTS_LIST_PLOG_NUMBER_STR); + if (charVal) { + LogDebug("phone number " << charVal); + m_logEntry->setPhoneNumber(charVal); + } + charVal = contacts_svc_value_get_str(log, CTS_LIST_PLOG_SHORTMSG_STR); + if (charVal) { + m_logEntry->setDescription(charVal); + } + m_logEntry->setDuration( + contacts_svc_value_get_int(log, CTS_LIST_PLOG_DURATION_INT)); + LogDebug("id " << + contacts_svc_value_get_int(log, CTS_LIST_PLOG_DURATION_INT)); + m_logEntry->setStartTime( + contacts_svc_value_get_int(log, CTS_LIST_PLOG_LOG_TIME_INT)); + m_logEntry->setId( + contacts_svc_value_get_int(log, CTS_LIST_PLOG_ID_INT)); + LogDebug("id " << contacts_svc_value_get_int(log, CTS_LIST_PLOG_ID_INT)); + switch (contacts_svc_value_get_int(log, CTS_LIST_PLOG_LOG_TYPE_INT)) { + case CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN: + case CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN: + m_logEntry->setFolder(LogEntry::MISSED_CALLS_FOLDER); + break; + case CTS_PLOG_TYPE_VIDEO_INCOMMING: + case CTS_PLOG_TYPE_VOICE_INCOMMING: + m_logEntry->setFolder(LogEntry::RECEIVED_CALLS_FOLDER); + break; + case CTS_PLOG_TYPE_VIDEO_OUTGOING: + case CTS_PLOG_TYPE_VOICE_OUTGOING: + m_logEntry->setFolder(LogEntry::INITIATED_CALLS_FOLDER); + break; + default: + LogDebug("Invalid folder"); + m_logEntry->setFolder(LogEntry::INVALID_FOLDER); + break; + } + return true; +} + +Api::LogEntryPtr LogEntryWrapper::getAbstractCall() const +{ + return m_logEntry; +} +} +} \ No newline at end of file diff --git a/src/modules/tizen/DEPRACATED/Telephony/LogEntryWrapper.h b/src/modules/tizen/DEPRACATED/Telephony/LogEntryWrapper.h new file mode 100644 index 0000000..d317034 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Telephony/LogEntryWrapper.h @@ -0,0 +1,48 @@ +/* + * 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 LogEntryWrapper.h + * @author Lukasz Marek (l.marek@samsung.com) + * @version 0.2 + */ + +#ifndef _SLP20_LOG_ENTRY_WRAPPER_H_ +#define _SLP20_LOG_ENTRY_WRAPPER_H_ + +#include +#include +#include +#include + +namespace WrtPlugins { +namespace Platform { +class LogEntryWrapper +{ + public: + explicit LogEntryWrapper(CTSvalue *log); + virtual ~LogEntryWrapper(); + bool matchFilters(const Api::LogFilterPtr &filter); + Api::LogEntryPtr getAbstractCall() const; + private: + Api::LogEntryPtr m_logEntry; + bool convertPlatformStructToAbstractStruct(CTSvalue *log); +}; + +typedef DPL::SharedPtr LogEntryWrapperPtr; +} +} + +#endif /* _SLP20_EVENT_WRAPPER_H_ */ diff --git a/src/modules/tizen/DEPRACATED/Telephony/LogManager.cpp b/src/modules/tizen/DEPRACATED/Telephony/LogManager.cpp new file mode 100644 index 0000000..a14061f --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Telephony/LogManager.cpp @@ -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 LogManager.cpp + * @author Lukasz Marek (l.marek@samsung.com) + * @version 0.2 + */ + +#include +#include +#include +#include "LogManager.h" +#include "LogEntryWrapper.h" + +using namespace WrtPlugins::Api; + +namespace WrtPlugins { +namespace Platform { +int LogManager::m_instanceCount = 0; + +LogManager::LogManager() +{ + DPL::Mutex::ScopedLock mx(&m_constructorMutex); + if (m_instanceCount == 0) { + LogDebug("opening calllog DB"); + if (CTS_SUCCESS != contacts_svc_connect()) { + LogError("database not opened"); + } + } + m_instanceCount++; +} + +LogManager::~LogManager() +{ + LogDebug("entered"); + DPL::Mutex::ScopedLock mx(&m_constructorMutex); + m_instanceCount--; + if (m_instanceCount == 0) { + LogDebug("closing calllog DB"); + contacts_svc_disconnect(); + } +} + +void LogManager::OnRequestReceived(const Api::IEventGetNumberOfLogsPtr &event) +{ + LogDebug("entered"); + Try + { + int result = getNumberOfLogsInternal(event->getFilter()); + event->setNumberOfLogs(result); + } + Catch(Commons::Exception) + { + LogError("Error during searching logs"); + return; + } + event->setResult(true); +} + +void LogManager::OnRequestReceived(const Api::IEventFindLogEntriesPtr &event) +{ + LogDebug("entered"); + Try + { + std::vector result = findLogEntriesInternal( + event->getFilter(), event->getFirstCall(), event->getLastCall()); + std::vector::const_iterator it; + for (it = result.begin(); it != result.end(); it++) { + event->addLog(*it); + } + } + Catch(Commons::Exception) + { + LogError("Error during searching logs"); + return; + } + event->setResult(true); +} + +void LogManager::OnRequestReceived(const Api::IEventDeleteLogEntryPtr &event) +{ + LogDebug("entered"); + Try + { + if (!event->getFilter() || !event->getFilter()->getIdIsSet()) { + return; + } + deleteLogEntryInternal(event->getFilter()->getIdFilter()); + } + Catch(Commons::Exception) + { + LogError("Error during deleting log"); + return; + } + event->setResult(true); +} + +void LogManager::OnRequestReceived(const Api::IEventClearLogPtr &event) +{ + LogDebug("entered"); + Try + { + clearLogInternal(event->getFilter()); + } + Catch(Commons::Exception) + { + LogError("Error during deleting logs"); + return; + } + event->setResult(true); +} + +int LogManager::getNumberOfLogsInternal(const LogFilterPtr &filter) +{ + LogDebug("entered"); + if (!filter) { + LogWarning("filter is NULL"); + return 0; + } + int result = 0; + CTSiter *iter = NULL; + contacts_svc_get_list(CTS_LIST_GROUPING_PLOG, &iter); + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *log = contacts_svc_iter_get_info(iter); + if (NULL == log) { + LogError("funtion returned NULL value"); + continue; + } + LogEntryWrapperPtr wrapper(new LogEntryWrapper(log)); + if (wrapper->matchFilters(filter)) { + result++; + } + contacts_svc_value_free(log); + } + contacts_svc_iter_remove(iter); + return result; +} + +std::vector LogManager::findLogEntriesInternal( + const LogFilterPtr &filter, + const int minIndex, + const int maxIndex) +{ + LogDebug("entered"); + std::vector result; + CTSiter *iter = NULL; + contacts_svc_get_list(CTS_LIST_GROUPING_PLOG, &iter); + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *log = contacts_svc_iter_get_info(iter); + if (NULL == log) { + LogError("funtion returned NULL value"); + continue; + } + LogEntryWrapperPtr wrapper(new LogEntryWrapper(log)); + if (wrapper->matchFilters(filter)) { + result.push_back(wrapper->getAbstractCall()); + } + contacts_svc_value_free(log); + } + contacts_svc_iter_remove(iter); + return result; +} + +void LogManager::deleteLogEntryInternal(int id) const +{ + LogDebug("entered"); + if (CTS_SUCCESS != contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_ID, id)) { + ThrowMsg(Commons::PlatformException, "Cannot delete log"); + } + return; +} + +void LogManager::clearLogInternal(const LogFilterPtr &filter) +{ + LogDebug("entered"); + CTSiter *iter = NULL; + contacts_svc_get_list(CTS_LIST_GROUPING_PLOG, &iter); + while (CTS_SUCCESS == contacts_svc_iter_next(iter)) { + CTSvalue *log = contacts_svc_iter_get_info(iter); + if (NULL == log) { + LogError("funtion returned NULL value"); + continue; + } + LogEntryWrapperPtr wrapper(new LogEntryWrapper(log)); + if (wrapper->matchFilters(filter)) { + deleteLogEntryInternal(wrapper->getAbstractCall()->getId()); + } + contacts_svc_value_free(log); + } + contacts_svc_iter_remove(iter); + return; +} +} +} \ No newline at end of file diff --git a/src/modules/tizen/DEPRACATED/Telephony/LogManager.h b/src/modules/tizen/DEPRACATED/Telephony/LogManager.h new file mode 100644 index 0000000..c5c53a3 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Telephony/LogManager.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. + */ +/** + * @file LogManager.h + * @author Lukasz Marek (l.marek@samsung.com) + * @version 0.2 + */ + +#ifndef _SLP20__LOG_MANAGER_H_ +#define _SLP20__LOG_MANAGER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace WrtPlugins { +namespace Platform { +class LogManager : public Api::ILogManager +{ + public: + LogManager(); + virtual ~LogManager(); + protected: + virtual void OnRequestReceived( + const Api::IEventGetNumberOfLogsPtr &event); + virtual void OnRequestReceived( + const Api::IEventFindLogEntriesPtr &event); + virtual void OnRequestReceived( + const Api::IEventDeleteLogEntryPtr &event); + virtual void OnRequestReceived( + const Api::IEventClearLogPtr &event); + int getNumberOfLogsInternal( + const Api::LogFilterPtr &filter); + std::vector findLogEntriesInternal( + const Api::LogFilterPtr &filter, + const int minIndex = -1, + const int maxIndex = -1); + void deleteLogEntryInternal(int id) const; + void clearLogInternal( + const Api::LogFilterPtr &filter); + static int m_instanceCount; + DPL::Mutex m_constructorMutex; +}; + +typedef DPL::SharedPtr LogManagerPtr; +} +} + +#endif /* _SLP20__LOG_MANAGER_H_ */ diff --git a/src/modules/tizen/DEPRACATED/Telephony/config.cmake b/src/modules/tizen/DEPRACATED/Telephony/config.cmake new file mode 100644 index 0000000..23d80a3 --- /dev/null +++ b/src/modules/tizen/DEPRACATED/Telephony/config.cmake @@ -0,0 +1,26 @@ +get_current_path() + +pkg_search_module(contacts-service REQUIRED contacts-service) +pkg_search_module(glib REQUIRED glib-2.0) +pkg_search_module(libpcrecpp REQUIRED libpcrecpp) + + +set(INCLUDES_PLATFORM_IMPLEMENTATION_TELEPHONY + ${contacts-service_INCLUDE_DIRS} + ${glib_INCLUDE_DIRS} + ${libpcrecpp_INCLUDE_DIRS} + PARENT_SCOPE +) + +set(LIBS_PLATFORM_IMPLEMENTATION_TELEPHONY + ${contacts-service_LIBRARIES} + ${glib_LIBRARIES} + ${libpcrecpp_LIBRARIES} + PARENT_SCOPE +) + +set(SRCS_PLATFORM_IMPLEMENTATION_TELEPHONY + ${CURRENT_PATH}/LogManager.cpp + ${CURRENT_PATH}/LogEntryWrapper.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/DEPRACATED/UI/config.cmake b/src/modules/tizen/DEPRACATED/UI/config.cmake new file mode 100644 index 0000000..e8aefbc --- /dev/null +++ b/src/modules/tizen/DEPRACATED/UI/config.cmake @@ -0,0 +1,6 @@ +get_current_path() + +set(SRCS_PLATFORM_IMPLEMENTATION_UI +# ${CURRENT_PATH}/Camera.cpp + PARENT_SCOPE +) diff --git a/src/modules/tizen/Filesystem/Command.cpp b/src/modules/tizen/Filesystem/Command.cpp deleted file mode 100644 index 85d166a..0000000 --- a/src/modules/tizen/Filesystem/Command.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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. - */ -/** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - */ - -#include "Command.h" -#include -#include - -namespace WrtDeviceApis { -namespace Filesystem { - -void Command::execute() -{ - int result = system(prepare().c_str()); - if (-1 != result) { - if (0 != WIFEXITED(result)) { - if (0 != WEXITSTATUS(result)) { - ThrowMsg(Commons::PlatformException, "Command failed."); - } - } else { - ThrowMsg(Commons::PlatformException, - "Command terminated abnormally."); - } - } else { - ThrowMsg(Commons::PlatformException, "Couldn't launch command."); - } -} - -} -} diff --git a/src/modules/tizen/Filesystem/Command.h b/src/modules/tizen/Filesystem/Command.h deleted file mode 100644 index 5c816b2..0000000 --- a/src/modules/tizen/Filesystem/Command.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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. - */ -/** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - */ - -#ifndef WRTDEVICEAPIS_FILESYSTEM_COMMAND_H_ -#define WRTDEVICEAPIS_FILESYSTEM_COMMAND_H_ - -#include - -namespace WrtDeviceApis { -namespace Filesystem { - -class Command -{ - public: - virtual ~Command() - { - } - void execute(); - - protected: - /** - * Returns command converted into string that has to be safe to be executed - * using system() function (@see man 3p system). - * @attention Underlying command has to be passed by absolute path. - * E.g. use '/bin/cp' instead of just 'cp'. - * @attention Do not chain a few commands as one. - * This is wrong: 'cmd1 && cmd2; cmd3'. - * @return Command string - please ensure that the command is safe to run. - */ - virtual std::string prepare() = 0; -}; - -} -} - -#endif // WRTDEVICEAPIS_FILESYSTEM_COMMAND_H_ diff --git a/src/modules/tizen/Filesystem/CopyCommand.cpp b/src/modules/tizen/Filesystem/CopyCommand.cpp deleted file mode 100644 index c087805..0000000 --- a/src/modules/tizen/Filesystem/CopyCommand.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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. - */ -/** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - */ - -#include "CopyCommand.h" -#include - -namespace { -const char* COMMAND_NAME = "/bin/cp"; -const char* COMMAND_SWITCH_RECURSIVE = "-r"; -const char* COMMAND_SWITCH_FORCE = "-f"; -} - -namespace WrtDeviceApis { -namespace Filesystem { - -using namespace Api; - -CopyCommand::CopyCommand(const IPathPtr& src, - const IPathPtr& dest) : - m_src(src), - m_dest(dest), - m_recursive(false), - m_force(false) -{ -} - -void CopyCommand::setRecursive(bool recursive) -{ - m_recursive = recursive; -} - -void CopyCommand::setForce(bool force) -{ - m_force = force; -} - -std::string CopyCommand::prepare() -{ - std::ostringstream oss; - oss << COMMAND_NAME; - - if (m_recursive) { - oss << " " << COMMAND_SWITCH_RECURSIVE; - } - - if (m_force) { - oss << " " << COMMAND_SWITCH_FORCE; - } - - oss << " \"" << m_src->getFullPath().c_str() << "\""; - oss << " \"" << m_dest->getFullPath().c_str() << "\""; - - return oss.str(); -} - -} -} diff --git a/src/modules/tizen/Filesystem/Manager.cpp b/src/modules/tizen/Filesystem/Manager.cpp index 6cdaad9..e31c46e 100755 --- a/src/modules/tizen/Filesystem/Manager.cpp +++ b/src/modules/tizen/Filesystem/Manager.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -30,10 +32,6 @@ #include #include #include "Node.h" -#include "System.h" -#include "CopyCommand.h" -#include "MoveCommand.h" -#include "RemoveCommand.h" #include "Utils.h" namespace { @@ -94,8 +92,10 @@ void Manager::removeOpenedNode(const INodePtr& node) bool Manager::checkIfOpened(const IPathPtr& path) const { + Assert(path); NodeListIterator it = m_openedNodes.begin(); for (; it != m_openedNodes.end(); ++it) { + Assert(*it); if (*path == *(*it)->getPath()) { return true; } @@ -187,6 +187,8 @@ void Manager::find(const IPathPtr& path, const EventFindPtr& event) { Try { + Assert(path && "path is NULL"); + DIR* dir = opendir(path->getFullPath().c_str()); if (!dir) { return; @@ -229,6 +231,49 @@ void Manager::find(const IPathPtr& path, } } +void Manager::copyElement( + const std::string &src, const std::string &dest, bool recursive) const +{ + LogDebug("Copying src: " << src << " to: " << dest); + + //element is a file: + if (EINA_TRUE != ecore_file_is_dir(src.c_str())) { + if (EINA_TRUE != ecore_file_cp(src.c_str(), dest.c_str())) { + ThrowMsg(Commons::PlatformException, "Failed to copy file"); + } + return; + } + //element is a directory -> create it: + if (EINA_TRUE != ecore_file_mkdir(dest.c_str())) { + LogDebug("Failed to create destination directory"); + ThrowMsg(Commons::PlatformException, "Failed to copy directory"); + } + //copy all elements of directory: + if (recursive) { + Eina_List* list = ecore_file_ls(src.c_str()); + void* data; + EINA_LIST_FREE(list, data) + { + Try + { + copyElement((src + '/' + static_cast(data)).c_str(), + (dest + '/' + static_cast(data)).c_str()); + } + Catch(Commons::PlatformException) + { + //remove rest of the list + EINA_LIST_FREE(list, data) + { + free(data); + } + ReThrowMsg(Commons::PlatformException, "Failed to copy element"); + } + free(data); + } + } + +} + bool Manager::access(const IPathPtr& path, int accessType) const { @@ -285,20 +330,32 @@ void Manager::OnRequestReceived(const EventCopyPtr& event) { Try { INodePtr srcNode = Node::resolve(event->getSource()); - if ((srcNode->getMode() & PERM_READ) == 0) { + int requiredAccess; + switch (srcNode->getType()) { + case NT_DIRECTORY: + requiredAccess = AT_EXEC; + break; + case NT_FILE: + requiredAccess = AT_READ; + break; + } + if (!access(srcNode->getPath(), requiredAccess)) { ThrowMsg(Commons::SecurityException, - "Not enough permissions to read source node."); + "Not enough permissions to copy source node."); } IPathPtr src = event->getSource(); IPathPtr dest = event->getDestination(); + + Assert(dest); if (!dest->isAbsolute()) { dest = src->getPath() + *dest; } if (src == dest) { ThrowMsg(Commons::PlatformException, - "Destination is same as source."); + "Destination is same as source: " << + srcNode->getPath()->getFullPath()); } INodePtr parent; @@ -315,6 +372,11 @@ void Manager::OnRequestReceived(const EventCopyPtr& event) "Destination's parent node is not directory."); } + if (!access(parent->getPath(), AT_WRITE)) { + ThrowMsg(Commons::SecurityException, + "Not enough permissions to copy source node to destination."); + } + std::string realSrc = src->getFullPath(); std::string realDest = dest->getFullPath(); @@ -327,33 +389,44 @@ void Manager::OnRequestReceived(const EventCopyPtr& event) "No access to platform destination node."); } - if (((event->getOptions() & OPT_OVERWRITE) == 0) && (status == 0)) { - ThrowMsg(Commons::PlatformException, "Overwrite is not set."); - } + if (0 == status) { + //no owerwrite flag setted -> exception + if ((event->getOptions() & OPT_OVERWRITE) == 0) { + ThrowMsg(Commons::PlatformException, "Overwrite is not set."); + } - if (event->checkCancelled()) { - //file is not copied yet, so we can cancel it now. - event->setCancelAllowed(true); - return; - } + if (event->checkCancelled()) { + //file is not copied yet, so we can cancel it now. + event->setCancelAllowed(true); + return; + } - if (event->getOptions() & OPT_OVERWRITE) { - DPL::ScopedPtr remove(new RemoveCommand(dest)); - remove->setRecursive(true); - remove->setForce(true); - System::run(remove.Get()); + //destination exist. Need to be removed + Try { + INodePtr node = Node::resolve(event->getDestination()); + node->remove(event->getOptions()); + } + Catch(Commons::PlatformException) { + LogError("Exception: " << _rethrown_exception.GetMessage()); + event->setExceptionCode( + Commons::ExceptionCodes::PlatformException); + } + Catch(Commons::SecurityException) { + event->setExceptionCode( + Commons::ExceptionCodes::SecurityException); + } } - - DPL::ScopedPtr copy(new CopyCommand(src, dest)); - copy->setRecursive(true); - System::run(copy.Get()); + //Destination is not exist. Start copy now. + copyElement(realSrc, realDest); event->setResult(Node::resolve(dest)); } - Catch(Commons::PlatformException) { + catch (const Commons::PlatformException& ex) { + LogError("Exception: " << ex.GetMessage()); event->setExceptionCode(Commons::ExceptionCodes::PlatformException); } - Catch(Commons::SecurityException) { + catch (const Commons::SecurityException& ex) { + LogError("Exception: " << ex.GetMessage()); event->setExceptionCode(Commons::ExceptionCodes::SecurityException); } //file is copied already so we don't allow cancelling anymore. @@ -367,19 +440,20 @@ void Manager::OnRequestReceived(const EventMovePtr& event) IPathPtr dest = event->getDestination(); INodePtr srcNode = Node::resolve(src); - if ((srcNode->getMode() & PERM_WRITE) == 0) - { + if (!access(srcNode->getParent()->getPath(), AT_WRITE)) { ThrowMsg(Commons::SecurityException, - "Not enough permissions to move source node."); + "Not enough permissions to move source node."); } + Assert(dest); if (!dest->isAbsolute()) { dest = src->getPath() + *dest; } if (src == dest) { ThrowMsg(Commons::PlatformException, - "Destination is same as source."); + "Destination is same as source: " << + srcNode->getPath()->getFullPath()); } INodePtr parent; @@ -396,6 +470,11 @@ void Manager::OnRequestReceived(const EventMovePtr& event) "Destination's parent node is not directory."); } + if (!access(parent->getPath(), AT_WRITE)) { + ThrowMsg(Commons::SecurityException, + "Not enough permissions to move source node to destination."); + } + errno = 0; struct stat info; memset(&info, 0, sizeof(info)); @@ -424,15 +503,35 @@ void Manager::OnRequestReceived(const EventMovePtr& event) { case EXDEV: { - if ((srcNode->getMode() & PERM_READ) == 0) - { - ThrowMsg(Commons::SecurityException, - "Not enough permissions to move source node."); + if (0 == status) { + //destination exist. Need to be removed + Try { + INodePtr node = Node::resolve( + event->getDestination()); + node->remove(event->getOptions()); + } + Catch(Commons::PlatformException) { + LogError("Exception while removing dest directory"); + event->setExceptionCode( + Commons::ExceptionCodes::PlatformException); + } + Catch(Commons::SecurityException) { + event->setExceptionCode( + Commons::ExceptionCodes::SecurityException); + } + } + + copyElement(src->getFullPath(), + dest->getFullPath()); + //remove source files + Try { + INodePtr node = Node::resolve(event->getSource()); + node->remove(event->getOptions()); + } + Catch(Commons::Exception) { + LogError("Exception: " + << _rethrown_exception.GetMessage()); } - DPL::ScopedPtr - move(new MoveCommand(src, dest)); - move->setForce(event->getOptions() & OPT_OVERWRITE); - System::run(move.Get()); break; } default: diff --git a/src/modules/tizen/Filesystem/Manager.h b/src/modules/tizen/Filesystem/Manager.h index 7edea91..9699285 100644 --- a/src/modules/tizen/Filesystem/Manager.h +++ b/src/modules/tizen/Filesystem/Manager.h @@ -115,6 +115,10 @@ class Manager : public Api::IManager static void setupLocation(Api::LocationType location, const char* path); + void copyElement(const std::string &src, + const std::string &dest, + bool recursive = true) const; + private: static Locations m_locations; ///< Paths to default locations. static const std::size_t m_maxPathLength; ///< Maximum path length. diff --git a/src/modules/tizen/Filesystem/MoveCommand.cpp b/src/modules/tizen/Filesystem/MoveCommand.cpp deleted file mode 100644 index b14c398..0000000 --- a/src/modules/tizen/Filesystem/MoveCommand.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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. - */ -/** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - */ - -#include "MoveCommand.h" -#include - -namespace { -const char* COMMAND_NAME = "/bin/mv"; -const char* COMMAND_SWITCH_FORCE = "-f"; -} - -namespace WrtDeviceApis { -namespace Filesystem { - -using namespace Api; - -MoveCommand::MoveCommand(const IPathPtr& src, - const IPathPtr& dest) : - m_src(src), - m_dest(dest), - m_force(false) -{ -} - -void MoveCommand::setForce(bool force) -{ - m_force = force; -} - -std::string MoveCommand::prepare() -{ - std::ostringstream oss; - oss << COMMAND_NAME; - - if (m_force) { - oss << " " << COMMAND_SWITCH_FORCE; - } - - oss << " \"" << m_src->getFullPath().c_str() << "\""; - oss << " \"" << m_dest->getFullPath().c_str() << "\""; - - return oss.str(); -} - -} -} diff --git a/src/modules/tizen/Filesystem/Node.cpp b/src/modules/tizen/Filesystem/Node.cpp index 527fa85..0561cd9 100755 --- a/src/modules/tizen/Filesystem/Node.cpp +++ b/src/modules/tizen/Filesystem/Node.cpp @@ -144,6 +144,7 @@ NodeList Node::getChildNodes(const NodeFilterPtr& filter) const continue; } Try { + Assert(m_path); INodePtr node = Node::resolve(*m_path + entry->d_name); node->setPermissions(getPermissions()); // inherit access rights if (NodeFilterMatcher::match(node, filter)) { @@ -184,6 +185,8 @@ INodePtr Node::createChild( ThrowMsg(Commons::SecurityException, "Not enough permissions."); } + Assert(m_path); + Assert(path); IPathPtr childPath = *m_path + *path; if (exists(childPath)) { ThrowMsg(Commons::PlatformException, "Node already exists."); @@ -279,6 +282,8 @@ INodePtr Node::getParent() const { LocationPaths roots = IManager::getInstance().getLocationPaths(); for (LocationPaths::iterator it = roots.begin(); it != roots.end(); ++it) { + Assert(*it); + Assert(m_path); if (*(*it) == *m_path) { return INodePtr(); } @@ -413,6 +418,7 @@ void Node::removeAsFile(const IPathPtr& path) void Node::removeAsDirectory(const IPathPtr& path, bool recursive) { + Assert(path); if (recursive) { DIR* dir = opendir(path->getFullPath().c_str()); if (!dir) { diff --git a/src/modules/tizen/Filesystem/RemoveCommand.cpp b/src/modules/tizen/Filesystem/RemoveCommand.cpp deleted file mode 100644 index 39fbe47..0000000 --- a/src/modules/tizen/Filesystem/RemoveCommand.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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. - */ -/** - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - */ - -#include "RemoveCommand.h" -#include - -namespace { -const char* COMMAND_NAME = "/bin/rm"; -const char* COMMAND_SWITCH_RECURSIVE = "-r"; -const char* COMMAND_SWITCH_FORCE = "-f"; -} - -namespace WrtDeviceApis { -namespace Filesystem { - -using namespace Api; - -RemoveCommand::RemoveCommand(const IPathPtr& path) : - m_path(path), - m_recursive(false), - m_force(false) -{ -} - -void RemoveCommand::setRecursive(bool recursive) -{ - m_recursive = recursive; -} - -void RemoveCommand::setForce(bool force) -{ - m_force = force; -} - -std::string RemoveCommand::prepare() -{ - std::ostringstream oss; - oss << COMMAND_NAME; - - if (m_recursive) { - oss << " " << COMMAND_SWITCH_RECURSIVE; - } - - if (m_force) { - oss << " " << COMMAND_SWITCH_FORCE; - } - - oss << " \"" << m_path->getFullPath().c_str() << "\""; - - return oss.str(); -} - -} // Filesystem -} // WrtDeviceApis diff --git a/src/modules/tizen/Filesystem/config.cmake b/src/modules/tizen/Filesystem/config.cmake index 85bb12b..ed22f05 100644 --- a/src/modules/tizen/Filesystem/config.cmake +++ b/src/modules/tizen/Filesystem/config.cmake @@ -1,14 +1,17 @@ get_current_path() -pkg_search_module(pcrecpp REQUIRED libpcrecpp) +pkg_search_module(pcrecpp REQUIRED libpcrecpp + ecore REQUIRED ecore-1) set(INCLUDES_PLATFORM_IMPLEMENTATION_FILESYSTEM ${pcrecpp_INCLUDE_DIRS} + ${ecore_INCLUDE_DIRS} PARENT_SCOPE ) set(LIBS_PLATFORM_IMPLEMENTATION_FILESYSTEM ${pcrecpp_LIBRARIES} + ${ecore_LIBRARIES} PARENT_SCOPE ) @@ -17,12 +20,7 @@ set(SRCS_PLATFORM_IMPLEMENTATION_FILESYSTEM ${CURRENT_PATH}/Node.cpp ${CURRENT_PATH}/Path.cpp ${CURRENT_PATH}/Stream.cpp - ${CURRENT_PATH}/System.cpp ${CURRENT_PATH}/NodeFilterMatcher.cpp - ${CURRENT_PATH}/Command.cpp - ${CURRENT_PATH}/CopyCommand.cpp - ${CURRENT_PATH}/MoveCommand.cpp - ${CURRENT_PATH}/RemoveCommand.cpp ${CURRENT_PATH}/Utils.cpp PARENT_SCOPE ) diff --git a/src/modules/tizen/PluginManager/PluginManager.cpp b/src/modules/tizen/PluginManager/PluginManager.cpp index 27af1fe..0f23423 100644 --- a/src/modules/tizen/PluginManager/PluginManager.cpp +++ b/src/modules/tizen/PluginManager/PluginManager.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,7 @@ #include #include + using namespace std; namespace { @@ -49,9 +51,9 @@ PluginManager::PluginManager(int widgetHandle, JSObjectRef object, JSContextRef context) : m_widgetHandle(widgetHandle), + m_objectInstance(object), m_objectUri(GLOBAL_OBJECT_NAME), m_shortUri(objectUri), - m_objectInstance(object), m_context(context) { m_objectUri.append(SEPARATOR).append(objectUri); @@ -112,11 +114,11 @@ bool PluginManager::loadChild(const string &name) const continue; } - PluginLogic::JavaScriptObject jsObject = {m_objectInstance, + JavaScriptObject jsObject = {m_objectInstance, m_shortUri}; return PluginLogicSingleton::Instance().loadPluginOnDemand( - handle, jsObject); + handle, jsObject, const_cast(m_context)); } } LogError("Plugin not loaded"); diff --git a/src/modules/tizen/PluginManager/config.cmake b/src/modules/tizen/PluginManager/config.cmake index fd8e9c1..ccf3c80 100644 --- a/src/modules/tizen/PluginManager/config.cmake +++ b/src/modules/tizen/PluginManager/config.cmake @@ -1,17 +1,19 @@ get_current_path() pkg_search_module(dpl-wrt-dao-ro REQUIRED dpl-wrt-dao-ro) -pkg_search_module(wrt-plugin-loading REQUIRED wrt-plugin-loading) +#pkg_search_module(wrt-plugin-loading REQUIRED wrt-plugin-loading) set(INCLUDES_PLATFORM_IMPLEMENTATION_PLUGIN_MANAGER ${dpl-wrt-dao-ro_INCLUDE_DIRS} ${wrt-plugin-loading_INCLUDE_DIRS} + ${PLUGIN_LOADING_DIRS} PARENT_SCOPE ) set(LIBS_PLATFORM_IMPLEMENTATION_PLUGIN_MANAGER ${dpl-wrt-dao-ro_LIBRARIES} ${wrt-plugin-loading_LIBRARIES} + ${TARGET_PLUGIN_LOADING_LIB} PARENT_SCOPE ) diff --git a/src/modules/tizen/WidgetDB/WidgetFeature.cpp b/src/modules/tizen/WidgetDB/WidgetFeature.cpp index 027a416..530acff 100644 --- a/src/modules/tizen/WidgetDB/WidgetFeature.cpp +++ b/src/modules/tizen/WidgetDB/WidgetFeature.cpp @@ -57,7 +57,7 @@ void WidgetFeature::addParam(const std::string& paramName, const std::string& paramValue) { //LogDebug("entered"); - m_params[paramName] = paramValue; + m_params.push_back(std::make_pair(paramName, paramValue)); } WidgetFeature::~WidgetFeature() diff --git a/src/modules/tizen/WidgetDB/config.cmake b/src/modules/tizen/WidgetDB/config.cmake index 43ac130..6362668 100644 --- a/src/modules/tizen/WidgetDB/config.cmake +++ b/src/modules/tizen/WidgetDB/config.cmake @@ -1,14 +1,17 @@ get_current_path() pkg_search_module(dpl-wrt-dao-ro REQUIRED dpl-wrt-dao-ro) +pkg_search_module(dpl-utils-efl REQUIRED dpl-utils-efl) set(INCLUDES_PLATFORM_IMPLEMENTATION_WIDGETDB ${dpl-wrt-dao-ro_INCLUDE_DIRS} + ${dpl-utils-efl_INCLUDE_DIRS} PARENT_SCOPE ) set(LIBS_PLATFORM_IMPLEMENTATION_WIDGETDB ${dpl-wrt-dao-ro_LDFLAGS} + ${dpl-utils-efl_LDFLAGS} PARENT_SCOPE ) diff --git a/src/modules/tizen/WidgetInterfaceDAO/CMakeLists.txt b/src/modules/tizen/WidgetInterfaceDAO/CMakeLists.txt index 7a011f6..60886cf 100644 --- a/src/modules/tizen/WidgetInterfaceDAO/CMakeLists.txt +++ b/src/modules/tizen/WidgetInterfaceDAO/CMakeLists.txt @@ -5,10 +5,12 @@ pkg_search_module(dpl-db REQUIRED dpl-db-efl) include_directories(${CURRENT_PATH}) +STRING(REPLACE ";" ":" SQL_GENERATOR_INCLUDE_DIRS "${dpl-db_INCLUDE_DIRS}") + ADD_CUSTOM_COMMAND( OUTPUT ${CURRENT_PATH}/widget_interface_db.sql COMMAND rm -f ${CURRENT_PATH}/.widget_interface.db COMMAND rm -f ${CURRENT_PATH}/widget_interface_db.sql - COMMAND gcc -Wall -I${dpl-db_INCLUDE_DIRS} -E ${CURRENT_PATH}/widget_interface_db_sql_generator.h | grep --invert-match "^#" > ${CURRENT_PATH}/widget_interface_db.sql + COMMAND CPATH=${SQL_GENERATOR_INCLUDE_DIRS} gcc -Wall -E ${CURRENT_PATH}/widget_interface_db_sql_generator.h | grep --invert-match "^#" > ${CURRENT_PATH}/widget_interface_db.sql COMMAND sqlite3 ${CURRENT_PATH}/.widget_interface.db ".read ${CURRENT_PATH}/widget_interface_db.sql" || rm -f ${CURRENT_PATH}/.widget_interface.db DEPENDS ${CURRENT_PATH}/widget_interface_db_sql_generator.h ${CURRENT_PATH}/widget_interface_db ) diff --git a/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.cpp b/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.cpp index 2ce1805..246c99f 100644 --- a/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.cpp +++ b/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.cpp @@ -290,7 +290,7 @@ size_t WidgetInterfaceDAO::getStorageSize() const return 0; } -std::string WidgetInterfaceDAO::getValueByIndex(size_t index) const +std::string WidgetInterfaceDAO::getKeyByIndex(size_t index) const { using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::widget_interface; @@ -300,7 +300,7 @@ std::string WidgetInterfaceDAO::getValueByIndex(size_t index) const Properties::Select select(&m_databaseInterface); select.OrderBy("key"); std::list list = - select.GetValueList(); + select.GetValueList(); if (index >= list.size()) { Throw(Commons::InvalidArgumentException); } diff --git a/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.h b/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.h index da5c8ff..371ae58 100644 --- a/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.h +++ b/src/modules/tizen/WidgetInterfaceDAO/WidgetInterfaceDAO.h @@ -47,7 +47,7 @@ class WidgetInterfaceDAO : DPL::Optional getValue(const std::string& key) const; void clear(bool removeReadOnly); size_t getStorageSize() const; - std::string getValueByIndex(size_t index) const; + std::string getKeyByIndex(size_t index) const; protected: int m_widgetHandle; diff --git a/src/plugin-loading/CMakeLists.txt b/src/plugin-loading/CMakeLists.txt new file mode 100644 index 0000000..135b224 --- /dev/null +++ b/src/plugin-loading/CMakeLists.txt @@ -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 CMakeLists.txt +# @author Lukasz Marek (l.marek@samsung.com) +# @version 1.0 +# + +pkg_search_module(plugin-types REQUIRED wrt-plugins-types) +pkg_search_module(dpl REQUIRED dpl-efl) +pkg_search_module(dpl-event REQUIRED dpl-event-efl) +pkg_search_module(dpl-wrt-dao-ro REQUIRED dpl-wrt-dao-ro) +pkg_search_module(webkit2 REQUIRED ewebkit2) + +#set(PLUGIN_MODULE_SRC_DIR ${PROJECT_SOURCE_DIR}/src/plugin-service) + +set(PLUGIN_LOADING_SOURCES + ${PLUGIN_LOADING_DIRS}/plugin_logic.cpp + ${PLUGIN_LOADING_DIRS}/plugin.cpp + ${PLUGIN_LOADING_DIRS}/plugin_model.cpp + ${PLUGIN_LOADING_DIRS}/explorer.cpp + ${PLUGIN_LOADING_DIRS}/plugin_iframe_support.cpp + ${PLUGIN_LOADING_DIRS}/plugin_container_support.cpp + ${PLUGIN_LOADING_DIRS}/plugin_property_support.cpp + ${PLUGIN_LOADING_DIRS}/javascript_interface.cpp + ${PLUGIN_LOADING_DIRS}/js_page_session.cpp + # ${PLUGIN_MODULE_SRC_DIR}/wrt_plugin_module.cpp +) + +INCLUDE_DIRECTORIES( + # ${PLUGIN_MODULE_SRC_DIR} + ${PLUGIN_LOADING_DIRS} + ${webkit2_INCLUDE_DIRS} + ${plugin-types_INCLUDE_DIRS} +) + +ADD_LIBRARY(${TARGET_PLUGIN_LOADING_LIB} SHARED + ${PLUGIN_LOADING_SOURCES} +) + +SET_TARGET_PROPERTIES(${TARGET_PLUGIN_LOADING_LIB} PROPERTIES + COMPILE_FLAGS -fPIC + LINK_FLAGS "-Wl,--as-needed -Wl,--hash-style=both" +) + +SET_TARGET_PROPERTIES(${TARGET_PLUGIN_LOADING_LIB} PROPERTIES + SOVERSION ${CMAKE_PROJECT_API_VERSION} + VERSION ${CMAKE_PROJECT_VERSION} +) + +target_link_libraries(${TARGET_PLUGIN_LOADING_LIB} + ${dpl_LIBRARIES} + ${dpl-event_LIBRARIES} + ${dpl-wrt-dao-ro_LIBRARIES} + ${TARGET_COMMONS} + ${TARGET_JS_OVERLAY} +) + +INSTALL(TARGETS ${TARGET_PLUGIN_LOADING_LIB} + DESTINATION lib + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) + +# For wrt-plugins +INSTALL(FILES + ${PLUGIN_LOADING_DIRS}/plugin_logic.h + ${PLUGIN_LOADING_DIRS}/js_types.h + DESTINATION include/wrt-plugin-loading) diff --git a/src/plugin-loading/explorer.cpp b/src/plugin-loading/explorer.cpp new file mode 100644 index 0000000..d755777 --- /dev/null +++ b/src/plugin-loading/explorer.cpp @@ -0,0 +1,438 @@ +/* + * 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 explorer.cpp + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @author Yunchan Cho (yunchan.cho@samgsung.com) + * @version + * @brief + */ + +#include +#include +#include +#include "explorer.h" +#include "plugin_property_support.h" + +// JS overlay +#include +#include +#include +#include +#include + +namespace { +//const char* SEPARATOR = "."; +const std::string GLOBAL_OBJECT_NAME = "GLOBAL_OBJECT"; +} + +using namespace std; +using namespace PluginModule; +using namespace WrtPlugins::W3C; + +Explorer::Explorer(JSGlobalContextRef context) : + m_context(context) +{ + if (!context) { + LogError("Context is NULL"); + return; + } + + m_globalObject = + JavaScriptInterfaceSingleton::Instance().getGlobalObject(context); + + LogDebug("Register main frame"); + //register main frame; + m_iframeSupport.registerIframe(m_globalObject); + + m_propertySupport.reset(new WindowPropertySupport(m_context)); + + // initialization for use of custom event + if (!AddEventListenerSupport::isInitialized()) + { + LogInfo("initialization for use of custom event"); + AddEventListenerSupport::initialize(context); + } +} + +Explorer::~Explorer() +{ + // deinitialization for use of custom event + if (AddEventListenerSupport::isInitialized()) { + LogInfo("deinitialization for use of custom event"); + AddEventListenerSupport::deinitialize(); + } +} + +JSObjectPtr Explorer::getJSObjectProperty(const std::string& propertyName, + JSObjectPtr object) +{ + LogDebug("Get object property " << propertyName); + return JavaScriptInterfaceSingleton::Instance().getJSObjectProperty( + m_context, object, propertyName); +} + +JSObjectPtr Explorer::getProperty( + const string& requestedProperty, + JSObjectPtr providedObject) +{ + LogDebug("Requested Property: " << requestedProperty); + + if(!providedObject) + { + LogError("Provided object is empty"); + return JSObjectPtr(); + } + + std::string currentObjectName; + std::string currentPropertyRequested = requestedProperty; + JSObjectPtr currentObject = providedObject; + + while(true) + { + auto pos = currentPropertyRequested.find("."); + if (pos == string::npos) + { + return getJSObjectProperty(currentPropertyRequested, currentObject); + } + + //check if requested object has child + currentObjectName = currentPropertyRequested.substr(0,pos); + + if (currentPropertyRequested.size() <= pos+1) + { + LogError("Wrong name of requested property"); + return JSObjectPtr(); + } + currentPropertyRequested = currentPropertyRequested.substr(pos+1); + + currentObject = getJSObjectProperty(currentObjectName, currentObject); + if(!currentObject) + { + LogError("Failed to get property: " << currentObjectName); + return JSObjectPtr(); + } + } +} + +bool Explorer::registerObject(const JSObjectDeclarationPtr& declaration, + JSGlobalContextRef context) +{ + LogDebug("Register to global object"); + + bool retValue; + + if (declaration->getParentName() == GLOBAL_OBJECT_NAME) + { + LogDebug("Connect to Global object"); + retValue = register_(declaration, m_globalObject, context); + } + else //PIM support + { + LogDebug("Connect to NOT global object"); + //it should be master object name + string masterName = declaration->getParentName(); + auto pos = masterName.find("."); + if (string::npos != pos) + { + LogError("ParentName not allowed"); + return false; + } + auto masterObject = getJSObjectProperty(masterName, m_globalObject); + if (masterObject->getObject() == 0) + { + return false; + } + retValue = registerObject(declaration, masterName, masterObject, context); + } + + if (declaration->checkIframesSupported()) { + LogDebug("Iframe supported"); + m_iframeSupport.registerDeclaration(declaration); +// m_iframeSupport.invokeCallbackForMainFrame(m_context, +// declaration, +// newObject); + } + else { + LogDebug("Iframe NOT supported"); + } + + return retValue; +} + + +bool Explorer::registerObject(const JSObjectDeclarationPtr& declaration, + const std::string& providedObjectName, + JSObjectPtr providedObject, + JSGlobalContextRef context) +{ + LogDebug("Register object. Provided object name: '" << providedObjectName + << "', registration of: '" << declaration->getName() << "'"); + + std::string fullParentName = declaration->getParentName(); + LogDebug("Parent name: " << declaration->getParentName()); + + if(fullParentName == providedObjectName) + { + LogDebug("Provided object match equaly to requested parent"); + return register_(declaration, providedObject, context); + } + + //check if object exists in fullParentName + auto pos = fullParentName.find(providedObjectName); + if(pos == string::npos) + { + LogError("Object: " << declaration->getName() + << " should be child of: " << declaration->getParentName() + << " but you provided object: " << providedObjectName); + + return false; + } + + if (fullParentName.size() <= pos+providedObjectName.size()+1) + { + LogError("Invalid object name"); + return false; + } + + auto currentRequesteProperty = + fullParentName.substr(pos+providedObjectName.size()+1); + + + JSObjectPtr jsObject = getProperty( + currentRequesteProperty, providedObject); + + if(!jsObject->getObject()) + { + LogError("Object: '" << declaration->getName() + << "' should be child of: '" << declaration->getParentName() + << "'. you provided object: '" << providedObjectName + << "' but object is null"); + + return false; + } + + return register_(declaration, jsObject, context); +} + +bool Explorer::register_(const JSObjectDeclarationPtr& declaration, + JSObjectPtr parent, + JSGlobalContextRef context) +{ + LogInfo("Registration object: " << declaration->getParentName() << + "<-" << declaration->getName()); + + Assert(parent && "parent object is NULL"); + + typedef JSObjectDeclaration::Options JO; + + JSGlobalContextRef gContext = (context==NULL)?m_context:context; + JSObjectPtr newObject; + + JSObjectPtr objectInstance = JavaScriptInterfaceSingleton::Instance(). + createObject(gContext,declaration); + + //function creation + if (declaration->getOptions() && + declaration->getOptions()->getType() == JO::ClassType::Function) + { + LogDebug("Loading function object " << declaration->getName()); + + auto type = declaration->getOptions()->getIframeOverlay(); + if (JO::IFrameOverlay::OverlayedBeforeOriginal == type) + { + LogDebug("Create overlayed function"); + JSObjectPtr original = + JavaScriptInterfaceSingleton::Instance(). + getJSObjectProperty(gContext, + parent, + declaration->getName()); + newObject = JSOverlaySupport:: + createWrappedFunction(gContext, + original, + objectInstance, + declaration->getName()); + } + else + { + LogDebug("create normal function"); + newObject = objectInstance; + } + } + else //object creation + { + newObject = objectInstance; + } + + JavaScriptInterfaceSingleton::Instance().setObjectProperty( + gContext, + parent, + declaration->getName(), + newObject); + + //notice + if (declaration->getOptions() && + (declaration->getOptions()->getIframeNotice() == + JO::IFrameNotice::AlwaysNotice)) + { + declaration->getOptions()->invokeCallback(gContext, + parent->getObject(), + objectInstance->getObject()); + } + + + return true; +} + +void Explorer::registerObjectIntoIframe(const JSObjectDeclarationPtr& declaration, + JSObjectPtr frameObject, + JSGlobalContextRef context) +{ + if (declaration->getParentName() == GLOBAL_OBJECT_NAME) + { + LogDebug("Connect to Global object of IFRAME"); + register_(declaration, frameObject, context); + return; + } + + //PIM SUPPORT + { + LogWarning("Connect to NOT global object of IFRAME"); + //it should be master object name + string masterName = declaration->getParentName(); + auto pos = masterName.find("."); + if (string::npos != pos) + { + LogError("ParentName not allowed"); + return; + } + auto masterObject = getJSObjectProperty(masterName, frameObject); + if (!masterObject->getObject()) + { + LogError("Object not exist in frame"); + return; + } + register_(declaration, masterObject, context); + } +} + + +void Explorer::loadFrame(JSGlobalContextRef context) +{ + LogDebug("Frame attached"); + + JSObjectPtr frameObject = + JavaScriptInterfaceSingleton::Instance().getGlobalObject(context); + + LogDebug("Register main frame"); + //register main frame; + + if(frameObject->getObject() == m_globalObject->getObject()) + { + // Main page was already loaded from constructor + LogDebug("Main page loaded"); + return; + } + + m_iframeSupport.registerIframe(frameObject); + + auto iframeObjects = m_iframeSupport.getIframeObjects(); + + FOREACH(object, iframeObjects) + { + LogDebug("Register object: " << (*object)->getName() ); + + registerObjectIntoIframe(*object, frameObject, context); + } +} + +void Explorer::unloadFrame(JSGlobalContextRef context) +{ + LogDebug("Frame detached"); + + JSObjectPtr frameObject = + JavaScriptInterfaceSingleton::Instance().getGlobalObject(context); + + m_iframeSupport.unregisterIframe(frameObject); +} + +void Explorer::removePluginsFromIframes() +{ + LogDebug("Remove plugins from iframes"); + + if (m_iframeSupport.hasIframes()) + { + LogDebug("Removing iframes"); + JavaScriptInterfaceSingleton::Instance().removeIframes(m_context); + } +} + +void Explorer::deregisterObject(const JSObjectDeclarationPtr& declaration) +{ + LogDebug("Deregister object " << declaration->getName()); + + if (GLOBAL_OBJECT_NAME != declaration->getParentName()) + { + LogWarning("Ignored remove property " << declaration->getName()); + return; + } + + JavaScriptInterfaceSingleton::Instance(). + removeObjectProperty(m_context, + m_globalObject, + declaration->getName()); +} + +void Explorer::cleanIframesData() +{ + LogDebug("Clean iframes data"); + m_iframeSupport.clean(); +} + +void Explorer::callEventListeners(CustomEventType eventType) +{ + if (eventType == ServiceCustomEvent) + { + using namespace WrtDeviceApis::TizenServiceEvent::Api; + + // get iframe objects from javascript global context + JavaScriptInterface::ObjectsListPtr frameLists = + JavaScriptInterfaceSingleton::Instance().getIframesList(m_context); + + // get main frame object from javascript global context + JSObjectRef mainFrame = JSContextGetGlobalObject(m_context); + frameLists->push_back(JSObjectPtr(new JSObject(mainFrame))); + + // set user data of js callback function for 'appservice' js event + ITizenServiceEventPtr event = ITizenServiceEventPtr(new TizenServiceEvent()); + event->setScale(m_propertySupport->getScale()); + event->setBundle(m_propertySupport->getBundle()); + + // call js callback function for 'appservice' js event on each frame + FOREACH(it, *frameLists) + { + JSObjectRef frame = static_cast((*it).Get()->getObject()); + AddEventListenerSupport::CallServiceListenersFromIFrame(frame, event); + } + } else { + LogInfo("Not supported custom event type"); + } +} + +WindowPropertySupport* Explorer::getWindowPropertySupport() +{ + return m_propertySupport.get(); +} diff --git a/src/plugin-loading/explorer.h b/src/plugin-loading/explorer.h new file mode 100644 index 0000000..e6f8cac --- /dev/null +++ b/src/plugin-loading/explorer.h @@ -0,0 +1,103 @@ +/* + * 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 explorer.h + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief + */ + +#ifndef WRT_SRC_PLUGIN_SERVICE_EXPLORER_H_ +#define WRT_SRC_PLUGIN_SERVICE_EXPLORER_H_ + +#include + +#include +#include +#include + +#include +#include +//JSGlobalContextRef +#include "javascript_interface.h" +#include "plugin_iframe_support.h" +#include "plugin_property_support.h" + +//JS overlay +#include + +using namespace PluginModule; +using namespace WrtPlugins::W3C; + +class Explorer : private DPL::Noncopyable +{ + public: + explicit Explorer(JSGlobalContextRef context); + ~Explorer(); + + //register to global frame + bool registerObject(const JSObjectDeclarationPtr& declaration, + JSGlobalContextRef context); + + bool registerObject (const JSObjectDeclarationPtr& declaration, + const std::string& parentObjectName, + JSObjectPtr parentObject, + JSGlobalContextRef context); + + void deregisterObject(const JSObjectDeclarationPtr& declaration); + + // new load/unload frame API + void loadFrame(JSGlobalContextRef context); + void unloadFrame(JSGlobalContextRef context); + + void removePluginsFromIframes(); + void cleanIframesData(); + void callEventListeners(CustomEventType eventType); + + WindowPropertySupport* getWindowPropertySupport(); + + private: + + IframesSupport m_iframeSupport; + + //globalContext + JSGlobalContextRef m_context; + + //global object of main frame + JSObjectPtr m_globalObject; + + std::unique_ptr m_propertySupport; + + private: + void registerObjectIntoIframe(const JSObjectDeclarationPtr& declaration, + JSObjectPtr parentObject, + JSGlobalContextRef context); + + bool register_(const JSObjectDeclarationPtr& declaration, + JSObjectPtr parent, + JSGlobalContextRef context); + + + JSObjectPtr getJSObjectProperty(const std::string& propertyName, + JSObjectPtr object); + + JSObjectPtr getProperty( + const std::string& requestedProperty, + JSObjectPtr providedObject); +}; + +typedef DPL::SharedPtr ExplorerPtr; +#endif diff --git a/src/plugin-loading/javascript_interface.cpp b/src/plugin-loading/javascript_interface.cpp new file mode 100644 index 0000000..0534397 --- /dev/null +++ b/src/plugin-loading/javascript_interface.cpp @@ -0,0 +1,426 @@ +/* + * 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 plugin_webkit.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of webkit js plugin + * accessing routines in EFL + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_SINGLETON(JavaScriptInterface) + +#define CHECK_JSVALUE_IS_UNDEFINED_RETURN(context, object, ret) \ + if (JSValueIsUndefined(context, object)) {\ + LogError("Object " << #object << " is undefined");\ + return ret;\ + } + +#define CHECK_JSOBJECT_IS_NULL_RETURN(object, ret) \ + if (!object) {\ + LogError("Object " << #object << " is NULL");\ + return ret;\ + } + +namespace { +/** + * Converts JSStringRef to std::string + * */ +std::string toString(const JSStringRef& arg) +{ + Assert(arg); + std::string result; + size_t jsSize = JSStringGetMaximumUTF8CStringSize(arg); + if (jsSize > 0) { + ++jsSize; + DPL::ScopedArray buffer(new char[jsSize]); + size_t written = JSStringGetUTF8CString(arg, buffer.Get(), jsSize); + if (written > jsSize) { + LogError("Conversion could not be fully performed."); + return std::string(); + } + result = buffer.Get(); + } + + return result; +} + +/** + * Converts JSValueRef to std::string + * */ +std::string toString(JSContextRef ctx, JSValueRef value) { + Assert(ctx && value); + std::string result; + JSStringRef str = JSValueToStringCopy(ctx, value, NULL); + result = toString(str); + JSStringRelease(str); + return result; +} + +JSValueRef getProperty(JSContextRef ctx, JSValueRef value, const char* name) { + Assert(ctx && value && name); + JSValueRef result = NULL; + JSObjectRef obj = JSValueToObject(ctx, value, NULL); + if (obj) { + JSStringRef str = JSStringCreateWithUTF8CString(name); + result = JSObjectGetProperty(ctx, obj, str, NULL); + JSStringRelease(str); + } + return result; +} + +JSValueRef getPropertyObj(JSContextRef ctx, JSObjectRef obj, const char* name) { + Assert(ctx && obj && name); + JSStringRef str = JSStringCreateWithUTF8CString(name); + JSValueRef result = JSObjectGetProperty(ctx, obj, str, NULL); + JSStringRelease(str); + return result; +} + +JSObjectRef getJSGlobalObject(JSGlobalContextRef context){ + return JSContextGetGlobalObject(context); +} + +} + +typedef JSValueRef (*JSCFunction)( + JSContextRef context, + JSObjectRef object, + JSObjectRef thisObject, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception); + + +void JavaScriptInterface::setObjectProperty(JSGlobalContextRef context, + const JSObjectPtr& parentObject, + const std::string &propertyName, + const JSObjectPtr& propertyObject) +{ + LogInfo("Webkit:setting property --" << propertyName << "--"); + + //create name + JSStringRef name = JSStringCreateWithUTF8CString(propertyName.c_str()); + //set property + JSObjectSetProperty( + static_cast(context), + static_cast(parentObject->getObject()), name, + static_cast(propertyObject->getObject()), + kJSPropertyAttributeReadOnly, 0); + + JSStringRelease(name); +} + +void JavaScriptInterface::removeObjectProperty(JSGlobalContextRef context, + const JSObjectPtr& parentObject, + const std::string &propertyName) +{ + if (!context) { + //nothing to do -> no context + return; + } + LogDebug("Deleting property --" << propertyName << "--"); + + JSStringRef name = JSStringCreateWithUTF8CString(propertyName.c_str()); + JSObjectDeleteProperty( + static_cast(context), + static_cast(parentObject->getObject()), name, 0); + + JSStringRelease(name); +} + +JavaScriptInterface::PropertiesList JavaScriptInterface::getObjectPropertiesList( + JSGlobalContextRef context, + const JSObjectPtr& object) const +{ + PropertiesList result; + JSPropertyNameArrayRef properties = JSObjectCopyPropertyNames( + static_cast(context), + static_cast(object->getObject())); + std::size_t count = JSPropertyNameArrayGetCount(properties); + result.reserve(count); + LogDebug("propesties count " << count); + for (std::size_t i = 0; i < count; ++i) { + JSStringRef property = JSPropertyNameArrayGetNameAtIndex(properties, i); + result.push_back(toString(property)); + } + JSPropertyNameArrayRelease(properties); + return result; +} + +JSObjectPtr JavaScriptInterface::makeJSFunctionObject( + JSGlobalContextRef context, + const std::string &name, + js_function_impl functionImplementation) const +{ + LogDebug("Create JS function"); + JSStringRef jsFunName = JSStringCreateWithUTF8CString(name.c_str()); + + JSObjectRef object = JSObjectMakeFunctionWithCallback( + context, + jsFunName, + reinterpret_cast( + functionImplementation)); + + JSStringRelease(jsFunName); + return JSObjectPtr(new JSObject(static_cast(object))); +} + +JSObjectPtr JavaScriptInterface::makeJSClassObject( + JSGlobalContextRef context, + JSObjectDeclaration::ConstClassTemplate classTemplate) const +{ + LogDebug("Create JS object"); + JSObjectRef object = JSObjectMake( + context, + static_cast( + const_cast(classTemplate)), + NULL); + return JSObjectPtr(new JSObject(object)); +} + +JSObjectPtr JavaScriptInterface::makeJSObjectBasedOnInterface( + JSGlobalContextRef context, + const std::string &interfaceName) const +{ + LogDebug("Create JS object base on interface: " << interfaceName); + LogDebug("Context: " << context); + + + JSObjectPtr jsInterfaceObj = getJSObjectProperty(context, + getGlobalObject(context), interfaceName); + JSObjectRef object = JSObjectCallAsConstructor(context, + static_cast(jsInterfaceObj->getObject()), 0, NULL, + NULL); + return JSObjectPtr(new JSObject(static_cast(object))); +} + +JSObjectPtr JavaScriptInterface::makeJSInterface( + JSGlobalContextRef context, + JSObjectDeclaration::ConstClassTemplate classTemplate, + JSObjectDeclaration::ConstructorCallback constructorCallback) const +{ + LogDebug("Create JS interface. Context: " << context); + JSObjectRef object = JSObjectMakeConstructor(context, + static_cast( + const_cast( + classTemplate)), + reinterpret_cast( + constructorCallback) + ); + return JSObjectPtr(new JSObject(static_cast(object))); +} + +JSObjectPtr JavaScriptInterface::createObject(JSGlobalContextRef context, + const JSObjectDeclarationPtr& declaration) +{ + typedef JSObjectDeclaration::Options JO; + + if( declaration->getOptions()) + { + switch (declaration->getOptions()->getType()) + { + case JO::ClassType::Function: + return makeJSFunctionObject( + context, + declaration->getName(), + declaration->getOptions()->getFunctionImpl()); + + case JO::ClassType::Class: + if (declaration->getInterfaceName().empty()) { + return makeJSClassObject( + context, + declaration->getClassTemplate()); + } else { + return makeJSObjectBasedOnInterface( + context, + declaration->getInterfaceName()); + } + + case JO::ClassType::Interface: + return makeJSInterface( + context, + /* product class template */ + declaration->getClassTemplate(), + declaration->getConstructorCallback()); + + default: + LogError("Invalid class type. Making empty JS object."); + return JSObjectPtr(new JSObject( + JSObjectMake(context, NULL, NULL))); + } + } else { + LogDebug("No declaration options"); + return JSObjectPtr(new JSObject( + JSObjectMake( + context, + static_cast( + const_cast( + declaration->getClassTemplate())), + NULL))); + } +} + +JSObjectPtr JavaScriptInterface::getGlobalObject(JSGlobalContextRef context) + const +{ + return JSObjectPtr(new JSObject(static_cast( + JSContextGetGlobalObject(static_cast(context))))); +} + +JSObjectPtr JavaScriptInterface::copyObjectToIframe( + JSGlobalContextRef context, + const JSObjectPtr& iframe, + const std::string& name) +{ + LogError("Copy object to iframe: " << name); + + JSGlobalContextRef jsGlobalContext = + static_cast(context); + + JSObjectRef globalObject = JSContextGetGlobalObject(jsGlobalContext); + + JSValueRef requestedObject = getPropertyObj(jsGlobalContext, + globalObject, + name.c_str()); + CHECK_JSVALUE_IS_UNDEFINED_RETURN(jsGlobalContext, + requestedObject, + JSObjectPtr()); + + JSStringRef requestedObjectStr = + JSStringCreateWithUTF8CString(name.c_str()); + + JSObjectSetProperty(jsGlobalContext, + static_cast(iframe->getObject()), + requestedObjectStr, + requestedObject, + kJSPropertyAttributeReadOnly, + NULL); + + JSStringRelease(requestedObjectStr); + + return JSObjectPtr( + new JSObject(const_cast(requestedObject))); +} + +JavaScriptInterface::ObjectsListPtr +JavaScriptInterface::getIframesList(JSGlobalContextRef ctx) const +{ + JSGlobalContextRef context = static_cast(ctx); + + LogDebug("get global object"); + JSObjectRef globalObject = JSContextGetGlobalObject(context); + + ObjectsListPtr retList = getIframesList(context, globalObject); + + return retList; +} + +JavaScriptInterface::ObjectsListPtr +JavaScriptInterface::getIframesList(JSContextRef context, + JSObjectRef globalObject) const +{ + JSValueRef frames = getPropertyObj(context, globalObject, "frames"); + CHECK_JSVALUE_IS_UNDEFINED_RETURN(context, frames, ObjectsListPtr()); + + JSObjectRef frames_o = JSValueToObject(context, frames, NULL); + CHECK_JSOBJECT_IS_NULL_RETURN(frames_o, ObjectsListPtr()); + + JSValueRef len = getPropertyObj(context, frames_o, "length"); + CHECK_JSVALUE_IS_UNDEFINED_RETURN(context, len, ObjectsListPtr()); + + size_t count = JSValueToNumber(context, len, NULL); + LogDebug("frames_o.length = " << count); + + ObjectsListPtr retList = ObjectsListPtr(new ObjectsList()); + + for (size_t i = 0; i < count; ++i) { + std::stringstream ss; + ss << i; + JSValueRef frame = getPropertyObj(context, + frames_o, + ss.str().c_str()); + if (JSValueIsUndefined(context, frame)) { + LogError("Selected frame is null: frame[" << i << "]"); + continue; + } + JSObjectRef frame_obj = JSValueToObject(context, frame, NULL); + if (!frame_obj) { + LogError("frame_obj is NULL."); + continue; + } + retList->push_back(JSObjectPtr(new JSObject(frame_obj))); + ObjectsListPtr childList = getIframesList(context, frame_obj); + + retList->merge(*childList); + LogDebug("Frame Value Pointer: " << frame); + LogDebug("Frame Object Pointer: " << frame_obj); + } + + return retList; +} + +JSObjectPtr JavaScriptInterface::getJSObjectProperty(JSGlobalContextRef ctx, + const JSObjectPtr& frame, + const std::string& name) const +{ + JSObjectRef frame_js = static_cast(frame->getObject()); + + JSValueRef property = getPropertyObj(ctx, frame_js, name.c_str()); + + JSObjectRef objProp = JSValueToObject(ctx, property, NULL); + + return JSObjectPtr(new JSObject(objProp)); +} + +void JavaScriptInterface::removeIframes(JSGlobalContextRef context) +{ + const char* deleteIframesScript = + "frame_set = document.getElementsByTagName('iframe');" + "len = frame_set.length;" + "for(i=0; i< len; i++)" + " frame_set[0].parentNode.removeChild(frame_set[0]); "; + + JSGlobalContextRef ctx = static_cast(context); + + JSStringRef script_src = JSStringCreateWithUTF8CString(deleteIframesScript); + + JSEvaluateScript(ctx, script_src, 0, 0, 0, 0); + + JSStringRelease(script_src); +} + +void JavaScriptInterface::invokeGarbageCollector(JSGlobalContextRef context) +{ + LogDebug("Garbage collection #1"); + JSGarbageCollect(context); + LogDebug("Garbage collection #2"); + JSGarbageCollect(context); + LogDebug("Garbage collection #3"); + JSGarbageCollect(context); + LogDebug("Garbage collection #4"); + JSGarbageCollect(context); +} diff --git a/src/plugin-loading/javascript_interface.h b/src/plugin-loading/javascript_interface.h new file mode 100644 index 0000000..7b77cc6 --- /dev/null +++ b/src/plugin-loading/javascript_interface.h @@ -0,0 +1,113 @@ +/* + * 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 JavaScriptInterface.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @author Piotr Fatyga (p.fatyga@samsung.com) + * @version 0.1 + * @brief + */ +#ifndef WRT_SRC_PLUGIN_SERVICE_WEBKIT_INTERFACE_H_ +#define WRT_SRC_PLUGIN_SERVICE_WEBKIT_INTERFACE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +//forward declaration of JSConectexRef +extern "C" { + typedef const struct OpaqueJSContext* JSContextRef; + typedef struct OpaqueJSContext* JSGlobalContextRef; + typedef struct OpaqueJSValue* JSObjectRef; +} + +class JavaScriptInterface : DPL::Noncopyable +{ + public: + + typedef std::vector PropertiesList; + + typedef std::list ObjectsList; + typedef std::shared_ptr ObjectsListPtr; + + public: + JSObjectPtr getGlobalObject(JSGlobalContextRef context) const; + + // object creation + JSObjectPtr createObject(JSGlobalContextRef context, + const JSObjectDeclarationPtr& declaration); + + //properties + void setObjectProperty(JSGlobalContextRef context, + const JSObjectPtr& parentObject, + const std::string &propertyName, + const JSObjectPtr& propertyObject); + + void removeObjectProperty(JSGlobalContextRef context, + const JSObjectPtr& parentObject, + const std::string &propertyName); + + PropertiesList getObjectPropertiesList(JSGlobalContextRef context, + const JSObjectPtr& object) const; + + JSObjectPtr copyObjectToIframe(JSGlobalContextRef context, + const JSObjectPtr& iframe, + const std::string& name); + + ObjectsListPtr getIframesList(JSGlobalContextRef context) const; + + void removeIframes(JSGlobalContextRef context); + + void invokeGarbageCollector(JSGlobalContextRef context); + + JSObjectPtr getJSObjectProperty(JSGlobalContextRef ctx, + const JSObjectPtr& frame, + const std::string& name) const; + + private: + JavaScriptInterface() + { + } + + JSObjectPtr makeJSFunctionObject( + JSGlobalContextRef context, + const std::string &name, + js_function_impl functionImplementation) const; + JSObjectPtr makeJSClassObject( + JSGlobalContextRef context, + JSObjectDeclaration::ConstClassTemplate classTemplate) const; + JSObjectPtr makeJSObjectBasedOnInterface( + JSGlobalContextRef context, + const std::string &interfaceName) const; + JSObjectPtr makeJSInterface( + JSGlobalContextRef context, + JSObjectDeclaration::ConstClassTemplate classTemplate, + JSObjectDeclaration::ConstructorCallback constructorCallback) const; + + ObjectsListPtr getIframesList(JSContextRef context, + JSObjectRef object) const; + + friend class DPL::Singleton; +}; + +typedef DPL::Singleton JavaScriptInterfaceSingleton; + +#endif diff --git a/src/plugin-loading/js_page_session.cpp b/src/plugin-loading/js_page_session.cpp new file mode 100644 index 0000000..4f4a5ff --- /dev/null +++ b/src/plugin-loading/js_page_session.cpp @@ -0,0 +1,771 @@ +/* + * 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 plugin_logic.cpp + * @author Piotr Fatyga (p.fatyga@samsung.com) + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of plugin and + * feature loading routines + * @brief This code is intended to work behind view controller + */ + +#include "plugin_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 "explorer.h" +#include "plugin.h" +#include "plugin_model.h" +#include "javascript_interface.h" +#include "js_function_manager.h" +#include "plugin_container_support.h" + +#include "js_page_session.h" + +using namespace std; +using namespace WrtDB; +using namespace WrtPlugins::W3C; + +namespace { +const char *LIBRARY_PATH_SEPARATOR = "/"; +const char* FEATURE_WAC20_DEVICAPIS_NAME = "http://wacapps.net/api/deviceapis"; +} + +class JSPageSession::Impl +{ + private: + typedef std::set LoadedPlugins; + typedef std::set LoadedContexts; + + private: + ///< Widget handle using this session + int m_widgetHandle; + + //view for this session + JSGlobalContextRef m_context; + + bool m_sessionStarted; + + ///< JS object explorer for this session + Explorer* m_objectExplorer; + + PluginContainerSupportPtr m_pluginsSupport; + + ///< All loaded plugins. Each one must be unloaded. Plugins means + //set of features connected with such plugin (library) + LoadedPlugins m_loadedPlugins; + + // Set of currently loaded web pages' contexts. These contexts are + // exactly matching with each frames' global context. + LoadedContexts m_loadedContexts; + + private: + PluginPtr loadLibrary(PluginModelPtr& pluginModel); + + void loadInjectedJavaScript(); + void installStandardFeatures(); + void installRequestedFeatures(); + + //returns true if success or false if failed + bool installPlugin(PluginModelPtr plugin); + bool installPluginOnDemand(PluginModelPtr plugin, + JavaScriptObject& parentObject, + JSGlobalContextRef context); + + void unloadPluginsFromSession(); + + public: + Impl(const PluginContainerSupportPtr& containerSupport); + ~Impl(); + + // Widget session + void startSession(int widgetHandle, + JSGlobalContextRef view, + double scaleFactor, + const char* encodedBundle, + const char* theme); + + void stopSession(); + + void performLibrariesUnload(); + + bool loadPluginOnDemand(const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context); + + void loadFrame(JSGlobalContextRef context); + void unloadFrame(JSGlobalContextRef context); + + void setCustomProperties(double scaleFactor, + const char* encodedBundle, + const char* theme); + + void dispatchJavaScriptEvent(CustomEventType eventType); + +}; + + +JSPageSession::Impl::Impl(const PluginContainerSupportPtr& support) : + m_sessionStarted(false) +{ +// DPL::Log::LogSystemSingleton::Instance().SetTag("WRT_PLUGINS"); + LogDebug("Initializing Page Session"); + m_pluginsSupport = support; + + // explicit call to keep singleton's lifetime until calling destructor. +// JsFunctionManagerSingleton::Instance(); +// JavaScriptInterfaceSingleton::Instance(); +} + +JSPageSession::Impl::~Impl() +{ + if(m_sessionStarted) + { + LogError("Must stop widget session before exit!"); + stopSession(); + } + + LogDebug("Deinitializing plugin Logic..."); +} + +void JSPageSession::Impl::installStandardFeatures() +{ + LogInfo("Installing standard widget features..."); + + //add standard functions + FOREACH(it, JsFunctionManagerSingleton::Instance().getFunctions()) + { + m_objectExplorer->registerObject(*it, NULL); + } + + //add standard objects + LogDebug("Installing standard extensions..."); + + auto standardPlugins = m_pluginsSupport->getStandardPlugins(); + FOREACH(it, standardPlugins) + { + //loadFeatureToSession(*it); + installPlugin(*it); + } + + LogInfo("Standard widget features installed."); +} + +bool JSPageSession::Impl::installPlugin(PluginModelPtr plugin) +{ + Assert(plugin && "Plugin Model is NULL"); + auto library = loadLibrary(plugin); + + LogInfo("Install Plugin '" << library->GetFileName()); + + + if(!library) + { + LogError("Loading library failed"); + return false; + } + + // Register new class + FOREACH(it, *(library->GetClassList())) + { + if (!m_objectExplorer->registerObject(*it, NULL)) { + LogError("Object Registration failed : " << (*it)->getName()); + } + } + + LogDebug("Registered feature."); + return true; +} + +void JSPageSession::Impl::installRequestedFeatures() +{ + LogInfo("Installing requested widget features..."); + + //TODO it have to return LIST NOT SET!!! + WidgetDAOReadOnly widgetDao(m_widgetHandle); + DbWidgetFeatureSet features = widgetDao.getFeaturesList(); + + std::list allowedFeatures; + + FOREACH(it, features) + { + LogInfo("Loading api-feature: " << it->name); + if (it->rejected) { + LogWarning("Api-feature was rejected by ace. (Api-feature name: " + << it->name << ")" ); + continue; + } + + allowedFeatures.push_back(DPL::ToUTF8String(it->name)); + } + + auto widgetType = widgetDao.getWidgetType(); + + //WAC2.0 requirement + if (widgetType == APP_TYPE_WAC20) + { + auto it = find(allowedFeatures.begin(), + allowedFeatures.end(), + FEATURE_WAC20_DEVICAPIS_NAME); + + if (allowedFeatures.end() == it) + { + LogInfo("WAC2.0 Deviceapis not declared but added"); + allowedFeatures.push_front(FEATURE_WAC20_DEVICAPIS_NAME); + } + } + + PluginContainerSupport::PluginsList allowedPlugins; + + FOREACH(feature, allowedFeatures) + { + LogDebug("Processing feature: " << *feature); + + auto plugin = m_pluginsSupport->getPluginForFeature(*feature); + ImplementedObjectsList implObjs = + PluginDAOReadOnly:: + getImplementedObjectsForPluginHandle(plugin->Handle.Get()); + + FOREACH(obj, implObjs) + { + LogDebug("Processing object: " << *obj); + /* This can be optimalized, but would need extra data in database. + There should be a list of features that are allowed to be + installed at widget start */ + if (obj->find(".") == obj->rfind(".")) { + allowedPlugins.push_back(plugin); + LogWarning("Plugin will be added: " + << plugin->LibraryName.Get()); + break; + } + } + } + + FOREACH(plugin, allowedPlugins) + { + LogDebug("Installation plugin: " << (*plugin)->LibraryName.Get()); + installPlugin(*plugin); + } + + LogInfo("requested features installed."); +} + +bool JSPageSession::Impl::loadPluginOnDemand( + const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context) +{ + LogDebug("load plugin with feature"); + + Assert(parentObject.instance && + !parentObject.name.empty() + && "Wrong arguments"); + + if (!m_sessionStarted) { + LogError("Session not started"); + return false; + } +// //TODO here may be a bug. if plugin contains feature rejected and accepted +// LogInfo("Installing feature : " << widgetFeature.name); +// if (widgetFeature.rejected) { +// LogWarning("This api-feature was rejected"); +// return; +// } +// + auto plugin = m_pluginsSupport->getPluginModelById(pluginHandle); + if (!plugin) { + LogError("Failed to load plugin. plugin handle: " << pluginHandle); + return false; + } + + return installPluginOnDemand(plugin,parentObject,context); +} + +bool JSPageSession::Impl::installPluginOnDemand(PluginModelPtr plugin, + JavaScriptObject& parentObject, + JSGlobalContextRef context) +{ + Assert(plugin && "Plugin Model is NULL"); + auto library = loadLibrary(plugin); + + LogInfo("Install Plugin '" << library->GetFileName()); + + if(!library) + { + LogError("Loading library failed"); + return false; + } + + if(!(parentObject.instance)) + { + LogError("NULL pointer value"); + return false; + } + + JSObjectPtr parent(new JSObject(parentObject.instance)); + + if (!parent->getObject()) + { + LogError("NULL pointer value"); + assert(false); + return false; + } + + FOREACH(it, *(library->GetClassList())) + { + bool installationStatus = + m_objectExplorer->registerObject(*it, + parentObject.name, + parent, + context); + + if(!installationStatus) + { + LogError("Object Registration failed : " << (*it)->getName() + << "; Parent object name: " << parentObject.name); + return false; + } + } + + LogDebug("Plugin on demand registration completed"); + return true; +} + +void JSPageSession::Impl::setCustomProperties(double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + LogInfo("set properties of window object " << scaleFactor << ", " + << encodedBundle << ", " << theme); + + m_objectExplorer->getWindowPropertySupport() + ->setScaleToNavigatorProperty(scaleFactor); + m_objectExplorer->getWindowPropertySupport() + ->setBundleToWindowProperty(encodedBundle); + m_objectExplorer->getWindowPropertySupport() + ->setThemeToNavigatorProperty(theme); +} + +void JSPageSession::Impl::dispatchJavaScriptEvent(CustomEventType eventType) +{ + // Check if session is already started + if (!m_sessionStarted) { + LogWarning("Session not started!"); + return; + } + + LogInfo("Request dispatching javascript event"); + m_objectExplorer->callEventListeners(eventType); +} + +void JSPageSession::Impl::loadInjectedJavaScript() +{ + LogInfo("Entered"); + + std::string DIR_PATH = "/usr/etc/wrt/injected-javascript"; + std::string JS_EXTENSION = ".js"; + + DIR *dir = opendir(DIR_PATH.c_str()); + + if (!dir) { + LogError("opendir(\"" << DIR_PATH << "\") error!" ); + return; + } + + struct dirent* libdir; + std::list jsFiles; + + // make file list from DIR_PATH + while ((libdir = readdir(dir)) != 0) + { + if (strncmp(libdir->d_name, ".", 2) == 0 || + strncmp(libdir->d_name, "..", 3) == 0) + { + continue; + } + + std::string filepath = DIR_PATH; + filepath += "/"; + filepath += libdir->d_name; + + std::string lowercase = filepath; + std::transform(lowercase.begin(), lowercase.end(), lowercase.begin(), + towlower); + + if( lowercase.rfind(JS_EXTENSION) == std::string::npos || + lowercase.length() != + lowercase.rfind(JS_EXTENSION) + JS_EXTENSION.length() ) + { + LogError("This is not js file" << filepath); + continue; + } + + struct stat tmp; + + if (stat(filepath.c_str(), &tmp) == -1) { + LogError("Failed to open file " << filepath); + continue; + } + + if (!S_ISREG(tmp.st_mode)) { + LogError("This is not a regular file " << filepath); + continue; + } + + LogInfo("Added : " << filepath); + jsFiles.push_back(filepath); + } + + closedir(dir); + + + FOREACH(it, jsFiles) + { + LogDebug("load file : " << (*it)); + // load file + std::string content; + std::ifstream fin(it->c_str()); + + while(fin.good()) + { + string line; + std::getline(fin, line); + content += line + "\n"; + } + + fin.close(); + // execute + if(!content.empty()) + { + JSValueRef exception = NULL; + JSStringRef script = + JSStringCreateWithUTF8CString(content.c_str()); + + JSEvaluateScript(m_context, script, NULL, NULL, 1, &exception); + + JSStringRelease(script); + + if(exception) + { + LogDebug("Exception Occured while injecting javascript " + "file. : " << *it); + + JSStringRef exceptionJSString = + JSValueToStringCopy(m_context, exception, NULL); + size_t size = + JSStringGetMaximumUTF8CStringSize(exceptionJSString); + char* exceptionString = new char[size]; + JSStringGetUTF8CString(exceptionJSString, + exceptionString, size); + LogDebug("Exception : " << exceptionString); + + delete [] exceptionString; + JSStringRelease(exceptionJSString); + } + } + } +} + +void JSPageSession::Impl::startSession(int widgetHandle, + JSGlobalContextRef context, + double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + LogInfo("Starting widget session..."); + + // Check if corresponding session if not already created + if (m_sessionStarted) { + LogWarning("Session already started!"); + return; + } + + // Create js object explorer object + m_objectExplorer = new Explorer(context); + + m_sessionStarted = true; + m_widgetHandle = widgetHandle; + m_loadedPlugins.clear(); + m_context = context; + + // Register standard features + installStandardFeatures(); + + // Register special features + installRequestedFeatures(); + + // set scale, bundle as window's property + setCustomProperties(scaleFactor, encodedBundle, theme); + + // Load injected javascript files + loadInjectedJavaScript(); + LogInfo("Widget session started."); +} + +void JSPageSession::Impl::stopSession() +{ + LogInfo("Stopping widget session..."); + + if (!m_sessionStarted) { + LogWarning("Session not started!"); + return; + } + + unloadPluginsFromSession(); + m_sessionStarted = false; + + LogInfo("Widget session stopped."); +} + + +void JSPageSession::Impl::unloadPluginsFromSession() +{ + LogDebug("Unload plugins from session"); + + m_objectExplorer->removePluginsFromIframes(); + m_objectExplorer->cleanIframesData(); + + // delete js object for overlayed js functions + FOREACH(it, JsFunctionManagerSingleton::Instance().getFunctions()) + { + m_objectExplorer->deregisterObject(*it); + } + + // delete js object for plugins + FOREACH(pluginIt, m_loadedPlugins) + { + LogDebug("Unregistering plugin " << (*pluginIt)->GetFileName()); + + (*pluginIt)->OnWidgetStop(m_widgetHandle); + LogDebug("Emitted WidgetStop for plugin: " << + (*pluginIt)->GetFileName()); + + FOREACH(it, *((*pluginIt)->GetClassList())) + { + m_objectExplorer->deregisterObject(*it); + } + } + + JavaScriptInterfaceSingleton::Instance().invokeGarbageCollector(m_context); + + m_loadedPlugins.clear(); + + delete m_objectExplorer; + m_objectExplorer = NULL; +} + + + + +void JSPageSession::Impl::performLibrariesUnload() +{ +#if 0 + LogDebug("Perform library unload"); + + size_t unloadedLibraries = 0; + + FOREACH(pluginIt, m_loadedPlugins) + { + LogDebug("Preparing library: " << (*pluginIt)->LibraryName.Get()); + + PluginPtr plugin = (*pluginIt)->LibraryInstance.Get(); + if (!plugin) { + LogWarning("Library not loaded " << (*pluginIt)->LibraryName.Get()); + continue; + } + unloadedLibraries++; + (*pluginIt)->LibraryInstance.Set(PluginPtr()); + } + + LogInfo("unloaded " << unloadedLibraries << " unreferenced libraries!"); +#endif +} + +PluginPtr JSPageSession::Impl::loadLibrary(PluginModelPtr& pluginModel) +{ + PluginPtr pluginLib = pluginModel->LibraryInstance.Get(); + if (!pluginLib) + { + std::string path = pluginModel->LibraryPath.Get() + + std::string(LIBRARY_PATH_SEPARATOR) + + pluginModel->LibraryName.Get(); + + pluginLib = Plugin::LoadFromFile(path); + + if (!pluginLib) + { + LogError("Loading library failed"); + } else + { + pluginModel->LibraryInstance.Set(pluginLib); + + LogDebug("On widget start"); + // This is first time for this plugin, start widget Session + pluginLib->OnWidgetStart( + m_widgetHandle); + m_loadedPlugins.insert(pluginLib); + + FOREACH(context, m_loadedContexts) + { + pluginLib->OnFrameLoad(*context); + } + } + } + else + { + LogDebug("Get from LibraryInstance"); + LogDebug("On widget start"); + // This is first time for this plugin, start widget Session + pluginLib->OnWidgetStart( + m_widgetHandle); + m_loadedPlugins.insert(pluginLib); + + FOREACH(context, m_loadedContexts) + { + pluginLib->OnFrameLoad(*context); + } + } + + return pluginLib; +} + + +void JSPageSession::Impl::loadFrame(JSGlobalContextRef context) +{ + LogDebug("Load a frame"); + + if (!m_sessionStarted) { + LogWarning("Session NOT started!"); + return; + } + + m_loadedContexts.insert(context); + + FOREACH(pluginIt, m_loadedPlugins) + { + LogDebug("load plugin to frame" << (*pluginIt)->GetFileName()); + + (*pluginIt)->OnFrameLoad(context); + } + + m_objectExplorer->loadFrame(context); +} + +void JSPageSession::Impl::unloadFrame(JSGlobalContextRef context) +{ + LogDebug("Unload a frame"); + + if (!m_sessionStarted) { + LogWarning("Session NOT started!"); + return; + } + + m_loadedContexts.erase(context); + + FOREACH(pluginIt, m_loadedPlugins) + { + LogDebug("unload plugin to frame" << (*pluginIt)->GetFileName()); + + (*pluginIt)->OnFrameUnload(context); + } + + m_objectExplorer->unloadFrame(context); +} + + +void JSPageSession::startSession(int widgetHandle, + JSGlobalContextRef ctx, + double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + m_impl->startSession(widgetHandle, ctx, scaleFactor, encodedBundle, theme); +} + +void JSPageSession::stopSession() +{ + m_impl->stopSession(); +} + +void JSPageSession::performLibrariesUnload() +{ + m_impl->performLibrariesUnload(); +} + +bool JSPageSession::loadPluginOnDemand( + const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context) +{ + return m_impl->loadPluginOnDemand(pluginHandle, parentObject, context); +} + +void JSPageSession::setCustomProperties(double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + m_impl->setCustomProperties(scaleFactor, encodedBundle, theme); +} + +void JSPageSession::dispatchJavaScriptEvent(CustomEventType eventType) +{ + m_impl->dispatchJavaScriptEvent(eventType); +} + +void JSPageSession::loadFrame(JSGlobalContextRef context) +{ + m_impl->loadFrame(context); +} + +void JSPageSession::unloadFrame(JSGlobalContextRef context) +{ + m_impl->unloadFrame(context); +} + +JSPageSession::JSPageSession(const PluginContainerSupportPtr& containerSupport) + : m_impl(new JSPageSession::Impl(containerSupport)) +{ +} + +JSPageSession::~JSPageSession() +{ +} diff --git a/src/plugin-loading/js_page_session.h b/src/plugin-loading/js_page_session.h new file mode 100644 index 0000000..5f1ebc2 --- /dev/null +++ b/src/plugin-loading/js_page_session.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 js_page_session.h + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 1.0 + */ +#ifndef WRT_PLUGIN_JS_PAGE_SESSION_H_ +#define WRT_PLUGIN_JS_PAGE_SESSION_H_ + +#include +#include +#include +#include +#include "js_types.h" + +using namespace WrtPlugins::W3C; + +class JSPageSession +{ + public: + // Widget session + void startSession(int widgetHandle, + JSGlobalContextRef view, + double scaleFactor, + const char* encodedBundle, + const char* theme); + + void stopSession(); + + //TODO im not sure if it is needed. I think it should be hidden + void performLibrariesUnload(); + bool loadPluginOnDemand(const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context); + + void loadFrame(JSGlobalContextRef context); + void unloadFrame(JSGlobalContextRef context); + + // reset custom window properties. (Tizen requirements) + void setCustomProperties(double scaleFactor, + const char* encodedBundle, + const char* theme); + + void dispatchJavaScriptEvent(CustomEventType eventType); + + JSPageSession(const PluginContainerSupportPtr& containerSupport); + + virtual ~JSPageSession(); + + private: + class Impl; + std::unique_ptr m_impl; +}; + +typedef std::shared_ptr JSPageSessionPtr; + +#endif // PLUGIN_LOGIC_H diff --git a/src/plugin-loading/js_types.h b/src/plugin-loading/js_types.h new file mode 100644 index 0000000..bb85699 --- /dev/null +++ b/src/plugin-loading/js_types.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file js_types.h + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 1.0 + */ + +#ifndef WRT_PLUGIN_JS_TYPES_H_ +#define WRT_PLUGIN_JS_TYPES_H_ + +//forward declaration of JSConectexRef +extern "C" { + typedef struct OpaqueJSContext* JSGlobalContextRef; + typedef struct OpaqueJSValue* JSObjectRef; +} + +struct JavaScriptObject +{ + JSObjectRef instance; + std::string name; +}; + +#endif diff --git a/src/plugin-loading/plugin.cpp b/src/plugin-loading/plugin.cpp new file mode 100644 index 0000000..9ab4518 --- /dev/null +++ b/src/plugin-loading/plugin.cpp @@ -0,0 +1,258 @@ +/* + * 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 plugin.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of plugin + */ +#include "plugin.h" +#include +#include +#include + +Plugin::Plugin(const std::string &fileName, + void *libHandle, + on_widget_start_proc *apiOnWidgetStart, + on_widget_init_proc *apiOnWidgetInit, + on_widget_stop_proc *apiOnWidgetStop, + on_frame_load_proc* apiOnFrameLoad, + on_frame_unload_proc* apiOnFrameUnload, + const ClassPtrList &apiClassList) : + m_fileName(fileName), + m_libHandle(libHandle), + m_apiOnWidgetStart(apiOnWidgetStart), + m_apiOnWidgetInit(apiOnWidgetInit), + m_apiOnWidgetStop(apiOnWidgetStop), + m_apiOnFrameLoad(apiOnFrameLoad), + m_apiOnFrameUnload(apiOnFrameUnload), + m_apiClassList(apiClassList) +{ +} + +Plugin::~Plugin() +{ + LogInfo("Unloading plugin library: " << m_fileName << "..."); + + // Unload library + if (dlclose(m_libHandle) != 0) { + LogError("Cannot close plugin handle"); + } else { + LogDebug("Library is unloaded"); + } +} + +PluginPtr Plugin::LoadFromFile(const std::string& fileName) +{ + LogDebug("LoadFromFile" << fileName); + + LogDebug("Loading plugin: " << fileName); + + void *dllHandle; + dllHandle = dlopen(fileName.c_str(), RTLD_NOW); + + if (dllHandle == NULL) { + LogError( + "Failed to load plugin: " << fileName << ". Reason: " << dlerror()); + PluginPtr empty; + return empty; + } + + // Load new plugin API + on_widget_start_proc *onWidgetStartProcPtr = NULL; + on_widget_stop_proc *onWidgetStopProcPtr = NULL; + on_widget_init_proc *onWidgetInitProcPtr = NULL; + on_frame_load_proc *onFrameLoadProcPtr = NULL; + on_frame_unload_proc *onFrameUnloadProcPtr = NULL; + + const js_entity_definition_t *rawClassList = NULL; + get_widget_entity_map_proc *getWidgetEntityMapProcPtr = NULL; + + onWidgetStartProcPtr = + reinterpret_cast( + dlsym(dllHandle, PLUGIN_WIDGET_START_PROC_NAME)); + onWidgetInitProcPtr = + reinterpret_cast( + dlsym(dllHandle, PLUGIN_WIDGET_INIT_PROC_NAME)); + onWidgetStopProcPtr = + reinterpret_cast( + dlsym(dllHandle, PLUGIN_WIDGET_STOP_PROC_NAME)); + onFrameLoadProcPtr = + reinterpret_cast( + dlsym(dllHandle, PLUGIN_FRAME_LOAD_PROC_NAME)); + onFrameUnloadProcPtr = + reinterpret_cast( + dlsym(dllHandle, PLUGIN_FRAME_UNLOAD_PROC_NAME)); + getWidgetEntityMapProcPtr = + reinterpret_cast( + dlsym(dllHandle, PLUGIN_GET_CLASS_MAP_PROC_NAME)); + + if( getWidgetEntityMapProcPtr ) + { + rawClassList = (*getWidgetEntityMapProcPtr)(); + LogDebug("rawClassList : " << rawClassList << "by getWidgetClassMapProcPtr()"); + } + else + { + rawClassList = + static_cast(dlsym(dllHandle, + PLUGIN_CLASS_MAP_NAME)); + LogDebug("rawClassList : " << rawClassList ); + } + + + if (NULL == onWidgetStartProcPtr || NULL == onWidgetStopProcPtr || + /*NULL == onWidgetInitProcPtr ||*/ NULL == rawClassList) { + LogWarning("#####"); + LogWarning( + "##### Warning: The following plugin does not support new plugin API."); + LogWarning( + "##### Old plugin API is deprecated. Please update it to new API"); + LogWarning("#####"); + LogWarning( + "##### Plugin: " << fileName << + " has got deprecated or invalid API"); + LogWarning("#####"); + + // Will not load plugin + dlclose(dllHandle); + + PluginPtr empty; + return empty; + } + + LogInfo("#####"); + LogInfo("##### Plugin: " << fileName << " supports new plugin API"); + LogInfo("#####"); + LogInfo("##### $onWidgetStartProc: " << onWidgetStartProcPtr); + LogInfo("##### $onWidgetInitProc: " << onWidgetInitProcPtr); + LogInfo("##### $onWidgetStopProc " << onWidgetStopProcPtr); + LogInfo("##### $onFrameLoadProc " << onFrameLoadProcPtr); + LogInfo("##### $onFrameUnloadProc " << onFrameUnloadProcPtr); + LogInfo("##### $classMap: " << reinterpret_cast(rawClassList)); + LogInfo("##### "); + LogInfo("##### Class map:"); + + const js_entity_definition_t *rawEntityListIterator = rawClassList; + ClassPtrList classList(new Plugin::ClassList()); + + // Parse all class definitions + while (rawEntityListIterator->parent_name != NULL && + rawEntityListIterator->object_name != NULL) + { + // Logging + LogInfo("#####"); + LogInfo("##### [" << rawEntityListIterator->object_name << "]: "); + LogInfo("##### Interface: " << + rawEntityListIterator->interface_name); + LogInfo("##### Parent: " << rawEntityListIterator->parent_name); + + // Register class + classList->push_back(ClassPtr(new Class(rawEntityListIterator))); + + // Go to next class + ++rawEntityListIterator; + } + + LogInfo("#####"); + + // Load export table + LogDebug("Plugin successfuly loaded"); + + // Insert to loaded modules list + + PluginPtr instance(new Plugin(fileName, + dllHandle, + onWidgetStartProcPtr, + onWidgetInitProcPtr, + onWidgetStopProcPtr, + onFrameLoadProcPtr, + onFrameUnloadProcPtr, + classList)); + + return instance; +} + +std::string Plugin::GetFileName() const +{ + return m_fileName; +} + +void Plugin::OnWidgetStart(int widgetId) +{ + if (NULL != m_apiOnWidgetStart) + { + (*m_apiOnWidgetStart)(widgetId); + } + else + { + LogWarning("OnWidgetStart not set!"); + } +} + +void Plugin::OnWidgetInit(feature_mapping_interface_t* mapping) +{ + Assert(NULL != mapping && "NULL mapping interface provided"); + if (NULL != m_apiOnWidgetInit) + { + (*m_apiOnWidgetInit)(mapping); + } + else + { + LogWarning("OnWidgetInit not set!"); + } +} + +void Plugin::OnWidgetStop(int widgetId) +{ + if (NULL != m_apiOnWidgetStop) + { + (*m_apiOnWidgetStop)(widgetId); + } + else + { + LogWarning("OnWidgetStop not set!"); + } +} + +void Plugin::OnFrameLoad(java_script_context_t context) +{ + if (NULL != m_apiOnFrameLoad) + { + (*m_apiOnFrameLoad)(context); + } + else + { + LogWarning("OnFrameLoad not set!"); + } +} + +void Plugin::OnFrameUnload(java_script_context_t context) +{ + if (NULL != m_apiOnFrameUnload) + { + (*m_apiOnFrameUnload)(context); + } + else + { + LogWarning("OnFrameUnload not set!"); + } +} + +const Plugin::ClassPtrList Plugin::GetClassList() const +{ + return m_apiClassList; +} diff --git a/src/plugin-loading/plugin.h b/src/plugin-loading/plugin.h new file mode 100644 index 0000000..d3eec30 --- /dev/null +++ b/src/plugin-loading/plugin.h @@ -0,0 +1,92 @@ +/* + * 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 plugin.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of plugin + */ +#ifndef WRT_SRC_PLUGIN_SERVICE_PLUGIN_H_ +#define WRT_SRC_PLUGIN_SERVICE_PLUGIN_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +class Plugin; +typedef DPL::SharedPtr PluginPtr; + +class Plugin : private DPL::Noncopyable +{ + public: + typedef JSObjectDeclaration Class; + typedef JSObjectDeclarationPtr ClassPtr; + typedef std::list ClassList; + typedef DPL::SharedPtr ClassPtrList; + + private: + ///< Plug-in identifier. Currently plug-in file name is used as the ID + std::string m_fileName; + + ///< Handle for the plug-in library. A plug-in is a dynamic loadable library + void* m_libHandle; + + // Plugin API + on_widget_start_proc* m_apiOnWidgetStart; + on_widget_init_proc* m_apiOnWidgetInit; + on_widget_stop_proc* m_apiOnWidgetStop; + on_frame_load_proc* m_apiOnFrameLoad; + on_frame_unload_proc* m_apiOnFrameUnload; + const ClassPtrList m_apiClassList; + + Plugin(const std::string &fileName, + void *libHandle, + on_widget_start_proc* apiOnWidgetStart, + on_widget_init_proc* apiOnWidgetInit, + on_widget_stop_proc* apiOnWidgetStop, + on_frame_load_proc* apiOnFrameLoad, + on_frame_unload_proc* apiOnFrameUnload, + const ClassPtrList &apiClassList); + + public: + virtual ~Plugin(); + + // Loading + static PluginPtr LoadFromFile(const std::string &fileName); + + // Filename + std::string GetFileName() const; + + // API + void OnWidgetStart(int widgetId); + + void OnWidgetInit(feature_mapping_interface_t *interface); + + void OnWidgetStop(int widgetId); + + void OnFrameLoad(java_script_context_t context); + + void OnFrameUnload(java_script_context_t context); + + const ClassPtrList GetClassList() const; +}; + +#endif // PLUGIN_H diff --git a/src/plugin-loading/plugin_container_support.cpp b/src/plugin-loading/plugin_container_support.cpp new file mode 100644 index 0000000..b8a1a08 --- /dev/null +++ b/src/plugin-loading/plugin_container_support.cpp @@ -0,0 +1,262 @@ +/* + * 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 plugin_container_support.h + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 1.0 + */ + +#include "plugin_container_support.h" + +#include + +#include +#include + +namespace { +const char *STANDARD_FEATURES_LIST_FILE = "standard-features-list"; +} + +using namespace WrtDB; + +PluginContainerSupport::PluginContainerSupport() +{ + // Retrieve plugin model list + readPlugins(); + + // Retrieve features model list + readFeatures(); + + // Reading standard features list from file + readStandardFeaturesList(); +} + +PluginContainerSupport::~PluginContainerSupport() +{ + // Remove all plugin models + m_pluginModels.clear(); + + // Remove all feature models + m_featureModels.clear(); + + // Clear standard features list + m_standardFeatureList.clear(); +} + +void PluginContainerSupport::registerPluginModel(DbPluginHandle handle) +{ + PluginModelPtr model = getPluginModelById(handle); + + if (model) { + LogDebug("Model for plugin:" << handle << " already registered"); + return; + } + + LogDebug("Creating Model for plugin: " << handle); + + if (PluginDAOReadOnly::INSTALLATION_COMPLETED != + PluginDAOReadOnly::getInstallationStateForHandle(handle)) + { + LogWarning("Failed To CreateModel for handle " << handle); + return; + } + + model.Reset(new PluginModel(handle)); + + LogInfo("Model Created. Handle: " << + handle << ", name: " << model->LibraryName.Get()); + + m_pluginModels.insert(model); +} + +void PluginContainerSupport::readPlugins() +{ + LogDebug("Retrieving installed plugin list..."); + PluginHandleList plugins = PluginDAOReadOnly::getPluginHandleList(); + + FOREACH(it, plugins) + { + registerPluginModel(*it); + } +} + +void PluginContainerSupport::readFeatures() +{ + std::map featureNames = FeatureDAOReadOnly::GetNames(); + std::multimap deviceCapabilities = FeatureDAOReadOnly::GetDevCapWithFeatureHandle(); + + FOREACH(pluginIt, m_pluginModels) + { + PluginModelPtr model = *pluginIt; + LogDebug("Analyzing Plugin model: " << model->Handle.Get()); + + WrtDB::DbPluginHandle pluginHandle = model->Handle.Get(); + FeatureHandleListPtr featureHandles = model->FeatureHandles.Get(); + + FOREACH(featureIt, *featureHandles) + { + LogDebug("Analyzing feature: " << *featureIt); + FeatureModelPtr model = getFeatureModel(*featureIt); + if (model) { + LogDebug("Model for feature:" << *featureIt << " already created"); + continue; + } + + LogDebug("Creating Model for feature:" << *featureIt); + + model.Reset(new FeatureModel(*featureIt)); + + std::set devCapList; + auto ret = deviceCapabilities.equal_range(*featureIt); + for (auto devCapIt = ret.first; devCapIt != ret.second; devCapIt++) + { + devCapList.insert((*devCapIt).second); + } + model->SetData(featureNames.find(*featureIt)->second, devCapList, pluginHandle); + m_featureModels.insert(model); + } + } +} + +void PluginContainerSupport::readStandardFeaturesList() +{ + LogDebug("Reading standard features list from file..."); + + std::string path = GlobalConfig::GetDevicePluginPath(); + path += "/"; + path += STANDARD_FEATURES_LIST_FILE; + + std::ifstream standardFeatureFile; + standardFeatureFile.open(path.c_str(), std::ifstream::in); + + if (!standardFeatureFile.is_open()) { + LogError("Reading standard features list from file FAILED."); + return; + } + + char buffer[1024]; + + while (!standardFeatureFile.eof()) { + standardFeatureFile.getline(buffer, sizeof(buffer)); + + if (buffer[0] == '\0') { + break; + } + + LogDebug("Standard Feature: <" << buffer << ">"); + m_standardFeatureList.push_back(std::string(buffer)); + } + + standardFeatureFile.close(); +} + +FeatureModelPtr +PluginContainerSupport::getFeatureModel(const std::string &name) const +{ + FOREACH(iter, m_featureModels) + { + if ((*iter)->Name.Get() == name) { + return *iter; + } + } + + return FeatureModelPtr(); +} + +FeatureModelPtr +PluginContainerSupport::getFeatureModel(const FeatureHandle handle) const +{ + FOREACH(iter, m_featureModels) + { + if ((*iter)->FHandle.Get() == handle) { + return *iter; + } + } + + return FeatureModelPtr(); +} + +PluginModelPtr +PluginContainerSupport::getPluginModelById(DbPluginHandle handle) const +{ + FOREACH(pluginModel, m_pluginModels) + { + if ((*pluginModel)->Handle.Get() == handle) { + return *pluginModel; + } + } + + return PluginModelPtr(); +} + +PluginModelPtr +PluginContainerSupport::getPluginModel(const FeatureModelPtr &feature) const +{ + LogDebug(""); + Assert(feature && "Null Ptr for feature model"); + LogDebug("Feature located in plugin: " << feature->PHandle.Get()); + + return getPluginModelById(feature->PHandle.Get()); +} + +PluginContainerSupport::FeaturesList +PluginContainerSupport::getStandardFeatures() const +{ + //TODO use move + FeaturesList standardFeatures; + + FOREACH(it, m_standardFeatureList) + { + FeatureModelPtr feature = getFeatureModel(*it); + if (!feature) { + LogWarning("Feature does not exist in DB " << *it); + continue; + } + + //TODO maybe it should be sorted + standardFeatures.push_back(feature); + } + + return standardFeatures; +} + +PluginContainerSupport::PluginsList +PluginContainerSupport::getStandardPlugins() const +{ + PluginsList plugins; + + auto features = getStandardFeatures(); + + FOREACH(it, features) + { + auto plugin = getPluginModel(*it); + if(!plugin) + { + LogError("PluginModel not found"); + continue; + } + + plugins.push_back(plugin); + } + + return plugins; +} + +PluginModelPtr +PluginContainerSupport::getPluginForFeature(const std::string& featureName) +{ + return getPluginModel(getFeatureModel(featureName)); +} diff --git a/src/plugin-loading/plugin_container_support.h b/src/plugin-loading/plugin_container_support.h new file mode 100644 index 0000000..e8b38c4 --- /dev/null +++ b/src/plugin-loading/plugin_container_support.h @@ -0,0 +1,86 @@ +/* + * 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 plugin_container_support.h + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @version 1.0 + */ +#ifndef PLUGIN_CONTAINER_SUPPORT_H +#define PLUGIN_CONTAINER_SUPPORT_H + +#include +#include +#include + +#include +#include + +#include "plugin_model.h" + +class PluginContainerSupport +{ +public: + typedef std::list FeaturesList; + typedef std::list PluginsList; + +private: + // Standard features + typedef std::list StandardFeatureList; + + // Main feature list. Always equal to DB feature list + typedef std::set FeatureModelContainer; + + // Main plugin list. Always equal to DB plugin list + typedef std::set PluginModelsContainer; + + StandardFeatureList m_standardFeatureList; + + PluginModelsContainer m_pluginModels; + + FeatureModelContainer m_featureModels; + +private: + // Reading + void readPlugins(); + void readFeatures(); + void readStandardFeaturesList(); + + // Plugin models + void registerPluginModel(WrtDB::DbPluginHandle handle); + + + WrtDB::FeatureModelPtr getFeatureModel(const std::string &name) const ; + WrtDB::FeatureModelPtr getFeatureModel(WrtDB::FeatureHandle handle) const ; + + PluginModelPtr getPluginModel(const WrtDB::FeatureModelPtr &feature) const; + +public: + PluginContainerSupport(); + + FeaturesList getStandardFeatures() const; + PluginsList getStandardPlugins() const; + + PluginModelPtr getPluginForFeature(const std::string& featureName); + + PluginModelPtr getPluginModelById(WrtDB::DbPluginHandle handle) const; + + ~PluginContainerSupport(); +}; + + +typedef std::shared_ptr PluginContainerSupportPtr; + +#endif // PLUGIN_CONTAINER_SUPPORT_H diff --git a/src/plugin-loading/plugin_iframe_support.cpp b/src/plugin-loading/plugin_iframe_support.cpp new file mode 100644 index 0000000..311d847 --- /dev/null +++ b/src/plugin-loading/plugin_iframe_support.cpp @@ -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 plugin_iframe_support.cpp + * @version 1.0 + * @brief + */ + +#include "plugin_iframe_support.h" + +#include +#include + +void IframesSupport::registerDeclaration( + const JSObjectDeclarationPtr& declaration) +{ + LogDebug("Registration iframes-supported plugins " << + declaration->getName()); + + if(declaration->getParentName().find('.') != std::string::npos) + { + LogWarning("The object will not be loaded to iframes"); + return; + } + m_iframesObjects.push_back(declaration); +} + +void IframesSupport::registerIframe(const JSObjectPtr& iframe){ + LogDebug("LoadedIframes size: " << m_loadedIframes.size() ); + + m_loadedIframes.insert(iframe); +} + +void IframesSupport::unregisterIframe(const JSObjectPtr& iframe){ + LogDebug("LoadedIframes size: " << m_loadedIframes.size() ); + + auto it_loaded = std::find_if(m_loadedIframes.begin(), + m_loadedIframes.end(), + std::bind2nd(EqualToJSObjectPtr(), iframe)); + //object not found, so thats the new iframe + if(it_loaded == m_loadedIframes.end()){ + LogDebug("Nothing to unregister"); + return; + } + + m_loadedIframes.erase(it_loaded); +} + +bool IframesSupport::hasIframes() const +{ + return !m_loadedIframes.empty(); +} + +IframesSupport::DeclarationsList IframesSupport::getIframeObjects() const +{ + return m_iframesObjects; +} + +void IframesSupport::clean() +{ + m_iframesObjects.clear(); + m_loadedIframes.clear(); +} diff --git a/src/plugin-loading/plugin_iframe_support.h b/src/plugin-loading/plugin_iframe_support.h new file mode 100644 index 0000000..ce5cd14 --- /dev/null +++ b/src/plugin-loading/plugin_iframe_support.h @@ -0,0 +1,68 @@ +/* + * 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 plugin_iframe_support.h + * @version 1.0 + * @brief + */ + +#ifndef _WRTENGINE_SRC_PLUGINSERVICE_IFRAME_SUPPORT_H_ +#define _WRTENGINE_SRC_PLUGINSERVICE_IFRAME_SUPPORT_H_ + +#include +#include +#include +#include +#include "javascript_interface.h" + +class IframesSupport +{ + public: + typedef std::list DeclarationsList; + + public: + void registerDeclaration(const JSObjectDeclarationPtr& declaration); + + void registerIframe(const JSObjectPtr& iframe); + + void unregisterIframe(const JSObjectPtr& iframe); + + DeclarationsList getIframeObjects() const; + + bool hasIframes() const; + + void clean(); + + private: + std::list m_iframesObjects; + std::set m_loadedIframes; + + // used to find matching object from m_loadedIframes + struct EqualToJSObjectPtr + { + typedef JSObjectPtr first_argument_type; + typedef JSObjectPtr second_argument_type; + typedef bool result_type; + + result_type operator()(const first_argument_type &s1, + const second_argument_type &s2) const + { + return (s1->getObject() == s2->getObject()); + } + }; +}; + +#endif diff --git a/src/plugin-loading/plugin_logic.cpp b/src/plugin-loading/plugin_logic.cpp new file mode 100644 index 0000000..2c2fc6c --- /dev/null +++ b/src/plugin-loading/plugin_logic.cpp @@ -0,0 +1,342 @@ +/* + * 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 plugin_logic.cpp + * @author Piotr Fatyga (p.fatyga@samsung.com) + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of plugin and + * feature loading routines + * @brief This code is intended to work behind view controller + */ + +#include "plugin_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 "explorer.h" +#include "plugin.h" +#include "plugin_model.h" +#include "javascript_interface.h" +#include "js_function_manager.h" +#include "plugin_container_support.h" + +#include "js_page_session.h" + +using namespace std; +using namespace WrtDB; +using namespace WrtPlugins::W3C; + +namespace { +const char *LIBRARY_PATH_SEPARATOR = "/"; +const char* FEATURE_WAC20_DEVICAPIS_NAME = "http://wacapps.net/api/deviceapis"; +} + +class PluginLogic::Impl +{ + PluginContainerSupportPtr m_pluginsSupport; + + typedef std::map PagesSessionsSet; + PagesSessionsSet m_sessions; + + + public: + Impl(); + ~Impl(); + + // Widget session + void startSession(int widgetHandle, + JSGlobalContextRef context, + double scaleFactor, + const char* encodedBundle, + const char* theme); + + void stopSession(JSGlobalContextRef context); + + void performLibrariesUnload(); + + bool loadPluginOnDemand(const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context); + + void loadFrame(JSGlobalContextRef context); + void unloadFrame(JSGlobalContextRef context); + + void setCustomProperties(JSGlobalContextRef ctx, + double scaleFactor, + const char* encodedBundle, + const char* theme); + + void dispatchJavaScriptEvent(JSGlobalContextRef ctx, + CustomEventType eventType); + +}; + +IMPLEMENT_SINGLETON(PluginLogic); + +PluginLogic::Impl::Impl() +{ + DPL::Log::LogSystemSingleton::Instance().SetTag("WRT_PLUGINS"); + LogDebug("Initializing Plugin Logic..."); + m_pluginsSupport = PluginContainerSupportPtr(new PluginContainerSupport()); + + // explicit call to keep singleton's lifetime until calling destructor. + JsFunctionManagerSingleton::Instance(); + JavaScriptInterfaceSingleton::Instance(); +} + +PluginLogic::Impl::~Impl() +{ + FOREACH(it, m_sessions) + { + LogError("Must stop widget session before exit!"); + it->second->stopSession(); + } + + LogDebug("Deinitializing plugin Logic..."); +} + + +void PluginLogic::startSession(int widgetHandle, + JSGlobalContextRef ctx, + double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + m_impl->startSession(widgetHandle, ctx, scaleFactor, encodedBundle, theme); +} + +void PluginLogic::stopSession(JSGlobalContextRef context) +{ + m_impl->stopSession(context); +} + +void PluginLogic::performLibrariesUnload() +{ + LogError("Libraries unload TURNED OFF"); +// m_impl->performLibrariesUnload(); +} + +bool PluginLogic::loadPluginOnDemand( + const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context) +{ + return m_impl->loadPluginOnDemand(pluginHandle, parentObject, context); +} + +void PluginLogic::loadPluginsIntoIframes(JSGlobalContextRef context) +{ + LogError("This function is Deprecated"); +} + +void PluginLogic::setCustomProperties(double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + LogError("This function is DEPRECATED"); +} + +void PluginLogic::setCustomProperties(JSGlobalContextRef context, + double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + m_impl->setCustomProperties(context, scaleFactor, encodedBundle, theme); +} + +void PluginLogic::dispatchJavaScriptEvent(CustomEventType eventType) +{ + LogError("This function is DEPRECATED"); +} + +void PluginLogic::dispatchJavaScriptEvent(JSGlobalContextRef context, + CustomEventType eventType) +{ + m_impl->dispatchJavaScriptEvent(context, eventType); +} + +void PluginLogic::loadFrame(JSGlobalContextRef context) +{ + m_impl->loadFrame(context); +} + +void PluginLogic::unloadFrame(JSGlobalContextRef context) +{ + m_impl->unloadFrame(context); +} + +PluginLogic::PluginLogic() : m_impl(new PluginLogic::Impl()) +{ +} + +PluginLogic::~PluginLogic() +{ +} + +void PluginLogic::Impl::startSession(int widgetHandle, + JSGlobalContextRef context, + double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + LogInfo("Starting widget session..."); + + auto sessionIt = m_sessions.find(context); + + // Check if corresponding session if not already created + if (sessionIt != m_sessions.end()) + { + LogWarning("Session already started!"); + return; + } + + auto newSession = JSPageSessionPtr(new JSPageSession(m_pluginsSupport)); + newSession->startSession(widgetHandle, + context, + scaleFactor, + encodedBundle, + theme); + + m_sessions[context] = newSession; +} + +void PluginLogic::Impl::stopSession(JSGlobalContextRef context) +{ + LogInfo("Stopping widget session..."); + + auto sessionIt = m_sessions.find(context); + if (sessionIt == m_sessions.end()) + { + LogError("Session not exist!"); + return; + } + + sessionIt->second->stopSession(); + m_sessions.erase(sessionIt); + + LogInfo("Widget session stopped."); +} + +bool PluginLogic::Impl::loadPluginOnDemand( + const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context + ) +{ + LogInfo("Load plugin on demand"); + + auto sessionIt = m_sessions.find(context); + if (sessionIt == m_sessions.end()) + { + LogWarning("Session not exist!"); + return false; + } + + return sessionIt->second->loadPluginOnDemand(pluginHandle, + parentObject, + context); +} + +void PluginLogic::Impl::loadFrame(JSGlobalContextRef context) +{ + LogDebug("Load a frame"); + auto sessionIt = m_sessions.find(context); + if (sessionIt == m_sessions.end()) + { + LogWarning("Session not exist!"); + return; + } + + sessionIt->second->loadFrame(context); +} + +void PluginLogic::Impl::unloadFrame(JSGlobalContextRef context) +{ + LogDebug("Unload a frame"); + + auto sessionIt = m_sessions.find(context); + if (sessionIt == m_sessions.end()) + { + LogWarning("Session not exist!"); + return; + } + + sessionIt->second->unloadFrame(context); +} + +void PluginLogic::Impl::setCustomProperties(JSGlobalContextRef context, + double scaleFactor, + const char* encodedBundle, + const char* theme) +{ + LogInfo("set properties of window object " << scaleFactor << ", " + << encodedBundle << ", " << theme); + + auto sessionIt = m_sessions.find(context); + if (sessionIt == m_sessions.end()) + { + LogWarning("Session not exist!"); + return; + } + + sessionIt->second->setCustomProperties(scaleFactor, + encodedBundle, + theme); + +} + +void PluginLogic::Impl::dispatchJavaScriptEvent(JSGlobalContextRef context, + CustomEventType eventType) +{ + LogDebug("Dispatch event"); + + auto sessionIt = m_sessions.find(context); + if (sessionIt == m_sessions.end()) + { + LogWarning("Session not exist!"); + return; + } + + sessionIt->second->dispatchJavaScriptEvent(eventType); + + +} diff --git a/src/plugin-loading/plugin_logic.h b/src/plugin-loading/plugin_logic.h new file mode 100644 index 0000000..1d19415 --- /dev/null +++ b/src/plugin-loading/plugin_logic.h @@ -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 plugin_logic.h + * @author Piotr Fatyga (p.fatyga@samsung.com) + * @author Grzegorz Krawczyk (g.krawczyk@samsung.com) + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of plugin and feature + * loading routines + * @brief This code is intended to work behind view controller + */ +#ifndef PLUGIN_LOGIC_H +#define PLUGIN_LOGIC_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace WrtPlugins::W3C; + + +class PluginLogic : DPL::Noncopyable +{ + public: + // Widget session + void startSession(int widgetHandle, + JSGlobalContextRef view, + double scaleFactor, + const char* encodedBundle, + const char* theme); + + void stopSession(JSGlobalContextRef context); + + //TODO im not sure if it is needed. I think it should be hidden + void performLibrariesUnload(); + bool loadPluginOnDemand(const WrtDB::DbPluginHandle &pluginHandle, + JavaScriptObject& parentObject, + JSGlobalContextRef context); + + WRT_PLUGINS_DEPRECATED void loadPluginsIntoIframes( + JSGlobalContextRef context); + + void loadFrame(JSGlobalContextRef context); + void unloadFrame(JSGlobalContextRef context); + + // reset custom window properties. (Tizen requirements) + WRT_PLUGINS_DEPRECATED void setCustomProperties(double scaleFactor, + const char* encodedBundle, + const char* theme); + + void setCustomProperties(JSGlobalContextRef ctx, + double scaleFactor, + const char* encodedBundle, + const char* theme); + + WRT_PLUGINS_DEPRECATED void dispatchJavaScriptEvent(CustomEventType eventType); + + void dispatchJavaScriptEvent(JSGlobalContextRef ctx, + CustomEventType eventType); + + private: + PluginLogic(); + ~PluginLogic(); + + class Impl; + std::unique_ptr m_impl; + + friend class DPL::Singleton; +}; + +typedef DPL::Singleton PluginLogicSingleton; + +#endif // PLUGIN_LOGIC_H diff --git a/src/plugin-loading/plugin_model.cpp b/src/plugin-loading/plugin_model.cpp new file mode 100644 index 0000000..b6884c8 --- /dev/null +++ b/src/plugin-loading/plugin_model.cpp @@ -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 plugin_model.cpp + * @author Pawel Sikorski (p.sikorski@samgsung.com) + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samgsung.com) + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief This file contains PluginModel, PluginHandle definitions. + */ + +#include "plugin_model.h" +#include +#include + +using namespace WrtDB; + +template +struct BindToPluginDAO : + DPL::Event::BindToDAO +{ +}; + +template +struct BindToFeatureDAOStatic : + DPL::Event::BindToDAO_Static +{ +}; + +PluginModel::PluginModel(const WrtDB::DbPluginHandle& handle) : + Handle(this, handle), + LibraryName(this, + BindToPluginDAO::Get), + LibraryPath(this, + BindToPluginDAO::Get), + FeatureHandles(this, + BindToFeatureDAOStatic::Get), + LibraryDependencies(this, + BindToPluginDAO::Get), + LibraryInstance(this, PluginPtr()) +{ +} + +WrtDB::DbPluginHandle PluginModel::getHandle() const +{ + return Handle.Get(); +} + +bool PluginModel::operator< (const PluginModel& obj) const +{ + return obj.Handle.Get() < Handle.Get(); +} diff --git a/src/plugin-loading/plugin_model.h b/src/plugin-loading/plugin_model.h new file mode 100644 index 0000000..a870c87 --- /dev/null +++ b/src/plugin-loading/plugin_model.h @@ -0,0 +1,94 @@ +/* + * 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 plugin_model.h + * @author Pawel Sikorski (p.sikorski@samgsung.com) + * @author Grzegorz Krawczyk (g.krawczyk@samgsung.com) + * @version + * @brief This file contains PluginModel, PluginHandle definitions. + */ + +#ifndef WRT_SRC_PLUGIN_SERVICE_PLUGIN_MODEL_H_ +#define WRT_SRC_PLUGIN_SERVICE_PLUGIN_MODEL_H_ + +#include +#include +#include +#include +#include + +#include +#include +#include + +class PluginModel; + +class PluginModel : public DPL::Event::Model +{ + public: + + /** + *@brief Plugin handle + */ + DPL::Event::Property Handle; + + /** + *@brief LibraryName + */ + DPL::Event::Property LibraryName; + + /** + *@brief Library Path + */ + DPL::Event::Property LibraryPath; + + /** + *@brief Feature set + */ + DPL::Event::Property FeatureHandles; + + /** + *@brief Librarydepencies + */ + DPL::Event::Property LibraryDependencies; + + /** + *@brief Library instance Low Level + * */ + DPL::Event::Property LibraryInstance; + + public: + PluginModel(const WrtDB::DbPluginHandle& handle); + + bool operator< (const PluginModel& obj) const; + + private: + WrtDB::DbPluginHandle getHandle() const; +}; + +typedef DPL::SharedPtr PluginModelPtr; + +#endif diff --git a/src/plugin-loading/plugin_property_support.cpp b/src/plugin-loading/plugin_property_support.cpp new file mode 100644 index 0000000..4786ea7 --- /dev/null +++ b/src/plugin-loading/plugin_property_support.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 plugin_property_support.cpp + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 1.0 + * @brief + */ + +#include "plugin_property_support.h" +#include + +using namespace PluginModule; + + +const char *NAVIGATOR_PROPERTY_NAME = "navigator"; +const char *SCALE_PROPERTY_NAME = "scale"; +const char *BUNDLE_PROPERTY_NAME = "__bundle"; +const char *THEME_PROPERTY_NAME = "theme"; + +WindowPropertySupport::WindowPropertySupport( + JSGlobalContextRef context): + m_scale(0), + m_bundle(""), + m_theme(""), + m_context(context) +{ +} + +WindowPropertySupport::~WindowPropertySupport() +{ +} + +float WindowPropertySupport::getScale() const +{ + return m_scale; +} + +std::string WindowPropertySupport::getBundle() const +{ + return m_bundle; +} + +std::string WindowPropertySupport::getTheme() const +{ + return m_theme; +} + +JSGlobalContextRef WindowPropertySupport::getJSContext() const +{ + return m_context; +} + +void WindowPropertySupport::setScaleToNavigatorProperty(const double scale) +{ + LogInfo("set window.navigator.scale: " << scale); + + m_scale = scale; + + setPropertyToNavigator(SCALE_PROPERTY_NAME, JSValueMakeNumber(m_context, scale)); +} + +void WindowPropertySupport::setBundleToWindowProperty(const char* bundle) +{ + LogInfo("set window.__bundle: " << bundle); + + if(bundle) + { + m_bundle = bundle; + + JSStringRef bundleString = JSStringCreateWithUTF8CString(bundle); + + setPropertyToWindow(BUNDLE_PROPERTY_NAME, + JSValueMakeString(m_context, bundleString)); + + JSStringRelease(bundleString); + } +} + + +void WindowPropertySupport::setBundleToNavigatorProperty(const char* bundle) +{ + LogInfo("set window.navigator.__bundle: " << bundle); + + if(bundle) + { + m_bundle = bundle; + + JSStringRef bundleString = JSStringCreateWithUTF8CString(bundle); + + setPropertyToNavigator(BUNDLE_PROPERTY_NAME, + JSValueMakeString(m_context, bundleString)); + + JSStringRelease(bundleString); + } +} + +void WindowPropertySupport::setThemeToNavigatorProperty(const char* theme) +{ + LogInfo("set window.navigator.__theme: " << theme); + + if(theme) + { + m_theme = theme; + + JSStringRef themeString = JSStringCreateWithUTF8CString(theme); + + setPropertyToNavigator(THEME_PROPERTY_NAME, + JSValueMakeString(m_context, themeString)); + + JSStringRelease(themeString); + } +} + +void WindowPropertySupport::setPropertyToWindow(const char* propertyName, + JSValueRef jsValue) +{ + if(propertyName) + { + JSObjectRef globalObject = JSContextGetGlobalObject(m_context); + + JSStringRef propertyNameString = + JSStringCreateWithUTF8CString(propertyName); + JSObjectSetProperty(m_context, + globalObject, + propertyNameString, + jsValue, + kJSPropertyAttributeReadOnly, + NULL); + + JSStringRelease(propertyNameString); + } +} + +void WindowPropertySupport::setPropertyToNavigator(const char* propertyName, + JSValueRef jsValue) +{ + if(propertyName) + { + JSObjectRef globalObject = JSContextGetGlobalObject(m_context); + + JSStringRef navigatorString = + JSStringCreateWithUTF8CString(NAVIGATOR_PROPERTY_NAME); + JSValueRef navigatorValue = JSObjectGetProperty(m_context, + globalObject, + navigatorString, + NULL); + + JSStringRef propertyNameString = + JSStringCreateWithUTF8CString(propertyName); + JSObjectSetProperty(m_context, + JSValueToObject(m_context, navigatorValue, NULL), + propertyNameString, + jsValue, + kJSPropertyAttributeReadOnly, + NULL); + + JSStringRelease(propertyNameString); + JSStringRelease(navigatorString); + } +} + diff --git a/src/plugin-loading/plugin_property_support.h b/src/plugin-loading/plugin_property_support.h new file mode 100644 index 0000000..a489a77 --- /dev/null +++ b/src/plugin-loading/plugin_property_support.h @@ -0,0 +1,59 @@ +/* + * 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 plugin_property_support.h + * @author Yunchan Cho (yunchan.cho@samsung.com) + * @version 1.0 + * @brief + */ + +#ifndef _PLUGIN_LOGIC_PROPERTY_SUPPORT_H_ +#define _PLUGIN_LOGIC_PROPERTY_SUPPORT_H_ + +#include +#include + +namespace PluginModule { + +class WindowPropertySupport +{ + public: + float getScale() const; + std::string getBundle() const; + std::string getTheme() const; + JSGlobalContextRef getJSContext() const; + + void setScaleToNavigatorProperty(const double scale); + void setBundleToWindowProperty(const char* bundle); + void setBundleToNavigatorProperty(const char* bundle); + void setThemeToNavigatorProperty(const char* theme); + + explicit WindowPropertySupport(JSGlobalContextRef m_context); + ~WindowPropertySupport(); + + private: + float m_scale; + std::string m_bundle; // string of base64 encoded bundle + std::string m_theme; + JSGlobalContextRef m_context; + + void setPropertyToWindow(const char* propertyName, JSValueRef jsValue); + void setPropertyToNavigator(const char* propertyName, JSValueRef jsValue); +}; + +} // namespace PluginModule + +#endif // _PLUGIN_LOGIC_PROPERTY_SUPPORT_H_ diff --git a/src/standards/W3C/Widget/CMakeLists.txt b/src/standards/W3C/Widget/CMakeLists.txt index 6444650..e6ab932 100755 --- a/src/standards/W3C/Widget/CMakeLists.txt +++ b/src/standards/W3C/Widget/CMakeLists.txt @@ -14,32 +14,23 @@ # set(TARGET_NAME "wrt-plugins-w3c-widget-interface") -pkg_search_module(webkit REQUIRED ewebkit>=0.1.0) -pkg_search_module(wrt-plugin-api REQUIRED wrt-plugin-api>=0.7.0) +pkg_search_module(webkit2 REQUIRED ewebkit2) +pkg_search_module(plugin-types REQUIRED wrt-plugins-types) set(SRCS ${SRCS_COMMONS} JSWidget.cpp JSPreferences.cpp - JSStorageEvent.cpp plugin_initializer.cpp - IFrameSupport.cpp - AddEventListenerSupport.cpp + plugin_config.cpp ) -IF(W3C_TEST) -set(SRCS - ${SRCS} - JSTest.cpp - Test.cpp -) -ENDIF(W3C_TEST) - -include_directories( ${API_WIDGET_PATH} +include_directories( + ${API_WIDGET_PATH} + ${webkit2_INCLUDE_DIRS} + ${plugin-types_INCLUDE_DIRS} # ${API_STORAGE_EVENT_PATH} # ${API_LOCALSTORAGE_PATH} - ${webkit_INCLUDE_DIRS} - ${wrt-plugin-api_INCLUDE_DIRS} ) add_library(${TARGET_NAME} SHARED ${SRCS}) @@ -47,10 +38,10 @@ target_link_libraries(${TARGET_NAME} ${LIBS_COMMON} ${TARGET_COMMONS} ${TARGET_COMMONS_JAVASCRIPT} + ${TARGET_JS_OVERLAY} wrt-plugins-widget wrt-plugins-localstorage wrt-plugins-storageevent ) INSTALL(TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${STANDARD_FILE_DESTINATION}/w3c-widget-interface) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/config.xml DESTINATION ${STANDARD_FILE_DESTINATION}/w3c-widget-interface) diff --git a/src/standards/W3C/Widget/JSPreferences.cpp b/src/standards/W3C/Widget/JSPreferences.cpp index 78748b3..c461fc8 100644 --- a/src/standards/W3C/Widget/JSPreferences.cpp +++ b/src/standards/W3C/Widget/JSPreferences.cpp @@ -30,8 +30,8 @@ #include #include #include -#include "IFrameSupport.h" -#include "AddEventListenerSupport.h" +#include +#include using namespace std; using namespace WrtDeviceApis; @@ -230,12 +230,7 @@ JSClassRef JSPreferences::m_jsClassRef = void JSPreferences::initialize(JSContextRef context, JSObjectRef object) { - LogDebug("entered"); - - if( !AddEventListenerSupport::isInitialized()) - { - AddEventListenerSupport::initializeContext(context); - } + LogDebug("entered. Context: " << context); LocalStoragePrivateData* priv = static_cast(JSObjectGetPrivate(object)); @@ -277,7 +272,7 @@ JSValueRef JSPreferences::removeItem(JSContextRef context, Assert(iframe && "Iframe is NULL"); AddEventListenerSupport:: - CallListenersFromDifferentIFrames(iframe, event); + CallStorageListenersFromDifferentIFrames(iframe, event); LogDebug("end"); return JSValueMakeNull(context); @@ -316,7 +311,7 @@ JSValueRef JSPreferences::setItem(JSContextRef context, Assert(iframe && "Iframe is NULL"); AddEventListenerSupport:: - CallListenersFromDifferentIFrames(iframe, event); + CallStorageListenersFromDifferentIFrames(iframe, event); LogDebug("end"); @@ -353,7 +348,7 @@ JSValueRef JSPreferences::clear(JSContextRef context, IStorageEventPtr storageEvent = getStorageEvent(); AddEventListenerSupport:: - CallListenersFromDifferentIFrames(iframe, storageEvent); + CallStorageListenersFromDifferentIFrames(iframe, storageEvent); LogDebug("end"); @@ -414,7 +409,7 @@ JSValueRef JSPreferences::key(JSContextRef context, size_t n = converter.toSizeT(arguments[0]); - std::string value = getIStorage(thisObject)->getValueByIndex(n); + std::string value = getIStorage(thisObject)->getKeyByIndex(n); LogDebug("end"); @@ -537,7 +532,7 @@ bool JSPreferences::setProperty(JSContextRef context, Assert(iframe && "Iframe is NULL"); AddEventListenerSupport:: - CallListenersFromDifferentIFrames(iframe, event); + CallStorageListenersFromDifferentIFrames(iframe, event); LogDebug("end"); diff --git a/src/standards/W3C/Widget/JSTest.cpp b/src/standards/W3C/Widget/JSTest.cpp deleted file mode 100644 index 80d77fb..0000000 --- a/src/standards/W3C/Widget/JSTest.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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 JSTest.cpp - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - * @version 0.1 - */ - -#include -#include -#include -#include -#include "JSTest.h" -#include "Test.h" - -using namespace WrtDeviceApis; -using namespace WrtDeviceApis::Commons; -using namespace WrtDeviceApis::CommonsJavaScript; - -#define CLASS_NAME "Test" - -namespace WrtPlugins { -namespace W3C { - -JSClassDefinition JSTest::m_classInfo = -{ - 0, - kJSClassAttributeNone, - CLASS_NAME, - 0, - NULL, - m_functions, - initialize, - finalize, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -}; - -JSStaticFunction JSTest::m_functions[] = { - { "setEvaluator", JSTest::setEvaluator, kJSPropertyAttributeNone }, - { "run", JSTest::run, kJSPropertyAttributeNone }, - { 0, 0, 0 } -}; - -const JSClassRef JSTest::getClassRef() { - if (!m_jsClassRef) { - m_jsClassRef = JSClassCreate(&m_classInfo); - } - return m_jsClassRef; -} - -const JSClassDefinition* JSTest::getClassInfo() { - return &m_classInfo; -} - -JSClassRef JSTest::m_jsClassRef = JSClassCreate(JSTest::getClassInfo()); - -void JSTest::initialize(JSContextRef context, JSObjectRef object) { - LogDebug("ENTER"); - - Test* priv = static_cast(JSObjectGetPrivate(object)); - if (!priv) { - priv = new Test(); - JSObjectSetPrivate(object, static_cast(priv)); - } - priv->setContext(context); -} - -void JSTest::finalize(JSObjectRef object) { - LogDebug("ENTER"); - delete static_cast(JSObjectGetPrivate(object)); -} - -JSValueRef JSTest::setEvaluator(JSContextRef context, - JSObjectRef object, - JSObjectRef thisObject, - size_t argumentCount, - const JSValueRef arguments[], - JSValueRef* exception) -{ - LogDebug("ENTER"); - - Assert(argumentCount >= 1 && "Not enough arguments."); - - try { - JSObjectRef evaluator = CommonsJavaScript::Converter(context).toJSObjectRef(arguments[0]); - getPrivateObject(thisObject)->setEvaluator(evaluator); - } - catch (const Commons::Exception& ex) { - LogError("Exception: " << ex.DumpToString()); - } - - return JSValueMakeUndefined(context); -} - -JSValueRef JSTest::run(JSContextRef context, - JSObjectRef object, - JSObjectRef thisObject, - size_t argumentCount, - const JSValueRef arguments[], - JSValueRef* exception) -{ - LogDebug("ENTER"); - - try { - double timeout = 0.0; - if (argumentCount >= 1) { - timeout = CommonsJavaScript::Converter(context).toDouble(arguments[0]); - } - - getPrivateObject(thisObject)->run(timeout); - } - catch (const Commons::Exception& ex) { - LogError("Exception: " << ex.DumpToString()); - } - - return JSValueMakeUndefined(context); -} - -Test* JSTest::getPrivateObject(JSObjectRef thisObject) { - Test* priv = static_cast(JSObjectGetPrivate(thisObject)); - Assert(priv && "Private object not available."); - - return priv; -} - -} -} diff --git a/src/standards/W3C/Widget/JSTest.h b/src/standards/W3C/Widget/JSTest.h deleted file mode 100644 index 22155e5..0000000 --- a/src/standards/W3C/Widget/JSTest.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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 JSTest.h - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - * @version 0.1 - * @brief - */ - -#ifndef WRT_PLUGIN_JS_WIDGET_TEST_H_ -#define WRT_PLUGIN_JS_WIDGET_TEST_H_ - -#include - -namespace WrtPlugins { -namespace W3C { - -class Test; - -class JSTest { - public: - static const JSClassRef getClassRef(); - - static const JSClassDefinition* getClassInfo(); - - private: - static void initialize(JSContextRef context, JSObjectRef object); - - static void finalize(JSObjectRef object); - - static JSClassDefinition m_classInfo; - - static JSStaticFunction m_functions[]; - - static JSClassRef m_jsClassRef; - - static JSValueRef setEvaluator(JSContextRef context, - JSObjectRef object, - JSObjectRef thisObject, - size_t argumentCount, - const JSValueRef arguments[], - JSValueRef* exception); - - static JSValueRef run(JSContextRef context, - JSObjectRef object, - JSObjectRef thisObject, - size_t argumentCount, - const JSValueRef arguments[], - JSValueRef* exception); - - static Test* getPrivateObject(JSObjectRef thisObject); -}; - -} -} - -#endif diff --git a/src/standards/W3C/Widget/JSWidget.cpp b/src/standards/W3C/Widget/JSWidget.cpp index 3adba57..3f3f8c3 100644 --- a/src/standards/W3C/Widget/JSWidget.cpp +++ b/src/standards/W3C/Widget/JSWidget.cpp @@ -29,9 +29,9 @@ #include #include "JSPreferences.h" #include -#include "IFrameSupport.h" #include #include +#include #define CATCH_EXCEPTION_NO_MODIFABLE \ @@ -197,7 +197,7 @@ JSClassDefinition JSWidget::m_classInfo = { NULL, //DeleteProperty, NULL, //GetPropertyNames, NULL, //CallAsFunction, - NULL, //CallAsConstructor, + callAsConstructor, NULL, //HasInstance, NULL, //ConvertToType, }; @@ -241,11 +241,13 @@ const JSClassDefinition* JSWidget::getClassInfo() JSClassRef JSWidget::m_jsClassRef = JSClassCreate(JSWidget::getClassInfo()); +JSContextRef JSWidget::m_globalContext = NULL; + void JSWidget::initialize(JSContextRef context, JSObjectRef object) { - LogDebug("entered"); - LogError("object " << object); + LogDebug("entered. Context : " << context); + LogDebug("Object: " << object); JSWidgetPrivateObject* priv = static_cast(JSObjectGetPrivate(object)); @@ -290,10 +292,24 @@ void JSWidget::finalize(JSObjectRef object) JSWidgetPrivateObject* priv = static_cast(JSObjectGetPrivate(object)); - JSValueUnprotect(priv->getContext(), priv->getObject()->preferencesObject); + JSValueUnprotect(priv->getContext(), + priv->getObject()->preferencesObject); delete priv; - LogDebug("private object is realised"); + LogDebug("private object is released"); +} + +void JSWidget::acquireGlobalContext(java_script_context_t global_context, + js_object_instance_t iframe, + js_object_instance_t object) +{ + IFrameSupport::RegisterWidget(global_context, iframe, object); + if (!m_globalContext) { + m_globalContext = static_cast(global_context); + LogInfo("Global context acquired."); + } else { + LogInfo("Global context already set."); + } } JSValueRef JSWidget::getAuthor(JSContextRef context, @@ -417,7 +433,11 @@ JSValueRef JSWidget::getHeight(JSContextRef context, { Try { Converter converter(context); - return converter.toJSValueRef(getIWidget(object)->getHeight()); + unsigned int height = getIWidget(object)->getHeight(); + if (0 == height) { + height = 1; + } + return converter.toJSValueRef(height); } CATCH_EXCEPTION_CONVERSION CATCH_EXCEPTION_NULL_PTR @@ -431,7 +451,11 @@ JSValueRef JSWidget::getWidth(JSContextRef context, { Try { Converter converter(context); - return converter.toJSValueRef(getIWidget(object)->getWidth()); + unsigned int width = getIWidget(object)->getWidth(); + if (0 == width) { + width = 1; + } + return converter.toJSValueRef(width); } CATCH_EXCEPTION_CONVERSION CATCH_EXCEPTION_NULL_PTR @@ -448,7 +472,7 @@ bool JSWidget::hasProperty(JSContextRef context, Converter converter(context); std::string key = converter.toString(propertyName); - if(key=="preferences"){ + if (key == "preferences") { return true; } } @@ -467,7 +491,6 @@ bool JSWidget::hasProperty(JSContextRef context, Catch(Commons::PlatformException){ LogError("PlatformException occured"); } - return false; } @@ -478,12 +501,12 @@ JSValueRef JSWidget::getProperty(JSContextRef context, { LogDebug("Object: " << object); - Try{ + Try { Converter converter(context); std::string key = converter.toString(propertyName); - if(key=="preferences"){ + if (key=="preferences") { Converter converter(context); JSObjectRef pref = getPreferences(object); if (!pref) @@ -526,6 +549,21 @@ bool JSWidget::setProperty(JSContextRef context, return false; } +JSObjectRef JSWidget::callAsConstructor(JSContextRef context, + JSObjectRef constructor, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception) +{ + LogDebug("widget constructor"); + if (!m_globalContext) { + LogError("Global context not set. Creating 'widget' object with " + "local context!"); + return JSObjectMake(context, JSWidget::getClassRef(), NULL); + } + return JSObjectMake(m_globalContext, JSWidget::getClassRef(), NULL); +} + #undef CATCH_EXCEPTION_NO_MODIFABLE #undef CATCH_EXCEPTION_CONVERSION #undef CATCH_EXCEPTION_NULL_PTR diff --git a/src/standards/W3C/Widget/JSWidget.h b/src/standards/W3C/Widget/JSWidget.h index 0ae68f5..3be203a 100644 --- a/src/standards/W3C/Widget/JSWidget.h +++ b/src/standards/W3C/Widget/JSWidget.h @@ -26,6 +26,7 @@ #include #include +#include namespace WrtPlugins { namespace W3C { @@ -44,6 +45,24 @@ class JSWidget */ static const JSClassDefinition* getClassInfo(); + static JSObjectRef callAsConstructor(JSContextRef context, + JSObjectRef constructor, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception); + + /** + * This function will acquire global context which is used later to + * keep JSValueProtect/Unprotect functionality working. + * This is workaround for JSCore semantic: when an object is created with + * JSObjectMakeConstructor a context passed to createCallback function + * is different (shorter lifecycle) than global context, so JSValueUnprotect + * called in finalize may fail because of invalid context. + */ + static void acquireGlobalContext(java_script_context_t global_context, + js_object_instance_t iframe, + js_object_instance_t object); + private: /** * The callback invoked when an object is first created. @@ -68,6 +87,11 @@ class JSWidget static JSClassRef m_jsClassRef; + /** + * Global context acquired by acquireGlobalContext() function. + */ + static JSContextRef m_globalContext; + // getters for properties static JSValueRef getAuthor(JSContextRef context, JSObjectRef object, @@ -124,6 +148,7 @@ class JSWidget JSStringRef propertyName, JSValueRef value, JSValueRef* exception); + }; } } diff --git a/src/standards/W3C/Widget/Test.cpp b/src/standards/W3C/Widget/Test.cpp deleted file mode 100644 index f53f3c8..0000000 --- a/src/standards/W3C/Widget/Test.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - * 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 Test.cpp - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - * @version 1.0 - * @date 09/13/2011 08:31:09 AM - * @brief - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Test.h" - -using namespace WrtDeviceApis; -//using namespace WrtDeviceApis::Commons; -//using namespace WrtDeviceApis::CommonsJavaScript; - -namespace WrtPlugins { -namespace W3C { - -Test::Test() - : m_context(NULL), - m_evaluator(NULL) -{ - DPL::Event::ControllerEventHandler::Touch(); -} - -void Test::run(double timeout) { - PostTimedEvent(FinishEvent(), timeout); -} - -void Test::setEvaluator(JSObjectRef evaluator) { - m_evaluator = evaluator; -} - -void Test::setContext(JSContextRef context) { - m_context = context; -} - -void Test::OnEventReceived(const FinishEvent& event) { - LogDebug("ENTER"); - - Result result = Result::Success; - if (m_evaluator && m_context) { - JSValueRef eval = JSObjectCallAsFunction(m_context, - m_evaluator, - NULL, - 0, - NULL, - NULL); - if (eval) { - if (JSValueIsBoolean(m_context, eval)) { - if (!JSValueToBoolean(m_context, eval)) { - result = Result::Fail; - } - } - else { - LogError("Evaluator returned value of wrong type."); - result = Result::Exception; - } - } - else { - LogError("Evaluator did not return any value."); - result = Result::Exception; - } - } - - - FILE* output = fdopen(4, "w"); - if (output) { - Commons::IWrtWrapperPtr wrt = - Commons::WrtWrappersMgr::getInstance().getWrtWrapper(m_context); - WidgetDB::Api::IWidgetDBPtr widgetDB = - WidgetDB::Api::getWidgetDB(wrt->getWidgetId()); - - fprintf(output, - "%d\t%s\t%s\n", - wrt->getWidgetId(), - widgetDB->getConfigValue( - WidgetDB::Api::ConfigAttribute::NAME).c_str(), - resultToString(result).c_str()); - fclose(output); - } else { - LogInfo("Output descriptor not created."); - } - - pid_t pid = getpid(); - LogDebug("Sending SIGINT to " << pid); - if (kill(pid, SIGINT) != 0) { - LogError("Sending SIGINT failed."); - } -} - -std::string Test::resultToString(Result result) { - switch (result) { - case Result::Success: return "OK"; - case Result::Fail: return "FAIL"; - case Result::Exception: return "EXCEPTION"; - default: - Assert(false && "Unsupported result type."); - } -} - -} -} diff --git a/src/standards/W3C/Widget/Test.h b/src/standards/W3C/Widget/Test.h deleted file mode 100644 index f102274..0000000 --- a/src/standards/W3C/Widget/Test.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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 Test.h - * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) - * @version 1.0 - * @date 09/13/2011 08:24:44 AM - * @brief - */ - -#ifndef WRTPLUGINS_W3C_TEST_H_ -#define WRTPLUGINS_W3C_TEST_H_ - -#include -#include -#include -#include -#include - -namespace WrtPlugins { -namespace W3C { - -DECLARE_GENERIC_EVENT_0(FinishEvent) - -class Test : public DPL::Event::Controller::Type> { - public: - Test(); - - void run(double timeout = 0.0); - void setEvaluator(JSObjectRef evaluator); - void setContext(JSContextRef context); - - protected: - void OnEventReceived(const FinishEvent& event); - - private: - enum class Result { - Success, - Fail, - Exception - }; - - private: - std::string resultToString(Result result); - - private: - JSContextRef m_context; - JSObjectRef m_evaluator; -}; - -} -} -#endif diff --git a/src/standards/W3C/Widget/config.xml b/src/standards/W3C/Widget/config.xml deleted file mode 100644 index 594e1b8..0000000 --- a/src/standards/W3C/Widget/config.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - libwrt-plugins-w3c-widget-interface.so - xxx - SAMSUNG plugin group - SAMSUNG certificate authority - AAAABBBBCCCCDDDEEEE0000 - - - http://w3cWidgetInterface.com/w3c-widget-interface - - - - - - - - - - - - - diff --git a/src/standards/W3C/Widget/plugin_config.cpp b/src/standards/W3C/Widget/plugin_config.cpp new file mode 100644 index 0000000..581bec5 --- /dev/null +++ b/src/standards/W3C/Widget/plugin_config.cpp @@ -0,0 +1,45 @@ +/* + * 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 "plugin_config.h" + +namespace WrtPlugins { +namespace W3C { + +template <> +WidgetDeclarations::ParamsMap WidgetDeclarations::m_params = + WrtPlugins::W3C::WidgetDeclarations::ParamsMap(); + +template <> +WidgetDeclarations::DeviceCapsMaps WidgetDeclarations::m_deviceCaps = + WrtPlugins::W3C::WidgetDeclarations::DeviceCapsMaps(); + + +template <> +WidgetDeclarations::FeaturesMap WidgetDeclarations::m_features = +{ + { + "http://w3cWidgetInterface.com/w3c-widget-interface", + { + } + } +}; + +template <> +WidgetDeclarations::FunctionsMap WidgetDeclarations::m_functions = + WrtPlugins::W3C::WidgetDeclarations::FunctionsMap(); + +} // namespace Wac2_0 +} // namespace WrtPlugins diff --git a/src/standards/W3C/Widget/plugin_config.h b/src/standards/W3C/Widget/plugin_config.h new file mode 100644 index 0000000..f0f8326 --- /dev/null +++ b/src/standards/W3C/Widget/plugin_config.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. + */ +#ifndef _WIDGET_PLUGIN_CONFIG_H_ +#define _WIDGET_PLUGIN_CONFIG_H_ + +#include + +namespace WrtPlugins { +namespace W3C { + +enum class WidgetParamId { +}; + +enum class WidgetDeviceCapId { +}; + +enum class WidgetFunctionId { +}; + +typedef WrtDeviceApis::CommonsJavaScript::StaticDeclarations < + WidgetParamId, + WidgetDeviceCapId, + WidgetFunctionId> WidgetDeclarations; + +} +} + +#endif // _WIDGET_PLUGIN_CONFIG_H_ diff --git a/src/standards/W3C/Widget/plugin_initializer.cpp b/src/standards/W3C/Widget/plugin_initializer.cpp index f03858a..05d385b 100644 --- a/src/standards/W3C/Widget/plugin_initializer.cpp +++ b/src/standards/W3C/Widget/plugin_initializer.cpp @@ -25,17 +25,17 @@ #include #include +#include +#include #include "JSWidget.h" #include "JSPreferences.h" -#include "JSTest.h" -#include "IFrameSupport.h" -#include "AddEventListenerSupport.h" +#include "plugin_config.h" #define OBJECT_WIDGET "widget" +#define INTERFACE_WIDGET_NAME "Widget" #define OBJECT_PREFERENCES "preferences" -#define OBJECT_TEST "__test" using namespace WrtPlugins::W3C; using namespace WrtDeviceApis; @@ -50,21 +50,30 @@ class_definition_options_t WidgetOptions = ALWAYS_NOTICE, USE_OVERLAYED, //ignored IFrameSupport::RegisterWidget, + NULL, NULL }; -class_definition_options_t AddEventListenerOptions = +class_definition_options_t WidgetInterfaceOptions = { - JS_FUNCTION, + JS_INTERFACE, CREATE_INSTANCE, ALWAYS_NOTICE, - OVERLAYED_BEFORE_ORIGINAL, - IFrameSupport::RegisterAddEventListener, + USE_OVERLAYED, //ignored + JSWidget::acquireGlobalContext, + NULL, NULL }; }; +void on_widget_init_callback(feature_mapping_interface_t *mapping) +{ + LogDebug("[W3C\\widget] on_widget_init_callback"); + + WrtPlugins::W3C::WidgetDeclarations::getMappingInterface(mapping); +} + void on_widget_start_callback(int widgetId) { LogDebug("[W3C\\widget] on_widget_start_callback (" << widgetId << ")"); @@ -97,28 +106,25 @@ void on_widget_stop_callback(int widgetId) PLUGIN_ON_WIDGET_START(on_widget_start_callback) PLUGIN_ON_WIDGET_STOP(on_widget_stop_callback) +PLUGIN_ON_WIDGET_INIT(on_widget_init_callback) PLUGIN_CLASS_MAP_BEGIN -PLUGIN_CLASS_MAP_ADD_CLASS (WRT_JS_EXTENSION_OBJECT_GLOBAL, +PLUGIN_CLASS_MAP_ADD_INTERFACE( + WRT_JS_EXTENSION_OBJECT_GLOBAL, + INTERFACE_WIDGET_NAME, + (js_class_template_getter)WrtPlugins::W3C::JSWidget::getClassRef, + reinterpret_cast(WrtPlugins::W3C::JSWidget::callAsConstructor), + &Options::WidgetInterfaceOptions) +PLUGIN_CLASS_MAP_ADD_INTERFACE_PRODUCT( + WRT_JS_EXTENSION_OBJECT_GLOBAL, + OBJECT_WIDGET, + INTERFACE_WIDGET_NAME, + &Options::WidgetOptions) + +PLUGIN_CLASS_MAP_ADD_CLASS(WRT_JS_EXTENSION_OBJECT_GLOBAL, OBJECT_WIDGET, - WrtPlugins::W3C::JSWidget::getClassRef(), + (js_class_template_getter)WrtPlugins::W3C::JSWidget::getClassRef, &Options::WidgetOptions) -//PLUGIN_CLASS_MAP_ADD_CLASS(OBJECT_WIDGET, -// OBJECT_PREFERENCES, -// WrtPlugins::W3C::JSPreferences::getClassRef(), -// NULL) -//Function::AddEventListener -PLUGIN_CLASS_MAP_ADD_CLASS (WRT_JS_EXTENSION_OBJECT_GLOBAL, - "addEventListener", - (const void*) - AddEventListenerSupport::AddEventListener, - &Options::AddEventListenerOptions) -#ifdef W3C_TEST -PLUGIN_CLASS_MAP_ADD_CLASS(OBJECT_WIDGET, - OBJECT_TEST, - WrtPlugins::W3C::JSTest::getClassRef(), - NULL) -#endif // W3C_TEST PLUGIN_CLASS_MAP_END #undef OBJECT_WIDGET