2 // Open Service Platform
3 // Copyright (c) 2012-2013 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 FNetWifi_WifiProximityManagerImpl.cpp
20 * @brief This is the implementation file for the _WifiProximityManagerImpl Class.
22 * This file contains the implementation of the _WifiProximityManagerImpl Class.
26 #include <unique_ptr.h>
27 #include <FBaseDataType.h>
28 #include <FBaseString.h>
29 #include <FBaseStringComparer.h>
30 #include <FBaseStringHashCodeProvider.h>
31 #include <FBaseSysLog.h>
32 #include <FBaseColIListT.h>
33 #include <FBaseColHashMapT.h>
34 #include <FBaseColMultiHashMapT.h>
35 #include <FBaseColIEnumeratorT.h>
36 #include <FNetWifiWifiBssInfo.h>
37 #include "FNetWifi_IWifiProximityEventListener.h"
38 #include "FNetWifi_WifiProximityManagerImpl.h"
39 #include "FNetWifi_WifiIpcProxy.h"
42 using namespace Tizen::Base;
43 using namespace Tizen::Base::Collection;
45 namespace Tizen { namespace Net { namespace Wifi
49 _WifiProximityManagerImpl* _WifiProximityManagerImpl::__pWifiProximityManagerImpl = null;
51 _WifiProximityManagerImpl*
52 _WifiProximityManagerImpl::GetInstance(void)
54 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
56 if (!__pWifiProximityManagerImpl)
59 pthread_once(&onceBlock, InitSingleton);
61 result r = GetLastResult();
65 onceBlock = PTHREAD_ONCE_INIT;
69 return __pWifiProximityManagerImpl;
73 _WifiProximityManagerImpl::InitSingleton(void)
77 unique_ptr<_WifiProximityManagerImpl> pInst(new (std::nothrow) _WifiProximityManagerImpl());
78 SysTryReturnVoidResult(NID_NET_WIFI, pInst != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
80 r = pInst->Construct();
81 SysTryReturnVoidResult(NID_NET_WIFI, r == E_SUCCESS, r, "[%s] Construct() of the singleton has failed.", GetErrorMessage(r));
83 __pWifiProximityManagerImpl = pInst.release();
86 _WifiProximityManagerImpl::_WifiProximityManagerImpl(void)
87 : __pListenerStateMap(null)
88 , __pWifiServiceProxy(null)
92 _WifiProximityManagerImpl::~_WifiProximityManagerImpl(void)
94 __pWifiServiceProxy->SetWifiProximityManagerImpl(null);
95 delete __pListenerStateMap;
96 delete __pBssListenerMap;
100 _WifiProximityManagerImpl::Construct(void)
102 result r = E_SUCCESS;
103 unique_ptr< HashMapT< _IWifiProximityEventListener*, bool > > pTempMap;
104 unique_ptr< MultiHashMapT< String, _IWifiProximityEventListener* > > pTempMultiMap;
105 static StringHashCodeProvider strHashCodeProvider;
106 static ComparerT<String> strComparer;
108 pTempMap.reset(new (std::nothrow) HashMapT<_IWifiProximityEventListener*, bool>());
109 SysTryReturnResult(NID_NET_WIFI, pTempMap != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
111 r = pTempMap->Construct();
112 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
113 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Construct of the listener hash map has failed.");
115 pTempMultiMap.reset(new (std::nothrow) MultiHashMapT<String, _IWifiProximityEventListener*>());
116 SysTryReturnResult(NID_NET_WIFI, pTempMultiMap != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
118 r = pTempMultiMap->Construct(16, 0.75f, strHashCodeProvider, strComparer);
119 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
120 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Construct of the listener hash map has failed.");
122 __pWifiServiceProxy = _WifiIpcProxy::GetInstance();
123 SysTryReturnResult(NID_NET_WIFI, __pWifiServiceProxy != null, E_SYSTEM, "Getting WifiIpcProxy instance has failed.");
125 __pWifiServiceProxy->SetWifiProximityManagerImpl(this);
127 __pListenerStateMap = pTempMap.release();
128 __pBssListenerMap = pTempMultiMap.release();
134 _WifiProximityManagerImpl::AddProximityEventListener(_IWifiProximityEventListener& listener, const Tizen::Base::String& bssId)
136 result r = E_SUCCESS;
137 bool contains = false;
139 // register the listener with an empty string as the BSS ID
140 if (bssId.GetLength() == 0)
142 contains = __pListenerStateMap->ContainsValue(true);
143 // the specified listener is the first listener in this process when it comes to an empty string.
146 r = __pWifiServiceProxy->RegisterBssId(L"");
147 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
148 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r,
149 "Registering the listener regardless of BSS ID to IPC instance has failed.");
152 __pListenerStateMap->ContainsKey(&listener, contains);
155 bool isDefault = false;
157 __pListenerStateMap->GetValue(&listener, isDefault);
158 SysTryReturnResult(NID_NET_WIFI, isDefault == false, E_OBJ_ALREADY_EXIST, "The listener was already registered.");
160 __pListenerStateMap->SetValue(&listener, true);
164 r = __pListenerStateMap->Add(&listener, true);
165 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
166 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
169 // register the listener with the specified BSS ID (not an empty string)
172 __pBssListenerMap->ContainsKey(bssId, contains);
175 r = __pWifiServiceProxy->RegisterBssId(bssId);
176 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
177 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r,
178 "Registering BSS ID and listener to IPC instance has failed.");
181 r = __pBssListenerMap->Add(bssId, &listener);
182 r = TransExceptionsExclusive(r, E_SYSTEM, E_OBJ_ALREADY_EXIST, E_OUT_OF_MEMORY);
183 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
185 __pListenerStateMap->ContainsKey(&listener, contains);
188 r = __pListenerStateMap->Add(&listener, false);
189 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
190 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
198 _WifiProximityManagerImpl::RemoveProximityEventListener(_IWifiProximityEventListener& listener, const Tizen::Base::String& bssId)
200 result r = E_SUCCESS;
201 bool contains = false;
203 // unregister the listener with an empty string as the BSS ID
204 if (bssId.GetLength() == 0)
206 __pListenerStateMap->ContainsKey(&listener, contains);
207 SysTryReturnResult(NID_NET_WIFI, contains == true, E_OBJ_NOT_FOUND, "The listener was not registered.");
209 __pListenerStateMap->Remove(&listener);
211 unique_ptr< IMapEnumeratorT<String, _IWifiProximityEventListener*> > pMapEnum(__pBssListenerMap->GetMapEnumeratorN());
212 SysTryReturnResult(NID_NET_WIFI, pMapEnum != null, E_OUT_OF_MEMORY, "Propagating. Internal map error.");
214 while(pMapEnum->MoveNext() == E_SUCCESS)
217 _IWifiProximityEventListener* pRegListener = null;
219 r = pMapEnum->GetKey(regBssId);
220 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
221 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Internal map error.");
223 r = pMapEnum->GetValue(pRegListener);
224 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
225 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Internal map error.");
227 if (pRegListener == &listener)
229 __pBssListenerMap->Remove(regBssId, pRegListener);
230 SysLog(NID_NET_WIFI, "BSS(ID:%d) is removed from the internal map.", regBssId.GetPointer());
232 __pBssListenerMap->ContainsKey(regBssId, contains);
235 r = __pWifiServiceProxy->UnRegisterBssId(regBssId);
236 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
237 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r,
238 "Unregistering BSS ID and listener to IPC instance has failed.");
243 contains = __pListenerStateMap->ContainsValue(true);
244 // the specified listener is the last listener in this process when it comes to an empty string.
247 r = __pWifiServiceProxy->UnRegisterBssId(L"");
248 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
249 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r,
250 "Unregistering the listener regardless of BSS ID to IPC instance has failed.");
253 // unregister the listener with the specified BSS ID (not an empty string)
256 r = __pBssListenerMap->Remove(bssId, &listener);
257 r = TransExceptionsExclusive(r, E_SYSTEM, E_OBJ_NOT_FOUND);
258 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating.");
259 SysLog(NID_NET_WIFI, "BSS(ID:%d) is removed from the internal map.", bssId.GetPointer());
261 __pBssListenerMap->ContainsKey(bssId, contains);
264 r = __pWifiServiceProxy->UnRegisterBssId(bssId);
265 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
266 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r,
267 "Unregistering BSS ID and listener to IPC instance has failed.");
270 __pListenerStateMap->ContainsKey(&listener, contains);
273 bool isDefault = false;
275 __pListenerStateMap->GetValue(&listener, isDefault);
278 __pListenerStateMap->Remove(&listener);
287 _WifiProximityManagerImpl::ActivateProximityCheck(void)
289 result r = E_SUCCESS;
291 r = __pWifiServiceProxy->ActivateProximityCheck();
292 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating.");
298 _WifiProximityManagerImpl::DeactivateProximityCheck(void)
300 result r = E_SUCCESS;
302 r = __pWifiServiceProxy->DeactivateProximityCheck();
303 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating.");
309 _WifiProximityManagerImpl::IsProximityCheckActivated(void)
311 bool isActivated = false;
312 result r = E_SUCCESS;
314 r = __pWifiServiceProxy->IsProximityCheckActivated(isActivated);
315 SysTryReturn(NID_NET_WIFI, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
321 _WifiProximityManagerImpl::OnWifiBssDetected(const WifiBssInfo& wifiBssInfo)
323 result r = E_SUCCESS;
324 unique_ptr< IEnumeratorT<_IWifiProximityEventListener*> > pValueEnum(__pBssListenerMap->GetValuesN(wifiBssInfo.GetBssId()));
325 SysTryReturnVoidResult(NID_NET_WIFI, pValueEnum != null, E_OUT_OF_MEMORY,
326 "[E_OUT_OF_MEMORY] Propagating. Internal map error.");
328 while (pValueEnum->MoveNext() == E_SUCCESS)
330 _IWifiProximityEventListener* pListener = null;
332 r = pValueEnum->GetCurrent(pListener);
333 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
334 SysTryReturnVoidResult(NID_NET_WIFI, r == E_SUCCESS, r, "[E_SYSTEM] Internal map error.");
336 pListener->OnWifiBssDetectedN(new WifiBssInfo(wifiBssInfo));
341 _WifiProximityManagerImpl::OnWifiBssLost(const Tizen::Base::String& bssId)
343 result r = E_SUCCESS;
344 unique_ptr< IEnumeratorT<_IWifiProximityEventListener*> > pValueEnum(__pBssListenerMap->GetValuesN(bssId));
345 SysTryReturnVoidResult(NID_NET_WIFI, pValueEnum != null, E_OUT_OF_MEMORY,
346 "[E_OUT_OF_MEMORY] Propagating. Internal map error.");
348 while (pValueEnum->MoveNext() == E_SUCCESS)
350 _IWifiProximityEventListener* pListener = null;
352 r = pValueEnum->GetCurrent(pListener);
353 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
354 SysTryReturnVoidResult(NID_NET_WIFI, r == E_SUCCESS, r, "[E_SYSTEM] Internal map error.");
356 pListener->OnWifiBssLost(bssId);
361 _WifiProximityManagerImpl::OnWifiProximityCheckActivated()
363 unique_ptr< IListT<_IWifiProximityEventListener*> > pListenerList;
366 pListenerList.reset(__pListenerStateMap->GetKeysN());
367 SysTryReturnVoidResult(NID_NET_WIFI, pListenerList != null, E_OUT_OF_MEMORY,
368 "[E_OUT_OF_MEMORY] Propagating. Internal map error.");
369 count = pListenerList->GetCount();
371 for (int i = 0; i < count; i++)
373 result r = E_SUCCESS;
374 _IWifiProximityEventListener* pListener = null;
376 r = pListenerList->GetAt(i, pListener);
377 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
378 SysTryReturnVoidResult(NID_NET_WIFI, r == E_SUCCESS, r, "[E_SYSTEM] Internal map error.");
380 pListener->OnWifiProximityCheckActivated();
385 _WifiProximityManagerImpl::OnWifiProximityCheckDeactivated()
387 unique_ptr< IListT<_IWifiProximityEventListener*> > pListenerList;
390 pListenerList.reset(__pListenerStateMap->GetKeysN());
391 SysTryReturnVoidResult(NID_NET_WIFI, pListenerList != null, E_OUT_OF_MEMORY,
392 "[E_OUT_OF_MEMORY] Propagating. Internal map error.");
393 count = pListenerList->GetCount();
395 for (int i = 0; i < count; i++)
397 result r = E_SUCCESS;
398 _IWifiProximityEventListener* pListener = null;
400 r = pListenerList->GetAt(i, pListener);
401 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
402 SysTryReturnVoidResult(NID_NET_WIFI, r == E_SUCCESS, r, "[E_SYSTEM] Internal map error.");
404 pListener->OnWifiProximityCheckDeactivated();
408 } } } // Tizen::Net::Wifi