summaryrefslogtreecommitdiff
path: root/Tizen.Network.WiFiDirect/Tizen.Network.WiFiDirect/WiFiDirectPeer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Tizen.Network.WiFiDirect/Tizen.Network.WiFiDirect/WiFiDirectPeer.cs')
-rw-r--r--Tizen.Network.WiFiDirect/Tizen.Network.WiFiDirect/WiFiDirectPeer.cs736
1 files changed, 736 insertions, 0 deletions
diff --git a/Tizen.Network.WiFiDirect/Tizen.Network.WiFiDirect/WiFiDirectPeer.cs b/Tizen.Network.WiFiDirect/Tizen.Network.WiFiDirect/WiFiDirectPeer.cs
new file mode 100644
index 0000000..a97e466
--- /dev/null
+++ b/Tizen.Network.WiFiDirect/Tizen.Network.WiFiDirect/WiFiDirectPeer.cs
@@ -0,0 +1,736 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Collections.Concurrent;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+
+namespace Tizen.Network.WiFiDirect
+{
+ /// <summary>
+ /// WiFiDirectPeer class is used to handle the connection with remote devices using WiFi Direct.
+ /// </summary>
+ /// <privilege> http://tizen.org/privilege/wifidirect </privilege>
+ public class WiFiDirectPeer
+ {
+ private event EventHandler<ConnectionStateChangedEventArgs> _connectionStateChanged;
+ private event EventHandler<IpAddressAssignedEventArgs> _ipAddressAssigned;
+ private event EventHandler<ServiceStateChangedEventArgs> _serviceStateChanged;
+
+ private Interop.WiFiDirect.ConnectionStateChangedCallback _connectionStateChangedCallback;
+ private Interop.WiFiDirect.ClientIpAddressAssignedCallback _ipAddressAssignedCallback;
+ private Interop.WiFiDirect.ServiceStateChangedCallback _serviceStateChangedCallback;
+
+ internal string _peerDeviceName;
+ internal string _peerIpAddress;
+ internal string _peerMacAddress;
+ internal string _peerInterfaceAddress;
+ internal int _peerChannel;
+ internal bool _isPeerConnected;
+ internal bool _isPeerGroupOwner;
+ internal bool _isPeerPersistentGroupOwner;
+ internal bool _peerP2PSupport;
+ internal WiFiDirectPrimaryDeviceType _peerPrimaryType;
+ internal WiFiDirectSecondaryDeviceType _peerSecondaryType;
+ internal int _peerWpsTypes;
+ internal bool _p2PInvitationSupported;
+ internal uint _peerServiceCount;
+ internal IEnumerable<string> _peerServiceList;
+ internal bool _isPeerMiracastDevice;
+
+ internal WiFiDirectPeer()
+ {
+ }
+
+ /// <summary>
+ /// Name of Peer device.
+ /// </summary>
+ public string Name
+ {
+ get
+ {
+ return _peerDeviceName;
+ }
+ }
+
+ /// <summary>
+ /// Ip address of the peer device.
+ /// </summary>
+ public string IpAddress
+ {
+ get
+ {
+ return _peerIpAddress;
+ }
+ }
+
+ /// <summary>
+ /// Mac address of the peer device.
+ /// </summary>
+ public string MacAddress
+ {
+ get
+ {
+ return _peerMacAddress;
+ }
+ }
+
+ /// <summary>
+ /// Interface address of the peer device.
+ /// </summary>
+ public string InterfaceAddress
+ {
+ get
+ {
+ return _peerInterfaceAddress;
+ }
+ }
+
+ /// <summary>
+ /// Listening channel of the peer device.
+ /// </summary>
+ public int Channel
+ {
+ get
+ {
+ return _peerChannel;
+ }
+ }
+
+ /// <summary>
+ /// Connected state of the peer device.
+ /// </summary>
+ public bool IsConnected
+ {
+ get
+ {
+ return _isPeerConnected;
+ }
+ }
+
+ /// <summary>
+ /// P2P group state of the peer device.
+ /// </summary>
+ public bool IsGroupOwner
+ {
+ get
+ {
+ return _isPeerGroupOwner;
+ }
+ }
+
+ /// <summary>
+ /// Persistent group state of the peer device.
+ /// </summary>
+ public bool IsPersistentGroupOwner
+ {
+ get
+ {
+ return _isPeerPersistentGroupOwner;
+ }
+ }
+
+ /// <summary>
+ /// P2P state of the peer device.
+ /// </summary>
+ public bool P2PSupport
+ {
+ get
+ {
+ return _peerP2PSupport;
+ }
+ }
+
+ /// <summary>
+ /// Primary catagory of the peer device.
+ /// </summary>
+ public WiFiDirectPrimaryDeviceType PrimaryType
+ {
+ get
+ {
+ return _peerPrimaryType;
+ }
+ }
+
+ /// <summary>
+ /// Sub category of the peer device.
+ /// </summary>
+ public WiFiDirectSecondaryDeviceType SecondaryType
+ {
+ get
+ {
+ return _peerSecondaryType;
+ }
+ }
+
+ /// <summary>
+ /// List of supported WPS type of the peer device.
+ /// </summary>
+ public int WpsTypes
+ {
+ get
+ {
+ return _peerWpsTypes;
+ }
+ }
+
+ /// <summary>
+ /// P2P invitation state of the peer device.
+ /// </summary>
+ public bool IsP2PInvitationSupported
+ {
+ get
+ {
+ return _p2PInvitationSupported;
+ }
+ }
+
+ /// <summary>
+ /// Number of registered services of the peer device.
+ /// </summary>
+ public uint ServiceCount
+ {
+ get
+ {
+ return _peerServiceCount;
+ }
+ }
+
+ /// <summary>
+ /// List of registered services of the peer device.
+ /// </summary>
+ public IEnumerable<string> ServiceList
+ {
+ get
+ {
+ return _peerServiceList;
+ }
+ }
+
+ /// <summary>
+ /// Checks if peer device is a wifi display device.
+ /// </summary>
+ public bool IsMiracastDevice
+ {
+ get
+ {
+ return _isPeerMiracastDevice;
+ }
+ }
+
+ /// <summary>
+ /// Wi-Fi Display device type of the peer device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If there is any error, default value of WiFiDirectDisplayType will be returned.
+ /// </remarks>
+ public WiFiDirectDisplayType Display
+ {
+ get
+ {
+ if (Globals.IsActivated)
+ {
+ WiFiDirectDisplayType displayType;
+ int ret = Interop.WiFiDirect.GetDisplayType(_peerMacAddress, out displayType);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to get the peer display type, Error - " + (WiFiDirectError)ret);
+ }
+
+ return displayType;
+ }
+
+ else
+ {
+ return default(WiFiDirectDisplayType);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Wi-Fi Display Session Availability of the peer device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If there is any error, false will be returned.
+ /// </remarks>
+ public bool DisplayAvailability
+ {
+ get
+ {
+ if (Globals.IsActivated)
+ {
+ bool displayAvailability;
+ int ret = Interop.WiFiDirect.GetDisplayAvailability(_peerMacAddress, out displayAvailability);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to get the peer display availability, Error - " + (WiFiDirectError)ret);
+ }
+
+ return displayAvailability;
+ }
+
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Hdcp information of the peer device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If there is any error, -1 will be returned.
+ /// </remarks>
+ public int Hdcp
+ {
+ get
+ {
+ if (Globals.IsActivated)
+ {
+ int hdcpSupport;
+ int ret = Interop.WiFiDirect.GetDisplayHdcp(_peerMacAddress, out hdcpSupport);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to get the peer display hdcp support, Error - " + (WiFiDirectError)ret);
+ return -1;
+ }
+
+ return hdcpSupport;
+ }
+
+ else
+ {
+ return -1;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Port of the connected peer device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If there is any error, -1 will be returned.
+ /// </remarks>
+ public int Port
+ {
+ get
+ {
+ if (Globals.IsActivated)
+ {
+ int displayPort;
+ int ret = Interop.WiFiDirect.GetDisplayPort(_peerMacAddress, out displayPort);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to get the peer display port, Error - " + (WiFiDirectError)ret);
+ return -1;
+ }
+
+ return displayPort;
+ }
+
+ else
+ {
+ return -1;
+ }
+ }
+ }
+
+ /// <summary>
+ /// WiFi Display max throughput of the peer device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If there is any error, -1 will be returned.
+ /// </remarks>
+ public int Throughput
+ {
+ get
+ {
+ if (Globals.IsActivated)
+ {
+ int displayThroughput;
+ int ret = Interop.WiFiDirect.GetDisplayThroughput(_peerMacAddress, out displayThroughput);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to get the peer display max throughput, Error - " + (WiFiDirectError)ret);
+ return -1;
+ }
+
+ return displayThroughput;
+ }
+
+ else
+ {
+ return -1;
+ }
+ }
+ }
+
+ /// <summary>
+ /// (event) ConnectionStateChanged event is raised when the connection state of the peer device changes.
+ /// </summary>
+ public event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged
+ {
+ add
+ {
+ if (Globals.IsInitialize)
+ {
+ if (_connectionStateChanged == null)
+ {
+ RegisterConnectionStateChangedEvent();
+ }
+
+ _connectionStateChanged += value;
+ }
+ }
+
+ remove
+ {
+ if (Globals.IsInitialize)
+ {
+ _connectionStateChanged -= value;
+ if (_connectionStateChanged == null)
+ {
+ UnregisterConnectionStateChangedEvent();
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// (event) IpAddressAssigned event is raised when ip address of the peer device is assigned.
+ /// </summary>
+ public event EventHandler<IpAddressAssignedEventArgs> IpAddressAssigned
+ {
+ add
+ {
+ if (Globals.IsInitialize)
+ {
+ if (_ipAddressAssigned == null)
+ {
+ RegisterIpAddressAssignedEvent();
+ }
+
+ _ipAddressAssigned += value;
+ }
+ }
+
+ remove
+ {
+ if (Globals.IsInitialize)
+ {
+ _ipAddressAssigned -= value;
+ if (_ipAddressAssigned == null)
+ {
+ UnregisterIpAddressAssignedEvent();
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// (event) ServiceStateChanged is raised when state of service discovery is changed.
+ /// </summary>
+ public event EventHandler<ServiceStateChangedEventArgs> ServiceStateChanged
+ {
+ add
+ {
+ if (Globals.IsInitialize)
+ {
+ if (_serviceStateChanged == null)
+ {
+ RegisterServiceStateChangedEvent();
+ }
+
+ _serviceStateChanged += value;
+ }
+ }
+
+ remove
+ {
+ if (Globals.IsInitialize)
+ {
+ _serviceStateChanged -= value;
+ if (_serviceStateChanged == null)
+ {
+ UnregisterServiceStateChangedEvent();
+ }
+ }
+ }
+ }
+
+ private void RegisterConnectionStateChangedEvent()
+ {
+ _connectionStateChangedCallback = (int result, WiFiDirectConnectionState state, string address, IntPtr userData) =>
+ {
+ if (_connectionStateChanged != null)
+ {
+ WiFiDirectError res = (WiFiDirectError)result;
+ _connectionStateChanged(null, new ConnectionStateChangedEventArgs(res, state, address));
+ }
+ };
+ int ret = Interop.WiFiDirect.SetConnectionChangedCallback(_connectionStateChangedCallback, IntPtr.Zero);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to set connection state changed callback, Error - " + (WiFiDirectError)ret);
+ }
+ }
+
+ private void UnregisterConnectionStateChangedEvent()
+ {
+ int ret = Interop.WiFiDirect.UnsetConnectionChangedCallback();
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to unset connection state changed callback, Error - " + (WiFiDirectError)ret);
+ }
+ }
+
+ private void RegisterIpAddressAssignedEvent()
+ {
+ _ipAddressAssignedCallback = (string macAddress, string ipAddress, string interfaceAddress, IntPtr userData) =>
+ {
+ if (_ipAddressAssigned != null)
+ {
+ _ipAddressAssigned(null, new IpAddressAssignedEventArgs(macAddress, ipAddress, interfaceAddress));
+ }
+ };
+ int ret = Interop.WiFiDirect.SetIpAddressAssignedCallback(_ipAddressAssignedCallback, IntPtr.Zero);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to set ip address assigned callback, Error - " + (WiFiDirectError)ret);
+ }
+ }
+
+ private void UnregisterIpAddressAssignedEvent()
+ {
+ int ret = Interop.WiFiDirect.UnsetIpAddressAssignedCallback();
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to unset ip address assigned callback, Error - " + (WiFiDirectError)ret);
+ }
+ }
+
+ private void RegisterServiceStateChangedEvent()
+ {
+ _serviceStateChangedCallback = (int result, WiFiDirectServiceDiscoveryState stateInfo, WiFiDirectServiceType typeInfo, IntPtr responseData, string address, IntPtr userData) =>
+ {
+ if (_serviceStateChanged != null)
+ {
+ WiFiDirectError error = (WiFiDirectError)result;
+ WiFiDirectServiceDiscoveryState state = stateInfo;
+ WiFiDirectServiceType type = typeInfo;
+ string response = Marshal.PtrToStringAnsi(responseData);
+ IntPtr peer;
+ Interop.WiFiDirect.GetDiscoveredPeerInfo(address, out peer);
+ DiscoveredPeerStruct peerStruct = (DiscoveredPeerStruct)Marshal.PtrToStructure(peer, typeof(DiscoveredPeerStruct));
+
+ _serviceStateChanged(null, new ServiceStateChangedEventArgs(error, state, type, response, WiFiDirectUtils.ConvertStructToDiscoveredPeer(peerStruct)));
+ }
+ };
+ int ret = Interop.WiFiDirect.SetServiceStateChangedCallback(_serviceStateChangedCallback, IntPtr.Zero);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to set service state changed callback, Error - " + (WiFiDirectError)ret);
+ }
+ }
+
+ private void UnregisterServiceStateChangedEvent()
+ {
+ int ret = Interop.WiFiDirect.UnsetServiceStateChangedCallback();
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to unset service state changed callback, Error - " + (WiFiDirectError)ret);
+ }
+ }
+
+ /// <summary>
+ /// Connects to a specified remote device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If this succeeds, ConnectionStateChanged event will be invoked.
+ /// </remarks>
+ /// <exception cref="NotSupportedException">Thrown when the wifidirect is not supported</exception>
+ public void Connect()
+ {
+ if (Globals.IsActivated)
+ {
+ int ret = Interop.WiFiDirect.Connect(_peerMacAddress);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to connect, Error - " + (WiFiDirectError)ret);
+ WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
+ }
+ }
+
+ else
+ {
+ Log.Error(Globals.LogTag, "Wifi-direct is not activated");
+ WiFiDirectErrorFactory.ThrowWiFiDirectException((int)WiFiDirectError.NotPermitted);
+ }
+ }
+
+ /// <summary>
+ /// Cancels the connection now in progress.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// </remarks>
+ /// <exception cref="NotSupportedException">Thrown when the wifidirect is not supported</exception>
+ public void CancelConnection()
+ {
+ if (Globals.IsActivated)
+ {
+ int ret = Interop.WiFiDirect.CancelConnection(_peerMacAddress);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to cancel the connection, Error - " + (WiFiDirectError)ret);
+ WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
+ }
+ }
+
+ else
+ {
+ Log.Error(Globals.LogTag, "Wifi-direct is not activated");
+ WiFiDirectErrorFactory.ThrowWiFiDirectException((int)WiFiDirectError.NotPermitted);
+ }
+ }
+
+ /// <summary>
+ /// Disconnects the specified remote device.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If this succeeds, ConnectionStateChanged event will be invoked.
+ /// </remarks>
+ /// <exception cref="NotSupportedException">Thrown when the wifidirect is not supported</exception>
+ public void Disconnect()
+ {
+ if (Globals.IsActivated)
+ {
+ int ret = Interop.WiFiDirect.Disconnect(_peerMacAddress);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to disconnect, Error - " + (WiFiDirectError)ret);
+ WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
+ }
+ }
+
+ else
+ {
+ Log.Error(Globals.LogTag, "Wifi-direct is not activated");
+ WiFiDirectErrorFactory.ThrowWiFiDirectException((int)WiFiDirectError.NotPermitted);
+ }
+ }
+
+ /// <summary>
+ /// Allows a device to connect automatically.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// </remarks>
+ /// <exception cref="NotSupportedException">Thrown when the wifidirect is not supported</exception>
+ public void SetAutoConnect()
+ {
+ if (Globals.IsActivated)
+ {
+ int ret = Interop.WiFiDirect.SetAutoConnectionPeer(_peerMacAddress);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to set auto connection, Error - " + (WiFiDirectError)ret);
+ WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
+ }
+ }
+
+ else
+ {
+ Log.Error(Globals.LogTag, "Wifi-direct is not activated");
+ WiFiDirectErrorFactory.ThrowWiFiDirectException((int)WiFiDirectError.NotPermitted);
+ }
+ }
+
+ /// <summary>
+ /// Starts the Wi-Fi Direct service discovery.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// If this succeeds, ServiceStateChanged event will be invoked.
+ /// </remarks>
+ /// <exception cref="NotSupportedException">
+ /// Thrown during one of the following cases :
+ /// 1. When the wifidirect is not supported
+ /// 2. When the wifidirect service discovery is not supported
+ /// </exception>
+ /// <param name="type">Type of service.</param>
+ public void StartServiceDiscovery(WiFiDirectServiceType type)
+ {
+ if (Globals.IsActivated)
+ {
+ int ret = Interop.WiFiDirect.StartServiceDiscovery(_peerMacAddress, type);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to start Wi-Fi Direct service discovery, Error - " + (WiFiDirectError)ret);
+ WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
+ }
+ }
+
+ else
+ {
+ Log.Error(Globals.LogTag, "Wifi-direct is not activated");
+ WiFiDirectErrorFactory.ThrowWiFiDirectException((int)WiFiDirectError.NotPermitted);
+ }
+ }
+
+ /// <summary>
+ /// Stops the Wi-Fi Direct service discovery.
+ /// </summary>
+ /// <remarks>
+ /// Wi-Fi Direct must be activated.
+ /// </remarks>
+ /// <exception cref="NotSupportedException">
+ /// Thrown during one of the following cases :
+ /// 1. When the wifidirect is not supported
+ /// 2. When the wifidirect service discovery is not supported
+ /// </exception>
+ /// <param name="type">Type of service.</param>
+ public void CancelServiceDiscovery(WiFiDirectServiceType type)
+ {
+ if (Globals.IsActivated)
+ {
+ int ret = Interop.WiFiDirect.StopServiceDiscovery(_peerMacAddress, type);
+ if (ret != (int)WiFiDirectError.None)
+ {
+ Log.Error(Globals.LogTag, "Failed to stop Wi-Fi Direct service discovery, Error - " + (WiFiDirectError)ret);
+ WiFiDirectErrorFactory.ThrowWiFiDirectException(ret);
+ }
+ }
+
+ else
+ {
+ Log.Error(Globals.LogTag, "Wifi-direct is not activated");
+ WiFiDirectErrorFactory.ThrowWiFiDirectException((int)WiFiDirectError.NotPermitted);
+ }
+ }
+ }
+}