• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include "wifi_idl_client.h"
17 #include <cstdio>
18 #include "wifi_global_func.h"
19 #include "wifi_log.h"
20 #include "wifi_idl_define.h"
21 #include "wifi_idl_inner_interface.h"
22 #include "i_wifi.h"
23 #include "i_wifi_chip.h"
24 #include "i_wifi_chip_event_callback.h"
25 #include "i_wifi_hotspot_iface.h"
26 #include "i_wifi_sta_iface.h"
27 #include "i_wifi_supplicant_iface.h"
28 #include "i_wifi_p2p_iface.h"
29 
30 #undef LOG_TAG
31 #define LOG_TAG "WifiIdlClient"
32 
33 namespace OHOS {
34 namespace Wifi {
35 const int BUFFER_SIZE = 4096;
36 
37 #define CHECK_CLIENT_NOT_NULL           \
38     do {                                \
39         if (pRpcClient == nullptr) {    \
40             return WIFI_IDL_OPT_FAILED; \
41         }                               \
42     } while (0)
43 
WifiIdlClient()44 WifiIdlClient::WifiIdlClient()
45 {
46     pRpcClient = nullptr;
47 }
48 
~WifiIdlClient()49 WifiIdlClient::~WifiIdlClient()
50 {
51     if (pRpcClient != nullptr) {
52         ReleaseRpcClient(pRpcClient);
53         pRpcClient = nullptr;
54     }
55 }
56 
InitClient(void)57 int WifiIdlClient::InitClient(void)
58 {
59     const std::string idlSockPath = "/data/misc/wifi/unix_sock.sock";
60     pRpcClient = CreateRpcClient(idlSockPath.c_str());
61     if (pRpcClient == nullptr) {
62         LOGE("init rpc client failed!");
63         return -1;
64     }
65     return 0;
66 }
67 
ExitAllClient(void)68 void WifiIdlClient::ExitAllClient(void)
69 {
70     if (pRpcClient == nullptr) {
71         return;
72     }
73     NotifyClear();
74     return;
75 }
76 
StartWifi(void)77 WifiErrorNo WifiIdlClient::StartWifi(void)
78 {
79     CHECK_CLIENT_NOT_NULL;
80     return Start();
81 }
82 
StopWifi(void)83 WifiErrorNo WifiIdlClient::StopWifi(void)
84 {
85     CHECK_CLIENT_NOT_NULL;
86     return Stop();
87 }
88 
ReqConnect(int networkId)89 WifiErrorNo WifiIdlClient::ReqConnect(int networkId)
90 {
91     CHECK_CLIENT_NOT_NULL;
92     return Connect(networkId);
93 }
94 
ReqReconnect(void)95 WifiErrorNo WifiIdlClient::ReqReconnect(void)
96 {
97     CHECK_CLIENT_NOT_NULL;
98     return Reconnect();
99 }
100 
ReqReassociate(void)101 WifiErrorNo WifiIdlClient::ReqReassociate(void)
102 {
103     CHECK_CLIENT_NOT_NULL;
104     return Reassociate();
105 }
106 
ReqDisconnect(void)107 WifiErrorNo WifiIdlClient::ReqDisconnect(void)
108 {
109     CHECK_CLIENT_NOT_NULL;
110     return Disconnect();
111 }
112 
GetStaCapabilities(unsigned int & capabilities)113 WifiErrorNo WifiIdlClient::GetStaCapabilities(unsigned int &capabilities)
114 {
115     CHECK_CLIENT_NOT_NULL;
116     return GetCapabilities((uint32_t *)&capabilities);
117 }
118 
GetStaDeviceMacAddress(std::string & mac)119 WifiErrorNo WifiIdlClient::GetStaDeviceMacAddress(std::string &mac)
120 {
121     CHECK_CLIENT_NOT_NULL;
122     char szMac[WIFI_IDL_BSSID_LENGTH + 1] = {0};
123     int len = WIFI_IDL_BSSID_LENGTH + 1;
124     WifiErrorNo err = GetDeviceMacAddress((unsigned char *)szMac, &len);
125     if (err == WIFI_IDL_OPT_OK) {
126         mac = std::string(szMac);
127     }
128     return err;
129 }
130 
GetSupportFrequencies(int band,std::vector<int> & frequencies)131 WifiErrorNo WifiIdlClient::GetSupportFrequencies(int band, std::vector<int> &frequencies)
132 {
133     CHECK_CLIENT_NOT_NULL;
134 
135     int values[WIFI_IDL_GET_MAX_BANDS] = {0};
136     int size = WIFI_IDL_GET_MAX_BANDS;
137 
138     if (GetFrequencies(band, values, &size) != 0) {
139         return WIFI_IDL_OPT_FAILED;
140     }
141 
142     for (int i = 0; i < size; i++) {
143         frequencies.push_back(values[i]);
144     }
145 
146     return WIFI_IDL_OPT_OK;
147 }
148 
SetConnectMacAddr(const std::string & mac)149 WifiErrorNo WifiIdlClient::SetConnectMacAddr(const std::string &mac)
150 {
151     CHECK_CLIENT_NOT_NULL;
152     if (CheckMacIsValid(mac) != 0) {
153         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
154     }
155     int len = mac.length();
156     return SetAssocMacAddr((unsigned char *)mac.c_str(), len);
157 }
158 
SetScanMacAddress(const std::string & mac)159 WifiErrorNo WifiIdlClient::SetScanMacAddress(const std::string &mac)
160 {
161     CHECK_CLIENT_NOT_NULL;
162     if (CheckMacIsValid(mac) != 0) {
163         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
164     }
165     int len = mac.length();
166     return SetScanningMacAddress((unsigned char *)mac.c_str(), len);
167 }
168 
DisconnectLastRoamingBssid(const std::string & mac)169 WifiErrorNo WifiIdlClient::DisconnectLastRoamingBssid(const std::string &mac)
170 {
171     CHECK_CLIENT_NOT_NULL;
172     if (CheckMacIsValid(mac) != 0) {
173         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
174     }
175     int len = mac.length();
176     return DeauthLastRoamingBssid((unsigned char *)mac.c_str(), len);
177 }
178 
ReqGetSupportFeature(long & feature)179 WifiErrorNo WifiIdlClient::ReqGetSupportFeature(long &feature)
180 {
181     CHECK_CLIENT_NOT_NULL;
182     return GetSupportFeature(&feature);
183 }
184 
SendRequest(const WifiStaRequest & request)185 WifiErrorNo WifiIdlClient::SendRequest(const WifiStaRequest &request)
186 {
187     CHECK_CLIENT_NOT_NULL;
188     /* RunCmd */
189     LOGD("Start run cmd %{public}d about iface %s", request.cmdId, request.ifName.c_str());
190     return WIFI_IDL_OPT_OK;
191 }
192 
SetTxPower(int power)193 WifiErrorNo WifiIdlClient::SetTxPower(int power)
194 {
195     CHECK_CLIENT_NOT_NULL;
196     return SetWifiTxPower((int32_t)power);
197 }
198 
Scan(const WifiScanParam & scanParam)199 WifiErrorNo WifiIdlClient::Scan(const WifiScanParam &scanParam)
200 {
201     CHECK_CLIENT_NOT_NULL;
202     ScanSettings settings;
203     if (memset_s(&settings, sizeof(settings), 0, sizeof(settings)) != EOK) {
204         return WIFI_IDL_OPT_FAILED;
205     }
206     bool bfail = false;
207     do {
208         if (scanParam.hiddenNetworkSsid.size() > 0) {
209             settings.hiddenSsidSize = scanParam.hiddenNetworkSsid.size();
210             settings.hiddenSsid = ConVectorToCArrayString(scanParam.hiddenNetworkSsid);
211             if (settings.hiddenSsid == nullptr) {
212                 bfail = true;
213                 break;
214             }
215         }
216         if (scanParam.scanFreqs.size() > 0) {
217             settings.freqSize = scanParam.scanFreqs.size();
218             settings.freqs = (int *)calloc(settings.freqSize, sizeof(int));
219             if (settings.freqs == nullptr) {
220                 bfail = true;
221                 break;
222             }
223             for (int i = 0; i < settings.freqSize; ++i) {
224                 settings.freqs[i] = scanParam.scanFreqs[i];
225             }
226         }
227         if (scanParam.scanStyle > 0) {
228             settings.scanStyle = scanParam.scanStyle;
229         }
230     } while (0);
231     WifiErrorNo err = WIFI_IDL_OPT_FAILED;
232     if (!bfail) {
233         err = StartScan(&settings);
234     }
235     if (settings.freqs != nullptr) {
236         free(settings.freqs);
237     }
238     if (settings.hiddenSsid != nullptr) {
239         for (int i = 0; i < settings.hiddenSsidSize; ++i) {
240             free(settings.hiddenSsid[i]);
241         }
242         free(settings.hiddenSsid);
243     }
244     return err;
245 }
246 
ReqGetNetworkList(std::vector<WifiWpaNetworkInfo> & networkList)247 WifiErrorNo WifiIdlClient::ReqGetNetworkList(std::vector<WifiWpaNetworkInfo> &networkList)
248 {
249     CHECK_CLIENT_NOT_NULL;
250     HidlNetworkInfo infos[WIFI_IDL_GET_MAX_NETWORK_LIST];
251     if (memset_s(infos, sizeof(infos), 0, sizeof(infos)) != EOK) {
252         return WIFI_IDL_OPT_FAILED;
253     }
254     int size = WIFI_IDL_GET_MAX_NETWORK_LIST;
255     WifiErrorNo err = GetNetworkList(infos, &size);
256     if (err != WIFI_IDL_OPT_OK) {
257         return err;
258     }
259     for (int i = 0; i < size; ++i) {
260         WifiWpaNetworkInfo tmp;
261         tmp.id = infos[i].id;
262         tmp.ssid = infos[i].ssid;
263         tmp.bssid = infos[i].bssid;
264         tmp.flag = infos[i].flags;
265         networkList.emplace_back(tmp);
266     }
267     return err;
268 }
269 
QueryScanInfos(std::vector<InterScanInfo> & scanInfos)270 WifiErrorNo WifiIdlClient::QueryScanInfos(std::vector<InterScanInfo> &scanInfos)
271 {
272     CHECK_CLIENT_NOT_NULL;
273     int size = WIFI_IDL_GET_MAX_SCAN_INFO;
274     ScanInfo* results = GetScanInfos(&size);
275     if (results == NULL) {
276         return size == 0 ? WIFI_IDL_OPT_OK : WIFI_IDL_OPT_FAILED;
277     }
278     for (int i = 0; i < size; ++i) {
279         InterScanInfo tmp;
280         tmp.ssid = results[i].ssid;
281         tmp.bssid = results[i].bssid;
282         tmp.frequency = results[i].frequency;
283         tmp.rssi = results[i].signalLevel;
284         tmp.timestamp = results[i].timestamp;
285         tmp.capabilities = results[i].capability;
286         scanInfos.emplace_back(tmp);
287     }
288     free(results);
289     results = NULL;
290     return WIFI_IDL_OPT_OK;
291 }
292 
ConvertPnoScanParam(const WifiPnoScanParam & param,PnoScanSettings * pSettings) const293 WifiErrorNo WifiIdlClient::ConvertPnoScanParam(const WifiPnoScanParam &param, PnoScanSettings *pSettings) const
294 {
295     if (param.scanInterval > 0) {
296         pSettings->scanInterval = param.scanInterval;
297     }
298     pSettings->minRssi2Dot4Ghz = param.minRssi2Dot4Ghz;
299     pSettings->minRssi5Ghz = param.minRssi5Ghz;
300     if (param.hiddenSsid.size() > 0) {
301         pSettings->hiddenSsidSize = param.hiddenSsid.size();
302         pSettings->hiddenSsid = ConVectorToCArrayString(param.hiddenSsid);
303         if (pSettings->hiddenSsid == nullptr) {
304             return WIFI_IDL_OPT_FAILED;
305         }
306     }
307     if (param.savedSsid.size() > 0) {
308         pSettings->savedSsidSize = param.savedSsid.size();
309         pSettings->savedSsid = ConVectorToCArrayString(param.savedSsid);
310         if (pSettings->savedSsid == nullptr) {
311             return WIFI_IDL_OPT_FAILED;
312         }
313     }
314     if (param.scanFreqs.size() > 0) {
315         pSettings->freqSize = param.scanFreqs.size();
316         pSettings->freqs = (int *)calloc(pSettings->freqSize, sizeof(int));
317         if (pSettings->freqs == nullptr) {
318             return WIFI_IDL_OPT_FAILED;
319         }
320         for (int i = 0; i < pSettings->freqSize; ++i) {
321             pSettings->freqs[i] = param.scanFreqs[i];
322         }
323     }
324     return WIFI_IDL_OPT_OK;
325 }
326 
ReqStartPnoScan(const WifiPnoScanParam & scanParam)327 WifiErrorNo WifiIdlClient::ReqStartPnoScan(const WifiPnoScanParam &scanParam)
328 {
329     CHECK_CLIENT_NOT_NULL;
330     PnoScanSettings settings;
331     if (memset_s(&settings, sizeof(settings), 0, sizeof(settings)) != EOK) {
332         return WIFI_IDL_OPT_FAILED;
333     }
334     WifiErrorNo err = ConvertPnoScanParam(scanParam, &settings);
335     if (err == WIFI_IDL_OPT_OK) {
336         err = StartPnoScan(&settings);
337     }
338     if (settings.freqs != nullptr) {
339         free(settings.freqs);
340     }
341     if (settings.hiddenSsid != nullptr) {
342         for (int i = 0; i < settings.hiddenSsidSize; ++i) {
343             free(settings.hiddenSsid[i]);
344         }
345         free(settings.hiddenSsid);
346     }
347     if (settings.savedSsid != nullptr) {
348         for (int i = 0; i < settings.savedSsidSize; ++i) {
349             free(settings.savedSsid[i]);
350         }
351         free(settings.savedSsid);
352     }
353     return err;
354 }
355 
ReqStopPnoScan(void)356 WifiErrorNo WifiIdlClient::ReqStopPnoScan(void)
357 {
358     CHECK_CLIENT_NOT_NULL;
359     return StopPnoScan();
360 }
361 
RemoveDevice(int networkId)362 WifiErrorNo WifiIdlClient::RemoveDevice(int networkId)
363 {
364     CHECK_CLIENT_NOT_NULL;
365     if (networkId < 0) {
366         return WIFI_IDL_OPT_INVALID_PARAM;
367     }
368     return RemoveNetwork(networkId);
369 }
370 
ClearDeviceConfig(void) const371 WifiErrorNo WifiIdlClient::ClearDeviceConfig(void) const
372 {
373     CHECK_CLIENT_NOT_NULL;
374     return RemoveNetwork(-1);
375 }
376 
GetNextNetworkId(int & networkId)377 WifiErrorNo WifiIdlClient::GetNextNetworkId(int &networkId)
378 {
379     CHECK_CLIENT_NOT_NULL;
380     return AddNetwork(&networkId);
381 }
382 
ReqEnableNetwork(int networkId)383 WifiErrorNo WifiIdlClient::ReqEnableNetwork(int networkId)
384 {
385     CHECK_CLIENT_NOT_NULL;
386     return EnableNetwork(networkId);
387 }
388 
ReqDisableNetwork(int networkId)389 WifiErrorNo WifiIdlClient::ReqDisableNetwork(int networkId)
390 {
391     CHECK_CLIENT_NOT_NULL;
392     return DisableNetwork(networkId);
393 }
394 
GetDeviceConfig(WifiIdlGetDeviceConfig & config)395 WifiErrorNo WifiIdlClient::GetDeviceConfig(WifiIdlGetDeviceConfig &config)
396 {
397     CHECK_CLIENT_NOT_NULL;
398     HidlGetNetworkConfig conf;
399     if (memset_s(&conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
400         return WIFI_IDL_OPT_FAILED;
401     }
402     conf.networkId = config.networkId;
403     if (strncpy_s(conf.param, sizeof(conf.param), config.param.c_str(), config.param.length()) != EOK) {
404         return WIFI_IDL_OPT_FAILED;
405     }
406     int ret = WpaGetNetwork(&conf);
407     if (ret != WIFI_IDL_OPT_OK) {
408         return WIFI_IDL_OPT_FAILED;
409     }
410     config.value = conf.value;
411     return WIFI_IDL_OPT_OK;
412 }
413 
PushDeviceConfigString(HidlSetNetworkConfig * pConfig,DeviceConfigType type,const std::string & msg) const414 int WifiIdlClient::PushDeviceConfigString(
415     HidlSetNetworkConfig *pConfig, DeviceConfigType type, const std::string &msg) const
416 {
417     if (msg.length() > 0) {
418         pConfig->cfgParam = type;
419         if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), msg.c_str(), msg.length()) != EOK) {
420             return 0;
421         }
422         return 1;
423     } else {
424         return 0;
425     }
426 }
427 
PushDeviceConfigInt(HidlSetNetworkConfig * pConfig,DeviceConfigType type,int i) const428 int WifiIdlClient::PushDeviceConfigInt(HidlSetNetworkConfig *pConfig, DeviceConfigType type, int i) const
429 {
430     pConfig->cfgParam = type;
431     if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
432         return 0;
433     }
434     return 1;
435 }
436 
PushDeviceConfigAuthAlgorithm(HidlSetNetworkConfig * pConfig,DeviceConfigType type,unsigned int alg) const437 int WifiIdlClient::PushDeviceConfigAuthAlgorithm(
438     HidlSetNetworkConfig *pConfig, DeviceConfigType type, unsigned int alg) const
439 {
440     pConfig->cfgParam = type;
441     if (alg & 0x1) {
442         if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN ") != EOK) {
443             return 0;
444         }
445     }
446     if (alg & 0x2) {
447         if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "SHARED ") != EOK) {
448             return 0;
449         }
450     }
451     if (alg & 0x4) {
452         if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "LEAP ") != EOK) {
453             return 0;
454         }
455     }
456     return 1;
457 }
458 
CheckValidDeviceConfig(const WifiIdlDeviceConfig & config) const459 WifiErrorNo WifiIdlClient::CheckValidDeviceConfig(const WifiIdlDeviceConfig &config) const
460 {
461     if (config.psk.length() > 0) {
462         if (config.psk.length() < WIFI_IDL_PSK_MIN_LENGTH || config.psk.length() > WIFI_IDL_PSK_MAX_LENGTH) {
463             return WIFI_IDL_OPT_FAILED;
464         }
465     }
466     if (config.authAlgorithms >= AUTH_ALGORITHM_MAX) { /* max is 0111 */
467         return WIFI_IDL_OPT_FAILED;
468     }
469     return WIFI_IDL_OPT_OK;
470 }
471 
SetDeviceConfig(int networkId,const WifiIdlDeviceConfig & config)472 WifiErrorNo WifiIdlClient::SetDeviceConfig(int networkId, const WifiIdlDeviceConfig &config)
473 {
474     CHECK_CLIENT_NOT_NULL;
475     if (CheckValidDeviceConfig(config) != WIFI_IDL_OPT_OK) {
476         return WIFI_IDL_OPT_FAILED;
477     }
478     HidlSetNetworkConfig conf[DEVICE_CONFIG_END_POS];
479     if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
480         return WIFI_IDL_OPT_FAILED;
481     }
482     int num = 0;
483     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_SSID, config.ssid);
484     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PSK, config.psk);
485     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, config.keyMgmt);
486     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eap);
487     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.identity);
488     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.password);
489     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_BSSID, config.bssid);
490     int i = 0;
491     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_0, config.wepKeys[i++]);
492     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_1, config.wepKeys[i++]);
493     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_2, config.wepKeys[i++]);
494     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_3, config.wepKeys[i++]);
495     if (config.priority >= 0) {
496         num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_PRIORITY, config.priority);
497     }
498     if (config.scanSsid == 1) {
499         num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_SCAN_SSID, config.scanSsid);
500     }
501     if (config.wepKeyIdx >= 0) {
502         num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_WEP_KEY_IDX, config.wepKeyIdx);
503     }
504     if (config.authAlgorithms > 0) {
505         num += PushDeviceConfigAuthAlgorithm(conf + num, DEVICE_CONFIG_AUTH_ALGORITHMS, config.authAlgorithms);
506     }
507     if (num == 0) {
508         return WIFI_IDL_OPT_OK;
509     }
510     return SetNetwork(networkId, conf, num);
511 }
512 
SaveDeviceConfig(void)513 WifiErrorNo WifiIdlClient::SaveDeviceConfig(void)
514 {
515     CHECK_CLIENT_NOT_NULL;
516     return SaveNetworkConfig();
517 }
518 
ReqRegisterStaEventCallback(const WifiEventCallback & callback)519 WifiErrorNo WifiIdlClient::ReqRegisterStaEventCallback(const WifiEventCallback &callback)
520 {
521     CHECK_CLIENT_NOT_NULL;
522     IWifiEventCallback cEventCallback;
523     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
524         return WIFI_IDL_OPT_FAILED;
525     }
526     if (callback.onConnectChanged != nullptr) {
527         cEventCallback.onConnectChanged = OnConnectChanged;
528         cEventCallback.onWpaStateChanged = OnWpaStateChanged;
529         cEventCallback.onSsidWrongkey = OnWpaSsidWrongKey;
530         cEventCallback.onWpsOverlap = OnWpsOverlap;
531         cEventCallback.onWpsTimeOut = OnWpsTimeOut;
532         cEventCallback.onWpsConnectionFull = onWpaConnectionFull;
533         cEventCallback.onWpsConnectionReject = onWpaConnectionReject;
534     }
535     return RegisterStaEventCallback(cEventCallback);
536 }
537 
ReqStartWpsPbcMode(const WifiIdlWpsConfig & config)538 WifiErrorNo WifiIdlClient::ReqStartWpsPbcMode(const WifiIdlWpsConfig &config)
539 {
540     CHECK_CLIENT_NOT_NULL;
541     WifiWpsParam param;
542     if (memset_s(&param, sizeof(param), 0, sizeof(param)) != EOK) {
543         return WIFI_IDL_OPT_FAILED;
544     }
545     param.anyFlag = config.anyFlag;
546     param.multiAp = config.multiAp;
547     if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
548         return WIFI_IDL_OPT_FAILED;
549     }
550     return StartWpsPbcMode(&param);
551 }
552 
ReqStartWpsPinMode(const WifiIdlWpsConfig & config,int & pinCode)553 WifiErrorNo WifiIdlClient::ReqStartWpsPinMode(const WifiIdlWpsConfig &config, int &pinCode)
554 {
555     CHECK_CLIENT_NOT_NULL;
556     WifiWpsParam param;
557     if (memset_s(&param, sizeof(param), 0, sizeof(param)) != EOK) {
558         return WIFI_IDL_OPT_FAILED;
559     }
560     param.anyFlag = config.anyFlag;
561     param.multiAp = config.multiAp;
562     if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
563         return WIFI_IDL_OPT_FAILED;
564     }
565     if (!config.pinCode.empty()) {
566         if (strncpy_s(param.pinCode, sizeof(param.pinCode), config.pinCode.c_str(), config.pinCode.length()) != EOK) {
567             return WIFI_IDL_OPT_FAILED;
568         }
569     }
570     return StartWpsPinMode(&param, &pinCode);
571 }
572 
ReqStopWps()573 WifiErrorNo WifiIdlClient::ReqStopWps()
574 {
575     CHECK_CLIENT_NOT_NULL;
576     return StopWps();
577 }
578 
ReqGetRoamingCapabilities(WifiIdlRoamCapability & capability)579 WifiErrorNo WifiIdlClient::ReqGetRoamingCapabilities(WifiIdlRoamCapability &capability)
580 {
581     CHECK_CLIENT_NOT_NULL;
582     WifiRoamCapability tmp;
583     if (memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)) != EOK) {
584         return WIFI_IDL_OPT_FAILED;
585     }
586     WifiErrorNo err = GetRoamingCapabilities(&tmp);
587     if (err == WIFI_IDL_OPT_OK) {
588         capability.maxBlocklistSize = tmp.maxBlocklistSize;
589         capability.maxTrustlistSize = tmp.maxTrustlistSize;
590     }
591     return err;
592 }
593 
ConVectorToCArrayString(const std::vector<std::string> & vec) const594 char **WifiIdlClient::ConVectorToCArrayString(const std::vector<std::string> &vec) const
595 {
596     int size = vec.size();
597     if (size == 0) {
598         return nullptr;
599     }
600     char **list = (char **)calloc(size, sizeof(char *));
601     if (list == nullptr) {
602         return nullptr;
603     }
604     int i = 0;
605     for (; i < size; ++i) {
606         int len = vec[i].length();
607         list[i] = (char *)calloc(len + 1, sizeof(char));
608         if (list[i] == nullptr) {
609             break;
610         }
611         if (strncpy_s(list[i], len + 1, vec[i].c_str(), len) != EOK) {
612             break;
613         }
614     }
615     if (i < size) {
616         for (int j = 0; j <= i; ++j) {
617             free(list[j]);
618         }
619         free(list);
620         return nullptr;
621     } else {
622         return list;
623     }
624 }
625 
ReqSetRoamConfig(const WifiIdlRoamConfig & config)626 WifiErrorNo WifiIdlClient::ReqSetRoamConfig(const WifiIdlRoamConfig &config)
627 {
628     CHECK_CLIENT_NOT_NULL;
629     char **blocklist = nullptr;
630     int blocksize = config.blocklistBssids.size();
631     char **trustlist = nullptr;
632     int trustsize = config.trustlistBssids.size();
633     if (blocksize == 0 && trustsize == 0) {
634         return WIFI_IDL_OPT_FAILED;
635     }
636     WifiErrorNo err = WIFI_IDL_OPT_FAILED;
637     do {
638         if (blocksize > 0) {
639             blocklist = ConVectorToCArrayString(config.blocklistBssids);
640             if (blocklist == nullptr) {
641                 break;
642             }
643         }
644         if (trustsize > 0) {
645             trustlist = ConVectorToCArrayString(config.trustlistBssids);
646             if (trustlist == nullptr) {
647                 break;
648             }
649         }
650         err = SetRoamConfig(blocklist, blocksize, trustlist, trustsize);
651     } while (0);
652     if (blocklist != nullptr) {
653         for (int i = 0; i < blocksize; ++i) {
654             free(blocklist[i]);
655         }
656         free(blocklist);
657     }
658     if (trustlist != nullptr) {
659         for (int i = 0; i < trustsize; ++i) {
660             free(trustlist[i]);
661         }
662         free(trustlist);
663     }
664     return err;
665 }
666 
ReqGetConnectSignalInfo(const std::string & endBssid,WifiWpaSignalInfo & info) const667 WifiErrorNo WifiIdlClient::ReqGetConnectSignalInfo(const std::string &endBssid, WifiWpaSignalInfo &info) const
668 {
669     CHECK_CLIENT_NOT_NULL;
670     HidlWpaSignalInfo req = {0};
671     WifiErrorNo err = GetConnectSignalInfo(endBssid.c_str(), &req);
672     if (err == WIFI_IDL_OPT_OK) {
673         info.signal = req.signal;
674         info.txrate = req.txrate;
675         info.rxrate = req.rxrate;
676         info.noise = req.noise;
677         info.frequency = req.frequency;
678     }
679     return err;
680 }
681 
StartAp(void)682 WifiErrorNo WifiIdlClient::StartAp(void)
683 {
684     CHECK_CLIENT_NOT_NULL;
685     return StartSoftAp();
686 }
687 
StopAp(void)688 WifiErrorNo WifiIdlClient::StopAp(void)
689 {
690     CHECK_CLIENT_NOT_NULL;
691     return StopSoftAp();
692 }
693 
SetSoftApConfig(const HotspotConfig & config)694 WifiErrorNo WifiIdlClient::SetSoftApConfig(const HotspotConfig &config)
695 {
696     CHECK_CLIENT_NOT_NULL;
697     HostapdConfig tmp;
698     if (memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)) != EOK) {
699         return WIFI_IDL_OPT_FAILED;
700     }
701     tmp.ssidLen = config.GetSsid().length();
702     if (strncpy_s(tmp.ssid, sizeof(tmp.ssid), config.GetSsid().c_str(), tmp.ssidLen) != EOK) {
703         return WIFI_IDL_OPT_FAILED;
704     }
705     std::string preSharedKey = config.GetPreSharedKey();
706     tmp.preSharedKeyLen = preSharedKey.length();
707     if (strncpy_s(tmp.preSharedKey, sizeof(tmp.preSharedKey), preSharedKey.c_str(), tmp.preSharedKeyLen) != EOK) {
708         return WIFI_IDL_OPT_FAILED;
709     }
710     tmp.securityType = static_cast<int>(config.GetSecurityType());
711     tmp.band = static_cast<int>(config.GetBand());
712     tmp.channel = config.GetChannel();
713     tmp.maxConn = config.GetMaxConn();
714     return SetHostapdConfig(&tmp);
715 }
716 
GetStationList(std::vector<std::string> & result)717 WifiErrorNo WifiIdlClient::GetStationList(std::vector<std::string> &result)
718 {
719     CHECK_CLIENT_NOT_NULL;
720 
721     char *staInfos = new (std::nothrow) char[BUFFER_SIZE]();
722     if (staInfos == nullptr) {
723         return WIFI_IDL_OPT_FAILED;
724     }
725     int32_t size = BUFFER_SIZE;
726     WifiErrorNo err = GetStaInfos(staInfos, &size);
727     if (err != WIFI_IDL_OPT_OK) {
728         delete[] staInfos;
729         return WIFI_IDL_OPT_FAILED;
730     }
731     std::string strStaInfo = std::string(staInfos);
732     SplitString(strStaInfo, ",", result);
733     delete[] staInfos;
734     return WIFI_IDL_OPT_OK;
735 }
736 
AddBlockByMac(const std::string & mac)737 WifiErrorNo WifiIdlClient::AddBlockByMac(const std::string &mac)
738 {
739     CHECK_CLIENT_NOT_NULL;
740     if (CheckMacIsValid(mac) != 0) {
741         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
742     }
743     int len = mac.length();
744     return SetMacFilter((unsigned char *)mac.c_str(), len);
745 }
746 
DelBlockByMac(const std::string & mac)747 WifiErrorNo WifiIdlClient::DelBlockByMac(const std::string &mac)
748 {
749     CHECK_CLIENT_NOT_NULL;
750     if (CheckMacIsValid(mac) != 0) {
751         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
752     }
753     int len = mac.length();
754     return DelMacFilter((unsigned char *)mac.c_str(), len);
755 }
756 
RemoveStation(const std::string & mac)757 WifiErrorNo WifiIdlClient::RemoveStation(const std::string &mac)
758 {
759     CHECK_CLIENT_NOT_NULL;
760     if (CheckMacIsValid(mac) != 0) {
761         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
762     }
763     int len = mac.length();
764     return DisassociateSta((unsigned char *)mac.c_str(), len);
765 }
766 
GetFrequenciesByBand(int32_t band,std::vector<int> & frequencies)767 WifiErrorNo WifiIdlClient::GetFrequenciesByBand(int32_t band, std::vector<int> &frequencies)
768 {
769     CHECK_CLIENT_NOT_NULL;
770 
771     int values[WIFI_IDL_GET_MAX_BANDS] = {0};
772     int size = WIFI_IDL_GET_MAX_BANDS;
773     if (GetValidFrequenciesForBand(band, values, &size) != 0) {
774         return WIFI_IDL_OPT_FAILED;
775     }
776 
777     for (int i = 0; i < size; i++) {
778         frequencies.push_back(values[i]);
779     }
780 
781     return WIFI_IDL_OPT_OK;
782 }
783 
RegisterApEvent(IWifiApMonitorEventCallback callback) const784 WifiErrorNo WifiIdlClient::RegisterApEvent(IWifiApMonitorEventCallback callback) const
785 {
786     CHECK_CLIENT_NOT_NULL;
787     IWifiApEventCallback cEventCallback;
788     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
789         return WIFI_IDL_OPT_FAILED;
790     }
791     if (callback.onStaJoinOrLeave != nullptr) {
792         cEventCallback.onStaJoinOrLeave = OnApStaJoinOrLeave;
793         cEventCallback.onApEnableOrDisable = OnApEnableOrDisable;
794     }
795 
796     return RegisterAsscociatedEvent(cEventCallback);
797 }
798 
SetWifiCountryCode(const std::string & code)799 WifiErrorNo WifiIdlClient::SetWifiCountryCode(const std::string &code)
800 {
801     CHECK_CLIENT_NOT_NULL;
802     if (code.length() != WIFI_IDL_COUNTRY_CODE_LENGTH) {
803         return WIFI_IDL_OPT_INVALID_PARAM;
804     }
805     return SetCountryCode(code.c_str());
806 }
807 
ReqDisconnectStaByMac(const std::string & mac)808 WifiErrorNo WifiIdlClient::ReqDisconnectStaByMac(const std::string &mac)
809 {
810     CHECK_CLIENT_NOT_NULL;
811     if (CheckMacIsValid(mac) != 0) {
812         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
813     }
814     return DisassociateSta((unsigned char *)mac.c_str(), strlen(mac.c_str()));
815 }
816 
GetWifiChipObject(int id,IWifiChip & chip)817 WifiErrorNo WifiIdlClient::GetWifiChipObject(int id, IWifiChip &chip)
818 {
819     CHECK_CLIENT_NOT_NULL;
820     LOGD("Get wifi chip object accord %{public}d, %{public}d", id, chip.i);
821     return WIFI_IDL_OPT_OK;
822 }
823 
GetChipIds(std::vector<int> & ids)824 WifiErrorNo WifiIdlClient::GetChipIds(std::vector<int> &ids)
825 {
826     CHECK_CLIENT_NOT_NULL;
827     LOGD("start GetChipIds %{public}zu", ids.size()); /* fixed compile error, -Werror,-Wunused-parameter */
828     return WIFI_IDL_OPT_OK;
829 }
830 
GetUsedChipId(int & id)831 WifiErrorNo WifiIdlClient::GetUsedChipId(int &id)
832 {
833     CHECK_CLIENT_NOT_NULL;
834     id = 0; /* fixed compile error, -Werror,-Wunused-parameter */
835     return WIFI_IDL_OPT_OK;
836 }
837 
GetChipCapabilities(int & capabilities)838 WifiErrorNo WifiIdlClient::GetChipCapabilities(int &capabilities)
839 {
840     CHECK_CLIENT_NOT_NULL;
841     capabilities = 0; /* fixed compile error, -Werror,-Wunused-parameter */
842     return WIFI_IDL_OPT_OK;
843 }
844 
GetSupportedModes(std::vector<int> & modes)845 WifiErrorNo WifiIdlClient::GetSupportedModes(std::vector<int> &modes)
846 {
847     CHECK_CLIENT_NOT_NULL;
848     int size = WIFI_IDL_INTERFACE_SUPPORT_COMBINATIONS;
849     int supportModes[WIFI_IDL_INTERFACE_SUPPORT_COMBINATIONS] = {0};
850     WifiErrorNo err = GetSupportedComboModes(supportModes, &size);
851     if (err == WIFI_IDL_OPT_OK) {
852         for (int i = 0; i < size; ++i) {
853             modes.push_back(supportModes[i]);
854         }
855     }
856     return err;
857 }
858 
ConfigRunModes(int mode)859 WifiErrorNo WifiIdlClient::ConfigRunModes(int mode)
860 {
861     CHECK_CLIENT_NOT_NULL;
862     LOGD("start ConfigRunModes mode %{public}d", mode);
863     return WIFI_IDL_OPT_OK;
864 }
865 
GetCurrentMode(int & mode)866 WifiErrorNo WifiIdlClient::GetCurrentMode(int &mode)
867 {
868     CHECK_CLIENT_NOT_NULL;
869     mode = 0; /* fixed compile error, -Werror,-Wunused-parameter */
870     return WIFI_IDL_OPT_OK;
871 }
872 
RegisterChipEventCallback(WifiChipEventCallback & callback)873 WifiErrorNo WifiIdlClient::RegisterChipEventCallback(WifiChipEventCallback &callback)
874 {
875     CHECK_CLIENT_NOT_NULL;
876     IWifiChipEventCallback cEventCallback;
877     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
878         return WIFI_IDL_OPT_FAILED;
879     }
880     cEventCallback.onIfaceAdded = callback.onIfaceAdded;
881     cEventCallback.onIfaceRemoved = callback.onIfaceRemoved;
882     return RegisterEventCallback(cEventCallback);
883 }
884 
RequestFirmwareDebugInfo(std::string & debugInfo)885 WifiErrorNo WifiIdlClient::RequestFirmwareDebugInfo(std::string &debugInfo)
886 {
887     CHECK_CLIENT_NOT_NULL;
888     debugInfo.clear(); /* fixed compile error, -Werror,-Wunused-parameter */
889     return WIFI_IDL_OPT_OK;
890 }
891 
SetWifiPowerMode(int mode)892 WifiErrorNo WifiIdlClient::SetWifiPowerMode(int mode)
893 {
894     CHECK_CLIENT_NOT_NULL;
895     LOGD("start SetWifiPowerMode mode %{public}d", mode);
896     return WIFI_IDL_OPT_OK;
897 }
898 
ReqStartSupplicant(void)899 WifiErrorNo WifiIdlClient::ReqStartSupplicant(void)
900 {
901     CHECK_CLIENT_NOT_NULL;
902     return StartSupplicant();
903 }
904 
ReqStopSupplicant(void)905 WifiErrorNo WifiIdlClient::ReqStopSupplicant(void)
906 {
907     CHECK_CLIENT_NOT_NULL;
908     return StopSupplicant();
909 }
910 
ReqConnectSupplicant(void)911 WifiErrorNo WifiIdlClient::ReqConnectSupplicant(void)
912 {
913     CHECK_CLIENT_NOT_NULL;
914     return ConnectSupplicant();
915 }
916 
ReqDisconnectSupplicant(void)917 WifiErrorNo WifiIdlClient::ReqDisconnectSupplicant(void)
918 {
919     CHECK_CLIENT_NOT_NULL;
920     return DisconnectSupplicant();
921 }
922 
ReqRequestToSupplicant(const std::string & request)923 WifiErrorNo WifiIdlClient::ReqRequestToSupplicant(const std::string &request)
924 {
925     CHECK_CLIENT_NOT_NULL;
926     unsigned char *p = (unsigned char *)request.c_str();
927     return RequestToSupplicant(p, request.length());
928 }
929 
ReqRegisterSupplicantEventCallback(SupplicantEventCallback & callback)930 WifiErrorNo WifiIdlClient::ReqRegisterSupplicantEventCallback(SupplicantEventCallback &callback)
931 {
932     CHECK_CLIENT_NOT_NULL;
933     ISupplicantEventCallback cEventCallback;
934     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
935         return WIFI_IDL_OPT_FAILED;
936     }
937     if (callback.onScanNotify != nullptr) {
938         cEventCallback.onScanNotify = OnScanNotify;
939     }
940     return RegisterSupplicantEventCallback(cEventCallback);
941 }
942 
ReqUnRegisterSupplicantEventCallback(void)943 WifiErrorNo WifiIdlClient::ReqUnRegisterSupplicantEventCallback(void)
944 {
945     CHECK_CLIENT_NOT_NULL;
946     ISupplicantEventCallback cEventCallback;
947     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
948         return WIFI_IDL_OPT_FAILED;
949     }
950     return RegisterSupplicantEventCallback(cEventCallback);
951 }
952 
ReqSetPowerSave(bool enable)953 WifiErrorNo WifiIdlClient::ReqSetPowerSave(bool enable)
954 {
955     CHECK_CLIENT_NOT_NULL;
956     int mode = 0;
957     if (enable) {
958         mode = 1;
959     }
960 
961     return SetPowerSave(mode);
962 }
963 
ReqWpaSetCountryCode(const std::string & countryCode)964 WifiErrorNo WifiIdlClient::ReqWpaSetCountryCode(const std::string &countryCode)
965 {
966     CHECK_CLIENT_NOT_NULL;
967     if (countryCode.length() != WIFI_IDL_COUNTRY_CODE_LENGTH) {
968         return WIFI_IDL_OPT_INVALID_PARAM;
969     }
970     return WpaSetCountryCode(countryCode.c_str());
971 }
972 
ReqWpaGetCountryCode(std::string & countryCode)973 WifiErrorNo WifiIdlClient::ReqWpaGetCountryCode(std::string &countryCode)
974 {
975     CHECK_CLIENT_NOT_NULL;
976     const int idlCountryCodeLen = 32;
977     char code[idlCountryCodeLen] = {0};
978     WifiErrorNo ret = WpaGetCountryCode(code, idlCountryCodeLen);
979     if (ret == WIFI_IDL_OPT_OK) {
980         countryCode = code;
981     }
982     return ret;
983 }
984 
ReqWpaAutoConnect(int enable)985 WifiErrorNo WifiIdlClient::ReqWpaAutoConnect(int enable)
986 {
987     CHECK_CLIENT_NOT_NULL;
988     return WpaAutoConnect(enable);
989 }
990 
ReqWpaBlocklistClear()991 WifiErrorNo WifiIdlClient::ReqWpaBlocklistClear()
992 {
993     CHECK_CLIENT_NOT_NULL;
994     return WpaBlocklistClear();
995 }
996 
ReqP2pStart(void) const997 WifiErrorNo WifiIdlClient::ReqP2pStart(void) const
998 {
999     CHECK_CLIENT_NOT_NULL;
1000     return P2pStart();
1001 }
1002 
ReqP2pStop(void) const1003 WifiErrorNo WifiIdlClient::ReqP2pStop(void) const
1004 {
1005     CHECK_CLIENT_NOT_NULL;
1006     return P2pStop();
1007 }
1008 
ReqP2pSetDeviceName(const std::string & name) const1009 WifiErrorNo WifiIdlClient::ReqP2pSetDeviceName(const std::string &name) const
1010 {
1011     CHECK_CLIENT_NOT_NULL;
1012     return P2pSetDeviceName(name.c_str());
1013 }
1014 
ReqP2pSetSsidPostfixName(const std::string & postfixName) const1015 WifiErrorNo WifiIdlClient::ReqP2pSetSsidPostfixName(const std::string &postfixName) const
1016 {
1017     CHECK_CLIENT_NOT_NULL;
1018     return P2pSetSsidPostfixName(postfixName.c_str());
1019 }
1020 
ReqP2pSetWpsDeviceType(const std::string & type) const1021 WifiErrorNo WifiIdlClient::ReqP2pSetWpsDeviceType(const std::string &type) const
1022 {
1023     CHECK_CLIENT_NOT_NULL;
1024     return P2pSetWpsDeviceType(type.c_str());
1025 }
1026 
ReqP2pSetWpsSecondaryDeviceType(const std::string & type) const1027 WifiErrorNo WifiIdlClient::ReqP2pSetWpsSecondaryDeviceType(const std::string &type) const
1028 {
1029     CHECK_CLIENT_NOT_NULL;
1030     return P2pSetWpsSecondaryDeviceType(type.c_str());
1031 }
1032 
ReqP2pSetWpsConfigMethods(const std::string & config) const1033 WifiErrorNo WifiIdlClient::ReqP2pSetWpsConfigMethods(const std::string &config) const
1034 {
1035     CHECK_CLIENT_NOT_NULL;
1036     return P2pSetWpsConfigMethods(config.c_str());
1037 }
1038 
ReqP2pGetDeviceAddress(std::string & deviceAddress) const1039 WifiErrorNo WifiIdlClient::ReqP2pGetDeviceAddress(std::string &deviceAddress) const
1040 {
1041     CHECK_CLIENT_NOT_NULL;
1042     char address[WIFI_IDL_P2P_DEV_ADDRESS_LEN] = {0};
1043     WifiErrorNo ret = P2pGetDeviceAddress(address, WIFI_IDL_P2P_DEV_ADDRESS_LEN);
1044     if (ret == WIFI_IDL_OPT_OK) {
1045         deviceAddress = address;
1046     }
1047     return ret;
1048 }
1049 
ReqP2pFlush() const1050 WifiErrorNo WifiIdlClient::ReqP2pFlush() const
1051 {
1052     CHECK_CLIENT_NOT_NULL;
1053     return P2pFlush();
1054 }
1055 
ReqP2pFlushService() const1056 WifiErrorNo WifiIdlClient::ReqP2pFlushService() const
1057 {
1058     CHECK_CLIENT_NOT_NULL;
1059     return P2pFlushService();
1060 }
1061 
ReqP2pSaveConfig() const1062 WifiErrorNo WifiIdlClient::ReqP2pSaveConfig() const
1063 {
1064     CHECK_CLIENT_NOT_NULL;
1065     return P2pSaveConfig();
1066 }
1067 
ReqP2pRegisterCallback(const P2pHalCallback & callbacks) const1068 WifiErrorNo WifiIdlClient::ReqP2pRegisterCallback(const P2pHalCallback &callbacks) const
1069 {
1070     CHECK_CLIENT_NOT_NULL;
1071 
1072     IWifiEventP2pCallback cEventCallback;
1073     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1074         return WIFI_IDL_OPT_FAILED;
1075     }
1076     if (callbacks.onConnectSupplicant != nullptr) {
1077         cEventCallback.onP2pSupplicantConnect = OnP2pConnectSupplicant;
1078         cEventCallback.onDeviceFound = OnP2pDeviceFound;
1079         cEventCallback.onDeviceLost = OnP2pDeviceLost;
1080         cEventCallback.onGoNegotiationRequest = OnP2pGoNegotiationRequest;
1081         cEventCallback.onGoNegotiationSuccess = OnP2pGoNegotiationSuccess;
1082         cEventCallback.onGoNegotiationFailure = OnP2pGoNegotiationFailure;
1083         cEventCallback.onInvitationReceived = OnP2pInvitationReceived;
1084         cEventCallback.onInvitationResult = OnP2pInvitationResult;
1085         cEventCallback.onGroupFormationSuccess = OnP2pGroupFormationSuccess;
1086         cEventCallback.onGroupFormationFailure = OnP2pGroupFormationFailure;
1087         cEventCallback.onGroupStarted = OnP2pGroupStarted;
1088         cEventCallback.onGroupRemoved = OnP2pGroupRemoved;
1089         cEventCallback.onProvisionDiscoveryPbcRequest = OnP2pProvisionDiscoveryPbcRequest;
1090         cEventCallback.onProvisionDiscoveryPbcResponse = OnP2pProvisionDiscoveryPbcResponse;
1091         cEventCallback.onProvisionDiscoveryEnterPin = OnP2pProvisionDiscoveryEnterPin;
1092         cEventCallback.onProvisionDiscoveryShowPin = OnP2pProvisionDiscoveryShowPin;
1093         cEventCallback.onProvisionDiscoveryFailure = OnP2pProvisionDiscoveryFailure;
1094         cEventCallback.onFindStopped = OnP2pFindStopped;
1095         cEventCallback.onServiceDiscoveryResponse = OnP2pServiceDiscoveryResponse;
1096         cEventCallback.onStaDeauthorized = OnP2pStaDeauthorized;
1097         cEventCallback.onStaAuthorized = OnP2pStaAuthorized;
1098         cEventCallback.connectSupplicantFailed = OnP2pConnectSupplicantFailed;
1099         cEventCallback.onP2pServDiscReq = OnP2pServDiscReq;
1100     }
1101 
1102     return RegisterP2pEventCallback(cEventCallback);
1103 }
1104 
ReqP2pSetupWpsPbc(const std::string & groupInterface,const std::string & bssid) const1105 WifiErrorNo WifiIdlClient::ReqP2pSetupWpsPbc(const std::string &groupInterface, const std::string &bssid) const
1106 {
1107     CHECK_CLIENT_NOT_NULL;
1108     return P2pSetupWpsPbc(groupInterface.c_str(), bssid.c_str());
1109 }
1110 
ReqP2pSetupWpsPin(const std::string & groupInterface,const std::string & address,const std::string & pin,std::string & result) const1111 WifiErrorNo WifiIdlClient::ReqP2pSetupWpsPin(
1112     const std::string &groupInterface, const std::string &address, const std::string &pin, std::string &result) const
1113 {
1114     CHECK_CLIENT_NOT_NULL;
1115     if (!pin.empty() && pin.size() != WIFI_IDL_PIN_CODE_LENGTH) {
1116         return WIFI_IDL_OPT_INVALID_PARAM;
1117     }
1118     char szPinCode[WIFI_IDL_PIN_CODE_LENGTH + 1] = {0};
1119     WifiErrorNo ret =
1120         P2pSetupWpsPin(groupInterface.c_str(), address.c_str(), pin.c_str(), szPinCode, sizeof(szPinCode));
1121     if (ret == WIFI_IDL_OPT_OK) {
1122         result = szPinCode;
1123     }
1124     return ret;
1125 }
1126 
ReqP2pRemoveNetwork(int networkId) const1127 WifiErrorNo WifiIdlClient::ReqP2pRemoveNetwork(int networkId) const
1128 {
1129     CHECK_CLIENT_NOT_NULL;
1130     return P2pRemoveNetwork(networkId);
1131 }
1132 
ReqP2pListNetworks(std::map<int,WifiP2pGroupInfo> & mapGroups) const1133 WifiErrorNo WifiIdlClient::ReqP2pListNetworks(std::map<int, WifiP2pGroupInfo> &mapGroups) const
1134 {
1135     CHECK_CLIENT_NOT_NULL;
1136     HidlP2pNetworkList infoList = {0};
1137     WifiErrorNo ret = P2pListNetworks(&infoList);
1138     if (ret != WIFI_IDL_OPT_OK) {
1139         return ret;
1140     }
1141     if (infoList.infos == nullptr) {
1142         return ret;
1143     }
1144     for (int i = 0; i < infoList.infoNum; ++i) {
1145         WifiP2pGroupInfo groupInfo;
1146         groupInfo.SetNetworkId(infoList.infos[i].id);
1147         groupInfo.SetGroupName(infoList.infos[i].ssid);
1148         WifiP2pDevice device;
1149         device.SetDeviceAddress(infoList.infos[i].bssid);
1150         groupInfo.SetOwner(device);
1151         if (strstr(infoList.infos[i].flags, "P2P-PERSISTENT") != nullptr) {
1152             groupInfo.SetIsPersistent(true);
1153         }
1154         mapGroups.insert(std::pair<int, WifiP2pGroupInfo>(infoList.infos[i].id, groupInfo));
1155     }
1156     free(infoList.infos);
1157     return ret;
1158 }
1159 
ReqP2pSetGroupMaxIdle(const std::string & groupInterface,size_t time) const1160 WifiErrorNo WifiIdlClient::ReqP2pSetGroupMaxIdle(const std::string &groupInterface, size_t time) const
1161 {
1162     CHECK_CLIENT_NOT_NULL;
1163     return P2pSetGroupMaxIdle(groupInterface.c_str(), time);
1164 }
1165 
ReqP2pSetPowerSave(const std::string & groupInterface,bool enable) const1166 WifiErrorNo WifiIdlClient::ReqP2pSetPowerSave(const std::string &groupInterface, bool enable) const
1167 {
1168     CHECK_CLIENT_NOT_NULL;
1169     int flag = enable;
1170     return P2pSetPowerSave(groupInterface.c_str(), flag);
1171 }
1172 
ReqP2pSetWfdEnable(bool enable) const1173 WifiErrorNo WifiIdlClient::ReqP2pSetWfdEnable(bool enable) const
1174 {
1175     CHECK_CLIENT_NOT_NULL;
1176     int flag = enable;
1177     return P2pSetWfdEnable(flag);
1178 }
1179 
ReqP2pSetWfdDeviceConfig(const std::string & config) const1180 WifiErrorNo WifiIdlClient::ReqP2pSetWfdDeviceConfig(const std::string &config) const
1181 {
1182     CHECK_CLIENT_NOT_NULL;
1183     return P2pSetWfdDeviceConfig(config.c_str());
1184 }
1185 
ReqP2pStartFind(size_t timeout) const1186 WifiErrorNo WifiIdlClient::ReqP2pStartFind(size_t timeout) const
1187 {
1188     CHECK_CLIENT_NOT_NULL;
1189     return P2pStartFind(timeout);
1190 }
1191 
ReqP2pStopFind() const1192 WifiErrorNo WifiIdlClient::ReqP2pStopFind() const
1193 {
1194     CHECK_CLIENT_NOT_NULL;
1195     return P2pStopFind();
1196 }
1197 
ReqP2pSetExtListen(bool enable,size_t period,size_t interval) const1198 WifiErrorNo WifiIdlClient::ReqP2pSetExtListen(bool enable, size_t period, size_t interval) const
1199 {
1200     CHECK_CLIENT_NOT_NULL;
1201     if (enable) {
1202         if (period < WIFI_IDL_P2P_LISTEN_MIN_TIME || period > WIFI_IDL_P2P_LISTEN_MAX_TIME ||
1203             interval < WIFI_IDL_P2P_LISTEN_MIN_TIME || interval > WIFI_IDL_P2P_LISTEN_MAX_TIME || period > interval) {
1204             return WIFI_IDL_OPT_INVALID_PARAM;
1205         }
1206     }
1207     int flag = enable;
1208     return P2pSetExtListen(flag, period, interval);
1209 }
1210 
ReqP2pSetListenChannel(size_t channel,unsigned char regClass) const1211 WifiErrorNo WifiIdlClient::ReqP2pSetListenChannel(size_t channel, unsigned char regClass) const
1212 {
1213     CHECK_CLIENT_NOT_NULL;
1214     return P2pSetListenChannel(channel, regClass);
1215 }
1216 
ReqP2pConnect(const WifiP2pConfigInternal & config,bool isJoinExistingGroup,std::string & pin) const1217 WifiErrorNo WifiIdlClient::ReqP2pConnect(const WifiP2pConfigInternal &config, bool isJoinExistingGroup,
1218     std::string &pin) const
1219 {
1220     CHECK_CLIENT_NOT_NULL;
1221     HidlP2pConnectInfo info = {0};
1222     info.mode = isJoinExistingGroup;
1223     info.persistent = config.GetNetId();
1224     if (isJoinExistingGroup) {
1225         info.goIntent = 0;
1226     } else {
1227         info.goIntent = config.GetGroupOwnerIntent();
1228     }
1229     if (info.goIntent < WIFI_IDL_P2P_MIN_GO_INTENT || info.goIntent > WIFI_IDL_P2P_MAX_GO_INTENT) {
1230         info.goIntent = WIFI_IDL_P2P_DEFAULT_GO_INTENT;
1231     }
1232     std::string address = config.GetDeviceAddress();
1233     if (address.size() < WIFI_IDL_BSSID_LENGTH) {
1234         LOGI("ReqP2pConnect Device Address is too short");
1235         return WIFI_IDL_OPT_INVALID_PARAM;
1236     }
1237     WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1238     if (mode == WpsMethod::WPS_METHOD_LABEL) {
1239         mode = WpsMethod::WPS_METHOD_KEYPAD;
1240     }
1241     info.provdisc = (int)mode;
1242     std::string pinCode = config.GetWpsInfo().GetPin();
1243     if (mode == WpsMethod::WPS_METHOD_PBC && !pinCode.empty()) {
1244         LOGI("ReqP2pConnect Expected empty pin for PBC.");
1245         return WIFI_IDL_OPT_INVALID_PARAM;
1246     }
1247     if (strncpy_s(info.peerDevAddr, sizeof(info.peerDevAddr), address.c_str(), address.length()) != EOK ||
1248         strncpy_s(info.pin, sizeof(info.pin), pinCode.c_str(), pinCode.length()) != EOK) {
1249         return WIFI_IDL_OPT_FAILED;
1250     }
1251     WifiErrorNo ret = P2pConnect(&info);
1252     if (ret == WIFI_IDL_OPT_OK) {
1253         pin = info.pin;
1254     }
1255     return ret;
1256 }
1257 
ReqP2pCancelConnect() const1258 WifiErrorNo WifiIdlClient::ReqP2pCancelConnect() const
1259 {
1260     CHECK_CLIENT_NOT_NULL;
1261     return P2pCancelConnect();
1262 }
1263 
ReqP2pProvisionDiscovery(const WifiP2pConfigInternal & config) const1264 WifiErrorNo WifiIdlClient::ReqP2pProvisionDiscovery(const WifiP2pConfigInternal &config) const
1265 {
1266     CHECK_CLIENT_NOT_NULL;
1267     WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1268     if (mode == WpsMethod::WPS_METHOD_LABEL) {
1269         mode = WpsMethod::WPS_METHOD_DISPLAY;
1270     } else if (mode == WpsMethod::WPS_METHOD_DISPLAY) {
1271         mode = WpsMethod::WPS_METHOD_KEYPAD;
1272     } else if (mode == WpsMethod::WPS_METHOD_KEYPAD) {
1273         mode = WpsMethod::WPS_METHOD_DISPLAY;
1274     } else if (mode != WpsMethod::WPS_METHOD_PBC) {
1275         return WIFI_IDL_OPT_FAILED;
1276     }
1277     return P2pProvisionDiscovery(config.GetDeviceAddress().c_str(), static_cast<int>(mode));
1278 }
1279 
ReqP2pAddGroup(bool isPersistent,int networkId,int freq) const1280 WifiErrorNo WifiIdlClient::ReqP2pAddGroup(bool isPersistent, int networkId, int freq) const
1281 {
1282     CHECK_CLIENT_NOT_NULL;
1283     int flag = isPersistent;
1284     return P2pAddGroup(flag, networkId, freq);
1285 }
1286 
ReqP2pRemoveGroup(const std::string & groupInterface) const1287 WifiErrorNo WifiIdlClient::ReqP2pRemoveGroup(const std::string &groupInterface) const
1288 {
1289     CHECK_CLIENT_NOT_NULL;
1290     return P2pRemoveGroup(groupInterface.c_str());
1291 }
1292 
ReqP2pInvite(const WifiP2pGroupInfo & group,const std::string & deviceAddr) const1293 WifiErrorNo WifiIdlClient::ReqP2pInvite(const WifiP2pGroupInfo &group, const std::string &deviceAddr) const
1294 {
1295     CHECK_CLIENT_NOT_NULL;
1296     return P2pInvite(group.IsPersistent(),
1297         deviceAddr.c_str(),
1298         group.GetOwner().GetDeviceAddress().c_str(),
1299         group.GetInterface().c_str());
1300 }
1301 
ReqP2pReinvoke(int networkId,const std::string & deviceAddr) const1302 WifiErrorNo WifiIdlClient::ReqP2pReinvoke(int networkId, const std::string &deviceAddr) const
1303 {
1304     CHECK_CLIENT_NOT_NULL;
1305     return P2pReinvoke(networkId, deviceAddr.c_str());
1306 }
1307 
ReqP2pGetGroupCapability(const std::string & deviceAddress,uint32_t & cap) const1308 WifiErrorNo WifiIdlClient::ReqP2pGetGroupCapability(const std::string &deviceAddress, uint32_t &cap) const
1309 {
1310     CHECK_CLIENT_NOT_NULL;
1311     int capacity = 0;
1312     WifiErrorNo ret = P2pGetGroupCapability(deviceAddress.c_str(), &capacity);
1313     if (ret == WIFI_IDL_OPT_OK) {
1314         cap = capacity;
1315     }
1316     return ret;
1317 }
1318 
ReqP2pAddService(const WifiP2pServiceInfo & info) const1319 WifiErrorNo WifiIdlClient::ReqP2pAddService(const WifiP2pServiceInfo &info) const
1320 {
1321     CHECK_CLIENT_NOT_NULL;
1322     WifiErrorNo ret = WIFI_IDL_OPT_OK;
1323     HidlP2pServiceInfo servInfo = {0};
1324     std::vector<std::string> queryList = info.GetQueryList();
1325     for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1326         std::vector<std::string> vec;
1327         SplitString(*iter, " ", vec);
1328         if (vec.size() < WIFI_IDL_P2P_SERVICE_TYPE_MIN_SIZE) {
1329             return WIFI_IDL_OPT_FAILED;
1330         }
1331         if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1332             return WIFI_IDL_OPT_FAILED;
1333         }
1334         const std::string &tmp = vec[WIFI_IDL_P2P_SERVICE_TYPE_2_POS];
1335         if (vec[0] == "upnp") {
1336             servInfo.mode = 0;
1337             servInfo.version = atoi(vec[1].c_str());
1338             if (strncpy_s(servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1339                 return WIFI_IDL_OPT_FAILED;
1340             }
1341             ret = P2pAddService(&servInfo);
1342         } else if (vec[0] == "bonjour") {
1343             servInfo.mode = 1;
1344             if (strncpy_s(servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK ||
1345                 strncpy_s(servInfo.resp, sizeof(servInfo.resp), tmp.c_str(), tmp.length()) != EOK) {
1346                 return WIFI_IDL_OPT_FAILED;
1347             }
1348             ret = P2pAddService(&servInfo);
1349         } else {
1350             ret = WIFI_IDL_OPT_FAILED;
1351         }
1352         if (ret != WIFI_IDL_OPT_OK) {
1353             break;
1354         }
1355     }
1356     return ret;
1357 }
1358 
ReqP2pRemoveService(const WifiP2pServiceInfo & info) const1359 WifiErrorNo WifiIdlClient::ReqP2pRemoveService(const WifiP2pServiceInfo &info) const
1360 {
1361     CHECK_CLIENT_NOT_NULL;
1362     WifiErrorNo ret = WIFI_IDL_OPT_OK;
1363     HidlP2pServiceInfo servInfo = {0};
1364     std::vector<std::string> queryList = info.GetQueryList();
1365     for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1366         std::vector<std::string> vec;
1367         SplitString(*iter, " ", vec);
1368         if (vec.size() < WIFI_IDL_P2P_SERVICE_TYPE_MIN_SIZE) {
1369             return WIFI_IDL_OPT_FAILED;
1370         }
1371         if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1372             return WIFI_IDL_OPT_FAILED;
1373         }
1374         const std::string &tmp = vec[WIFI_IDL_P2P_SERVICE_TYPE_2_POS];
1375         if (vec[0] == "upnp") {
1376             servInfo.mode = 0;
1377             servInfo.version = atoi(vec[1].c_str());
1378             if (strncpy_s(servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1379                 return WIFI_IDL_OPT_FAILED;
1380             }
1381             ret = P2pRemoveService(&servInfo);
1382         } else if (vec[0] == "bonjour") {
1383             servInfo.mode = 1;
1384             if (strncpy_s(servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK) {
1385                 return WIFI_IDL_OPT_FAILED;
1386             }
1387             ret = P2pRemoveService(&servInfo);
1388         } else {
1389             ret = WIFI_IDL_OPT_FAILED;
1390         }
1391         if (ret != WIFI_IDL_OPT_OK) {
1392             break;
1393         }
1394     }
1395     return ret;
1396 }
1397 
ReqP2pReqServiceDiscovery(const std::string & deviceAddress,const std::vector<unsigned char> & tlvs,std::string & reqID) const1398 WifiErrorNo WifiIdlClient::ReqP2pReqServiceDiscovery(
1399     const std::string &deviceAddress, const std::vector<unsigned char> &tlvs, std::string &reqID) const
1400 {
1401     CHECK_CLIENT_NOT_NULL;
1402     if (deviceAddress.size() != WIFI_IDL_BSSID_LENGTH || tlvs.empty()) {
1403         return WIFI_IDL_OPT_INVALID_PARAM;
1404     }
1405     unsigned size = (tlvs.size() << 1) + 1;
1406     char *pTlvs = (char *)calloc(size, sizeof(char));
1407     if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1408         free(pTlvs);
1409         return WIFI_IDL_OPT_FAILED;
1410     }
1411     char retBuf[WIFI_IDL_P2P_TMP_BUFFER_SIZE_128] = {0};
1412     WifiErrorNo ret = P2pReqServiceDiscovery(deviceAddress.c_str(), pTlvs, retBuf, sizeof(retBuf));
1413     if (ret == WIFI_IDL_OPT_OK) {
1414         reqID = retBuf;
1415     }
1416     free(pTlvs);
1417     return ret;
1418 }
1419 
ReqP2pCancelServiceDiscovery(const std::string & id) const1420 WifiErrorNo WifiIdlClient::ReqP2pCancelServiceDiscovery(const std::string &id) const
1421 {
1422     CHECK_CLIENT_NOT_NULL;
1423     return P2pCancelServiceDiscovery(id.c_str());
1424 }
1425 
ReqP2pSetRandomMac(bool enable) const1426 WifiErrorNo WifiIdlClient::ReqP2pSetRandomMac(bool enable) const
1427 {
1428     CHECK_CLIENT_NOT_NULL;
1429     int flag = enable;
1430     return P2pSetRandomMac(flag);
1431 }
1432 
ReqP2pSetMiracastType(int type) const1433 WifiErrorNo WifiIdlClient::ReqP2pSetMiracastType(int type) const
1434 {
1435     CHECK_CLIENT_NOT_NULL;
1436     return P2pSetMiracastType(type);
1437 }
1438 
ReqSetPersistentReconnect(int mode) const1439 WifiErrorNo WifiIdlClient::ReqSetPersistentReconnect(int mode) const
1440 {
1441     CHECK_CLIENT_NOT_NULL;
1442     return P2pSetPersistentReconnect(mode);
1443 }
1444 
ReqRespServiceDiscovery(const WifiP2pDevice & device,int frequency,int dialogToken,const std::vector<unsigned char> & tlvs) const1445 WifiErrorNo WifiIdlClient::ReqRespServiceDiscovery(
1446     const WifiP2pDevice &device, int frequency, int dialogToken, const std::vector<unsigned char> &tlvs) const
1447 {
1448     CHECK_CLIENT_NOT_NULL;
1449     if (tlvs.empty()) {
1450         return WIFI_IDL_OPT_INVALID_PARAM;
1451     }
1452     unsigned size = (tlvs.size() << 1) + 1;
1453     char *pTlvs = (char *)calloc(size, sizeof(char));
1454     if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1455         free(pTlvs);
1456         return WIFI_IDL_OPT_FAILED;
1457     }
1458     WifiErrorNo ret = P2pRespServerDiscovery(device.GetDeviceAddress().c_str(), frequency, dialogToken, pTlvs);
1459     free(pTlvs);
1460     return ret;
1461 }
1462 
ReqSetServiceDiscoveryExternal(bool isExternalProcess) const1463 WifiErrorNo WifiIdlClient::ReqSetServiceDiscoveryExternal(bool isExternalProcess) const
1464 {
1465     CHECK_CLIENT_NOT_NULL;
1466     return P2pSetServDiscExternal(isExternalProcess);
1467 }
1468 
ReqGetP2pPeer(const std::string & deviceAddress,WifiP2pDevice & device) const1469 WifiErrorNo WifiIdlClient::ReqGetP2pPeer(const std::string &deviceAddress, WifiP2pDevice &device) const
1470 {
1471     CHECK_CLIENT_NOT_NULL;
1472     HidlP2pDeviceInfo peerInfo;
1473     if (memset_s(&peerInfo, sizeof(peerInfo), 0, sizeof(peerInfo)) != EOK) {
1474         return WIFI_IDL_OPT_FAILED;
1475     }
1476     WifiErrorNo ret = P2pGetPeer(deviceAddress.c_str(), &peerInfo);
1477     if (ret == WIFI_IDL_OPT_OK) {
1478         device.SetDeviceAddress(peerInfo.p2pDeviceAddress);
1479         device.SetDeviceName(peerInfo.deviceName);
1480         device.SetPrimaryDeviceType(peerInfo.primaryDeviceType);
1481         device.SetWpsConfigMethod(peerInfo.configMethods);
1482         device.SetDeviceCapabilitys(peerInfo.deviceCapabilities);
1483         device.SetGroupCapabilitys(peerInfo.groupCapabilities);
1484     }
1485     return ret;
1486 }
1487 
ReqP2pGetSupportFrequencies(int band,std::vector<int> & frequencies) const1488 WifiErrorNo WifiIdlClient::ReqP2pGetSupportFrequencies(int band, std::vector<int> &frequencies) const
1489 {
1490     CHECK_CLIENT_NOT_NULL;
1491     int values[WIFI_IDL_GET_MAX_BANDS] = {0};
1492     int size = WIFI_IDL_GET_MAX_BANDS;
1493 
1494     if (P2pGetFrequencies(band, values, &size) != 0) {
1495         return WIFI_IDL_OPT_FAILED;
1496     }
1497 
1498     for (int i = 0; i < size; i++) {
1499         frequencies.push_back(values[i]);
1500     }
1501 
1502     return WIFI_IDL_OPT_OK;
1503 }
1504 
PushP2pGroupConfigString(HidlP2pGroupConfig * pConfig,P2pGroupConfigType type,const std::string & str) const1505 int WifiIdlClient::PushP2pGroupConfigString(
1506     HidlP2pGroupConfig *pConfig, P2pGroupConfigType type, const std::string &str) const
1507 {
1508     if (str.length() > 0) {
1509         pConfig->cfgParam = type;
1510         if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), str.c_str(), str.length()) != EOK) {
1511             return 0;
1512         }
1513         return 1;
1514     } else {
1515         return 0;
1516     }
1517 }
1518 
PushP2pGroupConfigInt(HidlP2pGroupConfig * pConfig,P2pGroupConfigType type,int i) const1519 int WifiIdlClient::PushP2pGroupConfigInt(HidlP2pGroupConfig *pConfig, P2pGroupConfigType type, int i) const
1520 {
1521     pConfig->cfgParam = type;
1522     if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
1523         return 0;
1524     }
1525     return 1;
1526 }
1527 
ReqP2pSetGroupConfig(int networkId,const IdlP2pGroupConfig & config) const1528 WifiErrorNo WifiIdlClient::ReqP2pSetGroupConfig(int networkId, const IdlP2pGroupConfig &config) const
1529 {
1530     CHECK_CLIENT_NOT_NULL;
1531     HidlP2pGroupConfig conf[GROUP_CONFIG_END_POS];
1532     if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
1533         return WIFI_IDL_OPT_FAILED;
1534     }
1535     int num = 0;
1536     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_SSID, config.ssid);
1537     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_BSSID, config.bssid);
1538     // If the PSK length is less than 8 or greater than 63, Do not set this psk field.
1539     if (config.psk.length() >= WIFI_IDL_PSK_MIN_LENGTH && config.psk.length() < WIFI_IDL_PSK_MAX_LENGTH) {
1540         std::string tmp = "\"" + config.psk + "\"";
1541         num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, tmp);
1542     } else if (config.psk.length() == WIFI_IDL_PSK_MAX_LENGTH) {
1543         num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, config.psk);
1544     }
1545     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PROTO, config.proto);
1546     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_KEY_MGMT, config.keyMgmt);
1547     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PAIRWISE, config.pairwise);
1548     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_AUTH_ALG, config.authAlg);
1549 
1550     num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_MODE, config.mode);
1551     num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_DISABLED, config.disabled);
1552     if (num == 0) {
1553         return WIFI_IDL_OPT_OK;
1554     }
1555     return P2pSetGroupConfig(networkId, conf, num);
1556 }
1557 
ReqP2pGetGroupConfig(int networkId,IdlP2pGroupConfig & config) const1558 WifiErrorNo WifiIdlClient::ReqP2pGetGroupConfig(int networkId, IdlP2pGroupConfig &config) const
1559 {
1560     CHECK_CLIENT_NOT_NULL;
1561     HidlP2pGroupConfig confs[GROUP_CONFIG_END_POS];
1562     if (memset_s(confs, sizeof(confs), 0, sizeof(confs)) != EOK) {
1563         return WIFI_IDL_OPT_FAILED;
1564     }
1565     int size = static_cast<P2pGroupConfigType>(GROUP_CONFIG_SSID);
1566     for (; size < GROUP_CONFIG_END_POS; size++) {
1567         confs[size].cfgParam = static_cast<P2pGroupConfigType>(size);
1568     }
1569     if (P2pGetGroupConfig(networkId, confs, size) != 0) {
1570         return WIFI_IDL_OPT_FAILED;
1571     }
1572     config.ssid = confs[GROUP_CONFIG_SSID].cfgValue;
1573     config.bssid = confs[GROUP_CONFIG_BSSID].cfgValue;
1574     config.psk = confs[GROUP_CONFIG_PSK].cfgValue;
1575     config.proto = confs[GROUP_CONFIG_PROTO].cfgValue;
1576     config.keyMgmt = confs[GROUP_CONFIG_KEY_MGMT].cfgValue;
1577     config.pairwise = confs[GROUP_CONFIG_PAIRWISE].cfgValue;
1578     config.authAlg = confs[GROUP_CONFIG_AUTH_ALG].cfgValue;
1579     config.mode = atoi(confs[GROUP_CONFIG_MODE].cfgValue);
1580     config.disabled = atoi(confs[GROUP_CONFIG_DISABLED].cfgValue);
1581     return WIFI_IDL_OPT_OK;
1582 }
1583 
ReqP2pAddNetwork(int & networkId) const1584 WifiErrorNo WifiIdlClient::ReqP2pAddNetwork(int &networkId) const
1585 {
1586     CHECK_CLIENT_NOT_NULL;
1587     return P2pAddNetwork(&networkId);
1588 }
1589 
ReqP2pHid2dConnect(const Hid2dConnectConfig & config) const1590 WifiErrorNo WifiIdlClient::ReqP2pHid2dConnect(const Hid2dConnectConfig &config) const
1591 {
1592     CHECK_CLIENT_NOT_NULL;
1593     Hid2dConnectInfo info;
1594     if (memset_s(&info, sizeof(info), 0, sizeof(info)) != EOK) {
1595         return WIFI_IDL_OPT_FAILED;
1596     }
1597     if (strncpy_s(info.ssid, sizeof(info.ssid), config.GetSsid().c_str(), config.GetSsid().length()) != EOK) {
1598         return WIFI_IDL_OPT_FAILED;
1599     }
1600     if (strncpy_s(info.bssid, sizeof(info.bssid), config.GetBssid().c_str(), config.GetBssid().length()) != EOK) {
1601         return WIFI_IDL_OPT_FAILED;
1602     }
1603     if (strncpy_s(info.passphrase, sizeof(info.passphrase),
1604         config.GetPreSharedKey().c_str(), config.GetPreSharedKey().length()) != EOK) {
1605         return WIFI_IDL_OPT_FAILED;
1606     }
1607     info.frequency = config.GetFrequency();
1608     WifiErrorNo ret = Hid2dConnect(&info);
1609     return ret;
1610 }
1611 }  // namespace Wifi
1612 }  // namespace OHOS