2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Threading.Tasks;
19 using System.Threading;
21 namespace Tizen.Network.WiFi
23 internal static class EventHandlerExtension
25 internal static void SafeInvoke(this EventHandler evt, object sender, EventArgs e)
34 internal static void SafeInvoke<T>(this EventHandler<T> evt, object sender, T e) where T : EventArgs
44 internal partial class WiFiManagerImpl
46 private event EventHandler<DeviceStateChangedEventArgs> _deviceStateChanged;
47 private event EventHandler<ConnectionStateChangedEventArgs> _connectionStateChanged;
48 private event EventHandler<RssiLevelChangedEventArgs> _rssiLevelChanged;
49 private event EventHandler<ScanStateChangedEventArgs> _scanStateChanged;
50 private event EventHandler _backgroundScanFinished;
52 private Interop.WiFi.DeviceStateChangedCallback _deviceChangedCallback;
53 private Interop.WiFi.ConnectionStateChangedCallback _connectionChangedCallback;
54 private Interop.WiFi.RssiLevelChangedCallback _rssiChangedCallback;
55 private Interop.WiFi.ScanStateChangedCallback _scanChangedCallback;
56 private Interop.WiFi.VoidCallback _backgroundScanFinishedCallback;
58 internal event EventHandler<DeviceStateChangedEventArgs> DeviceStateChanged
64 if (_deviceStateChanged == null)
68 RegisterDeviceStateChangedEvent();
71 Log.Error(Globals.LogTag, "Exception on adding DeviceStateChanged\n" + e);
75 _deviceStateChanged += value;
82 _deviceStateChanged -= value;
83 if (_deviceStateChanged == null)
87 UnregisterDeviceStateChangedEvent();
91 Log.Error(Globals.LogTag, "Exception on removing DeviceStateChanged\n" + e);
98 internal event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged
104 if (_connectionStateChanged == null)
108 RegisterConnectionStateChangedEvent();
112 Log.Error(Globals.LogTag, "Exception on adding ConnectionStateChanged\n" + e);
116 _connectionStateChanged += value;
123 _connectionStateChanged -= value;
124 if (_connectionStateChanged == null)
128 UnregisterConnectionStateChangedEvent();
132 Log.Error(Globals.LogTag, "Exception on removing ConnectionStateChanged\n" + e);
139 internal event EventHandler<RssiLevelChangedEventArgs> RssiLevelChanged
145 if (_rssiLevelChanged == null)
149 RegisterRssiLevelChangedEvent();
153 Log.Error(Globals.LogTag, "Exception on adding RssiLevelChanged\n" + e);
157 _rssiLevelChanged += value;
164 _rssiLevelChanged -= value;
165 if (_rssiLevelChanged == null)
169 UnregisterRssiLevelChangedEvent();
173 Log.Error(Globals.LogTag, "Exception on removing RssiLevelChanged\n" + e);
180 internal event EventHandler<ScanStateChangedEventArgs> ScanStateChanged
186 if (_scanStateChanged == null)
190 RegisterScanStateChangedEvent();
194 Log.Error(Globals.LogTag, "Exception on adding ScanStateChanged\n" + e);
198 _scanStateChanged += value;
205 _scanStateChanged -= value;
206 if (_scanStateChanged == null)
210 UnregisterScanStateChangedEvent();
214 Log.Error(Globals.LogTag, "Exception on removing ScanStateChanged\n" + e);
221 internal event EventHandler BackgroundScanFinished
227 if (_backgroundScanFinished == null)
231 RegisterBackgroundScanFinishedEvent();
235 Log.Error(Globals.LogTag, "Exception on adding BackgroundScanFinished\n" + e);
239 _backgroundScanFinished += value;
246 _backgroundScanFinished -= value;
247 if (_backgroundScanFinished == null)
251 UnregisterBackgroundScanFinishedEvent();
255 Log.Error(Globals.LogTag, "Exception on removing BackgroundScanFinished\n" + e);
262 private void RegisterDeviceStateChangedEvent()
264 Log.Info(Globals.LogTag, "RegisterDeviceStateChangedEvent in Thread " + Thread.CurrentThread.ManagedThreadId);
265 _deviceChangedCallback = (int deviceState, IntPtr userDate) =>
267 WiFiDeviceState state = (WiFiDeviceState)deviceState;
268 DeviceStateChangedEventArgs e = new DeviceStateChangedEventArgs(state);
269 _deviceStateChanged.SafeInvoke(null, e);
271 int ret = Interop.WiFi.SetDeviceStateChangedCallback(GetSafeHandle(), _deviceChangedCallback, IntPtr.Zero);
272 if (ret != (int)WiFiError.None)
274 Log.Error(Globals.LogTag, "Failed to set device state changed callback, Error - " + (WiFiError)ret);
278 private void UnregisterDeviceStateChangedEvent()
280 Log.Info(Globals.LogTag, "UnregisterDeviceStateChangedEvent in Thread " + Thread.CurrentThread.ManagedThreadId);
281 int ret = Interop.WiFi.UnsetDeviceStateChangedCallback(GetSafeHandle());
282 if (ret != (int)WiFiError.None)
284 Log.Error(Globals.LogTag, "Failed to unset device state changed callback, Error - " + (WiFiError)ret);
288 private void RegisterConnectionStateChangedEvent()
290 _connectionChangedCallback = (int connectionState, IntPtr ap, IntPtr userData) =>
292 if (ap != IntPtr.Zero)
294 WiFiConnectionState state = (WiFiConnectionState)connectionState;
295 ConnectionStateChangedEventArgs e = new ConnectionStateChangedEventArgs(state, ap);
296 _connectionStateChanged.SafeInvoke(null, e);
299 int ret = Interop.WiFi.SetConnectionStateChangedCallback(GetSafeHandle(), _connectionChangedCallback, IntPtr.Zero);
300 if (ret != (int)WiFiError.None)
302 Log.Error(Globals.LogTag, "Failed to set copnnection state changed callback, Error - " + (WiFiError)ret);
306 private void UnregisterConnectionStateChangedEvent()
308 int ret = Interop.WiFi.UnsetConnectionStateChangedCallback(GetSafeHandle());
309 if (ret != (int)WiFiError.None)
311 Log.Error(Globals.LogTag, "Failed to unset device state changed callback, Error - " + (WiFiError)ret);
315 private void RegisterRssiLevelChangedEvent()
318 _rssiChangedCallback = (int rssiLevel, IntPtr userDate) =>
320 WiFiRssiLevel level = (WiFiRssiLevel)rssiLevel;
321 RssiLevelChangedEventArgs e = new RssiLevelChangedEventArgs(level);
322 _rssiLevelChanged.SafeInvoke(null, e);
324 int ret = Interop.WiFi.SetRssiLevelchangedCallback(GetSafeHandle(), _rssiChangedCallback, IntPtr.Zero);
325 if (ret != (int)WiFiError.None)
327 Log.Error(Globals.LogTag, "Failed to set rssi level changed callback, Error - " + (WiFiError)ret);
331 private void UnregisterRssiLevelChangedEvent()
333 int ret = Interop.WiFi.UnsetRssiLevelchangedCallback(GetSafeHandle());
334 if (ret != (int)WiFiError.None)
336 Log.Error(Globals.LogTag, "Failed to unset rssi level changed callback, Error - " + (WiFiError)ret);
340 private void RegisterScanStateChangedEvent()
342 _scanChangedCallback = (int scanState, IntPtr userData) =>
344 _scanStateChanged?.Invoke(null, new ScanStateChangedEventArgs((WiFiScanState)scanState));
346 int ret = Interop.WiFi.SetScanStateChangedCallback(GetSafeHandle(), _scanChangedCallback, IntPtr.Zero);
347 if (ret != (int)WiFiError.None)
349 Log.Error(Globals.LogTag, "Failed to set scan state changed callback, Error - " + (WiFiError)ret);
353 private void UnregisterScanStateChangedEvent()
355 int ret = Interop.WiFi.UnsetScanStateChangedCallback(GetSafeHandle());
356 if (ret != (int)WiFiError.None)
358 Log.Error(Globals.LogTag, "Failed to unset scan state changed callback, Error - " + (WiFiError)ret);
362 private void RegisterBackgroundScanFinishedEvent()
364 _backgroundScanFinishedCallback = (int result, IntPtr userDate) =>
366 EventArgs e = new EventArgs();
367 _backgroundScanFinished.SafeInvoke(null, e);
369 int ret = Interop.WiFi.SetBackgroundScanCallback(GetSafeHandle(), _backgroundScanFinishedCallback, IntPtr.Zero);
370 if (ret != (int)WiFiError.None)
372 Log.Error(Globals.LogTag, "Failed to set background scan callback, Error - " + (WiFiError)ret);
376 private void UnregisterBackgroundScanFinishedEvent()
378 int ret = Interop.WiFi.UnsetBackgroundScanCallback(GetSafeHandle());
379 if (ret != (int)WiFiError.None)
381 Log.Error(Globals.LogTag, "Failed to unset background scan callback, Error - " + (WiFiError)ret);