Add some APIs to get and set cellular pdn type
[platform/core/api/connection.git] / src / connection_profile.c
1 /*
2  * Copyright (c) 2011-2013 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 #include <glib.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <arpa/inet.h>
22 #include <vconf/vconf.h>
23
24 #include "net_connection_private.h"
25
26 #define HTTP_PROXY "http_proxy"
27 #define MAX_PREFIX_LENGTH 6
28
29 static net_dev_info_t* __profile_get_net_info(net_profile_info_t *profile_info)
30 {
31         switch (profile_info->profile_type) {
32         case NET_DEVICE_CELLULAR:
33                 return &profile_info->ProfileInfo.Pdp.net_info;
34         case NET_DEVICE_WIFI:
35                 return &profile_info->ProfileInfo.Wlan.net_info;
36         case NET_DEVICE_ETHERNET:
37                 return &profile_info->ProfileInfo.Ethernet.net_info; //LCOV_EXCL_LINE
38         case NET_DEVICE_BLUETOOTH:
39                 return &profile_info->ProfileInfo.Bluetooth.net_info;
40         case NET_DEVICE_DEFAULT:
41         case NET_DEVICE_USB:
42         case NET_DEVICE_UNKNOWN:
43         case NET_DEVICE_MAX:
44         default:
45                 return NULL;
46         }
47 }
48
49 static char *__profile_convert_ip_to_string(net_addr_t *ip_addr, connection_address_family_e address_family)
50 {
51         unsigned char *ipaddr = NULL;
52         char *ipstr = NULL;
53
54         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
55                 ipaddr = (unsigned char *)&ip_addr->Data.Ipv4.s_addr;
56                 ipstr = g_try_malloc0(INET_ADDRSTRLEN);
57                 if (ipstr == NULL)
58                         return NULL;
59
60                 inet_ntop(AF_INET, ipaddr, ipstr, INET_ADDRSTRLEN);
61         } else {
62                 //LCOV_EXCL_START
63                 ipaddr = (unsigned char *)&ip_addr->Data.Ipv6.s6_addr;
64                 ipstr = g_try_malloc0(INET6_ADDRSTRLEN);
65                 if (ipstr == NULL)
66                                 return NULL;
67
68                 inet_ntop(AF_INET6, ipaddr, ipstr, INET6_ADDRSTRLEN);
69                 //LCOV_EXCL_STOP
70         }
71
72         return ipstr;
73 }
74
75 static void __profile_init_cellular_profile(net_profile_info_t *profile_info, const char *keyword)
76 {
77         int default_subscriber_id = 0;
78         connection_profile_h profile = NULL;
79
80         profile_info->profile_type = NET_DEVICE_CELLULAR;
81         profile_info->ProfileState = NET_STATE_TYPE_IDLE;
82         profile_info->ProfileInfo.Pdp.PdnType = NET_PDN_TYPE_UNKNOWN;
83         profile_info->ProfileInfo.Pdp.RoamPdnType = NET_PDN_TYPE_UNKNOWN;
84         profile_info->ProfileInfo.Pdp.net_info.IpConfigType = NET_IP_CONFIG_TYPE_OFF;
85         profile_info->ProfileInfo.Pdp.net_info.ProxyMethod = NET_PROXY_TYPE_DIRECT;
86         g_strlcpy(profile_info->ProfileInfo.Pdp.Keyword, keyword, NET_PDP_APN_LEN_MAX);
87
88         if (vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE,
89                                         &default_subscriber_id) != 0)
90                 CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE
91                                                 "Failed to get VCONF_TELEPHONY_DEFAULT_DATA_SERVICE");
92
93         profile = (connection_profile_h)profile_info;
94         _connection_libnet_set_cellular_subscriber_id(profile, default_subscriber_id);
95 }
96
97 static void __profile_init_wifi_profile(net_profile_info_t *profile_info)
98 {
99         profile_info->profile_type = NET_DEVICE_WIFI;
100         profile_info->ProfileState = NET_STATE_TYPE_IDLE;
101         profile_info->ProfileInfo.Wlan.net_info.IpConfigType = NET_IP_CONFIG_TYPE_OFF;
102         profile_info->ProfileInfo.Wlan.net_info.ProxyMethod = NET_PROXY_TYPE_DIRECT;
103         profile_info->ProfileInfo.Wlan.wlan_mode = NETPM_WLAN_CONNMODE_AUTO;
104         profile_info->ProfileInfo.Wlan.security_info.sec_mode = WLAN_SEC_MODE_NONE;
105         profile_info->ProfileInfo.Wlan.security_info.enc_mode = WLAN_ENC_MODE_NONE;
106 }
107
108 //LCOV_EXCL_START
109 static const char* __profile_get_ethernet_proxy(void)
110 {
111         char *proxy;
112
113         proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
114
115         if (proxy == NULL) {
116                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get system proxy");
117                 return NULL;
118         }
119
120         return proxy;
121 }
122 //LCOV_EXCL_STOP
123
124 //LCOV_EXCL_START
125 connection_cellular_service_type_e _profile_convert_to_connection_cellular_service_type(net_service_type_t svc_type)
126 {
127         switch (svc_type) {
128         case NET_SERVICE_INTERNET:
129                 return CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET;
130         case NET_SERVICE_MMS:
131                 return CONNECTION_CELLULAR_SERVICE_TYPE_MMS;
132         case NET_SERVICE_PREPAID_INTERNET:
133                 return CONNECTION_CELLULAR_SERVICE_TYPE_PREPAID_INTERNET;
134         case NET_SERVICE_PREPAID_MMS:
135                 return CONNECTION_CELLULAR_SERVICE_TYPE_PREPAID_MMS;
136         case NET_SERVICE_TETHERING:
137                 return CONNECTION_CELLULAR_SERVICE_TYPE_TETHERING;
138         case NET_SERVICE_APPLICATION:
139                 return CONNECTION_CELLULAR_SERVICE_TYPE_APPLICATION;
140         default:
141                 return CONNECTION_CELLULAR_SERVICE_TYPE_UNKNOWN;
142         }
143 }
144
145 connection_profile_state_e _profile_convert_to_cp_state(net_state_type_t state)
146 {
147         connection_profile_state_e cp_state;
148
149         switch (state) {
150         case NET_STATE_TYPE_ONLINE:
151         case NET_STATE_TYPE_READY:
152                 cp_state = CONNECTION_PROFILE_STATE_CONNECTED;
153                 break;
154         case NET_STATE_TYPE_IDLE:
155         case NET_STATE_TYPE_FAILURE:
156         case NET_STATE_TYPE_DISCONNECT:
157                 cp_state = CONNECTION_PROFILE_STATE_DISCONNECTED;
158                 break;
159         case NET_STATE_TYPE_ASSOCIATION:
160                 cp_state = CONNECTION_PROFILE_STATE_ASSOCIATION;
161                 break;
162         case NET_STATE_TYPE_CONFIGURATION:
163                 cp_state = CONNECTION_PROFILE_STATE_CONFIGURATION;
164                 break;
165         default:
166                 cp_state = -1;
167         }
168
169         return cp_state;
170 }
171
172 net_service_type_t _connection_profile_convert_to_libnet_cellular_service_type(connection_cellular_service_type_e svc_type)
173 {
174         switch (svc_type) {
175         case CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET:
176                 return NET_SERVICE_INTERNET;
177         case CONNECTION_CELLULAR_SERVICE_TYPE_MMS:
178                 return NET_SERVICE_MMS;
179         case CONNECTION_CELLULAR_SERVICE_TYPE_PREPAID_INTERNET:
180                 return NET_SERVICE_PREPAID_INTERNET;
181         case CONNECTION_CELLULAR_SERVICE_TYPE_PREPAID_MMS:
182                 return NET_SERVICE_PREPAID_MMS;
183         case CONNECTION_CELLULAR_SERVICE_TYPE_TETHERING:
184                 return NET_SERVICE_TETHERING;
185         case CONNECTION_CELLULAR_SERVICE_TYPE_APPLICATION:
186                 return NET_SERVICE_APPLICATION;
187         default:
188                 return NET_SERVICE_UNKNOWN;
189         }
190 }
191
192 net_state_type_t _connection_profile_convert_to_net_state(connection_profile_state_e state)
193 {
194         net_state_type_t libnet_state = NET_STATE_TYPE_UNKNOWN;
195
196         switch (state) {
197         case CONNECTION_PROFILE_STATE_CONNECTED:
198                 libnet_state = NET_STATE_TYPE_ONLINE;
199                 break;
200         case CONNECTION_PROFILE_STATE_DISCONNECTED:
201                 libnet_state = NET_STATE_TYPE_IDLE;
202                 break;
203         case CONNECTION_PROFILE_STATE_ASSOCIATION:
204                 libnet_state = NET_STATE_TYPE_ASSOCIATION;
205                 break;
206         case CONNECTION_PROFILE_STATE_CONFIGURATION:
207                 libnet_state = NET_STATE_TYPE_CONFIGURATION;
208                 break;
209         }
210
211         return libnet_state;
212 }
213 //LCOV_EXCL_STOP
214
215 /* Connection profile ********************************************************/
216 EXPORT_API int connection_profile_create(connection_profile_type_e type, const char* keyword, connection_profile_h* profile)
217 {
218         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
219
220         if (type == CONNECTION_PROFILE_TYPE_CELLULAR)
221                 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
222         else if (type == CONNECTION_PROFILE_TYPE_WIFI)
223                 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
224
225         if (type != CONNECTION_PROFILE_TYPE_CELLULAR &&
226              type != CONNECTION_PROFILE_TYPE_WIFI) {
227                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
228                 return CONNECTION_ERROR_INVALID_PARAMETER;
229         }
230
231         if (profile == NULL) {
232                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
233                 return CONNECTION_ERROR_INVALID_PARAMETER;
234         }
235
236         int rv  = _connection_libnet_check_profile_privilege();
237         if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
238                 return rv;
239         else if (rv != CONNECTION_ERROR_NONE) {
240                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to create profile"); //LCOV_EXCL_LINE
241                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
242         }
243
244         net_profile_info_t *profile_info = g_try_malloc0(sizeof(net_profile_info_t));
245         if (profile_info == NULL)
246                 return CONNECTION_ERROR_OUT_OF_MEMORY;
247
248         switch (type) {
249         case CONNECTION_PROFILE_TYPE_CELLULAR:
250                 if (keyword == NULL) {
251                         CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
252                         g_free(profile_info);
253                         return CONNECTION_ERROR_INVALID_PARAMETER;
254                 }
255                 __profile_init_cellular_profile(profile_info, keyword);
256                 break;
257         case CONNECTION_PROFILE_TYPE_WIFI:
258                 __profile_init_wifi_profile(profile_info);
259                 break;
260         default:
261                 break;
262         }
263
264         *profile = (connection_profile_h)profile_info;
265         _connection_libnet_add_to_profile_list(*profile);
266
267         return CONNECTION_ERROR_NONE;
268 }
269
270 EXPORT_API int connection_profile_destroy(connection_profile_h profile)
271 {
272         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
273
274         if (!(_connection_libnet_check_profile_validity(profile))) {
275                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
276                 return CONNECTION_ERROR_INVALID_PARAMETER;
277         }
278
279         _connection_libnet_remove_from_profile_list(profile);
280
281         return CONNECTION_ERROR_NONE;
282 }
283
284 EXPORT_API int connection_profile_clone(connection_profile_h* cloned_profile, connection_profile_h origin_profile)
285 {
286         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
287
288         if (!(_connection_libnet_check_profile_validity(origin_profile)) || cloned_profile == NULL) {
289                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
290                 return CONNECTION_ERROR_INVALID_PARAMETER;
291         }
292
293         *cloned_profile = g_try_malloc0(sizeof(net_profile_info_t));
294         if (*cloned_profile == NULL)
295                 return CONNECTION_ERROR_OUT_OF_MEMORY;
296
297         memcpy(*cloned_profile, origin_profile, sizeof(net_profile_info_t));
298         _connection_libnet_add_to_profile_list(*cloned_profile);
299
300         return CONNECTION_ERROR_NONE;
301 }
302
303 EXPORT_API int connection_profile_get_id(connection_profile_h profile, char** profile_id)
304 {
305         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
306
307         if (!(_connection_libnet_check_profile_validity(profile)) || profile_id == NULL) {
308                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
309                 return CONNECTION_ERROR_INVALID_PARAMETER;
310         }
311
312         net_profile_info_t *profile_info = profile;
313
314         char *prof_id = strrchr(profile_info->ProfileName, '/');
315         if (prof_id == NULL)
316                 return CONNECTION_ERROR_INVALID_PARAMETER;
317
318         prof_id++;
319         *profile_id = g_strdup(prof_id);
320
321         if (*profile_id == NULL)
322                 return CONNECTION_ERROR_OUT_OF_MEMORY;
323
324         return CONNECTION_ERROR_NONE;
325 }
326
327 EXPORT_API int connection_profile_get_name(connection_profile_h profile, char** profile_name)
328 {
329         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
330
331         if (!(_connection_libnet_check_profile_validity(profile)) || profile_name == NULL) {
332                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
333                 return CONNECTION_ERROR_INVALID_PARAMETER;
334         }
335
336         net_profile_info_t *profile_info = profile;
337
338         switch (profile_info->profile_type) {
339         case NET_DEVICE_CELLULAR:
340                 *profile_name = g_strdup(profile_info->ProfileInfo.Pdp.Keyword);
341                 break;
342         case NET_DEVICE_WIFI:
343                 *profile_name = g_strdup(profile_info->ProfileInfo.Wlan.essid);
344                 break;
345         case NET_DEVICE_ETHERNET:
346                 *profile_name = g_strdup(profile_info->ProfileInfo.Ethernet.net_info.DevName); //LCOV_EXCL_LINE
347                 break; //LCOV_EXCL_LINE
348         case NET_DEVICE_BLUETOOTH: {
349                 char *bt_name = strrchr(profile_info->ProfileName, '/');
350                 if (bt_name == NULL)
351                         return CONNECTION_ERROR_INVALID_PARAMETER;
352
353                 bt_name++;
354                 *profile_name = g_strdup(bt_name);
355         } break;
356         default:
357                 return CONNECTION_ERROR_INVALID_PARAMETER;
358         }
359
360         if (*profile_name == NULL)
361                 return CONNECTION_ERROR_OUT_OF_MEMORY;
362
363         return CONNECTION_ERROR_NONE;
364 }
365
366 EXPORT_API int connection_profile_get_type(connection_profile_h profile, connection_profile_type_e *type)
367 {
368         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
369
370         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
371                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
372                 return CONNECTION_ERROR_INVALID_PARAMETER;
373         }
374
375         net_profile_info_t *profile_info = profile;
376
377         switch (profile_info->profile_type) {
378         case NET_DEVICE_CELLULAR:
379                 *type = CONNECTION_PROFILE_TYPE_CELLULAR;
380                 break;
381         case NET_DEVICE_WIFI:
382                 *type = CONNECTION_PROFILE_TYPE_WIFI;
383                 break;
384         case NET_DEVICE_ETHERNET:
385                 *type = CONNECTION_PROFILE_TYPE_ETHERNET; //LCOV_EXCL_LINE
386                 break; //LCOV_EXCL_LINE
387         case NET_DEVICE_BLUETOOTH:
388                 *type = CONNECTION_PROFILE_TYPE_BT;
389                 break;
390         default:
391                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid profile type");
392                 return CONNECTION_ERROR_OPERATION_FAILED;
393         }
394
395         return CONNECTION_ERROR_NONE;
396 }
397
398 EXPORT_API int connection_profile_get_network_interface_name(connection_profile_h profile, char** interface_name)
399 {
400         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
401
402         if (!(_connection_libnet_check_profile_validity(profile)) || interface_name == NULL) {
403                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
404                 return CONNECTION_ERROR_INVALID_PARAMETER;
405         }
406
407         net_profile_info_t *profile_info = profile;
408         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
409         if (net_info == NULL)
410                 return CONNECTION_ERROR_INVALID_PARAMETER;
411
412         *interface_name = g_strdup(net_info->DevName);
413         if (*interface_name == NULL)
414                 return CONNECTION_ERROR_OUT_OF_MEMORY;
415
416         return CONNECTION_ERROR_NONE;
417 }
418
419 EXPORT_API int connection_profile_refresh(connection_profile_h profile)
420 {
421         int rv;
422
423         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
424
425         if (!(_connection_libnet_check_profile_validity(profile))) {
426                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
427                 return CONNECTION_ERROR_INVALID_PARAMETER;
428         }
429
430         net_profile_info_t profile_info_local;
431         net_profile_info_t *profile_info = profile;
432
433         rv = net_get_profile_info(profile_info->ProfileName, &profile_info_local);
434         if (rv == NET_ERR_ACCESS_DENIED) {
435                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
436                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
437         } else if (rv != NET_ERR_NONE) {
438                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get profile information"); //LCOV_EXCL_LINE
439                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
440         }
441
442         memcpy(profile, &profile_info_local, sizeof(net_profile_info_t));
443
444         return CONNECTION_ERROR_NONE;
445 }
446
447 EXPORT_API int connection_profile_get_state(connection_profile_h profile, connection_profile_state_e* state)
448 {
449         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
450
451         if (!(_connection_libnet_check_profile_validity(profile)) || state == NULL) {
452                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
453                 return CONNECTION_ERROR_INVALID_PARAMETER;
454         }
455
456         net_profile_info_t *profile_info = profile;
457         *state = _profile_convert_to_cp_state(profile_info->ProfileState);
458
459         return CONNECTION_ERROR_NONE;
460 }
461
462 EXPORT_API int connection_profile_get_ip_config_type(connection_profile_h profile,
463                 connection_address_family_e address_family, connection_ip_config_type_e *type)
464 {
465         net_ip_config_type_t profile_type;
466
467         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
468
469         if (!(_connection_libnet_check_profile_validity(profile)) ||
470             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
471              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
472             type == NULL) {
473                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
474                 return CONNECTION_ERROR_INVALID_PARAMETER;
475         }
476
477         net_profile_info_t *profile_info = profile;
478         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
479         if (net_info == NULL)
480                 return CONNECTION_ERROR_OPERATION_FAILED;
481
482         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4)
483                 profile_type = net_info->IpConfigType;
484         else
485                 profile_type = net_info->IpConfigType6;
486
487         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
488                 switch (profile_type) {
489                 //LCOV_EXCL_START
490                 case NET_IP_CONFIG_TYPE_STATIC:
491                         *type = CONNECTION_IP_CONFIG_TYPE_STATIC;
492                         break;
493
494                 case NET_IP_CONFIG_TYPE_DYNAMIC:
495                         *type = CONNECTION_IP_CONFIG_TYPE_DYNAMIC;
496                         break;
497
498                 case NET_IP_CONFIG_TYPE_AUTO_IP:
499                         *type = CONNECTION_IP_CONFIG_TYPE_AUTO;
500                         break;
501
502                 case NET_IP_CONFIG_TYPE_FIXED:
503                         *type = CONNECTION_IP_CONFIG_TYPE_FIXED;
504                         break;
505
506                 case NET_IP_CONFIG_TYPE_OFF:
507                         *type = CONNECTION_IP_CONFIG_TYPE_NONE;
508                         break;
509                 default:
510                         return CONNECTION_ERROR_OPERATION_FAILED;
511                 //LCOV_EXCL_STOP
512                 }
513         } else {
514                 //LCOV_EXCL_START
515                 switch (profile_type) {
516                 case NET_IP_CONFIG_TYPE_STATIC:
517                         *type = CONNECTION_IP_CONFIG_TYPE_STATIC;
518                         break;
519
520                 case NET_IP_CONFIG_TYPE_AUTO_IP:
521                         *type = CONNECTION_IP_CONFIG_TYPE_AUTO;
522                         break;
523
524                 case NET_IP_CONFIG_TYPE_OFF:
525                         *type = CONNECTION_IP_CONFIG_TYPE_NONE;
526                         break;
527
528                 default:
529                         return  CONNECTION_ERROR_OPERATION_FAILED;
530
531                 }
532                 //LCOV_EXCL_STOP
533         }
534
535         return CONNECTION_ERROR_NONE;
536 }
537
538 EXPORT_API int connection_profile_get_ip_address(connection_profile_h profile,
539                 connection_address_family_e address_family, char** ip_address)
540 {
541         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
542
543         if (!(_connection_libnet_check_profile_validity(profile)) ||
544             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
545              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
546             ip_address == NULL) {
547                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
548                 return CONNECTION_ERROR_INVALID_PARAMETER;
549         }
550
551         net_profile_info_t *profile_info = profile;
552         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
553         if (net_info == NULL)
554                 return CONNECTION_ERROR_OPERATION_FAILED;
555
556         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6)
557                 *ip_address = __profile_convert_ip_to_string(&net_info->IpAddr6,
558                                 address_family);
559         else
560                 *ip_address = __profile_convert_ip_to_string(&net_info->IpAddr,
561                                 address_family);
562
563         if (*ip_address == NULL)
564                 return CONNECTION_ERROR_OUT_OF_MEMORY;
565
566         return CONNECTION_ERROR_NONE;
567 }
568
569 EXPORT_API int connection_profile_get_subnet_mask(connection_profile_h profile,
570                 connection_address_family_e address_family, char** subnet_mask)
571 {
572         char* prefixlen;
573
574         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
575
576         if (!(_connection_libnet_check_profile_validity(profile)) ||
577             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
578              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
579             subnet_mask == NULL) {
580                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
581                 return CONNECTION_ERROR_INVALID_PARAMETER;
582         }
583
584         net_profile_info_t *profile_info = profile;
585         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
586         if (net_info == NULL)
587                 return CONNECTION_ERROR_OPERATION_FAILED;
588
589         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) {
590                 //LCOV_EXCL_START
591                 prefixlen = g_try_malloc0(MAX_PREFIX_LENGTH);
592                 if (prefixlen != NULL) {
593                         snprintf(prefixlen, MAX_PREFIX_LENGTH, "%d", net_info->PrefixLen6);
594                         *subnet_mask = prefixlen;
595                 } else
596                         *subnet_mask = NULL;
597                 //LCOV_EXCL_STOP
598         } else
599                 *subnet_mask = __profile_convert_ip_to_string(&net_info->SubnetMask,
600                                 address_family);
601
602         if (*subnet_mask == NULL)
603                 return CONNECTION_ERROR_OUT_OF_MEMORY;
604
605         return CONNECTION_ERROR_NONE;
606 }
607
608 EXPORT_API int connection_profile_get_gateway_address(connection_profile_h profile,
609                 connection_address_family_e address_family, char** gateway_address)
610 {
611         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
612
613         if (!(_connection_libnet_check_profile_validity(profile)) ||
614             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
615              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
616             gateway_address == NULL) {
617                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
618                 return CONNECTION_ERROR_INVALID_PARAMETER;
619         }
620
621         net_profile_info_t *profile_info = profile;
622         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
623         if (net_info == NULL)
624                 return CONNECTION_ERROR_OPERATION_FAILED;
625
626         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6)
627                 *gateway_address = __profile_convert_ip_to_string(
628                                         &net_info->GatewayAddr6, address_family);
629         else
630                 *gateway_address = __profile_convert_ip_to_string(
631                                         &net_info->GatewayAddr, address_family);
632
633         if (*gateway_address == NULL)
634                 return CONNECTION_ERROR_OUT_OF_MEMORY;
635
636         return CONNECTION_ERROR_NONE;
637 }
638
639 EXPORT_API int connection_profile_get_dns_address(connection_profile_h profile, int order,
640                 connection_address_family_e address_family, char** dns_address)
641 {
642         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
643
644         if (!(_connection_libnet_check_profile_validity(profile)) ||
645             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
646              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
647             dns_address == NULL ||
648             order <= 0 ||
649             order > NET_DNS_ADDR_MAX) {
650                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
651                 return CONNECTION_ERROR_INVALID_PARAMETER;
652         }
653
654         net_profile_info_t *profile_info = profile;
655         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
656         if (net_info == NULL)
657                 return CONNECTION_ERROR_OPERATION_FAILED;
658
659         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4)
660                 *dns_address = __profile_convert_ip_to_string(&net_info->DnsAddr[order-1],
661                                 address_family);
662         else if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) //LCOV_EXCL_LINE
663                 *dns_address = __profile_convert_ip_to_string(&net_info->DnsAddr6[order-1], //LCOV_EXCL_LINE
664                                 address_family);
665         else
666                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid address family\n"); //LCOV_EXCL_LINE
667
668         if (*dns_address == NULL)
669                 return CONNECTION_ERROR_OUT_OF_MEMORY;
670
671         return CONNECTION_ERROR_NONE;
672 }
673
674 EXPORT_API int connection_profile_get_proxy_type(connection_profile_h profile, connection_proxy_type_e *type)
675 {
676         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
677
678         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
679                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
680                 return CONNECTION_ERROR_INVALID_PARAMETER;
681         }
682
683         const char *proxy;
684         net_profile_info_t *profile_info = profile;
685         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
686         if (net_info == NULL)
687                 return CONNECTION_ERROR_OPERATION_FAILED;
688
689         //LCOV_EXCL_START
690         if (profile_info->profile_type == NET_DEVICE_ETHERNET) {
691                 proxy = __profile_get_ethernet_proxy();
692                 if (proxy == NULL)
693                         *type = CONNECTION_PROXY_TYPE_DIRECT;
694                 else
695                         *type = CONNECTION_PROXY_TYPE_MANUAL;
696
697                 return CONNECTION_ERROR_NONE;
698         }
699         //LCOV_EXCL_STOP
700
701         switch (net_info->ProxyMethod) {
702         //LCOV_EXCL_START
703         case NET_PROXY_TYPE_DIRECT:
704                 *type = CONNECTION_PROXY_TYPE_DIRECT;
705                 break;
706         case NET_PROXY_TYPE_AUTO:
707                 *type = CONNECTION_PROXY_TYPE_AUTO;
708                 break;
709         case NET_PROXY_TYPE_MANUAL:
710                 *type = CONNECTION_PROXY_TYPE_MANUAL;
711                 break;
712         case NET_PROXY_TYPE_UNKNOWN:
713         default:
714                 return CONNECTION_ERROR_OPERATION_FAILED;
715         //LCOV_EXCL_STOP
716         }
717
718         return CONNECTION_ERROR_NONE;
719 }
720
721 EXPORT_API int connection_profile_get_proxy_address(connection_profile_h profile,
722                 connection_address_family_e address_family, char** proxy_address)
723 {
724         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
725
726         if (!(_connection_libnet_check_profile_validity(profile)) ||
727             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
728              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
729              proxy_address == NULL) {
730                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
731                 return CONNECTION_ERROR_INVALID_PARAMETER;
732         }
733
734         net_profile_info_t *profile_info = profile;
735         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
736         if (net_info == NULL)
737                 return CONNECTION_ERROR_OPERATION_FAILED;
738
739         *proxy_address = g_strdup(net_info->ProxyAddr);
740
741         if (*proxy_address == NULL)
742                 return CONNECTION_ERROR_OUT_OF_MEMORY;
743
744         return CONNECTION_ERROR_NONE;
745 }
746
747 EXPORT_API int connection_profile_set_ip_config_type(connection_profile_h profile,
748                 connection_address_family_e address_family, connection_ip_config_type_e type)
749 {
750         net_ip_config_type_t *profile_type = NULL;
751
752         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
753
754         if (!(_connection_libnet_check_profile_validity(profile)) ||
755             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
756              address_family != CONNECTION_ADDRESS_FAMILY_IPV6)) {
757                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
758                 return CONNECTION_ERROR_INVALID_PARAMETER;
759         }
760
761         net_profile_info_t *profile_info = profile;
762         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
763         if (net_info == NULL)
764                 return CONNECTION_ERROR_OPERATION_FAILED;
765
766         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4)
767                 profile_type = &net_info->IpConfigType ;
768         else
769                 profile_type = &net_info->IpConfigType6 ;
770
771         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
772                 switch (type) {
773                 //LCOV_EXCL_START
774                 case CONNECTION_IP_CONFIG_TYPE_STATIC:
775                         *profile_type = NET_IP_CONFIG_TYPE_STATIC;
776                         net_info->IpAddr.Data.Ipv4.s_addr = 0;
777                         net_info->SubnetMask.Data.Ipv4.s_addr = 0;
778                         net_info->GatewayAddr.Data.Ipv4.s_addr = 0 ;
779                         break;
780
781                 case CONNECTION_IP_CONFIG_TYPE_DYNAMIC:
782                         *profile_type = NET_IP_CONFIG_TYPE_DYNAMIC;
783                         break;
784
785                 case CONNECTION_IP_CONFIG_TYPE_AUTO:
786                         *profile_type = NET_IP_CONFIG_TYPE_AUTO_IP;
787                         break;
788
789                 case CONNECTION_IP_CONFIG_TYPE_FIXED:
790                         net_info->IpConfigType = NET_IP_CONFIG_TYPE_FIXED;
791                         break;
792
793                 case CONNECTION_IP_CONFIG_TYPE_NONE:
794                         *profile_type = NET_IP_CONFIG_TYPE_OFF;
795                         break;
796
797                 default:
798                         return CONNECTION_ERROR_INVALID_PARAMETER;
799                 //LCOV_EXCL_STOP
800                 }
801         } else {
802                 //LCOV_EXCL_START
803                 switch (type) {
804                 case CONNECTION_IP_CONFIG_TYPE_STATIC:
805                         *profile_type = NET_IP_CONFIG_TYPE_STATIC;
806                         inet_pton(AF_INET6, "::", &net_info->IpAddr6.Data.Ipv6);
807                         net_info->PrefixLen6 = 0 ;
808                         inet_pton(AF_INET6, "::",
809                                         &net_info->GatewayAddr6.Data.Ipv6);
810                         break;
811
812                 case CONNECTION_IP_CONFIG_TYPE_AUTO:
813                         *profile_type = NET_IP_CONFIG_TYPE_AUTO_IP;
814                         break;
815
816                 case CONNECTION_IP_CONFIG_TYPE_NONE:
817                         *profile_type = NET_IP_CONFIG_TYPE_OFF;
818                         break;
819
820                 default:
821                         return CONNECTION_ERROR_INVALID_PARAMETER;
822                 }
823                 //LCOV_EXCL_STOP
824         }
825
826         return CONNECTION_ERROR_NONE;
827 }
828
829 EXPORT_API int connection_profile_set_ip_address(connection_profile_h profile,
830                 connection_address_family_e address_family, const char* ip_address)
831 {
832         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
833
834         if (!(_connection_libnet_check_profile_validity(profile)) ||
835             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
836              address_family != CONNECTION_ADDRESS_FAMILY_IPV6)) {
837                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
838                 return CONNECTION_ERROR_INVALID_PARAMETER;
839         }
840
841         net_profile_info_t *profile_info = profile;
842         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
843         if (net_info == NULL)
844                 return CONNECTION_ERROR_OPERATION_FAILED;
845
846         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) {
847                 //LCOV_EXCL_START
848                 if (ip_address == NULL)
849                         inet_pton(AF_INET6, "::", &net_info->IpAddr6.Data.Ipv6);
850                 else if (inet_pton(AF_INET6, ip_address,
851                                         &net_info->IpAddr6.Data.Ipv6) < 1)
852                         return CONNECTION_ERROR_INVALID_PARAMETER;
853                 //LCOV_EXCL_STOP
854         } else {
855                 if (ip_address == NULL)
856                         net_info->IpAddr.Data.Ipv4.s_addr = 0;
857                 else if (inet_pton(AF_INET, ip_address,
858                                         &net_info->IpAddr.Data.Ipv4) < 1)
859                         return CONNECTION_ERROR_INVALID_PARAMETER;
860         }
861
862         return CONNECTION_ERROR_NONE;
863 }
864
865 EXPORT_API int connection_profile_set_subnet_mask(connection_profile_h profile,
866                 connection_address_family_e address_family, const char* subnet_mask)
867 {
868         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
869
870         if (!(_connection_libnet_check_profile_validity(profile)) ||
871             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
872              address_family != CONNECTION_ADDRESS_FAMILY_IPV6)) {
873                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
874                 return CONNECTION_ERROR_INVALID_PARAMETER;
875         }
876
877         net_profile_info_t *profile_info = profile;
878         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
879         if (net_info == NULL)
880                 return CONNECTION_ERROR_OPERATION_FAILED;
881
882         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) {
883                 //LCOV_EXCL_START
884                 if (subnet_mask == NULL)
885                         net_info->PrefixLen6 = 0 ;
886                 else
887                         net_info->PrefixLen6 = atoi(subnet_mask) ;
888                 //LCOV_EXCL_STOP
889         } else {
890                 if (subnet_mask == NULL)
891                         net_info->SubnetMask.Data.Ipv4.s_addr = 0;
892                 else if (inet_pton(AF_INET, subnet_mask , &net_info->SubnetMask.Data.Ipv4)  < 1)
893                         return CONNECTION_ERROR_INVALID_PARAMETER;
894         }
895
896         return CONNECTION_ERROR_NONE;
897 }
898
899 EXPORT_API int connection_profile_set_gateway_address(connection_profile_h profile,
900                 connection_address_family_e address_family, const char* gateway_address)
901 {
902         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
903
904         if (!(_connection_libnet_check_profile_validity(profile)) ||
905             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
906              address_family != CONNECTION_ADDRESS_FAMILY_IPV6)) {
907                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
908                 return CONNECTION_ERROR_INVALID_PARAMETER;
909         }
910
911         net_profile_info_t *profile_info = profile;
912         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
913         if (net_info == NULL)
914                 return CONNECTION_ERROR_OPERATION_FAILED;
915
916         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) {
917                 //LCOV_EXCL_START
918                 if (gateway_address == NULL)
919                         inet_pton(AF_INET6, "::", &net_info->GatewayAddr6.Data.Ipv6);
920                 else if (inet_pton(AF_INET6, gateway_address, &net_info->GatewayAddr6.Data.Ipv6) < 1)
921                         return CONNECTION_ERROR_INVALID_PARAMETER;
922                 //LCOV_EXCL_STOP
923         } else {
924                 if (gateway_address == NULL)
925                         net_info->GatewayAddr.Data.Ipv4.s_addr = 0;
926                 else if (inet_pton(AF_INET, gateway_address, &(net_info->GatewayAddr.Data.Ipv4)) < 1)
927                         return CONNECTION_ERROR_INVALID_PARAMETER;
928         }
929
930         return CONNECTION_ERROR_NONE;
931 }
932
933 EXPORT_API int connection_profile_set_dns_address(connection_profile_h profile, int order,
934                 connection_address_family_e address_family, const char* dns_address)
935 {
936         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
937
938         if (!(_connection_libnet_check_profile_validity(profile)) ||
939             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
940              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
941             order <= 0 ||
942             order > NET_DNS_ADDR_MAX) {
943                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
944                 return CONNECTION_ERROR_INVALID_PARAMETER;
945         }
946
947         net_profile_info_t *profile_info = profile;
948         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
949         if (net_info == NULL)
950                 return CONNECTION_ERROR_OPERATION_FAILED;
951
952         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) {
953                 //LCOV_EXCL_START
954                 net_info->DnsAddr6[order-1].Type = NET_ADDR_IPV6;
955                 if (dns_address == NULL)
956                         inet_pton(AF_INET6, "::", &net_info->DnsAddr6[order-1].Data.Ipv6);
957                 else if (inet_pton(AF_INET6, dns_address, &net_info->DnsAddr6[order-1].Data.Ipv6) < 1)
958                         return CONNECTION_ERROR_INVALID_PARAMETER;
959                 if (net_info->DnsCount6 < order)
960                         net_info->DnsCount6 = order;
961                 //LCOV_EXCL_STOP
962         } else {
963                 net_info->DnsAddr[order-1].Type = NET_ADDR_IPV4;
964                 if (dns_address == NULL)
965                         net_info->DnsAddr[order-1].Data.Ipv4.s_addr = 0;
966                 else if (inet_pton(AF_INET, dns_address, &(net_info->DnsAddr[order-1].Data.Ipv4)) < 1)
967                         return CONNECTION_ERROR_INVALID_PARAMETER;
968                 if (net_info->DnsCount < order)
969                         net_info->DnsCount = order;
970         }
971
972         return CONNECTION_ERROR_NONE;
973 }
974
975 EXPORT_API int connection_profile_set_proxy_type(connection_profile_h profile, connection_proxy_type_e type)
976 {
977         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
978
979         if (!(_connection_libnet_check_profile_validity(profile))) {
980                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
981                 return CONNECTION_ERROR_INVALID_PARAMETER;
982         }
983
984         net_profile_info_t *profile_info = profile;
985         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
986         if (net_info == NULL)
987                 return CONNECTION_ERROR_OPERATION_FAILED;
988
989         switch (type) {
990         //LCOV_EXCL_START
991         case CONNECTION_PROXY_TYPE_DIRECT:
992                 net_info->ProxyMethod = NET_PROXY_TYPE_DIRECT;
993                 break;
994         case CONNECTION_PROXY_TYPE_AUTO:
995                 net_info->ProxyMethod = NET_PROXY_TYPE_AUTO;
996                 break;
997         case CONNECTION_PROXY_TYPE_MANUAL:
998                 net_info->ProxyMethod = NET_PROXY_TYPE_MANUAL;
999                 break;
1000         default:
1001                 return CONNECTION_ERROR_INVALID_PARAMETER;
1002         //LCOV_EXCL_STOP
1003         }
1004
1005         return CONNECTION_ERROR_NONE;
1006 }
1007
1008 EXPORT_API int connection_profile_set_proxy_address(connection_profile_h profile,
1009                 connection_address_family_e address_family, const char* proxy_address)
1010 {
1011         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1012
1013         if (!(_connection_libnet_check_profile_validity(profile)) ||
1014             (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1015              address_family != CONNECTION_ADDRESS_FAMILY_IPV6)) {
1016                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1017                 return CONNECTION_ERROR_INVALID_PARAMETER;
1018         }
1019
1020         net_profile_info_t *profile_info = profile;
1021         net_dev_info_t *net_info = __profile_get_net_info(profile_info);
1022         if (net_info == NULL)
1023                 return CONNECTION_ERROR_OPERATION_FAILED;
1024
1025         if (proxy_address == NULL)
1026                 net_info->ProxyAddr[0] = '\0';
1027         else
1028                 g_strlcpy(net_info->ProxyAddr, proxy_address, NET_PROXY_LEN_MAX);
1029
1030         return CONNECTION_ERROR_NONE;
1031 }
1032
1033 EXPORT_API int connection_profile_set_state_changed_cb(connection_profile_h profile,
1034                 connection_profile_state_changed_cb callback, void* user_data)
1035 {
1036         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1037
1038         if (!(_connection_libnet_check_profile_validity(profile)) || callback == NULL) {
1039                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1040                 return CONNECTION_ERROR_INVALID_PARAMETER;
1041         }
1042
1043         if (_connection_libnet_add_to_profile_cb_list(profile, callback, user_data))
1044                 return CONNECTION_ERROR_NONE;
1045
1046         return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1047 }
1048
1049 EXPORT_API int connection_profile_unset_state_changed_cb(connection_profile_h profile)
1050 {
1051         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1052
1053         if (!(_connection_libnet_check_profile_validity(profile))) {
1054                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1055                 return CONNECTION_ERROR_INVALID_PARAMETER;
1056         }
1057
1058         if (_connection_libnet_remove_from_profile_cb_list(profile) != true)
1059                 return CONNECTION_ERROR_INVALID_PARAMETER;
1060
1061         return CONNECTION_ERROR_NONE;
1062 }
1063
1064
1065 /* Wi-Fi profile *************************************************************/
1066 EXPORT_API int connection_profile_get_wifi_essid(connection_profile_h profile, char** essid)
1067 {
1068         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1069
1070         if (!(_connection_libnet_check_profile_validity(profile)) || essid == NULL) {
1071                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1072                 return CONNECTION_ERROR_INVALID_PARAMETER;
1073         }
1074
1075         net_profile_info_t *profile_info = profile;
1076
1077         if (profile_info->profile_type != NET_DEVICE_WIFI)
1078                 return CONNECTION_ERROR_INVALID_PARAMETER;
1079
1080         *essid = g_strdup(profile_info->ProfileInfo.Wlan.essid);
1081         if (*essid == NULL)
1082                 return CONNECTION_ERROR_OUT_OF_MEMORY;
1083
1084         return CONNECTION_ERROR_NONE;
1085 }
1086
1087 EXPORT_API int connection_profile_get_wifi_bssid(connection_profile_h profile, char** bssid)
1088 {
1089         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1090
1091         if (!(_connection_libnet_check_profile_validity(profile)) || bssid == NULL) {
1092                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1093                 return CONNECTION_ERROR_INVALID_PARAMETER;
1094         }
1095
1096         net_profile_info_t *profile_info = profile;
1097
1098         if (profile_info->profile_type != NET_DEVICE_WIFI)
1099                 return CONNECTION_ERROR_INVALID_PARAMETER;
1100
1101         *bssid = g_strdup(profile_info->ProfileInfo.Wlan.bssid);
1102         if (*bssid == NULL)
1103                 return CONNECTION_ERROR_OUT_OF_MEMORY;
1104
1105         return CONNECTION_ERROR_NONE;
1106 }
1107
1108 EXPORT_API int connection_profile_get_wifi_rssi(connection_profile_h profile, int* rssi)
1109 {
1110         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1111
1112         if (!(_connection_libnet_check_profile_validity(profile)) || rssi == NULL) {
1113                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1114                 return CONNECTION_ERROR_INVALID_PARAMETER;
1115         }
1116
1117         net_profile_info_t *profile_info = profile;
1118
1119         if (profile_info->profile_type != NET_DEVICE_WIFI)
1120                 return CONNECTION_ERROR_INVALID_PARAMETER;
1121
1122         *rssi = (int)profile_info->ProfileInfo.Wlan.Strength;
1123
1124         return CONNECTION_ERROR_NONE;
1125 }
1126
1127 EXPORT_API int connection_profile_get_wifi_frequency(connection_profile_h profile, int* frequency)
1128 {
1129         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1130
1131         if (!(_connection_libnet_check_profile_validity(profile)) || frequency == NULL) {
1132                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1133                 return CONNECTION_ERROR_INVALID_PARAMETER;
1134         }
1135
1136         net_profile_info_t *profile_info = profile;
1137
1138         if (profile_info->profile_type != NET_DEVICE_WIFI)
1139                 return CONNECTION_ERROR_INVALID_PARAMETER;
1140
1141         *frequency = (int)profile_info->ProfileInfo.Wlan.frequency;
1142
1143         return CONNECTION_ERROR_NONE;
1144 }
1145
1146 EXPORT_API int connection_profile_get_wifi_max_speed(connection_profile_h profile, int* max_speed)
1147 {
1148         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1149
1150         if (!(_connection_libnet_check_profile_validity(profile)) || max_speed == NULL) {
1151                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1152                 return CONNECTION_ERROR_INVALID_PARAMETER;
1153         }
1154
1155         net_profile_info_t *profile_info = profile;
1156
1157         if (profile_info->profile_type != NET_DEVICE_WIFI)
1158                 return CONNECTION_ERROR_INVALID_PARAMETER;
1159
1160         *max_speed = (int)profile_info->ProfileInfo.Wlan.max_rate;
1161
1162         return CONNECTION_ERROR_NONE;
1163 }
1164
1165 EXPORT_API int connection_profile_get_wifi_security_type(connection_profile_h profile, connection_wifi_security_type_e *type)
1166 {
1167         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1168
1169         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
1170                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1171                 return CONNECTION_ERROR_INVALID_PARAMETER;
1172         }
1173
1174         net_profile_info_t *profile_info = profile;
1175
1176         if (profile_info->profile_type != NET_DEVICE_WIFI)
1177                 return CONNECTION_ERROR_INVALID_PARAMETER;
1178
1179         switch (profile_info->ProfileInfo.Wlan.security_info.sec_mode) {
1180         //LCOV_EXCL_START
1181         case WLAN_SEC_MODE_NONE:
1182                 *type = CONNECTION_WIFI_SECURITY_TYPE_NONE;
1183                 break;
1184         case WLAN_SEC_MODE_WEP:
1185                 *type = CONNECTION_WIFI_SECURITY_TYPE_WEP;
1186                 break;
1187         case WLAN_SEC_MODE_IEEE8021X:
1188                 *type = CONNECTION_WIFI_SECURITY_TYPE_EAP;
1189                 break;
1190         case WLAN_SEC_MODE_WPA_PSK:
1191                 *type = CONNECTION_WIFI_SECURITY_TYPE_WPA_PSK;
1192                 break;
1193         case WLAN_SEC_MODE_WPA2_PSK:
1194                 *type = CONNECTION_WIFI_SECURITY_TYPE_WPA2_PSK;
1195                 break;
1196         default:
1197                 return CONNECTION_ERROR_OPERATION_FAILED;
1198         //LCOV_EXCL_STOP
1199         }
1200
1201         return CONNECTION_ERROR_NONE;
1202 }
1203
1204 EXPORT_API int connection_profile_get_wifi_encryption_type(connection_profile_h profile, connection_wifi_encryption_type_e *type)
1205 {
1206         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1207
1208         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
1209                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1210                 return CONNECTION_ERROR_INVALID_PARAMETER;
1211         }
1212
1213         net_profile_info_t *profile_info = profile;
1214
1215         if (profile_info->profile_type != NET_DEVICE_WIFI)
1216                 return CONNECTION_ERROR_INVALID_PARAMETER;
1217
1218         switch (profile_info->ProfileInfo.Wlan.security_info.enc_mode) {
1219         //LCOV_EXCL_START
1220         case WLAN_ENC_MODE_NONE:
1221                 *type = CONNECTION_WIFI_ENCRYPTION_TYPE_NONE;
1222                 break;
1223         case WLAN_ENC_MODE_WEP:
1224                 *type = CONNECTION_WIFI_ENCRYPTION_TYPE_WEP;
1225                 break;
1226         case WLAN_ENC_MODE_TKIP:
1227                 *type = CONNECTION_WIFI_ENCRYPTION_TYPE_TKIP;
1228                 break;
1229         case WLAN_ENC_MODE_AES:
1230                 *type = CONNECTION_WIFI_ENCRYPTION_TYPE_AES;
1231                 break;
1232         case WLAN_ENC_MODE_TKIP_AES_MIXED:
1233                 *type = CONNECTION_WIFI_ENCRYPTION_TYPE_TKIP_AES_MIXED;
1234                 break;
1235         default:
1236                 return CONNECTION_ERROR_OPERATION_FAILED;
1237         //LCOV_EXCL_STOP
1238         }
1239
1240         return CONNECTION_ERROR_NONE;
1241 }
1242
1243 EXPORT_API int connection_profile_is_wifi_passphrase_required(connection_profile_h profile, bool* required)
1244 {
1245         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1246
1247         if (!(_connection_libnet_check_profile_validity(profile)) || required == NULL) {
1248                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1249                 return CONNECTION_ERROR_INVALID_PARAMETER;
1250         }
1251
1252         net_profile_info_t *profile_info = profile;
1253
1254         if (profile_info->profile_type != NET_DEVICE_WIFI)
1255                 return CONNECTION_ERROR_INVALID_PARAMETER;
1256
1257         if (profile_info->Favourite) {
1258                 *required = false;
1259                 return CONNECTION_ERROR_NONE;
1260         }
1261
1262         switch (profile_info->ProfileInfo.Wlan.security_info.sec_mode) {
1263         //LCOV_EXCL_START
1264         case WLAN_SEC_MODE_NONE:
1265                 *required = false;
1266                 break;
1267         case WLAN_SEC_MODE_WEP:
1268         case WLAN_SEC_MODE_IEEE8021X:
1269         case WLAN_SEC_MODE_WPA_PSK:
1270         case WLAN_SEC_MODE_WPA2_PSK:
1271                 *required = true;
1272                 break;
1273         default:
1274                 return CONNECTION_ERROR_OPERATION_FAILED;
1275         //LCOV_EXCL_STOP
1276         }
1277
1278         return CONNECTION_ERROR_NONE;
1279 }
1280
1281 EXPORT_API int connection_profile_set_wifi_passphrase(connection_profile_h profile, const char* passphrase)
1282 {
1283         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1284
1285         if (!(_connection_libnet_check_profile_validity(profile)) || passphrase == NULL) {
1286                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1287                 return CONNECTION_ERROR_INVALID_PARAMETER;
1288         }
1289
1290         net_profile_info_t *profile_info = profile;
1291
1292         if (profile_info->profile_type != NET_DEVICE_WIFI)
1293                 return CONNECTION_ERROR_INVALID_PARAMETER;
1294
1295         g_strlcpy(profile_info->ProfileInfo.Wlan.security_info.authentication.psk.pskKey,
1296                                                 passphrase, NETPM_WLAN_MAX_PSK_PASSPHRASE_LEN);
1297
1298         return CONNECTION_ERROR_NONE;
1299 }
1300
1301 EXPORT_API int connection_profile_is_wifi_wps_supported(connection_profile_h profile, bool* supported)
1302 {
1303         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1304
1305         if (!(_connection_libnet_check_profile_validity(profile)) || supported == NULL) {
1306                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1307                 return CONNECTION_ERROR_INVALID_PARAMETER;
1308         }
1309
1310         net_profile_info_t *profile_info = profile;
1311
1312         if (profile_info->profile_type != NET_DEVICE_WIFI)
1313                 return CONNECTION_ERROR_INVALID_PARAMETER;
1314
1315         if (profile_info->ProfileInfo.Wlan.security_info.wps_support)
1316                 *supported = true;
1317         else
1318                 *supported = false;
1319
1320         return CONNECTION_ERROR_NONE;
1321 }
1322
1323
1324 /* Cellular profile **********************************************************/
1325 EXPORT_API int connection_profile_get_cellular_service_type(connection_profile_h profile,
1326                                                 connection_cellular_service_type_e* type)
1327 {
1328         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1329
1330         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
1331                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1332                 return CONNECTION_ERROR_INVALID_PARAMETER;
1333         }
1334
1335         net_profile_info_t *profile_info = profile;
1336
1337         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1338                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1339                 return CONNECTION_ERROR_INVALID_PARAMETER;
1340         }
1341
1342         *type = _profile_convert_to_connection_cellular_service_type(profile_info->ProfileInfo.Pdp.ServiceType);
1343
1344         if (*type == CONNECTION_CELLULAR_SERVICE_TYPE_UNKNOWN) {
1345                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid service type Passed"); //LCOV_EXCL_LINE
1346                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1347         }
1348
1349         return CONNECTION_ERROR_NONE;
1350 }
1351
1352 EXPORT_API int connection_profile_get_cellular_apn(connection_profile_h profile, char** apn)
1353 {
1354         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1355
1356         if (!(_connection_libnet_check_profile_validity(profile)) || apn == NULL) {
1357                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1358                 return CONNECTION_ERROR_INVALID_PARAMETER;
1359         }
1360
1361         net_profile_info_t *profile_info = profile;
1362
1363         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1364                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1365                 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1366         }
1367
1368         *apn = g_strdup(profile_info->ProfileInfo.Pdp.Apn);
1369         if (*apn == NULL)
1370                 return CONNECTION_ERROR_OUT_OF_MEMORY;
1371
1372         return CONNECTION_ERROR_NONE;
1373 }
1374
1375 EXPORT_API int connection_profile_get_cellular_auth_info(connection_profile_h profile,
1376                 connection_cellular_auth_type_e *type, char** user_name, char** password)
1377 {
1378         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1379
1380         if (!(_connection_libnet_check_profile_validity(profile)) ||
1381             type == NULL || user_name == NULL || password == NULL) {
1382                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1383                 return CONNECTION_ERROR_INVALID_PARAMETER;
1384         }
1385
1386         net_profile_info_t *profile_info = profile;
1387
1388         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1389                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1390                 return CONNECTION_ERROR_INVALID_PARAMETER;
1391         }
1392
1393         switch (profile_info->ProfileInfo.Pdp.AuthInfo.AuthType) {
1394         //LCOV_EXCL_START
1395         case NET_PDP_AUTH_NONE:
1396                 *type = CONNECTION_CELLULAR_AUTH_TYPE_NONE;
1397                 break;
1398         case NET_PDP_AUTH_PAP:
1399                 *type = CONNECTION_CELLULAR_AUTH_TYPE_PAP;
1400                 break;
1401         case NET_PDP_AUTH_CHAP:
1402                 *type = CONNECTION_CELLULAR_AUTH_TYPE_CHAP;
1403                 break;
1404         default:
1405                 return CONNECTION_ERROR_OPERATION_FAILED;
1406         //LCOV_EXCL_STOP
1407         }
1408
1409         *user_name = g_strdup(profile_info->ProfileInfo.Pdp.AuthInfo.UserName);
1410         if (*user_name == NULL)
1411                 return CONNECTION_ERROR_OUT_OF_MEMORY;
1412
1413         *password = g_strdup(profile_info->ProfileInfo.Pdp.AuthInfo.Password);
1414         if (*password == NULL) {
1415                 g_free(*user_name); //LCOV_EXCL_LINE
1416                 return CONNECTION_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
1417         }
1418
1419         return CONNECTION_ERROR_NONE;
1420 }
1421
1422 EXPORT_API int connection_profile_get_cellular_home_url(connection_profile_h profile, char** home_url)
1423 {
1424         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1425
1426         if (!(_connection_libnet_check_profile_validity(profile)) || home_url == NULL) {
1427                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1428                 return CONNECTION_ERROR_INVALID_PARAMETER;
1429         }
1430
1431         net_profile_info_t *profile_info = profile;
1432
1433         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1434                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1435                 return CONNECTION_ERROR_INVALID_PARAMETER;
1436         }
1437
1438         *home_url = g_strdup(profile_info->ProfileInfo.Pdp.HomeURL);
1439         if (*home_url == NULL)
1440                 return CONNECTION_ERROR_OUT_OF_MEMORY;
1441
1442         return CONNECTION_ERROR_NONE;
1443 }
1444
1445 EXPORT_API int connection_profile_get_cellular_pdn_type(connection_profile_h profile, connection_cellular_pdn_type_e* type)
1446 {
1447         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1448
1449         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
1450                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1451                 return CONNECTION_ERROR_INVALID_PARAMETER;
1452         }
1453
1454         net_profile_info_t *profile_info = profile;
1455
1456         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1457                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1458                 return CONNECTION_ERROR_INVALID_PARAMETER;
1459         }
1460
1461         switch (profile_info->ProfileInfo.Pdp.PdnType) {
1462         //LCOV_EXCL_START
1463         case NET_PDN_TYPE_UNKNOWN:
1464                 *type = CONNECTION_CELLULAR_PDN_TYPE_UNKNOWN;
1465                 break;
1466         case NET_PDN_TYPE_IPV4:
1467                 *type = CONNECTION_CELLULAR_PDN_TYPE_IPV4;
1468                 break;
1469         case NET_PDN_TYPE_IPV6:
1470                 *type = CONNECTION_CELLULAR_PDN_TYPE_IPV6;
1471                 break;
1472         case NET_PDN_TYPE_IPV4_IPV6:
1473                 *type = CONNECTION_CELLULAR_PDN_TYPE_IPV4_IPv6;
1474                 break;
1475         default:
1476                 return CONNECTION_ERROR_OPERATION_FAILED;
1477         //LCOV_EXCL_STOP
1478         }
1479
1480         return CONNECTION_ERROR_NONE;
1481 }
1482
1483 EXPORT_API int connection_profile_get_cellular_roam_pdn_type(connection_profile_h profile, connection_cellular_pdn_type_e* type)
1484 {
1485         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1486
1487         if (!(_connection_libnet_check_profile_validity(profile)) || type == NULL) {
1488                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1489                 return CONNECTION_ERROR_INVALID_PARAMETER;
1490         }
1491
1492         net_profile_info_t *profile_info = profile;
1493
1494         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1495                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1496                 return CONNECTION_ERROR_INVALID_PARAMETER;
1497         }
1498
1499         switch (profile_info->ProfileInfo.Pdp.RoamPdnType) {
1500         //LCOV_EXCL_START
1501         case NET_PDN_TYPE_UNKNOWN:
1502                 *type = CONNECTION_CELLULAR_PDN_TYPE_UNKNOWN;
1503                 break;
1504         case NET_PDN_TYPE_IPV4:
1505                 *type = CONNECTION_CELLULAR_PDN_TYPE_IPV4;
1506                 break;
1507         case NET_PDN_TYPE_IPV6:
1508                 *type = CONNECTION_CELLULAR_PDN_TYPE_IPV6;
1509                 break;
1510         case NET_PDN_TYPE_IPV4_IPV6:
1511                 *type = CONNECTION_CELLULAR_PDN_TYPE_IPV4_IPv6;
1512                 break;
1513         default:
1514                 return CONNECTION_ERROR_OPERATION_FAILED;
1515         //LCOV_EXCL_STOP
1516         }
1517
1518         return CONNECTION_ERROR_NONE;
1519 }
1520
1521 EXPORT_API int connection_profile_is_cellular_roaming(connection_profile_h profile, bool* is_roaming)
1522 {
1523         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1524
1525         if (!(_connection_libnet_check_profile_validity(profile)) || is_roaming == NULL) {
1526                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1527                 return CONNECTION_ERROR_INVALID_PARAMETER;
1528         }
1529
1530         net_profile_info_t *profile_info = profile;
1531
1532         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1533                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1534                 return CONNECTION_ERROR_INVALID_PARAMETER;
1535         }
1536
1537         if (profile_info->ProfileInfo.Pdp.Roaming)
1538                 *is_roaming = true;
1539         else
1540                 *is_roaming = false;
1541
1542         return CONNECTION_ERROR_NONE;
1543 }
1544
1545 EXPORT_API int connection_profile_is_cellular_hidden(connection_profile_h profile, bool* is_hidden)
1546 {
1547         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1548
1549         if (!(_connection_libnet_check_profile_validity(profile)) || is_hidden == NULL) {
1550                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1551                 return CONNECTION_ERROR_INVALID_PARAMETER;
1552         }
1553
1554         net_profile_info_t *profile_info = profile;
1555
1556         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1557                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1558                 return CONNECTION_ERROR_INVALID_PARAMETER;
1559         }
1560
1561         if (profile_info->ProfileInfo.Pdp.Hidden)
1562                 *is_hidden = true;
1563         else
1564                 *is_hidden = false;
1565
1566         return CONNECTION_ERROR_NONE;
1567 }
1568
1569 EXPORT_API int connection_profile_is_cellular_editable(connection_profile_h profile, bool* is_editable)
1570 {
1571         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1572
1573         if (!(_connection_libnet_check_profile_validity(profile)) || is_editable == NULL) {
1574                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1575                 return CONNECTION_ERROR_INVALID_PARAMETER;
1576         }
1577
1578         net_profile_info_t *profile_info = profile;
1579
1580         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1581                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1582                 return CONNECTION_ERROR_INVALID_PARAMETER;
1583         }
1584
1585         if (profile_info->ProfileInfo.Pdp.Editable)
1586                 *is_editable = true;
1587         else
1588                 *is_editable = false;
1589
1590         return CONNECTION_ERROR_NONE;
1591 }
1592
1593 EXPORT_API int connection_profile_is_cellular_default(connection_profile_h profile, bool* is_default)
1594 {
1595         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1596
1597         if (!(_connection_libnet_check_profile_validity(profile)) || is_default == NULL) {
1598                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1599                 return CONNECTION_ERROR_INVALID_PARAMETER;
1600         }
1601
1602         net_profile_info_t *profile_info = profile;
1603
1604         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1605                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1606                 return CONNECTION_ERROR_INVALID_PARAMETER;
1607         }
1608
1609         if (profile_info->ProfileInfo.Pdp.DefaultConn)
1610                 *is_default = true;
1611         else
1612                 *is_default = false;
1613
1614         return CONNECTION_ERROR_NONE;
1615 }
1616
1617 EXPORT_API int connection_profile_set_cellular_service_type(connection_profile_h profile,
1618                 connection_cellular_service_type_e service_type)
1619 {
1620         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1621
1622         if (!(_connection_libnet_check_profile_validity(profile))) {
1623                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1624                 return CONNECTION_ERROR_INVALID_PARAMETER;
1625         }
1626
1627         net_profile_info_t *profile_info = profile;
1628
1629         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1630                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1631                 return CONNECTION_ERROR_INVALID_PARAMETER;
1632         }
1633
1634         switch (service_type) {
1635         //LCOV_EXCL_START
1636         case CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET:
1637                 profile_info->ProfileInfo.Pdp.ServiceType = NET_SERVICE_INTERNET;
1638                 break;
1639         case CONNECTION_CELLULAR_SERVICE_TYPE_MMS:
1640                 profile_info->ProfileInfo.Pdp.ServiceType = NET_SERVICE_MMS;
1641                 break;
1642         case CONNECTION_CELLULAR_SERVICE_TYPE_PREPAID_INTERNET:
1643                 profile_info->ProfileInfo.Pdp.ServiceType = NET_SERVICE_PREPAID_INTERNET;
1644                 break;
1645         case CONNECTION_CELLULAR_SERVICE_TYPE_PREPAID_MMS:
1646                 profile_info->ProfileInfo.Pdp.ServiceType = NET_SERVICE_PREPAID_MMS;
1647                 break;
1648         case CONNECTION_CELLULAR_SERVICE_TYPE_TETHERING:
1649                 profile_info->ProfileInfo.Pdp.ServiceType = NET_SERVICE_TETHERING;
1650                 break;
1651         case CONNECTION_CELLULAR_SERVICE_TYPE_APPLICATION:
1652                 profile_info->ProfileInfo.Pdp.ServiceType = NET_SERVICE_APPLICATION;
1653                 break;
1654         case CONNECTION_CELLULAR_SERVICE_TYPE_UNKNOWN:
1655         default:
1656                 return CONNECTION_ERROR_INVALID_PARAMETER;
1657         //LCOV_EXCL_STOP
1658         }
1659
1660         return CONNECTION_ERROR_NONE;
1661 }
1662
1663 EXPORT_API int connection_profile_set_cellular_apn(connection_profile_h profile, const char* apn)
1664 {
1665         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1666
1667         if (!(_connection_libnet_check_profile_validity(profile)) || apn == NULL) {
1668                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1669                 return CONNECTION_ERROR_INVALID_PARAMETER;
1670         }
1671
1672         net_profile_info_t *profile_info = profile;
1673
1674         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1675                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1676                 return CONNECTION_ERROR_INVALID_PARAMETER;
1677         }
1678
1679         g_strlcpy(profile_info->ProfileInfo.Pdp.Apn, apn, NET_PDP_APN_LEN_MAX+1);
1680
1681         return CONNECTION_ERROR_NONE;
1682 }
1683
1684 EXPORT_API int connection_profile_set_cellular_auth_info(connection_profile_h profile,
1685                 connection_cellular_auth_type_e type, const char* user_name, const char* password)
1686 {
1687         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1688
1689         if (!(_connection_libnet_check_profile_validity(profile)) ||
1690             user_name == NULL || password == NULL) {
1691                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1692                 return CONNECTION_ERROR_INVALID_PARAMETER;
1693         }
1694
1695         net_profile_info_t *profile_info = profile;
1696
1697         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1698                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1699                 return CONNECTION_ERROR_INVALID_PARAMETER;
1700         }
1701
1702         switch (type) {
1703         //LCOV_EXCL_START
1704         case CONNECTION_CELLULAR_AUTH_TYPE_NONE:
1705                 profile_info->ProfileInfo.Pdp.AuthInfo.AuthType = NET_PDP_AUTH_NONE;
1706                 break;
1707         case CONNECTION_CELLULAR_AUTH_TYPE_PAP:
1708                 profile_info->ProfileInfo.Pdp.AuthInfo.AuthType = NET_PDP_AUTH_PAP;
1709                 break;
1710         case CONNECTION_CELLULAR_AUTH_TYPE_CHAP:
1711                 profile_info->ProfileInfo.Pdp.AuthInfo.AuthType = NET_PDP_AUTH_CHAP;
1712                 break;
1713         default:
1714                 return CONNECTION_ERROR_INVALID_PARAMETER;
1715         //LCOV_EXCL_STOP
1716         }
1717
1718         g_strlcpy(profile_info->ProfileInfo.Pdp.AuthInfo.UserName, user_name, NET_PDP_AUTH_USERNAME_LEN_MAX+1);
1719         g_strlcpy(profile_info->ProfileInfo.Pdp.AuthInfo.Password, password, NET_PDP_AUTH_PASSWORD_LEN_MAX+1);
1720
1721         return CONNECTION_ERROR_NONE;
1722 }
1723
1724 EXPORT_API int connection_profile_set_cellular_home_url(connection_profile_h profile, const char* home_url)
1725 {
1726         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1727
1728         if (!(_connection_libnet_check_profile_validity(profile)) || home_url == NULL) {
1729                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1730                 return CONNECTION_ERROR_INVALID_PARAMETER;
1731         }
1732
1733         net_profile_info_t *profile_info = profile;
1734
1735         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1736                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1737                 return CONNECTION_ERROR_INVALID_PARAMETER;
1738         }
1739
1740         g_strlcpy(profile_info->ProfileInfo.Pdp.HomeURL, home_url, NET_HOME_URL_LEN_MAX);
1741
1742         return CONNECTION_ERROR_NONE;
1743 }
1744
1745 EXPORT_API int connection_profile_set_cellular_pdn_type(connection_profile_h profile, connection_cellular_pdn_type_e type)
1746 {
1747         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1748
1749         if (!(_connection_libnet_check_profile_validity(profile))) {
1750                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1751                 return CONNECTION_ERROR_INVALID_PARAMETER;
1752         }
1753
1754         net_profile_info_t *profile_info = profile;
1755
1756         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1757                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1758                 return CONNECTION_ERROR_INVALID_PARAMETER;
1759         }
1760
1761         switch (type) {
1762         //LCOV_EXCL_START
1763         case CONNECTION_CELLULAR_PDN_TYPE_IPV4:
1764                 profile_info->ProfileInfo.Pdp.PdnType = NET_PDN_TYPE_IPV4;
1765                 break;
1766         case CONNECTION_CELLULAR_PDN_TYPE_IPV6:
1767                 profile_info->ProfileInfo.Pdp.PdnType = NET_PDN_TYPE_IPV6;
1768                 break;
1769         case CONNECTION_CELLULAR_PDN_TYPE_IPV4_IPv6:
1770                 profile_info->ProfileInfo.Pdp.PdnType = NET_PDN_TYPE_IPV4_IPV6;
1771                 break;
1772         default:
1773                 return CONNECTION_ERROR_INVALID_PARAMETER;
1774         //LCOV_EXCL_STOP
1775         }
1776
1777         return CONNECTION_ERROR_NONE;
1778 }
1779
1780 EXPORT_API int connection_profile_set_cellular_roam_pdn_type(connection_profile_h profile, connection_cellular_pdn_type_e type)
1781 {
1782         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1783
1784         if (!(_connection_libnet_check_profile_validity(profile))) {
1785                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1786                 return CONNECTION_ERROR_INVALID_PARAMETER;
1787         }
1788
1789         net_profile_info_t *profile_info = profile;
1790
1791         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
1792                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1793                 return CONNECTION_ERROR_INVALID_PARAMETER;
1794         }
1795
1796         switch (type) {
1797         //LCOV_EXCL_START
1798         case CONNECTION_CELLULAR_PDN_TYPE_IPV4:
1799                 profile_info->ProfileInfo.Pdp.RoamPdnType = NET_PDN_TYPE_IPV4;
1800                 break;
1801         case CONNECTION_CELLULAR_PDN_TYPE_IPV6:
1802                 profile_info->ProfileInfo.Pdp.RoamPdnType = NET_PDN_TYPE_IPV6;
1803                 break;
1804         case CONNECTION_CELLULAR_PDN_TYPE_IPV4_IPv6:
1805                 profile_info->ProfileInfo.Pdp.RoamPdnType = NET_PDN_TYPE_IPV4_IPV6;
1806                 break;
1807         default:
1808                 return CONNECTION_ERROR_INVALID_PARAMETER;
1809         //LCOV_EXCL_STOP
1810         }
1811
1812         return CONNECTION_ERROR_NONE;
1813 }