From 667ed732674b5ce454f9cd95bc6b4dd4597e19d0 Mon Sep 17 00:00:00 2001 From: Jinkun Jang Date: Wed, 13 Mar 2013 02:05:47 +0900 Subject: [PATCH] Tizen 2.1 base --- 3rdparty/CMakeLists.txt | 2 +- 3rdparty/fastdelegate/Demo.cpp | 1 + CMakeLists.txt | 73 +- build/CMakeLists.txt | 8 +- build/auto_save_dao/CMakeLists.txt | 22 + .../wrt-commons-auto-save-dao-ro.pc.in | 12 + .../wrt-commons-auto-save-dao-rw.pc.in | 12 + .../auto_save_dao/wrt-commons-auto-save-dao.pc.in | 12 + build/core/CMakeLists.txt | 12 +- build/core/dpl-efl.pc.in | 11 + build/custom_handler_dao/CMakeLists.txt | 21 + .../wrt-commons-custom-handler-dao-ro.pc.in | 12 + .../wrt-commons-custom-handler-dao-rw.pc.in | 12 + build/db/CMakeLists.txt | 14 +- build/db/dpl-db-efl.pc.in | 11 + build/dbus/CMakeLists.txt | 15 +- build/dbus/dpl-dbus-efl.pc.in | 11 + build/encryption/CMakeLists.txt | 76 + build/encryption/dpl-encryption.pc.in | 11 + build/encryption/libs/libcal.a | Bin 0 -> 4734 bytes build/encryption/libs/libcal.arm.a | Bin 0 -> 5566 bytes build/encryption/libs/libcal.i586.a | Bin 0 -> 5496 bytes build/event/CMakeLists.txt | 15 +- build/event/dpl-event-efl.pc.in | 11 + build/log/CMakeLists.txt | 12 +- build/log/dpl-log-efl.pc.in | 11 + build/rpc/CMakeLists.txt | 13 +- build/rpc/dpl-rpc-efl.pc.in | 11 + build/security_origin_dao/CMakeLists.txt | 21 + .../wrt-commons-security-origin-dao.pc.in | 12 + build/socket/CMakeLists.txt | 12 +- build/socket/dpl-socket-efl.pc.in | 11 + build/support/CMakeLists.txt | 26 + build/support/wrt-plugins-types.pc.in | 11 + build/test/CMakeLists.txt | 14 +- build/test/dpl-test-efl.pc.in | 11 + build/utils/CMakeLists.txt | 11 +- build/utils/dpl-utils-efl.pc.in | 11 + build/widget_dao/CMakeLists.txt | 9 +- debian/changelog | 1870 +++++++++++++++++++- debian/control | 6 +- debian/rules | 24 +- debian/wrt-commons.install | 10 +- debian/wrt-commons.postinst | 36 +- dir-struct.py | 14 + etc/CMakeLists.txt | 21 +- etc/wrt_commons_create_clean_db.sh | 33 + etc/wrt_commons_reset_db.sh | 45 + examples/CMakeLists.txt | 1 - examples/binary_queue/binary_queue.cpp | 1 + examples/copy/copy.cpp | 1 + examples/crypto_hash/crypto_hash.cpp | 1 + examples/dbus/client-example/client-example.cpp | 2 +- examples/dbus/server-example/server-example.cpp | 2 +- examples/fake_rpc/fake_rpc.cpp | 36 +- examples/metronome/metronome_client.cpp | 9 +- examples/metronome/metronome_server.cpp | 1 + examples/rpc/rpc.cpp | 17 +- examples/simple/simple.cpp | 1 + examples/single_instance/single_instance.cpp | 1 + examples/socket/socket.cpp | 1 + examples/tcpsock/tcpsock.cpp | 1 + examples/timed_event/timed_event.cpp | 1 + modules/CMakeLists.txt | 8 +- modules/auto_save_dao/CMakeLists.txt | 98 + modules/auto_save_dao/dao/AutoSaveDatabase.cpp | 30 + modules/auto_save_dao/dao/auto_save_dao.cpp | 99 ++ .../auto_save_dao/dao/auto_save_dao_read_only.cpp | 89 + modules/auto_save_dao/dao/common_dao_types.cpp | 29 + .../auto-save-dao-ro/auto_save_dao_read_only.h | 67 + .../wrt-commons/auto-save-dao-rw/auto_save_dao.h | 50 + .../wrt-commons/auto-save-dao/AutoSaveDatabase.h | 59 + .../wrt-commons/auto-save-dao/common_dao_types.h | 64 + modules/auto_save_dao/orm/autosave_db | 13 + modules/auto_save_dao/orm/autosave_db_definitions | 6 + .../auto_save_dao/orm/autosave_db_sql_generator.h | 27 + modules/auto_save_dao/orm/gen_db_md5.sh | 19 + modules/auto_save_dao/orm/orm_generator_autosave.h | 24 + modules/auto_save_dao/orm/version_db | 5 + modules/core/config.cmake | 4 +- modules/core/include/dpl/auto_ptr.h | 100 ++ modules/core/include/dpl/named_input_pipe.h | 35 +- modules/core/include/dpl/semaphore.h | 11 +- modules/core/include/dpl/shared_ptr.h | 2 +- modules/core/include/dpl/singleton.h | 40 - modules/core/include/dpl/task.h | 380 ---- modules/core/include/dpl/thread.h | 16 +- modules/core/include/dpl/zip_input.h | 93 +- .../core/src/abstract_waitable_input_adapter.cpp | 1 + .../src/abstract_waitable_input_output_adapter.cpp | 1 + .../core/src/abstract_waitable_output_adapter.cpp | 1 + modules/core/src/address.cpp | 1 + modules/core/src/application.cpp | 1 + modules/core/src/apply.cpp | 1 + modules/core/src/assert.cpp | 1 + modules/core/src/atomic.cpp | 11 +- modules/core/src/binary_queue.cpp | 1 + modules/core/src/char_traits.cpp | 1 + modules/core/src/colors.cpp | 2 +- modules/core/src/copy.cpp | 1 + modules/core/src/errno_string.cpp | 1 + modules/core/src/exception.cpp | 1 + modules/core/src/fast_delegate.cpp | 1 + modules/core/src/file_input.cpp | 4 +- modules/core/src/file_output.cpp | 1 + modules/core/src/generic_event.cpp | 1 + modules/core/src/lexical_cast.cpp | 1 + modules/core/src/main.cpp | 59 +- modules/core/src/mutex.cpp | 1 + modules/core/src/named_base_pipe.cpp | 1 + modules/core/src/named_output_pipe.cpp | 1 + modules/core/src/noncopyable.cpp | 1 + modules/core/src/once.cpp | 1 + modules/core/src/read_write_mutex.cpp | 1 + modules/core/src/recursive_mutex.cpp | 1 + modules/core/src/semaphore.cpp | 1 + modules/core/src/serialization.cpp | 1 + modules/core/src/single_instance.cpp | 1 + modules/core/src/singleton.cpp | 1 + modules/core/src/string.cpp | 4 +- modules/core/src/task.cpp | 1 + modules/core/src/task_list.cpp | 1 + modules/core/src/thread.cpp | 14 +- modules/core/src/type_list.cpp | 1 + modules/core/src/union_cast.cpp | 1 + modules/core/src/waitable_event.cpp | 1 + modules/core/src/waitable_handle.cpp | 1 + modules/core/src/waitable_handle_watch_support.cpp | 13 +- modules/core/src/zip_input.cpp | 150 +- modules/custom_handler_dao/CMakeLists.txt | 83 + .../dao/CustomHandlerDatabase.cpp | 47 + .../custom_handler_dao/dao/custom_handler_dao.cpp | 300 ++++ .../dao/custom_handler_dao_read_only.cpp | 264 +++ .../custom-handler-dao-ro/CustomHandlerDatabase.h | 66 + .../custom-handler-dao-ro/common_dao_types.h | 65 + .../custom_handler_dao_read_only.h | 98 + .../custom-handler-dao-rw/custom_handler_dao.h | 75 + modules/custom_handler_dao/orm/custom_handler_db | 34 + .../orm/custom_handler_db_definitions | 6 + .../orm/custom_handler_db_sql_generator.h | 27 + modules/custom_handler_dao/orm/gen_db_md5.sh | 19 + .../orm/orm_generator_custom_handler.h | 24 + modules/custom_handler_dao/orm/version_db | 5 + modules/db/include/dpl/db/orm.h | 479 ++++- modules/db/include/dpl/db/orm_generator.h | 66 +- modules/db/include/dpl/db/orm_macros.h | 8 +- modules/db/include/dpl/db/sql_connection.h | 19 +- .../db/include/dpl/db/thread_database_support.h | 6 +- modules/db/src/naive_synchronization_object.cpp | 1 + modules/db/src/orm.cpp | 5 +- modules/db/src/sql_connection.cpp | 43 +- modules/db/src/thread_database_support.cpp | 2 +- modules/dbus/include/dpl/dbus/connection.h | 6 +- modules/dbus/src/connection.cpp | 2 +- modules/dbus/src/dispatcher.cpp | 2 +- modules/dbus/src/interface.cpp | 1 + modules/dbus/src/object.cpp | 2 +- modules/dbus/src/object_proxy.cpp | 2 +- modules/dbus/src/server.cpp | 4 +- modules/encryption/config.cmake | 38 + .../include/dpl/encryption/resource_decryption.h | 59 + .../include/dpl/encryption/resource_encryption.h | 62 + modules/encryption/src/resource_decryption.cpp | 84 + modules/encryption/src/resource_encryption.cpp | 82 + modules/event/config.cmake | 8 - modules/event/include/dpl/event/event_support.h | 6 +- .../include/dpl/event/inter_context_delegate.h | 35 +- .../include/dpl/event/main_event_dispatcher.h | 3 +- modules/event/include/dpl/event/property.h | 8 + modules/event/src/abstract_event_call.cpp | 1 + modules/event/src/abstract_event_dispatcher.cpp | 1 + modules/event/src/controller.cpp | 1 + modules/event/src/event_listener.cpp | 1 + modules/event/src/event_support.cpp | 1 + modules/event/src/generic_event_call.cpp | 1 + modules/event/src/inter_context_delegate.cpp | 1 + modules/event/src/main_event_dispatcher.cpp | 52 +- modules/event/src/model.cpp | 1 + modules/event/src/thread_event_dispatcher.cpp | 1 + modules/localization/config.cmake | 3 +- .../localization/include/LanguageTagsProvider.h | 91 + .../include/dpl/localization/localization_utils.h | 12 - .../dpl/localization/w3c_file_localization.h | 41 +- modules/localization/src/LanguageTagsProvider.cpp | 158 ++ modules/localization/src/localization_utils.cpp | 55 +- modules/localization/src/w3c_file_localization.cpp | 196 +- modules/log/include/dpl/log/log.h | 3 - modules/log/src/abstract_log_provider.cpp | 1 + modules/log/src/dlog_log_provider.cpp | 1 + modules/log/src/log.cpp | 13 +- modules/log/src/old_style_log_provider.cpp | 1 + .../rpc/include/dpl/rpc/generic_rpc_connection.h | 4 +- modules/rpc/src/abstract_rpc_connection.cpp | 1 + modules/rpc/src/abstract_rpc_connector.cpp | 1 + modules/rpc/src/generic_rpc_connection.cpp | 1 + modules/rpc/src/generic_socket_rpc_client.cpp | 1 + modules/rpc/src/generic_socket_rpc_connection.cpp | 1 + modules/rpc/src/generic_socket_rpc_server.cpp | 1 + modules/rpc/src/unix_socket_rpc_client.cpp | 1 + modules/rpc/src/unix_socket_rpc_connection.cpp | 1 + modules/rpc/src/unix_socket_rpc_server.cpp | 1 + modules/security_origin_dao/CMakeLists.txt | 57 + .../dao/security_origin_dao.cpp | 262 +++ .../dao/security_origin_dao_types.cpp | 29 + .../dao/security_origin_database.cpp | 19 + .../security-origin-dao/security_origin_dao.h | 61 + .../security_origin_dao_types.h | 108 ++ .../security-origin-dao/security_origin_database.h | 50 + .../orm/orm_generator_security_origin.h | 24 + modules/security_origin_dao/orm/security_origin_db | 12 + .../orm/security_origin_db_definitions | 5 + .../orm/security_origin_db_sql_generator.h | 27 + modules/socket/src/generic_socket.cpp | 1 + modules/socket/src/unix_socket.cpp | 7 +- ...able_input_output_execution_context_support.cpp | 1 + modules/support/config.cmake | 26 + modules/support/wrt_plugin_export.h | 295 +++ .../test/include/dpl/test/test_results_collector.h | 5 +- modules/test/include/dpl/test/test_runner.h | 42 +- modules/test/src/test_results_collector.cpp | 574 +++++- modules/test/src/test_runner.cpp | 194 +- modules/utils/config.cmake | 18 +- modules/utils/include/dpl/utils/bash_utils.h | 38 + modules/utils/include/dpl/utils/file_utils.h | 56 + modules/utils/include/dpl/utils/folder_size.h | 39 + modules/utils/include/dpl/utils/mime_type_utils.h | 57 + modules/utils/include/dpl/utils/warp_iri.h | 63 + modules/utils/include/dpl/utils/widget_version.h | 118 ++ .../utils/include/dpl/utils/wrt_global_settings.h | 40 + modules/utils/include/dpl/utils/wrt_utility.h | 82 + modules/utils/src/bash_utils.cpp | 47 + modules/utils/src/file_utils.cpp | 4 +- modules/utils/src/folder_size.cpp | 98 +- modules/utils/src/mime_type_utils.cpp | 3 +- modules/utils/src/warp_iri.cpp | 23 +- modules/utils/src/widget_version.cpp | 3 +- modules/utils/src/wrt_global_settings.cpp | 143 +- modules/utils/src/wrt_utility.cpp | 421 ++--- modules/widget_dao/CMakeLists.txt | 33 +- modules/widget_dao/dao/WrtDatabase.cpp | 11 +- modules/widget_dao/dao/common_dao_types.cpp | 141 +- modules/widget_dao/dao/config_parser_data.cpp | 57 + modules/widget_dao/dao/feature_dao.cpp | 53 +- modules/widget_dao/dao/feature_dao_read_only.cpp | 113 +- modules/widget_dao/dao/global_dao.cpp | 292 +-- modules/widget_dao/dao/global_dao_read_only.cpp | 163 +- modules/widget_dao/dao/path_builder.cpp | 1 + modules/widget_dao/dao/plugin_dao.cpp | 42 +- modules/widget_dao/dao/plugin_dao_read_only.cpp | 30 +- modules/widget_dao/dao/property_dao.cpp | 44 +- modules/widget_dao/dao/property_dao_read_only.cpp | 91 +- modules/widget_dao/dao/webruntime_database.cpp | 1 + modules/widget_dao/dao/widget_dao.cpp | 563 ++++-- modules/widget_dao/dao/widget_dao_read_only.cpp | 497 ++++-- .../include/dpl/wrt-dao-ro/WrtDatabase.h | 3 +- .../include/dpl/wrt-dao-ro/common_dao_types.h | 313 ++-- .../include/dpl/wrt-dao-ro/config_parser_data.h | 120 +- .../include/dpl/wrt-dao-ro/feature_dao_read_only.h | 12 +- .../include/dpl/wrt-dao-ro/feature_model.h | 18 +- .../include/dpl/wrt-dao-ro/global_config.h | 121 +- .../include/dpl/wrt-dao-ro/global_dao_read_only.h | 49 +- .../include/dpl/wrt-dao-ro/plugin_dao_read_only.h | 8 +- .../dpl/wrt-dao-ro/property_dao_read_only.h | 31 +- .../include/dpl/wrt-dao-ro/vconf_config.h | 98 + .../include/dpl/wrt-dao-ro/widget_config.h | 2 +- .../include/dpl/wrt-dao-ro/widget_dao_read_only.h | 166 +- .../include/dpl/wrt-dao-ro/wrt_db_types.h | 38 + .../include/dpl/wrt-dao-rw/feature_dao.h | 3 +- .../widget_dao/include/dpl/wrt-dao-rw/global_dao.h | 46 +- .../widget_dao/include/dpl/wrt-dao-rw/plugin_dao.h | 2 + .../include/dpl/wrt-dao-rw/property_dao.h | 22 + .../widget_dao/include/dpl/wrt-dao-rw/widget_dao.h | 125 +- modules/widget_dao/orm/wrt_db | 171 +- packaging/wrt-commons.spec | 155 ++ tests/CMakeLists.txt | 50 +- tests/CMakeUtils.txt | 178 ++ tests/common/include/loop_control.h | 42 + tests/common/src/loop_control.cpp | 75 + tests/dao/CMakeLists.txt | 36 + tests/dao/README | 11 + tests/dao/TestCases_CustomHandlerDAO.cpp | 120 ++ tests/dao/TestCases_FeatureDAO.cpp | 244 +++ tests/dao/TestCases_GlobalDAO.cpp | 111 ++ tests/dao/TestCases_PluginDAO.cpp | 441 +++++ tests/dao/TestCases_PropertyDAO.cpp | 163 ++ tests/dao/TestCases_WidgetDAO.cpp | 980 ++++++++++ tests/dao/tests_dao.cpp | 52 + tests/dao/wrt_dao_tests_prepare_db.sh | 129 ++ tests/dpl/CMakeLists.txt | 28 + tests/dpl/README | 13 + tests/dpl/core/.swp | Bin 0 -> 12288 bytes tests/dpl/core/CMakeLists.txt | 61 + tests/dpl/core/DESCRIPTION | 2 + tests/dpl/core/data/sample.zip | Bin 0 -> 174 bytes tests/dpl/core/main.cpp | 28 + tests/dpl/core/test_address.cpp | 50 + tests/dpl/core/test_binary_queue.cpp | 357 ++++ tests/dpl/core/test_fast_delegate.cpp | 248 +++ tests/dpl/core/test_foreach.cpp | 118 ++ tests/dpl/core/test_log_unhandled_exception.cpp | 74 + tests/dpl/core/test_once.cpp | 103 ++ tests/dpl/core/test_scoped_array.cpp | 62 + tests/dpl/core/test_scoped_close.cpp | 27 + tests/dpl/core/test_scoped_fclose.cpp | 70 + tests/dpl/core/test_scoped_free.cpp | 53 + tests/dpl/core/test_scoped_ptr.cpp | 59 + tests/dpl/core/test_semaphore.cpp | 85 + tests/dpl/core/test_serialization.cpp | 259 +++ tests/dpl/core/test_shared_ptr.cpp | 85 + tests/dpl/core/test_string.cpp | 384 ++++ tests/dpl/core/test_thread.cpp | 100 ++ tests/dpl/core/test_type_list.cpp | 41 + tests/dpl/core/test_zip_input.cpp | 89 + tests/dpl/db/CMakeLists.txt | 49 + tests/dpl/db/main.cpp | 28 + tests/dpl/db/orm/CMakeLists.txt | 11 + tests/dpl/db/orm/dpl_orm_test_db | 88 + tests/dpl/db/orm/dpl_orm_test_db_definitions | 5 + tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h | 27 + .../dpl/db/orm/dpl_orm_test_db_sql_generator.h.gch | Bin 0 -> 6521 bytes tests/dpl/db/orm/generator_dpl_orm_test.h | 24 + tests/dpl/db/test_orm.cpp | 851 +++++++++ tests/dpl/db/test_sql_connection.cpp | 237 +++ tests/dpl/dbus/CMakeLists.txt | 63 + .../dbus/data/org.tizen.DBusTestService.service | 3 + tests/dpl/dbus/dbus_test.cpp | 117 ++ tests/dpl/dbus/dbus_test.h | 90 + tests/dpl/dbus/main.cpp | 35 + tests/dpl/dbus/test_cases.cpp | 190 ++ tests/dpl/dbus/test_service.cpp | 89 + tests/dpl/event/CMakeLists.txt | 42 + tests/dpl/event/main.cpp | 28 + tests/dpl/event/test_controller.cpp | 331 ++++ tests/dpl/event/test_event_support.cpp | 122 ++ tests/dpl/event/test_ic_delegate.cpp | 567 ++++++ tests/dpl/event/test_property.cpp | 111 ++ tests/dpl/localization/CMakeLists.txt | 51 + tests/dpl/localization/files/CMakeLists.txt | 19 + tests/dpl/localization/files/one | 0 tests/dpl/localization/files/two | 0 .../dpl/wrt-dao-ro/common_dao_types.h | 485 +++++ .../mockup_include/dpl/wrt-dao-rw/widget_dao.h | 231 +++ tests/dpl/localization/mockup_src/widget_dao.cpp | 108 ++ tests/dpl/localization/test_localization.cpp | 28 + tests/dpl/localization/test_suite01.cpp | 112 ++ tests/dpl/unused/test_caller.cpp | 128 ++ tests/dpl/unused/test_crypto_hash.cpp | 90 + tests/dpl/unused/test_message_queue.cpp | 158 ++ tests/dpl/unused/test_shm.cpp | 1658 +++++++++++++++++ tests/dpl/unused/test_sql_connection.cpp | 44 + tests/dpl/unused/test_task.cpp | 93 + tests/dpl/utils/CMakeLists.txt | 33 + tests/dpl/utils/bash_utils.cpp | 38 + tests/dpl/utils/main.cpp | 28 + tests/dpl/utils/widget_version.cpp | 278 +++ tests/dpl/utils/wrt_utility.cpp | 163 ++ wrt-commons | 290 +++ wrt-commons.manifest | 13 + 358 files changed, 22682 insertions(+), 3347 deletions(-) create mode 100644 build/auto_save_dao/CMakeLists.txt create mode 100644 build/auto_save_dao/wrt-commons-auto-save-dao-ro.pc.in create mode 100644 build/auto_save_dao/wrt-commons-auto-save-dao-rw.pc.in create mode 100644 build/auto_save_dao/wrt-commons-auto-save-dao.pc.in create mode 100644 build/core/dpl-efl.pc.in create mode 100644 build/custom_handler_dao/CMakeLists.txt create mode 100644 build/custom_handler_dao/wrt-commons-custom-handler-dao-ro.pc.in create mode 100644 build/custom_handler_dao/wrt-commons-custom-handler-dao-rw.pc.in create mode 100644 build/db/dpl-db-efl.pc.in create mode 100644 build/dbus/dpl-dbus-efl.pc.in create mode 100644 build/encryption/CMakeLists.txt create mode 100644 build/encryption/dpl-encryption.pc.in create mode 100755 build/encryption/libs/libcal.a create mode 100755 build/encryption/libs/libcal.arm.a create mode 100755 build/encryption/libs/libcal.i586.a create mode 100644 build/event/dpl-event-efl.pc.in create mode 100644 build/log/dpl-log-efl.pc.in create mode 100644 build/rpc/dpl-rpc-efl.pc.in create mode 100644 build/security_origin_dao/CMakeLists.txt create mode 100644 build/security_origin_dao/wrt-commons-security-origin-dao.pc.in create mode 100644 build/socket/dpl-socket-efl.pc.in create mode 100644 build/support/CMakeLists.txt create mode 100644 build/support/wrt-plugins-types.pc.in create mode 100644 build/test/dpl-test-efl.pc.in create mode 100644 build/utils/dpl-utils-efl.pc.in create mode 100755 etc/wrt_commons_create_clean_db.sh create mode 100755 etc/wrt_commons_reset_db.sh create mode 100644 modules/auto_save_dao/CMakeLists.txt create mode 100644 modules/auto_save_dao/dao/AutoSaveDatabase.cpp create mode 100644 modules/auto_save_dao/dao/auto_save_dao.cpp create mode 100644 modules/auto_save_dao/dao/auto_save_dao_read_only.cpp create mode 100644 modules/auto_save_dao/dao/common_dao_types.cpp create mode 100644 modules/auto_save_dao/include/wrt-commons/auto-save-dao-ro/auto_save_dao_read_only.h create mode 100644 modules/auto_save_dao/include/wrt-commons/auto-save-dao-rw/auto_save_dao.h create mode 100644 modules/auto_save_dao/include/wrt-commons/auto-save-dao/AutoSaveDatabase.h create mode 100644 modules/auto_save_dao/include/wrt-commons/auto-save-dao/common_dao_types.h create mode 100644 modules/auto_save_dao/orm/autosave_db create mode 100644 modules/auto_save_dao/orm/autosave_db_definitions create mode 100644 modules/auto_save_dao/orm/autosave_db_sql_generator.h create mode 100755 modules/auto_save_dao/orm/gen_db_md5.sh create mode 100644 modules/auto_save_dao/orm/orm_generator_autosave.h create mode 100644 modules/auto_save_dao/orm/version_db create mode 100644 modules/core/include/dpl/auto_ptr.h mode change 100644 => 100755 modules/core/src/string.cpp create mode 100644 modules/custom_handler_dao/CMakeLists.txt create mode 100644 modules/custom_handler_dao/dao/CustomHandlerDatabase.cpp create mode 100644 modules/custom_handler_dao/dao/custom_handler_dao.cpp create mode 100644 modules/custom_handler_dao/dao/custom_handler_dao_read_only.cpp create mode 100644 modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/CustomHandlerDatabase.h create mode 100644 modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/common_dao_types.h create mode 100644 modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/custom_handler_dao_read_only.h create mode 100644 modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-rw/custom_handler_dao.h create mode 100644 modules/custom_handler_dao/orm/custom_handler_db create mode 100644 modules/custom_handler_dao/orm/custom_handler_db_definitions create mode 100644 modules/custom_handler_dao/orm/custom_handler_db_sql_generator.h create mode 100755 modules/custom_handler_dao/orm/gen_db_md5.sh create mode 100644 modules/custom_handler_dao/orm/orm_generator_custom_handler.h create mode 100644 modules/custom_handler_dao/orm/version_db create mode 100644 modules/encryption/config.cmake create mode 100644 modules/encryption/include/dpl/encryption/resource_decryption.h create mode 100644 modules/encryption/include/dpl/encryption/resource_encryption.h create mode 100644 modules/encryption/src/resource_decryption.cpp create mode 100644 modules/encryption/src/resource_encryption.cpp create mode 100644 modules/localization/include/LanguageTagsProvider.h create mode 100644 modules/localization/src/LanguageTagsProvider.cpp create mode 100644 modules/security_origin_dao/CMakeLists.txt create mode 100644 modules/security_origin_dao/dao/security_origin_dao.cpp create mode 100644 modules/security_origin_dao/dao/security_origin_dao_types.cpp create mode 100644 modules/security_origin_dao/dao/security_origin_database.cpp create mode 100644 modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao.h create mode 100644 modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao_types.h create mode 100644 modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_database.h create mode 100644 modules/security_origin_dao/orm/orm_generator_security_origin.h create mode 100644 modules/security_origin_dao/orm/security_origin_db create mode 100644 modules/security_origin_dao/orm/security_origin_db_definitions create mode 100644 modules/security_origin_dao/orm/security_origin_db_sql_generator.h create mode 100644 modules/support/config.cmake create mode 100644 modules/support/wrt_plugin_export.h create mode 100644 modules/utils/include/dpl/utils/bash_utils.h create mode 100644 modules/utils/include/dpl/utils/file_utils.h create mode 100644 modules/utils/include/dpl/utils/folder_size.h create mode 100644 modules/utils/include/dpl/utils/mime_type_utils.h create mode 100644 modules/utils/include/dpl/utils/warp_iri.h create mode 100644 modules/utils/include/dpl/utils/widget_version.h create mode 100644 modules/utils/include/dpl/utils/wrt_global_settings.h create mode 100644 modules/utils/include/dpl/utils/wrt_utility.h create mode 100644 modules/utils/src/bash_utils.cpp mode change 100644 => 100755 modules/widget_dao/dao/config_parser_data.cpp mode change 100644 => 100755 modules/widget_dao/dao/feature_dao.cpp mode change 100644 => 100755 modules/widget_dao/include/dpl/wrt-dao-ro/config_parser_data.h create mode 100644 modules/widget_dao/include/dpl/wrt-dao-ro/vconf_config.h create mode 100644 modules/widget_dao/include/dpl/wrt-dao-ro/wrt_db_types.h mode change 100644 => 100755 modules/widget_dao/include/dpl/wrt-dao-rw/feature_dao.h mode change 100644 => 100755 modules/widget_dao/orm/wrt_db create mode 100644 packaging/wrt-commons.spec create mode 100644 tests/CMakeUtils.txt create mode 100644 tests/common/include/loop_control.h create mode 100644 tests/common/src/loop_control.cpp create mode 100644 tests/dao/CMakeLists.txt create mode 100644 tests/dao/README create mode 100644 tests/dao/TestCases_CustomHandlerDAO.cpp create mode 100644 tests/dao/TestCases_FeatureDAO.cpp create mode 100644 tests/dao/TestCases_GlobalDAO.cpp create mode 100644 tests/dao/TestCases_PluginDAO.cpp create mode 100644 tests/dao/TestCases_PropertyDAO.cpp create mode 100644 tests/dao/TestCases_WidgetDAO.cpp create mode 100644 tests/dao/tests_dao.cpp create mode 100755 tests/dao/wrt_dao_tests_prepare_db.sh create mode 100644 tests/dpl/CMakeLists.txt create mode 100644 tests/dpl/README create mode 100644 tests/dpl/core/.swp create mode 100644 tests/dpl/core/CMakeLists.txt create mode 100644 tests/dpl/core/DESCRIPTION create mode 100644 tests/dpl/core/data/sample.zip create mode 100644 tests/dpl/core/main.cpp create mode 100644 tests/dpl/core/test_address.cpp create mode 100644 tests/dpl/core/test_binary_queue.cpp create mode 100644 tests/dpl/core/test_fast_delegate.cpp create mode 100644 tests/dpl/core/test_foreach.cpp create mode 100644 tests/dpl/core/test_log_unhandled_exception.cpp create mode 100644 tests/dpl/core/test_once.cpp create mode 100644 tests/dpl/core/test_scoped_array.cpp create mode 100644 tests/dpl/core/test_scoped_close.cpp create mode 100644 tests/dpl/core/test_scoped_fclose.cpp create mode 100644 tests/dpl/core/test_scoped_free.cpp create mode 100644 tests/dpl/core/test_scoped_ptr.cpp create mode 100644 tests/dpl/core/test_semaphore.cpp create mode 100644 tests/dpl/core/test_serialization.cpp create mode 100644 tests/dpl/core/test_shared_ptr.cpp create mode 100644 tests/dpl/core/test_string.cpp create mode 100644 tests/dpl/core/test_thread.cpp create mode 100644 tests/dpl/core/test_type_list.cpp create mode 100644 tests/dpl/core/test_zip_input.cpp create mode 100644 tests/dpl/db/CMakeLists.txt create mode 100644 tests/dpl/db/main.cpp create mode 100644 tests/dpl/db/orm/CMakeLists.txt create mode 100644 tests/dpl/db/orm/dpl_orm_test_db create mode 100644 tests/dpl/db/orm/dpl_orm_test_db_definitions create mode 100644 tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h create mode 100644 tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h.gch create mode 100644 tests/dpl/db/orm/generator_dpl_orm_test.h create mode 100644 tests/dpl/db/test_orm.cpp create mode 100644 tests/dpl/db/test_sql_connection.cpp create mode 100644 tests/dpl/dbus/CMakeLists.txt create mode 100644 tests/dpl/dbus/data/org.tizen.DBusTestService.service create mode 100644 tests/dpl/dbus/dbus_test.cpp create mode 100644 tests/dpl/dbus/dbus_test.h create mode 100644 tests/dpl/dbus/main.cpp create mode 100644 tests/dpl/dbus/test_cases.cpp create mode 100644 tests/dpl/dbus/test_service.cpp create mode 100644 tests/dpl/event/CMakeLists.txt create mode 100644 tests/dpl/event/main.cpp create mode 100644 tests/dpl/event/test_controller.cpp create mode 100644 tests/dpl/event/test_event_support.cpp create mode 100644 tests/dpl/event/test_ic_delegate.cpp create mode 100644 tests/dpl/event/test_property.cpp create mode 100644 tests/dpl/localization/CMakeLists.txt create mode 100644 tests/dpl/localization/files/CMakeLists.txt create mode 100644 tests/dpl/localization/files/one create mode 100644 tests/dpl/localization/files/two create mode 100644 tests/dpl/localization/mockup_include/dpl/wrt-dao-ro/common_dao_types.h create mode 100644 tests/dpl/localization/mockup_include/dpl/wrt-dao-rw/widget_dao.h create mode 100644 tests/dpl/localization/mockup_src/widget_dao.cpp create mode 100644 tests/dpl/localization/test_localization.cpp create mode 100644 tests/dpl/localization/test_suite01.cpp create mode 100644 tests/dpl/unused/test_caller.cpp create mode 100644 tests/dpl/unused/test_crypto_hash.cpp create mode 100644 tests/dpl/unused/test_message_queue.cpp create mode 100644 tests/dpl/unused/test_shm.cpp create mode 100644 tests/dpl/unused/test_sql_connection.cpp create mode 100644 tests/dpl/unused/test_task.cpp create mode 100644 tests/dpl/utils/CMakeLists.txt create mode 100644 tests/dpl/utils/bash_utils.cpp create mode 100644 tests/dpl/utils/main.cpp create mode 100644 tests/dpl/utils/widget_version.cpp create mode 100644 tests/dpl/utils/wrt_utility.cpp create mode 100644 wrt-commons create mode 100644 wrt-commons.manifest diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index 4783a46..e71fc4c 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -54,7 +54,7 @@ SET(TARGET_3RDPARTY "lib3rdparty") INCLUDE_DIRECTORIES(${DPL_3RDPARTY_INCLUDE_DIR}) # Add system include files -INCLUDE_DIRECTORIES(${SYS_3RDPARTY_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(SYSTEM ${SYS_3RDPARTY_INCLUDE_DIRS}) LINK_DIRECTORIES(${SYS_3RDPARTY_LIBRARY_DIRS}) # Build shared library diff --git a/3rdparty/fastdelegate/Demo.cpp b/3rdparty/fastdelegate/Demo.cpp index 2b4d6f6..93720f9 100644 --- a/3rdparty/fastdelegate/Demo.cpp +++ b/3rdparty/fastdelegate/Demo.cpp @@ -1,3 +1,4 @@ +#include #include #include "FastDelegate.h" // Demonstrate the syntax for FastDelegates. diff --git a/CMakeLists.txt b/CMakeLists.txt index 42a1e50..64704d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,46 +19,46 @@ # @brief # -# # Check minimum CMake version -# CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -# # Project name -# PROJECT(dpl) -# -# Logs -# +STRING(REGEX MATCH "([^.]*)" API_VERSION "${VERSION}") +ADD_DEFINITIONS("-DAPI_VERSION=\"$(API_VERSION)\"") +# Comment this to disable control of global settings with environment variable +ADD_DEFINITIONS("-DGLOBAL_SETTINGS_CONTROL") -OPTION(DPL_LOG "DPL logs status" OFF) +# Build type +IF(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "Release") +ENDIF(NOT CMAKE_BUILD_TYPE) -IF(DPL_LOG) +# Options +OPTION(DPL_LOG "DPL logs status" OFF) +IF(DPL_LOG AND NOT CMAKE_BUILD_TYPE MATCHES "profiling") MESSAGE(STATUS "Logging enabled for DPL") ADD_DEFINITIONS("-DDPL_LOGS_ENABLED") -ELSE(DPL_LOG) +ELSE(DPL_LOG AND NOT CMAKE_BUILD_TYPE MATCHES "profiling") MESSAGE(STATUS "Logging disabled for DPL") -ENDIF(DPL_LOG) -ADD_DEFINITIONS("-DSEPARATED_SINGLETON_IMPLEMENTATION") +ENDIF(DPL_LOG AND NOT CMAKE_BUILD_TYPE MATCHES "profiling") -# Gtk -OPTION(DISABLE_GTK "Disable GTK stuff" ON) - -# -# Build type -# +OPTION(WITH_TESTS "Build tests" OFF) -SET(CMAKE_BUILD_TYPE "Release") +# Compiler flags +SET(CMAKE_C_FLAGS_PROFILING "-O2") +SET(CMAKE_CXX_FLAGS_PROFILING "-O2 -std=c++0x") +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") -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") -SET(CMAKE_CXX_FLAGS "-O2 -g -fPIC -D_FORTIFY_SOURCE=0") +ADD_DEFINITIONS("-fPIC") # If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. (BJ: our ARM too?) -# # CMake settings -# MESSAGE(STATUS "========================================") MESSAGE(STATUS "CMAKE_BINARY_DIR: " ${CMAKE_BINARY_DIR}) MESSAGE(STATUS "CMAKE_CURRENT_BINARY_DIR: " ${CMAKE_CURRENT_BINARY_DIR}) @@ -107,17 +107,13 @@ MESSAGE(STATUS "CMAKE_COMPILER_IS_GNUCC: " ${CMAKE_COMPILER_IS_GNUCC}) MESSAGE(STATUS "CMAKE_COMPILER_IS_GNUCXX : " ${CMAKE_COMPILER_IS_GNUCXX}) MESSAGE(STATUS "CMAKE_AR: " ${CMAKE_AR}) MESSAGE(STATUS "CMAKE_RANLIB: " ${CMAKE_RANLIB}) +MESSAGE(STATUS "WITH_TESTS: " ${WITH_TESTS}) MESSAGE(STATUS "========================================") -# # Build 3rd party libraries first -# ADD_SUBDIRECTORY(3rdparty) -# # Compiler flags -# - ADD_DEFINITIONS("-fvisibility=default") # mark all exported symbols as visible # Warnings mode @@ -186,18 +182,27 @@ SET(TARGET_DPL_SOCKET_EFL "lib${PROJECT_NAME}-socket-efl") SET(TARGET_DPL_RPC_EFL "lib${PROJECT_NAME}-rpc-efl") SET(TARGET_DPL_TEST_ENGINE_EFL "lib${PROJECT_NAME}-test-efl") SET(TARGET_DPL_LOG_EFL "lib${PROJECT_NAME}-log-efl") -SET(TARGET_DPL_POPUP "lib${PROJECT_NAME}-popup-efl") SET(TARGET_WRT_DAO_RW_LIB "dpl-wrt-dao-rw") SET(TARGET_WRT_DAO_RO_LIB "dpl-wrt-dao-ro") +SET(TARGET_AUTO_SAVE_DAO_LIB "wrt-commons-auto-save-dao") +SET(TARGET_AUTO_SAVE_DAO_RW_LIB "wrt-commons-auto-save-dao-rw") +SET(TARGET_AUTO_SAVE_DAO_RO_LIB "wrt-commons-auto-save-dao-ro") +SET(TARGET_CUSTOM_HANDLER_DAO_RW_LIB "wrt-commons-custom-handler-dao-rw") +SET(TARGET_CUSTOM_HANDLER_DAO_RO_LIB "wrt-commons-custom-handler-dao-ro") +SET(TARGET_SECURITY_ORIGIN_DAO_LIB "wrt-commons-security-origin-dao") SET(TARGET_DPL_UTILS_EFL "lib${PROJECT_NAME}-utils-efl") -SET(TARGET_ACE_DAO_RO_LIB "dpl-ace-dao-ro") -SET(TARGET_ACE_DAO_RW_LIB "dpl-ace-dao-rw") -SET(TARGET_ACE_LIB "dpl-ace") -SET(TARGET_VCORE_LIB "dpl-vcore") +SET(TARGET_DPL_ENCRYPTION "lib${PROJECT_NAME}-encryption") + +macro(configure_and_install_pkg PKG_FILE) + CONFIGURE_FILE(${PKG_FILE}.in ${PKG_FILE} @ONLY) + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PKG_FILE} DESTINATION lib/pkgconfig) +endmacro(configure_and_install_pkg) ADD_SUBDIRECTORY(modules) ADD_SUBDIRECTORY(build) -ADD_SUBDIRECTORY(tests) ADD_SUBDIRECTORY(etc) +IF(WITH_TESTS) + ADD_SUBDIRECTORY(tests) +ENDIF(WITH_TESTS) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 835f856..b27d01f 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -26,8 +26,10 @@ ADD_SUBDIRECTORY(socket) ADD_SUBDIRECTORY(rpc) ADD_SUBDIRECTORY(test) #ADD_SUBDIRECTORY(log) -ADD_SUBDIRECTORY(vcore) -ADD_SUBDIRECTORY(ace) ADD_SUBDIRECTORY(widget_dao) -ADD_SUBDIRECTORY(popup) +ADD_SUBDIRECTORY(auto_save_dao) +ADD_SUBDIRECTORY(security_origin_dao) +ADD_SUBDIRECTORY(custom_handler_dao) ADD_SUBDIRECTORY(utils) +ADD_SUBDIRECTORY(support) +ADD_SUBDIRECTORY(encryption) diff --git a/build/auto_save_dao/CMakeLists.txt b/build/auto_save_dao/CMakeLists.txt new file mode 100644 index 0000000..62e656a --- /dev/null +++ b/build/auto_save_dao/CMakeLists.txt @@ -0,0 +1,22 @@ +# 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 Jihoon Chung (jihoon.chung@samsung.com) +# @brief +# + +configure_and_install_pkg(wrt-commons-auto-save-dao.pc) +configure_and_install_pkg(wrt-commons-auto-save-dao-ro.pc) +configure_and_install_pkg(wrt-commons-auto-save-dao-rw.pc) diff --git a/build/auto_save_dao/wrt-commons-auto-save-dao-ro.pc.in b/build/auto_save_dao/wrt-commons-auto-save-dao-ro.pc.in new file mode 100644 index 0000000..2784bef --- /dev/null +++ b/build/auto_save_dao/wrt-commons-auto-save-dao-ro.pc.in @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} + +libdir=${prefix}/lib +includedir=${prefix}/include +Name: wrt-commons-auto-save-dao-ro +Description: wrt-commons-auto-save-dao-ro + +Version: @VERSION@ +Requires: dpl-efl wrt-commons-auto-save-dao libxml-2.0 +Libs: -lwrt-commons-auto-save-dao-ro -lwrt-commons-auto-save-dao -L${libdir} +Cflags: -I${includedir}/dpl-efl diff --git a/build/auto_save_dao/wrt-commons-auto-save-dao-rw.pc.in b/build/auto_save_dao/wrt-commons-auto-save-dao-rw.pc.in new file mode 100644 index 0000000..bb4bd70 --- /dev/null +++ b/build/auto_save_dao/wrt-commons-auto-save-dao-rw.pc.in @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} + +libdir=${prefix}/lib +includedir=${prefix}/include +Name: wrt-commons-auto-save-dao-rw +Description: wrt-commons-auto-save-dao-rw + +Version: @VERSION@ +Requires: dpl-efl wrt-commons-auto-save-dao wrt-commons-auto-save-dao-ro libxml-2.0 +Libs: -lwrt-commons-auto-save-dao-rw -lwrt-commons-auto-save-dao-ro -lwrt-commons-auto-save-dao -L${libdir} +Cflags: -I${includedir}/dpl-efl diff --git a/build/auto_save_dao/wrt-commons-auto-save-dao.pc.in b/build/auto_save_dao/wrt-commons-auto-save-dao.pc.in new file mode 100644 index 0000000..11e3ca9 --- /dev/null +++ b/build/auto_save_dao/wrt-commons-auto-save-dao.pc.in @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} + +libdir=${prefix}/lib +includedir=${prefix}/include +Name: wrt-commons-auto-save-dao +Description: wrt-commons-auto-save-dao + +Version: @VERSION@ +Requires: dpl-efl libxml-2.0 +Libs: -lwrt-commons-auto-save-dao -L${libdir} +Cflags: -I${includedir}/dpl-efl diff --git a/build/core/CMakeLists.txt b/build/core/CMakeLists.txt index a6dc980..080d65c 100644 --- a/build/core/CMakeLists.txt +++ b/build/core/CMakeLists.txt @@ -35,9 +35,10 @@ INCLUDE_DIRECTORIES( ${DPL_LOG_INCLUDE_DIR} ${DPL_CORE_INCLUDE_DIR} ${DPL_3RDPARTY_INCLUDE_DIR} - ${SYS_EFL_INCLUDE_DIRS} ) +INCLUDE_DIRECTORIES(SYSTEM ${SYS_EFL_INCLUDE_DIRS}) + LINK_DIRECTORIES(${SYS_EFL_LIBRARY_DIRS}) # Base EFL based DPL library @@ -58,14 +59,14 @@ TARGET_LINK_LIBRARIES(${TARGET_DPL_EFL} lib3rdparty) # Target library properties SET_TARGET_PROPERTIES(${TARGET_DPL_EFL} PROPERTIES - SOVERSION ${VERSION} + SOVERSION ${API_VERSION} + VERSION ${VERSION} CLEAN_DIRECT_OUTPUT 1 OUTPUT_NAME ${DPL_EFL_LIBRARY}) # Install libraries INSTALL(TARGETS ${TARGET_DPL_EFL} - DESTINATION lib - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + DESTINATION lib) # Install detail headers INSTALL(FILES ${DPL_CORE_EFL_DETAIL_HEADERS} @@ -84,5 +85,4 @@ INSTALL(FILES ${DPL_3RDPARTY_HEADERS} DESTINATION include/dpl-efl/dpl/3rdparty/fastdelegate) # Install pkgconfig script -INSTALL(FILES dpl-efl.pc - DESTINATION lib/pkgconfig) +configure_and_install_pkg(dpl-efl.pc) diff --git a/build/core/dpl-efl.pc.in b/build/core/dpl-efl.pc.in new file mode 100644 index 0000000..6d2a882 --- /dev/null +++ b/build/core/dpl-efl.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: dpl-efl +Description: DPL - EFL based +Version: @VERSION@ +Requires: ecore appcore-efl openssl dlog vconf +Libs: -L${libdir} -ldpl-efl +Cflags: -I${includedir}/dpl-efl diff --git a/build/custom_handler_dao/CMakeLists.txt b/build/custom_handler_dao/CMakeLists.txt new file mode 100644 index 0000000..26e701c --- /dev/null +++ b/build/custom_handler_dao/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @brief +# + +configure_and_install_pkg(wrt-commons-custom-handler-dao-ro.pc) +configure_and_install_pkg(wrt-commons-custom-handler-dao-rw.pc) diff --git a/build/custom_handler_dao/wrt-commons-custom-handler-dao-ro.pc.in b/build/custom_handler_dao/wrt-commons-custom-handler-dao-ro.pc.in new file mode 100644 index 0000000..7cda187 --- /dev/null +++ b/build/custom_handler_dao/wrt-commons-custom-handler-dao-ro.pc.in @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} + +libdir=${prefix}/lib +includedir=${prefix}/include +Name: wrt-commons-custom-handler-dao-ro +Description: wrt-commons-custom-handler-dao-ro + +Version: @VERSION@ +Requires: dpl-efl +Libs: -lwrt-commons-custom-handler-dao-ro -L${libdir} +Cflags: -I${includedir}/dpl-efl diff --git a/build/custom_handler_dao/wrt-commons-custom-handler-dao-rw.pc.in b/build/custom_handler_dao/wrt-commons-custom-handler-dao-rw.pc.in new file mode 100644 index 0000000..4cd2737 --- /dev/null +++ b/build/custom_handler_dao/wrt-commons-custom-handler-dao-rw.pc.in @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} + +libdir=${prefix}/lib +includedir=${prefix}/include +Name: wrt-commons-custom-handler-dao-rw +Description: wrt-commons-custom-handler-dao-rw + +Version: @VERSION@ +Requires: dpl-efl wrt-commons-custom-handler-dao-ro +Libs: -lwrt-commons-custom-handler-dao-rw -lwrt-commons-custom-handler-dao-ro -L${libdir} +Cflags: -I${includedir}/dpl-efl diff --git a/build/db/CMakeLists.txt b/build/db/CMakeLists.txt index 7426d5b..29dd495 100644 --- a/build/db/CMakeLists.txt +++ b/build/db/CMakeLists.txt @@ -30,7 +30,10 @@ INCLUDE_DIRECTORIES( ${DPL_LOG_INCLUDE_DIR} ${DPL_CORE_INCLUDE_DIR} ${DPL_DB_INCLUDE_DIR} - ${SYS_EFL_INCLUDE_DIRS}) +) + +INCLUDE_DIRECTORIES(SYSTEM ${SYS_EFL_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(SYSTEM ${SYS_EFL_DB_INCLUDE_DIRS}) LINK_DIRECTORIES( ${SYS_EFL_DB_LIBRARY_DIRS} @@ -50,19 +53,18 @@ TARGET_LINK_LIBRARIES(${TARGET_DPL_DB_EFL} # Target library properties SET_TARGET_PROPERTIES(${TARGET_DPL_DB_EFL} PROPERTIES - SOVERSION ${VERSION} + SOVERSION ${API_VERSION} + VERSION ${VERSION} CLEAN_DIRECT_OUTPUT 1 OUTPUT_NAME ${DPL_EFL_DB_LIBRARY}) # Install libraries INSTALL(TARGETS ${TARGET_DPL_DB_EFL} - DESTINATION lib - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + DESTINATION lib) # Install detail headers INSTALL(FILES ${DPL_DB_HEADERS} DESTINATION include/dpl-efl/dpl/db) # Install pkgconfig script -INSTALL(FILES dpl-db-efl.pc - DESTINATION lib/pkgconfig) +configure_and_install_pkg(dpl-db-efl.pc) diff --git a/build/db/dpl-db-efl.pc.in b/build/db/dpl-db-efl.pc.in new file mode 100644 index 0000000..866bb0f --- /dev/null +++ b/build/db/dpl-db-efl.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: dpl-db-efl +Description: DPL DB - EFL based +Version: @VERSION@ +Requires: dpl-efl sqlite3 db-util +Libs: -L${libdir} -ldpl-db-efl +Cflags: -I${includedir}/dpl-efl diff --git a/build/dbus/CMakeLists.txt b/build/dbus/CMakeLists.txt index 71e883a..59b2db1 100644 --- a/build/dbus/CMakeLists.txt +++ b/build/dbus/CMakeLists.txt @@ -22,6 +22,7 @@ INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(SYS_EFL_DBUS dbus-1 + gio-2.0 REQUIRED) # Add core include directories @@ -30,7 +31,10 @@ INCLUDE_DIRECTORIES( ${DPL_CORE_INCLUDE_DIR} ${DPL_DBUS_INCLUDE_DIR} ${DPL_EVENT_INCLUDE_DIR} - ${SYS_EFL_INCLUDE_DIRS}) +) + +INCLUDE_DIRECTORIES(SYSTEM ${SYS_EFL_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(SYSTEM ${SYS_EFL_DBUS_INCLUDE_DIRS}) LINK_DIRECTORIES( ${SYS_EFL_DBUS_LIBRARY_DIRS} @@ -51,19 +55,18 @@ TARGET_LINK_LIBRARIES(${TARGET_DPL_DBUS_EFL} # Target library properties SET_TARGET_PROPERTIES(${TARGET_DPL_DBUS_EFL} PROPERTIES - SOVERSION ${VERSION} + SOVERSION ${API_VERSION} + VERSION ${VERSION} CLEAN_DIRECT_OUTPUT 1 OUTPUT_NAME ${DPL_EFL_DBUS_LIBRARY}) # Install libraries INSTALL(TARGETS ${TARGET_DPL_DBUS_EFL} - DESTINATION lib - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + DESTINATION lib) # Install detail headers INSTALL(FILES ${DPL_DBUS_HEADERS} DESTINATION include/dpl-efl/dpl/dbus) # Install pkgconfig script -INSTALL(FILES dpl-dbus-efl.pc - DESTINATION lib/pkgconfig) +configure_and_install_pkg(dpl-dbus-efl.pc) diff --git a/build/dbus/dpl-dbus-efl.pc.in b/build/dbus/dpl-dbus-efl.pc.in new file mode 100644 index 0000000..73f2c03 --- /dev/null +++ b/build/dbus/dpl-dbus-efl.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: dpl-dbus-efl +Description: DPL DBus - EFL based +Version: @VERSION@ +Requires: dbus-1 dpl-efl dpl-event-efl +Libs: -L${libdir} -ldpl-dbus-efl +Cflags: -I${includedir}/dpl-efl diff --git a/build/encryption/CMakeLists.txt b/build/encryption/CMakeLists.txt new file mode 100644 index 0000000..bf38cae --- /dev/null +++ b/build/encryption/CMakeLists.txt @@ -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 CMakeLists.txt +# @author Soyoung Kim (sy037.kim@samsung.com) +# @version 1.0 +# @brief +# + +# Check required modules +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(SYS_ENCRYPTION + dlog + openssl + REQUIRED +) + +# Add core include directories +INCLUDE_DIRECTORIES( + ${DPL_LOG_INCLUDE_DIR} + ${DPL_CORE_INCLUDE_DIR} + ${DPL_DB_INCLUDE_DIR} + ${DPL_ENCRYPTION_INCLUDE_DIR} +) + +INCLUDE_DIRECTORIES(SYSTEM ${SYS_ENCRYPTION_INCLUDE_DIRS}) + +LINK_DIRECTORIES( + ${SYS_ENCRYPTION_LIBRARY_DIRS} +) + +# Base EFL based DPL library +SET(DPL_ENCRYPTION_LIBRARY "${PROJECT_NAME}-encryption") + +# Build shared library + +ADD_LIBRARY(${TARGET_DPL_ENCRYPTION} SHARED + ${DPL_ENCRYPTION_SOURCES} +) + +TARGET_LINK_LIBRARIES(${TARGET_DPL_ENCRYPTION} + ${SYS_ENCRYPTION_LIBRARIES} + ${TARGET_DPL_EFL} +) + +TARGET_LINK_LIBRARIES(${TARGET_DPL_ENCRYPTION} -L./libs -lcal) + +# Target library properties +SET_TARGET_PROPERTIES(${TARGET_DPL_ENCRYPTION} PROPERTIES + SOVERSION ${API_VERSION} + VERSION ${VERSION} + CLEAN_DIRECT_OUTPUT 1 + OUTPUT_NAME ${DPL_ENCRYPTION_LIBRARY}) + +# Install libraries +INSTALL(TARGETS ${TARGET_DPL_ENCRYPTION} + DESTINATION lib) + +# Install detail headers + +INSTALL(FILES ${DPL_ENCRYPTION_HEADERS} + DESTINATION include/dpl-efl/dpl/encryption) + +# Install pkgconfig script +configure_and_install_pkg(dpl-encryption.pc) diff --git a/build/encryption/dpl-encryption.pc.in b/build/encryption/dpl-encryption.pc.in new file mode 100644 index 0000000..dfddda3 --- /dev/null +++ b/build/encryption/dpl-encryption.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: dpl-encryption +Description: DPL UTILS - EFL based +Version: @VERSION@ +Requires: dpl-efl +Libs: -L${libdir} -ldpl-encryption +Cflags: -I${includedir}/dpl-efl diff --git a/build/encryption/libs/libcal.a b/build/encryption/libs/libcal.a new file mode 100755 index 0000000000000000000000000000000000000000..8400c5f506fe1ad1915fb18189265b512ac85fe1 GIT binary patch literal 4734 zcmbtXU5r~t6`r}*-o3l_I{TB~=BEyuw4vFxo$O|_O`{~+v`HMcX((z{Dui=w-`zE_ zuZ^#rWLp9fQfVs@5D)!9Dgr@U9*Ts3NC+qrg1$vOK#Rl^DnESygrMS~Nc@!V8=vvs zO&&ln+IzqAopa{Q%$ak?v%8P_?aIor;e2*|J1}!-u248!n7cchEf`b$oy{Jcv;G%` zl~NkdM@x_0UGeLcZr$$$=PR|EQuSIHnp~yT$~8GcFY4Uk*~5?v1%&Ls=VoWK+1W$$ zyk@;)GJ}9+gTRgI%eFh#tahfL5si0=)(&w3|t#&?%`wy^&soWN~61;||$? zN)7iNQ*=y;BZAN|t#xsN`jOqLIFZK)nVdeJ?#7nB$72P2}>9Q9JWAk-YDShCI%Y>?Y%^B25rw+Kypchb65=&1J; zt=oid^v;mpCUmR!2TV4xUFZ&Pj(v9s&3ey~?h?AkyTHD;3*G1aj@GQuDeoVo@6+Fc zlQUWHo+jO+zia5M_Ztp$hpcGc8z#L==uvMs>6CsPeVoY?-YRK9A2akm@1LXx^rE4s zyc?XxLCs}5lc&8ETIcjn4L##AM&h{stZ_c?U8eIH{k)-%diT;=6#5bGL!@VgUhtl! z^9O`hy%$Lr^_g{uO^)9FO1B%$i z)HvB|uNsy}CCPr&+hI=)Btqy160aagTu!q@xU>CLp6nR zXJchMR}J0pdB}Q*<-<1mX}t6hht?k)J&Ha;9zu9Jjr|I*H$RJj`UAEZI`2xwHhC zb!+6gSuk#PsrX>2-mF{%WsQ(F{PxA5tynCir;3aBLyS*{yWeYTQamubwF8VEgjGAI zekcl;u`xlZ>_>qaqTF3FuBB4TuO5u8(kNz(kBQgnv{k9m#P)QdkOD+qW=aw9;&MZc<_Q5F3*> z(YP`a$(e-BG2A7>Gq0mc}X1&`8)&Cxs zpNQNOdKtMjEv2PeJqVj-Z0=ca1H<47w%}67FV_RRyjyM|wgOAtup0%~WE0)InDC3i zD!0z;%36V#@-bUsb{Xj|`<08`mJDpNjP#;t4)o$#w_bgjYN2(u=X40QXllj`bNbxF z*^~SCXU%7CmSjq-w|cb7Azc~y81O)KXUne>Pvx6OP*xoEY4460nzY4>o&N*(4m zSM@u-%9W!CVo>fbm;7?M9b8hmc2E~hEnI5GIgYo$dZSL`rdGEc`i%g=*1AJy4z9S) zZ~Ngg-FjnUN-9@rHW~r;EEhIAK@ORjjyl*Dm0Nh|ft=szv}@&VXMO0UHU_in{cmtP zoOmSS3T7H}9zScWyc>G@$~Axz@oIykR$cx)etDujVo9^0(#EEMs0-x%xlXS_i? zHlF$UwVi<ZQ4m=Q(yZ+ocs$yS|%t+?MIOJaV%jL9^gLA)#lY0L}T zn|R_wy%}5YM%ZlrpzhZ^M74rWZ&Q%QHLww5X;AY>+6gGPLeIKkJm!;Q#>!k>K|N1G zXPb>@xy86Xq277V>WQuyeNE%8n+fgl5y@>9dVO5;CB^#>t~+1XR}lNhGe^z}UTf}6 zyQ2GkL>v-#hVO`2%Z)Eups|cqyJ^W&j>y%_>$mv z1b-~}Gr_k6|19_~!4c$;ad!yr7d#?Z6ns>0MX)LOgy1uR&kMdS_(#FN67jq%=%Va7 l?g$YjJ1+co!5P65f`4M((AU%jUN8l1fyUyfheFse?VwLq7qROe;E9sM1S}TLQK$Ltcr?asLylmIWu>Q zi6)%v%=13)`=0ll^PcydduKP^=+z4gyJP9(@-{LyF`3D1-!Ya+Ch>{0m>m$&CZKHMvXw`0!Hf z=C1F@4jp;#Y~%iYJ9Ezu?R($u6JLpKiafR_C%;CIWUlLlSKhh!Me*YeI=EaRuT2cb zt;D*-3b|4abO{kzBdo-(_zm&tK_RToA|BrjyAZY(9U-Fq&xv=Z?+Iz=U@ z(-%aDP7m%t&U#EhA!2REI345K5kctKE9LYc^?e(~^k5nzBvSIG-e5Kl?nz7!a*lht z=+Yl;&oY8Z55(m$z>4vX76Dgw=z2sO?9iKfZ|p@19<{Jul?q#a4rupb8-Av9b5LVs zJA}v^8GKuI_c!2SN$0bKNOuaoq0ACw*J-7U4#U&7qoqnySWfiY?B{ep0Gk@h+Tk(Y zS$28koC+F!nHrCpN2?H{c9;DWEzn{ zoi}K@+4&Ob)tYW`lI)w*bepq4dX0P$PLWL+r$Oh<@?}NGokh~?^on*kPm*4*>5b0a z9Cw>Mix81bdmJ7VJ0o{1y3e^l=Mg!hXwG?w)=~M2ihRI%k>gIvUnqLeVJG`0`LJ@H zbtL;9lusyn+;K>!HNDH}Cq1O;31{UaR^pI8W1hi=K1Yd5v^dz5$4A zs)?R=$S=gci%z}v51s{!f4~4gq=;RNA1C|K_Y||^N6B6dcGwYJb_Mz_`#FpimU~$u zTv{JXlQ!0e(!Oo9pMaL7VLA2yAR%8zXxVcW?DSzXWnRNs=>H}ZvWGpk;nV-BqMXPf z(%+(s>>=fbGN4$&WXfLl=t2M?o?7u&diAM-Y~HuBhxP=6V`NK4nC-#G;Szn8%awBQ zEt2N~BBJn$h&SOBksl=bU{^OIXPsWCF8OIM-zt@h>3VG`5cVFMp4peKHfqCOtu}Yh z@JMPbl}TmNjd~&7@C&Vasd+}ETa9`ecXWEbP)K|ArBmC>!_CrJzcO4dRa&Qq=PNDW z%a_vQsfpBBx>PBYTSZ@_RX5Gj`BJm7Tou0dxw=NPSoG&o3q0q|Gc~^f5$nddr7A>Q zc^DCEh8t4SBM(`Lq*YJhJG0@MV&-(D2g?>BGcr0hJ~6p{$4>g8BJhcb`xQEYJVfLM zLLU?XWH#K_n9(eOW+{&2yWM&rN%1K{VEuI41Oc}zthW*Z>+Qz69)g;*cpU4x2(kSb zR4$9l>^vI{B-w2WUTUs;vgH*)c#>VWIyVQI)uZIeaWK}eJAK40R||`vEPK)=ufFKl z1?!(QH$Af-qQHaDOoyon8fR=8o&YKlEYwM(1h!{V_ZzKpQxvPMeA(~B<{%C4l<)eL zqG&8s>&+zZa=jMLyx}*M`#q>G->o(4!ksI7^9`lUx8~fu*FeBv;(@mAWAO}l;Fe>_ zsjXX+s@6p9SfzBb6G?E> zcm($*hO&>!hawMJ=k0UR2fDHeTu-USnI)_O*sKS*V5GWVPBpnTsiN2PL@M8CK=kvi zdDqM5>;5T`qD!DDRpzQ;jyv23ud*v+kEF&;XDmPLS!?Ah-ja{looLXh%Q~#{>Rx4@ zZoz=d8AcGPLUn1$N5Q5l)ux|9LWdhoY^X?OZ@oF?HJkNPzSUel&|DounG zYSE>Axl`fm&0KoxpyyN8wDL-!_Tx$@*q?q5KD>{~)ngiXA3otm8{1ZV=>Na`_`orJ zAgXwmDClNvd%=xN)4d>kewb!#d^-!T<6*4h1Reog2XkQ7aVuog2cqbUqF+d1#9Lqs z$9s2Gur9{q`b@mLA+ygYK5Ro6jP-3A{b*m(X!M)mcixbYjd?Y5p!s?DB`N4;Y^TA) z^LsBeKaOwa_ZVc;harBBczmFmW^8NHTtmq4j+_TO%Z(2Z^96u@%v{;ruhQ=c;-ywdfEPlPdG2DLV4jYHItVWkV9oI z-a))BGZ<_}B!(jg2aP-0X_mO0)A%cmZ)v=!kwwq(64)5xRT}v&LwbKg zFA?)tr+HHI>orenzEktvL=?r8)*m6_h#u3tps}Ixw8nE9|Hys7JXD?G>vH7zpq-~G Kf}-R7NB$o=EdVC~ literal 0 HcmV?d00001 diff --git a/build/encryption/libs/libcal.i586.a b/build/encryption/libs/libcal.i586.a new file mode 100755 index 0000000000000000000000000000000000000000..b02e413dd2ac51d23196f6cfd9d4d491726db729 GIT binary patch literal 5496 zcmbVQYit}>6~1?8Y>&NuB~J5b61r*JHYLgKI$5vXk|yypHZe(*CZ&Rg$v(#R;`Q!k zcPEbu6}6?L#tl-`B7|B|XrYB4g(52PDA1sY06%yL`j3}DLMoy{0`eoGLE-!E+`Bt& zRaN3jGvE2nIrrRq&zyT_cDL-wRCDutI})*#ZD99cI++|A8XSzplFAgm$6|xKjQ`0F zAw&e%Szhi(?#g9~Ilq{xdq;AGf^gkJdN>`Q^XhIT=ho-_(n36YRul_a_{DRTO1#Xm z^?2#jFyv$sgEj8yR0`wm9!Lixp6vMK#LT3W62k>e3QIJZ5Klw{eM-SLv02=#?48>G z_|ji5y*TlTLny?NrYkgMcv-F;E3dzD-*ds~sM zwZiJYJNkj>be|AbzlcWn!YYKVMMsF19%zMVCD5y_Pg>p4C_1%BP^T-1&@$aOjDg!t zKp{FBj!`;BwIhPiu~W+FKI*%+i0QrrM(B>qeVxH<&hPJ@?&BQyx6-Ajr7_D0y7orp zam;;HYK3-nlWsz^z9!w*xrYfqkMuC9Se<-`_unWYL|J2G2twqyJ8-w`wv%`wmUI$? zNZY>&c3Ud~ShDpVrEJ*=Pup%Oli%iSwIha zou-}6BXnM`X|FR$=M9>!an{rMW=+>SAEkAprkk8^vhOBMW6ni7zfaSC=K$#~nr?Gq z>>JZ`hci!lt9%Jgk*!H*n9lw3+lr=~Bh`dd~CCXp? zFM~xdF~F-7@f4$*$$s#nVs>;r*`?qKJEGP8IP|Uda~LZucd|sdv@Vt=ZLANa{gct& z0WC|za_n9}x4ekZvi&c((}&HJc>(*N=NTwuyDFxOqUVxgY91Huo@dcPwg=2%G_mRl zI&{*#6}^RccGY+3)D;9Mu5PEjn~^b~B_p2)@B1)ZTE5D)O4;`U$qNAy*Iafv+ZsY@uFT zp%J0C0#{V4=kwlde4ZP-ey-xxAY!c;t5Ak$D-R=Lop3`M+Hp|Ut?DDrYO8zCHzGr8 zad=6Y9N4uxHJBb6zDq1`>c31+jDW~>^$uWqAv?rHCHoGsr1eBTN%{j++l0FsQY@p} zn-CjsK4s@o)3k2^t06INUC`jVr~FJFgd5Lw%d@kPxpS19PJyx9-08z^v7B1~WtEaH zW~vKbRXj&u(8=kU35Y^8r_-2WqxfiV!_|XpD=rV0X^ojwy_#RFi+tJ77QJR{4pPgU z_FS)&7q$6vwI1WqtJlJr*SxxNKZAPk+)BMF+}UDguBMb(f7Z=rY6uuiJkVA>ES>=m z96BBw+rB-f>O@qImkOtR@1S>1WXt8EsEkx9(|J)Wm*!&X#*tM*0v%}~KjW2zi)wUp z<)Xh>690cOvySy=iEt}r%(aI33%6X%n}zzNT4Ao_{85y6?6p(mbyL8WHatnSXc-+{$w5meDgci%#{*Cnn1#!Bb zL8Y0*x_-&8d3pFEk}5dmwcwrO^F_F_AC#Hi50(2eMIVKHU~KH}*f!MBow|s`8eQ7* z!J|Tc!jT(0ZToTT_I~KOOW4%0JksrqJ{IX}Ir?eqQ9E*fmwn~($WOY}Q9d5H@sJ5x zymoF8^A+)0y&B-Wk*Z!XUgtxI=QH(;h-Ygxh+fv8b2Hg&)jKWXbO|(t(rh`*aZGyP zWp-ukf%t$>(cNydKkDl6m;s?4C^x0Olgj8!E9DC3@_rj^5UY0 zx{a60buW&*?yS}ET!SFqygOUPI3hk*E&COdocG3Fg;Jqjj6n9|>(8|Q)k16op`M2>V=?}1xEPNIJKM_vH16j4Zij~c@8y?- z5967}c>gs7Xl$b)ndX;Z;A_G(KD8 z5O_G=6W9zU&(xcEAA`(3yKu3kknm_Asyl7G_!1=Y6P#@y{7lZsX=D2gE+dnV!Ec;` zZpQWna3j-n9)2+jx)~ckal-3(Dzpy#QfjQ@CCH`^L%fK1;d(K)ufrCO_e>}rYs%#1 z$B<1Qh+-`sLX3iL#`Z(-aJ;V|9^>%2;So0C{Tj0A15u!ue*c1kvT3)#FWii+6#`{5R1AK{LXPHHN8l7*?<=A8ay=%0 z+~c7#7j?v2X9k1Kh~Y6g+!`eBOHlHBz6lrOL8ZnF$9n|>uqI72@eDT@*4yHrH;kTW zHC7vFEj3!x!xGqBp=LEsqd;k?o!NA-R%C|p!#jzbKZKjj5?xIK$r7ySX0sZnT%fa7 zJYo7H`Jra1j5QUO;4j){vrus>XYls<@dR!*{+nXXYVM`gk%+jpX$J2UcZE2g)8V&q z{*Ez?_VA~Dd}b{9&X1CJdEL1OW)6>z%(#aqC-0p&<{ldvotbd?rOg-Mk%MFR4!TE1 z4~|dna;H8tGUnbpH8Q~AxFY<`qUxyw>9_;jMxmyF?bt9p|LhIHdq(1MGe5E?ct;Ug zgA$tpE($jju_u`a+7lYn8t>6KuJNG8qZ&_YoYPp;ct+!=G%jiUqQ>VnzO3;zjlb0R z2aRuPd`n{oHUQ_jLE|=!LmDSF9@m)HSkuVAGT2}JpapVolJjp0;*T`)S3UXfHU3@W ze>AouhqUw058@pf(;6o<9@CiD$bVMoe@5eD8lTkohQ@zrysGg!5f?UzLYs&)sEder z8#UgkafpcRw@33SB3_t>G=D&2QR69%4{7`}^NsQF+7S}Bw Sat, 02 Feb 2013 17:25:09 +0900 + +wrt-commons (0.2.92) unstable; urgency=low + + * Removal of popup implementation + * Clean up unnecessary cmake log + * Improve XML test results collector + * Add method for reset crossEventCallHandler + + -- Jihoon Chung Wed, 16 Jan 2013 10:49:45 +0900 + +wrt-commons (0.2.91) unstable; urgency=low + + * Fix issue Prevent Defect -17677 + * Fixing issues: 17677 + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.91 + + -- leerang Wed, 09 Jan 2013 18:03:04 +0900 + +wrt-commons (0.2.90) unstable; urgency=low + + * Changed PkgName type from DPL::Optional to DPL::String. PART 4 + * User agent database update + + -- Jihoon Chung Tue, 08 Jan 2013 11:12:49 +0900 + +wrt-commons (0.2.89) unstable; urgency=low + + * Handle return value from pthread_setspecific + * Deleted array to 0 comparison + * Deleted unreachable code + * Add vconf key for memory saving mode + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.89 + + -- Jihoon Chung Wed, 02 Jan 2013 11:00:02 +0900 + +wrt-commons (0.2.88) unstable; urgency=low + + * Add path builder for vconf key + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.88 + + -- Jihoon Chung Sat, 29 Dec 2012 14:02:18 +0900 + +wrt-commons (0.2.87) unstable; urgency=low + + * changed to get encryption/decryption key from device unique key + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.87 + + -- Soyoung Kim Fri, 28 Dec 2012 20:47:21 +0900 + +wrt-commons (0.2.86) unstable; urgency=low + + * Revert "Modify get encryption/decryption key from device unique key" + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.86 + + -- Soyoung Kim Fri, 28 Dec 2012 17:42:06 +0900 + +wrt-commons (0.2.85) unstable; urgency=low + + * For livebox configuration + * livebox configuration valuables have been changed + * Modify get encryption/decryption key from device unique key + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.85 + + -- Soyoung Kim Fri, 28 Dec 2012 14:05:27 +0900 + +wrt-commons (0.2.83) unstable; urgency=low + + * Replacing widget handle with tizenid in property DAO + + -- KEONGEUN Fri, 21 Dec 2012 17:03:54 +0900 + +wrt-commons (0.2.82) unstable; urgency=low + + * CustomHandlersDB API updated to handle new functionalities. + * Add tests - DAO, DPL + * Custom Handlers DAO extended with new api + * registerWidgetSecuritySettings - nested transaction removal. New widget dao testcase + * Unit test for custom handler dao stub + * CustomHandlersDAO test + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.82 + + -- Jihoon Chung Thu, 20 Dec 2012 09:04:59 +0900 + +wrt-commons (0.2.81) unstable; urgency=low + + * Fix dependencies in DAO modules + * Missing boilerplate added + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.81 + + -- Jihoon Chung Sun, 16 Dec 2012 09:09:42 +0900 + +wrt-commons (0.2.80) unstable; urgency=low + + * Implement privilege database table + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.80 + + -- Jihoon Chung Fri, 14 Dec 2012 10:30:48 +0900 + +wrt-commons (0.2.79) unstable; urgency=low + + * Replacing DbWidgetHandle with WidgetPkgName in SecurityOriginDAO + * Handle remove() return value + * Delete unreachable code + * Handle chmod return value + * CustomHandlerDAO implementation + * Unhandled isWidgetInstalled return value + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.79 + + -- Jihoon Chung Thu, 13 Dec 2012 11:15:24 +0900 + +wrt-commons (0.2.78) unstable; urgency=low + + * Removing copy&paste code, part 2 + * Changed SharedPtr to std:shared_ptr + * Changed ScopedPtr to std::unique_ptr + * Klocwork analysis related fix + * SharedFromTHis replace by STL C++0x ones + * Overload methods to run with tizen id instead of widgetHandle + * Changed PkgName type from DPL::Optional to DPL::String + * Default "en" language tag removed from provider + * CustomHandlers DAO libraries stubs added + * Replacing widget handle with tizenid in property DAO + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.78 + + -- Jihoon Chung Mon, 10 Dec 2012 10:11:26 +0900 + +wrt-commons (0.2.76) unstable; urgency=low + + * Add share directory + * Add category element for manifest.xml + * Modify installed path for preload widget. + * Updated widget resources path in wrt_reset_all.sh + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.76 + + -- Soyoung Kim Fri, 30 Nov 2012 17:47:24 +0900 + +wrt-commons (0.2.75) unstable; urgency=low + + * Throw an exception when pthread_key_create fails + * Symbolic link pointed by GetVCoreDatabaseFilePath will be removed. + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.75 + + -- Tae-Jeong Lee Fri, 23 Nov 2012 22:01:00 +0900 + +wrt-commons (0.2.74) unstable; urgency=low + + * Removing copy&paste code, part 1 + * Removal of factory_widget attribute and related functions + * Implement security origin dao for allow,deny one time + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.74 + + -- Jihoon Chung Fri, 23 Nov 2012 10:09:27 +0900 + +wrt-commons (0.2.73) unstable; urgency=low + + * Distinguish between system headers and project headers + * Implement security origin dao for setting menu + * Implement security settings in the widgetDAO + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.73 + + -- Jihoon Chung Thu, 22 Nov 2012 20:46:40 +0900 + +wrt-commons (0.2.72) unstable; urgency=low + + * Change widget installed path request by app fw + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.72 + + -- Soyoung Kim Tue, 13 Nov 2012 17:16:16 +0900 + +wrt-commons (0.2.71) unstable; urgency=low + + * Implement Security origin database + * hidden symbol for enhancement shared library loading time (orm.h) + * Default widget locale adding to language tags + * WrtDAO clean up - unused function with widget handle usage + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.71 + + -- Jihoon Chung Mon, 12 Nov 2012 16:55:19 +0900 + +wrt-commons (0.2.70) unstable; urgency=low + + * Additional Include: stddef.h + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.70 + + -- Jihoon Chung Mon, 05 Nov 2012 17:43:04 +0900 + +wrt-commons (0.2.69) unstable; urgency=low + + * [Commons] Modify package type + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.69 + + -- Soyoung Kim Mon, 05 Nov 2012 16:46:34 +0900 + +wrt-commons (0.2.68) unstable; urgency=low + + * Change profiling build + * Removing unused WtrUtilStringToLower + * Fix for localization URI ended with '/' + * Code refactoring and removal of factory_widget attribute + * WidgetDAO from WidgetHandle construction depracated + * WrtDAO - getPkgnameList + * Removal of compilation warnings + * W3c file localization - from pkgname construction + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.68 + + -- Jihoon Chung Fri, 02 Nov 2012 11:20:52 +0900 + +wrt-commons (0.2.67) unstable; urgency=low + + * Localization cleaning from unused API (restore) + * Removing old, unused _WrtUtil* functions + * Database reset affects security-server + * Removing FileUtils + * Replacing recursive opendir with fts + + * Release wrt-commons_0.2.67 + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.67 + + -- Soyoung Kim Wed, 24 Oct 2012 17:02:50 +0900 + +wrt-commons (0.2.66) unstable; urgency=low + + * Release wrt-commons_0.2.66 + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.66 + + -- Soyoung Kim Thu, 18 Oct 2012 11:33:54 +0900 + +wrt-commons (0.2.65) unstable; urgency=low + + * [Engine] Add method to get widget list + * [Commons] New utility functions in wrt_utility + * [Commons] Escaping bash sequences in argument programs + * [Engine] Allow to call methods using dao pointer + * [Engine] Remove mutex from log system. + * [Engine] Support for authors certificates (part 4). + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.65 + + -- Soyoung Kim Wed, 17 Oct 2012 22:08:33 +0900 + +wrt-commons (0.2.64) unstable; urgency=low + + * Revert "Localization cleaning from unused API" + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.64 + + -- Jihoon Chung Fri, 12 Oct 2012 14:21:43 +0900 + +wrt-commons (0.2.63) unstable; urgency=low + + * Support for authors certificate + * WidgetDAO new CTOR (based on TizenID) + * Localization related cleanup + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.63 + + -- Pawel Sikorski Thu, 11 Oct 2012 12:53:19 +0200 + +wrt-commons (0.2.62) unstable; urgency=low + + * [Engine] Add license installing + * [Engine] clean up .gitignore + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.62 + + -- Jihoon Chung Thu, 11 Oct 2012 08:02:04 +0900 + +wrt-commons (0.2.61) unstable; urgency=low + + * [Commons] Support for Debug and Release build configuration + * Deprecated localization API removal + * Localization refactoring and cleaning + * [Commons] Refactoring featureDAO, pluginDAO table + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.61 + + -- Jihoon Chung Fri, 05 Oct 2012 07:29:49 +0900 + +wrt-commons (0.2.60) unstable; urgency=low + + * for SEL verification + * [Commons] POWDER remains removed + * [Commons] Fixed PLM P120926-3287 + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.60 + + -- Soyoung Kim Fri, 28 Sep 2012 15:27:25 +0900 + +wrt-commons (0.2.59) unstalbe; urgency=low + + * Add smack manifest + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.59 + + -- Tae-Jeong Lee Thu, 20 Sep 2012 20:08:44 +0900 + +wrt-commons (0.2.58) unstalbe; urgency=low + + * for SEL verification + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.58 + + -- Tae-Jeong Lee Thu, 20 Sep 2012 12:02:41 +0900 + +wrt-commons (0.2.57) unstalbe; urgency=low + + * Proper list support in LanguageTagsProvider + * User Agent Database update + * Language tags providing class added + * Add a feature dao function giving requested features' data + + * Git : framework/web/wrt-commons + * Tag : wrt-commons_0.2.57 + + -- Tae-Jeong Lee Wed, 19 Sep 2012 12:03:09 +0900 + +wrt-commons (0.2.56) unstalbe; urgency=low + + * [Commons] Test mode environment variable changed + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.56 + + -- Jihoon Chung Wed, 12 Sep 2012 15:46:28 +0900 + +wrt-commons (0.2.55) unstable; urgency=low + + * [Commons] Table ExternalFiles renamed to ExternalLocations + * [Commons] Fix in base path removal in localization module. + * [Commons] Add multiple output types in test framework + * [Commons] Slash added to global config paths + * [Commons] Background page support in WidgetModel + * [Commons] New table - WidgetExternalFiles + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.55 + + -- Yunchan Cho Thu, 06 Sep 2012 00:34:12 +0900 + +wrt-commons (0.2.54) unstable; urgency=low + + * [common] Add XML test collector + * [common] Add encryption api + * [Engine] Fix for wrt-popup + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.54 + + -- Jihoon Chung Wed, 29 Aug 2012 13:37:28 +0900 + +wrt-commons (0.2.53) unstable; urgency=low + + * Added new build type for code coverage + * User Agent Database update + * Added new SQLConnection flag - CRW and null query check + * Remove "auto" for fixed build break + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.53 + + -- Jihoon Chung Thu, 09 Aug 2012 15:16:30 +0900 + +wrt-commons (0.2.52) unstable; urgency=low + + * Re-upload package + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.52 + + -- Jihoon Chung Tue, 31 Jul 2012 11:15:58 +0900 + +wrt-commons (0.2.51) unstable; urgency=low + + * Re-upload package + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.51 + + -- Jihoon Chung Mon, 30 Jul 2012 10:06:49 +0900 + +wrt-commons (0.2.50) unstable; urgency=low + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.50 + + -- Leerang Song Fri, 27 Jul 2012 12:02:06 +0900 + +wrt-commons (0.2.49) unstable; urgency=low + + * Add splash screen + * Fix circular dependency to cert-svc + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.49 + + -- Zbigniew Kostrzewa Wed, 25 Jul 2012 14:36:40 +0200 + +wrt-commons (0.2.48) unstable; urgency=low + + * Fixed CCR(#N_SE-3620) + * FeatureDAOReadOnly - performance improvement + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.48 + + -- Jihoon Chung Wed, 25 Jul 2012 09:58:22 +0900 + +wrt-commons (0.2.47) unstable; urgency=low + + * Change installed resource path & Add PackageType + * support tizen extension requirement regarding application id / required version + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.47 + + -- Leerang Song Thu, 19 Jul 2012 19:19:39 +0900 + +wrt-commons (0.2.46-1) unstable; urgency=low + + * Add tag for auto SR + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.46-1 + + -- Jihoon Chung Thu, 12 Jul 2012 15:25:36 +0900 + +wrt-commons (0.2.46) unstable; urgency=low + + * Remove auto save for WK1 + * Support auto save id/password for WK2 + * Multiple INVALID_WIDGET_HANDLE definition + * Wrt DB DefferedWidgetPackageInstallation clean up + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.46 + + -- Jihoon Chung Thu, 12 Jul 2012 10:56:48 +0900 + +wrt-commons (0.2.45) unstable; urgency=low + + * Fingerprint list should not contain empty strings + * Add frame load and unload callback + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.45 + + -- Jihoon Chung Thu, 28 Jun 2012 16:30:53 +0900 + +wrt-commons (0.2.44) unstable; urgency=low + + * Move create directory("/opt/apps/widget/") + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.44 + + -- Jihoon Chung Thu, 21 Jun 2012 11:13:38 +0900 + +wrt-commons (0.2.43) unstable; urgency=low + + * Remove WK1 + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.43 + + -- Jihoon Chung Tue, 19 Jun 2012 09:46:13 +0900 + +wrt-commons (0.2.42) unstable; urgency=low + + * Fix build break in wrt-security + * Remove warning when reset .wrt.db + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.42 + + -- Jihoon Chung Fri, 15 Jun 2012 10:31:34 +0900 + +wrt-commons (0.2.41) unstable; urgency=low + + * Clean up unused api in FeatureDAO + * Nested loop removal + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.41 + + -- Jihoon Chung Thu, 31 May 2012 11:40:41 +0900 + +wrt-commons (0.2.40) unstable; urgency=low + + * Unused code removal + * wrt_reset_all.sh changed to remove all widgets files + * Modify desktop default icon path for installer + * Add wrt-client prefix for wk2 + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.40 + + -- Jihoon Chung Thu, 24 May 2012 18:04:34 +0900 + +wrt-commons (0.2.39) unstable; urgency=low + + * Separated singleton implementation removal + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.39 + + -- Pawel Sikorski Mon, 21 May 2012 15:26:54 +0200 + +wrt-commons (0.2.38) unstable; urgency=low + + * Refactoring common_dao for auto_save + * ZipInput simplified + * Nested loop removall + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.38 + + -- Jihoon Chung Mon, 21 May 2012 17:13:15 +0900 + +wrt-commons (0.2.37) unstable; urgency=low + + * Tests leftovers removal + * Remove unused DPL::MultiTaskDecl + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.37 + + -- Jihoon Chung Thu, 17 May 2012 19:49:51 +0900 + +wrt-commons (0.2.36) unstable; urgency=low + + * Script to reset wrt (wrt_reset_all.sh) + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.36 + + -- Jihoon Chung Mon, 14 May 2012 18:28:43 +0900 + +wrt-commons (0.2.35) unstable; urgency=low + + * Prepare widgetDAO to get different widget IDs + * depends on "add recovery mechanism.." commit + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.35 + + -- Jihoon Chung Mon, 07 May 2012 17:35:10 +0900 + +wrt-commons (0.2.34) unstable; urgency=low + + * Patch for compliance test widget-api/NoInterfaceObject + * TLV pthread reference issue + * Changing WidgetDAO rw to ro permissions where appropriate + * JIL and WAC1.0 leftovers removal + * Widget StartFile localizedPath fix + * Switching to the TestModeFlag - final step + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.34 + + -- Jihoon Chung Thu, 03 May 2012 10:11:41 +0900 + +wrt-commons (0.2.33) unstable; urgency=low + + * UserAgent locales removed + * Deprecated api removed + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.33 + + -- Jihoon Chung Mon, 23 Apr 2012 14:10:21 +0900 + +wrt-commons (0.2.32) unstable; urgency=low + + * Language changed callback move to WRT engine + * Modify the access rights for Semaphore method + * Ultimate solution to test mode flag + * Web App data sharing From orange requirement + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.32 + + -- Jihoon Chung Mon, 16 Apr 2012 09:48:09 +0900 + +wrt-commons (0.2.31) unstable; urgency=low + + * Mapping from features to device caps is obtained from .so + * Exposed pc file for wrt-plugin-export header + * Common environment test flag + * getUserAgentLocales added to WidgetDAOReadOnly + * TAP tests results collector + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.31 + + -- Jihoon Chung Mon, 09 Apr 2012 10:25:57 +0900 + +wrt-commons (0.2.30) unstable; urgency=low + + * clean-up powder, parental mode + * Revert "[wrt-commons] Added global config API and desktop_file_name_field in wrt_db" + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.30 + + -- Jihoon Chung Wed, 28 Mar 2012 18:25:06 +0900 + +wrt-commons (0.2.29) unstable; urgency=low + + * Change user name to user id + * Adding cookie sharing mode field + * Added global config API and desktop_file_name_field in wrt_db + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.29 + + -- Jihoon Chung Tue, 27 Mar 2012 17:05:15 +0900 + +wrt-commons (0.2.28) unstable; urgency=low + + * Optimize OBS + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.28 + + -- Jihoon Chung Fri, 23 Mar 2012 10:10:42 +0900 + +wrt-commons (0.2.27) unstable; urgency=low + + * add libxml2-dev to 'Depends' of wrt-commons-dev package + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.27 + + -- Yunchan Cho Mon, 19 Mar 2012 19:01:09 +0900 + +wrt-commons (0.2.26) unstable; urgency=low + + * Create ".wrt_autosave.db" + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.26 + + -- Jihoon Chung Mon, 19 Mar 2012 13:31:14 +0900 + +wrt-commons (0.2.25-1) unstable; urgency=low + + * Apply changed EFL APIs + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.25-1 + + -- Yunchan Cho Wed, 14 Mar 2012 10:04:41 +0900 + +wrt-commons (0.2.25) unstable; urgency=low + + * Support OBS, SMACK + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.25 + + -- Yunchan Cho Tue, 13 Mar 2012 19:51:25 +0900 + +wrt-commons (0.2.24) unstable; urgency=low + + * Clean-up heynoti depedency + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.24 + + -- Jihoon Chung Tue, 06 Mar 2012 21:12:40 +0900 + +wrt-commons (0.2.23) unstable; urgency=low + + * Move certificates and finterprint settings from wrt-commons repository into wrt-security + * Add exception for "create directory" + * Clean-up unused event source + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.23 + + -- Jihoon Chung Tue, 06 Mar 2012 20:29:32 +0900 + +wrt-commons (0.2.22) unstable; urgency=low + + * Modified libraries' names + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.22 + + -- Grzegorz Krawczyk Tue, 28 Feb 2012 17:01:07 +0100 + +wrt-commons (0.2.21) unstable; urgency=low + + * Vcore and ACE removed + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.21 + + -- Grzegorz Krawczyk Fri, 24 Feb 2012 16:51:27 +0100 + +wrt-commons (0.2.20) unstable; urgency=low + + * User Agent lists update + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.20 + + -- Hoseon LEE Fri, 24 Feb 2012 09:28:47 +0100 + +wrt-commons (0.2.19) unstable; urgency=low + + * WAC Compliance test WL-3240 fix. + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.19 + + -- Zbigniew Kostrzewa Wed, 22 Feb 2012 09:28:47 +0100 + wrt-commons (0.2.18) unstable; urgency=low - * Boilerplate update + * Fixed static dev cap setting. + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.18 + + -- Zbigniew Kostrzewa Wed, 22 Feb 2012 07:59:18 +0100 + +wrt-commons (0.2.17) unstable; urgency=low + + * WAC policy test suite bugfix. + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.17 + + -- Zbigniew Kostrzewa Mon, 20 Feb 2012 14:05:41 +0100 + +wrt-commons (0.2.16) unstable; urgency=low + + * Localization API minor change + * test package reenabled + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.16 + + -- Pawel Sikorski Mon, 13 Feb 2012 16:04:58 +0100 + +wrt-commons (0.2.15) unstable; urgency=low + + * Tapi dependency added + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.15 + + -- Pawel Sikorski Mon, 13 Feb 2012 12:53:12 +0100 + +wrt-commons (0.2.14) unstable; urgency=low + + * MEID check added + * Added safe singleton implementation, that prevents dubletons. + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.14 + + -- Pawel Sikorski Mon, 13 Feb 2012 12:29:16 +0100 + +wrt-commons (0.2.13) unstable; urgency=low + + * Removing SLP, Bada ... strings for Source Open + * Update User-agent + * Popup manage initialization flag fixed + * Add weather widget is installed by package name + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.13 + + -- Pawel Sikorski Mon, 13 Feb 2012 10:46:30 +0100 + +wrt-commons (0.2.12) unstable; urgency=low + + * disabling test package to be build + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.12 + + -- Pawel Sikorski Wed, 08 Feb 2012 17:45:57 +0100 + +wrt-commons (0.2.11) unstable; urgency=low + + * Ace and Vcore tests moved to wrt-commons + * "efl" suffic removed + * certificate names changes + * bugfix: + ** undetermined attributes + ** Attributes sorting algorithm + ** Vcore init + * New tests added (to OCSP) + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.11 + + -- Pawel Sikorski Wed, 08 Feb 2012 17:10:30 +0100 + +wrt-commons (0.2.10) unstable; urgency=low + + * Files access with FILE API bug fix + * Add global dao APIs for operation of white document list + * fixed WidgetDAO for ugid + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.10 + + -- Jihoon Chung Thu, 02 Feb 2012 15:43:01 +0900 + +wrt-commons (0.2.9) unstable; urgency=low + + * Refactoring Phase2 + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.9 + + -- Jihoon Chung Tue, 31 Jan 2012 12:56:00 +0900 + +wrt-commons (0.2.8) unstable; urgency=low + + * documentation included to repository + * dbus fix (crash issue with bool type) + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.8 + + -- Pawel Sikorski Wed, 25 Jan 2012 14:47:21 +0100 + +wrt-commons (0.2.7) unstable; urgency=low + + * Debianize latest source + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.7 + + -- Yunchan Cho Wed, 25 Jan 2012 10:30:05 +0900 + +wrt-commons (0.2.6) unstable; urgency=low + + * Wrt-commons split into several libraries + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.6 + + -- Grzegorz Krawczyk Fri, 20 Jan 2012 16:20:27 +0100 + +wrt-commons (0.2.5) unstable; urgency=low + + * DBUS module moved from wrt + * Dir structure has been changed (modules extracted) + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.5 + + -- Pawel Sikorski Tue, 17 Jan 2012 18:20:27 +0100 + +wrt-commons (0.2.4) unstable; urgency=low + + * Webkit2(Refactoring) branch merged + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.4 + + -- Jihoon Chung Mon, 16 Jan 2012 15:57:06 +0900 + +wrt-commons (0.2.3) unstable; urgency=low + + * Webkit2(Refactoring) branch merged + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.3 + + -- Jihoon Chung Mon, 16 Jan 2012 15:30:07 +0900 + +wrt-commons (0.2.2) unstable; urgency=low + + * Master and Webkit2 branch merged (ORM change merged) + * Mechanisms moved from wrt: NestedLoop, ScopedGPointer + + * Git : slp/pkgs/w/wrt-commons + * Tag : wrt-commons_0.2.2 + + -- Pawel Sikorski Thu, 12 Jan 2012 11:19:00 +0100 + +wrt-commons (0.2.1) unstable; urgency=low + + * ORM interface changed + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : wrt-commons_0.2.1 + + -- Pawel Sikorski Mon, 12 Dec 2011 11:33:07 +0100 + +wrt-commons (0.2.0) unstable; urgency=low + + * Debianize for changing package name (wrt-commons) + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : wrt-commons_0.2.0 + + -- Hoseon LEE Thu, 08 Dec 2011 10:51:40 +0900 + +wrt-commons (0.1.65) unstable; urgency=low + + * Debianize latest source + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.65 + + -- Hoseon LEE Wed, 07 Dec 2011 12:11:02 +0900 + +wrt-commons (0.1.64) unstable; urgency=low + + * Fixes, FakeRPC connection added + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.64 + + -- Pawel Sikorski Tue, 29 Nov 2011 12:20:39 +0100 + +dpl (0.1.63) unstable; urgency=low + + * ThreadDatabase Support moved to dpl + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.63 + + -- Pawel Sikorski Tue, 22 Nov 2011 16:48:43 +0100 + +dpl (0.1.62) unstable; urgency=low + + * ICDelegate, apply, caller functions extended + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.62 + + -- Pawel Sikorski Thu, 17 Nov 2011 17:19:13 +0100 + +dpl (0.1.61) unstable; urgency=low + + * Adding ORM, Apply, ICD mechanism to DPL + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.61 + + -- Pawel Sikorski Wed, 09 Nov 2011 13:33:16 +0100 + +dpl (0.1.60) unstable; urgency=low + + * debianization due to icu upversioning + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.60 + + -- Pawel Sikorski Tue, 25 Oct 2011 10:40:26 +0200 + +dpl (0.1.59) unstable; urgency=low + + * modification of build option to build only EFL DPL package + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.59 + + -- Yunchan Cho Wed, 07 Sep 2011 13:42:54 +0900 + +dpl (0.1.58) unstable; urgency=low + + * Debianized for open source + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.58 + + -- Soyoung Kim Tue, 06 Sep 2011 13:52:05 +0900 + +dpl (0.1.57) unstable; urgency=low + + * Waitables reloaded after HandleWatcher is called + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.57 + + -- Zbigniew Kostrzewa Thu, 28 Jul 2011 11:35:42 +0200 + +dpl (0.1.56) unstable; urgency=low + + * add policyClass as template param, genericsocket fixed + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.56 + + -- Pawel Sikorski Mon, 27 Jun 2011 11:55:42 +0200 + +dpl (0.1.55) unstable; urgency=low + + * once, automatic listeners cleaning, property fix + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.55 + + -- Pawel Sikorski Tue, 14 Jun 2011 10:50:56 +0200 + +dpl (0.1.54) unstable; urgency=low + + * fix build dep + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.54 + + -- Pawel Sikorski Thu, 09 Jun 2011 14:12:31 +0200 + +dpl (0.1.53) unstable; urgency=low + + * scoped patterns extended, StringCompare with ICU + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.53 + + -- Pawel Sikorski Thu, 09 Jun 2011 12:50:44 +0200 + +dpl (0.1.52) unstable; urgency=low + + * scoped patterns extanded + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.52 + + -- Pawel Sikorski Mon, 06 Jun 2011 15:59:44 +0200 + +dpl (0.1.51) unstable; urgency=low + + * string errno, get/set virtual for property + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.51 + + -- Pawel Sikorski Mon, 06 Jun 2011 14:43:48 +0200 + +dpl (0.1.50) unstable; urgency=low + + * fix namespace, fix network change message publishing, + * size functionality added int TypeLists + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.50 + + -- Pawel Sikorski Thu, 19 May 2011 15:06:39 +0200 + +dpl (0.1.49) unstable; urgency=low + + * license cleanup, small bug fixes + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.49 + + -- Pawel Sikorski Thu, 12 May 2011 12:57:54 +0200 + +dpl (0.1.48) unstable; urgency=low + + * MessageQueue, static remove for semaphores + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.48 + + -- Pawel Sikorski Fri, 22 Apr 2011 11:32:15 +0200 + +dpl (0.1.47) unstable; urgency=low + + * model/property system, TLS fixed + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.47 + + -- Pawel Sikorski Thu, 14 Apr 2011 14:35:38 +0200 + +dpl (0.1.46) unstable; urgency=low + + * delegate mechanism, sql connection, test runner fix + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.46 + + -- Pawel Sikorski Thu, 31 Mar 2011 10:18:22 +0200 + +dpl (0.1.45) unstable; urgency=low + + * ThreadLocal variables, named semaphore, Waitable fix, + * symbols visibility fix + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.45 + + -- Pawel Sikorski Mon, 21 Mar 2011 16:57:31 +0100 + +dpl (0.1.44) unstable; urgency=low + + * Disable Werror flag, bb fixed + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.44 + + -- Koeun Choi Thu, 10 Mar 2011 21:06:51 +0900 + +dpl (0.1.43) unstable; urgency=low + + * ecore_main_loop_select_func_get return type changed + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.43 + + -- Koeun Choi Tue, 08 Mar 2011 11:05:54 +0900 + +dpl (0.1.42) unstable; urgency=low + + * MultiTask added. union_cast, lexical_cast + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.42 + + -- Pawel Sikorski Fri, 04 Mar 2011 14:05:23 +0100 + +dpl (0.1.41) unstable; urgency=low + + * klocwork fixes, release method added to scoped array + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.41 + + -- Pawel Sikorski Tue, 01 Mar 2011 09:38:53 +0100 + +dpl (0.1.40) unstable; urgency=low + + * Zip-input fixed. + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.40 + + -- Pawel Sikorski Mon, 28 Feb 2011 10:42:44 +0100 + +dpl (0.1.39-1) unstable; urgency=low + + * redebianized + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.39-1 + + -- Pawel Sikorski Fri, 25 Feb 2011 09:33:12 +0100 + +dpl (0.1.39) unstable; urgency=low + + * Semaphore added, Mutex fixed, Zip enhanced + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.39 + + -- Pawel Sikorski Tue, 22 Feb 2011 09:54:11 +0100 + +dpl (0.1.38) unstable; urgency=low + + * GetCurrentTask, EventDispatcher fix, Append for DPL::String + * Zip file support + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.38 + + -- Pawel Sikorski Tue, 15 Feb 2011 17:52:24 +0100 + +dpl (0.1.37-1) unstable; urgency=low + + * redebianize + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.37-1 - * Git : tizen2/pkgs/w/wrt-commons - * Tag : wrt-commons_0.2.18 + -- Pawel Sikorski Fri, 04 Feb 2011 11:11:13 +0100 - -- Tae-Jeong Lee Thu, 23 Feb 2012 16:12:49 +0900 +dpl (0.1.37) unstable; urgency=low -wrt-commons (0.2.17) unstable; urgency=low + * EventSupport fixes. - * debianize + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.37 - * Git : tizen2/pkgs/w/wrt-commons - * Tag : wrt-commons_0.2.17 + -- Pawel Sikorski Thu, 03 Feb 2011 17:44:49 +0100 - -- Yunchan Cho Wed, 22 Feb 2012 16:57:31 +0900 +dpl (0.1.36) unstable; urgency=low -wrt-commons (0.2.16) unstable; urgency=low + * header fix. - * Init changelog + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.36 - * Git : tizen2/pkgs/w/wrt-commons - * Tag : wrt-commons_0.2.16 + -- Pawel Sikorski Tue, 01 Feb 2011 12:19:53 +0100 + +dpl (0.1.35-1) unstable; urgency=low + + * debianization fix. + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.35-1 + + -- Pawel Sikorski Tue, 01 Feb 2011 09:58:40 +0100 + +dpl (0.1.35) unstable; urgency=low + + * DPL::CharTraits fixed + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.35 + + -- Pawel Sikorski Tue, 01 Feb 2011 09:46:04 +0100 + +dpl (0.1.34) unstable; urgency=low + + * bundled value usage added. + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.34 + + -- Pawel Sikorski Fri, 28 Jan 2011 14:13:03 +0100 + +dpl (0.1.33) unstable; urgency=low + + * Synchronized events support. + * FOREACH macro. + * BinaryQueue reimplementation + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.33 + + -- Pawel Sikorski Fri, 21 Jan 2011 10:43:38 +0100 + +dpl (0.1.32-3) unstable; urgency=low + + * dpl path fix + + * Git : 165.213.180.234:slp/pkgs/d/dpl + * Tag : dpl_0.1.32-3 + + -- Pawel Sikorski Tue, 11 Jan 2011 18:19:25 +0100 + +dpl (0.1.32-2) unstable; urgency=low + + * build break fixed + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.32-2 + + -- Pawel Sikorski Tue, 11 Jan 2011 17:29:55 +0100 + +dpl (0.1.32-1) unstable; urgency=low + + * redebianizing + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.32-1 + + -- Pawel Sikorski Tue, 11 Jan 2011 12:46:19 +0100 + +dpl (0.1.32) unstable; urgency=low + + * moving vconf header to dirty headers + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.32 + + -- Pawel Sikorski Mon, 10 Jan 2011 10:13:07 +0100 + +dpl (0.1.31) unstable; urgency=low + + * debianized - 0.1.31 + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.31 + + -- Koeun Choi Wed, 08 Dec 2010 20:22:25 +0900 + +dpl (0.1.30-2) unstable; urgency=low + + * debianized - 0.1.30-2 + * Ignored category for test runner + * TypeListGenerator to TypeListDecl + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.30-2 + + -- Koeun Choi Mon, 15 Nov 2010 16:00:52 +0900 + +dpl (0.1.30) unstable; urgency=low + + * Ignored category for test runner + + -- Przemyslaw Dobrowolski Fri, 12 Nov 2010 14:55:15 +0100 + +dpl (0.1.29) unstable; urgency=low + + * Renamed TypeListGenerator to TypeListDecl + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.29 + + -- Przemyslaw Dobrowolski Fri, 12 Nov 2010 14:14:54 +0100 + +dpl (0.1.28) unstable; urgency=low + + * New controller mechanism + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.28 + + -- Pawel Sikorski Fri, 12 Nov 2010 12:22:01 +0100 + +dpl (0.1.27) unstable; urgency=low + + * Added threads' guarded singletons + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.27 + + -- Pawel Sikorski Tue, 09 Nov 2010 10:13:16 +0100 + +dpl (0.1.26) unstable; urgency=low + + * Bug fixes + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.26 + + -- Koeun Choi Mon, 08 Nov 2010 14:43:15 +0100 + + dpl (0.1.25-1) unstable; urgency=low + + * Redebianized. + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.25-1 + + -- Koeun Choi Thu, 28 Oct 2010 12:12:45 +0900 + +dpl (0.1.25) unstable; urgency=low + + * Fixed exception handing while parsing RPC protocol + * commit : a19efed5a210fb1f8f91de18009b0d86e03326db + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.25 + + -- Koeun Choi Mon, 25 Oct 2010 15:21:48 +0900 + + +dpl (0.1.24) unstable; urgency=low + + * Added 21 Controler support + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.24 + + -- Piotr Fatyga Wed, 20 Oct 2010 16:15:42 +0200 + +dpl (0.1.23) unstable; urgency=low + + * Reverted: main event dispatcher fix + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.23 + + -- Piotr Fatyga Wed, 13 Oct 2010 11:09:48 +0200 + +dpl (0.1.22-1) unstable; urgency=low + + * Main event dispatcher fix + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.22-1 + + -- Piotr Fatyga Fri, 08 Oct 2010 16:17:51 +0200 + +dpl (0.1.22) unstable; urgency=low + + * Main event dispatcher fix + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.22 + + -- Piotr Fatyga Fri, 08 Oct 2010 14:45:45 +0200 + +dpl (0.1.21) unstable; urgency=low + + * Fixed RPC bug which caused white screen + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.21 + + -- Piotr Fatyga Thu, 07 Oct 2010 12:17:18 +0200 + +dpl (0.1.20-1) unstable; urgency=low + + * Reupload to fix debianization error (again) + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.20-1 + + -- Piotr Fatyga Wed, 06 Oct 2010 15:07:32 +0200 + +dpl (0.1.19) unstable; urgency=low + + * Fixed bug in generic RPC protocol parser & package name is changed(svn is removed) + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.19 + + -- Koeun Choi Thu, 30 Sep 2010 19:17:20 +0900 + +dpl (0.1.18) unstable; urgency=low + + * support string conversion (i18n) and char traits + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.18 + + -- Ming Jin Fri, 17 Sep 2010 14:32:23 +0900 + +dpl (0.1.17) unstable; urgency=low + + * Upgrade to EFL1.0 alpha + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.17 + + -- Piotr Fatyga Fri, 10 Sep 2010 17:41:55 +0200 + +dpl (0.1.16) unstable; urgency=low + + * changed assert routine. Building changed to Release. + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.16 + + -- Pawel Sikorski Wed, 01 Sep 2010 11:39:41 +0200 + +dpl (0.1.15) unstable; urgency=low + + * Hibernation fixed + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.15 + + -- Koeun Choi Tue, 31 Aug 2010 19:00:52 +0200 + +dpl (0.1.14) unstable; urgency=low + + * Improvements in shared ptr, logging mechanism and unit testing + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.14 + + -- Pawel Sikorski Tue, 24 Aug 2010 09:59:48 +0200 + +dpl (0.1.12) unstable; urgency=low + + * Fixed problem with bool operator in smart pointers + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.12 + + -- Przemyslaw Dobrowolski Wed, 18 Aug 2010 11:01:52 +0200 + +dpl (0.1.11) unstable; urgency=low + + * appcore updated + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.11 + + -- Koeun Choi Fri, 06 Aug 2010 10:28:44 +0900 + +dpl (0.1.10) unstable; urgency=low + + * Added support for handling late EFL events + + * Git : 165.213.180.234:/git/slp/pkgs/dpl + * Tag : dpl_0.1.10 + + -- Koeun Choi Tue, 03 Aug 2010 19:34:53 +0900 + +dpl (0.1.9) unstable; urgency=low + + * Fixed bug in shared pointer copy operator + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.9 + + -- Andrew Lee Mon, 12 Jul 2010 13:54:01 +0900 + +dpl (0.1.8) unstable; urgency=low + + * Fixed prevent defects + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.8 + + -- Andrew Lee Tue, 22 Jun 2010 12:14:32 +0900 + +dpl (0.1.7) unstable; urgency=low + + * DLOG API change update + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.7 + + -- Ming Jin Wed, 16 Jun 2010 17:00:00 +0900 + +dpl (0.1.6-1) unstable; urgency=low + + * Strange tag verification error. + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.6-1 + + -- Andrew Lee Fri, 11 Jun 2010 11:37:41 +0900 + +dpl (0.1.6) unstable; urgency=low + + * Repackaging due to efl update. + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.6 + + -- Andrew Lee Fri, 11 Jun 2010 09:38:01 +0900 + +dpl (0.1.5) unstable; urgency=low + + * Changed usage of deprecated appfwk to appcore-efl + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.5 + + -- Andrew Lee Tue, 08 Jun 2010 19:11:38 +0900 + +dpl (0.1.4) unstable; urgency=low + + * appfwk api removed + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.4 + + -- Andrew Lee Fri, 04 Jun 2010 11:22:28 +0900 + +dpl (0.1.3) unstable; urgency=low + + * single instance locking mechanism supported + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.3 + + -- Koeun Choi Wed, 19 May 2010 20:19:00 +0900 + +dpl (0.1.2) unstable; urgency=low + + * HIBERNATION_LEAVE_BEFORE_WS added + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.2 + + -- Koeun Choi Tue, 18 May 2010 08:27:14 +0900 + +dpl (0.1.1) unstable; urgency=low + + * permission changed by new SLP security guideline + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.1 + + -- Koeun Choi Fri, 14 May 2010 14:07:16 +0900 + +dpl (0.1.0) unstable; urgency=medium + + * below details are written by Przemek. :) + + * Added main window visibility optional flag to application class. + + * Removed debug logs from application (switched to pedantic ones) + Fixed close sequence in RPC example + + * Fixed critical leak in rpc connection related to acquisition of abstract waitable input/output. + + * Added RPC Client/Server example + + * Removed useParam from ConnectionEstablished event in RPC Server/Client + Added ConnectionID to ConnectionEstablishedEvent in RPC Server/Client + Added convience Open methods to (Tcp/Unix)SocketRPC(Server/Client) + + * Removed purpose-specific static call code. + + * Added implementation of GenericSocketRPCServer, TcpSocketRPCServer, UnixSocketRPCServer. + + * Implementation in progress: Client/Server architecture for RPC - client and connection part. + + * Temporary fix to build break caused by problems with in DLOG include files + + * Fixed unregister global noti signal routine + + * Added dedicated RPCFunction include file + All current RPC mechanisms marked as deprecated + Added RPC Client/Server/Connection stub files + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.1.0 + + -- Koeun Choi Fri, 07 May 2010 11:10:09 +0200 + +dpl (0.0.9) unstable; urgency=low + + * HibernationEnter and HibernationLeave system events added to EventDeliverySystem + + * Added support for old style pedantic logs + + * Added initial support (i386,gcc) for dynamically created static methods (static interception) + + * Added protocol argument size checks in RPC + + * Fixed non-reentrant version of serialized string parser in EventDeliverySystem + + * Fixed multiple event handling routines to return all signaled handles list (starvation related fix) + + * Workaround definition file added. Moved GLIB-loop-intergration workaround to workaround definition file. + + * Fixed typo in exception messages + + * Workaround for SLP select + + * Added postinstallation scripts for EFL and GTL version of DPL + + * Fixed bug related to improper reinitialization of socket descriptor after Close/Open sequence + + * Added GenericSocketRPC + Added TcpSocketRPC + Implementation of UnixSocketRPC rebased to GenericSocketRPC + Fixed template-based problems with declaring nested generic exceptions + + * Added support for old style plain logs (export DPL_USE_OLD_STYLE_LOGS=1) + + * Fixed bug in WaitableInputOutputExecutionContextSupport related to continous event insisting + Fixed bug in WaitableHandle related to improper handling of Read/Write events + Added support for retrieving other errors in WatableHandle + Added runtime-check for invalid WaitableHandles + + * Fixed DPL debug package name + + * More DPL doxygen documentation added. + + * Added more tests for BinaryQueue (21) + Added doxygen documentation for BinaryQueue + + * BinaryQueue basic unit tests added (13) + + * Added generic framework for unit-testing for DPL + + * Added support for handling manipulations with waitable handle watcher/listeners lists during event handling + Added TcpSocket + Added tcpsock example + Added support for defining maximum number of bytes to read in AbstractInput + Added support for DNS resolve for tcp Address + + * Added support for retrieving doubles from database in SqlConnection. + Added exceptions on retrieving column out of bounds. + + * Added support for retrieveing last insert row ID in SqlConnnection (reported by b.grzelewski) + + * Fixed bug in GenericRPC related to inproper interpretation of incoming data stream (reported by p.sikorski) + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.0.8 + + + -- Koeun Choi Thu, 29 Apr 2010 17:41:02 +0200 + +dpl (0.0.8) unstable; urgency=medium + + * debianized : commit 210d5f7ecd396ff9aeeafcb0d34272a4c4e6c77d + + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.0.8 + + -- Koeun Choi Fri, 23 Apr 2010 00:51:27 +0900 + +dpl (0.0.7) unstable; urgency=low + + * debianized + * Git : 165.213.180.234:/git/slp2.0/slp2.0-pkgs/dpl-0 + * Tag : dpl_0.0.7 + + + -- Koeun Choi Tue, 20 Apr 2010 14:16:18 +0900 + +dpl (0.0.6) unstable; urgency=medium + + * LogSystem switched to DLOG + + * Initial support for Application in gtk version added + + * Fixed link problems in example projects build scripts + + * Added missing sender in events from GenericSocket + + * Added missing dependencies to db-util in pkgconfig files + + * Fixed memory leak in MainEventDispatcher for EFL, related to timed events (reported by valgrind) + + * Fixed memory leak in Thread event list (reported by valgrind) + + * Minimum version of libslp-setting-0 defined (reported by p.misiak) + + * Fixed bug in UnixSocketRPC in scenario when cannot connect (reported by p.sikorski) + + -- Koeun Choi Fri, 16 Apr 2010 11:08:46 +0200 + +dpl (0.0.5) unstable; urgency=high + + * Minimum required version od db-util changed to 0.1.0-23 due to link problems + + -- Koeun Choi Thu, 15 Apr 2010 08:28:08 +0200 + +dpl (0.0.4) unstable; urgency=medium + + * SQLConnection: Added support for Lucene indexer + + * Replaced deprecated API from vconf and util in EventDeliveryDetail for EFL + + * Added doxygen configuration file + Added deprecated DPL declarator file + Added support for handling broken connections in GenericSocket and RPC + + * DLOG: dlog_init/dlog_deinit is not needed and deprecated. Removed. + + * Fixed bug related to multiple close/connect on socket (reported by p.sikorski) + + * Reference manual stub added + + * Added WaitableInputOutputExecutionContextSupport + Various bugfixes related to WaitableHandleSupport + Added RPC ClosedEvent support + + -- Koeun Choi Wed, 14 Apr 2010 14:27:54 +0200 + +dpl (0.0.3) unstable; urgency=low + + * Experimental RPC over unix-sockets added. + + * Fixed bug in Main. Various bugfixes in UnixSocket and GenericSocket. GenericRPC implementation in progress + + * Removed NamedPipeRPCCall + Added UnixSocketRPC + Renaming RPCCall -> RPC + + * GenericSocket implementation finished + + * Generic socket implementation in progress. + Added DPL debug package + + * Added Main + + * Fixed DPL-GTK library dependency problem + + * Added WaitableHandleWatchSupport + + * Fixed BUG in EFL-MainEventDispatcher, regarding too late deinitialization + + * Fixed bug in controller touch check assertions. + Generic socket implementation in progress. + + * Added support for mode in waitable handle wait procedures. + Added support for multi-mode watchers in thread. + Added UnixSocket implementation. + Added GenericSocket implementation. + Added AbstractSocket. + Added Address concept. + Added example socket test program. + + * Controller extended to handle maximum of 20 events + + * Added WaitableHandle + + * Added AbstractWaitableInput, AbstractWaitableOutput, AbstractWaitableInputOutput, + NamedBasePipe, NamedInputPipe, NamedOutputPipe, partial implementation of GenericRPCCall, + full implementation of NamedPipeRPCCall + + * Added NamedPipe (blocking mode) + + * Added AbstractInput, AbstractOutput, AbstractInputOutput, NamedPipe stub, GenericRPCCall stub + + * Added RecursiveMutex. + Added support for waitable event watchers in Thread. + + * Added BinaryQueue + + * Debian/changelog updated + + * Fixed build-depends + + * Package build dependencies defined properly + + -- Koeun Choi Thu, 08 Apr 2010 15:54:02 +0200 + +dpl (0.0.2) unstable; urgency=low + + * Toolchain upgrades and fixes + + -- Koeun Choi Tue, 23 Mar 2010 11:40:32 +0100 + +dpl (0.0.1) unstable; urgency=low + + * Initial release + + -- Koeun Choi Tue, 23 Mar 2010 11:40:32 +0100 - -- Pawel Sikorski Mon, 13 Feb 2012 16:04:58 +0100 diff --git a/debian/control b/debian/control index a786fd3..e8aeeed 100644 --- a/debian/control +++ b/debian/control @@ -4,9 +4,9 @@ Priority: extra Maintainer: Lukasz Wrzosek, Taejeong.lee Standards-Version: 3.7.2 Uploaders: Yunchan Cho ,Przemyslaw Dobrowolski , Pawel Sikorski , Zbigniew Kostrzewa -Build-Depends: debhelper (>= 5), libecore-dev, libslp-setting-dev (>=0.2.5-2), libheynoti-dev, libappcore-efl-dev, libssl-dev, libsqlite3-dev, dlog-dev (>= 0.2.14-0), libglib2.0-dev, libslp-db-util-dev (>= 0.1.0-23), zlib1g-dev, libpcre-dev, libicu-dev, libxmlsec1-dev, openssl, libxml2-dev, libsoup2.4-dev, libcert-svc-dev, libiri-dev, libidn11-dev, libslp-tapi-dev +Build-Depends: debhelper (>= 5), libecore-dev, libslp-setting-dev (>=0.2.5-2), libappcore-efl-dev, libssl-dev, libsqlite3-dev, dlog-dev (>= 0.2.14-0), libglib2.0-dev, libslp-db-util-dev (>= 0.1.0-23), zlib1g-dev, libpcre-dev, libicu-dev, libxmlsec1-dev, openssl, libxml2-dev, libsoup2.4-dev, libiri-dev, libidn11-dev # If you want to build version of gtk, comment out above one live and use the following one line -#Build-Depends: debhelper (>= 5), libecore-dev, libslp-setting-dev (>=0.2.5-2), libheynoti-dev, libappcore-efl-dev, libssl-dev, libsqlite3-dev, dlog-dev (>= 0.2.14-0), libglib2.0-dev, libslp-db-util-dev (>= 0.1.0-23), libgtk2.0-dev, zlib1g-dev, libpcre-dev, libicu-dev +#Build-Depends: debhelper (>= 5), libecore-dev, libslp-setting-dev (>=0.2.5-2), libappcore-efl-dev, libssl-dev, libsqlite3-dev, dlog-dev (>= 0.2.14-0), libglib2.0-dev, libslp-db-util-dev (>= 0.1.0-23), libgtk2.0-dev, zlib1g-dev, libpcre-dev, libicu-dev Package: wrt-commons Section: libs @@ -35,7 +35,7 @@ Provides: dpl-efl-dev Conflicts: dpl-efl-dev Replaces: dpl-efl-dev Architecture: any -Depends: wrt-commons (= ${Source-Version}), libecore-dev, libslp-setting-dev (>=0.2.5-2), libheynoti-dev, libappcore-efl-dev, libssl-dev, libsqlite3-dev, dlog-dev (>= 0.2.14-0), libslp-db-util-dev (>= 0.1.0-23), zlib1g-dev, libpcre-dev +Depends: wrt-commons (= ${Source-Version}), libecore-dev, libslp-setting-dev (>=0.2.5-2), libappcore-efl-dev, libssl-dev, libsqlite3-dev, dlog-dev (>= 0.2.14-0), libslp-db-util-dev (>= 0.1.0-23), zlib1g-dev, libpcre-dev, libxml2-dev Description: Design patterns library - EFL based developer files Design patterns library is a collection of useful C++ utilities to easily develop window applications. The most important part of diff --git a/debian/rules b/debian/rules index 3c1584f..12505a7 100755 --- a/debian/rules +++ b/debian/rules @@ -1,30 +1,26 @@ #!/usr/bin/make -f #export DH_VERBOSE=1 -PACKAGE_VERSION ?= $(shell sed -n "1 p" debian/changelog | sed 's/.*([0-9]*.\([0-9]*\).*).*/\1/') -CFLAGS = -Wall -g -LDFLAGS = -Wl,--as-needed -Wl,--hash-style=both +PACKAGE_VERSION ?= $(shell dpkg-parsechangelog | sed -n 's/^Version: // p') -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) - CFLAGS += -O0 +ifneq (,$(findstring yes,$(DPL_LOGS))) +DPL_LOGS_STATUS = "ON" else - CFLAGS += -O2 -endif - -ifneq (,$(findstring yes,$(DPL_LOG))) - DPL_LOGS_STATUS = "ON" -else - DPL_LOGS_STATUS = "OFF" +DPL_LOGS_STATUS = "OFF" endif BUILD_DIR = cmake-build configure: configure-stamp configure-stamp: - dh_testdir + dh_testdir rm -rf $(BUILD_DIR) mkdir $(BUILD_DIR) - ( cd $(BUILD_DIR); cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DDPL_LOG=$(DPL_LOGS_STATUS) -DVERSION=${PACKAGE_VERSION}; ) + ( cd $(BUILD_DIR); cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DDPL_LOG=$(DPL_LOGS_STATUS) \ + -DVERSION=${PACKAGE_VERSION};) + touch configure-stamp build: build-stamp diff --git a/debian/wrt-commons.install b/debian/wrt-commons.install index dce5a2d..e35c8f5 100644 --- a/debian/wrt-commons.install +++ b/debian/wrt-commons.install @@ -1,10 +1,4 @@ usr/lib/*.so* /usr/share/wrt-engine/* -/usr/bin/wrt_reset_db.sh -/usr/bin/wrt_create_clean_db.sh -/usr/etc/ace/config* -/usr/etc/ace/bondixml* -/usr/etc/ace/demo.* -/usr/etc/ace/WACPolicy.xml -/usr/etc/ace/UnrestrictedPolicy.xml -/opt/share/cert-svc/certs/code-signing/wac/* +/usr/bin/wrt_commons_reset_db.sh +/usr/bin/wrt_commons_create_clean_db.sh diff --git a/debian/wrt-commons.postinst b/debian/wrt-commons.postinst index ed20a1f..5cadde4 100755 --- a/debian/wrt-commons.postinst +++ b/debian/wrt-commons.postinst @@ -2,45 +2,41 @@ if [ -z ${2} ]; then echo "This is new install of wrt-commons" - echo "Calling /usr/bin/wrt_reset_db.sh" - /usr/bin/wrt_reset_db.sh + echo "Calling /usr/bin/wrt_commons_reset_db.sh" + /usr/bin/wrt_commons_reset_db.sh else # Find out old and new version of databases WRT_OLD_DB_VERSION=`sqlite3 /opt/dbspace/.wrt.db ".tables" | grep "DB_VERSION_"` WRT_NEW_DB_VERSION=`cat /usr/share/wrt-engine/wrt_db.sql | tr '[:blank:]' '\n' | grep DB_VERSION_` - ACE_OLD_DB_VERSION=`sqlite3 /opt/dbspace/.ace.db ".tables" | grep "DB_VERSION_"` - ACE_NEW_DB_VERSION=`cat /usr/share/wrt-engine/ace_db.sql | tr '[:blank:]' '\n' | grep DB_VERSION_` - VCORE_OLD_DB_VERSION=`sqlite3 /opt/dbspace/.vcore.db ".tables" | grep "DB_VERSION_"` - VCORE_NEW_DB_VERSION=`cat /usr/share/wrt-engine/vcore_db.sql | tr '[:blank:]' '\n' | grep DB_VERSION_` + AUTOSAVE_OLD_DB_VERSION=`sqlite3 /opt/dbspace/.wrt_autosave.db ".tables" | grep "DB_VERSION_"` + AUTOSAVE_NEW_DB_VERSION=`cat /usr/share/wrt-engine/wrt_autosave_db.sql | tr '[:blank:]' '\n' | grep DB_VERSION_` + CUSTOM_HANDLER_OLD_DB_VERSION=`sqlite3 /opt/dbspace/.wrt_custom_handler.db ".tables" | grep "DB_VERSION_"` + CUSTOM_HANDLER_NEW_DB_VERSION=`cat /usr/share/wrt-engine/wrt_custom_handler_db.sql | tr '[:blank:]' '\n' | grep DB_VERSION_` echo "OLD wrt database version ${WRT_OLD_DB_VERSION}" echo "NEW wrt database version ${WRT_NEW_DB_VERSION}" - echo "OLD ace database version ${ACE_OLD_DB_VERSION}" - echo "NEW ace database version ${ACE_NEW_DB_VERSION}" - echo "OLD vcore database version ${VCORE_OLD_DB_VERSION}" - echo "NEW vcore database version ${VCORE_NEW_DB_VERSION}" + echo "OLD wrt_autosave database version ${AUTOSAVE_OLD_DB_VERSION}" + echo "NEW wrt_autosave database version ${AUTOSAVE_NEW_DB_VERSION}" + echo "OLD wrt_custom_handler database version ${CUSTOM_HANDLER_OLD_DB_VERSION}" + echo "NEW wrt_custom_handler database version ${CUSTOM_HANDLER_NEW_DB_VERSION}" - - if [ ${WRT_OLD_DB_VERSION} -a ${WRT_NEW_DB_VERSION} -a ${ACE_OLD_DB_VERSION} -a ${ACE_NEW_DB_VERSION} -a ${VCORE_OLD_DB_VERSION} -a ${VCORE_NEW_DB_VERSION} ] + if [ ${WRT_OLD_DB_VERSION} -a ${WRT_NEW_DB_VERSION} -a ${AUTOSAVE_OLD_DB_VERSION} -a ${AUTOSAVE_NEW_DB_VERSION} -a ${CUSTOM_HANDLER_OLD_DB_VERSION} -a ${CUSTOM_HANDLER_NEW_DB_VERSION}] then - if [ ${WRT_NEW_DB_VERSION} = ${WRT_OLD_DB_VERSION} -a ${ACE_NEW_DB_VERSION} = ${ACE_OLD_DB_VERSION} -a ${VCORE_OLD_DB_VERSION} = ${VCORE_NEW_DB_VERSION} ] + if [ ${WRT_NEW_DB_VERSION} = ${WRT_OLD_DB_VERSION} -a ${AUTOSAVE_NEW_DB_VERSION} = ${AUTOSAVE_OLD_DB_VERSION} -a ${CUSTOM_HANDLER_NEW_DB_VERSION} = ${CUSTOM_HANDLER_OLD_DB_VERSION}] then echo "Equal database detected so db installation ignored" else - echo "Calling /usr/bin/wrt_reset_db.sh" - /usr/bin/wrt_reset_db.sh + echo "Calling /usr/bin/wrt_commons_reset_db.sh" + /usr/bin/wrt_commons_reset_db.sh fi else - echo "Calling /usr/bin/wrt_reset_db.sh" - /usr/bin/wrt_reset_db.sh + echo "Calling /usr/bin/wrt_commons_reset_db.sh" + /usr/bin/wrt_commons_reset_db.sh fi fi mkdir -p /usr/etc/ace mkdir -p /usr/apps/org.tizen.policy -# 3. configurations -chown root:root /usr/etc/ace/config.xml - # DBUS services fix # WARNING: THIS IS TEMPORARY SOLUTION, AS THIS SHOULD NOT BE OUR # RESPONSIBILITY!!! WE HAVE TO CONTACT TO DBUS MAINAINERS diff --git a/dir-struct.py b/dir-struct.py index a1fc0f0..13eb011 100755 --- a/dir-struct.py +++ b/dir-struct.py @@ -1,4 +1,18 @@ #!/usr/bin/env python +# Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# import os import re diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt index 3eab79c..f3436e6 100644 --- a/etc/CMakeLists.txt +++ b/etc/CMakeLists.txt @@ -2,24 +2,7 @@ SET(ETC_DIR ${PROJECT_SOURCE_DIR}/etc) INSTALL(FILES - ${ETC_DIR}/wrt_reset_db.sh - ${ETC_DIR}/wrt_create_clean_db.sh + ${ETC_DIR}/wrt_commons_reset_db.sh + ${ETC_DIR}/wrt_commons_create_clean_db.sh DESTINATION /usr/bin ) - -INSTALL(FILES - ${ETC_DIR}/schema.xsd - DESTINATION share/wrt-engine - ) - -INSTALL(FILES - ${ETC_DIR}/fingerprint_list.xsd - DESTINATION share/wrt-engine/ - ) - -INSTALL(FILES - ${ETC_DIR}/fingerprint_list.xml - DESTINATION share/wrt-engine/ - ) - -ADD_SUBDIRECTORY(certificates) diff --git a/etc/wrt_commons_create_clean_db.sh b/etc/wrt_commons_create_clean_db.sh new file mode 100755 index 0000000..d333d9d --- /dev/null +++ b/etc/wrt_commons_create_clean_db.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# 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. +# + +for name in wrt wrt_autosave wrt_custom_handler +do + rm -f /opt/dbspace/.$name.db + rm -f /opt/dbspace/.$name.db-journal + SQL="PRAGMA journal_mode = PERSIST;" + sqlite3 /opt/dbspace/.$name.db "$SQL" + SQL=".read /usr/share/wrt-engine/"$name"_db.sql" + sqlite3 /opt/dbspace/.$name.db "$SQL" + touch /opt/dbspace/.$name.db-journal + chown 0:6026 /opt/dbspace/.$name.db + chown 0:6026 /opt/dbspace/.$name.db-journal + chmod 660 /opt/dbspace/.$name.db + chmod 660 /opt/dbspace/.$name.db-journal + pkill -9 security-serv +done + + diff --git a/etc/wrt_commons_reset_db.sh b/etc/wrt_commons_reset_db.sh new file mode 100755 index 0000000..940af1f --- /dev/null +++ b/etc/wrt_commons_reset_db.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# 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. +# + +rm -rf /opt/share/widget/system/* + +#Removing of widget desktop icons +WIDGET_EXEC_PATH=/opt/usr/apps/ +WIDGET_DESKTOP_PATH=/opt/share/applications/ +WRT_DB=/opt/dbspace/.wrt.db +PLUGINS_INSTALLATION_REQUIRED_PATH=/opt/share/widget/ +PLUGINS_INSTALLATION_REQUIRED=plugin-installation-required + +if [ -f ${WRT_DB} ] +then + PKG_NAME_SET=$(sqlite3 $WRT_DB 'select pkgname from WidgetInfo;') + for pkgname in $PKG_NAME_SET + do + rm -rf ${WIDGET_EXEC_PATH}${pkgname} + widget_desktop_file="${WIDGET_DESKTOP_PATH}${pkgname}.desktop"; + if [ -f ${widget_desktop_file} ]; then + rm -f $widget_desktop_file; + fi + done +else + echo "${WRT_DB} doesn't exist" +fi + +wrt_commons_create_clean_db.sh +if [ -e ${PLUGINS_INSTALLATION_REQUIRED_PATH} ] && [ -d ${PLUGINS_INSTALLATION_REQUIRED_PATH} ] +then + touch ${PLUGINS_INSTALLATION_REQUIRED_PATH}${PLUGINS_INSTALLATION_REQUIRED} +fi diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a5546f4..82e583f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -37,6 +37,5 @@ ADD_SUBDIRECTORY(tcpsock) ADD_SUBDIRECTORY(timed_event) ADD_SUBDIRECTORY(single_instance) ADD_SUBDIRECTORY(crypto_hash) -ADD_SUBDIRECTORY(event_delivery_test) ADD_SUBDIRECTORY(metronome) ADD_SUBDIRECTORY(copy) diff --git a/examples/binary_queue/binary_queue.cpp b/examples/binary_queue/binary_queue.cpp index a978a6d..063b6af 100644 --- a/examples/binary_queue/binary_queue.cpp +++ b/examples/binary_queue/binary_queue.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of binary queue example */ +#include #include #include #include diff --git a/examples/copy/copy.cpp b/examples/copy/copy.cpp index 1ab7607..5fa9484 100644 --- a/examples/copy/copy.cpp +++ b/examples/copy/copy.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of copy example */ +#include #include #include #include diff --git a/examples/crypto_hash/crypto_hash.cpp b/examples/crypto_hash/crypto_hash.cpp index 0fffefa..791b971 100644 --- a/examples/crypto_hash/crypto_hash.cpp +++ b/examples/crypto_hash/crypto_hash.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of crypto hash example */ +#include #include #include #include diff --git a/examples/dbus/client-example/client-example.cpp b/examples/dbus/client-example/client-example.cpp index 964333e..878febf 100644 --- a/examples/dbus/client-example/client-example.cpp +++ b/examples/dbus/client-example/client-example.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief Implementation for simple echo service DBus client. */ - +#include #include #include diff --git a/examples/dbus/server-example/server-example.cpp b/examples/dbus/server-example/server-example.cpp index 3a54d2a..a733c70 100644 --- a/examples/dbus/server-example/server-example.cpp +++ b/examples/dbus/server-example/server-example.cpp @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#include #include #include #include diff --git a/examples/fake_rpc/fake_rpc.cpp b/examples/fake_rpc/fake_rpc.cpp index 9750c62..3396a59 100644 --- a/examples/fake_rpc/fake_rpc.cpp +++ b/examples/fake_rpc/fake_rpc.cpp @@ -20,12 +20,12 @@ * @version 1.0 * @brief This file is the implementation file of RPC example */ - +#include #include #include #include #include -#include +#include #include #include #include @@ -62,8 +62,8 @@ private: int m_sentData; int m_receivedData; - DPL::ScopedPtr m_rpcUnixConnection; - DPL::ScopedPtr m_rpcFakeConnection; + std::unique_ptr m_rpcUnixConnection; + std::unique_ptr m_rpcFakeConnection; virtual void OnEventReceived(const AsyncCallEvent &event) { @@ -81,14 +81,14 @@ private: if (dynamic_cast(event.GetArg1())){ ++m_connections; LogInfo("CLIENT: Acquiring new fake connection"); - m_rpcFakeConnection.Reset(event.GetArg1()); + m_rpcFakeConnection.reset(event.GetArg1()); //this is not used on this side // m_rpcFakeConnection->DPL::EventSupport::AddListener(this); } else{ ++m_connections; LogInfo("CLIENT: Acquiring new unix connection"); - m_rpcUnixConnection.Reset(event.GetArg1()); + m_rpcUnixConnection.reset(event.GetArg1()); m_rpcUnixConnection->DPL::EventSupport::AddListener(this); } if(m_connections == 2){ @@ -125,19 +125,19 @@ public: LogInfo("CLIENT: Starting thread event loop"); int ret = Exec(); - if (m_rpcUnixConnection.Get()){ + if (m_rpcUnixConnection.get()){ LogInfo("CLIENT: Removing Unix connection"); m_rpcUnixConnection->DPL::EventSupport::RemoveListener(this); - m_rpcUnixConnection.Reset(); + m_rpcUnixConnection.reset(); } LogInfo("CLIENT: Closing"); - if (m_rpcFakeConnection.Get()){ + if (m_rpcFakeConnection.get()){ LogInfo("CLIENT: Removing Fake connection"); //this is not used on this side // m_rpcFakeConnection->DPL::EventSupport::RemoveListener(this); - m_rpcFakeConnection.Reset(); + m_rpcFakeConnection.reset(); } // Detach RPC client listener @@ -169,8 +169,8 @@ private: DPL::UnixSocketRPCServer m_rpcUnixServer; DPL::FakeRpcServer m_rpcFakeServer; - DPL::ScopedPtr m_rpcUnixConnection; - DPL::ScopedPtr m_rpcFakeConnection; + std::unique_ptr m_rpcUnixConnection; + std::unique_ptr m_rpcFakeConnection; MyThread m_thread; @@ -180,15 +180,15 @@ private: LogInfo("SERVER: Closing RPC connection..."); // Detach RPC connection listeners - if (m_rpcUnixConnection.Get()) { + if (m_rpcUnixConnection.get()) { //this is not used on this side // m_rpcUnixConnection->DPL::EventSupport::RemoveListener(this); - m_rpcUnixConnection.Reset(); + m_rpcUnixConnection.reset(); } - if (m_rpcFakeConnection.Get()) { + if (m_rpcFakeConnection.get()) { m_rpcFakeConnection->DPL::EventSupport::RemoveListener(this); - m_rpcFakeConnection.Reset(); + m_rpcFakeConnection.reset(); } LogInfo("SERVER: Closing Server"); @@ -227,12 +227,12 @@ private: // Save connection pointer if (dynamic_cast(event.GetArg1())){ LogInfo("SERVER: Acquiring Fake RPC connection"); - m_rpcFakeConnection.Reset(event.GetArg1()); + m_rpcFakeConnection.reset(event.GetArg1()); m_rpcFakeConnection->DPL::EventSupport::AddListener(this); } else{ LogInfo("SERVER: Acquiring Unix RPC connection"); - m_rpcUnixConnection.Reset(event.GetArg1()); + m_rpcUnixConnection.reset(event.GetArg1()); //this is not used on this side // m_rpcUnixConnection->DPL::EventSupport::AddListener(this); } diff --git a/examples/metronome/metronome_client.cpp b/examples/metronome/metronome_client.cpp index 2411d09..4184f54 100644 --- a/examples/metronome/metronome_client.cpp +++ b/examples/metronome/metronome_client.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of metronome client example */ +#include #include #include #include @@ -33,7 +34,7 @@ class MetronomeClientApplication { private: DPL::TcpSocketRPCClient m_rpcClient; - DPL::ScopedPtr m_rpcConnection; + std::unique_ptr m_rpcConnection; virtual void OnEventReceived(const DPL::AbstractRPCConnectionEvents::AsyncCallEvent &event) { @@ -67,7 +68,7 @@ private: { // Save connection pointer LogInfo("Connected to metronome server"); - m_rpcConnection.Reset(event.GetArg1()); + m_rpcConnection.reset(event.GetArg1()); // Attach event listeners m_rpcConnection->DPL::EventSupport::AddListener(this); @@ -92,12 +93,12 @@ public: virtual ~MetronomeClientApplication() { // Delete all RPC connections - if (m_rpcConnection.Get()) + if (m_rpcConnection.get()) { m_rpcConnection->DPL::EventSupport::RemoveListener(this); m_rpcConnection->DPL::EventSupport::RemoveListener(this); m_rpcConnection->DPL::EventSupport::RemoveListener(this); - m_rpcConnection.Reset(); + m_rpcConnection.reset(); } // Close RPC server diff --git a/examples/metronome/metronome_server.cpp b/examples/metronome/metronome_server.cpp index 7efa458..508f61d 100644 --- a/examples/metronome/metronome_server.cpp +++ b/examples/metronome/metronome_server.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of metronome server example */ +#include #include #include #include diff --git a/examples/rpc/rpc.cpp b/examples/rpc/rpc.cpp index 833a20f..e1e2a64 100644 --- a/examples/rpc/rpc.cpp +++ b/examples/rpc/rpc.cpp @@ -19,10 +19,11 @@ * @version 1.0 * @brief This file is the implementation file of RPC example */ +#include #include #include #include -#include +#include #include #include #include @@ -40,7 +41,7 @@ class MyThread { private: DPL::UnixSocketRPCClient m_rpcClient; - DPL::ScopedPtr m_rpcConnection; + std::unique_ptr m_rpcConnection; virtual void OnEventReceived(const DPL::AbstractRPCConnectionEvents::AsyncCallEvent &event) { @@ -69,7 +70,7 @@ private: { // Save connection pointer LogInfo("CLIENT: Acquiring new connection"); - m_rpcConnection.Reset(event.GetArg1()); + m_rpcConnection.reset(event.GetArg1()); // Attach listener to new connection LogInfo("CLIENT: Attaching connection event listeners"); @@ -108,7 +109,7 @@ public: int ret = Exec(); // Detach RPC listeners - if (m_rpcConnection.Get()) + if (m_rpcConnection.get()) { LogInfo("CLIENT: Detaching RPC connection events"); m_rpcConnection->DPL::EventSupport::RemoveListener(this); @@ -116,7 +117,7 @@ public: m_rpcConnection->DPL::EventSupport::RemoveListener(this); LogInfo("CLIENT: Resetting connection"); - m_rpcConnection.Reset(); + m_rpcConnection.reset(); } // Detach RPC client listener @@ -146,7 +147,7 @@ class MyApplication { private: DPL::UnixSocketRPCServer m_rpcServer; - DPL::ScopedPtr m_rpcConnection; + std::unique_ptr m_rpcConnection; MyThread m_thread; @@ -184,7 +185,7 @@ private: LogInfo("SERVER: Closing RPC connection on event..."); // Detach RPC connection listeners - if (m_rpcConnection.Get()) + if (m_rpcConnection.get()) { LogInfo("SERVER: Detaching connection events"); m_rpcConnection->DPL::EventSupport::RemoveListener(this); @@ -208,7 +209,7 @@ private: { // Save connection pointer LogInfo("SERVER: Acquiring RPC connection"); - m_rpcConnection.Reset(event.GetArg1()); + m_rpcConnection.reset(event.GetArg1()); // Attach event listeners LogInfo("SERVER: Attaching connection listeners"); diff --git a/examples/simple/simple.cpp b/examples/simple/simple.cpp index e09af81..6da8409 100644 --- a/examples/simple/simple.cpp +++ b/examples/simple/simple.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of simple example */ +#include #include int main(int argc, char *argv[]) diff --git a/examples/single_instance/single_instance.cpp b/examples/single_instance/single_instance.cpp index cadb4f4..038594b 100644 --- a/examples/single_instance/single_instance.cpp +++ b/examples/single_instance/single_instance.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of single instance example */ +#include #include #include diff --git a/examples/socket/socket.cpp b/examples/socket/socket.cpp index c8a2894..fca68ab 100644 --- a/examples/socket/socket.cpp +++ b/examples/socket/socket.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of socket example */ +#include #include #include #include diff --git a/examples/tcpsock/tcpsock.cpp b/examples/tcpsock/tcpsock.cpp index c2697cd..1bae958 100644 --- a/examples/tcpsock/tcpsock.cpp +++ b/examples/tcpsock/tcpsock.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of tcpsock example */ +#include #include #include #include diff --git a/examples/timed_event/timed_event.cpp b/examples/timed_event/timed_event.cpp index 28c74a4..4e32cef 100644 --- a/examples/timed_event/timed_event.cpp +++ b/examples/timed_event/timed_event.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of timed event example */ +#include #include #include #include diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 7d34aaf..4d39189 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -27,9 +27,11 @@ include(socket/config.cmake) include(rpc/config.cmake) include(test/config.cmake) include(log/config.cmake) -ADD_SUBDIRECTORY(vcore) -ADD_SUBDIRECTORY(ace) ADD_SUBDIRECTORY(widget_dao) -include(popup/config.cmake) +ADD_SUBDIRECTORY(auto_save_dao) +ADD_SUBDIRECTORY(security_origin_dao) +ADD_SUBDIRECTORY(custom_handler_dao) include(utils/config.cmake) include(localization/config.cmake) +include(support/config.cmake) +include(encryption/config.cmake) diff --git a/modules/auto_save_dao/CMakeLists.txt b/modules/auto_save_dao/CMakeLists.txt new file mode 100644 index 0000000..232f836 --- /dev/null +++ b/modules/auto_save_dao/CMakeLists.txt @@ -0,0 +1,98 @@ +SET(TARGET_AUTO_SAVE_DAO_DB "Sqlite3DbAutoSave") + +ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h + COMMAND ${CMAKE_SOURCE_DIR}/modules/auto_save_dao/orm/gen_db_md5.sh + ARGS ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h + ${CMAKE_SOURCE_DIR}/modules/auto_save_dao/orm/autosave_db + DEPENDS ${CMAKE_SOURCE_DIR}/modules/auto_save_dao/orm/autosave_db + ${CMAKE_SOURCE_DIR}/modules/auto_save_dao/orm/gen_db_md5.sh + COMMENT "Generating WRT auto save database checksum" + ) + +ADD_CUSTOM_COMMAND( OUTPUT .wrt_autosave.db + COMMAND rm -f ${CMAKE_CURRENT_BINARY_DIR}/.wrt_autosave.db + COMMAND gcc -Wall -include ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h -I${PROJECT_SOURCE_DIR}/modules/db/include -I${PROJECT_SOURCE_DIR}/modules/auto_save_dao/orm -E ${PROJECT_SOURCE_DIR}/modules/auto_save_dao/orm/autosave_db_sql_generator.h | grep --invert-match "^#" > ${CMAKE_CURRENT_BINARY_DIR}/wrt_autosave_db.sql + COMMAND sqlite3 ${CMAKE_CURRENT_BINARY_DIR}/.wrt_autosave.db ".read ${CMAKE_CURRENT_BINARY_DIR}/wrt_autosave_db.sql" || rm -f ${CMAKE_CURRENT_BINARY_DIR}/.wrt_autosave.db + DEPENDS ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h ${PROJECT_SOURCE_DIR}/modules/auto_save_dao/orm/autosave_db_sql_generator.h ${PROJECT_SOURCE_DIR}/modules/auto_save_dao/orm/autosave_db + ) + +ADD_CUSTOM_COMMAND( OUTPUT .wrt_autosave.db-journal + COMMAND touch + ARGS ${CMAKE_CURRENT_BINARY_DIR}/.wrt_autosave.db-journal + ) + +ADD_CUSTOM_TARGET(${TARGET_AUTO_SAVE_DAO_DB} ALL DEPENDS .wrt_autosave.db .wrt_autosave.db-journal) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/wrt_autosave_db.sql DESTINATION share/wrt-engine/) + +############################################################################### + +INCLUDE(FindPkgConfig) + +PKG_CHECK_MODULES(AUTO_SAVE_DAO_DEPS + glib-2.0 + REQUIRED) + +SET(AUTO_SAVE_DAO_INCLUDE_DIRS + ${PROJECT_SOURCE_DIR}/modules/auto_save_dao/include + ${PROJECT_SOURCE_DIR}/modules/auto_save_dao/orm + ${PROJECT_SOURCE_DIR}/modules/core/include + ${PROJECT_SOURCE_DIR}/modules/db/include + ${PROJECT_SOURCE_DIR}/modules/log/include +) + + +SET(AUTO_SAVE_DAO_SOURCES + dao/common_dao_types.cpp + dao/AutoSaveDatabase.cpp +) + +SET(AUTO_SAVE_DAO_RO_SOURCES + dao/auto_save_dao_read_only.cpp +) + +SET(AUTO_SAVE_DAO_RW_SOURCES + dao/auto_save_dao.cpp +) + + +INCLUDE_DIRECTORIES(${AUTO_SAVE_DAO_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(SYSTEM ${AUTO_SAVE_DAO_DEPS_INCLUDE_DIRS}) + +ADD_LIBRARY(${TARGET_AUTO_SAVE_DAO_LIB} SHARED ${AUTO_SAVE_DAO_SOURCES}) +SET_TARGET_PROPERTIES(${TARGET_AUTO_SAVE_DAO_LIB} PROPERTIES SOVERSION ${API_VERSION} VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET_AUTO_SAVE_DAO_LIB} PROPERTIES COMPILE_FLAGS "-include ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h") +TARGET_LINK_LIBRARIES(${TARGET_AUTO_SAVE_DAO_LIB} ${TARGET_DPL_EFL} ${TARGET_DPL_DB_EFL} ${AUTO_SAVE_DAO_DEPS_LIBRARIES}) +ADD_DEPENDENCIES(${TARGET_AUTO_SAVE_DAO_LIB} ${TARGET_AUTO_SAVE_DAO_DB}) + +ADD_LIBRARY(${TARGET_AUTO_SAVE_DAO_RO_LIB} SHARED ${AUTO_SAVE_DAO_RO_SOURCES}) +SET_TARGET_PROPERTIES(${TARGET_AUTO_SAVE_DAO_RO_LIB} PROPERTIES SOVERSION ${API_VERSION} VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET_AUTO_SAVE_DAO_RO_LIB} PROPERTIES COMPILE_FLAGS "-include ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h") +TARGET_LINK_LIBRARIES(${TARGET_AUTO_SAVE_DAO_RO_LIB} ${TARGET_AUTO_SAVE_DAO_LIB}) +ADD_DEPENDENCIES(${TARGET_AUTO_SAVE_DAO_RO_LIB} ${TARGET_AUTO_SAVE_DAO_DB}) + +ADD_LIBRARY(${TARGET_AUTO_SAVE_DAO_RW_LIB} SHARED ${AUTO_SAVE_DAO_RW_SOURCES}) +SET_TARGET_PROPERTIES(${TARGET_AUTO_SAVE_DAO_RW_LIB} PROPERTIES SOVERSION ${API_VERSION} VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET_AUTO_SAVE_DAO_RW_LIB} PROPERTIES COMPILE_FLAGS "-include ${CMAKE_BINARY_DIR}/modules/auto_save_dao/database_checksum_autosave.h") +TARGET_LINK_LIBRARIES(${TARGET_AUTO_SAVE_DAO_RW_LIB} ${TARGET_AUTO_SAVE_DAO_RO_LIB}) +ADD_DEPENDENCIES(${TARGET_AUTO_SAVE_DAO_RW_LIB} ${TARGET_AUTO_SAVE_DAO_DB}) + +INSTALL(TARGETS ${TARGET_AUTO_SAVE_DAO_LIB} DESTINATION lib) +INSTALL(TARGETS ${TARGET_AUTO_SAVE_DAO_RO_LIB} DESTINATION lib) +INSTALL(TARGETS ${TARGET_AUTO_SAVE_DAO_RW_LIB} DESTINATION lib) + +INSTALL(FILES + include/wrt-commons/auto-save-dao/common_dao_types.h + include/wrt-commons/auto-save-dao/AutoSaveDatabase.h + DESTINATION include/dpl-efl/wrt-commons/auto-save-dao +) + +INSTALL(FILES + include/wrt-commons/auto-save-dao-ro/auto_save_dao_read_only.h + DESTINATION include/dpl-efl/wrt-commons/auto-save-dao-ro +) + +INSTALL(FILES + include/wrt-commons/auto-save-dao-rw/auto_save_dao.h + DESTINATION include/dpl-efl/wrt-commons/auto-save-dao-rw +) diff --git a/modules/auto_save_dao/dao/AutoSaveDatabase.cpp b/modules/auto_save_dao/dao/AutoSaveDatabase.cpp new file mode 100644 index 0000000..16813c9 --- /dev/null +++ b/modules/auto_save_dao/dao/AutoSaveDatabase.cpp @@ -0,0 +1,30 @@ +/* + * 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 + +using namespace AutoSaveDB; + +namespace { +const char* AUTOSAVE_DB_DATABASE = "/opt/dbspace/.wrt_autosave.db"; +DPL::DB::SqlConnection::Flag::Type AUTOSAVE_DB_FLAGS = + DPL::DB::SqlConnection::Flag::UseLucene; +} + +DPL::Mutex g_autoSaveDbQueriesMutex; +DPL::DB::ThreadDatabaseSupport Interface::m_autoSavedbInterface( + AUTOSAVE_DB_DATABASE, AUTOSAVE_DB_FLAGS); + diff --git a/modules/auto_save_dao/dao/auto_save_dao.cpp b/modules/auto_save_dao/dao/auto_save_dao.cpp new file mode 100644 index 0000000..9c811a9 --- /dev/null +++ b/modules/auto_save_dao/dao/auto_save_dao.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file auto_save_dao.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the definition of auto save dao class. + */ +#include +#include +#include +#include +#include + +using namespace DPL::DB::ORM; +using namespace DPL::DB::ORM::autosave; +using namespace AutoSaveDB::Interface; + +namespace AutoSaveDB { + +#define SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN Try + +#define SQL_CONNECTION_EXCEPTION_HANDLER_END(message) \ + Catch(DPL::DB::SqlConnection::Exception::Base) { \ + LogError(message); \ + ReThrowMsg(AutoSaveDAO::Exception::DatabaseError, \ + message); \ + } + +AutoSaveDAO::AutoSaveDAO() : + AutoSaveDAOReadOnly() +{ +} + +AutoSaveDAO::~AutoSaveDAO() +{ +} + +void AutoSaveDAO::attachDatabaseRW(void) +{ + m_autoSavedbInterface.AttachToThread( + DPL::DB::SqlConnection::Flag::RW); +} + +void AutoSaveDAO::detachDatabase(void) +{ + m_autoSavedbInterface.DetachFromThread(); +} + +void AutoSaveDAO::setAutoSaveSubmitFormData(const DPL::String &url, + const SubmitFormData &submitFormData) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + ScopedTransaction transaction(&m_autoSavedbInterface); + + SubmitFormData submitData = getAutoSaveSubmitFormData(url); + if (!submitData.empty()) { + AUTOSAVE_DB_DELETE(del, + AutoSaveSubmitFormElement, + &m_autoSavedbInterface) + del->Where(Equals(url)); + del->Execute(); + } + + FOREACH(pSubmitFormData, submitFormData) { + AutoSaveSubmitFormElement::Row row; + row.Set_address(url); + row.Set_key(pSubmitFormData->key); + row.Set_value(pSubmitFormData->value); + + AUTOSAVE_DB_INSERT( + insert, AutoSaveSubmitFormElement, &m_autoSavedbInterface); + insert->Values(row); + insert->Execute(); + } + + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END( + "Fail to register id, passwd for autosave") +} +#undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN +#undef SQL_CONNECTION_EXCEPTION_HANDLER_END + +} // namespace AutoSaveDB diff --git a/modules/auto_save_dao/dao/auto_save_dao_read_only.cpp b/modules/auto_save_dao/dao/auto_save_dao_read_only.cpp new file mode 100644 index 0000000..28e0bb6 --- /dev/null +++ b/modules/auto_save_dao/dao/auto_save_dao_read_only.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of auto save dao class. + * + * @file auto_save_dao_read_only.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of auto save dao + */ +#include +#include +#include +#include +#include + +using namespace DPL::DB::ORM; +using namespace DPL::DB::ORM::autosave; +using namespace AutoSaveDB::Interface; + + +namespace AutoSaveDB { + +#define SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN Try + +#define SQL_CONNECTION_EXCEPTION_HANDLER_END(message) \ + Catch(DPL::DB::SqlConnection::Exception::Base) { \ + LogError(message); \ + ReThrowMsg(AutoSaveDAOReadOnly::Exception::DatabaseError, \ + message); \ + } + +AutoSaveDAOReadOnly::AutoSaveDAOReadOnly() +{ +} + +AutoSaveDAOReadOnly::~AutoSaveDAOReadOnly() +{ +} + +void AutoSaveDAOReadOnly::attachDatabaseRO(void) +{ + m_autoSavedbInterface.AttachToThread( + DPL::DB::SqlConnection::Flag::RO); +} + +void AutoSaveDAOReadOnly::detachDatabase(void) +{ + m_autoSavedbInterface.DetachFromThread(); +} + +SubmitFormData AutoSaveDAOReadOnly::getAutoSaveSubmitFormData( + const DPL::String &url) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + AUTOSAVE_DB_SELECT(select, AutoSaveSubmitFormElement, &m_autoSavedbInterface); + select->Where(Equals(url)); + AutoSaveSubmitFormElement::Select::RowList rows = select->GetRowList(); + + SubmitFormData submitFormData; + FOREACH(it, rows) { + SubmitFormElement element; + element.key = it->Get_key(); + element.value = it->Get_value(); + submitFormData.push_back(element); + } + return submitFormData; + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get autosave data string") +} + +#undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN +#undef SQL_CONNECTION_EXCEPTION_HANDLER_END + +} // namespace AutoSaveDB diff --git a/modules/auto_save_dao/dao/common_dao_types.cpp b/modules/auto_save_dao/dao/common_dao_types.cpp new file mode 100644 index 0000000..0eb25c5 --- /dev/null +++ b/modules/auto_save_dao/dao/common_dao_types.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file common_dao_types.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the implementation of + * common data types for autoSavedb + */ +#include +#include +#include + +namespace AutoSaveDB { +} // namespace AutoSaveDB diff --git a/modules/auto_save_dao/include/wrt-commons/auto-save-dao-ro/auto_save_dao_read_only.h b/modules/auto_save_dao/include/wrt-commons/auto-save-dao-ro/auto_save_dao_read_only.h new file mode 100644 index 0000000..96a665b --- /dev/null +++ b/modules/auto_save_dao/include/wrt-commons/auto-save-dao-ro/auto_save_dao_read_only.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of auto save dao class. + * + * @file auto_save_dao_read_only.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of auto save dao + */ + +#ifndef _AUTO_SAVE_DAO_READ_ONLY_H_ +#define _AUTO_SAVE_DAO_READ_ONLY_H_ + +#include +#include +#include +#include + +namespace AutoSaveDB { + +class AutoSaveDAOReadOnly +{ + public: + /** + * AutoSaveDAOReadOnly Exception classes + */ + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, DatabaseError) + }; + + public: + + AutoSaveDAOReadOnly(); + virtual ~AutoSaveDAOReadOnly(); + + static void attachDatabaseRO(void); + static void detachDatabase(void); + + /** + * This method gets Autofill for Webkit + */ + static SubmitFormData getAutoSaveSubmitFormData( + const DPL::String &url); + +}; + +} // namespace AutoSaveDB + +#endif // _AUTO_SAVE_DAO_READ_ONLY_H_ + diff --git a/modules/auto_save_dao/include/wrt-commons/auto-save-dao-rw/auto_save_dao.h b/modules/auto_save_dao/include/wrt-commons/auto-save-dao-rw/auto_save_dao.h new file mode 100644 index 0000000..123d5f1 --- /dev/null +++ b/modules/auto_save_dao/include/wrt-commons/auto-save-dao-rw/auto_save_dao.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. + */ +/** + * This file contains the declaration of auto save dao class. + * + * @file auto_save_dao.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of auto save dao + */ +#ifndef _AUTO_SAVE_DAO_H_ +#define _AUTO_SAVE_DAO_H_ + +#include + +namespace AutoSaveDB { + +class AutoSaveDAO : public AutoSaveDAOReadOnly +{ + public: + + AutoSaveDAO(); + virtual ~AutoSaveDAO(); + + static void attachDatabaseRW(void); + static void detachDatabase(void); + + /** + * This method sets Autofill for Webkit + */ + static void setAutoSaveSubmitFormData( + const DPL::String& url, const SubmitFormData &submitFormData); +}; + +} // namespace AutoSaveDB + +#endif // _AUTO_SAVE_DAO_H_ diff --git a/modules/auto_save_dao/include/wrt-commons/auto-save-dao/AutoSaveDatabase.h b/modules/auto_save_dao/include/wrt-commons/auto-save-dao/AutoSaveDatabase.h new file mode 100644 index 0000000..93404c6 --- /dev/null +++ b/modules/auto_save_dao/include/wrt-commons/auto-save-dao/AutoSaveDatabase.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. + */ + +#ifndef _AUTOSAVEDATABASE_H_ +#define _AUTOSAVEDATABASE_H_ + +#include +#include +#include + +extern DPL::Mutex g_autoSaveDbQueriesMutex; + +#define AUTOSAVE_DB_INTERNAL(tlsCommand, InternalType, interface) \ + static DPL::ThreadLocalVariable *tlsCommand ## Ptr = NULL; \ + { \ + DPL::Mutex::ScopedLock lock(&g_autoSaveDbQueriesMutex); \ + if (!tlsCommand ## Ptr) { \ + static DPL::ThreadLocalVariable tmp; \ + tlsCommand ## Ptr = &tmp; \ + } \ + } \ + DPL::ThreadLocalVariable &tlsCommand = *tlsCommand ## Ptr; \ + if (tlsCommand.IsNull()) { tlsCommand = InternalType(interface); } + +#define AUTOSAVE_DB_SELECT(name, type, interface) \ + AUTOSAVE_DB_INTERNAL(name, type::Select, interface) + +#define AUTOSAVE_DB_INSERT(name, type, interface) \ + AUTOSAVE_DB_INTERNAL(name, type::Insert, interface) + +#define AUTOSAVE_DB_UPDATE(name, type, interface) \ + AUTOSAVE_DB_INTERNAL(name, type::Update, interface) + +#define AUTOSAVE_DB_DELETE(name, type, interface) \ + AUTOSAVE_DB_INTERNAL(name, type::Delete, interface) + +namespace AutoSaveDB { +namespace Interface { + +extern DPL::DB::ThreadDatabaseSupport m_autoSavedbInterface; + +} // namespace Interface +} // namespace AutoSaveDB + +#endif /* _AUTOSAVEDATABASE_H_ */ + diff --git a/modules/auto_save_dao/include/wrt-commons/auto-save-dao/common_dao_types.h b/modules/auto_save_dao/include/wrt-commons/auto-save-dao/common_dao_types.h new file mode 100644 index 0000000..420725d --- /dev/null +++ b/modules/auto_save_dao/include/wrt-commons/auto-save-dao/common_dao_types.h @@ -0,0 +1,64 @@ +/* + * 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 common_dao_types.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of + * common data types for auto save database. + */ +#ifndef SHARE_COMMON_DAO_TYPES_H_ +#define SHARE_COMMON_DAO_TYPES_H_ + +#include +#include + +namespace AutoSaveDB { + +struct SubmitFormElement +{ + DPL::String key; + DPL::String value; + + SubmitFormElement() + { + } + + SubmitFormElement( + const DPL::String& keyData, + const DPL::String& valueData) : + key(keyData), + value(valueData) + { + } + + bool operator== (const SubmitFormElement& other) const + { + return (!DPL::StringCompare(key, other.key) && + !DPL::StringCompare(value, other.value)); + } + + bool operator!= (const SubmitFormElement& other) const + { + return !(*this == other); + } +}; +typedef std::list SubmitFormData; + +} // namespace AutoSaveDB + +#endif /* SHARE_COMMON_DAO_TYPES_H_ */ diff --git a/modules/auto_save_dao/orm/autosave_db b/modules/auto_save_dao/orm/autosave_db new file mode 100644 index 0000000..5f79edf --- /dev/null +++ b/modules/auto_save_dao/orm/autosave_db @@ -0,0 +1,13 @@ +SQL( + BEGIN TRANSACTION; +) + +CREATE_TABLE(AutoSaveSubmitFormElement) + COLUMN_NOT_NULL(address, VARCHAR(256),) + COLUMN_NOT_NULL(key, TEXT,) + COLUMN_NOT_NULL(value, TEXT,) +CREATE_TABLE_END() + +SQL( + COMMIT; +) diff --git a/modules/auto_save_dao/orm/autosave_db_definitions b/modules/auto_save_dao/orm/autosave_db_definitions new file mode 100644 index 0000000..5674d7b --- /dev/null +++ b/modules/auto_save_dao/orm/autosave_db_definitions @@ -0,0 +1,6 @@ +DATABASE_START(autosave) + +#include "autosave_db" +#include "version_db" + +DATABASE_END() diff --git a/modules/auto_save_dao/orm/autosave_db_sql_generator.h b/modules/auto_save_dao/orm/autosave_db_sql_generator.h new file mode 100644 index 0000000..e6720a0 --- /dev/null +++ b/modules/auto_save_dao/orm/autosave_db_sql_generator.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file autosave_db_sql_generator.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief Macro definitions for generating the SQL + * input file from database definition. + */ + +//Do not include this file directly! It is used only for SQL code generation. +#include + +#include "autosave_db_definitions" diff --git a/modules/auto_save_dao/orm/gen_db_md5.sh b/modules/auto_save_dao/orm/gen_db_md5.sh new file mode 100755 index 0000000..38587b7 --- /dev/null +++ b/modules/auto_save_dao/orm/gen_db_md5.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# 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. +# +CHECKSUM=`cat ${2} ${3} 2>/dev/null | md5sum 2>/dev/null | cut -d\ -f1 2>/dev/null` +echo "#define DB_CHECKSUM DB_VERSION_${CHECKSUM}" > ${1} +echo "#define DB_CHECKSUM_STR \"DB_VERSION_${CHECKSUM}\"" >> ${1} + diff --git a/modules/auto_save_dao/orm/orm_generator_autosave.h b/modules/auto_save_dao/orm/orm_generator_autosave.h new file mode 100644 index 0000000..57765cd --- /dev/null +++ b/modules/auto_save_dao/orm/orm_generator_autosave.h @@ -0,0 +1,24 @@ +/* + * 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 _ORM_GENERATOR_AUTOSAVE_H_ +#define _ORM_GENERATOR_AUTOSAVE_H_ + +#define ORM_GENERATOR_DATABASE_NAME autosave_db_definitions +#include +#undef ORM_GENERATOR_DATABASE_NAME + +#endif // _ORM_GENERATOR_AUTOSAVE_H_ diff --git a/modules/auto_save_dao/orm/version_db b/modules/auto_save_dao/orm/version_db new file mode 100644 index 0000000..7e20d8d --- /dev/null +++ b/modules/auto_save_dao/orm/version_db @@ -0,0 +1,5 @@ +SQL( + BEGIN TRANSACTION; + CREATE TABLE DB_CHECKSUM (version INT); + COMMIT; +) diff --git a/modules/core/config.cmake b/modules/core/config.cmake index 10450d0..147f155 100644 --- a/modules/core/config.cmake +++ b/modules/core/config.cmake @@ -36,12 +36,10 @@ SET(DPL_CORE_SOURCES ${PROJECT_SOURCE_DIR}/modules/core/src/exception.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/fast_delegate.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/file_input.cpp - ${PROJECT_SOURCE_DIR}/modules/core/src/file_input_mapping.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/file_output.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/lexical_cast.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/mutex.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/named_base_pipe.cpp - ${PROJECT_SOURCE_DIR}/modules/core/src/named_input_pipe.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/named_output_pipe.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/noncopyable.cpp ${PROJECT_SOURCE_DIR}/modules/core/src/once.cpp @@ -84,6 +82,7 @@ SET(DPL_CORE_HEADERS ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/apply.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/assert.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/atomic.h + ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/auto_ptr.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/binary_queue.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/bool_operator.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/char_traits.h @@ -94,7 +93,6 @@ SET(DPL_CORE_HEADERS ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/exception.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/fast_delegate.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/file_input.h - ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/file_input_mapping.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/file_output.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/foreach.h ${PROJECT_SOURCE_DIR}/modules/core/include/dpl/generic_event.h diff --git a/modules/core/include/dpl/auto_ptr.h b/modules/core/include/dpl/auto_ptr.h new file mode 100644 index 0000000..5fa458e --- /dev/null +++ b/modules/core/include/dpl/auto_ptr.h @@ -0,0 +1,100 @@ +/* + * 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 auto_ptr.h + * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) + * @author Tomasz Swierczek (t.swierczek@samsung.com) + * @version 1.0 + * @brief This file contais definictions of specific AutoPtr class. + */ +#ifndef _AUTO_PTR_H_ +#define _AUTO_PTR_H_ + +#include +#include +#include + +namespace DPL { +/* + * base deleter func + */ +template +struct UniversalFree {}; + +// Template Specialization +#define DECLARE_DELETER(type, function) \ + template <> \ + struct UniversalFree { \ + void universal_free(type *ptr){ \ + if (ptr) { \ + function(ptr); } \ + } \ + }; + +template +class AutoPtr +{ + public: + AutoPtr(T *ptr) : + m_data(ptr) + { + } + + AutoPtr(const AutoPtr &second) + { + m_data = second.m_data; + second.m_data = 0; + } + + AutoPtr & operator=(const AutoPtr &second) + { + if (this != &second) { + UniversalFree deleter; + deleter.universal_free(m_data); + m_data = second.m_data; + second.m_data = 0; + } + return *this; + } + + /** + * overloaded -> operator, so smart ptr could act as ordinary ptr + */ + T* operator->() + { + return m_data; + } + + ~AutoPtr() + { + UniversalFree deleter; + deleter.universal_free(m_data); + } + + /** + * get internal pointer + */ + T* get(void) + { + return m_data; + } + + private: + mutable T *m_data; +}; +} // namespace DPL + +#endif // AUTO_PTR diff --git a/modules/core/include/dpl/named_input_pipe.h b/modules/core/include/dpl/named_input_pipe.h index 247890d..7f10c5d 100644 --- a/modules/core/include/dpl/named_input_pipe.h +++ b/modules/core/include/dpl/named_input_pipe.h @@ -22,43 +22,16 @@ #ifndef DPL_NAMED_PIPE_H #define DPL_NAMED_PIPE_H -#include #include -#include #include +#include namespace DPL { class NamedInputPipe - : private Noncopyable, - public NamedBasePipe, - public AbstractWaitableInput -{ -public: - class Exception - { - public: - DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) - DECLARE_EXCEPTION_TYPE(Base, OpenFailed) - DECLARE_EXCEPTION_TYPE(Base, CloseFailed) - }; - -protected: - int m_fifo; - -public: - NamedInputPipe(); - virtual ~NamedInputPipe(); - - void Open(const std::string &fileName); - void Close(); - - // AbstractInput - virtual BinaryQueueAutoPtr Read(size_t size); - - // AbstractWaitableInput - virtual WaitableHandle WaitableReadHandle() const; -}; + : public NamedBasePipe, + public FileInput +{}; } // namespace DPL #endif // DPL_NAMED_PIPE_H diff --git a/modules/core/include/dpl/semaphore.h b/modules/core/include/dpl/semaphore.h index 420d9a5..8d51071 100644 --- a/modules/core/include/dpl/semaphore.h +++ b/modules/core/include/dpl/semaphore.h @@ -81,11 +81,18 @@ private: sem_t *InternalGet() const; void InternalDestroy(); +public: + /** + * decrement the semaphore counter + */ void Lock() const; - void Unlock() const; -public: /** + * increment the semaphore counter + */ + void Unlock() const; + + /** * Remove a named semaphore * * @param fileName Name of the semaphore diff --git a/modules/core/include/dpl/shared_ptr.h b/modules/core/include/dpl/shared_ptr.h index c964fd9..d2fc91d 100644 --- a/modules/core/include/dpl/shared_ptr.h +++ b/modules/core/include/dpl/shared_ptr.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include namespace DPL diff --git a/modules/core/include/dpl/singleton.h b/modules/core/include/dpl/singleton.h index 24d2e64..4e5b281 100644 --- a/modules/core/include/dpl/singleton.h +++ b/modules/core/include/dpl/singleton.h @@ -61,46 +61,6 @@ public: static void ResetThreadGuard(); }; -//This is needed for backward compatibility -#ifndef SEPARATED_SINGLETON_IMPLEMENTATION -template -Singleton& Singleton::InternalInstance() -{ - static Singleton instance; - return instance; -} - -template -Class &Singleton::Instance() -{ - Singleton& instance = Singleton::InternalInstance(); - - if (!!instance.m_guard) - { - Assert(Thread::GetCurrentThread() == *instance.m_guard && - "Singleton thread guard failed. A forbidden call from foreign thread was detected!"); - } - - return instance; -} - -// Thread guarding -template -void Singleton::SetThreadGuard(Thread *thread) -{ - Singleton& instance = Singleton::InternalInstance(); - instance.m_guard = OptionalThreadPtr(thread); -} - -template -void Singleton::ResetThreadGuard() -{ - Singleton& instance = Singleton::InternalInstance(); - instance.m_guard = OptionalThreadPtr::Null; -} - -#endif - } // namespace DPL #endif // DPL_SINGLETON_H diff --git a/modules/core/include/dpl/task.h b/modules/core/include/dpl/task.h index 7e43253..84f5b45 100644 --- a/modules/core/include/dpl/task.h +++ b/modules/core/include/dpl/task.h @@ -23,20 +23,11 @@ #ifndef DPL_TASK_H #define DPL_TASK_H -#include #include -#include -#include #include -#include #include -#include #include -#include -#include #include -#include -#include namespace DPL { @@ -159,377 +150,6 @@ public: return static_cast(m_steps.size()); } }; - -template -class MultiTaskDecl - : public Task -{ -protected: - typedef void (ImplementationType::*Step)(); - typedef std::list StepList; - typedef std::stack StepStack; - -private: - static std::string StepToString(Step step) - { - std::ostringstream pseudoAddressStream; - pseudoAddressStream << std::hex << union_cast(step); - - std::string pseudoAddress = pseudoAddressStream.str(); - - std::transform(pseudoAddress.begin(), pseudoAddress.end(), - pseudoAddress.begin(), ::toupper); - - return std::string("0x") + pseudoAddress; - } - - struct ConditionalStep - { - Step step; - - // Depencency lists - StepList unsatisfiedDependencies; - StepList satisfiedDependencies; - - ConditionalStep() - : step(NULL) - { - } - - ConditionalStep(Step stepArg, - StepList dependenciesArg) - : step(stepArg), - unsatisfiedDependencies(dependenciesArg) - { - } - }; - - typedef std::list ConditionalStepList; - - // Synchronization - Semaphore m_activeStepsSemaphore; - mutable Mutex m_dependencyListMutex; - - // Those steps that have their dependency lists satified and are ready - // to be executed - // Current step is defined to be the front of satisfied list - ConditionalStepList m_satisfiedSteps; - - // Those steps that are going to be executed but their dependency - // lists have not been satified - ConditionalStepList m_unsatisfiedSteps; - - // Those steps that have their dependency lists satified and are currently - // being executed - ConditionalStepList m_executingSteps; - - // Those steps that have been executed with their dependency lists - // satisfied - ConditionalStepList m_historicSteps; - - ///< Growing list of submitted abort steps - StepStack m_abortSteps; - - // Deriving implementation - ImplementationType *m_implementation; - - // Max parallel steps - size_t m_maxParallelCount; - - ///< Valid in dependency list mutex only - void SatisfyDependencies(const ConditionalStep &conditionalStep) - { - LogPedantic("Satisfying steps with dependecy to step: " - << StepToString(conditionalStep.step)); - - // Can satisfy conditional steps if and only if there are no more - // satisfied, unsatisfied or running same steps - // There is at least one historic step - this one - if (IsContainingStep(conditionalStep.step, m_unsatisfiedSteps) || - IsContainingStep(conditionalStep.step, m_satisfiedSteps) || - IsContainingStep(conditionalStep.step, m_executingSteps)) - { - LogPedantic("Step " << StepToString(conditionalStep.step) - << " cannot satify other steps yet"); - - return; - } - - LogPedantic("Step " << StepToString(conditionalStep.step) - << " can satify other steps"); - - // Do satisfy - typename ConditionalStepList::iterator unsatisfiedStepIterator = - m_unsatisfiedSteps.begin();; - - while (unsatisfiedStepIterator != m_unsatisfiedSteps.end()) - { - typename StepList::iterator iterator = - std::find( - unsatisfiedStepIterator->unsatisfiedDependencies.begin(), - unsatisfiedStepIterator->unsatisfiedDependencies.end(), - conditionalStep.step); - - // Does this conditional step need to be satisfied ? - if (iterator == - unsatisfiedStepIterator->unsatisfiedDependencies.end()) - { - continue; - } - - LogPedantic("Satisfying step " - << StepToString(unsatisfiedStepIterator->step) - << " dependency to step " - << StepToString(conditionalStep.step)); - - // Satisfy dependency - unsatisfiedStepIterator->unsatisfiedDependencies.erase( - iterator); - - unsatisfiedStepIterator->satisfiedDependencies.push_back( - conditionalStep.step); - - // If step is fully satisfied, transfer it to the satisfied - // steps list - if (unsatisfiedStepIterator->unsatisfiedDependencies.empty()) - { - LogPedantic("Step " - << StepToString(unsatisfiedStepIterator->step) - << " is fully satisfied"); - - // Move step - m_satisfiedSteps.push_back(*unsatisfiedStepIterator); - - unsatisfiedStepIterator = - m_unsatisfiedSteps.erase(unsatisfiedStepIterator); - - continue; - } - - // Check next unsatisfied step - ++unsatisfiedStepIterator; - } - } - - ///< Valid in dependency list mutex only - bool IsContainingStep(Step step, const ConditionalStepList &dependencies) const - { - FOREACH (iterator, dependencies) - if (iterator->step == step) - return true; - - return false; - } - - ///< Valid in dependency list mutex only - bool IsStepDependecyListSatisfied( - const StepList &dependencies) const - { - // All dependant step must be historic - FOREACH (iterator, dependencies) - if (!IsContainingStep(*iterator, m_historicSteps)) - return false; - - // Also, none dependant step can exist in - // unsatisfied/satisfied/inProgress lists - FOREACH (iterator, dependencies) - { - if (IsContainingStep(*iterator, m_unsatisfiedSteps) || - IsContainingStep(*iterator, m_satisfiedSteps) || - IsContainingStep(*iterator, m_executingSteps)) - { - return false; - } - } - - return true; - } - - bool AbortInternal() - { - // Clear all steps and construct - // a single-dependency list of abort steps - m_unsatisfiedSteps.clear(); - m_satisfiedSteps.clear(); - m_executingSteps.clear(); - m_historicSteps.clear(); - - if (m_abortSteps.empty()) - return false; - - // Register last abort step as satisfied - m_satisfiedSteps.push_back( - ConditionalStep( - m_abortSteps.top(), - StepList())); - - Step lastStep = m_abortSteps.top(); - m_abortSteps.pop(); - - // Create abort step list - while (!m_abortSteps.empty()) - { - // Add next unsatisfied step - StepList dependencies; - dependencies.push_back(lastStep); - - m_unsatisfiedSteps.push_back( - ConditionalStep( - m_abortSteps.top(), - dependencies)); - - // Remove top abort step - lastStep = m_abortSteps.top(); - m_abortSteps.pop(); - } - - return true; - } - -protected: - void AddStep(Step step, - const StepList &dependencies) - { - Mutex::ScopedLock lock(&m_dependencyListMutex); - - LogPedantic("Adding step: " << StepToString(step)); - - FOREACH (iterator, dependencies) - LogPedantic(" Dependency: " << StepToString(*iterator)); - - // Add step to proper list - if (IsStepDependecyListSatisfied(dependencies)) - { - m_satisfiedSteps.push_back(ConditionalStep(step, dependencies)); - - LogPedantic("Step " << StepToString(step) << " is satisfied"); - } - else - { - m_unsatisfiedSteps.push_back(ConditionalStep(step, dependencies)); - - LogPedantic("Step " << StepToString(step) << " is unsatisfied"); - } - - LogPedantic("Satisfied step count: " << m_satisfiedSteps.size()); - LogPedantic("Unsatisfied step count: " << m_unsatisfiedSteps.size()); - } - - void AddAbortStep(Step step) - { - Mutex::ScopedLock lock(&m_dependencyListMutex); - - m_abortSteps.push_front(step); - - LogPedantic("Abort step count: " << m_abortSteps.size()); - } - -public: - MultiTaskDecl(ImplementationType *implementation, - size_t maxParallelCount) - : m_activeStepsSemaphore(maxParallelCount), - m_implementation(implementation), - m_maxParallelCount(maxParallelCount) - { - } - - bool NextStep() - { - ConditionalStep stepToExecute; - typename ConditionalStepList::iterator executingStepIterator; - - // Take the main semaphore lock - Semaphore::ScopedLock semaphoreLock(&m_activeStepsSemaphore); - - // Take the dependency list lock - { - Mutex::ScopedLock listLock(&m_dependencyListMutex); - - // Get next step to execute - if (m_satisfiedSteps.empty()) - { - LogPedantic("No more satisfied steps to execute"); - return false; - } - - // Get next satisfied step to execute - stepToExecute = m_satisfiedSteps.front(); - m_satisfiedSteps.pop_front(); - - // Register it in executing step list - m_executingSteps.push_back(stepToExecute); - executingStepIterator = --m_executingSteps.end(); - - // Leave the dependency list lock - } - - // Execute step - (*m_implementation.*stepToExecute.step)(); - - // Take a lock again - { - Mutex::ScopedLock listLock(&m_dependencyListMutex); - - // Unregister executing step - m_executingSteps.erase(executingStepIterator); - - // Add historic step - m_historicSteps.push_back(stepToExecute); - - // Satisfy dependencies - SatisfyDependencies(stepToExecute); - - // Leave lock - } - - // Done - return true; - } - - bool Abort() - { - // Wait until all active steps are done - // This is achieved by taking all semaphore slots - ScopedArray semaphoreLocks( - new Semaphore::ScopedLock *[m_maxParallelCount]); - - for (size_t i = 0; i < m_maxParallelCount; ++i) - semaphoreLocks[i] = new Semaphore::ScopedLock( - &m_activeStepsSemaphore); - - // Result - bool result; - - // Take step lists lock - { - Mutex::ScopedLock mutexLock(&m_dependencyListMutex); - - // Do internal abort - result = AbortInternal(); - - // Leave steps list lock - } - - // Leave semaphore locks - for (size_t i = 0; i < m_maxParallelCount; ++i) - delete semaphoreLocks[i]; - - // Return result - return result; - } - - size_t GetStepCount() const - { - // Return sum of sizes of all lists - Mutex::ScopedLock lock(&m_dependencyListMutex); - - return static_cast( - m_unsatisfiedSteps.size() + - m_satisfiedSteps.size() + - m_executingSteps.size() + - m_historicSteps.size()); - } -}; } // namespace DPL #endif // DPL_TASK_H diff --git a/modules/core/include/dpl/thread.h b/modules/core/include/dpl/thread.h index b49ee09..8406282 100644 --- a/modules/core/include/dpl/thread.h +++ b/modules/core/include/dpl/thread.h @@ -172,6 +172,12 @@ public: void Quit(); /** + * Checks if current thread is main one + * Returns true if it is main program thread, false otherwise + */ + static bool IsMainThread(); + + /** * Current thread retrieval * Returns DPL thread handle or NULL if it is main program thread */ @@ -228,6 +234,7 @@ public: public: DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) DECLARE_EXCEPTION_TYPE(Base, NullReference) + DECLARE_EXCEPTION_TYPE(Base, KeyCreateFailed) }; private: @@ -281,7 +288,7 @@ private: // If yes, pthread_exit(NULL) is required if (!g_TLSforMainCreated) { - if (Thread::GetCurrentThread() == NULL) + if (Thread::IsMainThread()) { g_TLSforMainCreated = true; atexit(&MainThreadExitClean); @@ -304,9 +311,10 @@ public: ThreadLocalVariable() { int result = pthread_key_create(&m_key, &InternalDestroy); - - Assert(result == 0 && - "Failed to allocate thread local variable"); + if (result != 0) { + ThrowMsg(typename Exception::KeyCreateFailed, + "Failed to allocate thread local variable: " << result); + } } ~ThreadLocalVariable() diff --git a/modules/core/include/dpl/zip_input.h b/modules/core/include/dpl/zip_input.h index f4b8e34..633dbc8 100644 --- a/modules/core/include/dpl/zip_input.h +++ b/modules/core/include/dpl/zip_input.h @@ -50,41 +50,6 @@ public: typedef std::pair FileHandle; - struct FileDateTime - { - unsigned int second; //< seconds after the minute - [0,59] - unsigned int minute; //< minutes after the hour - [0,59] - unsigned int hour; //< hours since midnight - [0,23] - unsigned int day; //< day of the month - [1,31] - unsigned int month; //< months since January - [0,11] - unsigned int year; //< years - [1980..2044] - - FileDateTime() - : second(0), - minute(0), - hour(0), - day(0), - month(0), - year(0) - { - } - - FileDateTime(unsigned int secondArg, - unsigned int minuteArg, - unsigned int hourArg, - unsigned int dayArg, - unsigned int monthArg, - unsigned int yearArg) - : second(secondArg), - minute(minuteArg), - hour(hourArg), - day(dayArg), - month(monthArg), - year(yearArg) - { - } - }; - struct FileInfo { // File handle @@ -95,69 +60,28 @@ public: std::string comment; // File information - unsigned long version; //< version made by - unsigned long versionNeeded; //< version needed to extract - unsigned long flag; //< general purpose bit flag - unsigned long compressionMethod; //< compression method - unsigned long dosDate; //< last mod file date in Dos fmt - unsigned long crc; //< crc-32 off64_t compressedSize; //< compressed size off64_t uncompressedSize; //< uncompressed size - unsigned long diskNumberStart; //< disk number start - unsigned long internalFileAttributes; //< internal file attributes - unsigned long externalFileAttributes; //< external file attributes - - FileDateTime dateTime; FileInfo() : handle(), name(), comment(), - version(0), - versionNeeded(0), - flag(0), - compressionMethod(0), - dosDate(0), - crc(0), compressedSize(0), - uncompressedSize(0), - diskNumberStart(0), - internalFileAttributes(0), - externalFileAttributes(0), - dateTime() + uncompressedSize(0) { } FileInfo(const FileHandle &handleArg, const std::string &nameArg, const std::string &commentArg, - unsigned long versionArg, - unsigned long versionNeededArg, - unsigned long flagArg, - unsigned long compressionMethodArg, - unsigned long dosDateArg, - unsigned long crcArg, const off64_t &compressedSizeArg, - const off64_t &uncompressedSizeArg, - unsigned long diskNumberStartArg, - unsigned long internalFileAttributesArg, - unsigned long externalFileAttributesArg, - const FileDateTime &dateTimeArg) + const off64_t &uncompressedSizeArg) : handle(handleArg), name(nameArg), comment(commentArg), - version(versionArg), - versionNeeded(versionNeededArg), - flag(flagArg), - compressionMethod(compressionMethodArg), - dosDate(dosDateArg), - crc(crcArg), compressedSize(compressedSizeArg), - uncompressedSize(uncompressedSizeArg), - diskNumberStart(diskNumberStartArg), - internalFileAttributes(internalFileAttributesArg), - externalFileAttributes(externalFileAttributesArg), - dateTime(dateTimeArg) + uncompressedSize(uncompressedSizeArg) { } }; @@ -221,17 +145,6 @@ public: bool empty() const; /** - * Open a binary file for given file handle - * - * @return file object - * @param[in] handle Zip file handle to open - * @exception std::bad_alloc Cannot allocate memory to hold additional data - * @exception SteamOpenFailed Cannot find file with given handle - * @see BinaryQueue::BufferDeleterFree - */ - File *OpenFile(FileHandle handle); - - /** * Open a binary file for given file name * * @return file object diff --git a/modules/core/src/abstract_waitable_input_adapter.cpp b/modules/core/src/abstract_waitable_input_adapter.cpp index e7964ea..9de97d5 100644 --- a/modules/core/src/abstract_waitable_input_adapter.cpp +++ b/modules/core/src/abstract_waitable_input_adapter.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract waitable input adapter */ +#include #include namespace DPL diff --git a/modules/core/src/abstract_waitable_input_output_adapter.cpp b/modules/core/src/abstract_waitable_input_output_adapter.cpp index d07737b..e6f3a0f 100644 --- a/modules/core/src/abstract_waitable_input_output_adapter.cpp +++ b/modules/core/src/abstract_waitable_input_output_adapter.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract waitable input output adapter */ +#include #include namespace DPL diff --git a/modules/core/src/abstract_waitable_output_adapter.cpp b/modules/core/src/abstract_waitable_output_adapter.cpp index f849579..f3cf9cb 100644 --- a/modules/core/src/abstract_waitable_output_adapter.cpp +++ b/modules/core/src/abstract_waitable_output_adapter.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract waitable output adapter */ +#include #include namespace DPL diff --git a/modules/core/src/address.cpp b/modules/core/src/address.cpp index 624fe7e..52a1c78 100644 --- a/modules/core/src/address.cpp +++ b/modules/core/src/address.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of address */ +#include #include #include #include diff --git a/modules/core/src/application.cpp b/modules/core/src/application.cpp index f4a2147..d25e5ad 100644 --- a/modules/core/src/application.cpp +++ b/modules/core/src/application.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of MVC application support */ +#include #include #include diff --git a/modules/core/src/apply.cpp b/modules/core/src/apply.cpp index d299b57..7ba5180 100644 --- a/modules/core/src/apply.cpp +++ b/modules/core/src/apply.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of apply functionality */ +#include #include // diff --git a/modules/core/src/assert.cpp b/modules/core/src/assert.cpp index 9a363dc..e3e4f82 100644 --- a/modules/core/src/assert.cpp +++ b/modules/core/src/assert.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of assert */ +#include #include #include #include diff --git a/modules/core/src/atomic.cpp b/modules/core/src/atomic.cpp index 65af06e..cb5a585 100644 --- a/modules/core/src/atomic.cpp +++ b/modules/core/src/atomic.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of atomic */ +#include #include namespace DPL @@ -30,26 +31,26 @@ Atomic::Atomic(ValueType value) Atomic::ValueType Atomic::ExchangeAndAdd(ValueType value) { - return g_atomic_int_exchange_and_add(&m_value, value); + return g_atomic_int_exchange_and_add(const_cast(&m_value), value); } bool Atomic::CompareAndExchange(ValueType oldValue, ValueType newValue) { - return g_atomic_int_compare_and_exchange(&m_value, oldValue, newValue); + return g_atomic_int_compare_and_exchange(const_cast(&m_value), oldValue, newValue); } bool Atomic::operator--() { - return g_atomic_int_dec_and_test(&m_value) != TRUE; + return g_atomic_int_dec_and_test(const_cast(&m_value)) != TRUE; } void Atomic::operator++() { - g_atomic_int_inc(&m_value); + g_atomic_int_inc(const_cast(&m_value)); } Atomic::operator ValueType() const { - return g_atomic_int_get(&m_value); + return g_atomic_int_get(const_cast(&m_value)); } } // namespace DPL diff --git a/modules/core/src/binary_queue.cpp b/modules/core/src/binary_queue.cpp index 42b351e..3efecd0 100644 --- a/modules/core/src/binary_queue.cpp +++ b/modules/core/src/binary_queue.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of binary queue */ +#include #include #include #include diff --git a/modules/core/src/char_traits.cpp b/modules/core/src/char_traits.cpp index 13ea72e..6e4bec8 100644 --- a/modules/core/src/char_traits.cpp +++ b/modules/core/src/char_traits.cpp @@ -20,6 +20,7 @@ * @biref Char traits are used to create basic_string extended with additional features * Current char traits could be extended in feature to boost performance */ +#include #include // diff --git a/modules/core/src/colors.cpp b/modules/core/src/colors.cpp index 19e6d3a..fc0f2e2 100644 --- a/modules/core/src/colors.cpp +++ b/modules/core/src/colors.cpp @@ -20,7 +20,7 @@ * @brief Some constants with definition of colors for Console * and html output */ - +#include #include diff --git a/modules/core/src/copy.cpp b/modules/core/src/copy.cpp index 465a9b9..a302fb8 100644 --- a/modules/core/src/copy.cpp +++ b/modules/core/src/copy.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of copy */ +#include #include #include #include diff --git a/modules/core/src/errno_string.cpp b/modules/core/src/errno_string.cpp index 1637d87..24b9b5a 100644 --- a/modules/core/src/errno_string.cpp +++ b/modules/core/src/errno_string.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of errno string */ +#include #include #include #include diff --git a/modules/core/src/exception.cpp b/modules/core/src/exception.cpp index 9d6de98..ea6624e 100644 --- a/modules/core/src/exception.cpp +++ b/modules/core/src/exception.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation of exception system */ +#include #include #include #include diff --git a/modules/core/src/fast_delegate.cpp b/modules/core/src/fast_delegate.cpp index 94b3ca3..70821b2 100644 --- a/modules/core/src/fast_delegate.cpp +++ b/modules/core/src/fast_delegate.cpp @@ -19,4 +19,5 @@ * @version 1.0 * @brief This file is the implementation file of fast delegate */ +#include #include diff --git a/modules/core/src/file_input.cpp b/modules/core/src/file_input.cpp index 6e536db..c0007e4 100644 --- a/modules/core/src/file_input.cpp +++ b/modules/core/src/file_input.cpp @@ -14,11 +14,12 @@ * limitations under the License. */ /* - * @file named_input_pipe.cpp + * @file file_input.cpp * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) * @version 1.0 * @brief This file is the implementation file of named input pipe */ +#include #include #include #include @@ -29,6 +30,7 @@ namespace DPL { + namespace // anonymous { const size_t DEFAULT_READ_BUFFER_SIZE = 4096; diff --git a/modules/core/src/file_output.cpp b/modules/core/src/file_output.cpp index 8b09042..3106e17 100644 --- a/modules/core/src/file_output.cpp +++ b/modules/core/src/file_output.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of file output */ +#include #include #include #include diff --git a/modules/core/src/generic_event.cpp b/modules/core/src/generic_event.cpp index 3ad97c4..f09ff2b 100644 --- a/modules/core/src/generic_event.cpp +++ b/modules/core/src/generic_event.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of MVC generic event */ +#include #include // diff --git a/modules/core/src/lexical_cast.cpp b/modules/core/src/lexical_cast.cpp index 1d9ad17..a89abc9 100644 --- a/modules/core/src/lexical_cast.cpp +++ b/modules/core/src/lexical_cast.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief Implementation file for lexical cast */ +#include #include // diff --git a/modules/core/src/main.cpp b/modules/core/src/main.cpp index 4e8078c..80f8cb5 100644 --- a/modules/core/src/main.cpp +++ b/modules/core/src/main.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of main for EFL */ +#include #include #include #include @@ -96,6 +97,9 @@ Main::~Main() ecore_main_fd_handler_del(m_invokerHandler); m_invokerHandler = NULL; + //set old ecore select function, because after ecore_shutdown() call, + //it is being called once again and it may crash. + ecore_main_loop_select_func_set(m_oldEcoreSelect); // Decrement ECORE init count // We do not need ecore routines any more ecore_shutdown(); @@ -355,60 +359,6 @@ void Main::HandleDirectInvoker() // GLIB loop intergration workaround int Main::EcoreSelectInterceptor(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { -#if 0 - // Check each descriptor to see if it is valid - for (int i = 0; i < nfds; i++) - { - if (FD_ISSET(i, readfds) || FD_ISSET(i, writefds) || FD_ISSET(i, exceptfds)) - { - // Try to get descriptor flags - int result = fcntl(i, F_GETFL); - - if (result == -1) - { - if (errno == EBADF) - { - // This a bad descriptor. Remove all occurrences of it. - if (FD_ISSET(i, readfds)) - { - LogPedantic("GLIB_LOOP_INTEGRATION_WORKAROUND: Bad read descriptor: " << i); - FD_CLR(i, readfds); - } - - if (FD_ISSET(i, writefds)) - { - LogPedantic("GLIB_LOOP_INTEGRATION_WORKAROUND: Bad write descriptor: " << i); - FD_CLR(i, writefds); - } - - if (FD_ISSET(i, exceptfds)) - { - LogPedantic("GLIB_LOOP_INTEGRATION_WORKAROUND: Bad exception descriptor: " << i); - FD_CLR(i, exceptfds); - } - } - else - { - // Unexpected error - Assert(0); - } - } - } - } - - // Find out new maximum - int newNfds = 0; - - for (int i = 0; i < nfds; i++) - { - if (FD_ISSET(i, readfds) || FD_ISSET(i, writefds) || FD_ISSET(i, exceptfds)) - newNfds = i; - } - - return MainSingleton::Instance().m_oldEcoreSelect(newNfds + 1, readfds, writefds, exceptfds, timeout); - -#else - // We have to check error code here and make another try because of some glib error's. fd_set rfds, wfds, efds; memcpy(&rfds, readfds, sizeof(fd_set)); @@ -478,7 +428,6 @@ int Main::EcoreSelectInterceptor(int nfds, fd_set *readfds, fd_set *writefds, fd } return ret; -#endif } #endif // DPL_ENABLE_GLIB_LOOP_INTEGRATION_WORKAROUND } // namespace DPL diff --git a/modules/core/src/mutex.cpp b/modules/core/src/mutex.cpp index 7d18eda..6a7fd99 100644 --- a/modules/core/src/mutex.cpp +++ b/modules/core/src/mutex.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of mutex */ +#include #include #include #include diff --git a/modules/core/src/named_base_pipe.cpp b/modules/core/src/named_base_pipe.cpp index 6d18bc6..f582000 100644 --- a/modules/core/src/named_base_pipe.cpp +++ b/modules/core/src/named_base_pipe.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of named base pipe */ +#include #include #include #include diff --git a/modules/core/src/named_output_pipe.cpp b/modules/core/src/named_output_pipe.cpp index 5dd7215..df9b03e 100644 --- a/modules/core/src/named_output_pipe.cpp +++ b/modules/core/src/named_output_pipe.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of named output pipe */ +#include #include #include #include diff --git a/modules/core/src/noncopyable.cpp b/modules/core/src/noncopyable.cpp index d0af48a..48aff28 100644 --- a/modules/core/src/noncopyable.cpp +++ b/modules/core/src/noncopyable.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of noncopyable */ +#include #include namespace DPL diff --git a/modules/core/src/once.cpp b/modules/core/src/once.cpp index 5ac0c1e..c29d928 100644 --- a/modules/core/src/once.cpp +++ b/modules/core/src/once.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of once */ +#include #include namespace DPL diff --git a/modules/core/src/read_write_mutex.cpp b/modules/core/src/read_write_mutex.cpp index 7807f7f..596b0f6 100644 --- a/modules/core/src/read_write_mutex.cpp +++ b/modules/core/src/read_write_mutex.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of read write mutex */ +#include #include #include diff --git a/modules/core/src/recursive_mutex.cpp b/modules/core/src/recursive_mutex.cpp index 19e9dea..c9fcd5d 100644 --- a/modules/core/src/recursive_mutex.cpp +++ b/modules/core/src/recursive_mutex.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of recursive mutex */ +#include #include #include diff --git a/modules/core/src/semaphore.cpp b/modules/core/src/semaphore.cpp index 82d53ff..bc96cff 100644 --- a/modules/core/src/semaphore.cpp +++ b/modules/core/src/semaphore.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of semaphore */ +#include #include #include #include diff --git a/modules/core/src/serialization.cpp b/modules/core/src/serialization.cpp index b6e7da8..f8f05ff 100644 --- a/modules/core/src/serialization.cpp +++ b/modules/core/src/serialization.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of data serialization. */ +#include #include // diff --git a/modules/core/src/single_instance.cpp b/modules/core/src/single_instance.cpp index cca8365..71b68da 100644 --- a/modules/core/src/single_instance.cpp +++ b/modules/core/src/single_instance.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of single instance */ +#include #include #include #include diff --git a/modules/core/src/singleton.cpp b/modules/core/src/singleton.cpp index a6680f1..a76e8ac 100644 --- a/modules/core/src/singleton.cpp +++ b/modules/core/src/singleton.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of singleton */ +#include #include // diff --git a/modules/core/src/string.cpp b/modules/core/src/string.cpp old mode 100644 new mode 100755 index d945ebd..f39e59a --- a/modules/core/src/string.cpp +++ b/modules/core/src/string.cpp @@ -19,6 +19,7 @@ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) * @version 1.0 */ +#include #include #include #include @@ -114,7 +115,6 @@ String FromUTF8String(const std::string& aIn) ThrowMsg(StringException::IconvConvertErrorUTF8ToUTF32, "iconv failed for " << "UTF-32 <- UTF-8" << "error: " << GetErrnoString()); - return String(); } // Ignore BOM in front of UTF-32 @@ -145,7 +145,6 @@ std::string ToUTF8String(const DPL::String& aIn) ThrowMsg(StringException::IconvInitErrorUTF32ToUTF8, "iconv_open failed for " << "UTF-8 <- UTF-32" << "error: " << GetErrnoString()); - return std::string(); } size_t iconvRet = iconv(iconvHandle, &inbuf, &inbytes, &outbuf, &outbytesleft); @@ -157,7 +156,6 @@ std::string ToUTF8String(const DPL::String& aIn) ThrowMsg(StringException::IconvConvertErrorUTF32ToUTF8, "iconv failed for " << "UTF-8 <- UTF-32" << "error: " << GetErrnoString()); - return std::string(); } return &output[0]; diff --git a/modules/core/src/task.cpp b/modules/core/src/task.cpp index a8f18a4..6d4ff0d 100644 --- a/modules/core/src/task.cpp +++ b/modules/core/src/task.cpp @@ -20,6 +20,7 @@ * @version 1.0 * @brief Implementation file for abstaract task definition */ +#include #include // diff --git a/modules/core/src/task_list.cpp b/modules/core/src/task_list.cpp index 89e0ff8..2176c31 100644 --- a/modules/core/src/task_list.cpp +++ b/modules/core/src/task_list.cpp @@ -20,6 +20,7 @@ * @version 1.0 * @brief Implementation file for task list */ +#include #include #include diff --git a/modules/core/src/thread.cpp b/modules/core/src/thread.cpp index ec7166a..3974406 100644 --- a/modules/core/src/thread.cpp +++ b/modules/core/src/thread.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of thread */ +#include #include #include #include @@ -26,6 +27,7 @@ #include #include #include +#include namespace // anonymous { @@ -89,6 +91,11 @@ Thread::~Thread() m_eventList.clear(); } +bool Thread::IsMainThread() +{ + return (pthread_equal(pthread_self(), g_mainThread)); +} + Thread *Thread::GetCurrentThread() { if (pthread_equal(pthread_self(), g_mainThread)) @@ -112,7 +119,12 @@ void *Thread::StaticThreadEntry(void *param) Assert(This != NULL); // Set thread specific - pthread_setspecific(g_threadSpecific.threadSpecific, This); + int result = pthread_setspecific(g_threadSpecific.threadSpecific, This); + + if (result!=0) + { + LogError("Failed to set threadSpecific. Error: " << strerror(result)); + } // Enter thread proc // Do not allow exceptions to hit pthread core diff --git a/modules/core/src/type_list.cpp b/modules/core/src/type_list.cpp index 8eeb106..fa94806 100644 --- a/modules/core/src/type_list.cpp +++ b/modules/core/src/type_list.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief Generic type list template */ +#include #include // diff --git a/modules/core/src/union_cast.cpp b/modules/core/src/union_cast.cpp index b79b622..ffcb499 100644 --- a/modules/core/src/union_cast.cpp +++ b/modules/core/src/union_cast.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief Implementation file for union cast */ +#include #include // diff --git a/modules/core/src/waitable_event.cpp b/modules/core/src/waitable_event.cpp index 6bb021c..f72190b 100644 --- a/modules/core/src/waitable_event.cpp +++ b/modules/core/src/waitable_event.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of waitable event */ +#include #include #include #include diff --git a/modules/core/src/waitable_handle.cpp b/modules/core/src/waitable_handle.cpp index faaea42..8875563 100644 --- a/modules/core/src/waitable_handle.cpp +++ b/modules/core/src/waitable_handle.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of waitable handle */ +#include #include #include #include diff --git a/modules/core/src/waitable_handle_watch_support.cpp b/modules/core/src/waitable_handle_watch_support.cpp index 19c10e7..66fc8b5 100644 --- a/modules/core/src/waitable_handle_watch_support.cpp +++ b/modules/core/src/waitable_handle_watch_support.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of waitable handle watch support */ +#include #include #include #include @@ -37,27 +38,25 @@ WaitableHandleWatchSupport::~WaitableHandleWatchSupport() // Developer assertions if (!m_watchersMap.empty()) { - LogPedantic("### Leaked watchers map dump ###"); + LogWarning("### Leaked watchers map dump ###"); for (WaitableHandleWatchersMap::const_iterator iterator = m_watchersMap.begin(); iterator != m_watchersMap.end(); ++iterator) { - LogPedantic("### Waitable handle: " << iterator->first); + LogWarning("### Waitable handle: " << iterator->first); - LogPedantic("### Read listeners: " << iterator->second.readListenersCount); - LogPedantic("### Write listeners: " << iterator->second.writeListenersCount); + LogWarning("### Read listeners: " << iterator->second.readListenersCount); + LogWarning("### Write listeners: " << iterator->second.writeListenersCount); for (WaitableHandleListenerList::const_iterator listenersIterator = iterator->second.listeners.begin(); listenersIterator != iterator->second.listeners.end(); ++listenersIterator) { - LogPedantic("### Mode: " << listenersIterator->mode << ". Listener: 0x" << std::hex << listenersIterator->listener); + LogWarning("### Mode: " << listenersIterator->mode << ". Listener: 0x" << std::hex << listenersIterator->listener); } } } - - Assert(m_watchersMap.empty() == true); } WaitableHandle WaitableHandleWatchSupport::WaitableInvokerHandle() const diff --git a/modules/core/src/zip_input.cpp b/modules/core/src/zip_input.cpp index d862c01..691a2ec 100644 --- a/modules/core/src/zip_input.cpp +++ b/modules/core/src/zip_input.cpp @@ -19,11 +19,17 @@ * @version 1.0 * @brief This file is the implementation file of zip input */ +#include +#include +#include +#include +#include +#include #include -#include +#include #include #include -#include +#include #include #include #include @@ -87,7 +93,9 @@ public: class Device { private: - DPL::ScopedPtr m_fileMapping; + int m_handle; + off64_t m_size; // file mapping size + unsigned char *m_address; // mapping base address struct File { @@ -104,30 +112,75 @@ private: public: Device(const std::string &fileName) { - Try + LogPedantic("Creating file mapping"); + // Open device and map it to user space + int file = TEMP_FAILURE_RETRY(open(fileName.c_str(), O_RDONLY)); + + if (file == -1) + { + int error = errno; + ThrowMsg(ZipInput::Exception::OpenFailed, + "Failed to open file. errno = " << error); + } + + // Scoped close on file + ScopedClose scopedClose(file); + + // Calculate file size + off64_t size = lseek64(file, 0, SEEK_END); + + if (size == static_cast(-1)) { - LogPedantic("Creating file mapping"); - m_fileMapping.Reset(new FileInputMapping(fileName)); + int error = errno; + ThrowMsg(ZipInput::Exception::OpenFailed, + "Failed to seek file. errno = " << error); } - Catch (FileInputMapping::Exception::Base) + + // Map file to usespace + void *address = mmap(0, static_cast(size), + PROT_READ, MAP_SHARED, file, 0); + + if (address == MAP_FAILED) { - LogPedantic("Failed to create file mapping"); + int error = errno; + ThrowMsg(ZipInput::Exception::OpenFailed, + "Failed to map file. errno = " << error); + } + + // Release scoped close + m_handle = scopedClose.Release(); + + // Save mapped up address + m_size = size; + m_address = static_cast(address); + + LogPedantic("Created file mapping: " << fileName << + " of size: " << m_size << + " at address: " << std::hex << static_cast(m_address)); + } - ReThrowMsg(ZipInput::Exception::OpenFailed, - "Failed to open zip file mapping"); + ~Device() + { + // Close mapping + if (munmap(m_address, static_cast(m_size)) == -1) + { + int error = errno; + LogPedantic("Failed to munmap file. errno = " << error); } - LogPedantic("File mapping created"); + // Close file descriptor + if (close(m_handle) == -1) + { + int error = errno; + LogPedantic("Failed to close file. errno = " << error); + } } // zlib_filefunc64_def interface: files static voidpf ZCALLBACK open64_file(voidpf opaque, - const void* filename, - int mode) + const void* /*filename*/, + int /*mode*/) { - (void)filename; - (void)mode; - Device *device = static_cast(opaque); // Open file for master device @@ -143,13 +196,13 @@ public: File *deviceFile = static_cast(pstream); // Check if offset is out of bounds - if (deviceFile->offset >= device->m_fileMapping->GetSize()) + if (deviceFile->offset >= device->m_size) { LogPedantic("Device: read offset out of bounds"); return -1; } - off64_t bytesLeft = device->m_fileMapping->GetSize() - + off64_t bytesLeft = device->m_size - deviceFile->offset; off64_t bytesToRead; @@ -162,7 +215,7 @@ public: // Do copy memcpy(buf, - device->m_fileMapping->GetAddress() + deviceFile->offset, + device->m_address + deviceFile->offset, static_cast(bytesToRead)); // Increment file offset @@ -172,25 +225,18 @@ public: return static_cast(bytesToRead); } - static uLong ZCALLBACK write_file(voidpf opaque, - voidpf stream, - const void* buf, - uLong size) + static uLong ZCALLBACK write_file(voidpf /*opaque*/, + voidpf /*stream*/, + const void* /*buf*/, + uLong /*size*/) { - (void)opaque; - (void)stream; - (void)buf; - (void)size; - // Not supported by device LogPedantic("Unsupported function called!"); return -1; } - static int ZCALLBACK close_file(voidpf opaque, - voidpf stream) + static int ZCALLBACK close_file(voidpf /*opaque*/, voidpf stream) { - (void)opaque; File *deviceFile = static_cast(stream); // Delete file @@ -200,20 +246,14 @@ public: return 0; } - static int ZCALLBACK testerror_file(voidpf opaque, - voidpf stream) + static int ZCALLBACK testerror_file(voidpf /*opaque*/, voidpf /*stream*/) { - (void)opaque; - (void)stream; - // No errors return 0; } - static ZPOS64_T ZCALLBACK tell64_file(voidpf opaque, - voidpf stream) + static ZPOS64_T ZCALLBACK tell64_file(voidpf /*opaque*/, voidpf stream) { - (void)opaque; File *deviceFile = static_cast(stream); return static_cast(deviceFile->offset); @@ -241,7 +281,7 @@ public: case ZLIB_FILEFUNC_SEEK_END: deviceFile->offset = - device->m_fileMapping->GetSize() - + device->m_size - static_cast(offset); break; @@ -264,7 +304,7 @@ ZipInput::ZipInput(const std::string &fileName) // Create master device LogPedantic("Creating master device"); - ScopedPtr device(new Device(fileName)); + std::unique_ptr device(new Device(fileName)); // Open master file zlib_filefunc64_def interface; @@ -275,7 +315,7 @@ ZipInput::ZipInput(const std::string &fileName) interface.zseek64_file = &Device::seek64_file; interface.zclose_file = &Device::close_file; interface.zerror_file = &Device::testerror_file; - interface.opaque = device.Get(); + interface.opaque = device.get(); LogPedantic("Opening zip file"); unzFile file = unzOpen2_64(NULL, &interface); @@ -299,7 +339,7 @@ ZipInput::ZipInput(const std::string &fileName) // Release scoped unz close m_masterFile = scopedUnzClose.Release(); - m_device = device.Release(); + m_device = device.release(); LogPedantic("Zip file opened"); } @@ -414,25 +454,8 @@ void ZipInput::ReadInfos(void *masterFile) ), std::string(fileName.Get()), std::string(fileComment.Get()), - static_cast(fileInfo.version), - static_cast(fileInfo.version_needed), - static_cast(fileInfo.flag), - static_cast(fileInfo.compression_method), - static_cast(fileInfo.dosDate), - static_cast(fileInfo.crc), static_cast(fileInfo.compressed_size), - static_cast(fileInfo.uncompressed_size), - static_cast(fileInfo.disk_num_start), - static_cast(fileInfo.internal_fa), - static_cast(fileInfo.external_fa), - FileDateTime( - fileInfo.tmu_date.tm_sec, - fileInfo.tmu_date.tm_min, - fileInfo.tmu_date.tm_hour, - fileInfo.tmu_date.tm_mday, - fileInfo.tmu_date.tm_mon, - fileInfo.tmu_date.tm_year - ) + static_cast(fileInfo.uncompressed_size) ) ); @@ -476,11 +499,6 @@ ZipInput::size_type ZipInput::size() const return m_fileInfos.size(); } -ZipInput::File *ZipInput::OpenFile(FileHandle handle) -{ - return new File(m_device, handle); -} - ZipInput::File *ZipInput::OpenFile(const std::string &fileName) { FOREACH(iterator, m_fileInfos) diff --git a/modules/custom_handler_dao/CMakeLists.txt b/modules/custom_handler_dao/CMakeLists.txt new file mode 100644 index 0000000..1afddd5 --- /dev/null +++ b/modules/custom_handler_dao/CMakeLists.txt @@ -0,0 +1,83 @@ +SET(TARGET_CUSTOM_HANDLER_DAO_DB "Sqlite3DbCustomHandler") + +ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_BINARY_DIR}/modules/custom_handler_dao/database_checksum_custom_handler.h + COMMAND ${CMAKE_SOURCE_DIR}/modules/custom_handler_dao/orm/gen_db_md5.sh + ARGS ${CMAKE_BINARY_DIR}/modules/custom_handler_dao/database_checksum_custom_handler.h + ${CMAKE_SOURCE_DIR}/modules/custom_handler_dao/orm/custom_handler_db + DEPENDS ${CMAKE_SOURCE_DIR}/modules/custom_handler_dao/orm/custom_handler_db + ${CMAKE_SOURCE_DIR}/modules/custom_handler_dao/orm/gen_db_md5.sh + COMMENT "Generating WRT custom handlers database checksum" + ) + +ADD_CUSTOM_COMMAND( OUTPUT .wrt_custom_handler.db + COMMAND rm -f ${CMAKE_CURRENT_BINARY_DIR}/.wrt_custom_handler.db + COMMAND gcc -Wall -include ${CMAKE_BINARY_DIR}/modules/custom_handler_dao/database_checksum_custom_handler.h -I${PROJECT_SOURCE_DIR}/modules/db/include -I${PROJECT_SOURCE_DIR}/modules/custom_handler_dao/orm -E ${PROJECT_SOURCE_DIR}/modules/custom_handler_dao/orm/custom_handler_db_sql_generator.h | grep --invert-match "^#" > ${CMAKE_CURRENT_BINARY_DIR}/wrt_custom_handler_db.sql + COMMAND sqlite3 ${CMAKE_CURRENT_BINARY_DIR}/.wrt_custom_handler.db ".read ${CMAKE_CURRENT_BINARY_DIR}/wrt_custom_handler_db.sql" || rm -f ${CMAKE_CURRENT_BINARY_DIR}/.wrt_custom_handler.db + DEPENDS ${CMAKE_BINARY_DIR}/modules/custom_handler_dao/database_checksum_custom_handler.h ${PROJECT_SOURCE_DIR}/modules/custom_handler_dao/orm/custom_handler_db_sql_generator.h ${PROJECT_SOURCE_DIR}/modules/custom_handler_dao/orm/custom_handler_db + ) + +ADD_CUSTOM_COMMAND( OUTPUT .wrt_custom_handler.db-journal + COMMAND touch + ARGS ${CMAKE_CURRENT_BINARY_DIR}/.wrt_custom_handler.db-journal + ) + +ADD_CUSTOM_TARGET(${TARGET_CUSTOM_HANDLER_DAO_DB} ALL DEPENDS .wrt_custom_handler.db .wrt_custom_handler.db-journal) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/wrt_custom_handler_db.sql DESTINATION share/wrt-engine/) + +############################################################################### + +INCLUDE(FindPkgConfig) + +PKG_CHECK_MODULES(CUSTOM_HANDLER_DAO_DEPS + glib-2.0 + REQUIRED) + +SET(CUSTOM_HANDLER_DAO_INCLUDE_DIRS + ${PROJECT_SOURCE_DIR}/modules/custom_handler_dao/include + ${PROJECT_SOURCE_DIR}/modules/custom_handler_dao/orm + ${PROJECT_SOURCE_DIR}/modules/core/include + ${PROJECT_SOURCE_DIR}/modules/db/include + ${PROJECT_SOURCE_DIR}/modules/log/include +) + + +SET(CUSTOM_HANDLER_DAO_RO_SOURCES + dao/CustomHandlerDatabase.cpp + dao/custom_handler_dao_read_only.cpp +) + +SET(CUSTOM_HANDLER_DAO_RW_SOURCES + dao/custom_handler_dao.cpp +) + + +INCLUDE_DIRECTORIES(${CUSTOM_HANDLER_DAO_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(SYSTEM ${CUSTOM_HANDLER_DAO_DEPS_INCLUDE_DIRS}) + +ADD_LIBRARY(${TARGET_CUSTOM_HANDLER_DAO_RO_LIB} SHARED ${CUSTOM_HANDLER_DAO_RO_SOURCES}) +SET_TARGET_PROPERTIES(${TARGET_CUSTOM_HANDLER_DAO_RO_LIB} PROPERTIES SOVERSION ${API_VERSION} VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET_CUSTOM_HANDLER_DAO_RO_LIB} PROPERTIES COMPILE_FLAGS "-include ${CMAKE_BINARY_DIR}/modules/custom_handler_dao/database_checksum_custom_handler.h") +TARGET_LINK_LIBRARIES(${TARGET_CUSTOM_HANDLER_DAO_RO_LIB} ${TARGET_CUSTOM_HANDLER_DAO_LIB}) +ADD_DEPENDENCIES(${TARGET_CUSTOM_HANDLER_DAO_RO_LIB} ${TARGET_CUSTOM_HANDLER_DAO_DB}) + +ADD_LIBRARY(${TARGET_CUSTOM_HANDLER_DAO_RW_LIB} SHARED ${CUSTOM_HANDLER_DAO_RW_SOURCES}) +SET_TARGET_PROPERTIES(${TARGET_CUSTOM_HANDLER_DAO_RW_LIB} PROPERTIES SOVERSION ${API_VERSION} VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${TARGET_CUSTOM_HANDLER_DAO_RW_LIB} PROPERTIES COMPILE_FLAGS "-include ${CMAKE_BINARY_DIR}/modules/custom_handler_dao/database_checksum_custom_handler.h") +TARGET_LINK_LIBRARIES(${TARGET_CUSTOM_HANDLER_DAO_RW_LIB} ${TARGET_CUSTOM_HANDLER_DAO_RO_LIB}) +ADD_DEPENDENCIES(${TARGET_CUSTOM_HANDLER_DAO_RW_LIB} ${TARGET_CUSTOM_HANDLER_DAO_DB}) + +INSTALL(TARGETS ${TARGET_CUSTOM_HANDLER_DAO_RO_LIB} DESTINATION lib) +INSTALL(TARGETS ${TARGET_CUSTOM_HANDLER_DAO_RW_LIB} DESTINATION lib) + +INSTALL(FILES + include/wrt-commons/custom-handler-dao-ro/common_dao_types.h + include/wrt-commons/custom-handler-dao-ro/CustomHandlerDatabase.h + include/wrt-commons/custom-handler-dao-ro/custom_handler_dao_read_only.h + DESTINATION include/dpl-efl/wrt-commons/custom-handler-dao-ro +) + +INSTALL(FILES + include/wrt-commons/custom-handler-dao-rw/custom_handler_dao.h + DESTINATION include/dpl-efl/wrt-commons/custom-handler-dao-rw +) diff --git a/modules/custom_handler_dao/dao/CustomHandlerDatabase.cpp b/modules/custom_handler_dao/dao/CustomHandlerDatabase.cpp new file mode 100644 index 0000000..d0b26c5 --- /dev/null +++ b/modules/custom_handler_dao/dao/CustomHandlerDatabase.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +namespace CustomHandlerDB { +namespace Interface { + +namespace { +const char* CustomHandler_DB_DATABASE = "/opt/dbspace/.wrt_custom_handler.db"; +DPL::DB::SqlConnection::Flag::Type CustomHandler_DB_FLAGS = + DPL::DB::SqlConnection::Flag::UseLucene; +} + +DPL::Mutex g_dbQueriesMutex; +DPL::DB::ThreadDatabaseSupport g_dbInterface(CustomHandler_DB_DATABASE, + CustomHandler_DB_FLAGS); + +void attachDatabaseRO() +{ + g_dbInterface.AttachToThread(DPL::DB::SqlConnection::Flag::RO); +} + +void attachDatabaseRW() +{ + g_dbInterface.AttachToThread(DPL::DB::SqlConnection::Flag::RW); +} + +void detachDatabase() +{ + g_dbInterface.DetachFromThread(); +} + +} //namespace Interface +} //namespace CustomHandlerDB diff --git a/modules/custom_handler_dao/dao/custom_handler_dao.cpp b/modules/custom_handler_dao/dao/custom_handler_dao.cpp new file mode 100644 index 0000000..555655e --- /dev/null +++ b/modules/custom_handler_dao/dao/custom_handler_dao.cpp @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file custom_handler_dao.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief This file contains the definition of custom handler dao class. + */ + +#include +#include +#include +#include + +using namespace DPL::DB::ORM; +using namespace DPL::DB::ORM::custom_handler; + +namespace CustomHandlerDB { + +namespace { + +template +void fillRow(T& row, const CustomHandler& handler, const DPL::String& pkgName) +{ + row.Set_app_id(pkgName); + row.Set_target(handler.target); + row.Set_base_url(handler.base_url); + row.Set_url(handler.url); + row.Set_title(handler.title); + row.Set_user_allowed(handler.user_decision); +} + +} // namespace + +CustomHandlerDAO::CustomHandlerDAO(const DPL::String& pkgName) : + CustomHandlerDAOReadOnly(pkgName) +{ +} + +CustomHandlerDAO::~CustomHandlerDAO() +{ +} + +void CustomHandlerDAO::registerContentHandler(const CustomHandler& handler) +{ + LogDebug("Registering content handler " << handler.target << " " << + handler.base_url); + Try { + if (handler.user_decision & Agreed) { + //need to disable all previous, agreed entries + CUSTOM_HANDLER_DB_SELECT(select, ContentHandlers); + select->Where(And(Equals(handler.target), + Or(Equals(Agreed), + Equals(AgreedPermanently)) + )); + ContentHandlers::Select::RowList rows = select->GetRowList(); + if (rows.size() > 1) { + //more than one activ content handler - not good. Remove all. + //this should never happen + LogError("Database data incoherent."); + CUSTOM_HANDLER_DB_DELETE(deleteContent, ContentHandlers); + deleteContent->Where(And(Equals(handler.target), + Or(Equals(Agreed), + Equals(AgreedPermanently)))); + deleteContent->Execute(); + //all content handlers removed. New one can be inserted + } else if (!rows.empty()) { + //one active handler. Can be updaed + LogDebug("Activ content handler exist. Update"); + CUSTOM_HANDLER_DB_UPDATE(update, ContentHandlers); + update->Where(And(Equals(handler.target), + Or(Equals(Agreed), + Equals(AgreedPermanently)) + )); + ContentHandlers::Row rowToUpdate = rows.front(); + + if (handler.user_decision & DecisionSaved) { + //do not ask about previous one + rowToUpdate.Set_user_allowed(DeclinedPermanently); + } else { + //ask for next time + rowToUpdate.Set_user_allowed(Declined); + } + update->Values(rowToUpdate); + update->Execute(); + } + } + LogDebug("Inserting new content handler"); + ContentHandlers::Row row; + fillRow(row, handler, m_pkgName); + if (getContentHandler(handler.target, handler.url, handler.base_url)) { + LogDebug("Content handler exist. Update its state"); + CUSTOM_HANDLER_DB_UPDATE(updateRow, ContentHandlers); + updateRow->Where(And(Equals(m_pkgName), + And(Equals(handler.target), + And(Equals(handler.url), + Equals(handler.base_url))))); + updateRow->Values(row); + updateRow->Execute(); + LogDebug("updated"); + return; + } + CUSTOM_HANDLER_DB_INSERT(insert, ContentHandlers); + insert->Values(row); + insert->Execute(); + LogDebug("insterted"); + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to register custom handler"); + } +} + +void CustomHandlerDAO::registerProtocolHandler(const CustomHandler& handler) +{ + LogDebug("Registering protocol handler " << handler.target << " " << + handler.base_url); + Try { + + if (handler.user_decision & Agreed) { + //need to disable all previous, agreed entries + CUSTOM_HANDLER_DB_SELECT(select, ProtocolHandlers); + select->Where(And(Equals(handler.target), + Or(Equals(Agreed), + Equals(AgreedPermanently)) + )); + ProtocolHandlers::Select::RowList rows = select->GetRowList(); + if (rows.size() > 1) { + //more than one activ protocol handler - not good. Remove all. + //this should never happen + LogError("Database data incoherent."); + CUSTOM_HANDLER_DB_DELETE(deleteProtocol, ProtocolHandlers); + deleteProtocol->Where(And(Equals(handler.target), + Or(Equals(Agreed), + Equals(AgreedPermanently)))); + deleteProtocol->Execute(); + //all protocol handlers removed. New one can be inserted + } else if (!rows.empty()) { + //one active handler. Can be updaed + CUSTOM_HANDLER_DB_UPDATE(update, ProtocolHandlers); + update->Where(And(Equals(handler.target), + Or(Equals(Agreed), + Equals(AgreedPermanently)) + )); + ProtocolHandlers::Row rowToUpdate = rows.front(); + + if (handler.user_decision & DecisionSaved) { + //do not ask about previous one + rowToUpdate.Set_user_allowed(DeclinedPermanently); + } else { + //ask for next time + rowToUpdate.Set_user_allowed(Declined); + } + update->Values(rowToUpdate); + update->Execute(); + } + } + LogDebug("Inserting new protocol handler"); + ProtocolHandlers::Row row; + fillRow(row, handler, m_pkgName); + if (getProtocolHandler(handler.target, handler.url, handler.base_url)) { + LogDebug("Protocol handler exist. Update its state"); + CUSTOM_HANDLER_DB_UPDATE(updateRow, ProtocolHandlers); + updateRow->Where(And(Equals(m_pkgName), + And(Equals(handler.target), + And(Equals(handler.url), + Equals(handler.base_url))))); + updateRow->Values(row); + updateRow->Execute(); + LogDebug("updated"); + return; + } + CUSTOM_HANDLER_DB_INSERT(insert, ProtocolHandlers); + insert->Values(row); + insert->Execute(); + LogDebug("insterted"); + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to register custom handler"); + } +} + +void CustomHandlerDAO::unregisterContentHandler(const DPL::String& target, + const DPL::String& url) +{ + LogDebug("Removing content handler " << target << " " << url); + Try { + CUSTOM_HANDLER_DB_DELETE(deleteFrom, ContentHandlers); + deleteFrom->Where(And(Equals(m_pkgName), + And(Equals(target), + Equals(url)))); + deleteFrom->Execute(); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to remove content handler"); + } +} + +void CustomHandlerDAO::unregisterProtocolHandler(const DPL::String& target, + const DPL::String& url) +{ + LogDebug("Removing protocol handler " << target << " " << url); + Try { + CUSTOM_HANDLER_DB_DELETE(deleteFrom, ProtocolHandlers); + deleteFrom->Where(And(Equals(m_pkgName), + And(Equals(target), + Equals(url)))); + deleteFrom->Execute(); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to remove content handler"); + } + +} + +void CustomHandlerDAO::unregisterContentHandler(const DPL::String& target, + const DPL::String& url, + const DPL::String& baseURL) +{ + LogDebug("Removing content handler " << target << " " << url); + Try { + CUSTOM_HANDLER_DB_DELETE(deleteFrom, ContentHandlers); + deleteFrom->Where(And(Equals(m_pkgName), + And(Equals(target), + And(Equals(url), + Equals(baseURL))))); + deleteFrom->Execute(); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to remove content handler"); + } +} + +void CustomHandlerDAO::unregisterProtocolHandler(const DPL::String& target, + const DPL::String& url, + const DPL::String& baseURL) +{ + LogDebug("Removing protocol handler " << target << " " << url); + Try { + CUSTOM_HANDLER_DB_DELETE(deleteFrom, ProtocolHandlers); + deleteFrom->Where(And(Equals(m_pkgName), + And(Equals(target), + And(Equals(url), + Equals(baseURL))))); + deleteFrom->Execute(); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to remove content handler"); + } + +} + +void CustomHandlerDAO::removeWidgetProtocolHandlers() +{ + LogDebug("ente"); + Try { + CUSTOM_HANDLER_DB_DELETE(deleteProtocol, ProtocolHandlers); + deleteProtocol->Where(Equals(m_pkgName)); + deleteProtocol->Execute(); + + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to remove widget protoc"); + } +} + +void CustomHandlerDAO::removeWidgetContentHandlers() +{ + LogDebug("ente"); + Try { + CUSTOM_HANDLER_DB_DELETE(deleteContent, ContentHandlers); + deleteContent->Where(Equals(m_pkgName)); + deleteContent->Execute(); + + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAO::Exception::DatabaseError, + "Failed to remove widget entries"); + } +} + + +} // namespace CustomHandlerDB diff --git a/modules/custom_handler_dao/dao/custom_handler_dao_read_only.cpp b/modules/custom_handler_dao/dao/custom_handler_dao_read_only.cpp new file mode 100644 index 0000000..a7159fa --- /dev/null +++ b/modules/custom_handler_dao/dao/custom_handler_dao_read_only.cpp @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of custom handler dao class. + * + * @file custom_handler_dao_read_only.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of custom handler dao + */ + +#include +#include + +#include + +using namespace DPL::DB::ORM; +using namespace DPL::DB::ORM::custom_handler; + +namespace CustomHandlerDB { + +namespace { + +template +CustomHandlerPtr getSingleHandler(std::list row) +{ + CustomHandlerPtr handler; + if (!row.empty()) { + // There should be only one + if (row.size() > 1) { + ThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "More than one handler registered"); + } + + handler.reset(new CustomHandler()); + handler->target = row.front().Get_target(); + handler->base_url = row.front().Get_base_url(); + handler->url = row.front().Get_url(); + handler->title = row.front().Get_title(); + handler->user_allowed = static_cast(row.front().Get_user_allowed()); + handler->user_decision = + static_cast(row.front().Get_user_allowed()); + } + return handler; +} + +} // namespace + +CustomHandlerDAOReadOnly::CustomHandlerDAOReadOnly(const DPL::String& pkgName) : + m_pkgName(pkgName) +{ +} + +CustomHandlerDAOReadOnly::~CustomHandlerDAOReadOnly() +{ +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getProtocolHandler( + const DPL::String& protocol, + const DPL::String& url) +{ + LogDebug("Getting protocol handler"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ProtocolHandlers); + + select->Where(And(Equals(m_pkgName), + And(Equals(protocol), + Equals(url)))); + + std::list list = select->GetRowList(); + return getSingleHandler(list); + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get protocol handler"); + } +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getContentHandler( + const DPL::String& content, + const DPL::String& url) +{ + LogDebug("Getting content handler"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ContentHandlers); + + select->Where(And(Equals(m_pkgName), + And(Equals(content), + Equals(url)))); + + std::list list = select->GetRowList(); + return getSingleHandler(list); + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get content handler"); + } +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getActivProtocolHandler( + const DPL::String& protocol) +{ + LogDebug("Getting active protocol handler"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ProtocolHandlers); + + select->Where(And(Equals(m_pkgName), + Equals(protocol))); + + std::list list = select->GetRowList(); + CustomHandlerPtr handler; + + FOREACH(it, list) { + if (it->Get_user_allowed() & Agreed) { + handler.reset(new CustomHandler()); + handler->base_url = it->Get_base_url(); + handler->target = it->Get_target(); + handler->title = it->Get_title(); + handler->url = it->Get_url(); + handler->user_allowed = + static_cast(it->Get_user_allowed()); + handler->user_decision = + static_cast(it->Get_user_allowed()); + } + } + return handler; + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get protocol handler"); + } +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getProtocolHandler( + const DPL::String& protocol, + const DPL::String& url, + const DPL::String& baseURL) +{ + LogDebug("Check if protocol is registered"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ProtocolHandlers); + + select->Where(And(Equals(m_pkgName), + And(Equals(protocol), + And(Equals(url), + Equals(baseURL) + ) + ) + ) + ); + + std::list list = select->GetRowList(); + return getSingleHandler(list); + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get content handler"); + } +} + + +CustomHandlerPtr CustomHandlerDAOReadOnly::getActivContentHandler( + const DPL::String& content) +{ + LogDebug("Getting active content handler"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ContentHandlers); + + select->Where(And(Equals(m_pkgName), + Equals(content))); + + std::list list = select->GetRowList(); + CustomHandlerPtr handler; + + FOREACH(it, list) { + if (it->Get_user_allowed() & Agreed) { + handler.reset(new CustomHandler()); + handler->base_url = it->Get_base_url(); + handler->target = it->Get_target(); + handler->title = it->Get_title(); + handler->url = it->Get_url(); + handler->user_allowed = + static_cast(it->Get_user_allowed()); + handler->user_decision = + static_cast(it->Get_user_allowed()); + } + } + return handler; + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get protocol handler"); + } +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getContentHandler( + const DPL::String& content, + const DPL::String& url, + const DPL::String& baseURL) +{ + LogDebug("Check if content is registered"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ContentHandlers); + + select->Where(And(Equals(m_pkgName), + And(Equals(content), + And(Equals(url), + Equals(baseURL))))); + + std::list list = select->GetRowList(); + return getSingleHandler(list); + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get content handler"); + } +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getAllowedProtocolHandler( + const DPL::String& protocol) +{ + LogDebug("Getting allowed protocol handler"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ProtocolHandlers); + + select->Where(And(Equals(m_pkgName), + And(Equals(protocol), + Equals(true)))); + + std::list list = select->GetRowList(); + return getSingleHandler(list); + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get content handler"); + } +} + +CustomHandlerPtr CustomHandlerDAOReadOnly::getAllowedContentHandler( + const DPL::String& protocol) +{ + LogDebug("Getting allowed content handler"); + Try{ + CUSTOM_HANDLER_DB_SELECT(select, ContentHandlers) + + select->Where(And(Equals(m_pkgName), + And(Equals(protocol), + Equals(true)))); + + std::list list = select->GetRowList(); + return getSingleHandler(list); + } Catch(DPL::DB::SqlConnection::Exception::Base) { + ReThrowMsg(CustomHandlerDAOReadOnly::Exception::DatabaseError, + "Failed to get content handler"); + } +} + +} // namespace CustomHandlerDB diff --git a/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/CustomHandlerDatabase.h b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/CustomHandlerDatabase.h new file mode 100644 index 0000000..fea6309 --- /dev/null +++ b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/CustomHandlerDatabase.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _CUSTOM_HANDLER_DATABASE_H_ +#define _CUSTOM_HANDLER_DATABASE_H_ + +#include +#include +#include + +namespace CustomHandlerDB { +namespace Interface { + +void attachDatabaseRO(); +void attachDatabaseRW(); +void detachDatabase(); + +extern DPL::Mutex g_dbQueriesMutex; +extern DPL::DB::ThreadDatabaseSupport g_dbInterface; + +} // namespace Interface +} // namespace CustomHandlerDB + +#define CUSTOM_HANDLER_DB_INTERNAL(tlsCommand, InternalType) \ + static DPL::ThreadLocalVariable *tlsCommand ## Ptr = NULL; \ + { \ + DPL::Mutex::ScopedLock lock( \ + &CustomHandlerDB::Interface::g_dbQueriesMutex); \ + if (!tlsCommand ## Ptr) { \ + static DPL::ThreadLocalVariable tmp; \ + tlsCommand ## Ptr = &tmp; \ + } \ + } \ + DPL::ThreadLocalVariable &tlsCommand = *tlsCommand ## Ptr; \ + if (tlsCommand.IsNull()) \ + { \ + tlsCommand = InternalType(&CustomHandlerDB::Interface::g_dbInterface); \ + } + +#define CUSTOM_HANDLER_DB_SELECT(name, type) \ + CUSTOM_HANDLER_DB_INTERNAL(name, type::Select) + +#define CUSTOM_HANDLER_DB_INSERT(name, type) \ + CUSTOM_HANDLER_DB_INTERNAL(name, type::Insert) + +#define CUSTOM_HANDLER_DB_UPDATE(name, type) \ + CUSTOM_HANDLER_DB_INTERNAL(name, type::Update) + +#define CUSTOM_HANDLER_DB_DELETE(name, type) \ + CUSTOM_HANDLER_DB_INTERNAL(name, type::Delete) + +#endif /* _CUSTOM_HANDLER_DATABASE_H_ */ + diff --git a/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/common_dao_types.h b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/common_dao_types.h new file mode 100644 index 0000000..b08142a --- /dev/null +++ b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/common_dao_types.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file common_dao_types.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of + * common data types for custom handler database. + */ +#ifndef SRC_MODULES_CUSTOM_HANDLERS_DAO_COMMON_DAO_TYPES_H_ +#define SRC_MODULES_CUSTOM_HANDLERS_DAO_COMMON_DAO_TYPES_H_ + +#include +#include +#include + +namespace CustomHandlerDB { + +/** + * @brief Custom Handler struct + * + * Describes custom handler for protocol and content. + */ +enum HandlerState { + Agreed = 0x01, //user agreed to use protocol only, + //but want to ask in next occurence + Declined = 0x02, //user declined to use protocol, + //but want to ask in next occurence + //in fact it is used when user wants to cover saved agreed + //decision by agreeing to another one without save. + DecisionSaved = 0x04, //user dont want to ask again + AgreedPermanently = Agreed | DecisionSaved, + DeclinedPermanently = Declined | DecisionSaved +}; + +struct CustomHandler +{ + DPL::String target; // protocol/content ("mailto"/"application/x-soup") + DPL::String base_url; // base url of registered page + DPL::String url; // url used for protocol/content handling + DPL::String title; // user friendly handler name + bool user_allowed; // true if user has allowed the handler + HandlerState user_decision; +}; + +typedef std::shared_ptr CustomHandlerPtr; +typedef std::list CustomHandlersList; + +} // namespace CustomHandlerDB + +#endif /* SRC_MODULES_CUSTOM_HANDLERS_DAO_COMMON_DAO_TYPES_H_ */ diff --git a/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/custom_handler_dao_read_only.h b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/custom_handler_dao_read_only.h new file mode 100644 index 0000000..88c720d --- /dev/null +++ b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-ro/custom_handler_dao_read_only.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of custom handler dao class. + * + * @file custom_handler_dao_read_only.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of custom handler dao + */ + +#ifndef _CUSTOM_HANDLER_DAO_READ_ONLY_H_ +#define _CUSTOM_HANDLER_DAO_READ_ONLY_H_ + +#include +#include +#include "common_dao_types.h" + +namespace CustomHandlerDB { + +class CustomHandlerDAOReadOnly +{ + public: + /** + * CustomHandlerDAOReadOnly Exception classes + */ + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, DatabaseError) + }; + + public: + explicit CustomHandlerDAOReadOnly(const DPL::String& pkgName); + virtual ~CustomHandlerDAOReadOnly(); + + /** + * Returns protocol handler + */ + CustomHandlerPtr getProtocolHandler(const DPL::String& protocol, + const DPL::String& url); + CustomHandlerPtr getProtocolHandler(const DPL::String& protocol, + const DPL::String& url, + const DPL::String& baseURL); + + /** + * Returns protocol handler that is agreed or agreed and saved and match tizenID + */ + CustomHandlerPtr getActivProtocolHandler(const DPL::String& protocol); + + + + /** + * Returns content handler + */ + CustomHandlerPtr getContentHandler(const DPL::String& content, + const DPL::String& url); + CustomHandlerPtr getContentHandler(const DPL::String& protocol, + const DPL::String& url, + const DPL::String& baseURL); + + /** + * Returns content handler that is agreed or agreed and saved and match tizenID + */ + CustomHandlerPtr getActivContentHandler(const DPL::String& content); + + /** + * Returns allowed handler for given protocol + */ + CustomHandlerPtr getAllowedProtocolHandler(const DPL::String& protocol); + + /** + * Returns allowed handler for given content + */ + CustomHandlerPtr getAllowedContentHandler(const DPL::String& protocol); + + protected: + DPL::String m_pkgName; +}; + +} // namespace CustomHandlerDB + +#endif // _CUSTOM_HANDLER_DAO_READ_ONLY_H_ + diff --git a/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-rw/custom_handler_dao.h b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-rw/custom_handler_dao.h new file mode 100644 index 0000000..1ce61cf --- /dev/null +++ b/modules/custom_handler_dao/include/wrt-commons/custom-handler-dao-rw/custom_handler_dao.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of custom handler dao class. + * + * @file custom_handler_dao.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of custom handler dao + */ +#ifndef _CUSTOM_HANDLER_DAO_H_ +#define _CUSTOM_HANDLER_DAO_H_ + +#include + +namespace CustomHandlerDB { + +class CustomHandlerDAO : public CustomHandlerDAOReadOnly +{ + public: + explicit CustomHandlerDAO(const DPL::String& pkgName); + virtual ~CustomHandlerDAO(); + + /** + * Registers custom content handler + */ + void registerContentHandler(const CustomHandler& handler); + + /** + * Registers custom protocol handler + */ + void registerProtocolHandler(const CustomHandler& handler); + + /** + * Unregisters custom content handler + */ + void unregisterContentHandler(const DPL::String& target, + const DPL::String& burl); + /** + * Unregisters custom protocol handler + */ + void unregisterProtocolHandler(const DPL::String& target, + const DPL::String& url); + + void unregisterContentHandler(const DPL::String& target, + const DPL::String& url, + const DPL::String& baseURL); + + void unregisterProtocolHandler(const DPL::String& target, + const DPL::String& url, + const DPL::String& baseURL); + + /** + * Removes all widget entries connected to given ID + */ + void removeWidgetProtocolHandlers(); + void removeWidgetContentHandlers(); +}; + +} // namespace CustomHandlerDB + +#endif // _CUSTOM_HANDLER_DAO_H_ diff --git a/modules/custom_handler_dao/orm/custom_handler_db b/modules/custom_handler_dao/orm/custom_handler_db new file mode 100644 index 0000000..848c84a --- /dev/null +++ b/modules/custom_handler_dao/orm/custom_handler_db @@ -0,0 +1,34 @@ +SQL( + BEGIN TRANSACTION; +) + +CREATE_TABLE(ProtocolHandlers) + COLUMN_NOT_NULL(app_id, TEXT,) + COLUMN_NOT_NULL(target, TEXT,) + COLUMN_NOT_NULL(base_url, TEXT,) + COLUMN_NOT_NULL(url, TEXT,) + COLUMN_NOT_NULL(title, TEXT,) + COLUMN_NOT_NULL(user_allowed, INT,) + + TABLE_CONSTRAINTS( + PRIMARY KEY (app_id, target, base_url, url) + ) +CREATE_TABLE_END() + +CREATE_TABLE(ContentHandlers) + COLUMN_NOT_NULL(app_id, TEXT,) + COLUMN_NOT_NULL(target, TEXT,) + COLUMN_NOT_NULL(base_url, TEXT,) + COLUMN_NOT_NULL(url, TEXT,) + COLUMN_NOT_NULL(title, TEXT,) + COLUMN_NOT_NULL(user_allowed, INT,) + + TABLE_CONSTRAINTS( + PRIMARY KEY (app_id, target, base_url, url) + ) +CREATE_TABLE_END() + +SQL( + COMMIT; +) + diff --git a/modules/custom_handler_dao/orm/custom_handler_db_definitions b/modules/custom_handler_dao/orm/custom_handler_db_definitions new file mode 100644 index 0000000..1bc2bcd --- /dev/null +++ b/modules/custom_handler_dao/orm/custom_handler_db_definitions @@ -0,0 +1,6 @@ +DATABASE_START(custom_handler) + +#include "custom_handler_db" +#include "version_db" + +DATABASE_END() diff --git a/modules/custom_handler_dao/orm/custom_handler_db_sql_generator.h b/modules/custom_handler_dao/orm/custom_handler_db_sql_generator.h new file mode 100644 index 0000000..9b007de --- /dev/null +++ b/modules/custom_handler_dao/orm/custom_handler_db_sql_generator.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file custom_handler_db_sql_generator.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief Macro definitions for generating the SQL + * input file from database definition. + */ + +//Do not include this file directly! It is used only for SQL code generation. +#include + +#include "custom_handler_db_definitions" diff --git a/modules/custom_handler_dao/orm/gen_db_md5.sh b/modules/custom_handler_dao/orm/gen_db_md5.sh new file mode 100755 index 0000000..22c2530 --- /dev/null +++ b/modules/custom_handler_dao/orm/gen_db_md5.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +CHECKSUM=`cat ${2} ${3} 2>/dev/null | md5sum 2>/dev/null | cut -d\ -f1 2>/dev/null` +echo "#define DB_CHECKSUM DB_VERSION_${CHECKSUM}" > ${1} +echo "#define DB_CHECKSUM_STR \"DB_VERSION_${CHECKSUM}\"" >> ${1} + diff --git a/modules/custom_handler_dao/orm/orm_generator_custom_handler.h b/modules/custom_handler_dao/orm/orm_generator_custom_handler.h new file mode 100644 index 0000000..35c43a2 --- /dev/null +++ b/modules/custom_handler_dao/orm/orm_generator_custom_handler.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ORM_GENERATOR_CUSTOM_HANDLER_H_ +#define _ORM_GENERATOR_CUSTOM_HANDLER_H_ + +#define ORM_GENERATOR_DATABASE_NAME custom_handler_db_definitions +#include +#undef ORM_GENERATOR_DATABASE_NAME + +#endif // _ORM_GENERATOR_CUSTOM_HANDLER_H_ diff --git a/modules/custom_handler_dao/orm/version_db b/modules/custom_handler_dao/orm/version_db new file mode 100644 index 0000000..7e20d8d --- /dev/null +++ b/modules/custom_handler_dao/orm/version_db @@ -0,0 +1,5 @@ +SQL( + BEGIN TRANSACTION; + CREATE TABLE DB_CHECKSUM (version INT); + COMMIT; +) diff --git a/modules/db/include/dpl/db/orm.h b/modules/db/include/dpl/db/orm.h index f4df084..c404fba 100644 --- a/modules/db/include/dpl/db/orm.h +++ b/modules/db/include/dpl/db/orm.h @@ -25,14 +25,16 @@ #include #include #include +#include +#include #include #include #include #include -#include #include #include +#include #ifndef DPL_ORM_H #define DPL_ORM_H @@ -48,6 +50,10 @@ namespace ORM { (void)_ignored_; \ } +#define DECLARE_COLUMN_TYPE_LIST() typedef DPL::TypeListDecl< +#define SELECTED_COLUMN(table_name, column_name) table_name::column_name, +#define DECLARE_COLUMN_TYPE_LIST_END(name) DPL::TypeListGuard>::Type name; + typedef size_t ColumnIndex; typedef size_t ArgumentIndex; typedef DPL::Optional OptionalString; @@ -60,6 +66,7 @@ namespace RelationTypes { extern const char And[]; extern const char Or[]; extern const char Is[]; + extern const char In[]; //TODO define more relation types } @@ -70,17 +77,17 @@ namespace DataCommandUtils { void BindArgument(DataCommand *command, ArgumentIndex index, const DPL::String& argument); void BindArgument(DataCommand *command, ArgumentIndex index, const OptionalString& argument); } -class Expression { +class __attribute__ ((visibility("hidden"))) Expression { public: virtual ~Expression() {} virtual std::string GetString() const = 0; virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) = 0; }; -typedef DPL::SharedPtr ExpressionPtr; +typedef std::shared_ptr ExpressionPtr; template -class BinaryExpression : public Expression { +class __attribute__ ((visibility("hidden"))) BinaryExpression : public Expression { protected: LeftExpression m_leftExpression; RightExpression m_rightExpression; @@ -121,8 +128,16 @@ BinaryExpression (leftExpression, rightExpression); } +template +BinaryExpression + Or(const LeftExpression& leftExpression, const RightExpression& rightExpression) +{ + return BinaryExpression + (leftExpression, rightExpression); +} + template -class ExpressionWithArgument : public Expression { +class __attribute__ ((visibility("hidden"))) ExpressionWithArgument : public Expression { protected: ArgumentType argument; @@ -136,9 +151,8 @@ public: } }; - template -class Compare : public ExpressionWithArgument { +class __attribute__ ((visibility("hidden"))) Compare : public ExpressionWithArgument { public: explicit Compare(typename ColumnData::ColumnType column) : ExpressionWithArgument(column) @@ -147,6 +161,8 @@ public: virtual std::string GetString() const { std::string statement; + statement += ColumnData::GetTableName(); + statement += "."; statement += ColumnData::GetColumnName(); statement += " "; statement += Relation; @@ -161,7 +177,7 @@ public: }; #define ORM_DEFINE_COMPARE_EXPRESSION(name, relationType) \ template \ - class name : public Compare { \ + class __attribute__ ((visibility("hidden"))) name : public Compare { \ public: \ name(typename ColumnData::ColumnType column) : \ Compare(column) \ @@ -171,12 +187,281 @@ public: ORM_DEFINE_COMPARE_EXPRESSION(Equals, Equal) ORM_DEFINE_COMPARE_EXPRESSION(Is, Is) +template +class __attribute__ ((visibility("hidden"))) CompareBinaryColumn { +private: + std::string m_relation; +public: + CompareBinaryColumn(const char* Relation) : + m_relation(Relation) + {} + + virtual ~CompareBinaryColumn() {} + + virtual std::string GetString() const + { + std::string statement; + statement += ColumnData1::GetTableName(); + statement += "."; + statement += ColumnData1::GetColumnName(); + statement += " "; + statement += m_relation; + statement += " "; + statement += ColumnData2::GetTableName(); + statement += "."; + statement += ColumnData2::GetColumnName(); + + return statement; + } +}; + +template +CompareBinaryColumn + Equal() +{ + return CompareBinaryColumn(RelationTypes::Equal); +} + +template +class __attribute__ ((visibility("hidden"))) NumerousArguments : public Expression { +protected: + std::set m_argumentList; +public: + NumerousArguments(const std::set& argumentList) : m_argumentList(argumentList) {} + + virtual std::string GetString() const + { + std::string statement; + statement += ColumnData::GetColumnName(); + statement += " "; + statement += Relation; + statement += " ( "; + + int argumentCount = m_argumentList.size(); + while(argumentCount) + { + statement += "?"; + argumentCount--; + if (argumentCount) + { + statement += ", "; + } + } + + statement += " )"; + + return statement; + } + + virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) + { + ArgumentIndex argumentIndex = index; + FOREACH(argumentIt, m_argumentList) + { + DataCommandUtils::BindArgument(command, argumentIndex, *argumentIt); + argumentIndex++; + } + return argumentIndex + 1; + } + + template + struct ValidForTable { + typedef typename TableDefinition::ColumnList::template Contains Yes; + }; +}; + +#define ORM_DEFINE_COMPARE_EXPRESSION_NUMEROUS_ARGUMENTS(name, relationType) \ + template \ + class __attribute__ ((visibility("hidden"))) name : public NumerousArguments { \ + public: \ + name(std::set column) : \ + NumerousArguments(column) \ + {} \ + }; + +ORM_DEFINE_COMPARE_EXPRESSION_NUMEROUS_ARGUMENTS(In, In) + template ColumnType GetColumnFromCommand(ColumnIndex columnIndex, DataCommand *command); +class __attribute__ ((visibility("hidden"))) CustomColumnBase { +public: + CustomColumnBase() {} + virtual ~CustomColumnBase() {} +}; + +template +class __attribute__ ((visibility("hidden"))) CustomColumn : public CustomColumnBase { +private: + ColumnType m_columnData; + +public: + CustomColumn() {} + CustomColumn(ColumnType data) + { + m_columnData = data; + } + + void SetColumnData(ColumnType data) + { + m_columnData = data; + } + + ColumnType GetColumnData() const + { + return m_columnData; + } +}; + +template +class __attribute__ ((visibility("hidden"))) CustomRowUtil { +public: + static void MakeColumnList(std::vector& columnList) + { + typedef CustomColumn Type; + Type* pColumn = new Type(); + columnList.push_back(pColumn); + CustomRowUtil::MakeColumnList(columnList); + } + + static void CopyColumnList(const std::vector& srcList, std::vector& dstList) + { + CopyColumnList(srcList, dstList, 0); + } + + static ColumnIndex GetColumnIndex(const std::string& columnName) + { + return GetColumnIndex(columnName, 0); + } + +private: + static void CopyColumnList(const std::vector& srcList, std::vector& dstList, ColumnIndex index) + { + typedef CustomColumn Type; + Type* pColumn = new Type(((Type*)(srcList.at(index)))->GetColumnData()); + dstList.push_back(pColumn); + CustomRowUtil::CopyColumnList(srcList, dstList, index + 1); + } + + static ColumnIndex GetColumnIndex(const std::string& columnName, ColumnIndex index) + { + if (ColumnList::Head::GetColumnName() == columnName) + return index; + + return CustomRowUtil::GetColumnIndex(columnName, index + 1); + } + +template +friend class CustomRowUtil; +}; + +template<> +class __attribute__ ((visibility("hidden"))) CustomRowUtil { +public: + static void MakeColumnList(std::vector&) {} +private: + static void CopyColumnList(const std::vector&, std::vector&, ColumnIndex) {} + static ColumnIndex GetColumnIndex(const std::string&, ColumnIndex) { return -1; } + +template +friend class CustomRowUtil; +}; + +template +class __attribute__ ((visibility("hidden"))) CustomRow { +private: + std::vector m_columns; + +public: + CustomRow() + { + CustomRowUtil::MakeColumnList(m_columns); + } + + CustomRow(const CustomRow& r) + { + CustomRowUtil::CopyColumnList(r.m_columns, m_columns); + } + + virtual ~CustomRow() + { + while (!m_columns.empty()) + { + CustomColumnBase* pCustomColumn = m_columns.back(); + m_columns.pop_back(); + if (pCustomColumn) + delete pCustomColumn; + } + } + + template + void SetColumnData(ColumnIndex columnIndex, ColumnType data) + { + typedef CustomColumn Type; + Assert(columnIndex < m_columns.size()); + Type* pColumn = dynamic_cast(m_columns.at(columnIndex)); + Assert(pColumn); + pColumn->SetColumnData(data); + } + + template + typename ColumnData::ColumnType GetColumnData() + { + typedef CustomColumn Type; + ColumnIndex index = CustomRowUtil::GetColumnIndex(ColumnData::GetColumnName()); + Assert(index < m_columns.size()); + Type* pColumn = dynamic_cast(m_columns.at(index)); + Assert(pColumn); + return pColumn->GetColumnData(); + } +}; + +template +void SetColumnData(CustomRow& row, ColumnType columnData, ColumnIndex columnIndex) +{ + row.SetColumnData(columnIndex, columnData); +} + +template +class __attribute__ ((visibility("hidden"))) FillCustomRowUtil { +public: + static void FillCustomRow(CustomRow& row, DataCommand* command) + { + FillCustomRow(row, 0, command); + } + +private: + static void FillCustomRow(CustomRow& row, ColumnIndex columnIndex, DataCommand* command) + { + typename ColumnList::Head::ColumnType columnData; + columnData = GetColumnFromCommand(columnIndex, command); + SetColumnData(row, columnData, columnIndex); + FillCustomRowUtil::FillCustomRow(row, columnIndex + 1, command); + } + +template +friend class FillCustomRowUtil; +}; + +template +class __attribute__ ((visibility("hidden"))) FillCustomRowUtil { +private: + static void FillCustomRow(CustomRow&, ColumnIndex, DataCommand *) + { /* do nothing, we're past the last element of column list */ } + +template +friend class FillCustomRowUtil; +}; + template -class FillRowUtil { +class __attribute__ ((visibility("hidden"))) FillRowUtil { public: + static void FillRow(Row& row, DataCommand *command) + { + FillRow(row, 0, command); + } + +private: static void FillRow(Row& row, ColumnIndex columnIndex, DataCommand *command) { typename ColumnList::Head::ColumnType rowField; @@ -184,13 +469,51 @@ public: ColumnList::Head::SetRowField(row, rowField); FillRowUtil::FillRow(row, columnIndex + 1, command); } + +template +friend class FillRowUtil; }; template -class FillRowUtil { -public: +class __attribute__ ((visibility("hidden"))) FillRowUtil { +private: static void FillRow(Row&, ColumnIndex, DataCommand *) { /* do nothing, we're past the last element of column list */ } + +template +friend class FillRowUtil; +}; + +template +class __attribute__ ((visibility("hidden"))) JoinUtil { +public: + static std::string GetColumnNames() + { + std::string result; + result = ColumnList::Head::GetTableName(); + result += "."; + result += ColumnList::Head::GetColumnName(); + if (ColumnList::Tail::Size > 0) + result += ", "; + + return result += JoinUtil::GetColumnNames(); + } + + static std::string GetJoinTableName(const std::string& tableName) + { + std::string joinTableName = ColumnList::Head::GetTableName(); + if (tableName.find(joinTableName) == std::string::npos) + return joinTableName; + + return JoinUtil::GetJoinTableName(tableName); + } +}; + +template<> +class __attribute__ ((visibility("hidden"))) JoinUtil { +public: + static std::string GetColumnNames() { return ""; } + static std::string GetJoinTableName(std::string) { return ""; } }; class Exception { @@ -202,7 +525,7 @@ public: }; template -class Query +class __attribute__ ((visibility("hidden"))) Query { protected: explicit Query(IOrmInterface* interface) : @@ -226,7 +549,7 @@ protected: }; template -class QueryWithWhereClause : public Query +class __attribute__ ((visibility("hidden"))) QueryWithWhereClause : public Query { protected: ExpressionPtr m_whereExpression; @@ -271,13 +594,13 @@ public: str.str()); } //TODO maybe don't make a copy here but just generate the string part of the query. - m_whereExpression.Reset(new Expression(expression)); + m_whereExpression.reset(new Expression(expression)); } }; template -class Delete : public QueryWithWhereClause +class __attribute__ ((visibility("hidden"))) Delete : public QueryWithWhereClause { protected: void Prepare() @@ -317,8 +640,31 @@ public: } }; +namespace { +class BindVisitor { +private: + DataCommand *m_command; +public: + ArgumentIndex m_bindArgumentIndex; + + BindVisitor(DataCommand *command) : + m_command(command), + m_bindArgumentIndex(1) + {} + + template + void Visit(const char*, const ColumnType& value, bool isSet) + { + if ( isSet ) + { + DataCommandUtils::BindArgument(m_command, m_bindArgumentIndex, value); + m_bindArgumentIndex++; + } + } +}; +} //anonymous namespace template -class Insert : public Query +class __attribute__ ((visibility("hidden"))) Insert : public Query { public: typedef typename TableDefinition::Row Row; @@ -374,27 +720,6 @@ protected: } } - class BindVisitor { - private: - DataCommand *m_command; - ArgumentIndex m_bindArgumentIndex; - public: - BindVisitor(DataCommand *command) : - m_command(command), - m_bindArgumentIndex(1) - {} - - template - void Visit(const char*, const ColumnType& value, bool isSet) - { - if ( isSet ) - { - DataCommandUtils::BindArgument(m_command, m_bindArgumentIndex, value); - m_bindArgumentIndex++; - } - } - }; - void Bind() { BindVisitor visitor(this->m_command); @@ -439,7 +764,7 @@ public: }; template -class Select : public QueryWithWhereClause +class __attribute__ ((visibility("hidden"))) Select : public QueryWithWhereClause { public: typedef typename TableDefinition::ColumnList ColumnList; @@ -448,6 +773,7 @@ public: typedef std::list RowList; protected: DPL::Optional m_orderBy; + std::string m_JoinClause; bool m_distinctResults; void Prepare(const char* selectColumnName) @@ -461,6 +787,8 @@ protected: this->m_commandString += " FROM "; this->m_commandString += TableDefinition::GetName(); + this->m_commandString += m_JoinClause; + QueryWithWhereClause::Prepare(); if ( !m_orderBy.IsNull() ) @@ -491,7 +819,15 @@ protected: Row GetRow() { Row row; - FillRowUtil::FillRow(row, 0, this->m_command); + FillRowUtil::FillRow(row, this->m_command); + return row; + } + + template + CustomRow GetCustomRow() + { + CustomRow row; + FillCustomRowUtil::FillCustomRow(row, this->m_command); return row; } @@ -513,6 +849,18 @@ public: m_orderBy = orderBy; } + template + void Join(const Expression& expression) { + std::string usedTableNames = TableDefinition::GetName(); + if (!m_JoinClause.empty()) + usedTableNames += m_JoinClause; + + this->m_JoinClause += " JOIN "; + this->m_JoinClause += JoinUtil::GetJoinTableName(usedTableNames); + this->m_JoinClause += " ON "; + this->m_JoinClause += expression.GetString(); + } + template typename ColumnData::ColumnType GetSingleValue() { @@ -569,10 +917,38 @@ public: this->m_command->Reset(); return resultList; } + + template + CustomRow GetCustomSingleRow() + { + Prepare(JoinUtil::GetColumnNames().c_str()); + Bind(); + this->m_command->Step(); + + CustomRow result = GetCustomRow(); + + this->m_command->Reset(); + return result; + } + + template + std::list GetCustomRowList() + { + Prepare(JoinUtil::GetColumnNames().c_str()); + Bind(); + + std::list resultList; + + while (this->m_command->Step()) + resultList.push_back(GetCustomRow()); + + this->m_command->Reset(); + return resultList; + } }; template -class Update : public QueryWithWhereClause { +class __attribute__ ((visibility("hidden"))) Update : public QueryWithWhereClause { public: typedef typename TableDefinition::Row Row; @@ -633,29 +1009,6 @@ protected: } } - class BindVisitor { - private: - DataCommand *m_command; - - public: - ArgumentIndex m_bindArgumentIndex; - - BindVisitor(DataCommand *command) : - m_command(command), - m_bindArgumentIndex(1) - {} - - template - void Visit(const char*, const ColumnType& value, bool isSet) - { - if ( isSet ) - { - DataCommandUtils::BindArgument(m_command, m_bindArgumentIndex, value); - m_bindArgumentIndex++; - } - } - }; - void Bind() { BindVisitor visitor(this->m_command); diff --git a/modules/db/include/dpl/db/orm_generator.h b/modules/db/include/dpl/db/orm_generator.h index 61ff9ca..8bd9fdb 100644 --- a/modules/db/include/dpl/db/orm_generator.h +++ b/modules/db/include/dpl/db/orm_generator.h @@ -70,8 +70,9 @@ namespace ORM { #define DECLARE_COLUMN(FIELD, TYPE) \ struct FIELD { \ typedef TYPE ColumnType; \ + static const char* GetTableName() { return GetName(); } \ static const char* GetColumnName() { return STRINGIFY(FIELD); } \ - static void SetRowField(Row& row, const TYPE& value) { row.Set_##FIELD(value);} \ + static void SetRowField(Row& row, const TYPE& _value) { row.Set_##FIELD(_value);} \ }; #define INT int @@ -81,8 +82,8 @@ namespace ORM { #define VARCHAR(x) DPL::String #define TEXT DPL::String -#define SQL(args...) -#define TABLE_CONSTRAINTS(args...) +#define SQL(...) +#define TABLE_CONSTRAINTS(...) #define OPTIONAL(type) DPL::Optional< type > #define DATABASE_START(db_name) \ namespace db_name \ @@ -123,8 +124,8 @@ namespace ORM { class RowBase; \ inline std::ostream& operator<<(std::ostream& ostr, const RowBase& row); \ } -#define COLUMN_NOT_NULL(name, type, args...) -#define COLUMN(name, type, args...) +#define COLUMN_NOT_NULL(name, type, ...) +#define COLUMN(name, type, ...) #define CREATE_TABLE_END() #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -141,11 +142,11 @@ namespace ORM { #define CREATE_TABLE(name) namespace name { class RowBase { \ public: friend std::ostream& operator<<(std::ostream&, const RowBase&); -#define COLUMN_NOT_NULL(name, type, args...) \ +#define COLUMN_NOT_NULL(name, type, ...) \ protected: type name; bool m_##name##_set; \ - public: void Set_##name(const type& value) { \ + public: void Set_##name(const type& _value) { \ m_##name##_set = true; \ - this->name = value; \ + this->name = _value; \ } \ public: type Get_##name() const { \ if ( !m_##name##_set ) { \ @@ -155,11 +156,11 @@ namespace ORM { return name; \ } -#define COLUMN(name, type, args...) \ +#define COLUMN(name, type, ...) \ protected: OPTIONAL(type) name; bool m_##name##_set; \ - public: void Set_##name(const OPTIONAL(type)& value) { \ + public: void Set_##name(const OPTIONAL(type)& _value) { \ m_##name##_set = true; \ - this->name = value; \ + this->name = _value; \ } \ public: OPTIONAL(type) Get_##name() const { \ if ( !m_##name##_set ) { \ @@ -180,8 +181,8 @@ namespace ORM { // RowBase ostream operator<< #define CREATE_TABLE(name) std::ostream& name::operator<<(std::ostream& ostr, const RowBase& row) { using ::operator<< ; ostr << STRINGIFY(name) << " ("; -#define COLUMN_NOT_NULL(name, type, args...) ostr << " '" << row.name << "'" ; -#define COLUMN(name, type, args...) ostr << " '" << row.name << "'" ; +#define COLUMN_NOT_NULL(name, type, ...) ostr << " '" << row.name << "'" ; +#define COLUMN(name, type, ...) ostr << " '" << row.name << "'" ; #define CREATE_TABLE_END() ostr << " )" ; return ostr; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -195,8 +196,8 @@ namespace ORM { #define CREATE_TABLE(name) namespace name { class RowBase2 : public RowBase { \ public: bool operator==(const RowBase2& row) const { return true -#define COLUMN_NOT_NULL(name, type, args...) && (this->name == row.name) -#define COLUMN(name, type, args...) && (this->name == row.name) +#define COLUMN_NOT_NULL(name, type, ...) && (this->name == row.name) +#define COLUMN(name, type, ...) && (this->name == row.name) #define CREATE_TABLE_END() ; } }; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -210,8 +211,8 @@ namespace ORM { #define CREATE_TABLE(name) namespace name { class RowBase3 : public RowBase2 { \ public: bool operator<(const RowBase3& row) const { -#define COLUMN_NOT_NULL(name, type, args...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; } -#define COLUMN(name, type, args...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; } +#define COLUMN_NOT_NULL(name, type, ...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; } +#define COLUMN(name, type, ...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; } #define CREATE_TABLE_END() return false; } }; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -225,8 +226,8 @@ namespace ORM { #define CREATE_TABLE(name) namespace name { class RowBase4 : public RowBase3 { \ public: bool IsSignatureMatching(const RowBase4& row) const { return true -#define COLUMN_NOT_NULL(name, type, args...) && (this->m_##name##_set == row.m_##name##_set) -#define COLUMN(name, type, args...) && (this->m_##name##_set == row.m_##name##_set) +#define COLUMN_NOT_NULL(name, type, ...) && (this->m_##name##_set == row.m_##name##_set) +#define COLUMN(name, type, ...) && (this->m_##name##_set == row.m_##name##_set) #define CREATE_TABLE_END() ; } }; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -240,8 +241,8 @@ namespace ORM { #define CREATE_TABLE(name) namespace name { class RowBase5 : public RowBase4 { \ public: RowBase5() { -#define COLUMN_NOT_NULL(name, type, args...) m_##name##_set = false; -#define COLUMN(name, type, args...) m_##name##_set = false; +#define COLUMN_NOT_NULL(name, type, ...) m_##name##_set = false; +#define COLUMN(name, type, ...) m_##name##_set = false; #define CREATE_TABLE_END() } }; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -256,8 +257,8 @@ namespace ORM { #define CREATE_TABLE(name) namespace name { class Row : public RowBase5 { \ public: template \ void VisitColumns(Visitor& visitor) const { -#define COLUMN_NOT_NULL(name, type, args...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set); -#define COLUMN(name, type, args...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set); +#define COLUMN_NOT_NULL(name, type, ...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set); +#define COLUMN(name, type, ...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set); #define CREATE_TABLE_END() } }; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -269,9 +270,10 @@ namespace ORM { // Field structure declarations -#define CREATE_TABLE(name) namespace name { -#define COLUMN_NOT_NULL(name, type, args...) DECLARE_COLUMN(name, type) -#define COLUMN(name, type, args...) DECLARE_COLUMN(name, OPTIONAL(type)) +#define CREATE_TABLE(name) namespace name { \ + static const char* GetName() { return STRINGIFY(name); } +#define COLUMN_NOT_NULL(name, type, ...) DECLARE_COLUMN(name, type) +#define COLUMN(name, type, ...) DECLARE_COLUMN(name, OPTIONAL(type)) #define CREATE_TABLE_END() } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -284,8 +286,8 @@ namespace ORM { // ColumnList typedef #define CREATE_TABLE(name) namespace name { typedef DPL::TypeListDecl< -#define COLUMN_NOT_NULL(name, type, args...) name, -#define COLUMN(name, type, args...) name, +#define COLUMN_NOT_NULL(name, type, ...) name, +#define COLUMN(name, type, ...) name, #define CREATE_TABLE_END() DPL::TypeListGuard>::Type ColumnList; } #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -326,8 +328,8 @@ namespace ORM { }; \ } -#define COLUMN_NOT_NULL(name, type, args...) -#define COLUMN(name, type, args...) +#define COLUMN_NOT_NULL(name, type, ...) +#define COLUMN(name, type, ...) #define CREATE_TABLE_END() #include ORM_GENERATOR_DATABASE_NAME_LOCAL @@ -346,8 +348,8 @@ namespace ORM { typedef Delete Delete; \ typedef Update Update; \ } -#define COLUMN_NOT_NULL(name, type, args...) -#define COLUMN(name, type, args...) +#define COLUMN_NOT_NULL(name, type, ...) +#define COLUMN(name, type, ...) #define CREATE_TABLE_END() #include ORM_GENERATOR_DATABASE_NAME_LOCAL diff --git a/modules/db/include/dpl/db/orm_macros.h b/modules/db/include/dpl/db/orm_macros.h index 804f59a..c70a3b0 100644 --- a/modules/db/include/dpl/db/orm_macros.h +++ b/modules/db/include/dpl/db/orm_macros.h @@ -23,10 +23,10 @@ //Do not include this file directly! It is used only for SQL code generation. #define CREATE_TABLE(name) CREATE TABLE name ( -#define COLUMN(name, type, args...) name type args , -#define COLUMN_NOT_NULL(name, type, args...) name type args not null, -#define SQL(args...) args -#define TABLE_CONSTRAINTS(args...) args , +#define COLUMN(name, type, ...) name type __VA_ARGS__ , +#define COLUMN_NOT_NULL(name, type, ...) name type __VA_ARGS__ not null, +#define SQL(...) __VA_ARGS__ +#define TABLE_CONSTRAINTS(...) __VA_ARGS__ , #define CREATE_TABLE_END() CHECK(1) ); #define DATABASE_START(db_name) #define DATABASE_END() diff --git a/modules/db/include/dpl/db/sql_connection.h b/modules/db/include/dpl/db/sql_connection.h index 1d032ee..f1b3b62 100644 --- a/modules/db/include/dpl/db/sql_connection.h +++ b/modules/db/include/dpl/db/sql_connection.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -377,6 +377,17 @@ public: None = 1<<0, UseLucene = 1<<1 }; + + enum Option + { + RO = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READONLY, + /** + *TODO: please remove CREATE option from RW flag when all places + * that need that switched do CRW + */ + RW = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + CRW = RW | SQLITE_OPEN_CREATE + }; }; // RowID @@ -412,9 +423,10 @@ protected: int m_dataCommandsCount; // Synchronization object - ScopedPtr m_synchronizationObject; + std::unique_ptr m_synchronizationObject; - virtual void Connect(const std::string &address, Flag::Type = Flag::None); + virtual void Connect(const std::string &address, + Flag::Type = Flag::None, Flag::Option = Flag::RO); virtual void Disconnect(); void TurnOnForeignKeys(); @@ -436,6 +448,7 @@ public: */ explicit SqlConnection(const std::string &address = std::string(), Flag::Type flags = Flag::None, + Flag::Option options = Flag::RO, SynchronizationObject *synchronizationObject = AllocDefaultSynchronizationObject()); diff --git a/modules/db/include/dpl/db/thread_database_support.h b/modules/db/include/dpl/db/thread_database_support.h index 2f45f0f..d0e8cb2 100644 --- a/modules/db/include/dpl/db/thread_database_support.h +++ b/modules/db/include/dpl/db/thread_database_support.h @@ -149,7 +149,9 @@ class ThreadDatabaseSupport : { } - void AttachToThread() + void AttachToThread( + DPL::DB::SqlConnection::Flag::Option options = + DPL::DB::SqlConnection::Flag::RO) { Linger() = false; @@ -162,7 +164,7 @@ class ThreadDatabaseSupport : // Initialize SQL connection described in traits LogInfo("Attaching thread database connection: " << m_address); - Connection() = new DPL::DB::SqlConnection(m_address.c_str(), m_flags); + Connection() = new DPL::DB::SqlConnection(m_address.c_str(), m_flags, options); RefCounter() = 0; diff --git a/modules/db/src/naive_synchronization_object.cpp b/modules/db/src/naive_synchronization_object.cpp index 198a2b6..9078f8a 100644 --- a/modules/db/src/naive_synchronization_object.cpp +++ b/modules/db/src/naive_synchronization_object.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of SQL naive synchronization object */ +#include #include #include diff --git a/modules/db/src/orm.cpp b/modules/db/src/orm.cpp index 5c7c821..1d2f6b4 100644 --- a/modules/db/src/orm.cpp +++ b/modules/db/src/orm.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief Static definitions and function template specialziations of DPL-ORM. */ - +#include #include namespace DPL { @@ -32,6 +32,7 @@ const char LessThan[] = "<"; const char And[] = "AND"; const char Or[] = "OR"; const char Is[] = "IS"; +const char In[] = "IN"; } template<> @@ -99,4 +100,4 @@ void DataCommandUtils::BindArgument(DataCommand *command, } } -} \ No newline at end of file +} diff --git a/modules/db/src/sql_connection.cpp b/modules/db/src/sql_connection.cpp index 5a7fd4d..d1b44dd 100644 --- a/modules/db/src/sql_connection.cpp +++ b/modules/db/src/sql_connection.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of SQL connection */ +#include #include #include #include @@ -68,7 +69,7 @@ SqlConnection::DataCommand::DataCommand(SqlConnection *connection, Assert(connection != NULL); // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll(connection->m_synchronizationObject.Get()); + ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get()); for (;;) { @@ -323,7 +324,7 @@ bool SqlConnection::DataCommand::Step() { // Notify all after potentially synchronized database connection access ScopedNotifyAll notifyAll( - m_masterConnection->m_synchronizationObject.Get()); + m_masterConnection->m_synchronizationObject.get()); for (;;) { @@ -590,48 +591,41 @@ Optional SqlConnection::DataCommand::GetColumnOptionalString( return Optional(s); } -void SqlConnection::Connect(const std::string &address, Flag::Type flag) +void SqlConnection::Connect(const std::string &address, + Flag::Type type, + Flag::Option flag) { - if (m_connection != NULL) - { + if (m_connection != NULL) { LogPedantic("Already connected."); return; } - LogPedantic("Connecting to DB: " << address << "..."); // Connect to database int result; - - if (flag & Flag::UseLucene) - { + if (type & Flag::UseLucene) { result = db_util_open_with_options( address.c_str(), &m_connection, - SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + flag, NULL); m_usingLucene = true; LogPedantic("Lucene index enabled"); - } - else - { + } else { result = sqlite3_open_v2( address.c_str(), &m_connection, - SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + flag, NULL); m_usingLucene = false; LogPedantic("Lucene index disabled"); } - if (result == SQLITE_OK) - { + if (result == SQLITE_OK) { LogPedantic("Connected to DB"); - } - else - { + } else { LogPedantic("Failed to connect to DB!"); ThrowMsg(Exception::ConnectionBroken, address); } @@ -703,6 +697,7 @@ bool SqlConnection::CheckTableExist(const char *tableName) SqlConnection::SqlConnection(const std::string &address, Flag::Type flag, + Flag::Option option, SynchronizationObject *synchronizationObject) : m_connection(NULL), m_usingLucene(false), @@ -712,7 +707,7 @@ SqlConnection::SqlConnection(const std::string &address, LogPedantic("Opening database connection to: " << address); // Connect to DB - SqlConnection::Connect(address, flag); + SqlConnection::Connect(address, flag, option); if (!m_synchronizationObject) { @@ -743,6 +738,12 @@ void SqlConnection::ExecCommand(const char *format, ...) return; } + if (format == NULL) + { + LogPedantic("Null query!"); + ThrowMsg(Exception::SyntaxError, "Null statement"); + } + char *rawBuffer; va_list args; @@ -764,7 +765,7 @@ void SqlConnection::ExecCommand(const char *format, ...) LogPedantic("Executing SQL command: " << buffer.Get()); // Notify all after potentially synchronized database connection access - ScopedNotifyAll notifyAll(m_synchronizationObject.Get()); + ScopedNotifyAll notifyAll(m_synchronizationObject.get()); for (;;) { diff --git a/modules/db/src/thread_database_support.cpp b/modules/db/src/thread_database_support.cpp index 5b7865c..101640f 100644 --- a/modules/db/src/thread_database_support.cpp +++ b/modules/db/src/thread_database_support.cpp @@ -19,5 +19,5 @@ * @version 1.0 * @brief This file contains the definition of thread database support */ - +#include #include \ No newline at end of file diff --git a/modules/dbus/include/dpl/dbus/connection.h b/modules/dbus/include/dpl/dbus/connection.h index 886038c..49e8197 100644 --- a/modules/dbus/include/dpl/dbus/connection.h +++ b/modules/dbus/include/dpl/dbus/connection.h @@ -172,9 +172,9 @@ private: struct ObjectRegistration { - ObjectRegistration(guint registrationId, const ObjectPtr& object) - : registrationId(registrationId), - object(object) + ObjectRegistration(guint _registrationId, const ObjectPtr& _object) + : registrationId(_registrationId), + object(_object) { } diff --git a/modules/dbus/src/connection.cpp b/modules/dbus/src/connection.cpp index e50faa8..c9b7f8e 100644 --- a/modules/dbus/src/connection.cpp +++ b/modules/dbus/src/connection.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief */ - +#include #include #include #include diff --git a/modules/dbus/src/dispatcher.cpp b/modules/dbus/src/dispatcher.cpp index ca1bbab..5411f35 100644 --- a/modules/dbus/src/dispatcher.cpp +++ b/modules/dbus/src/dispatcher.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief */ - +#include #include namespace DPL diff --git a/modules/dbus/src/interface.cpp b/modules/dbus/src/interface.cpp index 248ac6d..b151a75 100644 --- a/modules/dbus/src/interface.cpp +++ b/modules/dbus/src/interface.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief */ +#include #include #include #include diff --git a/modules/dbus/src/object.cpp b/modules/dbus/src/object.cpp index 1c46018..02781a7 100644 --- a/modules/dbus/src/object.cpp +++ b/modules/dbus/src/object.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief */ - +#include #include namespace DPL { diff --git a/modules/dbus/src/object_proxy.cpp b/modules/dbus/src/object_proxy.cpp index 22275a1..dcabb33 100644 --- a/modules/dbus/src/object_proxy.cpp +++ b/modules/dbus/src/object_proxy.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief */ - +#include #include namespace DPL { diff --git a/modules/dbus/src/server.cpp b/modules/dbus/src/server.cpp index 08292f5..1f84ce6 100644 --- a/modules/dbus/src/server.cpp +++ b/modules/dbus/src/server.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief */ - +#include #include #include #include @@ -117,4 +117,4 @@ gboolean Server::onNewConnection(GDBusServer* /*server*/, } } -} \ No newline at end of file +} diff --git a/modules/encryption/config.cmake b/modules/encryption/config.cmake new file mode 100644 index 0000000..5188ecb --- /dev/null +++ b/modules/encryption/config.cmake @@ -0,0 +1,38 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# @file config.cmake +# @author Soyoung Kim(sy037.kim@samsung.com) +# @version 1.0 +# @brief +# + +SET(DPL_ENCRYPTION_SOURCES + ${PROJECT_SOURCE_DIR}/modules/encryption/src/resource_encryption.cpp + ${PROJECT_SOURCE_DIR}/modules/encryption/src/resource_decryption.cpp + PARENT_SCOPE +) + + +SET(DPL_ENCRYPTION_HEADERS + ${PROJECT_SOURCE_DIR}/modules/encryption/include/dpl/encryption/resource_encryption.h + ${PROJECT_SOURCE_DIR}/modules/encryption/include/dpl/encryption/resource_decryption.h + PARENT_SCOPE +) + +SET(DPL_ENCRYPTION_INCLUDE_DIR + ${PROJECT_SOURCE_DIR}/modules/encryption/include + PARENT_SCOPE +) diff --git a/modules/encryption/include/dpl/encryption/resource_decryption.h b/modules/encryption/include/dpl/encryption/resource_decryption.h new file mode 100644 index 0000000..2a39eb1 --- /dev/null +++ b/modules/encryption/include/dpl/encryption/resource_decryption.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 resource_decryption.h + * @author Soyoung Kim (sy037.kim@samsung.com) + * @version 1.0 + * @brief Header file for resource decryption + */ +#ifndef RESOURCE_DECRYPTION_H +#define RESOURCE_DECRYPTION_H + +#include +#include +#include +#include +#include + +extern char** calculate(char*pappId, int idLen, int keyLen); + +namespace WRTDecryptor{ +class ResourceDecryptor +{ + public: + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, GetDecKeyFailed) + DECLARE_EXCEPTION_TYPE(Base, EncryptionFailed) + }; + + ResourceDecryptor(); + ResourceDecryptor(std::string userKey); + virtual ~ResourceDecryptor(); + + void SetDecryptionKey(std::string userKey); + void GetDecryptedChunk(unsigned char* inBuf, unsigned char* decBuf, size_t chunkSize); + + private: + AES_KEY* GetDecryptionKey(); + AES_KEY m_decKey; + +}; +} //namespace WRTDecryptor + +#endif /* RESOURCE_DECRYPTION_H */ diff --git a/modules/encryption/include/dpl/encryption/resource_encryption.h b/modules/encryption/include/dpl/encryption/resource_encryption.h new file mode 100644 index 0000000..6f57a93 --- /dev/null +++ b/modules/encryption/include/dpl/encryption/resource_encryption.h @@ -0,0 +1,62 @@ +/* + * 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 resource_encryption.h + * @author Soyoung Kim (sy037.kim@samsung.com) + * @version 1.0 + * @brief Header file for resource encryption + */ +#ifndef RESOURCE_ENCRYPTION_H +#define RESOURCE_ENCRYPTION_H + +#include +#include +#include +#include +#include + +extern char** calculate(char*pappId, int idLen, int keyLen); + +namespace WRTEncryptor{ +class ResourceEncryptor +{ + public: + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(DPL::Exception, CreateEncKeyFailed) + DECLARE_EXCEPTION_TYPE(DPL::Exception, CreateDecKeyFailed) + DECLARE_EXCEPTION_TYPE(DPL::Exception, CreateEncKeyFileFailed) + DECLARE_EXCEPTION_TYPE(DPL::Exception, CreateDecKeyFileFailed) + DECLARE_EXCEPTION_TYPE(DPL::Exception, EncryptionFailed) + }; + + ResourceEncryptor(); + virtual ~ResourceEncryptor(); + + int GetBlockSize(int inSize); + void CreateEncryptionKey(std::string userKey); + void EncryptChunk(unsigned char* inputBuf, unsigned char* encBuf, size_t + chunkSize); + + private: + AES_KEY GetEncryptionkey(); + AES_KEY m_encKey; +}; +} //namespace WRTEncryptor + +#endif /* RESOURCE_DECRYPTION_H */ diff --git a/modules/encryption/src/resource_decryption.cpp b/modules/encryption/src/resource_decryption.cpp new file mode 100644 index 0000000..9e8b39f --- /dev/null +++ b/modules/encryption/src/resource_decryption.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file resource_decryption.cpp + * @author Soyoung Kim (sy037.kim@samsung.com) + * @version 1.0 + * @brief Implementation file for resource decryption + */ +#include +#include + +#include +#include +#include +#include + +namespace { +#define BITS_SIZE 128 +#define KEY_SIZE 16 +} +namespace WRTDecryptor{ +ResourceDecryptor::ResourceDecryptor() +{ + LogDebug("Started Decryption"); +} + +ResourceDecryptor::ResourceDecryptor(std::string userKey) +{ + LogDebug("Finished Decryption"); + SetDecryptionKey(userKey); +} + +ResourceDecryptor::~ResourceDecryptor() +{ +} + +void ResourceDecryptor::SetDecryptionKey(std::string userKey) +{ + if (userKey.empty()) { + return; + } + + char **duk = calculate(const_cast(userKey.c_str()), userKey.size(), KEY_SIZE); + unsigned char *key = reinterpret_cast(*duk); + + if ( 0 > AES_set_decrypt_key(key, BITS_SIZE, &m_decKey)) { + ThrowMsg(ResourceDecryptor::Exception::GetDecKeyFailed, + "Failed to create decryption key"); + } +} + +AES_KEY* ResourceDecryptor::GetDecryptionKey() +{ + return &m_decKey; +} + +void ResourceDecryptor::GetDecryptedChunk(unsigned char* + inBuf, unsigned char* decBuf, size_t inBufSize) +{ + Assert(decBuf); + if (decBuf == NULL) { + ThrowMsg(ResourceDecryptor::Exception::EncryptionFailed, + "Failed to Get Decryption Chunk"); + } + unsigned char ivec[16] = {0, }; + + AES_cbc_encrypt(inBuf, decBuf, inBufSize, &m_decKey, ivec, AES_DECRYPT); + LogDebug("Success decryption"); +} + +} //namespace WRTDecryptor diff --git a/modules/encryption/src/resource_encryption.cpp b/modules/encryption/src/resource_encryption.cpp new file mode 100644 index 0000000..a238705 --- /dev/null +++ b/modules/encryption/src/resource_encryption.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file resource_encryption.cpp + * @author Soyoung Kim (sy037.kim@samsung.com) + * @version 1.0 + * @brief Implementation file for resource encryption + */ +#include +#include + +#include +#include + +namespace { +#define BITS_SIZE 128 +#define KEY_SIZE 16 +} +namespace WRTEncryptor{ +ResourceEncryptor::ResourceEncryptor() +{ + LogDebug("Started Encrytion"); +} + +ResourceEncryptor::~ResourceEncryptor() +{ + LogDebug("Finished Encrytion"); +} + +int ResourceEncryptor::GetBlockSize(int inSize) +{ + if ((inSize % AES_BLOCK_SIZE) != 0) { + return (( inSize/ AES_BLOCK_SIZE) +1) * AES_BLOCK_SIZE; + } + return inSize; +} + +void ResourceEncryptor::CreateEncryptionKey(std::string userKey) +{ + if (userKey.empty()) { + return; + } + + char **duk = calculate(const_cast(userKey.c_str()), userKey.size(), KEY_SIZE); + unsigned char *key = reinterpret_cast(*duk); + + if ( 0 > AES_set_encrypt_key(key, BITS_SIZE, &m_encKey)) { + ThrowMsg(ResourceEncryptor::Exception::CreateEncKeyFailed, + "Failed to create encryption key"); + } + LogDebug("Success to create ecryption and decryption key"); +} + +AES_KEY ResourceEncryptor::GetEncryptionkey() +{ + return m_encKey; +} + +void ResourceEncryptor::EncryptChunk(unsigned char* + inputBuf, unsigned char* encBuf, size_t chunkSize) +{ + Assert(inputBuf); + Assert(encBuf); + + unsigned char ivec[16] = {0, }; + + AES_cbc_encrypt(inputBuf, encBuf, chunkSize, &m_encKey, ivec, AES_ENCRYPT); +} +} //namespace ResourceEnc diff --git a/modules/event/config.cmake b/modules/event/config.cmake index 07831f0..313b6a8 100644 --- a/modules/event/config.cmake +++ b/modules/event/config.cmake @@ -23,15 +23,12 @@ SET(DPL_EVENT_SOURCES ${PROJECT_SOURCE_DIR}/modules/event/src/abstract_event_call.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/abstract_event_dispatcher.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/controller.cpp - ${PROJECT_SOURCE_DIR}/modules/event/src/event_delivery.cpp - ${PROJECT_SOURCE_DIR}/modules/event/src/event_delivery_detail.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/event_listener.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/event_support.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/generic_event_call.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/main_event_dispatcher.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/thread_event_dispatcher.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/inter_context_delegate.cpp - ${PROJECT_SOURCE_DIR}/modules/event/src/nested_loop.cpp ${PROJECT_SOURCE_DIR}/modules/event/src/model.cpp PARENT_SCOPE ) @@ -40,16 +37,11 @@ SET(DPL_EVENT_HEADERS ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/abstract_event_call.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/abstract_event_dispatcher.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/controller.h - ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/event_delivery_detail.h - ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/event_delivery.h - ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/event_delivery_injector.h - ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/event_delivery_messages.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/event_listener.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/event_support.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/generic_event_call.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/main_event_dispatcher.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/thread_event_dispatcher.h - ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/nested_loop.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/inter_context_delegate.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/model.h ${PROJECT_SOURCE_DIR}/modules/event/include/dpl/event/property.h diff --git a/modules/event/include/dpl/event/event_support.h b/modules/event/include/dpl/event/event_support.h index 3aaab81..2e8cfb2 100644 --- a/modules/event/include/dpl/event/event_support.h +++ b/modules/event/include/dpl/event/event_support.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -364,7 +364,7 @@ protected: double dueTime = 0.0) { // Emit event, and retrieve later in current context to dispatch - ScopedPtr lock( + std::unique_ptr lock( new Mutex::ScopedLock(&m_listenerDelegateMutex)); // Show some info @@ -583,7 +583,7 @@ protected: if (!synchronizationBarrier.empty()) { LogPedantic("Leaving lock due to existing barrier"); - lock.Reset(); + lock.reset(); } LogPedantic("Size of barrier: " << synchronizationBarrier.size()); diff --git a/modules/event/include/dpl/event/inter_context_delegate.h b/modules/event/include/dpl/event/inter_context_delegate.h index 55af651..78efd5f 100644 --- a/modules/event/include/dpl/event/inter_context_delegate.h +++ b/modules/event/include/dpl/event/inter_context_delegate.h @@ -31,8 +31,6 @@ #include #include #include -#include -#include #include #include #include @@ -43,6 +41,7 @@ #include #include #include +#include /* * - Created ICDelegate can be passed freely to other threads. @@ -88,7 +87,7 @@ namespace ICDPrivate { class ICDSharedDataBase { public: - typedef DPL::SharedPtr ICDSharedDataBasePtr; + typedef std::shared_ptr ICDSharedDataBasePtr; typedef std::list ICDSharedDataBaseList; class ScopedLock : DPL::Noncopyable @@ -146,7 +145,7 @@ class DeleteICDSharedDataBaseEventCall : public DPL::Event::AbstractEventCall } virtual void Call() { - m_helperBase.Reset(); + m_helperBase.reset(); } private: @@ -194,7 +193,7 @@ class ICDelegate ICD::Reuse reuse) { ICDSharedData* hlp = new ICDSharedData(base, outerDelegate, reuse); - m_helper.Reset(hlp); + m_helper.reset(hlp); } // Calling operator will pass all args passed to it to correct context and @@ -203,7 +202,7 @@ class ICDelegate { Assert(m_helper); ICDPrivate::ICDSharedDataBase::ScopedLock lock( - DPL::StaticPointerCast(m_helper)); + std::static_pointer_cast(m_helper)); m_helper->CallDelegate(args ...); } @@ -212,7 +211,7 @@ class ICDelegate { Assert(m_helper); ICDPrivate::ICDSharedDataBase::ScopedLock lock( - DPL::StaticPointerCast(m_helper)); + std::static_pointer_cast(m_helper)); m_helper->disable(); } @@ -220,14 +219,14 @@ class ICDelegate ICDPrivate::ICDSharedDataBase::ICDSharedDataBasePtr getRelatedICDSharedData() const { - return DPL::StaticPointerCast(m_helper); + return std::static_pointer_cast(m_helper); } private: template friend class ICDelegateSupport; class ICDSharedData; - typedef DPL::SharedPtr ICDSharedDataPtr; + typedef std::shared_ptr ICDSharedDataPtr; struct PrivateEvent { @@ -245,7 +244,7 @@ class ICDelegate typedef DPL::FastDelegate ICDSharedDataDelegateType; class ICDSharedData : private DPL::Event::EventSupport, - private DPL::EnableSharedFromThis, + public std::enable_shared_from_this, public ICDPrivate::ICDSharedDataBase { public: @@ -268,10 +267,10 @@ class ICDelegate void CallDelegate(ArgTypesList ... args) { ICDPrivate::ICDSharedDataBase::ScopedLock lock( - DPL::StaticPointerCast( - this->SharedFromThis())); + std::static_pointer_cast( + this->shared_from_this())); if (!isDisabled()) { - EmitEvent(PrivateEvent(this->SharedFromThis(), + EmitEvent(PrivateEvent(this->shared_from_this(), args ...)); } } @@ -279,8 +278,8 @@ class ICDelegate virtual void disable() { ICDPrivate::ICDSharedDataBase::ICDSharedDataBasePtr ptr( - DPL::StaticPointerCast( - this->SharedFromThis())); + std::static_pointer_cast( + this->shared_from_this())); ICDPrivate::ICDSharedDataBase::ScopedLock lock(ptr); if (!isDisabled()) { ICDPrivate::ICDSharedDataBase::disable(); @@ -290,7 +289,7 @@ class ICDelegate } private: - friend class DPL::SharedPtr; + friend class std::shared_ptr; ICDSharedDataDelegateType m_subDelegate; ICDPrivate::ICDelegateSupportInterface* m_base; DPL::FastDelegate m_outerDelegate; @@ -299,7 +298,7 @@ class ICDelegate void delegateForwarder(const PrivateEvent& event) { ICDPrivate::ICDSharedDataBase::ICDSharedDataBasePtr ptr( - DPL::StaticPointerCast(event.helper)); + std::static_pointer_cast(event.helper)); ICDPrivate::ICDSharedDataBase::ScopedLock lock(ptr); Assert(!m_outerDelegate.empty()); @@ -364,7 +363,7 @@ class ICDelegateSupport : public ICDPrivate::ICDelegateSupportInterface m_ICDSharedDatas; FOREACH(helper, list) { ICDPrivate::ICDSharedDataBase::ScopedLock lock( - DPL::StaticPointerCast(*helper)); + std::static_pointer_cast(*helper)); (*helper)->disable(); } m_ICDSharedDatas.clear(); diff --git a/modules/event/include/dpl/event/main_event_dispatcher.h b/modules/event/include/dpl/event/main_event_dispatcher.h index 97145f6..7bfabad 100644 --- a/modules/event/include/dpl/event/main_event_dispatcher.h +++ b/modules/event/include/dpl/event/main_event_dispatcher.h @@ -71,7 +71,7 @@ protected: // Cross thread send support WrappedEventCallList m_wrappedCrossEventCallList; Mutex m_crossEventCallMutex; - WaitableEvent m_crossEventCallInvoker; + WaitableEvent* m_crossEventCallInvoker; Ecore_Event_Handler *m_eventCallHandler; Ecore_Fd_Handler *m_crossEventCallHandler; @@ -110,6 +110,7 @@ public: virtual void AddEventCall(AbstractEventCall *abstractEventCall); virtual void AddTimedEventCall(AbstractEventCall *abstractEventCall, double dueTime); + virtual void ResetCrossEventCallHandler(); }; MainEventDispatcher& GetMainEventDispatcherInstance(); diff --git a/modules/event/include/dpl/event/property.h b/modules/event/include/dpl/event/property.h index 33da4df..7c87e50 100644 --- a/modules/event/include/dpl/event/property.h +++ b/modules/event/include/dpl/event/property.h @@ -514,6 +514,14 @@ public: EmitEvent(PropertyEvent(value, this->m_model), EmitMode::Auto); } + + void SetWithoutLock(const Type &value) + { + if (this->m_storage.Get() == value) + return; + + this->m_storage.Set(value); + } }; } diff --git a/modules/event/src/abstract_event_call.cpp b/modules/event/src/abstract_event_call.cpp index 093e5b5..2bd0d11 100644 --- a/modules/event/src/abstract_event_call.cpp +++ b/modules/event/src/abstract_event_call.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract event call */ +#include #include namespace DPL diff --git a/modules/event/src/abstract_event_dispatcher.cpp b/modules/event/src/abstract_event_dispatcher.cpp index 043e452..a3e6317 100644 --- a/modules/event/src/abstract_event_dispatcher.cpp +++ b/modules/event/src/abstract_event_dispatcher.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract event dispatcher */ +#include #include namespace DPL diff --git a/modules/event/src/controller.cpp b/modules/event/src/controller.cpp index abb126e..337a39f 100644 --- a/modules/event/src/controller.cpp +++ b/modules/event/src/controller.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of MVC controller */ +#include #include // diff --git a/modules/event/src/event_listener.cpp b/modules/event/src/event_listener.cpp index a90973c..5d0d382 100644 --- a/modules/event/src/event_listener.cpp +++ b/modules/event/src/event_listener.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of MVC event listener */ +#include #include // diff --git a/modules/event/src/event_support.cpp b/modules/event/src/event_support.cpp index 641b311..73cdea3 100644 --- a/modules/event/src/event_support.cpp +++ b/modules/event/src/event_support.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of MVC event support */ +#include #include namespace DPL diff --git a/modules/event/src/generic_event_call.cpp b/modules/event/src/generic_event_call.cpp index 2ad49b8..d0d6886 100644 --- a/modules/event/src/generic_event_call.cpp +++ b/modules/event/src/generic_event_call.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of generic event call */ +#include #include // diff --git a/modules/event/src/inter_context_delegate.cpp b/modules/event/src/inter_context_delegate.cpp index e1dfc52..07e3885 100644 --- a/modules/event/src/inter_context_delegate.cpp +++ b/modules/event/src/inter_context_delegate.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of ICDelegate functionality */ +#include #include // diff --git a/modules/event/src/main_event_dispatcher.cpp b/modules/event/src/main_event_dispatcher.cpp index dc2de85..ae1107d 100644 --- a/modules/event/src/main_event_dispatcher.cpp +++ b/modules/event/src/main_event_dispatcher.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of main event dispatcher for EFL */ +#include #include #include #include @@ -63,8 +64,11 @@ MainEventDispatcher::MainEventDispatcher() if ((m_eventCallHandler = ecore_event_handler_add(m_eventId, &StaticDispatchEvent, this)) == NULL) ThrowMsg(Exception::CreateFailed, "Failed to register event handler!"); + // Allocate WaitableEvent + m_crossEventCallInvoker = new WaitableEvent(); + // Register cross event handler - m_crossEventCallHandler = ecore_main_fd_handler_add(m_crossEventCallInvoker.GetHandle(), ECORE_FD_READ, &StaticDispatchCrossInvoker, this, NULL, NULL); + m_crossEventCallHandler = ecore_main_fd_handler_add(m_crossEventCallInvoker->GetHandle(), ECORE_FD_READ, &StaticDispatchCrossInvoker, this, NULL, NULL); if (m_crossEventCallHandler == NULL) ThrowMsg(Exception::CreateFailed, "Failed to register cross event handler!"); @@ -74,16 +78,19 @@ MainEventDispatcher::MainEventDispatcher() MainEventDispatcher::~MainEventDispatcher() { - // Remove event class handler - ecore_event_handler_del(m_eventCallHandler); - m_eventCallHandler = NULL; - // Remove cross event handler ecore_main_fd_handler_del(m_crossEventCallHandler); m_crossEventCallHandler = NULL; - LogPedantic("ECORE cross-event handler unregistered"); + // Remove m_crossEventCallInvoker + delete m_crossEventCallInvoker; + m_crossEventCallInvoker = NULL; + + // Remove event class handler + ecore_event_handler_del(m_eventCallHandler); + m_eventCallHandler = NULL; + // Decrement ECORE init count // We do not need ecore routines any more ecore_shutdown(); @@ -93,6 +100,33 @@ MainEventDispatcher::~MainEventDispatcher() g_lateMainEventDispatcher = NULL; } +void MainEventDispatcher::ResetCrossEventCallHandler() +{ + // Remove cross event handler + ecore_main_fd_handler_del(m_crossEventCallHandler); + m_crossEventCallHandler = NULL; + LogPedantic("ECORE cross-event handler unregistered"); + + // Re-allocate WaitableEvent + delete m_crossEventCallInvoker; + m_crossEventCallInvoker = new WaitableEvent(); + + // Register cross event handler + m_crossEventCallHandler = + ecore_main_fd_handler_add(m_crossEventCallInvoker->GetHandle(), + ECORE_FD_READ, + &StaticDispatchCrossInvoker, + this, + NULL, + NULL); + + if (m_crossEventCallHandler == NULL) { + ThrowMsg(Exception::CreateFailed, "Failed to register cross event handler!"); + } + + LogPedantic("ECORE cross-event handler re-registered"); +} + void MainEventDispatcher::StaticDeleteEvent(void *data, void *event) { LogPedantic("Static ECORE delete event handler"); @@ -225,7 +259,7 @@ void MainEventDispatcher::DispatchCrossInvoker() // Critical section { - m_crossEventCallInvoker.Reset(); + m_crossEventCallInvoker->Reset(); Mutex::ScopedLock lock(&m_crossEventCallMutex); m_wrappedCrossEventCallList.swap(stolenCrossEvents); } @@ -260,7 +294,7 @@ void MainEventDispatcher::AddEventCall(AbstractEventCall *abstractEventCall) { Mutex::ScopedLock lock(&m_crossEventCallMutex); m_wrappedCrossEventCallList.push_back(WrappedEventCall(abstractEventCall, false, 0.0)); - m_crossEventCallInvoker.Signal(); + m_crossEventCallInvoker->Signal(); } LogPedantic("Event pushed to cross-thread event list"); @@ -282,7 +316,7 @@ void MainEventDispatcher::AddTimedEventCall(AbstractEventCall *abstractEventCall { Mutex::ScopedLock lock(&m_crossEventCallMutex); m_wrappedCrossEventCallList.push_back(WrappedEventCall(abstractEventCall, true, dueTime)); - m_crossEventCallInvoker.Signal(); + m_crossEventCallInvoker->Signal(); } LogPedantic("Event pushed to cross-thread event list"); diff --git a/modules/event/src/model.cpp b/modules/event/src/model.cpp index a2e951d..4f6f86e 100644 --- a/modules/event/src/model.cpp +++ b/modules/event/src/model.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of model */ +#include #include namespace DPL diff --git a/modules/event/src/thread_event_dispatcher.cpp b/modules/event/src/thread_event_dispatcher.cpp index fa155bc..31aee44 100644 --- a/modules/event/src/thread_event_dispatcher.cpp +++ b/modules/event/src/thread_event_dispatcher.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of thread event dispatcher */ +#include #include #include #include diff --git a/modules/localization/config.cmake b/modules/localization/config.cmake index 5f52e6f..80f77c4 100644 --- a/modules/localization/config.cmake +++ b/modules/localization/config.cmake @@ -20,8 +20,8 @@ # SET(DPL_LOCALIZATION_SOURCES - ${PROJECT_SOURCE_DIR}/modules/localization/src/localization_utils.cpp ${PROJECT_SOURCE_DIR}/modules/localization/src/w3c_file_localization.cpp + ${PROJECT_SOURCE_DIR}/modules/localization/src/LanguageTagsProvider.cpp PARENT_SCOPE ) @@ -29,6 +29,7 @@ SET(DPL_LOCALIZATION_SOURCES SET(DPL_LOCALIZATION_HEADERS ${PROJECT_SOURCE_DIR}/modules/localization/include/dpl/localization/localization_utils.h ${PROJECT_SOURCE_DIR}/modules/localization/include/dpl/localization/w3c_file_localization.h + ${PROJECT_SOURCE_DIR}/modules/localization/include/LanguageTagsProvider.h PARENT_SCOPE ) diff --git a/modules/localization/include/LanguageTagsProvider.h b/modules/localization/include/LanguageTagsProvider.h new file mode 100644 index 0000000..bb3e48c --- /dev/null +++ b/modules/localization/include/LanguageTagsProvider.h @@ -0,0 +1,91 @@ +/* + * 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 LanguageTagsProvider.h + * @author Marcin Kaminski (marcin.ka@samsung.com) + * @version 1.0 + */ + +#ifndef LANGUAGETAGSPROVIDER_H +#define LANGUAGETAGSPROVIDER_H + +#include +#include +#include +#include + +typedef std::list LanguageTags; + +class LanguageTagsProvider { + +public: + /* + * Get list of currently set language tags + */ + const LanguageTags getLanguageTags() const; + + /* + * Set new language tags (other than based on system locales) + */ + void setLanguageTags(const LanguageTags& taglist ); + + /* + * Set language tags from given locales. + * Supported format is: xx[-yy[-zz]][.encoding] + */ + void setLanguageTagsFromLocales(const char* locales); + + /* + * Set language tags based on system language settings + */ + void resetLanguageTags(); + + /* + * Adds default widget locales to language tags if + * it doesn't exist within actual tags. + * Default locales i added: + * - at the beginning if less then 2 tags exists on list + * - just before empty ("") locales - pre-last position + * - at the end if last position is not empty locale + */ + void addWidgetDefaultLocales(const DPL::String&); + + /* + * Function converts language tag string (i.e. en-US) + * into locales string (en_US). + */ + static DPL::String BCP47LanguageTagToLocale(const DPL::String&); + + /* + * Function converts locales string (i.e. en_US.UTF-8) into language tag (i.e. en-US) + */ + static DPL::String LocaleToBCP47LanguageTag(const DPL::String&); + +private: + friend class DPL::Singleton; + + LanguageTags m_languageTagsList; + + LanguageTagsProvider(); + virtual ~LanguageTagsProvider(); + + void loadSystemTags(); + void createTagsFromLocales(const char* language); +}; + +typedef DPL::Singleton LanguageTagsProviderSingleton; + +#endif /* LANGUAGETAGSPROVIDER_H */ diff --git a/modules/localization/include/dpl/localization/localization_utils.h b/modules/localization/include/dpl/localization/localization_utils.h index 6779fd5..f971f93 100644 --- a/modules/localization/include/dpl/localization/localization_utils.h +++ b/modules/localization/include/dpl/localization/localization_utils.h @@ -73,18 +73,6 @@ struct WidgetStartFileInfo }; typedef DPL::Optional OptionalWidgetIcon; -typedef std::list LanguageTagsList; typedef DPL::Optional OptionalWidgetStartFileInfo; -namespace LocalizationUtils { -DPL::String BCP47LanguageTagToLocale(const DPL::String&); -DPL::String LocaleToBCP47LanguageTag(const DPL::String&); - -void SetUserLanguageTags(const LanguageTagsList& tags); -void SetSystemLanguageTags(const LanguageTagsList& tags); -LanguageTagsList GetUserAgentLanguageTags(); - -void Initialize(); -} - #endif //LOCALIZATION_UTILS_H diff --git a/modules/localization/include/dpl/localization/w3c_file_localization.h b/modules/localization/include/dpl/localization/w3c_file_localization.h index d52bd6c..e0e5737 100644 --- a/modules/localization/include/dpl/localization/w3c_file_localization.h +++ b/modules/localization/include/dpl/localization/w3c_file_localization.h @@ -22,7 +22,7 @@ #ifndef W3C_FILE_LOCALIZATION_H #define W3C_FILE_LOCALIZATION_H -#include +#include #include #include #include @@ -37,24 +37,49 @@ typedef std::list WidgetIconList; DPL::Optional getFilePathInWidgetPackageFromUrl( WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagsList &languageTags, + const DPL::String &url); +DPL::Optional getFilePathInWidgetPackageFromUrl( + const WrtDB::WidgetPkgName &pkgname, + const DPL::String &url); +DPL::Optional getFilePathInWidgetPackageFromUrl( + WrtDB::WidgetDAOReadOnlyPtr dao, const DPL::String &url); DPL::Optional getFilePathInWidgetPackage( WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagsList &languageTags, const DPL::String& file); +DPL::Optional getFilePathInWidgetPackage( + const WrtDB::WidgetPkgName &pkgname, + const DPL::String& file); +DPL::Optional getFilePathInWidgetPackage( + WrtDB::WidgetDAOReadOnlyPtr dao, + const DPL::String& file); + +DPL::OptionalString getStartFile(WrtDB::DbWidgetHandle handle); +DPL::OptionalString getStartFile(const WrtDB::WidgetPkgName & pkgname); +DPL::OptionalString getStartFile(WrtDB::WidgetDAOReadOnlyPtr dao); -DPL::OptionalString getStartFile(WrtDB::DbWidgetHandle widgetHandle); OptionalWidgetIcon getIcon(WrtDB::DbWidgetHandle widgetHandle); +OptionalWidgetIcon getIcon(const WrtDB::WidgetPkgName & pkgname); +OptionalWidgetIcon getIcon(WrtDB::WidgetDAOReadOnlyPtr dao); + WidgetIconList getValidIconsList( - WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagsList &languageTags); + WrtDB::DbWidgetHandle widgetHandle); +WidgetIconList getValidIconsList( + const WrtDB::WidgetPkgName &pkgname); +WidgetIconList getValidIconsList( + WrtDB::WidgetDAOReadOnlyPtr dao); OptionalWidgetStartFileInfo getStartFileInfo( - WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagsList &tagsList); + WrtDB::DbWidgetHandle widgetHandle); +OptionalWidgetStartFileInfo getStartFileInfo( + const WrtDB::WidgetPkgName &pkgname); +OptionalWidgetStartFileInfo getStartFileInfo( + WrtDB::WidgetDAOReadOnlyPtr dao); + WrtDB::WidgetLocalizedInfo getLocalizedInfo(WrtDB::DbWidgetHandle widgetHandle); +WrtDB::WidgetLocalizedInfo getLocalizedInfo(const WrtDB::WidgetPkgName & pkgname); +WrtDB::WidgetLocalizedInfo getLocalizedInfo(WrtDB::WidgetDAOReadOnlyPtr dao); } #endif //W3C_FILE_LOCALIZATION_H diff --git a/modules/localization/src/LanguageTagsProvider.cpp b/modules/localization/src/LanguageTagsProvider.cpp new file mode 100644 index 0000000..576d06a --- /dev/null +++ b/modules/localization/src/LanguageTagsProvider.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file LanguageTagsProvider.cpp + * @author Marcin Kaminski (marcin.ka@samsung.com) + * @version 1.0 + */ +#include +#include "LanguageTagsProvider.h" + +#include +#include +#include +#include +#include +#include +IMPLEMENT_SINGLETON(LanguageTagsProvider) + +/* ========== public ========== */ +const LanguageTags LanguageTagsProvider::getLanguageTags() const +{ + return m_languageTagsList; +} + +void LanguageTagsProvider::setLanguageTags(const LanguageTags& taglist) +{ + m_languageTagsList = taglist; + /* If given list does not contain default value (empty string) + * than append it to the list. + * In case of empty list given as parameter only default value + * will exist on m_languageTagsList. */ + DPL::String tofind = L""; + if(std::find(m_languageTagsList.begin(), m_languageTagsList.end(), + tofind) == m_languageTagsList.end()) { + m_languageTagsList.push_back(L""); + } +} + +void LanguageTagsProvider::setLanguageTagsFromLocales(const char* locales) +{ + LogDebug("Setting new language tags for locales " << locales); + this->createTagsFromLocales(locales); +} + +void LanguageTagsProvider::resetLanguageTags() +{ + this->loadSystemTags(); +} + +void LanguageTagsProvider::addWidgetDefaultLocales(const DPL::String& defaultLocale){ + if (defaultLocale.size() > 0 && + std::find(m_languageTagsList.begin(), m_languageTagsList.end(), defaultLocale) == m_languageTagsList.end()) + { + if (m_languageTagsList.size() < 2) { + m_languageTagsList.push_front(defaultLocale); + } else { + LanguageTags::iterator placeToInsert = m_languageTagsList.end(); + --placeToInsert; + if (*placeToInsert != L"") + { + ++placeToInsert; + } + m_languageTagsList.insert(placeToInsert, defaultLocale); + } + } +} + +DPL::String LanguageTagsProvider::BCP47LanguageTagToLocale(const DPL::String& inLanguageTag) +{ + DPL::String languageTag(inLanguageTag); + /* Replace all */ + std::replace(languageTag.begin(), languageTag.end(), '-', '_'); + return languageTag; +} + +DPL::String LanguageTagsProvider::LocaleToBCP47LanguageTag(const DPL::String& inLocaleString) +{ + /* Cut off codepage information from given string (if any exists) + * i.e. change en_US.UTF-8 into en_US */ + DPL::String localeString = inLocaleString.substr( + 0, inLocaleString.find_first_of(L".")); + /* Replace all '_' with '-' */ + std::replace(localeString.begin(), localeString.end(), '_', '-'); + return localeString; +} + +/* ========== private ========== */ +LanguageTagsProvider::LanguageTagsProvider() +{ + LogDebug("Creating LanguageTagsProvider instance"); + this->loadSystemTags(); +} + +LanguageTagsProvider::~LanguageTagsProvider() +{ +} + +void LanguageTagsProvider::loadSystemTags() +{ + char* language = vconf_get_str(VCONFKEY_LANGSET); + if(!language) { + LogError("Failed to get language from vconf"); + } + else { + LogDebug("Language fetched from vconf: " << language); + } + createTagsFromLocales(language); + free(language); +} + +void LanguageTagsProvider::createTagsFromLocales(const char* language) +{ + m_languageTagsList.clear(); + if(!language) { + LogDebug("Setting default language tags"); + /* If NULL language given than set default language tags + * and return. */ + m_languageTagsList.push_back(L""); + return; + } + + LogDebug("Setting tags for language: " << language); + DPL::String langdescr = LocaleToBCP47LanguageTag(DPL::FromUTF8String(language)); + + size_t position; + if(langdescr.empty()) { + LogError("Empty language description while correct value needed"); + } + else { + /* Language tags list should not be cleared before this place to + * avoid losing current data when new data are invalid */ + while (true) { + LogDebug("Processing language description: " << langdescr); + m_languageTagsList.push_back(langdescr); + + position = langdescr.find_last_of(L"-"); + if (position == DPL::String::npos) { + break; + } + langdescr = langdescr.substr(0, position); + } + } + /* Add empty tag for non-localized content */ + m_languageTagsList.push_back(L""); +} diff --git a/modules/localization/src/localization_utils.cpp b/modules/localization/src/localization_utils.cpp index 9a63800..c463276 100644 --- a/modules/localization/src/localization_utils.cpp +++ b/modules/localization/src/localization_utils.cpp @@ -21,40 +21,11 @@ #include -#include -#include -#include - #include #include -#include - -namespace { - -static int LanguageChanged(void *) -{ - char* lang = vconf_get_str(VCONFKEY_LANGSET); - if (!lang) { - LogError("Cannot get locale settings from vconf"); - return 0; - } - LogDebug("Language set to: " << lang); - - using namespace LocalizationUtils; - - LanguageTagsList list; - list.push_back(DPL::FromUTF8String(lang)); - SetSystemLanguageTags(list); - - LogDebug("LanguageChanged to " << lang); - - return 0; -} -} namespace LocalizationUtils { static LanguageTagsList m_systemLanguageTags; -static LanguageTagsList m_userLanguageTags; static LanguageTagsList m_languageTags; static DPL::ReadWriteMutex m_readWriteMutex; @@ -92,13 +63,9 @@ void UpdateUserAgentLanguageTags() // WARNING!!!!! This function shall be called // only when mutex is locked in readWriteMode! - LanguageTagsList list = m_userLanguageTags; - list.insert(list.begin(), - m_systemLanguageTags.begin(), - m_systemLanguageTags.end()); m_languageTags.clear(); - FOREACH(i, list) { + FOREACH(i, m_systemLanguageTags) { DPL::String tag = LocaleToBCP47LanguageTag(*i); while (true) { //W3C Packaging 9. Step 5. 2. D if (tag.empty()) { continue; } @@ -118,15 +85,6 @@ void UpdateUserAgentLanguageTags() m_languageTags.push_back(L""); } -void SetUserLanguageTags(const LanguageTagsList& tags) -{ - DPL::ReadWriteMutex::ScopedWriteLock lock(&m_readWriteMutex); - if (m_userLanguageTags != tags) { - m_userLanguageTags = tags; - UpdateUserAgentLanguageTags(); - } -} - void SetSystemLanguageTags(const LanguageTagsList& tags) { DPL::ReadWriteMutex::ScopedWriteLock lock(&m_readWriteMutex); @@ -141,15 +99,4 @@ LanguageTagsList GetUserAgentLanguageTags() DPL::ReadWriteMutex::ScopedReadLock lock(&m_readWriteMutex); return m_languageTags; } - -void Initialize() -{ - appcore_set_event_callback( - APPCORE_EVENT_LANG_CHANGE, - &LanguageChanged, - NULL); - - LanguageChanged(NULL); // updating language for the first time -} - } diff --git a/modules/localization/src/w3c_file_localization.cpp b/modules/localization/src/w3c_file_localization.cpp index bb41c5d..4a6cfe1 100644 --- a/modules/localization/src/w3c_file_localization.cpp +++ b/modules/localization/src/w3c_file_localization.cpp @@ -18,14 +18,15 @@ * @author Lukasz Wrzosek (l.wrzosek@samsung.com) * @version 1.0 */ - +#include #include #include #include +#include #include -#include +#include #include #include @@ -33,31 +34,36 @@ #include #include +#include + using namespace WrtDB; namespace { const DPL::String FILE_URI_BEGIN = L"file://"; const DPL::String WIDGET_URI_BEGIN = L"widget://"; +const DPL::String LOCALE_PREFIX = L"locales/"; DPL::Optional GetFilePathInWidgetPackageInternal( - const LanguageTagsList &tags, const std::string& basePath, std::string filePath) { LogDebug("Looking for file: " << filePath << " in: " << basePath); - using namespace LocalizationUtils; + + const LanguageTags& ltags = LanguageTagsProviderSingleton::Instance().getLanguageTags(); //Check if string isn't empty if (filePath.size() == 0) { return DPL::Optional::Null; } //Removing preceding '/' if (filePath[0] == '/') { filePath.erase(0, 1); } + // In some cases (start file localization) url has unnecessary "/" at the end + if(filePath[filePath.size()-1] == '/') { filePath.erase(filePath.size()-1, 1); } //Check if string isn't empty if (filePath.size() == 0) { return DPL::Optional::Null; } - LogDebug("locales size = " << tags.size()); - for (LanguageTagsList::const_iterator it = tags.begin(); - it != tags.end(); - ++it) { + LogDebug("locales size = " << ltags.size()); + for (LanguageTags::const_iterator it = ltags.begin(); + it != ltags.end(); + ++it) { LogDebug("Trying locale: " << *it); std::string path = basePath; if (path[path.size() - 1] == '/') { @@ -84,13 +90,11 @@ DPL::Optional GetFilePathInWidgetPackageInternal( } DPL::Optional GetFilePathInWidgetPackageInternal( - const LanguageTagsList &languageTags, const DPL::String& basePath, const DPL::String& filePath) { DPL::Optional path = - GetFilePathInWidgetPackageInternal(languageTags, - DPL::ToUTF8String(basePath), + GetFilePathInWidgetPackageInternal(DPL::ToUTF8String(basePath), DPL::ToUTF8String(filePath)); DPL::Optional dplPath; if (!!path) { @@ -101,30 +105,56 @@ DPL::Optional GetFilePathInWidgetPackageInternal( } namespace W3CFileLocalization { + DPL::Optional getFilePathInWidgetPackageFromUrl( DbWidgetHandle widgetHandle, - const LanguageTagsList &languageTags, + const DPL::String &url) +{ + return getFilePathInWidgetPackageFromUrl( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)), + url); +} + +DPL::Optional getFilePathInWidgetPackageFromUrl( + const WrtDB::WidgetPkgName &pkgname, + const DPL::String &url) +{ + return getFilePathInWidgetPackageFromUrl( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)), + url); +} + +DPL::Optional getFilePathInWidgetPackageFromUrl( + WrtDB::WidgetDAOReadOnlyPtr dao, const DPL::String &url) { DPL::String req = url; - WidgetDAO dao(widgetHandle); if (req.find(WIDGET_URI_BEGIN) == 0) { req.erase(0, WIDGET_URI_BEGIN.length()); } else if (req.find(FILE_URI_BEGIN) == 0) { req.erase(0, FILE_URI_BEGIN.length()); - if (req.find(dao.getPath()) == 0) { - req.erase(0, dao.getPath().length()); + if (req.find(dao->getPath()) == 0) { + req.erase(0, dao->getPath().length()); + } + if (req.find(LOCALE_PREFIX) == 0) { + req.erase(0, LOCALE_PREFIX.length()); + size_t position = req.find('/'); + // should always be >0 as correct locales path is + // always locales/xx/ or locales/xx-XX/ + if (position != std::string::npos && position > 0) { + req.erase(0, position+1); + } } } else { LogDebug("Unknown path format, ignoring"); return DPL::Optional::Null; } - auto widgetPath = dao.getPath(); + auto widgetPath = dao->getPath(); DPL::Optional found = - GetFilePathInWidgetPackageInternal(languageTags, widgetPath, req); + GetFilePathInWidgetPackageInternal(widgetPath, req); if (!found) { LogError("Path not found within current locale in current widget"); @@ -138,24 +168,46 @@ DPL::Optional getFilePathInWidgetPackageFromUrl( DPL::Optional getFilePathInWidgetPackage( WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagsList &languageTags, const DPL::String& file) { - WidgetDAO dao(widgetHandle); - return GetFilePathInWidgetPackageInternal(languageTags, dao.getPath(), file); + return getFilePathInWidgetPackage( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)), + file); +} + +DPL::Optional getFilePathInWidgetPackage( + const WrtDB::WidgetPkgName &pkgname, + const DPL::String& file) +{ + return getFilePathInWidgetPackage( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)), + file); } -DPL::OptionalString getStartFile(const WrtDB::DbWidgetHandle widgetHandle) +DPL::Optional getFilePathInWidgetPackage( + WrtDB::WidgetDAOReadOnlyPtr dao, + const DPL::String& file) { - using namespace LocalizationUtils; + return GetFilePathInWidgetPackageInternal(dao->getPath(), file); +} - WidgetDAO dao(widgetHandle); +DPL::OptionalString getStartFile(const WrtDB::WidgetPkgName & pkgname) +{ + return getStartFile(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname))); +} + +DPL::OptionalString getStartFile(const WrtDB::DbWidgetHandle handle) +{ + return getStartFile(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(handle))); +} - WidgetDAO::LocalizedStartFileList locList = dao.getLocalizedStartFileList(); - WidgetDAO::WidgetStartFileList list = dao.getStartFileList(); - LanguageTagsList tagsList = LocalizationUtils::GetUserAgentLanguageTags(); +DPL::OptionalString getStartFile(WrtDB::WidgetDAOReadOnlyPtr dao) +{ + WidgetDAOReadOnly::LocalizedStartFileList locList = dao->getLocalizedStartFileList(); + WidgetDAOReadOnly::WidgetStartFileList list = dao->getStartFileList(); + LanguageTags tagsList = LanguageTagsProviderSingleton::Instance().getLanguageTags(); - DPL::OptionalString defaultLoc = dao.getDefaultlocale(); + DPL::OptionalString defaultLoc = dao->getDefaultlocale(); if (!!defaultLoc) { tagsList.push_back(*defaultLoc); } @@ -178,16 +230,23 @@ DPL::OptionalString getStartFile(const WrtDB::DbWidgetHandle widgetHandle) return DPL::OptionalString::Null; } -OptionalWidgetIcon getIcon(const WrtDB::DbWidgetHandle widgetHandle) +OptionalWidgetIcon getIcon(const WrtDB::WidgetPkgName & pkgname) { - using namespace LocalizationUtils; - WidgetDAO dao(widgetHandle); + return getIcon(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname))); +} - WidgetDAO::WidgetLocalizedIconList locList = dao.getLocalizedIconList(); - WidgetDAO::WidgetIconList list = dao.getIconList(); - LanguageTagsList tagsList = LocalizationUtils::GetUserAgentLanguageTags(); +OptionalWidgetIcon getIcon(WrtDB::DbWidgetHandle widgetHandle) +{ + return getIcon(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle))); +} + +OptionalWidgetIcon getIcon(WrtDB::WidgetDAOReadOnlyPtr dao) +{ + WidgetDAOReadOnly::WidgetLocalizedIconList locList = dao->getLocalizedIconList(); + WidgetDAOReadOnly::WidgetIconList list = dao->getIconList(); + LanguageTags tagsList = LanguageTagsProviderSingleton::Instance().getLanguageTags(); - DPL::OptionalString defaultLoc = dao.getDefaultlocale(); + DPL::OptionalString defaultLoc = dao->getDefaultlocale(); if (!!defaultLoc) { tagsList.push_back(*defaultLoc); } @@ -214,21 +273,28 @@ OptionalWidgetIcon getIcon(const WrtDB::DbWidgetHandle widgetHandle) return OptionalWidgetIcon::Null; } -WidgetIconList getValidIconsList( - WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagsList &languageTags) +WidgetIconList getValidIconsList(WrtDB::DbWidgetHandle widgetHandle) +{ + return getValidIconsList( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle))); +} + +WidgetIconList getValidIconsList(const WrtDB::WidgetPkgName &pkgname) +{ + return getValidIconsList( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname))); +} + +WidgetIconList getValidIconsList(WrtDB::WidgetDAOReadOnlyPtr dao) { - using namespace LocalizationUtils; - WidgetDAO dao(widgetHandle); - WidgetDAO::WidgetIconList list = dao.getIconList(); + WidgetDAOReadOnly::WidgetIconList list = dao->getIconList(); WidgetIconList outlist; FOREACH(it, list) { LogDebug(":" << it->iconSrc); - if (!!getFilePathInWidgetPackage(widgetHandle, - languageTags, + if (!!getFilePathInWidgetPackage(dao->getHandle(), it->iconSrc)) { WidgetIcon ret; @@ -241,18 +307,28 @@ WidgetIconList getValidIconsList( return outlist; } -OptionalWidgetStartFileInfo getStartFileInfo( - WrtDB::DbWidgetHandle widgetHandle, - const LanguageTagList &tagsList) +OptionalWidgetStartFileInfo getStartFileInfo(WrtDB::DbWidgetHandle widgetHandle) +{ + return getStartFileInfo( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle))); +} + +OptionalWidgetStartFileInfo getStartFileInfo(const WrtDB::WidgetPkgName &pkgname) { - using namespace LocalizationUtils; + return getStartFileInfo( + WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname))); + +} + +OptionalWidgetStartFileInfo getStartFileInfo(WrtDB::WidgetDAOReadOnlyPtr dao) +{ WidgetStartFileInfo info; - WidgetDAO dao(widgetHandle); - WidgetDAO::LocalizedStartFileList locList = - dao.getLocalizedStartFileList(); - WidgetDAO::WidgetStartFileList list = dao.getStartFileList(); + WidgetDAOReadOnly::LocalizedStartFileList locList = + dao->getLocalizedStartFileList(); + WidgetDAOReadOnly::WidgetStartFileList list = dao->getStartFileList(); + const LanguageTags tagsList = LanguageTagsProviderSingleton::Instance().getLanguageTags(); FOREACH(tag, tagsList) { @@ -269,7 +345,7 @@ OptionalWidgetStartFileInfo getStartFileInfo( if (tag->empty()) { info.localizedPath = it->src; } else { - info.localizedPath = L"locales/" + *tag; + info.localizedPath = L"locales/" + *tag + L"/"; info.localizedPath += it->src; } return info; @@ -284,10 +360,18 @@ OptionalWidgetStartFileInfo getStartFileInfo( WidgetLocalizedInfo getLocalizedInfo(const WrtDB::DbWidgetHandle handle) { - LanguageTagList languages = - LocalizationUtils::GetUserAgentLanguageTags(); - WidgetDAO dao(handle); - DPL::OptionalString dl = dao.getDefaultlocale(); + return getLocalizedInfo(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(handle))); +} + +WidgetLocalizedInfo getLocalizedInfo(const WrtDB::WidgetPkgName & pkgname) +{ + return getLocalizedInfo(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname))); +} + +WidgetLocalizedInfo getLocalizedInfo(WidgetDAOReadOnlyPtr dao) +{ + LanguageTags languages = LanguageTagsProviderSingleton::Instance().getLanguageTags(); + DPL::OptionalString dl = dao->getDefaultlocale(); if (!!dl) { languages.push_back(*dl); } @@ -295,7 +379,7 @@ WidgetLocalizedInfo getLocalizedInfo(const WrtDB::DbWidgetHandle handle) WidgetLocalizedInfo result; FOREACH(i, languages) { - WidgetLocalizedInfo languageResult = dao.getLocalizedInfo(*i); + WidgetLocalizedInfo languageResult = dao->getLocalizedInfo(*i); #define OVERWRITE_IF_NULL(FIELD) if (!result.FIELD) { \ result.FIELD = languageResult.FIELD; \ diff --git a/modules/log/include/dpl/log/log.h b/modules/log/include/dpl/log/log.h index c9564bb..7be5c9d 100644 --- a/modules/log/include/dpl/log/log.h +++ b/modules/log/include/dpl/log/log.h @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -45,8 +44,6 @@ class LogSystem : private Noncopyable { private: - ReadWriteMutex m_spinLock; - typedef std::list AbstractLogProviderPtrList; AbstractLogProviderPtrList m_providers; diff --git a/modules/log/src/abstract_log_provider.cpp b/modules/log/src/abstract_log_provider.cpp index d16976c..0b28573 100644 --- a/modules/log/src/abstract_log_provider.cpp +++ b/modules/log/src/abstract_log_provider.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract log provider */ +#include #include #include diff --git a/modules/log/src/dlog_log_provider.cpp b/modules/log/src/dlog_log_provider.cpp index 448ae2c..2c05af4 100644 --- a/modules/log/src/dlog_log_provider.cpp +++ b/modules/log/src/dlog_log_provider.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of DLOG log provider */ +#include #include #include #include diff --git a/modules/log/src/log.cpp b/modules/log/src/log.cpp index b03ab61..a2f1f94 100644 --- a/modules/log/src/log.cpp +++ b/modules/log/src/log.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of log system */ +#include #include #include @@ -140,52 +141,40 @@ void LogSystem::SetTag(const char* tag) void LogSystem::AddProvider(AbstractLogProvider *provider) { - ReadWriteMutex::ScopedWriteLock lock(&m_spinLock); m_providers.push_back(provider); } void LogSystem::RemoveProvider(AbstractLogProvider *provider) { - ReadWriteMutex::ScopedWriteLock lock(&m_spinLock); m_providers.remove(provider); } void LogSystem::Debug(const char *message, const char *filename, int line, const char *function) { - ReadWriteMutex::ScopedReadLock lock(&m_spinLock); - for (AbstractLogProviderPtrList::iterator iterator = m_providers.begin(); iterator != m_providers.end(); ++iterator) (*iterator)->Debug(message, filename, line, function); } void LogSystem::Info(const char *message, const char *filename, int line, const char *function) { - ReadWriteMutex::ScopedReadLock lock(&m_spinLock); - for (AbstractLogProviderPtrList::iterator iterator = m_providers.begin(); iterator != m_providers.end(); ++iterator) (*iterator)->Info(message, filename, line, function); } void LogSystem::Warning(const char *message, const char *filename, int line, const char *function) { - ReadWriteMutex::ScopedReadLock lock(&m_spinLock); - for (AbstractLogProviderPtrList::iterator iterator = m_providers.begin(); iterator != m_providers.end(); ++iterator) (*iterator)->Warning(message, filename, line, function); } void LogSystem::Error(const char *message, const char *filename, int line, const char *function) { - ReadWriteMutex::ScopedReadLock lock(&m_spinLock); - for (AbstractLogProviderPtrList::iterator iterator = m_providers.begin(); iterator != m_providers.end(); ++iterator) (*iterator)->Error(message, filename, line, function); } void LogSystem::Pedantic(const char *message, const char *filename, int line, const char *function) { - ReadWriteMutex::ScopedReadLock lock(&m_spinLock); - for (AbstractLogProviderPtrList::iterator iterator = m_providers.begin(); iterator != m_providers.end(); ++iterator) (*iterator)->Pedantic(message, filename, line, function); } diff --git a/modules/log/src/old_style_log_provider.cpp b/modules/log/src/old_style_log_provider.cpp index 7c3b1fc..2ad499f 100644 --- a/modules/log/src/old_style_log_provider.cpp +++ b/modules/log/src/old_style_log_provider.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of old style log provider */ +#include #include #include #include diff --git a/modules/rpc/include/dpl/rpc/generic_rpc_connection.h b/modules/rpc/include/dpl/rpc/generic_rpc_connection.h index 1342859..353dd3a 100644 --- a/modules/rpc/include/dpl/rpc/generic_rpc_connection.h +++ b/modules/rpc/include/dpl/rpc/generic_rpc_connection.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include namespace DPL { @@ -42,7 +42,7 @@ private: virtual void OnInputStreamClosed(); virtual void OnInputStreamBroken(); - ScopedPtr m_inputOutput; + std::unique_ptr m_inputOutput; public: /** diff --git a/modules/rpc/src/abstract_rpc_connection.cpp b/modules/rpc/src/abstract_rpc_connection.cpp index b1b2140..e5455e2 100644 --- a/modules/rpc/src/abstract_rpc_connection.cpp +++ b/modules/rpc/src/abstract_rpc_connection.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract RPC connection */ +#include #include // diff --git a/modules/rpc/src/abstract_rpc_connector.cpp b/modules/rpc/src/abstract_rpc_connector.cpp index 63527bc..2bd879e 100644 --- a/modules/rpc/src/abstract_rpc_connector.cpp +++ b/modules/rpc/src/abstract_rpc_connector.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of abstract RPC connector */ +#include #include // diff --git a/modules/rpc/src/generic_rpc_connection.cpp b/modules/rpc/src/generic_rpc_connection.cpp index f087494..bd472b0 100644 --- a/modules/rpc/src/generic_rpc_connection.cpp +++ b/modules/rpc/src/generic_rpc_connection.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of generic RPC connection */ +#include #include #include #include diff --git a/modules/rpc/src/generic_socket_rpc_client.cpp b/modules/rpc/src/generic_socket_rpc_client.cpp index 3c09aac..f75fdc8 100644 --- a/modules/rpc/src/generic_socket_rpc_client.cpp +++ b/modules/rpc/src/generic_socket_rpc_client.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of generic socket RPC client */ +#include #include // diff --git a/modules/rpc/src/generic_socket_rpc_connection.cpp b/modules/rpc/src/generic_socket_rpc_connection.cpp index 0786c62..961a4dc 100644 --- a/modules/rpc/src/generic_socket_rpc_connection.cpp +++ b/modules/rpc/src/generic_socket_rpc_connection.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of generic socket RPC connection */ +#include #include // diff --git a/modules/rpc/src/generic_socket_rpc_server.cpp b/modules/rpc/src/generic_socket_rpc_server.cpp index 2472c66..a0590f4 100644 --- a/modules/rpc/src/generic_socket_rpc_server.cpp +++ b/modules/rpc/src/generic_socket_rpc_server.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of generic socket RPC */ +#include #include // diff --git a/modules/rpc/src/unix_socket_rpc_client.cpp b/modules/rpc/src/unix_socket_rpc_client.cpp index fb24741..b4bb1f4 100644 --- a/modules/rpc/src/unix_socket_rpc_client.cpp +++ b/modules/rpc/src/unix_socket_rpc_client.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of unix socket RPC client */ +#include #include #include diff --git a/modules/rpc/src/unix_socket_rpc_connection.cpp b/modules/rpc/src/unix_socket_rpc_connection.cpp index 28fea84..1a4615f 100644 --- a/modules/rpc/src/unix_socket_rpc_connection.cpp +++ b/modules/rpc/src/unix_socket_rpc_connection.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of unix socket RPC connection */ +#include #include namespace DPL diff --git a/modules/rpc/src/unix_socket_rpc_server.cpp b/modules/rpc/src/unix_socket_rpc_server.cpp index ea71eb7..38992ab 100644 --- a/modules/rpc/src/unix_socket_rpc_server.cpp +++ b/modules/rpc/src/unix_socket_rpc_server.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of unix socket RPC server */ +#include #include #include diff --git a/modules/security_origin_dao/CMakeLists.txt b/modules/security_origin_dao/CMakeLists.txt new file mode 100644 index 0000000..4e74cc3 --- /dev/null +++ b/modules/security_origin_dao/CMakeLists.txt @@ -0,0 +1,57 @@ +SET(TARGET_SECURITY_ORIGIN_DAO_DB "Sqlite3DbSecurityOrigin") + +ADD_CUSTOM_COMMAND( OUTPUT .security_origin.db + COMMAND rm -f ${CMAKE_CURRENT_BINARY_DIR}/.security_origin.db + COMMAND gcc -Wall -I${PROJECT_SOURCE_DIR}/modules/db/include -I${PROJECT_SOURCE_DIR}/modules/security_origin_dao/orm -E ${PROJECT_SOURCE_DIR}/modules/security_origin_dao/orm/security_origin_db_sql_generator.h | grep --invert-match "^#" > ${CMAKE_CURRENT_BINARY_DIR}/security_origin_db.sql + COMMAND sqlite3 ${CMAKE_CURRENT_BINARY_DIR}/.security_origin.db ".read ${CMAKE_CURRENT_BINARY_DIR}/security_origin_db.sql" || rm -f ${CMAKE_CURRENT_BINARY_DIR}/.security_origin.db + DEPENDS ${PROJECT_SOURCE_DIR}/modules/security_origin_dao/orm/security_origin_db_sql_generator.h ${PROJECT_SOURCE_DIR}/modules/security_origin_dao/orm/security_origin_db + ) + +ADD_CUSTOM_COMMAND( OUTPUT .security_origin.db-journal + COMMAND touch + ARGS ${CMAKE_CURRENT_BINARY_DIR}/.security_origin.db-journal + ) + +ADD_CUSTOM_TARGET(${TARGET_SECURITY_ORIGIN_DAO_DB} ALL DEPENDS .security_origin.db .security_origin.db-journal) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/security_origin_db.sql DESTINATION share/wrt-engine/) + +############################################################################### + +INCLUDE(FindPkgConfig) + +PKG_CHECK_MODULES(SECURITY_ORIGIN_DAO_DEPS + glib-2.0 + REQUIRED) + +SET(SECURITY_ORIGIN_DAO_INCLUDE_DIRS + ${PROJECT_SOURCE_DIR}/modules/security_origin_dao/include + ${PROJECT_SOURCE_DIR}/modules/security_origin_dao/orm + ${PROJECT_SOURCE_DIR}/modules/core/include + ${PROJECT_SOURCE_DIR}/modules/db/include + ${PROJECT_SOURCE_DIR}/modules/log/include + ${PROJECT_SOURCE_DIR}/modules/widget_dao/include +) + +SET(SECURITY_ORIGIN_DAO_SOURCES + dao/security_origin_dao_types.cpp + dao/security_origin_database.cpp + dao/security_origin_dao.cpp +) + +INCLUDE_DIRECTORIES(SYSTEM ${SECURITY_ORIGIN_DAO_DEPS_INCLUDE_DIRS} ) +INCLUDE_DIRECTORIES(${SECURITY_ORIGIN_DAO_INCLUDE_DIRS}) + +ADD_LIBRARY(${TARGET_SECURITY_ORIGIN_DAO_LIB} SHARED ${SECURITY_ORIGIN_DAO_SOURCES}) +SET_TARGET_PROPERTIES(${TARGET_SECURITY_ORIGIN_DAO_LIB} PROPERTIES SOVERSION ${API_VERSION} VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${TARGET_SECURITY_ORIGIN_DAO_LIB} ${TARGET_DPL_EFL} ${TARGET_DPL_DB_EFL} ${TARGET_WRT_DAP_RO_LIB} ${SECURITY_ORIGIN_DAO_DEPS_LIBRARIES}) +ADD_DEPENDENCIES(${TARGET_SECURITY_ORIGIN_DAO_LIB} ${TARGET_SECURITY_ORIGIN_DAO_DB}) + +INSTALL(TARGETS ${TARGET_SECURITY_ORIGIN_DAO_LIB} DESTINATION lib) + +INSTALL(FILES + include/wrt-commons/security-origin-dao/security_origin_dao_types.h + include/wrt-commons/security-origin-dao/security_origin_database.h + include/wrt-commons/security-origin-dao/security_origin_dao.h + DESTINATION include/dpl-efl/wrt-commons/security-origin-dao +) + diff --git a/modules/security_origin_dao/dao/security_origin_dao.cpp b/modules/security_origin_dao/dao/security_origin_dao.cpp new file mode 100644 index 0000000..377358c --- /dev/null +++ b/modules/security_origin_dao/dao/security_origin_dao.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 security_origin_dao.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the definition of security origin dao class. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace DPL::DB::ORM; +using namespace DPL::DB::ORM::security_origin; + +namespace SecurityOriginDB { + +#define SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN Try + +#define SQL_CONNECTION_EXCEPTION_HANDLER_END(message) \ + Catch(DPL::DB::SqlConnection::Exception::Base) { \ + LogError(message); \ + ReThrowMsg(SecurityOriginDAO::Exception::DatabaseError, \ + message); \ + } + +namespace { +DPL::DB::SqlConnection::Flag::Option SECURITY_ORIGIN_DB_OPTION = + DPL::DB::SqlConnection::Flag::RW; +DPL::DB::SqlConnection::Flag::Type SECURITY_ORIGIN_DB_TYPE = + DPL::DB::SqlConnection::Flag::UseLucene; +const char* const SECURITY_ORIGIN_DB_NAME = ".security_origin.db"; +const char* const SECURITY_ORIGIN_DB_SQL_PATH = + "/usr/share/wrt-engine/security_origin_db.sql"; + +std::string createDatabasePath(const WrtDB::WidgetPkgName &pkgName) +{ + std::stringstream filename; + + filename << WrtDB::WidgetConfig::GetWidgetPersistentStoragePath(pkgName) + << "/" + << SECURITY_ORIGIN_DB_NAME; + return filename.str(); +} + +std::string createDatabasePath(int widgetHandle) +{ + using namespace DPL::DB::ORM; + using namespace WrtDB::WidgetConfig; + using namespace WrtDB::GlobalConfig; + + WrtDB::WidgetPkgName pkgname; + + Try + { + pkgname = WrtDB::WidgetDAOReadOnly::getPkgName(widgetHandle); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { + LogError("Failed to get database Path"); + } + return createDatabasePath(pkgname); +} + +void checkDatabase(std::string databasePath) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + if (databasePath.empty()) { + ThrowMsg(SecurityOriginDAO::Exception::DatabaseError, + "Wrong database Path is passed"); + } + + struct stat buffer; + if (stat(databasePath.c_str(), &buffer) != 0) { + + //Create fresh database + LogInfo("Creating database " << databasePath); + + std::fstream file; + file.open(SECURITY_ORIGIN_DB_SQL_PATH, std::ios_base::in); + if (!file) { + ThrowMsg(SecurityOriginDAO::Exception::DatabaseError, + "Fail to get database Path"); + } + + std::stringstream ssBuffer; + ssBuffer << file.rdbuf(); + + file.close(); + + DPL::DB::SqlConnection con(databasePath, + SECURITY_ORIGIN_DB_TYPE, + SECURITY_ORIGIN_DB_OPTION); + con.ExecCommand(ssBuffer.str().c_str()); + } + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Fail to get database Path") +} +} + +SecurityOriginDAO::SecurityOriginDAO(int handle) : + m_securityOriginDBPath(createDatabasePath(handle)), + m_securityOriginDBInterface(m_securityOriginDBPath, SECURITY_ORIGIN_DB_TYPE) +{ + checkDatabase(m_securityOriginDBPath); + m_securityOriginDBInterface.AttachToThread(SECURITY_ORIGIN_DB_OPTION); +} + +SecurityOriginDAO::SecurityOriginDAO(const WrtDB::WidgetPkgName &pkgName) : + m_securityOriginDBPath(createDatabasePath(pkgName)), + m_securityOriginDBInterface(m_securityOriginDBPath, SECURITY_ORIGIN_DB_TYPE) +{ + checkDatabase(m_securityOriginDBPath); + m_securityOriginDBInterface.AttachToThread(SECURITY_ORIGIN_DB_OPTION); +} + +SecurityOriginDAO::~SecurityOriginDAO() +{ + m_securityOriginDBInterface.DetachFromThread(); +} + +SecurityOriginDataList SecurityOriginDAO::getSecurityOriginDataList(void) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + SecurityOriginDataList list; + SECURITY_ORIGIN_DB_SELECT(select, SecurityOriginInfo, &m_securityOriginDBInterface); + typedef std::list RowList; + RowList rowList = select->GetRowList(); + + FOREACH(it, rowList) { + Origin origin(it->Get_scheme(), it->Get_host(), it->Get_port()); + list.push_back( + SecurityOriginDataPtr( + new SecurityOriginData( + static_cast(it->Get_feature()), origin))); + } + return list; + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get data list") +} + +Result SecurityOriginDAO::getResult(const SecurityOriginData &securityOriginData) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + SECURITY_ORIGIN_DB_SELECT(select, SecurityOriginInfo, &m_securityOriginDBInterface); + select->Where( + And(And(And(Equals(securityOriginData.feature), + Equals(securityOriginData.origin.scheme)), + Equals(securityOriginData.origin.host)), + Equals(securityOriginData.origin.port))); + SecurityOriginInfo::Select::RowList rows = select->GetRowList(); + + if (rows.empty()) { + return RESULT_UNKNOWN; + } + SecurityOriginInfo::Row row = rows.front(); + return static_cast(row.Get_result()); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get result for security origin") +} + +void SecurityOriginDAO::setSecurityOriginData(const SecurityOriginData &securityOriginData, + const Result result) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + ScopedTransaction transaction(&m_securityOriginDBInterface); + SecurityOriginInfo::Row row; + row.Set_feature(securityOriginData.feature); + row.Set_scheme(securityOriginData.origin.scheme); + row.Set_host(securityOriginData.origin.host); + row.Set_port(securityOriginData.origin.port); + row.Set_result(result); + + if (true == hasResult(securityOriginData)) { + SECURITY_ORIGIN_DB_UPDATE(update, + SecurityOriginInfo, + &m_securityOriginDBInterface); + update->Values(row); + update->Execute(); + } else { + SECURITY_ORIGIN_DB_INSERT( + insert, + SecurityOriginInfo, + &m_securityOriginDBInterface); + insert->Values(row); + insert->Execute(); + } + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Fail to set security origin data") +} + +void SecurityOriginDAO::removeSecurityOriginData( + const SecurityOriginData &securityOriginData) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + ScopedTransaction transaction(&m_securityOriginDBInterface); + + if (true == hasResult(securityOriginData)) { + SECURITY_ORIGIN_DB_DELETE(del, SecurityOriginInfo, &m_securityOriginDBInterface) + del->Where( + And(And(And(Equals(securityOriginData.feature), + Equals(securityOriginData.origin.scheme)), + Equals(securityOriginData.origin.host)), + Equals(securityOriginData.origin.port))); + del->Execute(); + transaction.Commit(); + } + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Fail to set security origin data") +} + +void SecurityOriginDAO::removeSecurityOriginData(const Result result) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + ScopedTransaction transaction(&m_securityOriginDBInterface); + SECURITY_ORIGIN_DB_DELETE(del, SecurityOriginInfo, &m_securityOriginDBInterface) + del->Where(Equals(result)); + del->Execute(); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Fail to remove data by result") +} + +bool SecurityOriginDAO::hasResult(const SecurityOriginData &securityOriginData) +{ + Result res=getResult(securityOriginData); + return (res != RESULT_UNKNOWN); +} + +#undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN +#undef SQL_CONNECTION_EXCEPTION_HANDLER_END + +} // namespace SecurityOriginDB diff --git a/modules/security_origin_dao/dao/security_origin_dao_types.cpp b/modules/security_origin_dao/dao/security_origin_dao_types.cpp new file mode 100644 index 0000000..2e87959 --- /dev/null +++ b/modules/security_origin_dao/dao/security_origin_dao_types.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file security_origin_dao_types.cpp + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the implementation of + * common data types for wrt_security_origin.db + */ + +#include +#include + +namespace SecurityOriginDB { +} // namespace SecurityOriginDB \ No newline at end of file diff --git a/modules/security_origin_dao/dao/security_origin_database.cpp b/modules/security_origin_dao/dao/security_origin_database.cpp new file mode 100644 index 0000000..0564a18 --- /dev/null +++ b/modules/security_origin_dao/dao/security_origin_database.cpp @@ -0,0 +1,19 @@ +/* + * 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 + +DPL::Mutex g_securityOriginDBQueriesMutex; diff --git a/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao.h b/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao.h new file mode 100644 index 0000000..9dc7d9c --- /dev/null +++ b/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file securoty_origin_dao.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of security origin dao + */ +#ifndef _SECURITY_ORIGIN_DAO_H_ +#define _SECURITY_ORIGIN_DAO_H_ + +#include +#include +#include + +namespace SecurityOriginDB { + +class SecurityOriginDAO +{ + public: + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, DatabaseError) + DECLARE_EXCEPTION_TYPE(Base, DataNotExist) + }; + + explicit SecurityOriginDAO(int handle) __attribute__((deprecated)); + explicit SecurityOriginDAO(const WrtDB::WidgetPkgName &pkgName); + virtual ~SecurityOriginDAO(); + SecurityOriginDataList getSecurityOriginDataList(); + Result getResult(const SecurityOriginData &securityOriginData); + void setSecurityOriginData(const SecurityOriginData &securityOriginData, + const Result result); + void removeSecurityOriginData(const SecurityOriginData &securityOriginData); + void removeSecurityOriginData(const Result result); + private: + std::string m_securityOriginDBPath; + DPL::DB::ThreadDatabaseSupport m_securityOriginDBInterface; + bool hasResult(const SecurityOriginData &securityOriginData); +}; + +typedef std::shared_ptr SecurityOriginDAOPtr; + +} // namespace SecurityOriginDB + +#endif // _SECURITY_ORIGIN_DAO_H_ diff --git a/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao_types.h b/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao_types.h new file mode 100644 index 0000000..35081ca --- /dev/null +++ b/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_dao_types.h @@ -0,0 +1,108 @@ +/* + * 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 security_origin_dao_types.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of + * common data types for security origin database. + */ +#ifndef _SECURITY_ORIGIN_DAO_TYPES_H_ +#define _SECURITY_ORIGIN_DAO_TYPES_H_ + +#include +#include +#include + +namespace SecurityOriginDB { + +enum Feature +{ + FEATURE_START = 0, + FEATURE_GEOLOCATION = 0, + FEATURE_WEB_NOTIFICATION, + FEATURE_WEB_DATABASE, + FEATURE_FILE_SYSTEM_ACCESS, + FEATURE_END = FEATURE_FILE_SYSTEM_ACCESS +}; + +enum Result +{ + RESULT_UNKNOWN = 0, + RESULT_ALLOW_ONCE, + RESULT_DENY_ONCE, + RESULT_ALLOW_ALWAYS, + RESULT_DENY_ALWAYS +}; + +struct Origin +{ + DPL::String scheme; + DPL::String host; + unsigned int port; + + Origin(const DPL::String& Scheme, + const DPL::String& Host, + const unsigned int Port) : + scheme(Scheme), + host(Host), + port(Port) + { + } + + bool operator== (const Origin& other) const + { + return (!DPL::StringCompare(scheme, other.scheme) && + !DPL::StringCompare(host, other.host) && + port == other.port); + } + + bool operator!= (const Origin& other) const + { + return !(*this == other); + } +}; + +struct SecurityOriginData +{ + Feature feature; + Origin origin; + + SecurityOriginData(const Feature features, const Origin& ori) : + feature(features), + origin(ori) + { + } + + bool operator== (const SecurityOriginData& other) const + { + return !(origin == other.origin) && + !(feature == other.feature); + } + + bool operator!= (const SecurityOriginData& other) const + { + return !(*this == other); + } +}; + +typedef std::shared_ptr SecurityOriginDataPtr; +typedef std::list SecurityOriginDataList; + +} // namespace SecurityOriginDB + +#endif // _SECURITY_ORIGIN_DAO_TYPES_H_ diff --git a/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_database.h b/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_database.h new file mode 100644 index 0000000..d94b588 --- /dev/null +++ b/modules/security_origin_dao/include/wrt-commons/security-origin-dao/security_origin_database.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 _SECURITY_ORIGIN_DATABASE_H_ +#define _SECURITY_ORIGIN_DATABASE_H_ + +#include +#include + +extern DPL::Mutex g_securityOriginDBQueriesMutex; + +#define SECURITY_ORIGIN_DB_INTERNAL(tlsCommand, InternalType, interface) \ + static DPL::ThreadLocalVariable *tlsCommand ## Ptr = NULL; \ + { \ + DPL::Mutex::ScopedLock lock(&g_securityOriginDBQueriesMutex); \ + if (!tlsCommand ## Ptr) { \ + static DPL::ThreadLocalVariable tmp; \ + tlsCommand ## Ptr = &tmp; \ + } \ + } \ + DPL::ThreadLocalVariable &tlsCommand = *tlsCommand ## Ptr; \ + if (tlsCommand.IsNull()) { tlsCommand = InternalType(interface); } + +#define SECURITY_ORIGIN_DB_SELECT(name, type, interface) \ + SECURITY_ORIGIN_DB_INTERNAL(name, type::Select, interface) + +#define SECURITY_ORIGIN_DB_INSERT(name, type, interface) \ + SECURITY_ORIGIN_DB_INTERNAL(name, type::Insert, interface) + +#define SECURITY_ORIGIN_DB_UPDATE(name, type, interface) \ + SECURITY_ORIGIN_DB_INTERNAL(name, type::Update, interface) + +#define SECURITY_ORIGIN_DB_DELETE(name, type, interface) \ + SECURITY_ORIGIN_DB_INTERNAL(name, type::Delete, interface) + +#endif // _SECURITY_ORIGIN_DATABASE_H_ + diff --git a/modules/security_origin_dao/orm/orm_generator_security_origin.h b/modules/security_origin_dao/orm/orm_generator_security_origin.h new file mode 100644 index 0000000..84888de --- /dev/null +++ b/modules/security_origin_dao/orm/orm_generator_security_origin.h @@ -0,0 +1,24 @@ +/* + * 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 _ORM_GENERATOR_SECURITY_ORIGIN_H_ +#define _ORM_GENERATOR_SECURITY_ORIGIN_H_ + +#define ORM_GENERATOR_DATABASE_NAME security_origin_db_definitions +#include +#undef ORM_GENERATOR_DATABASE_NAME + +#endif // _ORM_GENERATOR_SECURITY_ORIGIN_H_ diff --git a/modules/security_origin_dao/orm/security_origin_db b/modules/security_origin_dao/orm/security_origin_db new file mode 100644 index 0000000..cb45aa4 --- /dev/null +++ b/modules/security_origin_dao/orm/security_origin_db @@ -0,0 +1,12 @@ +SQL(BEGIN TRANSACTION;) + +CREATE_TABLE(SecurityOriginInfo) + COLUMN_NOT_NULL(feature, INT, ) + COLUMN_NOT_NULL(scheme, TEXT,DEFAULT '') + COLUMN_NOT_NULL(host, TEXT,DEFAULT '') + COLUMN_NOT_NULL(port, INT, DEFAULT 0) + COLUMN_NOT_NULL(result, INT, DEFAULT 0) + TABLE_CONSTRAINTS(PRIMARY KEY(feature,scheme,host,port)) +CREATE_TABLE_END() + +SQL(COMMIT;) diff --git a/modules/security_origin_dao/orm/security_origin_db_definitions b/modules/security_origin_dao/orm/security_origin_db_definitions new file mode 100644 index 0000000..dc74f98 --- /dev/null +++ b/modules/security_origin_dao/orm/security_origin_db_definitions @@ -0,0 +1,5 @@ +DATABASE_START(security_origin) + +#include "security_origin_db" + +DATABASE_END() diff --git a/modules/security_origin_dao/orm/security_origin_db_sql_generator.h b/modules/security_origin_dao/orm/security_origin_db_sql_generator.h new file mode 100644 index 0000000..3bdbe6d --- /dev/null +++ b/modules/security_origin_dao/orm/security_origin_db_sql_generator.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file security_origin_db_sql_generator.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief Macro definitions for generating the SQL + * input file from database definition. + */ + +//Do not include this file directly! It is used only for SQL code generation. +#include + +#include "security_origin_db_definitions" diff --git a/modules/socket/src/generic_socket.cpp b/modules/socket/src/generic_socket.cpp index a8e2237..aff2d74 100644 --- a/modules/socket/src/generic_socket.cpp +++ b/modules/socket/src/generic_socket.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of generic socket */ +#include #include // diff --git a/modules/socket/src/unix_socket.cpp b/modules/socket/src/unix_socket.cpp index f185da3..3dd905c 100644 --- a/modules/socket/src/unix_socket.cpp +++ b/modules/socket/src/unix_socket.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of unix socket */ +#include #include #include #include @@ -29,6 +30,7 @@ #include #include #include +#include namespace DPL { @@ -101,8 +103,9 @@ void UnixSocket::Bind(const Address &address) GenericSocket::Bind(address); // Always set proper permissions to the socket file - chmod(address.GetAddress().c_str(), 0777); + if(chmod(address.GetAddress().c_str(), 0777)<0){ + LogError("Error setting permissions to the socket file. Errno " << strerror(errno)); + } } - } } // namespace DPL diff --git a/modules/socket/src/waitable_input_output_execution_context_support.cpp b/modules/socket/src/waitable_input_output_execution_context_support.cpp index 7411b49..6edf9b2 100644 --- a/modules/socket/src/waitable_input_output_execution_context_support.cpp +++ b/modules/socket/src/waitable_input_output_execution_context_support.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file is the implementation file of waitable input-output execution context support */ +#include #include #include #include // FIXME: Remove !!! diff --git a/modules/support/config.cmake b/modules/support/config.cmake new file mode 100644 index 0000000..e2865f6 --- /dev/null +++ b/modules/support/config.cmake @@ -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 config.cmake +# @author Lukasz Marek (l.marek@samsung.com) +# @version 1.0 +# @brief +# + + +SET(DPL_WRT_ENGINE_HEADERS + ${PROJECT_SOURCE_DIR}/modules/support/wrt_plugin_export.h + PARENT_SCOPE +) diff --git a/modules/support/wrt_plugin_export.h b/modules/support/wrt_plugin_export.h new file mode 100644 index 0000000..f57c59e --- /dev/null +++ b/modules/support/wrt_plugin_export.h @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file wrt_plugin_export.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief Header file for plugin export API + */ +#ifndef WRT_PLUGIN_EXPORT_H +#define WRT_PLUGIN_EXPORT_H + +#include + +/** + * Widget handle type + */ +typedef int widget_handle_t; + +/** + * Parameter which should be used during policy evaluation. + */ +typedef struct ace_param_s +{ + const char *name; + const char *value; +} ace_param_t; + +/** + * List of additional parameters which should be used during policy evaluation. + */ +typedef struct ace_param_list_s +{ + size_t count; + ace_param_t *param; +} ace_param_list_t; + +/** + * Contains list of device capabilities. Each device capability may have + * associated list of function params. + */ +typedef struct ace_device_cap_s +{ + size_t devcapsCount; + const char** dev_cap_names; + size_t paramsCount; + ace_param_list_t* params; +} ace_device_cap_t; + +/** + * List of device capabilities which must be check. + */ +typedef struct ace_device_capabilities_s +{ + size_t count; + const char **device_cap; +} ace_device_capabilities_t; + +/** + * List of api features that must be checked + */ +typedef struct ace_api_features_s +{ + size_t count; + const char **api_feature; +} ace_api_features_t; + +/** + * Data from request will be used to evaluate policy file. + */ +typedef struct ace_request_s +{ + widget_handle_t widget_handle; + const char* feature_api; + const char* function_name; + ace_device_capabilities_t device_capabilities; + ace_param_list_t param_list; +} ace_request_t; + +/** + * Data from request will be used to evaluate policy file. + */ +typedef struct ace_request_2_s +{ + widget_handle_t widget_handle; + ace_api_features_t api_features; + const char* function_name; + ace_device_cap_t device_capabilities; +} ace_request_2_t; + +/** + * info returned by plugin_api_check_access + */ +#define PLUGIN_API_ACCESS_GRANTED 1 +#define PLUGIN_API_ACCESS_DENIED 0 +#define PLUGIN_API_ACCESS_ERROR -1 + + +typedef const void* java_script_context_t; + +typedef struct js_object_properties_s +{ + size_t count; + char** properties; +} js_object_properties_t; + +typedef const void* js_class_template_t; +typedef void* js_object_ref_t; +typedef const void* js_value_ref_t; + +typedef js_class_template_t (*js_class_template_getter) (void); +typedef void* (*js_class_constructor_cb_t)(js_class_template_t, + js_object_ref_t, size_t, js_value_ref_t[], + js_value_ref_t*); + +typedef enum class_definition_type_e +{ + JS_CLASS, + JS_FUNCTION, + JS_INTERFACE +} class_definition_type_t; + +typedef enum class_definition_iframe_behaviour_e +{ + //object should not be initalized in iframes + //it is default one + NONE, + //object should be copied as reference to each iframe + REFERENCE, + //object should be created for each iframe and NOT inform plugin + CREATE_INSTANCE, +} class_definition_iframe_behaviour_t; + +typedef enum class_definition_iframe_notice_e +{ + //it is default one + NONE_NOTICE, + ALWAYS_NOTICE +} class_definition_iframe_notice_t; + +typedef enum class_definition_iframe_overlay_e +{ + IGNORED, + USE_OVERLAYED, + OVERLAYED_BEFORE_ORIGINAL +} class_definition_iframe_overlay_t; + +typedef void* js_object_instance_t; +//global_context - id +typedef void(*iframe_loaded_cb)(java_script_context_t global_context, + js_object_instance_t iframe, + js_object_instance_t object); + +typedef void* (*js_function_impl)(void*); + +typedef struct class_definition_options_s +{ + class_definition_type_t type; + class_definition_iframe_behaviour_t iframe_option; + class_definition_iframe_notice_t iframe_notice; + class_definition_iframe_overlay_t iframe_overlay; + iframe_loaded_cb cb; + void * private_data; + js_function_impl function; +} class_definition_options_t; + + +/* + * list of device caps + */ +typedef struct devcaps_s +{ + char** deviceCaps; + size_t devCapsCount; +} devcaps_t; + +/* + * mapping from a feature to corresponding list of device capabilities + */ +typedef struct feature_devcaps_s +{ + char* feature_name; + devcaps_t devCaps; +} feature_devcaps_t; + +/* + * list of feature_devcaps_t structs + */ +typedef struct feature_mapping_s +{ + feature_devcaps_t* features; + size_t featuresCount; +} feature_mapping_t; + + +typedef feature_mapping_t* pfeature_mapping_t; + +typedef pfeature_mapping_t (*features_getter)(void); + +typedef const devcaps_t* (*devcaps_getter)(pfeature_mapping_t /*features*/, + const char* /*featureName*/); +typedef void (*deinitializer)(pfeature_mapping_t /*features*/); + +typedef struct feature_mapping_interface_s +{ + features_getter featGetter; /* returns a list of api features */ + devcaps_getter dcGetter; /* + * for a given api feature returns a list of + * corresponding device capabilities + */ + + deinitializer release; /* as memory ownership of features is + * transfered to callee you have to call + * the release function ptr on features + */ +} feature_mapping_interface_t; + + +/* + * This is a structure describing a JS entity template (a class, an interface + * or function), object name and it's parent class name (parent_name). JS + * entity will be bind to a parent class name (parent_name.js_entity_name). + * @param parent_name - parent name (ie Widget.Device) + * @param object_name - object name (DeviceStatus) + * @param interface_name - interface name (e.g. Widget) + * @param js_class_template_getter_fun - js_class_template required to create + * JS object + * @param js_class_consturctor_cb - constructor to call to when instance of + * certain interface is created + * @param private_data private data for object creator if required (usually + * NULL) + */ +typedef struct js_entity_definition_s +{ + const char *parent_name; + const char *object_name; + const char *interface_name; + js_class_template_getter js_class_template_getter_fun; + js_class_constructor_cb_t js_class_constructor_cb; + //class options may be null - default + class_definition_options_t* class_options; +} js_entity_definition_t; + +typedef const js_entity_definition_t *js_entity_definition_ptr_t; + +/** + * Plugin export names + */ +#define PLUGIN_WIDGET_START_PROC on_widget_start +#define PLUGIN_WIDGET_INIT_PROC on_widget_init +#define PLUGIN_WIDGET_STOP_PROC on_widget_stop +#define PLUGIN_FRAME_LOAD_PROC on_frame_load +#define PLUGIN_FRAME_UNLOAD_PROC on_frame_unload +#define PLUGIN_CLASS_MAP class_map +#define PLUGIN_GET_CLASS_PROC_MAP get_widget_class_map + +#define PLUGIN_WIDGET_START_PROC_NAME "on_widget_start" +#define PLUGIN_WIDGET_INIT_PROC_NAME "on_widget_init" +#define PLUGIN_WIDGET_STOP_PROC_NAME "on_widget_stop" +#define PLUGIN_FRAME_LOAD_PROC_NAME "on_frame_load" +#define PLUGIN_FRAME_UNLOAD_PROC_NAME "on_frame_unload" +#define PLUGIN_CLASS_MAP_NAME "class_map" +#define PLUGIN_GET_CLASS_MAP_PROC_NAME "get_widget_class_map" + +/** + * Plugin export typedefs + */ +typedef void (*on_widget_start_proc)(int widgetId); + +typedef void (*on_widget_init_proc)(feature_mapping_interface_t *interface); + +/** + * FIXME: Add documentation + */ +typedef void (*on_widget_stop_proc)(int widgetId); + +typedef void (*on_frame_load_proc)(java_script_context_t context); + +typedef void (*on_frame_unload_proc)(java_script_context_t context); + +typedef const js_entity_definition_t* (*get_widget_entity_map_proc)(); + +#endif // WRT_PLUGIN_EXPORT_H diff --git a/modules/test/include/dpl/test/test_results_collector.h b/modules/test/include/dpl/test/test_results_collector.h index 6c4e24b..d3f44bb 100644 --- a/modules/test/include/dpl/test/test_results_collector.h +++ b/modules/test/include/dpl/test/test_results_collector.h @@ -23,12 +23,12 @@ #ifndef DPL_TEST_RESULTS_COLLECTOR_H #define DPL_TEST_RESULTS_COLLECTOR_H -#include #include #include #include #include #include +#include namespace DPL { @@ -36,7 +36,7 @@ namespace Test { class TestResultsCollectorBase; -typedef DPL::SharedPtr +typedef std::shared_ptr TestResultsCollectorBasePtr; class TestResultsCollectorBase @@ -52,7 +52,6 @@ class TestResultsCollectorBase NONE, FAILED, IGNORED, - TODO, INTERNAL }; }; diff --git a/modules/test/include/dpl/test/test_runner.h b/modules/test/include/dpl/test/test_runner.h index ab1a626..a4db750 100644 --- a/modules/test/include/dpl/test/test_runner.h +++ b/modules/test/include/dpl/test/test_runner.h @@ -32,6 +32,7 @@ #include #include #include +#include namespace DPL { @@ -39,9 +40,12 @@ namespace Test { class TestRunner { - TestResultsCollectorBasePtr m_collector; - std::string m_collectorName; + typedef std::map + TestResultsCollectors; + TestResultsCollectors m_collectors; + std::string m_startTestId; + bool m_runIgnored; public: typedef void (*TestCase)(); @@ -82,15 +86,21 @@ private: DPL::Atomic m_totalAssertions; void Banner(); - void InvalidArgs(); + void InvalidArgs(const std::string& message = "Invalid arguments!"); void Usage(); - enum Status { FAILED, TODO, IGNORED, PASS }; + enum Status { FAILED, IGNORED, PASS }; Status RunTestCase(const TestCaseStruct& testCase); void RunTests(); + void CollectResult(const std::string& id, + const std::string& description, + const TestResultsCollectorBase::FailStatus::Type status + = TestResultsCollectorBase::FailStatus::NONE, + const std::string& reason = std::string()); + public: class TestFailed { @@ -116,27 +126,6 @@ public: } }; - class ToDo - { - private: - std::string m_message; - - public: - ToDo() - { - } - - ToDo(const std::string &message) - : m_message(message) - { - } - - std::string GetMessage() const - { - return m_message; - } - }; - class Ignored { private: @@ -166,6 +155,7 @@ public: int ExecTestRunner(int argc, char *argv[]); typedef std::vector ArgsList; int ExecTestRunner(const ArgsList& args); + bool getRunIgnored() const; }; typedef DPL::Singleton TestRunnerSingleton; @@ -211,8 +201,6 @@ do #define RUNNER_FAIL RUNNER_ASSERT(false) -#define RUNNER_TODO_MSG(message) do { std::ostringstream assertMsg; assertMsg << message; throw DPL::Test::TestRunner::ToDo(assertMsg.str()); } while (0) - #define RUNNER_IGNORED_MSG(message) do { std::ostringstream assertMsg; assertMsg << message; throw DPL::Test::TestRunner::Ignored(assertMsg.str()); } while (0) #endif // DPL_TEST_RUNNER_H diff --git a/modules/test/src/test_results_collector.cpp b/modules/test/src/test_results_collector.cpp index 07a6a69..c9c6ea4 100644 --- a/modules/test/src/test_results_collector.cpp +++ b/modules/test/src/test_results_collector.cpp @@ -19,15 +19,23 @@ * @version 1.0 * @brief Implementation file some concrete TestResulstsCollector */ - +#include #include #include #include #include #include +#include +#include #include +#include #include +#include +#include +#include + +#define GREEN_RESULT_OK "[%s%s%s]\n", BOLD_GREEN_BEGIN, " OK ", BOLD_GREEN_END namespace DPL { @@ -37,6 +45,18 @@ namespace Test namespace { const char *DEFAULT_HTML_FILE_NAME = "index.html"; +const char *DEFAULT_TAP_FILE_NAME = "results.tap"; +const char *DEFAULT_XML_FILE_NAME = "results.xml"; + +bool ParseCollectorFileArg(const std::string &arg, std::string &filename) +{ + const std::string argname = "--file="; + if (0 == arg.find(argname)) { + filename = arg.substr(argname.size()); + return true; + } + return false; +} class Statistic { @@ -44,7 +64,6 @@ class Statistic Statistic() : m_failed(0), m_ignored(0), - m_todo(0), m_passed(0), m_count(0) { @@ -57,19 +76,17 @@ class Statistic case TestResultsCollectorBase::FailStatus::INTERNAL: case TestResultsCollectorBase::FailStatus::FAILED: ++m_failed; break; case TestResultsCollectorBase::FailStatus::IGNORED: ++m_ignored; break; - case TestResultsCollectorBase::FailStatus::TODO: ++m_todo; break; case TestResultsCollectorBase::FailStatus::NONE: ++m_passed; break; default: Assert(false && "Bad FailStatus"); } } - size_t GetTotal() const { return m_count; } - size_t GetPassed() const { return m_passed; } - size_t GetSuccesed() const { return m_passed; } - size_t GetFailed() const { return m_failed; } - size_t GetTODO() const { return m_todo; } - size_t GetIgnored() const { return m_ignored; } + std::size_t GetTotal() const { return m_count; } + std::size_t GetPassed() const { return m_passed; } + std::size_t GetSuccesed() const { return m_passed; } + std::size_t GetFailed() const { return m_failed; } + std::size_t GetIgnored() const { return m_ignored; } float GetPassedOrIgnoredPercend() const { float passIgnoredPercent = @@ -80,11 +97,10 @@ class Statistic } private: - size_t m_failed; - size_t m_ignored; - size_t m_todo; - size_t m_passed; - size_t m_count; + std::size_t m_failed; + std::size_t m_ignored; + std::size_t m_passed; + std::size_t m_count; }; class ConsoleCollector @@ -124,13 +140,11 @@ class ConsoleCollector printf("Running test case %-60s", tmp.c_str()); switch(status) { case TestResultsCollectorBase::FailStatus::NONE: - printf("[%s%s%s]\n", BOLD_GREEN_BEGIN, " OK ", BOLD_GREEN_END); break; + printf(GREEN_RESULT_OK); break; case TestResultsCollectorBase::FailStatus::FAILED: PrintfErrorMessage( " FAILED ", reason, true); break; case TestResultsCollectorBase::FailStatus::IGNORED: PrintfIgnoredMessage("Ignored ", reason, true); break; - case TestResultsCollectorBase::FailStatus::TODO: - PrintfTODOMessage( " TODO ", reason, true); break; case TestResultsCollectorBase::FailStatus::INTERNAL: PrintfErrorMessage( "INTERNAL", reason, true); break; default: @@ -161,27 +175,6 @@ class ConsoleCollector } } - void PrintfTODOMessage(const char* type, - const std::string& message, - bool verbosity) - { - using namespace DPL::Colors::Text; - if (verbosity) { - printf("[%s%s%s] %s%s%s\n", - BOLD_WHITE_BEGIN, - type, - BOLD_WHITE_END, - BOLD_GOLD_BEGIN, - message.c_str(), - BOLD_GOLD_END); - } else { - printf("[%s%s%s]\n", - BOLD_WHITE_BEGIN, - type, - BOLD_WHITE_END); - } - } - void PrintfIgnoredMessage(const char* type, const std::string& message, bool verbosity) @@ -208,12 +201,9 @@ class ConsoleCollector using namespace DPL::Colors::Text; printf("\n%sResults [%s]: %s\n", BOLD_GREEN_BEGIN, title.c_str(), BOLD_GREEN_END); printf("%s%s%3d%s\n", CYAN_BEGIN, "Total tests: ", stats.GetTotal(), CYAN_END); - printf("%s%s%3d%s\n", CYAN_BEGIN, "Succeeded or ignored: ", stats.GetPassed() + stats.GetIgnored(), CYAN_END); - printf(" %s%s%3d%s\n", CYAN_BEGIN, "Succeeded: ", stats.GetPassed(), CYAN_END); - printf(" %s%s%3d%s\n", CYAN_BEGIN, "Ignored: ", stats.GetIgnored(), CYAN_END); - printf("%s%s%3d%s\n", CYAN_BEGIN, "Failed: ", stats.GetFailed(), CYAN_END); - printf("%s%s%3d%s\n", CYAN_BEGIN, "Todo: ", stats.GetTODO(), CYAN_END); - printf("%s%s%3.0f%%%s\n", CYAN_BEGIN, "Succeeded or ignored %: ", stats.GetPassedOrIgnoredPercend(), CYAN_END); + printf(" %s%s%3d%s\n", CYAN_BEGIN, "Succeeded: ", stats.GetPassed(), CYAN_END); + printf(" %s%s%3d%s\n", CYAN_BEGIN, "Failed: ", stats.GetFailed(), CYAN_END); + printf(" %s%s%3d%s\n", CYAN_BEGIN, "Ignored: ", stats.GetIgnored(), CYAN_END); } Statistic m_stats; @@ -290,13 +280,7 @@ class HtmlCollector virtual bool ParseCollectorSpecificArg(const std::string& arg) { - const std::string argname = "--file="; - if (0 == arg.find(argname)) { - m_filename = arg.substr(argname.size()); - return true; - } else { - return false; - } + return ParseCollectorFileArg(arg, m_filename); } virtual void CollectResult(const std::string& id, @@ -310,13 +294,11 @@ class HtmlCollector fprintf(m_fp.Get(), "Running test case %-100s", tmp.c_str()); switch(status) { case TestResultsCollectorBase::FailStatus::NONE: - fprintf(m_fp.Get(), "[%s%s%s]\n", BOLD_GREEN_BEGIN, " OK ", BOLD_GREEN_END); break; + fprintf(m_fp.Get(), GREEN_RESULT_OK); break; case TestResultsCollectorBase::FailStatus::FAILED: PrintfErrorMessage( " FAILED ", reason, true); break; case TestResultsCollectorBase::FailStatus::IGNORED: PrintfIgnoredMessage("Ignored ", reason, true); break; - case TestResultsCollectorBase::FailStatus::TODO: - PrintfTODOMessage( " TODO ", reason, true); break; case TestResultsCollectorBase::FailStatus::INTERNAL: PrintfErrorMessage( "INTERNAL", reason, true); break; default: @@ -349,29 +331,6 @@ class HtmlCollector } } - void PrintfTODOMessage(const char* type, - const std::string& message, - bool verbosity) - { - using namespace DPL::Colors::Html; - if (verbosity) { - fprintf(m_fp.Get(), - "[%s%s%s] %s%s%s\n", - BOLD_WHITE_BEGIN, - type, - BOLD_WHITE_END, - BOLD_GOLD_BEGIN, - message.c_str(), - BOLD_GOLD_END); - } else { - fprintf(m_fp.Get(), - "[%s%s%s]\n", - BOLD_WHITE_BEGIN, - type, - BOLD_WHITE_END); - } - } - void PrintfIgnoredMessage(const char* type, const std::string& message, bool verbosity) @@ -401,12 +360,9 @@ class HtmlCollector using namespace DPL::Colors::Html; fprintf(m_fp.Get(), "\n%sResults [%s]:%s\n", BOLD_GREEN_BEGIN, name.c_str(), BOLD_GREEN_END); fprintf(m_fp.Get(), "%s%s%3d%s\n", CYAN_BEGIN, "Total tests: ", stats.GetTotal(), CYAN_END); - fprintf(m_fp.Get(), "%s%s%3d%s\n", CYAN_BEGIN, "Succeeded or ignored: ", stats.GetPassed() + stats.GetIgnored(), CYAN_END); - fprintf(m_fp.Get(), " %s%s%3d%s\n", CYAN_BEGIN, "Succeeded: ", stats.GetPassed(), CYAN_END); - fprintf(m_fp.Get(), " %s%s%3d%s\n", CYAN_BEGIN, "Ignored: ", stats.GetIgnored(), CYAN_END); - fprintf(m_fp.Get(), "%s%s%3d%s\n", CYAN_BEGIN, "Failed: ", stats.GetFailed(), CYAN_END); - fprintf(m_fp.Get(), "%s%s%3d%s\n", CYAN_BEGIN, "Todo: ", stats.GetTODO(), CYAN_END); - fprintf(m_fp.Get(), "%s%s%3.0f%%%s\n", CYAN_BEGIN, "Succeeded or ignored %: ", stats.GetPassedOrIgnoredPercend(), CYAN_END); + fprintf(m_fp.Get(), " %s%s%3d%s\n", CYAN_BEGIN, "Succeeded: ", stats.GetPassed(), CYAN_END); + fprintf(m_fp.Get(), " %s%s%3d%s\n", CYAN_BEGIN, "Failed: ", stats.GetFailed(), CYAN_END); + fprintf(m_fp.Get(), " %s%s%3d%s\n", CYAN_BEGIN, "Ignored: ", stats.GetIgnored(), CYAN_END); } std::string m_filename; @@ -421,6 +377,342 @@ TestResultsCollectorBase* HtmlCollector::Constructor() return new HtmlCollector(); } + +class XmlCollector + : public TestResultsCollectorBase +{ + public: + static TestResultsCollectorBase* Constructor(); + + private: + XmlCollector() : m_filename(DEFAULT_XML_FILE_NAME) {} + + virtual void CollectCurrentTestGroupName(const std::string& name) + { + std::size_t pos = GetCurrentGroupPosition(); + if (std::string::npos != pos) + { + GroupFinish(pos); + FlushOutput(); + m_stats = Statistic(); + } + + pos = m_outputBuffer.find(""); + if (std::string::npos == pos) + { + ThrowMsg(DPL::Exception, "Could not find test suites closing tag"); + } + GroupStart(pos, name); + } + + void GroupStart(const std::size_t pos, const std::string& name) + { + std::stringstream groupHeader; + groupHeader << "\n\t"; + + groupHeader << "\n\t\t"; + groupHeader << "\n\t\t\t"; + groupHeader << "\n\t\t"; + + groupHeader << "\n\t"; + + m_outputBuffer.insert(pos - 1, groupHeader.str()); + } + + virtual bool Configure() + { + m_fp.Reset(fopen (m_filename.c_str(), "w")); + if (!m_fp) { + LogPedantic("Could not open file " << m_filename << " for writing"); + return false; + } + return true; + } + + virtual std::string CollectorSpecificHelp() const + { + return "--file= - name of file for output\n" + " default - results.xml\n"; + } + + virtual void Start() + { + Assert(!!m_fp && "File handle must not be null"); + m_outputBuffer.append("\n"); + m_outputBuffer.append("\n"); + FlushOutput(); + } + + virtual void Finish() + { + std::size_t pos = GetCurrentGroupPosition(); + if (std::string::npos != pos) + { + GroupFinish(pos); + FlushOutput(); + } + } + + virtual bool ParseCollectorSpecificArg(const std::string& arg) + { + return ParseCollectorFileArg(arg, m_filename); + } + + virtual void CollectResult(const std::string& id, + const std::string& /*description*/, + const FailStatus::Type status = FailStatus::NONE, + const std::string& reason = "") + { + m_resultBuffer.erase(); + m_resultBuffer.append("\t\t\n"); + break; + case TestResultsCollectorBase::FailStatus::FAILED: + m_resultBuffer.append(" status=\"FAILED\">\n"); + PrintfErrorMessage("FAILED", EscapeSpecialCharacters(reason), true); + m_resultBuffer.append("\t\t\n"); + break; + case TestResultsCollectorBase::FailStatus::IGNORED: + m_resultBuffer.append(" status=\"Ignored\">\n"); + PrintfIgnoredMessage("Ignored", EscapeSpecialCharacters(reason), true); + m_resultBuffer.append("\t\t\n"); + break; + case TestResultsCollectorBase::FailStatus::INTERNAL: + m_resultBuffer.append(" status=\"FAILED\">\n"); + PrintfErrorMessage("INTERNAL", EscapeSpecialCharacters(reason), true); + m_resultBuffer.append("\t\t"); + break; + default: + Assert(false && "Bad status"); + } + std::size_t group_pos = GetCurrentGroupPosition(); + if (std::string::npos == group_pos) + { + ThrowMsg(DPL::Exception, "No current group set"); + } + + std::size_t last_case_pos = m_outputBuffer.find(" fprintf(m_fp.Get(), m_outputBuffer.c_str())) + { + int error = errno; + ThrowMsg(DPL::Exception, DPL::GetErrnoString(error)); + } + + if (-1 == TEMP_FAILURE_RETRY(fflush(m_fp.Get()))) + { + int error = errno; + ThrowMsg(DPL::Exception, DPL::GetErrnoString(error)); + } + } + + void PrintfErrorMessage(const char* type, + const std::string& message, + bool verbosity) + { + if (verbosity) { + m_resultBuffer.append("\t\t\t\n"); + + } else { + + m_resultBuffer.append("\t\t\t\n"); + } + } + + void PrintfIgnoredMessage(const char* type, + const std::string& message, + bool verbosity) + { + if (verbosity) { + m_resultBuffer.append("\t\t\t\n"); + } else { + + m_resultBuffer.append("\t\t\t\n"); + } + } + + std::string EscapeSpecialCharacters(std::string s) + { + for (unsigned int i = 0; i < s.size();) { + switch(s[i]){ + case '"': + s.erase(i,1); + s.insert(i, """); + i+=6; + break; + + case '&': + s.erase(i,1); + s.insert(i, "&"); + i+=5; + break; + + case '<': + s.erase(i,1); + s.insert(i, "<"); + i+=4; + break; + + case '>': + s.erase(i,1); + s.insert(i, ">"); + i+=4; + break; + + case '\'': + s.erase(i,1); + s.insert(i, "'"); + i+=5; + break; + default: + ++i; + break; + } + } + return s; + } + + std::string m_filename; + ScopedFClose m_fp; + Statistic m_stats; + std::string m_outputBuffer; + std::string m_resultBuffer; +}; + +TestResultsCollectorBase* XmlCollector::Constructor() +{ + return new XmlCollector(); +} + + + class CSVCollector : public TestResultsCollectorBase { @@ -449,7 +741,6 @@ class CSVCollector case TestResultsCollectorBase::FailStatus::NONE: statusMsg = "OK"; break; case TestResultsCollectorBase::FailStatus::FAILED: statusMsg = "FAILED"; break; case TestResultsCollectorBase::FailStatus::IGNORED: statusMsg = "IGNORED"; break; - case TestResultsCollectorBase::FailStatus::TODO: statusMsg = "TODO"; break; case TestResultsCollectorBase::FailStatus::INTERNAL: statusMsg = "FAILED"; break; default: Assert(false && "Bad status"); @@ -472,6 +763,114 @@ TestResultsCollectorBase* CSVCollector::Constructor() } +class TAPCollector + : public TestResultsCollectorBase +{ + public: + static TestResultsCollectorBase* Constructor(); + + private: + TAPCollector() : m_filename(DEFAULT_TAP_FILE_NAME) {} + + virtual bool Configure() + { + m_output.open(m_filename.c_str(), std::ios_base::trunc); + if (m_output.fail()) { + LogError("Can't open output file: " << m_filename); + return false; + } + return true; + } + virtual std::string CollectorSpecificHelp() const + { + std::string retVal = "--file= - name of file for output\n" + " default - "; + retVal += DEFAULT_TAP_FILE_NAME; + retVal += "\n"; + return retVal; + } + + virtual void Start() + { + Assert(m_output.good() && "Output file must be opened."); + m_output << "TAP version 13" << std::endl; + m_testIndex = 0; + } + + virtual void Finish() + { + m_output << "1.." << m_testIndex << std::endl; + m_output << m_collectedData.rdbuf(); + m_output.close(); + } + + virtual bool ParseCollectorSpecificArg(const std::string& arg) + { + return ParseCollectorFileArg(arg, m_filename); + } + + virtual void CollectResult(const std::string& id, + const std::string& description, + const FailStatus::Type status = FailStatus::NONE, + const std::string& reason = "") + { + m_testIndex++; + switch(status) { + case TestResultsCollectorBase::FailStatus::NONE: + LogBasicTAP(true, id, description); + endTAPLine(); + break; + case TestResultsCollectorBase::FailStatus::FAILED: + LogBasicTAP(false, id, description); + endTAPLine(); + break; + case TestResultsCollectorBase::FailStatus::IGNORED: + LogBasicTAP(true, id, description); + m_collectedData << " # skip " << reason; + endTAPLine(); + break; + case TestResultsCollectorBase::FailStatus::INTERNAL: + LogBasicTAP(true, id, description); + endTAPLine(); + m_collectedData << " ---" << std::endl; + m_collectedData << " message: " << reason << std::endl; + m_collectedData << " severity: Internal" << std::endl; + m_collectedData << " ..." << std::endl; + break; + default: + Assert(false && "Bad status"); + } + } + + void LogBasicTAP(bool isOK, const std::string& id, + const std::string& description) + { + if (!isOK) { + m_collectedData << "not "; + } + m_collectedData << "ok " << m_testIndex << " [" << + id << "] " << description; + } + + void endTAPLine() + { + m_collectedData << std::endl; + } + + + std::string m_filename; + std::stringstream m_collectedData; + std::ofstream m_output; + int m_testIndex; +}; + + +TestResultsCollectorBase* TAPCollector::Constructor() +{ + return new TAPCollector(); +} + + void TestResultsCollectorBase::RegisterCollectorConstructor( const std::string& name, TestResultsCollectorBase::CollectorConstructorFunc func) @@ -519,6 +918,12 @@ int RegisterCollectorConstructors() TestResultsCollectorBase::RegisterCollectorConstructor( "csv", &CSVCollector::Constructor); + TestResultsCollectorBase::RegisterCollectorConstructor( + "tap", + &TAPCollector::Constructor); + TestResultsCollectorBase::RegisterCollectorConstructor( + "xml", + &XmlCollector::Constructor); return 0; } @@ -527,3 +932,4 @@ int RegisterCollectorConstructors() } } +#undef GREEN_RESULT_OK diff --git a/modules/test/src/test_runner.cpp b/modules/test/src/test_runner.cpp index 8097c23..506dd10 100644 --- a/modules/test/src/test_runner.cpp +++ b/modules/test/src/test_runner.cpp @@ -20,6 +20,7 @@ * @version 1.0 * @brief This file is the implementation file of test runner */ +#include #include #include #include @@ -33,6 +34,8 @@ #include #include #include +#include +#include #include IMPLEMENT_SINGLETON(DPL::Test::TestRunner) @@ -97,67 +100,59 @@ TestRunner::Status TestRunner::RunTestCase(const TestCaseStruct& testCase) catch (const TestFailed &e) { // Simple test failure - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::FAILED, - e.GetMessage()); + CollectResult(testCase.name, + "", + TestResultsCollectorBase::FailStatus::FAILED, + e.GetMessage()); return FAILED; } catch (const Ignored &e) { - // Simple test have to be implemented - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::IGNORED, - e.GetMessage()); + if (m_runIgnored) { + // Simple test have to be implemented + CollectResult(testCase.name, + "", + TestResultsCollectorBase::FailStatus::IGNORED, + e.GetMessage()); + } return IGNORED; } - catch (const ToDo &e) - { - // Simple test have to be implemented - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::TODO, - e.GetMessage()); - - return TODO; - } catch (const DPL::Exception &e) { // DPL exception failure - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::INTERNAL, - "DPL exception:" + - e.GetMessage()); + CollectResult(testCase.name, + "", + TestResultsCollectorBase::FailStatus::INTERNAL, + "DPL exception:" + e.GetMessage()); return FAILED; } catch (const std::exception &) { // std exception failure - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::INTERNAL, - "std exception"); + CollectResult(testCase.name, + "", + TestResultsCollectorBase::FailStatus::INTERNAL, + "std exception"); return FAILED; } catch (...) { // Unknown exception failure - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::INTERNAL, - "unknown exception"); + CollectResult(testCase.name, + "", + TestResultsCollectorBase::FailStatus::INTERNAL, + "unknown exception"); return FAILED; } - m_collector->CollectResult(testCase.name, - "", - TestResultsCollectorBase::FailStatus::NONE); + CollectResult(testCase.name, + "", + TestResultsCollectorBase::FailStatus::NONE); + // Everything OK return PASS; } @@ -167,13 +162,25 @@ void TestRunner::RunTests() using namespace DPL::Colors::Text; Banner(); - m_collector->Start(); + std::for_each(m_collectors.begin(), + m_collectors.end(), + [](const TestResultsCollectors::value_type& collector) + { + collector.second->Start(); + }); fprintf(stderr, "%s%s%s\n", GREEN_BEGIN, "Running tests...", GREEN_END); FOREACH(group, m_testGroups) { TestCaseStructList list = group->second; if (!list.empty()) { - m_collector->CollectCurrentTestGroupName(group->first); + std::for_each( + m_collectors.begin(), + m_collectors.end(), + [&group](const TestResultsCollectors::value_type& collector) + { + collector.second-> + CollectCurrentTestGroupName(group->first); + }); list.sort(); for (TestCaseStructList::const_iterator iterator = list.begin(); @@ -191,11 +198,34 @@ void TestRunner::RunTests() } } - m_collector->Finish(); + std::for_each(m_collectors.begin(), + m_collectors.end(), + [](const TestResultsCollectors::value_type& collector) + { + collector.second->Finish(); + }); + // Finished fprintf(stderr, "%s%s%s\n\n", GREEN_BEGIN, "Finished", GREEN_END); } +void TestRunner::CollectResult( + const std::string& id, + const std::string& description, + const TestResultsCollectorBase::FailStatus::Type status, + const std::string& reason) +{ + std::for_each(m_collectors.begin(), + m_collectors.end(), + [&](const TestResultsCollectors::value_type& collector) + { + collector.second->CollectResult(id, + description, + status, + reason); + }); +} + void TestRunner::Banner() { using namespace DPL::Colors::Text; @@ -212,13 +242,13 @@ void TestRunner::Banner() GREEN_END); } -void TestRunner::InvalidArgs() +void TestRunner::InvalidArgs(const std::string& message) { using namespace DPL::Colors::Text; fprintf(stderr, "%s%s%s\n", BOLD_RED_BEGIN, - "Invalid parameters!", + message.c_str(), BOLD_RED_END); } @@ -226,25 +256,36 @@ void TestRunner::Usage() { fprintf(stderr, "Usage: runner [options]\n\n"); fprintf(stderr, "Output type:\n"); - fprintf(stderr, " --output=\n"); - fprintf(stderr, " possible output types:\n"); + fprintf(stderr, " --output= --output= ...\n"); + fprintf(stderr, "\n possible output types:\n"); FOREACH (type, TestResultsCollectorBase::GetCollectorsNames()) { - fprintf(stderr, " --output=%s\n", type->c_str()); + fprintf(stderr, " --output=%s\n", type->c_str()); } + fprintf(stderr, "\n example:\n"); + fprintf(stderr, " test-binary --output=text --output=xml --file=output.xml\n\n"); fprintf(stderr, "Other parameters:\n"); fprintf(stderr, " --regexp='regexp'\t Only selected tests" " which names match regexp run\n\n"); fprintf(stderr, " --start=\tStart from concrete test id"); fprintf(stderr, " --group=\t Run tests only from one group\n"); + fprintf(stderr, " --runignored\t Run also ignored tests\n"); fprintf(stderr, " --list\t Show a list of Test IDs\n"); fprintf(stderr, " --listgroups\t Show a list of Test Group names \n"); fprintf(stderr, " --listingroup=\t Show a list of Test IDS in one group\n"); fprintf(stderr, " --help\t This help\n\n"); - if (m_collector) { - fprintf(stderr, "Output %s has specific args:\n", m_collectorName.c_str()); - fprintf(stderr, "%s\n", m_collector->CollectorSpecificHelp().c_str()); - } + std::for_each(m_collectors.begin(), + m_collectors.end(), + [](const TestResultsCollectors::value_type& collector) + { + fprintf(stderr, + "Output %s has specific args:\n", + collector.first.c_str()); + fprintf(stderr, + "%s\n", + collector.second-> + CollectorSpecificHelp().c_str()); + }); fprintf(stderr, "For bug reporting, please write to:\n"); fprintf(stderr, "\n"); } @@ -266,6 +307,7 @@ void TestRunner::MarkAssertion() int TestRunner::ExecTestRunner(const ArgsList& value) { + m_runIgnored = false; ArgsList args = value; // Parse command line if (args.size() == 1) @@ -279,6 +321,8 @@ int TestRunner::ExecTestRunner(const ArgsList& value) bool showHelp = false; + TestResultsCollectorBasePtr currentCollector; + // Parse each argument FOREACH(it, args) { @@ -286,13 +330,21 @@ int TestRunner::ExecTestRunner(const ArgsList& value) const std::string regexp = "--regexp="; const std::string output = "--output="; const std::string groupId = "--group="; + const std::string runIgnored = "--runignored"; const std::string listCmd = "--list"; const std::string startCmd = "--start="; const std::string listGroupsCmd = "--listgroups"; const std::string listInGroup = "--listingroup="; - if (m_collector && m_collector->ParseCollectorSpecificArg(arg)) continue; - else if (arg.find(startCmd) == 0) + if (currentCollector) + { + if (currentCollector->ParseCollectorSpecificArg(arg)) + { + continue; + } + } + + if (arg.find(startCmd) == 0) { arg.erase(0, startCmd.length()); FOREACH(group, m_testGroups) { @@ -326,6 +378,10 @@ int TestRunner::ExecTestRunner(const ArgsList& value) return -1; } } + else if (arg == runIgnored) + { + m_runIgnored = true; + } else if (arg == listCmd) { FOREACH(group, m_testGroups) { @@ -355,14 +411,19 @@ int TestRunner::ExecTestRunner(const ArgsList& value) else if (arg.find(output) == 0) { arg.erase(0, output.length()); - m_collector.Reset(TestResultsCollectorBase::Create(arg)); - if (!m_collector) { - InvalidArgs(); + if (m_collectors.find(arg) != m_collectors.end()) + { + InvalidArgs("Multiple outputs of the same type are not supported!"); Usage(); return -1; - } else { - m_collectorName = arg; } + currentCollector.reset(TestResultsCollectorBase::Create(arg)); + if (!currentCollector) { + InvalidArgs("Unsupported output type!"); + Usage(); + return -1; + } + m_collectors[arg] = currentCollector; } else if (arg.find(regexp) == 0) { @@ -408,6 +469,8 @@ int TestRunner::ExecTestRunner(const ArgsList& value) } } + currentCollector.reset(); + // Show help if (showHelp) { @@ -415,12 +478,20 @@ int TestRunner::ExecTestRunner(const ArgsList& value) return 0; } - if (!m_collector) - m_collector.Reset(TestResultsCollectorBase::Create("text")); + if (m_collectors.empty()) + { + TestResultsCollectorBasePtr collector( + TestResultsCollectorBase::Create("text")); + m_collectors["text"] = collector; + } - if (!m_collector->Configure()) { - fprintf(stderr, "Could not configure selected output"); - return 0; + for (auto it = m_collectors.begin(); it != m_collectors.end(); ++it) + { + if (!it->second->Configure()) + { + fprintf(stderr, "Could not configure selected output"); + return 0; + } } // Run tests @@ -429,5 +500,10 @@ int TestRunner::ExecTestRunner(const ArgsList& value) return 0; } +bool TestRunner::getRunIgnored() const +{ + return m_runIgnored; +} + } } // namespace DPL diff --git a/modules/utils/config.cmake b/modules/utils/config.cmake index 96efba7..2b0beca 100644 --- a/modules/utils/config.cmake +++ b/modules/utils/config.cmake @@ -20,12 +20,11 @@ # SET(DPL_UTILS_SOURCES - ${PROJECT_SOURCE_DIR}/modules/utils/src/file_utils.cpp + ${PROJECT_SOURCE_DIR}/modules/utils/src/bash_utils.cpp ${PROJECT_SOURCE_DIR}/modules/utils/src/folder_size.cpp ${PROJECT_SOURCE_DIR}/modules/utils/src/mime_type_utils.cpp ${PROJECT_SOURCE_DIR}/modules/utils/src/warp_iri.cpp ${PROJECT_SOURCE_DIR}/modules/utils/src/widget_version.cpp - ${PROJECT_SOURCE_DIR}/modules/utils/src/wrt_global_settings_internal.cpp ${PROJECT_SOURCE_DIR}/modules/utils/src/wrt_global_settings.cpp ${PROJECT_SOURCE_DIR}/modules/utils/src/wrt_utility.cpp PARENT_SCOPE @@ -33,14 +32,13 @@ SET(DPL_UTILS_SOURCES SET(DPL_UTILS_HEADERS - ${PROJECT_SOURCE_DIR}/modules/utils/include/file_utils.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/folder_size.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/mime_type_utils.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/warp_iri.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/widget_version.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/wrt_global_settings.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/wrt_global_settings_internal.h - ${PROJECT_SOURCE_DIR}/modules/utils/include/wrt_utility.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/bash_utils.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/folder_size.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/mime_type_utils.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/warp_iri.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/widget_version.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/wrt_global_settings.h + ${PROJECT_SOURCE_DIR}/modules/utils/include/dpl/utils/wrt_utility.h PARENT_SCOPE ) diff --git a/modules/utils/include/dpl/utils/bash_utils.h b/modules/utils/include/dpl/utils/bash_utils.h new file mode 100644 index 0000000..1eb2ba9 --- /dev/null +++ b/modules/utils/include/dpl/utils/bash_utils.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file bash_utils.h + * @author Iwanek Tomasz + * @version 1.0 + */ + +#ifndef BASH_UTILS_H +#define BASH_UTILS_H + +#include + +namespace BashUtils { + +/** + * Escapes bash special characters in string and return string in double quotes + * @param source string to be escaped + * @return escaped string + */ +std::string escape_arg(const std::string & source); + +} + +#endif // BASH_UTILS_H diff --git a/modules/utils/include/dpl/utils/file_utils.h b/modules/utils/include/dpl/utils/file_utils.h new file mode 100644 index 0000000..6cdfefd --- /dev/null +++ b/modules/utils/include/dpl/utils/file_utils.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 file_utils.h + * @author Bartosz Janiak (b.janiak@samsung.com) + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @version 1.0 + */ + +#ifndef FILEUTILS_H +#define FILEUTILS_H + +#include +#include + +#include +#include + +namespace FileUtils { +DECLARE_EXCEPTION_TYPE(DPL::Exception, CreateDirectoryException) +DECLARE_EXCEPTION_TYPE(DPL::Exception, RemoveDirectoryException) + +bool FileExists(const DPL::String& absolutePath); +bool DirectoryExists(const DPL::String& absolutePath); + +/** + * Creates specified path recursively. + * @param path Path to create (e.g. /tmp/dir1/dir2). + * @param mode Mode for the non-existing parts of the path (e.g. 0755). + * @throw DPL::CommonException::::InternalError If sth bad happens. + */ +void MakePath(const std::string& path, mode_t mode); + +/** + * Removes specified directory recursively. + * @param path Full path to directory to remove. + * @throw FileUtils::DirectoryRemoveException If an error occured. + */ +void RemoveDir(const std::string& path); + +} // namespace FileUtils + +#endif diff --git a/modules/utils/include/dpl/utils/folder_size.h b/modules/utils/include/dpl/utils/folder_size.h new file mode 100644 index 0000000..db51de9 --- /dev/null +++ b/modules/utils/include/dpl/utils/folder_size.h @@ -0,0 +1,39 @@ +/* + * 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 folder_size.h + * @author Jaroslaw Osmanski (j.osmanski@samsung.com) + * @version 1.0 + * @brief Declaration for function calculating directory size + */ + +#ifndef SRC_COMMON_FOLDER_SIZE_H_ +#define SRC_COMMON_FOLDER_SIZE_H_ + +#include + +#include + +namespace Utils { + +size_t getFolderSize(const std::string& path); + +DPL::String fromFileSizeString(size_t fileSize); + +} + +#endif /* SRC_COMMON_FOLDER_SIZE_H_ */ diff --git a/modules/utils/include/dpl/utils/mime_type_utils.h b/modules/utils/include/dpl/utils/mime_type_utils.h new file mode 100644 index 0000000..b536c20 --- /dev/null +++ b/modules/utils/include/dpl/utils/mime_type_utils.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MIME_TYPE_UTILS_H +#define MIME_TYPE_UTILS_H + +#include +#include + +class MimeTypeUtils +{ + public: + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, InvalidFileName) + }; + + private: + //TODO use hash_map if possible + static const std::set& getMimeTypesSupportedForIcon(); + static const std::set& getMimeTypesSupportedForStartFile(); + + typedef std::map FileIdentificationMap; + + static DPL::String getFileNameFromPath(const DPL::String& path); + static const FileIdentificationMap& getFileIdentificationMap(); + static DPL::String stripMimeParameters(const DPL::String& mimeType); + + public: + typedef std::map MimeAttributes; + static bool isValidIcon(const DPL::String& path); + static bool isValidStartFile(const DPL::String& path, + const DPL::OptionalString& providedMimeType); + static bool isMimeTypeSupportedForStartFile(const DPL::String& mimeType); + static bool isMimeTypeSupportedForIcon(const DPL::String& mimeType); + static MimeAttributes getMimeAttributes(const DPL::String& mimeType); + ///implements 9.1.10. (Rule for Identifying the Media Type of a File) + ///from W3C packaging specification + static DPL::String identifyFileMimeType(const DPL::String& path); +}; + +#endif /* MIME_TYPE_UTILS_H */ + diff --git a/modules/utils/include/dpl/utils/warp_iri.h b/modules/utils/include/dpl/utils/warp_iri.h new file mode 100644 index 0000000..6968b66 --- /dev/null +++ b/modules/utils/include/dpl/utils/warp_iri.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 _WARPIRI_H_ +#define _WARPIRI_H_ + +#include + +#include +#include + +class WarpIRI +{ + static const unsigned int UNKNOWN_PORT = 0; + public: + WarpIRI(); + + void set(const char *iri, + bool domain); + void set(const DPL::String &iristring, + bool domain); + + /* It also checks port and schema */ + bool isSubDomain(const WarpIRI &second) const; + bool isAccessDefinition() const; + bool getSubDomain() const; + + static bool isIRISchemaIgnored(const char *iri); + + bool operator ==(const WarpIRI &other) const + { + return m_domain == other.m_domain && + m_host == other.m_host && + m_schema == other.m_schema && + m_port == other.m_port && + m_isAccessDefinition == other.m_isAccessDefinition && + m_isIRIValid == other.m_isIRIValid; + } + + private: + unsigned int getPort(const DPL::String &schema) const; + + bool m_domain; + std::vector m_host; + DPL::String m_schema; + unsigned int m_port; + bool m_isAccessDefinition; + bool m_isIRIValid; +}; + +#endif // _WarpIRI_H_ diff --git a/modules/utils/include/dpl/utils/widget_version.h b/modules/utils/include/dpl/utils/widget_version.h new file mode 100644 index 0000000..5f40e72 --- /dev/null +++ b/modules/utils/include/dpl/utils/widget_version.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file widget_version.h + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief Header file for widget version + */ +#ifndef WIDGET_VERSION_H +#define WIDGET_VERSION_H + +#include +#include +#include + +/* + * Note: This class also support non-WAC compliant version numbers + * + * WAC Waikiki Beta Release Core Specification: Widget Runtime + * 10 Dec 2010 + * + * WL-3370 The WRT MUST process widget packages as an update when received under the following conditions: + * + * - the Widget Id matches the Widget Id of an installed widget + * - the Widget version number is greater (as a compared string) than that of the installed widget, or no version + * information was provided for the installed widget + * + * To ensure that a string comparison of widget versions can reliably determine which version is an updated widget, + * WAC will mandate a specific version string format for WAC widgets. All widgets coming through the WAC channel + * will be required to have version strings in this format. Side-loaded widgets may have any format and, in this + * case, there is no requirement that the WRT support version detection for update of these widgets. + * + * The widget version format is the rec-version-tag grammar as described in [Widget Packaging]: + * + * rec-version-tag = 1*DIGIT "." 1*DIGIT [ "." 1*DIGIT] *[ 1*ALPHA / SP / 1*DIGIT ] + * + * Examples of rec-version-tag: + * + * 1.0 + * 1.10.1 beta1 + * 1.02.12 RC1 + * + * WL-3371 The WRT MUST use the following widget version comparison algorithm to compare WAC widget version strings: + * + * - prepare the version strings for comparison: + * - all leading zeros are discarded + * - the optional *[ 1*ALPHA / SP / 1*DIGIT ] part, if present, is discarded + * - the resulting numbers are then in the format major.minor[.micro] + * - Version A = Amajor.Aminor[.Amicro] is equal to Version B = Bmajor.Bminor[.Bmicro] if and only if: + * - Amajor Bmajor + * - Aminor Bminor + * - both Amicro and Bmicro are present and Amicro == Bmicro; or both Amicro and Bmicro are absent. + * - Version A = Amajor.Aminor[.Amicro] is greater than Version B = Bmajor.Bminor[.Bmicro] if and only if: + * - Amajor > Bmajor; or + * - Amajor Bmajor && Aminor > Bminor; or + * - Amajor Bmajor && Aminor == Bminor && both Amicro and Bmicro are present and Amicro > Bmicro; or Bmicro is absent. + */ +class WidgetVersion +{ + private: + bool m_isWac; + DPL::String m_raw; + + DPL::String m_major; + DPL::String m_minor; + DPL::Optional m_micro; + DPL::Optional m_optional; + + void WacCertify(const DPL::String &major, + const DPL::String &minor, + const DPL::Optional µ, + const DPL::Optional &optional); + + public: + explicit WidgetVersion(const DPL::String &str = DPL::String()); + WidgetVersion(const DPL::String &major, + const DPL::String &minor, + const DPL::Optional µ, + const DPL::Optional &optional); + + bool IsWac() const; + const DPL::String &Raw() const; + + const DPL::String &Major() const; + const DPL::String &Minor() const; + const DPL::Optional &Micro() const; + const DPL::Optional &Optional() const; +}; + +bool operator<(const WidgetVersion &left, + const WidgetVersion &right); +bool operator<=(const WidgetVersion &left, + const WidgetVersion &right); +bool operator>(const WidgetVersion &left, + const WidgetVersion &right); +bool operator>=(const WidgetVersion &left, + const WidgetVersion &right); +bool operator==(const WidgetVersion &left, + const WidgetVersion &right); +bool operator!=(const WidgetVersion &left, + const WidgetVersion &right); +std::ostream & operator<<(std::ostream& stream, + const WidgetVersion& version); + +#endif // WIDGET_VERSION_H diff --git a/modules/utils/include/dpl/utils/wrt_global_settings.h b/modules/utils/include/dpl/utils/wrt_global_settings.h new file mode 100644 index 0000000..35fabb3 --- /dev/null +++ b/modules/utils/include/dpl/utils/wrt_global_settings.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file wrt_global_settings.h + * @version 0.6 + * @author Pawel Sikorski(p.sikorski@samsung.com) + * @brief Header file for global predefined wrt setting + */ + +#ifndef WRT_COMMON_GLOBAL_SETTINGS_H_ +#define WRT_COMMON_GLOBAL_SETTINGS_H_ + +namespace GlobalSettings { + +// Methods for getting test mode environment flag +bool TestModeEnabled(); +bool PopupsTestModeEnabled(); +bool WarpTestModeEnabled(); +bool RoamingTestModeEnabled(); +bool OCSPTestModeEnabled(); +bool CrlTestModeEnabled(); +bool MakeScreenTestModeEnabled(); +bool IsEmulator(); + +} + +#endif /* WRT_COMMON_GLOBAL_SETTINGS_H_ */ diff --git a/modules/utils/include/dpl/utils/wrt_utility.h b/modules/utils/include/dpl/utils/wrt_utility.h new file mode 100644 index 0000000..fb2c920 --- /dev/null +++ b/modules/utils/include/dpl/utils/wrt_utility.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file wrt_utility.h + * @version 0.8 + * @author Janusz Majnert + * @brief Common utility functions + */ + +#ifndef _WRT_UTILITY_H_ +#define _WRT_UTILITY_H_ + +#include + +/** + * Joins two paths into one + * + * @param[out] joined String for storing joined paths + * @param[in] parent String containing the first part of path + * @param[in] child String containing the second part of the path + * + * Data stored in joined before the function call will be replaced with joined + * paths. + */ +void WrtUtilJoinPaths(std::string &joined, const std::string &parent, const std::string &child); + +/** + * Creates directories specified by path + * + * @param[in] path Path to create + * @param[in] mode access flags, default to 0755 + * @return true on success, false on failure + * + * Function creates directory specified by path argument and all directories + * leading up to it, if they don't exist. Note that if yout wish to create + * several nested directories, you must make sure that the mode flag allows you + * to write and search the direcotries you create. + */ +bool WrtUtilMakeDir(const std::string &newpath, mode_t mode=0755); + +/** + * This function removes the directory or file pointed to by path + * + * @param[in] path Path to the file/directory to be deleted + * + * @return true on success, false otherwise + */ +bool WrtUtilRemove(const std::string &path); + +/** + * Checks if path exists and is a regular file + * + * @param[in] path the string representing path to check + * + * @return true if regular file is accessible under path, false otherwise + */ +bool WrtUtilFileExists(const std::string &path); + +/** + * Checks if path exists and is a directory + * + * @param[in] path the string representing path to check + * + * @return true if directory is accessible under path, false otherwise + */ +bool WrtUtilDirExists(const std::string &path); + +#endif //_WRT_UTILITY_H_ + diff --git a/modules/utils/src/bash_utils.cpp b/modules/utils/src/bash_utils.cpp new file mode 100644 index 0000000..b76a261 --- /dev/null +++ b/modules/utils/src/bash_utils.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file bash_utils.cpp + * @author Iwanek Tomasz + * @version 1.0 + */ +#include +#include +#include + +#include + +namespace BashUtils { + +std::string escape_arg(const std::string & source) +{ + static const std::string special("!$`\\\""); + std::string ret = "\""; + for(std::string::const_iterator iter = source.begin(); iter != source.end(); ++iter) + { + if(special.find(*iter) != std::string::npos) + { + ret += std::string("\\") + *iter; + } + else + { + ret += *iter; + } + } + return ret + "\""; +} + +} diff --git a/modules/utils/src/file_utils.cpp b/modules/utils/src/file_utils.cpp index 097fd4a..e5100df 100644 --- a/modules/utils/src/file_utils.cpp +++ b/modules/utils/src/file_utils.cpp @@ -29,7 +29,7 @@ #include #include -#include +#include #include @@ -145,7 +145,7 @@ void MakePath(const std::string& path, mode_t mode) { if (mkpath(path.c_str(), mode) == -1) { - ThrowMsg(DPL::CommonException::InternalError, "Cannot make path"); + ThrowMsg(CreateDirectoryException, "Cannot make path"); } } diff --git a/modules/utils/src/folder_size.cpp b/modules/utils/src/folder_size.cpp index 87646f7..2029434 100644 --- a/modules/utils/src/folder_size.cpp +++ b/modules/utils/src/folder_size.cpp @@ -20,74 +20,70 @@ * @version 1.0 * @brief Implementation for function calculating directory size */ - +#include #include -#include #include #include +#include #include #include #include #include -#include +#include namespace Utils { -namespace { - -size_t getObjectSize(const std::string& path) -{ - struct stat tmp; - - if (stat(path.c_str(), &tmp) == -1) { - LogError("Failed to open file" << path); - return 0; - } - //it is not a file nor a directory - //not counting - if (!S_ISDIR(tmp.st_mode) && !S_ISREG(tmp.st_mode)) { - LogWarning("Not a regular file nor a directory: " << path); - return 0; - } - return tmp.st_size; -} -} size_t getFolderSize(const std::string& path) { size_t size = 0; - - DIR *dir; - std::vector localDirs; - if ((dir=opendir(path.c_str())) == NULL) { - LogError("Cannot open dir " << path); + FTS *fts; + FTSENT *ftsent; + char * const paths[] = {const_cast(path.c_str()), NULL}; + + if ((fts = fts_open(paths, FTS_PHYSICAL|FTS_NOCHDIR, NULL)) == NULL) { + //ERROR + int error = errno; + LogWarning(__PRETTY_FUNCTION__ << ": fts_open failed with error: " + << strerror(error)); return 0; } - struct dirent* el; - while ((el = readdir(dir)) != 0) { - if (strcmp(el->d_name, ".") == 0 || strcmp(el->d_name, "..") == 0) { - continue; - } - struct stat tmp; - std::string local = path + el->d_name; - if (stat(local.c_str(), &tmp) == -1) { - LogError("Failed to open file " << local); - char* errstring = strerror(errno); - LogError("Reason: " << errstring); - continue; - } - size += getObjectSize(local); - if (S_ISDIR(tmp.st_mode)) { - localDirs.push_back(local + "/"); + while ((ftsent = fts_read(fts)) != NULL) { + switch (ftsent->fts_info) { + case FTS_DP: + case FTS_DC: + //directory in postorder and directory causing a loop + break; + case FTS_F: + case FTS_D: + case FTS_NSOK: + case FTS_SL: + case FTS_SLNONE: + case FTS_DEFAULT: + //regular files and other objects that can be counted + size += ftsent->fts_statp->st_size; + break; + case FTS_NS: + case FTS_DOT: + case FTS_DNR: + case FTS_ERR: + default: + LogWarning(__PRETTY_FUNCTION__ + << ": traversal failed on file: " + << ftsent->fts_path + << " with error: " + << strerror(ftsent->fts_errno)); + return 0; } } - closedir(dir); - - FOREACH (localDir, localDirs) { - size += getFolderSize(*localDir); + if (fts_close(fts) == -1) { + int error = errno; + LogWarning(__PRETTY_FUNCTION__ << ": fts_close failed with error: " + << strerror(error)); + return 0; } return size; @@ -119,10 +115,11 @@ const int stepSize = 1024; template struct Pre; + template struct Pre { - static const double value = Pre::value * stepSize; + static const double value; static std::string printSize(double fileSize) { if(fileSize >= Pre::value) { @@ -149,9 +146,14 @@ struct Pre<> } }; + const double Pre<>::value = 1.0; +template const double Pre::value(Pre<>::value * stepSize); + typedef Pre FolderSizeToStringType; + + } //anonymous namespace diff --git a/modules/utils/src/mime_type_utils.cpp b/modules/utils/src/mime_type_utils.cpp index 988c1a3..2977a78 100644 --- a/modules/utils/src/mime_type_utils.cpp +++ b/modules/utils/src/mime_type_utils.cpp @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include #include #include #include #include -#include +#include const std::set& MimeTypeUtils::getMimeTypesSupportedForIcon() { diff --git a/modules/utils/src/warp_iri.cpp b/modules/utils/src/warp_iri.cpp index a296ea5..fb8ca70 100644 --- a/modules/utils/src/warp_iri.cpp +++ b/modules/utils/src/warp_iri.cpp @@ -18,14 +18,18 @@ * but there are some patent issue between W3C WARP SPEC and APPLE. * so if you want to use this file, refer to the README file in root directory */ - -#include +#include +#include +#include +#include +#include #include +#include #include #include #include #include -#include +//#include namespace { // All schemes which are supported by external application should be ignored @@ -46,9 +50,10 @@ const DPL::String SCHEMA_FTP = DPL::FromUTF8String("ftp"); // This will create AutoPtr deleter for iri_struct. // Deleter must be in the same namespace as definition of AutoPtr. -namespace ValidationCore { -VC_DECLARE_DELETER(iri_struct, iri_destroy) -} + +namespace DPL{ +DECLARE_DELETER(iri_struct, iri_destroy) +} // namespace DPL WarpIRI::WarpIRI() : m_domain(false), @@ -75,7 +80,7 @@ void WarpIRI::set(const char *p_iri, return; } - ValidationCore::AutoPtr iri(iri_parse(p_iri)); + DPL::AutoPtr iri(iri_parse(p_iri)); if (!iri.get()) { LogError("Error in iri_parse!"); @@ -190,10 +195,6 @@ bool WarpIRI::isAccessDefinition() const return m_isAccessDefinition; } -// KW bool WarpIRI::isIRIValid() const { -// KW return m_isIRIValid; -// KW } - bool WarpIRI::getSubDomain() const { return m_domain; diff --git a/modules/utils/src/widget_version.cpp b/modules/utils/src/widget_version.cpp index 0bf91c1..e19610b 100644 --- a/modules/utils/src/widget_version.cpp +++ b/modules/utils/src/widget_version.cpp @@ -19,7 +19,8 @@ * @version 1.0 * @brief Implementation file for widget version */ -#include +#include +#include #include #include #include diff --git a/modules/utils/src/wrt_global_settings.cpp b/modules/utils/src/wrt_global_settings.cpp index 8695e8a..9428fb3 100644 --- a/modules/utils/src/wrt_global_settings.cpp +++ b/modules/utils/src/wrt_global_settings.cpp @@ -20,35 +20,138 @@ * @author Lukasz Wrzosek (l.wrzosek@samsung.com) * @brief runtime */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include + +namespace GlobalSettings { namespace { -bool GetPopupsEnabledFlag() +const int ROAMING_TEST = 0x00000001; +const int POPUPS_TEST = 0x00000002; +const int OCSP_TEST = 0x00000004; +const int WARP_TEST = 0x00000008; +const int CRL_TEST = 0x00000010; +const int SCREEN_SHOT_TEST = 0x00000020; +const int ALL_TEST = (ROAMING_TEST | POPUPS_TEST | OCSP_TEST | WARP_TEST + | CRL_TEST | SCREEN_SHOT_TEST); +const char* WRT_TEST_MODE = "WRT_TEST_MODE"; +const char* MACHINE_NAME_EMUL = "emulated"; // "arch_emulated" +enum MachineType { - //TODO : env var. will be removed after UX guide for POWDER is enabled. - const char *env = getenv("WRT_POPUP_ENABLE"); - if (env && 0 == strcmp(env, "1")) { - return true; - } else { - return false; - } -} + MACHINE_TYPE_TARGET, + MACHINE_TYPE_EMULATOR, + MACHINE_TYPE_UNKNOWN +}; + +struct Settings { + bool isEmulator; + int testModes; -static bool initializeGlobalSettings(); + Settings() + : isEmulator(false), testModes(0) + {} +}; -static bool initHelper = initializeGlobalSettings(); +Settings gSettings; + +bool initializeGlobalSettings(); +bool initHelper = initializeGlobalSettings(); + +MachineType getMachineType() +{ + // get current machine name + struct utsname u; + if (0 == uname(&u)) { + if (0 == strlen(u.machine)) { + return MACHINE_TYPE_UNKNOWN; + } else { + // If current machine is emul, + // machine name include "_emulated" + std::string machine = u.machine; + // find "emulated" string in the u.machine + if (std::string::npos != machine.find(MACHINE_NAME_EMUL)) { + return MACHINE_TYPE_EMULATOR; + } else { + return MACHINE_TYPE_TARGET; + } + } + } + + return MACHINE_TYPE_UNKNOWN; +} bool initializeGlobalSettings() { (void)initHelper; - LogDebug("Initializing globall settings"); - GlobalSettings::IGlobalSettingsFunctions functions; - functions.getPopupsEnabledFlag = &GetPopupsEnabledFlag; - GlobalSettings::SetPredefinedGlobalSettings(functions); + + // ignore environment variables if this flag is not set +#ifdef GLOBAL_SETTINGS_CONTROL + char * envStr = getenv(WRT_TEST_MODE); + int testMode = 0; + if (NULL != envStr) { + std::string env = envStr; + if ("1" == env) { + testMode = ALL_TEST; + } else { + std::istringstream str(envStr); + while (std::getline(str, env, '|')) { + if ("popups" == env) { + testMode |= POPUPS_TEST; + } else if ("roaming" == env) { + testMode |= ROAMING_TEST;; + } else if ("ocsp" == env) { + testMode |= OCSP_TEST;; + } else if ("warp" == env) { + testMode |= WARP_TEST;; + } else if ("crl" == env) { + testMode |= CRL_TEST; + } else if ("screen" == env) { + testMode |= SCREEN_SHOT_TEST;; + } + } + } + gSettings.testModes = testMode; + } + // TODO other settings initialization + +#endif + gSettings.isEmulator = (MACHINE_TYPE_EMULATOR == getMachineType()); return false; } +} // namespace + +bool TestModeEnabled() +{ + return ((gSettings.testModes & ALL_TEST) == ALL_TEST); +} + +bool PopupsTestModeEnabled() { + return (gSettings.testModes & POPUPS_TEST); +} +bool WarpTestModeEnabled() { + return (gSettings.testModes & WARP_TEST); +} +bool RoamingTestModeEnabled() { + return (gSettings.testModes & ROAMING_TEST); +} +bool OCSPTestModeEnabled() { + return (gSettings.testModes & OCSP_TEST); } +bool CrlTestModeEnabled() { + return (gSettings.testModes & CRL_TEST); +} +bool MakeScreenTestModeEnabled() { + return (gSettings.testModes & SCREEN_SHOT_TEST); +} + +bool IsEmulator() +{ + return gSettings.isEmulator; +} + +} // GlobalSettings diff --git a/modules/utils/src/wrt_utility.cpp b/modules/utils/src/wrt_utility.cpp index f7ecd7d..9bb2187 100644 --- a/modules/utils/src/wrt_utility.cpp +++ b/modules/utils/src/wrt_utility.cpp @@ -14,349 +14,154 @@ * limitations under the License. */ /** - * @file wrt_utility.cpp - * @version 0.6 - * @author Wei Dong(d.wei@samsung.com) - * @author Ma Quan(jason.ma@samsung.com) - * @brief This file implemented some common functions for widget manager + * @file wrt_utility.cpp + * @version 0.8 + * @author Janusz Majnert + * @brief Implementation of some common utility functions */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include +#include +#include +#include #include -#include +#include -using namespace std; - -bool _WrtUtilSetAbsolutePath(char* absolutePath, - const char* parentPath, - const char* fileName) +void WrtUtilJoinPaths(std::string &joined, const std::string &parent, const std::string &child) { - int len; - if (NULL == absolutePath || NULL == parentPath || NULL == fileName) { - return false; + size_t parent_len = parent.length();; + joined=parent; + joined+=child; + //In case someone used windows-style paths + std::replace(joined.begin(), joined.end(), '\\', '/'); + + if (parent_len != 0 && child.length() != 0) { + if (joined[parent_len-1] != '/' && joined[parent_len] != '/') + joined.insert(parent_len, "/"); + else if (joined[parent_len-1] == '/' && joined[parent_len] == '/') + joined.erase(parent_len, 1); } - len = strlen(parentPath); - if (len > 0) { - // not check the valid of parentPath and fileName. - if (parentPath[len - 1] == '/') { - snprintf(absolutePath, - MAX_WIDGET_PATH_LENGTH, - "%s%s", - parentPath, - fileName); - } else { - snprintf(absolutePath, - MAX_WIDGET_PATH_LENGTH, - "%s/%s", - parentPath, - fileName); - } - } else { - LogDebug("The parent path is null"); - return false; - } - - //some widget use Windows notation. We need to change '\' to '/' - for (int i = 0; absolutePath[i] != 0; ++i) { - if (absolutePath[i] == '\\') { - absolutePath[i] = '/'; - } - } - - return true; } -// KW bool _WrtUtilConvertStrToBool(char* value, bool *result) -// KW { -// KW bool ret = false; -// KW if (NULL == value || NULL == result) -// KW { -// KW return ret; -// KW } -// KW -// KW char* source = value; -// KW char* changed = (char*)malloc(strlen(value) + 1); -// KW if (NULL == changed) -// KW { -// KW return ret; -// KW } -// KW memset(changed, 0, strlen(value) + 1); -// KW -// KW char* cur = changed; -// KW while(*source) -// KW { -// KW *cur++ = tolower(*source++); -// KW } -// KW if (!strcmp(changed,"false") || !strcmp(changed,"0")) -// KW { -// KW *result = false; -// KW ret = true; -// KW } -// KW else if(!strcmp(changed,"true") || !strcmp(changed,"1")) -// KW { -// KW *result = true; -// KW ret = true; -// KW } -// KW free(changed); -// KW -// KW return ret; -// KW } - -void _WrtUtilGetDirAndFileName(const char* fullPath, - char** dirName, - char** fileName) +bool WrtUtilMakeDir(const std::string &newpath, mode_t mode) { - int length = 0; - int index = 0; - if (NULL == fullPath || (NULL == dirName && NULL == fileName)) { - return; - } - - length = strlen(fullPath); - for (index = length - 1; index >= 0; index--) { - if ('/' == fullPath[index]) { - if (index == length - 1) { - LogDebug(" Warning: The end of directroy is '/'! "); - if (dirName) { - *dirName = (char*)malloc(sizeof(char) * (length + 1)); - if (*dirName != NULL) { - memset(*dirName, 0, sizeof(char) * (length + 1)); - strncpy(*dirName, fullPath, length); - } - } - return; - } - break; - } - } - if (index >= 0) { - if (dirName) { - int dirName_len = index + 2; - - *dirName = (char*)malloc(sizeof(char) * dirName_len); - if (*dirName != NULL) { - memset(*dirName, 0, sizeof(char) * dirName_len); - strncpy(*dirName, fullPath, dirName_len - 1); - } - } - - if (fileName) { - int fileName_len = length - index; + size_t pos = 0; + int error; - *fileName = (char*)malloc(sizeof(char) * fileName_len); - if (*fileName != NULL) { - memset(*fileName, 0, sizeof(char) * fileName_len); - strncpy(*fileName, &fullPath[index + 1], fileName_len - 1); - } - } - } else { - if (fileName) { - *fileName = (char*)malloc(sizeof(char) * (length + 1)); - if (*fileName != NULL) { - memset(*fileName, 0, sizeof(char) * (length + 1)); - strncpy(*fileName, fullPath, length); - } - } - } -} + if (newpath.length() == 0) return false; -// KW bool _WrtUtilStringCmp(const char* srcStr, const char* destStr) -// KW { -// KW bool ret = false; -// KW char* strString = NULL; -// KW char* destString = NULL; -// KW -// KW if (NULL == srcStr || NULL == destStr ) -// KW { -// KW return ret; -// KW } -// KW -// KW _WrtUtilStringToLower(srcStr, &strString); -// KW _WrtUtilStringToLower(destStr,&destString); -// KW -// KW if(!strcmp(strString, destString)) -// KW { -// KW ret = true; -// KW } -// KW -// KW free(strString); -// KW free(destString); -// KW -// KW return ret; -// KW } + std::string path=newpath; -// check it deeply later. -bool _WrtMakeDir (const char *path, - long mode, - int flags) -{ - if (NULL == path) { - return false; - } + if (*(path.rbegin()) != '/') path += '/'; - const int defaultMode = 0777; - if (!(flags & WRT_FILEUTILS_RECUR)) { - if (mkdir(path, defaultMode) < 0) { - LogDebug("Failed to make dir " << path); + while ((pos = path.find('/', pos+1)) != std::string::npos) { + if (mkdir(path.substr(0, pos).c_str(), mode) != 0) { + error=errno; + if (error == EEXIST) continue; + LogWarning(__PRETTY_FUNCTION__ << ": failed to create directory " + << path.substr(0,pos) + << ". Error: " + << strerror(error)); return false; } - if (mode != -1 && chmod(path, mode) < 0) { - LogDebug("Failed to chmod"); - remove(path); - return false; - } - } else { - struct stat st; - if (stat(path, &st) < 0 && errno == ENOENT) { - bool ret; - char *buf = NULL; - char *parent = NULL; - // mode_t mask; - - // mask = umask (0); - // umask (mask); - - buf = strdup(path); - parent = dirname(buf); - //ret = _WrtMakeDir(parent, (defaultMode & ~mask) | 0300, WRT_FILEUTILS_RECUR); - ret = _WrtMakeDir(parent, (defaultMode) | 0300, WRT_FILEUTILS_RECUR); - free(buf); - - if ((!ret) || (!_WrtMakeDir(path, mode, 0))) { - LogDebug("Failed to _WrtMakeDir"); - return false; - } - } } - return true; } -bool _WrtUtilChangeDir(const char* path) +bool WrtUtilRemove(const std::string &path) { - if (NULL == path) { + FTS *fts; + FTSENT *ftsent; + bool rv = true; + int error = 0; + char * const paths[] = {const_cast(path.c_str()), NULL}; + + if ((fts = fts_open(paths, FTS_PHYSICAL|FTS_NOCHDIR, NULL)) == NULL) { + //ERROR + error = errno; + LogWarning(__PRETTY_FUNCTION__ << ": fts_open failed with error: " + << strerror(error)); return false; } - if (-1 == chdir(path)) { - if (ENOENT == errno) { - if (!_WrtMakeDir(path, 0664, WRT_FILEUTILS_RECUR)) { - return false; - } - if (-1 == chdir(path)) { - remove(path); - return false; - } - } else { - return false; + + while ((ftsent = fts_read(fts)) != NULL) { + switch (ftsent->fts_info) { + case FTS_D: + //directory in preorder - do nothing + break; + case FTS_DP: + //directory in postorder - remove + if (rmdir(ftsent->fts_accpath) != 0) { + error = errno; + LogWarning(__PRETTY_FUNCTION__ + << ": rmdir failed with error: " + << strerror(error)); + rv = false; + } + break; + case FTS_DC: + case FTS_F: + case FTS_NSOK: + case FTS_SL: + case FTS_SLNONE: + case FTS_DEFAULT: + //regular files and other objects that can safely be removed + if (unlink(ftsent->fts_accpath) != 0) { + error = errno; + LogWarning(__PRETTY_FUNCTION__ + << ": unlink failed with error: " + << strerror(error)); + rv = false; + } + break; + case FTS_NS: + LogWarning(__PRETTY_FUNCTION__ + << ": couldn't get stat info for file: " + << ftsent->fts_path + << ". The error was: " + << strerror(ftsent->fts_errno)); + rv = false; + break; + case FTS_DOT: + case FTS_DNR: + case FTS_ERR: + default: + LogWarning(__PRETTY_FUNCTION__ + << ": traversal failed with error: " + << strerror(ftsent->fts_errno)); + rv = false; + break; } } - return true; + if (fts_close(fts) == -1) { + error = errno; + LogWarning(__PRETTY_FUNCTION__ << ": fts_close failed with error: " + << strerror(error)); + rv = false; + } + return rv; } -bool _WrtUtilRemoveDir(const char* path) +bool WrtUtilFileExists(const std::string &path) { - DIR* dir = NULL; - struct dirent* ptr = NULL; - char childPath[MAX_WIDGET_PATH_LENGTH + 1] = { 0 }; - if (path == NULL) { - LogWarning("Path is null"); - return false; - } - dir = opendir(path); - if (NULL != dir) { - while ((ptr = readdir(dir)) != NULL) { - if ((!strcmp(ptr->d_name, ".")) || (!strcmp(ptr->d_name, ".."))) { - continue; - } - int len = strlen(path); - if (path[len - 1] == '/') { - snprintf(childPath, - MAX_WIDGET_PATH_LENGTH, - "%s%s", - path, - ptr->d_name); - } else { - snprintf(childPath, - MAX_WIDGET_PATH_LENGTH, - "%s/%s", - path, - ptr->d_name); - } - if (ptr->d_type == DT_DIR) { - if (!_WrtUtilRemoveDir(childPath)) { - closedir(dir); - return false; - } - } else { - if (unlink(childPath) != 0) { - closedir(dir); - LogWarning("Failed to remove file " << childPath); - return false; - } - } - } - closedir(dir); - } else if (errno == ENOTDIR) { - if (unlink(path) != 0) { - LogWarning("Failed to remove file " << path); - return false; - } - return true; - } else if (errno == ENOENT) { //not exist - LogWarning("Cannot remove non existent directory " << path); - return true; + struct stat tmp; + if (stat(path.c_str(),&tmp) == 0) { + return S_ISREG(tmp.st_mode); } else { - LogWarning("Can't remove directory " << path); return false; } - if (rmdir(path) != 0) { - LogWarning("Removing directory failed :" << path << " errno: " << errno); - return false; - } - - return true; } -bool -_WrtUtilStringToLower(const char* str, - char** lowerStr) +bool WrtUtilDirExists(const std::string &path) { - if (!str || !lowerStr) { - return true; - } - - char* cur = NULL; - int length = strlen(str); - - *lowerStr = (char*)malloc(length + 1); - - if (!(*lowerStr)) { + struct stat tmp; + if (stat(path.c_str(),&tmp) == 0) { + return S_ISDIR(tmp.st_mode); + } else { return false; } - - memset(*lowerStr, 0, length + 1); - strncpy(*lowerStr, str, length); - - cur = *lowerStr; - - while (*str != '\0') { - *cur++ = tolower(*str++); - //cur++; - } - - return true; } diff --git a/modules/widget_dao/CMakeLists.txt b/modules/widget_dao/CMakeLists.txt index 82403c9..cf1034f 100644 --- a/modules/widget_dao/CMakeLists.txt +++ b/modules/widget_dao/CMakeLists.txt @@ -1,3 +1,5 @@ +SET(TARGET_WRT_DAO_DB "Sqlite3DbWRT") + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_BINARY_DIR}/modules/widget_dao/database_checksum.h COMMAND ${CMAKE_SOURCE_DIR}/modules/widget_dao/orm/gen_db_md5.sh @@ -22,7 +24,7 @@ ADD_CUSTOM_COMMAND( OUTPUT .wrt.db-journal ARGS ${CMAKE_CURRENT_BINARY_DIR}/.wrt.db-journal ) -ADD_CUSTOM_TARGET(Sqlite3DbWRT ALL DEPENDS .wrt.db .wrt.db-journal) +ADD_CUSTOM_TARGET(${TARGET_WRT_DAO_DB} ALL DEPENDS .wrt.db .wrt.db-journal) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/wrt_db.sql DESTINATION share/wrt-engine/ @@ -33,7 +35,6 @@ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/wrt_db.sql INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(WRT_DAO_DEPS - cert-svc ecore appcore-efl libxml-2.0 @@ -45,7 +46,6 @@ set(WRT_DAO_RO_SOURCES dao/common_dao_types.cpp dao/feature_dao_read_only.cpp dao/global_dao_read_only.cpp - dao/global_config.cpp dao/path_builder.cpp dao/plugin_dao_read_only.cpp dao/property_dao_read_only.cpp @@ -62,8 +62,6 @@ set(WRT_DAO_RW_SOURCES dao/widget_dao.cpp ) -ADD_DEFINITIONS("-DSEPARATED_SINGLETON_IMPLEMENTATION") - SET(WRT_DAO_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/modules/widget_dao/include ${PROJECT_SOURCE_DIR}/modules/event/include @@ -71,16 +69,18 @@ SET(WRT_DAO_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/modules/core/include ${PROJECT_SOURCE_DIR}/modules/db/include ${PROJECT_SOURCE_DIR}/modules/log/include - ${WRT_DAO_DEPS_INCLUDE_DIRS} - ) + ${PROJECT_SOURCE_DIR}/modules/localization/include +) INCLUDE_DIRECTORIES(${WRT_DAO_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(SYSTEM ${WRT_DAO_DEPS_INCLUDE_DIRS}) ADD_LIBRARY(${TARGET_WRT_DAO_RO_LIB} SHARED ${WRT_DAO_RO_SOURCES} ) SET_TARGET_PROPERTIES(${TARGET_WRT_DAO_RO_LIB} PROPERTIES - SOVERSION ${VERSION}) + SOVERSION ${API_VERSION} + VERSION ${VERSION}) SET_TARGET_PROPERTIES(${TARGET_WRT_DAO_RO_LIB} PROPERTIES COMPILE_FLAGS -fPIC) @@ -92,11 +92,13 @@ target_link_libraries(${TARGET_WRT_DAO_RO_LIB} ${TARGET_DPL_EFL} ${TARGET_DPL_DB_EFL} ${WRT_DAO_DEPS_LIBRARIES}) +ADD_DEPENDENCIES(${TARGET_WRT_DAO_RO_LIB} ${TARGET_WRT_DAO_DB}) ADD_LIBRARY(${TARGET_WRT_DAO_RW_LIB} SHARED ${WRT_DAO_RW_SOURCES}) SET_TARGET_PROPERTIES(${TARGET_WRT_DAO_RW_LIB} PROPERTIES - SOVERSION ${VERSION}) + SOVERSION ${API_VERSION} + VERSION ${VERSION}) SET_TARGET_PROPERTIES(${TARGET_WRT_DAO_RW_LIB} PROPERTIES COMPILE_FLAGS -fPIC) @@ -105,16 +107,13 @@ SET_TARGET_PROPERTIES(${TARGET_WRT_DAO_RW_LIB} PROPERTIES target_link_libraries(${TARGET_WRT_DAO_RW_LIB} ${TARGET_WRT_DAO_RO_LIB}) +ADD_DEPENDENCIES(${TARGET_WRT_DAO_RW_LIB} ${TARGET_WRT_DAO_DB}) INSTALL(TARGETS ${TARGET_WRT_DAO_RO_LIB} - DESTINATION lib - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - ) + DESTINATION lib) INSTALL(TARGETS ${TARGET_WRT_DAO_RW_LIB} - DESTINATION lib - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - ) + DESTINATION lib) INSTALL(FILES include/dpl/wrt-dao-ro/config_parser_data.h @@ -127,10 +126,12 @@ INSTALL(FILES include/dpl/wrt-dao-ro/plugin_dao_read_only.h include/dpl/wrt-dao-ro/property_dao_read_only.h include/dpl/wrt-dao-ro/widget_config.h + include/dpl/wrt-dao-ro/vconf_config.h include/dpl/wrt-dao-ro/widget_dao_read_only.h + include/dpl/wrt-dao-ro/wrt_db_types.h include/dpl/wrt-dao-ro/WrtDatabase.h DESTINATION include/dpl-efl/dpl/wrt-dao-ro - ) + ) INSTALL(FILES include/dpl/wrt-dao-rw/feature_dao.h diff --git a/modules/widget_dao/dao/WrtDatabase.cpp b/modules/widget_dao/dao/WrtDatabase.cpp index f3fabe6..106d98a 100644 --- a/modules/widget_dao/dao/WrtDatabase.cpp +++ b/modules/widget_dao/dao/WrtDatabase.cpp @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#include #include #include @@ -39,9 +39,14 @@ DPL::DB::ThreadDatabaseSupport WrtDatabase::m_interface( WrtDatabase::Address(), WrtDatabase::Flags()); -void WrtDatabase::attachToThread() +void WrtDatabase::attachToThreadRO() +{ + m_interface.AttachToThread(DPL::DB::SqlConnection::Flag::RO); +} + +void WrtDatabase::attachToThreadRW() { - m_interface.AttachToThread(); + m_interface.AttachToThread(DPL::DB::SqlConnection::Flag::RW); } void WrtDatabase::detachFromThread() diff --git a/modules/widget_dao/dao/common_dao_types.cpp b/modules/widget_dao/dao/common_dao_types.cpp index 94e1222..49abd87 100644 --- a/modules/widget_dao/dao/common_dao_types.cpp +++ b/modules/widget_dao/dao/common_dao_types.cpp @@ -20,145 +20,6 @@ * @version 1.0 * @brief This file contains the implementation of common data types for wrtdb */ - -#include - -#include - +#include namespace WrtDB { -namespace Powder { - -Description::LevelEntry::LevelEntry(LevelEnum level) : - level(level) -{ -} - -bool Description::LevelEntry::isContextValid(LevelEnum level, - const DPL::OptionalString& aContext) const -{ - if (!aContext) { - return level < level; - } else { - Context::const_iterator iter = context.find(*aContext); - if (iter != context.end()) { - return level < level; - } else { - return true; - } - } -} - -bool Description::CategoryEntry::isCategoryValid(LevelEntry& aReason, - LevelEnum aLevel, - const DPL::OptionalString& aContext) const -{ - for (LevelsContainer::const_iterator iter = levels.begin(); - iter != levels.end(); ++iter) { - if (!iter->isContextValid(aLevel, aContext)) { - aReason = *iter; - return false; - } - } - return true; -} -} - -namespace ChildProtection -{ - -PowderRules::CategoryRule::CategoryRule(const DPL::String& aCategory, - Powder::Description::LevelEnum aLevel, - const DPL::OptionalString& aContext) : - category(aCategory), - level(aLevel), - context(aContext) -{ -} - -PowderRules::PowderResult::PowderResult(InvalidReason aReason, - const Powder::Description::LevelEntry& anInvalidDescription, - const CategoryRule& anInvalidRule) : - invalidDescription(anInvalidDescription), - invalidRule(anInvalidRule), - reason(aReason) -{ -} - -//! Function checks if rule is fulfilled by description -//! \param[in] rule checked rule -//! \param[in] description -//! \retval true rule is valid -//! \retval false rule is invalid -PowderRules::ResultPair PowderRules::isRuleValidForDescription( - const CategoryRule& aRule, - const Powder::Description& aDescription) const -{ - Powder::Description::CategoryEntries::const_iterator - iter = aDescription.categories.find(aRule.category); - if (iter != aDescription.categories.end()) { - Powder::Description::LevelEntry invalidDescription; - if (!iter->second.isCategoryValid(invalidDescription, aRule.level, - aRule.context)) { - LogWarning("Widget forbidden for children detected"); - return std::make_pair(false, - PowderResult(PowderResult::InvalidRule, - invalidDescription, - aRule)); - } else { - return std::make_pair(true, PowderResult()); - } - } else { - return std::make_pair(true, PowderResult()); - } -} - -//! Function checks if age limit is fulfilled by description -//! \param[in] description -//! \retval true age is valid -//! \retval false age is invalid -PowderRules::ResultPair PowderRules::isAgeValidForDescription( - const Powder::Description& aDescription) const -{ - if (!ageLimit) { - return std::make_pair(true, PowderResult()); - } else { - if (!!aDescription.ageRating) { - if (*aDescription.ageRating <= *ageLimit) { - return std::make_pair(true, PowderResult()); - } else { - return std::make_pair(false, - PowderResult(PowderResult::InvalidAge)); - } - } else { - if (!isAgeRatingRequired) { - return std::make_pair(true, PowderResult()); - } else { - return std::make_pair( - false, - PowderResult(PowderResult::AgeRatingNotSet)); - } - } - } -} - -//! Function check if Widget description is valid for ChildProtection -//! configuration -//! \param description widget description -//! \retval true widget is valid -//! \retval false widget is invalid -PowderRules::ResultPair PowderRules::isDescriptionValid( - const Powder::Description& aDescription) const -{ - ResultPair powderResult; - for (RulesContainer::const_iterator iter = rules.begin(); - iter != rules.end(); ++iter) { - powderResult = isRuleValidForDescription(*iter, aDescription); - if (!powderResult.first) { - return powderResult; - } - } - return isAgeValidForDescription(aDescription); -} - -} } // namespace WrtDB diff --git a/modules/widget_dao/dao/config_parser_data.cpp b/modules/widget_dao/dao/config_parser_data.cpp old mode 100644 new mode 100755 index d2550cc..2fbd0f6 --- a/modules/widget_dao/dao/config_parser_data.cpp +++ b/modules/widget_dao/dao/config_parser_data.cpp @@ -19,12 +19,16 @@ * @version 0.1 * @brief */ +#include #include #include #include #include namespace WrtDB { +bool IsSpace(const xmlChar* str); +bool CopyChar(xmlChar* out, xmlChar* in); + bool IsSpace(const xmlChar* str) { @@ -87,6 +91,8 @@ bool IsSpace(const xmlChar* str) case 0xa9: case 0xaf: return true; + default: + return false; } case 0x81: if (*(str + 2) == 0x9f) { @@ -293,6 +299,36 @@ bool ConfigParserData::Feature::operator<=(const Feature& other) const return paramsList <= other.paramsList; } +bool ConfigParserData::Privilege::operator==(const Privilege& other) const +{ + return name == other.name; +} + +bool ConfigParserData::Privilege::operator!=(const Privilege& other) const +{ + return name != other.name; +} + +bool ConfigParserData::Privilege::operator >(const Privilege& other) const +{ + return name > other.name; +} + +bool ConfigParserData::Privilege::operator>=(const Privilege& other) const +{ + return name >= other.name; +} + +bool ConfigParserData::Privilege::operator <(const Privilege& other) const +{ + return name < other.name; +} + +bool ConfigParserData::Privilege::operator<=(const Privilege& other) const +{ + return name < other.name; +} + bool ConfigParserData::Icon::operator==(const Icon& other) const { return src == other.src; @@ -421,4 +457,25 @@ bool ConfigParserData::ServiceInfo::operator!= (const ServiceInfo& info) const m_scheme != info.m_scheme && m_mime != info.m_mime; } + +bool ConfigParserData::LiveboxInfo::operator==(const LiveboxInfo& other) const +{ + return m_liveboxId == other.m_liveboxId && + m_autoLaunch == other.m_autoLaunch && + m_updatePeriod == other.m_updatePeriod && + m_primary == other.m_primary && + m_label == other.m_label && + m_icon == other.m_icon; +} + +bool ConfigParserData::LiveboxInfo::operator!=(const LiveboxInfo& other) const +{ + return m_liveboxId != other.m_liveboxId && + m_autoLaunch != other.m_autoLaunch && + m_updatePeriod != other.m_updatePeriod && + m_primary != other.m_primary && + m_label != other.m_label && + m_icon != other.m_icon; +} + } // namespace WrtDB diff --git a/modules/widget_dao/dao/feature_dao.cpp b/modules/widget_dao/dao/feature_dao.cpp old mode 100644 new mode 100755 index 60c7151..2a272d2 --- a/modules/widget_dao/dao/feature_dao.cpp +++ b/modules/widget_dao/dao/feature_dao.cpp @@ -22,7 +22,7 @@ * @version 1.0 * @brief This file contains the definition of feature configuration. */ - +#include #include #include #include @@ -32,8 +32,6 @@ namespace WrtDB { namespace FeatureDAO { -const int STRANGE_FEATURE_PROPERTIES_ID = 0; - FeatureHandle RegisterFeature(const PluginMetafileData::Feature &feature, const DbPluginHandle pluginHandle) { @@ -115,49 +113,48 @@ FeatureHandle RegisterFeature(const PluginMetafileData::Feature &feature, } } -FeatureHandle RegisterStrangeFeature(const std::string& featureName) +void UnregisterFeature(FeatureHandle featureHandle) { Try { - LogDebug("Registering Feature " << featureName); - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + LogDebug("Unregistering Feature " << featureHandle); + DPL::DB::ORM::wrt::ScopedTransaction transaction( + &WrtDatabase::interface()); - if (FeatureDAOReadOnly::isFeatureInstalled(featureName)) { - LogError(" >> Feature " << featureName << - " is already registered."); - transaction.Commit(); - return -1; + if (FeatureDAOReadOnly::isFeatureInstalled(featureHandle)) { + LogError("Feature handle is invalid"); + return; } using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::wrt; - //register feature - LogInfo(" |-- Registering feature " << featureName); - - FeaturesList::Row row; - row.Set_FeatureName(DPL::FromUTF8String(featureName)); + // Unregister DeviceCapabilities + FeatureDAOReadOnly::DeviceCapabilitiesList capabilitiesList = + FeatureDAOReadOnly(featureHandle).GetDeviceCapabilities(); - // PluginPropertiesId '0' is not used as PluginPropertiesId for normal features(calendar, contact....). - // PluginPropertiesId for normal features start from '1' - row.Set_PluginPropertiesId(STRANGE_FEATURE_PROPERTIES_ID); - - WRT_DB_INSERT(insert, FeaturesList, &WrtDatabase::interface()) - insert->Values(row); - insert->Execute(); - - FeatureHandle featureHandle = - FeatureDAOReadOnly(featureName).GetFeatureHandle(); + FOREACH(it, capabilitiesList) { + WRT_DB_DELETE(del, DeviceCapabilities, &WrtDatabase::interface()) + del->Where( + Equals( + DPL::FromUTF8String(*it))); + del->Execute(); + } + // Unregister Feature + WRT_DB_DELETE(del, FeaturesList, &WrtDatabase::interface()) + del->Where(Equals(featureHandle)); + del->Execute(); transaction.Commit(); - return featureHandle; + return; } Catch(DPL::DB::SqlConnection::Exception::Base){ ReThrowMsg(FeatureDAOReadOnly::Exception::DatabaseError, - "Failure during Registering Feature"); + "Fail to unregister Feature"); } } + } // namespace FeatureDAO } // namespace WrtDB diff --git a/modules/widget_dao/dao/feature_dao_read_only.cpp b/modules/widget_dao/dao/feature_dao_read_only.cpp index adf11e9..1d20bdf 100644 --- a/modules/widget_dao/dao/feature_dao_read_only.cpp +++ b/modules/widget_dao/dao/feature_dao_read_only.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief This file contains the implementation of feature dao read only */ - +#include #include #include #include @@ -76,26 +76,6 @@ FeatureDAOReadOnly::FeatureDAOReadOnly(const std::string &featureName) failure.str()); \ } -std::string FeatureDAOReadOnly::GetInstallURI() const -{ - GET_PLUGIN_DATA(getInstallURI) -} - -std::string FeatureDAOReadOnly::GetKeyCn() const -{ - GET_PLUGIN_DATA(getKeyCn) -} - -std::string FeatureDAOReadOnly::GetRootKey() const -{ - GET_PLUGIN_DATA(getRootKey) -} - -std::string FeatureDAOReadOnly::GetRootKeyFingerprint() const -{ - GET_PLUGIN_DATA(getRootKeyFingerprint) -} - std::string FeatureDAOReadOnly::GetLibraryPath() const { GET_PLUGIN_DATA(getLibraryPath) @@ -319,4 +299,95 @@ FeatureHandleListPtr FeatureDAOReadOnly::GetFeatureHandleListForPlugin( } } +FeatureDAOReadOnly::NameMap +FeatureDAOReadOnly::GetNames() +{ + Try { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + WRT_DB_SELECT(select, FeaturesList, &WrtDatabase::interface()) + + NameMap nameMap; + + FeaturesList::Select::RowList rows = select->GetRowList(); + FOREACH(rowIt, rows) + { + nameMap.insert(std::pair(rowIt->Get_FeatureUUID(), DPL::ToUTF8String(rowIt->Get_FeatureName()))); + } + + return nameMap; + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(FeatureDAOReadOnly::Exception::DatabaseError, + "Failure during getting GetNames"); + } +} + +FeatureDAOReadOnly::DeviceCapabilitiesMap +FeatureDAOReadOnly::GetDevCapWithFeatureHandle() +{ + Try { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + DECLARE_COLUMN_TYPE_LIST() + SELECTED_COLUMN(FeatureDeviceCapProxy, FeatureUUID) + SELECTED_COLUMN(DeviceCapabilities, DeviceCapName) + DECLARE_COLUMN_TYPE_LIST_END(DevCapNameList) + + WRT_DB_SELECT(select, FeatureDeviceCapProxy, &WrtDatabase::interface()) + select->Join(Equal()); + + DeviceCapabilitiesMap devCap; + + std::list< CustomRow > rowList = select->GetCustomRowList< DevCapNameList, CustomRow >(); + FOREACH(rowIt, rowList) + { + FeatureHandle featureHandle = (*rowIt).GetColumnData(); + std::string devName = DPL::ToUTF8String((*rowIt).GetColumnData()); + devCap.insert(std::pair(featureHandle, devName)); + } + + return devCap; + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(FeatureDAOReadOnly::Exception::DatabaseError, + "Failure during getting DeviceCapabilities names"); + } +} + +FeatureDAOReadOnly::FeatureMap +FeatureDAOReadOnly::GetFeatures(const std::list& featureNames) +{ + Try { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + std::set nameList; + FOREACH(nm, featureNames) { + nameList.insert(DPL::FromUTF8String(*nm)); + } + + WRT_DB_SELECT(select, FeaturesList, &WrtDatabase::interface()) + select->Where(In(nameList)); + + FeatureMap featureMap; + FeatureData featureData; + FeaturesList::Select::RowList rows = select->GetRowList(); + FOREACH(rowIt, rows) { + featureData.featureName = DPL::ToUTF8String( + rowIt->Get_FeatureName()); + featureData.pluginHandle = rowIt->Get_PluginPropertiesId(); + featureMap.insert(std::pair( + rowIt->Get_FeatureUUID(), featureData)); + } + + return featureMap; + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(FeatureDAOReadOnly::Exception::DatabaseError, + "Failure during getting GetFeatures"); + } +} + } // namespace WrtDB diff --git a/modules/widget_dao/dao/global_dao.cpp b/modules/widget_dao/dao/global_dao.cpp index 6f1f406..cf7d818 100644 --- a/modules/widget_dao/dao/global_dao.cpp +++ b/modules/widget_dao/dao/global_dao.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief This file contains the definition of global dao class. */ - +#include #include #include #include @@ -29,73 +29,6 @@ #include namespace WrtDB { - -void GlobalDAO::AddAdultBlackListElement(const DPL::String &url) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - - ScopedTransaction transaction(&WrtDatabase::interface()); - if (IsElementOnAdultBlackList(url)) { - transaction.Commit(); - return; - } - - WRT_DB_INSERT(insert, ChildProtectionBlacklist, &WrtDatabase::interface()) - ChildProtectionBlacklist::Row row; - row.Set_url(url); - - insert->Values(row); - insert->Execute(); - transaction.Commit(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to add element to AdultBlackList"); - } -} - -void GlobalDAO::RemoveAdultBlackListElement(const DPL::String &url) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_DELETE(deleteFrom, ChildProtectionBlacklist, &WrtDatabase::interface()) - - deleteFrom->Where(Equals(url)); - deleteFrom->Execute(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to removed element from AdultBlackList"); - } -} - -void GlobalDAO::UpdateAdultBlackList(const DPL::String &oldUrl, - const DPL::String &newUrl) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - - ScopedTransaction transaction(&WrtDatabase::interface()); - if (IsElementOnAdultBlackList(newUrl)) { - transaction.Commit(); - return; - } - WRT_DB_UPDATE(update, ChildProtectionBlacklist, &WrtDatabase::interface()) - ChildProtectionBlacklist::Row row; - row.Set_url(newUrl); - - update->Where(Equals(oldUrl)); - update->Values(row); - update->Execute(); - transaction.Commit(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to update an element in AdultBlackList"); - } -} - void GlobalDAO::SetDeveloperMode(bool mode) { LogDebug("updating Developer mode to:" << mode); @@ -115,76 +48,6 @@ void GlobalDAO::SetDeveloperMode(bool mode) } } -void GlobalDAO::AddDefferedWidgetPackageInstallation(const DPL::String &path) -{ - LogDebug("Adding widget package as defered. Path: " << path); - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - DefferedWidgetPackageInstallation::Row row; - row.Set_path(path); - - WRT_DB_INSERT(insert, DefferedWidgetPackageInstallation, &WrtDatabase::interface()) - insert->Values(row); - insert->Execute(); - } - Catch(DPL::DB::SqlConnection::Exception::Base){ - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to add defered widget package"); - } -} - -void GlobalDAO::RemoveDefferedWidgetPackageInstallation(const DPL::String &path) -{ - LogDebug("Remove widget package from differed list. Path: " << path); - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_DELETE(del, DefferedWidgetPackageInstallation, &WrtDatabase::interface()) - del->Where(Equals(path)); - del->Execute(); - } - Catch(DPL::DB::SqlConnection::Exception::Base){ - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to remove defered widget package"); - } -} - -void GlobalDAO::SetParentalMode(bool parental_status) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - GlobalProperties::Row row; - row.Set_parental_mode(parental_status); - WRT_DB_UPDATE(update, GlobalProperties, &WrtDatabase::interface()) - - update->Values(row); - update->Execute(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to update Parental Mode"); - } -} - -void GlobalDAO::SetParentalAllowedAge(const DPL::OptionalInt& age) -{ - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - Try { - typedef wrt::GlobalProperties::Row ParentalAllowedAgeRow; - - ParentalAllowedAgeRow row; - row.Set_parental_allowed_age(age); - WRT_DB_UPDATE(update, GlobalProperties, &WrtDatabase::interface()) - update->Values(row); - update->Execute(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to update Parental Mode"); - } -} - void GlobalDAO::SetSecureByDefault(bool secure) { //If secure == true -> widget does not need to be signed @@ -257,105 +120,6 @@ void GlobalDAO::setComplianceFakeMeid(const std::string &meid) } } -void GlobalDAO::AddCategoryRule(const ChildProtection::PowderRules:: - CategoryRule& powder) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - PowderRules::Row row; - row.Set_category(powder.category); - row.Set_level(powder.level); - row.Set_context(powder.context); - - wrt::ScopedTransaction transaction(&WrtDatabase::interface()); - if (IsPowderRulePresent(powder)) { - transaction.Commit(); - return; - } - WRT_DB_INSERT(insert, PowderRules, &WrtDatabase::interface()) - - insert->Values(row); - insert->Execute(); - transaction.Commit(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to add POWDER rules"); - } -} - -void GlobalDAO::RemoveCategoryRule(const ChildProtection::PowderRules:: - CategoryRule& powder) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - - if (!powder.context.IsNull()) { - WRT_DB_DELETE(delWithContext, PowderRules, &WrtDatabase::interface()) - - delWithContext->Where( - And(Equals(powder.category), - And(Equals(powder.level), - Equals(powder.context)))); - delWithContext->Execute(); - } else { - WRT_DB_DELETE(delWithoutContext, PowderRules, &WrtDatabase::interface()) - delWithoutContext->Where( - And(Equals(powder.category), - And(Equals(powder.level), - Is(powder.context)))); - delWithoutContext->Execute(); - } - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to remove POWDER rules"); - } -} - -void GlobalDAO::UpdateCategoryRule( - const ChildProtection::PowderRules::CategoryRule& oldRule, - const ChildProtection::PowderRules::CategoryRule& newRule) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - PowderRules::Row row; - row.Set_category(newRule.category); - row.Set_level(newRule.level); - row.Set_context(newRule.context); - - wrt::ScopedTransaction transaction(&WrtDatabase::interface()); - - if (IsPowderRulePresent(newRule)) { - transaction.Commit(); - return; - } - - if (!oldRule.context.IsNull()) { - WRT_DB_UPDATE(updateWithContext, PowderRules, &WrtDatabase::interface()) - updateWithContext->Where( - And(Equals(oldRule.category), - And(Equals(oldRule.level), - Equals(oldRule.context)))); - updateWithContext->Values(row); - updateWithContext->Execute(); - } else { - WRT_DB_UPDATE(updateWithoutContext, PowderRules, &WrtDatabase::interface()) - updateWithoutContext->Where( - And(Equals(oldRule.category), - And(Equals(oldRule.level), - Is(oldRule.context)))); - updateWithoutContext->Values(row); - updateWithoutContext->Execute(); - } - transaction.Commit(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Failed to update POWDER rules"); - } -} - void GlobalDAO::SetHomeNetworkDataUsage(GlobalDAO::NetworkAccessMode newMode) { LogDebug("updating home network data usage to:" << newMode); @@ -394,41 +158,6 @@ void GlobalDAO::SetRoamingDataUsage(GlobalDAO::NetworkAccessMode newMode) } } -void GlobalDAO::SetAutoSaveIdPasswd(const DPL::String &url, - const AutoSaveData &saveData) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - ScopedTransaction transaction(&WrtDatabase::interface()); - AutoSaveIdPasswd::Row row; - - row.Set_address(url); - row.Set_userId(saveData.userId); - row.Set_passwd(saveData.passwd); - - DPL::Optional savedData = - GetAutoSaveIdPasswd(url); - - if (!savedData.IsNull()) { - WRT_DB_UPDATE(update, AutoSaveIdPasswd, &WrtDatabase::interface()) - - update->Where(Equals(url)); - update->Values(row); - update->Execute(); - } else { - WRT_DB_INSERT(insert, AutoSaveIdPasswd, &WrtDatabase::interface()); - insert->Values(row); - insert->Execute(); - } - - transaction.Commit(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAO::Exception::DatabaseError, - "Fail to register id, passwd for autosave"); - } -} - void GlobalDAO::AddWhiteURI(const std::string &uri, bool subDomain) { LogDebug("Add White URI : " << uri); @@ -468,4 +197,23 @@ void GlobalDAO::RemoveWhiteURI(const std::string &uri) } } +void GlobalDAO::SetCookieSharingMode(bool mode) +{ + LogDebug("updating Cookie Sharing mode to:" << mode); + Try { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + GlobalProperties::Row row; + row.Set_cookie_sharing_mode(mode); + + WRT_DB_UPDATE(update, GlobalProperties, &WrtDatabase::interface()) + update->Values(row); + update->Execute(); + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(GlobalDAO::Exception::DatabaseError, + "Failed to update Cookie Sharing Mode"); + } +} + } // namespace WrtDB diff --git a/modules/widget_dao/dao/global_dao_read_only.cpp b/modules/widget_dao/dao/global_dao_read_only.cpp index cb26a1e..1936d38 100644 --- a/modules/widget_dao/dao/global_dao_read_only.cpp +++ b/modules/widget_dao/dao/global_dao_read_only.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief This file contains the definition of global dao class. */ - +#include #include #include @@ -33,39 +33,6 @@ namespace WrtDB { -ChildProtection::BlackList GlobalDAOReadOnly::GetAdultBlackList() -{ - LogDebug("Getting AdultBlackList"); - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, ChildProtectionBlacklist, &WrtDatabase::interface()) - std::list list = - select->GetValueList(); - ChildProtection::BlackList blacklist(list.begin(), list.end()); - return blacklist; - } - Catch(DPL::DB::SqlConnection::Exception::Base){ - ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, - "Failed to get AdultBalckList"); - } -} - -bool GlobalDAOReadOnly::IsElementOnAdultBlackList(const DPL::String &url) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, ChildProtectionBlacklist, &WrtDatabase::interface()) - select->Where(Equals(url)); - - return !select->GetRowList().empty(); - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, - "Failure during checking if url is on pwoder black list"); - } -} - bool GlobalDAOReadOnly::GetDeveloperMode() { LogDebug("Getting Developer mode"); @@ -81,37 +48,6 @@ bool GlobalDAOReadOnly::GetDeveloperMode() } } -WidgetPackageList GlobalDAOReadOnly::GetDefferedWidgetPackageInstallationList() -{ - LogDebug("Getting widget packages list defered for installation"); - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, DefferedWidgetPackageInstallation, &WrtDatabase::interface()) - return select->GetValueList(); - } - Catch(DPL::DB::SqlConnection::Exception::Base){ - ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, - "Failed to get defered widget packages list"); - } -} - -bool GlobalDAOReadOnly::GetParentalMode() -{ - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, GlobalProperties, &WrtDatabase::interface()) - return select->GetSingleValue(); -} - -DPL::OptionalInt GlobalDAOReadOnly::GetParentalAllowedAge() -{ - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, GlobalProperties, &WrtDatabase::interface()) - return select->GetSingleValue(); -} - bool GlobalDAOReadOnly::GetSecureByDefault() { using namespace DPL::DB::ORM; @@ -186,64 +122,6 @@ bool GlobalDAOReadOnly::IsValidSubTag(const DPL::String& tag, int type) } } - -bool GlobalDAOReadOnly::IsPowderRulePresent( - const ChildProtection::PowderRules::CategoryRule& powder) -{ - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - - if (!powder.context.IsNull()) { - WRT_DB_SELECT(selWithContext, PowderRules, &WrtDatabase::interface()) - - selWithContext->Where( - And(Equals(powder.category), - And(Equals(powder.level), - Equals(powder.context)))); - return !selWithContext->GetRowList().empty(); - } else { - WRT_DB_SELECT(selWithoutContext, PowderRules, &WrtDatabase::interface()) - selWithoutContext->Where( - And(Equals(powder.category), - And(Equals(powder.level), - Is(powder.context)))); - return !selWithoutContext->GetRowList().empty(); - } - } - Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, - "Failure during checking if rule is present"); - } -} - -ChildProtection::PowderRules GlobalDAOReadOnly::GetPowderRules() -{ - ChildProtection::PowderRules powder; - powder.ageLimit = GetParentalAllowedAge(); - - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - typedef std::list PowderRulesList; - WRT_DB_SELECT(select, PowderRules, &WrtDatabase::interface()) - - PowderRulesList list = select->GetRowList(); - FOREACH(it, list) { - using namespace Powder; - powder.rules.push_back( - ChildProtection::PowderRules::CategoryRule( - it->Get_category(), - static_cast(it->Get_level()), - it->Get_context())); - } - return powder; - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, - "Failed to get POWDER rules"); - } -} - GlobalDAOReadOnly::NetworkAccessMode GlobalDAOReadOnly::GetHomeNetworkDataUsage() { @@ -342,30 +220,6 @@ DeviceCapabilitySet GlobalDAOReadOnly::GetDeviceCapability( } } -DPL::Optional - GlobalDAOReadOnly::GetAutoSaveIdPasswd(const DPL::String &url) -{ - Try{ - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, AutoSaveIdPasswd, &WrtDatabase::interface()); - select->Where(Equals(url)); - AutoSaveIdPasswd::Select::RowList rows = select->GetRowList(); - - if (rows.empty()) { - return DPL::Optional::Null; - } - - GlobalDAOReadOnly::AutoSaveData saveData; - saveData.userId = rows.front().Get_userId(); - saveData.passwd = rows.front().Get_passwd(); - return saveData; - } Catch(DPL::DB::SqlConnection::Exception::Base) { - ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, - "Failed to get autosave data string"); - } -} - WidgetAccessInfoList GlobalDAOReadOnly::GetWhiteURIList() { LogDebug("Getting WhiteURIList."); @@ -393,4 +247,19 @@ WidgetAccessInfoList GlobalDAOReadOnly::GetWhiteURIList() } } +bool GlobalDAOReadOnly::GetCookieSharingMode() +{ + LogDebug("Getting Cookie Sharing mode"); + Try { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + WRT_DB_SELECT(select, GlobalProperties, &WrtDatabase::interface()) + return select->GetSingleValue(); + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(GlobalDAOReadOnly::Exception::DatabaseError, + "Failed to get Cookie Sharing mode"); + } +} + } // namespace WrtDB diff --git a/modules/widget_dao/dao/path_builder.cpp b/modules/widget_dao/dao/path_builder.cpp index 4d91bbf..c55841a 100644 --- a/modules/widget_dao/dao/path_builder.cpp +++ b/modules/widget_dao/dao/path_builder.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief Implementation file for PathBuilde class. */ +#include #include #include diff --git a/modules/widget_dao/dao/plugin_dao.cpp b/modules/widget_dao/dao/plugin_dao.cpp index 7941efb..804c739 100644 --- a/modules/widget_dao/dao/plugin_dao.cpp +++ b/modules/widget_dao/dao/plugin_dao.cpp @@ -20,7 +20,7 @@ * @version 1.0 * @brief This file contains the definition of plugin dao class. */ - +#include #include #include #include @@ -67,14 +67,6 @@ DbPluginHandle PluginDAO::registerPlugin(const PluginMetafileData& metafile, row.Set_InstallationState(INSTALLATION_IN_PROGRESS); row.Set_PluginLibraryPath( DPL::FromUTF8String(pluginPath)); - row.Set_InstallURI( - DPL::FromUTF8String(metafile.m_featuresInstallURI)); - row.Set_KeyCN( - DPL::FromUTF8String(metafile.m_featuresKeyCN)); - row.Set_RootKeyCN( - DPL::FromUTF8String(metafile.m_featuresRootCN)); - row.Set_RootKeyFingerprint( - DPL::FromUTF8String(metafile.m_featuresRootFingerprint)); WRT_DB_INSERT(insert, PluginProperties, &WrtDatabase::interface()) insert->Values(row); @@ -217,4 +209,36 @@ void PluginDAO::setPluginInstallationStatus(DbPluginHandle pluginHandle, } } +void PluginDAO::unregisterPlugin(DbPluginHandle pluginHandle) +{ + LogDebug("unregisterPlugin plugin. Handle: " << pluginHandle); + + Try { + DPL::DB::ORM::wrt::ScopedTransaction transaction( + &WrtDatabase::interface()); + + if (!isPluginInstalled(pluginHandle)) { + LogInfo("PluginHandle is invalid. Handle: " << pluginHandle); + return; + + } else { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + WRT_DB_DELETE(del, PluginProperties, &WrtDatabase::interface()) + del->Where( + Equals(pluginHandle)); + del->Execute(); + + transaction.Commit(); + LogDebug(" >> Plugin Unregistered. Handle: " << pluginHandle); + } + } + Catch(DPL::DB::SqlConnection::Exception::Base) + { + ReThrowMsg(PluginDAO::Exception::DatabaseError, + "Failed in UnregisterPlugin"); + } +} + } // namespace WrtDB diff --git a/modules/widget_dao/dao/plugin_dao_read_only.cpp b/modules/widget_dao/dao/plugin_dao_read_only.cpp index edb376d..a1aec8f 100644 --- a/modules/widget_dao/dao/plugin_dao_read_only.cpp +++ b/modules/widget_dao/dao/plugin_dao_read_only.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief This file contains the implementation of plugin dao read only */ - +#include #include #include @@ -185,34 +185,6 @@ std::string PluginDAOReadOnly::getLibraryName() const return ret; } -std::string PluginDAOReadOnly::getInstallURI() const -{ - LogDebug("Getting plugin install URI. Handle: " << m_pluginHandle); - PluginRow row = getPluginRow(m_pluginHandle); - RETURN_STD_STRING(row.Get_InstallURI(), "install URI") -} - -std::string PluginDAOReadOnly::getKeyCn() const -{ - LogDebug("Getting plugin KeyCn. Handle: " << m_pluginHandle); - PluginRow row = getPluginRow(m_pluginHandle); - RETURN_STD_STRING(row.Get_KeyCN(), "keyCN") -} - -std::string PluginDAOReadOnly::getRootKey() const -{ - LogDebug("Getting plugin rootKey. Handle: " << m_pluginHandle); - PluginRow row = getPluginRow(m_pluginHandle); - RETURN_STD_STRING(row.Get_RootKeyCN(), "rootKey") -} - -std::string PluginDAOReadOnly::getRootKeyFingerprint() const -{ - LogDebug("Getting plugin rootKeyFingerprint. Handle: " << m_pluginHandle); - PluginRow row = getPluginRow(m_pluginHandle); - RETURN_STD_STRING(row.Get_RootKeyFingerprint(), "rootKeyFingerprint") -} - #undef RETURN_STD_STRING PluginHandleSetPtr PluginDAOReadOnly::getLibraryDependencies() const diff --git a/modules/widget_dao/dao/property_dao.cpp b/modules/widget_dao/dao/property_dao.cpp index 95ba056..b509118 100644 --- a/modules/widget_dao/dao/property_dao.cpp +++ b/modules/widget_dao/dao/property_dao.cpp @@ -19,7 +19,7 @@ * @version 1.0 * @brief This file contains the definition of property dao class. */ - +#include #include #include #include @@ -30,20 +30,26 @@ namespace WrtDB { namespace PropertyDAO { - +//deprecated void RemoveProperty(DbWidgetHandle widgetHandle, const PropertyDAOReadOnly::WidgetPropertyKey &key) { + RemoveProperty(WidgetDAOReadOnly::getPkgName(widgetHandle),key); +} + +void RemoveProperty(WidgetPkgName pkgName, + const PropertyDAOReadOnly::WidgetPropertyKey &key) +{ //TODO below there are two queries. // First query asks if given property can be removed, // Second removes it. Maybe it should be combined two one. - LogDebug("Removing Property. Handle: " << widgetHandle << ", key: " << key); + LogDebug("Removing Property. pkgName: " << pkgName << ", key: " << key); Try { DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); DPL::OptionalInt readonly = PropertyDAOReadOnly::CheckPropertyReadFlag( - widgetHandle, + pkgName, key); if (!readonly.IsNull() && *readonly == 1) { LogError("'" << key << @@ -58,7 +64,7 @@ void RemoveProperty(DbWidgetHandle widgetHandle, using namespace DPL::DB::ORM::wrt; WRT_DB_DELETE(del, WidgetPreference, &WrtDatabase::interface()) del->Where(And( - Equals(widgetHandle), + Equals(pkgName), Equals(key))); del->Execute(); @@ -70,12 +76,21 @@ void RemoveProperty(DbWidgetHandle widgetHandle, } } +//deprecated void SetProperty(DbWidgetHandle widgetHandle, const PropertyDAOReadOnly::WidgetPropertyKey &key, const PropertyDAOReadOnly::WidgetPropertyValue &value, bool readOnly) { - LogDebug("Setting/updating Property. Handle: " << widgetHandle << + SetProperty(WidgetDAOReadOnly::getPkgName(widgetHandle),key,value,readOnly); +} + +void SetProperty(WidgetPkgName pkgName, + const PropertyDAOReadOnly::WidgetPropertyKey &key, + const PropertyDAOReadOnly::WidgetPropertyValue &value, + bool readOnly) +{ + LogDebug("Setting/updating Property. pkgName: " << pkgName << ", key: " << key); Try { using namespace DPL::DB::ORM; @@ -83,7 +98,7 @@ void SetProperty(DbWidgetHandle widgetHandle, DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); DPL::OptionalInt readonly = PropertyDAOReadOnly::CheckPropertyReadFlag( - widgetHandle, + pkgName, key); if (!readonly.IsNull() && *readonly == 1) { LogError("'" << key << @@ -94,7 +109,7 @@ void SetProperty(DbWidgetHandle widgetHandle, if (readonly.IsNull()) { WidgetPreference::Row row; - row.Set_app_id(widgetHandle); + row.Set_pkgname(pkgName); row.Set_key_name(key); row.Set_key_value(value); row.Set_readonly(readOnly ? 1 : 0); @@ -108,7 +123,7 @@ void SetProperty(DbWidgetHandle widgetHandle, WRT_DB_UPDATE(update, WidgetPreference, &WrtDatabase::interface()) update->Where(And( - Equals(widgetHandle), + Equals(pkgName), Equals(key))); update->Values(row); @@ -122,10 +137,17 @@ void SetProperty(DbWidgetHandle widgetHandle, } } +//deprecated void RegisterProperties(DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info) { - LogDebug("Registering proferences for widget. Handle: " << widgetHandle); + RegisterProperties(WidgetDAOReadOnly::getPkgName(widgetHandle),regInfo); +} + +void RegisterProperties(WidgetPkgName pkgName, + const WidgetRegisterInfo ®Info) +{ + LogDebug("Registering proferences for widget. pkgName: " << pkgName); // Try-Catch in WidgetDAO @@ -137,7 +159,7 @@ void RegisterProperties(DbWidgetHandle widgetHandle, { { // Insert into table Widget Preferences WidgetPreference::Row row; - row.Set_app_id(widgetHandle); + row.Set_pkgname(pkgName); row.Set_key_name(it->name); row.Set_key_value(it->value); int readonly = true == it->readonly ? 1 : 0; diff --git a/modules/widget_dao/dao/property_dao_read_only.cpp b/modules/widget_dao/dao/property_dao_read_only.cpp index 74208af..1bc172c 100644 --- a/modules/widget_dao/dao/property_dao_read_only.cpp +++ b/modules/widget_dao/dao/property_dao_read_only.cpp @@ -19,8 +19,9 @@ * Created on: Nov 16, 2011 * Author: Krzysztof Jackiewicz(k.jackiewicz@samsung.com) */ - +#include #include +#include #include #include #include @@ -58,7 +59,7 @@ void convertWidgetPreferenceRow(const ORMWidgetPreferenceList& ormWidgetPrefRow, FOREACH(it, ormWidgetPrefRow) { WidgetPreferenceRow row; - row.app_id = it->Get_app_id(); + row.pkgname = it->Get_pkgname(); row.key_name = it->Get_key_name(); row.key_value = it->Get_key_value(); row.readonly = it->Get_readonly(); @@ -78,15 +79,50 @@ void convertWidgetPropertyKeyList(const ORMWidgetPropertyKeyList& propKeyList, } +//deprecated +DPL::OptionalInt CheckPropertyReadFlag(DbWidgetHandle widgetHandle, + const WidgetPropertyKey &key) +{ + return CheckPropertyReadFlag(WidgetDAOReadOnly::getPkgName(widgetHandle), + key); +} + +DPL::OptionalInt CheckPropertyReadFlag(WidgetPkgName pkgName, + const WidgetPropertyKey &key) +{ + LogDebug("Checking Property flag. pkgName: " << pkgName << + ", key: " << key); + + Try { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + WRT_DB_SELECT(select, WidgetPreference, &WrtDatabase::interface()) + select->Where(And(Equals(pkgName), + Equals(key))); + + return select->GetSingleValue(); + } + Catch(DPL::DB::SqlConnection::Exception::Base){ + ReThrowMsg(Exception::DatabaseError, + "Failure during checking readonly flag for property"); + } +} + +//deprecated WidgetPropertyKeyList GetPropertyKeyList(DbWidgetHandle widgetHandle) { - LogDebug("Get PropertyKey list. Handle: " << widgetHandle); + return GetPropertyKeyList(WidgetDAOReadOnly::getPkgName(widgetHandle)); +} + +WidgetPropertyKeyList GetPropertyKeyList(WidgetPkgName pkgName) +{ + LogDebug("Get PropertyKey list. pkgName: " << pkgName); Try { using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::wrt; ORMWidgetPropertyKeyList keyList; WRT_DB_SELECT(select, WidgetPreference, &WrtDatabase::interface()) - select->Where(Equals(widgetHandle)); + select->Where(Equals(pkgName)); keyList = select->GetValueList(); WidgetPropertyKeyList retKeyList; @@ -100,14 +136,26 @@ WidgetPropertyKeyList GetPropertyKeyList(DbWidgetHandle widgetHandle) } } +//deprecated WidgetPreferenceList GetPropertyList(DbWidgetHandle widgetHandle) { - LogDebug("Get Property list. Handle: " << widgetHandle); + Try{ + WidgetPkgName pkgName=WidgetDAOReadOnly::getPkgName(widgetHandle); + return GetPropertyList(pkgName); + }Catch(WidgetDAOReadOnly::Exception::WidgetNotExist){ + WidgetPreferenceList empty; + return empty; + } +} + +WidgetPreferenceList GetPropertyList(WidgetPkgName pkgName) +{ + LogDebug("Get Property list. pkgName: " << pkgName); Try { using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetPreference, &WrtDatabase::interface()) - select->Where(Equals(widgetHandle)); + select->Where(Equals(pkgName)); ORMWidgetPreferenceList ormPrefList = select->GetRowList(); WidgetPreferenceList prefList; @@ -121,16 +169,23 @@ WidgetPreferenceList GetPropertyList(DbWidgetHandle widgetHandle) } } +//deprecated WidgetPropertyValue GetPropertyValue(DbWidgetHandle widgetHandle, const WidgetPropertyKey &key) { - LogDebug("Get Property value. Handle: " << widgetHandle << + return GetPropertyValue(WidgetDAOReadOnly::getPkgName(widgetHandle),key); +} + +WidgetPropertyValue GetPropertyValue(WidgetPkgName pkgName, + const WidgetPropertyKey &key) +{ + LogDebug("Get Property value. pkgName: " << pkgName << ", key: " << key); Try { using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetPreference, &WrtDatabase::interface()) - select->Where(And(Equals(widgetHandle), + select->Where(And(Equals(pkgName), Equals(key))); ORMWidgetPropertyValue ormPropValue = @@ -148,25 +203,5 @@ WidgetPropertyValue GetPropertyValue(DbWidgetHandle widgetHandle, } } -DPL::OptionalInt CheckPropertyReadFlag(DbWidgetHandle widgetHandle, - const WidgetPropertyKey &key) -{ - LogDebug("Checking Property flag. Handle: " << widgetHandle << - ", key: " << key); - Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, WidgetPreference, &WrtDatabase::interface()) - select->Where(And(Equals(widgetHandle), - Equals(key))); - - return select->GetSingleValue(); - } - Catch(DPL::DB::SqlConnection::Exception::Base){ - ReThrowMsg(Exception::DatabaseError, - "Failure during checking readonly flag for property"); - } -} - } // namespace PropertyDAOReadOnly } // namespace WrtDB diff --git a/modules/widget_dao/dao/webruntime_database.cpp b/modules/widget_dao/dao/webruntime_database.cpp index bc24fbe..5fbb7d7 100644 --- a/modules/widget_dao/dao/webruntime_database.cpp +++ b/modules/widget_dao/dao/webruntime_database.cpp @@ -19,6 +19,7 @@ * @version 1.0 * @brief This file contains the definition of webruntime database */ +#include #include DPL::Mutex g_wrtDbQueriesMutex; diff --git a/modules/widget_dao/dao/widget_dao.cpp b/modules/widget_dao/dao/widget_dao.cpp index be33379..e078797 100644 --- a/modules/widget_dao/dao/widget_dao.cpp +++ b/modules/widget_dao/dao/widget_dao.cpp @@ -25,7 +25,7 @@ * @version 1.0 * @brief This file contains the definition of Configuration. */ - +#include #include #include @@ -51,23 +51,18 @@ namespace WrtDB { message); \ } -#define CHECK_WIDGET_EXISTENCE(macro_transaction, macro_handle) \ - if (!WidgetDAO::isWidgetInstalled(macro_handle)) \ - { \ - macro_transaction.Commit(); \ - LogWarning("Cannot find widget. Handle: " << macro_handle); \ - ThrowMsg(WidgetDAO::Exception::WidgetNotExist, \ - "Cannot find widget. Handle: " << macro_handle); \ - } - +WidgetDAO::WidgetDAO(DPL::OptionalString widgetGUID) : + WidgetDAOReadOnly(WidgetDAOReadOnly::getHandle(widgetGUID)) +{ +} -WidgetDAO::WidgetDAO(DbWidgetHandle widgetHandle) : - WidgetDAOReadOnly(widgetHandle) +WidgetDAO::WidgetDAO(DPL::String pkgName) : + WidgetDAOReadOnly(WidgetDAOReadOnly::getHandle(pkgName)) { } -WidgetDAO::WidgetDAO(DPL::OptionalString widgetGUID) : - WidgetDAOReadOnly(WidgetDAOReadOnly::getHandle(widgetGUID)) +WidgetDAO::WidgetDAO(DbWidgetHandle handle) : + WidgetDAOReadOnly(handle) { } @@ -103,12 +98,23 @@ void WidgetDAO::setProperty( void WidgetDAO::setPkgName(const DPL::OptionalString& pkgName) { + + // if(!!pkgName) + setPkgName_TEMPORARY_API(*pkgName); +} + + +void WidgetDAO::setPkgName_TEMPORARY_API(const WidgetPkgName& pkgName) +{ SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { using namespace DPL::DB::ORM; wrt::ScopedTransaction transaction(&WrtDatabase::interface()); - isWidgetInstalled(getHandle()); + if (!isWidgetInstalled(getHandle())) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << getHandle()); + } wrt::WidgetInfo::Row row; row.Set_pkgname(pkgName); @@ -124,58 +130,258 @@ void WidgetDAO::setPkgName(const DPL::OptionalString& pkgName) SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget") } -DbWidgetHandle WidgetDAO::registerWidget(const WidgetRegisterInfo &widgetRegInfo, - const IWacSecurity &wacSecurity, - const LanguageTagsList& languageTags) +void WidgetDAO::setSecurityPopupUsage(const SettingsType value) { - LogDebug("Registering widget"); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + ScopedTransaction transaction(&WrtDatabase::interface()); + if (!isWidgetInstalled(getHandle())) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << getHandle()); + } + + WidgetSecuritySettings::Row row; + row.Set_security_popup_usage(value); - //Register into WidgetInfo has to be first - //as all other tables depend upon that - DbWidgetHandle widgetHandle = - registerWidgetInfo(widgetRegInfo, wacSecurity); + WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface()) + update->Where(Equals(getHandle())); + update->Values(row); + update->Execute(); - registerWidgetExtendedInfo(widgetHandle, widgetRegInfo); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set security popup usage") +} + +void WidgetDAO::setGeolocationUsage(const SettingsType value) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; - registerWidgetLocalizedInfo(widgetHandle, widgetRegInfo); + ScopedTransaction transaction(&WrtDatabase::interface()); + if (!isWidgetInstalled(getHandle())) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << getHandle()); + } - registerWidgetUserAgentLocales( - widgetHandle, widgetRegInfo, languageTags); + WidgetSecuritySettings::Row row; + row.Set_geolocation_usage(value); - registerWidgetIcons(widgetHandle, widgetRegInfo); + WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface()) + update->Where(Equals(getHandle())); + update->Values(row); + update->Execute(); - registerWidgetStartFile(widgetHandle, widgetRegInfo); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set geolocation usage") +} - PropertyDAO::RegisterProperties(widgetHandle, widgetRegInfo); +void WidgetDAO::setWebNotificationUsage(const SettingsType value) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; - registerWidgetFeatures(widgetHandle, widgetRegInfo); + ScopedTransaction transaction(&WrtDatabase::interface()); + if (!isWidgetInstalled(getHandle())) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << getHandle()); + } - registerWidgetWindowModes(widgetHandle, widgetRegInfo); + WidgetSecuritySettings::Row row; + row.Set_web_notification_usage(value); - registerWidgetWarpInfo(widgetHandle, widgetRegInfo); + WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface()) + update->Where(Equals(getHandle())); + update->Values(row); + update->Execute(); - registerWidgetCertificates(widgetHandle, wacSecurity); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set web notification usage") +} - CertificateChainList list; - wacSecurity.getCertificateChainList(list); - registerLaunchCertificates(widgetHandle,list); +void WidgetDAO::setWebDatabaseUsage(const SettingsType value) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; - registerWidgetPowderData(widgetHandle, widgetRegInfo); + ScopedTransaction transaction(&WrtDatabase::interface()); + if (!isWidgetInstalled(getHandle())) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << getHandle()); + } - registerWidgetSettings(widgetHandle, widgetRegInfo); + WidgetSecuritySettings::Row row; + row.Set_web_database_usage(value); - registerAppService(widgetHandle, widgetRegInfo); + WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface()) + update->Where(Equals(getHandle())); + update->Values(row); + update->Execute(); transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set web database usage") +} - return widgetHandle; +void WidgetDAO::setFileSystemUsage(const SettingsType value) +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + ScopedTransaction transaction(&WrtDatabase::interface()); + if (!isWidgetInstalled(getHandle())) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << getHandle()); + } + + WidgetSecuritySettings::Row row; + row.Set_file_system_usage(value); + + WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface()) + update->Where(Equals(getHandle())); + update->Values(row); + update->Execute(); + + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set filesystem usage") +} + +void WidgetDAO::registerWidget( + const WidgetPkgName & widgetPkgname, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity) +{ + LogDebug("Registering widget"); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + registerWidgetInternal(widgetPkgname, widgetRegInfo, wacSecurity); + transaction.Commit(); } SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget") } +void WidgetDAO::registerWidget( + WrtDB::DbWidgetHandle handle, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity) +{ + LogDebug("Registering widget"); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + registerWidgetInternal(generateTizenId(), widgetRegInfo, wacSecurity, handle); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget") +} + +DbWidgetHandle WidgetDAO::registerWidget( + const WidgetRegisterInfo &pWidgetRegisterInfo, + const IWacSecurity &wacSecurity) +{ + //make it more precise due to very fast tests + struct timeval tv; + gettimeofday(&tv, NULL); + srand(time(NULL) + tv.tv_usec); + DbWidgetHandle widgetHandle; + do { + widgetHandle = rand(); + } while (isWidgetInstalled(widgetHandle)); + + registerWidget(widgetHandle, pWidgetRegisterInfo, wacSecurity); + return widgetHandle; +} + +WidgetPkgName WidgetDAO::registerWidgetGenerateTizenId( + const WidgetRegisterInfo &pWidgetRegisterInfo, + const IWacSecurity &wacSecurity) +{ + WidgetPkgName widgetPkgName = generateTizenId(); + registerWidget(widgetPkgName, pWidgetRegisterInfo, wacSecurity); + return widgetPkgName; +} + +void WidgetDAO::registerWidgetInternal( + const WidgetPkgName & widgetName, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity, + const DPL::Optional handle) +{ + //Register into WidgetInfo has to be first + //as all other tables depend upon that + DbWidgetHandle widgetHandle = registerWidgetInfo(widgetName, widgetRegInfo, wacSecurity, handle); + + registerWidgetExtendedInfo(widgetHandle, widgetRegInfo); + + registerWidgetLocalizedInfo(widgetHandle, widgetRegInfo); + + registerWidgetIcons(widgetHandle, widgetRegInfo); + + registerWidgetStartFile(widgetHandle, widgetRegInfo); + + PropertyDAO::RegisterProperties(widgetHandle, widgetRegInfo); + + registerWidgetFeatures(widgetHandle, widgetRegInfo); + + registerWidgetPrivilege(widgetHandle, widgetRegInfo); + + registerWidgetWindowModes(widgetHandle, widgetRegInfo); + + registerWidgetWarpInfo(widgetHandle, widgetRegInfo); + + registerWidgetCertificates(widgetHandle, wacSecurity); + + CertificateChainList list; + wacSecurity.getCertificateChainList(list, SIGNATURE_DISTRIBUTOR); + registerCertificatesChains(widgetHandle, SIGNATURE_DISTRIBUTOR, list); + + list.clear(); + wacSecurity.getCertificateChainList(list, SIGNATURE_AUTHOR); + registerCertificatesChains(widgetHandle, SIGNATURE_AUTHOR, list); + + registerWidgetSettings(widgetHandle, widgetRegInfo); + + registerAppService(widgetHandle, widgetRegInfo); + + registerEncryptedResouceInfo(widgetHandle, widgetRegInfo); + + registerExternalLocations(widgetHandle, widgetRegInfo.externalLocations); + + registerWidgetSecuritySettings(widgetHandle); +} + +void WidgetDAO::registerOrUpdateWidget( + const WidgetPkgName & widgetName, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity) +{ + LogDebug("Reregistering widget"); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + + unregisterWidgetInternal(widgetName); + registerWidgetInternal(widgetName, widgetRegInfo, wacSecurity); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to reregister widget") +} + #define DO_INSERT(row, table) \ { \ WRT_DB_INSERT(insert, table, &WrtDatabase::interface()) \ @@ -195,15 +401,20 @@ void WidgetDAO::registerWidgetExtendedInfo(DbWidgetHandle widgetHandle, row.Set_app_id(widgetHandle); // row.Set_share_href (DPL::FromUTF8String(regInfo.shareHref)); row.Set_signature_type(regInfo.signatureType); - row.Set_factory_widget(regInfo.isFactoryWidget); row.Set_test_widget(regInfo.isTestWidget); row.Set_install_time(regInfo.installedTime); + row.Set_splash_img_src(regInfo.configInfo.splashImgSrc); + row.Set_background_page(regInfo.configInfo.backgroundPage); + row.Set_installed_path(regInfo.widgetInstalledPath); DO_INSERT(row, WidgetExtendedInfo) } -DbWidgetHandle WidgetDAO::registerWidgetInfo(const WidgetRegisterInfo ®Info, - const IWacSecurity &wacSecurity) +DbWidgetHandle WidgetDAO::registerWidgetInfo( + const WidgetPkgName & widgetName, + const WidgetRegisterInfo ®Info, + const IWacSecurity &wacSecurity, + const DPL::Optional handle) { using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::wrt; @@ -213,7 +424,19 @@ DbWidgetHandle WidgetDAO::registerWidgetInfo(const WidgetRegisterInfo ®Info, // Because of that, "Optional" is not used there WidgetInfo::Row row; - row.Set_widget_type(regInfo.type.appType); + if(!!handle) + { + row.Set_app_id(*handle); + } + + if (regInfo.webAppType == APP_TYPE_UNKNOWN && regInfo.type != + APP_TYPE_UNKNOWN) { + // TODO : regInfo.type is temporary code for security. + // This code will be removed. + row.Set_widget_type(regInfo.type.appType); + } else { + row.Set_widget_type(regInfo.webAppType.appType); + } row.Set_widget_id(widgetConfigurationInfo.widget_id); row.Set_defaultlocale(widgetConfigurationInfo.defaultlocale); row.Set_widget_version(widgetConfigurationInfo.version); @@ -224,26 +447,40 @@ DbWidgetHandle WidgetDAO::registerWidgetInfo(const WidgetRegisterInfo ®Info, row.Set_author_href(widgetConfigurationInfo.authorHref); row.Set_base_folder(DPL::FromUTF8String(regInfo.baseFolder)); row.Set_webkit_plugins_required(widgetConfigurationInfo.flashNeeded); - row.Set_child_protection(1); row.Set_recognized(wacSecurity.isRecognized()); row.Set_wac_signed(wacSecurity.isWacSigned()); row.Set_distributor_signed(wacSecurity.isDistributorSigned()); + row.Set_pkgname(widgetName); { std::stringstream tmp; - tmp << widgetConfigurationInfo.minVersionRequired; + tmp << regInfo.minVersion; row.Set_min_version(DPL::FromUTF8String(tmp.str())); } row.Set_back_supported(widgetConfigurationInfo.backSupported); row.Set_access_network(widgetConfigurationInfo.accessNetwork); - row.Set_pkgname(regInfo.pkgname); + row.Set_pkg_type(regInfo.packagingType.pkgType); - wrt::WidgetInfo::app_id::ColumnType appID; + Try + { + DO_INSERT(row, WidgetInfo); + } + Catch(DPL::DB::SqlConnection::Exception::Base) { - WRT_DB_INSERT(insert, WidgetInfo, &WrtDatabase::interface()) - insert->Values(row); - appID = insert->Execute(); + ReThrowMsg(WidgetDAO::Exception::DatabaseError, + "Failed to register widget info."); + } + + if(!handle) + { + //get autoincremented value of widgetHandle + WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) + select->Where(Equals(widgetName)); + return select->GetSingleValue(); + } + else + { + return *handle; } - return appID; } void WidgetDAO::registerWidgetLocalizedInfo(DbWidgetHandle widgetHandle, @@ -273,25 +510,6 @@ void WidgetDAO::registerWidgetLocalizedInfo(DbWidgetHandle widgetHandle, } } -void WidgetDAO::registerWidgetUserAgentLocales( - DbWidgetHandle widgetHandle, - const WidgetRegisterInfo &/*regInfo*/, - const LanguageTagsList& languageTags) -{ - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - - - FOREACH(i, languageTags) - { - wrt::WidgetUserAgentLocales::Row row; - row.Set_app_id(widgetHandle); - row.Set_language_tag(*i); - - DO_INSERT(row, wrt::WidgetUserAgentLocales) - } -} - void WidgetDAO::registerWidgetIcons(DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info) { @@ -390,6 +608,7 @@ void WidgetDAO::registerWidgetFeatures(DbWidgetHandle widgetHandle, widgetFeature.Set_app_id(widgetHandle); widgetFeature.Set_name(pWidgetFeature->name); widgetFeature.Set_required(pWidgetFeature->required); + widgetFeature.Set_rejected(false); wrt::WidgetFeature::widget_feature_id::ColumnType widgetFeatureID; { @@ -402,8 +621,6 @@ void WidgetDAO::registerWidgetFeatures(DbWidgetHandle widgetHandle, wrt::FeatureParam::Row featureParam; featureParam.Set_widget_feature_id(widgetFeatureID); - ConfigParserData::ParamsList::const_iterator iter; - FOREACH(iter, pWidgetFeature->paramsList) { featureParam.Set_name(iter->name); @@ -414,6 +631,45 @@ void WidgetDAO::registerWidgetFeatures(DbWidgetHandle widgetHandle, } } +void WidgetDAO::registerWidgetPrivilege(DbWidgetHandle widgetHandle, + const WidgetRegisterInfo ®Info) +{ + using namespace DPL::DB::ORM; + const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo; + + FOREACH(it, widgetConfigurationInfo.privilegeList) + { + wrt::WidgetPrivilege::Row widgetPrivilege; + widgetPrivilege.Set_app_id(widgetHandle); + widgetPrivilege.Set_name(it->name); + + DO_INSERT(widgetPrivilege, wrt::WidgetPrivilege) + } +} + +void WidgetDAO::updateFeatureRejectStatus(const DbWidgetFeature &widgetFeature){ + // This function could be merged with registerWidgetFeature but it requires desing change: + // 1. Check "ace step" in installer must be done before "update database step" + // And: + // ConfigurationParserData shouldn't be called "ParserData" any more. + using namespace DPL::DB::ORM; + + wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + WRT_DB_SELECT(select, wrt::WidgetFeature, &WrtDatabase::interface()) + select->Where(And(Equals(m_widgetHandle), + Equals(widgetFeature.name))); + + auto row = select->GetSingleRow(); + row.Set_rejected(widgetFeature.rejected); + + WRT_DB_UPDATE(update, wrt::WidgetFeature, &WrtDatabase::interface()) + update->Where(And(Equals(m_widgetHandle), + Equals(widgetFeature.name))); + update->Values(row); + update->Execute(); + transaction.Commit(); +} + void WidgetDAO::registerWidgetWindowModes(DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info) { @@ -474,45 +730,8 @@ void WidgetDAO::registerWidgetCertificates(DbWidgetHandle widgetHandle, } } -void WidgetDAO::registerWidgetPowderData(DbWidgetHandle widgetHandle, - const WidgetRegisterInfo ®Info) -{ - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - - using namespace Powder; - - FOREACH(i, regInfo.powderDescription.categories) - { - const DPL::String& categoryName(i->first); - const Description::CategoryEntry& categoryEntry(i->second); - FOREACH(l, categoryEntry.levels) - { - PowderLevels::id::ColumnType powderID; - { - PowderLevels::Row row; - row.Set_app_id(widgetHandle); - row.Set_category(categoryName); - row.Set_level(l->level); - - WRT_DB_INSERT(insert, PowderLevels, &WrtDatabase::interface()) - insert->Values(row); - powderID = insert->Execute(); - } - - FOREACH(c, l->context) - { - PowderLevelContexts::Row row; - row.Set_levelId(powderID); - row.Set_context(*c); - - DO_INSERT(row, PowderLevelContexts) - } - } - } -} - -void WidgetDAO::registerLaunchCertificates(DbWidgetHandle widgetHandle, +void WidgetDAO::registerCertificatesChains(DbWidgetHandle widgetHandle, + CertificateSource certificateSource, const CertificateChainList &certificateChainList) { using namespace DPL::DB::ORM; @@ -521,6 +740,7 @@ void WidgetDAO::registerLaunchCertificates(DbWidgetHandle widgetHandle, { WidgetCertificate::Row row; row.Set_app_id(widgetHandle); + row.Set_cert_source(certificateSource); row.Set_encoded_chain(DPL::FromASCIIString(*certChain)); DO_INSERT(row, WidgetCertificate); @@ -537,12 +757,12 @@ void WidgetDAO::registerWidgetSettings(DbWidgetHandle widgetHandle, FOREACH(pWidgetSetting, widgetConfigurationInfo.settingsList) { - SettginsList::Row row; + SettingsList::Row row; row.Set_appId(widgetHandle); row.Set_settingName(pWidgetSetting->m_name); row.Set_settingValue(pWidgetSetting->m_value); - DO_INSERT(row, SettginsList) + DO_INSERT(row, SettingsList) } } @@ -566,35 +786,120 @@ void WidgetDAO::registerAppService(DbWidgetHandle widgetHandle, } } -#undef DO_INSERT +void WidgetDAO::registerEncryptedResouceInfo(DbWidgetHandle widgetHandle, + const WidgetRegisterInfo ®Info) +{ + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + FOREACH(it, regInfo.encryptedFiles) + { + EncryptedResourceList::Row row; + row.Set_app_id(widgetHandle); + row.Set_resource(it->fileName); + row.Set_size(it->fileSize); + + DO_INSERT(row, EncryptedResourceList) + } +} -void WidgetDAO::unregisterWidget(DbWidgetHandle widgetHandle) +void WidgetDAO::registerExternalLocations(DbWidgetHandle widgetHandle, + const ExternalLocationList & externals) { - LogDebug("Unregistering widget from DB. Handle: " << widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); using namespace DPL::DB::ORM; using namespace DPL::DB::ORM::wrt; - - CHECK_WIDGET_EXISTENCE(transaction, widgetHandle) - - // Delete from table Widget Info + DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + LogDebug("Inserting external files for widgetHandle: " << widgetHandle); + FOREACH(it, externals) { - WRT_DB_DELETE(del, WidgetInfo, &WrtDatabase::interface()) - del->Where(Equals(widgetHandle)); - del->Execute(); + WidgetExternalLocations::Row row; + row.Set_app_id(widgetHandle); + row.Set_path(DPL::FromUTF8String(*it)); + + DO_INSERT(row, WidgetExternalLocations) } + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register external files"); +} - // Deleting in other tables is done via "delete cascade" in SQL +void WidgetDAO::registerWidgetSecuritySettings(DbWidgetHandle widgetHandle) +{ + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + WidgetSecuritySettings::Row row; + row.Set_app_id(widgetHandle); + row.Set_security_popup_usage(SETTINGS_TYPE_ON); + row.Set_geolocation_usage(SETTINGS_TYPE_ON); + row.Set_web_notification_usage(SETTINGS_TYPE_ON); + row.Set_web_database_usage(SETTINGS_TYPE_ON); + row.Set_file_system_usage(SETTINGS_TYPE_ON); + + DO_INSERT(row, WidgetSecuritySettings) +} + +void WidgetDAO::unregisterAllExternalLocations() +{ + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + LogDebug("Deleting external files for widgetHandle: " << m_widgetHandle); + WRT_DB_DELETE(del, WidgetExternalLocations, &WrtDatabase::interface()); + del->Where(Equals(m_widgetHandle)); + del->Execute(); +} + +void WidgetDAO::unregisterWidget(const WidgetPkgName & pkgName) +{ + LogDebug("Unregistering widget from DB. PkgName: " << pkgName); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + unregisterWidgetInternal(pkgName); + transaction.Commit(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to unregister widget") +} + +void WidgetDAO::unregisterWidget(WrtDB::DbWidgetHandle handle) +{ + LogDebug("Unregistering widget from DB. Handle: " << handle); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + ScopedTransaction transaction(&WrtDatabase::interface()); + + // Delete from table Widget Info + WRT_DB_DELETE(del, WidgetInfo, &WrtDatabase::interface()) + del->Where(Equals(handle)); + del->Execute(); transaction.Commit(); } SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to unregister widget") } +void WidgetDAO::unregisterWidgetInternal( + const WidgetPkgName & pkgName) +{ + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + + DbWidgetHandle handle = getHandle(pkgName); + + // Delete from table Widget Info + WRT_DB_DELETE(del, WidgetInfo, &WrtDatabase::interface()) + del->Where(Equals(handle)); + del->Execute(); + + // Deleting in other tables is done via "delete cascade" in SQL +} + +#undef DO_INSERT + #undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN #undef SQL_CONNECTION_EXCEPTION_HANDLER_END -#undef CHECK_WIDGET_EXISTENCE } // namespace WrtDB diff --git a/modules/widget_dao/dao/widget_dao_read_only.cpp b/modules/widget_dao/dao/widget_dao_read_only.cpp index d3c9377..ade490b 100644 --- a/modules/widget_dao/dao/widget_dao_read_only.cpp +++ b/modules/widget_dao/dao/widget_dao_read_only.cpp @@ -23,7 +23,7 @@ * @version 1.0 * @brief This file contains the declaration of widget dao */ - +#include #include #include @@ -35,6 +35,7 @@ #include #include #include +#include namespace WrtDB { @@ -63,17 +64,20 @@ namespace WrtDB { typedef DPL::DB::ORM::wrt::WidgetInfo::Row WidgetInfoRow; typedef DPL::DB::ORM::wrt::WidgetFeature::widget_feature_id::ColumnType - WidgetFeatureId; + WidgetFeatureId; +typedef DPL::DB::ORM::wrt::WidgetSecuritySettings::Row + WidgetSecuritySettingsRow; namespace { +using namespace DPL::DB::ORM; +using namespace DPL::DB::ORM::wrt; + WidgetInfoRow getWidgetInfoRow(int widgetHandle) { LogDebug("Getting WidgetInfo row. Handle: " << widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) select->Where(Equals(widgetHandle)); @@ -87,6 +91,49 @@ WidgetInfoRow getWidgetInfoRow(int widgetHandle) SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed in GetWidgetInfoRow") } +WidgetSecuritySettingsRow getWidgetSecuritySettingsRow(int widgetHandle) +{ + LogDebug("Getting WidgetSecuritySettings row. Handle: " << widgetHandle); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + WRT_DB_SELECT(select, WidgetSecuritySettings, &WrtDatabase::interface()) + select->Where(Equals(widgetHandle)); + + WidgetSecuritySettings::Select::RowList rows = select->GetRowList(); + if (rows.empty()) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << widgetHandle); + } + return rows.front(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed in getWidgetSecuritySettingsRow") +} + +const int MAX_TIZENID_LENGTH = 10; + +WidgetPkgName getPkgNameByHandle(const DbWidgetHandle handle) +{ + LogDebug("Getting WidgetPkgName by DbWidgetHandle: " << handle); + + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) + select->Where(Equals(handle)); + WidgetInfo::Select::RowList rowList = select->GetRowList(); + + if (rowList.empty()) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Failed to get widget by handle"); + } + WidgetPkgName pkgname = rowList.front().Get_pkgname(); + + return pkgname; + + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed in getHandle") +} } // namespace @@ -99,6 +146,17 @@ WidgetDAOReadOnly::WidgetDAOReadOnly(DbWidgetHandle widgetHandle) : { } +WidgetDAOReadOnly::WidgetDAOReadOnly(DPL::OptionalString widgetGUID) : + m_widgetHandle(WidgetDAOReadOnly::getHandle(widgetGUID)) +{ +} + +WidgetDAOReadOnly::WidgetDAOReadOnly(DPL::String pkgName) : + m_widgetHandle(WidgetDAOReadOnly::getHandle(pkgName)) +{ + +} + WidgetDAOReadOnly::~WidgetDAOReadOnly() { } @@ -114,8 +172,6 @@ DbWidgetHandle WidgetDAOReadOnly::getHandle(const WidgetGUID GUID) SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) select->Where(Equals(GUID)); WidgetInfo::Select::RowList rowList = select->GetRowList(); @@ -127,9 +183,6 @@ DbWidgetHandle WidgetDAOReadOnly::getHandle(const WidgetGUID GUID) return rowList.front().Get_app_id(); } SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed in getHandle") - - ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, - "Failed to get widget by guid"); } DbWidgetHandle WidgetDAOReadOnly::getHandle(const DPL::String pkgName) @@ -138,8 +191,6 @@ DbWidgetHandle WidgetDAOReadOnly::getHandle(const DPL::String pkgName) SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) select->Where(Equals(pkgName)); WidgetInfo::Select::RowList rowList = select->GetRowList(); @@ -151,58 +202,53 @@ DbWidgetHandle WidgetDAOReadOnly::getHandle(const DPL::String pkgName) return rowList.front().Get_app_id(); } SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed in getHandle") +} + +WidgetPkgName WidgetDAOReadOnly::getPkgName() const +{ + return getPkgNameByHandle(m_widgetHandle); +} + +WidgetPkgName WidgetDAOReadOnly::getPkgName(const WidgetGUID GUID) +{ + return getPkgNameByHandle(getHandle(GUID)); +} - ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, - "Failed to get widget by package name"); +WidgetPkgName WidgetDAOReadOnly::getPkgName(const DbWidgetHandle handle) +{ + return getPkgNameByHandle(handle); } PropertyDAOReadOnly::WidgetPropertyKeyList WidgetDAOReadOnly::getPropertyKeyList() const { - return PropertyDAOReadOnly::GetPropertyKeyList(m_widgetHandle); + return PropertyDAOReadOnly::GetPropertyKeyList(getPkgName()); } PropertyDAOReadOnly::WidgetPreferenceList WidgetDAOReadOnly::getPropertyList() const { - return PropertyDAOReadOnly::GetPropertyList(m_widgetHandle); + return PropertyDAOReadOnly::GetPropertyList(getPkgName()); } PropertyDAOReadOnly::WidgetPropertyValue WidgetDAOReadOnly::getPropertyValue( const PropertyDAOReadOnly::WidgetPropertyKey &key) const { - return PropertyDAOReadOnly::GetPropertyValue(m_widgetHandle, key); + return PropertyDAOReadOnly::GetPropertyValue(getPkgName(), key); } DPL::OptionalInt WidgetDAOReadOnly::checkPropertyReadFlag( const PropertyDAOReadOnly::WidgetPropertyKey &key) const { - return PropertyDAOReadOnly::CheckPropertyReadFlag(m_widgetHandle, key); + return PropertyDAOReadOnly::CheckPropertyReadFlag(getPkgName(), key); } DPL::String WidgetDAOReadOnly::getPath() const { - DPL::String path = DPL::FromUTF8String( - GlobalConfig::GetUserInstalledWidgetPath()); + DPL::String path = *getWidgetInstalledPath(); DPL::String srcPath = DPL::FromUTF8String(GlobalConfig::GetWidgetSrcPath()); - bool isFactoryWidget = isFactory(); - - if (isFactoryWidget) { - WidgetGUID widgetGUID = getGUID(); - if (!widgetGUID) { - Throw(WidgetDAOReadOnly::Exception::GUIDisNull); - } - path += L"/" + *widgetGUID + L"/"; - } else { - // if the widget is a "downloaded widget", - // use unique package name. - DPL::OStringStream strAppId; - strAppId << m_widgetHandle; - DPL::OptionalString pkgname = getPkgname(); - path += L"/" + *pkgname + L"/"; - path += srcPath + L"/"; - } + path += srcPath + L"/"; return path; } @@ -219,11 +265,9 @@ WidgetLocalizedInfo LogDebug("Getting Localized Info. Handle: " << m_widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + ScopedTransaction transaction(&WrtDatabase::interface()); CHECK_WIDGET_EXISTENCE(transaction, m_widgetHandle) - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, LocalizedWidgetInfo, &WrtDatabase::interface()) select->Where( And(Equals(m_widgetHandle), @@ -248,22 +292,21 @@ DbWidgetFeatureSet WidgetDAOReadOnly::getFeaturesList() const LogDebug("Getting FeaturesList. Handle: " << m_widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + ScopedTransaction transaction(&WrtDatabase::interface()); CHECK_WIDGET_EXISTENCE(transaction, m_widgetHandle) - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, DPL::DB::ORM::wrt::WidgetFeature, &WrtDatabase::interface()) - select->Where(Equals(m_widgetHandle)); + WRT_DB_SELECT(select, WidgetFeature, &WrtDatabase::interface()) + select->Where(Equals(m_widgetHandle)); DbWidgetFeatureSet resultSet; - typedef std::list RowList; + typedef std::list RowList; RowList list = select->GetRowList(); for (RowList::iterator i = list.begin(); i != list.end(); ++i) { DbWidgetFeature feature; feature.name = i->Get_name(); feature.required = i->Get_required(); + feature.rejected = i->Get_rejected(); feature.params = getFeatureParams(i->Get_widget_feature_id()); FeatureDAOReadOnly featureDao(DPL::ToUTF8String(i->Get_name())); feature.pluginId = featureDao.GetPluginHandle(); @@ -281,14 +324,12 @@ WidgetParamMap WidgetDAOReadOnly::getFeatureParams(int id) LogDebug("Getting feature Params. featureId: " << widgetFeatureId); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, DPL::DB::ORM::wrt::FeatureParam, &WrtDatabase::interface()) - select->Where(Equals( + WRT_DB_SELECT(select, FeatureParam, &WrtDatabase::interface()) + select->Where(Equals( widgetFeatureId)); WidgetParamMap resultMap; - typedef std::list RowList; + typedef std::list RowList; RowList list = select->GetRowList(); FOREACH(i, list) @@ -306,11 +347,9 @@ bool WidgetDAOReadOnly::hasFeature(const std::string& featureName) const m_widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + ScopedTransaction transaction(&WrtDatabase::interface()); CHECK_WIDGET_EXISTENCE(transaction, m_widgetHandle) - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, wrt::WidgetFeature, &WrtDatabase::interface()) select->Where(And(Equals(m_widgetHandle), Equals( @@ -328,11 +367,9 @@ HostList WidgetDAOReadOnly::getAccessHostList() const LogDebug("Getting AccessHostList. Handle: " << m_widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + ScopedTransaction transaction(&WrtDatabase::interface()); CHECK_WIDGET_EXISTENCE(transaction, m_widgetHandle) - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetAccessHost, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); std::list values = @@ -359,21 +396,49 @@ DbWidgetHandleList WidgetDAOReadOnly::getHandleList() LogDebug("Getting DbWidgetHandle List"); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) return select->GetValueList(); } SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get handle list") } +WidgetPkgNameList WidgetDAOReadOnly::getPkgnameList() +{ + LogDebug("Getting Pkgname List "); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) + return select->GetValueList(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get Pkgname list") +} + +WidgetPkgNameList_TEMPORARY_API WidgetDAOReadOnly::getPkgnameList_TEMPORARY_API() +{ + LogDebug("Getting Pkgname List "); + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) + return select->GetValueList(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get Pkgname list") +} + +DbWidgetDAOReadOnlyList WidgetDAOReadOnly::getWidgetList() +{ + LogDebug("Getting DbWidget List"); + DbWidgetDAOReadOnlyList list; + FOREACH(iterator, getHandleList()) { + list.push_back(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(*iterator))); + } + return list; +} + bool WidgetDAOReadOnly::isWidgetInstalled(DbWidgetHandle handle) { LogDebug("Checking if widget exist. Handle: " << handle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) select->Where(Equals(handle)); @@ -384,13 +449,11 @@ bool WidgetDAOReadOnly::isWidgetInstalled(DbWidgetHandle handle) SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to check if widget exist") } -bool WidgetDAOReadOnly::isWidgetInstalled(DPL::String pkgName) +bool WidgetDAOReadOnly::isWidgetInstalled(const WidgetPkgName & pkgName) { LogDebug("Checking if widget exist. package name " << pkgName); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface()) select->Where(Equals(pkgName)); @@ -401,14 +464,34 @@ bool WidgetDAOReadOnly::isWidgetInstalled(DPL::String pkgName) SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to check if widget exist") } -CertificateChainList WidgetDAOReadOnly::getWidgetCertificate() const +ExternalLocationList WidgetDAOReadOnly::getWidgetExternalLocations() const +{ + LogDebug("Getting WidgetExtranalFiles List"); + ExternalLocationList result; + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + WRT_DB_SELECT(select, WidgetExternalLocations, &WrtDatabase::interface()); + select->Where(Equals(m_widgetHandle)); + WidgetExternalLocations::Select::RowList rows = select->GetRowList(); + FOREACH(it, rows) + { + result.push_back(DPL::ToUTF8String(it->Get_path())); + } + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get handle list") + return result; +} + +CertificateChainList WidgetDAOReadOnly::getWidgetCertificate( + CertificateSource source) const { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetCertificate, &WrtDatabase::interface()) - select->Where(Equals(m_widgetHandle)); + select->Where( + And( + Equals(m_widgetHandle), + Equals(source))); - std::list chainList = select->GetRowList(); + std::list chainList = select->GetRowList(); CertificateChainList result; @@ -447,8 +530,7 @@ WidgetGUID WidgetDAOReadOnly::getGUID() const DPL::OptionalString WidgetDAOReadOnly::getPkgname() const { - WidgetInfoRow row = getWidgetInfoRow(m_widgetHandle); - return row.Get_pkgname(); + return DPL::OptionalString(getPkgName()); } DPL::OptionalString WidgetDAOReadOnly::getDefaultlocale() const @@ -491,8 +573,6 @@ std::string WidgetDAOReadOnly::getShareHref() const { SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetExtendedInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); WidgetExtendedInfo::Select::RowList rows = select->GetRowList(); @@ -558,8 +638,6 @@ bool WidgetDAOReadOnly::isTrusted() const bool WidgetDAOReadOnly::isTestWidget() const { Try { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetExtendedInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); @@ -585,12 +663,10 @@ bool WidgetDAOReadOnly::getWebkitPluginsRequired() const if (ret.IsNull() || *ret == 0) { return false; } else { return true; } } -bool WidgetDAOReadOnly::isFactory() const +time_t WidgetDAOReadOnly::getInstallTime() const { SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetExtendedInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); @@ -600,21 +676,15 @@ bool WidgetDAOReadOnly::isFactory() const "Cannot find widget. Handle: " << m_widgetHandle); } - DPL::OptionalInt ret = rows.front().Get_factory_widget(); - if (ret.IsNull()) { - return false; - } - return static_cast(*ret); + return static_cast(*rows.front().Get_install_time()); } - SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get isFactory") + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get widdget install time") } -time_t WidgetDAOReadOnly::getInstallTime() const +DPL::OptionalString WidgetDAOReadOnly::getSplashImgSrc() const { SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetExtendedInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); @@ -624,9 +694,14 @@ time_t WidgetDAOReadOnly::getInstallTime() const "Cannot find widget. Handle: " << m_widgetHandle); } - return static_cast(*rows.front().Get_install_time()); + DPL::OptionalString value = rows.front().Get_splash_img_src(); + if (value.IsNull()) { + return DPL::OptionalString::Null; + } + + return DPL::OptionalString(getPath() + *value); } - SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get widdget install time") + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get splash image path") } WidgetDAOReadOnly::WidgetLocalizedIconList WidgetDAOReadOnly::getLocalizedIconList() const @@ -634,12 +709,10 @@ WidgetDAOReadOnly::WidgetLocalizedIconList WidgetDAOReadOnly::getLocalizedIconLi //TODO check widget existance?? SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetLocalizedIcon, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); - std::list list = + std::list list = select->GetRowList(); WidgetLocalizedIconList ret; FOREACH(it,list) @@ -659,12 +732,10 @@ WidgetDAOReadOnly::WidgetIconList WidgetDAOReadOnly::getIconList() const //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, wrt::WidgetIcon, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); - std::list list = + std::list list = select->GetRowList(); WidgetIconList ret; FOREACH(it,list) @@ -686,14 +757,12 @@ WidgetDAOReadOnly::LocalizedStartFileList WidgetDAOReadOnly::getLocalizedStartFi //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetLocalizedStartFile, &WrtDatabase::interface()) select->Where(Equals( m_widgetHandle)); select->OrderBy("start_file_id ASC"); - std::list list = + std::list list = select->GetRowList(); LocalizedStartFileList ret; FOREACH(it,list) @@ -715,13 +784,11 @@ WidgetDAOReadOnly::WidgetStartFileList WidgetDAOReadOnly::getStartFileList() con //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetStartFile, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); select->OrderBy("start_file_id ASC"); - std::list list = + std::list list = select->GetRowList(); WidgetStartFileList ret; FOREACH(it,list) @@ -741,8 +808,6 @@ WindowModeList WidgetDAOReadOnly::getWindowModes() const //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetWindowModes, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); @@ -767,18 +832,11 @@ std::string WidgetDAOReadOnly::getBaseFolder() const return baseFolder; } -bool WidgetDAOReadOnly::isDeletable() const -{ - return !WidgetDAOReadOnly::isFactory(); -} - WidgetCertificateDataList WidgetDAOReadOnly::getCertificateDataList() const { //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetCertificateFingerprint, &WrtDatabase::interface()) select->Where(Equals( m_widgetHandle)); @@ -820,8 +878,6 @@ FingerPrintList WidgetDAOReadOnly::getKeyFingerprints( //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetCertificateFingerprint, &WrtDatabase::interface()) select->Where(And(And( Equals(m_widgetHandle), @@ -834,10 +890,14 @@ FingerPrintList WidgetDAOReadOnly::getKeyFingerprints( FingerPrintList keys; FOREACH(it, rows) { - DPL::Optional md5 = it->Get_md5_fingerprint(); - keys.push_back(md5.IsNull() ? "" : DPL::ToUTF8String(*md5)); DPL::Optional sha1 = it->Get_sha1_fingerprint(); - keys.push_back(sha1.IsNull() ? "" : DPL::ToUTF8String(*sha1)); + if (!sha1.IsNull()) { + keys.push_back(DPL::ToUTF8String(*sha1)); + } + DPL::Optional md5 = it->Get_md5_fingerprint(); + if (!md5.IsNull()) { + keys.push_back(DPL::ToUTF8String(*md5)); + } } return keys; } @@ -851,8 +911,6 @@ WidgetCertificateCNList WidgetDAOReadOnly::getKeyCommonNameList( //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetCertificateFingerprint, &WrtDatabase::interface()) select->Where(And(And( Equals(m_widgetHandle), @@ -876,14 +934,12 @@ WidgetCertificateCNList WidgetDAOReadOnly::getKeyCommonNameList( ResourceAttributeList WidgetDAOReadOnly::getResourceAttribute( const std::string &resourceId) const { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, DPL::DB::ORM::wrt::WidgetFeature, &WrtDatabase::interface()) - select->Where(And(Equals(m_widgetHandle), - Equals( + WRT_DB_SELECT(select, WidgetFeature, &WrtDatabase::interface()) + select->Where(And(Equals(m_widgetHandle), + Equals( DPL::FromUTF8String(resourceId)))); - std::list list = select->GetRowList(); + std::list list = select->GetRowList(); ResourceAttributeList result; if (!list.empty()) { int widgetFeatureId = list.begin()->Get_widget_feature_id(); @@ -901,8 +957,6 @@ void WidgetDAOReadOnly::getWidgetAccessInfo( //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetWARPInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); @@ -926,13 +980,11 @@ void WidgetDAOReadOnly::getWidgetAccessInfo( SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get accessinfo list") } -LanguageTagList WidgetDAOReadOnly::getLanguageTags() const +LanguageTags WidgetDAOReadOnly::getLanguageTags() const { //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, LocalizedWidgetInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); return select->GetValueList(); @@ -940,11 +992,9 @@ LanguageTagList WidgetDAOReadOnly::getLanguageTags() const SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get language tags") } -LanguageTagList WidgetDAOReadOnly::getIconLanguageTags() const +LanguageTags WidgetDAOReadOnly::getIconLanguageTags() const { //TODO check widget existance - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, WidgetLocalizedIcon, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); select->Distinct(); @@ -956,9 +1006,9 @@ std::string WidgetDAOReadOnly::getCookieDatabasePath() const using namespace WrtDB::WidgetConfig; std::ostringstream path; - DPL::OptionalString pkgname = getPkgname(); + WidgetPkgName pkgname = getPkgName(); - path << GetWidgetPersistentStoragePath(*pkgname); + path << GetWidgetPersistentStoragePath(pkgname); path << "/"; path << GlobalConfig::GetCookieDatabaseFile(); @@ -968,77 +1018,23 @@ std::string WidgetDAOReadOnly::getCookieDatabasePath() const std::string WidgetDAOReadOnly::getPrivateLocalStoragePath() const { std::ostringstream path; - DPL::OptionalString pkgname = getPkgname(); - path << WidgetConfig::GetWidgetWebLocalStoragePath(*pkgname); + WidgetPkgName pkgname = getPkgName(); + path << WidgetConfig::GetWidgetWebLocalStoragePath(pkgname); path << "/"; - if (isFactory()) { - WidgetGUID widgetGUID = getGUID(); - if (!widgetGUID) { - Throw(WidgetDAOReadOnly::Exception::GUIDisNull); - } - path << DPL::ToUTF8String(*widgetGUID); - } - return path.str(); } -ChildProtection::Record WidgetDAOReadOnly::getChildProtection() const -{ - WidgetInfoRow row = getWidgetInfoRow(m_widgetHandle); - return ChildProtection::Record(row.Get_child_protection()); -} - -Powder::Description WidgetDAOReadOnly::getPowderDescription() const -{ - //TODO check widget existance - SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN - { - using namespace Powder; - Description description; - - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, PowderLevels, &WrtDatabase::interface()) - select->Where(Equals(m_widgetHandle)); - typedef std::list RowList; - RowList list = select->GetRowList(); - - FOREACH(it, list) - { - Description::CategoryEntry& categoryEntry = - description.categories[it->Get_category()]; - Description::LevelEntry levelEntry( - (Description::LevelEnum)it->Get_level()); - - WRT_DB_SELECT(selectContexts, PowderLevelContexts, &WrtDatabase::interface()) - selectContexts->Where(Equals( - it->Get_id())); - typedef std::list ContextsRowList; - ContextsRowList contextsList = selectContexts->GetRowList(); - - FOREACH(c, contextsList) - levelEntry.context.insert(c->Get_context()); - - categoryEntry.levels.push_back(levelEntry); - } - return description; - } - SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get powder description") -} - void WidgetDAOReadOnly::getWidgetSettings( WidgetSettings& outWidgetSettings) const { //TODO check widget existance SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; - WRT_DB_SELECT(select, SettginsList, &WrtDatabase::interface()) - select->Where(Equals(m_widgetHandle)); + WRT_DB_SELECT(select, SettingsList, &WrtDatabase::interface()) + select->Where(Equals(m_widgetHandle)); - SettginsList::Select::RowList rows = select->GetRowList(); + SettingsList::Select::RowList rows = select->GetRowList(); FOREACH(it, rows) { @@ -1058,11 +1054,9 @@ void WidgetDAOReadOnly::getAppServiceList( LogDebug("Getting getAppServiceList. Handle: " << m_widgetHandle); SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN { - DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface()); + ScopedTransaction transaction(&WrtDatabase::interface()); CHECK_WIDGET_EXISTENCE(transaction, m_widgetHandle) - using namespace DPL::DB::ORM; - using namespace DPL::DB::ORM::wrt; WRT_DB_SELECT(select, ApplicationServiceInfo, &WrtDatabase::interface()) select->Where(Equals(m_widgetHandle)); @@ -1087,6 +1081,121 @@ void WidgetDAOReadOnly::getAppServiceList( SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get access host list") } +PackagingType WidgetDAOReadOnly::getPackagingType() const +{ + WidgetInfoRow row = getWidgetInfoRow(m_widgetHandle); + DPL::OptionalInt result = row.Get_pkg_type(); + return PackagingType(static_cast(*result)); +} + +void WidgetDAOReadOnly::getEncryptedFileList(EncryptedFileList& filesList) const +{ + //TODO check widget existance + WRT_DB_SELECT(select, EncryptedResourceList, &WrtDatabase::interface()) + select->Where(Equals(m_widgetHandle)); + + typedef std::list RowList; + RowList list = select->GetRowList(); + + FOREACH(it, list) { + EncryptedFileInfo info; + info.fileName = it->Get_resource(); + info.fileSize = it->Get_size(); + filesList.insert(info); + } +} + +DPL::OptionalString WidgetDAOReadOnly::getBackgroundPage() const +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + WRT_DB_SELECT(select, WidgetExtendedInfo, &WrtDatabase::interface()) + select->Where(Equals(m_widgetHandle)); + + WidgetExtendedInfo::Select::RowList rows = select->GetRowList(); + if (rows.empty()) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << m_widgetHandle); + } + + return rows.front().Get_background_page(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get background page") +} + +WidgetPkgName WidgetDAOReadOnly::generateTizenId() { + std::string allowed("0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"); + WidgetPkgName tizenId; + tizenId.resize(MAX_TIZENID_LENGTH); + do { + for (int i = 0; i < MAX_TIZENID_LENGTH; ++i) { + tizenId[i] = allowed[rand() % allowed.length()]; + } + } while (isWidgetInstalled(tizenId)); + return tizenId; +} + +SettingsType WidgetDAOReadOnly::getSecurityPopupUsage(void) const +{ + WidgetSecuritySettingsRow row = + getWidgetSecuritySettingsRow(m_widgetHandle); + DPL::OptionalInt result = row.Get_security_popup_usage(); + return static_cast(*result); +} + +SettingsType WidgetDAOReadOnly::getGeolocationUsage(void) const +{ + WidgetSecuritySettingsRow row = + getWidgetSecuritySettingsRow(m_widgetHandle); + DPL::OptionalInt result = row.Get_geolocation_usage(); + return static_cast(*result); +} + +SettingsType WidgetDAOReadOnly::getWebNotificationUsage(void) const +{ + WidgetSecuritySettingsRow row = + getWidgetSecuritySettingsRow(m_widgetHandle); + DPL::OptionalInt result = row.Get_web_notification_usage(); + return static_cast(*result); +} + +SettingsType WidgetDAOReadOnly::getWebDatabaseUsage(void) const +{ + WidgetSecuritySettingsRow row = + getWidgetSecuritySettingsRow(m_widgetHandle); + DPL::OptionalInt result = row.Get_web_database_usage(); + return static_cast(*result); +} + +SettingsType WidgetDAOReadOnly::getFileSystemUsage(void) const +{ + WidgetSecuritySettingsRow row = + getWidgetSecuritySettingsRow(m_widgetHandle); + DPL::OptionalInt result = row.Get_file_system_usage(); + return static_cast(*result); +} + +DPL::OptionalString WidgetDAOReadOnly::getWidgetInstalledPath() const +{ + SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN + { + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::wrt; + WRT_DB_SELECT(select, WidgetExtendedInfo, &WrtDatabase::interface()) + select->Where(Equals(m_widgetHandle)); + + WidgetExtendedInfo::Select::RowList rows = select->GetRowList(); + if (rows.empty()) { + ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist, + "Cannot find widget. Handle: " << m_widgetHandle); + } + + return rows.front().Get_installed_path(); + } + SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to get widdget installed path") +} #undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN #undef SQL_CONNECTION_EXCEPTION_HANDLER_END #undef CHECK_WIDGET_EXISTENCE diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/WrtDatabase.h b/modules/widget_dao/include/dpl/wrt-dao-ro/WrtDatabase.h index 86a0980..28ebdf5 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/WrtDatabase.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/WrtDatabase.h @@ -25,7 +25,8 @@ class WrtDatabase public: static const char *Address(); static DPL::DB::SqlConnection::Flag::Type Flags(); - static void attachToThread(); + static void attachToThreadRO(); + static void attachToThreadRW(); static void detachFromThread(); static DPL::DB::ThreadDatabaseSupport& interface(); static bool CheckTableExist(const char *name); diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/common_dao_types.h b/modules/widget_dao/include/dpl/wrt-dao-ro/common_dao_types.h index 6913766..444f176 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/common_dao_types.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/common_dao_types.h @@ -21,204 +21,19 @@ * @brief This file contains the declaration of common data types for wrtdb */ -#ifndef WRT_SRC_CONFIGURATION_COMMON_DAO_TYPES_H_ -#define WRT_SRC_CONFIGURATION_COMMON_DAO_TYPES_H_ +#ifndef WRT_WIDGET_DAO_COMMON_DAO_TYPES_H_ +#define WRT_WIDGET_DAO_COMMON_DAO_TYPES_H_ #include #include #include #include #include +#include #include -#include -namespace WrtDB { -namespace Powder { - -typedef std::set StringSet; -//! Widget description -struct Description -{ - //!Content level - typedef enum - { - Level0 = 0, - Level1, - Level2, - Level3, - Level4, - Level5, - LevelUnknown - } LevelEnum; - struct LevelEntry - { - LevelEnum level; //!< content level - - typedef StringSet Context; - - //! POWDER context - //! xa This material appears in an artistic context - //! xb This material appears in an educational context - //! xc This material appears in a medical context - //! xd This material appears in a sports context - //! xe This material appears in a violent context - Context context; - explicit LevelEntry(LevelEnum level = LevelUnknown); - //! Function checks if context is valid - //! \param[in] level POWDER content level - //! \param[in] context POWDER context - bool isContextValid(LevelEnum level, - const DPL::OptionalString& context) const; - }; - - struct CategoryEntry - { - //! Levels entries for POWDER description - typedef std::vector LevelsContainer; - LevelsContainer levels; - //! Function checks if context is valid - //! \param[out] reason set if context invalid - //! \param[in] level POWDER content level - //! \param[in] context POWDER context - bool isCategoryValid(LevelEntry& reason, - LevelEnum level, - const DPL::OptionalString& context) const; - }; - - //! POWDER Category -> Category entry map for Widget - //! - //! nu Nudity - //! se Sex - //! vi Violence - //! la Potentially offensive language - //! dr Drug use - //! ga Gambling - //! ha Hate or harmful activities - //! ug Use of user-generated content - typedef std::map CategoryEntries; - - CategoryEntries categories; - - //! Age rating for widget - //! If Null not set - DPL::OptionalInt ageRating; -}; -} // namespace Powder - -namespace ChildProtection { - -//! Blacklist with forbidden URLs -//! It should be stored in WidgetDAO -typedef std::vector BlackList; - -//! Widget Child protection record -//! Record should be stored in WingetDAO -struct Record -{ - //! Child protection enabled - bool enabled; - explicit Record(bool enabled) : - enabled(enabled) - { - } -}; - -//! Powder processing -struct PowderRules -{ - //! Rule set by parent about forbidden category - //! Powder category - //! nu Nudity - //! se Sex - //! vi Violence - //! la Potentially offensive language - //! dr Drug use - //! ga Gambling - //! ha Hate or harmful activities - //! ug Use of user-generated content - //! Powder context - //! xa This material appears in an artistic conteaxt - //! xb This material appears in an educational context - //! xc This material appears in a medical context - //! xd This material appears in a sports context - //! xe This material appears in a violent context - struct CategoryRule - { - DPL::String category; - Powder::Description::LevelEnum level; - DPL::OptionalString context; - explicit CategoryRule(const DPL::String& category = DPL::String(), - Powder::Description::LevelEnum level = - Powder::Description::LevelUnknown, - const DPL::OptionalString& context = DPL::OptionalString()); - }; - - struct PowderResult - { - //! Reasoning outcome: part of POWDER description used to invalidate - Powder::Description::LevelEntry invalidDescription; - //! Reasoning outcome: rule set by parent not full filed by description - CategoryRule invalidRule; - - //! Reasoning outcome: type of invalidity - enum InvalidReason - { - InvalidRule, //!< One of rules was not fulfilled - InvalidAge, //!< Age is invalid - AgeRatingNotSet, //!< Age rating for widget is not set - Valid //!< Description valid - }; - InvalidReason reason; - explicit PowderResult(InvalidReason reason = Valid, - const Powder::Description::LevelEntry& invalidDescription = - Powder::Description::LevelEntry(), - const CategoryRule& invalidRule = CategoryRule()); - }; - - typedef std::pair ResultPair; - - //! Function checks if rule is fulfilled by description - //! \param[in] rule checked rule - //! \param[in] description - //! \retval true rule is valid - //! \retval false rule is invalid - ResultPair isRuleValidForDescription(const CategoryRule& rule, - const Powder::Description& description) const; - //! Function checks if age limit is fulfilled by description - //! \param[in] description - //! \retval true age is valid - //! \retval false age is invalid - ResultPair isAgeValidForDescription( - const Powder::Description& description) const; - - //! It is the maximum age rating valid for child - //! Uniform age is stored in WidgetDAO - DPL::OptionalInt ageLimit; - - //! Set to true if age rating is required - //! If ageLimit is not set value is ignored - bool isAgeRatingRequired; - - //! Set of rules configured by parent - //! Rules are stored in WidgetDAO and are uniform for all widgets - typedef std::vector RulesContainer; - RulesContainer rules; - - //! Function check if Widget description is valid for ChildProtection - //! configuration - //! \param description widget description - //! \retval true widget is valid - //! \retval false widget is invalid - ResultPair isDescriptionValid(const Powder::Description& description) - const; - - PowderRules() : - isAgeRatingRequired(false) - { - } -}; -} // namespace ChildProtection +namespace WrtDB { class PluginMetafileData { public: @@ -241,11 +56,6 @@ class PluginMetafileData } std::string m_libraryName; - std::string m_featuresInstallURI; - std::string m_featuresKeyCN; - std::string m_featuresRootCN; - std::string m_featuresRootFingerprint; - FeatureContainer m_featureContainer; }; @@ -253,7 +63,7 @@ class PluginObjectsDAO { public: typedef std::set Objects; - typedef DPL::SharedPtr ObjectsPtr; + typedef std::shared_ptr ObjectsPtr; public: explicit PluginObjectsDAO() {} @@ -271,6 +81,14 @@ class PluginObjectsDAO * FindWidgetModel routine. */ typedef int DbWidgetHandle; +typedef DPL::String WidgetPkgName; + +/** + * Value of invalid widget handle + */ +enum { + INVALID_WIDGET_HANDLE = -1 +}; /** * @brief Structure to hold the information of widget's size @@ -315,10 +133,33 @@ struct WidgetAccessInfo } }; +struct EncryptedFileInfo +{ + DPL::String fileName; + int fileSize; + + bool operator==(const EncryptedFileInfo& info) const + { + return fileName == info.fileName; + } + + bool operator==(const DPL::String& file) const + { + return fileName == file; + } + + bool operator< (const EncryptedFileInfo& info) const + { + return fileName < info.fileName; + } +}; + typedef std::list WidgetAccessInfoList; typedef std::list WindowModeList; +typedef std::set EncryptedFileList; + /** * @brief Widget configuration parameter key */ @@ -360,7 +201,8 @@ struct DbWidgetFeature { DPL::String name; /// Feature name bool required; /// Whether feature is required - DbPluginHandle pluginId; /// Plugin id that implement this feature + bool rejected; /// Api feature was rejected by ace + DbPluginHandle pluginId; /// Plugin id that implement this feature WidgetParamMap params; /// Widget's params DbWidgetFeature() : @@ -394,6 +236,16 @@ typedef std::multiset DbWidgetFeatureSet; */ typedef std::list DbWidgetHandleList; +typedef std::list WidgetPkgNameList; //TODO: this cannot be null -> appropriate changes in db schema needed +typedef std::list WidgetPkgNameList_TEMPORARY_API; //TODO: this cannot be null -> appropriate changes in db schema needed + +class WidgetDAOReadOnly; //forward declaration +typedef std::shared_ptr WidgetDAOReadOnlyPtr; +/** + * @brief Default container with WidgetDAOReadOnly + */ +typedef std::list DbWidgetDAOReadOnlyList; + /** * @brief Widget specific type * @@ -402,9 +254,8 @@ typedef std::list DbWidgetHandleList; enum AppType { APP_TYPE_UNKNOWN = 0, // unknown - APP_TYPE_WAC10, // WAC 1.0 APP_TYPE_WAC20, // WAC 2.0 - APP_TYPE_TIZENWEBAPP, // Tizen webapp + APP_TYPE_TIZENWEBAPP // Tizen webapp }; class WidgetType @@ -422,12 +273,15 @@ class WidgetType { return appType == other; } + bool operator!= (const AppType& other) const + { + return appType != other; + } std::string getApptypeToString() { switch (appType) { #define X(x) case x: return #x; X(APP_TYPE_UNKNOWN) - X(APP_TYPE_WAC10) X(APP_TYPE_WAC20) X(APP_TYPE_TIZENWEBAPP) #undef X @@ -439,6 +293,64 @@ class WidgetType AppType appType; }; +/** + * @brief Package specific type + * + * Package type describes belowed in Tizen webapp, C++ service App + */ +enum PkgType +{ + PKG_TYPE_UNKNOWN = 0, // unknown + PKG_TYPE_NOMAL_WEB_APP, + PKG_TYPE_DIRECTORY_WEB_APP, + PKG_TYPE_HOSTED_WEB_APP, // request from browser + PKG_TYPE_HYBRID_WEB_APP // Tizen webapp with C++ service app +}; + +class PackagingType +{ + public: + PackagingType() + :pkgType(PKG_TYPE_UNKNOWN) + { + } + PackagingType(const PkgType type) + :pkgType(type) + { + } + bool operator== (const PkgType& other) const + { + return pkgType == other; + } + bool operator!= (const PkgType& other) const + { + return pkgType != other; + } + std::string getPkgtypeToString() + { + switch (pkgType) { +#define X(x) case x: return #x; + X(PKG_TYPE_UNKNOWN) + X(PKG_TYPE_NOMAL_WEB_APP) + X(PKG_TYPE_DIRECTORY_WEB_APP) + X(PKG_TYPE_HOSTED_WEB_APP) + X(PKG_TYPE_HYBRID_WEB_APP) +#undef X + default: + return "UNKNOWN"; + } + } + + PkgType pkgType; +}; + +enum SettingsType +{ + SETTINGS_TYPE_UNKNOWN = 0, + SETTINGS_TYPE_ON, + SETTINGS_TYPE_ALWAYS_ASK, + SETTINGS_TYPE_OFF +}; } // namespace WrtDB struct WidgetSetting @@ -484,4 +396,5 @@ struct WidgetApplicationService }; typedef std::list WidgetApplicationServiceList; -#endif /* WRT_SRC_CONFIGURATION_COMMON_DAO_TYPES_H_ */ + +#endif /* WRT_WIDGET_DAO_COMMON_DAO_TYPES_H_ */ diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/config_parser_data.h b/modules/widget_dao/include/dpl/wrt-dao-ro/config_parser_data.h old mode 100644 new mode 100755 index a2d92ef..ad9929d --- a/modules/widget_dao/include/dpl/wrt-dao-ro/config_parser_data.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/config_parser_data.h @@ -43,7 +43,7 @@ class ConfigParserData public: struct Param { - Param(const DPL::String& name) : name(name) + Param(const DPL::String& _name) : name(_name) { } DPL::String name; @@ -59,9 +59,9 @@ class ConfigParserData struct Feature { - Feature(const DPL::String& name, - bool required = true) : name(name), - required(required) + Feature(const DPL::String& _name, + bool _required = true) : name(_name), + required(_required) { } DPL::String name; @@ -77,9 +77,25 @@ class ConfigParserData }; typedef std::set FeaturesList; + struct Privilege + { + Privilege(const DPL::String& _name) : name(_name) + { + } + DPL::String name; + + bool operator==(const Privilege&) const; + bool operator!=(const Privilege&) const; + bool operator >(const Privilege&) const; + bool operator>=(const Privilege&) const; + bool operator <(const Privilege&) const; + bool operator<=(const Privilege&) const; + }; + typedef std::set PrivilegeList; + struct Icon { - Icon(const DPL::String& src) : src(src) + Icon(const DPL::String& _src) : src(_src) { } DPL::String src; @@ -109,11 +125,11 @@ class ConfigParserData struct Preference { - Preference(const DPL::String& name, - bool readonly = false) : - name(name), + Preference(const DPL::String& _name, + bool _readonly = false) : + name(_name), value(), - readonly(readonly) + readonly(_readonly) { } DPL::String name; @@ -167,6 +183,9 @@ class ConfigParserData typedef std::set SettingsList; + /* ServiceInfo will be removed. + * ServiceInfo will be changed AppControl + */ struct ServiceInfo { ServiceInfo( @@ -188,7 +207,62 @@ class ConfigParserData bool operator==(const ServiceInfo&) const; bool operator!=(const ServiceInfo&) const; }; - typedef std::list ServiceInfoList; + + struct AppControlInfo + { + AppControlInfo( + const DPL::String& operation) : + m_operation(operation) + { + } + DPL::String m_src; + DPL::String m_operation; + std::set m_uriList; + std::set m_mimeList; + + bool operator==(const AppControlInfo&) const; + bool operator!=(const AppControlInfo&) const; + }; + + typedef std::list ServiceInfoList; // It will be removed. + typedef std::list AppControlInfoList; + + typedef std::list> BoxSizeList; + + struct LiveboxInfo + { + LiveboxInfo() { } + + struct BoxContent + { + DPL::String m_boxSrc; + BoxSizeList m_boxSize ; + DPL::String m_pdSrc; + DPL::String m_pdWidth; + DPL::String m_pdHeight; + }; typedef BoxContent BoxContentInfo; + + DPL::String m_label; + DPL::String m_icon; + DPL::String m_liveboxId; + DPL::String m_primary; + DPL::String m_autoLaunch; + DPL::String m_updatePeriod; + BoxContentInfo m_boxInfo; + + bool operator==(const LiveboxInfo&) const; + bool operator!=(const LiveboxInfo&) const; + bool operator >(const LiveboxInfo&) const; + bool operator>=(const LiveboxInfo&) const; + bool operator <(const LiveboxInfo&) const; + bool operator<=(const LiveboxInfo&) const; + }; + typedef std::list> LiveboxList; + LiveboxList m_livebox; + + typedef std::list DependsPkgList; + + typedef std::set CategoryList; StringsList nameSpaces; @@ -199,6 +273,7 @@ class ConfigParserData DPL::OptionalString authorEmail; FeaturesList featuresList; + PrivilegeList privilegeList; SettingsList settingsList; @@ -217,9 +292,7 @@ class ConfigParserData bool flashNeeded; - DPL::OptionalFloat minVersionRequired; - DPL::OptionalInt minVersionRequiredFound; - StringsList powderDescriptionLinks; + DPL::OptionalString minVersionRequired; bool backSupported; bool accessNetwork; @@ -231,15 +304,26 @@ class ConfigParserData DPL::OptionalString startFileContentType; IconsList iconsList; - // pakcage name determined by operator for TIZEN webapp - DPL::OptionalString pkgname; + // tizen id / required platform min version for TIZEN webapp + DPL::OptionalString tizenId; + DPL::OptionalString tizenMinVersionRequired; + //Application service model list - ServiceInfoList appServiceList; + ServiceInfoList appServiceList; //It will be removed. + AppControlInfoList appControlList; + + // For link shared directory + DependsPkgList dependsPkgList; + // Splash image path + DPL::OptionalString splashImgSrc; + // Background page filename + DPL::OptionalString backgroundPage; + // For category + CategoryList categoryList; ConfigParserData() : flashNeeded(false), - minVersionRequired(1.0), - minVersionRequiredFound(), + minVersionRequired(), backSupported(false), accessNetwork(false), startFileEncountered(false) diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/feature_dao_read_only.h b/modules/widget_dao/include/dpl/wrt-dao-ro/feature_dao_read_only.h index 9bd8945..1a736f9 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/feature_dao_read_only.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/feature_dao_read_only.h @@ -48,6 +48,9 @@ class FeatureDAOReadOnly }; typedef std::set DeviceCapabilitiesList; + typedef std::multimap DeviceCapabilitiesMap; + typedef std::map NameMap; + typedef std::map FeatureMap; static bool isDeviceCapabilityInstalled(const std::string &deviceCapName); @@ -62,16 +65,17 @@ class FeatureDAOReadOnly static FeatureHandleList GetHandleList(); std::string GetName() const; - std::string GetInstallURI() const; - std::string GetKeyCn() const; - std::string GetRootKey() const; - std::string GetRootKeyFingerprint() const; FeatureHandle GetFeatureHandle() const; std::string GetLibraryPath() const; std::string GetLibraryName() const; DeviceCapabilitiesList GetDeviceCapabilities() const; DbPluginHandle GetPluginHandle() const; + static NameMap GetNames(); + static DeviceCapabilitiesMap GetDevCapWithFeatureHandle(); + + static FeatureMap GetFeatures(const std::list& featureNames); + protected: FeatureHandle m_featureHandle; }; diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/feature_model.h b/modules/widget_dao/include/dpl/wrt-dao-ro/feature_model.h index 13b959c..fc9754d 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/feature_model.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/feature_model.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include #include @@ -34,11 +34,16 @@ namespace WrtDB { typedef int FeatureHandle; typedef std::list FeatureHandleList; -typedef DPL::SharedPtr FeatureHandleListPtr; +typedef std::shared_ptr FeatureHandleListPtr; typedef int FeatureSetHandle; typedef std::list FeatureSetHandleList; +typedef struct { + std::string featureName; + DbPluginHandle pluginHandle; +} FeatureData; + class FeatureModel : public DPL::Event::Model { public: @@ -55,9 +60,16 @@ class FeatureModel : public DPL::Event::Model PHandle(this, -1) { } + + void SetData(const std::string& name, const std::set& deviceCapabilities, const DbPluginHandle& pluginHandle) + { + Name.SetWithoutLock(name); + DeviceCapabilities.SetWithoutLock(deviceCapabilities); + PHandle.SetWithoutLock(pluginHandle); + } }; -typedef DPL::SharedPtr FeatureModelPtr; +typedef std::shared_ptr FeatureModelPtr; } // namespace WrtDB diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/global_config.h b/modules/widget_dao/include/dpl/wrt-dao-ro/global_config.h index bda207b..5558dbd 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/global_config.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/global_config.h @@ -53,19 +53,27 @@ inline const char* GetDevicePluginPath() } /** - * WRT factory widgets that are loaded by default + * WRT widgets that are downloaded and installed by user + */ +inline const char* GetUserInstalledWidgetPath() +{ + return "/opt/usr/apps"; +} + +/** + * WRT widgets that are preloaded */ -inline const char* GetFactoryInstalledWidgetPath() +inline const char* GetUserPreloadedWidgetPath() { - return "/opt/apps/widget/system"; + return "/usr/apps"; } /** * WRT widgets that are downloaded and installed by user */ -inline const char* GetUserInstalledWidgetPath() +inline const char* GetWidgetUserDataPath() { - return "/opt/apps"; + return "/opt/usr/apps"; } /** @@ -73,7 +81,7 @@ inline const char* GetUserInstalledWidgetPath() */ inline const char* GetWidgetSrcPath() { - return "res/src"; + return "/res/wgt"; } /** @@ -81,7 +89,7 @@ inline const char* GetWidgetSrcPath() */ inline const char* GetPublicVirtualRootPath() { - return "/opt/apps/widget/data/Public"; + return "/opt/share/widget/data/Public"; } /** @@ -97,7 +105,7 @@ inline const char* GetWidgetLocalStoragePath() */ inline const char* GetTestsDataPath() { - return "/opt/apps/widget/tests"; + return "/opt/share/widget/tests"; } /** @@ -105,7 +113,7 @@ inline const char* GetTestsDataPath() */ inline const char* GetUserWidgetExecPath() { - return "bin"; + return "/bin"; } /** @@ -116,6 +124,13 @@ inline const char* GetWidgetPrivateStoragePath() return "data"; } +/** + * widgets share directory path + */ +inline const char* GetWidgetSharePath() +{ + return "share"; +} /** * widgets desktop files path @@ -138,7 +153,7 @@ inline const char* GetWrtClientExec() */ inline const char* GetUserWidgetDesktopIconPath() { - return "res/icons/default/small"; + return "/opt/share/icons/default/small"; } /** @@ -149,14 +164,6 @@ inline const char* GetUserWidgetDefaultIconFile() return "/usr/share/wrt-engine/wrt_widget_default_icon.png"; } -/** - * WRT downloaded widgets - */ -// KW inline const char* GetDownloadedWidgetPath() -// KW { -// KW return "/opt/apps/widget/test-widgets"; -// KW } - inline const char* GetSignatureXmlSchema() { //TODO please rename, this filename is not descriptive enough @@ -193,13 +200,29 @@ inline const char* GetPluginMetafileName() } /** + * Plugin .so prefix + */ +inline const char* GetPluginPrefix() +{ + return "libwrt-plugins-"; +} + +/** + * Plugin .so suffix + */ +inline const char* GetPluginSuffix() +{ + return ".so"; +} + +/** * WRT device plugins installation required * File which indicate that new plugins * are available and should be installed */ inline const char* GetPluginInstallInitializerName() { - return "/opt/apps/widget/plugin-installation-required"; + return "/opt/share/widget/plugin-installation-required"; } /** @@ -218,10 +241,8 @@ inline const char* GetFingerprintListSchema() inline const char* GetVCoreDatabaseFilePath() { - return "/opt/dbspace/.vcore.db"; + return "/opt/dbspace/.cert_svc_vcore.db"; } -bool IsOCSPEnabled(); -bool IsCRLEnabled(); /** * widgets cookie database file name @@ -243,6 +264,62 @@ inline const char* GetTmpDirPath() { return "/tmp"; } + +inline const char* GetWACVersion() +{ + return "2.0"; +} + +inline const char* GetTizenVersion() +{ + return "1.0"; +} + +inline const char* GetShareDirectoryPath() +{ + return "/opt/share"; +} + +inline const char* GetTempInstallInfoPath() +{ + return "/opt/share/widget/temp_info"; +} + +inline const char* GetVconfKeyPrefixPath() +{ + return "file/private"; +} + +inline const char* GetVconfKeyPopupUsagePath() +{ + return "/popup_usage"; +} + +inline const char* GetVconfKeyGeolocationUsagePath() +{ + return "/geolocation_usage"; +} + +inline const char* GetVconfKeyWebNotificationUsagePath() +{ + return "/web_notification_usage"; +} + +inline const char* GetVconfKeyWebDatabaseUsagePath() +{ + return "/web_database_usage"; +} + +inline const char* GetVconfKeyFilesystemUsagePath() +{ + return "/filesystem_usage"; +} + +inline const char* GetVconfKeyMemorySavingModePath() +{ + return "/memory_saving_mode"; +} + } // namespace GlobalConfig } // namespace WrtDB diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/global_dao_read_only.h b/modules/widget_dao/include/dpl/wrt-dao-ro/global_dao_read_only.h index 2feafca..8442218 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/global_dao_read_only.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/global_dao_read_only.h @@ -55,43 +55,9 @@ class GlobalDAOReadOnly }; public: - /** - * Retrieve Parental mode status - * - * @return true for Parental Mode on, false for Parental Mode off - */ - static bool GetParentalMode(); - - /** - * Retrieve Parental mode maximal allowed age - * - * @return NULL if allowed age not set, else pointer value is allowed age - */ - static DPL::OptionalInt GetParentalAllowedAge(); - /** - * Retrieve Parental mode maximal allowed age - * - * @return NULL if allowed age not set, else pointer value is allowed age - */ static bool IsValidSubTag(const DPL::String& tag, int type); - static bool IsPowderRulePresent( - const ChildProtection::PowderRules::CategoryRule& rule); - - static ChildProtection::PowderRules GetPowderRules(); - - static ChildProtection::BlackList GetAdultBlackList(); - - static bool IsElementOnAdultBlackList(const DPL::String &url); - - /** - * Retrieve list of deffered widget packages to be installed - * - * @return Widget package list - */ - static WidgetPackageList GetDefferedWidgetPackageInstallationList(); - static bool GetDeveloperMode(); static bool GetSecureByDefault(); @@ -104,6 +70,8 @@ class GlobalDAOReadOnly static WidgetAccessInfoList GetWhiteURIList(); + static bool GetCookieSharingMode(); + enum NetworkAccessMode { NEVER_CONNECT, @@ -133,19 +101,6 @@ class GlobalDAOReadOnly static DeviceCapabilitySet GetDeviceCapability( const DPL::String &apifeature); - - /** - * This method gets Autofill for Webkit - */ - struct AutoSaveData - { - DPL::String userId; - DPL::String passwd; - }; - - static DPL::Optional GetAutoSaveIdPasswd( - const DPL::String &url); - protected: GlobalDAOReadOnly() { diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/plugin_dao_read_only.h b/modules/widget_dao/include/dpl/wrt-dao-ro/plugin_dao_read_only.h index 2341316..044d3d0 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/plugin_dao_read_only.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/plugin_dao_read_only.h @@ -26,8 +26,8 @@ #include #include +#include #include -#include #include namespace WrtDB { @@ -35,7 +35,7 @@ namespace WrtDB { typedef std::list PluginHandleList; typedef std::set PluginHandleSet; typedef std::list ImplementedObjectsList; -typedef DPL::SharedPtr PluginHandleSetPtr; +typedef std::shared_ptr PluginHandleSetPtr; //TODO make it friend to FeatureDAO or inherit class PluginDAOReadOnly @@ -104,10 +104,6 @@ class PluginDAOReadOnly PluginInstallationState getInstallationStatus() const; std::string getLibraryPath() const; std::string getLibraryName() const; - std::string getInstallURI() const; - std::string getKeyCn() const; - std::string getRootKey() const; - std::string getRootKeyFingerprint() const; PluginHandleSetPtr getLibraryDependencies() const; private: diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/property_dao_read_only.h b/modules/widget_dao/include/dpl/wrt-dao-ro/property_dao_read_only.h index 50b3dab..4c5a283 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/property_dao_read_only.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/property_dao_read_only.h @@ -38,7 +38,7 @@ typedef DPL::OptionalString WidgetPropertyValue; typedef std::list WidgetPropertyKeyList; struct WidgetPreferenceRow { - int app_id; + WidgetPkgName pkgname; WidgetPropertyKey key_name; WidgetPropertyValue key_value; DPL::OptionalInt readonly; @@ -57,24 +57,49 @@ class Exception DECLARE_EXCEPTION_TYPE(Base, ReadOnlyProperty) }; +//deprecated /* This method checks read only flag for given property */ DPL::OptionalInt CheckPropertyReadFlag(DbWidgetHandle widgetHandle, + const WidgetPropertyKey &key) + __attribute__((deprecated)); + +/* This method checks read only flag for given property + */ +DPL::OptionalInt CheckPropertyReadFlag(WidgetPkgName pkgName, const WidgetPropertyKey &key); +//deprecated /* This method gets widget property key list */ -WidgetPropertyKeyList GetPropertyKeyList(DbWidgetHandle widgetHandle); +WidgetPropertyKeyList GetPropertyKeyList(DbWidgetHandle widgetHandle) + __attribute__((deprecated)); +/* This method gets widget property key list + */ +WidgetPropertyKeyList GetPropertyKeyList(WidgetPkgName pkgName); + +//deprecated /* This method gets widget property list */ -WidgetPreferenceList GetPropertyList(DbWidgetHandle widgetHandle); +WidgetPreferenceList GetPropertyList(DbWidgetHandle widgetHandle) + __attribute__((deprecated)); +/* This method gets widget property list + */ +WidgetPreferenceList GetPropertyList(WidgetPkgName pkgName); + +//deprecated /* This method get widget property value */ WidgetPropertyValue GetPropertyValue(DbWidgetHandle widgetHandle, const WidgetPropertyKey &key); +/* This method get widget property value + */ +WidgetPropertyValue GetPropertyValue(WidgetPkgName pkgName, + const WidgetPropertyKey &key); + } // PropertyDAOReadOnly } // namespace WrtDB diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/vconf_config.h b/modules/widget_dao/include/dpl/wrt-dao-ro/vconf_config.h new file mode 100644 index 0000000..a30a84d --- /dev/null +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/vconf_config.h @@ -0,0 +1,98 @@ +/* + * 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 vconf_config.h + * @author Jihoon Chung (jihoon.chung@samsung.com) + * @version 1.0 + * @brief Implementation file for vconf key config. + */ +#ifndef SRC_DOMAIN_VCONF_CONFIG_H +#define SRC_DOMAIN_VCONF_CONFIG_H + +#include +#include + +#include +#include + +namespace WrtDB { +namespace VconfConfig { +inline std::string GetVconfKeyRootPath(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .GetFullPath(); +} + +inline std::string GetVconfKeyPopupUsage(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .Concat(GlobalConfig::GetVconfKeyPopupUsagePath()) + .GetFullPath(); +} + +inline std::string GetVconfKeyGeolocationUsage(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .Concat(GlobalConfig::GetVconfKeyGeolocationUsagePath()) + .GetFullPath(); +} + +inline std::string GetVconfKeyWebNotificationUsage(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .Concat(GlobalConfig::GetVconfKeyWebNotificationUsagePath()) + .GetFullPath(); +} + +inline std::string GetVconfKeyWebDatabaseUsage(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .Concat(GlobalConfig::GetVconfKeyWebDatabaseUsagePath()) + .GetFullPath(); +} + +inline std::string GetVconfKeyFilesystemUsage(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .Concat(GlobalConfig::GetVconfKeyFilesystemUsagePath()) + .GetFullPath(); +} + +inline std::string GetVconfKeyMemorySavingMode(DPL::String pkgName) +{ + return PathBuilder() + .Append(GlobalConfig::GetVconfKeyPrefixPath()) + .Append(DPL::ToUTF8String(pkgName)) + .Concat(GlobalConfig::GetVconfKeyMemorySavingModePath()) + .GetFullPath(); +} + +} // namespace VconfConfig +} // namespace WrtDB + +#endif diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/widget_config.h b/modules/widget_dao/include/dpl/wrt-dao-ro/widget_config.h index bd1ee00..7669701 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/widget_config.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/widget_config.h @@ -35,7 +35,7 @@ namespace WidgetConfig { inline std::string GetWidgetBasePath(DPL::String pkgName) { return PathBuilder() - .Append(GlobalConfig::GetUserInstalledWidgetPath()) + .Append(GlobalConfig::GetWidgetUserDataPath()) .Append(DPL::ToUTF8String(pkgName)) .GetFullPath(); } diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/widget_dao_read_only.h b/modules/widget_dao/include/dpl/wrt-dao-ro/widget_dao_read_only.h index 9dbd580..f454637 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-ro/widget_dao_read_only.h +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/widget_dao_read_only.h @@ -51,6 +51,11 @@ enum WidgetSignatureType SIGNATURE_TYPE_UNIDENTIFIED }; +enum CertificateSource { + SIGNATURE_DISTRIBUTOR = 0, + SIGNATURE_AUTHOR = 1 +}; + typedef std::list StringList; struct WidgetLocalizedInfo @@ -98,6 +103,7 @@ typedef std::list WidgetCertificateDataList; typedef DPL::String Locale; typedef std::set LocaleSet; +typedef std::list ExternalLocationList; /** * WidgetRegisterInfo @@ -150,27 +156,34 @@ struct WidgetRegisterInfo //Constructor WidgetRegisterInfo() : - type(APP_TYPE_UNKNOWN), + webAppType(APP_TYPE_UNKNOWN), signatureType(SIGNATURE_TYPE_UNIDENTIFIED), - isFactoryWidget(0), isTestWidget(0), - configInfo() + configInfo(), + packagingType(PKG_TYPE_UNKNOWN) { } - WidgetType type; + WidgetType webAppType; + WidgetType type; // TODO : This type will be removed. DPL::OptionalString guid; DPL::OptionalString version; + DPL::OptionalString minVersion; std::string shareHref; std::string baseFolder; WidgetSignatureType signatureType; - int isFactoryWidget; int isTestWidget; ConfigParserData configInfo; - Powder::Description powderDescription; LocalizationData localizationData; + DPL::OptionalString pkgname; + WidgetPkgName pkgName; + time_t installedTime; + PackagingType packagingType; + EncryptedFileList encryptedFiles; + ExternalLocationList externalLocations; + DPL::OptionalString widgetInstalledPath; }; typedef std::list CertificateChainList; @@ -187,7 +200,8 @@ class IWacSecurity virtual bool isWacSigned() const = 0; - virtual void getCertificateChainList(CertificateChainList& list) const = 0; + virtual void getCertificateChainList(CertificateChainList& list, + CertificateSource source) const = 0; }; /** @@ -277,13 +291,14 @@ class WidgetDAOReadOnly }; typedef std::list LocalizedStartFileList; - /** * This is a constructor. * * @param[in] widgetHandle application id of widget. */ WidgetDAOReadOnly(DbWidgetHandle widgetHandle); + WidgetDAOReadOnly(DPL::OptionalString widgetGUID); + WidgetDAOReadOnly(DPL::String pkgName); /** * Destructor @@ -302,6 +317,17 @@ class WidgetDAOReadOnly static DbWidgetHandle getHandle(const DPL::String pkgName); /** + * Returns pkgname for the specified widget + * + * @return pkgname + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in DB table. + */ + WidgetPkgName getPkgName() const; + static WidgetPkgName getPkgName(const WidgetGUID GUID); + static WidgetPkgName getPkgName(const DbWidgetHandle handle); + + /** * This method returns the root directory of widget resource. * * @return path name of root directory. @@ -345,13 +371,14 @@ class WidgetDAOReadOnly */ WidgetGUID getGUID() const; + /** - * This method returns the Package name of the widget. - * - * @return pkgname - * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. - * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in DB table. - */ + * This method returns the Package name of the widget. + * + * @return pkgname + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in DB table. + */ DPL::OptionalString getPkgname() const; /** @@ -533,7 +560,7 @@ class WidgetDAOReadOnly bool getWebkitPluginsRequired() const; /** - * This method returns a list of all the installed widgets. + * This method returns a list of all the installed widgets' app id. * * @return list of installed widgets' app id. * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. @@ -542,6 +569,23 @@ class WidgetDAOReadOnly */ static DbWidgetHandleList getHandleList(); + /** + * This method returns list of pkgname of installed packages + * @return list of pkgname of installed packages + */ + static WidgetPkgNameList getPkgnameList(); + static WidgetPkgNameList_TEMPORARY_API getPkgnameList_TEMPORARY_API(); + + /** + * This method returns a list of all the installed widgets. + * + * @return list of installed widgets. + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + static DbWidgetDAOReadOnlyList getWidgetList(); + /** * This method removes a widget's information from EmDB. * @@ -615,14 +659,6 @@ class WidgetDAOReadOnly std::string getShareHref() const; /** - * This method checks whether specified widget is a factory widget. - * - * @param[in] widgetHandle widget's app id - * @return true if yes, false if no. - */ - bool isFactory() const; - - /** * This method get widget installed time * * @return time_t : return widget's install time @@ -639,16 +675,6 @@ class WidgetDAOReadOnly */ std::string getBaseFolder() const; - /** - * This method gets deletable property of widget. - * - * @return true: can be deleted; false: can not be deleted - * @exception WRT_CONF_ERR_GCONF_FAILURE - * @exception WRT_CONF_ERR_EMDB_FAILURE - * @exception WRT_CONF_ERR_EMDB_NO_RECORD - */ - bool isDeletable() const; - /* This method gets the parameter list for resource. */ ResourceAttributeList getResourceAttribute( @@ -675,21 +701,32 @@ class WidgetDAOReadOnly LanguageTagList getLanguageTags() const; LanguageTagList getIconLanguageTags() const; + + WidgetLocalizedInfo getLocalizedInfo(const DPL::String& languageTag) const; std::string getCookieDatabasePath() const; // Local storage std::string getPrivateLocalStoragePath() const; - ChildProtection::Record getChildProtection() const; - - Powder::Description getPowderDescription() const; - bool getBackSupported() const; static bool isWidgetInstalled(DbWidgetHandle handle); - static bool isWidgetInstalled(DPL::String pkgName); + static bool isWidgetInstalled(const WidgetPkgName & pkgName); - CertificateChainList getWidgetCertificate() const; + /* This method get path of the splash image. + * + * @return path of the widget's splash image + */ + DPL::OptionalString getSplashImgSrc() const; + + ExternalLocationList getWidgetExternalLocations() const; + + /* + * Default value is required to keep compatibility with + * wrt-installer and wrt. + */ + CertificateChainList getWidgetCertificate( + CertificateSource source = SIGNATURE_DISTRIBUTOR) const; void getWidgetSettings(WidgetSettings& outWidgetSettings) const; @@ -701,6 +738,57 @@ class WidgetDAOReadOnly */ void getAppServiceList( WidgetApplicationServiceList& outAppServiceList) const; + + /** + * This method returns the type of the package. + * + * @return PackagingType + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching + records in DB table. + */ + PackagingType getPackagingType() const; + + void getEncryptedFileList(EncryptedFileList& filesList) const; + + /** + * This method returns widget's background page filename. + * + * @return Name of file containing background page + */ + DPL::OptionalString getBackgroundPage() const; + + /** + * @brief generateTizenId generates new tizen id + * + * If widget do not supplies it's own tizen id, this method can be used, + * although it should be removed in future. + * + * @return new tizen id + */ + static WidgetPkgName generateTizenId(); + + /** + * @brief This method return each value for security setting + * + * @return SettingsType + * SETTINGS_TYPE_UNKNOWN : unknow value + * SETTINGS_TYPE_ON : enable + * SETTINGS_TYPE_ALWAYS_ASK : ask by popup + * SETTINGS_TYPE_OFF : disable + */ + SettingsType getSecurityPopupUsage() const; + SettingsType getGeolocationUsage() const; + SettingsType getWebNotificationUsage() const; + SettingsType getWebDatabaseUsage() const; + SettingsType getFileSystemUsage() const; + + /** + * This method returns widget's installed path + * + * @return path of widget installed + */ + DPL::OptionalString getWidgetInstalledPath() const; }; } // namespace WrtDB diff --git a/modules/widget_dao/include/dpl/wrt-dao-ro/wrt_db_types.h b/modules/widget_dao/include/dpl/wrt-dao-ro/wrt_db_types.h new file mode 100644 index 0000000..1702433 --- /dev/null +++ b/modules/widget_dao/include/dpl/wrt-dao-ro/wrt_db_types.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * + * @file wrt_db_types.h + * @author Krzysztof Jackiewicz + * @version 1.0 + * @brief This file contains the declaration of common data types for wrtdb + */ +#ifndef _WRT_DB_TYPES_H_ +#define _WRT_DB_TYPES_H_ + +#include + +typedef WrtDB::DbWidgetHandle WidgetHandle; +typedef WrtDB::DbWidgetHandleList WidgetHandleList; +typedef WrtDB::DbWidgetDAOReadOnlyList WidgetDAOReadOnlyList; + +typedef WrtDB::DbWidgetFeature WidgetFeature; +typedef WrtDB::DbWidgetFeatureSet WidgetFeatureSet; + +typedef WrtDB::DbWidgetSize WidgetSize; +typedef WrtDB::DbPluginHandle PluginHandle; + +#endif diff --git a/modules/widget_dao/include/dpl/wrt-dao-rw/feature_dao.h b/modules/widget_dao/include/dpl/wrt-dao-rw/feature_dao.h old mode 100644 new mode 100755 index 94b5cb7..c525e86 --- a/modules/widget_dao/include/dpl/wrt-dao-rw/feature_dao.h +++ b/modules/widget_dao/include/dpl/wrt-dao-rw/feature_dao.h @@ -31,8 +31,7 @@ namespace WrtDB { namespace FeatureDAO { FeatureHandle RegisterFeature(const PluginMetafileData::Feature &feature, const DbPluginHandle pluginHandle); - - FeatureHandle RegisterStrangeFeature(const std::string& featureName); + void UnregisterFeature(FeatureHandle featureHandle); } // namespace FeatureDB } // namespace WrtDB diff --git a/modules/widget_dao/include/dpl/wrt-dao-rw/global_dao.h b/modules/widget_dao/include/dpl/wrt-dao-rw/global_dao.h index 51c9f38..b624d21 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-rw/global_dao.h +++ b/modules/widget_dao/include/dpl/wrt-dao-rw/global_dao.h @@ -30,45 +30,6 @@ namespace WrtDB { class GlobalDAO : public GlobalDAOReadOnly { public: - /** - * Set new Parental mode status - */ - static void SetParentalMode(bool parental_status); - - /** - * Retrieve Parental mode maximal allowed age - * - * @return NULL if allowed age not set, else pointer value is allowed age - */ - static void SetParentalAllowedAge(const DPL::OptionalInt& age); - - static void AddCategoryRule( - const ChildProtection::PowderRules::CategoryRule& powder); - - static void RemoveCategoryRule( - const ChildProtection::PowderRules::CategoryRule& powder); - - static void UpdateCategoryRule( - const ChildProtection::PowderRules::CategoryRule& oldRule, - const ChildProtection::PowderRules::CategoryRule& newRule); - - static void AddAdultBlackListElement(const DPL::String &url); - - static void RemoveAdultBlackListElement(const DPL::String &url); - - static void UpdateAdultBlackList(const DPL::String &oldUrl, - const DPL::String &newUrl); - - /** - * Add deffered widget packages to be installed - */ - static void AddDefferedWidgetPackageInstallation(const DPL::String &path); - - /** - * Remove deffered widget packages to be installed - */ - static void RemoveDefferedWidgetPackageInstallation(const DPL::String &arg); - static void SetDeveloperMode(bool mode); static void SetSecureByDefault(bool secureByDefault); @@ -95,12 +56,7 @@ class GlobalDAO : public GlobalDAOReadOnly */ static void SetRoamingDataUsage(NetworkAccessMode newMode); - /** - * This method sets Autofill for Webkit - */ - static void SetAutoSaveIdPasswd( - const DPL::String &url, const AutoSaveData &saveData); - + static void SetCookieSharingMode(bool mode); private: GlobalDAO() diff --git a/modules/widget_dao/include/dpl/wrt-dao-rw/plugin_dao.h b/modules/widget_dao/include/dpl/wrt-dao-rw/plugin_dao.h index e8a86d3..70d35f9 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-rw/plugin_dao.h +++ b/modules/widget_dao/include/dpl/wrt-dao-rw/plugin_dao.h @@ -54,6 +54,8 @@ class PluginDAO : public PluginDAOReadOnly static void setPluginInstallationStatus( DbPluginHandle, PluginInstallationState); + + static void unregisterPlugin(DbPluginHandle pluginHandle); }; } // namespace WrtDB diff --git a/modules/widget_dao/include/dpl/wrt-dao-rw/property_dao.h b/modules/widget_dao/include/dpl/wrt-dao-rw/property_dao.h index d75dc59..7046042 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-rw/property_dao.h +++ b/modules/widget_dao/include/dpl/wrt-dao-rw/property_dao.h @@ -31,20 +31,42 @@ struct WidgetRegisterInfo; //forward declaration namespace PropertyDAO { +//deprecated void RemoveProperty(DbWidgetHandle widgetHandle, + const PropertyDAOReadOnly::WidgetPropertyKey &key) + __attribute__((deprecated)); + +void RemoveProperty(WidgetPkgName pkgName, const PropertyDAOReadOnly::WidgetPropertyKey &key); +//deprecated /* This method sets widget property */ void SetProperty(DbWidgetHandle widgetHandle, const PropertyDAOReadOnly::WidgetPropertyKey &key, const PropertyDAOReadOnly::WidgetPropertyValue &value, + bool readOnly = false) + __attribute__((deprecated)); + +/* This method sets widget property + */ +void SetProperty(WidgetPkgName pkgName, + const PropertyDAOReadOnly::WidgetPropertyKey &key, + const PropertyDAOReadOnly::WidgetPropertyValue &value, bool readOnly = false); +//deprecated /* This method registers properties for widget. * Properties unregistering is done via "delete cascade" mechanism in SQL */ void RegisterProperties(DbWidgetHandle widgetHandle, + const WidgetRegisterInfo ®Info) + __attribute__((deprecated)); + +/* This method registers properties for widget. + * Properties unregistering is done via "delete cascade" mechanism in SQL + */ +void RegisterProperties(WidgetPkgName pkgName, const WidgetRegisterInfo ®Info); } // namespace PropertyDAO diff --git a/modules/widget_dao/include/dpl/wrt-dao-rw/widget_dao.h b/modules/widget_dao/include/dpl/wrt-dao-rw/widget_dao.h index 1b8b507..3f7b819 100644 --- a/modules/widget_dao/include/dpl/wrt-dao-rw/widget_dao.h +++ b/modules/widget_dao/include/dpl/wrt-dao-rw/widget_dao.h @@ -29,6 +29,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -41,14 +44,9 @@ class WidgetDAO : public WidgetDAOReadOnly public: typedef std::list LanguageTagsList; - /** - * This is a constructor. - * - * @param[in] widgetHandle application id of widget. - * @param[in] widgetGUID application guid of widget. - */ - WidgetDAO(DbWidgetHandle widgetHandle); + WidgetDAO(DbWidgetHandle handle); WidgetDAO(DPL::OptionalString widgetGUID); + WidgetDAO(DPL::String pkgName); /** * Destructor @@ -56,31 +54,76 @@ class WidgetDAO : public WidgetDAOReadOnly virtual ~WidgetDAO(); /** - * This method registers the widget information to the DB when it is installed. + * This method registers the widget information in the DB when it is installed. * * @see WidgetRegisterInfo * @see UnRegisterWidget() + * @param[in] widgetPkgname Widget Pkgname that will be registered. * @param[in] pWidgetRegisterInfo Specified the widget's information needed to be registered. - * @return widget's app id issued by app manager; 0 represents a failure during register. + * @param[in] wacSecurity Widget's security certificates. */ + static void registerWidget( + const WidgetPkgName & widgetPkgname, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity); + static DbWidgetHandle registerWidget( - const WidgetRegisterInfo &pWidgetRegisterInfo, - const IWacSecurity &wacSecurity, - const LanguageTagsList& languageTags); + const WidgetRegisterInfo &pWidgetRegisterInfo, + const IWacSecurity &wacSecurity) __attribute__((deprecated)); + + /** + * @brief registerWidgetGenerateTizenId Registers widget with auto-generated tizen id + * + * This function is disadviced and should be used only in tests. + * Function is not thread-safe. + * + * @param pWidgetRegisterInfo registeration information + * @param wacSecurity Widget's security certificates. + * @return pkgname generated + */ + static WidgetPkgName registerWidgetGenerateTizenId( + const WidgetRegisterInfo &pWidgetRegisterInfo, + const IWacSecurity &wacSecurity); + + /** + * This method re-registers the widget information to the DB when it is installed. + * + * It performs unregistration and new registration of widget in db in one transaction. + * + * @see WidgetRegisterInfo + * @param[in] widgetName Widget pkgname that will be registered. + * @param[in] pWidgetRegisterInfo Specified the widget's information needed to be registered. + * @param[in] wacSecurity Widget's security certificates. + */ + static void registerOrUpdateWidget( + const WidgetPkgName & widgetName, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity); + + static void registerWidget( + WrtDB::DbWidgetHandle handle, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity) __attribute__((deprecated)); /** * This method removes a widget's information from EmDB. * * @see RegisterWidget() - * @param[in] widgetHandle widget's app id - * @return true if succeed, false if fail. + * @param[in] pkgName widgets name to be unregistered */ - static void unregisterWidget(DbWidgetHandle widgetHandle); + static void unregisterWidget(const WidgetPkgName & pkgName); + + static void unregisterWidget(WrtDB::DbWidgetHandle handle) __attribute__((deprecated)); /* This method removes widget property */ void removeProperty(const PropertyDAOReadOnly::WidgetPropertyKey &key); + /** + * @brief registerExternalLocations Removes rows from WidgetExternalLocations + */ + void unregisterAllExternalLocations(); + /* This method sets widget property */ void setProperty(const PropertyDAOReadOnly::WidgetPropertyKey &key, @@ -90,22 +133,36 @@ class WidgetDAO : public WidgetDAOReadOnly /* set PkgName */ void setPkgName(const DPL::OptionalString& pkgName); + void setPkgName_TEMPORARY_API(const WidgetPkgName& pkgName); + + /* This function will update of api-feature status. + * If status is true (feature rejected) plugin connected with this + * api feature mustn't be loaded durign widget launch. + */ + void updateFeatureRejectStatus(const DbWidgetFeature &widgetFeature); + + /* + * This method change security settings value + */ + void setSecurityPopupUsage(const SettingsType value); + void setGeolocationUsage(const SettingsType value); + void setWebNotificationUsage(const SettingsType value); + void setWebDatabaseUsage(const SettingsType value); + void setFileSystemUsage(const SettingsType value); private: //Methods used during widget registering static DbWidgetHandle registerWidgetInfo( + const WidgetPkgName & widgetName, const WidgetRegisterInfo ®Info, - const IWacSecurity &wacSecurity); + const IWacSecurity &wacSecurity, + const DPL::Optional handle = DPL::Optional()); static void registerWidgetExtendedInfo( DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info); static void registerWidgetLocalizedInfo( DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info); - static void registerWidgetUserAgentLocales( - DbWidgetHandle widgetHandle, - const WidgetRegisterInfo &rInf, - const LanguageTagsList& languageTags); static void registerWidgetIcons( DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info); @@ -118,6 +175,9 @@ class WidgetDAO : public WidgetDAOReadOnly static void registerWidgetFeatures( DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info); + static void registerWidgetPrivilege( + DbWidgetHandle widgetHandle, + const WidgetRegisterInfo ®Info); static void registerWidgetWindowModes( DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info); @@ -127,11 +187,9 @@ class WidgetDAO : public WidgetDAOReadOnly static void registerWidgetCertificates( DbWidgetHandle widgetHandle, const IWacSecurity &wacSecurity); - static void registerWidgetPowderData( - DbWidgetHandle widgetHandle, - const WidgetRegisterInfo ®Info); - static void registerLaunchCertificates( + static void registerCertificatesChains( DbWidgetHandle widgetHandle, + CertificateSource certificateSource, const CertificateChainList &list); static void registerWidgetSettings( DbWidgetHandle widgetHandle, @@ -139,6 +197,25 @@ class WidgetDAO : public WidgetDAOReadOnly static void registerAppService( DbWidgetHandle widgetHandle, const WidgetRegisterInfo ®Info); + static void registerEncryptedResouceInfo( + DbWidgetHandle widgetHandle, + const WidgetRegisterInfo ®Info); + /** + * @brief registerExternalLocations Inserts new rows to WidgetExternalLocations + * @param externals list of files + */ + static void registerExternalLocations(DbWidgetHandle widgetHandle, + const ExternalLocationList & externals); + static void registerWidgetSecuritySettings(DbWidgetHandle widgetHandle); + + + static void registerWidgetInternal( + const WidgetPkgName & widgetName, + const WidgetRegisterInfo &widgetRegInfo, + const IWacSecurity &wacSecurity, + const DPL::Optional handle = DPL::Optional()); + static void unregisterWidgetInternal( + const WidgetPkgName & pkgName); }; } // namespace WrtDB diff --git a/modules/widget_dao/orm/wrt_db b/modules/widget_dao/orm/wrt_db old mode 100644 new mode 100755 index dc0f27f..46198c7 --- a/modules/widget_dao/orm/wrt_db +++ b/modules/widget_dao/orm/wrt_db @@ -5,14 +5,13 @@ SQL( /*TODO: secure_by_default should be 0 by default*/ CREATE_TABLE(GlobalProperties) COLUMN_NOT_NULL(developer_mode, INT, DEFAULT 0) - COLUMN_NOT_NULL(parental_mode, INT, DEFAULT 0) - COLUMN(parental_allowed_age, INT, DEFAULT NULL) COLUMN_NOT_NULL(secure_by_default, INT, DEFAULT 1) COLUMN_NOT_NULL(home_network_data_usage, TINYINT, DEFAULT 1) COLUMN_NOT_NULL(roaming_data_usage, TINYINT, DEFAULT 1) COLUMN_NOT_NULL(compliance_mode, TINYINT, DEFAULT 0) COLUMN_NOT_NULL(compliance_fake_imei, VARCHAR(256), DEFAULT '') COLUMN_NOT_NULL(compliance_fake_meid, VARCHAR(256), DEFAULT '') + COLUMN_NOT_NULL(cookie_sharing_mode, INT, DEFAULT 0) CREATE_TABLE_END() SQL( @@ -32,7 +31,6 @@ CREATE_TABLE(WidgetInfo) COLUMN(base_folder, VARCHAR(256), DEFAULT '') COLUMN(webkit_plugins_required, TINYINT, DEFAULT 0) COLUMN(security_domain, INT, DEFAULT 0) - COLUMN_NOT_NULL(child_protection,INT, DEFAULT 0) COLUMN(recognized, INT, DEFAULT 0) COLUMN(wac_signed, INT, DEFAULT 0) COLUMN(distributor_signed, INT, DEFAULT 0) @@ -40,11 +38,17 @@ CREATE_TABLE(WidgetInfo) COLUMN_NOT_NULL(back_supported, TINYINT, DEFAULT 0) COLUMN(access_network, TINYINT, DEFAULT 0) COLUMN(defaultlocale, VARCHAR(256), DEFAULT 0) - COLUMN(pkgname, VARCHAR(256), DEFAULT 0) + COLUMN_NOT_NULL(pkgname, VARCHAR(256), DEFAULT 0 UNIQUE) + COLUMN(pkg_type, INT, DEFAULT 0) CREATE_TABLE_END() +SQL( + CREATE INDEX IF NOT EXISTS WidgetInfo_PkgnameIndex ON WidgetInfo(pkgname); +) + CREATE_TABLE(WidgetCertificate) COLUMN_NOT_NULL(app_id, INT,) + COLUMN_NOT_NULL(cert_source, INT, CHECK(cert_source between 0 and 1)) COLUMN_NOT_NULL(encoded_chain, VARCHAR(16000),) TABLE_CONSTRAINTS( FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE @@ -59,15 +63,6 @@ CREATE_TABLE(WidgetWindowModes) ) CREATE_TABLE_END() -CREATE_TABLE(WidgetUserAgentLocales) - COLUMN_NOT_NULL(id, INTEGER, PRIMARY KEY AUTOINCREMENT) - COLUMN_NOT_NULL(app_id, INT,) - COLUMN_NOT_NULL(language_tag, TEXT,) - TABLE_CONSTRAINTS( - FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE - ) -CREATE_TABLE_END() - CREATE_TABLE(LocalizedWidgetInfo) COLUMN_NOT_NULL(app_id, INT,) COLUMN_NOT_NULL(widget_locale, TEXT,) @@ -91,24 +86,26 @@ CREATE_TABLE(WidgetExtendedInfo) COLUMN(option_state, INT, DEFAULT 0) COLUMN(share_href, VARCHAR(256), DEFAULT '') COLUMN(signature_type, INT, DEFAULT 0) - COLUMN(factory_widget, INT, DEFAULT 0) COLUMN(updated, INT, DEFAULT 0) COLUMN(update_policy, INT, DEFAULT 0) COLUMN_NOT_NULL(test_widget, INT, CHECK(test_widget between 0 and 1) DEFAULT 0) + COLUMN(splash_img_src, VARCHAR(256), DEFAULT '') + COLUMN(background_page, VARCHAR(256), DEFAULT '') + COLUMN(installed_path, VARCHAR(512), DEFAULT '') TABLE_CONSTRAINTS( FOREIGN KEY(app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE ) CREATE_TABLE_END() CREATE_TABLE(WidgetPreference) - COLUMN_NOT_NULL(app_id, INT,) + COLUMN_NOT_NULL(pkgname, VARCHAR(256), DEFAULT 0) COLUMN_NOT_NULL(key_name, VARCHAR(256),) COLUMN(key_value, VARCHAR(8000), DEFAULT '') COLUMN(readonly, INT, DEFAULT 0) TABLE_CONSTRAINTS( - PRIMARY KEY(app_id, key_name), - FOREIGN KEY(app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE + PRIMARY KEY(pkgname, key_name), + FOREIGN KEY(pkgname) REFERENCES WidgetInfo (pkgname) ON DELETE CASCADE ) CREATE_TABLE_END() @@ -117,6 +114,7 @@ CREATE_TABLE(WidgetFeature) COLUMN_NOT_NULL(app_id, INT,) COLUMN_NOT_NULL(name, VARCHAR(256),) COLUMN_NOT_NULL(required, INT,) + COLUMN_NOT_NULL(rejected, INT,) TABLE_CONSTRAINTS( FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE ) @@ -126,12 +124,20 @@ CREATE_TABLE(FeatureParam) COLUMN_NOT_NULL(widget_feature_id, INTEGER,) COLUMN_NOT_NULL(name, TEXT,) COLUMN_NOT_NULL(value, TEXT,) - TABLE_CONSTRAINTS( FOREIGN KEY (widget_feature_id) REFERENCES WidgetFeature (widget_feature_id) ON DELETE CASCADE ) CREATE_TABLE_END() +CREATE_TABLE(WidgetPrivilege) + COLUMN_NOT_NULL(widget_privilege_id, INTEGER, primary key autoincrement) + COLUMN_NOT_NULL(app_id, INT,) + COLUMN_NOT_NULL(name, VARCHAR(256),) + TABLE_CONSTRAINTS( + FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE + ) +CREATE_TABLE_END() + CREATE_TABLE(WidgetIcon) COLUMN_NOT_NULL(icon_id, INTEGER, primary key autoincrement) COLUMN_NOT_NULL(app_id, INT,) @@ -174,6 +180,15 @@ CREATE_TABLE(WidgetLocalizedStartFile) ) CREATE_TABLE_END() +CREATE_TABLE(WidgetExternalLocations) + COLUMN_NOT_NULL(app_id, INT,) + COLUMN_NOT_NULL(path, TEXT,) + TABLE_CONSTRAINTS( + FOREIGN KEY(app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE, + PRIMARY KEY(app_id, path) + ) +CREATE_TABLE_END() + CREATE_TABLE(WidgetAccessHost) COLUMN_NOT_NULL(app_id, INT,) COLUMN_NOT_NULL(host, VARCHAR(256),) @@ -209,10 +224,26 @@ CREATE_TABLE(WidgetWARPInfo) ) CREATE_TABLE_END() +CREATE_TABLE(WidgetSecuritySettings) + COLUMN_NOT_NULL(app_id, INT,) + COLUMN_NOT_NULL(security_popup_usage, INT, DEFAULT 1) + COLUMN_NOT_NULL(geolocation_usage, INT, DEFAULT 1) + COLUMN_NOT_NULL(web_notification_usage, INT, DEFAULT 1) + COLUMN_NOT_NULL(web_database_usage, INT, DEFAULT 1) + COLUMN_NOT_NULL(file_system_usage, INT, DEFAULT 1) + TABLE_CONSTRAINTS( + FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE + ) +CREATE_TABLE_END() + CREATE_TABLE(FeaturesList) COLUMN_NOT_NULL(FeatureUUID, INTEGER, primary key autoincrement) COLUMN_NOT_NULL(FeatureName, TEXT, unique) COLUMN_NOT_NULL(PluginPropertiesId, INT,) + + TABLE_CONSTRAINTS( + FOREIGN KEY (PluginPropertiesId) REFERENCES PluginProperties (PluginPropertiesId) ON DELETE CASCADE + ) CREATE_TABLE_END() CREATE_TABLE(PluginProperties) @@ -220,25 +251,33 @@ CREATE_TABLE(PluginProperties) COLUMN_NOT_NULL(InstallationState, INTEGER, DEFAULT 0) COLUMN_NOT_NULL(PluginLibraryName, TEXT, unique) COLUMN(PluginLibraryPath, TEXT,) - COLUMN(InstallURI, TEXT,) - COLUMN(KeyCN, TEXT,) - COLUMN(RootKeyCN, TEXT,) - COLUMN(RootKeyFingerprint, TEXT,) CREATE_TABLE_END() CREATE_TABLE(PluginDependencies) COLUMN_NOT_NULL(PluginPropertiesId, INTEGER, not null) COLUMN_NOT_NULL(RequiredPluginPropertiesId, INTEGER, not null) + + TABLE_CONSTRAINTS( + FOREIGN KEY (PluginPropertiesId) REFERENCES PluginProperties (PluginPropertiesId) ON DELETE CASCADE + ) CREATE_TABLE_END() CREATE_TABLE(PluginImplementedObjects) COLUMN_NOT_NULL(PluginObject, TEXT, unique) COLUMN_NOT_NULL(PluginPropertiesId, INTEGER, not null) + + TABLE_CONSTRAINTS( + FOREIGN KEY (PluginPropertiesId) REFERENCES PluginProperties (PluginPropertiesId) ON DELETE CASCADE + ) CREATE_TABLE_END() CREATE_TABLE(PluginRequiredObjects) COLUMN_NOT_NULL(PluginPropertiesId, INTEGER, not null) COLUMN_NOT_NULL(PluginObject, TEXT, not null) + + TABLE_CONSTRAINTS( + FOREIGN KEY (PluginPropertiesId) REFERENCES PluginProperties (PluginPropertiesId) ON DELETE CASCADE + ) CREATE_TABLE_END() CREATE_TABLE(DeviceCapabilities) @@ -251,44 +290,13 @@ CREATE_TABLE(FeatureDeviceCapProxy) COLUMN_NOT_NULL(FeatureUUID, INT, not null) COLUMN_NOT_NULL(DeviceCapID, INT, not null) - TABLE_CONSTRAINTS(PRIMARY KEY(FeatureUUID,DeviceCapID)) -CREATE_TABLE_END() - -CREATE_TABLE(PowderLevels) - COLUMN_NOT_NULL(app_id, INT, ) - COLUMN_NOT_NULL(id, INTEGER, primary key autoincrement) - COLUMN_NOT_NULL(category, TEXT, ) - COLUMN_NOT_NULL(level, INTEGER, ) - TABLE_CONSTRAINTS( - FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE - ) -CREATE_TABLE_END() - -CREATE_TABLE(PowderLevelContexts) - COLUMN_NOT_NULL(levelId, INTEGER, ) - COLUMN_NOT_NULL(context, TEXT, ) - TABLE_CONSTRAINTS( - FOREIGN KEY (levelId) REFERENCES PowderLevels (id) ON DELETE CASCADE + FOREIGN KEY (FeatureUUID) REFERENCES FeaturesList (FeatureUUID) ON DELETE CASCADE + FOREIGN KEY (DeviceCapID) REFERENCES DeviceCapabilities (DeviceCapID) ON DELETE CASCADE + PRIMARY KEY(FeatureUUID,DeviceCapID) ) CREATE_TABLE_END() -CREATE_TABLE(ChildProtectionBlacklist) - COLUMN_NOT_NULL(url, TEXT, unique) -CREATE_TABLE_END() - -CREATE_TABLE(PowderRules) - COLUMN_NOT_NULL(id, INTEGER, primary key autoincrement) - COLUMN_NOT_NULL(category, TEXT, ) - COLUMN_NOT_NULL(level, INTEGER, ) - COLUMN(context, TEXT, ) - TABLE_CONSTRAINTS(unique(category,context)) -CREATE_TABLE_END() - -CREATE_TABLE(DefferedWidgetPackageInstallation) - COLUMN_NOT_NULL(path, TEXT, unique) -CREATE_TABLE_END() - CREATE_TABLE(OCSPResponseStorage) COLUMN_NOT_NULL(cert_chain, TEXT, primary key) COLUMN(end_entity_check, INT,) @@ -302,13 +310,7 @@ CREATE_TABLE(CRLResponseStorage) COLUMN(next_update_time, BIGINT,) CREATE_TABLE_END() -CREATE_TABLE(AutoSaveIdPasswd) - COLUMN_NOT_NULL(address, VARCHAR(256), unique) - COLUMN_NOT_NULL(userId, VARCHAR(128),) - COLUMN_NOT_NULL(passwd, VARCHAR(128),) -CREATE_TABLE_END() - -CREATE_TABLE(SettginsList) +CREATE_TABLE(SettingsList) COLUMN_NOT_NULL(appId, INT,) COLUMN_NOT_NULL(settingName, TEXT, ) COLUMN_NOT_NULL(settingValue, TEXT, ) @@ -335,6 +337,16 @@ CREATE_TABLE(WidgetWhiteURIList) COLUMN_NOT_NULL(subdomain_access, INT, CHECK(subdomain_access between 0 and 1)) CREATE_TABLE_END() +CREATE_TABLE(EncryptedResourceList) + COLUMN_NOT_NULL(app_id, INT,) + COLUMN_NOT_NULL(resource, TEXT,) + COLUMN_NOT_NULL(size, INT,) + + TABLE_CONSTRAINTS( + FOREIGN KEY (app_id) REFERENCES WidgetInfo (app_id) ON DELETE CASCADE + ) +CREATE_TABLE_END() + SQL( INSERT INTO WidgetWhiteURIList VALUES("http://samsung.com", 1); INSERT INTO WidgetWhiteURIList VALUES("http://orange.fr", 1); @@ -350,10 +362,37 @@ CREATE_TABLE(UserAgents) CREATE_TABLE_END() SQL( + INSERT INTO UserAgents VALUES("Galaxy S", "Mozilla/5.0 (Linux; U; Android 2.3.7; en-gb; GT-I9000 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"); + INSERT INTO UserAgents VALUES("Galaxy S II", "Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"); + INSERT INTO UserAgents VALUES("Galaxy S III", "Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"); + INSERT INTO UserAgents VALUES("SLP Galaxy", "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; GT-I9500 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"); INSERT INTO UserAgents VALUES("Tizen", "Mozilla/5.0 (Linux; U; Tizen 1.0; en-us) AppleWebKit/534.46 (KHTML, like Gecko) Mobile Tizen Browser/1.0"); - INSERT INTO UserAgents VALUES("Chrome 16", "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20110706 Firefox/5.0"); + INSERT INTO UserAgents VALUES("Galaxy Nexus", "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) Mobile Safari/535.7"); + INSERT INTO UserAgents VALUES("Samsung", "Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-I9200/1.0; U; Linux/SLP/2.0; ko-kr) AppleWebKit/534.4 (KHTML, like Gecko) Dolfin/2.0 Mobile"); + INSERT INTO UserAgents VALUES("Samsung Dolfin", "SAMSUNG-GT-S8500/S8500XXJD2 SHP/VPP/R5 Dolfin/2.0 Nextreaming SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1"); + INSERT INTO UserAgents VALUES("Apple iPhone 3", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16"); + INSERT INTO UserAgents VALUES("Apple iPhone 4", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5"); + INSERT INTO UserAgents VALUES("Apple iOS 5", "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3"); + INSERT INTO UserAgents VALUES("Android 2.3 (Nexus One)", "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Nexus One Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"); + INSERT INTO UserAgents VALUES("Opera Mobi", "Opera/9.80 (Windows NT 6.1; U; Edition IBIS; en) Presto/2.6.30 Version/10.63"); + INSERT INTO UserAgents VALUES("Samsung Bada", "Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/1.0; U; Bada/1.0; en-us) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 OPN-B"); + INSERT INTO UserAgents VALUES("Orange TV 3.2 iPhone", "Mozilla/5.0 (OrangeTVPlayer4iPhone/iPhone2,1; U; CPU iPhone OS 4_3 like Mac OS X; fr) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F136 Safari/525.20 OrangeAppliTVHTTPLS/3.2.16"); + INSERT INTO UserAgents VALUES("Orange TV 3.2 iPad", "Mozilla/5.0 (OrangeTVPlayer4iPhone/iPad1,1; U; CPU iPhone OS 4_3 like Mac OS X; fr) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F136 Safari/525.20 iPad=SIMENABLED OrangeAppliTVHTTPLS/3.2.16"); + INSERT INTO UserAgents VALUES("Orange TV 3.3 iOS", "OrangeTVPlayer4iPhone/_iOS_3.3.3_Apple_iPhone2,1_4.1_OrangeAppliTVHTTPLS/3.3.3"); + INSERT INTO UserAgents VALUES("Chrome Browser for android", "Mozilla/5.0 (Linux; U; Android 4.0.1; ko-kr; Galaxy Nexus Build/ITL41F) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7"); + INSERT INTO UserAgents VALUES("MANGO(Nokia 800C)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C)"); + INSERT INTO UserAgents VALUES("Orange TV 3.2 Tizen", "Mozilla/5.0 (Linux; U; Tizen 1.0; fr-fr; GT-I8800) AppleWebKit/534.46 (KHTML, like Gecko) Mobile Tizen Browser/1.0 OrangeAppliTV/3.2.0"); + INSERT INTO UserAgents VALUES("System user agent", ""); + INSERT INTO UserAgents VALUES("Samsung Bada 2.0", "Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/1.0; U; Bada/2.0; en-us) AppleWebKit/534.20 (KHTML, like Gecko) Mobile WVGA SMM-MMS/1.2.0 OPN-B Dolfin/3.0"); + INSERT INTO UserAgents VALUES("Samsung Desktop", "Mozilla/5.0 (U; Linux/SLP/2.0; ko-kr) AppleWebKit/533.1 (KHTML, like Gecko)"); + INSERT INTO UserAgents VALUES("Firefox 5", "Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"); + INSERT INTO UserAgents VALUES("Firefox 5 Fennec(Mobile)", "Mozilla/5.0 (Android; Linux armv7l; rv:5.0) Gecko/20110615 Firefox/5.0 Fennec/5.0"); + INSERT INTO UserAgents VALUES("Safari 5.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.1.2 Safari/534.52.7"); + INSERT INTO UserAgents VALUES("Google Chrome 18.0", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.16 (KHTML, like Gecko) Chrome/18.0.1003.1 Safari/535.16"); + INSERT INTO UserAgents VALUES("Internet Explorer 9", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); + INSERT INTO UserAgents VALUES("Galaxy Tab 10.1", "Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13"); + INSERT INTO UserAgents VALUES("iPad 2", "Mozilla/5.0 (iPad; U; CPU OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5"); ) - -SQL( + SQL( COMMIT; ) diff --git a/packaging/wrt-commons.spec b/packaging/wrt-commons.spec new file mode 100644 index 0000000..0fec923 --- /dev/null +++ b/packaging/wrt-commons.spec @@ -0,0 +1,155 @@ +#git:framework/web/wrt-commons wrt-commons 0.2.92 +Name: wrt-commons +Summary: Wrt common library +Version: 0.2.93 +Release: 1 +Group: Development/Libraries +License: Apache License, Version 2.0 +URL: N/A +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(libssl) +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(db-util) +BuildRequires: pkgconfig(zlib) +BuildRequires: pkgconfig(libpcrecpp) +BuildRequires: pkgconfig(icu-i18n) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(libiri) +BuildRequires: pkgconfig(libidn) + +%description +Wrt common library + +%package devel +Summary: Wrt common library development headers +Group: Development/Libraries +Requires: %{name} = %{version} + +%description devel +Wrt common library development headers + +%prep +%setup -q + +%define with_tests 0 +%if "%{WITH_TESTS}" == "ON" || "%{WITH_TESTS}" == "Y" || "%{WITH_TESTS}" == "YES" || "%{WITH_TESTS}" == "TRUE" || "%{WITH_TESTS}" == "1" + %define with_tests 1 +%endif + +%build + +%ifarch %{ix86} +cp build/encryption/libs/libcal.i586.a build/encryption/libs/libcal.a +%else +cp build/encryption/libs/libcal.arm.a build/encryption/libs/libcal.a +%endif + +export LDFLAGS+="-Wl,--rpath=%{_libdir} -Wl,--hash-style=both -Wl,--as-needed" + +cmake . -DVERSION=%{version} \ + -DDPL_LOG="OFF" \ + -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DCMAKE_BUILD_TYPE=%{?build_type:%build_type} \ + %{?WITH_TESTS:-DWITH_TESTS=%WITH_TESTS} +make %{?jobs:-j%jobs} + +%install +mkdir -p %{buildroot}/usr/share/license +cp %{name} %{buildroot}/usr/share/license/ +%make_install + +%clean +rm -rf %{buildroot} + +%post +mkdir -p /opt/share/widget/system +mkdir -p /opt/share/widget/user +mkdir -p /opt/share/widget/exec +mkdir -p /opt/share/widget/data/Public +mkdir -p /usr/lib/wrt-plugins + +if [ -z ${2} ]; then + echo "This is new install of wrt-commons" + echo "Calling /usr/bin/wrt_commons_reset_db.sh" + /usr/bin/wrt_commons_reset_db.sh +else + # Find out old and new version of databases + WRT_OLD_DB_VERSION=`sqlite3 /opt/dbspace/.wrt.db ".tables" | grep "DB_VERSION_"` + WRT_NEW_DB_VERSION=`cat /usr/share/wrt-engine/wrt_db.sql | tr '[:blank:]' '\n' | grep DB_VERSION_` + echo "OLD wrt database version ${WRT_OLD_DB_VERSION}" + echo "NEW wrt database version ${WRT_NEW_DB_VERSION}" + + if [ ${WRT_OLD_DB_VERSION} -a ${WRT_NEW_DB_VERSION} ] + then + if [ ${WRT_NEW_DB_VERSION} = ${WRT_OLD_DB_VERSION} ] + then + echo "Equal database detected so db installation ignored" + else + echo "Calling /usr/bin/wrt_commons_reset_db.sh" + /usr/bin/wrt_commons_reset_db.sh + fi + else + echo "Calling /usr/bin/wrt_commons_reset_db.sh" + /usr/bin/wrt_commons_reset_db.sh + fi +fi + +mkdir -p /usr/etc/ace +mkdir -p /usr/apps/org.tizen.policy + +# DBUS services fix +# WARNING: THIS IS TEMPORARY SOLUTION, AS THIS SHOULD NOT BE OUR +# RESPONSIBILITY!!! WE HAVE TO CONTACT TO DBUS MAINAINERS + +if [ -f /var/lib/dbus/machine-id ]; then + echo "machine-id exists" +else + if [ -f /usr/var/lib/dbus/machine-id ]; then + echo "machine-id exists" + else + echo "Creating machine-id" + mkdir -p /usr/var/lib/dbus/ + dbus-uuidgen > /usr/var/lib/dbus/machine-id + dbus-uuidgen --ensure=/usr/var/lib/dbus/machine-id + fi + mkdir -p /var/lib/dbus/ + cp /usr/var/lib/dbus/machine-id /var/lib/dbus/ +fi + +# Set Smack label for db files +chsmack -a 'wrt-commons::db_wrt' /opt/dbspace/.wrt.db +chsmack -a 'wrt-commons::db_wrt' /opt/dbspace/.wrt.db-journal +chsmack -a 'wrt-commons::db_wrt_autosave' /opt/dbspace/.wrt_autosave.db +chsmack -a 'wrt-commons::db_wrt_autosave' /opt/dbspace/.wrt_autosave.db-journal +chsmack -a 'wrt-commons::db_wrt_custom_handler' /opt/dbspace/.wrt_custom_handler.db +chsmack -a 'wrt-commons::db_wrt_custom_handler' /opt/dbspace/.wrt_custom_handler.db-journal + +echo "[WRT] wrt-commons postinst done ..." + +%files +%manifest wrt-commons.manifest +%{_libdir}/*.so +%{_libdir}/*.so.* +%{_datadir}/wrt-engine/* +%{_datadir}/license/%{name} +%attr(755,root,root) %{_bindir}/wrt_commons_create_clean_db.sh +%attr(755,root,root) %{_bindir}/wrt_commons_reset_db.sh +%if %{with_tests} + %attr(755,root,root) %{_bindir}/dpl-tests-* + %attr(755,root,root) %{_bindir}/dpl-dbus-test-service + %attr(755,root,root) %{_bindir}/wrt-tests-* + %attr(755,root,root) %{_bindir}/wrt_dao_tests_prepare_db.sh + %{_datadir}/dbus-1/services/org.tizen.DBusTestService.service + /opt/share/wrt/wrt-commons/tests/* +%endif + +%files devel +%{_includedir}/dpl-efl/* +%{_libdir}/pkgconfig/*.pc diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8453ccb..40112fe 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,38 +1,18 @@ -# 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 -# @brief -# +# Suppress all warnings; TODO: inhibit only specific warnings per target (TURNED OFF) +#SET(CMAKE_CXX_FLAGS_BACKUP ${CMAKE_CXX_FLAGS}) +#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") -SET(DPL_TEST_INCLUDE_DIR - ${DPL_CORE_INCLUDE_DIR} - ${DPL_EVENT_INCLUDE_DIR} - ${DPL_DBUS_INCLUDE_DIR} - ${DPL_DB_INCLUDE_DIR} - ${DPL_RPC_INCLUDE_DIR} - ${DPL_SOCKET_INCLUDE_DIR} - ${DPL_TEST_ENGINE_INCLUDE_DIR} - ${DPL_LOG_INCLUDE_DIR} +INCLUDE(CMakeUtils.txt) + +SET(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +SET(TESTS_COMMON_DIR "${TESTS_DIR}/common") + +WRT_ADD_INTERNAL_DEPENDENCIES( + ${TARGET_DPL_TEST_ENGINE_EFL} ) -ADD_SUBDIRECTORY(core) -ADD_SUBDIRECTORY(dbus) -ADD_SUBDIRECTORY(db) -ADD_SUBDIRECTORY(event) -ADD_SUBDIRECTORY(ace) -ADD_SUBDIRECTORY(vcore) -ADD_SUBDIRECTORY(localization) +ADD_SUBDIRECTORY(dao) +ADD_SUBDIRECTORY(dpl) + +# Rollback CXX flags +#SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_BACKUP}) \ No newline at end of file diff --git a/tests/CMakeUtils.txt b/tests/CMakeUtils.txt new file mode 100644 index 0000000..ea9cfb3 --- /dev/null +++ b/tests/CMakeUtils.txt @@ -0,0 +1,178 @@ +# @file CMakeUtils.txt +# @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) +# @author Pawel Sikorski (p.sikorski@samsung.com) +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +# +# Discovers target's INCLUDE_DIRECTORIES and LINK_DIRECTORIES. +# This is done by retrieving the directory target was built in and +# fetching appropriate properties of that directory. +FUNCTION(WRT_INTROSPECT_TARGET PREFIX TARGET_NAME) + GET_TARGET_PROPERTY(LOCATION ${TARGET_NAME} LOCATION) + IF(${LOCATION} STREQUAL "LOCATION-NOTFOUND") + MESSAGE(FATAL_ERROR "Target '${TARGET_NAME}' introspection failed") + ELSE(${LOCATION} STREQUAL "LOCATION-NOTFOUND") + STRING(FIND ${LOCATION} "/" LAST_SLASH_POSITION REVERSE) + STRING(SUBSTRING ${LOCATION} 0 ${LAST_SLASH_POSITION} LOCATION) + + GET_DIRECTORY_PROPERTY(INCLUDE_DIRS DIRECTORY ${LOCATION} INCLUDE_DIRECTORIES) + SET("${PREFIX}_INCLUDE_DIRS" ${INCLUDE_DIRS} PARENT_SCOPE) + + GET_DIRECTORY_PROPERTY(LIBRARY_DIRS DIRECTORY ${LOCATION} LINK_DIRECTORIES) + SET("${PREFIX}_LIBRARY_DIRS" ${LIBRARY_DIRS} PARENT_SCOPE) + ENDIF(${LOCATION} STREQUAL "LOCATION-NOTFOUND") +ENDFUNCTION(WRT_INTROSPECT_TARGET) + +# +# Replacement functions for standard (w/o "WRT_" prefix) CMake functions. +# They store supplied arguments in global properties to assign them to tests. +# Anything added with this functions is used by all targets that are built with +# WRT_TEST_BUILD function. + +# +# Appends directories to global property TESTS_INCLUDE_DIRS which is +# then read by WRT_TEST_BUILD and its content is forwarded to +# command INCLUDE_DIRECTORIES() (for all targets). +FUNCTION(WRT_INCLUDE_DIRECTORIES) + SET_PROPERTY(GLOBAL APPEND PROPERTY TESTS_INCLUDE_DIRS ${ARGV}) +ENDFUNCTION(WRT_INCLUDE_DIRECTORIES) + +# +# Appends directories to global property TESTS_LIBRARY_DIRS which is +# then read by WRT_TEST_BUILD and its content is forwarded to +# command LINK_DIRECTORIES() (for all targets). +FUNCTION(WRT_LINK_DIRECTORIES) + SET_PROPERTY(GLOBAL APPEND PROPERTY TESTS_LIBRARY_DIRS ${ARGV}) +ENDFUNCTION(WRT_LINK_DIRECTORIES) + +# +# Appends directories to global property TESTS_LIBRARIES which is +# then read by WRT_TEST_BUILD and its content is forwarded to +# command TARGET_LINK_LIBRARIES() (for all targets). +FUNCTION(WRT_TARGET_LINK_LIBRARIES) + SET_PROPERTY(GLOBAL APPEND PROPERTY TESTS_LIBRARIES ${ARGV}) +ENDFUNCTION(WRT_TARGET_LINK_LIBRARIES) + +# +# Convenience method that fills TESTS_INCLUDE_DIRS, TESTS_LIBRARY_DIRS +# and TESTS_LIBRARIES with values discovered from introspecting supplied +# targets. +# Function takes arbitrary number of targets. +FUNCTION(WRT_ADD_INTERNAL_DEPENDENCIES) + FOREACH(DEPENDENCY ${ARGV}) + WRT_INTROSPECT_TARGET(prefix ${DEPENDENCY}) + WRT_INCLUDE_DIRECTORIES(${prefix_INCLUDE_DIRS}) + WRT_LINK_DIRECTORIES(${prefix_LIBRARY_DIRS}) + WRT_TARGET_LINK_LIBRARIES(${DEPENDENCY}) + ENDFOREACH(DEPENDENCY) +ENDFUNCTION(WRT_ADD_INTERNAL_DEPENDENCIES) + + +# +# Replacement functions for standard (w/o "WRT_" prefix) CMake functions. +# They store supplied arguments in global properties to assign them to specific +# tests. Properties names are based on the test target name. +# Anything added with this functions is used only by the specified target that +# is built with WRT_TEST_BUILD function. + +# +# Appends directories to global property ${TARGET_NAME}_INCLUDE_DIRS +# which is then read by WRT_TEST_BUILD and its content is forwarded to +# command INCLUDE_DIRECTORIES() (for specified target). +FUNCTION(WRT_TEST_INCLUDE_DIRECTORIES TARGET_NAME) + SET_PROPERTY(GLOBAL APPEND PROPERTY ${TARGET_NAME}_INCLUDE_DIRS ${ARGN}) +ENDFUNCTION(WRT_TEST_INCLUDE_DIRECTORIES) + +# +# Appends directories to global property ${TARGET_NAME}_LIBRARY_DIRS +# which is then read by WRT_TEST_BUILD and its content is forwarded to +# command LINK_DIRECTORIES() (for specified target). +FUNCTION(WRT_TEST_LINK_DIRECTORIES TARGET_NAME) + SET_PROPERTY(GLOBAL APPEND PROPERTY ${TARGET_NAME}_LIBRARY_DIRS ${ARGN}) +ENDFUNCTION(WRT_TEST_LINK_DIRECTORIES) + +# +# Appends directories to global property ${TARGET_NAME}_LIBRARIES +# which is then read by WRT_TEST_BUILD and its content is forwarded to +# command TARGET_LINK_LIBRARIES() (for specified target). +FUNCTION(WRT_TEST_TARGET_LINK_LIBRARIES TARGET_NAME) + SET_PROPERTY(GLOBAL APPEND PROPERTY ${TARGET_NAME}_LIBRARIES ${ARGN}) +ENDFUNCTION(WRT_TEST_TARGET_LINK_LIBRARIES) + +# +# Convenience method that fills ${TARGET_NAME}_INCLUDE_DIRS, +# ${TARGET_NAME}_LIBRARY_DIRS and ${TARGET_NAME}_LIBRARIES with +# values discovered from introspecting supplied targets. +# Function takes arbitrary number of targets. +FUNCTION(WRT_TEST_ADD_INTERNAL_DEPENDENCIES TARGET_NAME) + FOREACH(DEPENDENCY ${ARGN}) + WRT_INTROSPECT_TARGET(prefix ${DEPENDENCY}) + WRT_TEST_INCLUDE_DIRECTORIES(${TARGET_NAME} ${prefix_INCLUDE_DIRS}) + WRT_TEST_LINK_DIRECTORIES(${TARGET_NAME} ${prefix_LIBRARY_DIRS}) + WRT_TEST_TARGET_LINK_LIBRARIES(${TARGET_NAME} ${DEPENDENCY}) + ENDFOREACH(DEPENDENCY) +ENDFUNCTION(WRT_TEST_ADD_INTERNAL_DEPENDENCIES) + +# Functions used to build test targets (proper sources, includes, libs are +# added automatically) +FUNCTION(WRT_TEST_BUILD TARGET_NAME) + SET(SOURCES "${ARGN}") + ADD_EXECUTABLE("${TARGET_NAME}" ${SOURCES}) + + # get include dirs global property + GET_PROPERTY(INCLUDE_DIRS GLOBAL PROPERTY TESTS_INCLUDE_DIRS) + GET_PROPERTY(TEST_INCLUDE_DIRS GLOBAL PROPERTY ${TARGET_NAME}_INCLUDE_DIRS) + INCLUDE_DIRECTORIES( + ${INCLUDE_DIRS} + ${TEST_INCLUDE_DIRS} + ) + + # get library dirs global property + GET_PROPERTY(LIBRARY_DIRS GLOBAL PROPERTY TESTS_LIBRARY_DIRS) + GET_PROPERTY(TEST_LIBRARY_DIRS GLOBAL PROPERTY ${TARGET_NAME}_LIBRARY_DIRS) + LINK_DIRECTORIES( + ${LIBRARY_DIRS} + ${TEST_LIBRARY_DIRS} + ) + + # get link libraries global property + GET_PROPERTY(LINK_LIBRARIES GLOBAL PROPERTY TESTS_LIBRARIES) + GET_PROPERTY(TEST_LIBRARIES GLOBAL PROPERTY ${TARGET_NAME}_LIBRARIES) + TARGET_LINK_LIBRARIES("${TARGET_NAME}" + ${LINK_LIBRARIES} + ${TEST_LIBRARIES} + ) +ENDFUNCTION(WRT_TEST_BUILD) + +FUNCTION(WRT_TEST_INSTALL) + SET_TARGET_PROPERTIES(${ARGV} PROPERTIES + BUILD_WITH_INSTALL_RPATH ON + INSTALL_RPATH_USE_LINK_PATH ON + ) + INSTALL(TARGETS ${ARGV} + DESTINATION bin + PERMISSIONS OWNER_READ + OWNER_WRITE + OWNER_EXECUTE + GROUP_READ + GROUP_EXECUTE + WORLD_READ + WORLD_EXECUTE + ) +ENDFUNCTION(WRT_TEST_INSTALL) + +# Takes arbitrary number of arguments and concatenates them using ':' character. +# Rationale: +# CMake list when converted to a string is joined with ';' character. However, +# GCC takes strings with multiple elements separated with ':' (e.g. list of +# paths). Used typically when generating DB schemas with ORM mechanism. +FUNCTION(WRT_CONVERT_TO_GCC_LIST OUTPUT_VARIABLE) + FOREACH(ITEM ${ARGN}) + LIST(APPEND ITEMS ${ITEM}) + ENDFOREACH(ITEM) + STRING(REPLACE ";" ":" OUTPUT "${ITEMS}") + SET("${OUTPUT_VARIABLE}" "${OUTPUT}" PARENT_SCOPE) +ENDFUNCTION(WRT_CONVERT_TO_GCC_LIST) diff --git a/tests/common/include/loop_control.h b/tests/common/include/loop_control.h new file mode 100644 index 0000000..30aa6e8 --- /dev/null +++ b/tests/common/include/loop_control.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file loop_control.cpp + * @author Jaroslaw Osmanski (j.osmanski@samsung.com) + * @version 1.0 + * @brief This file is the definitions of loop controlling utilities + */ + + +#ifndef LOOP_CONTROL_H_ +#define LOOP_CONTROL_H_ + +namespace LoopControl +{ + +void init_loop(int argc, char *argv[]); +void wait_for_wrt_init(); +void finish_wait_for_wrt_init(); +void quit_loop(); + +void wrt_start_loop(); +void wrt_end_loop(); + +void *abstract_window(); + +} + +#endif /* LOOP_CONTROL_H_ */ diff --git a/tests/common/src/loop_control.cpp b/tests/common/src/loop_control.cpp new file mode 100644 index 0000000..eed375c --- /dev/null +++ b/tests/common/src/loop_control.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file loop_control.cpp + * @author Jaroslaw Osmanski (j.osmanski@samsung.com) + * @version 1.0 + * @brief This is implementation of EFL version of loop control + */ + +#include +#include + +#include + +#include +#include + + +namespace LoopControl +{ +void init_loop(int argc, char *argv[]) +{ + (void)argc; + (void)argv; + g_type_init(); + g_thread_init(NULL); + + LogInfo("Starting"); + elm_init(argc, argv); +} + +void wait_for_wrt_init() +{ + ecore_main_loop_begin(); +} + +void finish_wait_for_wrt_init() +{ + ecore_main_loop_quit(); +} + +void quit_loop() +{ + elm_shutdown(); +} + +void wrt_start_loop() +{ + ecore_main_loop_begin(); +} + +void wrt_end_loop() +{ + ecore_main_loop_quit(); +} + +void *abstract_window() +{ + return elm_win_add(NULL, "hello", ELM_WIN_BASIC); +} + +}//end of LoopControl namespace diff --git a/tests/dao/CMakeLists.txt b/tests/dao/CMakeLists.txt new file mode 100644 index 0000000..350431c --- /dev/null +++ b/tests/dao/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Pawel Sikorski (p.sikorski@samsung.com) +# @version 1.0 +# @brief +# + +# common part +FILE(GLOB DAO_TESTS_SOURCES "${PROJECT_SOURCE_DIR}/tests/dao/*DAO.cpp") + +# target wrt-tests-dao +SET(TARGET_DAO_TEST "wrt-tests-dao") +WRT_TEST_INCLUDE_DIRECTORIES(${TARGET_DAO_TEST} ${PROJECT_SOURCE_DIR}/modules/support/) +WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_DAO_TEST} ${TARGET_WRT_DAO_RW_LIB} ${TARGET_CUSTOM_HANDLER_DAO_RW_LIB}) +WRT_TEST_BUILD(${TARGET_DAO_TEST} ${DAO_TESTS_SOURCES} tests_dao.cpp) +WRT_TEST_INSTALL(${TARGET_DAO_TEST}) + + +# common installed files +INSTALL(PROGRAMS + ${PROJECT_SOURCE_DIR}/tests/dao/wrt_dao_tests_prepare_db.sh + DESTINATION bin + ) diff --git a/tests/dao/README b/tests/dao/README new file mode 100644 index 0000000..6c60a17 --- /dev/null +++ b/tests/dao/README @@ -0,0 +1,11 @@ +Wrt DAO +System tests. Tests database access layer: widgets information database, global configuration, plugins. +Binary file: wrt-tests-dao. Uses our test framework. Allows to use different types of output. Text output shows results on console - green passed. +To run: +1. Install wrt-extra on target +2. Run wrt-tests-dao --output=text + +Automatic: YES +Included in Daily Build: YES (http://build01.sprc.samsung.pl/browse/LINUXNGWAP-INT) +Included in Gerrit Builds: YES (http://build01.sprc.samsung.pl/browse/LINUXNGWAP-GERRIT) +Number of test cases: 45 \ No newline at end of file diff --git a/tests/dao/TestCases_CustomHandlerDAO.cpp b/tests/dao/TestCases_CustomHandlerDAO.cpp new file mode 100644 index 0000000..fb1a465 --- /dev/null +++ b/tests/dao/TestCases_CustomHandlerDAO.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file TestCases_CustomHandlerDAO.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief This file contains tests for custom handler dao class. + */ + +#include +#include +#include +#include + +using namespace CustomHandlerDB; + +RUNNER_TEST_GROUP_INIT(DAO) + +namespace +{ +const DPL::String P_TARGET(L"p_target"); +const DPL::String P_BASE_URL(L"p_base_url"); +const DPL::String P_URL(L"p_url"); +const DPL::String P_TITLE(L"p_title"); + +const DPL::String C_TARGET(L"c_target"); +const DPL::String C_BASE_URL(L"c_base_url"); +const DPL::String C_URL(L"c_url"); +const DPL::String C_TITLE(L"c_title"); + +void checkHandlersExistence(CustomHandlerDAOReadOnly& dao, bool protocol, bool content) +{ + CustomHandlerDB::CustomHandlerPtr handler; + handler = dao.getProtocolHandler(P_TARGET, P_URL); + RUNNER_ASSERT_MSG((!!handler) == protocol, "Protocol handler check"); + handler = dao.getContentHandler(C_TARGET, C_URL); + RUNNER_ASSERT_MSG((!!handler) == content, "Content handler check"); +} + +} // namespace + +RUNNER_TEST(custom_handler_empty_db_read) +{ + CustomHandlerDAOReadOnly dao(DPL::String(L"test")); +} + + +RUNNER_TEST(custom_handlers) +{ + CustomHandlerDAOReadOnly dao_ro(L"test"); + CustomHandlerDAO dao_rw(L"test"); + + CustomHandlerDB::CustomHandlerPtr handler; + CustomHandlerDB::CustomHandler p_handler; + p_handler.target = P_TARGET; + p_handler.base_url = P_BASE_URL; + p_handler.url = P_URL; + p_handler.title = P_TITLE; + p_handler.user_decision = Agreed; + + // initial check + checkHandlersExistence(dao_ro,false,false); + + // Protocol handler registration + dao_rw.registerProtocolHandler(p_handler); + checkHandlersExistence(dao_ro,true,false); + + handler = dao_ro.getProtocolHandler(P_TARGET, P_URL); + RUNNER_ASSERT(handler); + RUNNER_ASSERT(handler->target == P_TARGET); + RUNNER_ASSERT(handler->base_url == P_BASE_URL); + RUNNER_ASSERT(handler->url == P_URL); + RUNNER_ASSERT(handler->title == P_TITLE); + RUNNER_ASSERT(handler->user_decision == Agreed); + + + // Content handler registration + CustomHandlerDB::CustomHandler c_handler; + c_handler.target = C_TARGET; + c_handler.base_url = C_BASE_URL; + c_handler.url = C_URL; + c_handler.title = C_TITLE; + c_handler.user_decision = DeclinedPermanently; + + dao_rw.registerContentHandler(c_handler); + checkHandlersExistence(dao_ro,true,true); + handler = dao_ro.getContentHandler(C_TARGET, C_URL); + + RUNNER_ASSERT(handler); + RUNNER_ASSERT(handler->target == C_TARGET); + RUNNER_ASSERT(handler->base_url == C_BASE_URL); + RUNNER_ASSERT(handler->url == C_URL); + RUNNER_ASSERT(handler->title == C_TITLE); + RUNNER_ASSERT(handler->user_decision == DeclinedPermanently); + + // Handler unregistration + dao_rw.unregisterProtocolHandler(P_TARGET, P_URL); + checkHandlersExistence(dao_ro,false,true); + + // Nonexistent unregistration + dao_rw.unregisterContentHandler(L"blah", L"blah"); + checkHandlersExistence(dao_ro,false,true); + + // Cleanup + dao_rw.unregisterContentHandler(C_TARGET, C_URL); + checkHandlersExistence(dao_ro,false,false); +} diff --git a/tests/dao/TestCases_FeatureDAO.cpp b/tests/dao/TestCases_FeatureDAO.cpp new file mode 100644 index 0000000..26ea2bd --- /dev/null +++ b/tests/dao/TestCases_FeatureDAO.cpp @@ -0,0 +1,244 @@ +/* + * 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 TestCases_FeatureDAO.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains tests for feature dao class. + */ + +#include +#include +#include +#include +#include + +using namespace WrtDB; + +#define RUNNER_ASSERT_WHAT_EQUALS(in, test) \ + {std::string tmp(in); \ + RUNNER_ASSERT_MSG(tmp == test, "Equals: [" + tmp + "]");} + +RUNNER_TEST_GROUP_INIT(DAO) + +/* +Name: feature_dao_test_register_features +Description: Checks if plugin registeration performs features registration +Expected: registrartion should succeed +*/ +RUNNER_TEST(feature_dao_test_register_features) +{ + PluginHandle plHandle; + { + std::string libraryPath("nfp1 lib_path"); + std::string libraryName("nfp1"); + + PluginMetafileData pluginData; + pluginData.m_libraryName = libraryName; + + plHandle = PluginDAO::registerPlugin(pluginData, libraryPath); + RUNNER_ASSERT(PluginDAO::isPluginInstalled(libraryName) == true); + + FeatureHandleList old = FeatureDAOReadOnly::GetHandleList(); + PluginMetafileData::Feature f; + f.m_name = std::string("new_f1"); + + FeatureHandle handle = FeatureDAO::RegisterFeature(f,plHandle); + RUNNER_ASSERT_MSG(handle != -1, "Already registered"); + RUNNER_ASSERT_MSG(old.size() < FeatureDAOReadOnly::GetHandleList().size(), + "New feature should be saved"); + + FeatureDAOReadOnly dao(handle); + + RUNNER_ASSERT_WHAT_EQUALS(dao.GetName(),"new_f1"); + plHandle = dao.GetPluginHandle(); + } + + { + FeatureHandleList old = FeatureDAOReadOnly::GetHandleList(); + + PluginMetafileData::Feature f; + f.m_name = std::string("new_f2"); + + FeatureHandle handle = FeatureDAO::RegisterFeature(f,plHandle); + RUNNER_ASSERT_MSG(handle != -1, "Already registered"); + RUNNER_ASSERT_MSG(old.size() < FeatureDAOReadOnly::GetHandleList().size(), + "New feature should be saved"); + + FeatureDAOReadOnly dao(handle); + + RUNNER_ASSERT_MSG(plHandle == dao.GetPluginHandle(), + "New plugin registered (should be old used)"); + } +} + +/* +Name: feature_dao_test_get_feature_properties +Description: Checks properties of inserted features +Expected: properties of features should match values inserted to database directly +*/ +RUNNER_TEST(feature_dao_test_get_feature_properties) +{ + { + FeatureDAOReadOnly dao("feature1"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetName(), "feature1"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetLibraryName(), "plugin1"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetLibraryPath(), ""); + } + + { + FeatureDAOReadOnly dao("feature2"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetName(), "feature2"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetLibraryName(), "p4"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetLibraryPath(), "path_to_p4"); + } + + { + FeatureDAOReadOnly dao("feature3"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetName(), "feature3"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetLibraryName(), "p4"); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetLibraryPath(), "path_to_p4"); + } +} + +/* +Name: feature_dao_test_feature_constructor_name +Description: - +Expected: - + +TODO: test +*/ +RUNNER_TEST(feature_dao_test_feature_constructor_name) +{ + std::list preinstalled; + preinstalled.push_back("feature1"); + preinstalled.push_back("feature2"); + preinstalled.push_back("feature3"); + preinstalled.push_back("feature4"); + + FOREACH(it, preinstalled) + { + FeatureDAOReadOnly dao(*it); + RUNNER_ASSERT_WHAT_EQUALS(dao.GetName(), *it); + } + + //TODO check exception that may occur (feature does not exist) +} + +/* +Name: feature_dao_test_feature_handle_list +Description: Checks if list of installed features is returend correctly +Expected: list size should be at last equal number of preinserted features +*/ +RUNNER_TEST(feature_dao_test_feature_handle_list) +{ + FeatureHandleList handles = FeatureDAOReadOnly::GetHandleList(); + RUNNER_ASSERT(handles.size() >= 4); +} + +/* +Name: feature_dao_test_is_feature_installed +Description: Checks if installed features are showed correctly. +Expected: correct installed features should be present +*/ +RUNNER_TEST(feature_dao_test_is_feature_installed) +{ + //installed + { + std::list preinstalled; + preinstalled.push_back("feature1"); + preinstalled.push_back("feature2"); + preinstalled.push_back("feature3"); + preinstalled.push_back("feature4"); + + FOREACH(it, preinstalled) + RUNNER_ASSERT(FeatureDAOReadOnly::isFeatureInstalled(*it)); + } + + //not installed + { + RUNNER_ASSERT(FeatureDAOReadOnly::isFeatureInstalled("not_installed1")==false); + RUNNER_ASSERT(FeatureDAOReadOnly::isFeatureInstalled("plugin1") == false); + RUNNER_ASSERT(FeatureDAOReadOnly::isFeatureInstalled("") == false); + RUNNER_ASSERT(FeatureDAOReadOnly::isFeatureInstalled("ff") == false); + } +} + +/* +Name: feature_dao_test_get_device_capab +Description: - +Expected: - + +TODO: fix test +*/ +RUNNER_TEST(feature_dao_test_get_device_capab) +{ +#if 0 + //TODO do more tests + + {//check deviceCaps + Feature f; + f.setName("new_dev_f4"); + f.setLibraryName("new_dev_f4 lib_name"); + + FeatureDAOReadOnly::DeviceCapabilitiesList devList; + devList.insert("new_dev_f4 devcap1"); + devList.insert("new_dev_f4 devcap2"); + + FOREACH(it, devList) + f.addDeviceCapability(*it); + + FeatureHandle handle = FeatureDAO::RegisterFeature(f,"new_dev_f4 path"); + + FeatureDAOReadOnly dao(handle); + + FeatureDAOReadOnly::DeviceCapabilitiesList gotList = + dao.GetDeviceCapabilities(); + RUNNER_ASSERT_MSG(gotList.size() == devList.size(), + "deviceCaps wrong"); + } +#endif +} + +/* +Name: feature_dao_test_is_device_capab_installed +Description: Checks if FeatureDAOReadOnly::isDeviceCapabilityInstalled works correctly. +Expected: correct capabilities should be present +*/ +RUNNER_TEST(feature_dao_test_is_device_capab_installed) +{ + //installed + std::list preinstalled; + preinstalled.push_back("devicecap1"); + preinstalled.push_back("devicecap2"); + preinstalled.push_back("devicecap3"); + preinstalled.push_back("devicecap4"); + + FOREACH(it, preinstalled) + RUNNER_ASSERT(FeatureDAOReadOnly::isDeviceCapabilityInstalled(*it)); + + //not installed + std::list notinstalled; + notinstalled.push_back("notinstalled1"); + notinstalled.push_back("plugin1"); + notinstalled.push_back(""); + notinstalled.push_back("ff"); + + FOREACH(it, notinstalled) + RUNNER_ASSERT(!FeatureDAOReadOnly::isDeviceCapabilityInstalled(*it)); +} + +#undef RUNNER_ASSERT_WHAT_EQUALS diff --git a/tests/dao/TestCases_GlobalDAO.cpp b/tests/dao/TestCases_GlobalDAO.cpp new file mode 100644 index 0000000..0098eee --- /dev/null +++ b/tests/dao/TestCases_GlobalDAO.cpp @@ -0,0 +1,111 @@ +/* + * 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 TestCases_GlobalDAO.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains tests for global dao class. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace WrtDB; + + +namespace +{ +const DPL::String widgetPackage5(L"widgetpackage5"); +} // namespace + +RUNNER_TEST_GROUP_INIT(DAO) + +/* +Name: global_dao_developer_mode +Description: tests if developer mode is correctly set and get +Expected: received developer shoudl match the one was set +*/ +RUNNER_TEST(global_dao_developer_mode) +{ + bool prev_mode = GlobalDAO::GetDeveloperMode(); + GlobalDAO::SetDeveloperMode(false); + RUNNER_ASSERT_MSG(!GlobalDAO::GetDeveloperMode(), "set false failed"); + + GlobalDAO::SetDeveloperMode(true); + RUNNER_ASSERT_MSG(GlobalDAO::GetDeveloperMode(), "set true failed"); + GlobalDAO::SetDeveloperMode(prev_mode); +} + +/* +Name: home_network_data_usage +Description: tests if HomeNetworkDataUsage is correctly set and get +Expected: received developer shoudl match the one was set +*/ +RUNNER_TEST(home_network_data_usage) +{ + GlobalDAO::NetworkAccessMode original = + GlobalDAO::GetHomeNetworkDataUsage(); + + GlobalDAO::SetHomeNetworkDataUsage(GlobalDAO::CONNECT_AUTOMATICALLY); + RUNNER_ASSERT_MSG(GlobalDAO::CONNECT_AUTOMATICALLY == + GlobalDAO::GetHomeNetworkDataUsage(), "Value not updated"); + + GlobalDAO::SetHomeNetworkDataUsage(GlobalDAO::ALWAYS_ASK); + RUNNER_ASSERT_MSG(GlobalDAO::ALWAYS_ASK == + GlobalDAO::GetHomeNetworkDataUsage(), "Value not updated"); + + GlobalDAO::SetHomeNetworkDataUsage(GlobalDAO::NEVER_CONNECT); + RUNNER_ASSERT_MSG(GlobalDAO::NEVER_CONNECT == + GlobalDAO::GetHomeNetworkDataUsage(), "Value not updated"); + + GlobalDAO::SetHomeNetworkDataUsage(original); + RUNNER_ASSERT_MSG(original == GlobalDAO::GetHomeNetworkDataUsage(), + "Value not updated"); +} + +/* +Name: roaming_data_usage +Description: tests if RoamingDataUsage is correctly set and get +Expected: received developer shoudl match the one was set +*/ +RUNNER_TEST(roaming_data_usage) +{ + GlobalDAO::NetworkAccessMode original = + GlobalDAO::GetRoamingDataUsage(); + + GlobalDAO::SetRoamingDataUsage(GlobalDAO::CONNECT_AUTOMATICALLY); + RUNNER_ASSERT_MSG(GlobalDAO::CONNECT_AUTOMATICALLY == + GlobalDAO::GetRoamingDataUsage(), "Value not updated"); + + GlobalDAO::SetRoamingDataUsage(GlobalDAO::ALWAYS_ASK); + RUNNER_ASSERT_MSG(GlobalDAO::ALWAYS_ASK == + GlobalDAO::GetRoamingDataUsage(), "Value not updated"); + + GlobalDAO::SetRoamingDataUsage(GlobalDAO::NEVER_CONNECT); + RUNNER_ASSERT_MSG(GlobalDAO::NEVER_CONNECT == + GlobalDAO::GetRoamingDataUsage(), "Value not updated"); + + GlobalDAO::SetRoamingDataUsage(original); + RUNNER_ASSERT_MSG(original == GlobalDAO::GetRoamingDataUsage(), + "Value not updated"); +} diff --git a/tests/dao/TestCases_PluginDAO.cpp b/tests/dao/TestCases_PluginDAO.cpp new file mode 100644 index 0000000..d737752 --- /dev/null +++ b/tests/dao/TestCases_PluginDAO.cpp @@ -0,0 +1,441 @@ +/* + * 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 TestCases_PluginDAO.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains tests for feature dao class. + */ + +#include +#include +#include +#include +#include +//#include +#include +#include + +using namespace WrtDB; + +#define RUNNER_ASSERT_WHAT_EQUALS(in, test) \ + {std::string tmp(in); \ + RUNNER_ASSERT_MSG(tmp == test, "Equals: [" + tmp + "]");} + +RUNNER_TEST_GROUP_INIT(DAO) + +/* +Name: plugin_dao_test_register_plugins +Description: registers new plugin and check if it was correctly registered +Expected: plugin should be correctly registered +*/ +RUNNER_TEST(plugin_dao_test_register_plugins) +{ + { + std::string libraryPath("np1 lib_path"); + std::string libraryName("np1"); + + PluginMetafileData pluginData; + pluginData.m_libraryName = libraryName; + + PluginHandle handle = PluginDAO::registerPlugin(pluginData, libraryPath); + PluginDAO::setPluginInstallationStatus(handle,PluginDAO::INSTALLATION_COMPLETED); + RUNNER_ASSERT(PluginDAO::isPluginInstalled(libraryName) == true); + + PluginDAO dao(handle); + std::string tmp; + tmp = dao.getLibraryPath(); //do for each + RUNNER_ASSERT_MSG(tmp == libraryPath, "Equals: " + tmp); + } + + { + std::string libraryName("np2"); + + PluginMetafileData pluginData; + pluginData.m_libraryName = libraryName; + + PluginHandle handle = PluginDAO::registerPlugin(pluginData, ""); + PluginDAO::setPluginInstallationStatus(handle,PluginDAO::INSTALLATION_COMPLETED); + RUNNER_ASSERT(PluginDAO::isPluginInstalled(libraryName) == true); + + PluginDAO dao(handle); + RUNNER_ASSERT(dao.getLibraryPath() == ""); + } +} + +/* +Name: plugin_dao_test_register_plugin_implemented_object +Description: registers new PluginImplementedObject + and check if it was correctly registered +Expected: plugin dao shoudld be upodated with PluginImplementedObject +*/ +RUNNER_TEST(plugin_dao_test_register_plugin_implemented_object) +{ + { + std::string libraryPath("np3 lib_path"); + std::string libraryName("np3"); + + PluginMetafileData pluginData; + pluginData.m_libraryName = libraryName; + + PluginHandle handle = + PluginDAO::registerPlugin(pluginData, libraryPath); + RUNNER_ASSERT(PluginDAO::isPluginInstalled(libraryName) == true); + + std::string object1("object1"); + std::string object2("object2"); + PluginDAO::registerPluginImplementedObject(object1, handle); + PluginDAO::registerPluginImplementedObject(object2, handle); + + PluginHandle retHandle1 = + PluginDAO::getPluginHandleForImplementedObject(object1); + PluginHandle retHandle2 = + PluginDAO::getPluginHandleForImplementedObject(object1); + RUNNER_ASSERT(retHandle1 == handle); + RUNNER_ASSERT(retHandle2 == handle); + } +} + +/* +Name: plugin_dao_test_register_plugin_implemented_object +Description: registers dependecies for plugins and checks if they were saved +Expected: registered dependecies should be returned from database +*/ +RUNNER_TEST(plugin_dao_test_register_library_dependencies) +{ + { + std::string libraryPath("np4 lib_path"); + std::string libraryName("np4"); + + PluginMetafileData pluginData; + pluginData.m_libraryName = libraryName; + + PluginHandle handle = + PluginDAO::registerPlugin(pluginData, libraryPath); + PluginDAO::setPluginInstallationStatus(handle,PluginDAO::INSTALLATION_COMPLETED); + RUNNER_ASSERT(PluginDAO::isPluginInstalled(libraryName) == true); + + PluginHandle depHandles[] = {117, 119}; + + PluginHandleSetPtr dependencies(new PluginHandleSet); + dependencies->insert(depHandles[1]); + dependencies->insert(depHandles[2]); + + PluginDAO::registerPluginLibrariesDependencies(handle, dependencies); + + PluginDAO dao(handle); + PluginHandleSetPtr retDependencies; + retDependencies = dao.getLibraryDependencies(); + + RUNNER_ASSERT( + retDependencies->size()==sizeof(depHandles)/sizeof(depHandles[0])); + RUNNER_ASSERT( + retDependencies->find(depHandles[1]) != retDependencies->end()); + RUNNER_ASSERT( + retDependencies->find(depHandles[2]) != retDependencies->end()); + } +} + +/* +Name: plugin_dao_test_register_required_object +Description: registers required plugin objects for plugins and checks if they were saved +Expected: registered required plugin objects should be returned from database +*/ +RUNNER_TEST(plugin_dao_test_register_required_object) +{ + { + std::string libraryPath("np5 lib_path"); + std::string libraryName("np5"); + + PluginMetafileData pluginData; + pluginData.m_libraryName = libraryName; + + PluginHandle handle = + PluginDAO::registerPlugin(pluginData, libraryPath); + PluginDAO::setPluginInstallationStatus(handle,PluginDAO::INSTALLATION_COMPLETED); + RUNNER_ASSERT(PluginDAO::isPluginInstalled(libraryName) == true); + + const size_t numObjects =2; + std::string objectReq [numObjects]; + objectReq[0] = std::string("object1.req"); + objectReq[1] = std::string("object2.req"); + PluginDAO::registerPluginRequiredObject(objectReq[0], handle); + PluginDAO::registerPluginRequiredObject(objectReq[1], handle); + + WrtDB::PluginObjectsDAO::ObjectsPtr objects = + PluginDAO::getRequiredObjectsForPluginHandle(handle); + + RUNNER_ASSERT(objects->size() == numObjects + && objects->find(objectReq[0]) != objects->end() + && objects->find(objectReq[1]) != objects->end()); + } +} + +/* +Name: plugin_dao_test_is_library_installed +Description: tests if plugin isntallation/registrartion works +Expected: only registered plugins should be reported as installed +*/ +RUNNER_TEST(plugin_dao_test_is_library_installed) +{ + { + //exist + std::list preinstalled; + preinstalled.push_back("plugin1"); + preinstalled.push_back("plugin2"); + preinstalled.push_back("plugin3"); + preinstalled.push_back("p4"); + preinstalled.push_back("p5"); + + FOREACH(it, preinstalled) + RUNNER_ASSERT_MSG(PluginDAO::isPluginInstalled(*it), + std::string("Not found: ") + *it); + } + + { + //does not exist + RUNNER_ASSERT_MSG( + PluginDAO::isPluginInstalled("not_installed1") == false, + "Found not_installed1"); + RUNNER_ASSERT_MSG(PluginDAO::isPluginInstalled("p 4") == false, + "Found p 4"); + RUNNER_ASSERT_MSG(PluginDAO::isPluginInstalled("") == false, + "Found "); + RUNNER_ASSERT_MSG(PluginDAO::isPluginInstalled("p33") == false, + "Found p33"); + RUNNER_ASSERT_MSG(PluginDAO::isPluginInstalled("feature1") == false, + "Found feature1"); + } +} + +/* +Name: plugin_dao_test_get_plugin_handle_list +Description: test of returning plugin handle list +Expected: returned list should be no less than number of registered plugins +*/ +RUNNER_TEST(plugin_dao_test_get_plugin_handle_list) +{ + PluginHandleList handles = PluginDAO::getPluginHandleList(); + RUNNER_ASSERT(handles.size() >= 5); +} + +/* +Name: plugin_dao_test_constructor_name +Description: tests construction of plugin dao based on plugin name +Expected: Instance of dao should be constructed only + if there is given plugin in database +*/ +RUNNER_TEST(plugin_dao_test_constructor_name) +{ + { + //exist + std::list preinstalled; + preinstalled.push_back("plugin1"); + preinstalled.push_back("plugin2"); + preinstalled.push_back("plugin3"); + preinstalled.push_back("p4"); + preinstalled.push_back("p5"); + + FOREACH(it, preinstalled) + { + PluginDAO dao(*it); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryName(), *it); + } + } + + { + //does not exist + std::list not_installed; + not_installed.push_back("plugin 1"); + not_installed.push_back(""); + not_installed.push_back("p 3"); + + FOREACH(it, not_installed) + { + Try { + //Plugin not exist + PluginDAO dao(*it); + RUNNER_ASSERT_MSG(false, "should not be found"); + } + Catch (PluginDAO::Exception::PluginNotExist) { + continue; + } + } + } + +} + +/* +Name: plugin_dao_test_get_plugin_properties +Description: tests reading plugin properties from database +Expected: Data, inserted into database, should be accessible via dao +*/ +RUNNER_TEST(plugin_dao_test_get_plugin_properties) +{ + { + PluginDAO dao("p4"); + RUNNER_ASSERT(dao.getPluginHandle() == 4); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryName(), "p4"); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryPath(), "path_to_p4"); + } + + { + PluginDAO dao(5); + RUNNER_ASSERT(dao.getPluginHandle() == 5); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryName(), "p5"); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryPath(), "path_to_p5"); + } + + { + PluginDAO dao(2); + RUNNER_ASSERT(dao.getPluginHandle() == 2); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryName(), "plugin2"); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryPath(), "path_to_plugin2"); + } + + { + PluginDAO dao(1); + RUNNER_ASSERT(dao.getPluginHandle() == 1); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryName(), "plugin1"); + RUNNER_ASSERT_WHAT_EQUALS(dao.getLibraryPath(), ""); + } +} + +/* +Name: plugin_dao_test_get_implemented_objects_for_plugin_handle_1 +Description: tests receiving from dao Implemented Objects +Expected: returned object is size 0 +*/ +RUNNER_TEST(plugin_dao_test_get_implemented_objects_for_plugin_handle_1) +{ + { + const int handle = 1; + PluginDAOReadOnly dao(handle); + auto dbHandle = dao.getPluginHandle(); + RUNNER_ASSERT(dbHandle == handle); + auto objects = dao.getImplementedObjectsForPluginHandle(dbHandle); + + RUNNER_ASSERT(objects.size() == 0); + } +} + +/* +Name: plugin_dao_test_get_implemented_objects_for_plugin_handle_2 +Description: tests receiving from dao Implemented Objects +Expected: returned object is size as it was inserted +*/ +RUNNER_TEST(plugin_dao_test_get_implemented_objects_for_plugin_handle_2) +{ + { + std::set< std::string > preinstalled = + { + "" + }; + + PluginDAOReadOnly dao(2); + auto dbHandle = dao.getPluginHandle(); + auto objects = dao.getImplementedObjectsForPluginHandle(dbHandle); + + //LogError("\n" << objects.size() << " " << preinstalled.size() << "\n"); + + RUNNER_ASSERT(objects.size() == preinstalled.size()); + + FOREACH(dbObject, objects) + { + RUNNER_ASSERT(preinstalled.find(*dbObject) != preinstalled.end()); + } + } +} + +/* +Name: plugin_dao_test_get_implemented_objects_for_plugin_handle_3 +Description: tests receiving from dao Implemented Objects +Expected: returned objects list has preinserted object +*/ +RUNNER_TEST(plugin_dao_test_get_implemented_objects_for_plugin_handle_3) +{ + { + std::set< std::string > preinstalled = + { + "Plugin_3_Object_A" + }; + + PluginDAOReadOnly dao(3); + auto dbHandle = dao.getPluginHandle(); + auto objects = dao.getImplementedObjectsForPluginHandle(dbHandle); + RUNNER_ASSERT(objects.size() == preinstalled.size()); + + FOREACH(dbObject, objects) + { + RUNNER_ASSERT(preinstalled.find(*dbObject) != preinstalled.end()); + } + } +} + +/* +Name: plugin_dao_test_get_implemented_objects_for_plugin_handle_4 +Description: tests receiving from dao Implemented Objects +Expected: returned objects list has all preinserted objects +*/ +RUNNER_TEST(plugin_dao_test_get_implemented_objects_for_plugin_handle_4) +{ + { + std::set< std::string > preinstalled = + { + "Plugin_4_Object_A", + "Plugin_4_Object_B", + "Plugin_4_Object_C", + }; + + PluginDAOReadOnly dao(4); + auto dbHandle = dao.getPluginHandle(); + auto objects = dao.getImplementedObjectsForPluginHandle(dbHandle); + RUNNER_ASSERT(objects.size() == preinstalled.size()); + + FOREACH(dbObject, objects) + { + RUNNER_ASSERT(preinstalled.find(*dbObject) != preinstalled.end()); + } + } +} + +/* +Name: plugin_dao_test_get_implemented_objects_for_plugin_handle_5 +Description: tests receiving from dao Implemented Objects +Expected: returned objects list do not have object that was not inserted +*/ +RUNNER_TEST(plugin_dao_test_get_implemented_objects_for_plugin_handle_5) +{ + { + std::set< std::string > preinstalled = + { + "Plugin_5_Object_B", + }; + + PluginDAOReadOnly dao(5); + auto dbHandle = dao.getPluginHandle(); + auto objects = dao.getImplementedObjectsForPluginHandle(dbHandle); + RUNNER_ASSERT(objects.size() == preinstalled.size()); + + FOREACH(dbObject, objects) + { + RUNNER_ASSERT(preinstalled.find(*dbObject) == preinstalled.end()); + } + } +} + + +#undef RUNNER_ASSERT_WHAT_EQUALS diff --git a/tests/dao/TestCases_PropertyDAO.cpp b/tests/dao/TestCases_PropertyDAO.cpp new file mode 100644 index 0000000..e72b01b --- /dev/null +++ b/tests/dao/TestCases_PropertyDAO.cpp @@ -0,0 +1,163 @@ +/* + * 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 TestCases_PropertyDAO.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains tests for property dao class. + */ + +#include +#include +#include +#include +#include +#include +#include + +using namespace WrtDB; +using namespace WrtDB::PropertyDAOReadOnly; + +// Widgets used 2000, 2001, 2002, 2003(saved by wrt_dao_tests_prepare_db.sh) + +#define RUNNER_ASSERT_WHAT_EQUALS(in, test) \ + {std::string tmp(in); \ + RUNNER_ASSERT_MSG(tmp == test, "Equals: [" + tmp + "]");} + +#define RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(in, test) \ + { \ + if(in.IsNull()) RUNNER_ASSERT_MSG(false, "NULL"); \ + else RUNNER_ASSERT_WHAT_EQUALS(DPL::ToUTF8String(*in),test);\ + } + +RUNNER_TEST_GROUP_INIT(DAO) + +/* +Name: property_dao_get_lists +Description: tests returning list of properties for given id +Expected: data received should match those, which were inserted in prepare script +*/ +RUNNER_TEST(property_dao_get_lists) +{ + {//property list + std::map prefsMap; + prefsMap.insert(std::pair(2000, 2)); + prefsMap.insert(std::pair(2001, 1)); + prefsMap.insert(std::pair(2002, 2)); + prefsMap.insert(std::pair(1, 0)); //no widget + + FOREACH(it, prefsMap) { + PropertyDAOReadOnly::WidgetPreferenceList prefs = + PropertyDAOReadOnly::GetPropertyList(it->first); + RUNNER_ASSERT(prefs.size() == it->second); + } + } + + {//property key list + WidgetPropertyKeyList orig_2000; + orig_2000.push_back(DPL::FromUTF8String("key1_for_2000")); + orig_2000.push_back(DPL::FromUTF8String("key2_for_2000")); + + WidgetPropertyKeyList orig_2001; + orig_2001.push_back(DPL::FromUTF8String("key1_for_2001")); + + WidgetPropertyKeyList orig_2002; + orig_2002.push_back(DPL::FromUTF8String("key1_for_2002")); + orig_2002.push_back(DPL::FromUTF8String("key2_for_2002")); + + std::map prefsKeyMap; + prefsKeyMap.insert(std::pair( + 2000, &orig_2000)); + prefsKeyMap.insert(std::pair( + 2001, &orig_2001)); + prefsKeyMap.insert(std::pair( + 2002, &orig_2002)); + + FOREACH(it_out, prefsKeyMap) { + WidgetPropertyKeyList got = PropertyDAOReadOnly::GetPropertyKeyList( + it_out->first); + RUNNER_ASSERT(got.size() == it_out->second->size()); + //TODO + // FOREACH(it_in, got) + // { + // RUNNER_ASSERT(it_out->second. + // } + } + } +} + +/* +Name: property_dao_set_update_remove +Description: tests set new property for widget, updating property and removing it +Expected: given operation should works +*/ +RUNNER_TEST(property_dao_set_update_remove) +{ + WidgetPropertyKeyList keys = PropertyDAOReadOnly::GetPropertyKeyList(2000); + + //ADD + PropertyDAO::SetProperty(2000, + DPL::FromUTF8String("new_key"), + DPL::FromUTF8String("new_value1")); + + RUNNER_ASSERT_MSG( + keys.size() + 1 == PropertyDAOReadOnly::GetPropertyKeyList(2000).size(), + "new property not added"); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL( + PropertyDAOReadOnly::GetPropertyValue(2000, + DPL::FromUTF8String("new_key")), + "new_value1"); + + //UPDATE + PropertyDAO::SetProperty(2000, + DPL::FromUTF8String("new_key"), + DPL::FromUTF8String("new_value2")); + RUNNER_ASSERT_MSG( + keys.size() + 1 == PropertyDAOReadOnly::GetPropertyKeyList(2000).size(), + "new property not added"); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL( + PropertyDAOReadOnly::GetPropertyValue(2000, + DPL::FromUTF8String("new_key")), + "new_value2"); + + //REMOVE + PropertyDAO::RemoveProperty(2000, DPL::FromUTF8String("new_key")); + + RUNNER_ASSERT_MSG( + keys.size() == PropertyDAOReadOnly::GetPropertyKeyList(2000).size(), + "property not removed"); + +} + +/* +Name: property_dao_get_value +Description: tests if properties can be received from database +Expected: value, which were inserted before test, should be present +*/ +RUNNER_TEST(property_dao_get_value) +{ + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL( + PropertyDAOReadOnly::GetPropertyValue( + 2000, DPL::FromUTF8String("key1_for_2000")), + "value_for_key1_2000"); + + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL( + PropertyDAOReadOnly::GetPropertyValue( + 2000, DPL::FromUTF8String("key2_for_2000")), + "value_for_key2_2000"); +} + +#undef RUNNER_ASSERT_WHAT_EQUALS diff --git a/tests/dao/TestCases_WidgetDAO.cpp b/tests/dao/TestCases_WidgetDAO.cpp new file mode 100644 index 0000000..4964038 --- /dev/null +++ b/tests/dao/TestCases_WidgetDAO.cpp @@ -0,0 +1,980 @@ +/* + * 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 TestCases_WidgetDAO.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains tests for widget dao class. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace WrtDB; + +namespace { + +class WacSecurityMock : public WrtDB::IWacSecurity +{ +public: + WacSecurityMock() : + mRecognized(false), + mDistributorSigned(false), + mWacSigned(false) + { + } + + virtual const WidgetCertificateDataList& getCertificateList() const + { + return mList; + } + + virtual bool isRecognized() const { return mRecognized; } + virtual bool isDistributorSigned() const { return mDistributorSigned; } + virtual bool isWacSigned() const { return mWacSigned; } + virtual void getCertificateChainList(CertificateChainList& /*lst*/) const {} + virtual void getCertificateChainList(CertificateChainList& /*lst*/, + CertificateSource source) const {} + + WrtDB::WidgetCertificateDataList& getCertificateListRef() + { + return mList; + } + + void setRecognized(bool recognized) { mRecognized = recognized; } + void setDistributorSigned(bool distributorSigned) + { + mDistributorSigned = distributorSigned; + } + void setWacSigned(bool wacSigned) { mWacSigned = wacSigned; } + +private: + WrtDB::WidgetCertificateDataList mList; + // author signature verified + bool mRecognized; + // known distribuor + bool mDistributorSigned; + // distributor is wac + bool mWacSigned; + +}; + +WidgetPkgName _registerWidget(const WidgetRegisterInfo& regInfo, + const IWacSecurity& sec, + int line) +{ + WidgetPkgName pkgname; + Try { + auto previous = WidgetDAO::getPkgnameList(); + + // register widget + pkgname = WidgetDAO::registerWidgetGenerateTizenId(regInfo, sec); + + RUNNER_ASSERT_MSG(!pkgname.empty(), + "(called from line " << line << ")"); + + auto current = WidgetDAO::getPkgnameList(); + RUNNER_ASSERT_MSG(previous.size()+1 == current.size(), + "(called from line " << line << ")"); + + RUNNER_ASSERT_MSG(WidgetDAO::isWidgetInstalled(pkgname), + "(called from line " << line << " pkgname: " << pkgname << ")"); + } + Catch (WidgetDAO::Exception::AlreadyRegistered) { + RUNNER_ASSERT_MSG( + false, + "Unexpected exception (called from line " << line << ")"); + } + return pkgname; +} + +#define REGISTER_WIDGET(regInfo, sec) _registerWidget((regInfo),(sec), __LINE__) + +} // namespace + +// Widgets used <2300,2500), 2000, 2001, 2002, 2003 + +#define RUNNER_ASSERT_WHAT_EQUALS(in, test) \ + {std::string tmp(in); \ + RUNNER_ASSERT_MSG(tmp == test, "Equals: [" + tmp + "]");} + +#define RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(in, test) \ + { \ + if(in.IsNull()) RUNNER_ASSERT_MSG(false, "NULL"); \ + else RUNNER_ASSERT_WHAT_EQUALS(DPL::ToUTF8String(*in),test);\ + } + +#define RUNNER_ASSERT_WHAT_EQUALS_OPTIONALINT(in, test) \ + { \ + if(in.IsNull()) RUNNER_ASSERT_MSG(false, "NULL"); \ + else RUNNER_ASSERT_MSG(*in == test, "Equals: [" + *in + "]"); \ + } + +RUNNER_TEST_GROUP_INIT(DAO) + +//2300 +/* +Name: widget_dao_test_register_widget_empty_strings +Description: Tests registeration of new widget with empty values +Expected: widget should be registered in database +*/ +RUNNER_TEST(widget_dao_test_register_widget_empty_strings) +{ + WidgetRegisterInfo regInfo; + + //ext info + regInfo.shareHref = ""; + + //info + regInfo.configInfo.widget_id = DPL::FromUTF8String(""); + regInfo.configInfo.version = DPL::FromUTF8String(""); + regInfo.configInfo.width = 10; + regInfo.configInfo.height = 10; + regInfo.configInfo.authorName = DPL::FromUTF8String(""); + regInfo.configInfo.authorEmail = DPL::FromUTF8String(""); + regInfo.configInfo.authorHref = DPL::FromUTF8String(""); + regInfo.baseFolder = ""; + //TODO authenticated, etc... + regInfo.configInfo.flashNeeded = false; + regInfo.configInfo.minVersionRequired = DPL::FromUTF8String("1.0"); + regInfo.configInfo.backSupported = true; + + //loc info + ConfigParserData::LocalizedData locData; + locData.name = DPL::FromUTF8String(""); + locData.shortName = DPL::FromUTF8String(""); + locData.description = DPL::FromUTF8String(""); + locData.license = DPL::FromUTF8String(""); + locData.licenseFile = DPL::FromUTF8String(""); + locData.licenseHref = DPL::FromUTF8String(""); + regInfo.configInfo.localizedDataSet.insert( + std::make_pair(DPL::FromUTF8String("en"),locData)); + + //userAgentLoc + + //icons + ConfigParserData::Icon icon(DPL::FromUTF8String("")); + icon.width = 10; + icon.height = 10; + LocaleSet locs; + locs.insert(DPL::FromUTF8String("en")); + WidgetRegisterInfo::LocalizedIcon locIcon(icon,locs); + regInfo.localizationData.icons.push_back(locIcon); + + //start file + WidgetRegisterInfo::StartFileProperties prop; + prop.encoding = DPL::FromUTF8String(""); + prop.type = DPL::FromUTF8String(""); + WidgetRegisterInfo::LocalizedStartFile file; + file.path = DPL::FromUTF8String(""); + file.propertiesForLocales.insert( + std::make_pair(DPL::FromUTF8String("en"), prop)); + regInfo.localizationData.startFiles.push_back(file); + + //widget pref + ConfigParserData::Preference pref(DPL::FromUTF8String(""),false); + pref.value = DPL::FromUTF8String(""); + regInfo.configInfo.preferencesList.insert(pref); + + //widget feature + ConfigParserData::Feature feat(DPL::FromUTF8String(""),false); + ConfigParserData::Param par(DPL::FromUTF8String((""))); + par.value = DPL::FromUTF8String(""); + feat.paramsList.insert(par); + regInfo.configInfo.featuresList.insert(feat); + + //win modes + regInfo.configInfo.windowModes.insert(DPL::FromUTF8String("")); + + //WARP info + ConfigParserData::AccessInfo access(DPL::FromUTF8String(""),true); + regInfo.configInfo.accessInfoSet.insert(access); + + //certificates + WidgetCertificateData cert; + cert.owner = WidgetCertificateData::AUTHOR; + cert.type = WidgetCertificateData::ROOT; + cert.chainId = 1; + cert.strMD5Fingerprint = ""; + cert.strSHA1Fingerprint = ""; + cert.strCommonName = DPL::FromUTF8String(""); + + WacSecurityMock security; + security.getCertificateListRef().push_back(cert); + + REGISTER_WIDGET(regInfo,security); +} + +/* +Name: widget_dao_test_register_widget_empty_strings +Description: Tests possiblity of registering twice same content (different tizenId) +Expected: it should be possible +*/ +RUNNER_TEST(widget_dao_test_twice_install_same_widget) +{ + WacSecurityMock sec; + { + WidgetRegisterInfo regInfo; + REGISTER_WIDGET(regInfo, sec); + } + { + WidgetRegisterInfo regInfo; + REGISTER_WIDGET(regInfo, sec); + } + +} + +/* +Name: widget_dao_test_register_widget_minimum_info +Description: Tests simplest registeration of new widget +Expected: widget should be registered in database +*/ +RUNNER_TEST(widget_dao_test_register_widget_minimum_info) +{ + WacSecurityMock sec; + const std::size_t NUMBER_OF_WIDGETS = 5; + + WidgetPkgName lastPkgname; + + for (std::size_t number = 0; number < NUMBER_OF_WIDGETS; ++number) + { + WidgetRegisterInfo regInfo; + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + lastPkgname = pkgname; + + WidgetDAO dao(pkgname); + //TODO check nulls + } +} + +/* +Name: widget_dao_test_register_widget_info +Description: Tests registeration of many widgets +Expected: all widgets should be registered in database +*/ +RUNNER_TEST(widget_dao_test_register_widget_info) +{ + WacSecurityMock sec; + const std::size_t NUMBER_OF_WIDGETS = 5; + + for (std::size_t number = 0; number < NUMBER_OF_WIDGETS; ++number) + { + std::ostringstream str; + str << "register_info_test_" << number; + + WidgetRegisterInfo regInfo; + regInfo.configInfo.widget_id = DPL::FromUTF8String(str.str()); + regInfo.configInfo.version = DPL::FromUTF8String(str.str()); + regInfo.configInfo.width = 10; + regInfo.configInfo.height = 10; + regInfo.configInfo.authorName = DPL::FromUTF8String(str.str()); + regInfo.configInfo.authorEmail = DPL::FromUTF8String(str.str()); + regInfo.configInfo.authorHref = DPL::FromUTF8String(str.str()); + regInfo.baseFolder = str.str(); //base folder at the end has / + regInfo.configInfo.flashNeeded = false; + //TODO authenticated, etc... + //in wrt-installer: TaskWidgetConfig::fillWidgetConfig: + //regInfo.minVersion = regInfo.configInfo.minVersionRequired + regInfo.minVersion = DPL::FromUTF8String("1.0"); + regInfo.configInfo.backSupported = true; + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getGUID(), str.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getVersion(), str.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getAuthorName(), str.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getAuthorEmail(), str.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getAuthorHref(), str.str()); + RUNNER_ASSERT_WHAT_EQUALS(dao.getBaseFolder(), str.str() + "/"); + RUNNER_ASSERT(dao.getWebkitPluginsRequired() == false); +// RUNNER_ASSERT( +// dao.GetWidgetSecurityDomain() == WacSecurity::Trusted); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getMinimumWacVersion(), "1.0"); + } + +} + +/* +Name: widget_dao_test_register_widget_extended_info +Description: Tests registeration of widget_extended_info +Expected: registeration of extended inforamtion is checked + via existence of backgroudn page value +*/ +RUNNER_TEST(widget_dao_test_register_widget_extended_info) +{ + WacSecurityMock sec; + const std::size_t NUMBER_OF_WIDGETS = 5; + + for (std::size_t number = 0; number < NUMBER_OF_WIDGETS; ++number) + { + std::ostringstream str; + str << "register_ext_info_test_" << number; + + WidgetRegisterInfo regInfo; + +// regInfo.shareHref = str.str(); + regInfo.configInfo.backgroundPage = L"background.html"; + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); +// RUNNER_ASSERT_WHAT_EQUALS(dao.GetShareHref(), str.str()); + + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getBackgroundPage(), + "background.html"); + } +} + +/* +Name: widget_dao_test_register_widget_localized_info +Description: Tests registeration of localized widgets information +Expected: values received by dao should match those which were registered +*/ +RUNNER_TEST(widget_dao_test_register_widget_localized_info) +{ + WacSecurityMock sec; + const std::size_t NUMBER_OF_WIDGETS = 5; + + for (std::size_t number = 0; number < NUMBER_OF_WIDGETS; ++number) + { + WidgetRegisterInfo regInfo; + std::ostringstream str_en; + std::ostringstream str_pl; + str_en << "register_loc_info_test_en_" << number; + str_pl<< "register_loc_info_test_pl_" << number; + {//EN + ConfigParserData::LocalizedData locDataEn; + locDataEn.name = DPL::FromUTF8String(str_en.str()); + locDataEn.shortName = DPL::FromUTF8String(str_en.str()); + locDataEn.description = DPL::FromUTF8String(str_en.str()); + locDataEn.license = DPL::FromUTF8String(str_en.str()); + locDataEn.licenseFile = DPL::FromUTF8String(str_en.str()); + locDataEn.licenseHref = DPL::FromUTF8String(str_en.str()); + regInfo.configInfo.localizedDataSet.insert( + std::make_pair(DPL::FromUTF8String("en"),locDataEn)); + } + + {//PL + ConfigParserData::LocalizedData locDataPl; + locDataPl.name = DPL::FromUTF8String(str_pl.str()); + locDataPl.shortName = DPL::FromUTF8String(str_pl.str()); + locDataPl.description = DPL::FromUTF8String(str_pl.str()); + locDataPl.license = DPL::FromUTF8String(str_pl.str()); + locDataPl.licenseFile = DPL::FromUTF8String(str_pl.str()); + locDataPl.licenseHref = DPL::FromUTF8String(str_pl.str()); + regInfo.configInfo.localizedDataSet.insert( + std::make_pair(DPL::FromUTF8String("pl"),locDataPl)); + } + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + RUNNER_ASSERT_MSG(dao.getLanguageTags().size() == 2, + "language tags list invalid"); + + {//EN + WidgetLocalizedInfo locInfo = + dao.getLocalizedInfo(DPL::FromUTF8String("en")); + + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.name, + str_en.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.shortName, + str_en.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.description, + str_en.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.license, + str_en.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.licenseHref, + str_en.str()); + } + + {//PL + WidgetLocalizedInfo locInfo = + dao.getLocalizedInfo(DPL::FromUTF8String("pl")); + + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.name, + str_pl.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.shortName, + str_pl.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.description, + str_pl.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.license, + str_pl.str()); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(locInfo.licenseHref, + str_pl.str()); + } + } +} + +/* +Name: widget_dao_test_register_widget_icons +Description: Tests registeration of localized icons information +Expected: values received by dao should match those which were registered + for icon +*/ +RUNNER_TEST(widget_dao_test_register_widget_icons) +{ + WacSecurityMock sec; + WidgetRegisterInfo regInfo; + + ConfigParserData::Icon icon(L"icon1"); + icon.width = 10; + icon.height = 10; + LocaleSet locs; + locs.insert(DPL::FromUTF8String("en")); + WidgetRegisterInfo::LocalizedIcon locIcon(icon,locs); + regInfo.localizationData.icons.push_back(locIcon); + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + WidgetDAOReadOnly::WidgetIconList list = dao.getIconList(); + + RUNNER_ASSERT(list.size() == regInfo.localizationData.icons.size()); + WidgetDAOReadOnly::WidgetIconList::const_iterator it1 = list.begin(); + WidgetRegisterInfo::LocalizedIconList::const_iterator it2 = + regInfo.localizationData.icons.begin(); + for(;it1!=list.end() && it2!=regInfo.localizationData.icons.end(); + ++it1,++it2) + { + RUNNER_ASSERT(it2->height == it1->iconHeight); + RUNNER_ASSERT(it2->width == it1->iconWidth); + RUNNER_ASSERT(it2->src == it1->iconSrc); + RUNNER_ASSERT(it2->availableLocales == locs); + } +} + +/* +Name: widget_dao_test_register_widget_start_files +Description: Tests registeration of localized start files +Expected: no expectations as it should be removed +*/ +RUNNER_TEST(widget_dao_test_register_widget_start_files) +{ + WacSecurityMock sec; + + WidgetRegisterInfo::LocalizedStartFileList files; + WidgetRegisterInfo::StartFilePropertiesForLocalesMap map1; + WidgetRegisterInfo::StartFileProperties prop1; + prop1.encoding = DPL::FromUTF8String("enc1"); + prop1.type = DPL::FromUTF8String("type1"); + + map1.insert(std::make_pair(DPL::FromUTF8String("en"),prop1)); + map1.insert(std::make_pair(DPL::FromUTF8String("pl"),prop1)); + + WidgetRegisterInfo::LocalizedStartFile file1; + WidgetRegisterInfo::LocalizedStartFile file2; + file1.path = DPL::FromUTF8String("path1"); + file1.propertiesForLocales = map1; + file2.path = DPL::FromUTF8String("path2"); + file2.propertiesForLocales = map1; + + files.push_back(file1); + files.push_back(file1); + + WidgetRegisterInfo regInfo; + regInfo.localizationData.startFiles = files; + + REGISTER_WIDGET(regInfo, sec); + + //TODO no getter in WidgetDAO (getter in LocalizedWidgetDAO, + // but it will be removed +} + +/* +Name: widget_dao_test_register_widget_features +Description: Tests registeration of features of widget +Expected: number of features should match (for given widget reginfo) +*/ +RUNNER_TEST(widget_dao_test_register_widget_features) +{ + WacSecurityMock sec; + ConfigParserData::FeaturesList features; + features.insert(ConfigParserData::Feature(DPL::FromUTF8String("f1"),true)); + features.insert(ConfigParserData::Feature(DPL::FromUTF8String("f2"))); + features.insert(ConfigParserData::Feature(DPL::FromUTF8String("f3"), + false)); + + WidgetRegisterInfo regInfo; + FOREACH(it, features) + regInfo.configInfo.featuresList.insert(*it); + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + WidgetFeatureSet out = dao.getFeaturesList(); + RUNNER_ASSERT_MSG(out.size() == features.size(), + "wrong number of features"); +// FOREACH(it, out) +// RUNNER_ASSERT(features.find(*it) != features.end()); +} + +/* +Name: widget_dao_test_register_widget_security_settings +Description: Tests registeration of dafault values of security settings +Expected: widget should be registered in database. + Returned values should match dafault. +*/ +RUNNER_TEST(widget_dao_test_register_widget_security_settings) +{ + WacSecurityMock sec; + WidgetRegisterInfo regInfo; + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_ON, "SecurityPopupUsage is not deafult on"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ON, "GeolocationUsage is not deafult on"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_ON, "WebNotificationUsage is not deafult on"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ON, "WebDatabaseUsage is not deafult on"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_ON, "FileSystemUsage is not deafult on"); + + dao.setSecurityPopupUsage(WrtDB::SETTINGS_TYPE_OFF); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_OFF, "SecurityPopupUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ON, "GeolocationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_ON, "WebNotificationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ON, "WebDatabaseUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_ON, "FileSystemUsage - wrong value"); + + dao.setGeolocationUsage(WrtDB::SETTINGS_TYPE_ALWAYS_ASK); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_OFF, "SecurityPopupUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "GeolocationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_ON, "WebNotificationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ON, "WebDatabaseUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_ON, "FileSystemUsage - wrong value"); + + dao.setWebNotificationUsage(WrtDB::SETTINGS_TYPE_OFF); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_OFF, "SecurityPopupUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "GeolocationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_OFF, "WebNotificationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ON, "WebDatabaseUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_ON, "FileSystemUsage - wrong value"); + + dao.setWebDatabaseUsage(WrtDB::SETTINGS_TYPE_ALWAYS_ASK); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_OFF, "SecurityPopupUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "GeolocationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_OFF, "WebNotificationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "WebDatabaseUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_ON, "FileSystemUsage - wrong value"); + + dao.setFileSystemUsage(WrtDB::SETTINGS_TYPE_OFF); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_OFF, "SecurityPopupUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "GeolocationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_OFF, "WebNotificationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "WebDatabaseUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_OFF, "FileSystemUsage - wrong value"); + + dao.setFileSystemUsage(WrtDB::SETTINGS_TYPE_ON); + RUNNER_ASSERT_MSG(dao.getSecurityPopupUsage() == WrtDB::SETTINGS_TYPE_OFF, "SecurityPopupUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getGeolocationUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "GeolocationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebNotificationUsage() == WrtDB::SETTINGS_TYPE_OFF, "WebNotificationUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getWebDatabaseUsage() == WrtDB::SETTINGS_TYPE_ALWAYS_ASK, "WebDatabaseUsage - wrong value"); + RUNNER_ASSERT_MSG(dao.getFileSystemUsage() == WrtDB::SETTINGS_TYPE_ON, "FileSystemUsage - wrong value"); +} + +/* +Name: widget_dao_test_register_widget_win_modes +Description: Tests registeration of window modes +Expected: all modes should be returned from dao +*/ +RUNNER_TEST(widget_dao_test_register_widget_win_modes) +{ + WacSecurityMock sec; + std::set modes; + modes.insert(DPL::FromUTF8String("full")); + modes.insert(DPL::FromUTF8String("window")); + + WidgetRegisterInfo regInfo; + + FOREACH(it, modes) + regInfo.configInfo.windowModes.insert(*it); + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + std::list wins = dao.getWindowModes(); + RUNNER_ASSERT_MSG(modes.size() == wins.size(), + "wrong number of window modes"); + FOREACH(it, wins) + RUNNER_ASSERT(modes.find(*it) != modes.end()); +} + +/* +Name: widget_dao_test_register_widget_warp_info +Description: Tests registeration of access info iris +Expected: all access info iris should be returned from dao +*/ +RUNNER_TEST(widget_dao_test_register_widget_warp_info) +{ + WacSecurityMock sec; + ConfigParserData::AccessInfoSet orig; + orig.insert(ConfigParserData::AccessInfo(DPL::FromUTF8String("iri1"), + true)); + orig.insert(ConfigParserData::AccessInfo(DPL::FromUTF8String("iri2"), + false)); + orig.insert(ConfigParserData::AccessInfo(DPL::FromUTF8String("iri3"), + true)); + + WidgetRegisterInfo regInfo; + FOREACH(it, orig) + regInfo.configInfo.accessInfoSet.insert(*it); + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + + WidgetAccessInfoList out; + dao.getWidgetAccessInfo(out); + RUNNER_ASSERT_MSG(out.size() == orig.size(), + "wrong number of access info elem"); + FOREACH(it, out){ + ConfigParserData::AccessInfo tmp(it->strIRI,it->bSubDomains); + RUNNER_ASSERT(orig.find(tmp) != orig.end()); + } +} + +/* +Name: widget_dao_test_register_widget_certificates +Description: Tests registeration of widget certificates +Expected: all certificates should be returned from dao + and should contain inserted data +*/ +RUNNER_TEST(widget_dao_test_register_widget_certificates) +{ + WacSecurityMock sec; + WidgetRegisterInfo regInfo; + + WidgetCertificateData cert; + cert.owner = WidgetCertificateData::AUTHOR; + cert.type = WidgetCertificateData::ROOT; + cert.chainId = 1; + cert.strMD5Fingerprint = "md5"; + cert.strSHA1Fingerprint = "sha1"; + cert.strCommonName = DPL::FromUTF8String("common name"); + + WidgetCertificateDataList& certListRef = sec.getCertificateListRef(); + certListRef.push_back(cert); + + // register widget + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + + // certificates + WidgetCertificateDataList recList = dao.getCertificateDataList(); + RUNNER_ASSERT(recList.size() == certListRef.size()); + + auto recListIt = recList.begin(); + auto certListIt = certListRef.begin(); + for(;recListIt != recList.end() && certListIt != certListRef.end(); + ++recListIt,++certListIt) + { + RUNNER_ASSERT(recListIt->chainId == certListIt->chainId); + RUNNER_ASSERT(recListIt->owner == certListIt->owner); + RUNNER_ASSERT(recListIt->strCommonName == certListIt->strCommonName); + RUNNER_ASSERT(recListIt->strMD5Fingerprint == + certListIt->strMD5Fingerprint); + RUNNER_ASSERT(recListIt->strSHA1Fingerprint == + certListIt->strSHA1Fingerprint); + RUNNER_ASSERT(recListIt->type == certListIt->type); + } + + // fingerprints + RUNNER_ASSERT(dao.getKeyFingerprints(WidgetCertificateData::DISTRIBUTOR, + WidgetCertificateData::ENDENTITY).empty()); + RUNNER_ASSERT(dao.getKeyFingerprints(WidgetCertificateData::AUTHOR, + WidgetCertificateData::ENDENTITY).empty()); + RUNNER_ASSERT(dao.getKeyFingerprints(WidgetCertificateData::DISTRIBUTOR, + WidgetCertificateData::ROOT).empty()); + + FingerPrintList fingerprints = dao.getKeyFingerprints( + WidgetCertificateData::AUTHOR, + WidgetCertificateData::ROOT); + + RUNNER_ASSERT(fingerprints.size() == certListRef.size()*2); + FOREACH(it, certListRef) + { + auto md5 = std::find(fingerprints.begin(), + fingerprints.end(), + it->strMD5Fingerprint); + RUNNER_ASSERT(md5 != fingerprints.end()); + + auto sha = std::find(fingerprints.begin(), + fingerprints.end(), + it->strSHA1Fingerprint); + RUNNER_ASSERT(sha != fingerprints.end()); + } + + // common names + RUNNER_ASSERT(dao.getKeyCommonNameList(WidgetCertificateData::DISTRIBUTOR, + WidgetCertificateData::ENDENTITY).empty()); + RUNNER_ASSERT(dao.getKeyCommonNameList(WidgetCertificateData::AUTHOR, + WidgetCertificateData::ENDENTITY).empty()); + RUNNER_ASSERT(dao.getKeyCommonNameList(WidgetCertificateData::DISTRIBUTOR, + WidgetCertificateData::ROOT).empty()); + + FingerPrintList commonNames = dao.getKeyCommonNameList( + WidgetCertificateData::AUTHOR, + WidgetCertificateData::ROOT); + + RUNNER_ASSERT(commonNames.size() == certListRef.size()); + FOREACH(it, certListRef) + { + auto cn = std::find(commonNames.begin(), + commonNames.end(), + DPL::ToUTF8String(it->strCommonName)); + RUNNER_ASSERT(cn != commonNames.end()); + } +} + +/* +Name: widget_dao_test_is_widget_installed +Description: Tests checking if widgets are installed +Expected: installed widgets should be stated as installed +*/ +RUNNER_TEST(widget_dao_test_is_widget_installed) +{ + RUNNER_ASSERT(WidgetDAO::isWidgetInstalled(L"tizenid201")); + + WacSecurityMock sec; + WidgetRegisterInfo regInfo; + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + RUNNER_ASSERT(WidgetDAO::isWidgetInstalled(pkgname)); +} + +/* +Name: widget_dao_test_unregister_widget +Description: Tests unregistering widgets +Expected: widget register informations should be successfully removed +*/ +RUNNER_TEST(widget_dao_test_unregister_widget) +{ + WacSecurityMock sec; + WidgetHandleList handles = WidgetDAO::getHandleList(); + + WidgetRegisterInfo regInfo; + + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO::unregisterWidget(pkgname); + + RUNNER_ASSERT_MSG(handles.size() == WidgetDAO::getHandleList().size(), + "Widget unregister failed"); +} + +/* +Name: widget_dao_test_register_or_update_widget +Description: Tests reregistering widgets +Expected: widget should be successfully replaced +*/ +RUNNER_TEST(widget_dao_test_register_or_update_widget) +{ + WacSecurityMock sec; + + WidgetRegisterInfo regInfo; + regInfo.configInfo.version = L"1.0"; + regInfo.configInfo.authorName = L"AAA"; + + WidgetRegisterInfo regInfo2; + regInfo2.configInfo.version = L"1.1"; + regInfo2.configInfo.authorName = L"BBB"; + + WrtDB::WidgetPkgName pkgname(L"abcdefghij"); + + //first installation + WidgetDAO::registerWidget(pkgname, regInfo, sec); + RUNNER_ASSERT_MSG(WidgetDAO::isWidgetInstalled(pkgname), "Widget is not registered"); + + //success full update + WidgetDAO::registerOrUpdateWidget(pkgname, regInfo2, sec); + RUNNER_ASSERT_MSG(WidgetDAO::isWidgetInstalled(pkgname), "Widget is not reregistered"); + WidgetDAO dao(pkgname); + RUNNER_ASSERT_MSG(*dao.getVersion() == L"1.1", "Data widget was not updated"); + RUNNER_ASSERT_MSG(*dao.getAuthorName() == L"BBB", "Data widget was not updated"); + + WidgetDAO::unregisterWidget(pkgname); +} + +/* +Name: widget_dao_test_get_widget_pkgname_list +Description: Tests getPkgnameList API for backendlib +Expected: For all position in database should be returned one item in list +*/ +RUNNER_TEST(widget_dao_test_get_widget_pkgname_list) +{ + WidgetPkgNameList pkgnames = WidgetDAO::getPkgnameList(); + RUNNER_ASSERT(pkgnames.size() >= 3); +} + +/* +Name: widget_dao_test_get_widget_list +Description: Tests getPkgnameList API for backendlib +Expected: For all position in database should be returned one item in list + Those item should contain valid pkgname +*/ +RUNNER_TEST(widget_dao_test_get_widget_list) +{ + WidgetDAOReadOnlyList list = WidgetDAOReadOnly::getWidgetList(); + RUNNER_ASSERT(list.size() >= 3); + RUNNER_ASSERT_MSG(!!list.front(), "widget dao exists"); + WidgetDAOReadOnlyPtr dao = list.front(); +} + +/* +Name: widget_dao_test_get_widget_attributes +Description: Tests returning basic widget attributes by dao +Expected: Attributes should match values inserted into database +*/ +RUNNER_TEST(widget_dao_test_get_widget_attributes) +{ + { + WidgetPkgName pkgname = L"tizenid201"; + WidgetDAO dao(pkgname); + + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getGUID(), "w_id_2000"); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getVersion(), "1.0.0"); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getAuthorName(), "a_name_2000"); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getAuthorEmail(), + "a_email_2000"); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getAuthorHref(), "a_href_2000"); + RUNNER_ASSERT_WHAT_EQUALS(dao.getBaseFolder(), "basef_2000/"); + RUNNER_ASSERT(dao.getWebkitPluginsRequired() == true); + RUNNER_ASSERT_WHAT_EQUALS_OPTIONAL(dao.getMinimumWacVersion(), "1.0"); + } +} + +/* +Name: widget_dao_test_localization +Description: Tests inserting and returning localization info +Expected: Values inserted into database should match values received from database +*/ +RUNNER_TEST(widget_dao_test_localization) +{ + WacSecurityMock sec; + + // icon + WidgetRegisterInfo regInfo; + ConfigParserData::Icon icon(L"icon1"); + icon.width = 10; + icon.height = 10; + LocaleSet locs; + locs.insert(DPL::FromUTF8String("en")); + locs.insert(DPL::FromUTF8String("pl")); + WidgetRegisterInfo::LocalizedIcon locIcon(icon,locs); + regInfo.localizationData.icons.push_back(locIcon); + + //start file + WidgetRegisterInfo::StartFileProperties prop_en; + prop_en.encoding = DPL::FromUTF8String("encoding_en"); + prop_en.type = DPL::FromUTF8String("type_en"); + + WidgetRegisterInfo::StartFileProperties prop_pl; + prop_pl.encoding = DPL::FromUTF8String("encoding_pl"); + prop_pl.type = DPL::FromUTF8String("type_pl"); + + WidgetRegisterInfo::LocalizedStartFile file; + file.path = DPL::FromUTF8String("path"); + file.propertiesForLocales.insert( + std::make_pair(DPL::FromUTF8String("en"), prop_en)); + file.propertiesForLocales.insert( + std::make_pair(DPL::FromUTF8String("pl"), prop_pl)); + regInfo.localizationData.startFiles.push_back(file); + + // register widget + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + + WidgetDAO dao(pkgname); + + // check localized icons + WidgetDAO::WidgetLocalizedIconList locList = dao.getLocalizedIconList(); + RUNNER_ASSERT(locList.size() == locs.size()); + + // non-localized icon + WidgetDAO::WidgetIconList list = dao.getIconList(); + int iconId = list.front().iconId; + + // compare every icon with the origin + auto locsIt = locs.begin(); + auto iconIt = locList.begin(); + for(;locsIt!=locs.end() && iconIt!=locList.end();++locsIt,++iconIt) { + RUNNER_ASSERT(iconIt->appId == dao.getHandle()); + RUNNER_ASSERT(iconIt->iconId == iconId); + RUNNER_ASSERT(iconIt->widgetLocale == *locsIt); + } + + // localized start file list + WidgetDAO::LocalizedStartFileList fList = dao.getLocalizedStartFileList(); + RUNNER_ASSERT(fList.size() == file.propertiesForLocales.size()); + + int startFileId = dao.getStartFileList().front().startFileId; + + FOREACH(it,fList) + { + RUNNER_ASSERT(it->appId == dao.getHandle()); + auto propIt = file.propertiesForLocales.find(it->widgetLocale); + RUNNER_ASSERT(propIt != file.propertiesForLocales.end()); + RUNNER_ASSERT(it->encoding == propIt->second.encoding); + RUNNER_ASSERT(it->type == propIt->second.type); + RUNNER_ASSERT(it->startFileId == startFileId); + } +} + +/* +Name: widget_dao_test_wac_security +Description: Tests inserting and returning wac security information +Expected: Values inserted into database should match values received from database +*/ +RUNNER_TEST(widget_dao_test_wac_security) +{ + WacSecurityMock sec; + WidgetRegisterInfo regInfo; + { + // register widget + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + WidgetDAO dao(pkgname); + + RUNNER_ASSERT(!dao.isDistributorSigned()); + RUNNER_ASSERT(!dao.isRecognized()); + RUNNER_ASSERT(!dao.isWacSigned()); + } + sec.setDistributorSigned(true); + sec.setRecognized(true); + sec.setWacSigned(true); + { + // register widget + WidgetPkgName pkgname = REGISTER_WIDGET(regInfo, sec); + WidgetDAO dao(pkgname); + + RUNNER_ASSERT(dao.isDistributorSigned()); + RUNNER_ASSERT(dao.isRecognized()); + RUNNER_ASSERT(dao.isWacSigned()); + } +} + +#undef RUNNER_ASSERT_WHAT_EQUALS diff --git a/tests/dao/tests_dao.cpp b/tests/dao/tests_dao.cpp new file mode 100644 index 0000000..5d0422f --- /dev/null +++ b/tests/dao/tests_dao.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file tests_plugin_dao.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains tests for plugin dao class. + */ + +#include +#include +#include +#include + +int main (int argc, char *argv[]) +{ + int ret = system("/usr/bin/wrt_dao_tests_prepare_db.sh start"); + if (ret != 0) { + LogError("Preparation script has return error: " << ret + << ". Quitting"); + return -1; + } + + WrtDB::WrtDatabase::attachToThreadRW(); + CustomHandlerDB::Interface::attachDatabaseRW(); + + LogInfo("Starting tests"); + int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); + + CustomHandlerDB::Interface::detachDatabase(); + WrtDB::WrtDatabase::detachFromThread(); + + ret = system("/usr/bin/wrt_dao_tests_prepare_db.sh stop"); + if (ret != 0) { + LogError("Finalization script has return error: " << ret); + return -1; + } + return status; +} diff --git a/tests/dao/wrt_dao_tests_prepare_db.sh b/tests/dao/wrt_dao_tests_prepare_db.sh new file mode 100755 index 0000000..4f989f0 --- /dev/null +++ b/tests/dao/wrt_dao_tests_prepare_db.sh @@ -0,0 +1,129 @@ +#!/bin/sh +# 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. +# + +WRT_DB=/opt/dbspace/.wrt.db +WRT_DB_BCK=/tmp/wrt.db_backup + +if [ "x$1" == "xstart" ]; then + echo start; + cp $WRT_DB $WRT_DB_BCK + wrt_commons_create_clean_db.sh; + + #simple plugins + INS_MIN_PLUGINPROP="insert into PluginProperties(PluginPropertiesId, InstallationState, PluginLibraryName" + INS_ALL_PLUGINPROP="insert into PluginProperties(PluginPropertiesId, InstallationState, PluginLibraryName, PluginLibraryPath)" + INS_PLUGIN_OBJECTS="insert into PluginImplementedObjects(PluginObject, PluginPropertiesId)" + + sqlite3 $WRT_DB "${INS_MIN_PLUGINPROP}) VALUES(1, 1, 'plugin1')"; + sqlite3 $WRT_DB "${INS_MIN_PLUGINPROP}, PluginLibraryPath) VALUES(2, 1, 'plugin2', 'path_to_plugin2')"; + sqlite3 $WRT_DB "${INS_MIN_PLUGINPROP}) VALUES(3, 1, 'plugin3')"; + sqlite3 $WRT_DB "${INS_ALL_PLUGINPROP} VALUES(4, 1, 'p4', 'path_to_p4')"; + sqlite3 $WRT_DB "${INS_ALL_PLUGINPROP} VALUES(5, 1, 'p5', 'path_to_p5')"; + + #plugin dependendencies + #sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES(1, )"; + sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES('', 2)"; + sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES('Plugin_3_Object_A', 3)"; + sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES('Plugin_4_Object_A', 4)"; + sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES('Plugin_4_Object_B', 4)"; + sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES('Plugin_4_Object_C', 4)"; + sqlite3 $WRT_DB "${INS_PLUGIN_OBJECTS} VALUES('Plugin_5_Object_A', 5)"; + + + #simple features + INS_ALL_FEATURESLIST="insert into FeaturesList(FeatureUUID, FeatureName, PluginPropertiesId)" + sqlite3 $WRT_DB "${INS_ALL_FEATURESLIST} VALUES(1, 'feature1', 1)"; + sqlite3 $WRT_DB "${INS_ALL_FEATURESLIST} VALUES(2, 'feature2', 4)"; + sqlite3 $WRT_DB "${INS_ALL_FEATURESLIST} VALUES(3, 'feature3', 4)"; + sqlite3 $WRT_DB "${INS_ALL_FEATURESLIST} VALUES(4, 'feature4', 4)"; + + #device capabilities + INS_ALL_DEVICECAPS="insert into DeviceCapabilities(DeviceCapID, DeviceCapName, DeviceCapDefaultValue)" + sqlite3 $WRT_DB "${INS_ALL_DEVICECAPS} VALUES(1, 'devicecap1', 1)"; + sqlite3 $WRT_DB "${INS_ALL_DEVICECAPS} VALUES(2, 'devicecap2', 2)"; + sqlite3 $WRT_DB "${INS_ALL_DEVICECAPS} VALUES(3, 'devicecap3', 3)"; + sqlite3 $WRT_DB "${INS_ALL_DEVICECAPS} VALUES(4, 'devicecap4', 4)"; + + #Widgets + INS_ALL_WIDGETEXT="insert into WidgetExtendedInfo(app_id, share_href, signature_type)" + INS_ALL_WIDGET="insert into WidgetInfo(app_id, widget_id, widget_version, widget_width, widget_height, author_name, author_email, author_href, base_folder, webkit_plugins_required, recognized, wac_signed, distributor_signed, min_version, pkgname)" + INS_ALL_WIDGET_LOC="insert into LocalizedWidgetInfo(app_id, widget_locale, widget_name, widget_shortname, widget_description, widget_license, widget_license_file, widget_license_href)" + INS_ALL_WIDGET_ICONS="insert into WidgetIcon(app_id, icon_src, icon_width, icon_height)" + INS_ALL_WIDGET_LOC_ICONS="insert into WidgetLocalizedIcon(app_id, icon_id, widget_locale)" + INS_ALL_WIDGET_STARTFILE="insert into WidgetStartFile(app_id, src)" + INS_ALL_WIDGET_LOC_STARTFILE="insert into WidgetLocalizedStartFile(app_id, start_file_id, widget_locale, type, encoding)" + INS_ALL_WIDGET_DEFPREF="insert into WidgetDefaultPreference(app_id, key_name, key_value, readonly)" + INS_ALL_WIDGET_PREF="insert into WidgetPreference(pkgname, key_name, key_value, readonly)" + INS_ALL_WIDGET_FEATURE="insert into WidgetFeature(app_id, name, required)" + INS_ALL_WIDGET_FEATURE_PARAM="insert into FeatureParam(widget_feature_id, name, value)" + INS_ALL_WIDGET_WINMODES="insert into WidgetWindowModes(app_id, window_mode)" + INS_ALL_WIDGET_WARP="insert into WidgetWARPInfo(app_id, iri, subdomain_access)" + INS_ALL_WIDGET_CERT="insert into WidgetCertificateFingerprint(app_id, owner, chainid, type, md5_fingerprint, sha1_fingerprint, common_name)" + INS_ALL_WIDGET_POWDERLEV="insert into PowderLevels(app_id, category, level)" + INS_ALL_WIDGET_POWDERLEV_CONT="insert into PowderLevelContexts(levelid, context)" + + + sqlite3 $WRT_DB "${INS_ALL_WIDGET} VALUES(2000, 'w_id_2000', '1.0.0', 100, 200, 'a_name_2000', 'a_email_2000', 'a_href_2000', 'basef_2000', 1, 1, 1, 1, '1.0', 'tizenid201')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET} VALUES(2001, 'w_id_2001', '2.0.0', 100, 200, 'a_name_2001', 'a_email_2001', 'a_href_2001', 'basef_2001', 1, 1, 1, 1, '0.5', 'tizenid202')"; + sqlite3 $WRT_DB "insert into WidgetInfo(app_id, back_supported, pkgname) VALUES(2002, 0, 'tizenid203')"; + sqlite3 $WRT_DB "insert into WidgetInfo(app_id, back_supported, pkgname) VALUES(2003, 0, 'tizenid204')"; # for properties tests + + sqlite3 $WRT_DB "${INS_ALL_WIDGETEXT} VALUES(2000, 'share_href_2000', 0)"; + sqlite3 $WRT_DB "${INS_ALL_WIDGETEXT} VALUES(2001, 'share_href_2001', 0)"; + sqlite3 $WRT_DB "insert into WidgetExtendedInfo(app_id) VALUES(2002)"; + sqlite3 $WRT_DB "insert into WidgetExtendedInfo(app_id) VALUES(2003)"; + + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC} VALUES(2000, 'en', 'w_name_2000_en', 'w_shortname_2000_en', 'w_desc_2000_en', 'w_lic_2000_en', 'w_licf_2000_en', 'w_lic_href_2000_en')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC} VALUES(2000, 'pl', 'w_name_2000_pl', 'w_shortname_2000_pl', 'w_desc_2000_pl', 'w_lic_2000_pl', 'w_licf_2000_pl', 'w_lic_href_2000_pl')"; + sqlite3 $WRT_DB "insert into LocalizedWidgetInfo(app_id, widget_locale) VALUES(2002, 'en')"; + sqlite3 $WRT_DB "insert into LocalizedWidgetInfo(app_id, widget_locale) VALUES(2003, 'en')"; + + sqlite3 $WRT_DB "${INS_ALL_WIDGET_ICONS} VALUES(2000, 'icon_src_2000', 50, 50)"; + sqlite3 $WRT_DB "insert into WidgetIcon(app_id, icon_src) VALUES(2002, 'icon_src_2002')"; + + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC_ICONS} VALUES(2000, 1, 'en')"; + + sqlite3 $WRT_DB "${INS_ALL_WIDGET_STARTFILE} VALUES(2000, 'start_file_2000')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_STARTFILE} VALUES(2001, 'start_file_2001')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_STARTFILE} VALUES(2002, 'start_file_2002')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_STARTFILE} VALUES(2003, 'start_file_2003')"; + + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC_STARTFILE} VALUES(2000, 1, 'en', '', '')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC_STARTFILE} VALUES(2001, 2, 'en', '', '')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC_STARTFILE} VALUES(2002, 3, 'en', '', '')"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_LOC_STARTFILE} VALUES(2003, 4, 'en', '', '')"; + + #widget properties + sqlite3 $WRT_DB "${INS_ALL_WIDGET_PREF} VALUES('tizenid201', 'key1_for_2000', 'value_for_key1_2000', 0)"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_PREF} VALUES('tizenid201', 'key2_for_2000', 'value_for_key2_2000', 0)"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_PREF} VALUES('tizenid202', 'key1_for_2001', 'value1_for_key_2001', 1)"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_PREF} VALUES('tizenid203', 'key1_for_2002', 'value1_for_key_2002', 0)"; + sqlite3 $WRT_DB "${INS_ALL_WIDGET_PREF} VALUES('tizenid203', 'key2_for_2002', 'value2_for_key_2002', 1)"; + + #create if not exists and fix autoincrement value + sqlite3 $WRT_DB "INSERT INTO WidgetInfo(pkgname) VALUES('temp')"; + sqlite3 $WRT_DB "DELETE FROM WidgetInfo WHERE pkgname = 'temp'"; + sqlite3 $WRT_DB "UPDATE sqlite_sequence SET seq = 2004 WHERE name = 'WidgetInfo'"; + + exit $? + +elif [ "x$1" == "xstop" ]; then + echo stop; + cp $WRT_DB_BCK $WRT_DB + exit $? +else + exit 1 +fi diff --git a/tests/dpl/CMakeLists.txt b/tests/dpl/CMakeLists.txt new file mode 100644 index 0000000..b2348aa --- /dev/null +++ b/tests/dpl/CMakeLists.txt @@ -0,0 +1,28 @@ +# 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 Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +SET(TESTS_DPL_DIR "${TESTS_DIR}/dpl") + +ADD_SUBDIRECTORY(core) +ADD_SUBDIRECTORY(db) +ADD_SUBDIRECTORY(dbus) +ADD_SUBDIRECTORY(event) +#ADD_SUBDIRECTORY(localization) TODO localization mockups need to be fixed +ADD_SUBDIRECTORY(utils) diff --git a/tests/dpl/README b/tests/dpl/README new file mode 100644 index 0000000..6641953 --- /dev/null +++ b/tests/dpl/README @@ -0,0 +1,13 @@ +Unit tests for dpl library functionality. +There are 6 binaries: dpl-dbus-test-service, dpl-tests-core, dpl-tests-db, +dpl-tests-dbus, dpl-tests-event, dpl-tests-utils. +All binaries are using our test framework - it allows to use different types of +output. Text output shows results on console - green passed. +To run: +1. Install wrt-extra on target +2. Run for f in /usr/bin/dpl-tests-*; do $f --output=text; done + +Automatic: YES +Included in Daily Build: YES (http://build01.sprc.samsung.pl/browse/LINUXNGWAP-INT) +Included in Gerrit Builds: YES (http://build01.sprc.samsung.pl/browse/LINUXNGWAP-GERRIT) +Number of test cases: 151 \ No newline at end of file diff --git a/tests/dpl/core/.swp b/tests/dpl/core/.swp new file mode 100644 index 0000000000000000000000000000000000000000..e25a05b48227470164a5b546ec0bb135d5e190aa GIT binary patch literal 12288 zcmeI%ze>YE90%~Ln~N6p0qP%cEBzygqv+yLaH;EY&0U&<^m1MGIE2;hgAC*2+v2bf#IC7bX!#rnCWd7AgCEw=r#0 kM9HK-7KA2Ms=C4l59(+mT%Vs7stBq=N~iLC)IBEn07(a^&j0`b literal 0 HcmV?d00001 diff --git a/tests/dpl/core/CMakeLists.txt b/tests/dpl/core/CMakeLists.txt new file mode 100644 index 0000000..48d2c93 --- /dev/null +++ b/tests/dpl/core/CMakeLists.txt @@ -0,0 +1,61 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +# +# Test files +# +# Define all DPL tests sources. +# Runner is responsible for runnint it all and +# generating proper output files +# + +SET(TARGET_NAME "dpl-tests-core") + +# Set DPL tests sources +SET(DPL_TESTS_CORE_SOURCES + ${TESTS_DPL_DIR}/core/main.cpp + ${TESTS_DPL_DIR}/core/test_address.cpp + ${TESTS_DPL_DIR}/core/test_binary_queue.cpp + ${TESTS_DPL_DIR}/core/test_foreach.cpp + ${TESTS_DPL_DIR}/core/test_fast_delegate.cpp + ${TESTS_DPL_DIR}/core/test_log_unhandled_exception.cpp + ${TESTS_DPL_DIR}/core/test_once.cpp + ${TESTS_DPL_DIR}/core/test_serialization.cpp + ${TESTS_DPL_DIR}/core/test_scoped_array.cpp + ${TESTS_DPL_DIR}/core/test_scoped_close.cpp + ${TESTS_DPL_DIR}/core/test_scoped_fclose.cpp + ${TESTS_DPL_DIR}/core/test_scoped_free.cpp + ${TESTS_DPL_DIR}/core/test_scoped_ptr.cpp + ${TESTS_DPL_DIR}/core/test_semaphore.cpp + ${TESTS_DPL_DIR}/core/test_shared_ptr.cpp + ${TESTS_DPL_DIR}/core/test_string.cpp + ${TESTS_DPL_DIR}/core/test_thread.cpp + ${TESTS_DPL_DIR}/core/test_type_list.cpp + ${TESTS_DPL_DIR}/core/test_zip_input.cpp +) + +WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_NAME} ${TARGET_DPL_EFL}) +WRT_TEST_BUILD(${TARGET_NAME} ${DPL_TESTS_CORE_SOURCES}) +WRT_TEST_INSTALL(${TARGET_NAME}) + +INSTALL(FILES + ${TESTS_DPL_DIR}/core/data/sample.zip + DESTINATION /opt/share/wrt/wrt-commons/tests/core + ) diff --git a/tests/dpl/core/DESCRIPTION b/tests/dpl/core/DESCRIPTION new file mode 100644 index 0000000..48e5394 --- /dev/null +++ b/tests/dpl/core/DESCRIPTION @@ -0,0 +1,2 @@ +!!!options!!! stop +Test code diff --git a/tests/dpl/core/data/sample.zip b/tests/dpl/core/data/sample.zip new file mode 100644 index 0000000000000000000000000000000000000000..02417d89316a2de5eb658decfa83dc60e366c8c7 GIT binary patch literal 174 zcmWIWW@h1H0D-h9e>XlTKgobc3Fe?N{`GRn11vdjD z%L`_pLJ(1sT3iy~&B!FjjLRemkOd5kK)j?8#6mWg6=E)$nE~FcY#^14Ko|g|JwO}= E0Bw;T(f|Me literal 0 HcmV?d00001 diff --git a/tests/dpl/core/main.cpp b/tests/dpl/core/main.cpp new file mode 100644 index 0000000..42ffe3a --- /dev/null +++ b/tests/dpl/core/main.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file main.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of main + */ +#include + +int main(int argc, char *argv[]) +{ + return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); +} + diff --git a/tests/dpl/core/test_address.cpp b/tests/dpl/core/test_address.cpp new file mode 100644 index 0000000..7aff2df --- /dev/null +++ b/tests/dpl/core/test_address.cpp @@ -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. + */ +/* + * @file test_address.cpp + * @author Tomasz Swierczek (t.swierczek@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test address + */ +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(Address_InitialEmpty) +{ + DPL::Address address; + RUNNER_ASSERT(address.ToString() == ":0"); +} + +RUNNER_TEST(Address_InitialAddress) +{ + DPL::Address address("www.sample.com"); + RUNNER_ASSERT(address.ToString() == "www.sample.com:0"); +} + +RUNNER_TEST(Address_InitialAddressPort) +{ + DPL::Address address("www.somewhere.com", 8080); + RUNNER_ASSERT(address.ToString() == "www.somewhere.com:8080"); +} + +RUNNER_TEST(Address_Getters) +{ + DPL::Address address("www.somewhere.com", 8080); + RUNNER_ASSERT(address.GetAddress() == "www.somewhere.com"); + RUNNER_ASSERT(address.GetPort() == 8080); +} diff --git a/tests/dpl/core/test_binary_queue.cpp b/tests/dpl/core/test_binary_queue.cpp new file mode 100644 index 0000000..d955aab --- /dev/null +++ b/tests/dpl/core/test_binary_queue.cpp @@ -0,0 +1,357 @@ +/* + * 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_binary_queue.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test binary queue + */ +#include +#include +RUNNER_TEST_GROUP_INIT(DPL) + +inline std::string BinaryQueueToString(const DPL::BinaryQueue &queue) +{ + char *buffer = new char[queue.Size()]; + queue.Flatten(buffer, queue.Size()); + std::string result = std::string(buffer, buffer + queue.Size()); + delete [] buffer; + return result; +} + +RUNNER_TEST(BinaryQueue_InitialEmpty) +{ + DPL::BinaryQueue queue; + RUNNER_ASSERT(queue.Empty() == true); +} + +RUNNER_TEST(BinaryQueue_InitialSize) +{ + DPL::BinaryQueue queue; + RUNNER_ASSERT(queue.Size() == 0); +} + +RUNNER_TEST(BinaryQueue_InitialCopy) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy = queue; + + RUNNER_ASSERT(copy.Size() == 0); +} + +RUNNER_TEST(BinaryQueue_InitialConsumeZero) +{ + DPL::BinaryQueue queue; + queue.Consume(0); +} + +RUNNER_TEST(BinaryQueue_InitialFlattenConsumeZero) +{ + DPL::BinaryQueue queue; + queue.FlattenConsume(NULL, 0); +} + +RUNNER_TEST(BinaryQueue_InitialFlattenZero) +{ + DPL::BinaryQueue queue; + queue.Flatten(NULL, 0); +} + +RUNNER_TEST(BinaryQueue_InitialConsumeOne) +{ + DPL::BinaryQueue queue; + + Try + { + queue.Consume(1); + } + Catch (DPL::BinaryQueue::Exception::OutOfData) + { + return; + } + + RUNNER_FAIL; +} + +RUNNER_TEST(BinaryQueue_InitialFlattenConsumeOne) +{ + DPL::BinaryQueue queue; + + Try + { + char data; + queue.FlattenConsume(&data, 1); + } + Catch (DPL::BinaryQueue::Exception::OutOfData) + { + return; + } + + RUNNER_FAIL; +} + +RUNNER_TEST(BinaryQueue_InitialFlattenOne) +{ + DPL::BinaryQueue queue; + + Try + { + char data; + queue.Flatten(&data, 1); + } + Catch (DPL::BinaryQueue::Exception::OutOfData) + { + return; + } + + RUNNER_FAIL; +} + +RUNNER_TEST(BinaryQueue_ZeroCopyFrom) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + copy.AppendCopyFrom(queue); + RUNNER_ASSERT(queue.Empty()); +} + +RUNNER_TEST(BinaryQueue_ZeroMoveFrom) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + copy.AppendMoveFrom(queue); + RUNNER_ASSERT(queue.Empty()); +} + +RUNNER_TEST(BinaryQueue_ZeroCopyTo) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + queue.AppendCopyTo(copy); + RUNNER_ASSERT(queue.Empty()); +} + +RUNNER_TEST(BinaryQueue_InsertSingleCharacters) +{ + DPL::BinaryQueue queue; + + queue.AppendCopy("a", 1); + queue.AppendCopy("b", 1); + queue.AppendCopy("c", 1); + queue.AppendCopy("d", 1); + + RUNNER_ASSERT(queue.Size() == 4); + RUNNER_ASSERT(BinaryQueueToString(queue) == "abcd"); +} + +RUNNER_TEST(BinaryQueue_Consume) +{ + DPL::BinaryQueue queue; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + RUNNER_ASSERT(queue.Size() == 6); + + queue.Consume(1); + RUNNER_ASSERT(queue.Size() == 5); + RUNNER_ASSERT(BinaryQueueToString(queue) == "bcdef"); + + queue.Consume(2); + RUNNER_ASSERT(queue.Size() == 3); + RUNNER_ASSERT(BinaryQueueToString(queue) == "def"); + + queue.Consume(1); + RUNNER_ASSERT(queue.Size() == 2); + RUNNER_ASSERT(BinaryQueueToString(queue) == "ef"); + + queue.Consume(2); + RUNNER_ASSERT(queue.Size() == 0); + RUNNER_ASSERT(BinaryQueueToString(queue) == ""); +} + +RUNNER_TEST(BinaryQueue_Flatten) +{ + DPL::BinaryQueue queue; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + queue.AppendCopy("g", 1); + + RUNNER_ASSERT(queue.Size() == 7); + + RUNNER_ASSERT(BinaryQueueToString(queue) == "abcdefg"); +} + +RUNNER_TEST(BinaryQueue_FlattenConsume) +{ + DPL::BinaryQueue queue; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + RUNNER_ASSERT(queue.Size() == 6); + + char buffer[7] = { '\0' }; + queue.FlattenConsume(buffer, 3); + + RUNNER_ASSERT(queue.Size() == 3); + RUNNER_ASSERT(BinaryQueueToString(queue) == "def"); +} + +RUNNER_TEST(BinaryQueue_AppendCopyFrom) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + copy.AppendCopyFrom(queue); + + RUNNER_ASSERT(queue.Size() == 6); + RUNNER_ASSERT(copy.Size() == 6); + RUNNER_ASSERT(BinaryQueueToString(queue) == "abcdef"); + RUNNER_ASSERT(BinaryQueueToString(copy) == "abcdef"); +} + +RUNNER_TEST(BinaryQueue_AppendCopyTo) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + queue.AppendCopyTo(copy); + + RUNNER_ASSERT(queue.Size() == 6); + RUNNER_ASSERT(copy.Size() == 6); + RUNNER_ASSERT(BinaryQueueToString(queue) == "abcdef"); + RUNNER_ASSERT(BinaryQueueToString(copy) == "abcdef"); +} + +RUNNER_TEST(BinaryQueue_AppendMoveFrom) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + copy.AppendMoveFrom(queue); + + RUNNER_ASSERT(queue.Size() == 0); + RUNNER_ASSERT(copy.Size() == 6); + RUNNER_ASSERT(BinaryQueueToString(queue) == ""); + RUNNER_ASSERT(BinaryQueueToString(copy) == "abcdef"); +} + +RUNNER_TEST(BinaryQueue_AppendMoveTo) +{ + DPL::BinaryQueue queue; + DPL::BinaryQueue copy; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + queue.AppendMoveTo(copy); + + RUNNER_ASSERT(queue.Size() == 0); + RUNNER_ASSERT(copy.Size() == 6); + RUNNER_ASSERT(BinaryQueueToString(queue) == ""); + RUNNER_ASSERT(BinaryQueueToString(copy) == "abcdef"); +} + +class Visitor + : public DPL::BinaryQueue::BucketVisitor +{ +private: + int m_index; + +public: + Visitor() + : m_index(0) + { + } + + virtual void OnVisitBucket(const void *buffer, size_t bufferSize) + { + const char *str = static_cast(buffer); + + if (m_index == 0) + { + RUNNER_ASSERT(bufferSize == 4); + RUNNER_ASSERT(str[0] == 'a'); + RUNNER_ASSERT(str[1] == 'b'); + RUNNER_ASSERT(str[2] == 'c'); + RUNNER_ASSERT(str[3] == 'd'); + } + else if (m_index == 1) + { + RUNNER_ASSERT(bufferSize == 2); + RUNNER_ASSERT(str[0] == 'e'); + RUNNER_ASSERT(str[1] == 'f'); + } + else + { + RUNNER_FAIL; + } + + ++m_index; + } +}; + +RUNNER_TEST(BinaryQueue_Visitor) +{ + DPL::BinaryQueue queue; + + queue.AppendCopy("abcd", 4); + queue.AppendCopy("ef", 2); + + Visitor visitor; + queue.VisitBuckets(&visitor); +} + +RUNNER_TEST(BinaryQueue_AbstracInputRead) +{ + DPL::BinaryQueue queue; + + queue.AppendCopy("abcd", 4); + + queue.Read(0); + + RUNNER_ASSERT(BinaryQueueToString(*queue.Read(1).get()) == "a"); + RUNNER_ASSERT(BinaryQueueToString(*queue.Read(2).get()) == "bc"); + RUNNER_ASSERT(BinaryQueueToString(*queue.Read(1).get()) == "d"); + + RUNNER_ASSERT(queue.Size() == 0); +} + +RUNNER_TEST(BinaryQueue_AbstracOutputWrite) +{ + DPL::BinaryQueue queue; + queue.AppendCopy("abcd", 4); + + DPL::BinaryQueue stream; + + stream.Write(queue, 4); + + RUNNER_ASSERT(BinaryQueueToString(*queue.Read(4).get()) == "abcd"); +} diff --git a/tests/dpl/core/test_fast_delegate.cpp b/tests/dpl/core/test_fast_delegate.cpp new file mode 100644 index 0000000..947cbe5 --- /dev/null +++ b/tests/dpl/core/test_fast_delegate.cpp @@ -0,0 +1,248 @@ +/* + * 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_fast_delegate.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of fast delegate tests. + */ +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +// Sample copied and adopted from +// http://www.codeproject.com/KB/cpp/FastDelegate.aspx +// +// Demonstrate the syntax for FastDelegates. +// -Don Clugston, May 2004. +// It's a really boring example, but it shows the most important cases. +// Declare some functions of varying complexity... +void SimpleStaticFunction(int num, const char *str); +void SimpleStaticFunction(int num, const char *str) +{ + LogDebug("In SimpleStaticFunction. Num=" << num << ", str =" << str); +} + +void SimpleVoidFunction(); +void SimpleVoidFunction() +{ + LogDebug("In SimpleVoidFunction with no parameters."); +} + +class CBaseClass +{ +protected: + const char *m_name; + +public: + CBaseClass(const char *name) + : m_name(name) + { + } + + virtual ~CBaseClass() + { + } + + void SimpleMemberFunction(int num, const char *str) + { + LogDebug("In SimpleMemberFunction in " << m_name << ". Num=" + << num << ", str = " << str); + } + + int SimpleMemberFunctionReturnsInt(int num, const char *str) + { + LogDebug("In SimpleMemberFunctionReturnsInt in " << m_name << ". Num=" + << num << ", str = " << str); + return -1; + } + + void ConstMemberFunction(int num, const char *str) const + { + LogDebug("In ConstMemberFunction in " << m_name << ". Num=" + << num << ", str = " << str); + } + + virtual void SimpleVirtualFunction(int num, const char *str) + { + LogDebug("In SimpleVirtualFunction in " << m_name << ". Num=" + << num << ", str = " << str); + } + + static void StaticMemberFunction(int num, const char *str) + { + LogDebug("In StaticMemberFunction Num=" + << num << ", str = " << str); + } +}; + +class COtherClass +{ + double rubbish; // to ensure this class has non-zero size. + +public: + virtual ~COtherClass() + { + } + + virtual void UnusedVirtualFunction(void) + { + } + virtual void TrickyVirtualFunction(int num, const char *str) = 0; +}; + +class VeryBigClass +{ + int letsMakeThingsComplicated[400]; +}; + +// This declaration ensures that we get a convoluted class heirarchy. +class CDerivedClass + : public VeryBigClass, + virtual public COtherClass, + virtual public CBaseClass +{ + double m_somemember[8]; + +public: + CDerivedClass() + : CBaseClass("Base of Derived") + { + m_somemember[0] = 1.2345; + } + + void SimpleDerivedFunction(int num, const char *str) + { + LogDebug("In SimpleDerivedFunction Num=" + << num << ", str = " << str); + } + + virtual void AnotherUnusedVirtualFunction(int num, const char *str) + { + LogDebug("In AnotherUnusedVirtualFunction in " << m_name << ". Num=" + << num << ", str = " << str); + } + + virtual void TrickyVirtualFunction(int num, const char *str) + { + LogDebug("In TrickyVirtualFunction in " << m_name << ". Num=" + << num << ", str = " << str); + } +}; + +RUNNER_TEST(FastDelegate_Test) +{ + // Delegates with up to 8 parameters are supported. + // Here's the case for a void function. + // We declare a delegate and attach it to SimpleVoidFunction() + DPL::FastDelegate0<> noparameterdelegate(&SimpleVoidFunction); + + // invoke the delegate - this calls SimpleVoidFunction() + noparameterdelegate(); + + LogDebug("-- Examples using two-parameter delegates (int, char *) --"); + + // By default, the return value is void. + typedef DPL::FastDelegate2 MyDelegate; + + // If you want to have a non-void return value, put it at the end. + typedef DPL::FastDelegate2 IntMyDelegate; + + + MyDelegate funclist[12]; // delegates are initialized to empty + CBaseClass a("Base A"); + CBaseClass b("Base B"); + CDerivedClass d; + CDerivedClass c; + + IntMyDelegate newdeleg; + newdeleg = DPL::MakeDelegate(&a, + &CBaseClass::SimpleMemberFunctionReturnsInt); + + // Binding a simple member function + funclist[0].bind(&a, &CBaseClass::SimpleMemberFunction); + + // You can also bind static (free) functions + funclist[1].bind(&SimpleStaticFunction); + + // and static member functions + funclist[2].bind(&CBaseClass::StaticMemberFunction); + + // and const member functions (these only need a const class pointer). + funclist[3].bind((const CBaseClass *) &a, + &CBaseClass::ConstMemberFunction); + + funclist[4].bind(&a, &CBaseClass::ConstMemberFunction); + + // and virtual member functions + funclist[5].bind(&b, &CBaseClass::SimpleVirtualFunction); + + // You can also use the = operator. For static functions, a fastdelegate + // looks identical to a simple function pointer. + funclist[6] = &CBaseClass::StaticMemberFunction; + + // The weird rule about the class of derived member function pointers + // is avoided. For MSVC, you can use &CDerivedClass::SimpleVirtualFunction + // here, but DMC will complain. Note that as well as .bind(), you can also + // use the MakeDelegate() global function. + funclist[7] = DPL::MakeDelegate(&d, &CBaseClass::SimpleVirtualFunction); + + // The worst case is an abstract virtual function of a virtually-derived + // class with at least one non-virtual base class. This is a VERY obscure + // situation, which you're unlikely to encounter in the real world. + // FastDelegate versions prior to 1.3 had problems with this case on VC6. + // Now, it works without problems on all compilers. + funclist[8].bind(&c, &CDerivedClass::TrickyVirtualFunction); + + // BUT... in such cases you should be using the base class as an + // interface, anyway. + funclist[9].bind(&c, &COtherClass::TrickyVirtualFunction); + + // Calling a function that was first declared in the derived class is + // straightforward + funclist[10] = DPL::MakeDelegate(&c, &CDerivedClass::SimpleDerivedFunction); + + // You can also bind directly using the constructor + MyDelegate dg(&b, &CBaseClass::SimpleVirtualFunction); + + const char *msg = "Looking for equal delegate"; + + for (int i = 0; i < 12; i++) + { + LogDebug(i << ":"); + + // The == and != operators are provided + // Note that they work even for inline functions. + if (funclist[i] == dg) + { + msg = "Found equal delegate"; + } + + // operator ! can be used to test for an empty delegate + // You can also use the .empty() member function. + if (!funclist[i]) + { + LogDebug("Delegate is empty"); + } + else + { + // Invocation generates optimal assembly code. + funclist[i](i, msg); + } + } +} diff --git a/tests/dpl/core/test_foreach.cpp b/tests/dpl/core/test_foreach.cpp new file mode 100644 index 0000000..f698081 --- /dev/null +++ b/tests/dpl/core/test_foreach.cpp @@ -0,0 +1,118 @@ +/* + * 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_foreach.cpp + * @author Bartosz Janiak (b.janiak@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of foreach tests. + */ + +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +static const size_t testContainerSize = 1024; + +template +void VerifyForeach(Container& container) +{ + size_t i = 0; + FOREACH(it, container) + { + RUNNER_ASSERT(*it == i); + i++; + } + RUNNER_ASSERT(i == container.size()); +} + +#define VERIFY_FOREACH(container) \ + { \ + size_t i = 0; \ + FOREACH(it, container) \ + { \ + RUNNER_ASSERT(*it == i); \ + i++; \ + } \ + } + +static size_t numberOfCallsToTemporaryList = 0; +std::list temporaryList(); +std::list temporaryList() +{ + ++numberOfCallsToTemporaryList; + std::list list; + for (size_t i = 0 ; i < testContainerSize ; i++) + { + list.push_back(i); + } + return list; +} + +static size_t numberOfCallsToTemporaryVector = 0; +std::vector temporaryVector(); +std::vector temporaryVector() +{ + ++numberOfCallsToTemporaryVector; + std::vector vector; + for (size_t i = 0 ; i < testContainerSize ; i++) + { + vector.push_back(i); + } + return vector; +} + +static size_t numberOfCallsToTemporarySet = 0; +std::set temporarySet(); +std::set temporarySet() +{ + ++numberOfCallsToTemporarySet; + std::set set; + for (size_t i = 0 ; i < testContainerSize ; i++) + { + set.insert(i); + } + return set; +} + +RUNNER_TEST(Foreach_std_containers) +{ + std::vector vector; + std::list list; + std::set set; + + for (size_t i = 0 ; i < testContainerSize ; i++) + { + vector.push_back(i); + list.push_back(i); + set.insert(i); + } + + VerifyForeach(vector); + VerifyForeach(list); + VerifyForeach(set); + + VERIFY_FOREACH(temporaryList()); + VERIFY_FOREACH(temporaryVector()); + VERIFY_FOREACH(temporarySet()); + + RUNNER_ASSERT(numberOfCallsToTemporaryList == 1); + RUNNER_ASSERT(numberOfCallsToTemporaryVector == 1); + RUNNER_ASSERT(numberOfCallsToTemporarySet == 1); +} diff --git a/tests/dpl/core/test_log_unhandled_exception.cpp b/tests/dpl/core/test_log_unhandled_exception.cpp new file mode 100644 index 0000000..0403c28 --- /dev/null +++ b/tests/dpl/core/test_log_unhandled_exception.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. + */ +/* + * @file test_log_unhandled_exception.cpp + * @author Pawel Sikorski (p.marcinkiew@samsung.com) + * @version 1.0 + * @brief + */ +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +class MyException +{ +}; + +class MyDPLException +{ +public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, MyException) +}; + +class MySTDException + : public std::exception +{ +public: + virtual const char* what()const throw() { return "my std exception occurred";} +}; + +RUNNER_TEST(Log_Unknown_Exception) +{ + UNHANDLED_EXCEPTION_HANDLER_BEGIN + { +// throw MyException(); + } + UNHANDLED_EXCEPTION_HANDLER_END + RUNNER_ASSERT(true); +} + +RUNNER_TEST(Log_DPL_Exception) +{ + UNHANDLED_EXCEPTION_HANDLER_BEGIN + { +// Throw(MyDPLException::MyException); + } + UNHANDLED_EXCEPTION_HANDLER_END + RUNNER_ASSERT(true); +} + +RUNNER_TEST(Log_STD_Exception) +{ + UNHANDLED_EXCEPTION_HANDLER_BEGIN + { +// throw MySTDException(); + } + UNHANDLED_EXCEPTION_HANDLER_END + RUNNER_ASSERT(true); +} diff --git a/tests/dpl/core/test_once.cpp b/tests/dpl/core/test_once.cpp new file mode 100644 index 0000000..b278f83 --- /dev/null +++ b/tests/dpl/core/test_once.cpp @@ -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 test_once.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of once tests + */ +#include +#include +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +namespace // anonymous +{ +gint g_counter; + +void Delegate() +{ + ++g_counter; +} +} // namespace anonymous + +RUNNER_TEST(Once_DoubleCall) +{ + g_counter = 0; + + DPL::Once once; + + once.Call(&Delegate); + once.Call(&Delegate); + + RUNNER_ASSERT_MSG(g_counter == 1, "Counter value is: " << g_counter); +} + +class MyThread + : public DPL::Thread +{ +protected: + virtual int ThreadEntry() + { + DPL::WaitForSingleHandle(m_event->GetHandle()); + m_once->Call(DPL::Once::Delegate(this, &MyThread::Call)); + return 0; + } + + void Call() + { + ++*m_atom; + } + +public: + MyThread(DPL::WaitableEvent *event, DPL::Once *once, DPL::Atomic *atom) + : m_event(event), m_once(once), m_atom(atom) + { + } + +private: + DPL::WaitableEvent *m_event; + DPL::Once *m_once; + DPL::Atomic *m_atom; +}; + +RUNNER_TEST(Once_MultiThreadCall) +{ + const size_t NUM_THREADS = 20; + typedef std::shared_ptr ThreadPtr; + + ThreadPtr threads[NUM_THREADS]; + DPL::WaitableEvent event; + DPL::Once once; + DPL::Atomic atom; + + for (size_t i = 0; i< NUM_THREADS; ++i) + { + (threads[i] = ThreadPtr(new MyThread(&event, &once, &atom)))->Run(); + } + + event.Signal(); + + for (size_t i = 0; i< NUM_THREADS; ++i) + threads[i]->Quit(); + + RUNNER_ASSERT_MSG(atom == 1, "Atom value is: " << atom); +} diff --git a/tests/dpl/core/test_scoped_array.cpp b/tests/dpl/core/test_scoped_array.cpp new file mode 100644 index 0000000..58b0603 --- /dev/null +++ b/tests/dpl/core/test_scoped_array.cpp @@ -0,0 +1,62 @@ +/* + * 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_scoped_array.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test scoped array + */ +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(ScopedArray_Zero) +{ + DPL::ScopedArray array; + + RUNNER_ASSERT(!array); + RUNNER_ASSERT(!!!array); +} + +RUNNER_TEST(ScopedArray_NonZero) +{ + DPL::ScopedArray array(new char[7]); + + RUNNER_ASSERT(array); + RUNNER_ASSERT(!!array); +} + +RUNNER_TEST(ScopedArray_Reset) +{ + DPL::ScopedArray array(new char[7]); + array.Reset(); + + RUNNER_ASSERT(!array); + + array.Reset(new char); + RUNNER_ASSERT(array); +} + +RUNNER_TEST(ScopedArray_ArrayOperator) +{ + DPL::ScopedArray array(new char[7]); + + array[1] = array[2] = 3; + + RUNNER_ASSERT(array[1] == 3); + RUNNER_ASSERT(array[2] == 3); +} diff --git a/tests/dpl/core/test_scoped_close.cpp b/tests/dpl/core/test_scoped_close.cpp new file mode 100644 index 0000000..3549fed --- /dev/null +++ b/tests/dpl/core/test_scoped_close.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file test_scoped_close.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test scoped close + */ +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +// DUNNO diff --git a/tests/dpl/core/test_scoped_fclose.cpp b/tests/dpl/core/test_scoped_fclose.cpp new file mode 100644 index 0000000..dbdff95 --- /dev/null +++ b/tests/dpl/core/test_scoped_fclose.cpp @@ -0,0 +1,70 @@ +/* + * 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_scoped_fclose.cpp + * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test scoped fclose + */ + +#include +#include + +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +namespace +{ +FILE* MakeTmp() +{ + FILE* result = NULL; + do + { + result = tmpfile(); + } while (NULL != result && EINTR == errno); + return result; +} +}//anonymous namespace + +RUNNER_TEST(ScopedFClose_Zero) +{ + DPL::ScopedFClose file; + + RUNNER_ASSERT(!file); + RUNNER_ASSERT(!!!file); +} + +RUNNER_TEST(ScopedFClose_NonZero) +{ + DPL::ScopedFClose file(MakeTmp()); + + RUNNER_ASSERT(file); + RUNNER_ASSERT(!!file); +} + +RUNNER_TEST(ScopedFClose_Reset) +{ + DPL::ScopedFClose file(MakeTmp()); + file.Reset(); + + RUNNER_ASSERT(!file); + + file.Reset(MakeTmp()); + RUNNER_ASSERT(file); +} + diff --git a/tests/dpl/core/test_scoped_free.cpp b/tests/dpl/core/test_scoped_free.cpp new file mode 100644 index 0000000..bc41a5a --- /dev/null +++ b/tests/dpl/core/test_scoped_free.cpp @@ -0,0 +1,53 @@ +/* + * 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_scoped_free.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test scoped free + */ +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(ScopedFree_Zero) +{ + DPL::ScopedFree free; + + RUNNER_ASSERT(!free); + RUNNER_ASSERT(!!!free); +} + +RUNNER_TEST(ScopedFree_NonZero) +{ + DPL::ScopedFree free(malloc(7)); + + RUNNER_ASSERT(free); + RUNNER_ASSERT(!!free); +} + +RUNNER_TEST(ScopedFree_Reset) +{ + DPL::ScopedFree free(malloc(7)); + free.Reset(); + + RUNNER_ASSERT(!free); + + free.Reset(malloc(8)); + RUNNER_ASSERT(free); +} diff --git a/tests/dpl/core/test_scoped_ptr.cpp b/tests/dpl/core/test_scoped_ptr.cpp new file mode 100644 index 0000000..f3a7237 --- /dev/null +++ b/tests/dpl/core/test_scoped_ptr.cpp @@ -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 test_scoped_ptr.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test scoped ptr + */ +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(ScopedPtr_Zero) +{ + DPL::ScopedPtr ptr; + + RUNNER_ASSERT(!ptr); + RUNNER_ASSERT(!!!ptr); +} + +RUNNER_TEST(ScopedPtr_NonZero) +{ + DPL::ScopedPtr ptr(new char(7)); + + RUNNER_ASSERT(ptr); + RUNNER_ASSERT(!!ptr); +} + +RUNNER_TEST(ScopedPtr_Reset) +{ + DPL::ScopedPtr ptr(new char(7)); + ptr.Reset(); + + RUNNER_ASSERT(!ptr); + + ptr.Reset(new char); + RUNNER_ASSERT(ptr); +} + +RUNNER_TEST(ScopedPtr_Operators) +{ + DPL::ScopedPtr ptr(new char(7)); + + RUNNER_ASSERT(*ptr == *ptr.Get()); +} diff --git a/tests/dpl/core/test_semaphore.cpp b/tests/dpl/core/test_semaphore.cpp new file mode 100644 index 0000000..854978e --- /dev/null +++ b/tests/dpl/core/test_semaphore.cpp @@ -0,0 +1,85 @@ +/* + * 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_semaphore.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of semaphore tests + */ +#include +#include +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +class SemaphoreThread + : public DPL::Thread +{ + int m_delta; + int m_times; + int *m_value; + std::string m_semaphoreName; + +public: + SemaphoreThread(int delta, + int times, + int *value, + const std::string &semaphoreName) + : m_delta(delta), + m_times(times), + m_value(value), + m_semaphoreName(semaphoreName) + { + } + +protected: + virtual int ThreadEntry() + { + DPL::Semaphore semaphore(m_semaphoreName); + + for (int i = 0; i < m_times; ++i) + { + // Take scoped semaphore lock + DPL::Semaphore::ScopedLock lock(&semaphore); + *m_value += m_delta; + } + + return 0; + } +}; + +RUNNER_TEST(Semaphore_NamedIncrementDecrement) +{ + std::string semaphoreName = + "dpl_test_semaphore_" + + DPL::lexical_cast(std::time(NULL)); + + int value = 0; + SemaphoreThread threadA(-1, 10000, &value, semaphoreName); + SemaphoreThread threadB(+1, 10000, &value, semaphoreName); + + threadA.Run(); + threadB.Run(); + + threadA.Quit(); + threadB.Quit(); + + RUNNER_ASSERT_MSG(value == 0, "Final value is: " << value); +} diff --git a/tests/dpl/core/test_serialization.cpp b/tests/dpl/core/test_serialization.cpp new file mode 100644 index 0000000..8776fc8 --- /dev/null +++ b/tests/dpl/core/test_serialization.cpp @@ -0,0 +1,259 @@ +/* + * 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_address.cpp + * @author Tomasz Swierczek (t.swierczek@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of serialization tests + */ + +#include +#include +#include +#include + +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +// test stream class +class BinaryStream : public DPL::IStream { + public: + virtual void Read(size_t num, void * bytes) + { + for (unsigned i = 0; i < num; ++i) { + ((unsigned char*)bytes)[i] = data[i + readPosition]; + } + readPosition += num; + } + virtual void Write(size_t num, const void * bytes) + { + for (unsigned i = 0; i < num; ++i) { + data.push_back(((unsigned char*)bytes)[i]); + } + } + BinaryStream() + { + readPosition = 0; + } + virtual ~BinaryStream(){}; + + private: + std::vector data; + unsigned readPosition; +}; + +//test ISerializable class +class TestClass : public DPL::ISerializable { + public: + TestClass(int val, std::string str1, std::string str2) + { + a = val; + b = str1; + c.push_back(str1); + c.push_back(str2); + c.push_back(str1 + str2); + }; + TestClass(DPL::IStream& stream) + { + DPL::Deserialization::Deserialize(stream,a); + DPL::Deserialization::Deserialize(stream,b); + DPL::Deserialization::Deserialize(stream,c); + }; + virtual void Serialize(DPL::IStream& stream) const + { + DPL::Serialization::Serialize(stream,a); + DPL::Serialization::Serialize(stream,b); + DPL::Serialization::Serialize(stream,c); + } + virtual ~TestClass(){} + virtual bool operator==(const TestClass& other) + { + return (a == other.a && + b == other.b && + c.size() == other.c.size() && + c[0] == other.c[0] && + c[1] == other.c[1] && + c[2] == other.c[2]); + } + private: + int a; + std::string b; + std::vector c; +}; + +RUNNER_TEST(Serialize_primitives) +{ + int a = 1; + bool b = true; + unsigned c = 23; + BinaryStream stream; + DPL::Serialization::Serialize(stream,a); + DPL::Serialization::Serialize(stream,b); + DPL::Serialization::Serialize(stream,c); + int test_int; + DPL::Deserialization::Deserialize(stream,test_int); + RUNNER_ASSERT(test_int == a); + bool test_bool; + DPL::Deserialization::Deserialize(stream,test_bool); + RUNNER_ASSERT(test_bool == b); + unsigned test_unsigned; + DPL::Deserialization::Deserialize(stream,test_unsigned); + RUNNER_ASSERT(test_unsigned == c); +} + +RUNNER_TEST(Serialize_primitive_pointers) +{ + int a = 1; + bool b = true; + unsigned c = 23; + BinaryStream stream; + DPL::Serialization::Serialize(stream,&a); + DPL::Serialization::Serialize(stream,&b); + DPL::Serialization::Serialize(stream,&c); + int* test_int; + DPL::Deserialization::Deserialize(stream,test_int); + RUNNER_ASSERT(test_int != NULL && *test_int == a); + bool* test_bool; + DPL::Deserialization::Deserialize(stream,test_bool); + RUNNER_ASSERT(test_bool != NULL && *test_bool == b); + unsigned* test_unsigned; + DPL::Deserialization::Deserialize(stream,test_unsigned); + RUNNER_ASSERT(test_unsigned != NULL && *test_unsigned == c); + delete test_int; + delete test_bool; + delete test_unsigned; +} + +RUNNER_TEST(Serialize_strings) +{ + std::string str1 = "ALA MA KOTA"; + std::string str2 = "MULTILINE\nTEST"; + BinaryStream stream; + DPL::Serialization::Serialize(stream,str1); + DPL::Serialization::Serialize(stream,str2); + std::string test_str1; + DPL::Deserialization::Deserialize(stream,test_str1); + RUNNER_ASSERT(test_str1 == str1); + std::string test_str2; + DPL::Deserialization::Deserialize(stream,test_str2); + RUNNER_ASSERT(test_str2 == str2); +} + +RUNNER_TEST(Serialize_string_pointers) +{ + std::string str1 = "ALA MA KOTA"; + std::string str2 = "MULTILINE\nTEST"; + BinaryStream stream; + DPL::Serialization::Serialize(stream,&str1); + DPL::Serialization::Serialize(stream,&str2); + std::string* test_str1; + DPL::Deserialization::Deserialize(stream,test_str1); + RUNNER_ASSERT(test_str1 != NULL && *test_str1 == str1); + std::string* test_str2; + DPL::Deserialization::Deserialize(stream,test_str2); + RUNNER_ASSERT(test_str2 != NULL && *test_str2 == str2); + delete test_str1; + delete test_str2; +} + +RUNNER_TEST(Serialize_containers) +{ + std::vector vec; + vec.push_back(134); + vec.push_back(265); + std::list list; + list.push_back(true); + list.push_back(false); + std::pair pair; + pair.first = -23; + pair.second = 1234; + std::map map; + map.insert(std::pair(45, "ALA MA CZARNEGO KOTA")); + map.insert(std::pair(-78, "...A MOZE\nMA\nWIELE LINIJEK")); + BinaryStream stream; + DPL::Serialization::Serialize(stream,vec); + DPL::Serialization::Serialize(stream,list); + DPL::Serialization::Serialize(stream,pair); + DPL::Serialization::Serialize(stream,map); + std::vector test_vec; + DPL::Deserialization::Deserialize(stream,test_vec); + RUNNER_ASSERT(test_vec.size() == vec.size() && + test_vec[0] == vec[0] && test_vec[1] == vec[1]); + std::list test_list; + DPL::Deserialization::Deserialize(stream,test_list); + RUNNER_ASSERT(test_list.size() == list.size() && + test_list.front() == list.front() && + test_list.back() == test_list.back()); + std::pair test_pair; + DPL::Deserialization::Deserialize(stream,test_pair); + RUNNER_ASSERT(test_pair.first == pair.first && + test_pair.second == pair.second); + std::map test_map; + DPL::Deserialization::Deserialize(stream,test_map); + RUNNER_ASSERT(test_map.size() == map.size() && + test_map.at(45) == map.at(45) && + test_map.at(-78) == map.at(-78)); +} + +RUNNER_TEST(Serialize_objects) +{ + TestClass a(123,"ASDGHUADB\n\n5679b^^()*","TEST_STRING"), + b(679,"HUSPIDNSAHDPA","\nASDSADASD\naDSADASD8"); + BinaryStream stream; + DPL::Serialization::Serialize(stream,a); + DPL::Serialization::Serialize(stream,b); + TestClass test_a(0,"",""), test_b(0,"",""); + DPL::Deserialization::Deserialize(stream, test_a); + RUNNER_ASSERT(test_a == a); + DPL::Deserialization::Deserialize(stream, test_b); + RUNNER_ASSERT(test_b == b); +} + +RUNNER_TEST(Serialize_all) +{ + std::map > map; + std::vector vec; + vec.push_back(new TestClass(123,"ASDGHUADB\n\n5679b^^()*","TEST_STRING")); + vec.push_back(new TestClass(679,"HUSPIDNSAHDPA","\nASDSADASD\naDSADASD8")); + map.insert(std::pair >("KEY1",vec)); + map.insert(std::pair >("KEY2",vec)); + BinaryStream stream; + + DPL::Serialization::Serialize(stream, map); + + std::map > test_map; + DPL::Deserialization::Deserialize(stream,test_map); + RUNNER_ASSERT(map.size() == test_map.size()); + std::vector test_vec1,test_vec2; + test_vec1 = map.at("KEY1"); + test_vec2 = test_map.at("KEY1"); + RUNNER_ASSERT(test_vec1.size() == test_vec2.size()); + unsigned i; + for (i = 0; i < test_vec1.size(); ++i) + { + RUNNER_ASSERT((*test_vec1[i]) == (*test_vec2[i])); + } + test_vec1 = map.at("KEY2"); + test_vec2 = test_map.at("KEY2"); + RUNNER_ASSERT(test_vec1.size() == test_vec2.size()); + for (i = 0; i < test_vec1.size(); ++i) + { + RUNNER_ASSERT((*test_vec1[i]) == (*test_vec2[i])); + } +} + diff --git a/tests/dpl/core/test_shared_ptr.cpp b/tests/dpl/core/test_shared_ptr.cpp new file mode 100644 index 0000000..541a333 --- /dev/null +++ b/tests/dpl/core/test_shared_ptr.cpp @@ -0,0 +1,85 @@ +/* + * 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_shared_ptr.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test shared ptr + */ +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(SharedPtr_Zero) +{ + DPL::SharedPtr ptr; + + RUNNER_ASSERT(!ptr); + RUNNER_ASSERT(!!!ptr); + RUNNER_ASSERT(ptr == DPL::SharedPtr()); +} + +RUNNER_TEST(SharedPtr_NonZero) +{ + DPL::SharedPtr ptr(new char(7)); + + RUNNER_ASSERT(ptr); + RUNNER_ASSERT(!!ptr); + RUNNER_ASSERT(ptr != DPL::SharedPtr()); +} + +RUNNER_TEST(SharedPtr_Copy) +{ + DPL::SharedPtr ptr1(new char(7)); + DPL::SharedPtr ptr2(new char(7)); + + RUNNER_ASSERT(ptr1 != ptr2); + + ptr2 = ptr1; + + RUNNER_ASSERT(ptr1 == ptr2); +} + +RUNNER_TEST(SharedPtr_Reset) +{ + DPL::SharedPtr ptr(new char(7)); + ptr.Reset(); + + RUNNER_ASSERT(!ptr); + + ptr.Reset(new char); + RUNNER_ASSERT(ptr); +} + +RUNNER_TEST(SharedPtr_RefCounting) +{ + DPL::SharedPtr ptr1(new char(7)); + DPL::SharedPtr ptr2; + + ptr2 = ptr1; + + RUNNER_ASSERT(ptr1 == ptr2); + RUNNER_ASSERT(ptr1.GetUseCount() == ptr2.GetUseCount()); + RUNNER_ASSERT(ptr1.GetUseCount() == 2); +} + +RUNNER_TEST(SharedPtr_Operators) +{ + DPL::SharedPtr ptr(new char(7)); + + RUNNER_ASSERT(*ptr == *ptr.Get()); +} diff --git a/tests/dpl/core/test_string.cpp b/tests/dpl/core/test_string.cpp new file mode 100644 index 0000000..dea0a22 --- /dev/null +++ b/tests/dpl/core/test_string.cpp @@ -0,0 +1,384 @@ +/* + * 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_string.cpp + * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of string tests + */ +#include +#include +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +unsigned char GetBaseCode(int index); +unsigned char GetBaseCode(int index) +{ + /* aaaack but it's fast and const should make it shared text page. */ + static const unsigned char pr2six[256] = + { + /* ASCII table */ + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, + 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, + 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 + }; + return pr2six[index]; +} + + +/* Function adapted from APR library (http://apr.apache.org/) */ +int wbxml_base64_decode(const char *buffer, char **result); +int wbxml_base64_decode(const char *buffer, char **result) +{ + int nbytesdecoded = 0, nprbytes = 0; + const char *bufin = NULL; + char *bufout = NULL; + + if ((buffer == NULL) || (result == NULL)) + return 0; + + /* Initialize output buffer */ + *result = NULL; + + bufin = buffer; + while (GetBaseCode(*(bufin++)) <= 63) {} + + nprbytes = (bufin - buffer) - 1; + nbytesdecoded = ((nprbytes + 3) / 4) * 3; + + /* Malloc result buffer */ + if ((*result = (char*) malloc(nbytesdecoded + 1)) == NULL) + return 0; + memset(*result, nbytesdecoded + 1, 0); + + bufout = *result; + bufin = buffer; + + while (nprbytes > 4) + { + *(bufout++) = (char)(GetBaseCode(*bufin) << 2 | GetBaseCode(bufin[1]) >> 4); + *(bufout++) = (char)(GetBaseCode(bufin[1]) << 4 | GetBaseCode(bufin[2]) >> 2); + *(bufout++) = (char)(GetBaseCode(bufin[2]) << 6 | GetBaseCode(bufin[3])); + bufin += 4; + nprbytes -= 4; + } + + /* Note: (nprbytes == 1) would be an error, so just ingore that case */ + if (nprbytes > 1) + { + *(bufout++) = (char)(GetBaseCode(*bufin) << 2 | GetBaseCode(bufin[1]) >> 4); + } + if (nprbytes > 2) + { + *(bufout++) = (char)(GetBaseCode(bufin[1]) << 4 | GetBaseCode(bufin[2]) >> 2); + } + if (nprbytes > 3) + { + *(bufout++) = (char)(GetBaseCode(bufin[2]) << 6 | GetBaseCode(bufin[3])); + } + + nbytesdecoded -= (4 - nprbytes) & 3; + + return nbytesdecoded; +} + +//#define TEST_CONVERSION(in_string, out_string, buffer_type, function + +const char utf32Encoded[] = +"RDAAAI0wAABvMAAAazAAAHswAAB4MAAAaDAAAAAwAABhMAAAijAAAGwwAACLMAAAkjAAAAAwAACP\ +MAAASzAAAIgwAABfMAAAjDAAAF0wAAAAMAAAZDAAAG0wAABqMAAAiTAAAIAwAAAAMAAARjAAAJAw\ +AABuMAAASjAAAE8wAACEMAAAfjAAAAAwAABRMAAAdTAAAFMwAABIMAAAZjAAAAAwAABCMAAAVTAA\ +AE0wAACGMAAAgTAAAH8wAABXMAAAADAAAJEwAAByMAAAgjAAAFswAABZMAAACgAAANsFAADaBQAA\ +IAAAANQFAADqBQAA6AUAAOEFAADnBQAAIAAAAOAFAADkBQAA5QUAACAAAADiBQAA3AUAACAAAADS\ +BQAA1QUAANYFAADcBQAAIAAAAOcFAADYBQAA3wUAACwAAAAgAAAA6QUAANMFAADXBQAA4wUAACAA\ +AADQBQAA6gUAACAAAADmBQAA0QUAANkFAAAgAAAA3AUAAN4FAADZBQAA3QUAAAoAAACk0AAApMIA\ +AFjHAAAgAAAA4KwAACDHAABwyAAAdKwAAEDHAAAgAAAAhccAACDCAAB8sAAArLkAACAAAADMuQAA\ +mLAAAHzFAAAgAAAAWNUAAOCsAAAgAAAAudIAAMS8AABc1QAAIAAAADCuAAAgwgAAQMcAACAAAABE\ +1QAAlMYAAFjOAAAgAAAASsUAAOSyAAAKAAAAUAAAAGMAAABoAAAAbgAAAAUBAAAHAQAAIAAAAHcA\ +AAAgAAAAdAAAABkBAAAgAAAAQgEAAPMAAABkAAAAegEAACAAAABqAAAAZQAAAHwBAABhAAAAIAAA\ +AGwAAAB1AAAAYgAAACAAAABvAAAAWwEAAG0AAAAgAAAAcwAAAGsAAAByAAAAegAAAHkAAABEAQAA\ +IAAAAGYAAABpAAAAZwAAAC4AAAAKAAAAQgAAAGwAAABvAAAAdwAAAHoAAAB5AAAAIAAAAG4AAABp\ +AAAAZwAAAGgAAAB0AAAALQAAAGYAAAByAAAAdQAAAG0AAABwAAAAcwAAACAAAAB2AAAAZQAAAHgA\ +AAAnAAAAZAAAACAAAABKAAAAYQAAAGMAAABrAAAAIAAAAFEAAAAuAAAACgAAAEYGAAA1BgAAIAAA\ +AC0GAABDBgAASgYAAEUGAAAgAAAARAYAAEcGAAAgAAAAMwYAADEGAAAgAAAAQgYAACcGAAA3BgAA\ +OQYAACAAAABIBgAAMAYAAEgGAAAgAAAANAYAACMGAABGBgAAIAAAADkGAAA4BgAASgYAAEUGAAAg\ +AAAARQYAAEMGAAAqBgAASAYAACgGAAAgAAAAOQYAAEQGAABJBgAAIAAAACsGAABIBgAAKAYAACAA\ +AAAjBgAALgYAADYGAAAxBgAAIAAAAEgGAABFBgAAOgYAAEQGAABBBgAAIAAAACgGAAAsBgAARAYA\ +AC8GAAAgAAAAIwYAADIGAAAxBgAAQgYAACAAAAAKAAAAEgQAACAAAABHBAAAMAQAAEkEAAAwBAAA\ +RQQAACAAAABOBAAAMwQAADAEAAAgAAAANgQAADgEAAA7BAAAIAAAADEEAABLBAAAIAAAAEYEAAA4\ +BAAAQgQAAEAEAABDBAAAQQQAAD8AAAAgAAAAFAQAADAEAAAsAAAAIAAAAD0EAAA+BAAAIAAAAEQE\ +AAAwBAAAOwQAAEwEAABIBAAAOAQAADIEAABLBAAAOQQAACAAAABNBAAAOgQAADcEAAA1BAAAPAQA\ +AD8EAAA7BAAATwQAAEAEAAAhAAAACgAAAKQDAACsAwAAxwMAALkDAADDAwAAxAMAALcDAAAgAAAA\ +sQMAALsDAADOAwAAwAMAALcDAAC+AwAAIAAAALIDAACxAwAAxgMAAK4DAADCAwAAIAAAAMgDAAC3\ +AwAAvAMAAK0DAAC9AwAAtwMAACAAAACzAwAAtwMAACwAAAAgAAAAtAMAAMEDAACxAwAAwwMAALoD\ +AAC1AwAAuwMAAK8DAAC2AwAAtQMAALkDAAAgAAAAxQMAAMADAACtAwAAwQMAACAAAAC9AwAAyQMA\ +ALgDAADBAwAAvwMAAM0DAAAgAAAAugMAAMUDAAC9AwAAzAMAAMIDAAAKAAAAVgAAAGkAAABjAAAA\ +dAAAAG8AAAByAAAAIAAAAGoAAABhAAAAZwAAAHQAAAAgAAAAegAAAHcAAAD2AAAAbAAAAGYAAAAg\ +AAAAQgAAAG8AAAB4AAAAawAAAOQAAABtAAAAcAAAAGYAAABlAAAAcgAAACAAAABxAAAAdQAAAGUA\ +AAByAAAAIAAAAPwAAABiAAAAZQAAAHIAAAAgAAAAZAAAAGUAAABuAAAAIAAAAGcAAAByAAAAbwAA\ +AN8AAABlAAAAbgAAACAAAABTAAAAeQAAAGwAAAB0AAAAZQAAAHIAAAAgAAAARAAAAGUAAABpAAAA\ +YwAAAGgAAAAKAAAAlokAAM6RAAAhcQAAUJYAAONeAAAM/wAAl3oAABZZAAAJZwAAzYUAAClZAAAK\ +AAAACgAAAAAAAAA="; + +const char utf8Encoded[] = +"44GE44KN44Gv44Gr44G744G444Go44CA44Gh44KK44Gs44KL44KS44CA44KP44GL44KI44Gf44KM\ +44Gd44CA44Gk44Gt44Gq44KJ44KA44CA44GG44KQ44Gu44GK44GP44KE44G+44CA44GR44G144GT\ +44GI44Gm44CA44GC44GV44GN44KG44KB44G/44GX44CA44KR44Gy44KC44Gb44GZCteb15og15TX\ +qteo16HXpyDXoNek16Ug16LXnCDXkteV15bXnCDXp9eY158sINep15PXl9ejINeQ16og16bXkdeZ\ +INec157XmdedCu2CpOyKpOydmCDqs6DsnKDsobDqsbTsnYAg7J6F7Iig64G866asIOunjOuCmOyV\ +vCDtlZjqs6Ag7Yq567OE7ZWcIOq4sOyIoOydgCDtlYTsmpTsuZgg7JWK64ukClBjaG7EhcSHIHcg\ +dMSZIMWCw7NkxbogamXFvGEgbHViIG/Fm20gc2tyennFhCBmaWcuCkJsb3d6eSBuaWdodC1mcnVt\ +cHMgdmV4J2QgSmFjayBRLgrZhti1INit2YPZitmFINmE2Ycg2LPYsSDZgtin2LfYuSDZiNiw2Ygg\ +2LTYo9mGINi52LjZitmFINmF2YPYqtmI2Kgg2LnZhNmJINir2YjYqCDYo9iu2LbYsSDZiNmF2LrZ\ +hNmBINio2KzZhNivINij2LLYsdmCIArQkiDRh9Cw0YnQsNGFINGO0LPQsCDQttC40Lsg0LHRiyDR\ +htC40YLRgNGD0YE/INCU0LAsINC90L4g0YTQsNC70YzRiNC40LLRi9C5INGN0LrQt9C10LzQv9C7\ +0Y/RgCEKzqTOrM+HzrnPg8+EzrcgzrHOu8+Oz4DOt86+IM6yzrHPhs6uz4Igz4jOt868zq3Ovc63\ +IM6zzrcsIM60z4HOsc+DzrrOtc67zq/Ots61zrkgz4XPgM6tz4Egzr3Pic64z4HOv8+NIM66z4XO\ +vc+Mz4IKVmljdG9yIGphZ3QgenfDtmxmIEJveGvDpG1wZmVyIHF1ZXIgw7xiZXIgZGVuIGdyb8Of\ +ZW4gU3lsdGVyIERlaWNoCuimlumHjueEoemZkOW7o++8jOeql+WkluacieiXjeWkqQoKAA=="; + + + + +const char asciiEncodedIso1[] = +"ISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ\ +WltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fgA="; + +const char asciiEncodedUtf32[] = +"IQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAv\ +AAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0A\ +AAA+AAAAPwAAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAA\ +AEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAA\ +WgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABo\ +AAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYA\ +AAB3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAAAAAAAA="; + + +RUNNER_TEST(String_ConverterFromASCII) +{ + char* inStr = NULL; + int inSize = wbxml_base64_decode(asciiEncodedIso1, &inStr); + RUNNER_ASSERT(inSize > 0); + RUNNER_ASSERT(NULL != inStr); + inStr[inSize] = '\0'; + { + DPL::String asciiString = DPL::FromASCIIString(inStr); + + std::string result = DPL::ToUTF8String(asciiString); + + RUNNER_ASSERT(strlen(inStr) == result.size()); + + RUNNER_ASSERT(0 == memcmp(inStr, result.c_str(), result.size())); + } + + free(inStr); +} + +RUNNER_TEST(String_ConverterFromUTF8) +{ + char* inStr = NULL; + int inSize = wbxml_base64_decode(asciiEncodedIso1, &inStr); + RUNNER_ASSERT(inSize > 0); + RUNNER_ASSERT(NULL != inStr); + { + DPL::String asciiString = DPL::FromUTF8String(inStr); + + std::string result = DPL::ToUTF8String(asciiString); + + RUNNER_ASSERT(strlen(inStr) == result.size()); + + RUNNER_ASSERT(0 == memcmp(inStr, result.c_str(), result.size())); + } + + free(inStr); +} + +RUNNER_TEST(String_ConverterFromUTF32) +{ + wchar_t* inStr = NULL; + int inSize = wbxml_base64_decode(utf32Encoded, reinterpret_cast(&inStr)); + RUNNER_ASSERT(inSize > 0); + RUNNER_ASSERT(NULL != inStr); + char* outStr = NULL; + int outSize = wbxml_base64_decode(utf8Encoded, &outStr); + RUNNER_ASSERT(outSize > 0); + RUNNER_ASSERT(NULL != outStr); + outStr[outSize] = '\0'; + { + DPL::String utfString = DPL::FromUTF32String(inStr); + std::string result = DPL::ToUTF8String(utfString); + + RUNNER_ASSERT(strlen(outStr) == result.size()); + RUNNER_ASSERT(0 == memcmp(outStr, result.c_str(), result.size())); + + + RUNNER_ASSERT(inSize / sizeof(wchar_t) - 1 == utfString.size()); + RUNNER_ASSERT(0 == memcmp(inStr, &(utfString[0]), utfString.size() * sizeof(wchar_t))); + + } + + free(inStr); +} + +template +void String_TokenizeReal(const DelimiterType& delimiter) +{ + DPL::String str(L".##..abc.#."); + std::vector tokens; + DPL::Tokenize(str, delimiter, std::back_inserter(tokens)); + + std::vector expectedTokens; + for ( int i = 0 ; i < 5 ; i++ ) + expectedTokens.push_back(L""); + expectedTokens.push_back(L"abc"); + for ( int i = 0 ; i < 3 ; i++ ) + expectedTokens.push_back(L""); + + RUNNER_ASSERT(expectedTokens == tokens); + tokens.clear(); + expectedTokens.clear(); + + DPL::Tokenize(str, delimiter, std::back_inserter(tokens), true); + expectedTokens.push_back(L"abc"); + RUNNER_ASSERT(expectedTokens == tokens); +} + +RUNNER_TEST(String_Tokenize) +{ + String_TokenizeReal(L"#."); + String_TokenizeReal(L".#"); + String_TokenizeReal(L".....####.###.."); + String_TokenizeReal(DPL::String(L".#")); + + std::vector tokens; + DPL::Tokenize(std::string("abc.def"), '.', std::back_inserter(tokens)); + std::vector expectedTokens; + expectedTokens.push_back("abc"); + expectedTokens.push_back("def"); + + RUNNER_ASSERT(tokens == expectedTokens); +} + +template +void TestInStreams( + std::basic_string argumentInString, + std::basic_string argumentResultString) +{ + typedef std::basic_string + String; + std::basic_istringstream + istream(argumentInString); + int intValue = 0; + double doubleValue = 0.0; + float floatValue = 0.0; + String stringValue; + + istream >> intValue; + RUNNER_ASSERT(!istream.fail()); + istream >> doubleValue; + RUNNER_ASSERT(!istream.fail()); + istream >> floatValue; + RUNNER_ASSERT(!istream.fail()); + istream >> stringValue; + RUNNER_ASSERT(!istream.fail()); + + RUNNER_ASSERT(1 == intValue); + RUNNER_ASSERT(fabs(1.1f - doubleValue) < 0.00001); + RUNNER_ASSERT(fabs(1.1f - floatValue) < 0.00001); + RUNNER_ASSERT(argumentResultString == stringValue); +} + +template +void TestOutStreams( + std::basic_string argumentInString, + std::basic_string argumentResultString) +{ + typedef std::basic_string + String; + + std::basic_ostringstream + ostream; + + int intValue = 1; + double doubleValue = 1.1; + float floatValue = 1.1f; + String stringValue = argumentInString; + + ostream << intValue; + RUNNER_ASSERT(!ostream.fail()); + ostream << doubleValue; + RUNNER_ASSERT(!ostream.fail()); + ostream << floatValue; + RUNNER_ASSERT(!ostream.fail()); + ostream << stringValue; + RUNNER_ASSERT(!ostream.fail()); + + RUNNER_ASSERT(ostream.str() == argumentResultString); +} + +RUNNER_TEST(String_Streams) +{ + TestInStreams >("1 1.1 1.1 test", "test"); + TestInStreams >(L"1 1.1 1.1 test", L"test"); + TestInStreams(L"1 1.1 1.1 test", L"test"); + TestOutStreams >("test", "11.11.1test"); + TestOutStreams >(L"test", L"11.11.1test"); + TestOutStreams(L"test", L"11.11.1test"); +} + +RUNNER_TEST(String_CompareCaseSensitive) +{ + RUNNER_ASSERT( + DPL::StringCompare( + DPL::FromUTF32String(L"Ala Makota ma żołądkówkę"), + DPL::FromUTF32String(L"Ala Makota ma żołądkówkę")) == 0); +} + +RUNNER_TEST(String_CompareCaseInsensitive) +{ + RUNNER_ASSERT( + DPL::StringCompare( + DPL::FromUTF32String(L"Ala Makota ma żołądkówkę"), + DPL::FromUTF32String(L"AlA MakOTA ma Å»oŁąDKÓwkę"), + true) == 0); +} + diff --git a/tests/dpl/core/test_thread.cpp b/tests/dpl/core/test_thread.cpp new file mode 100644 index 0000000..202d468 --- /dev/null +++ b/tests/dpl/core/test_thread.cpp @@ -0,0 +1,100 @@ +/* + * 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_thread.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of thread tests + */ +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +bool g_wasFooDeleted; + +class Foo +{ +public: + int id; + Foo(int i=0): id(i) + { + LogInfo("Foo: ctor: " << id); + } + + ~Foo() + { + LogInfo("Foo: dtor: " << id); + g_wasFooDeleted = true; + } + + void Bar() + { + LogInfo("Foo: bar"); + } +}; + +typedef DPL::ThreadLocalVariable TlsFoo; +TlsFoo g_foo; + +class FooThread + : public DPL::Thread +{ +protected: + virtual int ThreadEntry() + { + LogInfo("In thread"); + + RUNNER_ASSERT(!g_foo); + RUNNER_ASSERT(g_foo.IsNull()); + + g_foo = Foo(); + g_foo->Bar(); + + return 0; + } +}; + +RUNNER_TEST(Thread_ThreadLocalVariable_FooDeletion) +{ + static TlsFoo staticFooForMain; + staticFooForMain = Foo(1); + + TlsFoo fooForMain; + fooForMain = Foo(2); + + RUNNER_ASSERT(!g_foo); + RUNNER_ASSERT(g_foo.IsNull()); + + g_wasFooDeleted = false; + + FooThread thread1; + thread1.Run(); + thread1.Quit(); + + RUNNER_ASSERT(!g_foo); + RUNNER_ASSERT(g_foo.IsNull()); + + RUNNER_ASSERT(g_wasFooDeleted == true); + + FooThread thread2; + thread2.Run(); + thread2.Quit(); + + RUNNER_ASSERT(!g_foo); + RUNNER_ASSERT(g_foo.IsNull()); +} diff --git a/tests/dpl/core/test_type_list.cpp b/tests/dpl/core/test_type_list.cpp new file mode 100644 index 0000000..98167f3 --- /dev/null +++ b/tests/dpl/core/test_type_list.cpp @@ -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 test_type_list.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 0.1 + * @brief + */ + +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(TypeList_TypeCount) +{ + typedef DPL::TypeListDecl::Type TestTypeList1; + typedef DPL::TypeListDecl::Type TestTypeList2; + typedef DPL::TypeListDecl<>::Type TestTypeList3; + typedef DPL::TypeList TestTypeList4; + + RUNNER_ASSERT(TestTypeList1::Size == 3); + RUNNER_ASSERT(TestTypeList2::Size == 1); + RUNNER_ASSERT(TestTypeList3::Size == 0); + RUNNER_ASSERT(TestTypeList4::Size == 4); + + RUNNER_ASSERT(TestTypeList4::Tail::Tail::Size == 2); +} diff --git a/tests/dpl/core/test_zip_input.cpp b/tests/dpl/core/test_zip_input.cpp new file mode 100644 index 0000000..5e5b9b4 --- /dev/null +++ b/tests/dpl/core/test_zip_input.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file test_zip_input.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of zip input tests + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +const char* PATH_NO_FILE = "/opt/share/wrt/wrt-commons/tests/core/no_such_file"; +const char* PATH_ARCHIVE = "/opt/share/wrt/wrt-commons/tests/core/sample.zip"; +const char* ARCHIVED_FILE = "sample.txt"; +} + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(ZipInput_OpenFailed) +{ + bool opened = true; + + Try + { + DPL::ZipInput zip(PATH_NO_FILE); + (void)zip; + } + Catch(DPL::ZipInput::Exception::OpenFailed) + { + opened = false; + } + + RUNNER_ASSERT(opened == false); +} + +RUNNER_TEST(ZipInput_OpenFile) +{ + DPL::ZipInput zip(PATH_ARCHIVE); + + FOREACH(iter, zip) + { + LogDebug("---------"); + LogDebug("FileInfo: "); +#define FIELD(X) LogDebug(#X ": " << iter->X) + FIELD(name); + FIELD(comment); + FIELD(compressedSize); + FIELD(uncompressedSize); +#undef FIELD + } +} + +RUNNER_TEST(ZipInput_UnzipSingleFile) +{ + DPL::ZipInput zip(PATH_ARCHIVE); + DPL::ZipInput::File *file = zip.OpenFile(ARCHIVED_FILE); + DPL::AbstractWaitableInputAdapter fileAdapter(file); + DPL::BinaryQueue buffer; + DPL::AbstractWaitableOutputAdapter bufferAdapter(&buffer); + + DPL::Copy(&fileAdapter, &bufferAdapter); + + DPL::ScopedArray data(new char[buffer.Size() + 1]); + buffer.Flatten(data.Get(), buffer.Size()); + data[buffer.Size()] = '\0'; + + RUNNER_ASSERT(std::string(data.Get()) == "test"); +} diff --git a/tests/dpl/db/CMakeLists.txt b/tests/dpl/db/CMakeLists.txt new file mode 100644 index 0000000..f4b5c22 --- /dev/null +++ b/tests/dpl/db/CMakeLists.txt @@ -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 CMakeLists.txt +# @author Lukasz Marek (l.marek@samsung.com) +# @version 1.0 +# @brief +# + +# +# Test files +# +# Define all DPL tests sources. +# Runner is responsible for runnint it all and +# generating proper output files +# + +SET(TARGET_NAME "dpl-tests-db") + +# Set DPL tests sources +SET(DPL_TESTS_DB_SOURCES + ${TESTS_DPL_DIR}/db/main.cpp + ${TESTS_DPL_DIR}/db/test_orm.cpp + ${TESTS_DPL_DIR}/db/test_sql_connection.cpp +) + +ADD_SUBDIRECTORY(orm) + +#include subdirectory +WRT_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/orm) +WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_NAME} ${TARGET_DPL_DB_EFL}) +WRT_TEST_BUILD(${TARGET_NAME} ${DPL_TESTS_DB_SOURCES}) +WRT_TEST_INSTALL(${TARGET_NAME}) + +INSTALL(FILES + ${TESTS_DPL_DIR}/db/orm/dpl_orm_test.db + DESTINATION /opt/share/wrt/wrt-commons/tests/db +) diff --git a/tests/dpl/db/main.cpp b/tests/dpl/db/main.cpp new file mode 100644 index 0000000..4ed6191 --- /dev/null +++ b/tests/dpl/db/main.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file main.cpp + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of main. + */ + +#include + +int main(int argc, char *argv[]) +{ + return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); +} diff --git a/tests/dpl/db/orm/CMakeLists.txt b/tests/dpl/db/orm/CMakeLists.txt new file mode 100644 index 0000000..b7ebafb --- /dev/null +++ b/tests/dpl/db/orm/CMakeLists.txt @@ -0,0 +1,11 @@ +WRT_INTROSPECT_TARGET(db ${TARGET_DPL_DB_EFL}) +WRT_CONVERT_TO_GCC_LIST(db_INCLUDE_DIRS_GCC ${db_INCLUDE_DIRS}) + +ADD_CUSTOM_COMMAND( OUTPUT dpl_orm_test_db.sql + COMMAND rm -f ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test.db + COMMAND C_INCLUDE_PATH=${db_INCLUDE_DIRS_GCC} gcc -Wall -E ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test_db_sql_generator.h | grep --invert-match "^#" > ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test_db.sql + COMMAND sqlite3 ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test.db ".read ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test_db.sql" || rm -f ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test.db + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test_db_sql_generator.h ${CMAKE_CURRENT_SOURCE_DIR}/dpl_orm_test_db +) + +ADD_CUSTOM_TARGET( Sqlite3Db ALL DEPENDS dpl_orm_test_db.sql ) diff --git a/tests/dpl/db/orm/dpl_orm_test_db b/tests/dpl/db/orm/dpl_orm_test_db new file mode 100644 index 0000000..8191624 --- /dev/null +++ b/tests/dpl/db/orm/dpl_orm_test_db @@ -0,0 +1,88 @@ + +CREATE_TABLE(TestTableInsert) + COLUMN(ColumnOptInt, INT,) + COLUMN(ColumnOptText, TEXT,) + COLUMN_NOT_NULL(ColumnInt, INT, DEFAULT 99) + COLUMN_NOT_NULL(ColumnInt2, INT,) + COLUMN_NOT_NULL(ColumnText, TEXT,) +CREATE_TABLE_END() + +CREATE_TABLE(TestTableDelete) + COLUMN(ColumnOptInt, INT,) + COLUMN(ColumnOptText, TEXT,) + COLUMN_NOT_NULL(ColumnInt, INT, DEFAULT 99) + COLUMN_NOT_NULL(ColumnInt2, INT,) + COLUMN_NOT_NULL(ColumnText, TEXT,) +CREATE_TABLE_END() + +SQL( + INSERT INTO TestTableDelete VALUES(1, "two", 3, 4, "five"); + INSERT INTO TestTableDelete VALUES(6, "seven", 8, 9, "ten"); + INSERT INTO TestTableDelete (ColumnInt2, ColumnText) VALUES(11, "twelve"); + INSERT INTO TestTableDelete (ColumnInt2, ColumnText) VALUES(13, "fourteen"); +) + +CREATE_TABLE(TestTable) + COLUMN(ColumnOptInt, INT,) + COLUMN(ColumnOptText, TEXT,) + COLUMN_NOT_NULL(ColumnInt, INT, DEFAULT 99) + COLUMN_NOT_NULL(ColumnInt2, INT,) + COLUMN_NOT_NULL(ColumnText, TEXT,) +CREATE_TABLE_END() + +SQL( + INSERT INTO TestTable VALUES(1, "two", 3, 4, "five"); + INSERT INTO TestTable VALUES(6, "seven", 8, 9, "ten"); + INSERT INTO TestTable (ColumnInt2, ColumnText) VALUES(11, "twelve"); + INSERT INTO TestTable (ColumnInt2, ColumnText) VALUES(13, "fourteen"); +) + +CREATE_TABLE(TestTableJoin1) + COLUMN_NOT_NULL(TestID, INT) + COLUMN_NOT_NULL(TestText, TEXT) + COLUMN(TestNumber, INT) + TABLE_CONSTRAINTS( + PRIMARY KEY(TestID) + ) +CREATE_TABLE_END() + +CREATE_TABLE(TestTableJoin2) + COLUMN_NOT_NULL(TestID, INT) + COLUMN_NOT_NULL(TestText1, TEXT) + COLUMN_NOT_NULL(TestText2, TEXT) + TABLE_CONSTRAINTS( + PRIMARY KEY(TestID) + ) +CREATE_TABLE_END() + +CREATE_TABLE(TestTableJoin3) + COLUMN_NOT_NULL(TestID, INT) + COLUMN(Value3, INT) + COLUMN(TestText33, TEXT) + TABLE_CONSTRAINTS( + PRIMARY KEY(TestID) + ) +CREATE_TABLE_END() + +SQL( + INSERT INTO TestTableJoin1 VALUES(1, "text val 1", 111); + INSERT INTO TestTableJoin1 VALUES(2, "text val 2", 222); + INSERT INTO TestTableJoin1 VALUES(3, "text val 3", 333); + INSERT INTO TestTableJoin1 VALUES(4, "text val 4", 444); + INSERT INTO TestTableJoin1 VALUES(5, "text val 5", 555); + INSERT INTO TestTableJoin1 VALUES(6, "text val 6", 666); + + INSERT INTO TestTableJoin2 VALUES(1, "01", "text2 1"); + INSERT INTO TestTableJoin2 VALUES(2, "02", "text2 2"); + INSERT INTO TestTableJoin2 VALUES(3, "03", "text2 3"); + INSERT INTO TestTableJoin2 VALUES(4, " 4 ", "text2 4"); + INSERT INTO TestTableJoin2 VALUES(5, "*5*", "text2 5"); + INSERT INTO TestTableJoin2 VALUES(10, "6", "text2 6"); + + INSERT INTO TestTableJoin3 VALUES(1, 111, "test 1"); + INSERT INTO TestTableJoin3 VALUES(2, 111, "test 2"); + INSERT INTO TestTableJoin3 VALUES(3, 222, "test 3"); + INSERT INTO TestTableJoin3 VALUES(6, 222, "test 4"); + INSERT INTO TestTableJoin3 (TestID, TestText33) VALUES(7, "test 5"); + INSERT INTO TestTableJoin3 (TestID, TestText33) VALUES(10, "test 6"); +) \ No newline at end of file diff --git a/tests/dpl/db/orm/dpl_orm_test_db_definitions b/tests/dpl/db/orm/dpl_orm_test_db_definitions new file mode 100644 index 0000000..da79427 --- /dev/null +++ b/tests/dpl/db/orm/dpl_orm_test_db_definitions @@ -0,0 +1,5 @@ +DATABASE_START(dpl_orm_test) + +#include "dpl_orm_test_db" + +DATABASE_END() diff --git a/tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h b/tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h new file mode 100644 index 0000000..d045a39 --- /dev/null +++ b/tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file dpl_orm_test_db_sql_generator.h + * @author Lukasz Marek (l.marek@samsung.com) + * @version 1.0 + * @brief Macro definitions for generating the SQL input file from database definition. + */ + +//Do not include this file directly! It is used only for SQL code generation. + +#include + +#include "dpl_orm_test_db_definitions" diff --git a/tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h.gch b/tests/dpl/db/orm/dpl_orm_test_db_sql_generator.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..5bd675d819280b19af780a02d2739acb3bf9f0f0 GIT binary patch literal 6521 zcmai3$&w^T5pB#62(gMqh`pEr)WxXEa$kdUS4}|M}bBs}uV9_n+T>bBTX+KTltN`guNhdh(U-i<4I`KEC<*Gyc!d>2F@Z zhweBzxp?vN=JNI6Y0*9PWBSK;>DQR?S!-s^+|-Yk#`I1HVGxD=pVHC~d3oE+H>Rzt z^(M^Bta?m)vNVm;`?UH^-Z5!6Y{2xwVVI{$nZ#*OL{U`a>E$3UCijjQE6nD}vL<7< z*RQUgU0;6GyZGek%OBCsx7aA1io-^y7yaHv@BaN>+kS@@zQv29X|*zE&4wN?-llK9 z&ELY)!nzox>AP-l0e zvxzu8{piK*AD>_LlVOdm{Q*CW^wke5Dnh-PF2)p7@W3r{ z_9vA5EU_MjMUrHBk_3622W6UuS(t9y7WEW+>*m~4o5iddbt%5OzCkeRE6N=PuHtc! z_urunQt(MLZ#KxsW@;Am_6Zz9p}#@D##F0W-O^W~25>&#j?A*!jHYea4)UtFZ9<(s_78h)L9OYU5Tes3O_!-pU zFfa40jKer7vM3JI{PIB@6kcML30^Ecvh_>)HRk;BV@`N8pDaxM;kIg<%@fni+h$(( zg7;|8_jn)7081AC&tF_W>+y$U0@Vx2{yJ}eesz8Ox)%biE@yFM>gBp=7jsmi9%SPQ zYA@>y*6o~NFt3585L^a#jKR_L>;aNd5OK~WMCw6WkU%9QkHRCu4k2QzkYEpSkWz8& zF(!<1*cOgjDp?ySslbXHqk8&m$1~zJ=((6sCc*av(1O1d&AMKhwmKuoEm!rVfi%Gd zk+t<^JTlY8dLu~yKjbkEaayg(AVVDh-%T%&K5Nd;>-EME5zptdn&DFn$+Q+ynBdgA8e-E*%{DYuO2N{AD~14u86zKpeCf}j#Ytj-g*5_J46=) zmDGw5DNaddgm2_u7VuA_l-;M&t@wmkfd3w27jho5D3Y{Jf5tbS-X!t`QP)1Q46Vu|XNRvEI ziy&`X)l>^L9u!!G4whIOoj}PU=m^zWV;~-@N zH?3dOlBU;=1P48Y3b}`H&aXrGUCPo|%Gp?#3x*(sKq=J$dxyW^_bzg}ni4RmE-)>g zuj=!L1bL-;jWv1JYK)YFCrovzJ61ve^PT6850ffK^M&ohyJR9D?M+@0{FF|}<*5kC zqHa-wB~cDrPcn8d8K%Sd9*U|;xzosKG(&u@%Mm3+Mlq2&J)lQ+;2fso@d4odo&oa;I>B~I$4I68t54`kpwl-2=WDe8tMrS;AX9@tQBc1(t0@DX$d&@em^bT<c&0gcc> zQc{nlaWA|agc*-{Qe6NMk?1f&HPi;+jn@*d$_u6>fx*Mc($F6YLYqRzE2~Yc6$nvg zD;9R!NO`V6ad|+dny$BJxLn|lz|;zc0e-A%{)%=AzqkSHbSF>$-=}T+aG;_cNQgg% zD)YNWyu*B$(>{%KxLZYBKo)Fl7%29W)sAT$dpJlmoI9fAP>+9L^ks?BEO&nT!yV=w zfZG^>Hl$P#Vv$_{zS!(K2S8~YhKvPdD#;!T33NzfzT^muqkM%gco4bRKfr1#NGEY1A z!=rVDp|f<1=19ELJv$&s3oLU4C2KGNAa`R3T_TVYksDg14u60s+?U>3tNcH%!2p3Vs@cFoJHM^U_ZT#`s^d@C|w)H*f)gbyDS6@nKutj%4|;13n~Dxh~m_ z{ucNp@@8da(k?2N6g(^*;26!5rv%VO39QS^7h?oa5^V&#M5M9@^yMCjjseGa8Y~q% zICsAk+R|zDm?^>-C?UbY6IieVVpL#BGJU4Gz7< z8BI-I;V~T|ECYNI4~oz|hqP)N-I*wl^i#eu%hUrL7Pg%tDnSh(&|MOgBv_LmEUqmB z$kRk`+pu^HA%12tCTKcDOFG8s3rC!%lN;5@>-xW;H77X0njrS*RpIyUG^U9EE-)M> zK^T=qk|p%!uLyG*IFfXN+Dd!m^oVVexg*W#ICQ`lsVMr*@jZJlX<4RX@+T^yILR`4 z!4MTiMlZUG33BD4Rcn@XqRO@=df7%fCCSW3qKO*-P6u($_h#{tf<%b60{YU6>;r*f z#JhP4uc^DINR&9nuLp<-ixt5k#br)x0}fiBJ6@0~vgj0w&r^sTe77Fhd#4M7Ub~0JS7O%F*QHdF+AO z+vojF0c~>QB=P3U1}z$^Sm+RhKopu$<0@+>T1kg1mm59e1h*D1S&%K4OM=ACn`R3q qy^GW98=WE$5YGUvZF?;Y>MF-DDConx;ptV`*>IDH%M1Q@!~X$0f4^1$ literal 0 HcmV?d00001 diff --git a/tests/dpl/db/orm/generator_dpl_orm_test.h b/tests/dpl/db/orm/generator_dpl_orm_test.h new file mode 100644 index 0000000..39bb1b7 --- /dev/null +++ b/tests/dpl/db/orm/generator_dpl_orm_test.h @@ -0,0 +1,24 @@ +/* + * 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 ORM_GENERATOR_DPL_ORM_TEST_H +#define ORM_GENERATOR_DPL_ORM_TEST_H + +#define ORM_GENERATOR_DATABASE_NAME dpl_orm_test_db_definitions +#include +#undef ORM_GENERATOR_DATABASE_NAME + +#endif diff --git a/tests/dpl/db/test_orm.cpp b/tests/dpl/db/test_orm.cpp new file mode 100644 index 0000000..9295ed2 --- /dev/null +++ b/tests/dpl/db/test_orm.cpp @@ -0,0 +1,851 @@ +/* + * 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 + +const char* PATH_DB = "/opt/share/wrt/wrt-commons/tests/db/dpl_orm_test.db"; + +//utils + +#define TEST_REPETITION 16 + +class SmartAttach +{ +public: + + SmartAttach(bool autoattach = true) : + m_interface(PATH_DB, + DPL::DB::SqlConnection::Flag::UseLucene), + m_autoattach(autoattach) + { + if (m_autoattach) { + m_interface.AttachToThread(DPL::DB::SqlConnection::Flag::RW); + } + } + + ~SmartAttach() + { + if (m_autoattach) { + m_interface.DetachFromThread(); + } + } + + DPL::DB::ThreadDatabaseSupport* get() + { + return &m_interface; + } +private: + DPL::DB::ThreadDatabaseSupport m_interface; + bool m_autoattach; +}; + +template +bool ContainerContentsEqual(const ContainerType1& container1, const ContainerType2& container2) +{ + using namespace DPL::DB::ORM::dpl_orm_test::TestTableInsert; + typedef std::set Set1; + typedef std::set Set2; + Set1 set1(container1.begin(), container1.end()); + Set2 set2(container2.begin(), container2.end()); + + for (typename Set1::iterator it = set1.begin(); + it != set1.end(); + it++) + { + LogDebug("Set1 element: " << *it); + } + + for (typename Set2::iterator it = set2.begin(); it != set2.end(); it++) + { + LogDebug("Set2 element: " << *it); + } + + return set1 == set2; +} + +template +std::list makeList(const T& a, const T& b) +{ + std::list list; + list.push_back(a); + list.push_back(b); + return list; +} + +//tests + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(ORM_SelectSingleValue) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + //Getting each column + { + TestTable::Select select(interface.get()); + select.Where(Equals(8)); + int result; + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == 6, "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(8)); + DPL::String result; + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == L"seven", "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(8)); + int result; + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 8, "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(8)); + int result; + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 9, "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(8)); + DPL::String result; + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == L"ten", "Got " << result); + } + + //Where on each column + { + TestTable::Select select(interface.get()); + select.Where(Equals(6)); + int result; + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == 6, "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(DPL::String(L"seven"))); + DPL::String result; + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == L"seven", "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(8)); + int result; + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 8, "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(9)); + int result; + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 9, "Got " << result); + } + { + TestTable::Select select(interface.get()); + select.Where(Equals(L"ten")); + DPL::String result; + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == L"ten", "Got " << result); + } +} + +RUNNER_TEST(ORM_SelectSingleRow) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + { + TestTable::Select select(interface.get()); + select.Where(Equals(3)); + TestTable::Row result = select.GetSingleRow(); + TestTable::Row expected; + expected.Set_ColumnOptInt(1); + expected.Set_ColumnOptText(DPL::String(L"two")); + expected.Set_ColumnInt(3); + expected.Set_ColumnInt2(4); + expected.Set_ColumnText(L"five"); + RUNNER_ASSERT_MSG(result == expected, "Got " << result); + } + + { + TestTable::Select select(interface.get()); + select.Where(Equals(DPL::String(L"seven"))); + TestTable::Row result = select.GetSingleRow(); + TestTable::Row expected; + expected.Set_ColumnOptInt(6); + expected.Set_ColumnOptText(DPL::String(L"seven")); + expected.Set_ColumnInt(8); + expected.Set_ColumnInt2(9); + expected.Set_ColumnText(L"ten"); + RUNNER_ASSERT_MSG(result == expected, "Got " << result); + } +} + +RUNNER_TEST(ORM_SelectRowList) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + { + TestTable::Select select(interface.get()); + select.Where(Equals(3)); + std::list result = select.GetRowList(); + RUNNER_ASSERT_MSG(result.size() == 1, "Got " << result.size()); + + TestTable::Row expected; + expected.Set_ColumnOptInt(1); + expected.Set_ColumnOptText(DPL::String(L"two")); + expected.Set_ColumnInt(3); + expected.Set_ColumnInt2(4); + expected.Set_ColumnText(L"five"); + RUNNER_ASSERT_MSG(*(result.begin()) == expected, "Got " << *(result.begin()) ); + } + + { + TestTable::Select select(interface.get()); + select.Where(Equals(DPL::String(L"seven"))); + std::list result = select.GetRowList(); + RUNNER_ASSERT_MSG(result.size() == 1, "Got " << result.size()); + + TestTable::Row expected; + expected.Set_ColumnOptInt(6); + expected.Set_ColumnOptText(DPL::String(L"seven")); + expected.Set_ColumnInt(8); + expected.Set_ColumnInt2(9); + expected.Set_ColumnText(L"ten"); + RUNNER_ASSERT_MSG(*(result.begin()) == expected, "Got " << *(result.begin()) ); + } + + { + TestTable::Select select(interface.get()); + select.Where(Equals(99)); + std::list result = select.GetRowList(); + + TestTable::Row expected1; + expected1.Set_ColumnInt(99); + expected1.Set_ColumnInt2(11); + expected1.Set_ColumnText(L"twelve"); + + TestTable::Row expected2; + expected2.Set_ColumnInt(99); + expected2.Set_ColumnInt2(13); + expected2.Set_ColumnText(L"fourteen"); + + RUNNER_ASSERT(ContainerContentsEqual(makeList(expected1, expected2), result)); + } +} + +RUNNER_TEST(ORM_SelectValueList) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + //Getting each column + { + TestTable::Select select(interface.get()); + select.Where(Is(DPL::Optional::Null)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(99, 99))); + } + { + TestTable::Select select(interface.get()); + select.Where(Is(DPL::Optional::Null)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(11, 13))); + } + { + TestTable::Select select(interface.get()); + select.Where(Is(DPL::Optional::Null)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(DPL::String(L"twelve"), DPL::String(L"fourteen")))); + } + { + TestTable::Select select(interface.get()); + select.Where(Is(DPL::Optional::Null)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(DPL::Optional::Null,DPL::Optional::Null))); + } + + //Where on each column + { + TestTable::Select select(interface.get()); + select.Where(Is(DPL::Optional::Null)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(11, 13))); + } + { + TestTable::Select select(interface.get()); + select.Where(Is(DPL::Optional::Null)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(11, 13))); + } + { + TestTable::Select select(interface.get()); + select.Where(Is(99)); + RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList(), + makeList(11, 13))); + } +} + +RUNNER_TEST(ORM_MultipleCalls) +{ + for (int j = 0 ; j < TEST_REPETITION ; j++ ) + { + for (int i = 0 ; i < TEST_REPETITION ; i++ ) + ORM_SelectSingleValue(); + + for (int i = 0 ; i < TEST_REPETITION ; i++ ) + ORM_SelectSingleRow(); + + for (int i = 0 ; i < TEST_REPETITION ; i++ ) + ORM_SelectRowList(); + + for (int i = 0 ; i < TEST_REPETITION ; i++ ) + ORM_SelectValueList(); + } +} + +RUNNER_TEST(ORM_Insert) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + + TestTableInsert::Select select1(interface.get()); + std::list resultList = select1.GetValueList(); + RUNNER_ASSERT_MSG(resultList.size() == 0, "Returned list has wrong size: " << resultList.size()); + std::list list; + + TestTableInsert::Insert insert(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnOptInt(1); + row.Set_ColumnInt2(2); + row.Set_ColumnText(L"three"); + insert.Values(row); + insert.Execute(); + + row.Set_ColumnInt(99); + list.push_back(row); + { + TestTableInsert::Select select2(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select2.GetRowList(), list), "Returned list doesn't match."); + } + + TestTableInsert::Insert insert2(interface.get()); + TestTableInsert::Row row2; + row2.Set_ColumnInt(4); + row2.Set_ColumnInt2(5); + row2.Set_ColumnText(L"six"); + insert2.Values(row2); + insert2.Execute(); + + list.push_back(row2); + { + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + TestTableInsert::Insert insert3(interface.get()); + TestTableInsert::Row row3; + row3.Set_ColumnOptInt(1); + row3.Set_ColumnInt2(7); + row3.Set_ColumnText(L"eight"); + insert3.Values(row3); + insert3.Execute(); + + row3.Set_ColumnInt(99); + list.push_back(row3); + { + TestTableInsert::Select select3(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select3.GetRowList(), list), "Returned list doesn't match."); + } + + TestTableInsert::Insert insert4(interface.get()); + TestTableInsert::Row row4; + row4.Set_ColumnOptInt(9); + row4.Set_ColumnInt2(10); + row4.Set_ColumnText(L"eleven"); + insert4.Values(row4); + insert4.Execute(); + + row4.Set_ColumnInt(99); + list.push_back(row4); + { + TestTableInsert::Select select4(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select4.GetRowList(), list), "Returned list doesn't match."); + } + + // restore original table state + { + TestTableInsert::Delete del(interface.get()); + del.Execute(); + + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT(select.GetRowList().size() == 0); + } +} + +RUNNER_TEST(ORM_MultipleBindInsert) +{ + for ( int i = 0 ; i < TEST_REPETITION ; i++ ) + { + ORM_Insert(); + } +} + +RUNNER_TEST(ORM_Delete) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + TestTableDelete::Select selectStart(interface.get()); + selectStart.OrderBy("ColumnInt2 ASC"); + std::list list = selectStart.GetRowList(); + std::list originalList = list; + + std::vector vector(list.begin(), list.end()); + RUNNER_ASSERT_MSG(list.size() == 4, "Returned list has wrong size: " << list.size()); + + typedef DPL::String S; + + //no-act deletes + { + TestTableDelete::Delete del(interface.get()); + del.Where(And(Equals(1), Equals(S(L"seven")))); + del.Execute(); + + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + { + TestTableDelete::Delete del(interface.get()); + del.Where(And(Equals(6), Equals(S(L"two")))); + del.Execute(); + + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + { + TestTableDelete::Delete del(interface.get()); + del.Where(Equals(10)); + del.Execute(); + + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + //act deletes + { + list.remove(vector[1]); + + TestTableDelete::Delete del(interface.get()); + del.Where(And(Equals(6), Equals(L"ten"))); + del.Execute(); + + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + { + list.remove(vector[2]); + list.remove(vector[3]); + + TestTableDelete::Delete del(interface.get()); + del.Where(Is(DPL::Optional::Null)); + del.Execute(); + + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + { + TestTableDelete::Delete del(interface.get()); + del.Execute(); + + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(select.GetRowList().size() == 0, "Returned list is not empty"); + } + + // Restore original table state + // This also tests if multiple different binds for Insert are working properly + for (std::list::iterator i = originalList.begin(); i != originalList.end(); i++) + { + TestTableDelete::Insert insert(interface.get()); + insert.Values(*i); + insert.Execute(); + } + + { + TestTableDelete::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), originalList), "Returned list doesn't match."); + } + +} + +RUNNER_TEST(ORM_MultipleBindDelete) +{ + for ( int i = 0 ; i < TEST_REPETITION ; i++ ) + { + ORM_Delete(); + } +} + +RUNNER_TEST(ORM_MultipleBindWhere) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + { + TestTable::Select select(interface.get()); + int result; + select.Where(Equals(8)); + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == 6, "Got " << result); + + select.Where(Equals(3)); + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == 1, "Got " << result); + + select.Where(Equals(8)); + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == 6, "Got " << result); + + select.Where(Equals(3)); + RUNNER_ASSERT_MSG((result = *select.GetSingleValue()) == 1, "Got " << result); + } + + { + TestTable::Select select(interface.get()); + int result; + select.Where(And(Equals(99), + Equals(L"fourteen"))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 13, "Got " << result); + + select.Where(And(Equals(99), + Equals(L"twelve"))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 11, "Got " << result); + + select.Where(And(Equals(99), + Equals(L"fourteen"))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 13, "Got " << result); + + select.Where(And(Equals(99), + Equals(L"twelve"))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 11, "Got " << result); + } + + { + TestTable::Select select(interface.get()); + int result; + select.Where(And(Equals(L"fourteen"), + Equals(99))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 13, "Got " << result); + + select.Where(And(Equals(L"twelve"), + Equals(99))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 11, "Got " << result); + + select.Where(And(Equals(L"fourteen"), + Equals(99))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 13, "Got " << result); + + select.Where(And(Equals(L"twelve"), + Equals(99))); + RUNNER_ASSERT_MSG((result = select.GetSingleValue()) == 11, "Got " << result); + + } + +} + +RUNNER_TEST(ORM_Update) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + + std::list list; + + TestTableInsert::Delete del(interface.get()); + del.Execute(); + + // INSERT + { + TestTableInsert::Insert insert(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnOptInt(5); + row.Set_ColumnInt2(2); + row.Set_ColumnText(L"two"); + insert.Values(row); + insert.Execute(); + + row.Set_ColumnInt(99); + list.push_back(row); + } + { + TestTableInsert::Insert insert(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnOptInt(1); + row.Set_ColumnInt2(2); + row.Set_ColumnText(L"three"); + insert.Values(row); + insert.Execute(); + + row.Set_ColumnInt(99); + list.push_back(row); + } + { + TestTableInsert::Insert insert(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnOptInt(2); + row.Set_ColumnInt2(3); + row.Set_ColumnText(L"three"); + insert.Values(row); + insert.Execute(); + + row.Set_ColumnInt(99); + list.push_back(row); + + // CHECK + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + { + // UPDATE - no rows + TestTableInsert::Update update(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnInt2(4); + row.Set_ColumnText(L"four"); + update.Values(row); + update.Where(Equals(12)); + update.Execute(); + + // CHECK + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + { + // UPDATE - one row + TestTableInsert::Update update(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnInt2(2); + row.Set_ColumnText(L"four"); + update.Values(row); + update.Where(Equals(3)); + update.Execute(); + + list.back().Set_ColumnInt2(2); + list.back().Set_ColumnText(L"four"); + + // CHECK + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + { + // UPDATE - multiple rows + TestTableInsert::Update update(interface.get()); + TestTableInsert::Row row; + row.Set_ColumnText(L"dup"); + update.Values(row); + update.Where(Equals(2)); + update.Execute(); + + FOREACH(it, list) + { + it->Set_ColumnText(L"dup"); + } + + // CHECK + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT_MSG(ContainerContentsEqual(select.GetRowList(), list), "Returned list doesn't match."); + } + + // restore original table state + { + TestTableInsert::Delete del2(interface.get()); + del2.Execute(); + + TestTableInsert::Select select(interface.get()); + RUNNER_ASSERT(select.GetRowList().size() == 0); + } +} + +RUNNER_TEST(ORM_MultipleBindUpdate) +{ + for ( int i = 0 ; i < TEST_REPETITION ; i++ ) + { + ORM_Update(); + } +} + +RUNNER_TEST(ORM_transactions) +{ + SmartAttach interface; + DPL::DB::ORM::dpl_orm_test::ScopedTransaction transaction(interface.get()); +} + +RUNNER_TEST(ORM_MultiAttach) +{ + SmartAttach interface(false); + RUNNER_ASSERT_MSG(!interface.get()->IsAttached(), "Is attached, but shouldn't be."); + interface.get()->AttachToThread(); + RUNNER_ASSERT_MSG(interface.get()->IsAttached(), "Isn't attached, but should be."); + interface.get()->AttachToThread(); + RUNNER_ASSERT_MSG(interface.get()->IsAttached(), "Isn't attached, but should be."); + interface.get()->DetachFromThread(); + RUNNER_ASSERT_MSG(interface.get()->IsAttached(), "Isn't attached, but should be."); + interface.get()->DetachFromThread(); + RUNNER_ASSERT_MSG(!interface.get()->IsAttached(), "Is attached, but shouldn't be."); +} + +RUNNER_TEST(ORM_Join) +{ + SmartAttach interface; + using namespace DPL::DB::ORM; + using namespace DPL::DB::ORM::dpl_orm_test; + + typedef DPL::TypeListDecl::Type JoinColumns; + + /* Test for correct join: + * 5 ids from first table matches 5 ids from second table thus join result + * contains 5 rows */ + TestTableJoin1::Select select(interface.get()); + select.Join(Equal()); + std::list> rowlist = + select.GetCustomRowList>(); + + RUNNER_ASSERT_MSG(rowlist.size() == 5, "Invalid number of rows fetched: " << rowlist.size()); + + std::string text; + std::ostringstream oss; + int cnt = 0; + FOREACH(rowit, rowlist) + { + cnt++; + + text = DPL::ToUTF8String((*rowit).GetColumnData()); + oss << "text val " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from first column: " + << text << " expected: " << oss.str()); + oss.str(std::string()); + + text = DPL::ToUTF8String((*rowit).GetColumnData()); + oss << "text2 " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from second column: " + << text << " expected: " << oss.str()); + oss.str(std::string()); + } + /* Test for empty join: + * None of number values from first table matches ids from second table + * - join result should be empty */ + TestTableJoin1::Select select2(interface.get()); + select2.Join(Equal()); + rowlist = select2.GetCustomRowList>(); + + RUNNER_ASSERT_MSG(rowlist.empty(), "Result should be empty but it is not!"); + + /* Test for "converted" join: + * - join made with int column and text column as keys + * - expected 5 matching rows (one row of 6 should not be matched)*/ + TestTableJoin1::Select select3(interface.get()); + select3.Join(Equal()); + rowlist = select3.GetCustomRowList>(); + RUNNER_ASSERT_MSG(rowlist.size() == 5, "Expected 5 rows while received: " << rowlist.size()); + cnt = 0; + FOREACH(rowit, rowlist) + { + cnt++; + // look at last two insertions into TestTableJoin2 + // for this skip understanding + if(cnt == 5) { + cnt = 6; + } + text = DPL::ToUTF8String((*rowit).GetColumnData()); + oss << "text val " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from first column: " + << text << " expected: " << oss.str() << " iteration: " <()); + oss << "text2 " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from second column: " + << text << " expected: " << oss.str() << " iteration: " <::Type JoinTables2; + TestTableJoin1::Select select4(interface.get()); + select4.Join(Equal()); + std::list> rowlist2 = select4.GetCustomRowList>(); + RUNNER_ASSERT_MSG(rowlist2.size() == 4, "Expected 4 rows while received: " << rowlist.size()); + cnt = 0; + DPL::Optional optext; + FOREACH(rowit, rowlist2) + { + cnt++; + + text = DPL::ToUTF8String((*rowit).GetColumnData()); + // values expected in subsequent (1,2,3,4) iterations: 1 1 2 2 + oss << "text val " << (1+(int)(cnt/3)); + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from first column: " + << text << " expected: " << oss.str() << " iteration: " <(); + text = DPL::ToUTF8String(*optext); + oss << "test " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from second column: " + << text << " expected: " << oss.str() << " iteration: " <::Type Join3Tables; + TestTableJoin1::Select select5(interface.get()); + select5.Join(Equal()); + select5.Join(Equal()); + std::list> rowlist3tab = select5.GetCustomRowList>(); + RUNNER_ASSERT_MSG(rowlist3tab.size() == 3, "Expected 3 rows while received: " << rowlist3tab.size()); + cnt = 0; + FOREACH(rowit, rowlist3tab) + { + cnt++; + + text = DPL::ToUTF8String((*rowit).GetColumnData()); + oss << "text val " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from first column: " + << text << " expected: " << oss.str() << " iteration: " <()); + oss << "text2 " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from first column: " + << text << " expected: " << oss.str() << " iteration: " <(); + text = DPL::ToUTF8String(*optext); + oss << "test " << cnt; + RUNNER_ASSERT_MSG(text.compare(oss.str()) == 0, "Invalid value from second column: " + << text << " expected: " << oss.str() << " iteration: " < +#include +#include +#include +#include +#include +#include +#include +#include + +extern const char* PATH_DB; + +RUNNER_TEST_GROUP_INIT(DPL) + +class AbstractSynchronizationObjectGenerator +{ +public: + virtual ~AbstractSynchronizationObjectGenerator() {} + + virtual DPL::DB::SqlConnection::SynchronizationObject *Create() = 0; +}; + +class NaiveSynchronizationObjectGenerator + : public AbstractSynchronizationObjectGenerator +{ +public: + virtual DPL::DB::SqlConnection::SynchronizationObject *Create() + { + return new DPL::DB::NaiveSynchronizationObject(); + } +}; + +void MassiveReadWriteTest(AbstractSynchronizationObjectGenerator *generator); + +class StressGenerator + : public DPL::Thread +{ +private: + size_t m_prefix; + std::string m_dbFileName; + AbstractSynchronizationObjectGenerator *m_generator; + +protected: + virtual int ThreadEntry() + { + DPL::DB::SqlConnection connection( + m_dbFileName, + DPL::DB::SqlConnection::Flag::None, + DPL::DB::SqlConnection::Flag::RW, + m_generator->Create()); + + DPL::DB::SqlConnection::DataCommandAutoPtr countCommand = + connection.PrepareDataCommand( + "SELECT COUNT(*) FROM test WHERE value=?"); + + for (size_t i = 0; i < 10; ++i) + { + std::ostringstream valueStream; + + valueStream << "value_"; + valueStream << static_cast(m_prefix); + valueStream << "_"; + valueStream << static_cast(i); + + std::string value = valueStream.str(); + + connection.ExecCommand( + "INSERT INTO test VALUES ('%s');", + value.c_str()); + + countCommand->BindString(1, value.c_str()); + + RUNNER_ASSERT(countCommand->Step()); + + RUNNER_ASSERT(countCommand->GetColumnString(0) == "1"); + + countCommand->Reset(); + } + + countCommand.reset(); + + return 0; + } + +public: + StressGenerator(size_t prefix, + const std::string &dbFileName, + AbstractSynchronizationObjectGenerator *generator) + : m_prefix(prefix), + m_dbFileName(dbFileName), + m_generator(generator) + { + } +}; + +typedef std::shared_ptr ThreadPtr; + +void MassiveReadWriteTest(AbstractSynchronizationObjectGenerator *generator) +{ + DPL::DB::SqlConnection connection(PATH_DB, + DPL::DB::SqlConnection::Flag::UseLucene, + DPL::DB::SqlConnection::Flag::RW); + + connection.ExecCommand("CREATE TABLE test(value TEXT);"); + + const size_t STRESS_GENERATOR_COUNT = 5; + ThreadPtr stressGenerators[STRESS_GENERATOR_COUNT]; + + for (size_t i = 0; i < STRESS_GENERATOR_COUNT; ++i) + { + stressGenerators[i].reset( + new StressGenerator(i, PATH_DB, generator)); + + stressGenerators[i]->Run(); + } + + for (size_t i = 0; i < STRESS_GENERATOR_COUNT; ++i) + stressGenerators[i]->Quit(); + + connection.ExecCommand("DROP TABLE test;"); +} + +RUNNER_TEST(SqlConnection_MassiveReadWrite_NaiveSynchronization) +{ + srand(time(NULL)); + + NaiveSynchronizationObjectGenerator m_generator; + MassiveReadWriteTest(&m_generator); +} + + + + + + +RUNNER_TEST(SqlConnection_Not_Connected_Lucene) +{ + Try { + DPL::DB::SqlConnection connection("/notexisitingdirectiory/foo", + DPL::DB::SqlConnection::Flag::UseLucene, + DPL::DB::SqlConnection::Flag::RW); + RUNNER_ASSERT_MSG(false, + "connection should throw on accessing " + "nonexistent file as a database"); + } + Catch (DPL::DB::SqlConnection::Exception::ConnectionBroken) + { + RUNNER_ASSERT(true); + } + catch (DPL::Exception) + { + RUNNER_ASSERT_MSG(false, "Wrong exception found"); + } +} + +RUNNER_TEST(SqlConnection_Not_Connected) +{ + Try { + DPL::DB::SqlConnection connection("/notexisitingdirectiory/foo", + DPL::DB::SqlConnection::Flag::None, + DPL::DB::SqlConnection::Flag::RW); + RUNNER_ASSERT_MSG(false, + "connection should throw on accessing " + "nonexistent file as a database"); + } + Catch (DPL::DB::SqlConnection::Exception::ConnectionBroken) + { + RUNNER_ASSERT(true); + } + catch (DPL::Exception) + { + RUNNER_ASSERT_MSG(false, "Wrong exception found"); + } +} + +RUNNER_TEST(SqlConnection_Null_Query) +{ + DPL::DB::SqlConnection connection(PATH_DB, + DPL::DB::SqlConnection::Flag::UseLucene, + DPL::DB::SqlConnection::Flag::RW); + Try + { + connection.ExecCommand(NULL); + RUNNER_ASSERT_MSG(false, + "Null pointer should not be accepted"); + } + Catch (DPL::DB::SqlConnection::Exception::SyntaxError) + { + RUNNER_ASSERT(true); + } + catch (DPL::Exception) + { + RUNNER_ASSERT_MSG(false, "Wrong exception found"); + } + +} + +RUNNER_TEST(SqlConnection_Bad_Query) +{ + DPL::DB::SqlConnection connection(PATH_DB, + DPL::DB::SqlConnection::Flag::UseLucene, + DPL::DB::SqlConnection::Flag::RW); + Try + { + connection.ExecCommand("Some stupid string"); + RUNNER_ASSERT_MSG(false, "This string should not be accepted"); + } + Catch (DPL::DB::SqlConnection::Exception::SyntaxError) + { + RUNNER_ASSERT(true); + } + catch (DPL::Exception) + { + RUNNER_ASSERT_MSG(false, "Wrong exception found"); + } +} diff --git a/tests/dpl/dbus/CMakeLists.txt b/tests/dpl/dbus/CMakeLists.txt new file mode 100644 index 0000000..066ad79 --- /dev/null +++ b/tests/dpl/dbus/CMakeLists.txt @@ -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. +# +# @file CMakeLists.txt +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +INCLUDE(FindPkgConfig) + +PKG_CHECK_MODULES(DEPENDENCIES gthread-2.0 REQUIRED) + +SET(TARGET_DBUS_TESTS "dpl-tests-dbus") +SET(TARGET_DBUS_TEST_SERVICE "dpl-dbus-test-service") + +SET(DBUS_TESTS_SRCS + ${TESTS_DPL_DIR}/dbus/main.cpp + ${TESTS_DPL_DIR}/dbus/test_cases.cpp + ${TESTS_DPL_DIR}/dbus/dbus_test.cpp + ${TESTS_COMMON_DIR}/src/loop_control.cpp +) + +SET(DBUS_TEST_SERVICE_SRCS + ${TESTS_DPL_DIR}/dbus/test_service.cpp + ${TESTS_COMMON_DIR}/src/loop_control.cpp +) + +WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_DBUS_TESTS} ${TARGET_DPL_DBUS_EFL}) +WRT_TEST_INCLUDE_DIRECTORIES(${TARGET_DBUS_TESTS} + ${TESTS_COMMON_DIR}/include + ${DEPENDENCIES_INCLUDE_DIRS} +) +WRT_TEST_LINK_DIRECTORIES(${TARGET_DBUS_TESTS} ${DEPENDENCIES_LIBRARY_DIRS}) +WRT_TEST_TARGET_LINK_LIBRARIES(${TARGET_DBUS_TESTS} ${DEPENDENCIES_LIBRARIES}) +WRT_TEST_BUILD(${TARGET_DBUS_TESTS} ${DBUS_TESTS_SRCS}) +WRT_TEST_INSTALL(${TARGET_DBUS_TESTS}) + +WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_DBUS_TEST_SERVICE} ${TARGET_DPL_DBUS_EFL}) +WRT_TEST_INCLUDE_DIRECTORIES(${TARGET_DBUS_TEST_SERVICE} + ${TESTS_COMMON_DIR}/include + ${DEPENDENCIES_INCLUDE_DIRS} +) +WRT_TEST_LINK_DIRECTORIES(${TARGET_DBUS_TEST_SERVICE} ${DEPENDENCIES_LIBRARY_DIRS}) +WRT_TEST_TARGET_LINK_LIBRARIES(${TARGET_DBUS_TEST_SERVICE} ${DEPENDENCIES_LIBRARIES}) +WRT_TEST_BUILD(${TARGET_DBUS_TEST_SERVICE} ${DBUS_TEST_SERVICE_SRCS}) +WRT_TEST_INSTALL(${TARGET_DBUS_TEST_SERVICE}) + +INSTALL(FILES + ${TESTS_DPL_DIR}/dbus/data/org.tizen.DBusTestService.service + DESTINATION /usr/share/dbus-1/services +) diff --git a/tests/dpl/dbus/data/org.tizen.DBusTestService.service b/tests/dpl/dbus/data/org.tizen.DBusTestService.service new file mode 100644 index 0000000..f024543 --- /dev/null +++ b/tests/dpl/dbus/data/org.tizen.DBusTestService.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.tizen.DBusTestService +Exec=/usr/bin/dpl-dbus-test-service diff --git a/tests/dpl/dbus/dbus_test.cpp b/tests/dpl/dbus/dbus_test.cpp new file mode 100644 index 0000000..6071f9f --- /dev/null +++ b/tests/dpl/dbus/dbus_test.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file dbus_test.cpp + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @brief Implementation file for DBusTest and DBusTestManager. + */ + +#include +#include "loop_control.h" +#include "dbus_test.h" + +DBusTest::DBusTest(const std::string& name) + : m_name(name), + m_status(Status::NONE) +{ +} + +void DBusTest::run(unsigned int timeout) +{ + DPL::Event::ControllerEventHandler::Touch(); + DPL::Event::ControllerEventHandler::Touch(); + + DPL::Event::ControllerEventHandler::PostTimedEvent( + TimeoutEvent(), timeout); + + LoopControl::wrt_start_loop(); + + switch (m_status) + { + case Status::FAILED: + throw DPL::Test::TestRunner::TestFailed(m_name.c_str(), + __FILE__, + __LINE__, + m_message); + + default: + break; + } +} + +void DBusTest::quit() +{ + DPL::Event::ControllerEventHandler::PostEvent(QuitEvent()); +} + +void DBusTest::setStatus(Status status) +{ + m_status = status; +} + +void DBusTest::setMessage(const std::string& message) +{ + m_message = message; +} + +void DBusTest::success() +{ + m_status = Status::SUCCESS; +} + +void DBusTest::fail(const std::string& message) +{ + m_status = Status::FAILED; + m_message = message; +} + +void DBusTest::OnEventReceived(const TimeoutEvent& /*event*/) +{ + fail("Test timed out."); + + // Saving one event dispatch since Quit and Timeout work on the same thread. + LoopControl::wrt_end_loop(); +} + +void DBusTest::OnEventReceived(const QuitEvent& /*event*/) +{ + LoopControl::wrt_end_loop(); +} + +DBusTestManager& DBusTestManager::getInstance() +{ + static DBusTestManager instance; + return instance; +} + +DBusTestManager::DBusTestManager() : m_test(NULL) { } + +DBusTest& DBusTestManager::getCurrentTest() const +{ + Assert(NULL != m_test && "Test not set."); + + return *m_test; +} + +void DBusTestManager::setCurrentTest(DBusTest& test) +{ + m_test = &test; +} + +void DBusTestManager::clear() +{ + m_test = NULL; +} diff --git a/tests/dpl/dbus/dbus_test.h b/tests/dpl/dbus/dbus_test.h new file mode 100644 index 0000000..9b5061e --- /dev/null +++ b/tests/dpl/dbus/dbus_test.h @@ -0,0 +1,90 @@ +/* + * 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 dbus_test.h + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @brief Header file for DBusTest and DBusTestManager. + */ + +#ifndef WRT_TESTS_DBUS_TESTS_DBUS_TEST_H +#define WRT_TESTS_DBUS_TESTS_DBUS_TEST_H + +#include +#include +#include + +DECLARE_GENERIC_EVENT_0(QuitEvent) +DECLARE_GENERIC_EVENT_0(TimeoutEvent) + +class DBusTest : + private DPL::Event::Controller::Type> +{ +public: + enum class Status + { + NONE, + SUCCESS, + FAILED + }; + + explicit DBusTest(const std::string& name); + + void run(unsigned int timeout); + void quit(); + + void setStatus(Status status); + void setMessage(const std::string& message); + + void success(); + void fail(const std::string& message = std::string()); + +private: + void OnEventReceived(const TimeoutEvent& event); + void OnEventReceived(const QuitEvent& event); + + std::string m_name; + Status m_status; + std::string m_message; +}; + +class DBusTestManager : private DPL::Noncopyable +{ +public: + static DBusTestManager& getInstance(); + + DBusTest& getCurrentTest() const; + void setCurrentTest(DBusTest& test); + + void clear(); + +private: + DBusTestManager(); + + DBusTest* m_test; +}; + +#define DBUS_TEST(TestProc) \ + void DBus##TestProc(); \ + RUNNER_TEST(TestProc) \ + { \ + DBusTest test(#TestProc); \ + DBusTestManager::getInstance().setCurrentTest(test); \ + DBus##TestProc(); \ + DBusTestManager::getInstance().clear(); \ + } \ + void DBus##TestProc() + +#endif diff --git a/tests/dpl/dbus/main.cpp b/tests/dpl/dbus/main.cpp new file mode 100644 index 0000000..55a8950 --- /dev/null +++ b/tests/dpl/dbus/main.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file main.cpp + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of main. + */ + +#include "loop_control.h" +#include +#include + +int main(int argc, char *argv[]) +{ + LoopControl::init_loop(argc, argv); + + LogInfo("Running tests"); + int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); + + return status; +} diff --git a/tests/dpl/dbus/test_cases.cpp b/tests/dpl/dbus/test_cases.cpp new file mode 100644 index 0000000..dfb3c7e --- /dev/null +++ b/tests/dpl/dbus/test_cases.cpp @@ -0,0 +1,190 @@ +/* + * 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 TestCases.cpp + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @version 1.0 + * @brief Implementation file for test cases for DBus internal tests. + */ + +#include +#include +#include +#include +#include +#include +#include "dbus_test.h" + +namespace { +const std::string dbusServiceName = "org.freedesktop.DBus"; +const std::string dbusObjectPath = "/"; +const std::string dbusInterfaceName = "org.freedesktop.DBus"; +const std::string dbusMethodGetId = "GetId"; + +const std::string serviceName = "org.tizen.DBusTestService"; +const std::string objectPath = "/org/tizen/DBusTestService"; +const std::string interfaceName = "org.tizen.DBusTestService"; +const std::string methodNameEcho = "echo"; +const std::string methodNameQuit = "quit"; +const std::string nodeInfo = + "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +const std::string challenge = "Hello world!"; + +const int DEFAULT_TIMEOUT = 2; // in seconds +} + +RUNNER_TEST_GROUP_INIT(DPL) + +RUNNER_TEST(AcquireSessionBus) +{ + try + { + DPL::DBus::Connection::sessionBus(); + } + catch (const DPL::DBus::Exception& ex) + { + RUNNER_ASSERT_MSG(false, ex.DumpToString()); + } +} + +RUNNER_TEST(AcquireSystemBus) +{ + try + { + DPL::DBus::Connection::systemBus(); + } + catch (const DPL::DBus::Exception& ex) + { + RUNNER_ASSERT_MSG(false, ex.DumpToString()); + } +} + +RUNNER_TEST(ParseNodeInfo) +{ + try + { + auto ifaces = DPL::DBus::Interface::fromXMLString(nodeInfo); + RUNNER_ASSERT(!ifaces.empty()); + + auto iface = ifaces.at(0); + RUNNER_ASSERT(NULL != iface->getVTable()); + RUNNER_ASSERT(NULL != iface->getInfo()); + } + catch (const DPL::DBus::Exception& ex) + { + RUNNER_ASSERT_MSG(false, ex.DumpToString()); + } +} + +RUNNER_TEST(InvokeRemoteMethod) +{ + try + { + auto connection = DPL::DBus::Connection::systemBus(); + auto freedesktop = connection->createObjectProxy(dbusServiceName, + dbusObjectPath); + auto getId = freedesktop->createMethodProxy + (dbusInterfaceName, dbusMethodGetId); + RUNNER_ASSERT(!getId().empty()); + } + catch (const DPL::DBus::Exception& ex) + { + RUNNER_ASSERT_MSG(false, ex.DumpToString()); + } +} + +class RegisterServiceListener : + public DPL::Event::EventListener +{ +public: + void OnEventReceived( + const DPL::DBus::ConnectionEvents::ServiceNameAcquiredEvent& event) + { + DBusTest& test = DBusTestManager::getInstance().getCurrentTest(); + + auto name = event.GetArg0(); + if (serviceName == name) + { + test.success(); + } + else + { + test.fail("Acquired service name: " + name); + } + test.quit(); + } +}; + +DBUS_TEST(RegisterService) +{ + try + { + RegisterServiceListener listener; + + auto connection = DPL::DBus::Connection::sessionBus(); + connection->DPL::Event::EventSupport::AddListener(&listener); + connection->registerService(serviceName); + + DBusTestManager::getInstance().getCurrentTest().run(DEFAULT_TIMEOUT); + } + catch (const DPL::DBus::Exception& ex) + { + RUNNER_ASSERT_MSG(false, ex.DumpToString()); + } +} + +/** + * This test checks: + * - object registration (done on the wrt-dbus-test-service side) + * - service registration (done on the wrt-dbus-test-service side) + * - dispatching method calls (done on the wrt-dbus-test-service side) + * - launching dbus service on demand + * - invoking remote method(s) + */ +DBUS_TEST(InvokeTestService) +{ + try + { + auto connection = DPL::DBus::Connection::sessionBus(); + auto testService = connection->createObjectProxy(serviceName, + objectPath); + auto echo = testService->createMethodProxy + (interfaceName, methodNameEcho); + auto response = echo(challenge); + + testService->createMethodProxy(interfaceName, methodNameQuit)(); + + RUNNER_ASSERT_MSG(response == challenge, + "[challenge = " << challenge << + ", response = " << response << "]"); + } + catch (const DPL::DBus::Exception& ex) + { + RUNNER_ASSERT_MSG(false, ex.DumpToString()); + } +} diff --git a/tests/dpl/dbus/test_service.cpp b/tests/dpl/dbus/test_service.cpp new file mode 100644 index 0000000..bc2e3f8 --- /dev/null +++ b/tests/dpl/dbus/test_service.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file test_service.cpp + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @brief Implementation file for wrt-dbus-test-service. + */ + +#include +#include +#include +#include +#include +#include + +namespace { +const std::string serviceName = "org.tizen.DBusTestService"; +const std::string objectPath = "/org/tizen/DBusTestService"; +const std::string interfaceName = "org.tizen.DBusTestService"; +const std::string methodNameEcho = "echo"; +const std::string methodNameQuit = "quit"; +const std::string nodeInfo = + "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + ""; +} + +class TestServiceDispatcher : public DPL::DBus::Dispatcher +{ +private: + void onMethodCall(GDBusConnection* /*connection*/, + const gchar* /*sender*/, + const gchar* /*objectPath*/, + const gchar* /*interfaceName*/, + const gchar* methodName, + GVariant* parameters, + GDBusMethodInvocation* invocation) + { + if (methodNameEcho == methodName) + { + LogDebug("Echo"); + g_dbus_method_invocation_return_value(invocation, + parameters); + } + else if (methodNameQuit == methodName) + { + LogDebug("Quit"); + g_dbus_method_invocation_return_value(invocation, NULL); + LoopControl::wrt_end_loop(); + } + } +}; + +int main(int argc, char* argv[]) +{ + LoopControl::init_loop(argc, argv); + TestServiceDispatcher dispatcher; + + auto iface = DPL::DBus::Interface::fromXMLString(nodeInfo).at(0); + iface->setDispatcher(&dispatcher); + auto object = DPL::DBus::Object::create(objectPath, iface); + auto connection = DPL::DBus::Connection::sessionBus(); + connection->registerObject(object); + connection->registerService(serviceName); + LoopControl::wrt_start_loop(); + + return 0; +} diff --git a/tests/dpl/event/CMakeLists.txt b/tests/dpl/event/CMakeLists.txt new file mode 100644 index 0000000..de3db4a --- /dev/null +++ b/tests/dpl/event/CMakeLists.txt @@ -0,0 +1,42 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +# +# Test files +# +# Define all DPL tests sources. +# Runner is responsible for runnint it all and +# generating proper output files +# + +SET(TARGET_NAME "dpl-tests-event") + +# Set DPL tests sources +SET(DPL_TESTS_EVENT_SOURCES + ${TESTS_DPL_DIR}/event/main.cpp + ${TESTS_DPL_DIR}/event/test_controller.cpp + ${TESTS_DPL_DIR}/event/test_event_support.cpp + ${TESTS_DPL_DIR}/event/test_ic_delegate.cpp + ${TESTS_DPL_DIR}/event/test_property.cpp +) + +WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_NAME} ${TARGET_DPL_EVENT_EFL}) +WRT_TEST_BUILD(${TARGET_NAME} ${DPL_TESTS_EVENT_SOURCES}) +WRT_TEST_INSTALL(${TARGET_NAME}) \ No newline at end of file diff --git a/tests/dpl/event/main.cpp b/tests/dpl/event/main.cpp new file mode 100644 index 0000000..4ed6191 --- /dev/null +++ b/tests/dpl/event/main.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file main.cpp + * @author Zbigniew Kostrzewa (z.kostrzewa@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of main. + */ + +#include + +int main(int argc, char *argv[]) +{ + return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); +} diff --git a/tests/dpl/event/test_controller.cpp b/tests/dpl/event/test_controller.cpp new file mode 100644 index 0000000..fe2a700 --- /dev/null +++ b/tests/dpl/event/test_controller.cpp @@ -0,0 +1,331 @@ +/* + * 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_controller.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test controller + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +class IntController + : public DPL::Event::Controller::Type> +{ +private: + int m_value; + +protected: + virtual void OnEventReceived(const int &event) + { + m_value = event; + } + +public: + IntController() + : m_value(-1) + { + } + + int Value() const + { + return m_value; + } +}; + +DECLARE_GENERIC_EVENT_1(DoneSignalEvent, DPL::WaitableEvent *) + +class ThreadController + : public DPL::Event::Controller::Type> +{ +private: + DPL::Thread *m_value; + +protected: + virtual void OnEventReceived(const DoneSignalEvent &event) + { + m_value = DPL::Thread::GetCurrentThread(); + event.GetArg0()->Signal(); + } + +public: + ThreadController() + : m_value(NULL) + { + } + + DPL::Thread *Value() const + { + return m_value; + } +}; + +struct StrangeStruct +{ + int a; + float b; + double c; +}; + +class StrangeController + : public DPL::Event::Controller::Type> +{ +protected: + virtual void OnEventReceived(const char &event) { (void)event; } + virtual void OnEventReceived(const short &event) { (void)event; } + virtual void OnEventReceived(const int &event) { (void)event; } + virtual void OnEventReceived(const long &event) { (void)event; } + virtual void OnEventReceived(const unsigned char &event) { (void)event; } + virtual void OnEventReceived(const unsigned short &event) { (void)event; } + virtual void OnEventReceived(const unsigned int &event) { (void)event; } + virtual void OnEventReceived(const unsigned long &event) { (void)event; } + virtual void OnEventReceived(const float &event) { (void)event; } + virtual void OnEventReceived(const double &event) { (void)event; } + virtual void OnEventReceived(const StrangeStruct &event) { (void)event; } +}; + +RUNNER_TEST(Controller_InitSimple) +{ + IntController controller; + controller.Touch(); + RUNNER_ASSERT(controller.Value() == -1); +} + +RUNNER_TEST(Controller_InitStrange) +{ + StrangeController controller; + controller.Touch(); +} + +RUNNER_TEST(Controller_PostEventToThread) +{ + ThreadController controller; + controller.Touch(); + + DPL::Thread thread; + thread.Run(); + + controller.SwitchToThread(&thread); + + DPL::WaitableEvent waitHandle; + + controller.PostEvent(DoneSignalEvent(&waitHandle)); + + DPL::WaitForSingleHandle(waitHandle.GetHandle()); + + controller.SwitchToThread(NULL); + + RUNNER_ASSERT(controller.Value() == &thread); +} + +RUNNER_TEST(Controller_PostTimedEventToThread) +{ + ThreadController controller; + controller.Touch(); + + DPL::Thread thread; + thread.Run(); + + controller.SwitchToThread(&thread); + + DPL::WaitableEvent waitHandle; + + controller.PostTimedEvent(DoneSignalEvent(&waitHandle), 0.5); + + DPL::WaitForSingleHandle(waitHandle.GetHandle()); + + controller.SwitchToThread(NULL); + + RUNNER_ASSERT(controller.Value() == &thread); +} + +DECLARE_GENERIC_EVENT_2(TouchInThread, DPL::WaitableEvent *, DPL::Thread **) +DECLARE_GENERIC_EVENT_2(TouchedControllerSignal, DPL::WaitableEvent *, DPL::Thread **) + +class TouchInThreadController + : public DPL::Event::Controller::Type>, + private DPL::Event::Controller::Type> +{ +public: + typedef DPL::Event::Controller::Type> PublicController; + typedef DPL::Event::Controller::Type> PrivateController; + + virtual void OnEventReceived(const TouchInThread &event) + { + // Touch controller in thread + PrivateController::Touch(); + + // Post signal + PrivateController::PostEvent(TouchedControllerSignal(event.GetArg0(), event.GetArg1())); + } + + virtual void OnEventReceived(const TouchedControllerSignal &event) + { + // Return touched thread + *event.GetArg1() = DPL::Thread::GetCurrentThread(); + + // Signal waitable event + event.GetArg0()->Signal(); + } +}; + +RUNNER_TEST(Controller_TouchInThread) +{ + TouchInThreadController controller; + controller.PublicController::Touch(); + + DPL::Thread thread; + thread.Run(); + + controller.PublicController::SwitchToThread(&thread); + + DPL::WaitableEvent waitHandle; + DPL::Thread *touchedThread = NULL; + + controller.PublicController::PostEvent(TouchInThread(&waitHandle, &touchedThread)); + + DPL::WaitForSingleHandle(waitHandle.GetHandle()); + + controller.PublicController::SwitchToThread(NULL); + + RUNNER_ASSERT(touchedThread == &thread); +} + +RUNNER_TEST(Controller_SynchronizedEvent) +{ + IntController controller; + controller.Touch(); + + DPL::Thread thread; + thread.Run(); + + controller.SwitchToThread(&thread); + controller.PostSyncEvent(12345); + controller.SwitchToThread(NULL); + + RUNNER_ASSERT(controller.Value() == 12345); +} + +const int ControllersNumber = 5; +const int MaxEventsPerController = 1; +const int MaxEvents = ControllersNumber * MaxEventsPerController; +const int ControllersPerThread = 1; + +class TestController; //Forward Declaration + +typedef std::shared_ptr ControllerPtr; +typedef std::shared_ptr ThreadPtr; +typedef std::vector ControllerList; +typedef std::list ThreadList; + +DECLARE_GENERIC_EVENT_0(QuitEvent) +class QuitController + : public DPL::Event::Controller::Type>, + public DPL::ApplicationExt +{ +public: + explicit QuitController( ) : DPL::ApplicationExt(1, NULL, "test-app") { Touch(); } +protected: + virtual void OnEventReceived(const QuitEvent &) { Quit(); } +}; + +struct TestContext +{ + ControllerList controllers; + ThreadList threads; + QuitController quitter; + DPL::Atomic g_ReceivedCounter; + DPL::Atomic g_SentCounter; +}; +typedef std::unique_ptr TestContextPtr; +TestContextPtr testContextPtr; + +DECLARE_GENERIC_EVENT_0(StartSendEvent) +DECLARE_GENERIC_EVENT_0(RandomEvent) +class TestController + : public DPL::Event::Controller::Type> +{ +public: + explicit TestController() { Touch(); } +protected: + virtual void OnEventReceived(const RandomEvent &) + { + ++testContextPtr->g_ReceivedCounter; + if(testContextPtr->g_ReceivedCounter == MaxEvents) + { + testContextPtr->quitter.DPL::Event::ControllerEventHandler::PostEvent(QuitEvent()); + return; + } + } + virtual void OnEventReceived(const StartSendEvent &) + { + for (int i=0 ; ig_SentCounter > MaxEvents) + { + return; + } + ++testContextPtr->g_SentCounter; + int id = rand() % static_cast(testContextPtr->controllers.size()); + testContextPtr->controllers.at(id)->DPL::Event::ControllerEventHandler::PostEvent(RandomEvent()); + } + } +}; + +RUNNER_TEST(Controllers_MultipleEvents) +{ + srand ( time(NULL) ); + + testContextPtr.reset(new TestContext()); + testContextPtr->controllers.reserve(ControllersNumber); + + for (int i = 0; i < ControllersNumber ; ++i) + { + if(testContextPtr->controllers.size() % ControllersPerThread ==0) + { + ThreadPtr thread = ThreadPtr(new DPL::Thread()); + testContextPtr->threads.push_back(thread); + thread->Run(); + } + + ControllerPtr controller = ControllerPtr(new TestController()); + testContextPtr->controllers.push_back(controller); + if(testContextPtr->controllers.size() % 2 == 0) + { + //This controller is being switched to thread (otherwise it is touched to main thread) + ThreadPtr thread = testContextPtr->threads.back(); + controller->SwitchToThread(thread.get()); + } + controller->DPL::Event::ControllerEventHandler::PostEvent(StartSendEvent()); + } + testContextPtr->quitter.Exec(); + RUNNER_ASSERT(testContextPtr->g_SentCounter == testContextPtr->g_ReceivedCounter); + testContextPtr.reset(); +} diff --git a/tests/dpl/event/test_event_support.cpp b/tests/dpl/event/test_event_support.cpp new file mode 100644 index 0000000..af303f0 --- /dev/null +++ b/tests/dpl/event/test_event_support.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file test_event_support.cpp + * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com) + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains test for event support + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GENERIC_EVENT_0(TestEvent) + +class TestListener: public DPL::Event::EventListener +{ +public: + explicit TestListener() : m_dummyVar(0) { } + void OnEventReceived(const TestEvent &) { m_dummyVar = 1; } + int GetDummyVar() const { return m_dummyVar; } + void ZeroDummyVar() { m_dummyVar = 0; } + +private: + int m_dummyVar; +}; + +class TestEventSupport + : public DPL::Event::EventSupport +{ +public: + void TestEmitEvent() { EmitEvent(TestEvent()); } +}; + +DECLARE_GENERIC_EVENT_0(QuitEvent) + +class QuitController + : public DPL::Event::Controller::Type>, + public DPL::ApplicationExt +{ +public: + QuitController() : DPL::ApplicationExt(1, NULL, "test-app") { Touch(); } + +protected: + virtual void OnEventReceived(const QuitEvent &) { Quit(); } +}; + +RUNNER_TEST(EventSupport_DestroyBeforeProcessing) +{ + QuitController quitter; + quitter.PostTimedEvent(QuitEvent(), 1.0); + + TestListener eventListener; + { + TestEventSupport eventSupport; + eventSupport.AddListener(&eventListener); + eventSupport.TestEmitEvent(); + eventSupport.RemoveListener(&eventListener); + } + eventListener.ZeroDummyVar(); + + quitter.Exec(); + RUNNER_ASSERT(eventListener.GetDummyVar() == 0); +} + +int g_delegateTest; + +void OnDelegateTest(const int &k); + +void OnDelegateTest(const int &k) +{ + LogInfo("Got delegate call"); + g_delegateTest = k; +} + +class DelegateTestSupport + : public DPL::Event::EventSupport +{ +public: + void Test() + { + EmitEvent(7); + } +}; + +RUNNER_TEST(EventSupport_BindDelegate) +{ + g_delegateTest = 0; + + DelegateTestSupport support; + support.AddListener(&OnDelegateTest); + + QuitController quitter; + quitter.PostTimedEvent(QuitEvent(), 1.0); + + support.Test(); + + quitter.Exec(); + + support.RemoveListener(&OnDelegateTest); + + RUNNER_ASSERT(g_delegateTest == 7); +} diff --git a/tests/dpl/event/test_ic_delegate.cpp b/tests/dpl/event/test_ic_delegate.cpp new file mode 100644 index 0000000..34aea50 --- /dev/null +++ b/tests/dpl/event/test_ic_delegate.cpp @@ -0,0 +1,567 @@ +/* + * 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_ic_delegate.cpp + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @author Lukasz Wrzosek (l.wrzosek@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of fast delegate tests. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +RUNNER_TEST_GROUP_INIT(DPL) + +const int IntVal = 123; +const std::string StringVal = "someString"; + +typedef DPL::Event::ICDelegate<> GetNothingDlpType; +typedef DPL::Event::ICDelegate GetIntDlgType; +typedef DPL::Event::ICDelegate GetIntAndStringDlgType; +DECLARE_GENERIC_EVENT_1(GetNothingEvent, GetNothingDlpType) +DECLARE_GENERIC_EVENT_1(GetIntEvent, GetIntDlgType) +DECLARE_GENERIC_EVENT_1(GetIntAndStringEvent, GetIntAndStringDlgType) + +class ICTestController +: public DPL::Event::Controller::Type> +{ + public: + ICTestController() { } + + protected: + virtual void OnEventReceived(const GetNothingEvent& event) + { + event.GetArg0()(); //calling intercontext delegate + } + virtual void OnEventReceived(const GetIntEvent& event) + { + event.GetArg0()(IntVal); //calling intercontext delegate + } + + virtual void OnEventReceived(const GetIntAndStringEvent& event) + { + event.GetArg0()(IntVal, StringVal); //calling intercontext delegate + } +}; + +struct TestResult +{ + TestResult() : + m_correctThread0(false), + m_correctThread1(false), + m_correctThread2(false), + m_int(-1), + m_int2(-1), + m_string("") + { + } + + void TestEventsPassed() + { + RUNNER_ASSERT(m_correctThread0); + RUNNER_ASSERT(m_correctThread1); + RUNNER_ASSERT(m_int == IntVal); + RUNNER_ASSERT(m_correctThread2); + RUNNER_ASSERT(m_int2 == IntVal); + RUNNER_ASSERT(m_string == StringVal); + } + + void TestEventsDidNotPass() + { + RUNNER_ASSERT(!m_correctThread0); + RUNNER_ASSERT(!m_correctThread1); + RUNNER_ASSERT(m_int == -1); + RUNNER_ASSERT(!m_correctThread2); + RUNNER_ASSERT(m_int2 == -1); + RUNNER_ASSERT(m_string == ""); + } + + bool m_correctThread0; + bool m_correctThread1; + bool m_correctThread2; + int m_int; + int m_int2; + std::string m_string; +}; + +class TestContextFreeClass : + protected DPL::Thread, + public DPL::Event::ICDelegateSupport +{ + public: + TestContextFreeClass(ICTestController* controller, TestResult* result) : + Thread(), + m_testResult(result), + m_controller(controller) + { + LogDebug("Context thread id = " << this); + } + + void Run() + { + LogDebug("Running Context Free thread"); + Thread::Run(); + } + + void Quit() + { + LogDebug("Exiting Context Free thread"); + Thread::Quit(); + } + + + void Wait() + { + LogDebug("Waiting for thread"); + DPL::WaitForSingleHandle(m_waitable.GetHandle()); + } + + protected: + void OnNothing() + { + LogDebug("Received nothing in thread = " << GetCurrentThread()); + m_testResult->m_correctThread0 = (GetCurrentThread() == this); + } + + void OnIntReceive(int val) + { + LogDebug("Received int in thread = " << GetCurrentThread()); + m_testResult->m_correctThread1 = (GetCurrentThread() == this); + m_testResult->m_int = val; + } + + void OnIntAndStringReceive(int val, std::string stringval) + { + LogDebug("Received int and string in thread = " << GetCurrentThread()); + m_testResult->m_correctThread2 = (GetCurrentThread() == this); + m_testResult->m_int2 = val; + m_testResult->m_string = stringval; + m_waitable.Signal(); + } + + virtual int ThreadEntry() + { + GetNothingEvent getNothingEvent( + makeICDelegate( + &TestContextFreeClass::OnNothing)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getNothingEvent); + + GetIntEvent getIntEvent( + makeICDelegate( + &TestContextFreeClass::OnIntReceive)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getIntEvent); + + GetIntAndStringEvent getIntAndStringEvent( + makeICDelegate( + &TestContextFreeClass::OnIntAndStringReceive)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getIntAndStringEvent); + + return Thread::ThreadEntry(); + } + + private: + TestResult* m_testResult; + DPL::WaitableEvent m_waitable; + ICTestController* m_controller; +}; + +RUNNER_TEST(ICDelegate_0) +{ + DPL::Thread thread; + thread.Run(); + LogDebug("Controller thread id = " << &thread); + + ICTestController testController; + testController.Touch(); + testController.SwitchToThread(&thread); + + TestResult result; + TestContextFreeClass* contextFree = + new TestContextFreeClass(&testController, &result); + result.TestEventsDidNotPass(); + + thread.Run(); + contextFree->Run(); + contextFree->Wait(); + contextFree->Quit(); + thread.Quit(); + + delete contextFree; + + result.TestEventsPassed(); +} + +RUNNER_TEST(ICDelegate_1) +{ + DPL::Thread thread; + LogDebug("Controller thread id = " << &thread); + + ICTestController testController; + testController.Touch(); + testController.SwitchToThread(&thread); + + TestResult result; + TestContextFreeClass* contextFree = + new TestContextFreeClass(&testController, &result); + result.TestEventsDidNotPass(); + + contextFree->Run(); + contextFree->Quit(); + delete contextFree; //deleting Delegates before actual Events are worked out + thread.Run(); + thread.Quit(); + + result.TestEventsDidNotPass(); +} + +class TestContextFree; +class TestRunnerInThread; + +namespace +{ +const int ControllersPerThread = 40; +const int ContextFreePerThread = 180; +const int TestsPerController = 110; +const int TestThreads = 23; +const int TestsPerThread = 100; +const int NumberOfEvents = 230; + +typedef std::shared_ptr ICTestControllerPtr; +typedef std::shared_ptr TestContextFreePtr; +typedef std::shared_ptr TestRunnerInThreadPtr; +typedef std::shared_ptr ThreadPtr; + +DPL::Mutex mutex; +std::list frees; +std::list ctrls; +std::list frees_threads; +std::list ctrls_threads; + +} + +class TestContextFree : public DPL::Event::ICDelegateSupport +{ + public: + TestContextFree(ICTestController* controller, + int eventsCount) : + m_controller(controller), + m_eventsCount(eventsCount) + { + } + + void Wait() + { + LogDebug("Waiting for thread"); + DPL::WaitForSingleHandle(m_waitable.GetHandle()); + } + + + void OnNothing() + { + LogDebug("Got"); + m_eventsCount--; + if (m_eventsCount > 0) { + LogDebug("posting next event"); + GetIntAndStringEvent getIntAndStringEvent( + makeICDelegate( + &TestContextFree::OnIntAndStringReceive)); + LogDebug("posting next event ..."); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getIntAndStringEvent); + LogDebug("posting next event done"); + } else { + LogDebug("test finished"); + m_waitable.Signal(); + } + } + + void OnIntReceive(int) + { + LogDebug("Got"); + m_eventsCount--; + if (m_eventsCount > 0) { + LogDebug("posting next event"); + GetNothingEvent getNothingEvent( + makeICDelegate( + &TestContextFree::OnNothing)); + LogDebug("posting next event ..."); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getNothingEvent); + LogDebug("posting next event done"); + } else { + LogDebug("test finished"); + m_waitable.Signal(); + } + } + + void OnIntAndStringReceive(int, std::string) + { + LogDebug("Got"); + m_eventsCount--; + if (m_eventsCount > 0) { + LogDebug("posting next event"); + + GetIntEvent getIntEvent( + makeICDelegate( + &TestContextFree::OnIntReceive)); + LogDebug("posting next event ..."); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getIntEvent); + LogDebug("posting next event done"); + } else { + LogDebug("test finished"); + m_waitable.Signal(); + } + } + + void StartTestOnNothing() + { + GetNothingEvent getNothingEvent( + makeICDelegate( + &TestContextFree::OnNothing)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getNothingEvent); + } + + void StartTestOnInt() + { + GetIntEvent getIntEvent( + makeICDelegate( + &TestContextFree::OnIntReceive)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getIntEvent); + } + + void StartTestOnIntAndString() + { + GetIntAndStringEvent getIntAndStringEvent( + makeICDelegate( + &TestContextFree::OnIntAndStringReceive)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + getIntAndStringEvent); + } + + bool CheckTest() + { + LogDebug("Checking test result"); + return m_eventsCount == 0; + } + + private: + ICTestController* m_controller; + int m_eventsCount; + DPL::WaitableEvent m_waitable; +}; + +class TestRunnerInThread : public DPL::Thread +{ + public: + TestRunnerInThread(int events, int tests) : + m_eventsCount(events), + m_tests(tests) {} + + void WaitForInit() + { + LogDebug("Waiting for thread"); + DPL::WaitForSingleHandle(m_init.GetHandle()); + } + + protected: + virtual int ThreadEntry() + { + LogDebug("Thread starts"); + { + DPL::Mutex::ScopedLock lock(&mutex); + for (int i = 0; i < m_tests; ++i) + { + if (i % TestsPerController == 0) { + if (ctrls.size() % ControllersPerThread == 0) { + ThreadPtr thread(new DPL::Thread()); + thread->Run(); + ctrls_threads.push_back(thread); + } + ICTestControllerPtr ptr(new ICTestController()); + ptr->Touch(); + ptr->SwitchToThread(ctrls_threads.back().get()); + ctrls.push_back(ptr); + + TestContextFreePtr t(new TestContextFree(ctrls.back().get(), + m_eventsCount)); + t->StartTestOnNothing(); + LogDebug(""); + frees.push_back(t); + } + } + } + m_init.Signal(); + LogDebug("Thread starts loop"); + return DPL::Thread::ThreadEntry(); + } + + private: + DPL::WaitableEvent m_init; + int m_eventsCount; + int m_tests; +}; + +RUNNER_TEST(ICDelegate_2) +{ + LogDebug("Creating test threads"); + for (int i = 0; i < TestThreads; ++i) + { + TestRunnerInThreadPtr ptr( + new TestRunnerInThread(NumberOfEvents, TestsPerThread)); + frees_threads.push_back(ptr); + frees_threads.back()->Run(); + } + + FOREACH(it, frees_threads) { + (*it)->WaitForInit(); + } + LogDebug("Creating test threads done"); + + FOREACH(it, frees) { + LogDebug("..."); + (*it)->Wait(); + } + + FOREACH(it, frees) { + RUNNER_ASSERT((*it)->CheckTest()); + } + + frees.clear(); + + FOREACH(it, frees_threads) { + (*it)->Quit(); + } + + frees_threads.clear(); + + FOREACH(it, ctrls) { + (*it)->SwitchToThread(NULL); + } + + FOREACH(it, ctrls_threads) { + (*it)->Quit(); + } + + ctrls.clear(); + ctrls_threads.clear(); +} + +namespace ReuseCheck { +const int ReuseCount = 5; +typedef DPL::Event::ICDelegate<> GetNothingDlpType; +DECLARE_GENERIC_EVENT_1(ReuseCountEvent, GetNothingDlpType) + +class ICReuseTestController +: public DPL::Event::Controller::Type> +{ + public: + ICReuseTestController() { m_reuseCount = 0; } + + protected: + virtual void OnEventReceived(const ReuseCountEvent& event) + { + event.GetArg0()(); //calling intercontext delegate + if(++m_reuseCount < ReuseCount){ + LogInfo("[Send] Reuse: " << m_reuseCount); + DPL::Event::ControllerEventHandler::PostEvent(event); + } + } + + int m_reuseCount; +}; + +class ReuseTestContextFreeClass : + protected DPL::Thread, + public DPL::Event::ICDelegateSupport +{ + public: + ReuseTestContextFreeClass(ICReuseTestController* controller) : + Thread(), + m_controller(controller), + m_reuseCount(0) + { } + + void Run() { Thread::Run(); } + void Quit() { Thread::Quit(); } + void Wait() { DPL::WaitForSingleHandle(m_waitable.GetHandle()); } + + protected: + void OnReuseReceive() + { + LogDebug("[Received] : " << ++m_reuseCount); + if(m_reuseCount == ReuseCount) + m_waitable.Signal(); + } + + virtual int ThreadEntry() + { + ReuseCountEvent reuseEvent( + makeICDelegate( + &ReuseTestContextFreeClass::OnReuseReceive, + DPL::Event::ICD::Reuse::Yes)); + m_controller->DPL::Event::ControllerEventHandler::PostEvent( + reuseEvent); + + return Thread::ThreadEntry(); + } + + private: + DPL::WaitableEvent m_waitable; + ICReuseTestController* m_controller; + int m_reuseCount; +}; + +RUNNER_TEST(ICDelegate_3) +{ + DPL::Thread thread; + thread.Run(); + LogDebug("Controller thread id = " << &thread); + + ICReuseTestController testController; + testController.Touch(); + testController.SwitchToThread(&thread); + + ReuseTestContextFreeClass* contextFree = + new ReuseTestContextFreeClass(&testController); + + thread.Run(); + contextFree->Run(); + contextFree->Wait(); + contextFree->Quit(); + thread.Quit(); + + delete contextFree; + + RUNNER_ASSERT(true); +} +} //namespace ReuseCheck diff --git a/tests/dpl/event/test_property.cpp b/tests/dpl/event/test_property.cpp new file mode 100644 index 0000000..c095e5b --- /dev/null +++ b/tests/dpl/event/test_property.cpp @@ -0,0 +1,111 @@ +/* + * 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_property.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test property + */ +#include +#include +#include +#include + +namespace { +const int PROPERTY_VALUE_INT = 2; +const std::string PROPERTY_VALUE_STRING = "aaa"; +} + +int ReadSomething2(DPL::Event::Model */*model*/); +int ReadSomething2(DPL::Event::Model */*model*/) +{ + return PROPERTY_VALUE_INT; +} + +std::string ReadSomething(DPL::Event::Model */*model*/); +std::string ReadSomething(DPL::Event::Model */*model*/) +{ + return PROPERTY_VALUE_STRING; +} + +void WriteSomething(const std::string &/*value*/, DPL::Event::Model */*model*/); +void WriteSomething(const std::string &/*value*/, DPL::Event::Model */*model*/) +{ +} + +class MyModel + : public DPL::Event::Model +{ +public: + ~MyModel() {} + + DPL::Event::Property + Caption; + + DPL::Event::Property + Testproperty0; + + DPL::Event::Property + Testproperty1; + + DPL::Event::Property + Testproperty2; + + DPL::Event::Property Testproperty3; + + DPL::Event::Property Testproperty4; + + DPL::Event::Property Testproperty5; + + MyModel() + : Caption(this, "Foo caption"), + Testproperty0(this, "", &ReadSomething), + Testproperty1(this), + Testproperty2(this), + Testproperty3(this), + Testproperty4(this, "test", &ReadSomething, &WriteSomething), + Testproperty5(this, &ReadSomething2) + { + } +}; + +std::string g_caption; + +void OnNameChanged(const DPL::Event::PropertyEvent &event); +void OnNameChanged(const DPL::Event::PropertyEvent &event) +{ + g_caption = event.value; +} + +RUNNER_TEST(Model_Test) +{ + MyModel model; + + g_caption = "It is a bad caption"; + + model.Caption.AddListener(&OnNameChanged); + model.Caption.Set("Test name"); + + RUNNER_ASSERT(model.Testproperty4.Get() == PROPERTY_VALUE_STRING); + RUNNER_ASSERT(PROPERTY_VALUE_INT == model.Testproperty5.Get()); + RUNNER_ASSERT(g_caption == "Test name"); + RUNNER_ASSERT(model.Caption.Get() == "Test name"); + + model.Caption.RemoveListener(&OnNameChanged); +} diff --git a/tests/dpl/localization/CMakeLists.txt b/tests/dpl/localization/CMakeLists.txt new file mode 100644 index 0000000..a50727a --- /dev/null +++ b/tests/dpl/localization/CMakeLists.txt @@ -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 CMakeLists.txt +# @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) +# @version 1.0 +# @brief +# + +# +# Test files +# +# Define all DPL tests sources. +# Runner is responsible for runnint it all and +# generating proper output files +# + +SET(TARGET_LOC "dpl-tests-loc") + +SET(LOC_TESTS_SOURCES + ${DPL_TESTS_DIR}/localization/test_localization.cpp + ${DPL_TESTS_DIR}/localization/test_suite01.cpp + #${DPL_TESTS_DIR}/localization/mockup_src/widget_dao.cpp + #${PROJECT_SOURCE_DIR}/modules/localization/src/localization_utils.cpp + #${PROJECT_SOURCE_DIR}/modules/localization/src/w3c_file_localization.cpp +) + +#WRT_INCLUDE_DIRECTORIES( + #${SYS_EFL_INCLUDE_DIRS} + #${DPL_TEST_INCLUDE_DIR} + #${DPL_TESTS_DIR}/localization/mockup_include + #${PROJECT_SOURCE_DIR}/modules/localization/include +#) + +#LINK_DIRECTORIES(${SYS_EFL_LIBRARY_DIRS}) + +WRT_TEST_BUILD(${TARGET_LOC} ${LOC_TESTS_SOURCES}) +WRT_TEST_INSTALL(${TARGET_LOC}) + +ADD_SUBDIRECTORY(files) diff --git a/tests/dpl/localization/files/CMakeLists.txt b/tests/dpl/localization/files/CMakeLists.txt new file mode 100644 index 0000000..17c7fda --- /dev/null +++ b/tests/dpl/localization/files/CMakeLists.txt @@ -0,0 +1,19 @@ +INSTALL(FILES + ${DPL_TESTS_DIR}/localization/files/one + DESTINATION + /opt/share/widget/tests/localization/widget1/locales/pl-en + ) + +INSTALL(FILES + ${DPL_TESTS_DIR}/localization/files/one + ${DPL_TESTS_DIR}/localization/files/two + DESTINATION + /opt/share/widget/tests/localization/widget2/locales/pl-en + ) + +INSTALL(FILES + ${DPL_TESTS_DIR}/localization/files/two + DESTINATION + /opt/share/widget/tests/localization/widget2/locales/en-en + ) + diff --git a/tests/dpl/localization/files/one b/tests/dpl/localization/files/one new file mode 100644 index 0000000..e69de29 diff --git a/tests/dpl/localization/files/two b/tests/dpl/localization/files/two new file mode 100644 index 0000000..e69de29 diff --git a/tests/dpl/localization/mockup_include/dpl/wrt-dao-ro/common_dao_types.h b/tests/dpl/localization/mockup_include/dpl/wrt-dao-ro/common_dao_types.h new file mode 100644 index 0000000..ad8443f --- /dev/null +++ b/tests/dpl/localization/mockup_include/dpl/wrt-dao-ro/common_dao_types.h @@ -0,0 +1,485 @@ +/* + * 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 common_dao_types.h + * @author Michal Ciepielski (m.ciepielski@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of common data types for wrtdb + */ + +#ifndef WRT_SRC_CONFIGURATION_COMMON_DAO_TYPES_H_ +#define WRT_SRC_CONFIGURATION_COMMON_DAO_TYPES_H_ + +#include +#include +#include +#include +#include +#include +#include + +namespace WrtDB { +namespace Powder { + +typedef std::set StringSet; +//! Widget description +struct Description +{ + //!Content level + typedef enum + { + Level0 = 0, + Level1, + Level2, + Level3, + Level4, + Level5, + LevelUnknown + } LevelEnum; + struct LevelEntry + { + LevelEnum level; //!< content level + + typedef StringSet Context; + + //! POWDER context + //! xa This material appears in an artistic context + //! xb This material appears in an educational context + //! xc This material appears in a medical context + //! xd This material appears in a sports context + //! xe This material appears in a violent context + Context context; + explicit LevelEntry(LevelEnum level = LevelUnknown); + //! Function checks if context is valid + //! \param[in] level POWDER content level + //! \param[in] context POWDER context + bool isContextValid(LevelEnum level, + const DPL::OptionalString& context) const; + }; + + struct CategoryEntry + { + //! Levels entries for POWDER description + typedef std::vector LevelsContainer; + LevelsContainer levels; + //! Function checks if context is valid + //! \param[out] reason set if context invalid + //! \param[in] level POWDER content level + //! \param[in] context POWDER context + bool isCategoryValid(LevelEntry& reason, + LevelEnum level, + const DPL::OptionalString& context) const; + }; + + //! POWDER Category -> Category entry map for Widget + //! + //! nu Nudity + //! se Sex + //! vi Violence + //! la Potentially offensive language + //! dr Drug use + //! ga Gambling + //! ha Hate or harmful activities + //! ug Use of user-generated content + typedef std::map CategoryEntries; + + CategoryEntries categories; + + //! Age rating for widget + //! If Null not set + DPL::OptionalInt ageRating; +}; +} // namespace Powder + +namespace ChildProtection { + +//! Blacklist with forbidden URLs +//! It should be stored in WidgetDAO +typedef std::vector BlackList; + +//! Widget Child protection record +//! Record should be stored in WingetDAO +struct Record +{ + //! Child protection enabled + bool enabled; + explicit Record(bool enabled) : + enabled(enabled) + { + } +}; + +//! Powder processing +struct PowderRules +{ + //! Rule set by parent about forbidden category + //! Powder category + //! nu Nudity + //! se Sex + //! vi Violence + //! la Potentially offensive language + //! dr Drug use + //! ga Gambling + //! ha Hate or harmful activities + //! ug Use of user-generated content + //! Powder context + //! xa This material appears in an artistic conteaxt + //! xb This material appears in an educational context + //! xc This material appears in a medical context + //! xd This material appears in a sports context + //! xe This material appears in a violent context + struct CategoryRule + { + DPL::String category; + Powder::Description::LevelEnum level; + DPL::OptionalString context; + explicit CategoryRule(const DPL::String& category = DPL::String(), + Powder::Description::LevelEnum level = + Powder::Description::LevelUnknown, + const DPL::OptionalString& context = DPL::OptionalString()); + }; + + struct PowderResult + { + //! Reasoning outcome: part of POWDER description used to invalidate + Powder::Description::LevelEntry invalidDescription; + //! Reasoning outcome: rule set by parent not full filed by description + CategoryRule invalidRule; + + //! Reasoning outcome: type of invalidity + enum InvalidReason + { + InvalidRule, //!< One of rules was not fulfilled + InvalidAge, //!< Age is invalid + AgeRatingNotSet, //!< Age rating for widget is not set + Valid //!< Description valid + }; + InvalidReason reason; + explicit PowderResult(InvalidReason reason = Valid, + const Powder::Description::LevelEntry& invalidDescription = + Powder::Description::LevelEntry(), + const CategoryRule& invalidRule = CategoryRule()); + }; + + typedef std::pair ResultPair; + + //! Function checks if rule is fulfilled by description + //! \param[in] rule checked rule + //! \param[in] description + //! \retval true rule is valid + //! \retval false rule is invalid + ResultPair isRuleValidForDescription(const CategoryRule& rule, + const Powder::Description& description) const; + //! Function checks if age limit is fulfilled by description + //! \param[in] description + //! \retval true age is valid + //! \retval false age is invalid + ResultPair isAgeValidForDescription( + const Powder::Description& description) const; + + //! It is the maximum age rating valid for child + //! Uniform age is stored in WidgetDAO + DPL::OptionalInt ageLimit; + + //! Set to true if age rating is required + //! If ageLimit is not set value is ignored + bool isAgeRatingRequired; + + //! Set of rules configured by parent + //! Rules are stored in WidgetDAO and are uniform for all widgets + typedef std::vector RulesContainer; + RulesContainer rules; + + //! Function check if Widget description is valid for ChildProtection + //! configuration + //! \param description widget description + //! \retval true widget is valid + //! \retval false widget is invalid + ResultPair isDescriptionValid(const Powder::Description& description) + const; + + PowderRules() : + isAgeRatingRequired(false) + { + } +}; +} // namespace ChildProtection + +class PluginMetafileData +{ + public: + struct Feature + { + std::string m_name; + std::set m_deviceCapabilities; + + bool operator< (const Feature& obj) const + { + return m_name < obj.m_name; + } + }; + typedef std::set FeatureContainer; + + public: + + PluginMetafileData() + { + } + + std::string m_libraryName; + std::string m_featuresInstallURI; + std::string m_featuresKeyCN; + std::string m_featuresRootCN; + std::string m_featuresRootFingerprint; + + FeatureContainer m_featureContainer; +}; + +class PluginObjectsDAO +{ + public: + typedef std::set Objects; + typedef std::shared_ptr ObjectsPtr; + + public: + explicit PluginObjectsDAO() {} + + protected: + ObjectsPtr m_implemented; + ObjectsPtr m_dependent; +}; + +/** + * @brief Widget id describes web-runtime global widget identifier. + * + * Notice that only up to one widget can exist at the same time. + * DbWidgetHandle can be translated into corresponding WidgetModel by invoking + * FindWidgetModel routine. + */ +typedef int DbWidgetHandle; + +/** + * @brief Structure to hold the information of widget's size + */ +struct DbWidgetSize +{ + DPL::OptionalInt width; + DPL::OptionalInt height; + + DbWidgetSize(DPL::OptionalInt w = DPL::OptionalInt::Null, + DPL::OptionalInt h = DPL::OptionalInt::Null) : + width(w), + height(h) + { + } +}; + +inline bool operator ==(const DbWidgetSize &objA, const DbWidgetSize &objB) +{ + if (!objA.height || !objA.width || !objB.width || !objB.height) { + return false; + } else { + return *objA.height == *objB.height && *objA.width == *objB.width; + } +} + +/** + * Widget [G]lobal [U]nique [ID]entifier + * Orginated from appstore ID + */ +typedef DPL::OptionalString WidgetGUID; + +struct WidgetAccessInfo +{ + DPL::String strIRI; /* origin iri */ + bool bSubDomains; /* do we want access to subdomains ? */ + + bool operator ==(const WidgetAccessInfo& info) const + { + return info.strIRI == strIRI && + info.bSubDomains == bSubDomains; + } +}; + +typedef std::list WidgetAccessInfoList; + +typedef std::list WindowModeList; + +/** + * @brief Widget configuration parameter key + */ +typedef DPL::String WidgetParamKey; + +/** + * @brief Widget configuration parameter value + */ +typedef DPL::String WidgetParamValue; + +/** + * @brief A map of widget configuration parameters. + * + * Widget configuration parameters are read from database and are stored + * along with feature that they describe. + */ +typedef std::multimap WidgetParamMap; + +/** + * @brief Widget feature host information about possible javascript extensions + * that widget may use + * + * Widget features are declared in configuration file in widget installation + * package. Each declared special feature is contained in some wrt-plugin that + * declares to implement it. After widget launch wrt searches for proper plugin + * libraries and load needed features. + * + * Widget features can be required or optional. It is possible to start widget + * without missing feature. When required feature cannot be loaded widget will + * not start. + */ + +enum { + INVALID_PLUGIN_HANDLE = -1 +}; +typedef int DbPluginHandle; + +struct DbWidgetFeature +{ + DPL::String name; /// Feature name + bool required; /// Whether feature is required + DbPluginHandle pluginId; /// Plugin id that implement this feature + WidgetParamMap params; /// Widget's params + + DbWidgetFeature() : + required(false), + pluginId(INVALID_PLUGIN_HANDLE) + { + } +}; + +inline bool operator < (const DbWidgetFeature &objA, + const DbWidgetFeature &objB) +{ + return objA.name.compare(objB.name) < 0; +} + +inline bool operator==(const DbWidgetFeature &featureA, + const DbWidgetFeature &featureB) +{ + return featureA.name == featureB.name && + featureA.required == featureB.required && + featureA.pluginId == featureB.pluginId; +} + +/** + * @brief Default container for features list + */ +typedef std::multiset DbWidgetFeatureSet; + +/** + * @brief Default container with DbWidgetHandle's + */ +typedef std::list DbWidgetHandleList; + +/** + * @brief Widget specific type + * + * Widget type describes belowed in WAC, TIZEN WebApp + */ +enum AppType +{ + APP_TYPE_UNKNOWN = 0, // unknown + APP_TYPE_WAC20, // WAC 2.0 + APP_TYPE_TIZENWEBAPP, // slp webapp +}; + +class WidgetType +{ + public: + WidgetType() + :appType(APP_TYPE_UNKNOWN) + { + } + WidgetType(const AppType type) + :appType(type) + { + } + bool operator== (const AppType& other) const + { + return appType == other; + } + std::string getApptypeToString() + { + switch (appType) { +#define X(x) case x: return #x; + X(APP_TYPE_UNKNOWN) + X(APP_TYPE_WAC20) + X(APP_TYPE_TIZENWEBAPP) +#undef X + default: + return "UNKNOWN"; + } + } + + AppType appType; +}; + +} // namespace WrtDB + +struct WidgetSetting +{ + DPL::String settingName; + DPL::String settingValue; + + bool operator ==(const WidgetSetting& info) const + { + return (info.settingName == settingName && + info.settingValue == settingValue); + } + bool operator !=(const WidgetSetting& info) const + { + return (info.settingName != settingName || + info.settingValue != settingValue); + } +}; + +typedef std::list WidgetSettings; + +/** + * @brief Widget Application Service + * + * Application sercvice describes details of behaviour + * when widget receives aul bundle data. + */ +struct WidgetApplicationService +{ + public: + DPL::String src; /* start uri */ + DPL::String operation; /* service name */ + DPL::String scheme; /* scheme type*/ + DPL::String mime; /* mime type */ + + bool operator== (const WidgetApplicationService& other) const + { + return src == other.src && + operation == other.operation && + scheme == other.scheme && + mime == other.mime; + } +}; + +typedef std::list WidgetApplicationServiceList; +#endif /* WRT_SRC_CONFIGURATION_COMMON_DAO_TYPES_H_ */ diff --git a/tests/dpl/localization/mockup_include/dpl/wrt-dao-rw/widget_dao.h b/tests/dpl/localization/mockup_include/dpl/wrt-dao-rw/widget_dao.h new file mode 100644 index 0000000..aae9ce2 --- /dev/null +++ b/tests/dpl/localization/mockup_include/dpl/wrt-dao-rw/widget_dao.h @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of widget dao class. + * + * @file widget_dao_read_only.h + * @author Yang Jie (jie2.yang@samsung.com) + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of widget dao + */ + +#ifndef _WRT_SRC_CONFIGURATION_WIDGET_DAO_READ_ONLY_H_ +#define _WRT_SRC_CONFIGURATION_WIDGET_DAO_READ_ONLY_H_ + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +//#include "../wrt-dao-ro/common_dao_types.h" + +typedef DPL::OptionalString WidgetGUID; + +namespace ConfigParserData { + +struct Icon +{ + Icon(const DPL::String& src) : src(src) + { + } + DPL::String src; + DPL::OptionalInt width; + DPL::OptionalInt height; + bool operator==(const Icon&) const; + bool operator!=(const Icon&) const; + bool operator >(const Icon&) const; + bool operator>=(const Icon&) const; + bool operator <(const Icon&) const; + bool operator<=(const Icon&) const; +}; +} // namespace ConfigParserData +namespace WrtDB { + +typedef std::list StringList; + +struct WidgetLocalizedInfo +{ + DPL::OptionalString name; + DPL::OptionalString shortName; + DPL::OptionalString description; + DPL::OptionalString license; + DPL::OptionalString licenseHref; +}; + +typedef std::list LanguageTagList; + +class WidgetDAO +{ + public: + /** + * WidgetDAO Exception classes + */ + class Exception + { + public: + DECLARE_EXCEPTION_TYPE(DPL::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, DatabaseError) + DECLARE_EXCEPTION_TYPE(Base, ReadOnlyProperty) + DECLARE_EXCEPTION_TYPE(Base, GUIDisNull) + DECLARE_EXCEPTION_TYPE(Base, UnexpectedEmptyResult) + DECLARE_EXCEPTION_TYPE(Base, WidgetNotExist) + DECLARE_EXCEPTION_TYPE(Base, AlreadyRegistered) + }; + + protected: + DbWidgetHandle m_widgetHandle; + + public: + struct WidgetLocalizedIconRow + { + int appId; + int iconId; + DPL::String widgetLocale; + }; + typedef std::list WidgetLocalizedIconList; + + struct WidgetIconRow + { + int iconId; + int appId; + DPL::String iconSrc; + DPL::OptionalInt iconWidth; + DPL::OptionalInt iconHeight; + }; + typedef std::list WidgetIconList; + + struct WidgetStartFileRow + { + int startFileId; + int appId; + DPL::String src; + }; + typedef std::list WidgetStartFileList; + + struct WidgetLocalizedStartFileRow + { + int startFileId; + int appId; + DPL::String widgetLocale; + DPL::String type; + DPL::String encoding; + }; + typedef std::list LocalizedStartFileList; + + + /** + * This is a constructor. + * + * @param[in] widgetHandle application id of widget. + */ + WidgetDAO(DbWidgetHandle widgetHandle) + : m_widgetHandle(widgetHandle) + {} + + /** + * Destructor + */ + virtual ~WidgetDAO(){} + + /** + * This method returns widget handle(m_widgetHandle). + * + * @return widget handle(m_widgetHandle). + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in DB table. + */ + DbWidgetHandle getHandle() const { return m_widgetHandle; } + DbWidgetHandle getHandle(const WidgetGUID GUID) const; + static DbWidgetHandle getHandle(const DPL::String pkgName); + + /** + * This method returns the root directory of widget resource. + * + * @return path name of root directory. + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + DPL::String getPath() const; + void setPath(const DPL::String &path) const; + + /** + * This method returns the defaultlocale for the widget. + * + * @return defaultlocale + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + DPL::OptionalString getDefaultlocale() const; + + /** + * This method returns list of localized icons files; + * + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + WidgetLocalizedIconList getLocalizedIconList() const; + + /** + * This method returns list of icons files; + * + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + WidgetIconList getIconList() const; + + /** + * This method returns list of localized start files; + * + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + LocalizedStartFileList getLocalizedStartFileList() const; + void setLocalizedStartFileList(const LocalizedStartFileList &list) const; + /** + * This method returns list of start files; + * + * @exception WRT_CONF_ERR_EMDB_FAILURE - Fail to query DB table. + * @exception WRT_CONF_ERR_EMDB_NO_RECORD - Can not find matching records in + * DB table. + */ + WidgetStartFileList getStartFileList() const; + void setStartFileList(const WidgetStartFileList &list) const; + + WidgetLocalizedInfo getLocalizedInfo(const DPL::String& languageTag) const; + protected: + static std::map s_startFileMap; + static std::map s_localizedStartFileMap; + static std::map s_pathMap; +}; + +} // namespace WrtDB + +#endif // _WRT_SRC_CONFIGURATION_WIDGET_DAO_READ_ONLY_H_ + diff --git a/tests/dpl/localization/mockup_src/widget_dao.cpp b/tests/dpl/localization/mockup_src/widget_dao.cpp new file mode 100644 index 0000000..d781c05 --- /dev/null +++ b/tests/dpl/localization/mockup_src/widget_dao.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of widget dao class. + * + * @file widget_dao_read_only.cpp + * @author Yang Jie (jie2.yang@samsung.com) + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @author Pawel Sikorski (p.sikorski@samsung.com) + * @version 1.0 + * @brief This file contains the declaration of widget dao + */ + +//#include "../mockup_include/dpl/wrt-dao-rw/widget_dao.h" +#include + +#include +#include +#include +#include + +namespace WrtDB { + +std::map WidgetDAO::s_startFileMap; +std::map WidgetDAO::s_localizedStartFileMap; +std::map WidgetDAO::s_pathMap; + +DbWidgetHandle WidgetDAO::getHandle(const WidgetGUID /* GUID */) const +{ + LogError("Not impleneted!"); + return 0; +} + +DbWidgetHandle WidgetDAO::getHandle(const DPL::String /* pkgName */) +{ + LogError("Not implemented!"); + return 0; +} + +DPL::String WidgetDAO::getPath() const +{ + return s_pathMap[m_widgetHandle]; +} + +void WidgetDAO::setPath(const DPL::String &path) const +{ + s_pathMap[m_widgetHandle] = path; +} + +WidgetLocalizedInfo + WidgetDAO::getLocalizedInfo(const DPL::String& /* languageTag */) + const +{ + LogError("Not implemented!"); + return WidgetLocalizedInfo(); +} + +DPL::OptionalString WidgetDAO::getDefaultlocale() const +{ + LogError("Not implemented!"); + return DPL::OptionalString(); +} + +WidgetDAO::WidgetLocalizedIconList WidgetDAO::getLocalizedIconList() const +{ + LogError("Not implemented!"); + return WidgetLocalizedIconList(); +} + +WidgetDAO::WidgetIconList WidgetDAO::getIconList() const +{ + LogError("Not implemented!"); + return WidgetIconList(); +} + +WidgetDAO::LocalizedStartFileList WidgetDAO::getLocalizedStartFileList() const +{ + return s_localizedStartFileMap[m_widgetHandle]; +} + +void WidgetDAO::setLocalizedStartFileList(const LocalizedStartFileList &list) const { + s_localizedStartFileMap[m_widgetHandle] = list; +} + +WidgetDAO::WidgetStartFileList WidgetDAO::getStartFileList() const +{ + return s_startFileMap[m_widgetHandle]; +} + +void WidgetDAO::setStartFileList(const WidgetStartFileList &list) const +{ + s_startFileMap[m_widgetHandle] = list; +} + +} // namespace WrtDB diff --git a/tests/dpl/localization/test_localization.cpp b/tests/dpl/localization/test_localization.cpp new file mode 100644 index 0000000..42ffe3a --- /dev/null +++ b/tests/dpl/localization/test_localization.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file main.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of main + */ +#include + +int main(int argc, char *argv[]) +{ + return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); +} + diff --git a/tests/dpl/localization/test_suite01.cpp b/tests/dpl/localization/test_suite01.cpp new file mode 100644 index 0000000..b752bf5 --- /dev/null +++ b/tests/dpl/localization/test_suite01.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This file contains the declaration of widget dao class. + * + * @file test_suite01.cpp + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief + */ + +#include +#include + +//#include "mockup_include/dpl/wrt-dao-rw/widget_dao.h" +#include +#include + +namespace { + +WrtDB::LanguageTagList generateLanguageTags(){ + WrtDB::LanguageTagList tags; + tags.push_back(L"pl-pl"); + tags.push_back(L"en-en"); + tags.push_back(L"pl-en"); + return tags; +} + +static const WrtDB::LanguageTagList languageTags = generateLanguageTags(); +static const DPL::String widget1Path = L"/opt/share/widget/tests/localization/widget1/"; +static const DPL::String widget2Path = L"/opt/share/widget/tests/localization/widget2/"; + +} // anonymous namespace + +RUNNER_TEST(test01_getFilePathInWidgetPackageFromUrl){ + const int widgetHandle = 1; + WrtDB::WidgetDAO dao(widgetHandle); + //dao.setPath(widget1Path); + + auto result = W3CFileLocalization::getFilePathInWidgetPackageFromUrl( + widgetHandle, + languageTags, + L"widget://one"); + + RUNNER_ASSERT(*result == L"/opt/share/widget/tests/localization/widget1/locales/pl-en/one"); +} + +RUNNER_TEST(test02_getFilePathInWidgetPackageFromUrl){ + const int widgetHandle = 2; + WrtDB::WidgetDAO dao(widgetHandle); + //dao.setPath(widget2Path); + + auto result = W3CFileLocalization::getFilePathInWidgetPackageFromUrl( + widgetHandle, + languageTags, + L"widget://one"); + + RUNNER_ASSERT(*result == L"/opt/share/widget/tests/localization/widget2/locales/pl-en/one"); +} + +RUNNER_TEST(test03_getFilePathInWidgetPackageFromUrl){ + const int widgetHandle = 2; + WrtDB::WidgetDAO dao(widgetHandle); + //dao.setPath(widget2Path); + + auto result = W3CFileLocalization::getFilePathInWidgetPackageFromUrl( + widgetHandle, + languageTags, + L"widget://two"); + + RUNNER_ASSERT(*result == L"/opt/share/widget/tests/localization/widget2/locales/en-en/two"); +} + +RUNNER_TEST(test04_getFilePathInWidgetPackage){ + const int widgetHandle = 1; + WrtDB::WidgetDAO dao(widgetHandle); + //dao.setPath(widget1Path); + + auto result = W3CFileLocalization::getFilePathInWidgetPackage( + widgetHandle, + languageTags, + L"one"); + + RUNNER_ASSERT(*result == L"locales/pl-en/one"); +} + +RUNNER_TEST(test05_getFilePathInWidgetPackage){ + const int widgetHandle = 2; + WrtDB::WidgetDAO dao(widgetHandle); + //dao.setPath(widget2Path); + + auto result = W3CFileLocalization::getFilePathInWidgetPackage( + widgetHandle, + languageTags, + L"two"); + + RUNNER_ASSERT(*result == L"locales/en-en/two"); +} + diff --git a/tests/dpl/unused/test_caller.cpp b/tests/dpl/unused/test_caller.cpp new file mode 100644 index 0000000..17de24b --- /dev/null +++ b/tests/dpl/unused/test_caller.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. + */ +/* + * @file test_address.cpp + * @author Tomasz Swierczek (t.swierczek@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of caller tests + */ + +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +// test stream class +class BinaryStream : public DPL::IStream { + public: + virtual void Read(size_t num, void * bytes) + { + for (unsigned i = 0; i < num; ++i) { + ((unsigned char*)bytes)[i] = data[i + readPosition]; + } + readPosition += num; + } + virtual void Write(size_t num, const void * bytes) + { + for (unsigned i = 0; i < num; ++i) { + data.push_back(((unsigned char*)bytes)[i]); + } + } + BinaryStream() + { + readPosition = 0; + } + virtual ~BinaryStream(){}; + + private: + std::vector data; + unsigned readPosition; +}; + +static int return_func(int a, bool b) +{ + if (b) { + return a; + } else { + return 0; + } +} + +static int called = 0; + +static void void_func(int a) +{ + called = a; +} + +static struct VoidDelegate +{ + void operator()(int a) + { + called = a; + } +} voidDelegate; + +static struct ReturnDelegate +{ + int operator()(int a) + { + return a; + } +} returnDelegate; + +RUNNER_TEST(Caller_function_void) +{ + int a = 23; + BinaryStream stream; + DPL::Serialization::Serialize(stream,a); + called = 0; + DPL::Caller::Call(stream,void_func); + RUNNER_ASSERT(called == a); +} + +RUNNER_TEST(Caller_function_return) +{ + int a = 23; + bool b = true; + BinaryStream stream; + DPL::Serialization::Serialize(stream,a); + DPL::Serialization::Serialize(stream,b); + int result = DPL::Caller::Call(stream,return_func); + RUNNER_ASSERT(result == a); +} + +RUNNER_TEST(Caller_delegate_void) +{ + int a = 23; + BinaryStream stream; + called = 0; + DPL::Serialization::Serialize(stream,a); + DPL::Caller::CallDelegate(stream,voidDelegate); + RUNNER_ASSERT(called == a); +} + +RUNNER_TEST(Caller_delegate_return) +{ + int a = 23; + BinaryStream stream; + called = 0; + DPL::Serialization::Serialize(stream,a); + int result = 0; + DPL::Caller::CallDelegate(stream,returnDelegate,result); + RUNNER_ASSERT(result == a); +} diff --git a/tests/dpl/unused/test_crypto_hash.cpp b/tests/dpl/unused/test_crypto_hash.cpp new file mode 100644 index 0000000..2c0accb --- /dev/null +++ b/tests/dpl/unused/test_crypto_hash.cpp @@ -0,0 +1,90 @@ +/* + * 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_crypto_hash.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of test crypto hash + */ +#include +#include +RUNNER_TEST_GROUP_INIT(DPL) + +#define TEST_CRYPTO_HASH(Class, Input, Output) \ + Class crypto; \ + crypto.Append(Input); \ + crypto.Finish(); \ + RUNNER_ASSERT(crypto.ToString() == Output); + +RUNNER_TEST(CryptoHash_MD2) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::MD2, "sample_input_string", "c9f26439c9882cccc98467dbdf07b1fc"); +} + +RUNNER_TEST(CryptoHash_MD4) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::MD4, "sample_input_string", "8cd0720f7ec98c8e5f008afb54054677"); +} + +RUNNER_TEST(CryptoHash_MD5) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::MD5, "sample_input_string", "eb7ae4f28fecbd1fd777d9b7495fc8ec"); +} + +RUNNER_TEST(CryptoHash_SHA) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::SHA, "sample_input_string", "0a5725f3586616a4049730f3ba14c8aeda79ab21"); +} + +RUNNER_TEST(CryptoHash_SHA1) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::SHA1, "sample_input_string", "be0ed9040af0c2b772b2dd0776f6966b5f4d1206"); +} + +RUNNER_TEST(CryptoHash_DSS) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::DSS, "sample_input_string", "be0ed9040af0c2b772b2dd0776f6966b5f4d1206"); +} + +RUNNER_TEST(CryptoHash_DSS1) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::DSS1, "sample_input_string", "be0ed9040af0c2b772b2dd0776f6966b5f4d1206"); +} + +RUNNER_TEST(CryptoHash_ECDSA) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::ECDSA, "sample_input_string", "be0ed9040af0c2b772b2dd0776f6966b5f4d1206"); +} + +RUNNER_TEST(CryptoHash_SHA224) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::SHA224, "sample_input_string", "d4dde2370eb869f6e790133b94d58e45417392b9d899af883a274011"); +} + +RUNNER_TEST(CryptoHash_SHA256) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::SHA256, "sample_input_string", "a470ec7c783ac51f9eb1772132e6bde1a053bbc81650719dd0ac62ecd93caf12"); +} + +RUNNER_TEST(CryptoHash_SHA384) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::SHA384, "sample_input_string", "63d8bfa95c95c6906d1816965431c065278a655c60f786c9b246c1f73ba7ac557007f5064ba54ebd3a1988e6f37baa97"); +} + +RUNNER_TEST(CryptoHash_SHA512) +{ + TEST_CRYPTO_HASH(DPL::Crypto::Hash::SHA512, "sample_input_string", "799317a140741937d9e5d8dbf9d3045d2c220de5ac33b3d5897acf873291ed14379eb15ef406d2284313d40edb0e01affac8efeb01cb47c2042e3e62a4a83d7d"); +} diff --git a/tests/dpl/unused/test_message_queue.cpp b/tests/dpl/unused/test_message_queue.cpp new file mode 100644 index 0000000..6340b57 --- /dev/null +++ b/tests/dpl/unused/test_message_queue.cpp @@ -0,0 +1,158 @@ +/* + * 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_message_queue.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of message queue tests + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GENERIC_EVENT_0(QuitEvent) + +class QuitController + : public DPL::Controller::Type>, + public DPL::ApplicationExt +{ +public: + QuitController() : DPL::ApplicationExt(1, NULL, "test-app") { Touch(); } + +protected: + virtual void OnEventReceived(const QuitEvent &) { Quit(); } +}; + +RUNNER_TEST_GROUP_INIT(DPL) + +class CopyThread + : public DPL::Thread +{ +private: + bool m_success; + DPL::AbstractWaitableInput *m_input; + DPL::AbstractWaitableOutput *m_output; + std::size_t m_dataSize; + +public: + CopyThread(DPL::AbstractWaitableInput *input, + DPL::AbstractWaitableOutput *output, + std::size_t dataSize) + : m_success(true), + m_input(input), + m_output(output), + m_dataSize(dataSize) + { + LogInfo("Thread created"); + } + +protected: + virtual int ThreadEntry() + { + LogInfo("Entering copy thread"); + + Try + { + DPL::Copy(m_input, m_output, m_dataSize); + } + Catch (DPL::CopyFailed) + { + m_success = false; + + LogWarning("Copy failed!"); + return 0; + } + + LogInfo("Copy finished"); + return 0; + } +}; + +inline std::string BinaryQueueToString(const DPL::BinaryQueue &queue) +{ + char *buffer = new char[queue.Size()]; + queue.Flatten(buffer, queue.Size()); + std::string result = std::string(buffer, buffer + queue.Size()); + delete [] buffer; + return result; +} + +RUNNER_TEST(MessageQueue_DoubleCopy) +{ + DPL::BinaryQueue dataA; + DPL::MessageQueue dataB("/test_mqueue_dataB", true, false, 0660, true); + DPL::MessageQueue dataC("/test_mqueue_dataC", true, false, 0660, true); + DPL::BinaryQueue dataD; + + DPL::AbstractWaitableInputAdapter dataAdapterA(&dataA); + DPL::AbstractWaitableOutputAdapter dataAdapterD(&dataD); + + const std::string testData = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + "Cras elementum venenatis velit, sit amet vehicula odio gravida a." + "Curabitur id nibh id ante adipiscing sollicitudin." + "Maecenas in tellus vel augue vehicula pharetra hendrerit cursus est." + "" + "Ut malesuada quam porttitor dui euismod lacinia." + "Phasellus quis lectus sed lectus dictum tincidunt et vitae leo." + "Fusce id est massa, condimentum bibendum urna." + "Donec venenatis quam eget sapien vulputate egestas." + "Maecenas scelerisque lorem a neque molestie a varius erat condimentum." + "Maecenas varius hendrerit ligula, sed iaculis justo pretium id." + "Nunc sit amet nisl vitae justo tristique suscipit id eget tortor." + "" + "Pellentesque sollicitudin nulla at metus dapibus tincidunt." + "Integer consequat justo eget dui imperdiet iaculis." + "Sed vestibulum ipsum vitae libero accumsan non molestie metus adipiscing." + "" + "Vivamus quis dui enim, in blandit urna." + "In imperdiet lacus at orci elementum a scelerisque dui blandit." + "Donec vulputate enim metus, eget convallis ante." + "Etiam mollis enim eget eros pulvinar nec sagittis justo fermentum." + "" + "Vestibulum sed nunc eu leo lobortis ultrices." + "Nullam placerat nulla et est blandit nec interdum nunc pulvinar." + "Vivamus a lectus eget dui fermentum hendrerit."; + + QuitController quitter; + quitter.PostTimedEvent(QuitEvent(), 1.0); + + CopyThread threadA(&dataAdapterA, &dataB, testData.size()); + CopyThread threadB(&dataB, &dataC, testData.size()); + CopyThread threadC(&dataC, &dataAdapterD, testData.size()); + + dataA.AppendCopy(testData.c_str(), testData.size()); + + threadA.Run(); + threadB.Run(); + threadC.Run(); + + quitter.Exec(); + + threadA.Quit(); + threadB.Quit(); + threadC.Quit(); + + // Now, test data should be in dataD + RUNNER_ASSERT(BinaryQueueToString(dataD) == testData); +} diff --git a/tests/dpl/unused/test_shm.cpp b/tests/dpl/unused/test_shm.cpp new file mode 100644 index 0000000..e62a5ac --- /dev/null +++ b/tests/dpl/unused/test_shm.cpp @@ -0,0 +1,1658 @@ +/* + * 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_shm.h + * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) + * @version 1.0 + * @brief Implementation file for test cases for shared data framework + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +using namespace DPL; + +namespace { +const SharedMemory::Key SHM_KEY = 12345; +const char* SEM_NAME = "/wrt_engine_shared_object_semaphore"; +const size_t VERSION = 1; + +const size_t MAX_THREADS = 10; +const size_t TEST_AND_SET_REPEATS = 100; + +const size_t SHARED_PROP_REPEATS = 3; + +const size_t SINGLETON_TEST_REPEATS = 3; + +// maximum random delay in singleton listener addition/removal +const size_t MAX_SINGLETON_LISTENER_DELAY = 50; + +const int SINGLE_PROCESS_REPEATS = 50; + +/* + * 5 seconds expected timeout for waitable events + * 30 seconds unexpected timeout for waitable events + * We don't want to block tests + */ +const size_t EXPECTED_WAITABLE_TIMEOUT = 5*1000; +const size_t UNEXPECTED_WAITABLE_TIMEOUT = 30*1000; + +bool g_enumTestCorrect = false; +bool g_enumTestIncorrect = false; +size_t g_delegateCalls = 0; + +void Wait(DPL::WaitableEvent& event, bool expectedTimeout = false) +{ + LogDebug("WaitForSingleHandle..."); + DPL::WaitableHandleIndexList list = DPL::WaitForSingleHandle( + event.GetHandle(), + expectedTimeout ? + EXPECTED_WAITABLE_TIMEOUT : UNEXPECTED_WAITABLE_TIMEOUT); + if (list.size() == 0) { + LogDebug("...timeout."); + } + else { + LogDebug("...signaled."); + event.Reset(); + } + + if (expectedTimeout) { + RUNNER_ASSERT(list.size() == 0); + } else { + RUNNER_ASSERT(list.size() == 1); + } +} + +void RemoveIpcs() +{ + Try { + SharedMemory::Remove(SHM_KEY); + } + Catch(SharedMemory::Exception::RemoveFailed) { + // ignore + } + + Try { + DPL::Semaphore::Remove(SEM_NAME); + } + Catch(DPL::Semaphore::Exception::RemoveFailed) { + // ignore + } +} + +typedef DPL::TypeListDecl::Type TestTypeList; +typedef DPL::TypeListDecl::Type TestTypeList2; +typedef DPL::TypeListDecl::Type TestTypeList3; + +typedef SharedObject TestSharedObject; +typedef SharedObject TestSharedObject2; +typedef SharedObject TestSharedObject3; + +typedef std::shared_ptr TestSharedObjectPtr; + +const int INIT_EVENT = 0; +const int DESTROY_EVENT = 1; + +int g_values[TestTypeList::Size]; + +/* + * helper listening controller + */ +template +class ListeningController : + public DPL::Controller::Type> +{ + public: + explicit ListeningController(DPL::WaitableEvent* waitable); + ~ListeningController(); + + virtual void OnEventReceived(const int &event); + + virtual void OnEvent(const int /*event*/) {} + + protected: + std::shared_ptr m_so; + DPL::Thread m_thread; + DPL::WaitableEvent* m_waitable; +}; + +template +ListeningController::ListeningController( + DPL::WaitableEvent* waitable) : + m_waitable(waitable) +{ + Touch(); + m_thread.Run(); + SwitchToThread(&m_thread); + PostEvent(INIT_EVENT); +} + +template +ListeningController::~ListeningController() +{ + m_thread.Quit(); +} + +template +void ListeningController::OnEventReceived(const int& event) +{ + if (event == INIT_EVENT) { + m_so = SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + OnEvent(event); + m_waitable->Signal(); + } + else if (event == DESTROY_EVENT) { + LogDebug("Destroying shared object"); + OnEvent(event); + + // deregister, destroy ad notify main thread + m_so.Reset(); + LogDebug("4"); + m_waitable->Signal(); + LogDebug("5"); + } + else { + OnEvent(event); + } +} + +typedef DPL::TypeListDecl::Type SharedTypeList; + +class TestSharedObject4; +typedef std::shared_ptr TestSharedObject4Ptr; + +class TestSharedObject4 : public SharedObject +{ + public: + enum + { + SIZE_T, + BOOLEAN + }; + + static TestSharedObject4Ptr Create() + { + return SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + } + + ~TestSharedObject4() + { + LogDebug("dtor"); + } + + protected: + explicit TestSharedObject4(const std::string& semaphore) : + SharedObject(semaphore) + { + } + + private: + void Init() + { + SetPropertyInternal(false); + } + friend class SharedObjectFactory; +}; + + + +} // anonymus namespace + +////////////////////////////////////////////// + +RUNNER_TEST(SharedMemory_002_AccessByType) +{ + RemoveIpcs(); + + SharedData str; + + // access by type + str.Embedded<0, int>::value = 4; + str.Embedded<1, int>::value = 5; + str.Embedded<2, char>::value = 'd'; + str.Embedded<3, int[64]>::value[0] = 1; + str.Embedded<3, int[64]>::value[1] = 20; + + RUNNER_ASSERT((str.Embedded<0, int>::value) == 4); + RUNNER_ASSERT((str.Embedded<1, int>::value) == 5); + RUNNER_ASSERT((str.Embedded<2, char>::value) == 'd'); + RUNNER_ASSERT((str.Embedded<3, int[64]>::value[0]) == 1); + RUNNER_ASSERT((str.Embedded<3, int[64]>::value[1]) == 20); +} + +////////////////////////////////////////////// + +RUNNER_TEST(SharedMemory_003_AccessByIndex) +{ + RemoveIpcs(); + + SharedData str; + // access by enum + str.Embedded<0, TestTypeList::Element<0>::Type>::value = 4; + str.Embedded<1, TestTypeList::Element<1>::Type>::value = 5; + str.Embedded<2, TestTypeList::Element<2>::Type>::value = 'd'; + str.Embedded<3, TestTypeList::Element<3>::Type>::value[0] = 1; + str.Embedded<3, TestTypeList::Element<3>::Type>::value[1] = 20; + + RUNNER_ASSERT( + (str.Embedded<0, TestTypeList::Element<0>::Type>::value) == 4); + RUNNER_ASSERT( + (str.Embedded<1, TestTypeList::Element<1>::Type>::value) == 5); + RUNNER_ASSERT( + (str.Embedded<2, TestTypeList::Element<2>::Type>::value) == 'd'); + RUNNER_ASSERT( + (str.Embedded<3, TestTypeList::Element<3>::Type>::value[0]) == 1); + RUNNER_ASSERT( + (str.Embedded<3, TestTypeList::Element<3>::Type>::value[1]) == 20); +} + +////////////////////////////////////////////// + +RUNNER_TEST(SharedMemory_004_SimplifiedAccess) +{ + RemoveIpcs(); + + SharedData str; + + // access via PropertyRef + str.PropertyRef<1>() = 3; + RUNNER_ASSERT(str.PropertyRef<1>() == 3); + + int (&array)[64] = str.PropertyRef<3>(); + array[0] = 2; + RUNNER_ASSERT(str.PropertyRef<3>()[0] == 2); + + str.PropertyRef<3>()[1] = 19; + RUNNER_ASSERT(str.PropertyRef<3>()[1] == 19); + + // access via macro + str.SHARED_PROPERTY(0) = 2; + RUNNER_ASSERT(str.SHARED_PROPERTY(0) == 2); + + str.SHARED_PROPERTY(2) = 'c'; + RUNNER_ASSERT(str.SHARED_PROPERTY(2) == 'c'); + + str.SHARED_PROPERTY(3)[2] = 10; + RUNNER_ASSERT(str.SHARED_PROPERTY(3)[2] == 10); + + // old style check + RUNNER_ASSERT((str.Embedded<0, int>::value) == 2); + RUNNER_ASSERT((str.Embedded<1, int>::value) == 3); + RUNNER_ASSERT((str.Embedded<2, char>::value) == 'c'); + RUNNER_ASSERT((str.Embedded<3, int[64]>::value[0]) == 2); + RUNNER_ASSERT((str.Embedded<3, int[64]>::value[1]) == 19); + RUNNER_ASSERT((str.Embedded<3, int[64]>::value[2]) == 10); +} + +////////////////////////////////////////////// + +struct SharedStruct +{ + int a; + int b; + char c; + int d[64]; +}; + +typedef std::shared_ptr > SharedStructPtr; + +RUNNER_TEST(SharedMemory_010_BaseShmTest) +{ + RemoveIpcs(); + + typedef std::unique_ptr SharedMemoryPtr; + + // write + SharedMemoryPtr shm; + Try { + shm.Reset(SharedMemory::Create(SHM_KEY, false)); + } + Catch (SharedMemory::Exception::NotFound) { + shm.Reset(SharedMemory::Create(SHM_KEY, true, true)); + } + + SharedStructPtr str = shm->Attach(); + + str->Data()->a = 1; + str->Data()->b = 2; + str->Data()->c = '3'; + str->Data()->d[0] = 4; + str->Data()->d[1] = 5; + + // read + SharedMemoryPtr shm2; + Try { + shm2.Reset(SharedMemory::Create(SHM_KEY, false)); + } + Catch (SharedMemory::Exception::NotFound) { + shm2.Reset(SharedMemory::Create(SHM_KEY, true, true)); + } + + SharedStructPtr str2 = shm2->Attach(); + SharedStructPtr str3 = shm2->Attach(); + + RUNNER_ASSERT(str2->Data()->a == 1); + RUNNER_ASSERT(str2->Data()->b == 2); + RUNNER_ASSERT(str2->Data()->c == '3'); + RUNNER_ASSERT(str2->Data()->d[0] == 4); + RUNNER_ASSERT(str2->Data()->d[1] == 5); + + RUNNER_ASSERT(str3->Data()->a == 1); + RUNNER_ASSERT(str3->Data()->b == 2); + RUNNER_ASSERT(str3->Data()->c == '3'); + RUNNER_ASSERT(str3->Data()->d[0] == 4); + RUNNER_ASSERT(str3->Data()->d[1] == 5); + + str2->Data()->b = 4; + str2->Data()->c = 'c'; + str2->Data()->d[0] = 0; + RUNNER_ASSERT(str3->Data()->a == 1); + RUNNER_ASSERT(str3->Data()->b == 4); + RUNNER_ASSERT(str3->Data()->c == 'c'); + RUNNER_ASSERT(str3->Data()->d[0] == 0); + RUNNER_ASSERT(str3->Data()->d[1] == 5); +} + +////////////////////////////////////////////// + +RUNNER_TEST(SharedMemory_020_SharedObjectTest) +{ + RemoveIpcs(); + + typedef SharedObject MySharedObj; + + MySharedObj::Ptr so = + SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + RUNNER_ASSERT((so->GetProperty<0, size_t>()) == 0); + so->SetProperty<0,size_t>(4); + RUNNER_ASSERT((so->GetProperty<0, size_t>()) == 4); +} + +////////////////////////////////////////////// + +class InitTestSharedObject : public TestSharedObject +{ + protected: + explicit InitTestSharedObject(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + virtual void Init(); // from SharedObject + + private: + friend class SharedObjectFactory; +}; + +void InitTestSharedObject::Init() +{ + SetPropertyInternal<0>(1); + SetPropertyInternal<1>(2); + SetPropertyInternal<2>('c'); +} + +RUNNER_TEST(SharedMemory_021_InitTest) +{ + RemoveIpcs(); // we need non existing shm + + std::shared_ptr sho = + SharedObjectFactory::Create( + SHM_KEY, SEM_NAME); + RUNNER_ASSERT((sho->GetProperty<0,int>()) == 1); + RUNNER_ASSERT((sho->GetProperty<1,int>()) == 2); + RUNNER_ASSERT((sho->GetProperty<2,char>()) == 'c'); +} + +////////////////////////////////////////////// + +class VersionTestSO1 : public TestSharedObject +{ + protected: + explicit VersionTestSO1(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + virtual SizeType GetVersion() const { return 1; } // from SharedObject + + private: + friend class SharedObjectFactory; +}; + +class VersionTestSO2 : public TestSharedObject +{ + protected: + explicit VersionTestSO2(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + virtual SizeType GetVersion() const { return 2; } // from SharedObject + + private: + friend class SharedObjectFactory; +}; + +RUNNER_TEST(SharedMemory_022_InvalidVersionTest) +{ + RemoveIpcs(); // we need non existing shm + + std::shared_ptr sho = + SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + Try { + std::shared_ptr sho2 = + SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + RUNNER_ASSERT_MSG(false, "Invalid shm version has been accepted"); + } + Catch(SharedObjectBase::Exception::InvalidVersion) { + RUNNER_ASSERT(true); + } +} + +////////////////////////////////////////////// + +RUNNER_TEST(SharedMemory_023_InvalidSizeTest) +{ + RemoveIpcs(); // we need non existing shm + + typedef SharedObject SO1; + typedef SharedObject SO2; + + SO1::Ptr sho = SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + Try { + SO2::Ptr sho2 = SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + RUNNER_ASSERT_MSG(false, "Invalid shm size has been accepted"); + } + Catch(SharedObjectBase::Exception::InvalidSize) { + RUNNER_ASSERT(true); + } +} + +////////////////////////////////////////////// + +class MagicTestSO1 : public TestSharedObject +{ + protected: + explicit MagicTestSO1(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + // from SharedObject + virtual MagicType GetMagicNumber() const { return 661; } + + private: + friend class SharedObjectFactory; +}; + +class MagicTestSO2 : public TestSharedObject +{ + protected: + explicit MagicTestSO2(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + // from SharedObject + virtual MagicType GetMagicNumber() const { return 662; } + + private: + friend class SharedObjectFactory; +}; + +RUNNER_TEST(SharedMemory_024_InvalidMagicTest) +{ + RemoveIpcs(); // we need non existing shm + + std::shared_ptr sho = + SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + Try { + std::shared_ptr sho2 = + SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + RUNNER_ASSERT_MSG(false, "Invalid shm magic number has been accepted"); + } + Catch(SharedObjectBase::Exception::InvalidMagicNumber) { + RUNNER_ASSERT(true); + } +} + +////////////////////////////////////////////// + +/* + * Listening shared object + */ +class EnumTestSO1 : public TestSharedObject +{ + public: + void SetWaitable(DPL::WaitableEvent* waitable) { m_waitable = waitable; } + + protected: + explicit EnumTestSO1(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + virtual void PropertyChanged(size_t propertyEnum); + + private: + friend class SharedObjectFactory; + + DPL::WaitableEvent* m_waitable; +}; + +void EnumTestSO1::PropertyChanged(size_t propertyEnum) +{ + if (propertyEnum == 1) + { + LogDebug("Property enum " << propertyEnum << " correctly set"); + g_enumTestCorrect = true; + } + if (propertyEnum == 4) + { + // This is bad. We only have 4 types + LogError("Property enum " << propertyEnum << " should be skipped"); + g_enumTestIncorrect = true; + } + // confirm property change notification + m_waitable->Signal(); +} + +class EnumController : public ListeningController +{ + public: + explicit EnumController(DPL::WaitableEvent* waitable) : + ListeningController(waitable) {} + + virtual void OnEvent(const int event); +}; + +void EnumController::OnEvent(const int event) +{ + if (event == INIT_EVENT) { + m_so->SetWaitable(m_waitable); + } +} + +/* + * Writing shared object with correct size but different number of types + */ +class EnumTestSO2 : public TestSharedObject3 +{ + protected: + explicit EnumTestSO2(const std::string& semaphore) : + TestSharedObject3(semaphore) {} + + private: + friend class SharedObjectFactory; +}; + +RUNNER_TEST(SharedMemory_025_InvalidEnumTest) +{ + RemoveIpcs(); // we need non existing shm + + g_enumTestCorrect = false; + g_enumTestIncorrect = false; + + DPL::WaitableEvent waitable; + + // create listening controller and wait until it registers + EnumController controller(&waitable); + Wait(waitable); + LogDebug("Listening controller created"); + + // create writing shared object + std::shared_ptr sho2 = + SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + DPL::WaitableHandleIndexList list; + + // write property and wait for confirmation + sho2->SetProperty<1>(2); + Wait(waitable); + + // write incorrect property and wait for confirmation + // we expect timeout + sho2->SetProperty<4>(2); + Wait(waitable, true); + + // schedule listener deregistration and wait for confirmation + controller.PostEvent(DESTROY_EVENT); + Wait(waitable); + + // check results + RUNNER_ASSERT(g_enumTestCorrect == true); + RUNNER_ASSERT(g_enumTestIncorrect == false); +} + +////////////////////////////////////////////// + +class MultiThreadSO : public TestSharedObject +{ + public: + void TestAndSetProperty(); + + protected: + explicit MultiThreadSO(const std::string& semaphore) : + TestSharedObject(semaphore) {} + + private: + friend class SharedObjectFactory; +}; + +void MultiThreadSO::TestAndSetProperty() +{ + ScopedFlaggedLock lock(*this); + + int value = PropertyRef<0,int>(); + DPL::Thread::MicroSleep(100); + SetPropertyInternal<0>(value+1); +} + +class ShmController : public ListeningController +{ + public: + explicit ShmController(DPL::WaitableEvent* event) : + ListeningController(event), m_counter(0) + {} + + virtual void OnEventReceived(const int& event); + + private: + size_t m_counter; +}; + +void ShmController::OnEventReceived(const int& event) +{ + if (event == INIT_EVENT) { + m_so = SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + PostEvent(2); + } + else if (event == DESTROY_EVENT) { + LogDebug("Destroying shared object"); + // deregister, destroy ad notify main thread + m_so.Reset(); + m_waitable->Signal(); + } + else if (event == 2){ + m_so->TestAndSetProperty(); + m_counter++; + if (m_counter >= TEST_AND_SET_REPEATS) { + LogDebug("Max tests reached. Finishing thread"); + PostEvent(DESTROY_EVENT); + return; + } + PostEvent(2); + } +} + +RUNNER_TEST(SharedMemory_030_MultithreadTest) +{ + RemoveIpcs(); // we need non existing shm + + typedef SharedObject SHO; + SHO::Ptr sho = SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + + ShmController* controller[MAX_THREADS]; + DPL::WaitableEvent finalEvent[MAX_THREADS]; + + for (size_t i=0;iGetProperty<0,int>(); + LogDebug("Final value is " << value << ", expected " << + MAX_THREADS * TEST_AND_SET_REPEATS); + RUNNER_ASSERT(value == MAX_THREADS * TEST_AND_SET_REPEATS); +} + +////////////////////////////////////////////// + +class MyModel10: public DPL::Model +{ + public: + explicit MyModel10(const TestSharedObject4Ptr& shared_object) + : DPL::Model(), boolValue(this, shared_object) {} + + SharedProperty + boolValue; +}; + +/* + * Listening controller + */ +class ShmController3: public ListeningController +{ + public: + explicit ShmController3(DPL::WaitableEvent* event) : + ListeningController(event) + {} + + virtual void OnEvent(const int event); + + void OnValueChanged(const DPL::PropertyEvent& event); + + private: + typedef std::unique_ptr MyModelPtr; + + // model with property bound to shared object + MyModelPtr m_model; +}; + +void ShmController3::OnEvent(const int event) +{ + if (event == INIT_EVENT) { + m_model.Reset(new MyModel10(m_so)); + m_model->boolValue.AddListener( + DPL::FastDelegate&)>( + this, + &ShmController3::OnValueChanged)); + } else if (event == DESTROY_EVENT) { + m_model->boolValue.RemoveListener( + DPL::FastDelegate&)>( + this, + &ShmController3::OnValueChanged)); + m_model.Reset(); + } +} + +void ShmController3::OnValueChanged(const DPL::PropertyEvent& event) +{ + if (event.value) { + // change back + m_model->boolValue.Set(false); + } else { + LogError("Expected value = true, got false"); + } + + m_waitable->Signal(); +} + +RUNNER_TEST(SharedMemory_050_SharedProperty) +{ + RemoveIpcs(); + + bool result = true; + DPL::WaitableEvent waitable; + // listener controller + ShmController3 controller(&waitable); + Wait(waitable); + + TestSharedObject4Ptr sharedObject = TestSharedObject4::Create(); + + for (size_t i = 0; i < SHARED_PROP_REPEATS; ++i) { + sharedObject->SetProperty(true); + Wait(waitable); + result = sharedObject->GetProperty(); + RUNNER_ASSERT(result == false); + } + controller.PostEvent(DESTROY_EVENT); + Wait(waitable); +} + +////////////////////////////////////////////// + +class MyModel2: public DPL::Model +{ + public: + explicit MyModel2(const TestSharedObjectPtr& shared_object) : + counter(this, shared_object) {} + + SharedProperty counter; +}; + +class SPController : public ListeningController +{ + public: + explicit SPController(DPL::WaitableEvent* event) : + ListeningController(event), m_repeats(1) {} + + virtual void OnEvent(const int event); + + void OnValueChanged1(const DPL::PropertyEvent& event); + void OnValueChanged2(const DPL::PropertyEvent& event); + + private: + std::unique_ptr m_model1; + std::unique_ptr m_model2; + + int m_repeats; + std::shared_ptr m_so2; +}; + +void SPController::OnEvent(const int event) +{ + if (event == INIT_EVENT) { + m_so2 = SharedObjectFactory::Create(SHM_KEY, + SEM_NAME); + + // create and register 2 models sharing the same property + m_model1.Reset(new MyModel2(m_so)); + m_model2.Reset(new MyModel2(m_so2)); + m_model1->counter.AddListener( + DPL::FastDelegate&)>( + this, + &SPController::OnValueChanged1)); + m_model2->counter.AddListener( + DPL::FastDelegate&)>( + this, + &SPController::OnValueChanged2)); + m_model1->counter.Set(1); + } + else if (event == DESTROY_EVENT) { + m_model1->counter.RemoveListener( + DPL::FastDelegate&)>( + this, + &SPController::OnValueChanged1)); + m_model2->counter.RemoveListener( + DPL::FastDelegate&)>( + this, + &SPController::OnValueChanged2)); + + m_model1.Reset(); + m_model2.Reset(); + m_so2.Reset(); + } +} + +void SPController::OnValueChanged1(const DPL::PropertyEvent& event) +{ + if (m_repeats >= SINGLE_PROCESS_REPEATS) { + PostEvent(DESTROY_EVENT); + return; + } + + LogDebug("[1] Value changed to " << event.value); + m_repeats++; + m_model1->counter.Set(event.value+1); +} + +void SPController::OnValueChanged2(const DPL::PropertyEvent& event) +{ + if (m_repeats >= SINGLE_PROCESS_REPEATS) { + PostEvent(DESTROY_EVENT); + return; + } + + LogDebug("[2] Value changed to " << event.value); + m_repeats++; + m_model2->counter.Set(event.value+1); +} + +RUNNER_TEST(SharedMemory_060_SingleProcess) +{ + RemoveIpcs(); + + DPL::WaitableEvent waitable; + SPController controller(&waitable); + TestSharedObjectPtr sho = SharedObjectFactory::Create( + SHM_KEY, + SEM_NAME); + + // wait for creation + Wait(waitable); + + // wait for destruction + Wait(waitable); + + int value = sho->GetProperty<0,int>(); + + LogDebug("final value: " << value); + + // check value + RUNNER_ASSERT(value == SINGLE_PROCESS_REPEATS); +} + +////////////////////////////////////////////// + +class ListenerTestController: public ListeningController, + public ISharedObjectListener<0,int>, + public ISharedObjectListener<1,int>, + public ISharedObjectListener<2,char>, + public ISharedObjectListener<3,int[64]> +{ + public: + explicit ListenerTestController(DPL::WaitableEvent* event) : + ListeningController(event) {} + + ~ListenerTestController(); + + virtual void OnEvent(const int event); + + virtual void ValueChanged(size_t propertyEnum, + const int& value, + const void* info = NULL); + virtual void ValueChanged(size_t propertyEnum, + const char& value, + const void* info = NULL); + virtual void ValueChanged(size_t propertyEnum, + const int(& value)[64], + const void* info = NULL); +}; + +ListenerTestController::~ListenerTestController() +{} + +void ListenerTestController::OnEvent(const int event) +{ + if (event == INIT_EVENT) { + // add self as a listener to shared object + m_so->AddListener<0,int>(this); + m_so->AddListener<1,int>(this); + m_so->AddListener<2,char>(this); + m_so->AddListener<3,int[64]>(this); + } + else if (event == DESTROY_EVENT) { + // remove self from listener list + m_so->RemoveListener<0,int>(this); + m_so->RemoveListener<1,int>(this); + m_so->RemoveListener<2,char>(this); + m_so->RemoveListener<3,int[64]>(this); + } +} + +void ListenerTestController::ValueChanged(size_t propertyEnum, + const int& value, + const void* /*info*/) +{ + LogDebug("ValueChanged(int) " << propertyEnum << " " << value); + if ((propertyEnum == 0 && value == 1) || (propertyEnum == 1 && value == 2)) + { + g_values[propertyEnum]++; + if (g_values[propertyEnum] == 3) { + m_waitable->Signal(); + } + } +} + +void ListenerTestController::ValueChanged(size_t propertyEnum, + const char& value, + const void* /*info*/) +{ + LogDebug("ValueChanged(char) " << propertyEnum << " " << value); + if (propertyEnum == 2 && value == 'c') + { + g_values[propertyEnum]++; + if (g_values[propertyEnum] == 3) { + m_waitable->Signal(); + } + } +} + +void ListenerTestController::ValueChanged(size_t propertyEnum, + const int(& value)[64], + const void* /*info*/) +{ + LogDebug("ValueChanged(int[64]) " << propertyEnum << " " << value[5]); + if (propertyEnum == 3 && value[5] == 5) + { + g_values[propertyEnum]++; + if (g_values[propertyEnum] == 3) { + m_waitable->Signal(); + } + } +} + +RUNNER_TEST(SharedMemory_070_SharedObjectListeners) +{ + RemoveIpcs(); + + // setup global flags + for (size_t i=0;i::Create( + SHM_KEY, SEM_NAME); + + // create 1st listener and wait for it + DPL::WaitableEvent waitable; + ListenerTestController c1(&waitable); + Wait(waitable); + + // create 2nd listener and wait for it + ListenerTestController c2(&waitable); + Wait(waitable); + + // create 3rd listener and wait for it + ListenerTestController c3(&waitable); + Wait(waitable); + + // set properties and wait for result + sho->SetProperty<0,int>(1); + Wait(waitable); + + RUNNER_ASSERT(g_values[0] == 3); + + sho->SetProperty<1,int>(2); + Wait(waitable); + + RUNNER_ASSERT(g_values[1] == 3); + + sho->SetProperty<2,char>('c'); + Wait(waitable); + + RUNNER_ASSERT(g_values[2] == 3); + + int array[64]; + memset(array,64*sizeof(array[0]),0); + array[5] = 5; + sho->SetProperty<3,int[64]>(array); + Wait(waitable); + + RUNNER_ASSERT(g_values[3] == 3); + + // finalize listeners + c1.PostEvent(DESTROY_EVENT); + Wait(waitable); + + c2.PostEvent(DESTROY_EVENT); + Wait(waitable); + + c3.PostEvent(DESTROY_EVENT); + Wait(waitable); +} + +////////////////////////////////////////////// + +/* + * class simulating DB access + */ +class DAO : public DPL::Noncopyable +{ + public: + DAO() : m_boolValue(false) {} + + void SetBoolValue(const bool& value) { m_boolValue = value; } + + bool GetBoolValue() const { return m_boolValue; } + + private: + bool m_boolValue; +}; + +/* + * Model with property having set delegate defined + */ +class MyModel3: public DPL::Model +{ + public: + typedef SharedPropertyEx PropertyType; + + MyModel3(const TestSharedObject4Ptr& shared_object, DAO* dao) : + boolValue(this, + shared_object, + PropertyType::SetDelegate(dao, &DAO::SetBoolValue)) + { + } + + PropertyType boolValue; +}; + +RUNNER_TEST(SharedMemory_090_SetPropertyDelegate) +{ + RemoveIpcs(); + + // dao object + DAO dao; + + // create shared object + TestSharedObject4Ptr sho = TestSharedObject4::Create(); + + // set property but call dao delegate within semaphore + sho->SetProperty( + true, + MyModel3::PropertyType::SetDelegate(&dao, &DAO::SetBoolValue)); + + // check dao value + RUNNER_ASSERT(dao.GetBoolValue() == true); + + // check shared object value + bool shoValue = sho->GetProperty(); + RUNNER_ASSERT(shoValue == true); + + // try the same with shared property + MyModel3 model(sho, &dao); + + // set property + model.boolValue.Set(false); + + // check dao value + RUNNER_ASSERT(dao.GetBoolValue() == false); + + // check sho value + shoValue = sho->GetProperty(); + RUNNER_ASSERT(shoValue == false); + + // check property value + RUNNER_ASSERT(model.boolValue.Get() == false); +} + +////////////////////////////////////////////// + +/* + * Lazy initialization test shared object + */ +class LazySharedObject : public SharedObject +{ + public: + explicit LazySharedObject(const std::string& semaphore) : + SharedObject(semaphore) + ,m_read(false) + { + } + + void Init(); + + bool IsRead() const { return m_read; } + + private: + friend class SharedObjectFactory; + + bool m_read; +}; + +void LazySharedObject::Init() +{ + SetPropertyInternal<0>(42); + m_read = true; +} + +RUNNER_TEST(SharedMemory_100_LazyInit) +{ + RemoveIpcs(); + + typedef std::shared_ptr LazySharedObjectPtr; + + // create shared object + LazySharedObjectPtr sho = SharedObjectFactory::Create( + SHM_KEY, SEM_NAME); + + RUNNER_ASSERT(sho->IsRead() == false); + + // get property causing lazy init + int value = sho->GetProperty<0, int>(); + + RUNNER_ASSERT(sho->IsRead() == true); + RUNNER_ASSERT(value == 42); + + // create another object + LazySharedObjectPtr sho2 = SharedObjectFactory::Create( + SHM_KEY, SEM_NAME); + + RUNNER_ASSERT(sho2->IsRead() == false); + + // get property NOT causing lazy init + value = sho2->GetProperty<0, int>(); + + RUNNER_ASSERT(sho2->IsRead() == false); + RUNNER_ASSERT(value == 42); + + // destroy both objects + sho.Reset(); + sho2.Reset(); + + // create shared object + LazySharedObjectPtr sho3 = SharedObjectFactory::Create( + SHM_KEY, SEM_NAME); + + RUNNER_ASSERT(sho3->IsRead() == false); + + // set property causing lazy init + sho3->SetProperty<0>(43); + value = sho3->GetProperty<0, int>(); + + RUNNER_ASSERT(sho3->IsRead() == true); + RUNNER_ASSERT(value == 43); + +} + +////////////////////////////////////////////// + +bool SetCondition(const int& readValue, int& setValue); +bool SetCondition(const int& readValue, int& setValue) +{ + LogDebug("Condition delegate called with read value = " << readValue << + " and set value = " << setValue); + + if (readValue > 3) { + LogDebug("Condition is false"); + return false; + } + + LogDebug("Condition is true"); + if (4 == setValue) { + setValue = 10; + LogDebug("Changing set value to " << setValue); + } + return true; +} + +void SetDelegate(const int& readValue); +void SetDelegate(const int& readValue) +{ + LogDebug("Set delegate called " << readValue); + g_delegateCalls++; +} + +RUNNER_TEST(SharedMemory_120_ConditionalSet) +{ + RemoveIpcs(); + + TestSharedObjectPtr sho = SharedObjectFactory::Create( + SHM_KEY, + SEM_NAME); + + g_delegateCalls = 0; + + RUNNER_ASSERT(0 == (sho->GetProperty<0,int>())); + + DPL::FastDelegate condition(&SetCondition); + DPL::FastDelegate delegate(&SetDelegate); + + bool succeeded = false; + + succeeded = sho->ConditionalSetProperty<0>(-2, condition); + + RUNNER_ASSERT(succeeded); + RUNNER_ASSERT(-2 == (sho->GetProperty<0,int>())); + + succeeded = sho->ConditionalSetProperty<0>(4, condition, delegate); + + RUNNER_ASSERT(succeeded); + RUNNER_ASSERT(10 == (sho->GetProperty<0,int>())); + RUNNER_ASSERT(1 == g_delegateCalls); + + succeeded = sho->ConditionalSetProperty<0>(5, condition); + + RUNNER_ASSERT(!succeeded); + RUNNER_ASSERT(10 == (sho->GetProperty<0,int>())); + + succeeded = sho->ConditionalSetProperty<0>(666, condition, delegate); + + RUNNER_ASSERT(!succeeded); + RUNNER_ASSERT(10 == (sho->GetProperty<0,int>())); + RUNNER_ASSERT(1 == g_delegateCalls); +} + +////////////////////////////////////////////// + +/* + * Shared object used by multiple threads as a singleton. + */ +class MTSharedObject : public SharedObject +{ + public: + explicit MTSharedObject(const std::string& semaphore) : + SharedObject(semaphore) + { + } + + void Clear(); + + private: + friend class SharedObjectFactory; +}; + +typedef std::shared_ptr MTSharedObjectPtr; + +void MTSharedObject::Clear() +{ + int array[64] = {}; + SetProperty<0>(0); + SetProperty<1>(0); + SetProperty<2>(static_cast(0)); + SetProperty<3>(array); +} + +/* + * Shared object singleton + */ +class SharedObjectSingleton +{ + public: + static MTSharedObjectPtr Instance(); + static void Destroy(); + + private: + static MTSharedObjectPtr m_sho; + static DPL::Mutex m_mutex; +}; + +MTSharedObjectPtr SharedObjectSingleton::m_sho; +DPL::Mutex SharedObjectSingleton::m_mutex; + +MTSharedObjectPtr SharedObjectSingleton::Instance() +{ + DPL::Mutex::ScopedLock lock(&m_mutex); + if (!m_sho) { + m_sho = SharedObjectFactory::Create(SHM_KEY, SEM_NAME); + } + return m_sho; +} + +void SharedObjectSingleton::Destroy() +{ + DPL::Mutex::ScopedLock lock(&m_mutex); + m_sho.Reset(); +} + +/* + * Listening controller + */ +class ShmController4 : public ListeningController, + public ISharedObjectListener<0,int>, + public ISharedObjectListener<1,int>, + public ISharedObjectListener<2,char>, + public ISharedObjectListener<3,int[64]> +{ + public: + enum { + ADD_LISTENERS = 2, + REMOVE_LISTENERS = 3, + DESTROY_SINGLETON = 4 + }; + + explicit ShmController4(DPL::WaitableEvent* event) : + ListeningController(event) + {} + + virtual void OnEventReceived(const int& event); + + virtual void ValueChanged(size_t propertyEnum, + const int& value, + const void* info = NULL); + virtual void ValueChanged(size_t propertyEnum, + const char& value, + const void* info = NULL); + virtual void ValueChanged(size_t propertyEnum, + const int(& value)[64], + const void* info = NULL); + + bool NotRegistered(); + + private: + void Sleep(); + + size_t m_counter; +}; + +void ShmController4::ValueChanged(size_t propertyEnum, + const int& value, + const void* /*info*/) +{ + LogDebug("ValueChanged(int) " << propertyEnum << " " << value); + if ((propertyEnum == 0 && value == 1) || + (propertyEnum == 1 && value == 11)) + { + m_waitable->Signal(); + } +} + +void ShmController4::ValueChanged(size_t propertyEnum, + const char& value, + const void* /*info*/) +{ + LogDebug("ValueChanged(char) " << propertyEnum << " " << value); + if (propertyEnum == 2 && value == 'a') { + m_waitable->Signal(); + } +} + +void ShmController4::ValueChanged(size_t propertyEnum, + const int(& value)[64], + const void* /*info*/) +{ + LogDebug("ValueChanged(int[64]) " << propertyEnum << " " << value[5]); + if (propertyEnum == 3 && value[0] == 0 && value[1] == 1 && value[2] == 2) { + m_waitable->Signal(); + } +} + +void ShmController4::Sleep() +{ + DPL::Thread::GetCurrentThread()->MiliSleep( + rand() % MAX_SINGLETON_LISTENER_DELAY); +} + +void ShmController4::OnEventReceived(const int& event) +{ + switch (event) { + case INIT_EVENT: + m_so = SharedObjectSingleton::Instance(); + m_waitable->Signal(); + break; + + case DESTROY_EVENT: + LogDebug("Destroying shared object"); + // deregister, destroy and notify main thread + m_so.Reset(); + m_waitable->Signal(); + break; + + case ADD_LISTENERS: + // add listener and notify + m_so->AddListener<0,int>(this); + Sleep(); + m_so->AddListener<1,int>(this); + Sleep(); + m_so->AddListener<2,char>(this); + Sleep(); + m_so->AddListener<3,int[64]>(this); + Sleep(); + m_waitable->Signal(); + break; + + case REMOVE_LISTENERS: + // remove listener and notify + m_so->RemoveListener<0,int>(this); + Sleep(); + m_so->RemoveListener<1,int>(this); + Sleep(); + m_so->RemoveListener<2,char>(this); + Sleep(); + m_so->RemoveListener<3,int[64]>(this); + Sleep(); + m_waitable->Signal(); + break; + + case DESTROY_SINGLETON: + SharedObjectSingleton::Destroy(); + m_waitable->Signal(); + break; + + default: + LogError("Unsupported event received: " << event); + } +} + +void MultipleWait(DPL::WaitableEvent (& event)[MAX_THREADS]); +void MultipleWait(DPL::WaitableEvent (& event)[MAX_THREADS]) +{ + for (size_t i=0;iRemoveListener<(property)>(controller[i]); \ + LogError("Controller " << i << " is still listening for property " \ + << #property); \ + RUNNER_ASSERT_MSG(false, "No listeners expected"); \ + } \ + Catch (MTSharedObject::Exception::ListenerNotFound) { \ + RUNNER_ASSERT(true); \ + } \ + +// test +RUNNER_TEST(SharedMemory_130_SharedObjectSingleton) +{ + RemoveIpcs(); // we need non existing shm + + srand(time(NULL)); + + // writer shared object + TestSharedObjectPtr sho = SharedObjectFactory::Create( + SHM_KEY, SEM_NAME); + + ShmController4* controller[MAX_THREADS]; + DPL::WaitableEvent waitable[MAX_THREADS]; + + const int array[64] = {0,1,2}; + + // Create and wait for notification. Make sure that the thread/controller 0 + // is created first + LogInfo("Creating controllers"); + for (size_t i=0;iClear(); + + // add listeners + LogInfo("Adding listeners"); + for (size_t i=0;iPostEvent(ShmController4::ADD_LISTENERS); + } + // wait for listeners + MultipleWait(waitable); + + RUNNER_ASSERT((singleton->GetProperty<0,int>()) == 0); + RUNNER_ASSERT((singleton->GetProperty<1,int>()) == 0); + RUNNER_ASSERT((singleton->GetProperty<2,char>()) == 0); + + int checkArray[64] = {}; + singleton->GetProperty<3>(checkArray); + RUNNER_ASSERT(checkArray[0] == 0); + RUNNER_ASSERT(checkArray[1] == 0); + RUNNER_ASSERT(checkArray[2] == 0); + + // change + LogInfo("Setting property 0"); + sho->SetProperty<0>(1); + // wait for confirmations + MultipleWait(waitable); + + // change + LogInfo("Setting property 1"); + sho->SetProperty<1>(11); + // wait for confirmations + MultipleWait(waitable); + + // change + LogInfo("Setting property 2"); + sho->SetProperty<2>('a'); + // wait for confirmations + MultipleWait(waitable); + + // change + LogInfo("Setting property 3"); + sho->SetProperty<3>(array); + // wait for confirmations + MultipleWait(waitable); + + // remove listeners + LogInfo("Removing listeners"); + for (size_t i=0;iPostEvent(ShmController4::REMOVE_LISTENERS); + } + // wait for listeners + MultipleWait(waitable); + + // check if listeners array is empty + LogInfo("Checking listeners"); + for (size_t i=0;iGetProperty<0,int>()) == 1); + RUNNER_ASSERT((singleton->GetProperty<1,int>()) == 11); + RUNNER_ASSERT((singleton->GetProperty<2,char>()) == 'a'); + singleton->GetProperty<3>(checkArray); + RUNNER_ASSERT(checkArray[0] == 0); + RUNNER_ASSERT(checkArray[1] == 1); + RUNNER_ASSERT(checkArray[2] == 2); + } + + singleton.Reset(); + + // Destroy controllers and wait for confirmation. Make sure that + // thread/controller 0 is destroyed in the end + LogInfo("Destroying controllers"); + for (int i=MAX_THREADS-1;i>=0;--i) { + controller[i]->PostEvent(DESTROY_EVENT); + Wait(waitable[i]); + if (i==0) { + /* + * Destroy singleton before thread that created it finishes. + * This is to properly close all waitable handles opened by + * SharedObject in thread 0. + */ + LogInfo("Destroying singleton"); + controller[i]->PostEvent(ShmController4::DESTROY_SINGLETON); + Wait(waitable[i]); + } + delete controller[i]; + } +} + +#undef LISTENER_ASSERT + +/* + * test preconditions & postconditions: + * - no existing shared memory with given SHM_KEY + * - no existing semaphore of given SEM_NAME + */ +RUNNER_TEST(SharedMemory_001_Preconditions) { + RemoveIpcs(); +} + +RUNNER_TEST(SharedMemory_999_Postconditions) { + RemoveIpcs(); +} diff --git a/tests/dpl/unused/test_sql_connection.cpp b/tests/dpl/unused/test_sql_connection.cpp new file mode 100644 index 0000000..2c2fc4f --- /dev/null +++ b/tests/dpl/unused/test_sql_connection.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file test_sql_connection.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of sql connection tests + */ + + +/* + +This test has been saved from original test_sql_connection.cpp in wrt-commons project. + +*/ + +#include + +RUNNER_TEST(SqlConnection_MassiveReadWrite_SemaphoreSynchronization) +{ + srand(time(NULL)); + + std::ostringstream dbSemaporeFileNameStream; + dbSemaporeFileNameStream << "dpl_tests_dbso_sem_"; + dbSemaporeFileNameStream << rand() << ".sem"; + + std::string dbSemaphoreFileName = dbSemaporeFileNameStream.str(); + + SemaphoreSynchronizationObjectGenerator m_generator(dbSemaphoreFileName); + MassiveReadWriteTest(&m_generator); +} diff --git a/tests/dpl/unused/test_task.cpp b/tests/dpl/unused/test_task.cpp new file mode 100644 index 0000000..94bd357 --- /dev/null +++ b/tests/dpl/unused/test_task.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file test_task.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of task tests + */ +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL) + +class MySingleTask + : public DPL::TaskDecl +{ +protected: + void StepOne() + { + } + +public: + MySingleTask() + : DPL::TaskDecl(this) + { + AddStep(&MySingleTask::StepOne); + } +}; + +class MyMultiTask + : public DPL::MultiTaskDecl +{ +protected: + typedef DPL::MultiTaskDecl BaseType; + + void StepOne() + { + LogInfo("Step one"); + } + + void StepTwo() + { + LogInfo("Step two"); + } + + void StepThree() + { + LogInfo("Step three"); + } + +public: + MyMultiTask() + : BaseType(this, 2) + { + BaseType::StepList depListStepThree; + depListStepThree.push_back(&MyMultiTask::StepOne); + depListStepThree.push_back(&MyMultiTask::StepTwo); + AddStep(&MyMultiTask::StepThree, depListStepThree); + + BaseType::StepList depListStepTwo; + depListStepTwo.push_back(&MyMultiTask::StepOne); + AddStep(&MyMultiTask::StepTwo, depListStepTwo); + + BaseType::StepList depListStepOne; + AddStep(&MyMultiTask::StepOne, depListStepOne); + } +}; + +RUNNER_TEST(Task_SingleTask) +{ + MySingleTask task; + while (task.NextStep()); +} + +RUNNER_TEST(Task_MultiTask) +{ + MyMultiTask task; + while (task.NextStep()); +} diff --git a/tests/dpl/utils/CMakeLists.txt b/tests/dpl/utils/CMakeLists.txt new file mode 100644 index 0000000..b3ce494 --- /dev/null +++ b/tests/dpl/utils/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# @file CMakeLists.txt +# @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com) +# @version 1.0 +# @brief +# + +SET(TARGET_NAME "dpl-tests-utils") + +# Set DPL tests sources +SET(DPL_TESTS_UTIL_SOURCES + ${TESTS_DPL_DIR}/utils/main.cpp + ${TESTS_DPL_DIR}/utils/widget_version.cpp + ${TESTS_DPL_DIR}/utils/bash_utils.cpp + ${TESTS_DPL_DIR}/utils/wrt_utility.cpp +) + +#WRT_TEST_ADD_INTERNAL_DEPENDENCIES(${TARGET_NAME} ${TARGET_DPL_UTILS_EFL}) +WRT_TEST_BUILD(${TARGET_NAME} ${DPL_TESTS_UTIL_SOURCES}) +WRT_TEST_INSTALL(${TARGET_NAME}) diff --git a/tests/dpl/utils/bash_utils.cpp b/tests/dpl/utils/bash_utils.cpp new file mode 100644 index 0000000..f433fd8 --- /dev/null +++ b/tests/dpl/utils/bash_utils.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file bash_utils.cpp + * @author Iwanek Tomasz + * @version 1.0 + */ +#include +#include +#include + +using namespace BashUtils; + +RUNNER_TEST_GROUP_INIT(DPL_BASH_UTILS) + +RUNNER_TEST(Bash_Utils_escape_arg) +{ + RUNNER_ASSERT_MSG(escape_arg(std::string("valid")) == "\"valid\"", "Valid argument failed"); + LogDebug("\"val\\!d\"" << " " << escape_arg(std::string("val!d"))); + RUNNER_ASSERT_MSG(escape_arg(std::string("val!d")) == "\"val\\!d\"", "Single escaped character in argument failed"); + LogDebug("\"v\\$l\\$\\$\"" << " " << escape_arg(std::string("v$l$$"))); + RUNNER_ASSERT_MSG(escape_arg(std::string("v$l$$")) == "\"v\\$l\\$\\$\"", "Multiple occurences of single special character in argument failed"); + LogDebug("\"v\\`\\$\\\"\\!d\\`\"" << " " << escape_arg(std::string("v`$\"!d`"))); + RUNNER_ASSERT_MSG(escape_arg(std::string("v`$\"!d`")) == "\"v\\`\\$\\\"\\!d\\`\"", "Multiple occurences of multiple special character in argument failed"); +} diff --git a/tests/dpl/utils/main.cpp b/tests/dpl/utils/main.cpp new file mode 100644 index 0000000..42ffe3a --- /dev/null +++ b/tests/dpl/utils/main.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file main.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief This file is the implementation file of main + */ +#include + +int main(int argc, char *argv[]) +{ + return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv); +} + diff --git a/tests/dpl/utils/widget_version.cpp b/tests/dpl/utils/widget_version.cpp new file mode 100644 index 0000000..2413b65 --- /dev/null +++ b/tests/dpl/utils/widget_version.cpp @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file widget_version.cpp + * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com) + * @version 1.0 + * @brief Implementation file for test cases for engine internal tests + */ +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL_WIDGET_VERSION) + +RUNNER_TEST(WidgetVersion_M2_O0) +{ + DPL::String raw(L"1.2"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == true); + RUNNER_ASSERT(version.Major() == DPL::String(L"1")); + RUNNER_ASSERT(version.Minor() == DPL::String(L"2")); + RUNNER_ASSERT(version.Micro() == DPL::Optional()); + RUNNER_ASSERT(version.Optional() == DPL::Optional()); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M2_O0_nonwac_1) +{ + DPL::String raw(L"a1.2"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M2_O0_nonwac_2) +{ + DPL::String raw(L"1.2a"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M2_O0_nonwac_3) +{ + DPL::String raw(L"aaa1.2bbb"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M2_O0_nonwac_4) +{ + DPL::String raw(L"1a.a2"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M2_O0_long) +{ + DPL::String raw(L"123456789012345678901234567890.98765432109876543210987654321"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == true); + RUNNER_ASSERT(version.Major() == DPL::String(L"123456789012345678901234567890")); + RUNNER_ASSERT(version.Minor() == DPL::String(L"98765432109876543210987654321")); + RUNNER_ASSERT(version.Micro() == DPL::Optional()); + RUNNER_ASSERT(version.Optional() == DPL::Optional()); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O0) +{ + DPL::String raw(L"1.2.3"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == true); + RUNNER_ASSERT(version.Major() == DPL::String(L"1")); + RUNNER_ASSERT(version.Minor() == DPL::String(L"2")); + RUNNER_ASSERT(version.Micro() == DPL::Optional(L"3")); + RUNNER_ASSERT(version.Optional() == DPL::Optional()); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O0_nonwac_1) +{ + DPL::String raw(L"a1a.2.3"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O0_nonwac_2) +{ + DPL::String raw(L"1.b2.3"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O0_nonwac_3) +{ + DPL::String raw(L"1.2.3c"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O0_nonwac_4) +{ + DPL::String raw(L"1.2.3a"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O1_1) +{ + DPL::String raw(L"1.2.3 test111"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == true); + RUNNER_ASSERT(version.Major() == DPL::String(L"1")); + RUNNER_ASSERT(version.Minor() == DPL::String(L"2")); + RUNNER_ASSERT(version.Micro() == DPL::Optional(L"3")); + RUNNER_ASSERT(version.Optional() == DPL::Optional(L"test111")); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O1_2) +{ + DPL::String raw(L"1.2.3 111"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == true); + RUNNER_ASSERT(version.Major() == DPL::String(L"1")); + RUNNER_ASSERT(version.Minor() == DPL::String(L"2")); + RUNNER_ASSERT(version.Micro() == DPL::Optional(L"3")); + RUNNER_ASSERT(version.Optional() == DPL::Optional(L"111")); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M3_O1_3) +{ + DPL::String raw(L"1.2.3 "); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_M2_O1_1) +{ + DPL::String raw(L"1.2 t"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == true); + RUNNER_ASSERT(version.Major() == DPL::String(L"1")); + RUNNER_ASSERT(version.Minor() == DPL::String(L"2")); + RUNNER_ASSERT(version.Micro() == DPL::Optional()); + RUNNER_ASSERT(version.Optional() == DPL::Optional(L"t")); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Strange_0) +{ + DPL::String raw(L"1"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Strange_1) +{ + DPL::String raw(L".1"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Strange_2) +{ + DPL::String raw(L"..1"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Strange_3) +{ + DPL::String raw(L"...1"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Strange_4) +{ + DPL::String raw(L"qwerty"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Strange_5) +{ + DPL::String raw(L"!@#$%^&*()_+ ^&%^*&%$^*&%*()& JHKJLHKJLH 685685687"); + WidgetVersion version(raw); + + RUNNER_ASSERT(version.IsWac() == false); + RUNNER_ASSERT(version.Raw() == raw); +} + +RUNNER_TEST(WidgetVersion_Compare_0) +{ + RUNNER_ASSERT(WidgetVersion(L"1.1") < WidgetVersion(L"1.2")); +} + +RUNNER_TEST(WidgetVersion_Compare_1) +{ + RUNNER_ASSERT(WidgetVersion(L"01.001") < WidgetVersion(L"0001.002")); +} + +RUNNER_TEST(WidgetVersion_Compare_2) +{ + RUNNER_ASSERT(WidgetVersion(L"0.1") == WidgetVersion(L"00.1")); +} + +RUNNER_TEST(WidgetVersion_Compare_3) +{ + RUNNER_ASSERT(WidgetVersion(L"1.00000000000000") >= WidgetVersion(L"1.0 test")); +} + +RUNNER_TEST(WidgetVersion_Compare_4) +{ + RUNNER_ASSERT(WidgetVersion(L"19647963733338932479072098437089778943732432.00000000000000004324324324324321") > WidgetVersion(L"4324324324324324324321.000432")); +} + +RUNNER_TEST(WidgetVersion_Compare_5) +{ + RUNNER_ASSERT(WidgetVersion(L"12345.1") == WidgetVersion(L"12345.1")); +} + +RUNNER_TEST(WidgetVersion_Compare_6) +{ + RUNNER_ASSERT(WidgetVersion(L"1.1") != WidgetVersion(L"1.11")); +} + +RUNNER_TEST(WidgetVersion_Compare_7) +{ + RUNNER_ASSERT(WidgetVersion(L"000123000.0 notatest") == WidgetVersion(L"00123000.0 testtesttest")); +} diff --git a/tests/dpl/utils/wrt_utility.cpp b/tests/dpl/utils/wrt_utility.cpp new file mode 100644 index 0000000..31d5abe --- /dev/null +++ b/tests/dpl/utils/wrt_utility.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * @file wrt_utility.cpp + * @author Janusz Majnert (j.majnert@samsung.com) + * @version 1.0 + * @brief Implementation file for test cases for wrt_utility functions + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +RUNNER_TEST_GROUP_INIT(DPL_WRT_UTILITY) + +RUNNER_TEST(wrt_utility_WrtUtilJoinPaths) +{ + std::string result; + + WrtUtilJoinPaths(result, "a/b/c/", "e/f/g.asd"); + RUNNER_ASSERT(result == "a/b/c/e/f/g.asd"); + + WrtUtilJoinPaths(result, "/a/b/c", "/e/f/g/"); + RUNNER_ASSERT(result == "/a/b/c/e/f/g/"); + + WrtUtilJoinPaths(result, "/a/b/c/", "/e/f/g/"); + RUNNER_ASSERT(result == "/a/b/c/e/f/g/"); + + WrtUtilJoinPaths(result, "/a/b/c", "e/f/g/"); + RUNNER_ASSERT(result == "/a/b/c/e/f/g/"); +} + +/** + * Create recursive path with specified permissions. + * Check if folders exist. + * Check if permissions are set. + */ +RUNNER_TEST(wrt_utility_WrtUtilMakeDir) +{ + struct stat st; + //First delete the dir if it exists + WrtUtilRemove("/tmp/test"); + WrtUtilMakeDir("/tmp/test/1/2/3/4/5/6/7/8/9", 0755); + if (stat("/tmp/test/1/2/3/4/5/6/7/8/9", &st) == 0) { + RUNNER_ASSERT_MSG(st.st_mode & S_IRWXU, + "read, write, execute/search by owner"); + RUNNER_ASSERT_MSG(st.st_mode & S_IXGRP, + "execute/search permission, group"); + RUNNER_ASSERT_MSG(st.st_mode & S_IRGRP, "read permission, group"); + RUNNER_ASSERT_MSG(!(st.st_mode & S_IWGRP), + "NO write permission, group "); + RUNNER_ASSERT_MSG(st.st_mode & S_IXOTH, + "execute/search permission, others"); + RUNNER_ASSERT_MSG(st.st_mode & S_IROTH, "read permission, others"); + RUNNER_ASSERT_MSG(!(st.st_mode & S_IWOTH), + "NO write permission, others "); + } else { + RUNNER_ASSERT_MSG(false, "Cannot stat folder"); + } +} + +/** + * Create directory without permission to write. + */ +RUNNER_TEST(wrt_utility_WrtUtilMakeDir_PermissionError) +{ + if (0 == getuid()) { + //Change UID to execute the test correctly + errno = 0; + struct passwd *p = getpwnam("app"); + if (p == NULL) { + int error = errno; + RUNNER_ASSERT_MSG(false, "Getting app user UID failed: " + << (error == 0 ? "No error detected" : strerror(error))); + } + if (setuid(p->pw_uid) != 0) { + int error = errno; + RUNNER_ASSERT_MSG(false, "Changing to app user's UID failed: " + << (error == 0 ? "No error detected" : strerror(error))); + } + } + RUNNER_ASSERT_MSG(WrtUtilMakeDir("/tmp/test2/1", 0055) == false, + "Creating directory '1' in /temp/test2/ should have failed"); + //Going back to root UID + if (setuid(0) != 0) { + int error = errno; + LogWarning("Changing back to root UID failed: " + << (error == 0 ? "No error detected" : strerror(error))); + } + +} + +/** + * Create directory with file inside. + * Check if file was removed with directory. + */ +RUNNER_TEST(wrt_utility_WrtUtilRemoveDir) { + RUNNER_ASSERT_MSG(WrtUtilMakeDir("/tmp/test3/", 0755) == true, + "Could not set up directory for test"); + + std::ofstream file; + file.open("/tmp/test3/example.txt"); + file.close(); + struct stat tmp; + RUNNER_ASSERT_MSG(stat("/tmp/test3/example.txt",&tmp) == 0, + "Couldn't create the test file"); + + WrtUtilRemove("/tmp/test3"); + if (stat("/tmp/test3", &tmp) != 0) { + int error=errno; + RUNNER_ASSERT(error == ENOENT); + return; + } + RUNNER_ASSERT(false); +} + +/** + * Try to remove not existing folder. + */ +RUNNER_TEST(wrt_utility_WrtUtilRemoveDir_NoDirError) +{ + //First making sure the test dir doesn't exist + WrtUtilRemove("/tmp/NOT_EXISTING"); + + RUNNER_ASSERT_MSG(WrtUtilRemove("/tmp/NOT_EXISTING") == false, + "Removing non existing directory returned success"); +} + +RUNNER_TEST(wrt_utility_WrtUtilFileExists) +{ + std::ofstream file; + file.open("/tmp/test_file1"); + file.close(); + RUNNER_ASSERT(WrtUtilFileExists("/tmp/test_file1")); + + WrtUtilRemove("/tmp/test_file1"); + RUNNER_ASSERT(WrtUtilFileExists("/tmp/test_file1") == false); +} + +RUNNER_TEST(wrt_utility_WrtUtilDirExists) +{ + RUNNER_ASSERT(WrtUtilDirExists("/tmp")); + RUNNER_ASSERT(WrtUtilDirExists("/UNAVAILABLE_DIR") == false); +} diff --git a/wrt-commons b/wrt-commons new file mode 100644 index 0000000..12a4281 --- /dev/null +++ b/wrt-commons @@ -0,0 +1,290 @@ +wrt-commons: +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +3rdparty/fastdelegate : +License + +The source code attached to this article is released into the public domain. +You may use it for any purpose. Frankly, writing the article was about ten +times as much work as writing the code. Of course, if you create great software +using the code, I would be interested to hear about it. And submissions are always welcome. + + +3rdparty/minizip : +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/wrt-commons.manifest b/wrt-commons.manifest new file mode 100644 index 0000000..fb4bfc3 --- /dev/null +++ b/wrt-commons.manifest @@ -0,0 +1,13 @@ + + + + + + + + + + -- 2.7.4