2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FBaseRt_Event.cpp
20 * @brief This is the implementation file for the _Event class.
26 #include <FBaseColIEnumeratorT.h>
28 #include <FBaseSysLog.h>
29 #include "FBaseRt_Event.h"
30 #include "FBaseRt_EventManager.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 _EventManager* pEventManager = _EventManager::GetCurrentEventManager();
135 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_OPERATION
136 , "The caller thread is not an event driven thread.");
138 eventManager = pEventManager->GetHandle();
141 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
142 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
144 while (pEnum->MoveNext() == E_SUCCESS)
146 pEnum->GetCurrent(listenerInfo);
148 if (&listener == listenerInfo.pListener)
157 SysTryReturnResult(NID_BASE_RT, !exist, E_OBJ_ALREADY_EXIST, "[E_OBJ_ALREADY_EXIST] Listener already exist.");
159 listenerInfo.pListener = &listener;
160 listenerInfo.listener = _EventManager::GetEventListenerObjectManager().Register(listener);
161 listenerInfo.eventManager = eventManager;
163 r = __listeners.Add(listenerInfo);
164 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
170 _Event::RemoveListener(const IEventListener& listener)
172 result r = E_SUCCESS;
174 _ListenerInfo listenerInfo;
176 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
177 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
179 while (pEnum->MoveNext() == E_SUCCESS)
181 pEnum->GetCurrent(listenerInfo);
183 if (listenerInfo.pListener == &listener)
185 r = __listeners.Remove(listenerInfo);
186 SysTryLog(NID_BASE_RT, !IsFailed(r), "[%s] Propagating.", GetErrorMessage(r));
188 _EventManager::GetEventListenerObjectManager().Unregister(listenerInfo.listener);
197 SysTryReturnResult(NID_BASE_RT, exist, E_OBJ_NOT_FOUND, "Listener not found.");
203 _Event::Initialize(void)
205 result r = E_SUCCESS;
207 _EventManager* pEventManager = _EventManager::GetCurrentEventManager();
208 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_OPERATION, "Event manager does not exist.");
210 r = pEventManager->RegisterEvent(this->GetHandle());
211 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Failed to register an event.", GetErrorMessage(r));
213 __eventManager = pEventManager->GetHandle();
219 _Event::FireAsync(IEventArg& arg)
221 SysTryReturnResult(NID_BASE_RT, __eventManager.IsValid(), E_INVALID_STATE, "Event manager is invalid state.");
223 _EventManager* pEventManager = _EventManager::GetEventManagerByHandle(__eventManager);
224 SysTryReturnResult(NID_BASE_RT, pEventManager != null, E_INVALID_STATE, "Event manager is invalid state.");
226 pEventManager->FireEventAsync(__handle, std::tr1::shared_ptr< IEventArg >(&arg));
232 _Event::Fire(IEventArg& arg)
234 std::tr1::shared_ptr< IEventArg > sharedArg(&arg);
236 return Fire(sharedArg);
240 _Event::Fire(std::tr1::shared_ptr< IEventArg > arg)
242 _RefCount* pRefCount = __pRefCount;
246 ProcessListeners(arg);
248 pRefCount->Release();
254 _Event::ProcessListeners(std::tr1::shared_ptr< IEventArg > arg)
256 _RefCount* pRefCount = __pRefCount;
258 _ListenerInfo listenerInfo;
259 _EventManager* pEventManager = null;
260 IEventListener* pEventListener = null;
262 IEnumeratorT< _ListenerInfo >* pEnum = __listeners.GetEnumeratorN();
263 SysTryReturnResult(NID_BASE_RT, pEnum != null, E_OUT_OF_MEMORY, "Not enough memory.");
265 while (pEnum->MoveNext() == E_SUCCESS)
267 pEnum->GetCurrent(listenerInfo);
269 if (listenerInfo.eventManager.IsValid())
271 pEventManager = _EventManager::GetEventManagerByHandle(listenerInfo.eventManager);
272 if (pEventManager == null)
277 _EventManager* pCurrentEventManager = _EventManager::GetCurrentEventManager();
278 if (pCurrentEventManager != null)
280 if (pEventManager->GetHandle() != pCurrentEventManager->GetHandle())
282 pEventManager->CallListenerAsync(this->GetHandle(), arg, listenerInfo.listener);
288 pEventManager->CallListenerAsync(this->GetHandle(), arg, listenerInfo.listener);
294 pEventListener = _EventManager::GetEventListenerObjectManager().GetObject(listenerInfo.listener);
295 if (pEventListener != null)
297 FireImpl(*pEventListener, *arg);
298 if (pRefCount->__destroyed)
310 _Event::GetListenerCount(void)
312 return __listeners.GetCount();
315 const _HandleT< _Event >
316 _Event::GetHandle(void) const
322 _Event::GetHandle(void)
328 _Event::FireImpl(IEventListener& listener, const IEventArg& arg)
332 } } } // Tizen::Base::Runtime