1 /*
2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "wifi_device_callback_stub.h"
16 #include "define.h"
17 #include "wifi_manager_service_ipc_interface_code.h"
18 #include "wifi_hisysevent.h"
19 #include "wifi_logger.h"
20 #include "wifi_msg.h"
21 #include "wifi_errcode.h"
22 #include "wifi_common_util.h"
23
24 DEFINE_WIFILOG_LABEL("WifiDeviceCallBackStub");
25 namespace OHOS {
26 namespace Wifi {
WifiDeviceCallBackStub()27 WifiDeviceCallBackStub::WifiDeviceCallBackStub() : callback_(nullptr), mRemoteDied(false)
28 {}
29
~WifiDeviceCallBackStub()30 WifiDeviceCallBackStub::~WifiDeviceCallBackStub()
31 {}
32
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)33 int WifiDeviceCallBackStub::OnRemoteRequest(
34 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
35 {
36 WIFI_LOGD("OnRemoteRequest, code:%{public}u!", code);
37
38 if (data.ReadInterfaceToken() != GetDescriptor()) {
39 WIFI_LOGE("Sta callback stub token verification error: %{public}d", code);
40 return WIFI_OPT_FAILED;
41 }
42
43 int exception = data.ReadInt32();
44 if (exception) {
45 WIFI_LOGE("WifiDeviceCallBackStub::OnRemoteRequest, got exception: %{public}d!", exception);
46 return WIFI_OPT_FAILED;
47 }
48 int ret = -1;
49 switch (code) {
50 case static_cast<uint32_t>(DevInterfaceCode::WIFI_CBK_CMD_STATE_CHANGE): {
51 ret = RemoteOnWifiStateChanged(code, data, reply);
52 break;
53 }
54 case static_cast<uint32_t>(DevInterfaceCode::WIFI_CBK_CMD_CONNECTION_CHANGE): {
55 ret = RemoteOnWifiConnectionChanged(code, data, reply);
56 break;
57 }
58 case static_cast<uint32_t>(DevInterfaceCode::WIFI_CBK_CMD_RSSI_CHANGE): {
59 ret = RemoteOnWifiRssiChanged(code, data, reply);
60 break;
61 }
62 case static_cast<uint32_t>(DevInterfaceCode::WIFI_CBK_CMD_WPS_STATE_CHANGE): {
63 ret = RemoteOnWifiWpsStateChanged(code, data, reply);
64 break;
65 }
66 case static_cast<uint32_t>(DevInterfaceCode::WIFI_CBK_CMD_STREAM_DIRECTION): {
67 ret = RemoteOnStreamChanged(code, data, reply);
68 break;
69 }
70 case static_cast<uint32_t>(DevInterfaceCode::WIFI_CBK_CMD_DEVICE_CONFIG_CHANGE): {
71 ret = RemoteOnDeviceConfigChanged(code, data, reply);
72 break;
73 }
74 default: {
75 ret = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
76 break;
77 }
78 }
79 return ret;
80 }
81
RegisterUserCallBack(const sptr<IWifiDeviceCallBack> & callBack)82 void WifiDeviceCallBackStub::RegisterUserCallBack(const sptr<IWifiDeviceCallBack> &callBack)
83 {
84 if (callBack == nullptr) {
85 WIFI_LOGE("RegisterUserCallBack:callBack is nullptr!");
86 return;
87 }
88 callback_ = callBack;
89 }
90
IsRemoteDied() const91 bool WifiDeviceCallBackStub::IsRemoteDied() const
92 {
93 return mRemoteDied;
94 }
95
SetRemoteDied(bool val)96 void WifiDeviceCallBackStub::SetRemoteDied(bool val)
97 {
98 WIFI_LOGI("SetRemoteDied, state:%{public}d!", val);
99 mRemoteDied = val;
100 }
101
OnWifiStateChanged(int state)102 NO_SANITIZE("cfi") void WifiDeviceCallBackStub::OnWifiStateChanged(int state)
103 {
104 WIFI_LOGI("OnWifiStateChanged, state:%{public}d!", state);
105
106 if (callback_) {
107 callback_->OnWifiStateChanged(state);
108 }
109 WriteWifiEventReceivedHiSysEvent(HISYS_STA_POWER_STATE_CHANGE, state);
110 }
111
OnWifiConnectionChanged(int state,const WifiLinkedInfo & info)112 NO_SANITIZE("cfi") void WifiDeviceCallBackStub::OnWifiConnectionChanged(int state, const WifiLinkedInfo &info)
113 {
114 WIFI_LOGI("OnWifiConnectionChanged, state:%{public}d!", state);
115 if (callback_) {
116 callback_->OnWifiConnectionChanged(state, info);
117 }
118 WriteWifiEventReceivedHiSysEvent(HISYS_STA_CONN_STATE_CHANGE, state);
119 }
120
OnWifiRssiChanged(int rssi)121 NO_SANITIZE("cfi") void WifiDeviceCallBackStub::OnWifiRssiChanged(int rssi)
122 {
123 WIFI_LOGI("OnWifiRssiChanged, rssi:%{public}d!", rssi);
124 if (callback_) {
125 callback_->OnWifiRssiChanged(rssi);
126 }
127 WriteWifiEventReceivedHiSysEvent(HISYS_STA_RSSI_STATE_CHANGE, rssi);
128 }
129
OnWifiWpsStateChanged(int state,const std::string & pinCode)130 NO_SANITIZE("cfi") void WifiDeviceCallBackStub::OnWifiWpsStateChanged(int state, const std::string &pinCode)
131 {
132 WIFI_LOGI("OnWifiWpsStateChanged, state:%{public}d!", state);
133 if (callback_) {
134 callback_->OnWifiWpsStateChanged(state, pinCode);
135 }
136 }
137
OnStreamChanged(int direction)138 NO_SANITIZE("cfi") void WifiDeviceCallBackStub::OnStreamChanged(int direction)
139 {
140 WIFI_LOGD("OnStreamChanged, direction:%{public}d!", direction);
141 if (callback_) {
142 callback_->OnStreamChanged(direction);
143 }
144 }
145
OnDeviceConfigChanged(ConfigChange value)146 NO_SANITIZE("cfi") void WifiDeviceCallBackStub::OnDeviceConfigChanged(ConfigChange value)
147 {
148 WIFI_LOGI("OnDeviceConfigChanged, value:%{public}d!", value);
149 if (callback_) {
150 callback_->OnDeviceConfigChanged(value);
151 }
152 }
153
RemoteOnWifiStateChanged(uint32_t code,MessageParcel & data,MessageParcel & reply)154 int WifiDeviceCallBackStub::RemoteOnWifiStateChanged(uint32_t code, MessageParcel &data, MessageParcel &reply)
155 {
156 WIFI_LOGD("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize());
157 int state = data.ReadInt32();
158 OnWifiStateChanged(state);
159 return 0;
160 }
161
RemoteOnWifiConnectionChanged(uint32_t code,MessageParcel & data,MessageParcel & reply)162 int WifiDeviceCallBackStub::RemoteOnWifiConnectionChanged(uint32_t code, MessageParcel &data, MessageParcel &reply)
163 {
164 WIFI_LOGD("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize());
165 int state = data.ReadInt32();
166 WifiLinkedInfo info;
167 info.networkId = data.ReadInt32();
168 info.ssid = data.ReadString();
169 info.bssid = data.ReadString();
170 info.rssi = data.ReadInt32();
171 info.band = data.ReadInt32();
172 info.frequency = data.ReadInt32();
173 info.linkSpeed = data.ReadInt32();
174 info.macAddress = data.ReadString();
175 info.ipAddress = static_cast<unsigned int>(data.ReadInt32());
176 int tmpConnState = data.ReadInt32();
177 if (tmpConnState >= 0 && tmpConnState <= int(ConnState::UNKNOWN)) {
178 info.connState = ConnState(tmpConnState);
179 } else {
180 info.connState = ConnState::UNKNOWN;
181 }
182 info.ifHiddenSSID = data.ReadBool();
183 info.rxLinkSpeed = data.ReadInt32();
184 info.txLinkSpeed = data.ReadInt32();
185 info.chload = data.ReadInt32();
186 info.snr = data.ReadInt32();
187 info.isDataRestricted = data.ReadInt32();
188 info.portalUrl = data.ReadString();
189 int tmpState = data.ReadInt32();
190 if (tmpState >= 0 && tmpState <= int(SupplicantState::INVALID)) {
191 info.supplicantState = SupplicantState(tmpState);
192 } else {
193 info.supplicantState = SupplicantState::INVALID;
194 }
195
196 int tmpDetailState = data.ReadInt32();
197 if (tmpDetailState >= 0 && tmpDetailState <= int(DetailedState::INVALID)) {
198 info.detailedState = DetailedState(tmpDetailState);
199 } else {
200 info.detailedState = DetailedState::INVALID;
201 }
202 info.isAncoConnected = data.ReadBool();
203 OnWifiConnectionChanged(state, info);
204 return 0;
205 }
206
RemoteOnWifiRssiChanged(uint32_t code,MessageParcel & data,MessageParcel & reply)207 int WifiDeviceCallBackStub::RemoteOnWifiRssiChanged(uint32_t code, MessageParcel &data, MessageParcel &reply)
208 {
209 WIFI_LOGD("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize());
210 int rssi = data.ReadInt32();
211 OnWifiRssiChanged(rssi);
212 return 0;
213 }
214
RemoteOnWifiWpsStateChanged(uint32_t code,MessageParcel & data,MessageParcel & reply)215 int WifiDeviceCallBackStub::RemoteOnWifiWpsStateChanged(uint32_t code, MessageParcel &data, MessageParcel &reply)
216 {
217 WIFI_LOGD("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize());
218 const char *readStr = nullptr;
219 int state = data.ReadInt32();
220 readStr = data.ReadCString();
221 std::string pinCode = (readStr != nullptr) ? readStr : "";
222 OnWifiWpsStateChanged(state, pinCode);
223 return 0;
224 }
225
RemoteOnStreamChanged(uint32_t code,MessageParcel & data,MessageParcel & reply)226 int WifiDeviceCallBackStub::RemoteOnStreamChanged(uint32_t code, MessageParcel &data, MessageParcel &reply)
227 {
228 WIFI_LOGD("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize());
229 int direction = data.ReadInt32();
230 OnStreamChanged(direction);
231 return 0;
232 }
233
RemoteOnDeviceConfigChanged(uint32_t code,MessageParcel & data,MessageParcel & reply)234 int WifiDeviceCallBackStub::RemoteOnDeviceConfigChanged(uint32_t code, MessageParcel &data, MessageParcel &reply)
235 {
236 WIFI_LOGD("run %{public}s code %{public}u, datasize %{public}zu", __func__, code, data.GetRawDataSize());
237 int value = data.ReadInt32();
238 OnDeviceConfigChanged(ConfigChange(value));
239 return 0;
240 }
241 } // namespace Wifi
242 } // namespace OHOS