diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-02-15 18:27:33 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-02-15 18:27:33 +0000 |
commit | d6964e5a5b4f0f3b5bc859b11a1352a06e313ecd (patch) | |
tree | faeee80121aa6bb9f8d4318174859be24d13ae9c /audio/headset.c | |
parent | 3b339295a07f906bdee4a7d5df1eb89d21bef8f0 (diff) |
Be sure to always reply to method calls
Diffstat (limited to 'audio/headset.c')
-rw-r--r-- | audio/headset.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/audio/headset.c b/audio/headset.c index a0ada250..da4350ce 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -530,7 +530,6 @@ static gboolean sco_connect_cb(GIOChannel *chan, GIOCondition cond, struct headset *hs) { int ret, sk, err, flags; - DBusMessage *reply; socklen_t len; if (cond & G_IO_NVAL) @@ -563,6 +562,8 @@ static gboolean sco_connect_cb(GIOChannel *chan, GIOCondition cond, g_io_add_watch(hs->sco, flags, sco_input_to_audio_output_cb, hs); if (hs->pending_connect->msg) { + DBusMessage *reply; + reply = dbus_message_new_method_return(hs->pending_connect->msg); if (reply) send_message_and_unref(connection, reply); @@ -635,12 +636,15 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan, GIOCondition cond, struct he g_io_add_watch(chan, G_IO_IN | G_IO_ERR | G_IO_HUP| G_IO_NVAL, (GIOFunc) rfcomm_io_cb, hs); - if (hs->pending_connect->msg) { - DBusMessage *reply; + if (hs->pending_connect) { + if (hs->pending_connect->msg) { + DBusMessage *reply; + + reply = dbus_message_new_method_return(hs->pending_connect->msg); + if (reply) + send_message_and_unref(hs->pending_connect->conn, reply); + } - reply = dbus_message_new_method_return(hs->pending_connect->msg); - if (reply) - send_message_and_unref(connection, reply); pending_connect_free(hs->pending_connect); hs->pending_connect = NULL; } @@ -1029,6 +1033,10 @@ static DBusHandlerResult hs_disconnect(struct headset *hs, DBusMessage *msg) if (hs->pending_connect) { if (hs->pending_connect->io) g_io_channel_close(hs->pending_connect->io); + if (hs->pending_connect->msg) + err_connect_failed(hs->pending_connect->conn, + hs->pending_connect->msg, + EINTR); pending_connect_free(hs->pending_connect); hs->pending_connect = NULL; } @@ -1317,13 +1325,12 @@ static DBusHandlerResult hs_play(struct headset *hs, DBusMessage *msg) if (hs->sco) return err_already_connected(connection, msg); - hs->pending_connect = g_try_new0(struct pending_connect, 1); - if (!hs->pending_connect) + c = g_try_new0(struct pending_connect, 1); + if (!c) return DBUS_HANDLER_RESULT_NEED_MEMORY; hs->state = HEADSET_STATE_PLAY_IN_PROGRESS; - c = hs->pending_connect; c->conn = dbus_connection_ref(connection); c->msg = msg ? dbus_message_ref(msg) : NULL; @@ -1378,13 +1385,14 @@ static DBusHandlerResult hs_play(struct headset *hs, DBusMessage *msg) sco_connect_cb(c->io, G_IO_OUT, hs); } + hs->pending_connect = c; + return 0; failed: - if (hs->pending_connect) { - pending_connect_free(hs->pending_connect); - hs->pending_connect = NULL; - } + if (c) + pending_connect_free(c); + return DBUS_HANDLER_RESULT_HANDLED; } @@ -1403,6 +1411,10 @@ static DBusHandlerResult hs_stop(struct headset *hs, DBusMessage *msg) if (hs->state == HEADSET_STATE_PLAY_IN_PROGRESS && hs->pending_connect) { g_io_channel_close(hs->pending_connect->io); + if (hs->pending_connect->msg) + err_connect_failed(hs->pending_connect->conn, + hs->pending_connect->msg, + EINTR); pending_connect_free(hs->pending_connect); hs->pending_connect = NULL; hs->state = HEADSET_STATE_CONNECTED; |