+/*
+ * Network Configuration - VPN Service Module
+ *
+ * Copyright (c) 2015 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 <unistd.h>
+#include <gio/gunixfdlist.h>
+
+#include "mptcp.h"
+#include "mptcp-internal.h"
+#include "netdbus.h"
+#include "log.h"
+
+static Mptcp *mptcp_object = NULL;
+
+Mptcp *get_mptcp_object(void)
+{
+ return mptcp_object;
+}
+
+/*********************
+ * Handler Functions *
+ ********************/
+gboolean handle_mptcp_supported(Mptcp *object, GDBusMethodInvocation *invocation)
+{
+ DBG("handle_mptcp_supported");
+ gboolean value;
+
+ value = mptcp_supported();
+
+ mptcp_complete_mptcp_supported(object, invocation, value);
+ return TRUE;
+}
+
+gboolean handle_mptcp_set_enable(Mptcp *object, GDBusMethodInvocation *invocation, gint enable)
+{
+ DBG("handle_mptcp_set_enable");
+
+ if (mptcp_set_enable(enable) == FALSE) {
+ ERR("Fail to set mptcp_enabled[%d]", enable);
+ return FALSE;
+ }
+
+ mptcp_complete_mptcp_set_enable(object, invocation);
+ return TRUE;
+}
+
+gboolean handle_mptcp_get_enabled(Mptcp *object, GDBusMethodInvocation *invocation)
+{
+ DBG("handle_mptcp_get_enabled");
+ gint value;
+
+ value = mptcp_get_enabled();
+ if (value != 0 && value != 1 && value != 2) {
+ ERR("Invalid value of mptcp_enabled[%d]", value);
+ return FALSE;
+ }
+
+ mptcp_complete_mptcp_get_enabled(object, invocation, value);
+ return TRUE;
+}
+
+gboolean handle_mptcp_set_path_manager(Mptcp *object, GDBusMethodInvocation *invocation, const gchar *pm)
+{
+ DBG("handle_mptcp_set_path_manager %s", pm);
+
+ if (mptcp_set_path_manager(pm) == FALSE) {
+ ERR("Fail to set mptcp_path_manager[%d]", pm);
+ return FALSE;
+ }
+
+ mptcp_complete_mptcp_set_path_manager(object, invocation);
+ return TRUE;
+}
+
+gboolean handle_mptcp_get_path_manager(Mptcp *object, GDBusMethodInvocation *invocation)
+{
+ DBG("handle_mptcp_get_path_manager");
+ gchar* pm;
+
+ pm = mptcp_get_path_manager();
+ if (pm == NULL) {
+ ERR("Fail to get mptcp_path_manager");
+ return FALSE;
+ }
+
+ DBG("get path manager %s", pm);
+ mptcp_complete_mptcp_get_path_manager(object, invocation, pm);
+ g_free(pm);
+
+ return TRUE;
+}
+
+gboolean handle_mptcp_set_scheduler(Mptcp *object, GDBusMethodInvocation *invocation, const gchar *scheduler)
+{
+ DBG("handle_mptcp_set_scheduler");
+
+ if (mptcp_mptcp_set_scheduler(scheduler) == FALSE) {
+ ERR("Fail to set mptcp_scheduler[%s]", scheduler);
+ return FALSE;
+ }
+
+ mptcp_complete_mptcp_set_scheduler(object, invocation);
+ return TRUE;
+}
+
+gboolean handle_mptcp_get_scheduler(Mptcp *object, GDBusMethodInvocation *invocation)
+{
+ DBG("handle_mptcp_get_scheduler");
+ gchar* scheduler;
+
+ scheduler = mptcp_get_scheduler();
+ if (scheduler == NULL) {
+ ERR("Fail to get mptcp_scheduler");
+ return FALSE;
+ }
+
+ DBG("get scheduler %s", scheduler);
+ mptcp_complete_mptcp_get_scheduler(object, invocation, scheduler);
+ g_free(scheduler);
+
+ return TRUE;
+}
+
+
+/*****************************
+ * Initializations Functions *
+ ****************************/
+void mptcp_object_create_and_init(void)
+{
+ DBG("Create mptcp object.");
+ GDBusInterfaceSkeleton *interface_mptcp = NULL;
+ GDBusConnection *connection = NULL;
+ GDBusObjectManagerServer *server = netdbus_get_mptcp_manager();
+ if (server == NULL)
+ return;
+
+ connection = netdbus_get_connection();
+ g_dbus_object_manager_server_set_connection(server, connection);
+
+ /* Interface */
+ mptcp_object = mptcp_skeleton_new();
+ interface_mptcp = G_DBUS_INTERFACE_SKELETON(mptcp_object);
+
+ /* VPN Service */
+ g_signal_connect(mptcp_object, "handle-mptcp-supported",
+ G_CALLBACK(handle_mptcp_supported), NULL);
+ g_signal_connect(mptcp_object, "handle-mptcp-set-enable",
+ G_CALLBACK(handle_mptcp_set_enable), NULL);
+ g_signal_connect(mptcp_object, "handle-mptcp-get-enabled",
+ G_CALLBACK(handle_mptcp_get_enabled), NULL);
+ g_signal_connect(mptcp_object, "handle-mptcp-set-path-manager",
+ G_CALLBACK(handle_mptcp_set_path_manager), NULL);
+ g_signal_connect(mptcp_object, "handle-mptcp-get-path-manager",
+ G_CALLBACK(handle_mptcp_get_path_manager), NULL);
+ g_signal_connect(mptcp_object, "handle-mptcp-set-scheduler",
+ G_CALLBACK(handle_mptcp_set_scheduler), NULL);
+ g_signal_connect(mptcp_object, "handle-mptcp-get-scheduler",
+ G_CALLBACK(handle_mptcp_get_scheduler), NULL);
+
+ if (!g_dbus_interface_skeleton_export(interface_mptcp, connection,
+ NETCONFIG_MPTCP_PATH, NULL)) {
+ ERR("Export NETCONFIG_MPTCP_PATH for mptcp failed");
+ }
+
+ return;
+}
+
+void mptcp_object_deinit(void)
+{
+ DBG("Deinit mptcp object.");
+
+ g_object_unref(mptcp_object);
+}
+