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