summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjk7744.park <jk7744.park@samsung.com>2015-10-24 16:22:40 +0900
committerjk7744.park <jk7744.park@samsung.com>2015-10-24 16:22:40 +0900
commit264829e4cbd3d10ba5925bd6022ceaf6e4140ff4 (patch)
treec6c13b421cf8051c278f9394cdd240183db69627
parent3b319fd12772adcf57d31b5f4fc564af6ed7ff4e (diff)
downloadconnection-264829e4cbd3d10ba5925bd6022ceaf6e4140ff4.tar.gz
connection-264829e4cbd3d10ba5925bd6022ceaf6e4140ff4.tar.bz2
connection-264829e4cbd3d10ba5925bd6022ceaf6e4140ff4.zip
-rw-r--r--CMakeLists.txt14
-rwxr-xr-xdoc/net_connection_doc.h12
-rwxr-xr-x[-rw-r--r--]include/connection_profile.h10
-rwxr-xr-xinclude/net_connection.h112
-rwxr-xr-xinclude/net_connection_private.h41
-rw-r--r--packaging/capi-network-connection.spec7
-rwxr-xr-xsrc/connection.c206
-rwxr-xr-xsrc/connection_profile.c20
-rwxr-xr-xsrc/libnetwork.c90
-rwxr-xr-xtest/connection_test.c88
10 files changed, 526 insertions, 74 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2473b3d..2c6b06c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,9 +3,11 @@ SET(fw_name "capi-network-connection")
PROJECT(${fw_name})
-SET(CMAKE_INSTALL_PREFIX /usr)
SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(LIB ${LIB_PATH})
+SET(LIBDIR ${PREFIX}/${LIB_PATH})
+
SET(INC_DIR include)
INCLUDE_DIRECTORIES(${INC_DIR})
@@ -21,6 +23,10 @@ ENDIF(TIZEN_WEARABLE)
IF(TIZEN_MOBILE)
ADD_DEFINITIONS(-DTIZEN_MOBILE)
ENDIF(TIZEN_MOBILE)
+IF(TIZEN_TV)
+ ADD_DEFINITIONS(-DTIZEN_TV)
+ENDIF(TIZEN_TV)
+
INCLUDE(FindPkgConfig)
pkg_check_modules(${fw_name} REQUIRED ${dependents})
@@ -38,7 +44,7 @@ ENDIF("${ARCH}" STREQUAL "arm")
ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
ADD_DEFINITIONS("-DTIZEN_DEBUG")
-SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIBDIR}")
aux_source_directory(src SOURCES)
ADD_LIBRARY(${fw_name} SHARED ${SOURCES})
@@ -52,7 +58,7 @@ SET_TARGET_PROPERTIES(${fw_name}
CLEAN_DIRECT_OUTPUT 1
)
-INSTALL(TARGETS ${fw_name} DESTINATION lib)
+INSTALL(TARGETS ${fw_name} DESTINATION ${LIB})
INSTALL(
DIRECTORY ${INC_DIR}/ DESTINATION include/network
FILES_MATCHING
@@ -69,7 +75,7 @@ CONFIGURE_FILE(
${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc
@ONLY
)
-INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION lib/pkgconfig)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIB}/pkgconfig)
ADD_SUBDIRECTORY(test)
diff --git a/doc/net_connection_doc.h b/doc/net_connection_doc.h
index d88113f..cb3446a 100755
--- a/doc/net_connection_doc.h
+++ b/doc/net_connection_doc.h
@@ -48,6 +48,7 @@
* or any other network library.
* @section CAPI_NETWORK_CONNECTION_MANAGER_MODULE_FEATURE Related Features
* This API is related with the following features:\n
+ * - http://tizen.org/feature/network.bluetooth\n
* - http://tizen.org/feature/network.wifi\n
* - http://tizen.org/feature/network.telephony\n
* - http://tizen.org/feature/network.tethering.bluetooth\n
@@ -58,7 +59,7 @@
*
* To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n
*
- * More details on featuring your application can be found from <a href="../org.tizen.gettingstarted/html/native/details/app_filtering_n.htm"><b>Feature List</b>.</a>
+ * More details on featuring your application can be found from <a href="https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature"><b>Feature List</b>.</a>
*
*/
@@ -75,6 +76,7 @@
* It allows you to use a handle for dealing with a connection profile. You can get details about connection using ‘connection_profile_h’ handle.
* @section CAPI_NETWORK_CONNECTION_PROFILE_MODULE_FEATURE Related Features
* This API is related with the following features:\n
+ * - http://tizen.org/feature/network.bluetooth\n
* - http://tizen.org/feature/network.wifi\n
* - http://tizen.org/feature/network.telephony\n
* - http://tizen.org/feature/network.tethering.bluetooth\n
@@ -85,7 +87,7 @@
*
* To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n
*
- * More details on featuring your application can be found from <a href="../org.tizen.gettingstarted/html/native/details/app_filtering_n.htm"><b>Feature List</b>.</a>
+ * More details on featuring your application can be found from <a href="https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature"><b>Feature List</b>.</a>
*
*/
@@ -108,7 +110,7 @@
*
* To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n
*
- * More details on featuring your application can be found from <a href="../org.tizen.gettingstarted/html/native/details/app_filtering_n.htm"><b>Feature List</b>.</a>
+ * More details on featuring your application can be found from <a href="https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature"><b>Feature List</b>.</a>
*
*/
@@ -131,7 +133,7 @@
*
* To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n
*
- * More details on featuring your application can be found from <a href="../org.tizen.gettingstarted/html/native/details/app_filtering_n.htm"><b>Feature List</b>.</a>
+ * More details on featuring your application can be found from <a href="https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature"><b>Feature List</b>.</a>
*
*/
@@ -158,7 +160,7 @@
*
* To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n
*
- * More details on featuring your application can be found from <a href="../org.tizen.gettingstarted/html/native/details/app_filtering_n.htm"><b>Feature List</b>.</a>
+ * More details on featuring your application can be found from <a href="https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature"><b>Feature List</b>.</a>
*
*/
diff --git a/include/connection_profile.h b/include/connection_profile.h
index 86860b0..433c4ca 100644..100755
--- a/include/connection_profile.h
+++ b/include/connection_profile.h
@@ -172,10 +172,8 @@ typedef enum{
* @details The profile name, which you get from connection_profile_get_name(), will include the keyword you set.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @privlevel public
- * @privilege %http://tizen.org/privilege/network.profile \n
- * %http://tizen.org/privilege/network.get
- * @remarks You must release @a profile using connection_profile_destroy(). \n
- * This API needs both privileges.
+ * @privilege %http://tizen.org/privilege/network.get
+ * @remarks You must release @a profile using connection_profile_destroy().
* @param[in] type The type of profile\n
* #CONNECTION_PROFILE_TYPE_CELLULAR and #CONNECTION_PROFILE_TYPE_WIFI are supported.
* @param[in] keyword The keyword included in profile name
@@ -203,7 +201,7 @@ int connection_profile_destroy(connection_profile_h profile);
/**
* @brief Clones a profile handle.
- * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @since_tizen 2.3
* @remarks You must release @a cloned_profile using connection_profile_destroy().
* @param[out] cloned_profile The handle of the cloned profile
* @param[in] origin_profile The handle of the origin profile
@@ -476,7 +474,7 @@ int connection_profile_set_gateway_address(connection_profile_h profile, connect
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @remarks The allowance of the DNS address is @c 2.
* @param[in] profile The profile handle
- * @param[in] order The order of the DNS address. \n
+ * @param[in] order The order of the DNS address. \n
* It starts from @c 1, which means first DNS address.
* @param[in] address_family The address family
* @param[in] dns_address The DNS address; if you set this value to NULL, then the existing value will be deleted
diff --git a/include/net_connection.h b/include/net_connection.h
index 2087ea4..f658d50 100755
--- a/include/net_connection.h
+++ b/include/net_connection.h
@@ -83,15 +83,14 @@ typedef enum
} connection_wifi_state_e;
/**
- * @internal
* @brief Enumeration for ethernet state.
- * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @since_tizen 2.4
*/
typedef enum
{
- CONNECTION_ETHERNET_STATE_DEACTIVATED = 0, /**< @internal There is no Ethernet profile to open */
- CONNECTION_ETHERNET_STATE_DISCONNECTED = 1, /**< @internal Disconnected */
- CONNECTION_ETHERNET_STATE_CONNECTED = 2, /**< @internal Connected */
+ CONNECTION_ETHERNET_STATE_DEACTIVATED = 0, /**< There is no Ethernet profile to open */
+ CONNECTION_ETHERNET_STATE_DISCONNECTED = 1, /**< Disconnected */
+ CONNECTION_ETHERNET_STATE_CONNECTED = 2, /**< Connected */
} connection_ethernet_state_e;
/**
@@ -127,6 +126,16 @@ typedef enum
} connection_reset_option_e;
/**
+ * @brief This enumeration defines the attached or detached state of ethernet cable.
+ * @since_tizen 2.4
+ */
+typedef enum
+{
+ CONNECTION_ETHERNET_CABLE_DETACHED = 0, /**< Ethernet cable is detached */
+ CONNECTION_ETHERNET_CABLE_ATTACHED = 1, /**< Ethernet cable is attached */
+} connection_ethernet_cable_state_e;
+
+/**
* @brief Enumeration for connection errors.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
*/
@@ -283,6 +292,23 @@ int connection_get_ip_address(connection_h connection, connection_address_family
int connection_get_proxy(connection_h connection, connection_address_family_e address_family, char** proxy);
/**
+ * @brief Gets the MAC address of the Wi-Fi or ethernet.
+ * @since_tizen 2.4
+ * @remarks @a mac_addr must be released with free() by you.
+ * @param[in] connection The handle of the connection
+ * @param[in] type The type of current network connection
+ * @param[out] mac_addr The MAC address
+ * @return 0 on success, otherwise negative error value.
+ * @retval #CONNECTION_ERROR_NONE Successful
+ * @retval #CONNECTION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CONNECTION_ERROR_INVALID_OPERATION Invalid operation
+ * @retval #CONNECTION_ERROR_OPERATION_FAILED Operation failed
+ * @retval #CONNECTION_ERROR_NOT_SUPPORTED Not supported
+ * @retval #CONNECTION_ERROR_OUT_OF_MEMORY Out of memory
+ */
+int connection_get_mac_address(connection_h connection, connection_type_e type, char** mac_addr);
+
+/**
* @brief Gets the state of cellular connection.
* @details The returned state is for the cellular connection state.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
@@ -314,10 +340,9 @@ int connection_get_cellular_state(connection_h connection, connection_cellular_s
int connection_get_wifi_state(connection_h connection, connection_wifi_state_e* state);
/**
- * @internal
* @brief Gets the state of the Ethernet.
* @details The returned state is for the Ethernet connection state.
- * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ * @since_tizen 2.4
* @privlevel public
* @privilege %http://tizen.org/privilege/network.get
* @param[in] connection The connection handle
@@ -332,6 +357,58 @@ int connection_get_wifi_state(connection_h connection, connection_wifi_state_e*
int connection_get_ethernet_state(connection_h connection, connection_ethernet_state_e* state);
/**
+* @brief Checks for ethernet cable is attached or not.
+* @details The returned state is for the ethernet cable state.
+* @since_tizen 2.4
+* @privlevel public
+* @privilege %http://tizen.org/privilege/network.get
+* @param[in] connection The handle of the connection
+* @param[in] state - Enum connection_ethernet_cable_state_e
+* @return 0 on success, otherwise negative error value
+* @retval #CONNECTION_ERROR_NONE Successful
+* @retval #CONNECTION_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #CONNECTION_ERROR_OPERATION_FAILED Operation failed
+* @retval #CONNECTION_ERROR_NOT_SUPPORTED Not supported
+* @retval #CONNECTION_ERROR_PERMISSION_DENIED Permission Denied
+*/
+int connection_get_ethernet_cable_state(connection_h connection, connection_ethernet_cable_state_e *state);
+
+/**
+ * @brief Called when ethernet cable is plugged [in/out].
+ * @since_tizen 2.4
+ * @param[in] state The ethernet cable state (connection_ethernet_cable_state_e)
+ * @param[in] user_data The user data passed to callback registration function
+ */
+typedef void(*connection_ethernet_cable_state_chaged_cb)(
+ connection_ethernet_cable_state_e state, void* user_data);
+
+/**
+ * @brief Registers callback for ethernet cable is plugged [in/out] event.
+ * @since_tizen 2.4
+ * @param[in] callback The callback function to be called
+ * @param[in] user_data The user data passed to the callback function
+ * @return 0 on success, otherwise negative error value
+ * @retval #CONNECTION_ERROR_NONE Successful
+ * @retval #CONNECTION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CONNECTION_ERROR_OPERATION_FAILED Operation failed
+ * @retval #CONNECTION_ERROR_NOT_SUPPORTED Not supported
+ */
+int connection_set_ethernet_cable_state_chaged_cb( connection_h connection,
+ connection_ethernet_cable_state_chaged_cb callback, void *user_data);
+
+/**
+ * @brief Unregisters callback for ethernet cable is plugged [in/out] event.
+ * @since_tizen 2.4
+ * @param[in] connection The handle of connection
+ * @return 0 on success, otherwise negative error value
+ * @retval #CONNECTION_ERROR_NONE Successful
+ * @retval #CONNECTION_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CONNECTION_ERROR_OPERATION_FAILED Operation failed
+ * @retval #CONNECTION_ERROR_NOT_SUPPORTED Not supported
+ */
+int connection_unset_ethernet_cable_state_chaged_cb(connection_h connection);
+
+/**
* @brief Gets the state of the Bluetooth.
* @details The returned state is for the Bluetooth connection state.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
@@ -424,10 +501,8 @@ int connection_unset_proxy_address_changed_cb(connection_h connection);
* @brief Adds a new profile which is created by connection_profile_create().
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @privlevel public
- * @privilege %http://tizen.org/privilege/network.profile \n
- * %http://tizen.org/privilege/network.get
- * @remarks You can only add a profile of the cellular type. \n
- * This API needs both privileges.
+ * @privilege %http://tizen.org/privilege/network.profile
+ * @remarks You can only add a profile of the cellular type.
* @param[in] connection The connection handle
* @param[in] profile The profile handle
* @return @c 0 on success, otherwise a negative error value
@@ -667,9 +742,7 @@ int connection_open_profile(connection_h connection, connection_profile_h profil
* @brief Closes a connection of profile.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @privlevel public
- * @privilege %http://tizen.org/privilege/network.set \n
- * %http://tizen.org/privilege/network.get
- * @remarks This API needs both privileges.
+ * @privilege %http://tizen.org/privilege/network.set
* @param[in] connection The connection handle
* @param[in] profile The profile handle
* @param[in] callback The callback function to be called
@@ -715,9 +788,7 @@ int connection_reset_profile(connection_h connection, connection_reset_option_e
* @details You can get the @a interface_name from connection_profile_get_network_interface_name() of opened profile.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @privlevel public
- * @privilege %http://tizen.org/privilege/network.set \n
- * %http://tizen.org/privilege/network.get
- * @remarks This API needs both privileges.
+ * @privilege %http://tizen.org/privilege/network.set
* @param[in] connection The connection handle
* @param[in] interface_name The name of network interface
* @param[in] host_address The IP address of the host
@@ -736,9 +807,7 @@ int connection_add_route(connection_h connection, const char* interface_name, co
* @details You can get the @a interface_name from connection_profile_get_network_interface_name() of opened profile.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @privlevel public
- * @privilege %http://tizen.org/privilege/network.set \n
- * %http://tizen.org/privilege/network.get
- * @remarks This API needs both privileges.
+ * @privilege %http://tizen.org/privilege/network.set
* @param[in] connection The connection handle
* @param[in] interface_name The name of network interface
* @param[in] host_address The IP address of the host
@@ -820,8 +889,7 @@ int connection_get_statistics(connection_h connection, connection_type_e connect
* @brief Resets the statistics information.
* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
* @privlevel public
- * @privilege %http://tizen.org/privilege/network.set \n
- * %http://tizen.org/privilege/network.get
+ * @privilege %http://tizen.org/privilege/network.set
* @remarks This API needs both privileges.
* @param[in] connection The connection handle
* @param[in] connection_type The type of connection (only CONNECTION_TYPE_WIFI and CONNECTION_TYPE_CELLULAR are supported)
diff --git a/include/net_connection_private.h b/include/net_connection_private.h
index 831ee54..0a389c4 100755
--- a/include/net_connection_private.h
+++ b/include/net_connection_private.h
@@ -11,7 +11,7 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License.
+ * limitations under the License.
*/
#ifndef __NET_CONNECTION_PRIVATE_H__
@@ -34,10 +34,14 @@ extern "C" {
#define CONNECTION_ERROR 2
#define CONNECTION_WARN 3
+#define CONNECTION_MAC_INFO_LENGTH 17
+#define ETHERNET_MAC_INFO_FILE "/sys/class/net/eth0/address"
+#define WIFI_MAC_INFO_FILE "/sys/class/net/wlan0/address"
+
#define TELEPHONY_FEATURE "http://tizen.org/feature/network.telephony"
#define WIFI_FEATURE "http://tizen.org/feature/network.wifi"
-#define TETHERING_BLUETOOTH_FEATURE "http://tizen.org/feature/network.tethering.bluetooth"
-#define ETHERNET_FEATURE "http://tizen.org/feature/network.ethernet"
+#define TETHERING_BLUETOOTH_FEATURE "http://tizen.org/feature/network.tethering.bluetooth"
+#define ETHERNET_FEATURE "http://tizen.org/feature/network.ethernet"
typedef enum
{
@@ -45,13 +49,25 @@ typedef enum
CONNECTION_CELLULAR_SUBSCRIBER_2 = 0x01,
} connection_cellular_subscriber_id_e;
-
+typedef enum
+{
+ CONNECTION_SUPPORTED_FEATURE_TELEPHONY,
+ CONNECTION_SUPPORTED_FEATURE_WIFI,
+ CONNECTION_SUPPORTED_FEATURE_TETHERING_BLUETOOTH,
+ CONNECTION_SUPPORTED_FEATURE_ETHERNET,
+ CONNECTION_SUPPORTED_FEATURE_MAX,
+} connection_supported_feature_e;
+
+#if !defined TIZEN_TV
#define CHECK_FEATURE_SUPPORTED(...) \
do { \
int rv = _connection_check_feature_supported(__VA_ARGS__, NULL); \
if( rv != CONNECTION_ERROR_NONE ) \
return rv; \
} while(0)
+#else
+#define CHECK_FEATURE_SUPPORTED(...)
+#endif
#define CONNECTION_LOG(log_level, format, args...) \
do { \
@@ -84,12 +100,29 @@ typedef enum
#define VCONF_TELEPHONY_DEFAULT_DATA_SERVICE \
"db/telephony/dualsim/default_data_service"
+typedef struct _connection_handle_s {
+ connection_type_changed_cb type_changed_callback;
+ connection_address_changed_cb ip_changed_callback;
+ connection_address_changed_cb proxy_changed_callback;
+ connection_ethernet_cable_state_chaged_cb ethernet_cable_state_changed_callback;
+ void *type_changed_user_data;
+ void *ip_changed_user_data;
+ void *proxy_changed_user_data;
+ void *ethernet_cable_state_changed_user_data;
+} connection_handle_s;
+
+typedef void(*libnet_ethernet_cable_state_changed_cb)
+ (connection_ethernet_cable_state_e state);
+
bool _connection_is_created(void);
int _connection_libnet_init(void);
bool _connection_libnet_deinit(void);
int _connection_libnet_get_wifi_state(connection_wifi_state_e *state);
int _connection_libnet_get_ethernet_state(connection_ethernet_state_e *state);
+int _connection_libnet_get_ethernet_cable_state(connection_ethernet_cable_state_e* state);
+int _connection_libnet_set_ethernet_cable_state_changed_cb(
+ libnet_ethernet_cable_state_changed_cb callback);
int _connection_libnet_get_bluetooth_state(connection_bt_state_e* state);
bool _connection_libnet_check_profile_validity(connection_profile_h profile);
bool _connection_libnet_check_profile_cb_validity(connection_profile_h profile);
diff --git a/packaging/capi-network-connection.spec b/packaging/capi-network-connection.spec
index 298c472..9400d20 100644
--- a/packaging/capi-network-connection.spec
+++ b/packaging/capi-network-connection.spec
@@ -1,6 +1,6 @@
Name: capi-network-connection
Summary: Network Connection library in TIZEN C API
-Version: 1.0.58
+Version: 1.0.72
Release: 1
Group: System/Network
License: Apache-2.0
@@ -35,6 +35,7 @@ Network Connection library in Tizen C API (Development)
export CFLAGS+=' -Wno-unused-local-typedefs'
MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
cmake -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} \
+ -DLIB_PATH=%{_lib} \
%if 0%{?model_build_feature_network_dsds} == 1
-DTIZEN_DUALSIM_ENABLE=1 \
%endif
@@ -43,6 +44,10 @@ cmake -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} \
%else
%if "%{?tizen_profile_name}" == "mobile"
-DTIZEN_MOBILE=1 \
+%else
+%if "%{?tizen_profile_name}" == "tv"
+ -DTIZEN_TV=1 \
+%endif
%endif
%endif
.
diff --git a/src/connection.c b/src/connection.c
index 0cb4f82..da5e609 100755
--- a/src/connection.c
+++ b/src/connection.c
@@ -21,15 +21,6 @@
#include "net_connection_private.h"
-typedef struct _connection_handle_s {
- connection_type_changed_cb type_changed_callback;
- connection_address_changed_cb ip_changed_callback;
- connection_address_changed_cb proxy_changed_callback;
- void *type_changed_user_data;
- void *ip_changed_user_data;
- void *proxy_changed_user_data;
-} connection_handle_s;
-
static __thread GSList *conn_handle_list = NULL;
static int __connection_convert_net_state(int status)
@@ -129,6 +120,33 @@ static void __connection_cb_type_change_cb(keynode_t *node, void *user_data)
}
}
+static void __connection_cb_ethernet_cable_state_changed_cb(connection_ethernet_cable_state_e state)
+{
+ CONNECTION_LOG(CONNECTION_INFO, "Ethernet Cable state Indication");
+
+ GSList *list;
+
+ for (list = conn_handle_list; list; list = list->next) {
+ connection_handle_s *local_handle = (connection_handle_s *)list->data;
+ if (local_handle->ethernet_cable_state_changed_callback)
+ local_handle->ethernet_cable_state_changed_callback(state,
+ local_handle->ethernet_cable_state_changed_user_data);
+ }
+}
+
+static int __connection_get_ethernet_cable_state_changed_callback_count(void)
+{
+ GSList *list;
+ int count = 0;
+
+ for (list = conn_handle_list; list; list = list->next) {
+ connection_handle_s *local_handle = (connection_handle_s *)list->data;
+ if (local_handle->ethernet_cable_state_changed_callback) count++;
+ }
+
+ return count;
+}
+
static int __connection_set_type_changed_callback(connection_h connection,
void *callback, void *user_data)
{
@@ -340,6 +358,26 @@ static int __connection_set_proxy_changed_callback(connection_h connection,
return CONNECTION_ERROR_NONE;
}
+static int __connection_set_ethernet_cable_state_changed_cb(connection_h connection,
+ connection_ethernet_cable_state_chaged_cb callback, void *user_data)
+{
+ connection_handle_s *local_handle = (connection_handle_s *)connection;
+
+ if (callback) {
+ if (__connection_get_ethernet_cable_state_changed_callback_count() == 0)
+ _connection_libnet_set_ethernet_cable_state_changed_cb(
+ __connection_cb_ethernet_cable_state_changed_cb);
+
+ } else {
+ if (__connection_get_ethernet_cable_state_changed_callback_count() == 1)
+ _connection_libnet_set_ethernet_cable_state_changed_cb(NULL);
+ }
+
+ local_handle->ethernet_cable_state_changed_callback = callback;
+ local_handle->ethernet_cable_state_changed_user_data = user_data;
+ return CONNECTION_ERROR_NONE;
+}
+
static int __connection_get_handle_count(void)
{
return ((int)g_slist_length(conn_handle_list));
@@ -390,6 +428,7 @@ EXPORT_API int connection_destroy(connection_h connection)
__connection_set_type_changed_callback(connection, NULL, NULL);
__connection_set_ip_changed_callback(connection, NULL, NULL);
__connection_set_proxy_changed_callback(connection, NULL, NULL);
+ __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
conn_handle_list = g_slist_remove(conn_handle_list, connection);
@@ -406,6 +445,9 @@ EXPORT_API int connection_destroy(connection_h connection)
EXPORT_API int connection_get_type(connection_h connection, connection_type_e* type)
{
+ int rv = 0;
+ int status = 0;
+
CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
if (type == NULL || !(__connection_check_handle_validity(connection))) {
@@ -413,8 +455,8 @@ EXPORT_API int connection_get_type(connection_h connection, connection_type_e* t
return CONNECTION_ERROR_INVALID_PARAMETER;
}
- int status = 0;
- if (vconf_get_int(VCONFKEY_NETWORK_STATUS, &status)) {
+ rv = vconf_get_int(VCONFKEY_NETWORK_STATUS, &status);
+ if (rv != VCONF_OK) {
CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_int Failed = %d", status);
return CONNECTION_ERROR_OPERATION_FAILED;
}
@@ -482,6 +524,100 @@ EXPORT_API int connection_get_proxy(connection_h connection,
return CONNECTION_ERROR_NONE;
}
+EXPORT_API int connection_get_mac_address(connection_h connection, connection_type_e type, char** mac_addr)
+{
+ FILE *fp;
+ char buf[CONNECTION_MAC_INFO_LENGTH + 1];
+
+ CHECK_FEATURE_SUPPORTED(WIFI_FEATURE, ETHERNET_FEATURE);
+
+ if(type == CONNECTION_TYPE_WIFI)
+ CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
+ else if(type == CONNECTION_TYPE_ETHERNET)
+ CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
+
+ if (mac_addr == NULL || !(__connection_check_handle_validity(connection))) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
+ return CONNECTION_ERROR_INVALID_PARAMETER;
+ }
+
+ switch (type) {
+ case CONNECTION_TYPE_WIFI:
+#if defined TIZEN_TV
+ fp = fopen(WIFI_MAC_INFO_FILE, "r");
+ if (fp == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", WIFI_MAC_INFO_FILE);
+ return CONNECTION_ERROR_OUT_OF_MEMORY;
+ }
+
+ if (fgets(buf, sizeof(buf), fp) == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", WIFI_MAC_INFO_FILE);
+ fclose(fp);
+ return CONNECTION_ERROR_OPERATION_FAILED;
+ }
+
+ CONNECTION_LOG(CONNECTION_INFO, "%s : %s", WIFI_MAC_INFO_FILE, buf);
+
+ *mac_addr = (char *)malloc(CONNECTION_MAC_INFO_LENGTH + 1);
+ if (*mac_addr == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "malloc() failed");
+ fclose(fp);
+ return CONNECTION_ERROR_OUT_OF_MEMORY;
+ }
+ g_strlcpy(*mac_addr, buf, CONNECTION_MAC_INFO_LENGTH + 1);
+ fclose(fp);
+#else
+ *mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
+
+ if(*mac_addr == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Failed to get vconf from %s", VCONFKEY_WIFI_BSSID_ADDRESS);
+ return CONNECTION_ERROR_OPERATION_FAILED;
+ }
+#endif
+ break;
+ case CONNECTION_TYPE_ETHERNET:
+ fp = fopen(ETHERNET_MAC_INFO_FILE, "r");
+ if (fp == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", ETHERNET_MAC_INFO_FILE);
+ return CONNECTION_ERROR_OUT_OF_MEMORY;
+ }
+
+ if (fgets(buf, sizeof(buf), fp) == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", ETHERNET_MAC_INFO_FILE);
+ fclose(fp);
+ return CONNECTION_ERROR_OPERATION_FAILED;
+ }
+
+ CONNECTION_LOG(CONNECTION_INFO, "%s : %s", ETHERNET_MAC_INFO_FILE, buf);
+
+ *mac_addr = (char *)malloc(CONNECTION_MAC_INFO_LENGTH + 1);
+ if (*mac_addr == NULL) {
+ CONNECTION_LOG(CONNECTION_ERROR, "malloc() failed");
+ fclose(fp);
+ return CONNECTION_ERROR_OUT_OF_MEMORY;
+ }
+
+ g_strlcpy(*mac_addr, buf,CONNECTION_MAC_INFO_LENGTH + 1);
+ fclose(fp);
+
+ break;
+ default:
+ CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
+ return CONNECTION_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Checking Invalid MAC Address */
+ if((strcmp(*mac_addr, "00:00:00:00:00:00") == 0) ||
+ (strcmp(*mac_addr, "ff:ff:ff:ff:ff:ff") == 0)) {
+ CONNECTION_LOG(CONNECTION_ERROR, "MAC Address(%s) is invalid", *mac_addr);
+ return CONNECTION_ERROR_INVALID_OPERATION;
+ }
+
+ CONNECTION_LOG(CONNECTION_INFO, "MAC Address %s", *mac_addr);
+
+ return CONNECTION_ERROR_NONE;
+}
+
EXPORT_API int connection_get_cellular_state(connection_h connection, connection_cellular_state_e* state)
{
int rv = 0;
@@ -580,6 +716,45 @@ EXPORT_API int connection_get_ethernet_state(connection_h connection, connection
return _connection_libnet_get_ethernet_state(state);
}
+EXPORT_API int connection_get_ethernet_cable_state(connection_h connection, connection_ethernet_cable_state_e *state)
+{
+ CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
+
+ if (state == NULL || !(__connection_check_handle_validity(connection))) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
+ return CONNECTION_ERROR_INVALID_PARAMETER;
+ }
+
+ return _connection_libnet_get_ethernet_cable_state(state);
+}
+
+EXPORT_API int connection_set_ethernet_cable_state_chaged_cb(connection_h connection,
+ connection_ethernet_cable_state_chaged_cb callback, void *user_data)
+{
+ CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
+
+ if (callback == NULL || !(__connection_check_handle_validity(connection))) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
+ return CONNECTION_ERROR_INVALID_PARAMETER;
+ }
+
+ return __connection_set_ethernet_cable_state_changed_cb(connection,
+ callback, user_data);
+}
+
+EXPORT_API int connection_unset_ethernet_cable_state_chaged_cb(connection_h connection)
+{
+ CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
+
+ if ( !(__connection_check_handle_validity(connection)) ) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
+ return CONNECTION_ERROR_INVALID_PARAMETER;
+ }
+
+ return __connection_set_ethernet_cable_state_changed_cb(connection,
+ NULL, NULL);
+}
+
EXPORT_API int connection_get_bt_state(connection_h connection, connection_bt_state_e* state)
{
CHECK_FEATURE_SUPPORTED(TETHERING_BLUETOOTH_FEATURE);
@@ -740,7 +915,7 @@ EXPORT_API int connection_update_profile(connection_h connection, connection_pro
int rv = 0;
net_profile_info_t *profile_info = profile;
- CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
+ CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
if (!(__connection_check_handle_validity(connection)) ||
!(_connection_libnet_check_profile_validity(profile))) {
@@ -780,18 +955,21 @@ EXPORT_API int connection_profile_iterator_next(connection_profile_iterator_h pr
connection_profile_h* profile)
{
CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
+
return _connection_libnet_get_iterator_next(profile_iterator, profile);
}
EXPORT_API bool connection_profile_iterator_has_next(connection_profile_iterator_h profile_iterator)
{
CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
+
return _connection_libnet_iterator_has_next(profile_iterator);
}
EXPORT_API int connection_destroy_profile_iterator(connection_profile_iterator_h profile_iterator)
{
CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
+
return _connection_libnet_destroy_iterator(profile_iterator);
}
@@ -923,7 +1101,7 @@ EXPORT_API int connection_remove_route(connection_h connection, const char* inte
EXPORT_API int connection_add_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
{
- CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
+ CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
if (!(__connection_check_handle_validity(connection)) ||
interface_name == NULL || host_address == NULL) {
@@ -936,7 +1114,7 @@ EXPORT_API int connection_add_route_ipv6(connection_h connection, const char *in
EXPORT_API int connection_remove_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
{
- CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
+ CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
if (!(__connection_check_handle_validity(connection)) ||
interface_name == NULL || host_address == NULL) {
diff --git a/src/connection_profile.c b/src/connection_profile.c
index d6a9f49..3005b69 100755
--- a/src/connection_profile.c
+++ b/src/connection_profile.c
@@ -411,6 +411,8 @@ EXPORT_API int connection_profile_get_network_interface_name(connection_profile_
EXPORT_API int connection_profile_refresh(connection_profile_h profile)
{
+ int rv;
+
CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
if (!(_connection_libnet_check_profile_validity(profile))) {
@@ -421,7 +423,7 @@ EXPORT_API int connection_profile_refresh(connection_profile_h profile)
net_profile_info_t profile_info_local;
net_profile_info_t *profile_info = profile;
- int rv = net_get_profile_info(profile_info->ProfileName, &profile_info_local);
+ rv = net_get_profile_info(profile_info->ProfileName, &profile_info_local);
if (rv == NET_ERR_ACCESS_DENIED) {
CONNECTION_LOG(CONNECTION_ERROR, "Access denied");
return CONNECTION_ERROR_PERMISSION_DENIED;
@@ -455,9 +457,10 @@ EXPORT_API int connection_profile_get_state(connection_profile_h profile, connec
EXPORT_API int connection_profile_get_ip_config_type(connection_profile_h profile,
connection_address_family_e address_family, connection_ip_config_type_e* type)
{
- CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
net_ip_config_type_t profile_type;
+ CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
+
if (!(_connection_libnet_check_profile_validity(profile)) ||
(address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
@@ -557,9 +560,10 @@ EXPORT_API int connection_profile_get_ip_address(connection_profile_h profile,
EXPORT_API int connection_profile_get_subnet_mask(connection_profile_h profile,
connection_address_family_e address_family, char** subnet_mask)
{
- CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
char* prefixlen;
+ CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
+
if (!(_connection_libnet_check_profile_validity(profile)) ||
(address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
@@ -575,8 +579,11 @@ EXPORT_API int connection_profile_get_subnet_mask(connection_profile_h profile,
if (address_family == CONNECTION_ADDRESS_FAMILY_IPV6) {
prefixlen = g_try_malloc0(MAX_PREFIX_LENGTH);
- snprintf(prefixlen, MAX_PREFIX_LENGTH, "%d", net_info->PrefixLen6);
- *subnet_mask = prefixlen;
+ if (prefixlen != NULL) {
+ snprintf(prefixlen, MAX_PREFIX_LENGTH, "%d", net_info->PrefixLen6);
+ *subnet_mask = prefixlen;
+ } else
+ *subnet_mask = NULL;
} else
*subnet_mask = __profile_convert_ip_to_string(&net_info->SubnetMask,
address_family);
@@ -725,9 +732,10 @@ EXPORT_API int connection_profile_get_proxy_address(connection_profile_h profile
EXPORT_API int connection_profile_set_ip_config_type(connection_profile_h profile,
connection_address_family_e address_family, connection_ip_config_type_e type)
{
- CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
net_ip_config_type_t *profile_type = NULL;
+ CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
+
if (!(_connection_libnet_check_profile_validity(profile)) ||
(address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
address_family != CONNECTION_ADDRESS_FAMILY_IPV6)) {
diff --git a/src/libnetwork.c b/src/libnetwork.c
index 2ac48ba..cda1205 100755
--- a/src/libnetwork.c
+++ b/src/libnetwork.c
@@ -11,7 +11,7 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
- * limitations under the License.
+ * limitations under the License.
*/
#include <glib.h>
@@ -44,6 +44,7 @@ struct _libnet_s {
connection_closed_cb closed_cb;
connection_set_default_cb set_default_cb;
connection_reset_cb reset_profile_cb;
+ libnet_ethernet_cable_state_changed_cb ethernet_cable_state_changed_cb;
void *opened_user_data;
void *closed_user_data;
void *set_default_user_data;
@@ -66,6 +67,8 @@ struct managed_idle_data {
static __thread struct _profile_list_s profile_iterator = {0, 0, NULL};
static __thread struct _libnet_s libnet = {NULL, NULL, NULL, NULL, NULL, NULL, false};
static __thread GSList *managed_idler_list = NULL;
+static __thread bool connection_is_feature_checked[CONNECTION_SUPPORTED_FEATURE_MAX] = {0, };
+static __thread bool connection_feature_supported[CONNECTION_SUPPORTED_FEATURE_MAX] = {0, };
bool _connection_is_created(void)
{
@@ -295,6 +298,19 @@ static void __libnet_default_cb(connection_error_e result)
_connection_callback_add(__libnet_default_cb_idle, (gpointer)result);
}
+static void __libnet_set_ethernet_cable_state_changed_cb(
+ libnet_ethernet_cable_state_changed_cb user_cb)
+{
+ libnet.ethernet_cable_state_changed_cb = user_cb;
+}
+
+static void __libnet_ethernet_cable_state_changed_cb(
+ connection_ethernet_cable_state_e state)
+{
+ if (libnet.ethernet_cable_state_changed_cb)
+ libnet.ethernet_cable_state_changed_cb(state);
+}
+
static gboolean __libnet_state_changed_cb_idle(gpointer data)
{
struct _state_notify *notify = (struct _state_notify *)data;
@@ -443,6 +459,16 @@ static void __libnet_evt_cb(net_event_info_t *event_cb, void *user_data)
result = __libnet_convert_to_cp_error_type(event_cb->Error);
CONNECTION_LOG(CONNECTION_INFO, "Got reset default profile RSP %d", result);
__libnet_reset_profile_cb(result);
+ break;
+ case NET_EVENT_ETHERNET_CABLE_ATTACHED:
+ CONNECTION_LOG(CONNECTION_INFO, "Got Ethernet cable Attached Indication\n");
+ __libnet_ethernet_cable_state_changed_cb(CONNECTION_ETHERNET_CABLE_ATTACHED);
+ break;
+ case NET_EVENT_ETHERNET_CABLE_DETACHED:
+ CONNECTION_LOG(CONNECTION_INFO, "Got Ethernet cable detached Indication\n");
+ __libnet_ethernet_cable_state_changed_cb(CONNECTION_ETHERNET_CABLE_DETACHED);
+ break;
+
default :
break;
}
@@ -660,6 +686,35 @@ int _connection_libnet_get_ethernet_state(connection_ethernet_state_e* state)
return CONNECTION_ERROR_NONE;
}
+int _connection_libnet_get_ethernet_cable_state(connection_ethernet_cable_state_e* state)
+{
+ int rv = 0;
+ int status = 0;
+
+ rv = net_get_ethernet_cable_state(&status);
+ if (rv == NET_ERR_ACCESS_DENIED) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Access denied");
+ return CONNECTION_ERROR_PERMISSION_DENIED;
+ } else if (rv != NET_ERR_NONE) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Failed to get ethernet cable state[%d]", rv);
+ return CONNECTION_ERROR_OPERATION_FAILED;
+ }
+
+ if(status == 1)
+ *state = CONNECTION_ETHERNET_CABLE_ATTACHED;
+ else
+ *state = CONNECTION_ETHERNET_CABLE_DETACHED;
+ return CONNECTION_ERROR_NONE;
+}
+
+int _connection_libnet_set_ethernet_cable_state_changed_cb(
+ libnet_ethernet_cable_state_changed_cb callback)
+{
+ __libnet_set_ethernet_cable_state_changed_cb(callback);
+
+ return CONNECTION_ERROR_NONE;
+}
+
int _connection_libnet_get_bluetooth_state(connection_bt_state_e* state)
{
int i = 0;
@@ -1300,6 +1355,7 @@ bool _connection_libnet_add_to_profile_cb_list(connection_profile_h profile,
profile_cb_info->callback = callback;
profile_cb_info->user_data = user_data;
+ profile_cb_info->state = _profile_convert_to_cp_state(profile_info->ProfileState);
g_hash_table_replace(profile_cb_table, profile_name, profile_cb_info);
@@ -1463,20 +1519,42 @@ int _connection_libnet_check_profile_privilege()
return CONNECTION_ERROR_NONE;
}
+bool __libnet_check_feature_supported(const char *key, connection_supported_feature_e feature)
+{
+ if(!connection_is_feature_checked[feature]) {
+ if(system_info_get_platform_bool(key, &connection_feature_supported[feature]) < 0) {
+ CONNECTION_LOG(CONNECTION_ERROR, "Error - Feature getting from System Info");
+ set_last_result(CONNECTION_ERROR_OPERATION_FAILED);
+ return CONNECTION_ERROR_OPERATION_FAILED;
+ }
+ connection_is_feature_checked[feature] = true;
+ }
+ return connection_feature_supported[feature];
+}
+
int _connection_check_feature_supported(const char *feature_name, ...)
{
va_list list;
const char *key;
- bool value, feature_supported = false;
+ bool value = false;
+ bool feature_supported = false;
va_start(list, feature_name);
key = feature_name;
while(1) {
- if(system_info_get_platform_bool(key, &value) < 0) {
- CONNECTION_LOG(CONNECTION_ERROR, "Error - Feature getting from System Info");
- set_last_result(CONNECTION_ERROR_OPERATION_FAILED);
- return CONNECTION_ERROR_OPERATION_FAILED;
+ if((strcmp(key, TELEPHONY_FEATURE) == 0)){
+ value = __libnet_check_feature_supported(key, CONNECTION_SUPPORTED_FEATURE_TELEPHONY);
+ }
+ if((strcmp(key, WIFI_FEATURE) == 0)){
+ value = __libnet_check_feature_supported(key, CONNECTION_SUPPORTED_FEATURE_WIFI);
+ }
+ if((strcmp(key, TETHERING_BLUETOOTH_FEATURE) == 0)){
+ value = __libnet_check_feature_supported(key, CONNECTION_SUPPORTED_FEATURE_TETHERING_BLUETOOTH);
}
+ if((strcmp(key, ETHERNET_FEATURE) == 0)){
+ value = __libnet_check_feature_supported(key, CONNECTION_SUPPORTED_FEATURE_ETHERNET);
+ }
+
SECURE_CONNECTION_LOG(CONNECTION_INFO, "%s feature is %s", key, (value?"true":"false"));
feature_supported |= value;
key = va_arg(list, const char *);
diff --git a/test/connection_test.c b/test/connection_test.c
index 381d0ad..dde3efd 100755
--- a/test/connection_test.c
+++ b/test/connection_test.c
@@ -48,9 +48,7 @@ static bool test_get_user_string(const char *msg, char *buf, int buf_size)
return false;
}
- if (rv >= 0)
- buf[rv] = '\0';
-
+ buf[rv-1]='\0';
return true;
}
@@ -191,6 +189,15 @@ static void test_connection_set_default_callback(connection_error_e result, void
printf("Default profile setting Failed, err : [%s]\n", test_print_error(result));
}
+void test_get_ethernet_cable_state_callback(connection_ethernet_cable_state_e state,
+ void* user_data)
+{
+ if(state == CONNECTION_ETHERNET_CABLE_ATTACHED)
+ printf("Ethernet Cable Connected\n");
+ else if(state == CONNECTION_ETHERNET_CABLE_DETACHED)
+ printf("Ethernet Cable Disconnected\n");
+}
+
static bool test_get_user_selected_profile(connection_profile_h *profile, bool select)
{
int rv = 0;
@@ -244,8 +251,13 @@ static bool test_get_user_selected_profile(connection_profile_h *profile, bool s
profile_list[profile_count] = profile_h;
profile_count++;
} else {
- printf("%d. state:[%s], profile name : %s\n",
- profile_count, test_print_state(profile_state), profile_name);
+ connection_cellular_service_type_e service_type;
+ if (connection_profile_get_cellular_service_type(profile_h, &service_type) != CONNECTION_ERROR_NONE) {
+ printf("Fail to get cellular service type!\n");
+ }
+
+ printf("%d. state:[%s], profile name:%s[%d]\n",
+ profile_count, test_print_state(profile_state), profile_name, service_type);
profile_list[profile_count] = profile_h;
profile_count++;
@@ -721,6 +733,8 @@ int test_register_client(void)
connection_set_type_changed_cb(connection, test_type_changed_callback, NULL);
connection_set_ip_address_changed_cb(connection, test_ip_changed_callback, NULL);
connection_set_proxy_address_changed_cb(connection, test_proxy_changed_callback, NULL);
+ connection_set_ethernet_cable_state_chaged_cb(connection,
+ test_get_ethernet_cable_state_callback, NULL);
} else {
printf("Client registration failed [%s]\n", test_print_error(err));
return -1;
@@ -1053,7 +1067,7 @@ int test_get_default_cellular_service_type(void)
char *profile_name = NULL;
rv = test_get_user_int("Input profile type to get"
- "(1:Internet, 2:MMS, 3:Prepaid internet, 4:Prepaid MMS, 5:Tethering):", &input);
+ "(1:Internet, 2:MMS, 3:Prepaid internet, 4:Prepaid MMS, 5:Tethering, 6:Application):", &input);
if (rv == false) {
printf("Invalid input!!\n");
@@ -1076,6 +1090,9 @@ int test_get_default_cellular_service_type(void)
case 5:
service_type = CONNECTION_CELLULAR_SERVICE_TYPE_TETHERING;
break;
+ case 6:
+ service_type = CONNECTION_CELLULAR_SERVICE_TYPE_APPLICATION;
+ break;
default:
printf("Wrong number!!\n");
return -1;
@@ -1600,6 +1617,57 @@ int test_get_profile_id(void)
return 1;
}
+int test_get_mac_address(void)
+{
+ int rv = 0, type = 0;
+ connection_type_e conn_type;
+ char *mac_addr = NULL;
+
+ test_get_user_int("Input connection type (1:wifi, 2:ethernet)", &type);
+
+ switch (type) {
+ case 1:
+ conn_type = CONNECTION_TYPE_WIFI;
+ break;
+ case 2:
+ conn_type = CONNECTION_TYPE_ETHERNET;
+ break;
+ default:
+ printf("Wrong number!!\n");
+ return -1;
+ }
+
+ rv = connection_get_mac_address(connection, conn_type, &mac_addr);
+
+ if (rv != CONNECTION_ERROR_NONE) {
+ printf("Fail to get MAC address [%s]\n", test_print_error(rv));
+ return -1;
+ }
+
+ printf("mac address is %s\n", mac_addr);
+
+ g_free(mac_addr);
+
+ return 1;
+}
+
+int test_get_ethernet_cable_state(void)
+{
+ int rv = 0;
+ connection_ethernet_cable_state_e cable_state;
+
+ rv = connection_get_ethernet_cable_state(connection, &cable_state);
+
+ if (rv != CONNECTION_ERROR_NONE) {
+ printf("Fail to get ethernet cable state [%s]\n", test_print_error(rv));
+ return -1;
+ }
+
+ printf("Retval = [%s], Ethernet cable state [%d]\n", test_print_error(rv), cable_state);
+
+ return 1;
+}
+
int test_reset_profile(void)
{
int type, sim_id, rv;
@@ -1691,6 +1759,8 @@ gboolean test_thread(GIOChannel *source, GIOCondition condition, gpointer data)
printf("t - Get profile id\n");
printf("u - Reset profile\n");
printf("v - Get all cellular default profiles\n");
+ printf("w - Get mac address\n");
+ printf("x - Get ethernet cable state\n");
printf("B - Add IPv6 new route\n");
printf("C - Remove IPv6 route\n");
printf("0 - Exit \n");
@@ -1791,6 +1861,12 @@ gboolean test_thread(GIOChannel *source, GIOCondition condition, gpointer data)
case 'v':
rv = test_get_default_profile_list();
break;
+ case 'w':
+ rv = test_get_mac_address();
+ break;
+ case 'x':
+ rv = test_get_ethernet_cable_state();
+ break;
case 'B':
rv = test_add_route_ipv6();
break;