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;
20 using Tizen.Applications;
22 namespace Tizen.Network.WiFi
24 internal static class EventHandlerExtension
26 internal static void SafeInvoke(this EventHandler evt, object sender, EventArgs e)
35 internal static void SafeInvoke<T>(this EventHandler<T> evt, object sender, T e) where T : EventArgs
45 internal partial class WiFiManagerImpl
47 private event EventHandler<DeviceStateChangedEventArgs> _deviceStateChanged;
48 private event EventHandler<ConnectionStateChangedEventArgs> _connectionStateChanged;
49 private event EventHandler<RssiLevelChangedEventArgs> _rssiLevelChanged;
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.VoidCallback _backgroundScanFinishedCallback;
57 private TizenSynchronizationContext context = new TizenSynchronizationContext();
58 internal event EventHandler<DeviceStateChangedEventArgs> DeviceStateChanged
64 if (_deviceStateChanged == null)
66 RegisterDeviceStateChangedEvent();
68 _deviceStateChanged += value;
75 _deviceStateChanged -= value;
76 if (_deviceStateChanged == null)
78 UnregisterDeviceStateChangedEvent();
84 internal event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged
90 if (_connectionStateChanged == null)
92 RegisterConnectionStateChangedEvent();
94 _connectionStateChanged += value;
101 _connectionStateChanged -= value;
102 if (_connectionStateChanged == null)
104 UnregisterConnectionStateChangedEvent();
110 internal event EventHandler<RssiLevelChangedEventArgs> RssiLevelChanged
116 if (_rssiLevelChanged == null)
118 RegisterRssiLevelChangedEvent();
120 _rssiLevelChanged += value;
127 _rssiLevelChanged -= value;
128 if (_rssiLevelChanged == null)
130 UnregisterRssiLevelChangedEvent();
136 internal event EventHandler BackgroundScanFinished
142 if (_backgroundScanFinished == null)
144 RegisterBackgroundScanFinishedEvent();
146 _backgroundScanFinished += value;
153 _backgroundScanFinished -= value;
154 if (_backgroundScanFinished == null)
156 UnregisterBackgroundScanFinishedEvent();
162 private void RegisterDeviceStateChangedEvent()
164 Log.Info(Globals.LogTag, "RegisterDeviceStateChangedEvent in Thread " + Thread.CurrentThread.ManagedThreadId);
165 _deviceChangedCallback = (int deviceState, IntPtr userDate) =>
167 WiFiDeviceState state = (WiFiDeviceState)deviceState;
168 DeviceStateChangedEventArgs e = new DeviceStateChangedEventArgs(state);
169 _deviceStateChanged.SafeInvoke(null, e);
171 int ret = Interop.WiFi.SetDeviceStateChangedCallback(GetSafeHandle(), _deviceChangedCallback, IntPtr.Zero);
172 if (ret != (int)WiFiError.None)
174 Log.Error(Globals.LogTag, "Failed to set device state changed callback, Error - " + (WiFiError)ret);
178 private void UnregisterDeviceStateChangedEvent()
180 Log.Info(Globals.LogTag, "UnregisterDeviceStateChangedEvent in Thread " + Thread.CurrentThread.ManagedThreadId);
181 int ret = Interop.WiFi.UnsetDeviceStateChangedCallback(GetSafeHandle());
182 if (ret != (int)WiFiError.None)
184 Log.Error(Globals.LogTag, "Failed to unset device state changed callback, Error - " + (WiFiError)ret);
188 private void RegisterConnectionStateChangedEvent()
190 _connectionChangedCallback = (int connectionState, IntPtr ap, IntPtr userData) =>
192 if (ap != IntPtr.Zero)
194 WiFiConnectionState state = (WiFiConnectionState)connectionState;
195 ConnectionStateChangedEventArgs e = new ConnectionStateChangedEventArgs(state, ap);
196 _connectionStateChanged.SafeInvoke(null, e);
199 int ret = Interop.WiFi.SetConnectionStateChangedCallback(GetSafeHandle(), _connectionChangedCallback, IntPtr.Zero);
200 if (ret != (int)WiFiError.None)
202 Log.Error(Globals.LogTag, "Failed to set copnnection state changed callback, Error - " + (WiFiError)ret);
206 private void UnregisterConnectionStateChangedEvent()
208 int ret = Interop.WiFi.UnsetConnectionStateChangedCallback(GetSafeHandle());
209 if (ret != (int)WiFiError.None)
211 Log.Error(Globals.LogTag, "Failed to unset device state changed callback, Error - " + (WiFiError)ret);
215 private void RegisterRssiLevelChangedEvent()
218 _rssiChangedCallback = (int rssiLevel, IntPtr userDate) =>
220 WiFiRssiLevel level = (WiFiRssiLevel)rssiLevel;
221 RssiLevelChangedEventArgs e = new RssiLevelChangedEventArgs(level);
222 _rssiLevelChanged.SafeInvoke(null, e);
224 int ret = Interop.WiFi.SetRssiLevelchangedCallback(GetSafeHandle(), _rssiChangedCallback, IntPtr.Zero);
225 if (ret != (int)WiFiError.None)
227 Log.Error(Globals.LogTag, "Failed to set rssi level changed callback, Error - " + (WiFiError)ret);
231 private void UnregisterRssiLevelChangedEvent()
233 int ret = Interop.WiFi.UnsetRssiLevelchangedCallback(GetSafeHandle());
234 if (ret != (int)WiFiError.None)
236 Log.Error(Globals.LogTag, "Failed to unset rssi level changed callback, Error - " + (WiFiError)ret);
240 private void RegisterBackgroundScanFinishedEvent()
242 _backgroundScanFinishedCallback = (int result, IntPtr userDate) =>
244 EventArgs e = new EventArgs();
245 _backgroundScanFinished.SafeInvoke(null, e);
247 int ret = Interop.WiFi.SetBackgroundScanCallback(GetSafeHandle(), _backgroundScanFinishedCallback, IntPtr.Zero);
248 if (ret != (int)WiFiError.None)
250 Log.Error(Globals.LogTag, "Failed to set background scan callback, Error - " + (WiFiError)ret);
254 private void UnregisterBackgroundScanFinishedEvent()
256 int ret = Interop.WiFi.UnsetBackgroundScanCallback(GetSafeHandle());
257 if (ret != (int)WiFiError.None)
259 Log.Error(Globals.LogTag, "Failed to unset background scan callback, Error - " + (WiFiError)ret);