From 5e4757eff68aa42b354b62a513f367c635812c21 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 10 Jun 2009 00:01:07 +0200 Subject: [PATCH] rtsp: prepare for handling GET/SET_PARAMETER Add helper functions to handle GET/SET_PARAMETER. Reply with an error when there is a body now. Fix return codes of handlers. --- gst/rtsp-server/Makefile.am | 2 + gst/rtsp-server/rtsp-client.c | 86 ++++++++++++++++++++++++++++++++++++++++--- gst/rtsp-server/rtsp-params.c | 55 +++++++++++++++++++++++++++ gst/rtsp-server/rtsp-params.h | 43 ++++++++++++++++++++++ 4 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 gst/rtsp-server/rtsp-params.c create mode 100644 gst/rtsp-server/rtsp-params.h diff --git a/gst/rtsp-server/Makefile.am b/gst/rtsp-server/Makefile.am index eced581..1b33fc3 100644 --- a/gst/rtsp-server/Makefile.am +++ b/gst/rtsp-server/Makefile.am @@ -4,6 +4,7 @@ public_headers = \ rtsp-media.h \ rtsp-media-factory.h \ rtsp-media-mapping.h \ + rtsp-params.h \ rtsp-sdp.h \ rtsp-session-pool.h \ rtsp-session.h @@ -14,6 +15,7 @@ c_sources = \ rtsp-media.c \ rtsp-media-factory.c \ rtsp-media-mapping.c \ + rtsp-params.c \ rtsp-sdp.c \ rtsp-session-pool.c \ rtsp-session.c diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index aeaf52a..4d245b7 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -21,6 +21,7 @@ #include "rtsp-client.h" #include "rtsp-sdp.h" +#include "rtsp-params.h" #define DEBUG @@ -396,7 +397,7 @@ handle_teardown_request (GstRTSPClient * client, GstRTSPUrl * uri, send_response (client, session, &response); - return FALSE; + return TRUE; /* ERRORS */ no_session: @@ -412,6 +413,77 @@ not_found: } static gboolean +handle_get_param_request (GstRTSPClient * client, GstRTSPUrl * uri, + GstRTSPSession * session, GstRTSPMessage * request) +{ + GstRTSPResult res; + guint8 *data; + guint size; + + res = gst_rtsp_message_get_body (request, &data, &size); + if (res != GST_RTSP_OK) + goto bad_request; + + if (size == 0) { + /* no body, keep-alive request */ + send_generic_response (client, GST_RTSP_STS_OK, request); + } else { + /* there is a body */ + GstRTSPMessage response = { 0 }; + + /* there is a body, handle the params */ + res = gst_rtsp_params_get (client, uri, session, request, &response); + if (res != GST_RTSP_OK) + goto bad_request; + + send_response (client, session, &response); + } + return TRUE; + + /* ERRORS */ +bad_request: + { + send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, request); + return FALSE; + } +} + +static gboolean +handle_set_param_request (GstRTSPClient * client, GstRTSPUrl * uri, + GstRTSPSession * session, GstRTSPMessage * request) +{ + GstRTSPResult res; + guint8 *data; + guint size; + + res = gst_rtsp_message_get_body (request, &data, &size); + if (res != GST_RTSP_OK) + goto bad_request; + + if (size == 0) { + /* no body, keep-alive request */ + send_generic_response (client, GST_RTSP_STS_OK, request); + } else { + GstRTSPMessage response = { 0 }; + + /* there is a body, handle the params */ + res = gst_rtsp_params_set (client, uri, session, request, &response); + if (res != GST_RTSP_OK) + goto bad_request; + + send_response (client, session, &response); + } + return TRUE; + + /* ERRORS */ +bad_request: + { + send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, request); + return FALSE; + } +} + +static gboolean handle_pause_request (GstRTSPClient * client, GstRTSPUrl * uri, GstRTSPSession * session, GstRTSPMessage * request) { @@ -448,7 +520,7 @@ handle_pause_request (GstRTSPClient * client, GstRTSPUrl * uri, /* the state is now READY */ media->state = GST_RTSP_STATE_READY; - return FALSE; + return TRUE; /* ERRORS */ no_session: @@ -581,7 +653,7 @@ handle_play_request (GstRTSPClient * client, GstRTSPUrl * uri, media->state = GST_RTSP_STATE_PLAYING; - return FALSE; + return TRUE; /* ERRORS */ no_session: @@ -876,7 +948,7 @@ no_sdp: } } -static void +static gboolean handle_options_request (GstRTSPClient * client, GstRTSPUrl * uri, GstRTSPSession * session, GstRTSPMessage * request) { @@ -900,6 +972,8 @@ handle_options_request (GstRTSPClient * client, GstRTSPUrl * uri, g_free (str); send_response (client, session, &response); + + return TRUE; } /* remove duplicate and trailing '/' */ @@ -1031,8 +1105,10 @@ handle_request (GstRTSPClient * client, GstRTSPMessage * request) handle_teardown_request (client, uri, session, request); break; case GST_RTSP_SET_PARAMETER: + handle_set_param_request (client, uri, session, request); + break; case GST_RTSP_GET_PARAMETER: - send_generic_response (client, GST_RTSP_STS_OK, request); + handle_get_param_request (client, uri, session, request); break; case GST_RTSP_ANNOUNCE: case GST_RTSP_RECORD: diff --git a/gst/rtsp-server/rtsp-params.c b/gst/rtsp-server/rtsp-params.c new file mode 100644 index 0000000..079f714 --- /dev/null +++ b/gst/rtsp-server/rtsp-params.c @@ -0,0 +1,55 @@ +/* GStreamer + * Copyright (C) 2008 Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include + +#include "rtsp-params.h" + +GstRTSPResult +gst_rtsp_params_set (GstRTSPClient * client, GstRTSPUrl * uri, + GstRTSPSession * session, GstRTSPMessage * request, + GstRTSPMessage * response) +{ + GstRTSPStatusCode code; + + /* FIXME, actually parse the request based on the mime type and try to repond + * with a list of the parameters */ + code = GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD; + + gst_rtsp_message_init_response (response, code, + gst_rtsp_status_as_text (code), request); + + return GST_RTSP_OK; +} + +GstRTSPResult +gst_rtsp_params_get (GstRTSPClient * client, GstRTSPUrl * uri, + GstRTSPSession * session, GstRTSPMessage * request, + GstRTSPMessage * response) +{ + GstRTSPStatusCode code; + + /* FIXME, actually parse the request based on the mime type and try to repond + * with a list of the parameters */ + code = GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD; + + gst_rtsp_message_init_response (response, code, + gst_rtsp_status_as_text (code), request); + + return GST_RTSP_OK; +} diff --git a/gst/rtsp-server/rtsp-params.h b/gst/rtsp-server/rtsp-params.h new file mode 100644 index 0000000..4690383 --- /dev/null +++ b/gst/rtsp-server/rtsp-params.h @@ -0,0 +1,43 @@ +/* GStreamer + * Copyright (C) 2008 Wim Taymans + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include + +#ifndef __GST_RTSP_PARAMS_H__ +#define __GST_RTSP_PARAMS_H__ + +#include "rtsp-client.h" +#include "rtsp-session.h" + +G_BEGIN_DECLS + +GstRTSPResult gst_rtsp_params_set (GstRTSPClient * client, GstRTSPUrl * uri, + GstRTSPSession * session, GstRTSPMessage * request, + GstRTSPMessage * response); + +GstRTSPResult gst_rtsp_params_get (GstRTSPClient * client, GstRTSPUrl * uri, + GstRTSPSession * session, GstRTSPMessage * request, + GstRTSPMessage * response); + +G_END_DECLS + +#endif /* __GST_RTSP_PARAMS_H__ */ -- 2.7.4