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"
30 #include "FBaseRt_ThreadImpl.h"
32 using namespace Tizen::Base;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Base::Runtime;
36 namespace Tizen { namespace Base { namespace Runtime
39 _Event::_ListenerInfo&
40 _Event::_ListenerInfo::operator =(const _ListenerInfo& rhs)
44 pListener = rhs.pListener;
45 listener = rhs.listener;
46 eventManager = rhs.eventManager;
53 _Event::_ListenerInfo::operator ==(const _ListenerInfo& rhs) const
55 if (listener == rhs.listener && eventManager == rhs.eventManager)
64 _Event::_ListenerInfo::operator !=(const _ListenerInfo& rhs) const
66 if (listener != rhs.listener || eventManager != rhs.eventManager)
74 _Event::_RefCount::_RefCount(void)
81 _Event::_RefCount::~_RefCount(void)
87 _Event::_RefCount::AddRef(void)
94 _Event::_RefCount::Release(void)
108 __pRefCount = new (std::nothrow) _RefCount();
110 __handle = _EventManager::GetEventObjectManager().Register(*this);
113 _Event::~_Event(void)
115 __pRefCount->__destroyed = true;
116 __pRefCount->Release();
118 if (__handle.IsValid())
120 _EventManager::GetEventObjectManager().Unregister(__handle);
125 _Event::AddListener(const IEventListener& listener, bool calledByCallerThread)
127 result r = E_SUCCESS;
129 _ListenerInfo listenerInfo;
130 _HandleT< _EventManager > eventManager;
132 if (calledByCallerThread)
134 _ThreadImpl* pThreadImpl = _ThreadImpl::GetCurrentThreadImpl();
135 SysTryReturnResult(NID_BASE_RT, pThreadImpl != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] This is not OSP thread.");
137 ThreadType threadType = pThreadImpl->GetThreadType();
138 SysTryReturnResult(NID_BASE_RT, threadType != THREAD_TYPE_WORKER, E_INVALID_OPERATION, "The caller thread is not an event driven thread.");
141 _EventManager* pEventManager = _EventManager::GetCurrentEventManager();
145 SysPropagate(NID_BASE_RT, r);
149 eventManager = pEventManager->GetHandle();
152 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
153 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
155 while (pEnum->MoveNext() == E_SUCCESS)
157 pEnum->GetCurrent(listenerInfo);
159 if (&listener == listenerInfo.pListener)
168 SysTryReturnResult(NID_BASE_RT, !exist, E_OBJ_ALREADY_EXIST, "[E_OBJ_ALREADY_EXIST] Listener already exist.");
170 listenerInfo.pListener = &listener;
171 listenerInfo.listener = _EventManager::GetEventListenerObjectManager().Register(listener);
172 listenerInfo.eventManager = eventManager;
174 r = __listeners.Add(listenerInfo);
175 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
181 _Event::RemoveListener(const IEventListener& listener)
183 result r = E_SUCCESS;
185 _ListenerInfo listenerInfo;
187 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
188 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
190 while (pEnum->MoveNext() == E_SUCCESS)
192 pEnum->GetCurrent(listenerInfo);
194 if (listenerInfo.pListener == &listener)
196 r = __listeners.Remove(listenerInfo);
197 SysTryLog(NID_BASE_RT, !IsFailed(r), "[%s] Propagating.", GetErrorMessage(r));
199 _EventManager::GetEventListenerObjectManager().Unregister(listenerInfo.listener);
208 SysTryReturnResult(NID_BASE_RT, exist, E_OBJ_NOT_FOUND, "Listener not found.");
214 _Event::Initialize(void)
216 result r = E_SUCCESS;
218 _EventManager* pEventManager = _EventManager::GetCurrentEventManager();
219 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_OPERATION, "Event manager does not exist.");
221 r = pEventManager->RegisterEvent(this->GetHandle());
222 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Failed to register an event.", GetErrorMessage(r));
224 __eventManager = pEventManager->GetHandle();
230 _Event::FireAsync(IEventArg& arg)
232 SysTryReturnResult(NID_BASE_RT, __eventManager.IsValid(), E_INVALID_STATE, "Event manager is invalid state.");
234 _EventManager* pEventManager = _EventManager::GetEventManagerByHandle(__eventManager);
235 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_STATE, "Event manager is invalid state.");
237 pEventManager->FireEventAsync(__handle, std::tr1::shared_ptr< IEventArg >(&arg));
243 _Event::Fire(IEventArg& arg)
245 std::tr1::shared_ptr< IEventArg > sharedArg(&arg);
247 return Fire(sharedArg);
251 _Event::Fire(std::tr1::shared_ptr< IEventArg > arg)
253 _RefCount* pRefCount = __pRefCount;
257 ProcessListeners(arg);
259 pRefCount->Release();
265 _Event::ProcessListeners(std::tr1::shared_ptr< IEventArg > arg)
267 _RefCount* pRefCount = __pRefCount;
269 _ListenerInfo listenerInfo;
270 _EventManager* pEventManager = null;
271 IEventListener* pEventListener = null;
273 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
274 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
276 while (pEnum->MoveNext() == E_SUCCESS)
278 pEnum->GetCurrent(listenerInfo);
280 if (listenerInfo.eventManager.IsValid())
282 pEventManager = _EventManager::GetEventManagerByHandle(listenerInfo.eventManager);
283 if (pEventManager == null)
288 _EventManager* pCurrentEventManager = _EventManager::GetCurrentEventManager();
289 if (pCurrentEventManager != null)
291 if (pEventManager->GetHandle() != pCurrentEventManager->GetHandle())
293 pEventManager->CallListenerAsync(this->GetHandle(), arg, listenerInfo.listener);
299 pEventManager->CallListenerAsync(this->GetHandle(), arg, listenerInfo.listener);
305 pEventListener = _EventManager::GetEventListenerObjectManager().GetObject(listenerInfo.listener);
306 if (pEventListener != null)
308 FireImpl(*pEventListener, *arg);
309 if (pRefCount->__destroyed)
321 _Event::GetListenerCount(void)
323 return __listeners.GetCount();
326 const _HandleT< _Event >
327 _Event::GetHandle(void) const
333 _Event::GetHandle(void)
339 _Event::FireImpl(IEventListener& listener, const IEventArg& arg)
343 } } } // Tizen::Base::Runtime