diff --git a/src/dbus.c b/src/dbus.c index 6d1e35af..ecff80df 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -32,6 +32,7 @@ typedef struct dbus_sig { TAILQ_ENTRY(dbus_sig) link; + char *obj_name; char *sig_name; htsmsg_t *msg; } dbus_sig_t; @@ -47,14 +48,19 @@ static int dbus_running; * */ void -dbus_emit_signal(const char *sig_name, htsmsg_t *msg) +dbus_emit_signal(const char *obj_name, const char *sig_name, htsmsg_t *msg) { dbus_sig_t *ds = calloc(1, sizeof(dbus_sig_t)); + size_t l; if (!dbus_running) { htsmsg_destroy(msg); return; } + l = strlen(obj_name); + ds->obj_name = malloc(l + 15); + strcpy(ds->obj_name, "/org/tvheadend"); + strcpy(ds->obj_name + 14, obj_name); ds->sig_name = strdup(sig_name); ds->msg = msg; pthread_mutex_lock(&dbus_lock); @@ -64,19 +70,19 @@ dbus_emit_signal(const char *sig_name, htsmsg_t *msg) } void -dbus_emit_signal_str(const char *sig_name, const char *value) +dbus_emit_signal_str(const char *obj_name, const char *sig_name, const char *value) { htsmsg_t *l = htsmsg_create_list(); htsmsg_add_str(l, NULL, value); - dbus_emit_signal(sig_name, l); + dbus_emit_signal(obj_name, sig_name, l); } void -dbus_emit_signal_s64(const char *sig_name, int64_t value) +dbus_emit_signal_s64(const char *obj_name, const char *sig_name, int64_t value) { htsmsg_t *l = htsmsg_create_list(); htsmsg_add_s64(l, NULL, value); - dbus_emit_signal(sig_name, l); + dbus_emit_signal(obj_name, sig_name, l); } /** @@ -199,27 +205,11 @@ dbus_reply_to_ping(DBusMessage *msg, DBusConnection *conn) /** * */ -#if 0 -static void -dbus_server_close_hack(DBusConnection *conn, - DBusDispatchStatus new_status, - void *data) -{ - /* buggy refcounting in libdbus */ - dbus_connection_unref(conn); -} -#endif static void dbus_connection_safe_close(DBusConnection *conn) { dbus_connection_flush(conn); - -//#if ENABLE_TRACE /* a little bit wrong condition */ - /* ugly bug here, note that the fixed version of dbus will broke this */ -// dbus_connection_set_dispatch_status_function(conn, dbus_server_close_hack, NULL, NULL); -//#endif - dbus_connection_close(conn); dbus_connection_unref(conn); } @@ -243,10 +233,13 @@ dbus_flush_queue(DBusConnection *conn) break; if (conn) - dbus_send_signal(conn, "/", "org.tvheadend.notify", ds->sig_name, ds->msg); + dbus_send_signal(conn, + ds->obj_name, "org.tvheadend.notify", + ds->sig_name, ds->msg); htsmsg_destroy(ds->msg); free(ds->sig_name); + free(ds->obj_name); free(ds); } if (conn) @@ -344,7 +337,7 @@ dbus_server_init(void) tvh_pipe(O_NONBLOCK, &dbus_pipe); dbus_threads_init_default(); dbus_running = 1; - dbus_emit_signal_str("start", tvheadend_version); + dbus_emit_signal_str("/main", "start", tvheadend_version); } void @@ -356,7 +349,7 @@ dbus_server_start(void) void dbus_server_done(void) { - dbus_emit_signal_str("stop", "bye"); + dbus_emit_signal_str("/main", "stop", "bye"); dbus_running = 0; tvh_write(dbus_pipe.wr, "", 1); pthread_kill(dbus_tid, SIGTERM); diff --git a/src/dbus.h b/src/dbus.h index a093648a..a083c98c 100644 --- a/src/dbus.h +++ b/src/dbus.h @@ -25,11 +25,11 @@ #if ENABLE_DBUS_1 void -dbus_emit_signal(const char *sig_name, htsmsg_t *msg); +dbus_emit_signal(const char *obj_name, const char *sig_name, htsmsg_t *msg); void -dbus_emit_signal_str(const char *sig_name, const char *value); +dbus_emit_signal_str(const char *obj_name, const char *sig_name, const char *value); void -dbus_emit_signal_s64(const char *sig_name, int64_t value); +dbus_emit_signal_s64(const char *obj_name, const char *sig_name, int64_t value); void dbus_server_init(void); void dbus_server_start(void); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index dcb10362..802c4867 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -77,7 +77,7 @@ dvr_dbus_timer_cb( void *aux ) } /* different? send it.... */ if (result && result != last_result) { - dbus_emit_signal_s64("dvr_next", result); + dbus_emit_signal_s64("/dvr", "next", result); last_result = result; } } diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index 6ebb49a4..825976cd 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -532,7 +532,7 @@ epggrab_ota_next_arm( time_t next ) { tvhtrace("epggrab", "next ota start event in %li seconds", next - time(NULL)); gtimer_arm_abs(&epggrab_ota_start_timer, epggrab_ota_start_cb, NULL, next); - dbus_emit_signal_s64("epggrab_ota_next", next); + dbus_emit_signal_s64("/epggrab/ota", "next", next); } static void @@ -759,7 +759,7 @@ epggrab_ota_post ( void ) /* Init timer (call after full init - wait for network tuners) */ if (epggrab_ota_initial) { /* notify another system layers, that we will do EPG OTA */ - dbus_emit_signal_s64("epggrab_ota_next", time(NULL) + 15); + dbus_emit_signal_s64("/epggrab/ota", "next", time(NULL) + 15); epggrab_ota_pending_flag = 1; epggrab_ota_kick(15); t = time(NULL); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index f72ac82e..64418d65 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -564,6 +564,11 @@ struct mpegts_input pthread_cond_t mi_table_cond; mpegts_table_feed_queue_t mi_table_queue; + /* DBus */ +#if ENABLE_DBUS_1 + int64_t mi_dbus_subs; +#endif + /* * Functions */ diff --git a/src/subscriptions.c b/src/subscriptions.c index 3be46cee..c30f9f79 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -801,7 +801,7 @@ subscription_status_callback ( void *p ) } if (old_count != count) { old_count = count; - dbus_emit_signal_s64("subscriptions", count); + dbus_emit_signal_s64("/status", "subscriptions", count); } }