2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FBaseRt_Event.cpp
19 * @brief This is the implementation file for the _Event class.
25 #include <FBaseColIEnumeratorT.h>
27 #include <FBaseSysLog.h>
28 #include "FBaseRt_Event.h"
29 #include "FBaseRt_EventManager.h"
31 using namespace Tizen::Base;
32 using namespace Tizen::Base::Collection;
33 using namespace Tizen::Base::Runtime;
35 namespace Tizen { namespace Base { namespace Runtime
38 _Event::_ListenerInfo&
39 _Event::_ListenerInfo::operator =(const _ListenerInfo& rhs)
43 pListener = rhs.pListener;
44 listener = rhs.listener;
45 eventManager = rhs.eventManager;
52 _Event::_ListenerInfo::operator ==(const _ListenerInfo& rhs) const
54 if (listener == rhs.listener && eventManager == rhs.eventManager)
63 _Event::_ListenerInfo::operator !=(const _ListenerInfo& rhs) const
65 if (listener != rhs.listener || eventManager != rhs.eventManager)
73 _Event::_RefCount::_RefCount(void)
80 _Event::_RefCount::~_RefCount(void)
86 _Event::_RefCount::AddRef(void)
93 _Event::_RefCount::Release(void)
107 __pRefCount = new (std::nothrow) _RefCount();
109 __handle = _EventManager::GetEventObjectManager().Register(*this);
112 _Event::~_Event(void)
114 __pRefCount->__destroyed = true;
115 __pRefCount->Release();
117 if (__handle.IsValid())
119 _EventManager::GetEventObjectManager().Unregister(__handle);
124 _Event::AddListener(const IEventListener& listener, bool calledByCallerThread)
126 result r = E_SUCCESS;
128 _ListenerInfo listenerInfo;
129 _HandleT< _EventManager > eventManager;
131 if (calledByCallerThread)
133 _EventManager* pEventManager = _EventManager::GetCurrentEventManager();
134 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_OPERATION
135 , "The caller thread is not an event driven thread.");
137 eventManager = pEventManager->GetHandle();
140 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
141 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
143 while (pEnum->MoveNext() == E_SUCCESS)
145 pEnum->GetCurrent(listenerInfo);
147 if (&listener == listenerInfo.pListener)
156 SysTryReturnResult(NID_BASE_RT, !exist, E_OBJ_ALREADY_EXIST, "[E_OBJ_ALREADY_EXIST] Listener already exist.");
158 listenerInfo.pListener = &listener;
159 listenerInfo.listener = _EventManager::GetEventListenerObjectManager().Register(listener);
160 listenerInfo.eventManager = eventManager;
162 r = __listeners.Add(listenerInfo);
163 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
169 _Event::RemoveListener(const IEventListener& listener)
171 result r = E_SUCCESS;
173 _ListenerInfo listenerInfo;
175 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
176 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
178 while (pEnum->MoveNext() == E_SUCCESS)
180 pEnum->GetCurrent(listenerInfo);
182 if (listenerInfo.pListener == &listener)
184 r = __listeners.Remove(listenerInfo);
185 SysTryLog(NID_BASE_RT, !IsFailed(r), "[%s] Propagating.", GetErrorMessage(r));
187 _EventManager::GetEventListenerObjectManager().Unregister(listenerInfo.listener);
196 SysTryReturnResult(NID_BASE_RT, exist, E_OBJ_NOT_FOUND, "Listener not found.");
202 _Event::Initialize(void)
204 result r = E_SUCCESS;
206 _EventManager* pEventManager = _EventManager::GetCurrentEventManager();
207 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_OPERATION, "Event manager does not exist.");
209 r = pEventManager->RegisterEvent(this->GetHandle());
210 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Failed to register an event.", GetErrorMessage(r));
212 __eventManager = pEventManager->GetHandle();
218 _Event::FireAsync(IEventArg& arg)
220 SysTryReturnResult(NID_BASE_RT, __eventManager.IsValid(), E_INVALID_STATE, "Event manager is invalid state.");
222 _EventManager* pEventManager = _EventManager::GetEventManagerByHandle(__eventManager);
223 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_STATE, "Event manager is invalid state.");
225 pEventManager->FireEventAsync(__handle, std::tr1::shared_ptr< IEventArg >(&arg));
231 _Event::Fire(IEventArg& arg)
233 std::tr1::shared_ptr< IEventArg > sharedArg(&arg);
235 return Fire(sharedArg);
239 _Event::Fire(std::tr1::shared_ptr< IEventArg > arg)
241 _RefCount* pRefCount = __pRefCount;
245 ProcessListeners(arg);
247 pRefCount->Release();
253 _Event::ProcessListeners(std::tr1::shared_ptr< IEventArg > arg)
255 _RefCount* pRefCount = __pRefCount;
257 _ListenerInfo listenerInfo;
258 _EventManager* pEventManager = null;
259 IEventListener* pEventListener = null;
261 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
262 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
264 while (pEnum->MoveNext() == E_SUCCESS)
266 pEnum->GetCurrent(listenerInfo);
268 if (listenerInfo.eventManager.IsValid())
270 pEventManager = _EventManager::GetEventManagerByHandle(listenerInfo.eventManager);
271 if (pEventManager == null)
276 _EventManager* pCurrentEventManager = _EventManager::GetCurrentEventManager();
277 if (pCurrentEventManager != null)
279 if (pEventManager->GetHandle() != pCurrentEventManager->GetHandle())
281 pEventManager->CallListenerAsync(this->GetHandle(), arg, listenerInfo.listener);
287 pEventManager->CallListenerAsync(this->GetHandle(), arg, listenerInfo.listener);
293 pEventListener = _EventManager::GetEventListenerObjectManager().GetObject(listenerInfo.listener);
294 if (pEventListener != null)
296 FireImpl(*pEventListener, *arg);
297 if (pRefCount->__destroyed)
309 _Event::GetListenerCount(void)
311 return __listeners.GetCount();
314 const _HandleT< _Event >
315 _Event::GetHandle(void) const
321 _Event::GetHandle(void)
327 _Event::FireImpl(IEventListener& listener, const IEventArg& arg)
331 } } } // Tizen::Base::Runtime