• 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     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