2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file NetService.cpp
20 * @brief This is the implementation file for the %NetService class.
23 #include <net_connection.h>
24 #include <FApp_AppManagerImpl.h>
25 #include <FBaseSysLog.h>
27 #include <FNetNetAccountManager.h>
28 #include <FBaseString.h>
29 #include <FNet_NetTypes.h>
30 #include "FBase_StringConverter.h"
31 #include "NetService.h"
33 using namespace Tizen::Base;
34 using namespace Tizen::Net;
37 NetService::NetService(void)
38 : __pConnectionHandle(null)
40 int ret = CONNECTION_ERROR_NONE;
41 ret = connection_create(&__pConnectionHandle);
43 SysLog(NID_NET, "The return value from connection_create() is %d", ret);
46 NetService::~NetService(void)
48 if (__pConnectionHandle != null)
50 connection_destroy(__pConnectionHandle);
51 __pConnectionHandle = null;
56 NetService::GetAppNetAccountId(const String& profileName, int& netAccountId)
60 if (profileName.Equals(L"Internet", false))
62 netAccountId = _DEFAULT_PS_ACCOUNT_ID;
64 else if (profileName.Equals(L"Mms", false))
66 netAccountId = _DEFAULT_MMS_ACCOUNT_ID;
70 netAccountId = INVALID_HANDLE;
78 NetService::SetNetAccountId(int netAccountId, int& netAccountId2)
82 netAccountId2 = netAccountId;
90 NetService::UpdateSystemNetAccount(const String& profileName, const NetAccountInfo& netAccountInfo, int bearerType)
94 int ret = CONNECTION_ERROR_NONE;
95 connection_h connectionHandle = null;
96 connection_profile_h profileHandle = null;
98 ret = connection_create(&connectionHandle);
99 SysTryReturnResult(NID_NET, ret == CONNECTION_ERROR_NONE, E_SYSTEM,
100 "A system error has been occurred. The return value from connection_create() is %d", ret);
102 SysAssertf(connectionHandle != null, "Not yet constructed. Construct() should be called before use.");
104 profileHandle = GetPsProfileHandleN(profileName);
105 SysTryReturnResult(NID_NET, profileHandle != null, E_INVALID_ACCOUNT,
106 "Invalid network account. The current value of account id is %d", netAccountInfo.GetAccountId());
108 r = ConvertToProfileInfo((void*)profileHandle, netAccountInfo, bearerType);
111 SysLogException(NID_NET, r, "[%s] Propagating.", GetErrorMessage(r));
113 connection_profile_destroy(profileHandle);
114 connection_destroy(connectionHandle);
119 ret = connection_update_profile((void*)connectionHandle, profileHandle);
121 connection_profile_destroy(profileHandle);
122 connection_destroy(connectionHandle);
124 SysTryReturnResult(NID_NET, ret == CONNECTION_ERROR_NONE, E_SYSTEM,
125 "A system error has been occurred. The return value from connection_update_profile() is %d", ret);
131 NetService::ResetNetStatistics(int bearerType, int statType)
133 int err = CONNECTION_ERROR_NONE;
135 SysTryReturnResult(NID_NET, (bearerType == NET_BEARER_WIFI || bearerType == NET_BEARER_PS),
136 E_INVALID_ARG, "Invalid bearer type. [%d]", bearerType);
138 //Reset net statistics info based on type
142 case NET_STAT_RCVD_SIZE:
143 if (bearerType == NET_BEARER_PS)
145 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA);
149 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA);
154 case NET_STAT_SENT_SIZE:
155 if (bearerType == NET_BEARER_PS)
157 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA);
161 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA);
166 case NET_STAT_TOTAL_RCVD_SIZE:
167 if (bearerType == NET_BEARER_PS)
169 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA);
173 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA);
178 case NET_STAT_TOTAL_SENT_SIZE:
179 if (bearerType == NET_BEARER_PS)
181 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA);
185 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA);
191 SysTryReturnResult(NID_NET, false, E_INVALID_ARG, "Invalid argument is used.");
196 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
202 NetService::ResetAllNetStatistics(int bearerType)
204 int err = CONNECTION_ERROR_NONE;
206 SysTryReturnResult(NID_NET, (bearerType == NET_BEARER_WIFI || bearerType == NET_BEARER_PS),
207 E_INVALID_ARG, "Invalid bearer type. [%d]", bearerType);
209 //we support only PS and WIFI
210 if (bearerType == NET_BEARER_PS)
212 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA);
213 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
215 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA);
216 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
218 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA);
219 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
221 err = connection_reset_statistics(CONNECTION_TYPE_CELLULAR, CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA);
222 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
227 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA);
228 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
230 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA);
231 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
233 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA);
234 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
236 err = connection_reset_statistics(CONNECTION_TYPE_WIFI, CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA);
237 SysTryReturnResult(NID_NET, err == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Operation failed. [err:%d]", err);
244 NetService::GetPsProfileHandleN(const String& profileName)
246 SysLog(NID_NET, "GetPsProfileHandleN() has been called with ProfileName : %ls", profileName.GetPointer());
250 int ret = CONNECTION_ERROR_NONE;
251 connection_h connectionHandle = null;
252 connection_profile_iterator_h iterator = null;
253 connection_profile_h profileHandle = null;
254 connection_profile_h matchingProfileHandle = null;
256 SysTryReturn(NID_NET, !profileName.IsEmpty(), null, E_INVALID_ARG,
257 "[%s] Invalid argument is used. profileName is an empty string.", GetErrorMessage(E_INVALID_ARG));
259 ret = connection_create(&connectionHandle);
260 SysTryReturn(NID_NET, ret == CONNECTION_ERROR_NONE, null, E_SYSTEM,
261 "[%s] A system error has been occurred. The return value from connection_create() is %d", GetErrorMessage(E_SYSTEM), ret);
263 ret = connection_get_profile_iterator(connectionHandle, CONNECTION_ITERATOR_TYPE_REGISTERED, &iterator);
264 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, , E_SYSTEM,
265 "[%s] A system error has been occurred. The return value from connection_get_profile_iterator() is %d", GetErrorMessage(E_SYSTEM), ret);
267 ret = connection_profile_iterator_next(iterator, &profileHandle);
268 while (profileHandle != null)
270 char* pTempProfileName = null;
271 String tempProfileName;
273 ret = connection_profile_get_id(profileHandle, &pTempProfileName);
274 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, , E_SYSTEM,
275 "[%s] A system error has been occurred. The return value from connection_profile_get_id() is %d", GetErrorMessage(E_SYSTEM), ret);
277 tempProfileName = String(pTempProfileName);
278 free(pTempProfileName);
280 if (profileName.Equals(tempProfileName))
282 ret = connection_profile_clone(&matchingProfileHandle, profileHandle);
283 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, matchingProfileHandle = null, E_SYSTEM,
284 "[%s] A system error has been occurred. The return value from connection_profile_clone() is %d", GetErrorMessage(E_SYSTEM), ret);
289 profileHandle = null;
290 ret = connection_profile_iterator_next(iterator, &profileHandle);
293 SysTryCatch(NID_NET, matchingProfileHandle != null, , E_INVALID_ACCOUNT,
294 "[%s] Matching account is not found.", GetErrorMessage(E_INVALID_ACCOUNT));
296 connection_destroy_profile_iterator(iterator);
297 connection_destroy(connectionHandle);
299 return matchingProfileHandle;
302 if (iterator != null)
304 connection_destroy_profile_iterator(iterator);
307 if (connectionHandle != null)
309 connection_destroy(connectionHandle);
316 NetService::ConvertToProfileInfo(void* pProfileHandle, const NetAccountInfo& netAccountInfo, int bearerType) const
318 result r = E_SUCCESS;
319 connection_profile_h profileHandle = (connection_profile_h)pProfileHandle;
320 int ret = CONNECTION_ERROR_NONE;
321 connection_cellular_auth_type_e cellAuthType = CONNECTION_CELLULAR_AUTH_TYPE_NONE;
322 connection_ip_config_type_e ipConfigType = CONNECTION_IP_CONFIG_TYPE_NONE;
325 char* pAuthId = null;
326 char* pAuthPassword = null;
327 char* pHomeUrl = null;
328 char* pDnsAddr = null;
329 char* pLocalAddr = null;
330 char* pProxyAddr = null;
333 NetNapAuthType authType;
337 SysTryReturnResult(NID_NET, pProfileHandle != null, E_INVALID_ARG, "pProfileHandle is null.");
338 SysTryReturnResult(NID_NET, ((bearerType == NET_BEARER_PS) || (bearerType == NET_BEARER_MMS)),
339 E_INVALID_ARG, "Invalid argument is used. BearerType has to be PS. bearerType=%d", bearerType);
341 if (!netAccountInfo.GetAccessPointName().IsEmpty())
343 pApn = _StringConverter::CopyToCharArrayN(netAccountInfo.GetAccessPointName());
344 SysTryCatch(NID_NET, pApn != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
345 "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
347 ret = connection_profile_set_cellular_apn(profileHandle, pApn);
349 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
350 "[%s] A system error has been occurred. The return value from connection_profile_set_cellular_apn() is %d", GetErrorMessage(E_SYSTEM), ret);
353 netAccountInfo.GetAuthenticationInfo(authType, authId, authPw);
355 if (authType == NET_NAPAUTH_PAP)
357 cellAuthType = CONNECTION_CELLULAR_AUTH_TYPE_PAP;
359 else if (authType == NET_NAPAUTH_CHAP)
361 cellAuthType = CONNECTION_CELLULAR_AUTH_TYPE_CHAP;
365 cellAuthType = CONNECTION_CELLULAR_AUTH_TYPE_NONE;
368 if (!authId.IsEmpty())
370 pAuthId = _StringConverter::CopyToCharArrayN(authId);
374 if (!authPw.IsEmpty())
376 pAuthPassword = _StringConverter::CopyToCharArrayN(authPw);
380 if ((pAuthId != null) && (pAuthPassword != null))
382 ret = connection_profile_set_cellular_auth_info(profileHandle, cellAuthType, pAuthId, pAuthPassword);
386 ret = connection_profile_set_cellular_auth_info(profileHandle, cellAuthType, " ", " ");
392 if (pAuthPassword != null)
394 delete[] pAuthPassword;
396 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
397 "[%s] A system error has been occurred. The return value from connection_profile_set_cellular_auth_info() is %d", GetErrorMessage(E_SYSTEM), ret);
399 if (!netAccountInfo.GetHomeUrl().IsEmpty())
401 pHomeUrl = _StringConverter::CopyToCharArrayN(netAccountInfo.GetHomeUrl());
402 SysTryCatch(NID_NET, pHomeUrl != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
404 ret = connection_profile_set_cellular_home_url(profileHandle, pHomeUrl);
409 ret = connection_profile_set_cellular_home_url(profileHandle, " ");
411 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
412 "[%s] A system error has been occurred. The return value from connection_profile_set_cellular_home_url() is %d", GetErrorMessage(E_SYSTEM), ret);
414 ret = connection_profile_get_ip_config_type(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, &ipConfigType);
415 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
416 "[%s] A system error has been occurred. The return value from connection_profile_get_ip_config_type() is %d", GetErrorMessage(E_SYSTEM), ret);
418 if (ipConfigType != CONNECTION_IP_CONFIG_TYPE_FIXED)
420 if (netAccountInfo.GetLocalAddressScheme() == NET_ADDRESS_SCHEME_STATIC)
422 ret = connection_profile_set_ip_config_type(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, CONNECTION_IP_CONFIG_TYPE_STATIC);
423 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM,
424 E_SYSTEM, "[%s] A system error has been occurred. The return value from connection_profile_set_ip_config_type() is %d", ret);
426 SysTryCatch(NID_NET, netAccountInfo.GetLocalAddress() != null, r = E_INVALID_ARG, E_INVALID_ARG,
427 "[%s] Invalid argument is used. Local Address Scheme is static, but local address is null.", GetErrorMessage(E_INVALID_ARG));
429 pLocalAddr = _StringConverter::CopyToCharArrayN(netAccountInfo.GetLocalAddress()->ToString());
430 SysTryCatch(NID_NET, pLocalAddr != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
431 "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
433 ret = connection_profile_set_ip_address(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, pLocalAddr);
435 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
436 "[%s] A system error has been occurred. The return value from connection_profile_set_ip_address() is %d", GetErrorMessage(E_SYSTEM), ret);
440 ret = connection_profile_set_ip_config_type(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, CONNECTION_IP_CONFIG_TYPE_DYNAMIC);
441 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
442 "[%s] A system error has been occurred. The return value connection_profile_set_ip_config_type() is %d", GetErrorMessage(E_SYSTEM), ret);
446 if (netAccountInfo.GetDnsAddressScheme() == NET_ADDRESS_SCHEME_STATIC)
448 if (netAccountInfo.GetPrimaryDnsAddress() != null)
450 pDnsAddr = _StringConverter::CopyToCharArrayN(netAccountInfo.GetPrimaryDnsAddress()->ToString());
451 SysTryCatch(NID_NET, pDnsAddr != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
452 "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
454 ret = connection_profile_set_dns_address(profileHandle, 1, CONNECTION_ADDRESS_FAMILY_IPV4, pDnsAddr);
457 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
458 "[%s] A system error has been occurred. The return value from connection_profile_set_dns_address() is %d", GetErrorMessage(E_SYSTEM), ret);
461 if (netAccountInfo.GetSecondaryDnsAddress() != null)
463 pDnsAddr = _StringConverter::CopyToCharArrayN(netAccountInfo.GetSecondaryDnsAddress()->ToString());
464 SysTryCatch(NID_NET, pDnsAddr != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
465 "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
467 ret = connection_profile_set_dns_address(profileHandle, 2, CONNECTION_ADDRESS_FAMILY_IPV4, pDnsAddr);
469 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
470 "[%s] A system error has been occurred. The return value from connection_profile_set_dns_address() is %d", GetErrorMessage(E_SYSTEM), ret);
474 if (netAccountInfo.GetProxyAddress() != null)
476 proxyAddr = netAccountInfo.GetProxyAddress()->GetNetEndPoint();
477 if (proxyAddr.IsEmpty() == false)
479 ret = connection_profile_set_proxy_type(profileHandle, CONNECTION_PROXY_TYPE_MANUAL);
480 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
481 "[%s] A system error has been occurred. The return value connection_profile_set_proxy_type() is %d", GetErrorMessage(E_SYSTEM), ret);
483 pProxyAddr = _StringConverter::CopyToCharArrayN(proxyAddr);
484 SysTryCatch(NID_NET, pProxyAddr != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
485 "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
487 ret = connection_profile_set_proxy_address(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, pProxyAddr);
492 ret = connection_profile_set_proxy_address(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, null);
497 ret = connection_profile_set_proxy_address(profileHandle, CONNECTION_ADDRESS_FAMILY_IPV4, null);
499 SysTryCatch(NID_NET, ret == CONNECTION_ERROR_NONE, r = E_SYSTEM, E_SYSTEM,
500 "[%s] A system error has been occurred. The return value connection_profile_set_proxy_address() is %d", GetErrorMessage(E_SYSTEM), ret);