Release 4.0.0-preview1-00194
[platform/core/csapi/tizenfx.git] / src / Tizen.Network.Connection / Tizen.Network.Connection / IAddressInformation.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.Linq;
20 using System.Text;
21 using System.Threading.Tasks;
22 using System.Collections;
23 using System.Runtime.InteropServices;
24
25 namespace Tizen.Network.Connection
26 {
27     /// <summary>
28     /// This interface provides properties to manage address information of the connection.
29     /// </summary>
30     /// <since_tizen> 3 </since_tizen>
31     public interface IAddressInformation
32     {
33         /// <summary>
34         /// The DNS address.
35         /// </summary>
36         /// <since_tizen> 3 </since_tizen>
37         /// <value>First DNS address of the connection.</value>
38         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
39         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
40         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
41         System.Net.IPAddress Dns1 { get; set; }
42
43         /// <summary>
44         /// The DNS address.
45         /// </summary>
46         /// <since_tizen> 3 </since_tizen>
47         /// <value>Second DNS address of the connection.</value>
48         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
49         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
50         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
51         System.Net.IPAddress Dns2 { get; set; }
52
53         /// <summary>
54         /// The gateway address.
55         /// </summary>
56         /// <since_tizen> 3 </since_tizen>
57         /// <value>Gateway address of the connection.</value>
58         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
59         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
60         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
61         System.Net.IPAddress Gateway { get; set; }
62
63         /// <summary>
64         /// The subnet mask address.
65         /// </summary>
66         /// <since_tizen> 3 </since_tizen>
67         /// <value>Subnet mask of the connection.</value>
68         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
69         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
70         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
71         System.Net.IPAddress SubnetMask { get; set; }
72
73         /// <summary>
74         /// The IP address.
75         /// </summary>
76         /// <since_tizen> 3 </since_tizen>
77         /// <value>IP address of the connection.</value>
78         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
79         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
80         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
81         System.Net.IPAddress IP { get; set; }
82
83         /// <summary>
84         /// The type of IP config.
85         /// </summary>
86         /// <since_tizen> 3 </since_tizen>
87         /// <value>IP config type of the connection.</value>
88         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
89         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
90         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
91         IPConfigType IPConfigType { get; set; }
92
93         /// <summary>
94         /// The prefix length.
95         /// </summary>
96         /// <since_tizen> 3 </since_tizen>
97         /// <value>Prefix length of the connection.</value>
98         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
99         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
100         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
101         int PrefixLength { get; set; }
102
103         /// <summary>
104         /// The DNS config type.
105         /// </summary>
106         /// <since_tizen> 3 </since_tizen>
107         /// <value>Config type of the DNS.</value>
108         /// <exception cref="System.NotSupportedException">Thrown during set when a feature is not supported.</exception>
109         /// <exception cref="System.ArgumentException">Thrown during set when a value is an invalid parameter.</exception>
110         /// <exception cref="System.InvalidOperationException">Thrown during set when a profile instance is invalid or when a method fails due to an invalid operation.</exception>
111         DnsConfigType DnsConfigType { get; set; }
112
113         /// <summary>
114         /// The DHCP server address. It is only supported for the IPV4 address family.
115         /// </summary>
116         /// <since_tizen> 4 </since_tizen>
117         /// <value>Server address of the DHCP.</value>
118         System.Net.IPAddress DhcpServerAddress { get; }
119     }
120
121     internal class ConnectionAddressInformation : IAddressInformation
122     {
123         private IntPtr _profileHandle;
124         private AddressFamily _family;
125
126         internal ConnectionAddressInformation(IntPtr handle, AddressFamily family)
127         {
128             _profileHandle = handle;
129             _family = family;
130         }
131
132         public System.Net.IPAddress Dns1
133         {
134             get
135             {
136                 IntPtr Value;
137                 int ret = Interop.ConnectionProfile.GetDnsAddress(_profileHandle, 1, (int)_family, out Value);
138                 if ((ConnectionError)ret != ConnectionError.None)
139                 {
140                     Log.Error(Globals.LogTag, "It failed to get dns1 address, " + (ConnectionError)ret);
141                 }
142                 string result = Marshal.PtrToStringAnsi(Value);
143                 Interop.Libc.Free(Value);
144                 if (result == null || result.Length == 0)
145                     return System.Net.IPAddress.Parse("0.0.0.0");
146                 return System.Net.IPAddress.Parse(result);
147             }
148
149             set
150             {
151                 int ret = Interop.ConnectionProfile.SetDnsAddress(_profileHandle, 1, (int)_family, value.ToString());
152                 if ((ConnectionError)ret != ConnectionError.None)
153                 {
154                     Log.Error(Globals.LogTag, "It failed to set dns1 address, " + (ConnectionError)ret);
155                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
156                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
157                     ConnectionErrorFactory.ThrowConnectionException(ret);
158                 }
159             }
160         }
161         public System.Net.IPAddress Dns2
162         {
163             get
164             {
165                 IntPtr Value;
166                 int ret = Interop.ConnectionProfile.GetDnsAddress(_profileHandle, 2, (int)_family, out Value);
167                 if ((ConnectionError)ret != ConnectionError.None)
168                 {
169                     Log.Error(Globals.LogTag, "It failed to get dns2 address, " + (ConnectionError)ret);
170                 }
171                 string result = Marshal.PtrToStringAnsi(Value);
172                 Interop.Libc.Free(Value);
173                 if (result == null || result.Length == 0)
174                     return System.Net.IPAddress.Parse("0.0.0.0");
175                 return System.Net.IPAddress.Parse(result);
176             }
177
178             set
179             {
180                 int ret = Interop.ConnectionProfile.SetDnsAddress(_profileHandle, 2, (int)_family, value.ToString());
181                 if ((ConnectionError)ret != ConnectionError.None)
182                 {
183                     Log.Error(Globals.LogTag, "It failed to set dns2 address, " + (ConnectionError)ret);
184                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
185                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
186                     ConnectionErrorFactory.ThrowConnectionException(ret);
187                 }
188             }
189         }
190
191         public System.Net.IPAddress Gateway
192         {
193             get
194             {
195                 IntPtr Value;
196                 int ret = Interop.ConnectionProfile.GetGatewayAddress(_profileHandle, (int)_family, out Value);
197                 if ((ConnectionError)ret != ConnectionError.None)
198                 {
199                     Log.Error(Globals.LogTag, "It failed to get gateway, " + (ConnectionError)ret);
200                 }
201                 string result = Marshal.PtrToStringAnsi(Value);
202                 Interop.Libc.Free(Value);
203                 if (result == null || result.Length == 0)
204                     return System.Net.IPAddress.Parse("0.0.0.0");
205                 return System.Net.IPAddress.Parse(result);
206             }
207
208             set
209             {
210                 int ret = Interop.ConnectionProfile.SetGatewayAddress(_profileHandle, (int)_family, value.ToString());
211                 if ((ConnectionError)ret != ConnectionError.None)
212                 {
213                     Log.Error(Globals.LogTag, "It failed to set gateway, " + (ConnectionError)ret);
214                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
215                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
216                     ConnectionErrorFactory.ThrowConnectionException(ret);
217                 }
218             }
219         }
220
221
222         public System.Net.IPAddress SubnetMask
223         {
224             get
225             {
226                 IntPtr Value;
227                 int ret = Interop.ConnectionProfile.GetSubnetMask(_profileHandle, (int)_family, out Value);
228                 if ((ConnectionError)ret != ConnectionError.None)
229                 {
230                     Log.Error(Globals.LogTag, "It failed to get subnet mask, " + (ConnectionError)ret);
231                 }
232                 string result = Marshal.PtrToStringAnsi(Value);
233                 Interop.Libc.Free(Value);
234                 if (result == null || result.Length == 0)
235                     return System.Net.IPAddress.Parse("0.0.0.0");
236                 return System.Net.IPAddress.Parse(result);
237             }
238
239             set
240             {
241                 int ret = Interop.ConnectionProfile.SetSubnetMask(_profileHandle, (int)_family, value.ToString());
242                 if ((ConnectionError)ret != ConnectionError.None)
243                 {
244                     Log.Error(Globals.LogTag, "It failed to set subnet mask, " + (ConnectionError)ret);
245                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
246                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
247                     ConnectionErrorFactory.ThrowConnectionException(ret);
248                 }
249             }
250         }
251
252
253         public System.Net.IPAddress IP
254         {
255             get
256             {
257                 IntPtr Value;
258                 int ret = Interop.ConnectionProfile.GetIPAddress(_profileHandle, (int)_family, out Value);
259                 if ((ConnectionError)ret != ConnectionError.None)
260                 {
261                     Log.Error(Globals.LogTag, "It failed to get ip, " + (ConnectionError)ret);
262                 }
263                 string result = Marshal.PtrToStringAnsi(Value);
264                 Interop.Libc.Free(Value);
265                 if (result == null || result.Length == 0)
266                     return System.Net.IPAddress.Parse("0.0.0.0");
267                 return System.Net.IPAddress.Parse(result);
268             }
269
270             set
271             {
272                 int ret = Interop.ConnectionProfile.SetIPAddress(_profileHandle, (int)_family, value.ToString());
273                 if ((ConnectionError)ret != ConnectionError.None)
274                 {
275                     Log.Error(Globals.LogTag, "It failed to set ip, " + (ConnectionError)ret);
276                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
277                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
278                     ConnectionErrorFactory.ThrowConnectionException(ret);
279                 }
280             }
281         }
282
283         public IPConfigType IPConfigType
284         {
285             get
286             {
287                 int Value;
288                 int ret = Interop.ConnectionProfile.GetIPConfigType(_profileHandle, (int)_family, out Value);
289                 if ((ConnectionError)ret != ConnectionError.None)
290                 {
291                     Log.Error(Globals.LogTag, "It failed to get ip config type, " + (ConnectionError)ret);
292                 }
293                 return (IPConfigType)Value;
294             }
295
296             set
297             {
298                 int ret = Interop.ConnectionProfile.SetIPConfigType(_profileHandle, (int)_family, (int)value);
299                 if ((ConnectionError)ret != ConnectionError.None)
300                 {
301                     Log.Error(Globals.LogTag, "It failed to set ip config type, " + (ConnectionError)ret);
302                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
303                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
304                     ConnectionErrorFactory.ThrowConnectionException(ret);
305                 }
306             }
307         }
308
309         public int PrefixLength
310         {
311             get
312             {
313                 int Value;
314                 int ret = Interop.ConnectionProfile.GetPrefixLength(_profileHandle, (int)_family, out Value);
315                 if ((ConnectionError)ret != ConnectionError.None)
316                 {
317                     Log.Error(Globals.LogTag, "It failed to get prefix length, " + (ConnectionError)ret);
318                 }
319                 return Value;
320             }
321
322             set
323             {
324                 int ret = Interop.ConnectionProfile.SetPrefixLength(_profileHandle, (int)_family, value);
325                 if ((ConnectionError)ret != ConnectionError.None)
326                 {
327                     Log.Error(Globals.LogTag, "It failed to set prefix length, " + (ConnectionError)ret);
328                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
329                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
330                     ConnectionErrorFactory.ThrowConnectionException(ret);
331                 }
332             }
333         }
334
335         public DnsConfigType DnsConfigType
336         {
337             get
338             {
339                 int Value;
340                 int ret = Interop.ConnectionProfile.GetDnsConfigType(_profileHandle, (int)_family, out Value);
341                 if ((ConnectionError)ret != ConnectionError.None)
342                 {
343                     Log.Error(Globals.LogTag, "It failed to get DNS config type, " + (ConnectionError)ret);
344                 }
345                 return (DnsConfigType)Value;
346             }
347
348             set
349             {
350                 int ret = Interop.ConnectionProfile.SetDnsConfigType(_profileHandle, (int)_family, (int)value);
351                 if ((ConnectionError)ret != ConnectionError.None)
352                 {
353                     Log.Error(Globals.LogTag, "It failed to set DNS config type, " + (ConnectionError)ret);
354                     ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet");
355                     ConnectionErrorFactory.CheckHandleNullException(ret, (_profileHandle == IntPtr.Zero), "ProfileHandle may have been disposed or released");
356                     ConnectionErrorFactory.ThrowConnectionException(ret);
357                 }
358             }
359         }
360
361         public System.Net.IPAddress DhcpServerAddress
362         {
363             get
364             {
365                 string dhcpServer;
366                 int ret = Interop.ConnectionProfile.GetDhcpServerAddress(_profileHandle, _family, out dhcpServer);
367                 if ((ConnectionError)ret != ConnectionError.None)
368                 {
369                     Log.Error(Globals.LogTag, "It failed to get the DHCP server address, " + (ConnectionError)ret);
370                 }
371
372                 if (dhcpServer == null || dhcpServer.Length == 0)
373                 {
374                     return System.Net.IPAddress.Parse("0.0.0.0");
375                 }
376
377                 else
378                 {
379                     return System.Net.IPAddress.Parse(dhcpServer);
380                 }
381             }
382         }
383     }
384 }