1 /*
2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "wifi_p2p_impl.h"
16 #include "iservice_registry.h"
17 #include "if_config.h"
18 #include "mac_address.h"
19 #include "wifi_logger.h"
20 #include "wifi_sa_manager.h"
21
22 DEFINE_WIFILOG_P2P_LABEL("WifiP2pImpl");
23 namespace OHOS {
24 namespace Wifi {
25
26 #define RETURN_IF_FAIL(cond) \
27 do { \
28 if (!(cond)) { \
29 WIFI_LOGI("'%{public}s' failed.", #cond); \
30 return WIFI_OPT_FAILED; \
31 } \
32 } while (0)
33
WifiP2pImpl()34 WifiP2pImpl::WifiP2pImpl() : systemAbilityId_(0), client_(nullptr)
35 {}
36
~WifiP2pImpl()37 WifiP2pImpl::~WifiP2pImpl()
38 {}
39
Init(int systemAbilityId)40 bool WifiP2pImpl::Init(int systemAbilityId)
41 {
42 systemAbilityId_ = systemAbilityId;
43 return true;
44 }
45
46
GetWifiP2pProxy()47 bool WifiP2pImpl::GetWifiP2pProxy()
48 {
49 WifiSaLoadManager::GetInstance().LoadWifiSa(systemAbilityId_);
50 if (IsRemoteDied() == false) {
51 return true;
52 }
53 sptr<ISystemAbilityManager> sa_mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
54 if (sa_mgr == nullptr) {
55 WIFI_LOGE("failed to get SystemAbilityManager");
56 return false;
57 }
58 sptr<IRemoteObject> object = sa_mgr->GetSystemAbility(systemAbilityId_);
59 if (object == nullptr) {
60 WIFI_LOGE("failed to get P2P_SERVICE");
61 return false;
62 }
63
64 client_ = iface_cast<IWifiP2p>(object);
65 if (client_ == nullptr) {
66 client_ = new (std::nothrow) WifiP2pProxy(object);
67 }
68
69 if (client_ == nullptr) {
70 WIFI_LOGE("wifi p2p init failed. %{public}d", systemAbilityId_.load());
71 return false;
72 }
73 return true;
74 }
75
EnableP2p(void)76 ErrCode WifiP2pImpl::EnableP2p(void)
77 {
78 std::lock_guard<std::mutex> lock(mutex_);
79 RETURN_IF_FAIL(GetWifiP2pProxy());
80 return client_->EnableP2p();
81 }
82
DisableP2p(void)83 ErrCode WifiP2pImpl::DisableP2p(void)
84 {
85 std::lock_guard<std::mutex> lock(mutex_);
86 RETURN_IF_FAIL(GetWifiP2pProxy());
87 return client_->DisableP2p();
88 }
89
DiscoverDevices(void)90 ErrCode WifiP2pImpl::DiscoverDevices(void)
91 {
92 std::lock_guard<std::mutex> lock(mutex_);
93 RETURN_IF_FAIL(GetWifiP2pProxy());
94 return client_->DiscoverDevices();
95 }
96
StopDiscoverDevices(void)97 ErrCode WifiP2pImpl::StopDiscoverDevices(void)
98 {
99 std::lock_guard<std::mutex> lock(mutex_);
100 RETURN_IF_FAIL(GetWifiP2pProxy());
101 return client_->StopDiscoverDevices();
102 }
103
DiscoverServices(void)104 ErrCode WifiP2pImpl::DiscoverServices(void)
105 {
106 std::lock_guard<std::mutex> lock(mutex_);
107 RETURN_IF_FAIL(GetWifiP2pProxy());
108 return client_->DiscoverServices();
109 }
110
StopDiscoverServices(void)111 ErrCode WifiP2pImpl::StopDiscoverServices(void)
112 {
113 std::lock_guard<std::mutex> lock(mutex_);
114 RETURN_IF_FAIL(GetWifiP2pProxy());
115 return client_->StopDiscoverServices();
116 }
117
RequestService(const WifiP2pDevice & device,const WifiP2pServiceRequest & request)118 ErrCode WifiP2pImpl::RequestService(const WifiP2pDevice &device, const WifiP2pServiceRequest &request)
119 {
120 std::lock_guard<std::mutex> lock(mutex_);
121 RETURN_IF_FAIL(GetWifiP2pProxy());
122 return client_->RequestService(device, request);
123 }
124
PutLocalP2pService(const WifiP2pServiceInfo & srvInfo)125 ErrCode WifiP2pImpl::PutLocalP2pService(const WifiP2pServiceInfo &srvInfo)
126 {
127 std::lock_guard<std::mutex> lock(mutex_);
128 RETURN_IF_FAIL(GetWifiP2pProxy());
129 return client_->PutLocalP2pService(srvInfo);
130 }
131
DeleteLocalP2pService(const WifiP2pServiceInfo & srvInfo)132 ErrCode WifiP2pImpl::DeleteLocalP2pService(const WifiP2pServiceInfo &srvInfo)
133 {
134 std::lock_guard<std::mutex> lock(mutex_);
135 RETURN_IF_FAIL(GetWifiP2pProxy());
136 return client_->DeleteLocalP2pService(srvInfo);
137 }
138
StartP2pListen(int period,int interval)139 ErrCode WifiP2pImpl::StartP2pListen(int period, int interval)
140 {
141 std::lock_guard<std::mutex> lock(mutex_);
142 RETURN_IF_FAIL(GetWifiP2pProxy());
143 return client_->StartP2pListen(period, interval);
144 }
145
StopP2pListen(void)146 ErrCode WifiP2pImpl::StopP2pListen(void)
147 {
148 std::lock_guard<std::mutex> lock(mutex_);
149 RETURN_IF_FAIL(GetWifiP2pProxy());
150 return client_->StopP2pListen();
151 }
152
CreateGroup(const WifiP2pConfig & config)153 ErrCode WifiP2pImpl::CreateGroup(const WifiP2pConfig &config)
154 {
155 std::lock_guard<std::mutex> lock(mutex_);
156 RETURN_IF_FAIL(GetWifiP2pProxy());
157 return client_->CreateGroup(config);
158 }
159
RemoveGroup(void)160 ErrCode WifiP2pImpl::RemoveGroup(void)
161 {
162 std::lock_guard<std::mutex> lock(mutex_);
163 RETURN_IF_FAIL(GetWifiP2pProxy());
164 return client_->RemoveGroup();
165 }
166
RemoveGroupClient(const GcInfo & info)167 ErrCode WifiP2pImpl::RemoveGroupClient(const GcInfo &info)
168 {
169 std::lock_guard<std::mutex> lock(mutex_);
170 RETURN_IF_FAIL(GetWifiP2pProxy());
171 return client_->RemoveGroupClient(info);
172 }
173
DeleteGroup(const WifiP2pGroupInfo & group)174 ErrCode WifiP2pImpl::DeleteGroup(const WifiP2pGroupInfo &group)
175 {
176 std::lock_guard<std::mutex> lock(mutex_);
177 RETURN_IF_FAIL(GetWifiP2pProxy());
178 return client_->DeleteGroup(group);
179 }
180
P2pConnect(const WifiP2pConfig & config)181 ErrCode WifiP2pImpl::P2pConnect(const WifiP2pConfig &config)
182 {
183 std::lock_guard<std::mutex> lock(mutex_);
184 RETURN_IF_FAIL(GetWifiP2pProxy());
185 return client_->P2pConnect(config);
186 }
187
P2pCancelConnect(void)188 ErrCode WifiP2pImpl::P2pCancelConnect(void)
189 {
190 std::lock_guard<std::mutex> lock(mutex_);
191 RETURN_IF_FAIL(GetWifiP2pProxy());
192 return client_->P2pCancelConnect();
193 }
194
QueryP2pLinkedInfo(WifiP2pLinkedInfo & linkedInfo)195 ErrCode WifiP2pImpl::QueryP2pLinkedInfo(WifiP2pLinkedInfo &linkedInfo)
196 {
197 std::lock_guard<std::mutex> lock(mutex_);
198 RETURN_IF_FAIL(GetWifiP2pProxy());
199 return client_->QueryP2pLinkedInfo(linkedInfo);
200 }
201
GetCurrentGroup(WifiP2pGroupInfo & group)202 ErrCode WifiP2pImpl::GetCurrentGroup(WifiP2pGroupInfo &group)
203 {
204 std::lock_guard<std::mutex> lock(mutex_);
205 RETURN_IF_FAIL(GetWifiP2pProxy());
206 return client_->GetCurrentGroup(group);
207 }
208
GetP2pEnableStatus(int & status)209 ErrCode WifiP2pImpl::GetP2pEnableStatus(int &status)
210 {
211 std::lock_guard<std::mutex> lock(mutex_);
212 RETURN_IF_FAIL(GetWifiP2pProxy());
213 return client_->GetP2pEnableStatus(status);
214 }
215
GetP2pDiscoverStatus(int & status)216 ErrCode WifiP2pImpl::GetP2pDiscoverStatus(int &status)
217 {
218 std::lock_guard<std::mutex> lock(mutex_);
219 RETURN_IF_FAIL(GetWifiP2pProxy());
220 return client_->GetP2pDiscoverStatus(status);
221 }
222
GetP2pConnectedStatus(int & status)223 ErrCode WifiP2pImpl::GetP2pConnectedStatus(int &status)
224 {
225 std::lock_guard<std::mutex> lock(mutex_);
226 RETURN_IF_FAIL(GetWifiP2pProxy());
227 return client_->GetP2pConnectedStatus(status);
228 }
229
QueryP2pDevices(std::vector<WifiP2pDevice> & devices)230 ErrCode WifiP2pImpl::QueryP2pDevices(std::vector<WifiP2pDevice> &devices)
231 {
232 std::lock_guard<std::mutex> lock(mutex_);
233 RETURN_IF_FAIL(GetWifiP2pProxy());
234 return client_->QueryP2pDevices(devices);
235 }
236
QueryP2pLocalDevice(WifiP2pDevice & devices)237 ErrCode WifiP2pImpl::QueryP2pLocalDevice(WifiP2pDevice &devices)
238 {
239 std::lock_guard<std::mutex> lock(mutex_);
240 RETURN_IF_FAIL(GetWifiP2pProxy());
241 return client_->QueryP2pLocalDevice(devices);
242 }
243
QueryP2pGroups(std::vector<WifiP2pGroupInfo> & groups)244 ErrCode WifiP2pImpl::QueryP2pGroups(std::vector<WifiP2pGroupInfo> &groups)
245 {
246 std::lock_guard<std::mutex> lock(mutex_);
247 RETURN_IF_FAIL(GetWifiP2pProxy());
248 return client_->QueryP2pGroups(groups);
249 }
250
QueryP2pServices(std::vector<WifiP2pServiceInfo> & services)251 ErrCode WifiP2pImpl::QueryP2pServices(std::vector<WifiP2pServiceInfo> &services)
252 {
253 std::lock_guard<std::mutex> lock(mutex_);
254 RETURN_IF_FAIL(GetWifiP2pProxy());
255 return client_->QueryP2pServices(services);
256 }
257
RegisterCallBack(const sptr<IWifiP2pCallback> & callback,const std::vector<std::string> & event)258 ErrCode WifiP2pImpl::RegisterCallBack(const sptr<IWifiP2pCallback> &callback, const std::vector<std::string> &event)
259 {
260 std::lock_guard<std::mutex> lock(mutex_);
261 RETURN_IF_FAIL(GetWifiP2pProxy());
262 return client_->RegisterCallBack(callback, event);
263 }
264
GetSupportedFeatures(long & features)265 ErrCode WifiP2pImpl::GetSupportedFeatures(long &features)
266 {
267 std::lock_guard<std::mutex> lock(mutex_);
268 RETURN_IF_FAIL(GetWifiP2pProxy());
269 return client_->GetSupportedFeatures(features);
270 }
271
IsFeatureSupported(long feature)272 bool WifiP2pImpl::IsFeatureSupported(long feature)
273 {
274 std::lock_guard<std::mutex> lock(mutex_);
275 RETURN_IF_FAIL(GetWifiP2pProxy());
276 long tmpFeatures = 0;
277 if (client_->GetSupportedFeatures(tmpFeatures) != WIFI_OPT_SUCCESS) {
278 return false;
279 }
280 return ((static_cast<unsigned long>(tmpFeatures) & static_cast<unsigned long>(feature)) ==
281 static_cast<unsigned long>(feature));
282 }
283
SetP2pDeviceName(const std::string & deviceName)284 ErrCode WifiP2pImpl::SetP2pDeviceName(const std::string &deviceName)
285 {
286 std::lock_guard<std::mutex> lock(mutex_);
287 RETURN_IF_FAIL(GetWifiP2pProxy());
288 return client_->SetP2pDeviceName(deviceName);
289 }
290
SetP2pWfdInfo(const WifiP2pWfdInfo & wfdInfo)291 ErrCode WifiP2pImpl::SetP2pWfdInfo(const WifiP2pWfdInfo &wfdInfo)
292 {
293 std::lock_guard<std::mutex> lock(mutex_);
294 RETURN_IF_FAIL(GetWifiP2pProxy());
295 return client_->SetP2pWfdInfo(wfdInfo);
296 }
297
Hid2dRequestGcIp(const std::string & gcMac,std::string & ipAddr)298 ErrCode WifiP2pImpl::Hid2dRequestGcIp(const std::string& gcMac, std::string& ipAddr)
299 {
300 std::lock_guard<std::mutex> lock(mutex_);
301 RETURN_IF_FAIL(GetWifiP2pProxy());
302 return client_->Hid2dRequestGcIp(gcMac, ipAddr);
303 }
304
Hid2dSharedlinkIncrease()305 ErrCode WifiP2pImpl::Hid2dSharedlinkIncrease()
306 {
307 std::lock_guard<std::mutex> lock(mutex_);
308 RETURN_IF_FAIL(GetWifiP2pProxy());
309 return client_->Hid2dSharedlinkIncrease();
310 }
311
Hid2dSharedlinkDecrease()312 ErrCode WifiP2pImpl::Hid2dSharedlinkDecrease()
313 {
314 std::lock_guard<std::mutex> lock(mutex_);
315 RETURN_IF_FAIL(GetWifiP2pProxy());
316 return client_->Hid2dSharedlinkDecrease();
317 }
318
Hid2dCreateGroup(const int frequency,FreqType type)319 ErrCode WifiP2pImpl::Hid2dCreateGroup(const int frequency, FreqType type)
320 {
321 std::lock_guard<std::mutex> lock(mutex_);
322 RETURN_IF_FAIL(GetWifiP2pProxy());
323 return client_->Hid2dCreateGroup(frequency, type);
324 }
325
Hid2dRemoveGcGroup(const std::string & gcIfName)326 ErrCode WifiP2pImpl::Hid2dRemoveGcGroup(const std::string& gcIfName)
327 {
328 std::lock_guard<std::mutex> lock(mutex_);
329 RETURN_IF_FAIL(GetWifiP2pProxy());
330 return client_->Hid2dRemoveGcGroup(gcIfName);
331 }
332
Hid2dConnect(const Hid2dConnectConfig & config)333 ErrCode WifiP2pImpl::Hid2dConnect(const Hid2dConnectConfig& config)
334 {
335 std::lock_guard<std::mutex> lock(mutex_);
336 RETURN_IF_FAIL(GetWifiP2pProxy());
337 return client_->Hid2dConnect(config);
338 }
339
Hid2dConfigIPAddr(const std::string & ifName,const IpAddrInfo & ipInfo)340 ErrCode WifiP2pImpl::Hid2dConfigIPAddr(const std::string& ifName, const IpAddrInfo& ipInfo)
341 {
342 std::lock_guard<std::mutex> lock(mutex_);
343 RETURN_IF_FAIL(GetWifiP2pProxy());
344 return client_->Hid2dConfigIPAddr(ifName, ipInfo);
345 }
346
Hid2dReleaseIPAddr(const std::string & ifName)347 ErrCode WifiP2pImpl::Hid2dReleaseIPAddr(const std::string& ifName)
348 {
349 std::lock_guard<std::mutex> lock(mutex_);
350 RETURN_IF_FAIL(GetWifiP2pProxy());
351 return client_->Hid2dReleaseIPAddr(ifName);
352 }
353
Hid2dGetRecommendChannel(const RecommendChannelRequest & request,RecommendChannelResponse & response)354 ErrCode WifiP2pImpl::Hid2dGetRecommendChannel(const RecommendChannelRequest& request,
355 RecommendChannelResponse& response)
356 {
357 std::lock_guard<std::mutex> lock(mutex_);
358 RETURN_IF_FAIL(GetWifiP2pProxy());
359 return client_->Hid2dGetRecommendChannel(request, response);
360 }
361
Hid2dGetChannelListFor5G(std::vector<int> & vecChannelList)362 ErrCode WifiP2pImpl::Hid2dGetChannelListFor5G(std::vector<int>& vecChannelList)
363 {
364 std::lock_guard<std::mutex> lock(mutex_);
365 RETURN_IF_FAIL(GetWifiP2pProxy());
366 return client_->Hid2dGetChannelListFor5G(vecChannelList);
367 }
368
Hid2dGetSelfWifiCfgInfo(SelfCfgType cfgType,char cfgData[CFG_DATA_MAX_BYTES],int * getDatValidLen)369 ErrCode WifiP2pImpl::Hid2dGetSelfWifiCfgInfo(SelfCfgType cfgType, char cfgData[CFG_DATA_MAX_BYTES], int* getDatValidLen)
370 {
371 std::lock_guard<std::mutex> lock(mutex_);
372 RETURN_IF_FAIL(GetWifiP2pProxy());
373 return client_->Hid2dGetSelfWifiCfgInfo(cfgType, cfgData, getDatValidLen);
374 }
375
Hid2dSetPeerWifiCfgInfo(PeerCfgType cfgType,char cfgData[CFG_DATA_MAX_BYTES],int setDataValidLen)376 ErrCode WifiP2pImpl::Hid2dSetPeerWifiCfgInfo(PeerCfgType cfgType, char cfgData[CFG_DATA_MAX_BYTES], int setDataValidLen)
377 {
378 std::lock_guard<std::mutex> lock(mutex_);
379 RETURN_IF_FAIL(GetWifiP2pProxy());
380 return client_->Hid2dSetPeerWifiCfgInfo(cfgType, cfgData, setDataValidLen);
381 }
382
Hid2dSetUpperScene(const std::string & ifName,const Hid2dUpperScene & scene)383 ErrCode WifiP2pImpl::Hid2dSetUpperScene(const std::string& ifName, const Hid2dUpperScene& scene)
384 {
385 std::lock_guard<std::mutex> lock(mutex_);
386 RETURN_IF_FAIL(GetWifiP2pProxy());
387 return client_->Hid2dSetUpperScene(ifName, scene);
388 }
389
IsRemoteDied(void)390 bool WifiP2pImpl::IsRemoteDied(void)
391 {
392 return (client_ == nullptr) ? true : client_->IsRemoteDied();
393 }
394
DiscoverPeers(int32_t channelid)395 ErrCode WifiP2pImpl::DiscoverPeers(int32_t channelid)
396 {
397 std::lock_guard<std::mutex> lock(mutex_);
398 RETURN_IF_FAIL(GetWifiP2pProxy());
399 return client_->DiscoverPeers(channelid);
400 }
401
DisableRandomMac(int setmode)402 ErrCode WifiP2pImpl::DisableRandomMac(int setmode)
403 {
404 std::lock_guard<std::mutex> lock(mutex_);
405 RETURN_IF_FAIL(GetWifiP2pProxy());
406 return client_->DisableRandomMac(setmode);
407 }
408
CheckCanUseP2p()409 ErrCode WifiP2pImpl::CheckCanUseP2p()
410 {
411 std::lock_guard<std::mutex> lock(mutex_);
412 RETURN_IF_FAIL(GetWifiP2pProxy());
413 return client_->CheckCanUseP2p();
414 }
415
Hid2dIsWideBandwidthSupported(bool & isSupport)416 ErrCode WifiP2pImpl::Hid2dIsWideBandwidthSupported(bool &isSupport)
417 {
418 std::lock_guard<std::mutex> lock(mutex_);
419 RETURN_IF_FAIL(GetWifiP2pProxy());
420 return client_->Hid2dIsWideBandwidthSupported(isSupport);
421 }
422 } // namespace Wifi
423 } // namespace OHOS