• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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