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