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