mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-13 10:55:34 +00:00
Add handle-response signal for when we receive a GET_PARAMETER response
This commit is contained in:
parent
76cbc7c86c
commit
1f84618725
2 changed files with 87 additions and 0 deletions
|
@ -107,6 +107,7 @@ enum
|
||||||
SIGNAL_TEARDOWN_REQUEST,
|
SIGNAL_TEARDOWN_REQUEST,
|
||||||
SIGNAL_SET_PARAMETER_REQUEST,
|
SIGNAL_SET_PARAMETER_REQUEST,
|
||||||
SIGNAL_GET_PARAMETER_REQUEST,
|
SIGNAL_GET_PARAMETER_REQUEST,
|
||||||
|
SIGNAL_HANDLE_RESPONSE,
|
||||||
SIGNAL_LAST
|
SIGNAL_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -223,6 +224,12 @@ gst_rtsp_client_class_init (GstRTSPClientClass * klass)
|
||||||
get_parameter_request), NULL, NULL, g_cclosure_marshal_VOID__POINTER,
|
get_parameter_request), NULL, NULL, g_cclosure_marshal_VOID__POINTER,
|
||||||
G_TYPE_NONE, 1, G_TYPE_POINTER);
|
G_TYPE_NONE, 1, G_TYPE_POINTER);
|
||||||
|
|
||||||
|
gst_rtsp_client_signals[SIGNAL_HANDLE_RESPONSE] =
|
||||||
|
g_signal_new ("handle-response", G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPClientClass,
|
||||||
|
handle_response), NULL, NULL, g_cclosure_marshal_VOID__POINTER,
|
||||||
|
G_TYPE_NONE, 1, G_TYPE_POINTER);
|
||||||
|
|
||||||
tunnels =
|
tunnels =
|
||||||
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
|
g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
|
||||||
g_mutex_init (&tunnels_lock);
|
g_mutex_init (&tunnels_lock);
|
||||||
|
@ -1947,6 +1954,84 @@ not_implemented:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_response (GstRTSPClient * client, GstRTSPMessage * response)
|
||||||
|
{
|
||||||
|
GstRTSPClientPrivate *priv = client->priv;
|
||||||
|
GstRTSPResult res;
|
||||||
|
GstRTSPSession *session = NULL;
|
||||||
|
GstRTSPContext sctx = { NULL }, *ctx;
|
||||||
|
gchar *sessid;
|
||||||
|
|
||||||
|
if (!(ctx = gst_rtsp_context_get_current ())) {
|
||||||
|
ctx = &sctx;
|
||||||
|
ctx->auth = priv->auth;
|
||||||
|
gst_rtsp_context_push_current (ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->conn = priv->connection;
|
||||||
|
ctx->client = client;
|
||||||
|
ctx->request = NULL;
|
||||||
|
ctx->uri = NULL;
|
||||||
|
ctx->method = GST_RTSP_INVALID;
|
||||||
|
ctx->response = response;
|
||||||
|
|
||||||
|
if (gst_debug_category_get_threshold (rtsp_client_debug) >= GST_LEVEL_LOG) {
|
||||||
|
gst_rtsp_message_dump (response);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_INFO ("client %p: received a response", client);
|
||||||
|
|
||||||
|
/* get the session if there is any */
|
||||||
|
res =
|
||||||
|
gst_rtsp_message_get_header (response, GST_RTSP_HDR_SESSION, &sessid, 0);
|
||||||
|
if (res == GST_RTSP_OK) {
|
||||||
|
if (priv->session_pool == NULL)
|
||||||
|
goto no_pool;
|
||||||
|
|
||||||
|
/* we had a session in the request, find it again */
|
||||||
|
if (!(session = gst_rtsp_session_pool_find (priv->session_pool, sessid)))
|
||||||
|
goto session_not_found;
|
||||||
|
|
||||||
|
/* we add the session to the client list of watched sessions. When a session
|
||||||
|
* disappears because it times out, we will be notified. If all sessions are
|
||||||
|
* gone, we will close the connection */
|
||||||
|
client_watch_session (client, session);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->session = session;
|
||||||
|
|
||||||
|
if (!gst_rtsp_auth_check (GST_RTSP_AUTH_CHECK_URL))
|
||||||
|
goto not_authorized;
|
||||||
|
|
||||||
|
g_signal_emit (client, gst_rtsp_client_signals[SIGNAL_HANDLE_RESPONSE],
|
||||||
|
0, ctx);
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (ctx == &sctx)
|
||||||
|
gst_rtsp_context_pop_current (ctx);
|
||||||
|
if (session)
|
||||||
|
g_object_unref (session);
|
||||||
|
return;
|
||||||
|
|
||||||
|
no_pool:
|
||||||
|
{
|
||||||
|
GST_ERROR ("client %p: no pool configured", client);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
session_not_found:
|
||||||
|
{
|
||||||
|
GST_ERROR ("client %p: session not found", client);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
not_authorized:
|
||||||
|
{
|
||||||
|
GST_ERROR ("client %p: not allowed", client);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_data (GstRTSPClient * client, GstRTSPMessage * message)
|
handle_data (GstRTSPClient * client, GstRTSPMessage * message)
|
||||||
{
|
{
|
||||||
|
@ -2368,6 +2453,7 @@ gst_rtsp_client_handle_message (GstRTSPClient * client,
|
||||||
handle_request (client, message);
|
handle_request (client, message);
|
||||||
break;
|
break;
|
||||||
case GST_RTSP_MESSAGE_RESPONSE:
|
case GST_RTSP_MESSAGE_RESPONSE:
|
||||||
|
handle_response (client, message);
|
||||||
break;
|
break;
|
||||||
case GST_RTSP_MESSAGE_DATA:
|
case GST_RTSP_MESSAGE_DATA:
|
||||||
handle_data (client, message);
|
handle_data (client, message);
|
||||||
|
|
|
@ -104,6 +104,7 @@ struct _GstRTSPClientClass {
|
||||||
void (*teardown_request) (GstRTSPClient *client, GstRTSPContext *ctx);
|
void (*teardown_request) (GstRTSPClient *client, GstRTSPContext *ctx);
|
||||||
void (*set_parameter_request) (GstRTSPClient *client, GstRTSPContext *ctx);
|
void (*set_parameter_request) (GstRTSPClient *client, GstRTSPContext *ctx);
|
||||||
void (*get_parameter_request) (GstRTSPClient *client, GstRTSPContext *ctx);
|
void (*get_parameter_request) (GstRTSPClient *client, GstRTSPContext *ctx);
|
||||||
|
void (*handle_response) (GstRTSPClient *client, GstRTSPContext *ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_rtsp_client_get_type (void);
|
GType gst_rtsp_client_get_type (void);
|
||||||
|
|
Loading…
Reference in a new issue