1 /*
2 * Copyright (c) 2021 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 "lnn_event_monitor_impl.h"
17
18 #include <securec.h>
19
20 #include "bus_center_event.h"
21 #include "common_event_data.h"
22 #include "common_event_manager.h"
23 #include "common_event_subscriber.h"
24 #include "common_event_support.h"
25 #include "lnn_async_callback_utils.h"
26 #include "want.h"
27 #include "wifi_msg.h"
28 #include "softbus_adapter_mem.h"
29 #include "softbus_errcode.h"
30 #include "softbus_log.h"
31 #include "wifi_event.h"
32 #include "wifi_ap_msg.h"
33
34 static const int32_t DELAY_LEN = 1000;
35 static const int32_t RETRY_MAX = 20;
36
37 namespace OHOS {
38 namespace EventFwk {
39 class WifiServiceMonitor : public CommonEventSubscriber {
40 public:
41 explicit WifiServiceMonitor(const CommonEventSubscribeInfo &subscriberInfo);
~WifiServiceMonitor()42 virtual ~WifiServiceMonitor(){}
43 virtual void OnReceiveEvent(const CommonEventData &data);
44 };
45
WifiServiceMonitor(const CommonEventSubscribeInfo & subscriberInfo)46 WifiServiceMonitor::WifiServiceMonitor(const CommonEventSubscribeInfo &subscriberInfo)
47 :CommonEventSubscriber(subscriberInfo)
48 {
49 }
50
OnReceiveEvent(const CommonEventData & data)51 void WifiServiceMonitor::OnReceiveEvent(const CommonEventData &data)
52 {
53 int code = data.GetCode();
54 std::string action = data.GetWant().GetAction();
55 SoftBusWifiState state = SOFTBUS_WIFI_UNKNOWN;
56 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify wifiservice event %s, code(%d)", action.c_str(), code);
57
58 if (action == CommonEventSupport::COMMON_EVENT_WIFI_CONN_STATE) {
59 switch (code) {
60 case int(OHOS::Wifi::ConnState::OBTAINING_IPADDR):
61 state = SOFTBUS_WIFI_OBTAINING_IPADDR;
62 break;
63 case int(OHOS::Wifi::ConnState::CONNECTED):
64 state = SOFTBUS_WIFI_CONNECTED;
65 break;
66 case int(OHOS::Wifi::ConnState::DISCONNECTED):
67 state = SOFTBUS_WIFI_DISCONNECTED;
68 break;
69 default: {
70 break;
71 }
72 }
73 }
74 if (action == CommonEventSupport::COMMON_EVENT_WIFI_POWER_STATE) {
75 switch (code) {
76 case int(OHOS::Wifi::WifiState::DISABLED):
77 state = SOFTBUS_WIFI_DISABLED;
78 break;
79 case int(OHOS::Wifi::WifiState::ENABLED):
80 state = SOFTBUS_WIFI_ENABLED;
81 break;
82 default: {
83 break;
84 }
85 }
86 }
87 if (action == CommonEventSupport::COMMON_EVENT_WIFI_HOTSPOT_STATE) {
88 switch (code) {
89 case int(OHOS::Wifi::ApState::AP_STATE_STARTED):
90 state = SOFTBUS_AP_ENABLED;
91 break;
92 case int(OHOS::Wifi::ApState::AP_STATE_CLOSED):
93 state = SOFTBUS_AP_DISABLED;
94 break;
95 default: {
96 break;
97 }
98 }
99 }
100 if (state != SOFTBUS_WIFI_UNKNOWN) {
101 LnnNotifyWlanStateChangeEvent(state);
102 }
103 }
104
105 class SubscribeEvent {
106 public:
107 int32_t SubscribeWifiConnStateEvent();
108 int32_t SubscribeWifiPowerStateEvent();
109 int32_t SubscribeAPConnStateEvent();
110 };
111
SubscribeAPConnStateEvent()112 int32_t SubscribeEvent::SubscribeAPConnStateEvent()
113 {
114 MatchingSkills matchingSkills;
115 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_HOTSPOT_STATE);
116 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
117 std::shared_ptr<WifiServiceMonitor> subscriberPtr = std::make_shared<WifiServiceMonitor>(subscriberInfo);
118 if (!CommonEventManager::SubscribeCommonEvent(subscriberPtr)) {
119 return SOFTBUS_ERR;
120 }
121 return SOFTBUS_OK;
122 }
123
SubscribeWifiConnStateEvent()124 int32_t SubscribeEvent::SubscribeWifiConnStateEvent()
125 {
126 MatchingSkills matchingSkills;
127 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_CONN_STATE);
128 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
129 std::shared_ptr<WifiServiceMonitor> subscriberPtr = std::make_shared<WifiServiceMonitor>(subscriberInfo);
130 if (!CommonEventManager::SubscribeCommonEvent(subscriberPtr)) {
131 return SOFTBUS_ERR;
132 }
133 return SOFTBUS_OK;
134 }
135
SubscribeWifiPowerStateEvent()136 int32_t SubscribeEvent::SubscribeWifiPowerStateEvent()
137 {
138 MatchingSkills matchingSkills;
139 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_POWER_STATE);
140 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
141 std::shared_ptr<WifiServiceMonitor> subscriberPtr = std::make_shared<WifiServiceMonitor>(subscriberInfo);
142 if (!CommonEventManager::SubscribeCommonEvent(subscriberPtr)) {
143 return SOFTBUS_ERR;
144 }
145 return SOFTBUS_OK;
146 }
147 } // namespace EventFwk
148 } // namespace OHOS
149
LnnSubscribeWifiService(void * para)150 static void LnnSubscribeWifiService(void *para)
151 {
152 (void)para;
153 static int32_t retry = 0;
154 if (retry > RETRY_MAX) {
155 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "try subscribe wifiservice event max times");
156 return;
157 }
158 OHOS::EventFwk::SubscribeEvent *subscriberPtr = new OHOS::EventFwk::SubscribeEvent();
159 if (subscriberPtr == nullptr) {
160 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SubscribeEvent init fail");
161 return;
162 }
163 if (subscriberPtr->SubscribeWifiConnStateEvent() == SOFTBUS_OK &&
164 subscriberPtr->SubscribeWifiPowerStateEvent() == SOFTBUS_OK &&
165 subscriberPtr->SubscribeAPConnStateEvent() == SOFTBUS_OK) {
166 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "subscribe wifiservice conn and power state success");
167 } else {
168 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "subscribe wifiservice event fail");
169 retry++;
170 SoftBusLooper *looper = GetLooper(LOOP_TYPE_DEFAULT);
171 if (LnnAsyncCallbackDelayHelper(looper, LnnSubscribeWifiService, NULL, DELAY_LEN) != SOFTBUS_OK) {
172 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init wifiservice LnnAsyncCallbackDelayHelper fail");
173 }
174 }
175 delete subscriberPtr;
176 }
177
LnnInitWifiServiceMonitorImpl(void)178 int32_t LnnInitWifiServiceMonitorImpl(void)
179 {
180 SoftBusLooper *looper = GetLooper(LOOP_TYPE_DEFAULT);
181 int32_t ret = LnnAsyncCallbackDelayHelper(looper, LnnSubscribeWifiService, NULL, DELAY_LEN);
182 if (ret != SOFTBUS_OK) {
183 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init wifiservice LnnAsyncCallbackDelayHelper fail");
184 }
185 return ret;
186 }
187