Add WiFi state publisher 61/141161/2
authorMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 28 Jul 2017 09:29:58 +0000 (18:29 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 28 Jul 2017 09:48:06 +0000 (18:48 +0900)
Change-Id: If74a6eb1d32817f6586becc96c6950ed8384c757
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
include/job_scheduler_types_internal.h
packaging/context-job-scheduler.spec
src/server/CMakeLists.txt
src/server/publisher/WifiState.cpp [new file with mode: 0644]

index 06e7a9e06e41957e10020227d9d4d1a1e42081c7..aacab31313466c89557b50504f8abfa17335676d 100644 (file)
@@ -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"
index 00aadf9e51743e89f4b4b14fb98f043e3d434ad9..d1821d2f42bedf9473d662ae6ed451bc47efe790 100644 (file)
@@ -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)
 
index 16bb77ea2b7ea690c8ef0f3868a4869e1b00af3b..91e8479226897d89fefa44c0d226f8f247a60504 100644 (file)
@@ -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 (file)
index 0000000..2f6cc47
--- /dev/null
@@ -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 <system_info.h>
+#include <wifi-manager.h>
+
+#include <ContextTypes.h>
+#include <JobSchedulerTypesPrivate.h>
+#include <job_scheduler_types_internal.h>
+#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<WifiState*>(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<WifiState*>(cbData);
+
+       if (pubs->__update(pubs->__activated, state == WIFI_MANAGER_CONNECTION_STATE_CONNECTED))
+               pubs->notifyObservers();
+}