ADD_DEFINITIONS("-DTCP_ADAPTER")
MESSAGE(" - Start building src directories")
-ADD_SUBDIRECTORY(src/d2d-manager)
-ADD_SUBDIRECTORY(src/d2d-subowner)
+ADD_SUBDIRECTORY(src/mot-agent)
ADD_SUBDIRECTORY(src/companion-manager)
ADD_SUBDIRECTORY(test)
ADD_SUBDIRECTORY(capi)
Group: Network & Connectivity/Other
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
-Source2: d2dm.service
Source3: %{name}.manifest
Source4: %{name}-devel.manifest
-Source5: net.d2dm.service
Source6: fnm.service
Source7: net.fnm.service
-Source8: d2ds.service
-Source9: net.d2ds.service
+Source8: ma.service
+Source9: net.ma.service
Source10: capi-network-companion.manifest
BuildRequires: cmake
%prep
%setup -q
chmod 644 %{SOURCE0}
-chmod 644 %{SOURCE2}
chmod 644 %{SOURCE3}
chmod 644 %{SOURCE4}
-chmod 644 %{SOURCE5}
chmod 644 %{SOURCE6}
chmod 644 %{SOURCE7}
chmod 644 %{SOURCE8}
chmod 644 %{SOURCE9}
chmod 644 %{SOURCE10}
-cp %{SOURCE2} .
cp %{SOURCE3} .
cp %{SOURCE4} .
-cp %{SOURCE5} .
cp %{SOURCE6} .
cp %{SOURCE7} .
cp %{SOURCE8} .
%make_install
mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services/
-cp %{SOURCE5} %{buildroot}%{_datadir}/dbus-1/system-services/net.d2dm.service
-mkdir -p %{buildroot}%{_unitdir}
-cp %{SOURCE2} %{buildroot}%{_unitdir}/d2dm.service
cp %{SOURCE7} %{buildroot}%{_datadir}/dbus-1/system-services/net.fnm.service
mkdir -p %{buildroot}%{_unitdir}
cp %{SOURCE6} %{buildroot}%{_unitdir}/fnm.service
-cp %{SOURCE9} %{buildroot}%{_datadir}/dbus-1/system-services/net.d2ds.service
+cp %{SOURCE9} %{buildroot}%{_datadir}/dbus-1/system-services/net.ma.service
mkdir -p %{buildroot}%{_unitdir}
-cp %{SOURCE8} %{buildroot}%{_unitdir}/d2ds.service
+cp %{SOURCE8} %{buildroot}%{_unitdir}/ma.service
cp test/oic_svr_db_client.dat oic_svr_db_subowner_client.dat
%postun
-rm -rf %{NETWORK_FW_DATADIR}/oic_pdm_d2ds.db
-rm -rf %{NETWORK_FW_DATADIR}/oic_pdm_d2ds.db-journal
+rm -rf %{NETWORK_FW_DATADIR}/oic_pdm_ma.db
+rm -rf %{NETWORK_FW_DATADIR}/oic_pdm_ma.db-journal
%files
%manifest %{name}.manifest
%license LICENSE
%defattr(-,root,root,-)
-%{_bindir}/%{name}
-%{_bindir}/d2d-subowner
+%{_bindir}/mot-agent
%{_bindir}/companion-manager
%attr(644,root,root) %{_datadir}/dbus-1/system-services/*
-%attr(644,root,root) %{_unitdir}/d2dm.service
%attr(644,root,root) %{_unitdir}/fnm.service
-%attr(644,root,root) %{_unitdir}/d2ds.service
-%attr(644,network_fw,network_fw) %{NETWORK_FW_DATADIR}/oic_svr_db_d2ds.dat
+%attr(644,root,root) %{_unitdir}/ma.service
+%attr(644,network_fw,network_fw) %{NETWORK_FW_DATADIR}/oic_svr_db_ma.dat
%attr(644,network_fw,network_fw) %{NETWORK_FW_DATADIR}/oic_svr_db_comp_manager.dat
%files devel
+++ /dev/null
-[Unit]
-Description=OCF D2D Manager
-Requires=dbus.socket
-After=dbus.socket
-
-[Service]
-Type=dbus
-User=network_fw
-Group=network_fw
-BusName=net.d2dm.enabler
-SmackProcessLabel=System
-ExecStart=/usr/bin/d2d-manager
+++ /dev/null
-[Unit]
-Description=OCF D2D Sub-Owner Client
-Requires=dbus.socket
-After=dbus.socket
-
-[Service]
-Type=dbus
-User=network_fw
-Group=network_fw
-BusName=net.d2ds.enabler
-SmackProcessLabel=System
-ExecStart=/usr/bin/d2d-subowner
--- /dev/null
+[Unit]
+Description=OCF MOT Agent
+Requires=dbus.socket
+After=dbus.socket
+
+[Service]
+Type=dbus
+User=network_fw
+Group=network_fw
+BusName=net.ma.enabler
+SmackProcessLabel=System
+ExecStart=/usr/bin/mot-agent
+++ /dev/null
-[D-BUS Service]
-Name=net.d2dm.enabler
-
-Exec=/bin/false
-User=network_fw
-Group=network_fw
-SystemdService=d2dm.service
+++ /dev/null
-[D-BUS Service]
-Name=net.d2ds.enabler
-
-Exec=/bin/false
-User=network_fw
-Group=network_fw
-SystemdService=d2ds.service
--- /dev/null
+[D-BUS Service]
+Name=net.ma.enabler
+
+Exec=/bin/false
+User=network_fw
+Group=network_fw
+SystemdService=ma.service
"rt": ["core.comp.device"],\r
"if": ["oic.if.baseline"]\r
}, {\r
- "href": "/comp/operation",\r
+ "href": "/comp/operation",\r
"rel": "",\r
"rt": ["core.comp.operation"],\r
"if": ["oic.if.baseline"]\r
- }\r
+ }\r
],\r
"permission": 31\r
},\r
#include <comp_log.h>
#include <comp_enum.h>
-#define AGENT_SERVER_NAME "net.d2ds"
-#define AGENT_OBJECT_PATH "/net/d2ds"
-#define AGENT_SERVICE_INTERFACE "net.d2ds"
+#define AGENT_SERVER_NAME "net.ma"
+#define AGENT_OBJECT_PATH "/net/ma"
+#define AGENT_SERVICE_INTERFACE "net.ma"
-#define AGENT_ENABLER_NAME "net.d2ds.enabler"
-#define AGENT_ENABLER_OBJ_PATH "/net/d2ds/enabler"
-#define AGENT_ENABLER_INTERFACE "net.d2ds.enabler"
+#define AGENT_ENABLER_NAME "net.ma.enabler"
+#define AGENT_ENABLER_OBJ_PATH "/net/ma/enabler"
+#define AGENT_ENABLER_INTERFACE "net.ma.enabler"
#define NOTUSED(var) (var = var)
+++ /dev/null
-MESSAGE("===================================================================")
-MESSAGE("Building...d2d-manager")
-MESSAGE("===================================================================")
-
-SET(INTROSPECTION_PATH ${CMAKE_CURRENT_SOURCE_DIR}/introspection)
-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")
-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})
-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 _d2dm_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
- _d2dm_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
+++ /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
-#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
+++ /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 __D2D_LOG_H__\r
-#define __D2D_LOG_H__\r
-\r
-#ifdef LOG_TAG\r
-#undef LOG_TAG\r
-#endif\r
-\r
-#ifdef USE_DLOG\r
-#include <dlog.h>\r
-\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_LOGI(format, args...) LOGI(format, ##args)\r
-#define D2DM_LOGW(format, args...) LOGW(format, ##args)\r
-#define D2DM_LOGE(format, args...) LOGE(format, ##args)\r
-#define D2DM_LOGF(format, args...) LOGF(format, ##args)\r
-\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, 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
-#define D2DM_LOGV(format, args...)\r
-#define D2DM_LOGD(format, args...)\r
-#define D2DM_LOGI(format, args...)\r
-#define D2DM_LOGW(format, args...)\r
-#define D2DM_LOGE(format, args...)\r
-#define D2DM_LOGF(format, args...)\r
-\r
-#define __D2DM_LOG_FUNC_ENTER__\r
-#define __D2DM_LOG_FUNC_EXIT__\r
-\r
-#define D2DM_SECLOGI(format, args...)\r
-#define D2DM_SECLOGD(format, args...)\r
-\r
-#endif /* USE_DLOG */\r
-\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-gdbus.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
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * 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.
- *
- */
-#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 d2dm_check_null_ret_error(name, value, error) do { \
- if (G_UNLIKELY(NULL == (value))) { \
- D2DM_LOGE("%s is NULL", name); \
- return error; \
- } \
-} while (FALSE)
-
-#define d2dm_check_null_ret(name, value) do { \
- if (G_UNLIKELY(NULL == (value))) { \
- D2DM_LOGE("%s is NULL", name); \
- return; \
- } \
-} while (FALSE)
-
-#endif /* __D2DM_UTIL_H__ */
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * 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 <string.h>
-
-#include <glib.h>
-
-#include "d2dm.h"
-#include "d2dm-log.h"
-#include "d2dm-util.h"
-#include "d2dm-service.h"
-#include "d2dm-service-interface.h"
-
-/**< d2d-manager service */
-d2dm_service *d2dsvc;
-
-int main(int argc, char *argv[])
-{
- d2dm_service *service = NULL;
- int ret_code = 0;
- gboolean ret;
-
- __D2DM_LOG_FUNC_ENTER__;
-
-#if !GLIB_CHECK_VERSION(2, 32, 0)
- if (!g_thread_supported())
- g_thread_init(NULL);
-#endif
-
-#if !GLIB_CHECK_VERSION(2, 36, 0)
- g_type_init();
-#endif
- NOTUSED(argc);
- NOTUSED(argv);
-
- D2DM_LOGI("service mainloop start");
-
- /* 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("Service interface init. failed!");
- ret_code = EXIT_FAILURE;
- goto END;
- }
- /* Run d2d-manager service */
- ret = d2dm_service_run(service);
- if (G_UNLIKELY(FALSE == ret)) {
- D2DM_LOGE("Run service failed!");
- ret_code = EXIT_FAILURE;
- }
-
-END:
- /* Free d2d-manager service */
- d2dm_service_interface_deinit(service);
- d2dm_service_free(service);
- d2dsvc = NULL;
-
- __D2DM_LOG_FUNC_EXIT__;
- return ret_code;
-}
-
+++ /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 __D2D_MANAGER_H__\r
-#define __D2D_MANAGER_H__\r
-\r
-#include <glib.h>\r
-#include <gio/gio.h>\r
-#include <tizen.h>\r
-\r
-/**< Internal error code with d2dm daemon. It should be matched with API side */\r
-typedef enum {\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
-/**< d2d-manager service structure */\r
-typedef struct _d2d_service {\r
- GMainLoop *main_loop; /**< Service main-loop */\r
- guint dbus_id; /**< D-Bus id */\r
- guint activation_dbus_id; /**< D-Bus id for activation */\r
-\r
- gpointer connection; /**< Connection handle for D-Bus call to other process */\r
- GCancellable *ca; /**< Cancellable object for D-Bus call (Daemon->other) */\r
- GList *dbus_sub_ids; /**< The list of subscribed signals */\r
-\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
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!DOCTYPE node PUBLIC
- "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
- "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
-
-<node>
- <interface name="net.d2dm.enabler">
- <!-- Method definitions -->
- <method name="enable">
- <arg type="i" name="result" direction="out"/>
- </method>
- <method name="disable">
- <arg type="i" name="result" direction="out"/>
- </method>
- </interface>
-</node>
+++ /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
-MESSAGE("===================================================================")
-MESSAGE("Building...subowner client")
-MESSAGE("===================================================================")
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/include/cjson)
-
-SET(INTROSPECTION_PATH ${CMAKE_CURRENT_SOURCE_DIR}/introspection)
-ADD_CUSTOM_COMMAND(
- OUTPUT dbus1
- COMMAND gdbus-codegen
- --interface-prefix net.d2ds.
- --generate-c-code d2ds-generated-code
- --c-generate-object-manager
- --generate-docbook generated-docs
- ${INTROSPECTION_PATH}/d2ds.xml
- ${INTROSPECTION_PATH}/enabler.xml
- COMMENT "Generating d2ds GDBus .c/.h"
-)
-
-MESSAGE(" - Check cmake packagesion")
-pkg_check_modules(d2ds_pkgs REQUIRED ${COMMON_DEPS} ${TIZEN_DEPS}
- capi-network-wifi-manager
- sqlite3
- )
-
-ADD_CUSTOM_TARGET(GENERATED_D2DS_DBUS_CODE DEPENDS dbus1)
-MESSAGE(" - Set source folder")
-FILE(GLOB SUBOWNER_SRCS *.c)
-SET(SUBOWNER_SRCS ${SUBOWNER_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/d2ds-generated-code.c)
-SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/d2ds-generated-code.c PROPERTIES GENERATED TRUE)
-
-INCLUDE_DIRECTORIES(${d2ds_pkgs_INCLUDE_DIRS})
-LINK_DIRECTORIES(${d2ds_pkgs_LIBRARY_DIRS})
-
-SET(SUBOWNER "d2d-subowner")
-ADD_EXECUTABLE(${SUBOWNER} ${SUBOWNER_SRCS})
-ADD_DEPENDENCIES(${SUBOWNER} GENERATED_D2DS_DBUS_CODE)
-TARGET_LINK_LIBRARIES(${SUBOWNER} ${d2ds_pkgs_LIBRARIES} pthread)
-INSTALL(TARGETS ${SUBOWNER} DESTINATION bin)
-INSTALL(FILES oic_svr_db_d2ds.dat DESTINATION ${NETWORK_FW_DATADIR})
+++ /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 __D2DS_LOG_H__\r
-#define __D2DS_LOG_H__\r
-\r
-#ifdef LOG_TAG\r
-#undef LOG_TAG\r
-#endif\r
-\r
-#ifdef USE_DLOG\r
-#include <dlog.h>\r
-\r
-#undef LOG_TAG\r
-#define LOG_TAG "D2D_SUBOWNER"\r
-\r
-#define D2DS_LOGV(format, args...) LOGV(format, ##args)\r
-#define D2DS_LOGD(format, args...) LOGD(format, ##args)\r
-#define D2DS_LOGI(format, args...) LOGI(format, ##args)\r
-#define D2DS_LOGW(format, args...) LOGW(format, ##args)\r
-#define D2DS_LOGE(format, args...) LOGE(format, ##args)\r
-#define D2DS_LOGF(format, args...) LOGF(format, ##args)\r
-\r
-#define __D2DS_LOG_FUNC_ENTER__ LOGD("Enter")\r
-#define __D2DS_LOG_FUNC_EXIT__ LOGD("Quit")\r
-\r
-#define D2DS_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, D2DS_LOG_TAG, format, ##args)\r
-#define D2DS_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, D2DS_LOG_TAG, format, ##args)\r
-\r
-#else /* USE_DLOG */\r
-\r
-#define D2DS_LOGV(format, args...)\r
-#define D2DS_LOGD(format, args...)\r
-#define D2DS_LOGI(format, args...)\r
-#define D2DS_LOGW(format, args...)\r
-#define D2DS_LOGE(format, args...)\r
-#define D2DS_LOGF(format, args...)\r
-\r
-#define __D2DS_LOG_FUNC_ENTER__\r
-#define __D2DS_LOG_FUNC_EXIT__\r
-\r
-#define D2DS_SECLOGI(format, args...)\r
-#define D2DS_SECLOGD(format, args...)\r
-\r
-#endif /* USE_DLOG */\r
-\r
-#endif /* __D2DS_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 "d2ds.h"\r
-#include "d2ds-log.h"\r
-#include "d2ds-util.h"\r
-#include "d2ds-service.h"\r
-#include "d2ds-subowner.h"\r
-#include "d2ds-service-interface.h"\r
-#include "d2ds-generated-code.h"\r
-\r
-static NetD2ds *d2ds_dbus_object;\r
-static Enabler *d2ds_activator_dbus_object;\r
-\r
-/* global list to care resource handle for each client */\r
-static GList *d2ds_dbus_client_list;\r
-static GMutex d2ds_dbus_client_list_mutex;\r
-\r
-typedef struct _d2ds_dbus_client_s {\r
- gchar *bus_name;\r
-} d2ds_dbus_client_s;\r
-\r
-NetD2ds* d2ds_dbus_get_object()\r
-{\r
- return d2ds_dbus_object;\r
-}\r
-\r
-static int _d2ds_dbus_client_list_cleanup(GList *client_list)\r
-{\r
- d2ds_dbus_client_s *client;\r
-\r
- d2ds_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 D2DS_ERROR_NONE;\r
-}\r
-\r
-static int _d2ds_dbus_client_list_compare_bus_name(const void *a, const void *b)\r
-{\r
- const d2ds_dbus_client_s *client = a;\r
- return g_strcmp0(client->bus_name, b);\r
-}\r
-\r
-static inline GList* _d2ds_dbus_client_list_find_client(const gchar *owner)\r
-{\r
- return g_list_find_custom(d2ds_dbus_client_list, owner,\r
- _d2ds_dbus_client_list_compare_bus_name);\r
-}\r
-\r
-static void _d2ds_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(&d2ds_dbus_client_list_mutex);\r
- client = _d2ds_dbus_client_list_find_client(old_owner);\r
- if (client) { /* found bus name in our bus list */\r
- D2DS_LOGD("bus(%s) stopped", old_owner);\r
- d2ds_dbus_client_list = g_list_remove_link(d2ds_dbus_client_list, client);\r
- }\r
- g_mutex_unlock(&d2ds_dbus_client_list_mutex);\r
-\r
- if (client) {\r
- ret = _d2ds_dbus_client_list_cleanup(client);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("_d2ds_dbus_client_list_cleanup() Fail(%d)", ret);\r
- }\r
- }\r
-}\r
-\r
-static int _d2ds_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
- _d2ds_dbus_name_owner_changed_cb,\r
- NULL,\r
- NULL);\r
- if (0 == id) {\r
- D2DS_LOGE("g_dbus_connection_signal_subscribe() Fail");\r
- return D2DS_ERROR_IO_ERROR;\r
- }\r
-\r
- return D2DS_ERROR_NONE;\r
-}\r
-\r
-\r
-static gboolean _d2ds_dbus_handle_disc_mot_enb_devs(NetD2ds *object,\r
- GDBusMethodInvocation *invocation,\r
- gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
- ret = d2ds_request_disc_mot_enb_devs(service);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_disc_mot_enb_devs !");\r
-\r
- net_d2ds_complete_disc_mot_enb_devs(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_disc_mowned_devs(NetD2ds *object,\r
- GDBusMethodInvocation *invocation,\r
- gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
-\r
- ret = d2ds_request_disc_owned_devs(service);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_disc_owned_devs !");\r
-\r
- net_d2ds_complete_disc_mowned_devs(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_mot(NetD2ds *object,\r
- GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_pin, gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
-\r
- ret = d2ds_request_mot(service, arg_target, arg_pin);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_disc_moted_devs !");\r
-\r
- net_d2ds_complete_mot(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_remove_mo(NetD2ds *object,\r
- GDBusMethodInvocation *invocation, gchar *arg_target, gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
-\r
- ret = d2ds_request_remove_mo(service, arg_target);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_remove_mo !");\r
-\r
- net_d2ds_complete_remove_mo(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-static gboolean _d2ds_dbus_handle_acl(NetD2ds *object,\r
- GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_subject, gchar *arg_uri,\r
- gchar *arg_rt, gchar *arg_interface, gint arg_permission, gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
-\r
- ret = d2ds_request_prov_acl(service, arg_target, arg_subject, arg_uri, arg_rt, arg_interface, arg_permission);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_prov_acl !");\r
-\r
- net_d2ds_complete_acl(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_cred(NetD2ds *object,\r
- GDBusMethodInvocation *invocation, gchar *arg_dev1, gchar *arg_dev2, gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
-\r
- ret = d2ds_request_prov_cred(service, arg_dev1, arg_dev2);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_prov_cred !");\r
-\r
- net_d2ds_complete_cred(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_get_ownerid(NetD2ds *object,\r
- GDBusMethodInvocation *invocation,\r
- gpointer user_data)\r
-{\r
- gchar *uuid_str = NULL;\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
- ret = d2ds_request_get_ownerid(service, &uuid_str);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_get_ownerid = %d", ret);\r
-\r
- net_d2ds_complete_get_ownerid(object, invocation, uuid_str, ret);\r
-\r
- if (uuid_str)\r
- g_free(uuid_str);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_pairwise(NetD2ds *object,\r
- GDBusMethodInvocation *invocation, gchar *target_1,\r
- gchar *subject_1, gchar *uri_1, gchar *rt_1,\r
- gchar *interface_1, int permission_1, gchar *target_2,\r
- gchar *subject_2, gchar *uri_2, gchar *rt_2,\r
- gchar *interface_2, int permission_2, gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
-\r
- ret = d2ds_request_pairwise(service, target_1, subject_1, uri_1, rt_1,\r
- interface_1, permission_1, target_2, subject_2, uri_2,\r
- rt_2, interface_2, permission_2);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_pairwise = %d", ret);\r
-\r
- net_d2ds_complete_pairwise(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_unpair(NetD2ds *object,\r
- GDBusMethodInvocation *invocation, gchar *uuid_dev, gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
- ret = d2ds_request_unpair(service, uuid_dev);\r
- if (D2DS_ERROR_NONE != ret)\r
- D2DS_LOGE("Failed to d2ds_request_unpair = %d", ret);\r
-\r
- net_d2ds_complete_unpair(object, invocation, ret);\r
-\r
- return TRUE;\r
-}\r
-\r
-static void _d2ds_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,\r
- gpointer user_data)\r
-{\r
- gboolean ret;\r
- GError *error = NULL;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- NOTUSED(name);\r
-\r
- d2ds_dbus_object = net_d2ds_skeleton_new();\r
- if (NULL == d2ds_dbus_object) {\r
- D2DS_LOGE("net_d2ds_skeleton_new() Fail");\r
- return;\r
- }\r
-\r
- g_signal_connect(d2ds_dbus_object, "handle-disc-mot-enb-devs",\r
- G_CALLBACK(_d2ds_dbus_handle_disc_mot_enb_devs), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-disc-mowned-devs",\r
- G_CALLBACK(_d2ds_dbus_handle_disc_mowned_devs), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-mot",\r
- G_CALLBACK(_d2ds_dbus_handle_mot), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-remove-mo",\r
- G_CALLBACK(_d2ds_dbus_handle_remove_mo), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-acl",\r
- G_CALLBACK(_d2ds_dbus_handle_acl), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-cred",\r
- G_CALLBACK(_d2ds_dbus_handle_cred), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-get-ownerid",\r
- G_CALLBACK(_d2ds_dbus_handle_get_ownerid), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-pairwise",\r
- G_CALLBACK(_d2ds_dbus_handle_pairwise), service);\r
- g_signal_connect(d2ds_dbus_object, "handle-unpair",\r
- G_CALLBACK(_d2ds_dbus_handle_unpair), service);\r
-\r
- ret = g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(d2ds_dbus_object),\r
- conn, D2DS_DBUS_OBJPATH, &error);\r
- if (FALSE == ret) {\r
- D2DS_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);\r
- g_error_free(error);\r
- }\r
-\r
- ret = _d2ds_dbus_subscribe_name_owner_changed(conn);\r
- if (D2DS_ERROR_NONE != ret) {\r
- D2DS_LOGE("_d2ds_dbus_subscribe_name_owner_changed() Fail(%d)", ret);\r
- return;\r
- }\r
-}\r
-\r
-static void _d2ds_dbus_on_name_lost(GDBusConnection *conn, const gchar *name,\r
- gpointer user_data)\r
-{\r
- NOTUSED(conn);\r
- NOTUSED(user_data);\r
-\r
- D2DS_LOGD("Lost the name %s", name);\r
-}\r
-\r
-static void _d2ds_dbus_on_name_acquired(GDBusConnection *conn, const gchar *name,\r
- gpointer user_data)\r
-{\r
- NOTUSED(conn);\r
- NOTUSED(user_data);\r
-\r
- D2DS_LOGD("Acquired the name %s", name);\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_enable(Enabler *object,\r
- GDBusMethodInvocation *invocation,\r
- gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- __D2DS_LOG_FUNC_ENTER__;\r
-\r
- /* Do API response first */\r
- enabler_complete_enable(object, invocation, ret);\r
- service->d2ds_activated = TRUE;\r
-\r
- /* Intialize subowner client */\r
- ret = d2ds_request_enable(service);\r
- if (D2DS_ERROR_NONE != ret) {\r
- D2DS_LOGE("d2ds_request_enable() Fail(%d)", ret);\r
- return FALSE;\r
- }\r
-\r
- /* Notify d2ds enabled */\r
- net_d2ds_emit_subowner_enabled(d2ds_dbus_get_object(), ret);\r
-\r
- __D2DS_LOG_FUNC_EXIT__;\r
-\r
- return TRUE;\r
-}\r
-\r
-static gboolean _d2ds_dbus_handle_disable(Enabler *object,\r
- GDBusMethodInvocation *invocation,\r
- gpointer user_data)\r
-{\r
- int ret = D2DS_ERROR_NONE;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- __D2DS_LOG_FUNC_ENTER__;\r
-\r
- /* Make response first */\r
- enabler_complete_disable(object, invocation, ret);\r
-\r
- /* De-Intialize subowner client */\r
- ret = d2ds_request_disable(service);\r
- if (D2DS_ERROR_NONE != ret) {\r
- D2DS_LOGE("d2ds_request_disable() Fail(%d)", ret);\r
- return FALSE;\r
- }\r
-\r
- /* Terminate daemon */\r
- d2ds_service_exit(service);\r
-\r
- return TRUE;\r
-}\r
-\r
-static void _d2ds_dbus_on_activator_bus_acquired(GDBusConnection *conn,\r
- const gchar *name, gpointer user_data)\r
-{\r
- gboolean ret;\r
- GError *error = NULL;\r
- d2ds_service *service = (d2ds_service *)user_data;\r
-\r
- NOTUSED(name);\r
-\r
- __D2DS_LOG_FUNC_ENTER__;\r
-\r
- d2ds_activator_dbus_object = enabler_skeleton_new();\r
- if (NULL == d2ds_activator_dbus_object) {\r
- D2DS_LOGE("enabler_skeleton_new() Fail");\r
- return;\r
- }\r
-\r
- g_signal_connect(d2ds_activator_dbus_object, "handle-enable",\r
- G_CALLBACK(_d2ds_dbus_handle_enable), service);\r
- g_signal_connect(d2ds_activator_dbus_object, "handle-disable",\r
- G_CALLBACK(_d2ds_dbus_handle_disable), service);\r
-\r
- ret = g_dbus_interface_skeleton_export(\r
- G_DBUS_INTERFACE_SKELETON(d2ds_activator_dbus_object),\r
- conn, D2DS_DBUS_ENABLER_OBJPATH, &error);\r
- if (FALSE == ret) {\r
- D2DS_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);\r
- g_error_free(error);\r
- }\r
-\r
- __D2DS_LOG_FUNC_EXIT__;\r
-\r
-}\r
-\r
-static gboolean _d2ds_dbus_interface_init(d2ds_service *service)\r
-{\r
- guint id;\r
- guint activation_dbus_id;\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
- id = g_bus_own_name(G_BUS_TYPE_SYSTEM,\r
- D2DS_DBUS_INTERFACE,\r
- G_BUS_NAME_OWNER_FLAGS_REPLACE,\r
- _d2ds_dbus_on_bus_acquired,\r
- _d2ds_dbus_on_name_acquired,\r
- _d2ds_dbus_on_name_lost,\r
- service,\r
- NULL);\r
- if (0 == id) {\r
- D2DS_LOGE("g_bus_own_name() Fail");\r
- return FALSE;\r
- }\r
-\r
- /* Get D-Bus owner to activate subowner service daemon */\r
- activation_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,\r
- D2DS_DBUS_INTERFACE".enabler",\r
- G_BUS_NAME_OWNER_FLAGS_REPLACE,\r
- _d2ds_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
- return TRUE;\r
-}\r
-\r
-void d2ds_notify_mot_env_devs(GVariant *devices)\r
-{\r
- /* Notify d2ds enabled */\r
- net_d2ds_emit_disc_mot_enb_devs_done(d2ds_dbus_get_object(), devices);\r
-}\r
-\r
-void d2ds_notify_mowned_devs(GVariant *devices)\r
-{\r
- /* Notify d2ds enabled */\r
- net_d2ds_emit_disc_mowned_devs_done(d2ds_dbus_get_object(), devices);\r
-}\r
-\r
-static void _d2ds_dbus_deinit(d2ds_service *service)\r
-{\r
- d2ds_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 d2ds_service_interface_init(d2ds_service *service)\r
-{\r
- guint ret;\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
-\r
- __D2DS_LOG_FUNC_ENTER__;\r
-\r
- /* Initialize dbus interface */\r
- ret = _d2ds_dbus_interface_init(service);\r
- if (FALSE == ret) {\r
- D2DS_LOGE("%s failed!!!", __func__);\r
- return FALSE;\r
- }\r
-\r
- __D2DS_LOG_FUNC_EXIT__;\r
-\r
- return TRUE;\r
-}\r
-\r
-void d2ds_service_interface_deinit(d2ds_service *service)\r
-{\r
- d2ds_check_null_ret("service", service);\r
-\r
- /* De-initialize dbus interface */\r
- _d2ds_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 __D2DS_SERVICE_INTERFACE_H__\r
-#define __D2DS_SERVICE_INTERFACE_H__\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/**< Mesh D-BUS service*/\r
-#define D2DS_DBUS_SERVICE "net.d2ds"\r
-\r
-/**< Mesh D-BUS service path */\r
-#define D2DS_DBUS_PATH "/net/d2ds"\r
-\r
-#ifndef D2DS_DBUS_INTERFACE\r
-#define D2DS_DBUS_INTERFACE "net.d2ds"\r
-#endif\r
-\r
-#ifndef D2DS_DBUS_OBJPATH\r
-#define D2DS_DBUS_OBJPATH "/net/d2ds"\r
-#endif\r
-\r
-#ifndef D2DS_DBUS_ENABLER_OBJPATH\r
-#define D2DS_DBUS_ENABLER_OBJPATH "/net/d2ds/enabler"\r
-#endif\r
-\r
-struct _NetD2ds;\r
-typedef struct _NetD2ds NetD2ds;\r
-\r
-NetD2ds* d2ds_dbus_get_object();\r
-gboolean d2ds_service_interface_init(d2ds_service *service);\r
-void d2ds_service_interface_deinit(d2ds_service *service);\r
-void d2ds_notify_mot_env_devs(GVariant *devices);\r
-void d2ds_notify_mowned_devs(GVariant *devices);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* __D2DS_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 "d2ds.h"\r
-#include "d2ds-log.h"\r
-#include "d2ds-util.h"\r
-\r
-d2ds_service *d2ds_service_new()\r
-{\r
- d2ds_service *service;\r
-\r
- service = g_malloc0(sizeof(struct _d2ds_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
- D2DS_LOGE("g-main loop creation failed!!!");\r
- g_free(service);\r
- return NULL;\r
- }\r
-\r
- return service;\r
-}\r
-\r
-void d2ds_service_free(d2ds_service *service)\r
-{\r
- d2ds_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 d2ds_service_run(d2ds_service *service)\r
-{\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
- d2ds_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 d2ds_service_exit(d2ds_service *service)\r
-{\r
- d2ds_check_null_ret_error("service", service, FALSE);\r
- d2ds_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 __D2DS_SERVICE_H__\r
-#define __D2DS_SERVICE_H__\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-d2ds_service* d2ds_service_new();\r
-void d2ds_service_free(d2ds_service *service);\r
-gboolean d2ds_service_run(d2ds_service *service);\r
-gboolean d2ds_service_exit(d2ds_service *service);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* __D2DS_SERVICE_H__ */\r
-\r
+++ /dev/null
-/******************************************************************
- *
- * Copyright 2016 Samsung Electronics 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 <errno.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <glib.h>
-#include <gio/gio.h>
-
-#include <iotivity_config.h>
-#include <platform_features.h>
-#include <utlist.h>
-#include <oic_malloc.h>
-#include <ocprovisioningmanager.h>
-#include <oxmjustworks.h>
-#include <oxmrandompin.h>
-#include <srmutility.h>
-#include <securevirtualresourcetypes.h>
-#include <security/srmutility.h>
-#include <pmtypes.h>
-#include <pmutility.h>
-
-#include <wifi-manager.h>
-#include <tzplatform_config.h>
-
-#include "d2ds.h"
-#include "d2ds-log.h"
-#include "d2ds-util.h"
-#include "d2ds-subowner.h"
-#include "d2ds-service-interface.h"
-#include "d2ds-generated-code.h"
-#include "magent-db.h"
-
-#define WIFI_MAC_ADDR_LENGTH 17
-
-#define MAX_FILE_PATH_LEN 1024
-#define ACL_RESRC_MAX_LEN 128
-
-/*This value is used only for sample (not OCF spec) */
-#define ACL_RESRC_ARRAY_SIZE 3
-
-#define DISCOVERY_TIMEOUT 3 /**< 3 sec */
-#define CALLBACK_TIMEOUT_10S 10 * 1000 /**< 10 sec = 10 * 1000 * 1ms */
-#define CALLBACK_TIMEOUT_5S 5 * 1000 /**< 5sec = 5 * 1000 * 1ms */
-
-#define TIMEOUT_USED
-
-/* '_' for separaing from the same constant variable in srmresourcestrings.c */
-static const char* SVR_DB_FILE_NAME = "oic_svr_db_d2ds.dat";
-static const char* PRVN_DB_FILE_NAME = "oic_pdm_d2ds.db";
-
-#ifdef TEST
-static const OicSecPrm_t SUPPORTED_PRMS[2] = { PRM_PRE_CONFIGURED, PRM_RANDOM_PIN };
-#endif
-
-OCStackResult GetDoxmDevOwnerId(OicUuid_t *devownerid);
-
-typedef struct {
- d2ds_cmd_id_e cid; /**< Command ID */
- int tid; /**< Timer ID */
- GThread *thread; /**< Thread handle */
- unsigned int sid; /**< Subcribed signal ID */
- bool found; /**< Whether we discoverd devices */
- void *cb; /**< Callback function pointer */
- void *userdata; /**< User data */
-
- /* To-Do : Change belows to union type */
-
- /* For MOT */
- gchar *uuid_target_str; /**< Target device*/
- gchar *pin; /**< PIN */
-
- /* For ACL provisioning */
- gchar *uuid_subject_str;/**< Subject device for ACL */
- gchar *rsrc_uri; /**< Resource URI */
- gchar *rsrc_type; /**< Resouce Type */
- gchar *rsrc_interface; /**< Resource Interface Array To-Do : Make this as array */
- int permission;/**< Permision */
-
- /* For CRED provisioning */
- gchar *uuid_dev1; /**< 1st device for CRED provisiong */
- gchar *uuid_dev2; /**< 2nd device for CRED provisiong */
-
- /* For Pairwaise linking */
- gchar *target_1; /**< Target device 1*/
- gchar *target_2; /**< Target device 1*/
-
- gchar *subject_1; /**< Target device for ACL */
- gchar *rsrc_uri_1; /**< Resource URI */
- gchar *rsrc_type_1; /**< Resouce Type */
- gchar *rsrc_interface_1; /**< Resource Interface Array To-Do : Make this as array */
- int permission_1;/**< Permision */
- gchar *subject_2; /**< Target device for ACL */
- gchar *rsrc_uri_2; /**< Resource URI */
- gchar *rsrc_type_2; /**< Resouce Type */
- gchar *rsrc_interface_2; /**< Resource Interface Array To-Do : Make this as array */
- int permission_2;/**< Permision */
-
- /* For unpair */
- gchar *target_to_revoke; /**< Target device to revoke */
-
-} d2ds_req_cb_s;
-
-typedef struct _d2ds_subowner {
- OCProvisionDev_t* g_motdev_list; /**< Discoverd MOT enabled devices list */
- OCProvisionDev_t* g_mowned_list; /**< My owned MOT enabled devices list */
-
- int g_motdev_cnt; /**< Number of MOT enabled devices */
- int g_mowndev_cnt; /**< Number of my owned MOT enabled devices */
-
- bool g_doneCB; /**< This means callback completed or not */
-
- char *rnd_pin; /**< Random PIN */
- int rnd_pin_len; /**< Random PIN length */
-
-} d2ds_subowner_s;
-
-d2ds_subowner_s *g_client;
-
-#define CASE_TO_STR(x) case x: return #x;
-const char* _error_to_string(OCStackResult err)
-{
- switch (err) {
- /* CHECK: List all enum values here */
- CASE_TO_STR(OC_STACK_OK)
- CASE_TO_STR(OC_STACK_RESOURCE_CREATED)
- CASE_TO_STR(OC_STACK_RESOURCE_DELETED)
- CASE_TO_STR(OC_STACK_CONTINUE)
- CASE_TO_STR(OC_STACK_RESOURCE_CHANGED)
- CASE_TO_STR(OC_STACK_INVALID_URI)
- CASE_TO_STR(OC_STACK_INVALID_QUERY)
- CASE_TO_STR(OC_STACK_INVALID_IP)
- CASE_TO_STR(OC_STACK_INVALID_PORT)
- CASE_TO_STR(OC_STACK_INVALID_CALLBACK)
- CASE_TO_STR(OC_STACK_INVALID_METHOD)
- CASE_TO_STR(OC_STACK_INVALID_PARAM)
- CASE_TO_STR(OC_STACK_INVALID_OBSERVE_PARAM)
-
-
- CASE_TO_STR(OC_STACK_NO_MEMORY)
- CASE_TO_STR(OC_STACK_COMM_ERROR)
- CASE_TO_STR(OC_STACK_TIMEOUT)
- CASE_TO_STR(OC_STACK_ADAPTER_NOT_ENABLED)
- CASE_TO_STR(OC_STACK_NOTIMPL)
- CASE_TO_STR(OC_STACK_RESOURCE_ERROR)
- CASE_TO_STR(OC_STACK_SLOW_RESOURCE)
- CASE_TO_STR(OC_STACK_DUPLICATE_REQUEST)
- CASE_TO_STR(OC_STACK_OBSERVER_NOT_FOUND)
- CASE_TO_STR(OC_STACK_VIRTUAL_DO_NOT_HANDLE)
- CASE_TO_STR(OC_STACK_INVALID_OPTION)
- CASE_TO_STR(OC_STACK_MALFORMED_RESPONSE)
- CASE_TO_STR(OC_STACK_PERSISTENT_BUFFER_REQUIRED)
-
- CASE_TO_STR(OC_STACK_INVALID_REQUEST_HANDLE)
- CASE_TO_STR(OC_STACK_INVALID_DEVICE_INFO)
- CASE_TO_STR(OC_STACK_INVALID_JSON)
- CASE_TO_STR(OC_STACK_UNAUTHORIZED_REQ)
- CASE_TO_STR(OC_STACK_TOO_LARGE_REQ)
- CASE_TO_STR(OC_STACK_PDM_IS_NOT_INITIALIZED)
- CASE_TO_STR(OC_STACK_DUPLICATE_UUID)
- CASE_TO_STR(OC_STACK_INCONSISTENT_DB)
- CASE_TO_STR(OC_STACK_SVR_DB_NOT_EXIST)
- CASE_TO_STR(OC_STACK_AUTHENTICATION_FAILURE)
- CASE_TO_STR(OC_STACK_NOT_ALLOWED_OXM)
-#ifdef WITH_PRESENCE
- CASE_TO_STR(OC_STACK_PRESENCE_STOPPED)
- CASE_TO_STR(OC_STACK_PRESENCE_TIMEOUT)
- CASE_TO_STR(OC_STACK_PRESENCE_DO_NOT_HANDLE)
-#endif
- CASE_TO_STR(OC_STACK_USER_DENIED_REQ)
- CASE_TO_STR(OC_STACK_NOT_ACCEPTABLE)
- CASE_TO_STR(OC_STACK_METHOD_NOT_ALLOWED)
- CASE_TO_STR(OC_STACK_FORBIDDEN_REQ)
- CASE_TO_STR(OC_STACK_INTERNAL_SERVER_ERROR)
- CASE_TO_STR(OC_STACK_NOT_IMPLEMENTED)
- CASE_TO_STR(OC_STACK_BAD_GATEWAY)
- CASE_TO_STR(OC_STACK_SERVICE_UNAVAILABLE)
- CASE_TO_STR(OC_STACK_GATEWAY_TIMEOUT)
- CASE_TO_STR(OC_STACK_PROXY_NOT_SUPPORTED)
- CASE_TO_STR(OC_STACK_ERROR)
- default :
- return "Unknown Error";
- }
-}
-
-static const char* _wifi_error_to_string(wifi_manager_error_e err)
-{
- switch (err) {
- /* CHECK: List all enum values here */
- CASE_TO_STR(WIFI_MANAGER_ERROR_NONE)
- CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_PARAMETER)
- CASE_TO_STR(WIFI_MANAGER_ERROR_OUT_OF_MEMORY)
- CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_OPERATION)
- CASE_TO_STR(WIFI_MANAGER_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_OPERATION_FAILED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_NO_CONNECTION)
- CASE_TO_STR(WIFI_MANAGER_ERROR_NOW_IN_PROGRESS)
- CASE_TO_STR(WIFI_MANAGER_ERROR_ALREADY_EXISTS)
- CASE_TO_STR(WIFI_MANAGER_ERROR_OPERATION_ABORTED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_DHCP_FAILED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_KEY)
- CASE_TO_STR(WIFI_MANAGER_ERROR_NO_REPLY)
- CASE_TO_STR(WIFI_MANAGER_ERROR_SECURITY_RESTRICTED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_ALREADY_INITIALIZED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_PERMISSION_DENIED)
- CASE_TO_STR(WIFI_MANAGER_ERROR_NOT_SUPPORTED)
- default :
- return "WIFI_MANAGER_ERROR_UNKNOWN";
- }
-}
-
-OicUuid_t* _convert_uuid(gchar *device_id)
-{
- OicUuid_t *uuid;
-
- if (NULL == device_id)
- return NULL;
-
- uuid = g_malloc0(sizeof(struct OicUuid));
- if (NULL == uuid) {
- D2DS_LOGE("g_malloc0() Fail(%d)", errno);
- return NULL;
- }
-
- sscanf(&device_id[0], "%2hhx", &uuid->id[0]);
- sscanf(&device_id[2], "%2hhx", &uuid->id[1]);
- sscanf(&device_id[4], "%2hhx", &uuid->id[2]);
- sscanf(&device_id[6], "%2hhx", &uuid->id[3]);
- /* device_id[8] == '-' */
- sscanf(&device_id[9], "%2hhx", &uuid->id[4]);
- sscanf(&device_id[11], "%2hhx", &uuid->id[5]);
- /* device_id[13] == '-' */
- sscanf(&device_id[14], "%2hhx", &uuid->id[6]);
- sscanf(&device_id[16], "%2hhx", &uuid->id[7]);
- /* device_id[18] == '-' */
- sscanf(&device_id[19], "%2hhx", &uuid->id[8]);
- sscanf(&device_id[21], "%2hhx", &uuid->id[9]);
- /* device_id[23] == '-' */
- sscanf(&device_id[24], "%2hhx", &uuid->id[10]);
- sscanf(&device_id[26], "%2hhx", &uuid->id[11]);
- sscanf(&device_id[28], "%2hhx", &uuid->id[12]);
- sscanf(&device_id[30], "%2hhx", &uuid->id[13]);
- sscanf(&device_id[32], "%2hhx", &uuid->id[14]);
- sscanf(&device_id[34], "%2hhx", &uuid->id[15]);
-
- return uuid;
-}
-
-static void _print_no_uuid(int idx, const OicUuid_t* uuid)
-{
- char uuid_string[256] = {0};
- snprintf(uuid_string, sizeof(uuid_string),
- "[%d] %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
- idx,
- (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
- (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
- (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
- (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
- D2DS_LOGI("%s", uuid_string);
-}
-#ifdef DEBUG_UUID
-static void _print_uuid(const OicUuid_t* uuid)
-{
- char uuid_string[256] = {0};
- snprintf(uuid_string, sizeof(uuid_string),
- "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
- (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
- (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
- (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
- (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
- D2DS_LOGI("%s", uuid_string);
-}
-#endif
-
-static void _print_uuid_res(const OicUuid_t* uuid, int res)
-{
- char uuid_string[256] = {0};
- snprintf(uuid_string, sizeof(uuid_string),
- "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x : [%d] [%s]",
- (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
- (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
- (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
- (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15],
- res, _error_to_string(res));
- D2DS_LOGI("%s", uuid_string);
-}
-
-#ifdef TEST
-static OCProvisionDev_t* _get_dev_by_id(const OCProvisionDev_t* dev_lst, const int dev_num)
-{
- if (!dev_lst || 0>=dev_num) {
- D2DS_LOGI("Device List is Empty..\n");
- return NULL;
- }
-
- OCProvisionDev_t* lst = (OCProvisionDev_t*) dev_lst;
- for (int i=0; lst; ) {
- if (dev_num == ++i) {
- return lst;
- }
- lst = lst->next;
- }
-
- return NULL;
-}
-#endif
-
-static OCProvisionDev_t* _get_dev_by_uuid(const OCProvisionDev_t* dev_lst,
- const OicUuid_t* uuid)
-{
- if (!dev_lst ) {
- D2DS_LOGI("dev_lst is empty");
- return NULL;
- }
-
- if (!uuid ) {
- D2DS_LOGI("uuid is NULL");
- return NULL;
- }
-
- OCProvisionDev_t* lst = (OCProvisionDev_t*)dev_lst;
-#ifdef DEBUG_UUID
- _print_uuid(&lst->doxm->deviceID);
-#endif
- while (lst) {
- if (!memcmp((const void *)&lst->doxm->deviceID, (const void *)uuid, sizeof(OicUuid_t)))
- return lst;
-#ifdef DEBUG_UUID
- _print_uuid(uuid);
-#endif
- lst = lst->next;
- }
-
- return NULL;
-}
-
-static int _print_dev_list(const OCProvisionDev_t* dev_lst)
-{
- if (!dev_lst) {
- D2DS_LOGI("Device List is Empty..\n\n");
- return 0;
- }
-
- OCProvisionDev_t* lst = (OCProvisionDev_t*) dev_lst;
- int lst_cnt = 0;
- for ( ; lst; ) {
- _print_no_uuid(++lst_cnt, (const OicUuid_t*) &lst->doxm->deviceID);
- lst = lst->next;
- }
-
- return lst_cnt;
-}
-
-static int _print_result_list(const OCProvisionResult_t* rslt_lst, const int rslt_cnt)
-{
- if (!rslt_lst || 0>=rslt_cnt) {
- D2DS_LOGI(" Device List is Empty..\n\n");
- return 0;
- }
-
- int lst_cnt = 0;
- for ( ; rslt_cnt>lst_cnt; ++lst_cnt) {
- _print_uuid_res((const OicUuid_t*) &rslt_lst[lst_cnt].deviceId, rslt_lst[lst_cnt].res);
- }
-
- return lst_cnt;
-}
-
-static FILE* _fopen_prvn_mng(const char* path, const char* mode)
-{
- char data_dir[MAX_FILE_PATH_LEN] = {0,};
-
- snprintf(data_dir, MAX_FILE_PATH_LEN, "%s/network/%s",
- tzplatform_getenv(TZ_SYS_GLOBALUSER_DATA), SVR_DB_FILE_NAME);
-
- NOTUSED(path);
-#if 0
- D2DS_LOGD("Unsed DB path %s\n", path);
-#endif
-
- return fopen(data_dir, mode);
-}
-
-static int _wait_cb_ret(int msec)
-{
- OCStackResult ret = OC_STACK_OK;
-
- d2ds_check_null_ret_error("g_client", g_client, OC_STACK_INVALID_PARAM);
-
- for (int i=0; !g_client->g_doneCB && msec > i; ++i) {
- usleep(1000);
- ret = OCProcess();
- if (OC_STACK_OK != ret) {
- D2DS_LOGE( "OCStack process error = %d", ret);
- return ret;
- }
- }
-
- if (!g_client->g_doneCB)
- OCPDMCleanupForTimeout();
-
- return ret;
-}
-
-static void _input_pin_cb(char* pin, size_t len)
-{
- d2ds_check_null_ret("g_client", g_client);
-
- if (!pin || OXM_RANDOM_PIN_MAX_SIZE>=len) {
- D2DS_LOGE( "inputPinCB invalid parameters");
- return;
- }
-
- memcpy(pin, g_client->rnd_pin, g_client->rnd_pin_len);
- D2DS_LOGI("Random PIN : %s", g_client->rnd_pin);
-}
-
-static void _remove_mot_client()
-{
- GMutex motdev_mutex;
-
- d2ds_check_null_ret("g_client", g_client);
-
- g_mutex_init(&motdev_mutex);
- g_mutex_lock(&motdev_mutex);
- if (g_client->g_motdev_list) {
- OCDeleteDiscoveredDevices(g_client->g_motdev_list);
- g_client->g_motdev_list = NULL;
- }
- g_mutex_unlock(&motdev_mutex);
-}
-
-static void _remove_owned_client()
-{
- GMutex owned_dev_mutex;
-
- d2ds_check_null_ret("g_client", g_client);
-
- /* delete un/owned device lists before updating them */
- g_mutex_init(&owned_dev_mutex);
- g_mutex_lock(&owned_dev_mutex);
- if (g_client->g_mowned_list) {
- OCDeleteDiscoveredDevices(g_client->g_mowned_list);
- g_client->g_mowned_list = NULL;
- }
- g_mutex_unlock(&owned_dev_mutex);
-}
-
-static int _set_device_id_seed(void)
-{
- int ret = WIFI_MANAGER_ERROR_NONE;
- gchar *mac_addr = NULL;
- gchar *test_mac = "00:12:36:11:22:33";
-
- wifi_manager_h wifi_handle = NULL;
- bool wifi_activated = false;
-
- /* Initialize Wi-Fi driver */
- ret = wifi_manager_initialize(&wifi_handle);
- if (WIFI_MANAGER_ERROR_NONE != ret)
- D2DS_LOGE("Failed to get wifi manager handle ! [%d][%s]", ret, _wifi_error_to_string(ret));
-
- wifi_manager_is_activated(wifi_handle, &wifi_activated);
- if (false == wifi_activated) {
- ret = wifi_manager_activate(wifi_handle, NULL, NULL);
- if (WIFI_MANAGER_ERROR_NONE != ret)
- D2DS_LOGE("Failed to activate wifi ! [%d][%s]", ret, _wifi_error_to_string(ret));
- }
-
- ret = wifi_manager_get_mac_address(wifi_handle, &mac_addr);
- if (WIFI_MANAGER_ERROR_NONE != ret) {
- D2DS_LOGE("Fail to get MAC address [%d][%s]", ret, _wifi_error_to_string(ret));
- /* Make deviceID based on Fake MAC address */
- ret = SetDeviceIdSeed((const guchar *)test_mac, WIFI_MAC_ADDR_LENGTH);
- } else {
- /* Make deviceID based on Wi-Fi MAC address */
- ret = SetDeviceIdSeed((const guchar *)mac_addr, WIFI_MAC_ADDR_LENGTH);
- g_free(mac_addr);
- }
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "SetDeviceIdSeed() error = [%d][%s]", ret, _error_to_string(ret));
- }
- wifi_manager_deinitialize(wifi_handle);
- return ret;
-}
-
-static int _init_provision_client(void)
-{
- int ret = OC_STACK_OK;
- char data_dir[MAX_FILE_PATH_LEN] = {0,};
-
- snprintf(data_dir, MAX_FILE_PATH_LEN, "%s/network/%s",
- tzplatform_getenv(TZ_SYS_GLOBALUSER_DATA), PRVN_DB_FILE_NAME);
-
- /* initialize persistent storage for SVR DB */
- static OCPersistentStorage ps = { _fopen_prvn_mng, fread, fwrite, fclose, unlink };
-
- ret = OCRegisterPersistentStorageHandler(&ps);
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "OCRegisterPersistentStorageHandler error = %d", ret);
- return ret;
- }
-
- _set_device_id_seed();
-
- /* initialize OC stack and provisioning manager */
- ret = OCInit(NULL, 0, OC_CLIENT_SERVER);
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "OCInit() error = [%d][%s]", ret, _error_to_string(ret));
- return ret;
- }
-
- /* Do Self-Ownership Transfer */
- ret = OCConfigSelfOwnership();
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "OCConfigSelfOwnership() error = [%d][%s]", ret, _error_to_string(ret));
- //return ret;
- }
-
- ret = OCInitPM(data_dir);
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "OCInitPM() error = [%d][%s]", ret, _error_to_string(ret));
- return ret;
- }
-
- SetInputPinCB(_input_pin_cb);
-
- g_client = g_malloc0(sizeof(d2ds_subowner_s));
- if (!g_client) {
- D2DS_LOGE( "memory allocation error = %d", errno);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_client->g_motdev_list = NULL;
- g_client->g_mowned_list = NULL;
- g_client->rnd_pin = NULL;
-
- return ret;
-}
-static void _request_cleanup(gpointer data)
-{
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
- d2ds_check_null_ret("con", con);
- d2ds_service *service = (d2ds_service *)con->userdata;
- d2ds_check_null_ret("service", service);
-
- if (!con) {
- D2DS_LOGI("container is null");
- return;
- }
-
- if (con->tid) {
- g_source_remove(con->tid);
- con->tid = 0;
- }
- con->sid = 0;
- con->found = FALSE;
-
- if (con->pin) {
- g_free(con->pin);
- con->pin = NULL;
- }
- if (con->rsrc_uri) {
- g_free(con->rsrc_uri);
- con->rsrc_uri = NULL;
- }
- if (con->rsrc_type) {
- g_free(con->rsrc_type);
- con->rsrc_type = NULL;
- }
- if (con->rsrc_interface) {
- g_free(con->rsrc_interface);
- con->rsrc_interface = NULL;
- }
- if (con->uuid_target_str) {
- g_free(con->uuid_target_str);
- con->uuid_target_str = NULL;
- }
- if (con->uuid_dev1) {
- g_free(con->uuid_dev1);
- con->uuid_dev1 = NULL;
- }
- if (con->uuid_dev2) {
- g_free(con->uuid_dev2);
- con->uuid_dev2 = NULL;
- }
- if (con->target_1) {
- g_free(con->target_1);
- con->target_1 = NULL;
- }
- if (con->subject_1) {
- g_free(con->subject_1);
- con->subject_1 = NULL;
- }
- if (con->rsrc_uri_1) {
- g_free(con->rsrc_uri_1);
- con->rsrc_uri_1 = NULL;
- }
- if (con->rsrc_type_1) {
- g_free(con->rsrc_type_1);
- con->rsrc_type_1 = NULL;
- }
- if (con->rsrc_interface_1) {
- g_free(con->rsrc_interface_1);
- con->rsrc_interface_1 = NULL;
- }
- if (con->target_2) {
- g_free(con->target_1);
- con->target_1 = NULL;
- }
- if (con->subject_2) {
- g_free(con->subject_1);
- con->subject_1 = NULL;
- }
- if (con->rsrc_uri_2) {
- g_free(con->rsrc_uri_2);
- con->rsrc_uri_2 = NULL;
- }
- if (con->rsrc_type_2) {
- g_free(con->rsrc_type_2);
- con->rsrc_type_2 = NULL;
- }
- if (con->rsrc_interface_2) {
- g_free(con->rsrc_interface_2);
- con->rsrc_interface_2 = NULL;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
-
- if (con) {
- g_free(con);
- con = NULL;
- }
-}
-
-static void __notify_found_devs(void *data)
-{
- GVariantBuilder builder;
- GVariant* devices;
- OCProvisionDev_t *iter = NULL;
-
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
- d2ds_check_null_ret("con", con);
- d2ds_service *service= (d2ds_service *)con->userdata;
- d2ds_check_null_ret("service", service);
-
- /* g_mowned_list would be filled above request */
- g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
-
- if (D2DS_DISC_MOT_ENB_DEVS == con->cid) {
- iter = g_client->g_motdev_list;
- g_client->g_motdev_cnt = _print_dev_list(g_client->g_motdev_list);
- D2DS_LOGD("Found %d MOT enabled devices", g_client->g_motdev_cnt);
- } else if (D2DS_DISC_MOWNED_DEVS == con->cid) {
- iter = g_client->g_mowned_list;
- g_client->g_mowndev_cnt = _print_dev_list(g_client->g_mowned_list);
- D2DS_LOGD("Found %d Mowned devices", g_client->g_mowndev_cnt);
- }
-
- while (iter != NULL) {
- char uuid_string[256] = {0};
-
- OicUuid_t *uuid = &iter->doxm->deviceID;
- d2ds_check_null_ret("uuid", uuid);
-
- snprintf(uuid_string, sizeof(uuid_string),
- "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
- (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
- (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
- (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
- (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
-
- D2DS_LOGI("uuid %s", uuid_string);
-
- g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
-
- g_variant_builder_add(&builder, "{sv}", "deviceId",
- g_variant_new_string(uuid_string));
- g_variant_builder_add(&builder, "{sv}", "adapter",
- g_variant_new_uint32(iter->endpoint.adapter));
- g_variant_builder_add(&builder, "{sv}", "flags",
- g_variant_new_int32(iter->endpoint.flags));
- g_variant_builder_add(&builder, "{sv}", "port",
- g_variant_new_uint16(iter->endpoint.port));
- g_variant_builder_add(&builder, "{sv}", "addr",
- g_variant_new_string(iter->endpoint.addr));
- g_variant_builder_add(&builder, "{sv}", "ifindex",
- g_variant_new_int32(iter->endpoint.ifindex));
- g_variant_builder_add(&builder, "{sv}", "routeData",
- g_variant_new_string(iter->endpoint.routeData));
- g_variant_builder_add(&builder, "{sv}", "remoteId",
- g_variant_new_string(iter->endpoint.remoteId));
-
- D2DS_LOGI("%s", iter->endpoint.remoteId);
-
- g_variant_builder_add(&builder, "{sv}", "connType",
- g_variant_new_uint32(iter->connType));
- g_variant_builder_add(&builder, "{sv}", "securePort",
- g_variant_new_uint16(iter->securePort));
-#ifdef WITH_TCP
- g_variant_builder_add(&builder, "{sv}", "tcpPort",
- g_variant_new_uint16(iter->tcpPort));
-#endif
- g_variant_builder_add(&builder, "{sv}", "secVer",
- g_variant_new_string(iter->secVer));
- g_variant_builder_add(&builder, "{sv}", "devStatus",
- g_variant_new_uint32(iter->devStatus));
- g_variant_builder_close(&builder);
-
- iter = iter->next;
- }
-
- devices = g_variant_builder_end(&builder);
-
- if (D2DS_DISC_MOT_ENB_DEVS == con->cid)
- d2ds_notify_mot_env_devs(devices);
- else if (D2DS_DISC_MOWNED_DEVS == con->cid)
- d2ds_notify_mowned_devs(devices);
-
- g_variant_builder_unref(&builder);
- g_variant_unref(devices);
-
-}
-#ifdef TIMEOUT_USED
-static gboolean _d2ds_timeout_cb(gpointer data)
-{
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
- d2ds_check_null_ret_error("con", con, G_SOURCE_REMOVE);
-
- if (NULL == con) {
- D2DS_LOGE("container is NULL");
- return G_SOURCE_REMOVE;
- }
- if (con->found) {
- D2DS_LOGE("cb was alreay handled");
- return G_SOURCE_REMOVE;
- }
-
- if(OC_STACK_OK != OCProcess()) {
- D2DS_LOGE( "OCStack process error");
- return G_SOURCE_REMOVE;
- }
-
- OCPDMCleanupForTimeout();
-
- switch (con->cid) {
- case D2DS_DISC_MOT_ENB_DEVS:
- D2DS_LOGE("Discovered Multiple Ownership Transfer Enabled Devices");
- __notify_found_devs(con);
- break;
- case D2DS_DISC_MOWNED_DEVS:
- D2DS_LOGE("Discovered Multiple Ownership Transfer Enabled Devices");
- __notify_found_devs(con);
- break;
- case D2DS_MOT:
- net_d2ds_emit_mot_done(d2ds_dbus_get_object(), D2DS_ERROR_OPERATION_FAILED);
- break;
- case D2DS_PROV_ACL:
- net_d2ds_emit_acl_done(d2ds_dbus_get_object(), D2DS_ERROR_OPERATION_FAILED);
- break;
- case D2DS_PROV_CRED:
- net_d2ds_emit_cred_done(d2ds_dbus_get_object(), D2DS_ERROR_OPERATION_FAILED);
- break;
- case D2DS_REMOVE_MOT:
- net_d2ds_emit_remove_mo_done(d2ds_dbus_get_object(), D2DS_ERROR_OPERATION_FAILED);
- break;
- case D2DS_UNPAIR:
- net_d2ds_emit_unpair_done(d2ds_dbus_get_object(), D2DS_ERROR_OPERATION_FAILED);
- break;
- case D2DS_PROV_PAIRWISE:
- net_d2ds_emit_pairwise_done(d2ds_dbus_get_object(), D2DS_ERROR_OPERATION_FAILED);
- break;
- }
-
- _request_cleanup((gpointer)con);
-
- return G_SOURCE_REMOVE;
-}
-#endif
-static gpointer _disc_mot_env_devs_func(gpointer data)
-{
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
- d2ds_check_null_ret_error("con", con, NULL);
-
- /* delete un/owned device lists before updating them */
- _remove_mot_client();
-
- D2DS_LOGI("Discovering Multiple Ownership Transfer enabled Devices on Network..");
- if (OC_STACK_OK != OCDiscoverMultipleOwnerEnabledDevices(DISCOVERY_TIMEOUT,
- &g_client->g_motdev_list)) {
- D2DS_LOGE( "OCDiscoverMultipleOwnerEnalbedDevices API error");
- goto DISC_MOT_ENB_DEVS_END;
- }
-
- __notify_found_devs(con);
-
-DISC_MOT_ENB_DEVS_END:
- _request_cleanup(con);
- g_thread_exit(GINT_TO_POINTER (1));
-
- return NULL;
-}
-
-static int _disc_mot_enb_devs(d2ds_service *service)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->thread = g_thread_try_new("disc_mot_env_devs", _disc_mot_env_devs_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-
- con->userdata = service;
- con->cid = D2DS_DISC_MOT_ENB_DEVS;
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(DISCOVERY_TIMEOUT * 2, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-static gpointer _disc_owned_devs_func(gpointer data)
-{
- OCStackResult ret = OC_STACK_OK;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
-
- d2ds_check_null_ret_error("g_client", g_client, NULL);
-
- /* delete un/owned device lists before updating them */
- _remove_owned_client();
-
- D2DS_LOGD("Discovering Multiple Owned Devices");
- ret = OCDiscoverMultipleOwnedDevices(DISCOVERY_TIMEOUT, &g_client->g_mowned_list);
- if (OC_STACK_OK != ret) {
- D2DS_LOGE( "OCDiscoverMultipleOwnerEnabledDevices API error");
- goto DISC_OWNED_DEVS_END;
- }
-
- __notify_found_devs(con);
-
-DISC_OWNED_DEVS_END:
- _request_cleanup(con);
- g_thread_exit(GINT_TO_POINTER (1));
-
- return NULL;
-}
-
-static int _disc_owned_devs(d2ds_service *service)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_DISC_MOWNED_DEVS;
-
- con->thread = g_thread_try_new("disc_owned_devs", _disc_owned_devs_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(DISCOVERY_TIMEOUT * 2, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-static void _mot_cb(void* ctx, int num, OCProvisionResult_t* arr, bool has_error)
-{
- int i = 0;
- int ret = OC_STACK_OK;
- d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
-
- if (!has_error) {
- D2DS_LOGD("Multiple Ownership Transfer SUCCEEDED");
- } else {
- D2DS_LOGD( "Multiple Ownership Transfer FAILED ");
-
- _print_result_list((const OCProvisionResult_t*) arr, num);
-
- ret = openDB();
- if (OC_STACK_OK != ret)
- D2DS_LOGE( "openDB: ret = %d (%s)", ret, _error_to_string(ret));
-
- for ( ; num > i; ++i) {
- if (OC_STACK_OK !=arr[i].res) {
- ret = delete_mowned_device_db((const OicUuid_t*) &arr[i].deviceId);
- }
- }
- ret = closeDB();
- if (OC_STACK_OK != ret)
- D2DS_LOGE( "closeDB: ret = %d (%s)", ret, _error_to_string(ret));
- }
- client->g_doneCB = true;
-}
-
-static gpointer _mot_func(gpointer data)
-{
- OCStackResult ret = OC_STACK_OK;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
-
- OCProvisionDev_t *src_dev = NULL;
- OicUuid_t *uuid_target = NULL;
-
- if (!con->uuid_target_str) {
- D2DS_LOGE("Target device UUID is NULL");
- goto MOT_ENDED;
- }
-
- uuid_target = _convert_uuid(con->uuid_target_str);
- src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_target);
- if (!src_dev) {
- D2DS_LOGE("We can't find in MOT dev list");
- goto MOT_ENDED;
- }
-
- g_client->g_doneCB = false;
-
- OCProvisionDev_t* dev = NULL;
- LL_FOREACH(src_dev, dev) {
- if(OIC_PRECONFIG_PIN == dev->doxm->oxmSel) {
- /* Pre-Configured PIN initialization */
- const char* testPreconfigPin = con->pin;/* Ex) "12341234" */
- ret = OCAddPreconfigPin(dev, testPreconfigPin, strlen(testPreconfigPin));
- if(OC_STACK_OK != ret) {
- D2DS_LOGE("Failed to save the pre-configured PIN");
- D2DS_LOGE("You can't use the pre-configured PIN OxM for MOT");
- goto MOT_ENDED;
- }
- }
- }
-
- ret = OCDoMultipleOwnershipTransfer(g_client, src_dev, _mot_cb);
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "OCDoMultipleOwnershipTransfer: ret = %d (%s)", ret, _error_to_string(ret));
- goto MOT_ENDED;
- }
-
- ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
- if(ret) {
- D2DS_LOGE( "OCDoMultipleOwnershipTransfer callback error = %d (%s)", ret, _error_to_string(ret));
- goto MOT_ENDED;
- }
-
- D2DS_LOGE("Registered Discovered Devices");
-
-MOT_ENDED:
-
- net_d2ds_emit_mot_done(d2ds_dbus_get_object(), (int)ret);
- if (uuid_target)
- g_free(uuid_target);
- _request_cleanup(data);
- g_thread_exit(GINT_TO_POINTER (1));
-
- return NULL;
-}
-
-static int _d2ds_mot(d2ds_service *service, gchar *uuid_str, gchar *pin)
-{
- d2ds_req_cb_s *con = NULL;
-
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- /* Unset d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_MOT;
- con->uuid_target_str = g_strdup(uuid_str);
-
- if (pin) {
- con->pin = g_malloc0(OXM_RANDOM_PIN_MAX_SIZE+1);
- if (!pin) {
- D2DS_LOGE("Failed to allocate PIN number");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- memcpy(con->pin, pin, OXM_RANDOM_PIN_MAX_SIZE);
- }
-
- con->thread = g_thread_try_new("mot", _mot_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-static void _remove_mo_cb(void* ctx, int num, OCProvisionResult_t* arr, bool has_error)
-{
- d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
-
- if (!has_error) {
- D2DS_LOGD("Remove Multiple Ownership SUCCEEDED");
- } else {
- D2DS_LOGD( "Remove Multiple Ownership FAILED ");
- _print_result_list((const OCProvisionResult_t*) arr, num);
- }
- client->g_doneCB = true;
-}
-
-static gpointer _remove_mo_func(gpointer data)
-{
- OCStackResult ret = D2DS_ERROR_OPERATION_FAILED;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
-
- OCProvisionDev_t *src_dev = NULL;
- OicUuid_t uuid_mowner;
- OicUuid_t *uuid_target = NULL;
-
- if (!con->uuid_target_str) {
- D2DS_LOGE("Target device UUID is NULL");
- goto MOT_ENDED;
- }
-
- uuid_target = _convert_uuid(con->uuid_target_str);
- src_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid_target);
- if (!src_dev) {
- D2DS_LOGE("We can't find in MOT dev list");
- goto MOT_ENDED;
- }
-
- g_client->g_doneCB = false;
-
- ret = GetDoxmDevOwnerId(&uuid_mowner);
- if (OC_STACK_OK != ret) {
- D2DS_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret));
- goto MOT_ENDED;
- }
-
- ret = openDB();
- if (OC_STACK_OK != ret)
- D2DS_LOGE( "openDB: ret = %d (%s)", ret, _error_to_string(ret));
- ret = delete_mowned_device_db((const OicUuid_t*) uuid_target);
- if (OC_STACK_OK != ret)
- D2DS_LOGE( "delete_mowned_device_db: ret = %d (%s)", ret, _error_to_string(ret));
- ret = closeDB();
- if (OC_STACK_OK != ret)
- D2DS_LOGE( "closeDB: ret = %d (%s)", ret, _error_to_string(ret));
-
- ret = OCRemoveSubOwner(g_client, src_dev, &uuid_mowner, _remove_mo_cb);
- if (OC_STACK_OK != ret ) {
- D2DS_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret));
- goto MOT_ENDED;
- }
-
- ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
- if(ret) {
- D2DS_LOGE( "OCRemoveSubOwner callback error = %d (%s)", ret, _error_to_string(ret));
- goto MOT_ENDED;
- }
-
- D2DS_LOGE("Remove Multiple Ownership Done");
-
-MOT_ENDED:
-
- net_d2ds_emit_remove_mo_done(d2ds_dbus_get_object(), (int)ret);
-
- if (uuid_target)
- g_free(uuid_target);
- _request_cleanup(data);
- g_thread_exit(GINT_TO_POINTER (1));
-
- return NULL;
-}
-
-static int _d2ds_remove_mo(d2ds_service *service, gchar *uuid_str)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- /* Unset d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_REMOVE_MOT;
- con->uuid_target_str = g_strdup(uuid_str);
-
- con->thread = g_thread_try_new("remove_mo", _remove_mo_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-#if 0 /* TEST */
-static int sendGetLed()
-{
- int selDevNum;
- char query[256] = {0};
- OCCallbackData cbData;
- cbData.cb = &LedCB;
- cbData.context = NULL;
- cbData.cd = NULL;
-
- printDevList(g_mowned_list);
-
- // select device for provisioning access control list
- for( ; ; ) {
- printf(" > Enter Device Number, for sending GET LED request: ");
- for(int ret=0; 1!=ret; ) {
- ret = scanf("%d", &selDevNum);
- for( ; 0x20<=getchar(); ); // for removing overflow garbages
- // '0x20<=code' is character region
- }
- if(0<selDevNum && g_mowned_cnt>=selDevNum) {
- break;
- }
- printf(" Entered Wrong Number. Please Enter Again\n");
- }
-
- OCProvisionDev_t* selDev = _get_dev_by_id(g_mowned_list, selDevNum);
- if(NULL == selDev) {
- printf("Failed to _get_dev_by_id()\n");
- return -1;
- }
-
- if(PMGenerateQuery(true, selDev->endpoint.addr, selDev->securePort, selDev->connType,
- query, sizeof(query), "/a/led")) {
- g_doneCB = false;
- printf("query=%s\n", query);
- if(OC_STACK_OK != OCDoResource(NULL, OC_REST_GET, query, NULL, NULL, selDev->connType,
- OC_HIGH_QOS, &cbData, NULL, 0)) {
- printf("********************************\n");
- printf("Failed to send GET request to %s\n", query);
- printf("********************************\n");
- g_doneCB = true;
- return -1;
- }
-
- waitCallbackRet();
- } else {
- printf("Failed to generate GET request for /a/led\n");
- return -1;
- }
-
- return 0;
-}
-
-static int sendPutLed()
-{
- int selDevNum;
- char query[256] = {0};
- OCCallbackData cbData;
- cbData.cb = &LedCB;
- cbData.context = NULL;
- cbData.cd = NULL;
-
- printDevList(g_mowned_list);
- // select device for provisioning access control list
- for( ; ; ) {
- printf(" > Enter Device Number, for sending PUT LED request: ");
- for(int ret=0; 1!=ret; ) {
- ret = scanf("%d", &selDevNum);
- for( ; 0x20<=getchar(); ); // for removing overflow garbages
- // '0x20<=code' is character region
- }
- if(0<selDevNum && g_mowned_cnt>=selDevNum) {
- break;
- }
- printf(" Entered Wrong Number. Please Enter Again\n");
- }
-
- OCProvisionDev_t* selDev = _get_dev_by_id(g_mowned_list, selDevNum);
- if (NULL == selDev) {
- printf("Failed to _get_dev_by_id()\n");
- return -1;
- }
-
- if (PMGenerateQuery(true, selDev->endpoint.addr, selDev->securePort, selDev->connType, query,
- sizeof(query), "/a/led")) {
- g_doneCB = false;
- D2DS_LOGI("query=%s\n", query);
- if(OC_STACK_OK != OCDoResource(NULL, OC_REST_PUT, query, NULL, NULL, selDev->connType,
- OC_LOW_QOS, &cbData, NULL, 0)) {
- D2DS_LOGI("********************************\n");
- D2DS_LOGI("Failed to send PUT request to %s\n", query);
- D2DS_LOGI("********************************\n");
- g_doneCB = true;
- return -1;
- }
-
- waitCallbackRet();
- } else {
- printf("Failed to generate PUT request for /a/led\n");
- return -1;
- }
-
- return 0;
-}
-#endif /* TEST */
-static OicSecAcl_t* _create_target_acl(const OicUuid_t* target, const OicUuid_t* subject,
- const char *rsrc_uri, const char *rsrc_type, const char *rsrc_interface, int permission)
-{
- /* For example
- * subejct = "12341234-1234-1234-12341234"
- * rsrc_uri = "/a/led"
- * rsrc_type = "oic.r.core"
- * rsrc_interface = "oic.if.baseline"
- * rsrc_permission = D2DS_PERMISSION_FULL
- */
- size_t len;
- OicSecAcl_t* acl = NULL;
- OicSecAce_t* ace = NULL;
- OicSecRsrc_t* rsrc = NULL;
-
- if (NULL == target) {
- D2DS_LOGE( "target is NULL");
- return NULL;
- }
-
- if (NULL == subject) {
- D2DS_LOGE( "subejct is NULL");
- return NULL;
- }
-#ifdef DEBUG_UUID
- _print_uuid(target);
- _print_uuid(subject);
-#endif
- acl = (OicSecAcl_t*) OICCalloc(1, sizeof(OicSecAcl_t));
- if (!acl) {
- D2DS_LOGE( "acl : OICCalloc failed =%d", errno);
- return NULL;
- }
- ace = (OicSecAce_t*) OICCalloc(1, sizeof(OicSecAce_t));
- if (!ace) {
- D2DS_LOGE( "ace : OICCalloc failed =%d", errno);
- return NULL;
- }
- LL_APPEND(acl->aces, ace);
- memcpy(ace->subjectuuid.id, subject->id, sizeof(subject->id));
-
- /* fill the href */
- rsrc = (OicSecRsrc_t*)OICCalloc(1, sizeof(OicSecRsrc_t));
- if (!rsrc) {
- D2DS_LOGE( "rsrc: OICCalloc failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
-
- len = strlen(rsrc_uri)+1; // '1' for null termination
- rsrc->href = (char*) OICCalloc(len, sizeof(char));
- if (!rsrc->href) {
- D2DS_LOGE( "rsrc->href: OICCalloc failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
- memcpy(rsrc->href, rsrc_uri, len);
-
- /* Fill the resource type (rt) */
- rsrc->typeLen = 1;
- rsrc->types = (char**)OICCalloc(1, sizeof(char*));
- if (!rsrc->types) {
- D2DS_LOGE( "rsrc->types: OICCalloc failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
- rsrc->types[0] = g_strdup(rsrc_type);
- if (!rsrc->types[0]) {
- D2DS_LOGE( "rsrc->types[0]: g_strdup failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
-
- /* Fill the interface (if) */
- rsrc->interfaceLen = 1;
- rsrc->interfaces = (char**)OICCalloc(1, sizeof(char*));
- if (!rsrc->interfaces) {
- D2DS_LOGE( "rsrc->interfaces: OICCalloc failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
- rsrc->interfaces[0] = g_strdup(rsrc_interface);
- if (!rsrc->interfaces[0]) {
- D2DS_LOGE( "rsrc->interfaces[0] : g_strdup failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
-
- LL_APPEND(ace->resources, rsrc);
-
- /* Fill permission for the reource */
- ace->permission = permission;
-
- ace->eownerID = (OicUuid_t*)OICCalloc(1, sizeof(OicUuid_t));
- if (NULL == ace->eownerID) {
- D2DS_LOGE( "ace->eownerID : OICCalloc failed =%d", errno);
- goto CREATE_ACL_ERROR;
- }
- memcpy(ace->eownerID->id, subject->id, sizeof(subject->id));
-
- return acl;
-
-CREATE_ACL_ERROR:
- OCDeleteACLList(acl);
- return NULL;
-}
-
-static void _provisioning_acl_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
-{
- d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
-
- if (!has_error) {
- D2DS_LOGD("Provision ACL SUCCEEDED");
- } else {
- D2DS_LOGD( "Provision ACL FAILED ");
- _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
- }
- client->g_doneCB = true;
-}
-
-static void _provisioning_pairwise_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
-{
- d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
-
- if (!has_error) {
- D2DS_LOGD("Provision pairwise SUCCEEDED");
- } else {
- D2DS_LOGD( "Provision pairwise FAILED ");
- _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
- }
- client->g_doneCB = true;
-}
-
-static void _unpair_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
-{
- d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
-
- if (!has_error) {
- D2DS_LOGD("unpair SUCCEEDED");
- } else {
- D2DS_LOGD( "unpair FAILED ");
- _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
- }
- client->g_doneCB = true;
-}
-
-static gpointer _provisioning_acl_func(gpointer data)
-{
- OCStackResult ret = OC_STACK_OK;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
- OicSecAcl_t* acl = NULL;
- OicUuid_t *uuid = NULL;
- OCProvisionDev_t *target_dev = NULL;
- OCProvisionDev_t *subject_dev = NULL;
-
- if (!con->uuid_subject_str ||!con->uuid_target_str || !con->rsrc_uri || !con->rsrc_type || !con->rsrc_interface) {
- D2DS_LOGE("Some parameters are wrong");
- D2DS_LOGE("%s", con->uuid_target_str );
- D2DS_LOGE("%s", con->uuid_subject_str );
- D2DS_LOGE("%s", con->rsrc_uri );
- D2DS_LOGE("%s", con->rsrc_type );
- D2DS_LOGE("%s", con->rsrc_interface );
- goto PVACL_ERROR;
- }
-
- uuid = _convert_uuid(con->uuid_target_str);
- target_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
- if (!target_dev) {
- D2DS_LOGE("We can't find target in MOWNED dev list");
- goto PVACL_ERROR;
- }
- g_free(uuid);
-
- uuid = _convert_uuid(con->uuid_subject_str);
- subject_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
- if (!subject_dev) {
- D2DS_LOGE("We can't find subject in MOWNED dev list");
- goto PVACL_ERROR;
- }
- g_free(uuid);
-
- g_client->g_doneCB = false;
- D2DS_LOGI(" Provisioning Selected ACL..");
-
- acl = _create_target_acl(&target_dev->doxm->deviceID, &subject_dev->doxm->deviceID, con->rsrc_uri, con->rsrc_type,
- con->rsrc_interface, con->permission);
- if (NULL == acl) {
- D2DS_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
- goto PVACL_ERROR;
- }
-
- ret= OCProvisionACL((void*) g_client, target_dev, acl, _provisioning_acl_cb);
- if (OC_STACK_OK != ret) {
- D2DS_LOGD( "OCProvisionACL API error: %d (%s)", ret, _error_to_string(ret));
- goto PVACL_ERROR;
- }
-
- ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
- if (ret) {
- D2DS_LOGE( "OCProvisionCredentials Faild = %d", errno);
- goto PVACL_ERROR;
- }
- /* display the ACL-provisioned result */
- D2DS_LOGI(" Provisioned Selected ACL Successfully");
-
-PVACL_ERROR:
- /* Notify ACL result */
- net_d2ds_emit_acl_done(d2ds_dbus_get_object(), (int)ret);
-
- if (acl)
- OCDeleteACLList(acl);
- if (uuid)
- g_free(uuid);
- _request_cleanup(con);
- g_thread_exit(GINT_TO_POINTER (1));
- return NULL;
-}
-
-static int _provisioning_acl(d2ds_service *service, gchar *target, gchar *subject,
- gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- /* Unset d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_PROV_ACL;
- con->uuid_target_str = g_strdup(target);
- con->uuid_subject_str = g_strdup(subject);
- con->rsrc_uri = g_strdup(rsrc_uri);
- con->rsrc_type = g_strdup(rsrc_type);
- con->rsrc_interface = g_strdup(rsrc_interface);
-
- con->thread = g_thread_try_new("prov_acl", _provisioning_acl_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-static gpointer _provisioning_pairwise_func(gpointer data)
-{
- OCStackResult ret = OC_STACK_OK;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
-
- OicUuid_t *uuid_1 = NULL;
- OicUuid_t *uuid_2 = NULL;
- OicUuid_t *uuid_3 = NULL;
- OicUuid_t *uuid_4 = NULL;
-
- OicSecAcl_t* acl_1 = NULL;
- OicSecAcl_t* acl_2 = NULL;
-
- OCProvisionDev_t *target_dev_1 = NULL;
- OCProvisionDev_t *target_dev_2 = NULL;
- OCProvisionDev_t *subject_dev_1 = NULL;
- OCProvisionDev_t *subject_dev_2 = NULL;
-
- if (!con->subject_1 || !con->rsrc_uri_1 || !con->rsrc_type_1 || !con->rsrc_interface_1 ||
- !con->subject_2 || !con->rsrc_uri_2 || !con->rsrc_type_2 || !con->rsrc_interface_2) {
- D2DS_LOGE("Some parameters are wrong");
- D2DS_LOGE("%s", con->subject_1 );
- D2DS_LOGE("%s", con->rsrc_uri_1 );
- D2DS_LOGE("%s", con->rsrc_type_1 );
- D2DS_LOGE("%s", con->rsrc_interface_1 );
- D2DS_LOGE("%s", con->subject_2 );
- D2DS_LOGE("%s", con->rsrc_uri_2 );
- D2DS_LOGE("%s", con->rsrc_type_2 );
- D2DS_LOGE("%s", con->rsrc_interface_2 );
-
- goto PVACL_ERROR;
- }
-
- uuid_1 = _convert_uuid(con->target_1);
- target_dev_1 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_1);
- if (!target_dev_1) {
- D2DS_LOGE("We can't find target in MOWNED dev list");
- goto PVACL_ERROR;
- }
-
- uuid_2 = _convert_uuid(con->target_2);
- target_dev_2 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_2);
- if (!target_dev_2) {
- D2DS_LOGE("We can't find target in MOWNED dev list");
- goto PVACL_ERROR;
- }
-
- uuid_3 = _convert_uuid(con->subject_1);
- subject_dev_1 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_3);
- if (!subject_dev_1) {
- D2DS_LOGE("We can't find subject in MOWNED dev list");
- goto PVACL_ERROR;
- }
-
- uuid_4 = _convert_uuid(con->subject_2);
- subject_dev_2 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_4);
- if (!subject_dev_2) {
- D2DS_LOGE("We can't find subject in MOWNED dev list");
- goto PVACL_ERROR;
- }
-
- g_client->g_doneCB = false;
- D2DS_LOGI(" Provisioning Selected Pairwise..");
-
- acl_1 = _create_target_acl(&target_dev_1->doxm->deviceID,
- &subject_dev_1->doxm->deviceID, con->rsrc_uri_1,
- con->rsrc_type_1,
- con->rsrc_interface_1, con->permission_1);
- if (NULL == acl_1) {
- D2DS_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
- goto PVACL_ERROR;
- }
-
- acl_2 = _create_target_acl(&target_dev_2->doxm->deviceID,
- &subject_dev_2->doxm->deviceID, con->rsrc_uri_2,
- con->rsrc_type_2,
- con->rsrc_interface_2, con->permission_2);
- if (NULL == acl_2) {
- D2DS_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
- goto PVACL_ERROR;
- }
-
- ret = OCProvisionPairwiseDevices((void*) g_client, SYMMETRIC_PAIR_WISE_KEY,
- OWNER_PSK_LENGTH_256, target_dev_1, acl_1,
- target_dev_2, acl_2, _provisioning_pairwise_cb);
- if (OC_STACK_OK != ret) {
- D2DS_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret,
- _error_to_string(ret));
- goto PVACL_ERROR;
- }
-
- ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
- if (ret) {
- D2DS_LOGE( "OCProvisionPairwise Faild = %d", errno);
- goto PVACL_ERROR;
- }
- /* display the pairwise-provisioned result */
- D2DS_LOGI(" Provision pairwise Successfully");
-
-PVACL_ERROR:
- /* Notify ACL result */
- net_d2ds_emit_pairwise_done(d2ds_dbus_get_object(), (int)ret);
-
- if (uuid_1)
- g_free(uuid_1);
- if (uuid_2)
- g_free(uuid_2);
- if (uuid_3)
- g_free(uuid_3);
- if (uuid_4)
- g_free(uuid_4);
- if (acl_1)
- OCDeleteACLList(acl_1);
- if (acl_2)
- OCDeleteACLList(acl_2);
-
- _request_cleanup(con);
- g_thread_exit(GINT_TO_POINTER (1));
- return NULL;
-}
-
-static gpointer _unpair_func(gpointer data)
-{
- OCStackResult ret = OC_STACK_OK;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
-
- OicUuid_t *uuid = NULL;
-
- if (!con->target_to_revoke) {
- D2DS_LOGE("Some parameters are wrong");
- D2DS_LOGE("%s", con->target_to_revoke );
- goto PVACL_ERROR;
- }
-
- uuid = _convert_uuid(con->target_to_revoke);
-
- g_client->g_doneCB = false;
- D2DS_LOGI(" unpair device..");
-
- ret = OCRemoveDeviceWithUuid((void*) g_client, CALLBACK_TIMEOUT_5S, uuid, _unpair_cb );
- if (OC_STACK_OK != ret) {
- D2DS_LOGD( "OCRemoveDevice API error: %d (%s)", ret, _error_to_string(ret));
- goto PVACL_ERROR;
- }
-
- ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
- if (ret) {
- D2DS_LOGE( "OCRemoveDevice Faild = %d", errno);
- goto PVACL_ERROR;
- }
- /* display the pairwise-provisioned result */
- D2DS_LOGI(" Provision pairwise Successfully");
-
-PVACL_ERROR:
- /* Notify ACL result */
- net_d2ds_emit_unpair_done(d2ds_dbus_get_object(), (int)ret);
- if (uuid)
- g_free(uuid);
- _request_cleanup(con);
- g_thread_exit(GINT_TO_POINTER (1));
- return NULL;
-}
-
-static int _provisioning_unpair(d2ds_service *service, gchar *target)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- /* Unset d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_UNPAIR;
-
- con->target_to_revoke = g_strdup(target);
-
- con->thread = g_thread_try_new("unpair_device", _unpair_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-static int _provisioning_pairwise_link(d2ds_service *service, gchar *target_1, gchar *subject_1,
- gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1,
- gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (NULL == con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- /* Unset d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_PROV_PAIRWISE;
-
- con->target_1 = g_strdup(target_1);
- con->subject_1 = g_strdup(subject_1);
- con->rsrc_uri_1 = g_strdup(rsrc_uri_1);
- con->rsrc_type_1 = g_strdup(rsrc_type_1);
- con->rsrc_interface_1 = g_strdup(rsrc_interface_1);
-
- con->target_2 = g_strdup(target_2);
- con->subject_2 = g_strdup(subject_2);
- con->rsrc_uri_2 = g_strdup(rsrc_uri_2);
- con->rsrc_type_2 = g_strdup(rsrc_type_2);
- con->rsrc_interface_2 = g_strdup(rsrc_interface_2);
-
- con->thread = g_thread_try_new("prov_pairwise", _provisioning_pairwise_func,
- con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _d2ds_timeout_cb,
- con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-
-static void _provision_cred_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
-{
- d2ds_subowner_s *client = (d2ds_subowner_s *)ctx;
-
- if (!has_error) {
- D2DS_LOGD("Provision ACL SUCCEEDED");
- } else {
- D2DS_LOGD( "Provision ACL FAILED ");
- _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
- }
- client->g_doneCB = true;
-}
-
-static gpointer _cred_provisioning_func(gpointer data)
-{
- OCStackResult ret = OC_STACK_OK;
- d2ds_req_cb_s *con = (d2ds_req_cb_s *)data;
-
- OicUuid_t *uuid = NULL;
- OCProvisionDev_t *dev1 = NULL;
- OCProvisionDev_t *dev2 = NULL;
-
- if (!con->uuid_dev1 ) {
- D2DS_LOGE("dev1 is NULL");
- goto PVPWS_ERROR;
- }
- if (!con->uuid_dev2) {
- D2DS_LOGE("dev2 is NULL");
- goto PVPWS_ERROR;
- }
-
- uuid = _convert_uuid(con->uuid_dev1);
- dev1 = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
- if (!dev1) {
- D2DS_LOGE("We can't find in MOWNED dev list");
- goto PVPWS_ERROR;
- }
- g_free(uuid);
-
- uuid = _convert_uuid(con->uuid_dev2);
- dev2 = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
- if (!dev2) {
- D2DS_LOGE("We can't find in MOWNED dev list");
- goto PVPWS_ERROR;
- }
- g_free(uuid);
-
- /* To do ACL provisioning only one */
- dev1->next = NULL;
-
- /* To do ACL provisioning only one */
- dev2->next = NULL;
-
- g_client->g_doneCB = false;
-
- D2DS_LOGI("Provisioning Selected Pairwise Devices..");
- ret = OCProvisionCredentials((void*) g_client,
- SYMMETRIC_PAIR_WISE_KEY, OWNER_PSK_LENGTH_256,
- dev1, dev2, _provision_cred_cb);
- if (OC_STACK_OK != ret) {
- D2DS_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret, _error_to_string(ret));
- goto PVPWS_ERROR;
- }
-
- ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
- if (ret) {
- D2DS_LOGE( "OCProvisionCredentials Faild = %d", errno);
- goto PVPWS_ERROR;
- }
-
- /* display the pairwise-provisioned result */
- D2DS_LOGI("Provisioned Selected Pairwise Devices");
-
- return 0;
-
-PVPWS_ERROR:
- /* Notify ACL result */
- net_d2ds_emit_cred_done(d2ds_dbus_get_object(), (int)ret);
-
- if (uuid)
- g_free(uuid);
- _request_cleanup(con);
-
- g_thread_exit(GINT_TO_POINTER (1));
-
- return NULL;
-}
-
-static int _provisioning_cred(d2ds_service *service,
- gchar *uuid_dev1, gchar *uuid_dev2)
-{
- d2ds_req_cb_s *con = NULL;
- con = g_malloc0(sizeof(d2ds_req_cb_s));
- if (!con) {
- D2DS_LOGE( "g_malloc0() Fail=%d", errno);
- /* Unset d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 0);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
-
- con->userdata = service;
- con->cid = D2DS_PROV_CRED;
-
- if (!uuid_dev1 ||!uuid_dev2) {
- D2DS_LOGE( "Invaild Prameters");
- _request_cleanup(con);
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- con->uuid_dev1 = g_strdup(uuid_dev1);
- con->uuid_dev2 = g_strdup(uuid_dev2);
-
- con->thread = g_thread_try_new("prov_cred", _cred_provisioning_func, con, NULL);
- if (!con->thread) {
- D2DS_LOGE("Failed to create thread");
- _request_cleanup(con);
- return D2DS_ERROR_OUT_OF_MEMORY;
- }
- g_thread_unref(con->thread);
-#ifdef TIMEOUT_USED
- con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _d2ds_timeout_cb, con);
-#endif
- return D2DS_ERROR_NONE;
-}
-
-int d2ds_request_enable(d2ds_service *service)
-{
- int ret = D2DS_ERROR_NONE;
- d2ds_check_null_ret_error("service", service, FALSE);
- ret = _init_provision_client();
- return ret;
-}
-
-int d2ds_request_disc_mot_enb_devs(d2ds_service *service)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Discovery MOT enabled devices");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _disc_mot_enb_devs(service);
-
- return ret;
-}
-
-int d2ds_request_disc_owned_devs(d2ds_service *service)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Discovery Owned devices");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _disc_owned_devs(service);
-
- return ret;
-}
-
-int d2ds_request_mot(d2ds_service *service, gchar* uuid_str, gchar *pin)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Mullti Ownership Transfer");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- if (!uuid_str || !pin) {
- D2DS_LOGE("uuid_str = %s", uuid_str);
- D2DS_LOGE("pin = %s", pin);
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _d2ds_mot(service, uuid_str, pin);
-
- return ret;
-}
-
-int d2ds_request_remove_mo(d2ds_service *service, gchar* uuid_str)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Remove Mulltiple Ownership");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- if (!uuid_str) {
- D2DS_LOGE("uuid_str = %s", uuid_str);
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _d2ds_remove_mo(service, uuid_str);
-
- return ret;
-}
-
-int d2ds_request_prov_acl(d2ds_service *service, gchar *target, gchar *subject,
- gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Provisioning ACL");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- if (!target || !subject || !rsrc_uri || !rsrc_type || !rsrc_interface) {
- D2DS_LOGE("target = %s", target);
- D2DS_LOGE("subject = %s", subject);
- D2DS_LOGE("rsrc_uri = %s", rsrc_uri);
- D2DS_LOGE("rsrc_type = %s", rsrc_type);
- D2DS_LOGE("rsrc_interface = %s", rsrc_interface);
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _provisioning_acl(service, target, subject, rsrc_uri, rsrc_type, rsrc_interface, permission);
-
- return ret;
-}
-
-int d2ds_request_prov_cred(d2ds_service *service, gchar *uuid_dev1, gchar *uuid_dev2)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Provisioning Credential");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- if (!uuid_dev1 || !uuid_dev2) {
- D2DS_LOGE("uuid_dev1 = %s", uuid_dev1);
- D2DS_LOGE("uuid_dev2 = %s", uuid_dev2);
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _provisioning_cred(service, uuid_dev1, uuid_dev2);
-
- return ret;
-}
-
-int d2ds_request_get_ownerid(d2ds_service *service, gchar **uuid_str)
-{
- int ret =D2DS_ERROR_NONE;
- OicUuid_t uuid;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Get Device ID");
-
- ret = GetDoxmDevOwnerId(&uuid);
- if (OC_STACK_OK != ret)
- D2DS_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret));
-
- ret = ConvertUuidToStr(&uuid, uuid_str);
- if (OC_STACK_OK != ret)
- D2DS_LOGE("ConvertUuidToStr faild = [%d][%s]", ret, _error_to_string(ret));
-
- return ret;
-}
-
-int d2ds_request_disable(d2ds_service *service)
-{
- NOTUSED(service);
-
- if (OC_STACK_OK != OCStop()) {
- D2DS_LOGE( "OCStack stop error");
- }
-
- OCTerminatePM();
-
- if (!g_client)
- return D2DS_ERROR_NONE;
-
- if (g_client->g_mowned_list)
- OCDeleteDiscoveredDevices(g_client->g_mowned_list);
- if (g_client->g_motdev_list)
- OCDeleteDiscoveredDevices(g_client->g_motdev_list);
-
- if (g_client->rnd_pin) {
- g_free(g_client->rnd_pin);
- g_client->rnd_pin = NULL;
- }
-
- g_free(g_client);
- g_client = NULL;
-
- return D2DS_ERROR_NONE;
-}
-
-int d2ds_request_pairwise(d2ds_service *service, gchar *target_1,
- gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1,
- gchar *rsrc_interface_1, int permission_1,
- gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2,
- gchar *rsrc_type_2, gchar *rsrc_interface_2,
- int permission_2)
-{
- int ret =D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Link Pairwise");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- if (!target_1 || !subject_1 || !rsrc_uri_1 || !rsrc_type_1 ||
- !rsrc_interface_1 || !target_2 || !subject_2 || !rsrc_uri_2 ||
- !rsrc_type_2 || !rsrc_interface_2) {
- D2DS_LOGE("target_1 = %s", target_1);
- D2DS_LOGE("subject_1 = %s", subject_1);
- D2DS_LOGE("rsrc_uri_1 = %s", rsrc_uri_1);
- D2DS_LOGE("rsrc_type_1 = %s", rsrc_type_1);
- D2DS_LOGE("rsrc_interface_1 = %s", rsrc_interface_1);
- D2DS_LOGE("target_2 = %s", target_2);
- D2DS_LOGE("subject_2 = %s", subject_2);
- D2DS_LOGE("rsrc_uri_2 = %s", rsrc_uri_2);
- D2DS_LOGE("rsrc_type_2 = %s", rsrc_type_2);
- D2DS_LOGE("rsrc_interface_2 = %s", rsrc_interface_2);
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _provisioning_pairwise_link(service, target_1, subject_1, rsrc_uri_1,
- rsrc_type_1, rsrc_interface_1, permission_1, target_2,
- subject_2, rsrc_uri_2, rsrc_type_2, rsrc_interface_2,
- permission_2);
-
- return ret;
-
-}
-
-int d2ds_request_unpair(d2ds_service *service, gchar *uuid_dev)
-{
- int ret = D2DS_ERROR_NONE;
-
- d2ds_check_null_ret_error("service", service, FALSE);
-
- D2DS_LOGD("[IPC] Unpair device");
-
- /* If we are working now? */
- if (g_atomic_int_get(&service->pending))
- return D2DS_ERROR_IN_PROGRESS;
-
- if (!uuid_dev) {
- D2DS_LOGE("uuid_dev = %s", uuid_dev);
-
- return D2DS_ERROR_INVALID_PARAMETER;
- }
-
- /* Set d2ds status 'pending' */
- g_atomic_int_set(&service->pending, 1);
-
- ret = _provisioning_unpair(service, uuid_dev);
-
- return ret;
-
-}
-
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * 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.
- *
- */
-#ifndef __D2DS_SUBONWER_H__
-#define __D2DS_SUBONWER_H__
-
-#include "d2ds.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* command id */
-typedef enum {
- D2DS_DISC_MOT_ENB_DEVS = 0, /**< Discover MOT enabled devices */
- D2DS_DISC_MOWNED_DEVS, /**< Discover my owned MOT enabled devices */
- D2DS_MOT, /**< Do Multiple Onwership Transfer */
- D2DS_PROV_ACL, /**< ACL Provisioning */
- D2DS_PROV_CRED, /**< CRED Provisioning */
- D2DS_REMOVE_MOT, /**< Remove Multiple Ownership */
- D2DS_UNPAIR, /**< Unpair */
- D2DS_PROV_PAIRWISE, /** < Pairwise Provisioning */
-} d2ds_cmd_id_e;
-
-/* ACL Permission type */
-typedef enum {
- D2DS_PERMISSION_CREATE = (1 << 0), /**< C */
- D2DS_PERMISSION_READ = (1 << 1), /**< R */
- D2DS_PERMISSION_WRITE = (1 << 2), /**< U */
- D2DS_PERMISSION_DELETE = (1 << 3), /**< D */
- D2DS_PERMISSION_NOTIFY = (1 << 4), /**< N */
- D2DS_PERMISSION_FULL = 0x11111 /**< CRUDN */
-} d2ds_permission_e;
-
-int d2ds_request_enable(d2ds_service *service);
-int d2ds_request_disc_mot_enb_devs(d2ds_service *service);
-int d2ds_request_disc_owned_devs(d2ds_service *service);
-int d2ds_request_mot(d2ds_service *service, gchar* uuid, gchar *pin);
-int d2ds_request_remove_mo(d2ds_service *service, gchar* uuid_str);
-int d2ds_request_prov_acl(d2ds_service *service, gchar *target, gchar *subject,
- gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission);
-int d2ds_request_prov_cred(d2ds_service *service, gchar *uuid_dev1, gchar *uuid_dev2);
-int d2ds_request_unpair(d2ds_service *service, gchar *uuid_dev);
-int d2ds_request_get_ownerid(d2ds_service *service, gchar **uuid_str);
-int d2ds_request_disable(d2ds_service *service);
-int d2ds_request_pairwise(d2ds_service *service, gchar *target_1, gchar *subject_1,
- gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1,
- gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __D2DS_SUBONWER_H__ */
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * 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.
- *
- */
-#ifndef __D2DS_UTIL_H__
-#define __D2DS_UTIL_H__
-
-#include <glib.h>
-#include <unistd.h>
-#include <gio/gio.h>
-
-#include "d2ds-log.h"
-
-#define NOTUSED(var) (var = var)
-
-#define d2ds_check_null_ret_error(name, value, error) do { \
- if (G_UNLIKELY(NULL == (value))) { \
- D2DS_LOGE("%s is NULL", name); \
- return error; \
- } \
-} while (FALSE)
-
-#define d2ds_check_null_ret(name, value) do { \
- if (G_UNLIKELY(NULL == (value))) { \
- D2DS_LOGE("%s is NULL", name); \
- return; \
- } \
-} while (FALSE)
-
-#endif /* __D2DS_UTIL_H__ */
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * 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 <string.h>
-
-#include <glib.h>
-
-#include "d2ds.h"
-#include "d2ds-log.h"
-#include "d2ds-util.h"
-#include "d2ds-service.h"
-#include "d2ds-service-interface.h"
-
-/**< d2d-subowner service */
-d2ds_service *d2dssvc;
-
-int main(int argc, char *argv[])
-{
- d2ds_service *service = NULL;
- int ret_code = 0;
- gboolean ret;
-
- __D2DS_LOG_FUNC_ENTER__;
-
-#if !GLIB_CHECK_VERSION(2, 32, 0)
- if (!g_thread_supported())
- g_thread_init(NULL);
-#endif
-
-#if !GLIB_CHECK_VERSION(2, 36, 0)
- g_type_init();
-#endif
- NOTUSED(argc);
- NOTUSED(argv);
-
- D2DS_LOGI("service mainloop start");
-
- /* Create d2d-subowner service */
- d2dssvc = service = d2ds_service_new();
-
- /* Initialize d2d-subowner service interface layer */
- ret = d2ds_service_interface_init(service);
- if (G_UNLIKELY(FALSE == ret)) {
- D2DS_LOGE("Service interface init. failed!");
- ret_code = EXIT_FAILURE;
- goto END;
- }
- /* Run d2d-subowner service */
- ret = d2ds_service_run(service);
- if (G_UNLIKELY(FALSE == ret)) {
- D2DS_LOGE("Run service failed!");
- ret_code = EXIT_FAILURE;
- }
-
-END:
- /* Free d2d-manager service */
- d2ds_service_interface_deinit(service);
- d2ds_service_free(service);
- d2dssvc = NULL;
-
- __D2DS_LOG_FUNC_EXIT__;
- return ret_code;
-}
-
+++ /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 __D2D_SUBOWNER_H__\r
-#define __D2D_SUBOWNER_H__\r
-\r
-#include <glib.h>\r
-#include <gio/gio.h>\r
-#include <tizen.h>\r
-\r
-/**< Internal error code with d2ds daemon. It should be matched with API side */\r
-typedef enum {\r
- D2DS_ERROR_NONE = 0, /**< Successful */\r
- D2DS_ERROR_IO_ERROR, /**< I/O error */\r
- D2DS_ERROR_NO_DATA, /**< Data not exists */\r
- D2DS_ERROR_OUT_OF_MEMORY, /**< out of memory */\r
- D2DS_ERROR_OPERATION_FAILED, /**< operation failed */\r
- D2DS_ERROR_INVALID_PARAMETER, /**< Invalid parameter */\r
- D2DS_ERROR_ALREADY_REGISTERED, /**< Request already registered */\r
- D2DS_ERROR_IN_PROGRESS /**< operation is in progress */\r
-} d2ds_error_e;\r
-\r
-/**< d2d-subowner service structure */\r
-typedef struct _d2ds_service {\r
- GMainLoop *main_loop; /**< Service main-loop */\r
- guint dbus_id; /**< D-Bus id */\r
- guint activation_dbus_id; /**< D-Bus id for activation */\r
-\r
- gint pending; /**< Is there any pending operation? */\r
-\r
- gpointer connection; /**< Connection handle for D-Bus call to other process */\r
- GCancellable *ca; /**< Cancellable object for D-Bus call (Daemon->other) */\r
- GList *dbus_sub_ids; /**< The list of subscribed signals */\r
-\r
- gboolean d2ds_activated; /**< Whether d2d-manager enabled or not */\r
-} d2ds_service;\r
-\r
-#endif /* __D2D_SUBOWNER_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.d2ds">\r
- <!-- Method definitions -->\r
- <method name="disc_mot_enb_devs">\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="disc_mowned_devs">\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="mot">\r
- <arg type="s" name="target" direction="in"/>\r
- <arg type="s" name="pin" direction="in"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="remove_mo">\r
- <arg type="s" name="target" direction="in"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="acl">\r
- <arg type="s" name="target" direction="in"/>\r
- <arg type="s" name="subject" direction="in"/>\r
- <arg type="s" name="uri" direction="in"/>\r
- <arg type="s" name="rt" direction="in"/>\r
- <arg type="s" name="interface" direction="in"/>\r
- <arg type="i" name="permission" direction="in"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="cred">\r
- <arg type="s" name="dev1" direction="in"/>\r
- <arg type="s" name="dev2" direction="in"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="get_ownerid">\r
- <arg type="s" name="devownerid" direction="out"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="pairwise">\r
- <arg type="s" name="target_1" direction="in"/>\r
- <arg type="s" name="subject_1" direction="in"/>\r
- <arg type="s" name="uri_1" direction="in"/>\r
- <arg type="s" name="rt_1" direction="in"/>\r
- <arg type="s" name="interface_1" direction="in"/>\r
- <arg type="i" name="permission_1" direction="in"/>\r
- <arg type="s" name="target_2" direction="in"/>\r
- <arg type="s" name="subject_2" direction="in"/>\r
- <arg type="s" name="uri_2" direction="in"/>\r
- <arg type="s" name="rt_2" direction="in"/>\r
- <arg type="s" name="interface_2" direction="in"/>\r
- <arg type="i" name="permission_2" direction="in"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
- <method name="unpair">\r
- <arg type="s" name="uuid_dev" direction="in"/>\r
- <arg type="i" name="result" direction="out"/>\r
- </method>\r
-\r
- <!-- Signal (D-Bus) definitions -->\r
- <signal name="subowner_enabled">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- <signal name="disc_mot_enb_devs_done">\r
- <arg type="aa{sv}" name="list" direction="out"/>\r
- </signal>\r
- <signal name="disc_mowned_devs_done">\r
- <arg type="aa{sv}" name="list" direction="out"/>\r
- </signal>\r
- <signal name="mot_done">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- <signal name="remove_mo_done">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- <signal name="acl_done">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- <signal name="cred_done">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- <signal name="unpair_done">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- <signal name="pairwise_done">\r
- <arg type="i" name="result" direction="out"/>\r
- </signal>\r
- </interface>\r
-</node>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!DOCTYPE node PUBLIC
- "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
- "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
-
-<node>
- <interface name="net.d2ds.enabler">
- <!-- Method definitions -->
- <method name="enable">
- <arg type="i" name="result" direction="out"/>
- </method>
- <method name="disable">
- <arg type="i" name="result" direction="out"/>
- </method>
- </interface>
-</node>
+++ /dev/null
-gdbus-codegen --interface-prefix net.d2ds. \
- --generate-c-code d2ds-generated-code \
- --c-generate-object-manager \
- --generate-docbook generated-docs \
- d2ds.xml \
- enabler.xml
+++ /dev/null
-/******************************************************************
- *
- * Copyright 2016 Samsung Electronics 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 "iotivity_config.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <glib.h>
-#include <gio/gio.h>
-#include <sqlite3.h>
-
-#include "oic_malloc.h"
-#include "oic_string.h"
-#include "ocprovisioningmanager.h"
-
-#include <tzplatform_config.h>
-
-#include "d2ds.h"
-#include "d2ds-log.h"
-#include "d2ds-util.h"
-
-#define MAX_FILE_PATH_LEN 1024
-
-static const char* PRVN_DB_FILE_NAME = "oic_pdm_d2ds.db"; /**< Provisining DB file */
-
-#define UUID_LENGTH 128/8 /**< 128-bit GUID length */
-
-typedef enum PdmDeviceState {
- PDM_DEVICE_ACTIVE = 0,
- PDM_DEVICE_STALE = 1,
- PDM_DEVICE_INIT = 2,
- PDM_DEVICE_UNKNOWN = 99
-} PdmDeviceState_t;
-
-#define PDM_FIRST_INDEX 0
-#define PDM_SECOND_INDEX 1
-
-#define PDM_BIND_INDEX_FIRST 1
-#define PDM_BIND_INDEX_SECOND 2
-#define PDM_BIND_INDEX_THIRD 3
-
-#define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
- UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);"
-
-#define PDM_CREATE_T_DEVICE_LINK "create table T_DEVICE_LINK_STATE(ID INT NOT NULL, ID2 INT NOT \
- NULL,STATE INT NOT NULL, PRIMARY KEY (ID, ID2));"
-
-#define PDM_VERIFY_SQLITE_OK(arg, logLevel, retValue) do{ if (SQLITE_OK != (arg)) \
- { D2DS_LOGE("Error in " #arg ", Error Message: %s", \
- sqlite3_errmsg(g_db)); return retValue; }}while(0)
-
-#define PDM_SQLITE_TRANSACTION_BEGIN "BEGIN TRANSACTION;"
-#define PDM_SQLITE_TRANSACTION_COMMIT "COMMIT;"
-#define PDM_SQLITE_TRANSACTION_ROLLBACK "ROLLBACK;"
-#define PDM_SQLITE_GET_STALE_INFO "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE STATE = ?"
-#define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?,?)"
-#define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?"
-#define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
-#define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
-#define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
-#define PDM_SQLITE_DELETE_DEVICE "DELETE FROM T_DEVICE_LIST WHERE ID = ?"
-#define PDM_SQLITE_DELETE_DEVICE_WITH_STATE "DELETE FROM T_DEVICE_LIST WHERE STATE= ?"
-#define PDM_SQLITE_UPDATE_LINK "UPDATE T_DEVICE_LINK_STATE SET STATE = ? WHERE ID = ? and ID2 = ?"
-#define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE STATE = 0"
-#define PDM_SQLITE_GET_UUID "SELECT UUID,STATE FROM T_DEVICE_LIST WHERE ID = ?"
-#define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
- (ID = ? or ID2 = ?) and state = 0"
-#define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
- ID = ? and ID2 = ? and state = 0"
-#define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ? WHERE UUID like ?"
-#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID like ?"
-#define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\
- WHERE ID = ? or ID2 = ?"
-
-#define CHECK_PDM_INIT() do{if(true != gInit)\
- { D2DS_LOGE("PDB is not initialized"); \
- return OC_STACK_PDM_IS_NOT_INITIALIZED; }}while(0)
-
-static sqlite3 *g_db = NULL;
-static bool gInit = false; /* Only if we can open sqlite db successfully, gInit is true. */
-
-static OCStackResult begin()
-{
- int res = 0;
- res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_BEGIN, NULL, NULL, NULL);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
- return OC_STACK_OK;
-}
-
-static OCStackResult commit()
-{
- int res = 0;
- res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_COMMIT, NULL, NULL, NULL);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
- return OC_STACK_OK;
-}
-
-static OCStackResult rollback()
-{
- int res = 0;
- res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_ROLLBACK, NULL, NULL, NULL);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
- return OC_STACK_OK;
-}
-
-int openDB()
-{
- int result = 0;
- char path[MAX_FILE_PATH_LEN] = {0,};
-
- snprintf(path, MAX_FILE_PATH_LEN, "%s/network/%s",
- tzplatform_getenv(TZ_SYS_GLOBALUSER_DATA), PRVN_DB_FILE_NAME);
-
- result = sqlite3_open_v2(path, &g_db, SQLITE_OPEN_READWRITE, NULL);
- PDM_VERIFY_SQLITE_OK(result, ERROR, OC_STACK_ERROR);
-
- gInit = true;
-
- return OC_STACK_OK;
-}
-
-int closeDB()
-{
- CHECK_PDM_INIT();
- int res = 0;
- res = sqlite3_close(g_db);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
- return OC_STACK_OK;
-}
-
-static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
-{
- sqlite3_stmt *stmt = 0;
- int res = 0;
- res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_UUID,
- strlen(PDM_SQLITE_GET_UUID) + 1, &stmt, NULL);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
-
- res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
-
- while (SQLITE_ROW == sqlite3_step(stmt))
- {
- const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
- memcpy(uid, ptr, sizeof(OicUuid_t));
-
- int temp = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
- if(PDM_DEVICE_STALE == temp)
- {
- if(result)
- {
- *result = true;
- }
- }
- else
- {
- if(result)
- {
- *result = false;
- }
- }
- sqlite3_finalize(stmt);
- return OC_STACK_OK;
- }
- sqlite3_finalize(stmt);
-
- return OC_STACK_INVALID_PARAM;
-}
-
-static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
-{
- sqlite3_stmt *stmt = 0;
- int res = 0;
- res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
-
- res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
-
- D2DS_LOGD("Binding Done");
- while (SQLITE_ROW == sqlite3_step(stmt))
- {
- int tempId = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
- D2DS_LOGD("ID is %d", tempId);
- *id = tempId;
- sqlite3_finalize(stmt);
- return OC_STACK_OK;
- }
- sqlite3_finalize(stmt);
- return OC_STACK_INVALID_PARAM;
-}
-
-static OCStackResult removeFromDeviceList(int id)
-{
- sqlite3_stmt *stmt = 0;
- int res = 0;
- res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE,
- strlen(PDM_SQLITE_DELETE_DEVICE) + 1, &stmt, NULL);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
-
- res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
- PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
-
- if (sqlite3_step(stmt) != SQLITE_DONE)
- {
- D2DS_LOGE("Error message: %s", sqlite3_errmsg(g_db));
- sqlite3_finalize(stmt);
- return OC_STACK_ERROR;
- }
- sqlite3_finalize(stmt);
-
- return OC_STACK_OK;
-}
-
-int delete_mowned_device_db(const OicUuid_t *UUID)
-{
- CHECK_PDM_INIT();
- if (NULL == UUID)
- {
- return OC_STACK_INVALID_PARAM;
- }
- int id = 0;
- if (OC_STACK_OK != getIdForUUID(UUID, &id))
- {
- D2DS_LOGE("Requested value not found");
- return OC_STACK_INVALID_PARAM;
- }
- begin();
- if(OC_STACK_OK != removeFromDeviceList(id))
- {
- rollback();
- D2DS_LOGE("Requested value not found");
- return OC_STACK_ERROR;
- }
- commit();
- return OC_STACK_OK;
-}
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * 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.
- *
- */
-#ifndef __MAGENT_DB_H__
-#define __MAGENT_DB_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int openDB();
-int closeDB();
-int delete_mowned_device_db(const OicUuid_t *UUID);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __MAGENT_DB_H__ */
+++ /dev/null
-{
- "acl": {
- "aclist": {
- "aces": [
- {
- "subjectuuid": "*",
- "resources": [
- {
- "href": "/oic/res",
- "rel": "",
- "rt": ["oic.wk.res"],
- "if": ["oic.if.ll"]
- },{
- "href": "/oic/d",
- "rel": "",
- "rt": ["oic.wk.d"],
- "if": ["oic.if.baseline", "oic.if.r"]
- },{
- "href": "/oic/p",
- "rel": "",
- "rt": ["oic.wk.p"],
- "if": ["oic.if.baseline", "oic.if.r"]
- }
- ],
- "permission": 2
- },
- {
- "subjectuuid": "*",
- "resources": [
- {
- "href": "/oic/sec/doxm",
- "rel": "",
- "rt": ["oic.r.doxm"],
- "if": ["oic.if.baseline"]
- },
- {
- "href": "/oic/sec/pstat",
- "rel": "",
- "rt": ["oic.r.pstat"],
- "if": ["oic.if.baseline"]
- },
- {
- "href": "/oic/sec/cred",
- "rel": "",
- "rt": ["oic.r.cred"],
- "if": ["oic.if.baseline"]
- }
- ],
- "permission": 6
- }
- ]
- },
- "rowneruuid": "00000000-0000-0000-0000-000000000000"
- },
- "pstat": {
- "isop": false,
- "deviceuuid": "00000000-0000-0000-0000-000000000000",
- "rowneruuid": "00000000-0000-0000-0000-000000000000",
- "cm": 2,
- "tm": 0,
- "om": 4,
- "sm": 4
- },
- "doxm": {
- "oxms": [0],
- "oxmsel": 0,
- "sct": 0,
- "owned": false,
- "deviceuuid": "00000000-0000-0000-0000-000000000000",
- "devowneruuid": "",
- "rowneruuid": "00000000-0000-0000-0000-000000000000"
- }
-}
--- /dev/null
+MESSAGE("===================================================================")
+MESSAGE("Building...MOT client")
+MESSAGE("===================================================================")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/include/cjson)
+
+SET(INTROSPECTION_PATH ${CMAKE_CURRENT_SOURCE_DIR}/introspection)
+ADD_CUSTOM_COMMAND(
+ OUTPUT dbus1
+ COMMAND gdbus-codegen
+ --interface-prefix net.ma.
+ --generate-c-code ma-generated-code
+ --c-generate-object-manager
+ --generate-docbook generated-docs
+ ${INTROSPECTION_PATH}/ma.xml
+ ${INTROSPECTION_PATH}/enabler.xml
+ COMMENT "Generating MOT agent GDBus .c/.h"
+)
+
+MESSAGE(" - Check cmake packagesion")
+pkg_check_modules(ma_pkgs REQUIRED ${COMMON_DEPS} ${TIZEN_DEPS}
+ capi-network-wifi-manager
+ sqlite3
+ )
+
+ADD_CUSTOM_TARGET(GENERATED_MA_DBUS_CODE DEPENDS dbus1)
+MESSAGE(" - Set source folder")
+FILE(GLOB MOT_AGENT_SRCS *.c)
+SET(MOT_AGENT_SRCS ${MOT_AGENT_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/ma-generated-code.c)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/ma-generated-code.c PROPERTIES GENERATED TRUE)
+
+INCLUDE_DIRECTORIES(${ma_pkgs_INCLUDE_DIRS})
+LINK_DIRECTORIES(${ma_pkgs_LIBRARY_DIRS})
+
+SET(MOT_AGENT "mot-agent")
+ADD_EXECUTABLE(${MOT_AGENT} ${MOT_AGENT_SRCS})
+ADD_DEPENDENCIES(${MOT_AGENT} GENERATED_MA_DBUS_CODE)
+TARGET_LINK_LIBRARIES(${MOT_AGENT} ${ma_pkgs_LIBRARIES} pthread)
+INSTALL(TARGETS ${MOT_AGENT} DESTINATION bin)
+INSTALL(FILES oic_svr_db_ma.dat DESTINATION ${NETWORK_FW_DATADIR})
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE node PUBLIC
+ "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
+ "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
+
+<node>
+ <interface name="net.ma.enabler">
+ <!-- Method definitions -->
+ <method name="enable">
+ <arg type="i" name="result" direction="out"/>
+ </method>
+ <method name="disable">
+ <arg type="i" name="result" direction="out"/>
+ </method>
+ </interface>
+</node>
--- /dev/null
+gdbus-codegen --interface-prefix net.ma. \
+ --generate-c-code ma-generated-code \
+ --c-generate-object-manager \
+ --generate-docbook generated-docs \
+ ma.xml \
+ enabler.xml
--- /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.ma">\r
+ <!-- Method definitions -->\r
+ <method name="disc_mot_enb_devs">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="disc_mowned_devs">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="mot">\r
+ <arg type="s" name="target" direction="in"/>\r
+ <arg type="s" name="pin" direction="in"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="remove_mo">\r
+ <arg type="s" name="target" direction="in"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="acl">\r
+ <arg type="s" name="target" direction="in"/>\r
+ <arg type="s" name="subject" direction="in"/>\r
+ <arg type="s" name="uri" direction="in"/>\r
+ <arg type="s" name="rt" direction="in"/>\r
+ <arg type="s" name="interface" direction="in"/>\r
+ <arg type="i" name="permission" direction="in"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="cred">\r
+ <arg type="s" name="dev1" direction="in"/>\r
+ <arg type="s" name="dev2" direction="in"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="get_ownerid">\r
+ <arg type="s" name="devownerid" direction="out"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="pairwise">\r
+ <arg type="s" name="target_1" direction="in"/>\r
+ <arg type="s" name="subject_1" direction="in"/>\r
+ <arg type="s" name="uri_1" direction="in"/>\r
+ <arg type="s" name="rt_1" direction="in"/>\r
+ <arg type="s" name="interface_1" direction="in"/>\r
+ <arg type="i" name="permission_1" direction="in"/>\r
+ <arg type="s" name="target_2" direction="in"/>\r
+ <arg type="s" name="subject_2" direction="in"/>\r
+ <arg type="s" name="uri_2" direction="in"/>\r
+ <arg type="s" name="rt_2" direction="in"/>\r
+ <arg type="s" name="interface_2" direction="in"/>\r
+ <arg type="i" name="permission_2" direction="in"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+ <method name="unpair">\r
+ <arg type="s" name="uuid_dev" direction="in"/>\r
+ <arg type="i" name="result" direction="out"/>\r
+ </method>\r
+\r
+ <!-- Signal (D-Bus) definitions -->\r
+ <signal name="subowner_enabled">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="disc_mot_enb_devs_done">\r
+ <arg type="aa{sv}" name="list" direction="out"/>\r
+ </signal>\r
+ <signal name="disc_mowned_devs_done">\r
+ <arg type="aa{sv}" name="list" direction="out"/>\r
+ </signal>\r
+ <signal name="mot_done">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="remove_mo_done">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="acl_done">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="cred_done">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="unpair_done">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ <signal name="pairwise_done">\r
+ <arg type="i" name="result" direction="out"/>\r
+ </signal>\r
+ </interface>\r
+</node>\r
--- /dev/null
+/******************************************************************
+ *
+ * Copyright 2016 Samsung Electronics 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 "iotivity_config.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <glib.h>
+#include <gio/gio.h>
+#include <sqlite3.h>
+
+#include "oic_malloc.h"
+#include "oic_string.h"
+#include "ocprovisioningmanager.h"
+
+#include <tzplatform_config.h>
+
+#include "ma.h"
+#include "ma-log.h"
+#include "ma-util.h"
+
+#define MAX_FILE_PATH_LEN 1024
+
+static const char* PRVN_DB_FILE_NAME = "oic_pdm_ma.db"; /**< Provisining DB file */
+
+#define UUID_LENGTH 128/8 /**< 128-bit GUID length */
+
+typedef enum PdmDeviceState {
+ PDM_DEVICE_ACTIVE = 0,
+ PDM_DEVICE_STALE = 1,
+ PDM_DEVICE_INIT = 2,
+ PDM_DEVICE_UNKNOWN = 99
+} PdmDeviceState_t;
+
+#define PDM_FIRST_INDEX 0
+#define PDM_SECOND_INDEX 1
+
+#define PDM_BIND_INDEX_FIRST 1
+#define PDM_BIND_INDEX_SECOND 2
+#define PDM_BIND_INDEX_THIRD 3
+
+#define PDM_CREATE_T_DEVICE_LIST "create table T_DEVICE_LIST(ID INTEGER PRIMARY KEY AUTOINCREMENT,\
+ UUID BLOB NOT NULL UNIQUE, STATE INT NOT NULL);"
+
+#define PDM_CREATE_T_DEVICE_LINK "create table T_DEVICE_LINK_STATE(ID INT NOT NULL, ID2 INT NOT \
+ NULL,STATE INT NOT NULL, PRIMARY KEY (ID, ID2));"
+
+#define PDM_VERIFY_SQLITE_OK(arg, logLevel, retValue) do{ if (SQLITE_OK != (arg)) \
+ { MA_LOGE("Error in " #arg ", Error Message: %s", \
+ sqlite3_errmsg(g_db)); return retValue; }}while(0)
+
+#define PDM_SQLITE_TRANSACTION_BEGIN "BEGIN TRANSACTION;"
+#define PDM_SQLITE_TRANSACTION_COMMIT "COMMIT;"
+#define PDM_SQLITE_TRANSACTION_ROLLBACK "ROLLBACK;"
+#define PDM_SQLITE_GET_STALE_INFO "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE STATE = ?"
+#define PDM_SQLITE_INSERT_T_DEVICE_LIST "INSERT INTO T_DEVICE_LIST VALUES(?,?,?)"
+#define PDM_SQLITE_GET_ID "SELECT ID FROM T_DEVICE_LIST WHERE UUID like ?"
+#define PDM_SQLITE_INSERT_LINK_DATA "INSERT INTO T_DEVICE_LINK_STATE VALUES(?,?,?)"
+#define PDM_SQLITE_DELETE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? and ID2 = ?"
+#define PDM_SQLITE_DELETE_DEVICE_LINK "DELETE FROM T_DEVICE_LINK_STATE WHERE ID = ? or ID2 = ?"
+#define PDM_SQLITE_DELETE_DEVICE "DELETE FROM T_DEVICE_LIST WHERE ID = ?"
+#define PDM_SQLITE_DELETE_DEVICE_WITH_STATE "DELETE FROM T_DEVICE_LIST WHERE STATE= ?"
+#define PDM_SQLITE_UPDATE_LINK "UPDATE T_DEVICE_LINK_STATE SET STATE = ? WHERE ID = ? and ID2 = ?"
+#define PDM_SQLITE_LIST_ALL_UUID "SELECT UUID FROM T_DEVICE_LIST WHERE STATE = 0"
+#define PDM_SQLITE_GET_UUID "SELECT UUID,STATE FROM T_DEVICE_LIST WHERE ID = ?"
+#define PDM_SQLITE_GET_LINKED_DEVICES "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
+ (ID = ? or ID2 = ?) and state = 0"
+#define PDM_SQLITE_GET_DEVICE_LINKS "SELECT ID,ID2 FROM T_DEVICE_LINK_STATE WHERE \
+ ID = ? and ID2 = ? and state = 0"
+#define PDM_SQLITE_UPDATE_DEVICE "UPDATE T_DEVICE_LIST SET STATE = ? WHERE UUID like ?"
+#define PDM_SQLITE_GET_DEVICE_STATUS "SELECT STATE FROM T_DEVICE_LIST WHERE UUID like ?"
+#define PDM_SQLITE_UPDATE_LINK_STALE_FOR_STALE_DEVICE "UPDATE T_DEVICE_LINK_STATE SET STATE = 1\
+ WHERE ID = ? or ID2 = ?"
+
+#define CHECK_PDM_INIT() do{if(true != gInit)\
+ { MA_LOGE("PDB is not initialized"); \
+ return OC_STACK_PDM_IS_NOT_INITIALIZED; }}while(0)
+
+static sqlite3 *g_db = NULL;
+static bool gInit = false; /* Only if we can open sqlite db successfully, gInit is true. */
+
+static OCStackResult begin()
+{
+ int res = 0;
+ res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_BEGIN, NULL, NULL, NULL);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+ return OC_STACK_OK;
+}
+
+static OCStackResult commit()
+{
+ int res = 0;
+ res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_COMMIT, NULL, NULL, NULL);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+ return OC_STACK_OK;
+}
+
+static OCStackResult rollback()
+{
+ int res = 0;
+ res = sqlite3_exec(g_db, PDM_SQLITE_TRANSACTION_ROLLBACK, NULL, NULL, NULL);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+ return OC_STACK_OK;
+}
+
+int openDB()
+{
+ int result = 0;
+ char path[MAX_FILE_PATH_LEN] = {0,};
+
+ snprintf(path, MAX_FILE_PATH_LEN, "%s/network/%s",
+ tzplatform_getenv(TZ_SYS_GLOBALUSER_DATA), PRVN_DB_FILE_NAME);
+
+ result = sqlite3_open_v2(path, &g_db, SQLITE_OPEN_READWRITE, NULL);
+ PDM_VERIFY_SQLITE_OK(result, ERROR, OC_STACK_ERROR);
+
+ gInit = true;
+
+ return OC_STACK_OK;
+}
+
+int closeDB()
+{
+ CHECK_PDM_INIT();
+ int res = 0;
+ res = sqlite3_close(g_db);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+ return OC_STACK_OK;
+}
+
+static OCStackResult getUUIDforId(int id, OicUuid_t *uid, bool *result)
+{
+ sqlite3_stmt *stmt = 0;
+ int res = 0;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_UUID,
+ strlen(PDM_SQLITE_GET_UUID) + 1, &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+
+ while (SQLITE_ROW == sqlite3_step(stmt))
+ {
+ const void *ptr = sqlite3_column_blob(stmt, PDM_FIRST_INDEX);
+ memcpy(uid, ptr, sizeof(OicUuid_t));
+
+ int temp = sqlite3_column_int(stmt, PDM_SECOND_INDEX);
+ if(PDM_DEVICE_STALE == temp)
+ {
+ if(result)
+ {
+ *result = true;
+ }
+ }
+ else
+ {
+ if(result)
+ {
+ *result = false;
+ }
+ }
+ sqlite3_finalize(stmt);
+ return OC_STACK_OK;
+ }
+ sqlite3_finalize(stmt);
+
+ return OC_STACK_INVALID_PARAM;
+}
+
+static OCStackResult getIdForUUID(const OicUuid_t *UUID , int *id)
+{
+ sqlite3_stmt *stmt = 0;
+ int res = 0;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_GET_ID, strlen(PDM_SQLITE_GET_ID) + 1, &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_blob(stmt, PDM_BIND_INDEX_FIRST, UUID, UUID_LENGTH, SQLITE_STATIC);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+
+ MA_LOGD("Binding Done");
+ while (SQLITE_ROW == sqlite3_step(stmt))
+ {
+ int tempId = sqlite3_column_int(stmt, PDM_FIRST_INDEX);
+ MA_LOGD("ID is %d", tempId);
+ *id = tempId;
+ sqlite3_finalize(stmt);
+ return OC_STACK_OK;
+ }
+ sqlite3_finalize(stmt);
+ return OC_STACK_INVALID_PARAM;
+}
+
+static OCStackResult removeFromDeviceList(int id)
+{
+ sqlite3_stmt *stmt = 0;
+ int res = 0;
+ res = sqlite3_prepare_v2(g_db, PDM_SQLITE_DELETE_DEVICE,
+ strlen(PDM_SQLITE_DELETE_DEVICE) + 1, &stmt, NULL);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+
+ res = sqlite3_bind_int(stmt, PDM_BIND_INDEX_FIRST, id);
+ PDM_VERIFY_SQLITE_OK(res, ERROR, OC_STACK_ERROR);
+
+ if (sqlite3_step(stmt) != SQLITE_DONE)
+ {
+ MA_LOGE("Error message: %s", sqlite3_errmsg(g_db));
+ sqlite3_finalize(stmt);
+ return OC_STACK_ERROR;
+ }
+ sqlite3_finalize(stmt);
+
+ return OC_STACK_OK;
+}
+
+int delete_mowned_device_db(const OicUuid_t *UUID)
+{
+ CHECK_PDM_INIT();
+ if (NULL == UUID)
+ {
+ return OC_STACK_INVALID_PARAM;
+ }
+ int id = 0;
+ if (OC_STACK_OK != getIdForUUID(UUID, &id))
+ {
+ MA_LOGE("Requested value not found");
+ return OC_STACK_INVALID_PARAM;
+ }
+ begin();
+ if(OC_STACK_OK != removeFromDeviceList(id))
+ {
+ rollback();
+ MA_LOGE("Requested value not found");
+ return OC_STACK_ERROR;
+ }
+ commit();
+ return OC_STACK_OK;
+}
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * 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.
+ *
+ */
+#ifndef __MAGENT_DB_H__
+#define __MAGENT_DB_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int openDB();
+int closeDB();
+int delete_mowned_device_db(const OicUuid_t *UUID);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAGENT_DB_H__ */
--- /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 __MA_LOG_H__\r
+#define __MA_LOG_H__\r
+\r
+#ifdef LOG_TAG\r
+#undef LOG_TAG\r
+#endif\r
+\r
+#ifdef USE_DLOG\r
+#include <dlog.h>\r
+\r
+#undef LOG_TAG\r
+#define LOG_TAG "MOT_AGENT"\r
+\r
+#define MA_LOGV(format, args...) LOGV(format, ##args)\r
+#define MA_LOGD(format, args...) LOGD(format, ##args)\r
+#define MA_LOGI(format, args...) LOGI(format, ##args)\r
+#define MA_LOGW(format, args...) LOGW(format, ##args)\r
+#define MA_LOGE(format, args...) LOGE(format, ##args)\r
+#define MA_LOGF(format, args...) LOGF(format, ##args)\r
+\r
+#define __MA_LOG_FUNC_ENTER__ LOGD("Enter")\r
+#define __MA_LOG_FUNC_EXIT__ LOGD("Quit")\r
+\r
+#define MA_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, MA_LOG_TAG, format, ##args)\r
+#define MA_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, MA_LOG_TAG, format, ##args)\r
+\r
+#else /* USE_DLOG */\r
+\r
+#define MA_LOGV(format, args...)\r
+#define MA_LOGD(format, args...)\r
+#define MA_LOGI(format, args...)\r
+#define MA_LOGW(format, args...)\r
+#define MA_LOGE(format, args...)\r
+#define MA_LOGF(format, args...)\r
+\r
+#define __MA_LOG_FUNC_ENTER__\r
+#define __MA_LOG_FUNC_EXIT__\r
+\r
+#define MA_SECLOGI(format, args...)\r
+#define MA_SECLOGD(format, args...)\r
+\r
+#endif /* USE_DLOG */\r
+\r
+#endif /* __MA_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 "ma.h"\r
+#include "ma-log.h"\r
+#include "ma-util.h"\r
+#include "ma-service.h"\r
+#include "ma-subowner.h"\r
+#include "ma-service-interface.h"\r
+#include "ma-generated-code.h"\r
+\r
+static NetMa *ma_dbus_object;\r
+static Enabler *ma_activator_dbus_object;\r
+\r
+/* global list to care resource handle for each client */\r
+static GList *ma_dbus_client_list;\r
+static GMutex ma_dbus_client_list_mutex;\r
+\r
+typedef struct _ma_dbus_client_s {\r
+ gchar *bus_name;\r
+} ma_dbus_client_s;\r
+\r
+NetMa* ma_dbus_get_object()\r
+{\r
+ return ma_dbus_object;\r
+}\r
+\r
+static int _ma_dbus_client_list_cleanup(GList *client_list)\r
+{\r
+ ma_dbus_client_s *client;\r
+\r
+ ma_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 MA_ERROR_NONE;\r
+}\r
+\r
+static int _ma_dbus_client_list_compare_bus_name(const void *a, const void *b)\r
+{\r
+ const ma_dbus_client_s *client = a;\r
+ return g_strcmp0(client->bus_name, b);\r
+}\r
+\r
+static inline GList* _ma_dbus_client_list_find_client(const gchar *owner)\r
+{\r
+ return g_list_find_custom(ma_dbus_client_list, owner,\r
+ _ma_dbus_client_list_compare_bus_name);\r
+}\r
+\r
+static void _ma_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(&ma_dbus_client_list_mutex);\r
+ client = _ma_dbus_client_list_find_client(old_owner);\r
+ if (client) { /* found bus name in our bus list */\r
+ MA_LOGD("bus(%s) stopped", old_owner);\r
+ ma_dbus_client_list = g_list_remove_link(ma_dbus_client_list, client);\r
+ }\r
+ g_mutex_unlock(&ma_dbus_client_list_mutex);\r
+\r
+ if (client) {\r
+ ret = _ma_dbus_client_list_cleanup(client);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("_ma_dbus_client_list_cleanup() Fail(%d)", ret);\r
+ }\r
+ }\r
+}\r
+\r
+static int _ma_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
+ _ma_dbus_name_owner_changed_cb,\r
+ NULL,\r
+ NULL);\r
+ if (0 == id) {\r
+ MA_LOGE("g_dbus_connection_signal_subscribe() Fail");\r
+ return MA_ERROR_IO_ERROR;\r
+ }\r
+\r
+ return MA_ERROR_NONE;\r
+}\r
+\r
+\r
+static gboolean _ma_dbus_handle_disc_mot_enb_devs(NetMa *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+ ret = ma_request_disc_mot_enb_devs(service);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_disc_mot_enb_devs !");\r
+\r
+ net_ma_complete_disc_mot_enb_devs(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_disc_mowned_devs(NetMa *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+ ret = ma_request_disc_owned_devs(service);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_disc_owned_devs !");\r
+\r
+ net_ma_complete_disc_mowned_devs(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_mot(NetMa *object,\r
+ GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_pin, gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+ ret = ma_request_mot(service, arg_target, arg_pin);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_disc_moted_devs !");\r
+\r
+ net_ma_complete_mot(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_remove_mo(NetMa *object,\r
+ GDBusMethodInvocation *invocation, gchar *arg_target, gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+ ret = ma_request_remove_mo(service, arg_target);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_remove_mo !");\r
+\r
+ net_ma_complete_remove_mo(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
+static gboolean _ma_dbus_handle_acl(NetMa *object,\r
+ GDBusMethodInvocation *invocation, gchar *arg_target, gchar *arg_subject, gchar *arg_uri,\r
+ gchar *arg_rt, gchar *arg_interface, gint arg_permission, gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+ ret = ma_request_prov_acl(service, arg_target, arg_subject, arg_uri, arg_rt, arg_interface, arg_permission);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_prov_acl !");\r
+\r
+ net_ma_complete_acl(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_cred(NetMa *object,\r
+ GDBusMethodInvocation *invocation, gchar *arg_dev1, gchar *arg_dev2, gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+ ret = ma_request_prov_cred(service, arg_dev1, arg_dev2);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_prov_cred !");\r
+\r
+ net_ma_complete_cred(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_get_ownerid(NetMa *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ gchar *uuid_str = NULL;\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+ ret = ma_request_get_ownerid(service, &uuid_str);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_get_ownerid = %d", ret);\r
+\r
+ net_ma_complete_get_ownerid(object, invocation, uuid_str, ret);\r
+\r
+ if (uuid_str)\r
+ g_free(uuid_str);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_pairwise(NetMa *object,\r
+ GDBusMethodInvocation *invocation, gchar *target_1,\r
+ gchar *subject_1, gchar *uri_1, gchar *rt_1,\r
+ gchar *interface_1, int permission_1, gchar *target_2,\r
+ gchar *subject_2, gchar *uri_2, gchar *rt_2,\r
+ gchar *interface_2, int permission_2, gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+\r
+ ret = ma_request_pairwise(service, target_1, subject_1, uri_1, rt_1,\r
+ interface_1, permission_1, target_2, subject_2, uri_2,\r
+ rt_2, interface_2, permission_2);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_pairwise = %d", ret);\r
+\r
+ net_ma_complete_pairwise(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_unpair(NetMa *object,\r
+ GDBusMethodInvocation *invocation, gchar *uuid_dev, gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+ ret = ma_request_unpair(service, uuid_dev);\r
+ if (MA_ERROR_NONE != ret)\r
+ MA_LOGE("Failed to ma_request_unpair = %d", ret);\r
+\r
+ net_ma_complete_unpair(object, invocation, ret);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static void _ma_dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,\r
+ gpointer user_data)\r
+{\r
+ gboolean ret;\r
+ GError *error = NULL;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ NOTUSED(name);\r
+\r
+ ma_dbus_object = net_ma_skeleton_new();\r
+ if (NULL == ma_dbus_object) {\r
+ MA_LOGE("net_ma_skeleton_new() Fail");\r
+ return;\r
+ }\r
+\r
+ g_signal_connect(ma_dbus_object, "handle-disc-mot-enb-devs",\r
+ G_CALLBACK(_ma_dbus_handle_disc_mot_enb_devs), service);\r
+ g_signal_connect(ma_dbus_object, "handle-disc-mowned-devs",\r
+ G_CALLBACK(_ma_dbus_handle_disc_mowned_devs), service);\r
+ g_signal_connect(ma_dbus_object, "handle-mot",\r
+ G_CALLBACK(_ma_dbus_handle_mot), service);\r
+ g_signal_connect(ma_dbus_object, "handle-remove-mo",\r
+ G_CALLBACK(_ma_dbus_handle_remove_mo), service);\r
+ g_signal_connect(ma_dbus_object, "handle-acl",\r
+ G_CALLBACK(_ma_dbus_handle_acl), service);\r
+ g_signal_connect(ma_dbus_object, "handle-cred",\r
+ G_CALLBACK(_ma_dbus_handle_cred), service);\r
+ g_signal_connect(ma_dbus_object, "handle-get-ownerid",\r
+ G_CALLBACK(_ma_dbus_handle_get_ownerid), service);\r
+ g_signal_connect(ma_dbus_object, "handle-pairwise",\r
+ G_CALLBACK(_ma_dbus_handle_pairwise), service);\r
+ g_signal_connect(ma_dbus_object, "handle-unpair",\r
+ G_CALLBACK(_ma_dbus_handle_unpair), service);\r
+\r
+ ret = g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(ma_dbus_object),\r
+ conn, MA_DBUS_OBJPATH, &error);\r
+ if (FALSE == ret) {\r
+ MA_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);\r
+ g_error_free(error);\r
+ }\r
+\r
+ ret = _ma_dbus_subscribe_name_owner_changed(conn);\r
+ if (MA_ERROR_NONE != ret) {\r
+ MA_LOGE("_ma_dbus_subscribe_name_owner_changed() Fail(%d)", ret);\r
+ return;\r
+ }\r
+}\r
+\r
+static void _ma_dbus_on_name_lost(GDBusConnection *conn, const gchar *name,\r
+ gpointer user_data)\r
+{\r
+ NOTUSED(conn);\r
+ NOTUSED(user_data);\r
+\r
+ MA_LOGD("Lost the name %s", name);\r
+}\r
+\r
+static void _ma_dbus_on_name_acquired(GDBusConnection *conn, const gchar *name,\r
+ gpointer user_data)\r
+{\r
+ NOTUSED(conn);\r
+ NOTUSED(user_data);\r
+\r
+ MA_LOGD("Acquired the name %s", name);\r
+}\r
+\r
+static gboolean _ma_dbus_handle_enable(Enabler *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ __MA_LOG_FUNC_ENTER__;\r
+\r
+ /* Do API response first */\r
+ enabler_complete_enable(object, invocation, ret);\r
+ service->ma_activated = TRUE;\r
+\r
+ /* Intialize subowner client */\r
+ ret = ma_request_enable(service);\r
+ if (MA_ERROR_NONE != ret) {\r
+ MA_LOGE("ma_request_enable() Fail(%d)", ret);\r
+ return FALSE;\r
+ }\r
+\r
+ /* Notify d2ds enabled */\r
+ net_ma_emit_subowner_enabled(ma_dbus_get_object(), ret);\r
+\r
+ __MA_LOG_FUNC_EXIT__;\r
+\r
+ return TRUE;\r
+}\r
+\r
+static gboolean _ma_dbus_handle_disable(Enabler *object,\r
+ GDBusMethodInvocation *invocation,\r
+ gpointer user_data)\r
+{\r
+ int ret = MA_ERROR_NONE;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ __MA_LOG_FUNC_ENTER__;\r
+\r
+ /* Make response first */\r
+ enabler_complete_disable(object, invocation, ret);\r
+\r
+ /* De-Intialize subowner client */\r
+ ret = ma_request_disable(service);\r
+ if (MA_ERROR_NONE != ret) {\r
+ MA_LOGE("ma_request_disable() Fail(%d)", ret);\r
+ return FALSE;\r
+ }\r
+\r
+ /* Terminate daemon */\r
+ ma_service_exit(service);\r
+\r
+ return TRUE;\r
+}\r
+\r
+static void _ma_dbus_on_activator_bus_acquired(GDBusConnection *conn,\r
+ const gchar *name, gpointer user_data)\r
+{\r
+ gboolean ret;\r
+ GError *error = NULL;\r
+ ma_service *service = (ma_service *)user_data;\r
+\r
+ NOTUSED(name);\r
+\r
+ __MA_LOG_FUNC_ENTER__;\r
+\r
+ ma_activator_dbus_object = enabler_skeleton_new();\r
+ if (NULL == ma_activator_dbus_object) {\r
+ MA_LOGE("enabler_skeleton_new() Fail");\r
+ return;\r
+ }\r
+\r
+ g_signal_connect(ma_activator_dbus_object, "handle-enable",\r
+ G_CALLBACK(_ma_dbus_handle_enable), service);\r
+ g_signal_connect(ma_activator_dbus_object, "handle-disable",\r
+ G_CALLBACK(_ma_dbus_handle_disable), service);\r
+\r
+ ret = g_dbus_interface_skeleton_export(\r
+ G_DBUS_INTERFACE_SKELETON(ma_activator_dbus_object),\r
+ conn, MA_DBUS_ENABLER_OBJPATH, &error);\r
+ if (FALSE == ret) {\r
+ MA_LOGE("g_dbus_interface_skeleton_export() Fail(%s)", error->message);\r
+ g_error_free(error);\r
+ }\r
+\r
+ __MA_LOG_FUNC_EXIT__;\r
+\r
+}\r
+\r
+static gboolean _ma_dbus_interface_init(ma_service *service)\r
+{\r
+ guint id;\r
+ guint activation_dbus_id;\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+ id = g_bus_own_name(G_BUS_TYPE_SYSTEM,\r
+ MA_DBUS_INTERFACE,\r
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,\r
+ _ma_dbus_on_bus_acquired,\r
+ _ma_dbus_on_name_acquired,\r
+ _ma_dbus_on_name_lost,\r
+ service,\r
+ NULL);\r
+ if (0 == id) {\r
+ MA_LOGE("g_bus_own_name() Fail");\r
+ return FALSE;\r
+ }\r
+\r
+ /* Get D-Bus owner to activate subowner service daemon */\r
+ activation_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,\r
+ MA_DBUS_INTERFACE".enabler",\r
+ G_BUS_NAME_OWNER_FLAGS_REPLACE,\r
+ _ma_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
+ return TRUE;\r
+}\r
+\r
+void ma_notify_mot_env_devs(GVariant *devices)\r
+{\r
+ /* Notify d2ds enabled */\r
+ net_ma_emit_disc_mot_enb_devs_done(ma_dbus_get_object(), devices);\r
+}\r
+\r
+void ma_notify_mowned_devs(GVariant *devices)\r
+{\r
+ /* Notify d2ds enabled */\r
+ net_ma_emit_disc_mowned_devs_done(ma_dbus_get_object(), devices);\r
+}\r
+\r
+static void _ma_dbus_deinit(ma_service *service)\r
+{\r
+ ma_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 ma_service_interface_init(ma_service *service)\r
+{\r
+ guint ret;\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+\r
+ __MA_LOG_FUNC_ENTER__;\r
+\r
+ /* Initialize dbus interface */\r
+ ret = _ma_dbus_interface_init(service);\r
+ if (FALSE == ret) {\r
+ MA_LOGE("%s failed!!!", __func__);\r
+ return FALSE;\r
+ }\r
+\r
+ __MA_LOG_FUNC_EXIT__;\r
+\r
+ return TRUE;\r
+}\r
+\r
+void ma_service_interface_deinit(ma_service *service)\r
+{\r
+ ma_check_null_ret("service", service);\r
+\r
+ /* De-initialize dbus interface */\r
+ _ma_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 __MA_SERVICE_INTERFACE_H__\r
+#define __MA_SERVICE_INTERFACE_H__\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/**< Mesh D-BUS service*/\r
+#define MA_DBUS_SERVICE "net.ma"\r
+\r
+/**< Mesh D-BUS service path */\r
+#define MA_DBUS_PATH "/net/ma"\r
+\r
+#ifndef MA_DBUS_INTERFACE\r
+#define MA_DBUS_INTERFACE "net.ma"\r
+#endif\r
+\r
+#ifndef MA_DBUS_OBJPATH\r
+#define MA_DBUS_OBJPATH "/net/ma"\r
+#endif\r
+\r
+#ifndef MA_DBUS_ENABLER_OBJPATH\r
+#define MA_DBUS_ENABLER_OBJPATH "/net/ma/enabler"\r
+#endif\r
+\r
+struct _NetMa;\r
+typedef struct _NetMa NetMa;\r
+\r
+NetMa* ma_dbus_get_object();\r
+gboolean ma_service_interface_init(ma_service *service);\r
+void ma_service_interface_deinit(ma_service *service);\r
+void ma_notify_mot_env_devs(GVariant *devices);\r
+void ma_notify_mowned_devs(GVariant *devices);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __MA_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 "ma.h"\r
+#include "ma-log.h"\r
+#include "ma-util.h"\r
+\r
+ma_service *ma_service_new()\r
+{\r
+ ma_service *service;\r
+\r
+ service = g_malloc0(sizeof(struct _ma_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
+ MA_LOGE("g-main loop creation failed!!!");\r
+ g_free(service);\r
+ return NULL;\r
+ }\r
+\r
+ return service;\r
+}\r
+\r
+void ma_service_free(ma_service *service)\r
+{\r
+ ma_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 ma_service_run(ma_service *service)\r
+{\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+ ma_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 ma_service_exit(ma_service *service)\r
+{\r
+ ma_check_null_ret_error("service", service, FALSE);\r
+ ma_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 __MA_SERVICE_H__\r
+#define __MA_SERVICE_H__\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+ma_service* ma_service_new();\r
+void ma_service_free(ma_service *service);\r
+gboolean ma_service_run(ma_service *service);\r
+gboolean ma_service_exit(ma_service *service);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __MA_SERVICE_H__ */\r
+\r
--- /dev/null
+/******************************************************************
+ *
+ * Copyright 2016 Samsung Electronics 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 <errno.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <iotivity_config.h>
+#include <platform_features.h>
+#include <utlist.h>
+#include <oic_malloc.h>
+#include <ocprovisioningmanager.h>
+#include <oxmjustworks.h>
+#include <oxmrandompin.h>
+#include <srmutility.h>
+#include <securevirtualresourcetypes.h>
+#include <security/srmutility.h>
+#include <pmtypes.h>
+#include <pmutility.h>
+
+#include <wifi-manager.h>
+#include <tzplatform_config.h>
+
+#include "ma.h"
+#include "ma-log.h"
+#include "ma-util.h"
+#include "ma-subowner.h"
+#include "ma-service-interface.h"
+#include "ma-generated-code.h"
+#include "ma-db.h"
+
+#define WIFI_MAC_ADDR_LENGTH 17
+
+#define MAX_FILE_PATH_LEN 1024
+#define ACL_RESRC_MAX_LEN 128
+
+/*This value is used only for sample (not OCF spec) */
+#define ACL_RESRC_ARRAY_SIZE 3
+
+#define DISCOVERY_TIMEOUT 3 /**< 3 sec */
+#define CALLBACK_TIMEOUT_10S 10 * 1000 /**< 10 sec = 10 * 1000 * 1ms */
+#define CALLBACK_TIMEOUT_5S 5 * 1000 /**< 5sec = 5 * 1000 * 1ms */
+
+#define TIMEOUT_USED
+
+/* '_' for separaing from the same constant variable in srmresourcestrings.c */
+static const char* SVR_DB_FILE_NAME = "oic_svr_db_ma.dat";
+static const char* PRVN_DB_FILE_NAME = "oic_pdm_ma.db";
+
+#ifdef TEST
+static const OicSecPrm_t SUPPORTED_PRMS[2] = { PRM_PRE_CONFIGURED, PRM_RANDOM_PIN };
+#endif
+
+OCStackResult GetDoxmDevOwnerId(OicUuid_t *devownerid);
+
+typedef struct {
+ ma_cmd_id_e cid; /**< Command ID */
+ int tid; /**< Timer ID */
+ GThread *thread; /**< Thread handle */
+ unsigned int sid; /**< Subcribed signal ID */
+ bool found; /**< Whether we discoverd devices */
+ void *cb; /**< Callback function pointer */
+ void *userdata; /**< User data */
+
+ /* To-Do : Change belows to union type */
+
+ /* For MOT */
+ gchar *uuid_target_str; /**< Target device*/
+ gchar *pin; /**< PIN */
+
+ /* For ACL provisioning */
+ gchar *uuid_subject_str;/**< Subject device for ACL */
+ gchar *rsrc_uri; /**< Resource URI */
+ gchar *rsrc_type; /**< Resouce Type */
+ gchar *rsrc_interface; /**< Resource Interface Array To-Do : Make this as array */
+ int permission;/**< Permision */
+
+ /* For CRED provisioning */
+ gchar *uuid_dev1; /**< 1st device for CRED provisiong */
+ gchar *uuid_dev2; /**< 2nd device for CRED provisiong */
+
+ /* For Pairwaise linking */
+ gchar *target_1; /**< Target device 1*/
+ gchar *target_2; /**< Target device 1*/
+
+ gchar *subject_1; /**< Target device for ACL */
+ gchar *rsrc_uri_1; /**< Resource URI */
+ gchar *rsrc_type_1; /**< Resouce Type */
+ gchar *rsrc_interface_1; /**< Resource Interface Array To-Do : Make this as array */
+ int permission_1;/**< Permision */
+ gchar *subject_2; /**< Target device for ACL */
+ gchar *rsrc_uri_2; /**< Resource URI */
+ gchar *rsrc_type_2; /**< Resouce Type */
+ gchar *rsrc_interface_2; /**< Resource Interface Array To-Do : Make this as array */
+ int permission_2;/**< Permision */
+
+ /* For unpair */
+ gchar *target_to_revoke; /**< Target device to revoke */
+
+} ma_req_cb_s;
+
+typedef struct _ma_subowner {
+ OCProvisionDev_t* g_motdev_list; /**< Discoverd MOT enabled devices list */
+ OCProvisionDev_t* g_mowned_list; /**< My owned MOT enabled devices list */
+
+ int g_motdev_cnt; /**< Number of MOT enabled devices */
+ int g_mowndev_cnt; /**< Number of my owned MOT enabled devices */
+
+ bool g_doneCB; /**< This means callback completed or not */
+
+ char *rnd_pin; /**< Random PIN */
+ int rnd_pin_len; /**< Random PIN length */
+
+} ma_subowner_s;
+
+ma_subowner_s *g_client;
+
+#define CASE_TO_STR(x) case x: return #x;
+const char* _error_to_string(OCStackResult err)
+{
+ switch (err) {
+ /* CHECK: List all enum values here */
+ CASE_TO_STR(OC_STACK_OK)
+ CASE_TO_STR(OC_STACK_RESOURCE_CREATED)
+ CASE_TO_STR(OC_STACK_RESOURCE_DELETED)
+ CASE_TO_STR(OC_STACK_CONTINUE)
+ CASE_TO_STR(OC_STACK_RESOURCE_CHANGED)
+ CASE_TO_STR(OC_STACK_INVALID_URI)
+ CASE_TO_STR(OC_STACK_INVALID_QUERY)
+ CASE_TO_STR(OC_STACK_INVALID_IP)
+ CASE_TO_STR(OC_STACK_INVALID_PORT)
+ CASE_TO_STR(OC_STACK_INVALID_CALLBACK)
+ CASE_TO_STR(OC_STACK_INVALID_METHOD)
+ CASE_TO_STR(OC_STACK_INVALID_PARAM)
+ CASE_TO_STR(OC_STACK_INVALID_OBSERVE_PARAM)
+
+
+ CASE_TO_STR(OC_STACK_NO_MEMORY)
+ CASE_TO_STR(OC_STACK_COMM_ERROR)
+ CASE_TO_STR(OC_STACK_TIMEOUT)
+ CASE_TO_STR(OC_STACK_ADAPTER_NOT_ENABLED)
+ CASE_TO_STR(OC_STACK_NOTIMPL)
+ CASE_TO_STR(OC_STACK_RESOURCE_ERROR)
+ CASE_TO_STR(OC_STACK_SLOW_RESOURCE)
+ CASE_TO_STR(OC_STACK_DUPLICATE_REQUEST)
+ CASE_TO_STR(OC_STACK_OBSERVER_NOT_FOUND)
+ CASE_TO_STR(OC_STACK_VIRTUAL_DO_NOT_HANDLE)
+ CASE_TO_STR(OC_STACK_INVALID_OPTION)
+ CASE_TO_STR(OC_STACK_MALFORMED_RESPONSE)
+ CASE_TO_STR(OC_STACK_PERSISTENT_BUFFER_REQUIRED)
+
+ CASE_TO_STR(OC_STACK_INVALID_REQUEST_HANDLE)
+ CASE_TO_STR(OC_STACK_INVALID_DEVICE_INFO)
+ CASE_TO_STR(OC_STACK_INVALID_JSON)
+ CASE_TO_STR(OC_STACK_UNAUTHORIZED_REQ)
+ CASE_TO_STR(OC_STACK_TOO_LARGE_REQ)
+ CASE_TO_STR(OC_STACK_PDM_IS_NOT_INITIALIZED)
+ CASE_TO_STR(OC_STACK_DUPLICATE_UUID)
+ CASE_TO_STR(OC_STACK_INCONSISTENT_DB)
+ CASE_TO_STR(OC_STACK_SVR_DB_NOT_EXIST)
+ CASE_TO_STR(OC_STACK_AUTHENTICATION_FAILURE)
+ CASE_TO_STR(OC_STACK_NOT_ALLOWED_OXM)
+#ifdef WITH_PRESENCE
+ CASE_TO_STR(OC_STACK_PRESENCE_STOPPED)
+ CASE_TO_STR(OC_STACK_PRESENCE_TIMEOUT)
+ CASE_TO_STR(OC_STACK_PRESENCE_DO_NOT_HANDLE)
+#endif
+ CASE_TO_STR(OC_STACK_USER_DENIED_REQ)
+ CASE_TO_STR(OC_STACK_NOT_ACCEPTABLE)
+ CASE_TO_STR(OC_STACK_METHOD_NOT_ALLOWED)
+ CASE_TO_STR(OC_STACK_FORBIDDEN_REQ)
+ CASE_TO_STR(OC_STACK_INTERNAL_SERVER_ERROR)
+ CASE_TO_STR(OC_STACK_NOT_IMPLEMENTED)
+ CASE_TO_STR(OC_STACK_BAD_GATEWAY)
+ CASE_TO_STR(OC_STACK_SERVICE_UNAVAILABLE)
+ CASE_TO_STR(OC_STACK_GATEWAY_TIMEOUT)
+ CASE_TO_STR(OC_STACK_PROXY_NOT_SUPPORTED)
+ CASE_TO_STR(OC_STACK_ERROR)
+ default :
+ return "Unknown Error";
+ }
+}
+
+static const char* _wifi_error_to_string(wifi_manager_error_e err)
+{
+ switch (err) {
+ /* CHECK: List all enum values here */
+ CASE_TO_STR(WIFI_MANAGER_ERROR_NONE)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_PARAMETER)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_OUT_OF_MEMORY)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_OPERATION)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_OPERATION_FAILED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_NO_CONNECTION)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_NOW_IN_PROGRESS)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_ALREADY_EXISTS)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_OPERATION_ABORTED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_DHCP_FAILED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_INVALID_KEY)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_NO_REPLY)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_SECURITY_RESTRICTED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_ALREADY_INITIALIZED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_PERMISSION_DENIED)
+ CASE_TO_STR(WIFI_MANAGER_ERROR_NOT_SUPPORTED)
+ default :
+ return "WIFI_MANAGER_ERROR_UNKNOWN";
+ }
+}
+
+OicUuid_t* _convert_uuid(gchar *device_id)
+{
+ OicUuid_t *uuid;
+
+ if (NULL == device_id)
+ return NULL;
+
+ uuid = g_malloc0(sizeof(struct OicUuid));
+ if (NULL == uuid) {
+ MA_LOGE("g_malloc0() Fail(%d)", errno);
+ return NULL;
+ }
+
+ sscanf(&device_id[0], "%2hhx", &uuid->id[0]);
+ sscanf(&device_id[2], "%2hhx", &uuid->id[1]);
+ sscanf(&device_id[4], "%2hhx", &uuid->id[2]);
+ sscanf(&device_id[6], "%2hhx", &uuid->id[3]);
+ /* device_id[8] == '-' */
+ sscanf(&device_id[9], "%2hhx", &uuid->id[4]);
+ sscanf(&device_id[11], "%2hhx", &uuid->id[5]);
+ /* device_id[13] == '-' */
+ sscanf(&device_id[14], "%2hhx", &uuid->id[6]);
+ sscanf(&device_id[16], "%2hhx", &uuid->id[7]);
+ /* device_id[18] == '-' */
+ sscanf(&device_id[19], "%2hhx", &uuid->id[8]);
+ sscanf(&device_id[21], "%2hhx", &uuid->id[9]);
+ /* device_id[23] == '-' */
+ sscanf(&device_id[24], "%2hhx", &uuid->id[10]);
+ sscanf(&device_id[26], "%2hhx", &uuid->id[11]);
+ sscanf(&device_id[28], "%2hhx", &uuid->id[12]);
+ sscanf(&device_id[30], "%2hhx", &uuid->id[13]);
+ sscanf(&device_id[32], "%2hhx", &uuid->id[14]);
+ sscanf(&device_id[34], "%2hhx", &uuid->id[15]);
+
+ return uuid;
+}
+
+static void _print_no_uuid(int idx, const OicUuid_t* uuid)
+{
+ char uuid_string[256] = {0};
+ snprintf(uuid_string, sizeof(uuid_string),
+ "[%d] %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ idx,
+ (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+ (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+ (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+ (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
+ MA_LOGI("%s", uuid_string);
+}
+#ifdef DEBUG_UUID
+static void _print_uuid(const OicUuid_t* uuid)
+{
+ char uuid_string[256] = {0};
+ snprintf(uuid_string, sizeof(uuid_string),
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+ (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+ (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+ (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
+ MA_LOGI("%s", uuid_string);
+}
+#endif
+
+static void _print_uuid_res(const OicUuid_t* uuid, int res)
+{
+ char uuid_string[256] = {0};
+ snprintf(uuid_string, sizeof(uuid_string),
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x : [%d] [%s]",
+ (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+ (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+ (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+ (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15],
+ res, _error_to_string(res));
+ MA_LOGI("%s", uuid_string);
+}
+
+#ifdef TEST
+static OCProvisionDev_t* _get_dev_by_id(const OCProvisionDev_t* dev_lst, const int dev_num)
+{
+ if (!dev_lst || 0>=dev_num) {
+ MA_LOGI("Device List is Empty..\n");
+ return NULL;
+ }
+
+ OCProvisionDev_t* lst = (OCProvisionDev_t*) dev_lst;
+ for (int i=0; lst; ) {
+ if (dev_num == ++i) {
+ return lst;
+ }
+ lst = lst->next;
+ }
+
+ return NULL;
+}
+#endif
+
+static OCProvisionDev_t* _get_dev_by_uuid(const OCProvisionDev_t* dev_lst,
+ const OicUuid_t* uuid)
+{
+ if (!dev_lst ) {
+ MA_LOGI("dev_lst is empty");
+ return NULL;
+ }
+
+ if (!uuid ) {
+ MA_LOGI("uuid is NULL");
+ return NULL;
+ }
+
+ OCProvisionDev_t* lst = (OCProvisionDev_t*)dev_lst;
+#ifdef DEBUG_UUID
+ _print_uuid(&lst->doxm->deviceID);
+#endif
+ while (lst) {
+ if (!memcmp((const void *)&lst->doxm->deviceID, (const void *)uuid, sizeof(OicUuid_t)))
+ return lst;
+#ifdef DEBUG_UUID
+ _print_uuid(uuid);
+#endif
+ lst = lst->next;
+ }
+
+ return NULL;
+}
+
+static int _print_dev_list(const OCProvisionDev_t* dev_lst)
+{
+ if (!dev_lst) {
+ MA_LOGI("Device List is Empty..\n\n");
+ return 0;
+ }
+
+ OCProvisionDev_t* lst = (OCProvisionDev_t*) dev_lst;
+ int lst_cnt = 0;
+ for ( ; lst; ) {
+ _print_no_uuid(++lst_cnt, (const OicUuid_t*) &lst->doxm->deviceID);
+ lst = lst->next;
+ }
+
+ return lst_cnt;
+}
+
+static int _print_result_list(const OCProvisionResult_t* rslt_lst, const int rslt_cnt)
+{
+ if (!rslt_lst || 0>=rslt_cnt) {
+ MA_LOGI(" Device List is Empty..\n\n");
+ return 0;
+ }
+
+ int lst_cnt = 0;
+ for ( ; rslt_cnt>lst_cnt; ++lst_cnt) {
+ _print_uuid_res((const OicUuid_t*) &rslt_lst[lst_cnt].deviceId, rslt_lst[lst_cnt].res);
+ }
+
+ return lst_cnt;
+}
+
+static FILE* _fopen_prvn_mng(const char* path, const char* mode)
+{
+ char data_dir[MAX_FILE_PATH_LEN] = {0,};
+
+ snprintf(data_dir, MAX_FILE_PATH_LEN, "%s/network/%s",
+ tzplatform_getenv(TZ_SYS_GLOBALUSER_DATA), SVR_DB_FILE_NAME);
+
+ NOTUSED(path);
+#if 0
+ MA_LOGD("Unsed DB path %s\n", path);
+#endif
+
+ return fopen(data_dir, mode);
+}
+
+static int _wait_cb_ret(int msec)
+{
+ OCStackResult ret = OC_STACK_OK;
+
+ ma_check_null_ret_error("g_client", g_client, OC_STACK_INVALID_PARAM);
+
+ for (int i=0; !g_client->g_doneCB && msec > i; ++i) {
+ usleep(1000);
+ ret = OCProcess();
+ if (OC_STACK_OK != ret) {
+ MA_LOGE( "OCStack process error = %d", ret);
+ return ret;
+ }
+ }
+
+ if (!g_client->g_doneCB)
+ OCPDMCleanupForTimeout();
+
+ return ret;
+}
+
+static void _input_pin_cb(char* pin, size_t len)
+{
+ ma_check_null_ret("g_client", g_client);
+
+ if (!pin || OXM_RANDOM_PIN_MAX_SIZE>=len) {
+ MA_LOGE( "inputPinCB invalid parameters");
+ return;
+ }
+
+ memcpy(pin, g_client->rnd_pin, g_client->rnd_pin_len);
+ MA_LOGI("Random PIN : %s", g_client->rnd_pin);
+}
+
+static void _remove_mot_client()
+{
+ GMutex motdev_mutex;
+
+ ma_check_null_ret("g_client", g_client);
+
+ g_mutex_init(&motdev_mutex);
+ g_mutex_lock(&motdev_mutex);
+ if (g_client->g_motdev_list) {
+ OCDeleteDiscoveredDevices(g_client->g_motdev_list);
+ g_client->g_motdev_list = NULL;
+ }
+ g_mutex_unlock(&motdev_mutex);
+}
+
+static void _remove_owned_client()
+{
+ GMutex owned_dev_mutex;
+
+ ma_check_null_ret("g_client", g_client);
+
+ /* delete un/owned device lists before updating them */
+ g_mutex_init(&owned_dev_mutex);
+ g_mutex_lock(&owned_dev_mutex);
+ if (g_client->g_mowned_list) {
+ OCDeleteDiscoveredDevices(g_client->g_mowned_list);
+ g_client->g_mowned_list = NULL;
+ }
+ g_mutex_unlock(&owned_dev_mutex);
+}
+
+static int _set_device_id_seed(void)
+{
+ int ret = WIFI_MANAGER_ERROR_NONE;
+ gchar *mac_addr = NULL;
+ gchar *test_mac = "00:12:36:11:22:33";
+
+ wifi_manager_h wifi_handle = NULL;
+ bool wifi_activated = false;
+
+ /* Initialize Wi-Fi driver */
+ ret = wifi_manager_initialize(&wifi_handle);
+ if (WIFI_MANAGER_ERROR_NONE != ret)
+ MA_LOGE("Failed to get wifi manager handle ! [%d][%s]", ret, _wifi_error_to_string(ret));
+
+ wifi_manager_is_activated(wifi_handle, &wifi_activated);
+ if (false == wifi_activated) {
+ ret = wifi_manager_activate(wifi_handle, NULL, NULL);
+ if (WIFI_MANAGER_ERROR_NONE != ret)
+ MA_LOGE("Failed to activate wifi ! [%d][%s]", ret, _wifi_error_to_string(ret));
+ }
+
+ ret = wifi_manager_get_mac_address(wifi_handle, &mac_addr);
+ if (WIFI_MANAGER_ERROR_NONE != ret) {
+ MA_LOGE("Fail to get MAC address [%d][%s]", ret, _wifi_error_to_string(ret));
+ /* Make deviceID based on Fake MAC address */
+ ret = SetDeviceIdSeed((const guchar *)test_mac, WIFI_MAC_ADDR_LENGTH);
+ } else {
+ /* Make deviceID based on Wi-Fi MAC address */
+ ret = SetDeviceIdSeed((const guchar *)mac_addr, WIFI_MAC_ADDR_LENGTH);
+ g_free(mac_addr);
+ }
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "SetDeviceIdSeed() error = [%d][%s]", ret, _error_to_string(ret));
+ }
+ wifi_manager_deinitialize(wifi_handle);
+ return ret;
+}
+
+static int _init_provision_client(void)
+{
+ int ret = OC_STACK_OK;
+ char data_dir[MAX_FILE_PATH_LEN] = {0,};
+
+ snprintf(data_dir, MAX_FILE_PATH_LEN, "%s/network/%s",
+ tzplatform_getenv(TZ_SYS_GLOBALUSER_DATA), PRVN_DB_FILE_NAME);
+
+ /* initialize persistent storage for SVR DB */
+ static OCPersistentStorage ps = { _fopen_prvn_mng, fread, fwrite, fclose, unlink };
+
+ ret = OCRegisterPersistentStorageHandler(&ps);
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "OCRegisterPersistentStorageHandler error = %d", ret);
+ return ret;
+ }
+
+ _set_device_id_seed();
+
+ /* initialize OC stack and provisioning manager */
+ ret = OCInit(NULL, 0, OC_CLIENT_SERVER);
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "OCInit() error = [%d][%s]", ret, _error_to_string(ret));
+ return ret;
+ }
+
+ /* Do Self-Ownership Transfer */
+ ret = OCConfigSelfOwnership();
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "OCConfigSelfOwnership() error = [%d][%s]", ret, _error_to_string(ret));
+ //return ret;
+ }
+
+ ret = OCInitPM(data_dir);
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "OCInitPM() error = [%d][%s]", ret, _error_to_string(ret));
+ return ret;
+ }
+
+ SetInputPinCB(_input_pin_cb);
+
+ g_client = g_malloc0(sizeof(ma_subowner_s));
+ if (!g_client) {
+ MA_LOGE( "memory allocation error = %d", errno);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_client->g_motdev_list = NULL;
+ g_client->g_mowned_list = NULL;
+ g_client->rnd_pin = NULL;
+
+ return ret;
+}
+static void _request_cleanup(gpointer data)
+{
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+ ma_check_null_ret("con", con);
+ ma_service *service = (ma_service *)con->userdata;
+ ma_check_null_ret("service", service);
+
+ if (!con) {
+ MA_LOGI("container is null");
+ return;
+ }
+
+ if (con->tid) {
+ g_source_remove(con->tid);
+ con->tid = 0;
+ }
+ con->sid = 0;
+ con->found = FALSE;
+
+ if (con->pin) {
+ g_free(con->pin);
+ con->pin = NULL;
+ }
+ if (con->rsrc_uri) {
+ g_free(con->rsrc_uri);
+ con->rsrc_uri = NULL;
+ }
+ if (con->rsrc_type) {
+ g_free(con->rsrc_type);
+ con->rsrc_type = NULL;
+ }
+ if (con->rsrc_interface) {
+ g_free(con->rsrc_interface);
+ con->rsrc_interface = NULL;
+ }
+ if (con->uuid_target_str) {
+ g_free(con->uuid_target_str);
+ con->uuid_target_str = NULL;
+ }
+ if (con->uuid_dev1) {
+ g_free(con->uuid_dev1);
+ con->uuid_dev1 = NULL;
+ }
+ if (con->uuid_dev2) {
+ g_free(con->uuid_dev2);
+ con->uuid_dev2 = NULL;
+ }
+ if (con->target_1) {
+ g_free(con->target_1);
+ con->target_1 = NULL;
+ }
+ if (con->subject_1) {
+ g_free(con->subject_1);
+ con->subject_1 = NULL;
+ }
+ if (con->rsrc_uri_1) {
+ g_free(con->rsrc_uri_1);
+ con->rsrc_uri_1 = NULL;
+ }
+ if (con->rsrc_type_1) {
+ g_free(con->rsrc_type_1);
+ con->rsrc_type_1 = NULL;
+ }
+ if (con->rsrc_interface_1) {
+ g_free(con->rsrc_interface_1);
+ con->rsrc_interface_1 = NULL;
+ }
+ if (con->target_2) {
+ g_free(con->target_1);
+ con->target_1 = NULL;
+ }
+ if (con->subject_2) {
+ g_free(con->subject_1);
+ con->subject_1 = NULL;
+ }
+ if (con->rsrc_uri_2) {
+ g_free(con->rsrc_uri_2);
+ con->rsrc_uri_2 = NULL;
+ }
+ if (con->rsrc_type_2) {
+ g_free(con->rsrc_type_2);
+ con->rsrc_type_2 = NULL;
+ }
+ if (con->rsrc_interface_2) {
+ g_free(con->rsrc_interface_2);
+ con->rsrc_interface_2 = NULL;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+
+ if (con) {
+ g_free(con);
+ con = NULL;
+ }
+}
+
+static void __notify_found_devs(void *data)
+{
+ GVariantBuilder builder;
+ GVariant* devices;
+ OCProvisionDev_t *iter = NULL;
+
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+ ma_check_null_ret("con", con);
+ ma_service *service= (ma_service *)con->userdata;
+ ma_check_null_ret("service", service);
+
+ /* g_mowned_list would be filled above request */
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
+
+ if (MA_DISC_MOT_ENB_DEVS == con->cid) {
+ iter = g_client->g_motdev_list;
+ g_client->g_motdev_cnt = _print_dev_list(g_client->g_motdev_list);
+ MA_LOGD("Found %d MOT enabled devices", g_client->g_motdev_cnt);
+ } else if (MA_DISC_MOWNED_DEVS == con->cid) {
+ iter = g_client->g_mowned_list;
+ g_client->g_mowndev_cnt = _print_dev_list(g_client->g_mowned_list);
+ MA_LOGD("Found %d Mowned devices", g_client->g_mowndev_cnt);
+ }
+
+ while (iter != NULL) {
+ char uuid_string[256] = {0};
+
+ OicUuid_t *uuid = &iter->doxm->deviceID;
+ ma_check_null_ret("uuid", uuid);
+
+ snprintf(uuid_string, sizeof(uuid_string),
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ (*uuid).id[0], (*uuid).id[1], (*uuid).id[2], (*uuid).id[3],
+ (*uuid).id[4], (*uuid).id[5], (*uuid).id[6], (*uuid).id[7],
+ (*uuid).id[8], (*uuid).id[9], (*uuid).id[10], (*uuid).id[11],
+ (*uuid).id[12], (*uuid).id[13], (*uuid).id[14], (*uuid).id[15]);
+
+ MA_LOGI("uuid %s", uuid_string);
+
+ g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT);
+
+ g_variant_builder_add(&builder, "{sv}", "deviceId",
+ g_variant_new_string(uuid_string));
+ g_variant_builder_add(&builder, "{sv}", "adapter",
+ g_variant_new_uint32(iter->endpoint.adapter));
+ g_variant_builder_add(&builder, "{sv}", "flags",
+ g_variant_new_int32(iter->endpoint.flags));
+ g_variant_builder_add(&builder, "{sv}", "port",
+ g_variant_new_uint16(iter->endpoint.port));
+ g_variant_builder_add(&builder, "{sv}", "addr",
+ g_variant_new_string(iter->endpoint.addr));
+ g_variant_builder_add(&builder, "{sv}", "ifindex",
+ g_variant_new_int32(iter->endpoint.ifindex));
+ g_variant_builder_add(&builder, "{sv}", "routeData",
+ g_variant_new_string(iter->endpoint.routeData));
+ g_variant_builder_add(&builder, "{sv}", "remoteId",
+ g_variant_new_string(iter->endpoint.remoteId));
+
+ MA_LOGI("%s", iter->endpoint.remoteId);
+
+ g_variant_builder_add(&builder, "{sv}", "connType",
+ g_variant_new_uint32(iter->connType));
+ g_variant_builder_add(&builder, "{sv}", "securePort",
+ g_variant_new_uint16(iter->securePort));
+#ifdef WITH_TCP
+ g_variant_builder_add(&builder, "{sv}", "tcpPort",
+ g_variant_new_uint16(iter->tcpPort));
+#endif
+ g_variant_builder_add(&builder, "{sv}", "secVer",
+ g_variant_new_string(iter->secVer));
+ g_variant_builder_add(&builder, "{sv}", "devStatus",
+ g_variant_new_uint32(iter->devStatus));
+ g_variant_builder_close(&builder);
+
+ iter = iter->next;
+ }
+
+ devices = g_variant_builder_end(&builder);
+
+ if (MA_DISC_MOT_ENB_DEVS == con->cid)
+ ma_notify_mot_env_devs(devices);
+ else if (MA_DISC_MOWNED_DEVS == con->cid)
+ ma_notify_mowned_devs(devices);
+
+ g_variant_builder_unref(&builder);
+ g_variant_unref(devices);
+
+}
+#ifdef TIMEOUT_USED
+static gboolean _ma_timeout_cb(gpointer data)
+{
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+ ma_check_null_ret_error("con", con, G_SOURCE_REMOVE);
+
+ if (NULL == con) {
+ MA_LOGE("container is NULL");
+ return G_SOURCE_REMOVE;
+ }
+ if (con->found) {
+ MA_LOGE("cb was alreay handled");
+ return G_SOURCE_REMOVE;
+ }
+
+ if(OC_STACK_OK != OCProcess()) {
+ MA_LOGE( "OCStack process error");
+ return G_SOURCE_REMOVE;
+ }
+
+ OCPDMCleanupForTimeout();
+
+ switch (con->cid) {
+ case MA_DISC_MOT_ENB_DEVS:
+ MA_LOGE("Discovered Multiple Ownership Transfer Enabled Devices");
+ __notify_found_devs(con);
+ break;
+ case MA_DISC_MOWNED_DEVS:
+ MA_LOGE("Discovered Multiple Ownership Transfer Enabled Devices");
+ __notify_found_devs(con);
+ break;
+ case MA_MOT:
+ net_ma_emit_mot_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED);
+ break;
+ case MA_PROV_ACL:
+ net_ma_emit_acl_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED);
+ break;
+ case MA_PROV_CRED:
+ net_ma_emit_cred_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED);
+ break;
+ case MA_REMOVE_MOT:
+ net_ma_emit_remove_mo_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED);
+ break;
+ case MA_UNPAIR:
+ net_ma_emit_unpair_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED);
+ break;
+ case MA_PROV_PAIRWISE:
+ net_ma_emit_pairwise_done(ma_dbus_get_object(), MA_ERROR_OPERATION_FAILED);
+ break;
+ }
+
+ _request_cleanup((gpointer)con);
+
+ return G_SOURCE_REMOVE;
+}
+#endif
+static gpointer _disc_mot_env_devs_func(gpointer data)
+{
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+ ma_check_null_ret_error("con", con, NULL);
+
+ /* delete un/owned device lists before updating them */
+ _remove_mot_client();
+
+ MA_LOGI("Discovering Multiple Ownership Transfer enabled Devices on Network..");
+ if (OC_STACK_OK != OCDiscoverMultipleOwnerEnabledDevices(DISCOVERY_TIMEOUT,
+ &g_client->g_motdev_list)) {
+ MA_LOGE( "OCDiscoverMultipleOwnerEnalbedDevices API error");
+ goto DISC_MOT_ENB_DEVS_END;
+ }
+
+ __notify_found_devs(con);
+
+DISC_MOT_ENB_DEVS_END:
+ _request_cleanup(con);
+ g_thread_exit(GINT_TO_POINTER (1));
+
+ return NULL;
+}
+
+static int _disc_mot_enb_devs(ma_service *service)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->thread = g_thread_try_new("disc_mot_env_devs", _disc_mot_env_devs_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+
+ con->userdata = service;
+ con->cid = MA_DISC_MOT_ENB_DEVS;
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(DISCOVERY_TIMEOUT * 2, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+static gpointer _disc_owned_devs_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+
+ ma_check_null_ret_error("g_client", g_client, NULL);
+
+ /* delete un/owned device lists before updating them */
+ _remove_owned_client();
+
+ MA_LOGD("Discovering Multiple Owned Devices");
+ ret = OCDiscoverMultipleOwnedDevices(DISCOVERY_TIMEOUT, &g_client->g_mowned_list);
+ if (OC_STACK_OK != ret) {
+ MA_LOGE( "OCDiscoverMultipleOwnerEnabledDevices API error");
+ goto DISC_OWNED_DEVS_END;
+ }
+
+ __notify_found_devs(con);
+
+DISC_OWNED_DEVS_END:
+ _request_cleanup(con);
+ g_thread_exit(GINT_TO_POINTER (1));
+
+ return NULL;
+}
+
+static int _disc_owned_devs(ma_service *service)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_DISC_MOWNED_DEVS;
+
+ con->thread = g_thread_try_new("disc_owned_devs", _disc_owned_devs_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(DISCOVERY_TIMEOUT * 2, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+static void _mot_cb(void* ctx, int num, OCProvisionResult_t* arr, bool has_error)
+{
+ int i = 0;
+ int ret = OC_STACK_OK;
+ ma_subowner_s *client = (ma_subowner_s *)ctx;
+
+ if (!has_error) {
+ MA_LOGD("Multiple Ownership Transfer SUCCEEDED");
+ } else {
+ MA_LOGD( "Multiple Ownership Transfer FAILED ");
+
+ _print_result_list((const OCProvisionResult_t*) arr, num);
+
+ ret = openDB();
+ if (OC_STACK_OK != ret)
+ MA_LOGE( "openDB: ret = %d (%s)", ret, _error_to_string(ret));
+
+ for ( ; num > i; ++i) {
+ if (OC_STACK_OK !=arr[i].res) {
+ ret = delete_mowned_device_db((const OicUuid_t*) &arr[i].deviceId);
+ }
+ }
+ ret = closeDB();
+ if (OC_STACK_OK != ret)
+ MA_LOGE( "closeDB: ret = %d (%s)", ret, _error_to_string(ret));
+ }
+ client->g_doneCB = true;
+}
+
+static gpointer _mot_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+
+ OCProvisionDev_t *src_dev = NULL;
+ OicUuid_t *uuid_target = NULL;
+
+ if (!con->uuid_target_str) {
+ MA_LOGE("Target device UUID is NULL");
+ goto MOT_ENDED;
+ }
+
+ uuid_target = _convert_uuid(con->uuid_target_str);
+ src_dev = _get_dev_by_uuid(g_client->g_motdev_list, uuid_target);
+ if (!src_dev) {
+ MA_LOGE("We can't find in MOT dev list");
+ goto MOT_ENDED;
+ }
+
+ g_client->g_doneCB = false;
+
+ OCProvisionDev_t* dev = NULL;
+ LL_FOREACH(src_dev, dev) {
+ if(OIC_PRECONFIG_PIN == dev->doxm->oxmSel) {
+ /* Pre-Configured PIN initialization */
+ const char* testPreconfigPin = con->pin;/* Ex) "12341234" */
+ ret = OCAddPreconfigPin(dev, testPreconfigPin, strlen(testPreconfigPin));
+ if(OC_STACK_OK != ret) {
+ MA_LOGE("Failed to save the pre-configured PIN");
+ MA_LOGE("You can't use the pre-configured PIN OxM for MOT");
+ goto MOT_ENDED;
+ }
+ }
+ }
+
+ ret = OCDoMultipleOwnershipTransfer(g_client, src_dev, _mot_cb);
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "OCDoMultipleOwnershipTransfer: ret = %d (%s)", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
+ if(ret) {
+ MA_LOGE( "OCDoMultipleOwnershipTransfer callback error = %d (%s)", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ MA_LOGE("Registered Discovered Devices");
+
+MOT_ENDED:
+
+ net_ma_emit_mot_done(ma_dbus_get_object(), (int)ret);
+ if (uuid_target)
+ g_free(uuid_target);
+ _request_cleanup(data);
+ g_thread_exit(GINT_TO_POINTER (1));
+
+ return NULL;
+}
+
+static int _ma_mot(ma_service *service, gchar *uuid_str, gchar *pin)
+{
+ ma_req_cb_s *con = NULL;
+
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_MOT;
+ con->uuid_target_str = g_strdup(uuid_str);
+
+ if (pin) {
+ con->pin = g_malloc0(OXM_RANDOM_PIN_MAX_SIZE+1);
+ if (!pin) {
+ MA_LOGE("Failed to allocate PIN number");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ memcpy(con->pin, pin, OXM_RANDOM_PIN_MAX_SIZE);
+ }
+
+ con->thread = g_thread_try_new("mot", _mot_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+static void _remove_mo_cb(void* ctx, int num, OCProvisionResult_t* arr, bool has_error)
+{
+ ma_subowner_s *client = (ma_subowner_s *)ctx;
+
+ if (!has_error) {
+ MA_LOGD("Remove Multiple Ownership SUCCEEDED");
+ } else {
+ MA_LOGD( "Remove Multiple Ownership FAILED ");
+ _print_result_list((const OCProvisionResult_t*) arr, num);
+ }
+ client->g_doneCB = true;
+}
+
+static gpointer _remove_mo_func(gpointer data)
+{
+ OCStackResult ret = MA_ERROR_OPERATION_FAILED;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+
+ OCProvisionDev_t *src_dev = NULL;
+ OicUuid_t uuid_mowner;
+ OicUuid_t *uuid_target = NULL;
+
+ if (!con->uuid_target_str) {
+ MA_LOGE("Target device UUID is NULL");
+ goto MOT_ENDED;
+ }
+
+ uuid_target = _convert_uuid(con->uuid_target_str);
+ src_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid_target);
+ if (!src_dev) {
+ MA_LOGE("We can't find in MOT dev list");
+ goto MOT_ENDED;
+ }
+
+ g_client->g_doneCB = false;
+
+ ret = GetDoxmDevOwnerId(&uuid_mowner);
+ if (OC_STACK_OK != ret) {
+ MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ ret = openDB();
+ if (OC_STACK_OK != ret)
+ MA_LOGE( "openDB: ret = %d (%s)", ret, _error_to_string(ret));
+ ret = delete_mowned_device_db((const OicUuid_t*) uuid_target);
+ if (OC_STACK_OK != ret)
+ MA_LOGE( "delete_mowned_device_db: ret = %d (%s)", ret, _error_to_string(ret));
+ ret = closeDB();
+ if (OC_STACK_OK != ret)
+ MA_LOGE( "closeDB: ret = %d (%s)", ret, _error_to_string(ret));
+
+ ret = OCRemoveSubOwner(g_client, src_dev, &uuid_mowner, _remove_mo_cb);
+ if (OC_STACK_OK != ret ) {
+ MA_LOGE( "OCRemoveSubOwner: ret = %d (%s)", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
+ if(ret) {
+ MA_LOGE( "OCRemoveSubOwner callback error = %d (%s)", ret, _error_to_string(ret));
+ goto MOT_ENDED;
+ }
+
+ MA_LOGE("Remove Multiple Ownership Done");
+
+MOT_ENDED:
+
+ net_ma_emit_remove_mo_done(ma_dbus_get_object(), (int)ret);
+
+ if (uuid_target)
+ g_free(uuid_target);
+ _request_cleanup(data);
+ g_thread_exit(GINT_TO_POINTER (1));
+
+ return NULL;
+}
+
+static int _ma_remove_mo(ma_service *service, gchar *uuid_str)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_REMOVE_MOT;
+ con->uuid_target_str = g_strdup(uuid_str);
+
+ con->thread = g_thread_try_new("remove_mo", _remove_mo_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+#if 0 /* TEST */
+static int sendGetLed()
+{
+ int selDevNum;
+ char query[256] = {0};
+ OCCallbackData cbData;
+ cbData.cb = &LedCB;
+ cbData.context = NULL;
+ cbData.cd = NULL;
+
+ printDevList(g_mowned_list);
+
+ // select device for provisioning access control list
+ for( ; ; ) {
+ printf(" > Enter Device Number, for sending GET LED request: ");
+ for(int ret=0; 1!=ret; ) {
+ ret = scanf("%d", &selDevNum);
+ for( ; 0x20<=getchar(); ); // for removing overflow garbages
+ // '0x20<=code' is character region
+ }
+ if(0<selDevNum && g_mowned_cnt>=selDevNum) {
+ break;
+ }
+ printf(" Entered Wrong Number. Please Enter Again\n");
+ }
+
+ OCProvisionDev_t* selDev = _get_dev_by_id(g_mowned_list, selDevNum);
+ if(NULL == selDev) {
+ printf("Failed to _get_dev_by_id()\n");
+ return -1;
+ }
+
+ if(PMGenerateQuery(true, selDev->endpoint.addr, selDev->securePort, selDev->connType,
+ query, sizeof(query), "/a/led")) {
+ g_doneCB = false;
+ printf("query=%s\n", query);
+ if(OC_STACK_OK != OCDoResource(NULL, OC_REST_GET, query, NULL, NULL, selDev->connType,
+ OC_HIGH_QOS, &cbData, NULL, 0)) {
+ printf("********************************\n");
+ printf("Failed to send GET request to %s\n", query);
+ printf("********************************\n");
+ g_doneCB = true;
+ return -1;
+ }
+
+ waitCallbackRet();
+ } else {
+ printf("Failed to generate GET request for /a/led\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int sendPutLed()
+{
+ int selDevNum;
+ char query[256] = {0};
+ OCCallbackData cbData;
+ cbData.cb = &LedCB;
+ cbData.context = NULL;
+ cbData.cd = NULL;
+
+ printDevList(g_mowned_list);
+ // select device for provisioning access control list
+ for( ; ; ) {
+ printf(" > Enter Device Number, for sending PUT LED request: ");
+ for(int ret=0; 1!=ret; ) {
+ ret = scanf("%d", &selDevNum);
+ for( ; 0x20<=getchar(); ); // for removing overflow garbages
+ // '0x20<=code' is character region
+ }
+ if(0<selDevNum && g_mowned_cnt>=selDevNum) {
+ break;
+ }
+ printf(" Entered Wrong Number. Please Enter Again\n");
+ }
+
+ OCProvisionDev_t* selDev = _get_dev_by_id(g_mowned_list, selDevNum);
+ if (NULL == selDev) {
+ printf("Failed to _get_dev_by_id()\n");
+ return -1;
+ }
+
+ if (PMGenerateQuery(true, selDev->endpoint.addr, selDev->securePort, selDev->connType, query,
+ sizeof(query), "/a/led")) {
+ g_doneCB = false;
+ MA_LOGI("query=%s\n", query);
+ if(OC_STACK_OK != OCDoResource(NULL, OC_REST_PUT, query, NULL, NULL, selDev->connType,
+ OC_LOW_QOS, &cbData, NULL, 0)) {
+ MA_LOGI("********************************\n");
+ MA_LOGI("Failed to send PUT request to %s\n", query);
+ MA_LOGI("********************************\n");
+ g_doneCB = true;
+ return -1;
+ }
+
+ waitCallbackRet();
+ } else {
+ printf("Failed to generate PUT request for /a/led\n");
+ return -1;
+ }
+
+ return 0;
+}
+#endif /* TEST */
+static OicSecAcl_t* _create_target_acl(const OicUuid_t* target, const OicUuid_t* subject,
+ const char *rsrc_uri, const char *rsrc_type, const char *rsrc_interface, int permission)
+{
+ /* For example
+ * subejct = "12341234-1234-1234-12341234"
+ * rsrc_uri = "/a/led"
+ * rsrc_type = "oic.r.core"
+ * rsrc_interface = "oic.if.baseline"
+ * rsrc_permission = MA_PERMISSION_FULL
+ */
+ size_t len;
+ OicSecAcl_t* acl = NULL;
+ OicSecAce_t* ace = NULL;
+ OicSecRsrc_t* rsrc = NULL;
+
+ if (NULL == target) {
+ MA_LOGE( "target is NULL");
+ return NULL;
+ }
+
+ if (NULL == subject) {
+ MA_LOGE( "subejct is NULL");
+ return NULL;
+ }
+#ifdef DEBUG_UUID
+ _print_uuid(target);
+ _print_uuid(subject);
+#endif
+ acl = (OicSecAcl_t*) OICCalloc(1, sizeof(OicSecAcl_t));
+ if (!acl) {
+ MA_LOGE( "acl : OICCalloc failed =%d", errno);
+ return NULL;
+ }
+ ace = (OicSecAce_t*) OICCalloc(1, sizeof(OicSecAce_t));
+ if (!ace) {
+ MA_LOGE( "ace : OICCalloc failed =%d", errno);
+ return NULL;
+ }
+ LL_APPEND(acl->aces, ace);
+ memcpy(ace->subjectuuid.id, subject->id, sizeof(subject->id));
+
+ /* fill the href */
+ rsrc = (OicSecRsrc_t*)OICCalloc(1, sizeof(OicSecRsrc_t));
+ if (!rsrc) {
+ MA_LOGE( "rsrc: OICCalloc failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+
+ len = strlen(rsrc_uri)+1; // '1' for null termination
+ rsrc->href = (char*) OICCalloc(len, sizeof(char));
+ if (!rsrc->href) {
+ MA_LOGE( "rsrc->href: OICCalloc failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+ memcpy(rsrc->href, rsrc_uri, len);
+
+ /* Fill the resource type (rt) */
+ rsrc->typeLen = 1;
+ rsrc->types = (char**)OICCalloc(1, sizeof(char*));
+ if (!rsrc->types) {
+ MA_LOGE( "rsrc->types: OICCalloc failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+ rsrc->types[0] = g_strdup(rsrc_type);
+ if (!rsrc->types[0]) {
+ MA_LOGE( "rsrc->types[0]: g_strdup failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+
+ /* Fill the interface (if) */
+ rsrc->interfaceLen = 1;
+ rsrc->interfaces = (char**)OICCalloc(1, sizeof(char*));
+ if (!rsrc->interfaces) {
+ MA_LOGE( "rsrc->interfaces: OICCalloc failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+ rsrc->interfaces[0] = g_strdup(rsrc_interface);
+ if (!rsrc->interfaces[0]) {
+ MA_LOGE( "rsrc->interfaces[0] : g_strdup failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+
+ LL_APPEND(ace->resources, rsrc);
+
+ /* Fill permission for the reource */
+ ace->permission = permission;
+
+ ace->eownerID = (OicUuid_t*)OICCalloc(1, sizeof(OicUuid_t));
+ if (NULL == ace->eownerID) {
+ MA_LOGE( "ace->eownerID : OICCalloc failed =%d", errno);
+ goto CREATE_ACL_ERROR;
+ }
+ memcpy(ace->eownerID->id, subject->id, sizeof(subject->id));
+
+ return acl;
+
+CREATE_ACL_ERROR:
+ OCDeleteACLList(acl);
+ return NULL;
+}
+
+static void _provisioning_acl_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
+{
+ ma_subowner_s *client = (ma_subowner_s *)ctx;
+
+ if (!has_error) {
+ MA_LOGD("Provision ACL SUCCEEDED");
+ } else {
+ MA_LOGD( "Provision ACL FAILED ");
+ _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
+ }
+ client->g_doneCB = true;
+}
+
+static void _provisioning_pairwise_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
+{
+ ma_subowner_s *client = (ma_subowner_s *)ctx;
+
+ if (!has_error) {
+ MA_LOGD("Provision pairwise SUCCEEDED");
+ } else {
+ MA_LOGD( "Provision pairwise FAILED ");
+ _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
+ }
+ client->g_doneCB = true;
+}
+
+static void _unpair_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
+{
+ ma_subowner_s *client = (ma_subowner_s *)ctx;
+
+ if (!has_error) {
+ MA_LOGD("unpair SUCCEEDED");
+ } else {
+ MA_LOGD( "unpair FAILED ");
+ _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
+ }
+ client->g_doneCB = true;
+}
+
+static gpointer _provisioning_acl_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+ OicSecAcl_t* acl = NULL;
+ OicUuid_t *uuid = NULL;
+ OCProvisionDev_t *target_dev = NULL;
+ OCProvisionDev_t *subject_dev = NULL;
+
+ if (!con->uuid_subject_str ||!con->uuid_target_str || !con->rsrc_uri || !con->rsrc_type || !con->rsrc_interface) {
+ MA_LOGE("Some parameters are wrong");
+ MA_LOGE("%s", con->uuid_target_str );
+ MA_LOGE("%s", con->uuid_subject_str );
+ MA_LOGE("%s", con->rsrc_uri );
+ MA_LOGE("%s", con->rsrc_type );
+ MA_LOGE("%s", con->rsrc_interface );
+ goto PVACL_ERROR;
+ }
+
+ uuid = _convert_uuid(con->uuid_target_str);
+ target_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+ if (!target_dev) {
+ MA_LOGE("We can't find target in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+ g_free(uuid);
+
+ uuid = _convert_uuid(con->uuid_subject_str);
+ subject_dev = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+ if (!subject_dev) {
+ MA_LOGE("We can't find subject in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+ g_free(uuid);
+
+ g_client->g_doneCB = false;
+ MA_LOGI(" Provisioning Selected ACL..");
+
+ acl = _create_target_acl(&target_dev->doxm->deviceID, &subject_dev->doxm->deviceID, con->rsrc_uri, con->rsrc_type,
+ con->rsrc_interface, con->permission);
+ if (NULL == acl) {
+ MA_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
+ goto PVACL_ERROR;
+ }
+
+ ret= OCProvisionACL((void*) g_client, target_dev, acl, _provisioning_acl_cb);
+ if (OC_STACK_OK != ret) {
+ MA_LOGD( "OCProvisionACL API error: %d (%s)", ret, _error_to_string(ret));
+ goto PVACL_ERROR;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
+ if (ret) {
+ MA_LOGE( "OCProvisionCredentials Faild = %d", errno);
+ goto PVACL_ERROR;
+ }
+ /* display the ACL-provisioned result */
+ MA_LOGI(" Provisioned Selected ACL Successfully");
+
+PVACL_ERROR:
+ /* Notify ACL result */
+ net_ma_emit_acl_done(ma_dbus_get_object(), (int)ret);
+
+ if (acl)
+ OCDeleteACLList(acl);
+ if (uuid)
+ g_free(uuid);
+ _request_cleanup(con);
+ g_thread_exit(GINT_TO_POINTER (1));
+ return NULL;
+}
+
+static int _provisioning_acl(ma_service *service, gchar *target, gchar *subject,
+ gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_PROV_ACL;
+ con->uuid_target_str = g_strdup(target);
+ con->uuid_subject_str = g_strdup(subject);
+ con->rsrc_uri = g_strdup(rsrc_uri);
+ con->rsrc_type = g_strdup(rsrc_type);
+ con->rsrc_interface = g_strdup(rsrc_interface);
+
+ con->thread = g_thread_try_new("prov_acl", _provisioning_acl_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+static gpointer _provisioning_pairwise_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+
+ OicUuid_t *uuid_1 = NULL;
+ OicUuid_t *uuid_2 = NULL;
+ OicUuid_t *uuid_3 = NULL;
+ OicUuid_t *uuid_4 = NULL;
+
+ OicSecAcl_t* acl_1 = NULL;
+ OicSecAcl_t* acl_2 = NULL;
+
+ OCProvisionDev_t *target_dev_1 = NULL;
+ OCProvisionDev_t *target_dev_2 = NULL;
+ OCProvisionDev_t *subject_dev_1 = NULL;
+ OCProvisionDev_t *subject_dev_2 = NULL;
+
+ if (!con->subject_1 || !con->rsrc_uri_1 || !con->rsrc_type_1 || !con->rsrc_interface_1 ||
+ !con->subject_2 || !con->rsrc_uri_2 || !con->rsrc_type_2 || !con->rsrc_interface_2) {
+ MA_LOGE("Some parameters are wrong");
+ MA_LOGE("%s", con->subject_1 );
+ MA_LOGE("%s", con->rsrc_uri_1 );
+ MA_LOGE("%s", con->rsrc_type_1 );
+ MA_LOGE("%s", con->rsrc_interface_1 );
+ MA_LOGE("%s", con->subject_2 );
+ MA_LOGE("%s", con->rsrc_uri_2 );
+ MA_LOGE("%s", con->rsrc_type_2 );
+ MA_LOGE("%s", con->rsrc_interface_2 );
+
+ goto PVACL_ERROR;
+ }
+
+ uuid_1 = _convert_uuid(con->target_1);
+ target_dev_1 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_1);
+ if (!target_dev_1) {
+ MA_LOGE("We can't find target in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+
+ uuid_2 = _convert_uuid(con->target_2);
+ target_dev_2 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_2);
+ if (!target_dev_2) {
+ MA_LOGE("We can't find target in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+
+ uuid_3 = _convert_uuid(con->subject_1);
+ subject_dev_1 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_3);
+ if (!subject_dev_1) {
+ MA_LOGE("We can't find subject in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+
+ uuid_4 = _convert_uuid(con->subject_2);
+ subject_dev_2 = _get_dev_by_uuid(g_client->g_mowned_list, uuid_4);
+ if (!subject_dev_2) {
+ MA_LOGE("We can't find subject in MOWNED dev list");
+ goto PVACL_ERROR;
+ }
+
+ g_client->g_doneCB = false;
+ MA_LOGI(" Provisioning Selected Pairwise..");
+
+ acl_1 = _create_target_acl(&target_dev_1->doxm->deviceID,
+ &subject_dev_1->doxm->deviceID, con->rsrc_uri_1,
+ con->rsrc_type_1,
+ con->rsrc_interface_1, con->permission_1);
+ if (NULL == acl_1) {
+ MA_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
+ goto PVACL_ERROR;
+ }
+
+ acl_2 = _create_target_acl(&target_dev_2->doxm->deviceID,
+ &subject_dev_2->doxm->deviceID, con->rsrc_uri_2,
+ con->rsrc_type_2,
+ con->rsrc_interface_2, con->permission_2);
+ if (NULL == acl_2) {
+ MA_LOGE( "Failed to create ACL for %s", con->rsrc_uri);
+ goto PVACL_ERROR;
+ }
+
+ ret = OCProvisionPairwiseDevices((void*) g_client, SYMMETRIC_PAIR_WISE_KEY,
+ OWNER_PSK_LENGTH_256, target_dev_1, acl_1,
+ target_dev_2, acl_2, _provisioning_pairwise_cb);
+ if (OC_STACK_OK != ret) {
+ MA_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret,
+ _error_to_string(ret));
+ goto PVACL_ERROR;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
+ if (ret) {
+ MA_LOGE( "OCProvisionPairwise Faild = %d", errno);
+ goto PVACL_ERROR;
+ }
+ /* display the pairwise-provisioned result */
+ MA_LOGI(" Provision pairwise Successfully");
+
+PVACL_ERROR:
+ /* Notify ACL result */
+ net_ma_emit_pairwise_done(ma_dbus_get_object(), (int)ret);
+
+ if (uuid_1)
+ g_free(uuid_1);
+ if (uuid_2)
+ g_free(uuid_2);
+ if (uuid_3)
+ g_free(uuid_3);
+ if (uuid_4)
+ g_free(uuid_4);
+ if (acl_1)
+ OCDeleteACLList(acl_1);
+ if (acl_2)
+ OCDeleteACLList(acl_2);
+
+ _request_cleanup(con);
+ g_thread_exit(GINT_TO_POINTER (1));
+ return NULL;
+}
+
+static gpointer _unpair_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+
+ OicUuid_t *uuid = NULL;
+
+ if (!con->target_to_revoke) {
+ MA_LOGE("Some parameters are wrong");
+ MA_LOGE("%s", con->target_to_revoke );
+ goto PVACL_ERROR;
+ }
+
+ uuid = _convert_uuid(con->target_to_revoke);
+
+ g_client->g_doneCB = false;
+ MA_LOGI(" unpair device..");
+
+ ret = OCRemoveDeviceWithUuid((void*) g_client, CALLBACK_TIMEOUT_5S, uuid, _unpair_cb );
+ if (OC_STACK_OK != ret) {
+ MA_LOGD( "OCRemoveDevice API error: %d (%s)", ret, _error_to_string(ret));
+ goto PVACL_ERROR;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
+ if (ret) {
+ MA_LOGE( "OCRemoveDevice Faild = %d", errno);
+ goto PVACL_ERROR;
+ }
+ /* display the pairwise-provisioned result */
+ MA_LOGI(" Provision pairwise Successfully");
+
+PVACL_ERROR:
+ /* Notify ACL result */
+ net_ma_emit_unpair_done(ma_dbus_get_object(), (int)ret);
+ if (uuid)
+ g_free(uuid);
+ _request_cleanup(con);
+ g_thread_exit(GINT_TO_POINTER (1));
+ return NULL;
+}
+
+static int _provisioning_unpair(ma_service *service, gchar *target)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_UNPAIR;
+
+ con->target_to_revoke = g_strdup(target);
+
+ con->thread = g_thread_try_new("unpair_device", _unpair_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+static int _provisioning_pairwise_link(ma_service *service, gchar *target_1, gchar *subject_1,
+ gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1,
+ gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (NULL == con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_PROV_PAIRWISE;
+
+ con->target_1 = g_strdup(target_1);
+ con->subject_1 = g_strdup(subject_1);
+ con->rsrc_uri_1 = g_strdup(rsrc_uri_1);
+ con->rsrc_type_1 = g_strdup(rsrc_type_1);
+ con->rsrc_interface_1 = g_strdup(rsrc_interface_1);
+
+ con->target_2 = g_strdup(target_2);
+ con->subject_2 = g_strdup(subject_2);
+ con->rsrc_uri_2 = g_strdup(rsrc_uri_2);
+ con->rsrc_type_2 = g_strdup(rsrc_type_2);
+ con->rsrc_interface_2 = g_strdup(rsrc_interface_2);
+
+ con->thread = g_thread_try_new("prov_pairwise", _provisioning_pairwise_func,
+ con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _ma_timeout_cb,
+ con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+
+static void _provision_cred_cb(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool has_error)
+{
+ ma_subowner_s *client = (ma_subowner_s *)ctx;
+
+ if (!has_error) {
+ MA_LOGD("Provision ACL SUCCEEDED");
+ } else {
+ MA_LOGD( "Provision ACL FAILED ");
+ _print_result_list((const OCProvisionResult_t*) arr, nOfRes);
+ }
+ client->g_doneCB = true;
+}
+
+static gpointer _cred_provisioning_func(gpointer data)
+{
+ OCStackResult ret = OC_STACK_OK;
+ ma_req_cb_s *con = (ma_req_cb_s *)data;
+
+ OicUuid_t *uuid = NULL;
+ OCProvisionDev_t *dev1 = NULL;
+ OCProvisionDev_t *dev2 = NULL;
+
+ if (!con->uuid_dev1 ) {
+ MA_LOGE("dev1 is NULL");
+ goto PVPWS_ERROR;
+ }
+ if (!con->uuid_dev2) {
+ MA_LOGE("dev2 is NULL");
+ goto PVPWS_ERROR;
+ }
+
+ uuid = _convert_uuid(con->uuid_dev1);
+ dev1 = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+ if (!dev1) {
+ MA_LOGE("We can't find in MOWNED dev list");
+ goto PVPWS_ERROR;
+ }
+ g_free(uuid);
+
+ uuid = _convert_uuid(con->uuid_dev2);
+ dev2 = _get_dev_by_uuid(g_client->g_mowned_list, uuid);
+ if (!dev2) {
+ MA_LOGE("We can't find in MOWNED dev list");
+ goto PVPWS_ERROR;
+ }
+ g_free(uuid);
+
+ /* To do ACL provisioning only one */
+ dev1->next = NULL;
+
+ /* To do ACL provisioning only one */
+ dev2->next = NULL;
+
+ g_client->g_doneCB = false;
+
+ MA_LOGI("Provisioning Selected Pairwise Devices..");
+ ret = OCProvisionCredentials((void*) g_client,
+ SYMMETRIC_PAIR_WISE_KEY, OWNER_PSK_LENGTH_256,
+ dev1, dev2, _provision_cred_cb);
+ if (OC_STACK_OK != ret) {
+ MA_LOGD( "OCProvisionPairwiseDevices API error: %d (%s)", ret, _error_to_string(ret));
+ goto PVPWS_ERROR;
+ }
+
+ ret = _wait_cb_ret(CALLBACK_TIMEOUT_5S);
+ if (ret) {
+ MA_LOGE( "OCProvisionCredentials Faild = %d", errno);
+ goto PVPWS_ERROR;
+ }
+
+ /* display the pairwise-provisioned result */
+ MA_LOGI("Provisioned Selected Pairwise Devices");
+
+ return 0;
+
+PVPWS_ERROR:
+ /* Notify ACL result */
+ net_ma_emit_cred_done(ma_dbus_get_object(), (int)ret);
+
+ if (uuid)
+ g_free(uuid);
+ _request_cleanup(con);
+
+ g_thread_exit(GINT_TO_POINTER (1));
+
+ return NULL;
+}
+
+static int _provisioning_cred(ma_service *service,
+ gchar *uuid_dev1, gchar *uuid_dev2)
+{
+ ma_req_cb_s *con = NULL;
+ con = g_malloc0(sizeof(ma_req_cb_s));
+ if (!con) {
+ MA_LOGE( "g_malloc0() Fail=%d", errno);
+ /* Unset d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 0);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+
+ con->userdata = service;
+ con->cid = MA_PROV_CRED;
+
+ if (!uuid_dev1 ||!uuid_dev2) {
+ MA_LOGE( "Invaild Prameters");
+ _request_cleanup(con);
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ con->uuid_dev1 = g_strdup(uuid_dev1);
+ con->uuid_dev2 = g_strdup(uuid_dev2);
+
+ con->thread = g_thread_try_new("prov_cred", _cred_provisioning_func, con, NULL);
+ if (!con->thread) {
+ MA_LOGE("Failed to create thread");
+ _request_cleanup(con);
+ return MA_ERROR_OUT_OF_MEMORY;
+ }
+ g_thread_unref(con->thread);
+#ifdef TIMEOUT_USED
+ con->tid = g_timeout_add_seconds(CALLBACK_TIMEOUT_5S + 1, _ma_timeout_cb, con);
+#endif
+ return MA_ERROR_NONE;
+}
+
+int ma_request_enable(ma_service *service)
+{
+ int ret = MA_ERROR_NONE;
+ ma_check_null_ret_error("service", service, FALSE);
+ ret = _init_provision_client();
+ return ret;
+}
+
+int ma_request_disc_mot_enb_devs(ma_service *service)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Discovery MOT enabled devices");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _disc_mot_enb_devs(service);
+
+ return ret;
+}
+
+int ma_request_disc_owned_devs(ma_service *service)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Discovery Owned devices");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _disc_owned_devs(service);
+
+ return ret;
+}
+
+int ma_request_mot(ma_service *service, gchar* uuid_str, gchar *pin)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Mullti Ownership Transfer");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ if (!uuid_str || !pin) {
+ MA_LOGE("uuid_str = %s", uuid_str);
+ MA_LOGE("pin = %s", pin);
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _ma_mot(service, uuid_str, pin);
+
+ return ret;
+}
+
+int ma_request_remove_mo(ma_service *service, gchar* uuid_str)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Remove Mulltiple Ownership");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ if (!uuid_str) {
+ MA_LOGE("uuid_str = %s", uuid_str);
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _ma_remove_mo(service, uuid_str);
+
+ return ret;
+}
+
+int ma_request_prov_acl(ma_service *service, gchar *target, gchar *subject,
+ gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Provisioning ACL");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ if (!target || !subject || !rsrc_uri || !rsrc_type || !rsrc_interface) {
+ MA_LOGE("target = %s", target);
+ MA_LOGE("subject = %s", subject);
+ MA_LOGE("rsrc_uri = %s", rsrc_uri);
+ MA_LOGE("rsrc_type = %s", rsrc_type);
+ MA_LOGE("rsrc_interface = %s", rsrc_interface);
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _provisioning_acl(service, target, subject, rsrc_uri, rsrc_type, rsrc_interface, permission);
+
+ return ret;
+}
+
+int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Provisioning Credential");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ if (!uuid_dev1 || !uuid_dev2) {
+ MA_LOGE("uuid_dev1 = %s", uuid_dev1);
+ MA_LOGE("uuid_dev2 = %s", uuid_dev2);
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _provisioning_cred(service, uuid_dev1, uuid_dev2);
+
+ return ret;
+}
+
+int ma_request_get_ownerid(ma_service *service, gchar **uuid_str)
+{
+ int ret =MA_ERROR_NONE;
+ OicUuid_t uuid;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Get Device ID");
+
+ ret = GetDoxmDevOwnerId(&uuid);
+ if (OC_STACK_OK != ret)
+ MA_LOGE("GetDoxmDevOwnerId faild = [%d][%s]", ret, _error_to_string(ret));
+
+ ret = ConvertUuidToStr(&uuid, uuid_str);
+ if (OC_STACK_OK != ret)
+ MA_LOGE("ConvertUuidToStr faild = [%d][%s]", ret, _error_to_string(ret));
+
+ return ret;
+}
+
+int ma_request_disable(ma_service *service)
+{
+ NOTUSED(service);
+
+ if (OC_STACK_OK != OCStop()) {
+ MA_LOGE( "OCStack stop error");
+ }
+
+ OCTerminatePM();
+
+ if (!g_client)
+ return MA_ERROR_NONE;
+
+ if (g_client->g_mowned_list)
+ OCDeleteDiscoveredDevices(g_client->g_mowned_list);
+ if (g_client->g_motdev_list)
+ OCDeleteDiscoveredDevices(g_client->g_motdev_list);
+
+ if (g_client->rnd_pin) {
+ g_free(g_client->rnd_pin);
+ g_client->rnd_pin = NULL;
+ }
+
+ g_free(g_client);
+ g_client = NULL;
+
+ return MA_ERROR_NONE;
+}
+
+int ma_request_pairwise(ma_service *service, gchar *target_1,
+ gchar *subject_1, gchar *rsrc_uri_1, gchar *rsrc_type_1,
+ gchar *rsrc_interface_1, int permission_1,
+ gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2,
+ gchar *rsrc_type_2, gchar *rsrc_interface_2,
+ int permission_2)
+{
+ int ret =MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Link Pairwise");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ if (!target_1 || !subject_1 || !rsrc_uri_1 || !rsrc_type_1 ||
+ !rsrc_interface_1 || !target_2 || !subject_2 || !rsrc_uri_2 ||
+ !rsrc_type_2 || !rsrc_interface_2) {
+ MA_LOGE("target_1 = %s", target_1);
+ MA_LOGE("subject_1 = %s", subject_1);
+ MA_LOGE("rsrc_uri_1 = %s", rsrc_uri_1);
+ MA_LOGE("rsrc_type_1 = %s", rsrc_type_1);
+ MA_LOGE("rsrc_interface_1 = %s", rsrc_interface_1);
+ MA_LOGE("target_2 = %s", target_2);
+ MA_LOGE("subject_2 = %s", subject_2);
+ MA_LOGE("rsrc_uri_2 = %s", rsrc_uri_2);
+ MA_LOGE("rsrc_type_2 = %s", rsrc_type_2);
+ MA_LOGE("rsrc_interface_2 = %s", rsrc_interface_2);
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _provisioning_pairwise_link(service, target_1, subject_1, rsrc_uri_1,
+ rsrc_type_1, rsrc_interface_1, permission_1, target_2,
+ subject_2, rsrc_uri_2, rsrc_type_2, rsrc_interface_2,
+ permission_2);
+
+ return ret;
+
+}
+
+int ma_request_unpair(ma_service *service, gchar *uuid_dev)
+{
+ int ret = MA_ERROR_NONE;
+
+ ma_check_null_ret_error("service", service, FALSE);
+
+ MA_LOGD("[IPC] Unpair device");
+
+ /* If we are working now? */
+ if (g_atomic_int_get(&service->pending))
+ return MA_ERROR_IN_PROGRESS;
+
+ if (!uuid_dev) {
+ MA_LOGE("uuid_dev = %s", uuid_dev);
+
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ /* Set d2ds status 'pending' */
+ g_atomic_int_set(&service->pending, 1);
+
+ ret = _provisioning_unpair(service, uuid_dev);
+
+ return ret;
+
+}
+
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * 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.
+ *
+ */
+#ifndef __MA_SUBONWER_H__
+#define __MA_SUBONWER_H__
+
+#include "ma.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* command id */
+typedef enum {
+ MA_DISC_MOT_ENB_DEVS = 0, /**< Discover MOT enabled devices */
+ MA_DISC_MOWNED_DEVS, /**< Discover my owned MOT enabled devices */
+ MA_MOT, /**< Do Multiple Onwership Transfer */
+ MA_PROV_ACL, /**< ACL Provisioning */
+ MA_PROV_CRED, /**< CRED Provisioning */
+ MA_REMOVE_MOT, /**< Remove Multiple Ownership */
+ MA_UNPAIR, /**< Unpair */
+ MA_PROV_PAIRWISE, /** < Pairwise Provisioning */
+} ma_cmd_id_e;
+
+/* ACL Permission type */
+typedef enum {
+ MA_PERMISSION_CREATE = (1 << 0), /**< C */
+ MA_PERMISSION_READ = (1 << 1), /**< R */
+ MA_PERMISSION_WRITE = (1 << 2), /**< U */
+ MA_PERMISSION_DELETE = (1 << 3), /**< D */
+ MA_PERMISSION_NOTIFY = (1 << 4), /**< N */
+ MA_PERMISSION_FULL = 0x11111 /**< CRUDN */
+} ma_permission_e;
+
+int ma_request_enable(ma_service *service);
+int ma_request_disc_mot_enb_devs(ma_service *service);
+int ma_request_disc_owned_devs(ma_service *service);
+int ma_request_mot(ma_service *service, gchar* uuid, gchar *pin);
+int ma_request_remove_mo(ma_service *service, gchar* uuid_str);
+int ma_request_prov_acl(ma_service *service, gchar *target, gchar *subject,
+ gchar *rsrc_uri, gchar *rsrc_type, gchar *rsrc_interface, int permission);
+int ma_request_prov_cred(ma_service *service, gchar *uuid_dev1, gchar *uuid_dev2);
+int ma_request_unpair(ma_service *service, gchar *uuid_dev);
+int ma_request_get_ownerid(ma_service *service, gchar **uuid_str);
+int ma_request_disable(ma_service *service);
+int ma_request_pairwise(ma_service *service, gchar *target_1, gchar *subject_1,
+ gchar *rsrc_uri_1, gchar *rsrc_type_1, gchar *rsrc_interface_1, int permission_1,
+ gchar *target_2, gchar *subject_2,gchar *rsrc_uri_2, gchar *rsrc_type_2, gchar *rsrc_interface_2, int permission_2);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MA_SUBONWER_H__ */
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * 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.
+ *
+ */
+#ifndef __MA_UTIL_H__
+#define __MA_UTIL_H__
+
+#include <glib.h>
+#include <unistd.h>
+#include <gio/gio.h>
+
+#include "ma-log.h"
+
+#define NOTUSED(var) (var = var)
+
+#define ma_check_null_ret_error(name, value, error) do { \
+ if (G_UNLIKELY(NULL == (value))) { \
+ MA_LOGE("%s is NULL", name); \
+ return error; \
+ } \
+} while (FALSE)
+
+#define ma_check_null_ret(name, value) do { \
+ if (G_UNLIKELY(NULL == (value))) { \
+ MA_LOGE("%s is NULL", name); \
+ return; \
+ } \
+} while (FALSE)
+
+#endif /* __MA_UTIL_H__ */
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * 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 <string.h>
+
+#include <glib.h>
+
+#include "ma.h"
+#include "ma-log.h"
+#include "ma-util.h"
+#include "ma-service.h"
+#include "ma-service-interface.h"
+
+/**< d2d-subowner service */
+ma_service *d2dssvc;
+
+int main(int argc, char *argv[])
+{
+ ma_service *service = NULL;
+ int ret_code = 0;
+ gboolean ret;
+
+ __MA_LOG_FUNC_ENTER__;
+
+#if !GLIB_CHECK_VERSION(2, 32, 0)
+ if (!g_thread_supported())
+ g_thread_init(NULL);
+#endif
+
+#if !GLIB_CHECK_VERSION(2, 36, 0)
+ g_type_init();
+#endif
+ NOTUSED(argc);
+ NOTUSED(argv);
+
+ MA_LOGI("service mainloop start");
+
+ /* Create MOT agent */
+ d2dssvc = service = ma_service_new();
+
+ /* Initialize MOT agent service interface layer */
+ ret = ma_service_interface_init(service);
+ if (G_UNLIKELY(FALSE == ret)) {
+ MA_LOGE("Service interface init. failed!");
+ ret_code = EXIT_FAILURE;
+ goto END;
+ }
+ /* Run MOT agent service */
+ ret = ma_service_run(service);
+ if (G_UNLIKELY(FALSE == ret)) {
+ MA_LOGE("Run service failed!");
+ ret_code = EXIT_FAILURE;
+ }
+
+END:
+ /* Free MOT agent service */
+ ma_service_interface_deinit(service);
+ ma_service_free(service);
+ d2dssvc = NULL;
+
+ __MA_LOG_FUNC_EXIT__;
+ return ret_code;
+}
+
--- /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 __MA_AGENT_H__\r
+#define __MA_AGENT_H__\r
+\r
+#include <glib.h>\r
+#include <gio/gio.h>\r
+#include <tizen.h>\r
+\r
+/**< Internal error code with d2ds daemon. It should be matched with API side */\r
+typedef enum {\r
+ MA_ERROR_NONE = 0, /**< Successful */\r
+ MA_ERROR_IO_ERROR, /**< I/O error */\r
+ MA_ERROR_NO_DATA, /**< Data not exists */\r
+ MA_ERROR_OUT_OF_MEMORY, /**< out of memory */\r
+ MA_ERROR_OPERATION_FAILED, /**< operation failed */\r
+ MA_ERROR_INVALID_PARAMETER, /**< Invalid parameter */\r
+ MA_ERROR_ALREADY_REGISTERED, /**< Request already registered */\r
+ MA_ERROR_IN_PROGRESS /**< operation is in progress */\r
+} ma_error_e;\r
+\r
+/**< d2d-subowner service structure */\r
+typedef struct _ma_service {\r
+ GMainLoop *main_loop; /**< Service main-loop */\r
+ guint dbus_id; /**< D-Bus id */\r
+ guint activation_dbus_id; /**< D-Bus id for activation */\r
+\r
+ gint pending; /**< Is there any pending operation? */\r
+\r
+ gpointer connection; /**< Connection handle for D-Bus call to other process */\r
+ GCancellable *ca; /**< Cancellable object for D-Bus call (Daemon->other) */\r
+ GList *dbus_sub_ids; /**< The list of subscribed signals */\r
+\r
+ gboolean ma_activated; /**< Whether d2d-manager enabled or not */\r
+} ma_service;\r
+\r
+#endif /* __MA_AGENT_H__ */\r
--- /dev/null
+{
+ "acl": {
+ "aclist": {
+ "aces": [
+ {
+ "subjectuuid": "*",
+ "resources": [
+ {
+ "href": "/oic/res",
+ "rel": "",
+ "rt": ["oic.wk.res"],
+ "if": ["oic.if.ll"]
+ },{
+ "href": "/oic/d",
+ "rel": "",
+ "rt": ["oic.wk.d"],
+ "if": ["oic.if.baseline", "oic.if.r"]
+ },{
+ "href": "/oic/p",
+ "rel": "",
+ "rt": ["oic.wk.p"],
+ "if": ["oic.if.baseline", "oic.if.r"]
+ }
+ ],
+ "permission": 2
+ },
+ {
+ "subjectuuid": "*",
+ "resources": [
+ {
+ "href": "/oic/sec/doxm",
+ "rel": "",
+ "rt": ["oic.r.doxm"],
+ "if": ["oic.if.baseline"]
+ },
+ {
+ "href": "/oic/sec/pstat",
+ "rel": "",
+ "rt": ["oic.r.pstat"],
+ "if": ["oic.if.baseline"]
+ },
+ {
+ "href": "/oic/sec/cred",
+ "rel": "",
+ "rt": ["oic.r.cred"],
+ "if": ["oic.if.baseline"]
+ }
+ ],
+ "permission": 6
+ }
+ ]
+ },
+ "rowneruuid": "00000000-0000-0000-0000-000000000000"
+ },
+ "pstat": {
+ "isop": false,
+ "deviceuuid": "00000000-0000-0000-0000-000000000000",
+ "rowneruuid": "00000000-0000-0000-0000-000000000000",
+ "cm": 2,
+ "tm": 0,
+ "om": 4,
+ "sm": 4
+ },
+ "doxm": {
+ "oxms": [0],
+ "oxmsel": 0,
+ "sct": 0,
+ "owned": false,
+ "deviceuuid": "00000000-0000-0000-0000-000000000000",
+ "devowneruuid": "",
+ "rowneruuid": "00000000-0000-0000-0000-000000000000"
+ }
+}