From dcbe342ad26c31ad6eeac7c96a789decc690d8e7 Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Fri, 28 Jul 2017 18:29:58 +0900 Subject: [PATCH] Add WiFi state publisher Change-Id: If74a6eb1d32817f6586becc96c6950ed8384c757 Signed-off-by: Mu-Woong Lee --- include/job_scheduler_types_internal.h | 2 + packaging/context-job-scheduler.spec | 1 + src/server/CMakeLists.txt | 3 +- src/server/publisher/WifiState.cpp | 208 +++++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 src/server/publisher/WifiState.cpp diff --git a/include/job_scheduler_types_internal.h b/include/job_scheduler_types_internal.h index 06e7a9e..aacab31 100644 --- a/include/job_scheduler_types_internal.h +++ b/include/job_scheduler_types_internal.h @@ -45,6 +45,7 @@ #define CTX_SCHED_ATTR_NAME_ACCURACY "Accuracy" #define CTX_SCHED_ATTR_NAME_IS_CONNECTED "IsConnected" #define CTX_SCHED_ATTR_NAME_IS_CHARGING "IsCharging" +#define CTX_SCHED_ATTR_NAME_BSSID "BSSID" /* Attribute values */ #define CTX_SCHED_ATTR_VALUE_TRUE 1 @@ -52,6 +53,7 @@ #define CTX_SCHED_ATTR_VALUE_UNDEFINED "Undefined" #define CTX_SCHED_ATTR_VALUE_CONNECTED "Connected" +#define CTX_SCHED_ATTR_VALUE_UNCONNECTED "Unconnected" #define CTX_SCHED_ATTR_VALUE_DISABLED "Disabled" #define CTX_SCHED_ATTR_VALUE_DETECTED "Detected" #define CTX_SCHED_ATTR_VALUE_HEADSET "Headset" diff --git a/packaging/context-job-scheduler.spec b/packaging/context-job-scheduler.spec index 00aadf9..d1821d2 100644 --- a/packaging/context-job-scheduler.spec +++ b/packaging/context-job-scheduler.spec @@ -19,6 +19,7 @@ BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(capi-system-device) BuildRequires: pkgconfig(capi-system-runtime-info) BuildRequires: pkgconfig(capi-context-motion) +BuildRequires: pkgconfig(capi-network-wifi-manager) BuildRequires: pkgconfig(aul) BuildRequires: pkgconfig(notification) diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 16bb77e..91e8479 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -1,7 +1,8 @@ SET(target "${PROJECT_NAME}-server-genuine") SET(DEPS "${DEPS} jsoncpp sqlite3 vconf context-common-server") -SET(DEPS "${DEPS} capi-system-info capi-system-device capi-system-runtime-info capi-context-motion") +SET(DEPS "${DEPS} capi-system-info capi-system-device capi-system-runtime-info") +SET(DEPS "${DEPS} capi-context-motion capi-network-wifi-manager") SET(DEPS "${DEPS} aul notification") FILE(GLOB_RECURSE SRCS *.cpp ../shared/*.cpp) diff --git a/src/server/publisher/WifiState.cpp b/src/server/publisher/WifiState.cpp new file mode 100644 index 0000000..2f6cc47 --- /dev/null +++ b/src/server/publisher/WifiState.cpp @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * 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. + */ + +#include +#include + +#include +#include +#include +#include "../ContextPublisher.h" +#include "../IContextObserver.h" + +#define UNKNOWN -1 +#define DISABLED 0 +#define UNCONNECTED 1 +#define CONNECTED 2 + +using namespace ctx; + +namespace { + class WifiState : public ContextPublisher { + public: + WifiState(uid_t uid); + ~WifiState(); + + const char* getUri() const; + + protected: + void read(); + void subscribe(); + void unsubscribe(); + + private: + bool __init(); + void __release(); + + bool __update(bool activated, bool connected); + + std::string __getBssid(); + + static void __deviceStateCb(wifi_manager_device_state_e state, void *cbData); + static void __connectionStateCb(wifi_manager_connection_state_e state, wifi_manager_ap_h ap, void *cbData); + + wifi_manager_h __wifiManager; + int __state; + bool __activated; + bool __connected; + }; +} + +REGISTER_PUBLISHER(URI(WIFI), WifiState) + +WifiState::WifiState(uid_t uid) : + __wifiManager(NULL), + __state(UNKNOWN), + __activated(false), + __connected(false) +{ + bool supported = false; + system_info_get_platform_bool("tizen.org/feature/network.wifi", &supported); + IF_FAIL_THROW(supported, E_SUPPORT); + + _D("Created"); +} + +WifiState::~WifiState() +{ + unsubscribe(); + + _D("Destroyed"); +} + +const char* WifiState::getUri() const +{ + return URI(WIFI); +} + +void WifiState::read() +{ + IF_FAIL_VOID(__init()); + + bool activated = false; + wifi_manager_connection_state_e connState = WIFI_MANAGER_CONNECTION_STATE_FAILURE; + + wifi_manager_is_activated(__wifiManager, &activated); + wifi_manager_get_connection_state(__wifiManager, &connState); + + __update(activated, connState == WIFI_MANAGER_CONNECTION_STATE_CONNECTED); +} + +void WifiState::subscribe() +{ + IF_FAIL_VOID(__init()); + + int error = E_NONE; + + error = wifi_manager_set_device_state_changed_cb(__wifiManager, __deviceStateCb, this); + IF_FAIL_VOID_TAG(IS_SUCCESS(error), _E, "Failed to subscribe"); + + error = wifi_manager_set_connection_state_changed_cb(__wifiManager, __connectionStateCb, this); + IF_FAIL_VOID_TAG(IS_SUCCESS(error), _E, "Failed to subscribe"); +} + +void WifiState::unsubscribe() +{ + wifi_manager_unset_device_state_changed_cb(__wifiManager); + wifi_manager_unset_connection_state_changed_cb(__wifiManager); + + __release(); +} + +bool WifiState::__init() +{ + if (__wifiManager) + return true; + + int error = wifi_manager_initialize(&__wifiManager); + IF_FAIL_RETURN_TAG(error == WIFI_MANAGER_ERROR_NONE, false, _E, "WiFi initialization failed"); + + return true; +} + +void WifiState::__release() +{ + if (__wifiManager) { + wifi_manager_deinitialize(__wifiManager); + __wifiManager = NULL; + } +} + +bool WifiState::__update(bool activated, bool connected) +{ + int state = activated ? (connected ? CONNECTED : UNCONNECTED) : DISABLED; + bool updated = (__state != state); + + __activated = activated; + __connected = connected; + + __state = state; + + __data[NAME(STATE)] = [&state]()->const char* { + if (state == DISABLED) + return VALUE(DISABLED); + if (state == UNCONNECTED) + return VALUE(UNCONNECTED); + if (state == CONNECTED) + return VALUE(CONNECTED); + return VALUE(UNDEFINED); + }(); + + if (state == CONNECTED) + __data[NAME(BSSID)] = __getBssid(); + else + __data.removeMember(NAME(BSSID)); + + return updated; +} + +std::string WifiState::__getBssid() +{ + wifi_manager_ap_h ap = NULL; + std::string bssid; + + wifi_manager_get_connected_ap(__wifiManager, &ap); + IF_FAIL_RETURN(ap, bssid); + + char* buffer = NULL; + wifi_manager_ap_get_bssid(ap, &buffer); + if (buffer) { + bssid = buffer; + g_free(buffer); + } + + wifi_manager_ap_destroy(ap); + + return bssid; +} + +void WifiState::__deviceStateCb(wifi_manager_device_state_e state, void *cbData) +{ + _D("Device state changed"); + WifiState* pubs = static_cast(cbData); + + if (pubs->__update(state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED, pubs->__connected)) + pubs->notifyObservers(); +} + +void WifiState::__connectionStateCb(wifi_manager_connection_state_e state, wifi_manager_ap_h ap, void *cbData) +{ + _D("Connection state changed"); + WifiState* pubs = static_cast(cbData); + + if (pubs->__update(pubs->__activated, state == WIFI_MANAGER_CONNECTION_STATE_CONNECTED)) + pubs->notifyObservers(); +} -- 2.7.4