static void set_stream_held (TpMediaStreamHandler *proxy, gboolean held, gpointer user_data, GObject *object) { TpStreamEngineStream *self = TP_STREAM_ENGINE_STREAM (object); g_assert (self->priv->fs_stream != NULL); DEBUG ("parent_channel = %p. Holding : %d", self->priv->parent_channel, held); if (held) { /* Hold the call */ if (farsight_stream_hold (self->priv->fs_stream)) { tp_stream_engine_stream_held (); /* Send success message */ if (self->priv->stream_handler_proxy) { tp_cli_media_stream_handler_call_hold_state ( self->priv->stream_handler_proxy, -1, TRUE, async_method_callback, "Media.StreamHandler::HoldState", NULL, (GObject *) self); } } else { stop_stream (self); tp_stream_engine_stream_error (self, 0, "Error holding call"); } } else { /* Make sure we have access to the resource */ if (tp_stream_engine_get_unheld_call () == NULL || tp_stream_engine_get_unheld_call () == self->priv->parent_channel) { /* Unhold the call */ if (farsight_stream_unhold (self->priv->fs_stream)) { tp_stream_engine_stream_unheld (self->priv->parent_channel); /* Send success message */ if (self->priv->stream_handler_proxy) { tp_cli_media_stream_handler_call_hold_state ( self->priv->stream_handler_proxy, -1, FALSE, async_method_callback, "Media.StreamHandler::HoldState", NULL, (GObject *) self); } } else { stop_stream (self); tp_stream_engine_stream_error (self, 0, "Error unholding call"); } } else { /* Send failure message */ if (self->priv->stream_handler_proxy) { tp_cli_media_stream_handler_call_unhold_failure ( self->priv->stream_handler_proxy, -1, async_method_callback, "Media.StreamHandler::UnholdFailure", NULL, (GObject *) self); } } } }