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 IsGroupOwner
395 int ret = Interop.WiFiDirect.IsGroupOwner(out isGroupOwner);
396 if (ret != (int)WiFiDirectError.None)
398 Log.Error(Globals.LogTag, "Failed to get whether this device is the group owner or not, Error - " + (WiFiDirectError)ret);
405 internal bool IsAutonomousGroup
409 bool isAutonomousGroup;
410 int ret = Interop.WiFiDirect.IsAutonomousGroup(out isAutonomousGroup);
411 if (ret != (int)WiFiDirectError.None)
413 Log.Error(Globals.LogTag, "Failed to check whether the current group is autonomous or not, Error - " + (WiFiDirectError)ret);
416 return isAutonomousGroup;
425 int ret = Interop.WiFiDirect.GetSsid(out ssid);
426 if (ret != (int)WiFiDirectError.None)
428 Log.Error(Globals.LogTag, "Failed to get SSID of local device, Error - " + (WiFiDirectError)ret);
436 internal string NetworkInterface
440 string networkInterface;
441 int ret = Interop.WiFiDirect.GetInterfaceName(out networkInterface);
442 if (ret != (int)WiFiDirectError.None)
444 Log.Error(Globals.LogTag, "Failed to get name of network interface, Error - " + (WiFiDirectError)ret);
448 return networkInterface;
452 internal string IpAddress
457 int ret = Interop.WiFiDirect.GetIpAddress(out ipAddress);
458 if (ret != (int)WiFiDirectError.None)
460 Log.Error(Globals.LogTag, "Failed to get IP address of local device, Error - " + (WiFiDirectError)ret);
468 internal string SubnetMask
473 int ret = Interop.WiFiDirect.GetSubnetMask(out subnetMask);
474 if (ret != (int)WiFiDirectError.None)
476 Log.Error(Globals.LogTag, "Failed to get subnet mask, Error - " + (WiFiDirectError)ret);
484 internal string GatewayAddress
488 string gatewayAddress;
489 int ret = Interop.WiFiDirect.GetGatewayAddress(out gatewayAddress);
490 if (ret != (int)WiFiDirectError.None)
492 Log.Error(Globals.LogTag, "Failed to get gateway address, Error - " + (WiFiDirectError)ret);
496 return gatewayAddress;
500 internal string MacAddress
505 int ret = Interop.WiFiDirect.GetMacAddress(out macAddress);
506 if (ret != (int)WiFiDirectError.None)
508 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiDirectError)ret);
516 internal WiFiDirectState State
520 WiFiDirectState state;
521 int ret = Interop.WiFiDirect.GetState(out state);
522 if (ret != (int)WiFiDirectError.None)
524 Log.Error(Globals.LogTag, "Failed to get state of Wi-Fi direct service, Error - " + (WiFiDirectError)ret);
531 internal bool IsDiscoverable
536 int ret = Interop.WiFiDirect.IsDiscoverable(out isDiscoverable);
537 if (ret != (int)WiFiDirectError.None)
539 Log.Error(Globals.LogTag, "Failed to check whether the device is discoverable, Error - " + (WiFiDirectError)ret);
542 return isDiscoverable;
546 internal bool IsListenOnly
551 int ret = Interop.WiFiDirect.IsListeningOnly(out isListenOnly);
552 if (ret != (int)WiFiDirectError.None)
554 Log.Error(Globals.LogTag, "Failed to check whether the local device is listening only, Error - " + (WiFiDirectError)ret);
561 internal WiFiDirectPrimaryDeviceType PrimaryType
565 WiFiDirectPrimaryDeviceType primaryType;
566 int ret = Interop.WiFiDirect.GetPrimaryType(out primaryType);
567 if (ret != (int)WiFiDirectError.None)
569 Log.Error(Globals.LogTag, "Failed to get the primary device type of local device, Error - " + (WiFiDirectError)ret);
576 internal WiFiDirectSecondaryDeviceType SecondaryType
580 WiFiDirectSecondaryDeviceType secondaryType;
581 int ret = Interop.WiFiDirect.GetSecondaryType(out secondaryType);
582 if (ret != (int)WiFiDirectError.None)
584 Log.Error(Globals.LogTag, "Failed to get the secondary device type of local device, Error - " + (WiFiDirectError)ret);
587 return secondaryType;
596 int ret = Interop.WiFiDirect.GetWpsMode(out mode);
597 if (ret != (int)WiFiDirectError.None)
599 Log.Error(Globals.LogTag, "Failed to get supproted wps modes at local device, Error - " + (WiFiDirectError)ret);
607 internal WiFiDirectWpsType WpsType
611 WiFiDirectWpsType wpsType;
612 int ret = Interop.WiFiDirect.GetLocalWpsType(out wpsType);
613 if (ret != (int)WiFiDirectError.None)
615 Log.Error(Globals.LogTag, "Failed to get the WPS type, Error - " + (WiFiDirectError)ret);
622 internal int OperatingChannel
627 int ret = Interop.WiFiDirect.GetChannel(out channel);
628 if (ret != (int)WiFiDirectError.None)
630 Log.Error(Globals.LogTag, "Failed to get operating channel, Error - " + (WiFiDirectError)ret);
638 internal bool PersistentGroupEnabled
643 int ret = Interop.WiFiDirect.GetPersistentGroupState(out isEnabled);
644 if (ret != (int)WiFiDirectError.None)
646 Log.Error(Globals.LogTag, "Failed to check persistent group state, Error - " + (WiFiDirectError)ret);
654 int ret = Interop.WiFiDirect.SetPersistentGroupState(value);
655 if (ret != (int)WiFiDirectError.None)
657 Log.Error(Globals.LogTag, "Failed to set the persistent group state, Error - " + (WiFiDirectError)ret);
658 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
663 internal bool AutoConnect
668 int ret = Interop.WiFiDirect.GetAutoConnectionMode(out isAutoConnect);
669 if (ret != (int)WiFiDirectError.None)
671 Log.Error(Globals.LogTag, "Failed to get autoconnection mode status, Error - " + (WiFiDirectError)ret);
674 return isAutoConnect;
679 int ret = Interop.WiFiDirect.SetAutoConnectionMode(value);
680 if (ret != (int)WiFiDirectError.None)
682 Log.Error(Globals.LogTag, "Failed to set the autoconnection mode, Error - " + (WiFiDirectError)ret);
683 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
688 internal string WpsPin
693 int ret = Interop.WiFiDirect.GetWpsPin(out pin);
694 if (ret != (int)WiFiDirectError.None)
696 Log.Error(Globals.LogTag, "Failed to get WPS pin, Error - " + (WiFiDirectError)ret);
704 int ret = Interop.WiFiDirect.SetWpsPin(value.ToString());
705 if (ret != (int)WiFiDirectError.None)
707 Log.Error(Globals.LogTag, "Failed to set or update WPS pin, Error - " + (WiFiDirectError)ret);
708 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
718 int ret = Interop.WiFiDirect.GetName(out name);
719 if (ret != (int)WiFiDirectError.None)
721 Log.Error(Globals.LogTag, "Failed to get name of local device, Error - " + (WiFiDirectError)ret);
730 int ret = Interop.WiFiDirect.SetName(value.ToString());
731 if (ret != (int)WiFiDirectError.None)
733 Log.Error(Globals.LogTag, "Failed to set name of local device, Error - " + (WiFiDirectError)ret);
734 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
739 internal WiFiDirectWpsType RequestedWps
743 WiFiDirectWpsType wpsType;
744 int ret = Interop.WiFiDirect.GetReqWpsType(out wpsType);
745 if (ret != (int)WiFiDirectError.None)
747 Log.Error(Globals.LogTag, "Failed to get the requested WPS type, Error - " + (WiFiDirectError)ret);
755 int ret = Interop.WiFiDirect.SetReqWpsType(value);
756 if (ret != (int)WiFiDirectError.None)
758 Log.Error(Globals.LogTag, "Failed to set the requested WPS type, Error - " + (WiFiDirectError)ret);
759 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
764 internal int GroupOwnerIntent
769 int ret = Interop.WiFiDirect.GetIntent(out intent);
770 if (ret != (int)WiFiDirectError.None)
772 Log.Error(Globals.LogTag, "Failed to get the intent of the group owner, Error - " + (WiFiDirectError)ret);
780 int ret = Interop.WiFiDirect.SetIntent(value);
781 if (ret != (int)WiFiDirectError.None)
783 Log.Error(Globals.LogTag, "Failed to set the intent of the group owner, Error - " + (WiFiDirectError)ret);
784 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
789 internal int MaxClients
794 int ret = Interop.WiFiDirect.GetMaxClients(out maxClients);
795 if (ret != (int)WiFiDirectError.None)
797 Log.Error(Globals.LogTag, "Failed to get the max number of clients, Error - " + (WiFiDirectError)ret);
805 int ret = Interop.WiFiDirect.SetMaxClients(value);
806 if (ret != (int)WiFiDirectError.None)
808 Log.Error(Globals.LogTag, "Failed to set the max number of clients, Error - " + (WiFiDirectError)ret);
809 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
814 internal string Passphrase
819 int ret = Interop.WiFiDirect.GetPassPhrase(out passphrase);
820 if (ret != (int)WiFiDirectError.None)
822 Log.Error(Globals.LogTag, "Failed to get Wi-Fi Protected Access password, Error - " + (WiFiDirectError)ret);
831 int ret = Interop.WiFiDirect.SetPassPhrase(value.ToString());
832 if (ret != (int)WiFiDirectError.None)
834 Log.Error(Globals.LogTag, "Failed to set or update Wi-Fi Protected Access password, Error - " + (WiFiDirectError)ret);
835 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
840 internal int SessionTimer
845 int ret = Interop.WiFiDirect.GetSessionTimer(out sessionTimer);
846 if (ret != (int)WiFiDirectError.None)
848 Log.Error(Globals.LogTag, "Failed to get the timer used to expire the connection session, Error - " + (WiFiDirectError)ret);
856 int ret = Interop.WiFiDirect.SetSessionTimer(value);
857 if (ret != (int)WiFiDirectError.None)
859 Log.Error(Globals.LogTag, "Failed to set the timer used to expire the connection session, Error - " + (WiFiDirectError)ret);
860 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
865 internal void Activate()
867 int ret = Interop.WiFiDirect.Activate();
868 if (ret != (int)WiFiDirectError.None)
870 Log.Error(Globals.LogTag, "Failed to activate Wi-Fi direct service, Error - " + (WiFiDirectError)ret);
871 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
875 internal void Deactivate()
877 int ret = Interop.WiFiDirect.Deactivate();
878 if (ret != (int)WiFiDirectError.None)
880 Log.Error(Globals.LogTag, "Failed to deactivate Wi-Fi direct service, Error - " + (WiFiDirectError)ret);
881 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
885 internal void StartDiscovery(bool listenOnly, int duration, WiFiDirectDiscoveryChannel channel = WiFiDirectDiscoveryChannel.FullScan)
887 int ret = Interop.WiFiDirect.StartDiscoveryInChannel(listenOnly, duration, channel);
888 if (ret != (int)WiFiDirectError.None)
890 Log.Error(Globals.LogTag, "Failed to start discovery, Error - " + (WiFiDirectError)ret);
891 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
895 internal void CancelDiscovery()
897 int ret = Interop.WiFiDirect.StopDiscovery();
898 if (ret != (int)WiFiDirectError.None)
900 Log.Error(Globals.LogTag, "Failed to cancel discovery, Error - " + (WiFiDirectError)ret);
901 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
905 internal IEnumerable<WiFiDirectPeer> GetDiscoveredPeers()
907 List<WiFiDirectPeer> discoveredPeerList = new List<WiFiDirectPeer>();
908 Interop.WiFiDirect.DiscoveredPeerCallback callback = (ref DiscoveredPeerStruct peer, IntPtr userData) =>
910 if (!peer.Equals(null))
912 discoveredPeerList.Add(WiFiDirectUtils.ConvertStructToDiscoveredPeer(peer));
917 int ret = Interop.WiFiDirect.GetDiscoveredPeers(callback, IntPtr.Zero);
918 if (ret != (int)WiFiDirectError.None)
920 Log.Error(Globals.LogTag, "Failed to get information of discovered peers, Error - " + (WiFiDirectError)ret);
921 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
924 return discoveredPeerList;
927 internal IEnumerable<WiFiDirectPeer> GetConnectedPeers()
929 List<WiFiDirectPeer> connectedPeerList = new List<WiFiDirectPeer>();
930 Interop.WiFiDirect.ConnectedPeerCallback callback = (ref ConnectedPeerStruct peer, IntPtr userData) =>
932 if (!peer.Equals(null))
934 connectedPeerList.Add(WiFiDirectUtils.ConvertStructToConnectedPeer(peer));
939 int ret = Interop.WiFiDirect.GetConnectedPeers(callback, IntPtr.Zero);
940 if (ret != (int)WiFiDirectError.None)
942 Log.Error(Globals.LogTag, "Failed to get information of connected peers, Error - " + (WiFiDirectError)ret);
943 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
946 return connectedPeerList;
949 internal void DisconnectAll()
951 int ret = Interop.WiFiDirect.DisconnectAll();
952 if (ret != (int)WiFiDirectError.None)
954 Log.Error(Globals.LogTag, "Failed to disconnect all connected links, Error - " + (WiFiDirectError)ret);
955 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
959 internal void CreateGroup()
961 int ret = Interop.WiFiDirect.CreateGroup();
962 if (ret != (int)WiFiDirectError.None)
964 Log.Error(Globals.LogTag, "Failed to create a WiFi-Direct group, Error - " + (WiFiDirectError)ret);
965 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
969 internal void DestroyGroup()
971 int ret = Interop.WiFiDirect.DestroyGroup();
972 if (ret != (int)WiFiDirectError.None)
974 Log.Error(Globals.LogTag, "Failed to destroy the WiFi-Direct group, Error - " + (WiFiDirectError)ret);
975 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
979 internal void ActivatePushButton()
981 int ret = Interop.WiFiDirect.ActivatePushButton();
982 if (ret != (int)WiFiDirectError.None)
984 Log.Error(Globals.LogTag, "Failed to set the Wps config PBC, Error - " + (WiFiDirectError)ret);
985 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
989 internal IEnumerable<WiFiDirectWpsType> GetSupportedWpsTypes()
991 List<WiFiDirectWpsType> wpsList = new List<WiFiDirectWpsType>();
992 Interop.WiFiDirect.WpsTypeCallback callback = (WiFiDirectWpsType type, IntPtr userData) =>
994 if (!type.Equals(null))
1001 int ret = Interop.WiFiDirect.GetWpsTypes(callback, IntPtr.Zero);
1002 if (ret != (int)WiFiDirectError.None)
1004 Log.Error(Globals.LogTag, "Failed to get the supported WPS types, Error - " + (WiFiDirectError)ret);
1005 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1011 internal IEnumerable<WiFiDirectPersistentGroup> GetPersistentGroups()
1013 List<WiFiDirectPersistentGroup> persistentGroupList = new List<WiFiDirectPersistentGroup>();
1014 Interop.WiFiDirect.PersistentGroupCallback callback = (string address, string ssid, IntPtr userData) =>
1016 if (address != null && ssid != null)
1018 persistentGroupList.Add(new WiFiDirectPersistentGroup(address, ssid));
1023 int ret = Interop.WiFiDirect.GetPersistentGroups(callback, IntPtr.Zero);
1024 if (ret != (int)WiFiDirectError.None)
1026 Log.Error(Globals.LogTag, "Failed to get the persistent groups, Error - " + (WiFiDirectError)ret);
1027 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1030 return persistentGroupList;
1033 internal void RemovePersistentGroup(WiFiDirectPersistentGroup group)
1035 int ret = Interop.WiFiDirect.RemovePersistentGroup(group.MacAddress, group.Ssid);
1036 if (ret != (int)WiFiDirectError.None)
1038 Log.Error(Globals.LogTag, "Failed to remove a persistent group, Error - " + (WiFiDirectError)ret);
1039 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1043 internal void InitMiracast(bool enable)
1045 int ret = Interop.WiFiDirect.InitMiracast(enable);
1046 if (ret != (int)WiFiDirectError.None)
1048 Log.Error(Globals.LogTag, "Failed to set the WiFi-Direct Display(MIRACAST) service, Error - " + (WiFiDirectError)ret);
1049 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1053 internal void InitDisplay()
1055 int ret = Interop.WiFiDirect.InitDisplay();
1056 if (ret != (int)WiFiDirectError.None)
1058 Log.Error(Globals.LogTag, "Failed to enable Wi-Fi Display functionality, Error - " + (WiFiDirectError)ret);
1059 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1064 Globals.s_isDisplay = true;
1068 internal void DeinitDisplay()
1070 int ret = Interop.WiFiDirect.DeinitDisplay();
1071 if (ret != (int)WiFiDirectError.None)
1073 Log.Error(Globals.LogTag, "Failed to disable Wi-Fi Display functionality, Error - " + (WiFiDirectError)ret);
1074 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1079 Globals.s_isDisplay = false;
1083 internal void SetDisplay(WiFiDirectDisplayType type, int port, int hdcp)
1085 int ret = Interop.WiFiDirect.SetDisplay(type, port, hdcp);
1086 if (ret != (int)WiFiDirectError.None)
1088 Log.Error(Globals.LogTag, "Failed to set the Wi-Fi Display parameters, Error - " + (WiFiDirectError)ret);
1089 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1093 internal void SetDisplayAvailability(bool availability)
1095 int ret = Interop.WiFiDirect.SetDisplayAvailability(availability);
1096 if (ret != (int)WiFiDirectError.None)
1098 Log.Error(Globals.LogTag, "Failed to set the Wi-Fi Display session availability, Error - " + (WiFiDirectError)ret);
1099 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1103 internal void SetAutoGroupRemove(bool enable)
1105 int ret = Interop.WiFiDirect.SetAutoGroupRemoval(enable);
1106 if (ret != (int)WiFiDirectError.None)
1108 Log.Error(Globals.LogTag, "Failed to set automatic group removal feature when all peers are disconnected, Error - " + (WiFiDirectError)ret);
1109 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1113 internal uint RegisterService(WiFiDirectServiceType type, string info, string serviceInfo)
1116 int ret = Interop.WiFiDirect.RegisterService(type, info, serviceInfo, out serviceId);
1117 if (ret != (int)WiFiDirectError.None)
1119 Log.Error(Globals.LogTag, "Failed to register for service, Error - " + (WiFiDirectError)ret);
1120 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1126 internal void DeregisterService(uint serviceId)
1128 int ret = Interop.WiFiDirect.DeregisterService(serviceId);
1129 if (ret != (int)WiFiDirectError.None)
1131 Log.Error(Globals.LogTag, "Failed to deregister service, Error - " + (WiFiDirectError)ret);
1132 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1136 internal static WiFiDirectManagerImpl Instance
1140 if (_instance == null)
1142 _instance = new WiFiDirectManagerImpl();
1149 private WiFiDirectManagerImpl()
1153 internal void Initialize()
1155 int ret = Interop.WiFiDirect.Initialize();
1156 if (ret != (int)WiFiDirectError.None)
1158 Log.Error(Globals.LogTag, "Failed to initialize Wi-Fi direct, Error - " + (WiFiDirectError)ret);
1159 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1164 Globals.s_isInitialize = true;
1168 ~WiFiDirectManagerImpl()
1173 public void Dispose()
1176 GC.SuppressFinalize(this);
1179 private void Dispose(bool disposing)
1188 // Free managed objects.
1191 //Free unmanaged objects
1192 RemoveAllRegisteredEvent();
1197 private void Deinitialize()
1199 int ret = Interop.WiFiDirect.Deinitialize();
1200 if (ret != (int)WiFiDirectError.None)
1202 Log.Error(Globals.LogTag, "Failed to deinitialize Wi-Fi direct, Error - " + (WiFiDirectError)ret);
1203 WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
1208 Globals.s_isInitialize = false;
1212 private void RemoveAllRegisteredEvent()
1214 //unregister all remaining events when this object is released.
1215 if (_stateChanged != null)
1217 UnregisterStateChangedEvent();
1220 if (_discoveryStateChanged != null)
1222 UnregisterDiscoveryStateChangedEvent();
1225 if (_peerFound != null)
1227 UnregisterPeerFoundEvent();
1230 if (_deviceStateChanged != null)
1232 UnregisterDeviceStateChangedEvent();
1235 if (_connectionStatusChanged != null)
1237 UnregisterConnectionStatusChangedEvent();