1f1549183Sopenharmony_ciFrom cfc04fdab06a83cae0737b5a1b8ca8f6dfc21fbf Mon Sep 17 00:00:00 2001
2f1549183Sopenharmony_ciFrom: zhaoshenghua <zhaoshenghua1@huawei.com>
3f1549183Sopenharmony_ciDate: Thu, 15 Aug 2024 19:27:45 +0800
4f1549183Sopenharmony_ciSubject: [PATCH 2/4] callback
5f1549183Sopenharmony_ci
6f1549183Sopenharmony_ciChange-Id: Ib59d9795eb4d154e06dc2615285cbd86f7683bb7
7f1549183Sopenharmony_ciSigned-off-by: zhaoshenghua <zhaoshenghua1@huawei.com>
8f1549183Sopenharmony_ci---
9f1549183Sopenharmony_ci wifi/frameworks/cj/BUILD.gn                |   1 +
10f1549183Sopenharmony_ci wifi/frameworks/cj/include/ffi_structs.h   |   6 +-
11f1549183Sopenharmony_ci wifi/frameworks/cj/include/wifi_callback.h |  80 +++
12f1549183Sopenharmony_ci wifi/frameworks/cj/include/wifi_ffi.h      |   2 +-
13f1549183Sopenharmony_ci wifi/frameworks/cj/src/wifi_callback.cpp   | 534 +++++++++++++++++++++
14f1549183Sopenharmony_ci wifi/frameworks/cj/src/wifi_ffi.cpp        |  15 +-
15f1549183Sopenharmony_ci 6 files changed, 631 insertions(+), 7 deletions(-)
16f1549183Sopenharmony_ci create mode 100644 wifi/frameworks/cj/include/wifi_callback.h
17f1549183Sopenharmony_ci create mode 100644 wifi/frameworks/cj/src/wifi_callback.cpp
18f1549183Sopenharmony_ci
19f1549183Sopenharmony_cidiff --git a/wifi/frameworks/cj/BUILD.gn b/wifi/frameworks/cj/BUILD.gn
20f1549183Sopenharmony_ciindex 71fed17cc..a83ae447e 100644
21f1549183Sopenharmony_ci--- a/wifi/frameworks/cj/BUILD.gn
22f1549183Sopenharmony_ci+++ b/wifi/frameworks/cj/BUILD.gn
23f1549183Sopenharmony_ci@@ -39,6 +39,7 @@ ohos_shared_library("cj_wifi_ffi") {
24f1549183Sopenharmony_ci 
25f1549183Sopenharmony_ci   sources = [
26f1549183Sopenharmony_ci     "src/wifi_ffi.cpp",
27f1549183Sopenharmony_ci+    "src/wifi_callback.cpp",
28f1549183Sopenharmony_ci   ]
29f1549183Sopenharmony_ci 
30f1549183Sopenharmony_ci   deps = [ "$WIFI_ROOT_DIR/frameworks/native:wifi_sdk" ]
31f1549183Sopenharmony_cidiff --git a/wifi/frameworks/cj/include/ffi_structs.h b/wifi/frameworks/cj/include/ffi_structs.h
32f1549183Sopenharmony_ciindex ca174fecf..e1f0d9b23 100644
33f1549183Sopenharmony_ci--- a/wifi/frameworks/cj/include/ffi_structs.h
34f1549183Sopenharmony_ci+++ b/wifi/frameworks/cj/include/ffi_structs.h
35f1549183Sopenharmony_ci@@ -45,14 +45,14 @@ extern "C" {
36f1549183Sopenharmony_ci         int32_t supportedWifiCategory;
37f1549183Sopenharmony_ci         bool isHiLinkNetwork;
38f1549183Sopenharmony_ci     };
39f1549183Sopenharmony_ci-    
40f1549183Sopenharmony_ci+
41f1549183Sopenharmony_ci     struct WifiScanInfoArr
42f1549183Sopenharmony_ci     {
43f1549183Sopenharmony_ci         CWifiScanInfo *head;
44f1549183Sopenharmony_ci         int64_t size;
45f1549183Sopenharmony_ci     };
46f1549183Sopenharmony_ci 
47f1549183Sopenharmony_ci-    // TODO figure out clientCert
48f1549183Sopenharmony_ci+    // TODO figure out clientCertAlias
49f1549183Sopenharmony_ci     struct CWifiEapConfig
50f1549183Sopenharmony_ci     {
51f1549183Sopenharmony_ci         int32_t eapMethod;                        /* EAP authentication mode:PEAP/TLS/TTLS/PWD/SIM/AKA/AKA' */
52f1549183Sopenharmony_ci@@ -112,7 +112,7 @@ extern "C" {
53f1549183Sopenharmony_ci         char *groupName;
54f1549183Sopenharmony_ci         int32_t netId;
55f1549183Sopenharmony_ci         int32_t goBand;
56f1549183Sopenharmony_ci-        int32_t deviceAddressType;        
57f1549183Sopenharmony_ci+        int32_t deviceAddressType;
58f1549183Sopenharmony_ci     };
59f1549183Sopenharmony_ci 
60f1549183Sopenharmony_ci     struct CWifiP2PLinkedInfo
61f1549183Sopenharmony_cidiff --git a/wifi/frameworks/cj/include/wifi_callback.h b/wifi/frameworks/cj/include/wifi_callback.h
62f1549183Sopenharmony_cinew file mode 100644
63f1549183Sopenharmony_ciindex 000000000..7039f9605
64f1549183Sopenharmony_ci--- /dev/null
65f1549183Sopenharmony_ci+++ b/wifi/frameworks/cj/include/wifi_callback.h
66f1549183Sopenharmony_ci@@ -0,0 +1,80 @@
67f1549183Sopenharmony_ci+/*
68f1549183Sopenharmony_ci+ * Copyright (c) 2024 Huawei Device Co., Ltd.
69f1549183Sopenharmony_ci+ * Licensed under the Apache License, Version 2.0 (the "License");
70f1549183Sopenharmony_ci+ * you may not use this file except in compliance with the License.
71f1549183Sopenharmony_ci+ * You may obtain a copy of the License at
72f1549183Sopenharmony_ci+ *
73f1549183Sopenharmony_ci+ *     http://www.apache.org/licenses/LICENSE-2.0
74f1549183Sopenharmony_ci+ *
75f1549183Sopenharmony_ci+ * Unless required by applicable law or agreed to in writing, software
76f1549183Sopenharmony_ci+ * distributed under the License is distributed on an "AS IS" BASIS,
77f1549183Sopenharmony_ci+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78f1549183Sopenharmony_ci+ * See the License for the specific language governing permissions and
79f1549183Sopenharmony_ci+ * limitations under the License.
80f1549183Sopenharmony_ci+ */
81f1549183Sopenharmony_ci+
82f1549183Sopenharmony_ci+#include <shared_mutex>
83f1549183Sopenharmony_ci+
84f1549183Sopenharmony_ci+#include "ffi_structs.h"
85f1549183Sopenharmony_ci+#include "wifi_errcode.h"
86f1549183Sopenharmony_ci+#include "wifi_p2p.h"
87f1549183Sopenharmony_ci+#include "wifi_hotspot.h"
88f1549183Sopenharmony_ci+#include "wifi_logger.h"
89f1549183Sopenharmony_ci+#include "wifi_sa_event.h"
90f1549183Sopenharmony_ci+
91f1549183Sopenharmony_ci+namespace OHOS::Wifi {
92f1549183Sopenharmony_ci+
93f1549183Sopenharmony_ci+class CjWifiAbilityStatusChange : public WifiAbilityStatusChange {
94f1549183Sopenharmony_ci+public:
95f1549183Sopenharmony_ci+    void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
96f1549183Sopenharmony_ci+};
97f1549183Sopenharmony_ci+
98f1549183Sopenharmony_ci+class CjEventRegister {
99f1549183Sopenharmony_ci+public:
100f1549183Sopenharmony_ci+    CjEventRegister()
101f1549183Sopenharmony_ci+    {
102f1549183Sopenharmony_ci+        int32_t ret;
103f1549183Sopenharmony_ci+        auto samgrProxy = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
104f1549183Sopenharmony_ci+        if (samgrProxy == nullptr) {
105f1549183Sopenharmony_ci+            return;
106f1549183Sopenharmony_ci+        }
107f1549183Sopenharmony_ci+        mSaStatusListener = new OHOS::Wifi::CjWifiAbilityStatusChange();
108f1549183Sopenharmony_ci+        if (mSaStatusListener == nullptr) {
109f1549183Sopenharmony_ci+            return;
110f1549183Sopenharmony_ci+        }
111f1549183Sopenharmony_ci+        ret = samgrProxy->SubscribeSystemAbility((int32_t)WIFI_DEVICE_ABILITY_ID, mSaStatusListener);
112f1549183Sopenharmony_ci+        samgrProxy->SubscribeSystemAbility((int32_t)WIFI_SCAN_ABILITY_ID, mSaStatusListener);
113f1549183Sopenharmony_ci+        samgrProxy->SubscribeSystemAbility((int32_t)WIFI_HOTSPOT_ABILITY_ID, mSaStatusListener);
114f1549183Sopenharmony_ci+        samgrProxy->SubscribeSystemAbility((int32_t)WIFI_P2P_ABILITY_ID, mSaStatusListener);
115f1549183Sopenharmony_ci+    }
116f1549183Sopenharmony_ci+    ~CjEventRegister()
117f1549183Sopenharmony_ci+    {}
118f1549183Sopenharmony_ci+
119f1549183Sopenharmony_ci+    static CjEventRegister& GetInstance();
120f1549183Sopenharmony_ci+
121f1549183Sopenharmony_ci+    int32_t Register(const std::string& type, void (* callback)());
122f1549183Sopenharmony_ci+    int32_t UnRegister(const std::string& type);
123f1549183Sopenharmony_ci+    ErrCode RegisterDeviceEvents(const std::vector<std::string> &event);
124f1549183Sopenharmony_ci+    ErrCode RegisterScanEvents(const std::vector<std::string> &event);
125f1549183Sopenharmony_ci+    ErrCode RegisterHotspotEvents(const std::vector<std::string> &event);
126f1549183Sopenharmony_ci+    ErrCode RegisterP2PEvents(const std::vector<std::string> &event);
127f1549183Sopenharmony_ci+
128f1549183Sopenharmony_ci+private:
129f1549183Sopenharmony_ci+    // std::function<void(int32_t)> wifiStateChange{nullptr};
130f1549183Sopenharmony_ci+    // std::function<void(int32_t)> wifiConnectionChange{nullptr};
131f1549183Sopenharmony_ci+    // std::function<void(int32_t)> wifiRssiChange{nullptr};
132f1549183Sopenharmony_ci+    // std::function<void(int32_t)> wifiScanStateChange{nullptr};
133f1549183Sopenharmony_ci+    // std::function<void(int32_t)> hotspotStateChange{nullptr};
134f1549183Sopenharmony_ci+    // std::function<void(int32_t)> p2pStateChange{nullptr};
135f1549183Sopenharmony_ci+    // std::function<void(CWifiP2PLinkedInfo)> p2pConnectionChange{nullptr};
136f1549183Sopenharmony_ci+    // std::function<void(CWifiP2pDevice)> p2pDeviceChange{nullptr};
137f1549183Sopenharmony_ci+    // std::function<void(WifiP2pDeviceArr)> p2pPeerDeviceChange{nullptr};
138f1549183Sopenharmony_ci+    // std::function<void()> p2pPersistentGroupChange{nullptr};
139f1549183Sopenharmony_ci+    // std::function<void(int32_t)> p2pDiscoveryChange{nullptr};
140f1549183Sopenharmony_ci+    OHOS::sptr<OHOS::ISystemAbilityStatusChange> mSaStatusListener = nullptr;
141f1549183Sopenharmony_ci+};
142f1549183Sopenharmony_ci+
143f1549183Sopenharmony_ci+
144f1549183Sopenharmony_ci+
145f1549183Sopenharmony_ci+
146f1549183Sopenharmony_ci+}
147f1549183Sopenharmony_ci\ No newline at end of file
148f1549183Sopenharmony_cidiff --git a/wifi/frameworks/cj/include/wifi_ffi.h b/wifi/frameworks/cj/include/wifi_ffi.h
149f1549183Sopenharmony_ciindex 5525813ed..f7f59dcb9 100644
150f1549183Sopenharmony_ci--- a/wifi/frameworks/cj/include/wifi_ffi.h
151f1549183Sopenharmony_ci+++ b/wifi/frameworks/cj/include/wifi_ffi.h
152f1549183Sopenharmony_ci@@ -72,7 +72,7 @@ FFI_EXPORT int32_t CJ_CreateGroup(CWifiP2PConfig &cfg);
153f1549183Sopenharmony_ci FFI_EXPORT int32_t CJ_GetLinkedInfo(CWifiLinkedInfo &info);
154f1549183Sopenharmony_ci FFI_EXPORT int32_t CJ_AddCandidateConfig(CWifiDeviceConfig cfg, int32_t &ret);
155f1549183Sopenharmony_ci FFI_EXPORT WifiDeviceConfigArr CJ_GetCandidateConfigs(int32_t &code);
156f1549183Sopenharmony_ci-FFI_EXPORT int32_t CJ_WifiOn(char *type, int64_t id);
157f1549183Sopenharmony_ci+FFI_EXPORT int32_t CJ_WifiOn(char *type, void (*callback)());
158f1549183Sopenharmony_ci FFI_EXPORT int32_t CJ_WifiOff(char* type);
159f1549183Sopenharmony_ci }
160f1549183Sopenharmony_ci 
161f1549183Sopenharmony_cidiff --git a/wifi/frameworks/cj/src/wifi_callback.cpp b/wifi/frameworks/cj/src/wifi_callback.cpp
162f1549183Sopenharmony_cinew file mode 100644
163f1549183Sopenharmony_ciindex 000000000..cbd564eb0
164f1549183Sopenharmony_ci--- /dev/null
165f1549183Sopenharmony_ci+++ b/wifi/frameworks/cj/src/wifi_callback.cpp
166f1549183Sopenharmony_ci@@ -0,0 +1,534 @@
167f1549183Sopenharmony_ci+/*
168f1549183Sopenharmony_ci+ * Copyright (c) 2024 Huawei Device Co., Ltd.
169f1549183Sopenharmony_ci+ * Licensed under the Apache License, Version 2.0 (the "License");
170f1549183Sopenharmony_ci+ * you may not use this file except in compliance with the License.
171f1549183Sopenharmony_ci+ * You may obtain a copy of the License at
172f1549183Sopenharmony_ci+ *
173f1549183Sopenharmony_ci+ *     http://www.apache.org/licenses/LICENSE-2.0
174f1549183Sopenharmony_ci+ *
175f1549183Sopenharmony_ci+ * Unless required by applicable law or agreed to in writing, software
176f1549183Sopenharmony_ci+ * distributed under the License is distributed on an "AS IS" BASIS,
177f1549183Sopenharmony_ci+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
178f1549183Sopenharmony_ci+ * See the License for the specific language governing permissions and
179f1549183Sopenharmony_ci+ * limitations under the License.
180f1549183Sopenharmony_ci+ */
181f1549183Sopenharmony_ci+
182f1549183Sopenharmony_ci+#include "wifi_callback.h"
183f1549183Sopenharmony_ci+
184f1549183Sopenharmony_ci+#include "ffi_structs.h"
185f1549183Sopenharmony_ci+#include "accesstoken_kit.h"
186f1549183Sopenharmony_ci+#include "ipc_skeleton.h"
187f1549183Sopenharmony_ci+#include "wifi_device.h"
188f1549183Sopenharmony_ci+#include "wifi_logger.h"
189f1549183Sopenharmony_ci+#include "wifi_scan.h"
190f1549183Sopenharmony_ci+#include "cj_lambda.h"
191f1549183Sopenharmony_ci+
192f1549183Sopenharmony_ci+DEFINE_WIFILOG_LABEL("CJ_Wifi_Callback");
193f1549183Sopenharmony_ci+
194f1549183Sopenharmony_ci+namespace OHOS::Wifi {
195f1549183Sopenharmony_ci+
196f1549183Sopenharmony_ci+std::shared_ptr<WifiDevice> g_cjWifiStaPtr = WifiDevice::GetInstance(WIFI_DEVICE_ABILITY_ID);
197f1549183Sopenharmony_ci+std::shared_ptr<WifiScan> g_cjWifiScanPtr = WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
198f1549183Sopenharmony_ci+std::shared_ptr<WifiHotspot> g_cjWifiHotspotPtr = WifiHotspot::GetInstance(WIFI_HOTSPOT_ABILITY_ID);
199f1549183Sopenharmony_ci+std::shared_ptr<WifiP2p> g_cjWifiP2pPtr = WifiP2p::GetInstance(WIFI_P2P_ABILITY_ID);
200f1549183Sopenharmony_ci+
201f1549183Sopenharmony_ci+CjEventRegister& CjEventRegister::GetInstance()
202f1549183Sopenharmony_ci+{
203f1549183Sopenharmony_ci+    static CjEventRegister inst;
204f1549183Sopenharmony_ci+    return inst;
205f1549183Sopenharmony_ci+}
206f1549183Sopenharmony_ci+
207f1549183Sopenharmony_ci+class CjWifiDeviceEventCallback : public IWifiDeviceCallBack {
208f1549183Sopenharmony_ci+public:
209f1549183Sopenharmony_ci+    CjWifiDeviceEventCallback() {
210f1549183Sopenharmony_ci+    }
211f1549183Sopenharmony_ci+
212f1549183Sopenharmony_ci+    virtual ~CjWifiDeviceEventCallback() {
213f1549183Sopenharmony_ci+    }
214f1549183Sopenharmony_ci+
215f1549183Sopenharmony_ci+public:
216f1549183Sopenharmony_ci+    void OnWifiStateChanged(int state) override
217f1549183Sopenharmony_ci+    {
218f1549183Sopenharmony_ci+        WIFI_LOGI("OnWifiStateChanged event: %{public}d [0:DISABLING, 1:DISABLED, 2:ENABLING, 3:ENABLED]",
219f1549183Sopenharmony_ci+            state);
220f1549183Sopenharmony_ci+        if (wifiStateChange == nullptr) {
221f1549183Sopenharmony_ci+            WIFI_LOGI("OnWifiStateChanged not registered");
222f1549183Sopenharmony_ci+            return;
223f1549183Sopenharmony_ci+        }
224f1549183Sopenharmony_ci+        if (m_wifiStateConvertMap.find(state) == m_wifiStateConvertMap.end()) {
225f1549183Sopenharmony_ci+            WIFI_LOGW("not find state.");
226f1549183Sopenharmony_ci+            return;
227f1549183Sopenharmony_ci+        }
228f1549183Sopenharmony_ci+        wifiStateChange(m_wifiStateConvertMap[state]);
229f1549183Sopenharmony_ci+    }
230f1549183Sopenharmony_ci+
231f1549183Sopenharmony_ci+    void OnWifiConnectionChanged(int state, const WifiLinkedInfo &info) override
232f1549183Sopenharmony_ci+    {
233f1549183Sopenharmony_ci+        WIFI_LOGI("OnWifiConnectionChanged event: %{public}d [4:CONNECTED, 6:DISCONNECTED, 7:SPECIAL_CONNECT]", state);
234f1549183Sopenharmony_ci+        if (wifiConnectionChange == nullptr) {
235f1549183Sopenharmony_ci+            WIFI_LOGI("OnWifiConnectionChanged not registered");
236f1549183Sopenharmony_ci+            return;
237f1549183Sopenharmony_ci+        }
238f1549183Sopenharmony_ci+        if (m_connectStateConvertMap.find(state) == m_connectStateConvertMap.end()) {
239f1549183Sopenharmony_ci+            WIFI_LOGW("not find connect state.");
240f1549183Sopenharmony_ci+            return;
241f1549183Sopenharmony_ci+        }
242f1549183Sopenharmony_ci+        wifiConnectionChange(m_connectStateConvertMap[state]);
243f1549183Sopenharmony_ci+    }
244f1549183Sopenharmony_ci+
245f1549183Sopenharmony_ci+    void OnWifiRssiChanged(int rssi) override
246f1549183Sopenharmony_ci+    {
247f1549183Sopenharmony_ci+        WIFI_LOGI("OnWifiRssiChanged event: %{public}d", rssi);
248f1549183Sopenharmony_ci+        if (wifiRssiChange == nullptr) {
249f1549183Sopenharmony_ci+            WIFI_LOGI("OnWifiConnectionChanged not registered");
250f1549183Sopenharmony_ci+            return;
251f1549183Sopenharmony_ci+        }
252f1549183Sopenharmony_ci+        wifiRssiChange(rssi);
253f1549183Sopenharmony_ci+    }
254f1549183Sopenharmony_ci+
255f1549183Sopenharmony_ci+    void OnWifiWpsStateChanged(int state, const std::string &pinCode) override
256f1549183Sopenharmony_ci+    {
257f1549183Sopenharmony_ci+    }
258f1549183Sopenharmony_ci+
259f1549183Sopenharmony_ci+    void OnStreamChanged(int direction) override
260f1549183Sopenharmony_ci+    {
261f1549183Sopenharmony_ci+    }
262f1549183Sopenharmony_ci+
263f1549183Sopenharmony_ci+    void OnDeviceConfigChanged(ConfigChange value) override
264f1549183Sopenharmony_ci+    {
265f1549183Sopenharmony_ci+    }
266f1549183Sopenharmony_ci+
267f1549183Sopenharmony_ci+    OHOS::sptr<OHOS::IRemoteObject> AsObject() override
268f1549183Sopenharmony_ci+    {
269f1549183Sopenharmony_ci+        return nullptr;
270f1549183Sopenharmony_ci+    }
271f1549183Sopenharmony_ci+
272f1549183Sopenharmony_ci+    void SetCallback(const std::string &type, void (* callback)(int32_t))
273f1549183Sopenharmony_ci+    {
274f1549183Sopenharmony_ci+        if (type == EVENT_STA_POWER_STATE_CHANGE) {
275f1549183Sopenharmony_ci+            wifiStateChange = CJLambda::Create(callback);
276f1549183Sopenharmony_ci+        }
277f1549183Sopenharmony_ci+        if (type == EVENT_STA_CONN_STATE_CHANGE) {
278f1549183Sopenharmony_ci+            wifiConnectionChange = CJLambda::Create(callback);
279f1549183Sopenharmony_ci+        }
280f1549183Sopenharmony_ci+        if (type == EVENT_STA_RSSI_STATE_CHANGE) {
281f1549183Sopenharmony_ci+            wifiRssiChange = CJLambda::Create(callback);
282f1549183Sopenharmony_ci+        }
283f1549183Sopenharmony_ci+    }
284f1549183Sopenharmony_ci+private:
285f1549183Sopenharmony_ci+
286f1549183Sopenharmony_ci+    std::function<void(int32_t)> wifiStateChange{nullptr};
287f1549183Sopenharmony_ci+    std::function<void(int32_t)> wifiConnectionChange{nullptr};
288f1549183Sopenharmony_ci+    std::function<void(int32_t)> wifiRssiChange{nullptr};
289f1549183Sopenharmony_ci+
290f1549183Sopenharmony_ci+    enum class JsLayerWifiState {
291f1549183Sopenharmony_ci+        DISABLED = 0,
292f1549183Sopenharmony_ci+        ENABLED = 1,
293f1549183Sopenharmony_ci+        ENABLING = 2,
294f1549183Sopenharmony_ci+        DISABLING = 3
295f1549183Sopenharmony_ci+    };
296f1549183Sopenharmony_ci+
297f1549183Sopenharmony_ci+    enum class JsLayerConnectStatus {
298f1549183Sopenharmony_ci+        DISCONNECTED = 0,
299f1549183Sopenharmony_ci+        CONNECTED = 1,
300f1549183Sopenharmony_ci+        SPECIAL_CONNECT = 2,
301f1549183Sopenharmony_ci+    };
302f1549183Sopenharmony_ci+
303f1549183Sopenharmony_ci+    enum class JsLayerStreamDirection {
304f1549183Sopenharmony_ci+        STREAM_DIRECTION_NONE = 0,
305f1549183Sopenharmony_ci+        STREAM_DIRECTION_DOWN = 1,
306f1549183Sopenharmony_ci+        STREAM_DIRECTION_UP = 2,
307f1549183Sopenharmony_ci+        STREAM_DIRECTION_UPDOWN = 3
308f1549183Sopenharmony_ci+    };
309f1549183Sopenharmony_ci+
310f1549183Sopenharmony_ci+    std::map<int, int> m_wifiStateConvertMap = {
311f1549183Sopenharmony_ci+        { static_cast<int>(WifiState::DISABLING), static_cast<int>(JsLayerWifiState::DISABLING) },
312f1549183Sopenharmony_ci+        { static_cast<int>(WifiState::DISABLED), static_cast<int>(JsLayerWifiState::DISABLED) },
313f1549183Sopenharmony_ci+        { static_cast<int>(WifiState::ENABLING), static_cast<int>(JsLayerWifiState::ENABLING) },
314f1549183Sopenharmony_ci+        { static_cast<int>(WifiState::ENABLED), static_cast<int>(JsLayerWifiState::ENABLED) },
315f1549183Sopenharmony_ci+    };
316f1549183Sopenharmony_ci+
317f1549183Sopenharmony_ci+    std::map<int, int> m_connectStateConvertMap = {
318f1549183Sopenharmony_ci+        { static_cast<int>(ConnState::CONNECTED), static_cast<int>(JsLayerConnectStatus::CONNECTED) },
319f1549183Sopenharmony_ci+        { static_cast<int>(ConnState::DISCONNECTED), static_cast<int>(JsLayerConnectStatus::DISCONNECTED) },
320f1549183Sopenharmony_ci+        { static_cast<int>(ConnState::SPECIAL_CONNECT), static_cast<int>(JsLayerConnectStatus::SPECIAL_CONNECT) },
321f1549183Sopenharmony_ci+    };
322f1549183Sopenharmony_ci+
323f1549183Sopenharmony_ci+    std::map<int, int> m_streamDirectionConvertMap = {
324f1549183Sopenharmony_ci+        { static_cast<int>(StreamDirection::STREAM_DIRECTION_NONE),
325f1549183Sopenharmony_ci+            static_cast<int>(JsLayerStreamDirection::STREAM_DIRECTION_NONE) },
326f1549183Sopenharmony_ci+        { static_cast<int>(StreamDirection::STREAM_DIRECTION_DOWN),
327f1549183Sopenharmony_ci+            static_cast<int>(JsLayerStreamDirection::STREAM_DIRECTION_DOWN) },
328f1549183Sopenharmony_ci+        { static_cast<int>(StreamDirection::STREAM_DIRECTION_UP),
329f1549183Sopenharmony_ci+            static_cast<int>(JsLayerStreamDirection::STREAM_DIRECTION_UP) },
330f1549183Sopenharmony_ci+        { static_cast<int>(StreamDirection::STREAM_DIRECTION_UPDOWN),
331f1549183Sopenharmony_ci+            static_cast<int>(JsLayerStreamDirection::STREAM_DIRECTION_UPDOWN) },
332f1549183Sopenharmony_ci+    };
333f1549183Sopenharmony_ci+};
334f1549183Sopenharmony_ci+
335f1549183Sopenharmony_ci+class CjWifiScanEventCallback : public IWifiScanCallback {
336f1549183Sopenharmony_ci+public:
337f1549183Sopenharmony_ci+    CjWifiScanEventCallback() {
338f1549183Sopenharmony_ci+    }
339f1549183Sopenharmony_ci+
340f1549183Sopenharmony_ci+    virtual ~CjWifiScanEventCallback() {
341f1549183Sopenharmony_ci+    }
342f1549183Sopenharmony_ci+
343f1549183Sopenharmony_ci+public:
344f1549183Sopenharmony_ci+    void OnWifiScanStateChanged(int state) override
345f1549183Sopenharmony_ci+    {
346f1549183Sopenharmony_ci+        WIFI_LOGI("scan received state changed event: %{public}d", state);
347f1549183Sopenharmony_ci+        if (wifiScanStateChange == nullptr) {
348f1549183Sopenharmony_ci+            WIFI_LOGI("OnWifiScanStateChanged not registered");
349f1549183Sopenharmony_ci+            return;
350f1549183Sopenharmony_ci+        }
351f1549183Sopenharmony_ci+        wifiScanStateChange(state);
352f1549183Sopenharmony_ci+    }
353f1549183Sopenharmony_ci+
354f1549183Sopenharmony_ci+    OHOS::sptr<OHOS::IRemoteObject> AsObject() override
355f1549183Sopenharmony_ci+    {
356f1549183Sopenharmony_ci+        return nullptr;
357f1549183Sopenharmony_ci+    }
358f1549183Sopenharmony_ci+
359f1549183Sopenharmony_ci+    void SetScanStateChange(void (* callback)(int32_t))
360f1549183Sopenharmony_ci+    {
361f1549183Sopenharmony_ci+        wifiScanStateChange = CJLambda::Create(callback);
362f1549183Sopenharmony_ci+    }
363f1549183Sopenharmony_ci+private:
364f1549183Sopenharmony_ci+    std::function<void(int32_t)> wifiScanStateChange{nullptr};
365f1549183Sopenharmony_ci+};
366f1549183Sopenharmony_ci+
367f1549183Sopenharmony_ci+class CjWifiHotspotEventCallback : public IWifiHotspotCallback {
368f1549183Sopenharmony_ci+public:
369f1549183Sopenharmony_ci+    CjWifiHotspotEventCallback() {
370f1549183Sopenharmony_ci+    }
371f1549183Sopenharmony_ci+
372f1549183Sopenharmony_ci+    virtual ~CjWifiHotspotEventCallback() {
373f1549183Sopenharmony_ci+    }
374f1549183Sopenharmony_ci+
375f1549183Sopenharmony_ci+public:
376f1549183Sopenharmony_ci+    void OnHotspotStateChanged(int state) override
377f1549183Sopenharmony_ci+    {
378f1549183Sopenharmony_ci+        WIFI_LOGI("Hotspot received state changed event: %{public}d", state);
379f1549183Sopenharmony_ci+        if (hotspotStateChange == nullptr) {
380f1549183Sopenharmony_ci+            WIFI_LOGI("OnHotspotStateChanged not registered");
381f1549183Sopenharmony_ci+            return;
382f1549183Sopenharmony_ci+        }
383f1549183Sopenharmony_ci+        if (m_apStateConvertMap.find(state) == m_apStateConvertMap.end()) {
384f1549183Sopenharmony_ci+            return;
385f1549183Sopenharmony_ci+        }
386f1549183Sopenharmony_ci+        hotspotStateChange(m_apStateConvertMap[state]);
387f1549183Sopenharmony_ci+    }
388f1549183Sopenharmony_ci+
389f1549183Sopenharmony_ci+    void OnHotspotStaJoin(const StationInfo &info) override
390f1549183Sopenharmony_ci+    {
391f1549183Sopenharmony_ci+    }
392f1549183Sopenharmony_ci+
393f1549183Sopenharmony_ci+    void OnHotspotStaLeave(const StationInfo &info) override
394f1549183Sopenharmony_ci+    {
395f1549183Sopenharmony_ci+    }
396f1549183Sopenharmony_ci+
397f1549183Sopenharmony_ci+    void SetHotspotStateChanged(void (* callback)(int32_t))
398f1549183Sopenharmony_ci+    {
399f1549183Sopenharmony_ci+        hotspotStateChange = CJLambda::Create(callback);
400f1549183Sopenharmony_ci+    }
401f1549183Sopenharmony_ci+
402f1549183Sopenharmony_ci+    OHOS::sptr<OHOS::IRemoteObject> AsObject() override
403f1549183Sopenharmony_ci+    {
404f1549183Sopenharmony_ci+        return nullptr;
405f1549183Sopenharmony_ci+    }
406f1549183Sopenharmony_ci+private:
407f1549183Sopenharmony_ci+    std::function<void(int32_t)> hotspotStateChange{nullptr};
408f1549183Sopenharmony_ci+
409f1549183Sopenharmony_ci+    enum class JsLayerApState {
410f1549183Sopenharmony_ci+        DISABLED = 0,
411f1549183Sopenharmony_ci+        ENABLED = 1,
412f1549183Sopenharmony_ci+        ENABLING = 2,
413f1549183Sopenharmony_ci+        DISABLING = 3
414f1549183Sopenharmony_ci+    };
415f1549183Sopenharmony_ci+
416f1549183Sopenharmony_ci+    std::map<int, int> m_apStateConvertMap = {
417f1549183Sopenharmony_ci+        { static_cast<int>(ApState::AP_STATE_STARTING), static_cast<int>(JsLayerApState::ENABLING) },
418f1549183Sopenharmony_ci+        { static_cast<int>(ApState::AP_STATE_STARTED), static_cast<int>(JsLayerApState::ENABLED) },
419f1549183Sopenharmony_ci+        { static_cast<int>(ApState::AP_STATE_CLOSING), static_cast<int>(JsLayerApState::DISABLING) },
420f1549183Sopenharmony_ci+        { static_cast<int>(ApState::AP_STATE_CLOSED), static_cast<int>(JsLayerApState::DISABLED) },
421f1549183Sopenharmony_ci+    };
422f1549183Sopenharmony_ci+};
423f1549183Sopenharmony_ci+
424f1549183Sopenharmony_ci+class CjWifiP2pEventCallback : public IWifiP2pCallback {
425f1549183Sopenharmony_ci+public:
426f1549183Sopenharmony_ci+    CjWifiP2pEventCallback() {
427f1549183Sopenharmony_ci+    }
428f1549183Sopenharmony_ci+
429f1549183Sopenharmony_ci+    virtual ~CjWifiP2pEventCallback() {
430f1549183Sopenharmony_ci+    }
431f1549183Sopenharmony_ci+
432f1549183Sopenharmony_ci+public:
433f1549183Sopenharmony_ci+    void OnP2pStateChanged(int state) override
434f1549183Sopenharmony_ci+    {
435f1549183Sopenharmony_ci+        WIFI_LOGI("received p2p state changed event: %{public}d", state);
436f1549183Sopenharmony_ci+        if (p2pStateChange == nullptr) {
437f1549183Sopenharmony_ci+            WIFI_LOGI("OnP2pStateChanged not registered");
438f1549183Sopenharmony_ci+            return;
439f1549183Sopenharmony_ci+        }
440f1549183Sopenharmony_ci+        p2pStateChange(state);
441f1549183Sopenharmony_ci+    }
442f1549183Sopenharmony_ci+
443f1549183Sopenharmony_ci+    void OnP2pPersistentGroupsChanged(void) override
444f1549183Sopenharmony_ci+    {
445f1549183Sopenharmony_ci+        WIFI_LOGI("received persistent group changed event");
446f1549183Sopenharmony_ci+        if (p2pPersistentGroupChange == nullptr) {
447f1549183Sopenharmony_ci+            WIFI_LOGI("OnP2pPersistentGroupsChanged not registered");
448f1549183Sopenharmony_ci+            return;
449f1549183Sopenharmony_ci+        }
450f1549183Sopenharmony_ci+        p2pPersistentGroupChange();
451f1549183Sopenharmony_ci+    }
452f1549183Sopenharmony_ci+
453f1549183Sopenharmony_ci+    void OnP2pThisDeviceChanged(const WifiP2pDevice& device) override
454f1549183Sopenharmony_ci+    {
455f1549183Sopenharmony_ci+        WIFI_LOGI("received this device changed event");
456f1549183Sopenharmony_ci+        if (p2pDeviceChange == nullptr) {
457f1549183Sopenharmony_ci+            WIFI_LOGI("OnP2pThisDeviceChanged not registered");
458f1549183Sopenharmony_ci+            return;
459f1549183Sopenharmony_ci+        }
460f1549183Sopenharmony_ci+        CWifiP2pDevice cdevice;
461f1549183Sopenharmony_ci+        cdevice.deviceName = const_cast<char*>(device.GetDeviceName().c_str());
462f1549183Sopenharmony_ci+        cdevice.deviceAddress = const_cast<char*>(device.GetDeviceAddress().c_str());
463f1549183Sopenharmony_ci+        cdevice.primaryDeviceType = const_cast<char*>(device.GetPrimaryDeviceType().c_str());
464f1549183Sopenharmony_ci+        cdevice.deviceStatus = static_cast<int32_t>(device.GetP2pDeviceStatus());
465f1549183Sopenharmony_ci+        cdevice.groupCapabilities = device.GetGroupCapabilitys();
466f1549183Sopenharmony_ci+        cdevice.deviceAddressType = device.GetDeviceAddressType();
467f1549183Sopenharmony_ci+        p2pDeviceChange(cdevice);
468f1549183Sopenharmony_ci+    }
469f1549183Sopenharmony_ci+
470f1549183Sopenharmony_ci+    void OnP2pPeersChanged(const std::vector<WifiP2pDevice>& devices) override
471f1549183Sopenharmony_ci+    {
472f1549183Sopenharmony_ci+        WIFI_LOGI("received p2p peers changed event, devices count: %{public}d", static_cast<int>(devices.size()));
473f1549183Sopenharmony_ci+        if (p2pPeerDeviceChange == nullptr) {
474f1549183Sopenharmony_ci+            WIFI_LOGI("OnP2pPeersChanged not registered");
475f1549183Sopenharmony_ci+            return;
476f1549183Sopenharmony_ci+        }
477f1549183Sopenharmony_ci+        int64_t size = static_cast<int64_t>(devices.size());
478f1549183Sopenharmony_ci+        if (size <= 0) {
479f1549183Sopenharmony_ci+            return;
480f1549183Sopenharmony_ci+        }
481f1549183Sopenharmony_ci+        CWifiP2pDevice cdevices[size];
482f1549183Sopenharmony_ci+        WifiP2pDeviceArr arr{.head = cdevices, .size = size};
483f1549183Sopenharmony_ci+        uint32_t idx = 0;
484f1549183Sopenharmony_ci+        for (auto& each : devices) {
485f1549183Sopenharmony_ci+            cdevices[idx].deviceName = const_cast<char*>(each.GetDeviceName().c_str());
486f1549183Sopenharmony_ci+            cdevices[idx].deviceAddress = const_cast<char*>(each.GetDeviceAddress().c_str());
487f1549183Sopenharmony_ci+            cdevices[idx].primaryDeviceType = const_cast<char*>(each.GetPrimaryDeviceType().c_str());
488f1549183Sopenharmony_ci+            cdevices[idx].deviceStatus = static_cast<int32_t>(each.GetP2pDeviceStatus());
489f1549183Sopenharmony_ci+            cdevices[idx].groupCapabilities = each.GetGroupCapabilitys();
490f1549183Sopenharmony_ci+            cdevices[idx].deviceAddressType = each.GetDeviceAddressType();
491f1549183Sopenharmony_ci+            idx++;
492f1549183Sopenharmony_ci+        }
493f1549183Sopenharmony_ci+        p2pPeerDeviceChange(arr);
494f1549183Sopenharmony_ci+    }
495f1549183Sopenharmony_ci+
496f1549183Sopenharmony_ci+    void OnP2pServicesChanged(const std::vector<WifiP2pServiceInfo>& srvInfo) override
497f1549183Sopenharmony_ci+    {
498f1549183Sopenharmony_ci+    }
499f1549183Sopenharmony_ci+
500f1549183Sopenharmony_ci+    void OnP2pConnectionChanged(const WifiP2pLinkedInfo& info) override
501f1549183Sopenharmony_ci+    {
502f1549183Sopenharmony_ci+        WIFI_LOGI("received p2p connection changed event, state: %{public}d",
503f1549183Sopenharmony_ci+            static_cast<int>(info.GetConnectState()));
504f1549183Sopenharmony_ci+        if (p2pConnectionChange == nullptr) {
505f1549183Sopenharmony_ci+            WIFI_LOGI("OnP2pConnectionChanged not registered");
506f1549183Sopenharmony_ci+            return;
507f1549183Sopenharmony_ci+        }
508f1549183Sopenharmony_ci+        CWifiP2PLinkedInfo cinfo;
509f1549183Sopenharmony_ci+        cinfo.connectState = static_cast<int32_t>(info.GetConnectState());
510f1549183Sopenharmony_ci+        cinfo.isGroupOwner = info.IsGroupOwner();
511f1549183Sopenharmony_ci+        cinfo.groupOwnerAddr = const_cast<char*>(info.GetGroupOwnerAddress().c_str());
512f1549183Sopenharmony_ci+        p2pConnectionChange(cinfo);
513f1549183Sopenharmony_ci+    }
514f1549183Sopenharmony_ci+
515f1549183Sopenharmony_ci+    void OnP2pDiscoveryChanged(bool isChange) override
516f1549183Sopenharmony_ci+    {
517f1549183Sopenharmony_ci+        WIFI_LOGI("received discovery state changed event");
518f1549183Sopenharmony_ci+        if (p2pDiscoveryChange == nullptr) {
519f1549183Sopenharmony_ci+            WIFI_LOGI("OnP2pDiscoveryChanged not registered");
520f1549183Sopenharmony_ci+            return;
521f1549183Sopenharmony_ci+        }
522f1549183Sopenharmony_ci+        p2pDiscoveryChange(static_cast<int32_t>(isChange));
523f1549183Sopenharmony_ci+    }
524f1549183Sopenharmony_ci+
525f1549183Sopenharmony_ci+    void OnP2pActionResult(P2pActionCallback action, ErrCode code) override
526f1549183Sopenharmony_ci+    {
527f1549183Sopenharmony_ci+    }
528f1549183Sopenharmony_ci+
529f1549183Sopenharmony_ci+    void OnConfigChanged(CfgType type, char* data, int dataLen) override
530f1549183Sopenharmony_ci+    {
531f1549183Sopenharmony_ci+    }
532f1549183Sopenharmony_ci+
533f1549183Sopenharmony_ci+    void OnP2pGcJoinGroup(const OHOS::Wifi::GcInfo &info) override
534f1549183Sopenharmony_ci+    {
535f1549183Sopenharmony_ci+    }
536f1549183Sopenharmony_ci+
537f1549183Sopenharmony_ci+    void OnP2pGcLeaveGroup(const OHOS::Wifi::GcInfo &info) override
538f1549183Sopenharmony_ci+    {
539f1549183Sopenharmony_ci+    }
540f1549183Sopenharmony_ci+
541f1549183Sopenharmony_ci+    void OnP2pPrivatePeersChanged(const std::string &priWfdInfo) override
542f1549183Sopenharmony_ci+    {
543f1549183Sopenharmony_ci+    }
544f1549183Sopenharmony_ci+
545f1549183Sopenharmony_ci+    OHOS::sptr<OHOS::IRemoteObject> AsObject() override
546f1549183Sopenharmony_ci+    {
547f1549183Sopenharmony_ci+        return nullptr;
548f1549183Sopenharmony_ci+    }
549f1549183Sopenharmony_ci+
550f1549183Sopenharmony_ci+    void SetCallback(const std::string &type, void (* callback)())
551f1549183Sopenharmony_ci+    {
552f1549183Sopenharmony_ci+        if (type == EVENT_P2P_STATE_CHANGE) {
553f1549183Sopenharmony_ci+            p2pStateChange = CJLambda::Create(reinterpret_cast<void (*)(int32_t)>(callback));
554f1549183Sopenharmony_ci+        }
555f1549183Sopenharmony_ci+        if (type == EVENT_P2P_PERSISTENT_GROUP_CHANGE) {
556f1549183Sopenharmony_ci+            p2pPersistentGroupChange = CJLambda::Create(callback);
557f1549183Sopenharmony_ci+        }
558f1549183Sopenharmony_ci+        if (type == EVENT_P2P_DEVICE_STATE_CHANGE) {
559f1549183Sopenharmony_ci+            p2pDeviceChange = CJLambda::Create(reinterpret_cast<void (*)(CWifiP2pDevice)>(callback));
560f1549183Sopenharmony_ci+        }
561f1549183Sopenharmony_ci+        if (type == EVENT_P2P_PEER_DEVICE_CHANGE) {
562f1549183Sopenharmony_ci+            p2pPeerDeviceChange = CJLambda::Create(reinterpret_cast<void (*)(WifiP2pDeviceArr)>(callback));
563f1549183Sopenharmony_ci+        }
564f1549183Sopenharmony_ci+        if (type == EVENT_P2P_CONN_STATE_CHANGE) {
565f1549183Sopenharmony_ci+            p2pConnectionChange = CJLambda::Create(reinterpret_cast<void (*)(CWifiP2PLinkedInfo)>(callback));
566f1549183Sopenharmony_ci+        }
567f1549183Sopenharmony_ci+        if (type == EVENT_P2P_DISCOVERY_CHANGE) {
568f1549183Sopenharmony_ci+            p2pDiscoveryChange = CJLambda::Create(reinterpret_cast<void (*)(int32_t)>(callback));
569f1549183Sopenharmony_ci+        }
570f1549183Sopenharmony_ci+    }
571f1549183Sopenharmony_ci+private:
572f1549183Sopenharmony_ci+    std::function<void(int32_t)> p2pStateChange{nullptr};
573f1549183Sopenharmony_ci+    std::function<void(CWifiP2PLinkedInfo)> p2pConnectionChange{nullptr};
574f1549183Sopenharmony_ci+    std::function<void(CWifiP2pDevice)> p2pDeviceChange{nullptr};
575f1549183Sopenharmony_ci+    std::function<void(WifiP2pDeviceArr)> p2pPeerDeviceChange{nullptr};
576f1549183Sopenharmony_ci+    std::function<void()> p2pPersistentGroupChange{nullptr};
577f1549183Sopenharmony_ci+    std::function<void(int32_t)> p2pDiscoveryChange{nullptr};
578f1549183Sopenharmony_ci+};
579f1549183Sopenharmony_ci+
580f1549183Sopenharmony_ci+sptr<CjWifiDeviceEventCallback> cjWifiDeviceCallback =
581f1549183Sopenharmony_ci+    sptr<CjWifiDeviceEventCallback>(new (std::nothrow) CjWifiDeviceEventCallback());
582f1549183Sopenharmony_ci+
583f1549183Sopenharmony_ci+sptr<CjWifiScanEventCallback> cjWifiScanCallback =
584f1549183Sopenharmony_ci+    sptr<CjWifiScanEventCallback>(new (std::nothrow) CjWifiScanEventCallback());
585f1549183Sopenharmony_ci+
586f1549183Sopenharmony_ci+sptr<CjWifiHotspotEventCallback> cjWifiHotspotCallback =
587f1549183Sopenharmony_ci+    sptr<CjWifiHotspotEventCallback>(new (std::nothrow) CjWifiHotspotEventCallback());
588f1549183Sopenharmony_ci+
589f1549183Sopenharmony_ci+sptr<CjWifiP2pEventCallback> cjWifiP2pCallback =
590f1549183Sopenharmony_ci+    sptr<CjWifiP2pEventCallback>(new (std::nothrow) CjWifiP2pEventCallback());
591f1549183Sopenharmony_ci+
592f1549183Sopenharmony_ci+int32_t CjEventRegister::Register(const std::string& type, void (* callback)())
593f1549183Sopenharmony_ci+{
594f1549183Sopenharmony_ci+    WIFI_LOGI("Register event: %{public}s", type.c_str());
595f1549183Sopenharmony_ci+    std::vector<std::string> event = {type};
596f1549183Sopenharmony_ci+
597f1549183Sopenharmony_ci+    if (type == EVENT_STA_POWER_STATE_CHANGE || type == EVENT_STA_CONN_STATE_CHANGE
598f1549183Sopenharmony_ci+        || type == EVENT_STA_RSSI_STATE_CHANGE) {
599f1549183Sopenharmony_ci+            cjWifiDeviceCallback->SetCallback(type, reinterpret_cast<void (*)(int32_t)>(callback));
600f1549183Sopenharmony_ci+            CjEventRegister::GetInstance().RegisterDeviceEvents(event);
601f1549183Sopenharmony_ci+    }
602f1549183Sopenharmony_ci+
603f1549183Sopenharmony_ci+    if (type == EVENT_STA_SCAN_STATE_CHANGE) {
604f1549183Sopenharmony_ci+        cjWifiScanCallback->SetScanStateChange(reinterpret_cast<void (*)(int32_t)>(callback));
605f1549183Sopenharmony_ci+        CjEventRegister::GetInstance().RegisterScanEvents(event);
606f1549183Sopenharmony_ci+    }
607f1549183Sopenharmony_ci+
608f1549183Sopenharmony_ci+    if (type == EVENT_HOTSPOT_STATE_CHANGE) {
609f1549183Sopenharmony_ci+        cjWifiHotspotCallback->SetHotspotStateChanged(reinterpret_cast<void (*)(int32_t)>(callback));
610f1549183Sopenharmony_ci+        CjEventRegister::GetInstance().RegisterHotspotEvents(event);
611f1549183Sopenharmony_ci+    }
612f1549183Sopenharmony_ci+
613f1549183Sopenharmony_ci+    if (type == EVENT_P2P_STATE_CHANGE || type == EVENT_P2P_PERSISTENT_GROUP_CHANGE ||
614f1549183Sopenharmony_ci+        type == EVENT_P2P_DEVICE_STATE_CHANGE || type == EVENT_P2P_PEER_DEVICE_CHANGE ||
615f1549183Sopenharmony_ci+        type == EVENT_P2P_CONN_STATE_CHANGE || type == EVENT_P2P_DISCOVERY_CHANGE) {
616f1549183Sopenharmony_ci+        cjWifiP2pCallback->SetCallback(type, callback);
617f1549183Sopenharmony_ci+        CjEventRegister::GetInstance().RegisterP2PEvents(event);
618f1549183Sopenharmony_ci+    }
619f1549183Sopenharmony_ci+    return WIFI_OPT_SUCCESS;
620f1549183Sopenharmony_ci+}
621f1549183Sopenharmony_ci+
622f1549183Sopenharmony_ci+int32_t CjEventRegister::UnRegister(const std::string& type)
623f1549183Sopenharmony_ci+{
624f1549183Sopenharmony_ci+    return WIFI_OPT_SUCCESS;
625f1549183Sopenharmony_ci+}
626f1549183Sopenharmony_ci+
627f1549183Sopenharmony_ci+ErrCode CjEventRegister::RegisterDeviceEvents(const std::vector<std::string> &event)
628f1549183Sopenharmony_ci+{
629f1549183Sopenharmony_ci+    if (g_cjWifiStaPtr == nullptr) {
630f1549183Sopenharmony_ci+        WIFI_LOGE("Register sta event get instance failed!");
631f1549183Sopenharmony_ci+        return WIFI_OPT_FAILED;
632f1549183Sopenharmony_ci+    }
633f1549183Sopenharmony_ci+    return g_cjWifiStaPtr->RegisterCallBack(cjWifiDeviceCallback, event);
634f1549183Sopenharmony_ci+}
635f1549183Sopenharmony_ci+
636f1549183Sopenharmony_ci+ErrCode CjEventRegister::RegisterScanEvents(const std::vector<std::string> &event)
637f1549183Sopenharmony_ci+{
638f1549183Sopenharmony_ci+    if (g_cjWifiScanPtr == nullptr) {
639f1549183Sopenharmony_ci+        WIFI_LOGE("Register scan event get instance failed!");
640f1549183Sopenharmony_ci+        return WIFI_OPT_FAILED;
641f1549183Sopenharmony_ci+    }
642f1549183Sopenharmony_ci+    return g_cjWifiScanPtr->RegisterCallBack(cjWifiScanCallback, event);
643f1549183Sopenharmony_ci+}
644f1549183Sopenharmony_ci+
645f1549183Sopenharmony_ci+ErrCode CjEventRegister::RegisterHotspotEvents(const std::vector<std::string> &event)
646f1549183Sopenharmony_ci+{
647f1549183Sopenharmony_ci+    if (g_cjWifiHotspotPtr == nullptr) {
648f1549183Sopenharmony_ci+        WIFI_LOGE("Register hotspot event get instance failed!");
649f1549183Sopenharmony_ci+        return WIFI_OPT_FAILED;
650f1549183Sopenharmony_ci+    }
651f1549183Sopenharmony_ci+    return g_cjWifiHotspotPtr->RegisterCallBack(cjWifiHotspotCallback, event);
652f1549183Sopenharmony_ci+}
653f1549183Sopenharmony_ci+
654f1549183Sopenharmony_ci+ErrCode CjEventRegister::RegisterP2PEvents(const std::vector<std::string> &event)
655f1549183Sopenharmony_ci+{
656f1549183Sopenharmony_ci+    if (g_cjWifiP2pPtr == nullptr) {
657f1549183Sopenharmony_ci+        WIFI_LOGE("Register p2p event get instance failed!");
658f1549183Sopenharmony_ci+        return WIFI_OPT_FAILED;
659f1549183Sopenharmony_ci+    }
660f1549183Sopenharmony_ci+    return g_cjWifiP2pPtr->RegisterCallBack(cjWifiP2pCallback, event);
661f1549183Sopenharmony_ci+}
662f1549183Sopenharmony_ci+
663f1549183Sopenharmony_ci+void CjWifiAbilityStatusChange::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
664f1549183Sopenharmony_ci+{
665f1549183Sopenharmony_ci+    WIFI_LOGI("OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
666f1549183Sopenharmony_ci+    std::vector<std::string> event;
667f1549183Sopenharmony_ci+    switch (systemAbilityId) {
668f1549183Sopenharmony_ci+        case WIFI_DEVICE_ABILITY_ID: {
669f1549183Sopenharmony_ci+            event.push_back(EVENT_STA_POWER_STATE_CHANGE);
670f1549183Sopenharmony_ci+            event.push_back(EVENT_STA_CONN_STATE_CHANGE);
671f1549183Sopenharmony_ci+            event.push_back(EVENT_STA_RSSI_STATE_CHANGE);
672f1549183Sopenharmony_ci+            CjEventRegister::GetInstance().RegisterDeviceEvents(event);
673f1549183Sopenharmony_ci+            break;
674f1549183Sopenharmony_ci+        }
675f1549183Sopenharmony_ci+        case WIFI_SCAN_ABILITY_ID: {
676f1549183Sopenharmony_ci+            event.push_back(EVENT_STA_SCAN_STATE_CHANGE);
677f1549183Sopenharmony_ci+            CjEventRegister::GetInstance().RegisterScanEvents(event);
678f1549183Sopenharmony_ci+            break;
679f1549183Sopenharmony_ci+        }
680f1549183Sopenharmony_ci+        case WIFI_HOTSPOT_ABILITY_ID: {
681f1549183Sopenharmony_ci+            event.push_back(EVENT_HOTSPOT_STATE_CHANGE);
682f1549183Sopenharmony_ci+            CjEventRegister::GetInstance().RegisterHotspotEvents(event);
683f1549183Sopenharmony_ci+            break;
684f1549183Sopenharmony_ci+        }
685f1549183Sopenharmony_ci+        case WIFI_P2P_ABILITY_ID: {
686f1549183Sopenharmony_ci+            event.push_back(EVENT_P2P_STATE_CHANGE);
687f1549183Sopenharmony_ci+            event.push_back(EVENT_P2P_PERSISTENT_GROUP_CHANGE);
688f1549183Sopenharmony_ci+            event.push_back(EVENT_P2P_DEVICE_STATE_CHANGE);
689f1549183Sopenharmony_ci+            event.push_back(EVENT_P2P_PEER_DEVICE_CHANGE);
690f1549183Sopenharmony_ci+            event.push_back(EVENT_P2P_CONN_STATE_CHANGE);
691f1549183Sopenharmony_ci+            event.push_back(EVENT_P2P_DISCOVERY_CHANGE);
692f1549183Sopenharmony_ci+            CjEventRegister::GetInstance().RegisterP2PEvents(event);
693f1549183Sopenharmony_ci+            break;
694f1549183Sopenharmony_ci+        }
695f1549183Sopenharmony_ci+        default:
696f1549183Sopenharmony_ci+            WIFI_LOGI("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
697f1549183Sopenharmony_ci+            return;
698f1549183Sopenharmony_ci+    }
699f1549183Sopenharmony_ci+}
700f1549183Sopenharmony_ci+}
701f1549183Sopenharmony_ci\ No newline at end of file
702f1549183Sopenharmony_cidiff --git a/wifi/frameworks/cj/src/wifi_ffi.cpp b/wifi/frameworks/cj/src/wifi_ffi.cpp
703f1549183Sopenharmony_ciindex 2673fee55..3b1346526 100644
704f1549183Sopenharmony_ci--- a/wifi/frameworks/cj/src/wifi_ffi.cpp
705f1549183Sopenharmony_ci+++ b/wifi/frameworks/cj/src/wifi_ffi.cpp
706f1549183Sopenharmony_ci@@ -22,6 +22,7 @@
707f1549183Sopenharmony_ci #include "wifi_p2p.h"
708f1549183Sopenharmony_ci #include "wifi_common_util.h"
709f1549183Sopenharmony_ci #include "wifi_logger.h"
710f1549183Sopenharmony_ci+#include "wifi_callback.h"
711f1549183Sopenharmony_ci 
712f1549183Sopenharmony_ci DEFINE_WIFILOG_LABEL("CJ_WIFI_FFI");
713f1549183Sopenharmony_ci 
714f1549183Sopenharmony_ci@@ -721,14 +722,22 @@ WifiDeviceConfigArr CJ_GetCandidateConfigs(int32_t &code)
715f1549183Sopenharmony_ci     return arr;
716f1549183Sopenharmony_ci }
717f1549183Sopenharmony_ci 
718f1549183Sopenharmony_ci-int32_t CJ_WifiOn(char *type, int64_t id)
719f1549183Sopenharmony_ci+int32_t CJ_WifiOn(char *type, void (*callback)())
720f1549183Sopenharmony_ci {
721f1549183Sopenharmony_ci-    return 0;
722f1549183Sopenharmony_ci+    std::string eventType(type);
723f1549183Sopenharmony_ci+    if (eventType.empty()) {
724f1549183Sopenharmony_ci+        return WIFI_OPT_FAILED;
725f1549183Sopenharmony_ci+    }
726f1549183Sopenharmony_ci+    return CjEventRegister::GetInstance().Register(eventType, callback);
727f1549183Sopenharmony_ci }
728f1549183Sopenharmony_ci 
729f1549183Sopenharmony_ci int32_t CJ_WifiOff(char* type)
730f1549183Sopenharmony_ci {
731f1549183Sopenharmony_ci-    return 0;
732f1549183Sopenharmony_ci+    std::string eventType(type);
733f1549183Sopenharmony_ci+    if (eventType.empty()) {
734f1549183Sopenharmony_ci+        return WIFI_OPT_FAILED;
735f1549183Sopenharmony_ci+    }
736f1549183Sopenharmony_ci+    return CjEventRegister::GetInstance().UnRegister(eventType);
737f1549183Sopenharmony_ci }
738f1549183Sopenharmony_ci 
739f1549183Sopenharmony_ci }
740f1549183Sopenharmony_ci-- 
741f1549183Sopenharmony_ci2.34.1
742f1549183Sopenharmony_ci
743