+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <iostream>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "wmesh.h"
+
+Wmesh::Wmesh()
+{
+ Create();
+}
+
+Wmesh::~Wmesh()
+{
+ Destroy();
+}
+error_e Wmesh::Scan(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_SCAN,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform scan");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::SpecificScan(char *mesh_id, int channel)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_SPECIFIC_SCAN,
+ g_variant_new("(si)", mesh_id, channel),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform specific_scan");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::CancelScan(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_CANCEL_SCAN,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform cancel_scan");
+
+ return ERROR_NONE;
+}
+
+error_e Wmesh::GetFoundMeshNetworks(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_FOUND_MESH_NETWORKS,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform get_found_mesh_networks");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::GetConnectedPeers(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_CONNECTED_PEERS,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform get_connceted_peers");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::EnableMesh(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_ENABLE_MESH,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform enable_mesh");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::DisableMesh(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_DISABLE_MESH,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform disable_mesh");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::IsMeshEnabled(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_IS_MESH_ENABLED,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform is_mesh_enabled");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::IsJoined(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_IS_JOINED,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform is_joined");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::GetJoinedMeshNetwork(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_JOINED_MESH_NETWORK,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform get_joined_mesh_network");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::SetGate(bool gate_announce, int hwmp_root_mode, bool stp)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_SET_GATE,
+ g_variant_new("(bqq)", gate_announce, hwmp_root_mode, stp),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform set_gate");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::UnsetGate(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_UNSET_GATE,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform unset_gate");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::SetSoftap(char *ssid, char *passphrase, int channel,
+ int visibility, int max_stations, int security)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+ char buf[2] = {0, };
+
+ if (channel <= 13) {
+ buf[0] = 'g';
+ buf[1] = 0;
+ } else {
+ buf[0] = 'a';
+ buf[1] = 0;
+ }
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_SET_SOFTAP,
+ g_variant_new("(sssiiii)", ssid, passphrase, buf,
+ channel, visibility, max_stations, security),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform set_softap");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::GetSoftap(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_SOFTAP,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform get_softap");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::EnableSoftap(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_ENABLE_SOFTAP,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform enabe_softap");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::DisableSoftap(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_DISABLE_SOFTAP,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform disable_softap");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::IsSoftapEnabled(void)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_IS_SOFTAP_ENABLED,
+ NULL,
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform is_softap_enabled");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::CreateMeshNetwork(char *mesh_id, int channel, int security,
+ int pmf)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_CREATE_MESH_NETWORK,
+ g_variant_new("(siii)", mesh_id, channel, security, pmf),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform create_mesh_network");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::ConnectMeshNetwork(char *mesh_id, int channel, int security,
+ char *passphrase)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_CONNECT_MESH_NETWORK,
+ g_variant_new("(siis)", mesh_id, channel, security, passphrase),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform connect_mesh_network");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::DisconnectMeshNetwork(char *mesh_id, int channel, int security)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_DISCONNECT_MESH_NETWORK,
+ g_variant_new("(sii)", mesh_id, channel, security),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform disconnect_mesh_network");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::ForgetMeshNetwork(char *mesh_id, int channel, int security)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_FORGET_MESH_NETWORK,
+ g_variant_new("(sii)", mesh_id, channel, security),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform forget_mesh_network");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::SetInterfaces(char *mesh, char *gate, char *softap)
+{
+ GVariant *message = NULL;
+ error_e error = ERROR_NONE;
+
+ message = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_SET_INTERFACES,
+ g_variant_new("(sss)", mesh, gate, softap),
+ &error);
+
+ if (message == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ GLOGD("Succeeded to perform set_interfaces");
+
+ return ERROR_NONE;
+}
+error_e Wmesh::GetStationInfo(int sta_type)
+{
+ bool is_started;
+ GVariant *msg1 = NULL;
+ GVariant *msg2 = NULL;
+ error_e error = ERROR_NONE;
+
+ msg1 = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_IS_MESH_ENABLED,
+ NULL,
+ &error);
+
+ if (msg1 == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ g_variant_get(msg1, "(b)", &is_started);
+ g_variant_unref(msg1);
+ if (TRUE == is_started) {
+ msg2 = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_STATION_INFO,
+ g_variant_new("(i)", sta_type),
+ &error);
+
+ if (msg2 == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ } else {
+ g_variant_unref(msg2);
+ }
+
+ GLOGD("Succeeded to perform get_station_info");
+ }
+
+ return ERROR_NONE;
+}
+error_e Wmesh::GetMpathInfo(void)
+{
+ bool is_started;
+ GVariant *msg1 = NULL;
+ GVariant *msg2 = NULL;
+ error_e error = ERROR_NONE;
+
+ msg1 = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_IS_MESH_ENABLED,
+ NULL,
+ &error);
+
+ if (msg1 == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ g_variant_get(msg1, "(b)", &is_started);
+ g_variant_unref(msg1);
+ if (TRUE == is_started) {
+ msg2 = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_MPATH_INFO,
+ NULL,
+ &error);
+
+ if (msg2 == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ } else {
+ g_variant_unref(msg2);
+ }
+
+ GLOGD("Succeeded to perform get_mpath_info");
+ }
+
+ return ERROR_NONE;
+}
+error_e Wmesh::GetMeshconfInfo(void)
+{
+ bool is_started;
+ GVariant *msg1 = NULL;
+ GVariant *msg2 = NULL;
+ error_e error = ERROR_NONE;
+
+ msg1 = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_IS_MESH_ENABLED,
+ NULL,
+ &error);
+
+ if (msg1 == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ }
+
+ g_variant_get(msg1, "(b)", &is_started);
+ g_variant_unref(msg1);
+ if (TRUE == is_started) {
+ msg2 = InvokeMethod(WIFI_MESH_MGR_SERVICE,
+ WIFI_MESH_MGR_PATH,
+ WIFI_MESH_MGR_INTERFACE,
+ WIFI_MESH_MGR_METHOD_GET_MESHCONF_INFO,
+ NULL,
+ &error);
+
+ if (msg2 == NULL) {
+ GLOGD("Failed to invoke dbus method");
+ return error;
+ } else {
+ g_variant_unref(msg2);
+ }
+
+ GLOGD("Succeeded to perform get_meshconf_info");
+ }
+
+ return ERROR_NONE;
+}
+