From d9b7907a944d4ca0568b34361f334026999312bc Mon Sep 17 00:00:00 2001 From: Adeel Kazmi Date: Mon, 1 Sep 2014 18:45:53 +0100 Subject: [PATCH] Using SingletonService instead of Adaptor Change-Id: I4bb36595d48bb6441f1896975f73b6ce754231e1 --- .../src/dali-toolkit-internal/CMakeLists.txt | 1 + .../src/dali-toolkit-unmanaged/CMakeLists.txt | 1 + automated-tests/src/dali-toolkit/CMakeLists.txt | 1 + .../dali-toolkit-test-utils/toolkit-adaptor.cpp | 34 ----- .../toolkit-singleton-service.cpp | 161 +++++++++++++++++++++ .../toolkit-singleton-service.h | 55 +++++++ .../internal/controls/relayout-controller.cpp | 35 +++-- .../focus-manager/keyboard-focus-manager-impl.cpp | 17 ++- .../internal/styling/style-manager-impl.cpp | 17 ++- .../factory/localized-control-factory.cpp | 27 ++-- .../public-api/focus-manager/focus-manager.cpp | 27 ++-- .../focus-manager/keyinput-focus-manager.cpp | 27 ++-- 12 files changed, 305 insertions(+), 98 deletions(-) create mode 100644 automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp create mode 100644 automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.h diff --git a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt index da51107..ff683d5 100644 --- a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt @@ -25,6 +25,7 @@ LIST(APPEND TC_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-orientation.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-physical-keyboard.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-style-monitor.cpp + ../dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-timer.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp ../dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp diff --git a/automated-tests/src/dali-toolkit-unmanaged/CMakeLists.txt b/automated-tests/src/dali-toolkit-unmanaged/CMakeLists.txt index a1e6c7f..13c2d32 100644 --- a/automated-tests/src/dali-toolkit-unmanaged/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-unmanaged/CMakeLists.txt @@ -61,6 +61,7 @@ LIST(APPEND TC_SOURCES ../dali-toolkit/dali-toolkit-test-utils/toolkit-imf-manager.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-physical-keyboard.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-style-monitor.cpp + ../dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-timer.cpp ../dali-toolkit/dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp ../dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp diff --git a/automated-tests/src/dali-toolkit/CMakeLists.txt b/automated-tests/src/dali-toolkit/CMakeLists.txt index a476f28..52f8353 100644 --- a/automated-tests/src/dali-toolkit/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit/CMakeLists.txt @@ -43,6 +43,7 @@ LIST(APPEND TC_SOURCES dali-toolkit-test-utils/toolkit-imf-manager.cpp dali-toolkit-test-utils/toolkit-physical-keyboard.cpp dali-toolkit-test-utils/toolkit-style-monitor.cpp + dali-toolkit-test-utils/toolkit-singleton-service.cpp dali-toolkit-test-utils/toolkit-timer.cpp dali-toolkit-test-utils/toolkit-clipboard-event-notifier.cpp dali-toolkit-test-utils/dummy-control.cpp diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp index 186fadd..41acc41 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-adaptor.cpp @@ -55,10 +55,6 @@ public: typedef SignalV2< void ( Adaptor& ) > AdaptorSignalV2; - typedef std::pair SingletonPair; - typedef std::map SingletonContainer; - typedef SingletonContainer::const_iterator SingletonConstIter; - public: Adaptor(ToolkitAdaptor& toolkitAdaptor); @@ -78,9 +74,6 @@ public: void RenderSync(); RenderSurface& GetSurface(); - void RegisterSingleton(const std::type_info& info, Dali::BaseHandle singleton); - Dali::BaseHandle GetSingleton(const std::type_info& info) const; - public: // static methods static Adaptor& Get(); static bool IsAvailable(); @@ -103,8 +96,6 @@ private: AdaptorSignalV2 mResizeSignal; TestRenderSurface mRenderSurface; ToolkitAdaptor& mToolkitAdaptor; - - SingletonContainer mSingletonContainer; }; namespace @@ -206,31 +197,6 @@ bool Adaptor::IsAvailable() return available; } -void Adaptor::RegisterSingleton(const std::type_info& info, Dali::BaseHandle singleton) -{ - mToolkitAdaptor.mFunctionsCalled.RegisterSingleton = true; - - if(singleton) - { - mSingletonContainer.insert(SingletonPair(info.name(), singleton)); - } -} - -Dali::BaseHandle Adaptor::GetSingleton(const std::type_info& info) const -{ - mToolkitAdaptor.mFunctionsCalled.GetSingleton = true; - - Dali::BaseHandle object = Dali::BaseHandle(); - - SingletonConstIter iter = mSingletonContainer.find(info.name()); - if(iter != mSingletonContainer.end()) - { - object = (*iter).second; - } - - return object; -} - Adaptor::AdaptorSignalV2& Adaptor::SignalResize() { mToolkitAdaptor.mFunctionsCalled.SignalResize = true; diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp new file mode 100644 index 0000000..d92eb15 --- /dev/null +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.cpp @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 "toolkit-singleton-service.h" + +#include +#include +#include +#include + +namespace Dali +{ + + +namespace Internal +{ +namespace Adaptor +{ + +/** + * Stub for the SingletonService + */ +class SingletonService : public Dali::BaseObject +{ +public: + static Dali::SingletonService New(); + static Dali::SingletonService Get(); + void Register( const std::type_info& info, BaseHandle singleton ); + BaseHandle GetSingleton( const std::type_info& info ) const; + +private: + SingletonService(); + virtual ~SingletonService(); + + // Undefined + SingletonService( const SingletonService& ); + SingletonService& operator=( SingletonService& ); + +private: + + typedef std::pair SingletonPair; + typedef std::map SingletonContainer; + typedef SingletonContainer::const_iterator SingletonConstIter; + + SingletonContainer mSingletonContainer; ///< The container to look up singleton by its type name + + static Dali::SingletonService mToolkitSingletonService; +}; + +Dali::SingletonService SingletonService::mToolkitSingletonService; + +Dali::SingletonService SingletonService::New() +{ + return Get(); +} + +Dali::SingletonService SingletonService::Get() +{ + if( ! mToolkitSingletonService ) + { + mToolkitSingletonService = Dali::SingletonService( new Dali::Internal::Adaptor::SingletonService ); + } + return mToolkitSingletonService; +} + +void SingletonService::Register( const std::type_info& info, BaseHandle singleton ) +{ + if( singleton ) + { + mSingletonContainer.insert( SingletonPair( info.name(), singleton ) ); + } +} + +BaseHandle SingletonService::GetSingleton( const std::type_info& info ) const +{ + BaseHandle object; + + SingletonConstIter iter = mSingletonContainer.find(info.name()); + if( iter != mSingletonContainer.end() ) + { + object = ( *iter ).second; + } + + return object; +} + +SingletonService::SingletonService() +: mSingletonContainer() +{ +} + +SingletonService::~SingletonService() +{ +} + +} // namespace Adaptor +} // namespace Internal + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Internal::Adaptor::SingletonService& GetImplementation(Dali::SingletonService& player) +{ + DALI_ASSERT_ALWAYS( player && "SingletonService handle is empty" ); + + BaseObject& handle = player.GetBaseObject(); + + return static_cast(handle); +} + +const Internal::Adaptor::SingletonService& GetImplementation(const Dali::SingletonService& player) +{ + DALI_ASSERT_ALWAYS( player && "SingletonService handle is empty" ); + + const BaseObject& handle = player.GetBaseObject(); + + return static_cast(handle); +} + +SingletonService::SingletonService() +{ +} + +SingletonService SingletonService::Get() +{ + return Internal::Adaptor::SingletonService::Get(); +} + +SingletonService::~SingletonService() +{ +} + +void SingletonService::Register( const std::type_info& info, BaseHandle singleton ) +{ + GetImplementation( *this ).Register( info, singleton ); +} + +BaseHandle SingletonService::GetSingleton( const std::type_info& info ) const +{ + return GetImplementation( *this ).GetSingleton( info ); +} + +SingletonService::SingletonService( Internal::Adaptor::SingletonService* singletonService ) +: BaseHandle( singletonService ) +{ +} + +} // namespace Dali diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.h new file mode 100644 index 0000000..956925e --- /dev/null +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-singleton-service.h @@ -0,0 +1,55 @@ +#ifndef __DALI_TOOLKIT_TOOLKIT_SINGLETON_SERVICE_H__ +#define __DALI_TOOLKIT_TOOLKIT_SINGLETON_SERVICE_H__ + +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// EXTERNAL INCLUDES + +#define __DALI_SINGELTON_SERVICE_H__ +#include +#include + +// INTERNAL INCLUDES + +namespace Dali +{ + +namespace Internal DALI_INTERNAL +{ +namespace Adaptor +{ +class SingletonService; +} +} + +class SingletonService : public BaseHandle +{ +public: + SingletonService(); + static SingletonService Get(); + ~SingletonService(); + void Register( const std::type_info& info, BaseHandle singleton ); + BaseHandle GetSingleton( const std::type_info& info ) const; + +public: // Not intended for application developers + SingletonService( Internal::Adaptor::SingletonService* singletonService ); +}; + +} // namespace Dali + +#endif // __DALI_TOOLKIT_TOOLKIT_SINGLETON_SERVICE_H__ diff --git a/base/dali-toolkit/internal/controls/relayout-controller.cpp b/base/dali-toolkit/internal/controls/relayout-controller.cpp index 8dce13a..1a3a4e6 100644 --- a/base/dali-toolkit/internal/controls/relayout-controller.cpp +++ b/base/dali-toolkit/internal/controls/relayout-controller.cpp @@ -67,24 +67,27 @@ void RelayoutController::Request() RelayoutController controller; // Check whether the RelayoutController is already created - Dali::Adaptor& adaptor = Dali::Adaptor::Get(); - Dali::BaseHandle handle = adaptor.GetSingleton(typeid(RelayoutController)); - - if(handle) + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) { - // If so, downcast the handle of singleton to RelayoutController - controller = RelayoutController(dynamic_cast(handle.GetObjectPtr())); + Dali::BaseHandle handle = singletonService.GetSingleton(typeid(RelayoutController)); + + if(handle) + { + // If so, downcast the handle of singleton to RelayoutController + controller = RelayoutController(dynamic_cast(handle.GetObjectPtr())); + } + + if(!controller) + { + // If not, create the RelayoutController and register it as a singleton + controller = RelayoutController( new Internal::RelayoutControllerImpl(gRelayoutRequestPending) ); + singletonService.Register( typeid(controller), controller ); + } + + GetImpl(controller).Request(); + gRelayoutRequestPending = true; } - - if(!controller) - { - // If not, create the RelayoutController and register it as a singleton - controller = RelayoutController( new Internal::RelayoutControllerImpl(gRelayoutRequestPending) ); - adaptor.RegisterSingleton( typeid(controller), controller ); - } - - GetImpl(controller).Request(); - gRelayoutRequestPending = true; } } diff --git a/base/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp b/base/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp index a6ed055..12b6748 100644 --- a/base/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp +++ b/base/dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp @@ -50,11 +50,15 @@ BaseHandle Create() { BaseHandle handle = KeyboardFocusManager::Get(); - if ( !handle && Adaptor::IsAvailable() ) + if ( !handle ) { - Toolkit::KeyboardFocusManager manager = Toolkit::KeyboardFocusManager( new Internal::KeyboardFocusManager() ); - Adaptor::Get().RegisterSingleton( typeid( manager ), manager ); - handle = manager; + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) + { + Toolkit::KeyboardFocusManager manager = Toolkit::KeyboardFocusManager( new Internal::KeyboardFocusManager() ); + singletonService.Register( typeid( manager ), manager ); + handle = manager; + } } return handle; @@ -67,10 +71,11 @@ Toolkit::KeyboardFocusManager KeyboardFocusManager::Get() { Toolkit::KeyboardFocusManager manager; - if ( Adaptor::IsAvailable() ) + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) { // Check whether the keyboard focus manager is already created - Dali::BaseHandle handle = Dali::Adaptor::Get().GetSingleton( typeid( Toolkit::KeyboardFocusManager ) ); + Dali::BaseHandle handle = singletonService.GetSingleton( typeid( Toolkit::KeyboardFocusManager ) ); if(handle) { // If so, downcast the handle of singleton to keyboard focus manager diff --git a/base/dali-toolkit/internal/styling/style-manager-impl.cpp b/base/dali-toolkit/internal/styling/style-manager-impl.cpp index 53c05cd..57be231 100644 --- a/base/dali-toolkit/internal/styling/style-manager-impl.cpp +++ b/base/dali-toolkit/internal/styling/style-manager-impl.cpp @@ -59,11 +59,15 @@ BaseHandle Create() { BaseHandle handle = StyleManager::Get(); - if ( !handle && Adaptor::IsAvailable() ) + if ( !handle ) { - Toolkit::StyleManager manager = Toolkit::StyleManager( new Internal::StyleManager() ); - Adaptor::Get().RegisterSingleton( typeid( manager ), manager ); - handle = manager; + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) + { + Toolkit::StyleManager manager = Toolkit::StyleManager( new Internal::StyleManager() ); + singletonService.Register( typeid( manager ), manager ); + handle = manager; + } } return handle; @@ -88,10 +92,11 @@ Toolkit::StyleManager StyleManager::Get() { Toolkit::StyleManager manager; - if ( Adaptor::IsAvailable() ) + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) { // Check whether the style manager is already created - Dali::BaseHandle handle = Dali::Adaptor::Get().GetSingleton( typeid( Toolkit::StyleManager ) ); + Dali::BaseHandle handle = singletonService.GetSingleton( typeid( Toolkit::StyleManager ) ); if( handle ) { // If so, downcast the handle of singleton diff --git a/base/dali-toolkit/public-api/factory/localized-control-factory.cpp b/base/dali-toolkit/public-api/factory/localized-control-factory.cpp index 724c1f3..d8999c1 100644 --- a/base/dali-toolkit/public-api/factory/localized-control-factory.cpp +++ b/base/dali-toolkit/public-api/factory/localized-control-factory.cpp @@ -50,19 +50,22 @@ LocalizedControlFactory LocalizedControlFactory::Get() LocalizedControlFactory factory; // Check whether the focus factory is already created - Dali::Adaptor& adaptor = Dali::Adaptor::Get(); - Dali::BaseHandle handle = adaptor.GetSingleton(typeid(LocalizedControlFactory)); - if(handle) + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) { - // If so, downcast the handle of singleton to focus factory - factory = LocalizedControlFactory(dynamic_cast(handle.GetObjectPtr())); - } - - if(!factory) - { - // If not, create the focus factory and register it as a singleton - factory = LocalizedControlFactory(new Internal::LocalizedControlFactory()); - adaptor.RegisterSingleton(typeid(factory), factory); + Dali::BaseHandle handle = singletonService.GetSingleton(typeid(LocalizedControlFactory)); + if(handle) + { + // If so, downcast the handle of singleton to focus factory + factory = LocalizedControlFactory(dynamic_cast(handle.GetObjectPtr())); + } + + if(!factory) + { + // If not, create the focus factory and register it as a singleton + factory = LocalizedControlFactory(new Internal::LocalizedControlFactory()); + singletonService.Register(typeid(factory), factory); + } } return factory; diff --git a/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp b/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp index f8e2060..a4cddb1 100644 --- a/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp +++ b/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp @@ -48,19 +48,22 @@ FocusManager FocusManager::Get() FocusManager manager; // Check whether the focus manager is already created - Dali::Adaptor& adaptor = Dali::Adaptor::Get(); - Dali::BaseHandle handle = adaptor.GetSingleton(typeid(FocusManager)); - if(handle) + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) { - // If so, downcast the handle of singleton to focus manager - manager = FocusManager(dynamic_cast(handle.GetObjectPtr())); - } - - if(!manager) - { - // If not, create the focus manager and register it as a singleton - manager = FocusManager(new Internal::FocusManager()); - adaptor.RegisterSingleton(typeid(manager), manager); + Dali::BaseHandle handle = singletonService.GetSingleton(typeid(FocusManager)); + if(handle) + { + // If so, downcast the handle of singleton to focus manager + manager = FocusManager(dynamic_cast(handle.GetObjectPtr())); + } + + if(!manager) + { + // If not, create the focus manager and register it as a singleton + manager = FocusManager(new Internal::FocusManager()); + singletonService.Register(typeid(manager), manager); + } } return manager; diff --git a/base/dali-toolkit/public-api/focus-manager/keyinput-focus-manager.cpp b/base/dali-toolkit/public-api/focus-manager/keyinput-focus-manager.cpp index f427283..b81e807 100644 --- a/base/dali-toolkit/public-api/focus-manager/keyinput-focus-manager.cpp +++ b/base/dali-toolkit/public-api/focus-manager/keyinput-focus-manager.cpp @@ -47,19 +47,22 @@ KeyInputFocusManager KeyInputFocusManager::Get() KeyInputFocusManager manager; // Check whether the focus manager is already created - Dali::Adaptor& adaptor = Dali::Adaptor::Get(); - Dali::BaseHandle handle = adaptor.GetSingleton(typeid(KeyInputFocusManager)); - if(handle) + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) { - // If so, downcast the handle of singleton to focus manager - manager = KeyInputFocusManager(dynamic_cast(handle.GetObjectPtr())); - } - - if(!manager) - { - // If not, create the focus manager and register it as a singleton - manager = KeyInputFocusManager(new Internal::KeyInputFocusManager()); - adaptor.RegisterSingleton(typeid(manager), manager); + Dali::BaseHandle handle = singletonService.GetSingleton(typeid(KeyInputFocusManager)); + if(handle) + { + // If so, downcast the handle of singleton to focus manager + manager = KeyInputFocusManager(dynamic_cast(handle.GetObjectPtr())); + } + + if(!manager) + { + // If not, create the focus manager and register it as a singleton + manager = KeyInputFocusManager(new Internal::KeyInputFocusManager()); + singletonService.Register(typeid(manager), manager); + } } return manager; -- 2.7.4