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_internal_event_dispatcher_lite.h"
17 #include "wifi_logger.h"
18 #include "wifi_permission_helper.h"
19 #include "wifi_errcode.h"
20 #include "wifi_common_event_helper.h"
21 #include "wifi_common_util.h"
22 #include "wifi_config_center.h"
23 #include "wifi_settings.h"
24 
25 DEFINE_WIFILOG_LABEL("WifiInternalEventDispatcher");
26 
27 namespace OHOS {
28 namespace Wifi {
GetInstance()29 WifiInternalEventDispatcher &WifiInternalEventDispatcher::GetInstance()
30 {
31     static WifiInternalEventDispatcher gWifiEventBroadcast;
32     return gWifiEventBroadcast;
33 }
34 
WifiInternalEventDispatcher()35 WifiInternalEventDispatcher::WifiInternalEventDispatcher() : mRunFlag(true)
36 {}
37 
~WifiInternalEventDispatcher()38 WifiInternalEventDispatcher::~WifiInternalEventDispatcher()
39 {}
40 
Init()41 int WifiInternalEventDispatcher::Init()
42 {
43     /* first init system notify service client here ! */
44 
45     mBroadcastThread = std::thread(WifiInternalEventDispatcher::Run, std::ref(*this));
46     pthread_setname_np(mBroadcastThread.native_handle(), "InnerDisThread");
47     return 0;
48 }
49 
SendSystemNotifyMsg()50 int WifiInternalEventDispatcher::SendSystemNotifyMsg() /* parameters */
51 {
52     return 0;
53 }
54 
SetSingleStaCallback(const std::shared_ptr<IWifiDeviceCallBack> & callback,const std::string & eventName,int instId)55 int WifiInternalEventDispatcher::SetSingleStaCallback(const std::shared_ptr<IWifiDeviceCallBack> &callback,
56     const std::string &eventName, int instId)
57 {
58     auto iter = g_staCallBackNameEventIdMap.find(eventName);
59     if (iter == g_staCallBackNameEventIdMap.end()) {
60         WIFI_LOGE("SetSingleStaCallback: Not find event! eventName:%{public}s", eventName.c_str());
61         return 1;
62     }
63     mStaSingleCallbackEvent.emplace(iter->second);
64     mStaSingleCallback = callback;
65     return 0;
66 }
67 
GetSingleStaCallback() const68 std::shared_ptr<IWifiDeviceCallBack> WifiInternalEventDispatcher::GetSingleStaCallback() const
69 {
70     return mStaSingleCallback;
71 }
72 
GetStaSingleCallbackEvent()73 std::unordered_set<int>& WifiInternalEventDispatcher::GetStaSingleCallbackEvent()
74 {
75     return mStaSingleCallbackEvent;
76 }
77 
SetSingleScanCallback(const std::shared_ptr<IWifiScanCallback> & callback,const std::string & eventName,int instId)78 int WifiInternalEventDispatcher::SetSingleScanCallback(const std::shared_ptr<IWifiScanCallback> &callback,
79     const std::string &eventName, int instId)
80 {
81     auto iter = g_staCallBackNameEventIdMap.find(eventName);
82     if (iter == g_staCallBackNameEventIdMap.end()) {
83         WIFI_LOGE("SetSingleScanCallback: Not find event! eventName:%{public}s", eventName.c_str());
84         return 1;
85     }
86     mScanSingleCallbackEvent.emplace(iter->second);
87     mScanSingleCallback = callback;
88     return 0;
89 }
90 
GetSingleScanCallback() const91 std::shared_ptr<IWifiScanCallback> WifiInternalEventDispatcher::GetSingleScanCallback() const
92 {
93     return mScanSingleCallback;
94 }
95 
GetScanSingleCallbackEvent()96 std::unordered_set<int>& WifiInternalEventDispatcher::GetScanSingleCallbackEvent()
97 {
98     return mScanSingleCallbackEvent;
99 }
100 
AddBroadCastMsg(const WifiEventCallbackMsg & msg)101 int WifiInternalEventDispatcher::AddBroadCastMsg(const WifiEventCallbackMsg &msg)
102 {
103     WIFI_LOGD("WifiInternalEventDispatcher::AddBroadCastMsg, msgcode %{public}d", msg.msgCode);
104     {
105         std::unique_lock<std::mutex> lock(mMutex);
106         mEventQue.push_back(msg);
107     }
108     mCondition.notify_one();
109     return 0;
110 }
111 
Exit()112 void WifiInternalEventDispatcher::Exit()
113 {
114     if (!mRunFlag) {
115         return;
116     }
117     mRunFlag = false;
118     mCondition.notify_one();
119     if (mBroadcastThread.joinable()) {
120         mBroadcastThread.join();
121     }
122 }
123 
DealStaCallbackMsg(WifiInternalEventDispatcher & instance,const WifiEventCallbackMsg & msg)124 void WifiInternalEventDispatcher::DealStaCallbackMsg(
125     WifiInternalEventDispatcher &instance, const WifiEventCallbackMsg &msg)
126 {
127     WIFI_LOGD("Deal Sta Event Callback Msg: %{public}d", msg.msgCode);
128 
129     switch (msg.msgCode) {
130         case WIFI_CBK_MSG_STATE_CHANGE:
131             WifiInternalEventDispatcher::PublishWifiStateChangedEvent(msg.msgData);
132             break;
133         case WIFI_CBK_MSG_CONNECTION_CHANGE:
134             WifiInternalEventDispatcher::PublishConnStateChangedEvent(msg.msgData, msg.linkInfo);
135             break;
136         case WIFI_CBK_MSG_RSSI_CHANGE:
137             WifiInternalEventDispatcher::PublishRssiValueChangedEvent(msg.msgData);
138             break;
139         case WIFI_CBK_MSG_STREAM_DIRECTION:
140             break;
141         case WIFI_CBK_MSG_WPS_STATE_CHANGE:
142             break;
143         default:
144             break;
145     }
146 
147     auto staSingleCallbackEvent = instance.GetStaSingleCallbackEvent();
148     if (staSingleCallbackEvent.count(msg.msgData) == 0) {
149         WIFI_LOGI("WifiInternalEventDispatcher:: Not registered callback event! msg.msgCode:%{public}d", msg.msgCode);
150         return;
151     }
152 
153     auto callback = instance.GetSingleStaCallback();
154     if (callback != nullptr) {
155         switch (msg.msgCode) {
156             case WIFI_CBK_MSG_STATE_CHANGE:
157                 callback->OnWifiStateChanged(msg.msgData);
158                 break;
159             case WIFI_CBK_MSG_CONNECTION_CHANGE:
160                 callback->OnWifiConnectionChanged(msg.msgData, msg.linkInfo);
161                 break;
162             case WIFI_CBK_MSG_RSSI_CHANGE:
163                 callback->OnWifiRssiChanged(msg.msgData);
164                 break;
165             case WIFI_CBK_MSG_STREAM_DIRECTION:
166                 callback->OnStreamChanged(msg.msgData);
167                 break;
168             case WIFI_CBK_MSG_WPS_STATE_CHANGE:
169                 callback->OnWifiWpsStateChanged(msg.msgData, msg.pinCode);
170                 break;
171             default:
172                 WIFI_LOGI("UnKnown msgcode %{public}d", msg.msgCode);
173                 break;
174         }
175     }
176     return;
177 }
178 
DealScanCallbackMsg(WifiInternalEventDispatcher & instance,const WifiEventCallbackMsg & msg)179 void WifiInternalEventDispatcher::DealScanCallbackMsg(
180     WifiInternalEventDispatcher &instance, const WifiEventCallbackMsg &msg)
181 {
182     WIFI_LOGD("WifiInternalEventDispatcher:: Deal Scan Event Callback Msg: %{public}d", msg.msgCode);
183 
184     switch (msg.msgCode) {
185         case WIFI_CBK_MSG_SCAN_STATE_CHANGE:
186             WifiCommonEventHelper::PublishScanStateChangedEvent(msg.msgData, "OnScanStateChanged");
187             break;
188         default:
189             WIFI_LOGI("UnKnown msgcode %{public}d", msg.msgCode);
190             break;
191     }
192 
193     auto scanSingleCallbackEvent = instance.GetScanSingleCallbackEvent();
194     if (scanSingleCallbackEvent.count(msg.msgData) == 0) {
195         WIFI_LOGI("WifiInternalEventDispatcher:: Not registered callback event! msg.msgCode:%{public}d", msg.msgCode);
196         return;
197     }
198 
199     auto callback = instance.GetSingleScanCallback();
200     if (callback != nullptr) {
201         switch (msg.msgCode) {
202             case WIFI_CBK_MSG_SCAN_STATE_CHANGE:
203                 callback->OnWifiScanStateChanged(msg.msgData);
204                 break;
205             default:
206                 break;
207         }
208     }
209     return;
210 }
211 
PublishConnStateChangedEvent(int state,const WifiLinkedInfo & info)212 void WifiInternalEventDispatcher::PublishConnStateChangedEvent(int state, const WifiLinkedInfo &info)
213 {
214     std::string eventData = "Other";
215     switch (state) {
216         case int(OHOS::Wifi::ConnState::CONNECTING):
217             eventData = "Connecting";
218             break;
219         case int(OHOS::Wifi::ConnState::CONNECTED):
220             eventData = "ApConnected";
221             break;
222         case int(OHOS::Wifi::ConnState::DISCONNECTING):
223             eventData = "Disconnecting";
224             break;
225         case int(OHOS::Wifi::ConnState::DISCONNECTED):
226             eventData = "Disconnected";
227             break;
228         default: {
229             eventData = "UnknownState";
230             break;
231         }
232     }
233     if (!WifiCommonEventHelper::PublishConnStateChangedEvent(state, eventData)) {
234         WIFI_LOGE("failed to publish connection state changed event!");
235         return;
236     }
237     WIFI_LOGD("publish connection state changed event.");
238 }
239 
PublishRssiValueChangedEvent(int state)240 void WifiInternalEventDispatcher::PublishRssiValueChangedEvent(int state)
241 {
242     WifiLinkedInfo likedInfo;
243     WifiConfigCenter::GetInstance().GetLinkedInfo(likedInfo);
244     int signalLevel = WifiSettings::GetInstance().GetSignalLevel(state, likedInfo.band);
245     if (!WifiCommonEventHelper::PublishRssiValueChangedEvent("wifiSignalLevel", signalLevel,
246         state, "OnRssiValueChanged")) {
247         WIFI_LOGE("failed to publish rssi value changed event!");
248         return;
249     }
250     WIFI_LOGD("publish rssi value changed event.");
251 }
252 
PublishWifiStateChangedEvent(int state)253 void WifiInternalEventDispatcher::PublishWifiStateChangedEvent(int state)
254 {
255     if (!WifiCommonEventHelper::PublishPowerStateChangeEvent(state, "OnWifiPowerStateChanged")) {
256         WIFI_LOGE("failed to publish wifi state changed event!");
257         return;
258     }
259     WIFI_LOGD("publish wifi state changed event.");
260 }
261 
Run(WifiInternalEventDispatcher & instance)262 void WifiInternalEventDispatcher::Run(WifiInternalEventDispatcher &instance)
263 {
264     while (instance.mRunFlag) {
265         std::unique_lock<std::mutex> lock(instance.mMutex);
266         while (instance.mEventQue.empty() && instance.mRunFlag) {
267             instance.mCondition.wait(lock);
268         }
269         if (!instance.mRunFlag) {
270             break;
271         }
272         WifiEventCallbackMsg msg = instance.mEventQue.front();
273         instance.mEventQue.pop_front();
274         lock.unlock();
275         WIFI_LOGD("WifiInternalEventDispatcher::Run broad cast a msg %{public}d", msg.msgCode);
276         if (msg.msgCode >= WIFI_CBK_MSG_STATE_CHANGE && msg.msgCode <= WIFI_CBK_MSG_WPS_STATE_CHANGE) {
277             DealStaCallbackMsg(instance, msg);
278         } else if (msg.msgCode == WIFI_CBK_MSG_SCAN_STATE_CHANGE) {
279             DealScanCallbackMsg(instance, msg);
280         } else if (msg.msgCode == WIFI_CBK_MSG_SEMI_STATE_CHANGE) {
281             WifiCommonEventHelper::PublishWifiSemiStateChangedEvent(msg.msgData, "OnWifiSemiStateChanged");
282         } else {
283             WIFI_LOGI("UnKnown msgcode %{public}d", msg.msgCode);
284         }
285     }
286     return;
287 }
288 }  // namespace Wifi
289 }  // namespace OHOS