<node>
<interface name="org.tizen.iotcon.dbus">
+ <method name="initialize">
+ <arg type="i" name="ret" direction="out"/>
+ </method>
<method name="registerResource">
<arg type="s" name="uri_path" direction="in"/>
<arg type="as" name="resource_types" direction="in"/>
TARGET_LINK_LIBRARIES(${DAEMON} ${daemon_pkgs_LIBRARIES})
INSTALL(TARGETS ${DAEMON} DESTINATION ${BIN_INSTALL_DIR})
+
+IF(TZ_VER_3)
+ SET(USER "iotcon")
+ELSE(TZ_VER_3)
+ SET(USER "system")
+ENDIF(TZ_VER_3)
+
+SET(DBUS_SERVICE_FILE "org.tizen.${PROJECT_NAME}.dbus")
+CONFIGURE_FILE(${DBUS_SERVICE_FILE}.service.in ${DBUS_SERVICE_FILE}.service @ONLY)
+INSTALL(FILES ${DBUS_SERVICE_FILE}.service DESTINATION
+ ${SHARE_INSTALL_PREFIX}/dbus-1/system-services)
DBG("new client(%s) added", bus_name);
icd_dbus_client_list = g_list_append(icd_dbus_client_list, client);
+
+ icd_unset_kill_timeout();
+
*ret_client = client;
return IOTCON_ERROR_NONE;
if (client) { /* found bus name in our bus list */
DBG("bus(%s) stopped", old_owner);
icd_dbus_client_list = g_list_remove_link(icd_dbus_client_list, client);
+
+ if (0 == g_list_length(icd_dbus_client_list))
+ icd_set_kill_timeout();
}
g_mutex_unlock(&icd_dbus_client_list_mutex);
g_mutex_unlock(&icd_dbus_client_list_mutex);
}
+static gboolean _dbus_handle_initialize(icDbus *object,
+ GDBusMethodInvocation *invocation)
+{
+ FN_CALL;
+ int ret;
+ const gchar *sender;
+ icd_dbus_client_s *client = NULL;
+
+ sender = g_dbus_method_invocation_get_sender(invocation);
+
+ g_mutex_lock(&icd_dbus_client_list_mutex);
+ ret = _icd_dbus_client_list_get_client(sender, &client);
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("_icd_dbus_client_list_get_client() Fail(%d)", ret);
+ g_mutex_unlock(&icd_dbus_client_list_mutex);
+ ic_dbus_complete_initialize(object, invocation, ret);
+ return TRUE;
+ }
+ g_mutex_unlock(&icd_dbus_client_list_mutex);
+
+ ic_dbus_complete_initialize(object, invocation, IOTCON_ERROR_NONE);
+
+ return TRUE;
+}
+
static gboolean _dbus_handle_register_resource(icDbus *object,
GDBusMethodInvocation *invocation,
return;
}
+ g_signal_connect(icd_dbus_object, "handle-initialize",
+ G_CALLBACK(_dbus_handle_initialize), NULL);
g_signal_connect(icd_dbus_object, "handle-register-resource",
G_CALLBACK(_dbus_handle_register_resource), NULL);
g_signal_connect(icd_dbus_object, "handle-unregister-resource",
{
FN_CALL;
OCStackResult result;
- const struct timespec delay = {0, 10 * 1000 * 1000}; /* 10 ms */
+ const struct timespec delay = {0, 100 * 1000 * 1000}; /* 100 ms */
icd_ioty_alive = 1;
while (icd_ioty_alive) {
break;
}
- /* TODO : Current '10ms' is not proven sleep time. Revise the time after test.
+ /* TODO : Current '100 ms' is not proven sleep time. Revise the time after test.
* Or recommend changes to event driven architecture */
nanosleep(&delay, NULL);
}
* limitations under the License.
*/
#include <gio/gio.h>
+#include <glib.h>
#include "icd.h"
#include "icd-dbus.h"
#define ICD_ALL_INTERFACES "0.0.0.0"
#define ICD_RANDOM_PORT 0
+#define ICD_KILL_TIMEOUT_DURATION 10
+
+static GMainLoop *icd_loop;
+static int icd_kill_timeout;
+
+void icd_unset_kill_timeout()
+{
+ FN_CALL;
+ if (0 == icd_kill_timeout)
+ return;
+
+ g_source_remove(icd_kill_timeout);
+ icd_kill_timeout = 0;
+}
+
+static gboolean _icd_kill_cb(gpointer p)
+{
+ FN_CALL;
+ g_main_loop_quit(icd_loop);
+ return G_SOURCE_REMOVE;
+}
+
+void icd_set_kill_timeout()
+{
+ FN_CALL;
+ if (icd_kill_timeout)
+ return;
+
+ icd_kill_timeout = g_timeout_add_seconds(ICD_KILL_TIMEOUT_DURATION, _icd_kill_cb, NULL);
+}
int main(int argc, char **argv)
{
int ret;
guint id;
GThread *thread;
- GMainLoop *loop;
#if !GLIB_CHECK_VERSION(2, 35, 0)
g_type_init();
#endif
- loop = g_main_loop_new(NULL, FALSE);
+ icd_loop = g_main_loop_new(NULL, FALSE);
id = icd_dbus_init();
thread = icd_ioty_init(ICD_ALL_INTERFACES, ICD_RANDOM_PORT);
icd_dbus_deinit(id);
}
- g_main_loop_run(loop);
+ icd_set_kill_timeout();
+ g_main_loop_run(icd_loop);
icd_cynara_deinit();
icd_ioty_deinit(thread);
icd_dbus_deinit(id);
- g_main_loop_unref(loop);
+ g_main_loop_unref(icd_loop);
return 0;
}
#define IC_DAEMON
#include "ic-log.h"
+void icd_unset_kill_timeout();
+void icd_set_kill_timeout();
#endif /*__IOT_CONNECTIVITY_MANAGER_DAEMON_H__*/
--- /dev/null
+[D-BUS Service]
+Name=@DBUS_INTERFACE@
+User=@USER@
+Exec=/bin/false
+SystemdService=@PROJECT_NAME@.service
int icl_dbus_start()
{
+ int ret;
unsigned int id;
GError *error = NULL;
g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(icl_dbus_object),
ICL_DBUS_TIMEOUT_DEFAULT * 1000);
+ ic_dbus_call_initialize_sync(icl_dbus_get_object(),
+ &ret,
+ NULL,
+ &error);
+ if (error) {
+ ERR("ic_dbus_call_initialize_sync() Fail(%s)", error->message);
+ ret = icl_dbus_convert_dbus_error(error->code);
+ g_error_free(error);
+ return ret;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
icl_dbus_count++;
return IOTCON_ERROR_NONE;
}
Description=Tizen IoT Connectivity
[Service]
-Type=simple
+Type=dbus
+BusName=org.tizen.iotcon.dbus
ExecStart=/usr/bin/iotcon-daemon
-Restart=always
+Restart=on-failure
User=system
Group=system
SmackProcessLabel=iotcon
Description=Tizen IoT Connectivity
[Service]
-Type=simple
+Type=dbus
+BusName=org.tizen.iotcon.dbus
ExecStart=/usr/bin/iotcon-daemon
-Restart=always
+Restart=on-failure
User=iotcon
[Install]
%{_libdir}/lib%{name}.so.*
%{_unitdir}/%{name}.service
%{_unitdir}/multi-user.target.wants/%{name}.service
+%{_datadir}/dbus-1/system-services/org.tizen.%{name}.dbus.service
%if 0%{?tizen_version_major} < 3
%{_datadir}/license/%{name}
%else