--- /dev/null
+/*
+ * 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();
+}