void rtsp_handle_options_request(RTSP_Client *client, RTSP_Ps *state) { GstRTSPMethod options; gchar *str; rtsp_client_remove_dead_session(client); options = GST_RTSP_DESCRIBE | GST_RTSP_OPTIONS | GST_RTSP_PAUSE | GST_RTSP_PLAY | GST_RTSP_SETUP | GST_RTSP_GET_PARAMETER | GST_RTSP_SET_PARAMETER | GST_RTSP_TEARDOWN; str = gst_rtsp_options_as_text(options); gst_rtsp_message_init_response( state->response, GST_RTSP_STS_OK, gst_rtsp_status_as_text(GST_RTSP_STS_OK), state->request ); gst_rtsp_message_add_header(state->response, GST_RTSP_HDR_PUBLIC, str); g_free(str); rtsp_client_send_response(client, NULL, state->response); }
static __inline__ void nmp_rtsp_device_send_generic_response(NmpMediaDevice *device, GstRTSPStatusCode code, NmpRtspState *state) { gst_rtsp_message_init_response(state->response, code, gst_rtsp_status_as_text(code), state->request); nmp_rtsp_device_send_response(device, state->response); }
/** * gst_rtsp_message_init_response: * @msg: a #GstRTSPMessage * @code: the status code * @reason: (transfer none) (allow-none): the status reason or %NULL * @request: (transfer none) (allow-none): the request that triggered the response or %NULL * * Initialize @msg with @code and @reason. * * When @reason is #NULL, the default reason for @code will be used. * * When @request is not #NULL, the relevant headers will be copied to the new * response message. * * Returns: a #GstRTSPResult. */ GstRTSPResult gst_rtsp_message_init_response (GstRTSPMessage * msg, GstRTSPStatusCode code, const gchar * reason, const GstRTSPMessage * request) { g_return_val_if_fail (msg != NULL, GST_RTSP_EINVAL); gst_rtsp_message_unset (msg); if (reason == NULL) reason = gst_rtsp_status_as_text (code); msg->type = GST_RTSP_MESSAGE_RESPONSE; msg->type_data.response.code = code; msg->type_data.response.reason = g_strdup (reason); msg->type_data.response.version = GST_RTSP_VERSION_1_0; msg->hdr_fields = g_array_new (FALSE, FALSE, sizeof (RTSPKeyValue)); if (request) { if (request->type == GST_RTSP_MESSAGE_HTTP_REQUEST) { msg->type = GST_RTSP_MESSAGE_HTTP_RESPONSE; if (request->type_data.request.version != GST_RTSP_VERSION_INVALID) msg->type_data.response.version = request->type_data.request.version; else msg->type_data.response.version = GST_RTSP_VERSION_1_1; } else { gchar *header; /* copy CSEQ */ if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_CSEQ, &header, 0) == GST_RTSP_OK) { gst_rtsp_message_add_header (msg, GST_RTSP_HDR_CSEQ, header); } /* copy session id */ if (gst_rtsp_message_get_header (request, GST_RTSP_HDR_SESSION, &header, 0) == GST_RTSP_OK) { char *pos; header = g_strdup (header); if ((pos = strchr (header, ';'))) { *pos = '\0'; } g_strchomp (header); gst_rtsp_message_take_header (msg, GST_RTSP_HDR_SESSION, header); } /* FIXME copy more headers? */ } } return GST_RTSP_OK; }
/** * gst_rtsp_params_get: * @client: a #GstRTSPClient * @ctx: a #GstRTSPContext * * Get parameters (not implemented yet) * * Returns: a #GstRTSPResult */ GstRTSPResult gst_rtsp_params_get (GstRTSPClient * client, GstRTSPContext * ctx) { 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 (ctx->response, code, gst_rtsp_status_as_text (code), ctx->request); return GST_RTSP_OK; }
static __inline__ void nmp_rtsp_give_options_response(NmpMediaDevice *device, NmpRtspState *state, GstRTSPStatusCode code) { GstRTSPMethod options; gchar *str; if (code == GST_RTSP_STS_OK) { options = GST_RTSP_OPTIONS | GST_RTSP_TEARDOWN; str = gst_rtsp_options_as_text(options); gst_rtsp_message_init_response(state->response, GST_RTSP_STS_OK, gst_rtsp_status_as_text(GST_RTSP_STS_OK), state->request); gst_rtsp_message_add_header(state->response, GST_RTSP_HDR_PUBLIC, str); g_free(str); nmp_rtsp_device_send_response(device, state->response); } else { nmp_rtsp_device_send_generic_response(device, code, state); } }