Merge remote-tracking branch 'wifi/tizen'
[platform/core/csapi/tizenfx.git] / src / Tizen.Network.WiFi / Tizen.Network.WiFi / WiFiNetwork.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using System.Collections.Generic;
19 using System.Net;
20 using System.Runtime.InteropServices;
21 using Tizen.Network.Connection;
22
23 namespace Tizen.Network.WiFi
24 {
25     /// <summary>
26     /// A class for managing the Wi-Fi network information.
27     /// </summary>
28     /// <since_tizen> 3 </since_tizen>
29     public class WiFiNetwork
30     {
31         private Interop.WiFi.SafeWiFiAPHandle _apHandle;
32         private IAddressInformation _ipv4;
33         private IAddressInformation _ipv6;
34         private string _essid;
35
36         /// <summary>
37         /// The Extended Service Set Identifier(ESSID).
38         /// </summary>
39         /// <since_tizen> 3 </since_tizen>
40         /// <value>Essid of the WiFi.</value>
41         public string Essid
42         {
43             get
44             {
45                 if (string.IsNullOrEmpty(_essid))
46                 {
47                     IntPtr strPtr;
48                     int ret = Interop.WiFi.AP.GetEssid(_apHandle, out strPtr);
49                     if (ret != (int)WiFiError.None)
50                     {
51                         Log.Error(Globals.LogTag, "Failed to get essid, Error - " + (WiFiError)ret);
52                         _essid = "";
53                     }
54                     else
55                     {
56                         _essid = Marshal.PtrToStringAnsi(strPtr);
57                     }
58                 }
59                 return _essid;
60             }
61         }
62
63         /// <summary>
64         /// The Basic Service Set Identifier(BSSID).
65         /// </summary>
66         /// <since_tizen> 3 </since_tizen>
67         /// <value>Bssid of the WiFi.</value>
68         public string Bssid
69         {
70             get
71             {
72                 IntPtr strPtr;
73                 int ret = Interop.WiFi.AP.GetBssid(_apHandle, out strPtr);
74                 if (ret != (int)WiFiError.None)
75                 {
76                     Log.Error(Globals.LogTag, "Failed to get bssid, Error - " + (WiFiError)ret);
77                     return "";
78                 }
79                 return Marshal.PtrToStringAnsi(strPtr);
80             }
81         }
82
83         /// <summary>
84         /// The address informaiton for IPv4.
85         /// </summary>
86         /// <since_tizen> 3 </since_tizen>
87         /// <value>IP address information for IPv4 type.</value>
88         public IAddressInformation IPv4Setting
89         {
90             get
91             {
92                 return _ipv4;
93             }
94         }
95
96         /// <summary>
97         /// The address information for IPv6.
98         /// </summary>
99         /// <since_tizen> 3 </since_tizen>
100         /// <value>IP address information for IPv6 type.</value>
101         public IAddressInformation IPv6Setting
102         {
103             get
104             {
105                 return _ipv6;
106             }
107         }
108
109         /// <summary>
110         /// The proxy address.
111         /// </summary>
112         /// <since_tizen> 3 </since_tizen>
113         /// <value>Represents proxy address of WiFi.</value>
114         /// <exception cref="NotSupportedException">Thrown while setting this property when WiFi is not supported.</exception>
115         /// <exception cref="ArgumentException">Thrown while setting this property due to an invalid parameter.</exception>
116         /// <exception cref="InvalidOperationException">Thrown while setting this value due to invalid operation.</exception>
117         public string ProxyAddress
118         {
119             get
120             {
121                 IntPtr strPtr;
122                 int ret = Interop.WiFi.AP.GetProxyAddress(_apHandle, (int)AddressFamily.IPv4, out strPtr);
123                 if (ret != (int)WiFiError.None)
124                 {
125                     Log.Error(Globals.LogTag, "Failed to get proxy address, Error - " + (WiFiError)ret);
126                     return "";
127                 }
128                 return Marshal.PtrToStringAnsi(strPtr);
129             }
130             set
131             {
132                 int ret = Interop.WiFi.AP.SetProxyAddress(_apHandle, (int)AddressFamily.IPv4, value);
133                 if (ret != (int)WiFiError.None)
134                 {
135                     Log.Error(Globals.LogTag, "Failed to set proxy address, Error - " + (WiFiError)ret);
136                     WiFiErrorFactory.ThrowWiFiException(ret, _apHandle.DangerousGetHandle());
137                 }
138             }
139         }
140
141         /// <summary>
142         /// The proxy type(IPv6).
143         /// </summary>
144         /// <since_tizen> 3 </since_tizen>
145         /// <value>Represents proxy type of WiFi.</value>
146         /// <exception cref="NotSupportedException">Thrown while setting this property when WiFi is not supported.</exception>
147         /// <exception cref="ArgumentException">Thrown while setting this property due to an invalid parameter.</exception>
148         /// <exception cref="InvalidOperationException">Thrown while setting this value due to invalid operation.</exception>
149         public WiFiProxyType ProxyType
150         {
151             get
152             {
153                 int type;
154                 int ret = Interop.WiFi.AP.GetProxyType(_apHandle, out type);
155                 if (ret != (int)WiFiError.None)
156                 {
157                     Log.Error(Globals.LogTag, "Failed to get proxy type, Error - " + (WiFiError)ret);
158                 }
159                 return (WiFiProxyType)type;
160             }
161             set
162             {
163                 int ret = Interop.WiFi.AP.SetProxyType(_apHandle, (int)value);
164                 if (ret != (int)WiFiError.None)
165                 {
166                     Log.Error(Globals.LogTag, "Failed to set proxy type, Error - " + (WiFiError)ret);
167                     WiFiErrorFactory.ThrowWiFiException(ret, _apHandle.DangerousGetHandle());
168                 }
169             }
170         }
171
172         /// <summary>
173         /// The frequency band(MHz).
174         /// </summary>
175         /// <since_tizen> 3 </since_tizen>
176         /// <value>Represents the frequency band value.</value>
177         public int Frequency
178         {
179             get
180             {
181                 int freq;
182                 int ret = Interop.WiFi.AP.GetFrequency(_apHandle, out freq);
183                 if (ret != (int)WiFiError.None)
184                 {
185                     Log.Error(Globals.LogTag, "Failed to get frequency, Error - " + (WiFiError)ret);
186                 }
187                 return freq;
188             }
189         }
190
191         /// <summary>
192         /// The Received signal strength indication(RSSI).
193         /// </summary>
194         /// <since_tizen> 3 </since_tizen>
195         /// <value>Represents Rssi of WiFi(dbm).</value>
196         public int Rssi
197         {
198             get
199             {
200                 int rssi;
201                 int ret = Interop.WiFi.AP.GetRssi(_apHandle, out rssi);
202                 if (ret != (int)WiFiError.None)
203                 {
204                     Log.Error(Globals.LogTag, "Failed to get rssi, Error - " + (WiFiError)ret);
205                 }
206                 return rssi;
207             }
208         }
209
210         /// <summary>
211         /// The max speed (Mbps).
212         /// </summary>
213         /// <since_tizen> 3 </since_tizen>
214         /// <value>Represents max speed value.</value>
215         public int MaxSpeed
216         {
217             get
218             {
219                 int maxSpeed;
220                 int ret = Interop.WiFi.AP.GetMaxSpeed(_apHandle, out maxSpeed);
221                 if (ret != (int)WiFiError.None)
222                 {
223                     Log.Error(Globals.LogTag, "Failed to get max speed, Error - " + (WiFiError)ret);
224                 }
225                 return maxSpeed;
226             }
227         }
228
229         /// <summary>
230         /// A property to check whether the access point is favorite or not.
231         /// </summary>
232         /// <since_tizen> 3 </since_tizen>
233         /// <value>Boolean value to check if the access point is favorite or not.</value>
234         public bool IsFavorite
235         {
236             get
237             {
238                 bool isFavorite;
239                 int ret = Interop.WiFi.AP.IsFavorite(_apHandle, out isFavorite);
240                 if (ret != (int)WiFiError.None)
241                 {
242                     Log.Error(Globals.LogTag, "Failed to get favorite, Error - " + (WiFiError)ret);
243                 }
244                 return isFavorite;
245             }
246         }
247
248         /// <summary>
249         /// A property to check whether the access point is passpoint or not.
250         /// </summary>
251         /// <since_tizen> 3 </since_tizen>
252         /// <value>Boolean value to check if the access point is passpoint or not.</value>
253         public bool IsPasspoint
254         {
255             get
256             {
257                 bool isPasspoint;
258                 Log.Debug(Globals.LogTag, "Handle: " + _apHandle);
259                 int ret = Interop.WiFi.AP.IsPasspoint(_apHandle, out isPasspoint);
260                 if (ret != (int)WiFiError.None)
261                 {
262                     Log.Error(Globals.LogTag, "Failed to get isPassport, Error - " + (WiFiError)ret);
263                 }
264                 return isPasspoint;
265             }
266         }
267
268         /// <summary>
269         /// The connection state.
270         /// </summary>
271         /// <since_tizen> 3 </since_tizen>
272         /// <value>Represents the connection state of WiFi.</value>
273         public WiFiConnectionState ConnectionState
274         {
275             get
276             {
277                 int state;
278                 int ret = Interop.WiFi.AP.GetConnectionState(_apHandle, out state);
279                 if (ret != (int)WiFiError.None)
280                 {
281                     Log.Error(Globals.LogTag, "Failed to get connection state, Error - " + (WiFiError)ret);
282                 }
283                 return (WiFiConnectionState)state;
284             }
285         }
286
287         /// <summary>
288         /// Gets the all IPv6 addresses of the access point
289         /// </summary>
290         /// <since_tizen> 3 </since_tizen>
291         /// <returns>A list of IPv6 addresses of the access point.</returns>
292         /// <feature>http://tizen.org/feature/network.wifi</feature>
293         /// <exception cref="NotSupportedException">Thrown when WiFi is not supported.</exception>
294         /// <exception cref="ArgumentException">Thrown when method is failed due to an invalid parameter.</exception>
295         /// <exception cref="InvalidOperationException">Thrown when method failed due to invalid operation.</exception>
296         public IEnumerable<System.Net.IPAddress> GetAllIPv6Addresses()
297         {
298             Log.Debug(Globals.LogTag, "GetAllIPv6Addresses");
299             List<System.Net.IPAddress> ipList = new List<System.Net.IPAddress>();
300             Interop.WiFi.HandleCallback callback = (IntPtr ipv6Address, IntPtr userData) =>
301             {
302                 if (ipv6Address != IntPtr.Zero)
303                 {
304                     string ipv6 = Marshal.PtrToStringAnsi(ipv6Address);
305                     ipList.Add(System.Net.IPAddress.Parse(ipv6));
306                     return true;
307                 }
308                 return false;
309             };
310
311             int ret = Interop.WiFi.AP.GetAllIPv6Addresses(_apHandle, callback, IntPtr.Zero);
312             if (ret != (int)WiFiError.None)
313             {
314                 Log.Error(Globals.LogTag, "Failed to get all IPv6 addresses, Error - " + (WiFiError)ret);
315                 WiFiErrorFactory.ThrowWiFiException(ret, _apHandle.DangerousGetHandle());
316             }
317
318             return ipList;
319         }
320
321         internal WiFiNetwork(Interop.WiFi.SafeWiFiAPHandle apHandle)
322         {
323             _apHandle = apHandle;
324             _ipv4 = new WiFiAddressInformation(apHandle, AddressFamily.IPv4);
325             _ipv6 = new WiFiAddressInformation(apHandle, AddressFamily.IPv6);
326
327             IntPtr strPtr;
328             int ret = Interop.WiFi.AP.GetEssid(_apHandle, out strPtr);
329             if (ret != (int)WiFiError.None)
330             {
331                 Log.Error(Globals.LogTag, "Failed to get essid, Error - " + (WiFiError)ret);
332             }
333             _essid = Marshal.PtrToStringAnsi(strPtr);
334         }
335     } //WiFiNetworkInformation
336 }