dbus: add obj_path structure

This commit is contained in:
Jaroslav Kysela 2014-08-07 11:11:42 +02:00
parent 1a01052a52
commit fc2776d5f4
6 changed files with 29 additions and 31 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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
*/

View file

@ -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);
}
}