1 /*
2 * Copyright (C) 2021-2023 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 "softap_manager_state_machine.h"
17 #include "wifi_manager.h"
18 #include "wifi_service_manager.h"
19 #include "wifi_config_center.h"
20 #include "wifi_chip_hal_interface.h"
21 #include "wifi_internal_event_dispatcher.h"
22 #include "wifi_hisysevent.h"
23 #include "wifi_settings.h"
24 #include "wifi_common_event_helper.h"
25 #include "wifi_country_code_manager.h"
26 #include "wifi_service_scheduler.h"
27 #include "i_ap_service.h"
28 #ifdef HDI_CHIP_INTERFACE_SUPPORT
29 #include "hal_device_manage.h"
30 #endif
31
32 namespace OHOS {
33 namespace Wifi {
34 DEFINE_WIFILOG_LABEL("SoftapManagerMachine");
35 int SoftapManagerMachine::mid{0};
36
SoftapManagerMachine()37 SoftapManagerMachine::SoftapManagerMachine()
38 : StateMachine("SoftapManagerMachine"), pDefaultState(nullptr), pIdleState(nullptr), pStartedState(nullptr)
39 {}
40
~SoftapManagerMachine()41 SoftapManagerMachine::~SoftapManagerMachine()
42 {
43 WIFI_LOGE("SoftapManagerMachine::~SoftapManagerMachine");
44 StopHandlerThread();
45 ParsePointer(pDefaultState);
46 ParsePointer(pIdleState);
47 ParsePointer(pStartedState);
48 #ifdef HDI_CHIP_INTERFACE_SUPPORT
49 if (!ifaceName.empty()) {
50 DelayedSingleton<HalDeviceManager>::GetInstance()->RemoveApIface(ifaceName);
51 ifaceName.clear();
52 WifiServiceScheduler::GetInstance().ClearSoftApIfaceNameMap(mid);
53 WifiConfigCenter::GetInstance().SetApIfaceName("");
54 }
55 #endif
56 }
57
58 /* --------------------------Initialization functions--------------------------*/
InitSoftapManagerMachine()59 ErrCode SoftapManagerMachine::InitSoftapManagerMachine()
60 {
61 WIFI_LOGE("Enter SoftapManagerMachine::InitSoftapManagerMachine.\n");
62 if (!InitialStateMachine("SoftapManagerMachine")) {
63 WIFI_LOGE("Initial StateMachine failed.\n");
64 return WIFI_OPT_FAILED;
65 }
66
67 if (InitSoftapManagerStates() == WIFI_OPT_FAILED) {
68 return WIFI_OPT_FAILED;
69 }
70 BuildStateTree();
71 SetFirstState(pIdleState);
72 StartStateMachine();
73 return WIFI_OPT_SUCCESS;
74 }
75
BuildStateTree()76 void SoftapManagerMachine::BuildStateTree()
77 {
78 StatePlus(pDefaultState, nullptr);
79 StatePlus(pIdleState, pDefaultState);
80 StatePlus(pStartedState, pDefaultState);
81 }
82
InitSoftapManagerStates()83 ErrCode SoftapManagerMachine::InitSoftapManagerStates()
84 {
85 int tmpErrNumber;
86
87 WIFI_LOGE("Enter InitConcreteMangerStates\n");
88 pDefaultState = new (std::nothrow) DefaultState(this);
89 tmpErrNumber = JudgmentEmpty(pDefaultState);
90 pIdleState = new (std::nothrow) IdleState(this);
91 tmpErrNumber += JudgmentEmpty(pIdleState);
92 pStartedState = new (std::nothrow) StartedState(this);
93 tmpErrNumber += JudgmentEmpty(pStartedState);
94 if (tmpErrNumber != 0) {
95 WIFI_LOGE("InitSoftapManagerStates some one state is null\n");
96 return WIFI_OPT_FAILED;
97 }
98 return WIFI_OPT_SUCCESS;
99 }
100
RegisterCallback(const SoftApModeCallback & callbacks)101 ErrCode SoftapManagerMachine::RegisterCallback(const SoftApModeCallback &callbacks)
102 {
103 mcb = callbacks;
104 return WIFI_OPT_SUCCESS;
105 }
106
DefaultState(SoftapManagerMachine * softapManagerMachine)107 SoftapManagerMachine::DefaultState::DefaultState(SoftapManagerMachine *softapManagerMachine)
108 : State("DefaultState"), pSoftapManagerMachine(softapManagerMachine)
109 {}
110
~DefaultState()111 SoftapManagerMachine::DefaultState::~DefaultState()
112 {}
113
GoInState()114 void SoftapManagerMachine::DefaultState::GoInState()
115 {
116 WIFI_LOGE("DefaultState GoInState function.\n");
117 }
118
GoOutState()119 void SoftapManagerMachine::DefaultState::GoOutState()
120 {
121 WIFI_LOGE("DefaultState GoOutState function.\n");
122 }
123
ExecuteStateMsg(InternalMessagePtr msg)124 bool SoftapManagerMachine::DefaultState::ExecuteStateMsg(InternalMessagePtr msg)
125 {
126 if (msg == nullptr || pSoftapManagerMachine == nullptr) {
127 return false;
128 }
129 WIFI_LOGE("DefaultState-msgCode=%{public}d is received.\n", msg->GetMessageName());
130 return true;
131 }
132
IdleState(SoftapManagerMachine * softapManagerMachine)133 SoftapManagerMachine::IdleState::IdleState(SoftapManagerMachine *softapManagerMachine)
134 : State("IdleState"), pSoftapManagerMachine(softapManagerMachine)
135 {}
136
~IdleState()137 SoftapManagerMachine::IdleState::~IdleState()
138 {}
139
GoInState()140 void SoftapManagerMachine::IdleState::GoInState()
141 {
142 WIFI_LOGE("IdleState GoInState function.\n");
143 }
144
GoOutState()145 void SoftapManagerMachine::IdleState::GoOutState()
146 {
147 WIFI_LOGE("IdleState GoOutState function.\n");
148 }
149
ExecuteStateMsg(InternalMessagePtr msg)150 bool SoftapManagerMachine::IdleState::ExecuteStateMsg(InternalMessagePtr msg)
151 {
152 if (msg == nullptr) {
153 return false;
154 }
155 WIFI_LOGE("IdleState-msgCode=%{public}d is received.\n", msg->GetMessageName());
156 switch (msg->GetMessageName()) {
157 case SOFTAP_CMD_START:
158 HandleStartInIdleState(msg);
159 break;
160 case SOFTAP_CMD_STOP:
161 pSoftapManagerMachine->StopSoftap();
162 break;
163 default:
164 break;
165 }
166 return true;
167 }
168
HandleStartInIdleState(InternalMessagePtr msg)169 void SoftapManagerMachine::IdleState::HandleStartInIdleState(InternalMessagePtr msg)
170 {
171 mid = msg->GetParam2();
172 ErrCode ret = WifiServiceScheduler::GetInstance().AutoStartApService(mid, pSoftapManagerMachine->ifaceName);
173 if (ret != WIFI_OPT_SUCCESS) {
174 pSoftapManagerMachine->mcb.onStartFailure(mid);
175 return;
176 }
177 pSoftapManagerMachine->SwitchState(pSoftapManagerMachine->pStartedState);
178 }
179
StartedState(SoftapManagerMachine * softapManagerMachine)180 SoftapManagerMachine::StartedState::StartedState(SoftapManagerMachine *softapManagerMachine)
181 : State("StartedState"), pSoftapManagerMachine(softapManagerMachine)
182 {}
183
~StartedState()184 SoftapManagerMachine::StartedState::~StartedState()
185 {}
186
GoInState()187 void SoftapManagerMachine::StartedState::GoInState()
188 {
189 WIFI_LOGE("StartedState GoInState function.\n");
190 }
191
GoOutState()192 void SoftapManagerMachine::StartedState::GoOutState()
193 {
194 WIFI_LOGE("StartedState GoOutState function.\n");
195 }
196
ExecuteStateMsg(InternalMessagePtr msg)197 bool SoftapManagerMachine::StartedState::ExecuteStateMsg(InternalMessagePtr msg)
198 {
199 if (msg == nullptr) {
200 return false;
201 }
202 WIFI_LOGE("StartedState-msgCode=%{public}d is received.\n", msg->GetMessageName());
203 switch (msg->GetMessageName()) {
204 case SOFTAP_CMD_STOP:
205 pSoftapManagerMachine->StopSoftap();
206 break;
207 default:
208 break;
209 }
210 return true;
211 }
212
StopSoftap()213 void SoftapManagerMachine::StopSoftap()
214 {
215 WifiOprMidState apState = WifiConfigCenter::GetInstance().GetApMidState(mid);
216 if (apState == WifiOprMidState::CLOSING || apState == WifiOprMidState::OPENING) {
217 return;
218 }
219 ErrCode ret = WifiServiceScheduler::GetInstance().AutoStopApService(mid);
220 if (ret != WIFI_OPT_SUCCESS) {
221 WIFI_LOGE("Stop softap failed ret = %{public}d", ret);
222 }
223 SwitchState(pIdleState);
224 }
225 } // namespace Wifi
226 } // namespace OHOS