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 if (action == CommonEventSupport::COMMON_EVENT_WIFI_CONN_STATE) {
58 switch (code) {
59 case int(OHOS::Wifi::ConnState::OBTAINING_IPADDR):
60 state = SOFTBUS_WIFI_OBTAINING_IPADDR;
61 break;
62 case int(OHOS::Wifi::ConnState::CONNECTED):
63 state = SOFTBUS_WIFI_CONNECTED;
64 break;
65 case int(OHOS::Wifi::ConnState::DISCONNECTED):
66 state = SOFTBUS_WIFI_DISCONNECTED;
67 break;
68 default: {
69 break;
70 }
71 }
72 }
73 if (action == CommonEventSupport::COMMON_EVENT_WIFI_POWER_STATE) {
74 switch (code) {
75 case int(OHOS::Wifi::WifiState::DISABLED):
76 state = SOFTBUS_WIFI_DISABLED;
77 break;
78 case int(OHOS::Wifi::WifiState::ENABLED):
79 state = SOFTBUS_WIFI_ENABLED;
80 break;
81 default: {
82 break;
83 }
84 }
85 }
86 if (action == CommonEventSupport::COMMON_EVENT_WIFI_HOTSPOT_STATE) {
87 switch (code) {
88 case int(OHOS::Wifi::ApState::AP_STATE_STARTED):
89 state = SOFTBUS_AP_ENABLED;
90 break;
91 case int(OHOS::Wifi::ApState::AP_STATE_CLOSED):
92 state = SOFTBUS_AP_DISABLED;
93 break;
94 default: {
95 break;
96 }
97 }
98 }
99 if (state != SOFTBUS_WIFI_UNKNOWN) {
100 LnnNotifyWlanStateChangeEvent(state);
101 }
102 }
103
104 class SubscribeEvent {
105 public:
106 int32_t SubscribeWifiConnStateEvent();
107 int32_t SubscribeWifiPowerStateEvent();
108 int32_t SubscribeAPConnStateEvent();
109 };
110
SubscribeAPConnStateEvent()111 int32_t SubscribeEvent::SubscribeAPConnStateEvent()
112 {
113 MatchingSkills matchingSkills;
114 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_HOTSPOT_STATE);
115 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
116 std::shared_ptr<WifiServiceMonitor> subscriberPtr = std::make_shared<WifiServiceMonitor>(subscriberInfo);
117 if (!CommonEventManager::SubscribeCommonEvent(subscriberPtr)) {
118 return SOFTBUS_ERR;
119 }
120 return SOFTBUS_OK;
121 }
122
SubscribeWifiConnStateEvent()123 int32_t SubscribeEvent::SubscribeWifiConnStateEvent()
124 {
125 MatchingSkills matchingSkills;
126 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_CONN_STATE);
127 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
128 std::shared_ptr<WifiServiceMonitor> subscriberPtr = std::make_shared<WifiServiceMonitor>(subscriberInfo);
129 if (!CommonEventManager::SubscribeCommonEvent(subscriberPtr)) {
130 return SOFTBUS_ERR;
131 }
132 return SOFTBUS_OK;
133 }
134
SubscribeWifiPowerStateEvent()135 int32_t SubscribeEvent::SubscribeWifiPowerStateEvent()
136 {
137 MatchingSkills matchingSkills;
138 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_POWER_STATE);
139 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
140 std::shared_ptr<WifiServiceMonitor> subscriberPtr = std::make_shared<WifiServiceMonitor>(subscriberInfo);
141 if (!CommonEventManager::SubscribeCommonEvent(subscriberPtr)) {
142 return SOFTBUS_ERR;
143 }
144 return SOFTBUS_OK;
145 }
146 } // namespace EventFwk
147 } // namespace OHOS
148
LnnSubscribeWifiService(void * para)149 static void LnnSubscribeWifiService(void *para)
150 {
151 (void)para;
152 static int32_t retry = 0;
153 if (retry > RETRY_MAX) {
154 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "try subscribe wifiservice event max times");
155 return;
156 }
157 OHOS::EventFwk::SubscribeEvent *subscriberPtr = new OHOS::EventFwk::SubscribeEvent();
158 if (subscriberPtr == nullptr) {
159 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SubscribeEvent init fail");
160 return;
161 }
162 if (subscriberPtr->SubscribeWifiConnStateEvent() == SOFTBUS_OK &&
163 subscriberPtr->SubscribeWifiPowerStateEvent() == SOFTBUS_OK &&
164 subscriberPtr->SubscribeAPConnStateEvent() == SOFTBUS_OK) {
165 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "subscribe wifiservice conn and power state success");
166 } else {
167 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "subscribe wifiservice event fail");
168 retry++;
169 SoftBusLooper *looper = GetLooper(LOOP_TYPE_DEFAULT);
170 if (LnnAsyncCallbackDelayHelper(looper, LnnSubscribeWifiService, NULL, DELAY_LEN) != SOFTBUS_OK) {
171 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init wifiservice LnnAsyncCallbackDelayHelper fail");
172 }
173 }
174 delete subscriberPtr;
175 }
176
LnnInitWifiServiceMonitorImpl(void)177 int32_t LnnInitWifiServiceMonitorImpl(void)
178 {
179 SoftBusLooper *looper = GetLooper(LOOP_TYPE_DEFAULT);
180 int32_t ret = LnnAsyncCallbackDelayHelper(looper, LnnSubscribeWifiService, NULL, DELAY_LEN);
181 if (ret != SOFTBUS_OK) {
182 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init wifiservice LnnAsyncCallbackDelayHelper fail");
183 }
184 return ret;
185 }
186