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.Collections.Generic;
19 using System.Runtime.InteropServices;
20 using System.Threading;
22 namespace Tizen.Network.WiFiDirect
24 internal class WiFiDirectThreadLocal
26 private int _threadId;
27 internal WiFiDirectThreadLocal(int id)
40 ~WiFiDirectThreadLocal()
42 Log.Info(Globals.LogTag, "Deinitializing Wi-Fi direct");
43 int ret = Interop.WiFiDirect.Deinitialize();
44 if (ret != (int)WiFiDirectError.None)
46 Log.Error(Globals.LogTag, "Failed to deinitialize Wi-Fi direct, Error - " + (WiFiDirectError)ret);
47 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
52 Globals.s_isInitialize = false;
57 internal static class Globals
59 internal const string LogTag = "Tizen.Network.WiFiDirect";
60 internal static bool s_isInitialize = false;
61 internal static bool s_isDisplay = false;
62 private static ThreadLocal<WiFiDirectThreadLocal> s_threadName = new ThreadLocal<WiFiDirectThreadLocal>(() =>
64 Log.Info(Globals.LogTag, "In threadlocal delegate");
65 return new WiFiDirectThreadLocal(Thread.CurrentThread.ManagedThreadId);
67 internal static bool IsActivated
71 WiFiDirectState _state = WiFiDirectManager.State;
74 if (_state == WiFiDirectState.Deactivated || _state == WiFiDirectState.Deactivating)
92 private static bool IsUniqueThread()
94 if (s_threadName.IsValueCreated)
96 Log.Info(Globals.LogTag, "This thread is old");
102 WiFiDirectThreadLocal obj = s_threadName.Value;
103 Log.Info(Globals.LogTag, "This thread is new , Id = " + obj.ThreadId);
108 internal static bool IsInitialize
112 if(Globals.IsUniqueThread() || !Globals.s_isInitialize)
114 WiFiDirectManagerImpl.Instance.Initialize();
117 return (Globals.s_isInitialize);
123 /// Implementation of Wi-Fi Direct Apis
125 internal partial class WiFiDirectManagerImpl : IDisposable
127 private event EventHandler<StateChangedEventArgs> _stateChanged;
128 private event EventHandler<DiscoveryStateChangedEventArgs > _discoveryStateChanged;
129 private event EventHandler<PeerFoundEventArgs > _peerFound;
130 private event EventHandler<DeviceStateChangedEventArgs > _deviceStateChanged;
131 private event EventHandler<ConnectionStatusChangedEventArgs > _connectionStatusChanged;
133 private Interop.WiFiDirect.StateChangedCallback _stateChangedCallback;
134 private Interop.WiFiDirect.DiscoveryStateChangedCallback _discoveryStateChangedCallback;
135 private Interop.WiFiDirect.PeerFoundCallback _peerFoundCallback;
136 private Interop.WiFiDirect.DeviceStateChangedCallback _deviceStateChangedCallback;
137 private Interop.WiFiDirect.ConnectionStateChangedCallback _connectionChangedCallback;
139 internal event EventHandler<StateChangedEventArgs> StateChanged
143 if (_stateChanged == null)
145 RegisterStateChangedEvent();
148 _stateChanged += value;
153 _stateChanged -= value;
154 if (_stateChanged == null)
156 UnregisterStateChangedEvent();
161 internal event EventHandler<DiscoveryStateChangedEventArgs> DiscoveryStateChanged
165 if (_discoveryStateChanged == null)
167 RegisterDiscoveryStateChangedEvent();
170 _discoveryStateChanged += value;
175 _discoveryStateChanged -= value;
176 if (_discoveryStateChanged == null)
178 UnregisterDiscoveryStateChangedEvent();
183 internal event EventHandler<PeerFoundEventArgs> PeerFound
187 if (_peerFound == null)
189 RegisterPeerFoundEvent();
198 if (_peerFound == null)
200 UnregisterPeerFoundEvent();
205 internal event EventHandler<DeviceStateChangedEventArgs> DeviceStateChanged
209 if (_deviceStateChanged == null)
211 RegisterDeviceStateChangedEvent();
214 _deviceStateChanged += value;
219 _deviceStateChanged -= value;
220 if (_deviceStateChanged == null)
222 UnregisterDeviceStateChangedEvent();
227 internal event EventHandler<ConnectionStatusChangedEventArgs> ConnectionStatusChanged
231 if (_connectionStatusChanged == null)
233 RegisterConnectionStatusChangedEvent();
236 _connectionStatusChanged += value;
241 _connectionStatusChanged -= value;
242 if (_connectionStatusChanged == null)
244 UnregisterConnectionStatusChangedEvent();
249 private bool _disposed = false;
250 private static WiFiDirectManagerImpl _instance;
252 private void RegisterStateChangedEvent()
254 _stateChangedCallback = (WiFiDirectState stateInfo, IntPtr userData) =>
256 if (_stateChanged != null)
258 WiFiDirectState state = stateInfo;
259 _stateChanged(null, new StateChangedEventArgs(state));
262 int ret = Interop.WiFiDirect.SetStateChangedCallback(_stateChangedCallback, IntPtr.Zero);
263 if (ret != (int)WiFiDirectError.None)
265 Log.Error(Globals.LogTag, "Failed to set Wi-Fi Direct state changed callback, Error - " + (WiFiDirectError)ret);
269 private void UnregisterStateChangedEvent()
271 int ret = Interop.WiFiDirect.UnsetStateChangedCallback();
272 if (ret != (int)WiFiDirectError.None)
274 Log.Error(Globals.LogTag, "Failed to unset Wi-Fi Direct state changed callback, Error - " + (WiFiDirectError)ret);
278 private void RegisterDiscoveryStateChangedEvent()
280 _discoveryStateChangedCallback = (int result, WiFiDirectDiscoveryState stateInfo, IntPtr userData) =>
282 if (_discoveryStateChanged != null)
284 WiFiDirectError error = (WiFiDirectError)result;
285 WiFiDirectDiscoveryState state = stateInfo;
286 _discoveryStateChanged(null, new DiscoveryStateChangedEventArgs(error, state));
289 int ret = Interop.WiFiDirect.SetDiscoveryStateChangedCallback(_discoveryStateChangedCallback, IntPtr.Zero);
290 if (ret != (int)WiFiDirectError.None)
292 Log.Error(Globals.LogTag, "Failed to set Wi-Fi Direct discovery state changed callback, Error - " + (WiFiDirectError)ret);
296 private void UnregisterDiscoveryStateChangedEvent()
298 int ret = Interop.WiFiDirect.UnsetDiscoveryStateChangedCallback();
299 if (ret != (int)WiFiDirectError.None)
301 Log.Error(Globals.LogTag, "Failed to unset Wi-Fi Direct discovery state changed callback, Error - " + (WiFiDirectError)ret);
305 private void RegisterPeerFoundEvent()
307 _peerFoundCallback = (int result, WiFiDirectDiscoveryState stateInfo, string address, IntPtr userData) =>
309 if (_peerFound != null)
311 WiFiDirectError error = (WiFiDirectError)result;
312 WiFiDirectDiscoveryState state = stateInfo;
314 Interop.WiFiDirect.GetDiscoveredPeerInfo(address, out peer);
315 DiscoveredPeerStruct peerStruct = (DiscoveredPeerStruct)Marshal.PtrToStructure(peer, typeof(DiscoveredPeerStruct));
316 _peerFound(null, new PeerFoundEventArgs(error, state, WiFiDirectUtils.ConvertStructToDiscoveredPeer(peerStruct)));
319 int ret = Interop.WiFiDirect.SetPeerFoundCallback(_peerFoundCallback, IntPtr.Zero);
320 if (ret != (int)WiFiDirectError.None)
322 Log.Error(Globals.LogTag, "Failed to set Wi-Fi Direct discovery state changed callback, Error - " + (WiFiDirectError)ret);
326 private void UnregisterPeerFoundEvent()
328 int ret = Interop.WiFiDirect.UnsetPeerFoundCallback();
329 if (ret != (int)WiFiDirectError.None)
331 Log.Error(Globals.LogTag, "Failed to unset Wi-Fi Direct discovery state changed callback, Error - " + (WiFiDirectError)ret);
335 private void RegisterDeviceStateChangedEvent()
337 _deviceStateChangedCallback = (int result, WiFiDirectDeviceState stateInfo, IntPtr userData) =>
339 if (_deviceStateChanged != null)
341 WiFiDirectError error = (WiFiDirectError)result;
342 WiFiDirectDeviceState state = stateInfo;
343 _deviceStateChanged(null, new DeviceStateChangedEventArgs(error, state));
346 int ret = Interop.WiFiDirect.SetDeviceStateChangedCallback(_deviceStateChangedCallback, IntPtr.Zero);
347 if (ret != (int)WiFiDirectError.None)
349 Log.Error(Globals.LogTag, "Failed to set device state changed callback, Error - " + (WiFiDirectError)ret);
353 private void UnregisterDeviceStateChangedEvent()
355 int ret = Interop.WiFiDirect.UnsetDeviceStateChangedCallback();
356 if (ret != (int)WiFiDirectError.None)
358 Log.Error(Globals.LogTag, "Failed to unset device state changed callback, Error - " + (WiFiDirectError)ret);
362 private void RegisterConnectionStatusChangedEvent()
364 _connectionChangedCallback = (int result, WiFiDirectConnectionState stateInfo, string address, IntPtr userData) =>
366 if (_connectionStatusChanged != null)
368 WiFiDirectError error = (WiFiDirectError)result;
369 WiFiDirectConnectionState state = stateInfo;
371 _connectionStatusChanged(null, new ConnectionStatusChangedEventArgs(error, state));
374 int ret = Interop.WiFiDirect.SetConnectionChangedCallback(_connectionChangedCallback, IntPtr.Zero);
375 if (ret != (int)WiFiDirectError.None)
377 Log.Error(Globals.LogTag, "Failed to set connection status changed callback, Error - " + (WiFiDirectError)ret);
381 private void UnregisterConnectionStatusChangedEvent()
383 int ret = Interop.WiFiDirect.UnsetConnectionChangedCallback();
384 if (ret != (int)WiFiDirectError.None)
386 Log.Error(Globals.LogTag, "Failed to unset connection status changed callback, Error - " + (WiFiDirectError)ret);
390 internal bool IsInitialize
394 return Globals.IsInitialize;
397 internal bool IsGroupOwner
402 int ret = Interop.WiFiDirect.IsGroupOwner(out isGroupOwner);
403 if (ret != (int)WiFiDirectError.None)
405 Log.Error(Globals.LogTag, "Failed to get whether this device is the group owner or not, Error - " + (WiFiDirectError)ret);
412 internal bool IsAutonomousGroup
416 bool isAutonomousGroup;
417 int ret = Interop.WiFiDirect.IsAutonomousGroup(out isAutonomousGroup);
418 if (ret != (int)WiFiDirectError.None)
420 Log.Error(Globals.LogTag, "Failed to check whether the current group is autonomous or not, Error - " + (WiFiDirectError)ret);
423 return isAutonomousGroup;
432 int ret = Interop.WiFiDirect.GetSsid(out ssid);
433 if (ret != (int)WiFiDirectError.None)
435 Log.Error(Globals.LogTag, "Failed to get SSID of local device, Error - " + (WiFiDirectError)ret);
443 internal string NetworkInterface
447 string networkInterface;
448 int ret = Interop.WiFiDirect.GetInterfaceName(out networkInterface);
449 if (ret != (int)WiFiDirectError.None)
451 Log.Error(Globals.LogTag, "Failed to get name of network interface, Error - " + (WiFiDirectError)ret);
455 return networkInterface;
459 internal string IpAddress
464 int ret = Interop.WiFiDirect.GetIpAddress(out ipAddress);
465 if (ret != (int)WiFiDirectError.None)
467 Log.Error(Globals.LogTag, "Failed to get IP address of local device, Error - " + (WiFiDirectError)ret);
475 internal string SubnetMask
480 int ret = Interop.WiFiDirect.GetSubnetMask(out subnetMask);
481 if (ret != (int)WiFiDirectError.None)
483 Log.Error(Globals.LogTag, "Failed to get subnet mask, Error - " + (WiFiDirectError)ret);
491 internal string GatewayAddress
495 string gatewayAddress;
496 int ret = Interop.WiFiDirect.GetGatewayAddress(out gatewayAddress);
497 if (ret != (int)WiFiDirectError.None)
499 Log.Error(Globals.LogTag, "Failed to get gateway address, Error - " + (WiFiDirectError)ret);
503 return gatewayAddress;
507 internal string MacAddress
512 int ret = Interop.WiFiDirect.GetMacAddress(out macAddress);
513 if (ret != (int)WiFiDirectError.None)
515 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiDirectError)ret);
523 internal WiFiDirectState State
527 WiFiDirectState state;
528 int ret = Interop.WiFiDirect.GetState(out state);
529 if (ret != (int)WiFiDirectError.None)
531 Log.Error(Globals.LogTag, "Failed to get state of Wi-Fi direct service, Error - " + (WiFiDirectError)ret);
538 internal bool IsDiscoverable
543 int ret = Interop.WiFiDirect.IsDiscoverable(out isDiscoverable);
544 if (ret != (int)WiFiDirectError.None)
546 Log.Error(Globals.LogTag, "Failed to check whether the device is discoverable, Error - " + (WiFiDirectError)ret);
549 return isDiscoverable;
553 internal bool IsListenOnly
558 int ret = Interop.WiFiDirect.IsListeningOnly(out isListenOnly);
559 if (ret != (int)WiFiDirectError.None)
561 Log.Error(Globals.LogTag, "Failed to check whether the local device is listening only, Error - " + (WiFiDirectError)ret);
568 internal WiFiDirectPrimaryDeviceType PrimaryType
572 WiFiDirectPrimaryDeviceType primaryType;
573 int ret = Interop.WiFiDirect.GetPrimaryType(out primaryType);
574 if (ret != (int)WiFiDirectError.None)
576 Log.Error(Globals.LogTag, "Failed to get the primary device type of local device, Error - " + (WiFiDirectError)ret);
583 internal WiFiDirectSecondaryDeviceType SecondaryType
587 WiFiDirectSecondaryDeviceType secondaryType;
588 int ret = Interop.WiFiDirect.GetSecondaryType(out secondaryType);
589 if (ret != (int)WiFiDirectError.None)
591 Log.Error(Globals.LogTag, "Failed to get the secondary device type of local device, Error - " + (WiFiDirectError)ret);
594 return secondaryType;
603 int ret = Interop.WiFiDirect.GetWpsMode(out mode);
604 if (ret != (int)WiFiDirectError.None)
606 Log.Error(Globals.LogTag, "Failed to get supproted wps modes at local device, Error - " + (WiFiDirectError)ret);
614 internal WiFiDirectWpsType WpsType
618 WiFiDirectWpsType wpsType;
619 int ret = Interop.WiFiDirect.GetLocalWpsType(out wpsType);
620 if (ret != (int)WiFiDirectError.None)
622 Log.Error(Globals.LogTag, "Failed to get the WPS type, Error - " + (WiFiDirectError)ret);
629 internal int OperatingChannel
634 int ret = Interop.WiFiDirect.GetChannel(out channel);
635 if (ret != (int)WiFiDirectError.None)
637 Log.Error(Globals.LogTag, "Failed to get operating channel, Error - " + (WiFiDirectError)ret);
645 internal bool PersistentGroupEnabled
650 int ret = Interop.WiFiDirect.GetPersistentGroupState(out isEnabled);
651 if (ret != (int)WiFiDirectError.None)
653 Log.Error(Globals.LogTag, "Failed to check persistent group state, Error - " + (WiFiDirectError)ret);
661 int ret = Interop.WiFiDirect.SetPersistentGroupState(value);
662 if (ret != (int)WiFiDirectError.None)
664 Log.Error(Globals.LogTag, "Failed to set the persistent group state, Error - " + (WiFiDirectError)ret);
665 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
670 internal bool AutoConnect
675 int ret = Interop.WiFiDirect.GetAutoConnectionMode(out isAutoConnect);
676 if (ret != (int)WiFiDirectError.None)
678 Log.Error(Globals.LogTag, "Failed to get autoconnection mode status, Error - " + (WiFiDirectError)ret);
681 return isAutoConnect;
686 int ret = Interop.WiFiDirect.SetAutoConnectionMode(value);
687 if (ret != (int)WiFiDirectError.None)
689 Log.Error(Globals.LogTag, "Failed to set the autoconnection mode, Error - " + (WiFiDirectError)ret);
690 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
695 internal string WpsPin
700 int ret = Interop.WiFiDirect.GetWpsPin(out pin);
701 if (ret != (int)WiFiDirectError.None)
703 Log.Error(Globals.LogTag, "Failed to get WPS pin, Error - " + (WiFiDirectError)ret);
711 int ret = Interop.WiFiDirect.SetWpsPin(value.ToString());
712 if (ret != (int)WiFiDirectError.None)
714 Log.Error(Globals.LogTag, "Failed to set or update WPS pin, Error - " + (WiFiDirectError)ret);
715 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
725 int ret = Interop.WiFiDirect.GetName(out name);
726 if (ret != (int)WiFiDirectError.None)
728 Log.Error(Globals.LogTag, "Failed to get name of local device, Error - " + (WiFiDirectError)ret);
737 int ret = Interop.WiFiDirect.SetName(value.ToString());
738 if (ret != (int)WiFiDirectError.None)
740 Log.Error(Globals.LogTag, "Failed to set name of local device, Error - " + (WiFiDirectError)ret);
741 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
746 internal WiFiDirectWpsType RequestedWps
750 WiFiDirectWpsType wpsType;
751 int ret = Interop.WiFiDirect.GetReqWpsType(out wpsType);
752 if (ret != (int)WiFiDirectError.None)
754 Log.Error(Globals.LogTag, "Failed to get the requested WPS type, Error - " + (WiFiDirectError)ret);
762 int ret = Interop.WiFiDirect.SetReqWpsType(value);
763 if (ret != (int)WiFiDirectError.None)
765 Log.Error(Globals.LogTag, "Failed to set the requested WPS type, Error - " + (WiFiDirectError)ret);
766 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
771 internal int GroupOwnerIntent
776 int ret = Interop.WiFiDirect.GetIntent(out intent);
777 if (ret != (int)WiFiDirectError.None)
779 Log.Error(Globals.LogTag, "Failed to get the intent of the group owner, Error - " + (WiFiDirectError)ret);
787 int ret = Interop.WiFiDirect.SetIntent(value);
788 if (ret != (int)WiFiDirectError.None)
790 Log.Error(Globals.LogTag, "Failed to set the intent of the group owner, Error - " + (WiFiDirectError)ret);
791 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
796 internal int MaxClients
801 int ret = Interop.WiFiDirect.GetMaxClients(out maxClients);
802 if (ret != (int)WiFiDirectError.None)
804 Log.Error(Globals.LogTag, "Failed to get the max number of clients, Error - " + (WiFiDirectError)ret);
812 int ret = Interop.WiFiDirect.SetMaxClients(value);
813 if (ret != (int)WiFiDirectError.None)
815 Log.Error(Globals.LogTag, "Failed to set the max number of clients, Error - " + (WiFiDirectError)ret);
816 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
821 internal string Passphrase
826 int ret = Interop.WiFiDirect.GetPassPhrase(out passphrase);
827 if (ret != (int)WiFiDirectError.None)
829 Log.Error(Globals.LogTag, "Failed to get Wi-Fi Protected Access password, Error - " + (WiFiDirectError)ret);
838 int ret = Interop.WiFiDirect.SetPassPhrase(value.ToString());
839 if (ret != (int)WiFiDirectError.None)
841 Log.Error(Globals.LogTag, "Failed to set or update Wi-Fi Protected Access password, Error - " + (WiFiDirectError)ret);
842 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
847 internal int SessionTimer
852 int ret = Interop.WiFiDirect.GetSessionTimer(out sessionTimer);
853 if (ret != (int)WiFiDirectError.None)
855 Log.Error(Globals.LogTag, "Failed to get the timer used to expire the connection session, Error - " + (WiFiDirectError)ret);
863 int ret = Interop.WiFiDirect.SetSessionTimer(value);
864 if (ret != (int)WiFiDirectError.None)
866 Log.Error(Globals.LogTag, "Failed to set the timer used to expire the connection session, Error - " + (WiFiDirectError)ret);
867 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
872 internal void Activate()
874 int ret = Interop.WiFiDirect.Activate();
875 if (ret != (int)WiFiDirectError.None)
877 Log.Error(Globals.LogTag, "Failed to activate Wi-Fi direct service, Error - " + (WiFiDirectError)ret);
878 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
882 internal void Deactivate()
884 int ret = Interop.WiFiDirect.Deactivate();
885 if (ret != (int)WiFiDirectError.None)
887 Log.Error(Globals.LogTag, "Failed to deactivate Wi-Fi direct service, Error - " + (WiFiDirectError)ret);
888 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
892 internal void StartDiscovery(bool listenOnly, int duration, WiFiDirectDiscoveryChannel channel = WiFiDirectDiscoveryChannel.FullScan)
894 int ret = Interop.WiFiDirect.StartDiscoveryInChannel(listenOnly, duration, channel);
895 if (ret != (int)WiFiDirectError.None)
897 Log.Error(Globals.LogTag, "Failed to start discovery, Error - " + (WiFiDirectError)ret);
898 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
902 internal void CancelDiscovery()
904 int ret = Interop.WiFiDirect.StopDiscovery();
905 if (ret != (int)WiFiDirectError.None)
907 Log.Error(Globals.LogTag, "Failed to cancel discovery, Error - " + (WiFiDirectError)ret);
908 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
912 internal IEnumerable<WiFiDirectPeer> GetDiscoveredPeers()
914 List<WiFiDirectPeer> discoveredPeerList = new List<WiFiDirectPeer>();
915 Interop.WiFiDirect.DiscoveredPeerCallback callback = (ref DiscoveredPeerStruct peer, IntPtr userData) =>
917 if (!peer.Equals(null))
919 discoveredPeerList.Add(WiFiDirectUtils.ConvertStructToDiscoveredPeer(peer));
924 int ret = Interop.WiFiDirect.GetDiscoveredPeers(callback, IntPtr.Zero);
925 if (ret != (int)WiFiDirectError.None)
927 Log.Error(Globals.LogTag, "Failed to get information of discovered peers, Error - " + (WiFiDirectError)ret);
928 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
931 return discoveredPeerList;
934 internal IEnumerable<WiFiDirectPeer> GetConnectedPeers()
936 List<WiFiDirectPeer> connectedPeerList = new List<WiFiDirectPeer>();
937 Interop.WiFiDirect.ConnectedPeerCallback callback = (ref ConnectedPeerStruct peer, IntPtr userData) =>
939 if (!peer.Equals(null))
941 connectedPeerList.Add(WiFiDirectUtils.ConvertStructToConnectedPeer(peer));
946 int ret = Interop.WiFiDirect.GetConnectedPeers(callback, IntPtr.Zero);
947 if (ret != (int)WiFiDirectError.None)
949 Log.Error(Globals.LogTag, "Failed to get information of connected peers, Error - " + (WiFiDirectError)ret);
950 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
953 return connectedPeerList;
956 internal void DisconnectAll()
958 int ret = Interop.WiFiDirect.DisconnectAll();
959 if (ret != (int)WiFiDirectError.None)
961 Log.Error(Globals.LogTag, "Failed to disconnect all connected links, Error - " + (WiFiDirectError)ret);
962 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
966 internal void CreateGroup()
968 int ret = Interop.WiFiDirect.CreateGroup();
969 if (ret != (int)WiFiDirectError.None)
971 Log.Error(Globals.LogTag, "Failed to create a WiFi-Direct group, Error - " + (WiFiDirectError)ret);
972 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
976 internal void DestroyGroup()
978 int ret = Interop.WiFiDirect.DestroyGroup();
979 if (ret != (int)WiFiDirectError.None)
981 Log.Error(Globals.LogTag, "Failed to destroy the WiFi-Direct group, Error - " + (WiFiDirectError)ret);
982 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
986 internal void ActivatePushButton()
988 int ret = Interop.WiFiDirect.ActivatePushButton();
989 if (ret != (int)WiFiDirectError.None)
991 Log.Error(Globals.LogTag, "Failed to set the Wps config PBC, Error - " + (WiFiDirectError)ret);
992 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
996 internal IEnumerable<WiFiDirectWpsType> GetSupportedWpsTypes()
998 List<WiFiDirectWpsType> wpsList = new List<WiFiDirectWpsType>();
999 Interop.WiFiDirect.WpsTypeCallback callback = (WiFiDirectWpsType type, IntPtr userData) =>
1001 if (!type.Equals(null))
1008 int ret = Interop.WiFiDirect.GetWpsTypes(callback, IntPtr.Zero);
1009 if (ret != (int)WiFiDirectError.None)
1011 Log.Error(Globals.LogTag, "Failed to get the supported WPS types, Error - " + (WiFiDirectError)ret);
1012 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1018 internal IEnumerable<WiFiDirectPersistentGroup> GetPersistentGroups()
1020 List<WiFiDirectPersistentGroup> persistentGroupList = new List<WiFiDirectPersistentGroup>();
1021 Interop.WiFiDirect.PersistentGroupCallback callback = (string address, string ssid, IntPtr userData) =>
1023 if (address != null && ssid != null)
1025 persistentGroupList.Add(new WiFiDirectPersistentGroup(address, ssid));
1030 int ret = Interop.WiFiDirect.GetPersistentGroups(callback, IntPtr.Zero);
1031 if (ret != (int)WiFiDirectError.None)
1033 Log.Error(Globals.LogTag, "Failed to get the persistent groups, Error - " + (WiFiDirectError)ret);
1034 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1037 return persistentGroupList;
1040 internal void RemovePersistentGroup(WiFiDirectPersistentGroup group)
1042 int ret = Interop.WiFiDirect.RemovePersistentGroup(group.MacAddress, group.Ssid);
1043 if (ret != (int)WiFiDirectError.None)
1045 Log.Error(Globals.LogTag, "Failed to remove a persistent group, Error - " + (WiFiDirectError)ret);
1046 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1050 internal void InitMiracast(bool enable)
1052 int ret = Interop.WiFiDirect.InitMiracast(enable);
1053 if (ret != (int)WiFiDirectError.None)
1055 Log.Error(Globals.LogTag, "Failed to set the WiFi-Direct Display(MIRACAST) service, Error - " + (WiFiDirectError)ret);
1056 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1060 internal void InitDisplay()
1062 int ret = Interop.WiFiDirect.InitDisplay();
1063 if (ret != (int)WiFiDirectError.None)
1065 Log.Error(Globals.LogTag, "Failed to enable Wi-Fi Display functionality, Error - " + (WiFiDirectError)ret);
1066 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1071 Globals.s_isDisplay = true;
1075 internal void DeinitDisplay()
1077 int ret = Interop.WiFiDirect.DeinitDisplay();
1078 if (ret != (int)WiFiDirectError.None)
1080 Log.Error(Globals.LogTag, "Failed to disable Wi-Fi Display functionality, Error - " + (WiFiDirectError)ret);
1081 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1086 Globals.s_isDisplay = false;
1090 internal void SetDisplay(WiFiDirectDisplayType type, int port, int hdcp)
1092 int ret = Interop.WiFiDirect.SetDisplay(type, port, hdcp);
1093 if (ret != (int)WiFiDirectError.None)
1095 Log.Error(Globals.LogTag, "Failed to set the Wi-Fi Display parameters, Error - " + (WiFiDirectError)ret);
1096 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1100 internal void SetDisplayAvailability(bool availability)
1102 int ret = Interop.WiFiDirect.SetDisplayAvailability(availability);
1103 if (ret != (int)WiFiDirectError.None)
1105 Log.Error(Globals.LogTag, "Failed to set the Wi-Fi Display session availability, Error - " + (WiFiDirectError)ret);
1106 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1110 internal void SetAutoGroupRemove(bool enable)
1112 int ret = Interop.WiFiDirect.SetAutoGroupRemoval(enable);
1113 if (ret != (int)WiFiDirectError.None)
1115 Log.Error(Globals.LogTag, "Failed to set automatic group removal feature when all peers are disconnected, Error - " + (WiFiDirectError)ret);
1116 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1120 internal uint RegisterService(WiFiDirectServiceType type, string info, string serviceInfo)
1123 int ret = Interop.WiFiDirect.RegisterService(type, info, serviceInfo, out serviceId);
1124 if (ret != (int)WiFiDirectError.None)
1126 Log.Error(Globals.LogTag, "Failed to register for service, Error - " + (WiFiDirectError)ret);
1127 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1133 internal void DeregisterService(uint serviceId)
1135 int ret = Interop.WiFiDirect.DeregisterService(serviceId);
1136 if (ret != (int)WiFiDirectError.None)
1138 Log.Error(Globals.LogTag, "Failed to deregister service, Error - " + (WiFiDirectError)ret);
1139 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1143 internal static WiFiDirectManagerImpl Instance
1147 if (_instance == null)
1149 _instance = new WiFiDirectManagerImpl();
1156 private WiFiDirectManagerImpl()
1160 internal void Initialize()
1162 int ret = Interop.WiFiDirect.Initialize();
1163 if (ret != (int)WiFiDirectError.None)
1165 Log.Error(Globals.LogTag, "Failed to initialize Wi-Fi direct, Error - " + (WiFiDirectError)ret);
1166 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1171 Globals.s_isInitialize = true;
1175 ~WiFiDirectManagerImpl()
1180 public void Dispose()
1183 GC.SuppressFinalize(this);
1186 private void Dispose(bool disposing)
1195 // Free managed objects.
1198 //Free unmanaged objects
1199 RemoveAllRegisteredEvent();
1204 private void Deinitialize()
1206 int ret = Interop.WiFiDirect.Deinitialize();
1207 if (ret != (int)WiFiDirectError.None)
1209 Log.Error(Globals.LogTag, "Failed to deinitialize Wi-Fi direct, Error - " + (WiFiDirectError)ret);
1210 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1215 Globals.s_isInitialize = false;
1219 private void RemoveAllRegisteredEvent()
1221 //unregister all remaining events when this object is released.
1222 if (_stateChanged != null)
1224 UnregisterStateChangedEvent();
1227 if (_discoveryStateChanged != null)
1229 UnregisterDiscoveryStateChangedEvent();
1232 if (_peerFound != null)
1234 UnregisterPeerFoundEvent();
1237 if (_deviceStateChanged != null)
1239 UnregisterDeviceStateChangedEvent();
1242 if (_connectionStatusChanged != null)
1244 UnregisterConnectionStatusChangedEvent();