Group: Network & Connectivity/Other
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
-Source2: %{name}.service
+Source2: d2dm.service
Source3: %{name}.manifest
Source4: %{name}-devel.manifest
-Source5: net.d2d.manager.service
-Source6: fn-manager.service
-Source7: net.fn.manager.service
-Source8: d2d-subowner.service
-Source9: net.d2d.subowner.service
+Source5: net.d2dm.service
+Source6: fnm.service
+Source7: net.fnm.service
+Source8: d2ds.service
+Source9: net.d2ds.service
BuildRequires: cmake
BuildRequires: pkgconfig(iotivity)
%make_install
mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services/
-cp %{SOURCE5} %{buildroot}%{_datadir}/dbus-1/system-services/net.d2d.manager.service
+cp %{SOURCE5} %{buildroot}%{_datadir}/dbus-1/system-services/net.d2dm.service
mkdir -p %{buildroot}%{_unitdir}
-cp %{SOURCE2} %{buildroot}%{_unitdir}/%{name}.service
+cp %{SOURCE2} %{buildroot}%{_unitdir}/d2dm.service
-cp %{SOURCE7} %{buildroot}%{_datadir}/dbus-1/system-services/net.fn.manager.service
+cp %{SOURCE7} %{buildroot}%{_datadir}/dbus-1/system-services/net.fnm.service
mkdir -p %{buildroot}%{_unitdir}
-cp %{SOURCE6} %{buildroot}%{_unitdir}/fn-manager.service
+cp %{SOURCE6} %{buildroot}%{_unitdir}/fnm.service
-cp %{SOURCE9} %{buildroot}%{_datadir}/dbus-1/system-services/net.d2d.subowner.service
+cp %{SOURCE9} %{buildroot}%{_datadir}/dbus-1/system-services/net.d2ds.service
mkdir -p %{buildroot}%{_unitdir}
-cp %{SOURCE8} %{buildroot}%{_unitdir}/d2d-subowner.service
+cp %{SOURCE8} %{buildroot}%{_unitdir}/d2ds.service
cp test/oic_svr_db_client.dat oic_svr_db_subowner_client.dat
%{_bindir}/subowner
%{_bindir}/fn-manager
%attr(644,root,root) %{_datadir}/dbus-1/system-services/*
-%attr(644,root,root) %{_unitdir}/%{name}.service
-%attr(644,root,root) %{_unitdir}/fn-manager.service
-%attr(644,root,root) %{_unitdir}/d2d-subowner.service
+%attr(644,root,root) %{_unitdir}/d2dm.service
+%attr(644,root,root) %{_unitdir}/fnm.service
+%attr(644,root,root) %{_unitdir}/d2ds.service
%files devel
%manifest %{name}-devel.manifest
Type=dbus
User=network_fw
Group=network_fw
-BusName=net.d2d.manager
+BusName=net.d2dm.enabler
SmackProcessLabel=System
ExecStart=/usr/bin/d2d-manager
Type=dbus
User=network_fw
Group=network_fw
-BusName=net.d2d.subowner
+BusName=net.d2ds.enabler
SmackProcessLabel=System
ExecStart=/usr/bin/d2d-subowner
[D-BUS Service]
-Name=net.d2d.manager
+Name=net.d2dm.enabler
Exec=/bin/false
User=network_fw
Group=network_fw
-SystemdService=d2d-manager.service
+SystemdService=d2dm.service
[D-BUS Service]
-Name=net.d2d.subowner
+Name=net.d2ds.enabler
Exec=/bin/false
User=network_fw
Group=network_fw
-SystemdService=d2d-subowner.service
+SystemdService=d2ds.service
[D-BUS Service]
-Name=net.fn.manager
+Name=net.fn.enabler
Exec=/bin/false
User=network_fw
Group=network_fw
-SystemdService=fn-manager.service
+SystemdService=fnm.service
[Install]
WantedBy=multi-user.target
-MESSAGE("===================================================================")
-MESSAGE("Building...d2d-manager")
MESSAGE("===================================================================")
+MESSAGE("Building...d2d-manager")
+MESSAGE("===================================================================")
+
+SET(INTROSPECTION_PATH ${CMAKE_CURRENT_SOURCE_DIR}/introspection)
+MESSAGE("KSR : ${INTROSPECTION_PATH}")
+ADD_CUSTOM_COMMAND(
+ OUTPUT dbus
+ COMMAND gdbus-codegen
+ --interface-prefix net.d2dm.
+ --generate-c-code d2dm-generated-code
+ --c-generate-object-manager
+ --generate-docbook generated-docs
+ ${INTROSPECTION_PATH}/d2dm.xml
+ ${INTROSPECTION_PATH}/enabler.xml
+ COMMENT "Generating d2dm GDBus .c/.h"
+)
+ADD_CUSTOM_TARGET(GENERATED_DBUS_CODE DEPENDS dbus)
-MESSAGE(" - Set source folder")
+MESSAGE(" - Set source folder")
FILE(GLOB D2D_MANAGER_SRCS *.c)
+SET(D2D_MANAGER_SRCS ${D2D_MANAGER_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/d2dm-generated-code.c)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/d2dm-generated-code.c PROPERTIES GENERATED TRUE)
SET(D2D_MANAGER "d2d-manager")
-ADD_EXECUTABLE(${D2D_MANAGER} ${D2D_MANAGER_SRCS})
-TARGET_LINK_LIBRARIES(${D2D_MANAGER} ${daemon_pkgs_LIBRARIES} pthread)
+ADD_EXECUTABLE(${D2D_MANAGER} ${D2D_MANAGER_SRCS})
+ADD_DEPENDENCIES(${D2D_MANAGER} GENERATED_DBUS_CODE)
+TARGET_LINK_LIBRARIES(${D2D_MANAGER} ${daemon_pkgs_LIBRARIES} pthread)
INSTALL(TARGETS ${D2D_MANAGER} DESTINATION bin)
--- /dev/null
+/*\r
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "d2dm-log.h"\r
+#include "d2dm-util.h"\r
+#include "d2dm-gdbus.h"\r
+\r
+static int _d2dm_close_gdbus_call(d2dm_service *service)\r
+{\r
+ /* CHECK: is connection ref count required? */\r
+ g_object_unref(service->connection);\r
+ service->connection = NULL;\r
+\r
+ return D2DM_ERROR_NONE;\r
+}\r
+\r
+static void _dbus_name_owner_notify(GObject *object, GParamSpec *pspec,\r
+ gpointer *user_data)\r
+{\r
+ GDBusProxy *proxy = G_DBUS_PROXY(object);\r
+ gchar *name_owner = g_dbus_proxy_get_name_owner(proxy);\r
+ d2dm_service *service = (d2dm_service*)user_data;\r
+\r
+ NOTUSED(pspec);\r
+\r
+ if (NULL == name_owner) {\r
+ D2DM_LOGE("name_owner is not exists !");\r
+ _d2dm_close_gdbus_call(service);\r
+ }\r
+\r
+ g_free(name_owner);\r
+}\r
+\r
+static int _d2dm_create_gdbus_call(d2dm_service *service)\r
+{\r
+ int id;\r
+ GError *error = NULL;\r
+\r
+ if (NULL == service)\r
+ return D2DM_ERROR_INVALID_PARAMETER;\r
+\r
+ if (NULL != service->connection)\r
+ return D2DM_ERROR_ALREADY_REGISTERED;\r
+\r
+ service->connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);\r
+ if (service->connection == NULL) {\r
+ if (error != NULL) {\r
+ D2DM_LOGE("Failed to connect to the D-BUS daemon [%s]", error->message);\r
+ g_error_free(error);\r
+ }\r
+ return D2DM_ERROR_IO_ERROR;\r
+ }\r
+\r
+ id = g_signal_connect(service->connection, "notify::g-name-owner",\r
+ G_CALLBACK(_dbus_name_owner_notify), service);\r
+ if (0 == id) {\r
+ D2DM_LOGE("g_signal_connect() Fail");\r
+ g_object_unref(service->connection);\r
+ service->connection = NULL;\r
+ return D2DM_ERROR_IO_ERROR;\r
+ }\r
+\r
+ return D2DM_ERROR_NONE;\r
+}\r
+\r
+static void _d2dm_subscribe_event(d2dm_service *service)\r
+{\r
+ unsigned int id = 0;\r
+\r
+ d2dm_check_null_ret("service", service);\r
+#if 0\r
+ id = g_dbus_connection_signal_subscribe(\r
+ (GDBusConnection *)service->connection,\r
+ CONNMAN_SERVER_NAME, CONNMAN_INTERFACE_MANAGER,\r
+ "ScanDone", "/", NULL,\r
+ G_DBUS_CALL_FLAGS_NONE, _wmeshd_signal_handler, service, NULL);\r
+ if (0 == id) {\r
+ WMESH_LOGE("g_dbus_connection_signal_subscribe(ScanDone) Fail(%d)", errno);\r
+ return;\r
+ }\r
+ service->dbus_sub_ids = g_list_append(service->dbus_sub_ids, GUINT_TO_POINTER(id));\r
+ WMESH_LOGD("[Signal subscribe] : ScanDone (%d)", id);\r
+\r
+ /* To monitor mesh profiles */\r
+ id = g_dbus_connection_signal_subscribe(\r
+ (GDBusConnection *)service->connection,\r
+ CONNMAN_SERVER_NAME,\r
+ CONNMAN_INTERFACE_MESH,\r
+ "PropertyChanged",\r
+ NULL, /* Path */\r
+ NULL,\r
+ G_DBUS_CALL_FLAGS_NONE, _wmeshd_signal_handler, service, NULL);\r
+ if (0 == id) {\r
+ WMESH_LOGE("g_dbus_connection_signal_subscribe(ScanDone) Fail(%d)", errno);\r
+ return;\r
+ }\r
+ service->dbus_sub_ids = g_list_append(service->dbus_sub_ids, GUINT_TO_POINTER(id));\r
+ WMESH_LOGD("[Signal subscribe] : PropertyChanged (%d)", id);\r
+#endif\r
+ /* End of subscription */\r
+}\r
+\r
+\r
+static void _on_unsubscribe_ids(gpointer data, gpointer user_data)\r
+{\r
+ unsigned int id = GPOINTER_TO_UINT(data);\r
+ d2dm_service *service = (d2dm_service*)user_data;\r
+\r
+ D2DM_LOGD("[Signal unsubscribe] : %d", id);\r
+ g_dbus_connection_signal_unsubscribe((GDBusConnection *)service->connection, id);\r
+}\r
+\r
+static void _wmeshd_unsubscribe_event(d2dm_service *service)\r
+{\r
+ d2dm_check_null_ret("service", service);\r
+\r
+ g_list_foreach(service->dbus_sub_ids, _on_unsubscribe_ids, service);\r
+\r
+ g_list_free(service->dbus_sub_ids);\r
+ service->dbus_sub_ids = NULL;\r
+}\r
+\r
+\r
+int d2dm_dbus_start(d2dm_service *service)\r
+{\r
+ int rv;\r
+\r
+ rv = _d2dm_create_gdbus_call(service);\r
+ if (D2DM_ERROR_NONE != rv)\r
+ return rv;\r
+\r
+ service->ca = g_cancellable_new();\r
+\r
+ /* Create all required proxies here */\r
+#if 0\r
+ _gproxy_connman = _proxy_get_connman(service);\r
+ wmeshd_check_null_ret_error("_gproxy_connman", _gproxy_connman,\r
+ WMESHD_ERROR_IO_ERROR);\r
+ g_dbus_proxy_set_default_timeout(\r
+ G_DBUS_PROXY(_gproxy_connman), WMESH_DBUS_PROXY_TIMEOUT);\r
+#endif\r
+ /* Subscribe events */\r
+ _d2dm_subscribe_event(service);\r
+\r
+ return D2DM_ERROR_NONE;\r
+}\r
+\r
+int d2dm_dbus_stop(d2dm_service *service)\r
+{\r
+ int rv;\r
+\r
+ if (NULL == service)\r
+ return D2DM_ERROR_INVALID_PARAMETER;\r
+\r
+ /* Unsubscribe events */\r
+ _wmeshd_unsubscribe_event(service);\r
+\r
+ g_cancellable_cancel(service->ca);\r
+ g_object_unref(service->ca);\r
+ service->ca = NULL;\r
+\r
+ rv = _d2dm_close_gdbus_call(service);\r
+ return rv;\r
+}\r
+\r
-/*
- * Copyright (c) 2012, 2013 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 <stdio.h>
-#include <stdint.h>
-#include <dlog.h>
-#include <aul.h>
-#include <glib.h>
-
-int main()
-{
- int ret;
-
- dlog_print(DLOG_DEBUG, "D2D_DAEMON", "run daemon");
-
- ret = aul_launch_app("org.tizen.familynet-manager", NULL);
- dlog_print(DLOG_DEBUG, "D2D_DAEMON", "launch app result : %d", ret);
-
- return 0;
-}
+/*\r
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef __D2DM_GDBUS_H__\r
+#define __D2DM_GDBUS_H__\r
+\r
+#include "d2dm.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+int d2dm_dbus_start(d2dm_service *service);\r
+int d2dm_dbus_stop(d2dm_service *service);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /** __D2DM_GDBUS_H__ */\r
+\r
* limitations under the License.\r
*\r
*/\r
-#ifndef __D2D_MANAGER_LOG_H__\r
-#define __D2D_MANAGER_LOG_H__\r
+#ifndef __D2D_LOG_H__\r
+#define __D2D_LOG_H__\r
\r
-#ifdef D2D_MAN_LOG_TAG\r
-#undef D2D_MAN_LOG_TAG\r
+#ifdef LOG_TAG\r
+#undef LOG_TAG\r
#endif\r
\r
#ifdef USE_DLOG\r
#include <dlog.h>\r
\r
-#undef D2D_MAN_LOG_TAG\r
-#define D2D_MAN_LOG_TAG "D2D_MANAGER"\r
+#undef LOG_TAG\r
+#define LOG_TAG "D2D_MANAGER"\r
\r
#define D2DM_LOGV(format, args...) LOGV(format, ##args)\r
#define D2DM_LOGD(format, args...) LOGD(format, ##args)\r
#define __D2DM_LOG_FUNC_ENTER__ LOGD("Enter")\r
#define __D2DM_LOG_FUNC_EXIT__ LOGD("Quit")\r
\r
-#define D2DM_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, D2D_MAN_LOG_TAG, format, ##args)\r
-#define D2DM_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, D2D_MAN_LOG_TAG, format, ##args)\r
+#define D2DM_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, LOG_TAG, format, ##args)\r
+#define D2DM_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, LOG_TAG, format, ##args)\r
\r
#else /* USE_DLOG */\r
\r
\r
#endif /* USE_DLOG */\r
\r
-#endif /* __D2D_MANAGER_LOG_H__ */\r
+#endif /* __D2D_LOG_H__ */\r
--- /dev/null
+/*\r
+ * Network Configuration Module\r
+ *\r
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ */\r
+#include <glib.h>\r
+\r
+#include "d2dm.h"\r
+#include "d2dm-log.h"\r
+#include "d2dm-util.h"\r
+#include "d2dm-service.h"\r
+#include "d2dm-service-interface.h"\r
+#include "d2dm-generated-code.h"\r
+\r
+static NetD2dm *d2dm_dbus_object;\r
+static Enabler *d2dm_activator_dbus_object;\r
+\r
+/* global list to care resource handle for each client */\r
+static GList *d2dm_dbus_client_list;\r
+static GMutex d2dm_dbus_client_list_mutex;\r
+\r
+typedef struct _d2dm_dbus_client_s {\r
+ gchar *bus_name;\r
+} d2dm_dbus_client_s;\r
+\r
+NetD2dm* d2dm_dbus_get_object()\r
+{\r
+ return d2dm_dbus_object;\r
+}\r
+\r
+static int _d2dm_dbus_client_list_cleanup(GList *client_list)\r
+{\r
+ d2dm_dbus_client_s *client;\r
+\r
+ d2dm_check_null_ret_error("client_list", client_list, FALSE);\r
+\r
+ client = client_list->data;\r
+\r
+ g_free(client->bus_name);\r
+ client->bus_name = NULL;\r
+ g_free(client);\r
+ g_list_free(client_list);\r
+\r
+ return D2DM_ERROR_NONE;\r
+}\r
+\r
+static int _d2dm_dbus_client_list_compare_bus_name(const void *a, const void *b)\r
+{\r
+ const d2dm_dbus_client_s *client = a;\r
+ return g_strcmp0(client->bus_name, b);\r
+}\r
+\r
+static inline GList* _d2dm_dbus_client_list_find_client(const gchar *owner)\r
+{\r
+ return g_list_find_custom(d2dm_dbus_client_list, owner,\r
+ _d2dm_dbus_client_list_compare_bus_name);\r
+}\r
+\r
+static void _d2dm_dbus_name_owner_changed_cb(GDBusConnection *conn,\r
+ const gchar *sender_name,\r
+ const gchar *object_path,\r
+ const gchar *interface_name,\r
+ const gchar *signal_name,\r
+ GVariant *parameters,\r
+ gpointer user_data)\r
+{\r
+ int ret;\r
+ GList *client = NULL;\r
+ gchar *name, *old_owner, *new_owner;\r
+\r
+ NOTUSED(conn);\r
+ NOTUSED(sender_name);\r
+ NOTUSED(object_path);\r
+ NOTUSED(interface_name);\r
+ NOTUSED(signal_name);\r
+ NOTUSED(user_data);\r
+\r
+ g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);\r
+\r
+ if (0 == strlen(new_owner)) {\r
+ g_mutex_lock(&d2dm_dbus_client_list_mutex);\r
+ client = _d2dm_dbus_client_list_find_client(old_owner);\r
+ if (client) { /* found bus name in our bus list */\r
+ D2DM_LOGD("bus(%s) stopped", old_owner);\r
+ d2dm_dbus_client_list = g_list_remove_link(d2dm_dbus_client_list, client);\r
+ }\r
+ g_mutex_unlock(&d2dm_dbus_client_list_mutex);\r
+\r
+ if (client) {\r
+ ret = _d2dm_dbus_client_list_cleanup(client);\r
+ if (D2DM_ERROR_NONE != ret)\r
+ D2DM_LOGE("_d2dm_dbus_client_list_cleanup() Fail(%d)", ret);\r
+ }\r
+ }\r
+}\r
+\r
+static int _d2dm_dbus_subscribe_name_owner_changed(GDBusConnection *conn)\r
+{\r
+ unsigned int id;\r
+\r
+ id = g_dbus_connection_signal_subscribe(conn,\r
+ "org.freedesktop.DBus", /* bus name */\r
+ "org.freedesktop.DBus", /* interface */\r
+ "NameOwnerChanged", /* member */\r
+ "/org/freedesktop/DBus", /* path */\r
+ NULL, /* arg0 */\r
+ G_DBUS_SIGNAL_FLAGS_NONE,\r
+ _d2dm_dbus_name_owner_changed_cb,\r
+ NULL,\r
+ NULL);\r
+ if (0 == id) {\r
+ D2DM_LOGE("g_dbus_connection_signal_subscribe() Fail");\r
+ return D2DM_ERROR_IO_ERROR;\r
+ }\r
+\r
+ return D2DM_ERROR_NONE;\r
+}\r
+\r
+\r
+static gboolean _d2dm_dbus_handle_find_peer(NetD2dm *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = D2DM_ERROR_NONE;\r
+ d2dm_service *service = (d2dm_service *)user_data;\r
+\r
+ d2dm_check_null_ret_error("service", service, FALSE);\r
+\r
+#if 0\r
+ ret = d2dm_request_find_peers(service);\r
+ if (D2DM_ERROR_NONE != ret)\r
+ D2DM_LOGE("Failed to wmesh_request_scan !");\r
+#endif\r
+ net_d2dm_complete_find_peer(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
+static void _d2dm_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,\r
+ gpointer user_data)\r
+{\r
+ gboolean ret;\r
+ GError *error = NULL;\r
+ d2dm_service *service = (d2dm_service *)user_data;\r
+\r
+ NOTUSED(name);\r
+\r
+ d2dm_dbus_object = net_d2dm_skeleton_new();\r
+ if (NULL == d2dm_dbus_object) {\r
+ D2DM_LOGE("net_d2dm_skeleton_new() Fail");\r
+ return;\r
+ }\r
+\r
+ g_signal_connect(d2dm_dbus_object, "handle-find-peers",\r
+ G_CALLBACK(_d2dm_dbus_handle_find_peer), service);\r
+\r
+ ret = g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(d2dm_dbus_object),\r
+ conn, D2DM_DBUS_OBJPATH, &error);\r
+ if (FALSE == ret) {\r
+ D2DM_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);\r
+ g_error_free(error);\r
+ }\r
+\r
+ ret = _d2dm_dbus_subscribe_name_owner_changed(conn);\r
+ if (D2DM_ERROR_NONE != ret) {\r
+ D2DM_LOGE("_d2dm_dbus_subscribe_name_owner_changed() Fail(%d)", ret);\r
+ return;\r
+ }\r
+\r
+}\r
+\r
+static void _d2dm_dbus_on_name_lost(GDBusConnection *conn, const gchar *name,\r
+ gpointer user_data)\r
+{\r
+ NOTUSED(conn);\r
+ NOTUSED(user_data);\r
+\r
+ D2DM_LOGD("Lost the name %s", name);\r
+}\r
+\r
+static void _d2dm_dbus_on_name_acquired(GDBusConnection *conn, const gchar *name,\r
+ gpointer user_data)\r
+{\r
+ NOTUSED(conn);\r
+ NOTUSED(user_data);\r
+\r
+ D2DM_LOGD("Acquired the name %s", name);\r
+}\r
+\r
+static gboolean _d2dm_dbus_handle_enable(Enabler *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = D2DM_ERROR_NONE;\r
+ d2dm_service *service = (d2dm_service *)user_data;\r
+\r
+ __D2DM_LOG_FUNC_ENTER__;\r
+\r
+ /* Do API response first */\r
+ enabler_complete_enable(object, invocation, ret);\r
+ service->d2dm_activated = TRUE;\r
+\r
+ if (service->d2dp_activated) {\r
+ /* Enable d2d proxy */\r
+ }\r
+ service->d2dp_activated = TRUE;\r
+\r
+ /* Notify d2d-manager enabled */\r
+ net_d2dm_emit_proxy_enabled(d2dm_dbus_get_object(), ret);\r
+\r
+ __D2DM_LOG_FUNC_EXIT__;\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _d2dm_dbus_handle_disable(Enabler *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = D2DM_ERROR_NONE;\r
+ d2dm_service *service = (d2dm_service *)user_data;\r
+\r
+ __D2DM_LOG_FUNC_ENTER__;\r
+\r
+ /* Make response first */\r
+ enabler_complete_disable(object, invocation, ret);\r
+\r
+ /* Terminate daemon */\r
+ d2dm_service_exit(service);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static void _d2dm_dbus_on_activator_bus_acquired(GDBusConnection *conn,\r
+ const gchar *name, gpointer user_data)\r
+{\r
+ gboolean ret;\r
+ GError *error = NULL;\r
+ d2dm_service *service = (d2dm_service *)user_data;\r
+\r
+ NOTUSED(name);\r
+\r
+ __D2DM_LOG_FUNC_ENTER__;\r
+\r
+ d2dm_activator_dbus_object = enabler_skeleton_new();\r
+ if (NULL == d2dm_activator_dbus_object) {\r
+ D2DM_LOGE("enabler_skeleton_new() Fail");\r
+ return;\r
+ }\r
+\r
+ g_signal_connect(d2dm_activator_dbus_object, "handle-enable",\r
+ G_CALLBACK(_d2dm_dbus_handle_enable), service);\r
+ g_signal_connect(d2dm_activator_dbus_object, "handle-disable",\r
+ G_CALLBACK(_d2dm_dbus_handle_disable), service);\r
+\r
+ ret = g_dbus_interface_skeleton_export(\r
+ G_DBUS_INTERFACE_SKELETON(d2dm_activator_dbus_object),\r
+ conn, D2DM_DBUS_ENABLER_OBJPATH, &error);\r
+ if (FALSE == ret) {\r
+ D2DM_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);\r
+ g_error_free(error);\r
+ }\r
+\r
+ __D2DM_LOG_FUNC_EXIT__;\r
+\r
+}\r
+\r
+static gboolean _d2dm_dbus_interface_init(d2dm_service *service)\r
+{\r
+ guint id;\r
+ guint activation_dbus_id;\r
+ d2dm_check_null_ret_error("service", service, FALSE);\r
+\r
+ id = g_bus_own_name(G_BUS_TYPE_SYSTEM,\r
+ D2DM_DBUS_INTERFACE,\r
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,\r
+ _d2dm_dbus_on_bus_acquired,\r
+ _d2dm_dbus_on_name_acquired,\r
+ _d2dm_dbus_on_name_lost,\r
+ service,\r
+ NULL);\r
+ if (0 == id) {\r
+ D2DM_LOGE("g_bus_own_name() Fail");\r
+ return FALSE;\r
+ }\r
+\r
+ /* Get D-Bus owner to activate mesh service daemon */\r
+ activation_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,\r
+ D2DM_DBUS_INTERFACE".enabler",\r
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,\r
+ _d2dm_dbus_on_activator_bus_acquired,\r
+ NULL,\r
+ NULL,\r
+ service,\r
+ NULL);\r
+\r
+ service->dbus_id = id;\r
+ service->activation_dbus_id = activation_dbus_id;\r
+\r
+ /* Intiailze DBus sender */\r
+ d2dm_dbus_start(service);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static void _d2dm_dbus_deinit(d2dm_service *service)\r
+{\r
+ d2dm_check_null_ret("service", service);\r
+\r
+ g_bus_unown_name(service->dbus_id);\r
+ g_bus_unown_name(service->activation_dbus_id);\r
+}\r
+\r
+gboolean d2dm_service_interface_init(d2dm_service *service)\r
+{\r
+ guint ret;\r
+ d2dm_check_null_ret_error("service", service, FALSE);\r
+\r
+ __D2DM_LOG_FUNC_ENTER__;\r
+\r
+ /* Initialize dbus interface */\r
+ ret = _d2dm_dbus_interface_init(service);\r
+ if (FALSE == ret) {\r
+ D2DM_LOGE("_d2dm_dbus_interface_init failed!!!");\r
+ return FALSE;\r
+ }\r
+\r
+ __D2DM_LOG_FUNC_EXIT__;\r
+\r
+ return TRUE;\r
+}\r
+\r
+void d2dm_service_interface_deinit(d2dm_service *service)\r
+{\r
+ d2dm_check_null_ret("service", service);\r
+\r
+ /* De-initialize dbus interface */\r
+ _d2dm_dbus_deinit(service);\r
+}\r
+\r
--- /dev/null
+/*\r
+ * Network Configuration Module\r
+ *\r
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ */\r
+#ifndef __D2DM_SERVICE_INTERFACE_H__\r
+#define __D2DM_SERVICE_INTERFACE_H__\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/**< Mesh D-BUS service*/\r
+#define D2DM_DBUS_SERVICE "net.d2dm"\r
+\r
+/**< Mesh D-BUS service path */\r
+#define D2DM_DBUS_PATH "/net/d2dm"\r
+\r
+#ifndef D2DM_DBUS_INTERFACE\r
+#define D2DM_DBUS_INTERFACE "net.d2dm"\r
+#endif\r
+\r
+#ifndef D2DM_DBUS_OBJPATH\r
+#define D2DM_DBUS_OBJPATH "/net/d2dm"\r
+#endif\r
+\r
+#ifndef D2DM_DBUS_ENABLER_OBJPATH\r
+#define D2DM_DBUS_ENABLER_OBJPATH "/net/d2dm/enabler"\r
+#endif\r
+\r
+gboolean d2dm_service_interface_init(d2dm_service *service);\r
+void d2dm_service_interface_deinit(d2dm_service *service);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __D2DM_SERVICE_INTERFACE_H__ */\r
+\r
--- /dev/null
+/*\r
+ * Network Configuration Module\r
+ *\r
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ */\r
+#include <glib.h>\r
+\r
+#include "d2dm.h"\r
+#include "d2dm-log.h"\r
+#include "d2dm-util.h"\r
+\r
+d2dm_service *d2dm_service_new()\r
+{\r
+ d2dm_service *service;\r
+\r
+ service = g_malloc0(sizeof(struct _d2d_service));\r
+\r
+ /* Create g-main loop */\r
+ service->main_loop = g_main_loop_new(NULL, FALSE);\r
+ if (G_UNLIKELY(NULL == service->main_loop)) {\r
+ D2DM_LOGE("g-main loop creation failed!!!");\r
+ g_free(service);\r
+ return NULL;\r
+ }\r
+\r
+ return service;\r
+}\r
+\r
+void d2dm_service_free(d2dm_service *service)\r
+{\r
+ d2dm_check_null_ret("service", service);\r
+\r
+ /* Unref 'g-main loop' */\r
+ if (service->main_loop)\r
+ g_main_loop_unref(service->main_loop);\r
+\r
+ g_free(service);\r
+}\r
+\r
+gboolean d2dm_service_run(d2dm_service *service)\r
+{\r
+ d2dm_check_null_ret_error("service", service, FALSE);\r
+ d2dm_check_null_ret_error("service->main_loop", service->main_loop, FALSE);\r
+\r
+ g_main_loop_run(service->main_loop);\r
+\r
+ return TRUE;\r
+}\r
+\r
+gboolean d2dm_service_exit(d2dm_service *service)\r
+{\r
+ d2dm_check_null_ret_error("service", service, FALSE);\r
+ d2dm_check_null_ret_error("service->main_loop", service->main_loop, FALSE);\r
+\r
+ g_main_loop_quit(service->main_loop);\r
+\r
+ return TRUE;\r
+}\r
--- /dev/null
+/*\r
+ * Network Configuration Module\r
+ *\r
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ */\r
+#ifndef __D2DM_SERVICE_H__\r
+#define __D2DM_SERVICE_H__\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+d2dm_service *d2dm_service_new();\r
+void d2dm_service_free(d2dm_service *service);\r
+gboolean d2dm_service_run(d2dm_service *service);\r
+gboolean d2dm_service_exit(d2dm_service *service);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __D2DM_SERVICE_H__ */\r
+\r
* limitations under the License.
*
*/
-#ifndef __D2D_COMMON_H__
-#define __D2D_COMMON_H__
+#ifndef __D2DM_UTIL_H__
+#define __D2DM_UTIL_H__
#include <glib.h>
#include <unistd.h>
#include <gio/gio.h>
+#include "d2dm-log.h"
+
#define NOTUSED(var) (var = var)
-#define d2dd_check_null_ret_error(name, value, error) do { \
+#define d2dm_check_null_ret_error(name, value, error) do { \
if (G_UNLIKELY(NULL == (value))) { \
- WMESH_LOGE("%s is NULL", name); \
+ D2DM_LOGE("%s is NULL", name); \
return error; \
} \
} while (FALSE)
-#define d2dd_check_null_ret(name, value) do { \
+#define d2dm_check_null_ret(name, value) do { \
if (G_UNLIKELY(NULL == (value))) { \
- WMESH_LOGE("%s is NULL", name); \
+ D2DM_LOGE("%s is NULL", name); \
return; \
} \
} while (FALSE)
-#endif /* __D2D_COMMON_H__ */
+#endif /* __D2DM_UTIL_H__ */
#include <glib.h>
-#include "d2d-common.h"
-#include "d2d-manager.h"
-#include "d2d-manager-log.h"
+#include "d2dm.h"
+#include "d2dm-log.h"
+#include "d2dm-util.h"
+#include "d2dm-service.h"
/**< d2d-manager service */
-d2d_service *d2dsvc;
+d2dm_service *d2dsvc;
int main(int argc, char *argv[])
{
- d2d_service *service = NULL;
+ d2dm_service *service = NULL;
int ret_code = 0;
gboolean ret;
NOTUSED(argv);
D2DM_LOGI("service mainloop start");
-#if 0
+
/* Create d2d-manager service */
d2dsvc = service = d2dm_service_new();
/* Initialize d2d-manager service interface layer */
ret = d2dm_service_interface_init(service);
if (G_UNLIKELY(FALSE == ret)) {
- D2DM_LOGE("wmeshd_service_interface_init failed!");
+ D2DM_LOGE("Service interface init. failed!");
goto END;
}
-
/* Run mesh service */
- ret = wmeshd_service_run(service);
+ ret = d2dm_service_run(service);
if (G_UNLIKELY(FALSE == ret)) {
D2DM_LOGE("Run service failed!");
ret_code = EXIT_FAILURE;
d2dm_service_interface_deinit(service);
d2dm_service_free(service);
d2dsvc = NULL;
-#endif
+
__D2DM_LOG_FUNC_EXIT__;
return 0;
}
\r
/**< Internal error code with mesh daemon. It should be matched with API side */\r
typedef enum {\r
- D2D_ERROR_NONE = 0, /**< Successful */\r
- D2D_ERROR_IO_ERROR, /**< I/O error */\r
- D2D_ERROR_NO_DATA, /**< Data not exists */\r
- D2D_ERROR_OUT_OF_MEMORY, /**< out of memory */\r
- D2D_ERROR_OPERATION_FAILED, /**< operation failed */\r
- D2D_ERROR_INVALID_PARAMETER, /**< Invalid parameter */\r
- D2D_ERROR_ALREADY_REGISTERED, /**< Request already registered */\r
- D2D_ERROR_IN_PROGRESS /**< operation is in progress */\r
-} meshd_error_e;\r
+ D2DM_ERROR_NONE = 0, /**< Successful */\r
+ D2DM_ERROR_IO_ERROR, /**< I/O error */\r
+ D2DM_ERROR_NO_DATA, /**< Data not exists */\r
+ D2DM_ERROR_OUT_OF_MEMORY, /**< out of memory */\r
+ D2DM_ERROR_OPERATION_FAILED, /**< operation failed */\r
+ D2DM_ERROR_INVALID_PARAMETER, /**< Invalid parameter */\r
+ D2DM_ERROR_ALREADY_REGISTERED, /**< Request already registered */\r
+ D2DM_ERROR_IN_PROGRESS /**< operation is in progress */\r
+} d2dm_error_e;\r
\r
/**< mesh service structure */\r
typedef struct _d2d_service {\r
GCancellable *ca; /**< Cancellable object for D-Bus call (Daemon->other) */\r
GList *dbus_sub_ids; /**< The list of subscribed signals */\r
\r
-} d2d_service;\r
+ gboolean d2dp_activated; /**< Whetehr d2d-proxy enabled or not */\r
+ gboolean d2dm_activated; /**< Whether d2d-manager enabled or not */\r
+\r
+} d2dm_service;\r
\r
#endif /* __D2D_MANAGER_H__ */\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>\r
+\r
+<!DOCTYPE node PUBLIC\r
+ "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"\r
+ "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">\r
+\r
+<node>\r
+ <interface name="net.d2dm">\r
+ <!-- Method definitions -->\r
+ <method name="find_peer">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+\r
+ <!-- Signal (D-Bus) definitions -->\r
+ <signal name="proxy_enabled">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="find_peer_done">\r
+ </signal>\r
+ </interface>\r
+</node>\r
"http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
<node>
- <interface name="net.d2d.manager">
+ <interface name="net.d2dm.enabler">
<!-- Method definitions -->
<method name="enable">
<arg type="i" name="result" direction="out"/>
--- /dev/null
+gdbus-codegen --interface-prefix net.d2dm. \
+ --generate-c-code d2dm-generated-code \
+ --c-generate-object-manager \
+ --generate-docbook generated-docs \
+ d2dm.xml \
+ enabler.xml
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-#include "mesh.h"
-#include "mesh-log.h"
-#include "mesh-util.h"
-#include "mesh-service.h"
-#include "mesh-service-interface.h"
-
-/**< mesh service */
-+mesh_service *meshsvc;
-
-int main(int argc, char *argv[])
-{
- mesh_service *service = NULL;
- int ret_code = 0;
- gboolean ret;
-
- __MESH_LOG_FUNC_ENTER__;
-
-#if !GLIB_CHECK_VERSION(2, 32, 0)
- if (!g_thread_supported())
-#if !GLIB_CHECK_VERSION(2, 36, 0)
- g_type_init();
-#endif
- NOTUSED(argc);
- NOTUSED(argv);
-
- MESH_LOGI("service mainloop start");
-
- /* Create mesh service */
- meshsvc = service = meshd_service_new();
-
- /* Initialize mesh service interface layer */
- ret = meshd_service_interface_init(service);
- if (G_UNLIKELY(FALSE == ret)) {
- MESH_LOGE("zigbee_service_interface_init failed!");
- goto END;
- }
-
- /* Run mesh service */
- ret = meshd_service_run(service);
- if (G_UNLIKELY(FALSE == ret)) {
- MESH_LOGE("Run service failed!");
- ret_code = EXIT_FAILURE;
- }
-
- /* Free mesh service */
- meshd_service_free(service);
- meshsvc = NULL;
-
- __MESH_LOG_FUNC_EXIT__;
- return 0;
-}
+++ /dev/null
-gdbus-codegen --interface-prefix net.d2d. \
- --generate-c-code d2d-generated-code \
- --c-generate-object-manager \
- --generate-docbook generated-docs \
- manager.xml
+++ /dev/null
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(d2d-manager-daemon C CXX)
-
-FILE(GLOB SRCS *)
-
-include_directories(${CMAKE_SOURCE_DIR}/src/subownerclient)
-include_directories(${CMAKE_SOURCE_DIR}/src/subownerclient/include)
-
-INCLUDE(FindPkgConfig)
-pkg_check_modules(subownerclient_pkgs REQUIRED glib-2.0 gio-2.0 gio-unix-2.0 dlog dbus-1 iotivity uuid gmock aul)
-
-MESSAGE(" - Adding external C flags")
-FOREACH(flag ${subownerclient_pkgs_CFLAGS})
- SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
- SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fpic")
-SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} -std=gnu++11 -fPIC -fvisibility=hidden")
-SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
-
-ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${subownerclient_pkgs_LDFLAGS})
-INSTALL(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)