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 WifiService.cpp
20 * @brief This is the implementation file for the %WifiService class.
25 #include <vconf-keys.h>
27 #include <unique_ptr.h>
28 #include <FBaseUtilStringUtil.h>
29 #include <FBaseRtMutexGuard.h>
30 #include <FBaseSysLog.h>
31 #include <FNetIp4Address.h>
32 #include <FNetWifiWifiTypes.h>
33 #include <FNetWifiWifiBssInfo.h>
34 #include <FNetNetAccountInfo.h>
35 #include <FSys_SystemInfoImpl.h>
36 #include <FBase_StringConverter.h>
37 #include <FNetWifi_WifiBssInfoImpl.h>
38 #include <FNetWifi_WifiUtility.h>
39 #include <FNetWifi_WifiNetAccountInfoImpl.h>
40 #include "WifiService.h"
41 #include "WifiProximityService.h"
42 #include "WifiConnectivityIpcStub.h"
43 #include "WifiSystemAdapter.h"
45 #ifdef _WifiConvertErrorResult
46 #undef _WifiConvertErrorResult
48 #define _WifiConvertErrorResult(condition, r, value) \
57 using namespace Tizen::Base;
58 using namespace Tizen::Base::Utility;
59 using namespace Tizen::Base::Runtime;
60 using namespace Tizen::Base::Collection;
61 using namespace Tizen::App;
62 using namespace Tizen::System;
63 using namespace Tizen::Net;
64 using namespace Tizen::Net::Wifi;
66 WifiService::WifiService(void)
68 , __managerClientIdList()
69 , __monitorClientIdList()
71 , __pWifiSystemAdapter(null)
75 WifiService::~WifiService(void)
80 WifiService::Construct(WifiConnectivityIpcStub& stub)
83 bool isWifiSupported = false;
84 String key(L"http://tizen.org/feature/network.wifi");
86 r = Tizen::System::_SystemInfoImpl::GetSysInfo(key, isWifiSupported);
87 SysTryReturnResult(NID_NET_WIFI, (r == E_SUCCESS) && (isWifiSupported == true), E_UNSUPPORTED_OPERATION,
88 "Wi-Fi is not supported.");
90 r = __listMutex.Create();
91 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, E_SYSTEM, "Failed to create a mutex.");
93 SysAssertf(__pWifiSystemAdapter == null,
94 "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
96 __pWifiSystemAdapter = WifiSystemAdapter::GetInstance();
97 SysTryReturnResult(NID_NET_WIFI, __pWifiSystemAdapter != null, GetLastResult(), "Failed to get Wi-Fi System adapter instance");
104 WifiService::RegisterManagerClientId(int clientId)
106 result r = E_SUCCESS;
107 bool isContain = true;
109 isContain = __managerClientIdList.Contains(clientId);
110 SysTryReturnResult(NID_NET_WIFI, isContain == false, E_OBJ_ALREADY_EXIST, "The client was already registered.");
112 r = __managerClientIdList.Add(clientId);
113 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
114 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
116 if (__managerClientIdList.GetCount() == 1)
118 __pWifiSystemAdapter->SetWifiService(this);
125 WifiService::UnregisterManagerClientId(int clientId)
127 result r = E_SUCCESS;
129 if (__managerClientIdList.GetCount() == 0)
132 r = __managerClientIdList.Remove(clientId);
133 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
134 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
136 if (__managerClientIdList.GetCount() == 0
137 && __monitorClientIdList.GetCount() == 0)
139 __pWifiSystemAdapter->SetWifiService(null);
147 WifiService::RegisterMonitoringClientId(int clientId)
149 result r = E_SUCCESS;
150 bool isContain = true;
152 isContain = __monitorClientIdList.Contains(clientId);
153 SysTryReturnResult(NID_NET_WIFI, isContain == false, E_OBJ_ALREADY_EXIST, "The client was already registered.");
155 r = __monitorClientIdList.Add(clientId);
156 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
157 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
159 if (__monitorClientIdList.GetCount() == 1)
161 __pWifiSystemAdapter->SetWifiService(this);
169 WifiService::UnregisterMonitoringClientId(int clientId)
171 result r = E_SUCCESS;
172 if (__monitorClientIdList.GetCount() == 0)
175 r = __monitorClientIdList.Remove(clientId);
176 r = TransExceptionsExclusive(r, E_SYSTEM, E_OUT_OF_MEMORY);
177 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Propagating. Internal map error.");
179 if (__managerClientIdList.GetCount() == 0
180 && __monitorClientIdList.GetCount() == 0)
182 __pWifiSystemAdapter->SetWifiService(null);
189 WifiService::SetWifiSystemScanMode(int mode)
191 return __pWifiSystemAdapter->SetWifiSystemScanMode(mode);
195 WifiService::UpdateWifiBssInfo(const WifiBssInfo& bssInfo)
197 return __pWifiSystemAdapter->UpdateWifiBssInfo(bssInfo);
201 WifiService::GetWifiMacAddress(String* pMacAddress)
203 *pMacAddress = __pWifiSystemAdapter->GetMacAddress();
204 return GetLastResult();
207 WifiService::IsWifiActivated(bool& isActivated)
209 isActivated = __pWifiSystemAdapter->IsActivated();
211 return GetLastResult();
215 WifiService::IsWifiConnected(bool& isConnected)
217 isConnected = __pWifiSystemAdapter->IsConnected();
219 return GetLastResult();
223 WifiService::GetWifiConnectionState(int& connectionState)
225 connectionState = __pWifiSystemAdapter->GetConnectionState();
227 return GetLastResult();
231 WifiService::WifiActivate(int clientId)
233 return __pWifiSystemAdapter->Activate(clientId);
237 WifiService::WifiDeactivate(int clientId)
239 return __pWifiSystemAdapter->Deactivate(clientId);
243 WifiService::WifiScan(int clientId)
245 return __pWifiSystemAdapter->Scan(clientId);
249 WifiService::WifiConnect(int clientId, const Tizen::Net::Wifi::WifiBssInfo& bssInfo)
251 return __pWifiSystemAdapter->Connect(clientId, bssInfo);
255 WifiService::GetWifiConnectionTargetInfo(Tizen::Net::Wifi::WifiBssInfo* pBssInfo) const
257 return __pWifiSystemAdapter->GetConnectionTargetInfo(pBssInfo);
261 WifiService::GetWifiNetAccountInfo(NetAccountInfo* pNetAccountInfo, _WifiNetAccountInfoImpl* pWifiNetAccountInfoImpl) const
263 return __pWifiSystemAdapter->GetWifiNetAccountInfo(pNetAccountInfo, pWifiNetAccountInfoImpl);
267 WifiService::GetWifiSystemScanResultN(ArrayListT<Tizen::Net::Wifi::WifiBssInfo*>* pBssInfoList) const
269 IList* pList = __pWifiSystemAdapter->GetSystemScanResult();
270 result r = GetLastResult();
271 SysTryReturnResult(NID_NET_WIFI, pList != null, r, "Failed to get scan results.");
273 for (int i = 0; i < pList->GetCount() ; i++)
275 r = pBssInfoList->Add(static_cast<Tizen::Net::Wifi::WifiBssInfo*>(pList->GetAt(i)));
278 SysTryReturnResult(NID_NET_WIFI, r == E_SUCCESS, r, "Failed to get scan results.");
283 // Wifi callback functions
286 WifiService::OnWifiActivated(int clientId, result r)
291 // broadcast to all clients
292 for (int i = 0 ; i < __managerClientIdList.GetCount() ; i++)
294 __managerClientIdList.GetAt(i, id);
295 __pStub->SendWifiActivated(id, r);
300 __pStub->SendWifiActivated(clientId, r);
305 WifiService::OnWifiDeactivated(int clientId, result r)
310 // broadcast to all clients
311 for (int i = 0 ; i < __managerClientIdList.GetCount() ; i++)
313 __managerClientIdList.GetAt(i, id);
314 __pStub->SendWifiDeactivated(id, r);
320 __pStub->SendWifiDeactivated(clientId, r);
325 WifiService::OnWifiConnected(int clientId, const String ssid, result r)
330 // broadcast to all clients
331 for (int i = 0 ; i < __managerClientIdList.GetCount() ; i++)
333 __managerClientIdList.GetAt(i, id);
334 __pStub->SendWifiConnected(id, ssid, r);
339 __pStub->SendWifiConnected(clientId, ssid, r);
344 WifiService::OnWifiScanCompleted(int clientId, Tizen::Base::Collection::IList* pWifiBssInfoList, result r)
346 if (r == E_SUCCESS && pWifiBssInfoList != null)
348 ArrayListT<Tizen::Net::Wifi::WifiBssInfo*>* pBssInfoList = new ArrayListT<Tizen::Net::Wifi::WifiBssInfo*>();
349 SysTryCatch(NID_NET_WIFI, pBssInfoList != null, r = E_OUT_OF_MEMORY, r, "Memory allocation failed.");
352 for (int i = 0; i < pWifiBssInfoList->GetCount(); i++)
354 result res = pBssInfoList->Add(static_cast<Tizen::Net::Wifi::WifiBssInfo*>(pWifiBssInfoList->GetAt(i)));
355 SysTryCatch(NID_NET_WIFI, res == E_SUCCESS, ,E_SYSTEM, "Failed to get scan results.");
358 __pStub->SendWifiScanCompleted(clientId, pBssInfoList, r);
369 unique_ptr< ArrayListT<Tizen::Net::Wifi::WifiBssInfo*> > pBssInfoList(new ArrayListT<Tizen::Net::Wifi::WifiBssInfo*>());
370 __pStub->SendWifiScanCompleted(clientId, pBssInfoList.get(), r);
375 WifiService::OnWifiDisconnected()
378 // broadcast to all clients
379 for (int i = 0 ; i < __managerClientIdList.GetCount() ; i++)
381 __managerClientIdList.GetAt(i, id);
382 __pStub->SendWifiDisconnected(id);
387 WifiService::OnWifiRssiLevelChanged(long rssi)
389 // broadcast to all clients
391 for (int i = 0 ; i < __managerClientIdList.GetCount() ; i++)
393 __managerClientIdList.GetAt(i, id);
394 __pStub->SendWifiRssiChanged(id, rssi);
398 // __monitorClientIdList
400 WifiService::OnWifiConnectionStateChanged(Tizen::Net::Wifi::WifiConnectionState state)
403 // broadcast to all clients
404 for (int i = 0 ; i < __monitorClientIdList.GetCount() ; i++)
406 __monitorClientIdList.GetAt(i, id);
407 __pStub->SendWifiConnectionStateChanged(id, state);
412 WifiService::OnWifiBackgroundScanResultUpdated()
414 // broadcast to all clients
416 for (int i = 0 ; i < __monitorClientIdList.GetCount() ; i++)
418 __monitorClientIdList.GetAt(i, id);
419 __pStub->SendWifiSystemScanResultUpdated(id);