From: Piotr Kosko
Date: Wed, 19 Aug 2015 07:55:25 +0000 (+0200)
Subject: [Systeminfo] Changed implementation of WIFI_NETWORK property
X-Git-Tag: submit/tizen/20151026.073646^2^2~188^2
X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6894a2fd79d7ed2c33a4a7628922a051e1c5ae3e;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git
[Systeminfo] Changed implementation of WIFI_NETWORK property
[Feature] Implementation changed to provide actual WIFI_NETWORK state.
[Verification] Tested in chrome console. Signal strength change when distance from access point changes.
TCT passrate 100%.
Change-Id: Iccfedca3b4084c4626343381f6f8f4fff56e08e1
Signed-off-by: Piotr Kosko
---
diff --git a/src/systeminfo/systeminfo-utils.cpp b/src/systeminfo/systeminfo-utils.cpp
index 94be7b11..12ebf2a3 100644
--- a/src/systeminfo/systeminfo-utils.cpp
+++ b/src/systeminfo/systeminfo-utils.cpp
@@ -36,10 +36,12 @@
#include
#include
#include
+#include
#include "common/logger.h"
#include "common/platform_exception.h"
#include "common/dbus_operation.h"
+#include "common/scope_exit.h"
// TODO:: hardcoded value, only for IsBluetoothAlwaysOn
#define PROFILE_MOBILE 1
@@ -79,6 +81,7 @@ static void OnCellularNetworkValueChangedCb(keynode_t *node, void *event_ptr);
static void OnPeripheralChangedCb(keynode_t* node, void* event_ptr);
static void OnMemoryChangedCb(keynode_t* node, void* event_ptr);
static void OnBrightnessChangedCb(device_callback_e type, void *value, void *user_data);
+static void OnWifiLevelChangedCb (wifi_rssi_level_e rssi_level, void *user_data);
static void SimCphsValueCallback(TapiHandle *handle, int result, void *data, void *user_data);
static void SimMsisdnValueCallback(TapiHandle *handle, int result, void *data, void *user_data);
@@ -190,6 +193,28 @@ const char* kTizenFeatureCpuFrequency = "http://tizen.org/feature/platform.core.
const char* kTizenFeaturePlatformNativeApiVersion = "tizen.org/feature/platform.native.api.version";
const char* kTizenFeaturePlatformNativeOspCompatible = "tizen.org/feature/platform.native.osp_compatible";
const char* kTizenFeaturePlatformVersionName = "http://tizen.org/feature/platform.version.name";
+
+static std::string parseWifiNetworkError(int error) {
+ switch (error) {
+ case WIFI_ERROR_NONE : return "WIFI_ERROR_NONE";
+ case WIFI_ERROR_INVALID_PARAMETER : return "WIFI_ERROR_INVALID_PARAMETER";
+ case WIFI_ERROR_OUT_OF_MEMORY : return "WIFI_ERROR_OUT_OF_MEMORY";
+ case WIFI_ERROR_INVALID_OPERATION : return "WIFI_ERROR_INVALID_OPERATION";
+ case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED : return "WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED";
+ case WIFI_ERROR_OPERATION_FAILED : return "WIFI_ERROR_OPERATION_FAILED";
+ case WIFI_ERROR_NO_CONNECTION : return "WIFI_ERROR_NO_CONNECTION";
+ case WIFI_ERROR_NOW_IN_PROGRESS : return "WIFI_ERROR_NOW_IN_PROGRESS";
+ case WIFI_ERROR_ALREADY_EXISTS : return "WIFI_ERROR_ALREADY_EXISTS";
+ case WIFI_ERROR_OPERATION_ABORTED : return "WIFI_ERROR_OPERATION_ABORTED";
+ case WIFI_ERROR_DHCP_FAILED : return "WIFI_ERROR_DHCP_FAILED";
+ case WIFI_ERROR_INVALID_KEY : return "WIFI_ERROR_INVALID_KEY";
+ case WIFI_ERROR_NO_REPLY : return "WIFI_ERROR_NO_REPLY";
+ case WIFI_ERROR_SECURITY_RESTRICTED : return "WIFI_ERROR_SECURITY_RESTRICTED";
+ case WIFI_ERROR_PERMISSION_DENIED : return "WIFI_ERROR_PERMISSION_DENIED";
+ case WIFI_ERROR_NOT_SUPPORTED : return "WIFI_ERROR_NOT_SUPPORTED";
+ }
+}
+
}
/////////////////////////// SimDetailsManager ////////////////////////////////
@@ -512,6 +537,8 @@ class SystemInfoListeners {
int GetSensorHandle();
PlatformResult ConnectSensor(int* result);
void DisconnectSensor(int handle_orientation);
+ wifi_rssi_level_e GetWifiLevel();
+ void SetWifiLevel(wifi_rssi_level_e level);
private:
static PlatformResult RegisterVconfCallback(const char *in_key, vconf_callback_fn cb,
SysteminfoInstance& instance);
@@ -530,6 +557,7 @@ class SystemInfoListeners {
unsigned long long m_available_capacity_mmc;
unsigned long long m_last_available_capacity_internal;
unsigned long long m_last_available_capacity_mmc;
+ wifi_rssi_level_e m_wifi_level;
SysteminfoUtilsCallback m_battery_listener;
SysteminfoUtilsCallback m_cpu_listener;
@@ -551,7 +579,6 @@ class SystemInfoListeners {
//! Sensor handle for DeviceOrientation purposes
int m_sensor_handle;
};
-
SystemInfoListeners::SystemInfoListeners():
m_cpu_event_id(0),
m_storage_event_id(0),
@@ -561,6 +588,7 @@ SystemInfoListeners::SystemInfoListeners():
m_available_capacity_mmc(0),
m_last_available_capacity_internal(0),
m_last_available_capacity_mmc(0),
+ m_wifi_level(WIFI_RSSI_LEVEL_0),
m_battery_listener(nullptr),
m_cpu_listener(nullptr),
m_storage_listener(nullptr),
@@ -579,6 +607,21 @@ SystemInfoListeners::SystemInfoListeners():
m_sensor_handle(-1)
{
LoggerD("Entered");
+ int error = wifi_initialize();
+ if (WIFI_ERROR_NONE != error) {
+ std::string log_msg = "Initialize failed: " + parseWifiNetworkError(error);
+ LoggerE("%s", log_msg.c_str());
+ } else {
+ LoggerD("WIFI initialization succeed");
+ }
+
+ error = wifi_set_rssi_level_changed_cb(OnWifiLevelChangedCb, nullptr);
+ if (WIFI_ERROR_NONE != error) {
+ std::string log_msg = "Setting wifi listener failed: " + parseWifiNetworkError(error);
+ LoggerE("%s", log_msg.c_str());
+ } else {
+ LoggerD("Setting wifi listener succeed");
+ }
}
SystemInfoListeners::~SystemInfoListeners(){
@@ -605,6 +648,8 @@ SystemInfoListeners::~SystemInfoListeners(){
if (nullptr != m_connection_handle) {
connection_destroy(m_connection_handle);
}
+
+ wifi_deinitialize();
}
#define CHECK_LISTENER_ERROR(method) \
@@ -657,6 +702,16 @@ void SystemInfoListeners::DisconnectSensor(int handle_orientation)
}
}
+wifi_rssi_level_e SystemInfoListeners::GetWifiLevel()
+{
+ return m_wifi_level;
+}
+
+void SystemInfoListeners::SetWifiLevel(wifi_rssi_level_e level)
+{
+ m_wifi_level = level;
+}
+
PlatformResult SystemInfoListeners::RegisterBatteryListener(const SysteminfoUtilsCallback& callback,
SysteminfoInstance& instance)
{
@@ -1538,6 +1593,13 @@ void OnBrightnessChangedCb(device_callback_e type, void* value, void* user_data)
}
}
+void OnWifiLevelChangedCb (wifi_rssi_level_e rssi_level, void *user_data)
+{
+ LoggerD("Entered");
+ LoggerD("Level %d", rssi_level);
+ system_info_listeners.SetWifiLevel(rssi_level);
+}
+
/////////////////////////// SysteminfoUtils ////////////////////////////////
PlatformResult SystemInfoDeviceCapability::GetValueBool(const char *key, bool* value) {
@@ -2145,14 +2207,14 @@ PlatformResult SysteminfoUtils::ReportNetwork(picojson::object& out) {
return PlatformResult(ErrorCode::NO_ERROR);
}
-static PlatformResult GetIps(connection_profile_h profile_handle, std::string* ip_addr_str,
+static PlatformResult GetIps(wifi_ap_h wifi_ap_handle, std::string* ip_addr_str,
std::string* ipv6_addr_str){
//getting ipv4 address
char* ip_addr = nullptr;
- int error = connection_profile_get_ip_address(profile_handle,
- CONNECTION_ADDRESS_FAMILY_IPV4,
- &ip_addr);
- if (CONNECTION_ERROR_NONE != error) {
+ int error = wifi_ap_get_ip_address(wifi_ap_handle,
+ WIFI_ADDRESS_FAMILY_IPV4,
+ &ip_addr);
+ if (WIFI_ERROR_NONE != error) {
LoggerE("Failed to get ip address: %d", error);
return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ip address");
}
@@ -2161,18 +2223,15 @@ static PlatformResult GetIps(connection_profile_h profile_handle, std::string* i
//getting ipv6 address
ip_addr = nullptr;
- error = connection_profile_get_ip_address(profile_handle,
- CONNECTION_ADDRESS_FAMILY_IPV6,
- &ip_addr);
- if (CONNECTION_ERROR_NONE == error) {
- *ipv6_addr_str = ip_addr;
- free(ip_addr);
- } else if (CONNECTION_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED != error) {
- //core api returns error -97 = CONNECTION_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED
- //it will be supported in the future. For now let's ignore this error
+ error = wifi_ap_get_ip_address(wifi_ap_handle,
+ WIFI_ADDRESS_FAMILY_IPV6,
+ &ip_addr);
+ if (WIFI_ERROR_NONE != error) {
LoggerE("Failed to get ipv6 address: %d", error);
return PlatformResult(ErrorCode::UNKNOWN_ERR, "Cannot get ipv6 address");
}
+ *ipv6_addr_str = ip_addr;
+ free(ip_addr);
return PlatformResult(ErrorCode::NO_ERROR);
}
@@ -2186,94 +2245,104 @@ PlatformResult SysteminfoUtils::ReportWifiNetwork(picojson::object& out) {
std::string result_mac_address;
double result_signal_strength = 0;
- connection_h connection_handle = nullptr;
- connection_type_e connection_type = CONNECTION_TYPE_DISCONNECTED;
- connection_profile_h profile_handle = nullptr;
-
- //connection must be created in every call, in other case error occurs
- int error = connection_create(&connection_handle);
- if (CONNECTION_ERROR_NONE != error) {
- std::string log_msg = "Cannot create connection: " + std::to_string(error);
+ // wifi_initialize() must be called in each thread
+ int error = wifi_initialize();
+ if (WIFI_ERROR_NONE != error) {
+ std::string log_msg = "Initialize failed: " + parseWifiNetworkError(error);
LoggerE("%s", log_msg.c_str());
return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+ } else {
+ LoggerD("WIFI initializatino succeed");
}
- std::unique_ptr::type, int(*)(connection_h)>
- connection_handle_ptr(connection_handle, &connection_destroy);
- // automatically release the memory
+ SCOPE_EXIT {
+ wifi_deinitialize();
+ };
- char* mac = nullptr;
- error = connection_get_mac_address(connection_handle, CONNECTION_TYPE_WIFI, &mac);
- if (CONNECTION_ERROR_NONE == error && nullptr != mac) {
- SLoggerD("MAC address fetched: %s", mac);
- result_mac_address = mac;
- free(mac);
+ wifi_ap_h wifi_ap_handle = nullptr;
+ error = wifi_get_connected_ap(&wifi_ap_handle);
+ if (WIFI_ERROR_NONE != error) {
+ LoggerD("Error while wifi_get_connnected_ap: %s", parseWifiNetworkError(error).c_str());
+ // in case of no connection, ignore error and leave status as false
+ if (WIFI_ERROR_NO_CONNECTION != error) {
+ std::string log_msg = "Cannot get connected access point handle: " + parseWifiNetworkError(error);
+ LoggerE("%s", log_msg.c_str());
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+ }
} else {
- std::string log_msg = "Failed to get mac address: " + std::to_string(error);
- LoggerE("%s", log_msg.c_str());
- return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+ //if getting connected AP succeed, set status on true
+ result_status = true;
}
- error = connection_get_type(connection_handle, &connection_type);
- if (CONNECTION_ERROR_NONE != error) {
- std::string log_msg = "Cannot get connection type: " + std::to_string(error);
- LoggerE("%s", log_msg.c_str());
- return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
- }
- if (CONNECTION_TYPE_WIFI == connection_type) {
- result_status = true;
+ if (result_status) {
+ std::unique_ptr::type, int(*)(wifi_ap_h)>
+ wifi_ap_handle_ptr(wifi_ap_handle, &wifi_ap_destroy);
+ // automatically release the memory
- //gathering profile
- error = connection_get_current_profile(connection_handle, &profile_handle);
- if (CONNECTION_ERROR_NONE != error) {
- std::string log_msg = "Cannot get connection profile: " + std::to_string(error);
+ //gathering mac address
+ char* mac = nullptr;
+ error = wifi_get_mac_address(&mac);
+ if (WIFI_ERROR_NONE == error && nullptr != mac) {
+ SLoggerD("MAC address fetched: %s", mac);
+ result_mac_address = mac;
+ free(mac);
+ } else {
+ std::string log_msg = "Failed to get mac address: " + parseWifiNetworkError(error);
+ LoggerE("%s", log_msg.c_str());
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+ }
+
+ //refreshing access point information
+ error = wifi_ap_refresh(wifi_ap_handle);
+ if (WIFI_ERROR_NONE != error) {
+ std::string log_msg = "Failed to refresh access point information: " + parseWifiNetworkError(error);
LoggerE("%s", log_msg.c_str());
return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
}
- std::unique_ptr
- ::type, int(*)(connection_profile_h)>
- profile_handle_ptr(profile_handle, &connection_profile_destroy);
- // automatically release the memory
//gathering ssid
char* essid = nullptr;
- error = connection_profile_get_wifi_essid(profile_handle, &essid);
- if (CONNECTION_ERROR_NONE == error) {
+ error = wifi_ap_get_essid(wifi_ap_handle, &essid);
+ if (WIFI_ERROR_NONE == error) {
result_ssid = essid;
free(essid);
- }
- else {
- std::string log_msg = "Failed to get network ssid: " + std::to_string(error);
+ } else {
+ std::string log_msg = "Failed to get network ssid: " + parseWifiNetworkError(error);
LoggerE("%s", log_msg.c_str());
return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
}
//gathering ips
- PlatformResult ret = GetIps(profile_handle, &result_ip_address, &result_ipv6_address);
+ PlatformResult ret = GetIps(wifi_ap_handle, &result_ip_address, &result_ipv6_address);
if (ret.IsError()) {
return ret;
}
//gathering strength
- int rssi = 0;
- error = connection_profile_get_wifi_rssi(profile_handle, &rssi);
- if (CONNECTION_ERROR_NONE == error) {
- result_signal_strength = (double) rssi/kWifiSignalStrengthDivideValue;
- }
- else {
- std::string log_msg = "Failed to get signal strength: " + std::to_string(error);
- LoggerE("%s", log_msg.c_str());
- return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+ wifi_rssi_level_e rssi_level = system_info_listeners.GetWifiLevel();
+ // this mean that level was not initialized or wifi not connected
+ if (WIFI_RSSI_LEVEL_0 == rssi_level) {
+ // so try to gather rssi level with dedicated function
+ int rssi = 0;
+ error = wifi_ap_get_rssi(wifi_ap_handle, &rssi);
+ if (WIFI_ERROR_NONE == error) {
+ result_signal_strength = ((double) abs(rssi))/kWifiSignalStrengthDivideValue;
+ } else {
+ std::string log_msg = "Failed to get signal strength: " + parseWifiNetworkError(error);
+ LoggerE("%s", log_msg.c_str());
+ return PlatformResult(ErrorCode::UNKNOWN_ERR, log_msg);
+ }
+ } else {
+ result_signal_strength = ((double) rssi_level)/WIFI_RSSI_LEVEL_4;
}
- } else {
- LoggerD("Connection type = %d. WIFI is disabled", connection_type);
}
-
+ //building result object
out.insert(std::make_pair("status", picojson::value(result_status ? kWifiStatusOn : kWifiStatusOff)));
out.insert(std::make_pair("ssid", picojson::value(result_ssid)));
out.insert(std::make_pair("ipAddress", picojson::value(result_ip_address)));
out.insert(std::make_pair("ipv6Address", picojson::value(result_ipv6_address)));
out.insert(std::make_pair("macAddress", picojson::value(result_mac_address)));
out.insert(std::make_pair("signalStrength", picojson::value(std::to_string(result_signal_strength))));
+
return PlatformResult(ErrorCode::NO_ERROR);
}
diff --git a/src/systeminfo/systeminfo.gyp b/src/systeminfo/systeminfo.gyp
index 72441978..5659bfac 100644
--- a/src/systeminfo/systeminfo.gyp
+++ b/src/systeminfo/systeminfo.gyp
@@ -32,6 +32,7 @@
'capi-network-connection',
'capi-system-device',
'capi-system-system-settings',
+ 'capi-network-wifi',
'tapi',
'sensor',
]