Add new RTSP message method to set header

Add gst_rtsp_message_take_header() that takes ownership of the passed header
value. This allows us to avoid an allocations and memory copy in some
situations.
API: GstRTSPMessage::gst_rtsp_message_take_header()
This commit is contained in:
Wim Taymans 2009-01-29 11:55:10 +01:00
parent 9135370b42
commit 484a025f6d
4 changed files with 33 additions and 11 deletions

View File

@ -1227,6 +1227,7 @@ gst_rtsp_message_new_data
gst_rtsp_message_init_data gst_rtsp_message_init_data
gst_rtsp_message_parse_data gst_rtsp_message_parse_data
gst_rtsp_message_add_header gst_rtsp_message_add_header
gst_rtsp_message_take_header
gst_rtsp_message_remove_header gst_rtsp_message_remove_header
gst_rtsp_message_get_header gst_rtsp_message_get_header
gst_rtsp_message_append_headers gst_rtsp_message_append_headers

View File

@ -398,12 +398,11 @@ add_auth_header (GstRTSPConnection * conn, GstRTSPMessage * message)
gst_rtsp_base64_encode (user_pass, strlen (user_pass)); gst_rtsp_base64_encode (user_pass, strlen (user_pass));
gchar *auth_string = g_strdup_printf ("Basic %s", user_pass64); gchar *auth_string = g_strdup_printf ("Basic %s", user_pass64);
gst_rtsp_message_add_header (message, GST_RTSP_HDR_AUTHORIZATION, gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION,
auth_string); auth_string);
g_free (user_pass); g_free (user_pass);
g_free (user_pass64); g_free (user_pass64);
g_free (auth_string);
break; break;
} }
case GST_RTSP_AUTH_DIGEST:{ case GST_RTSP_AUTH_DIGEST:{
@ -445,9 +444,8 @@ add_auth_header (GstRTSPConnection * conn, GstRTSPMessage * message)
g_free (auth_string); g_free (auth_string);
auth_string = auth_string2; auth_string = auth_string2;
} }
gst_rtsp_message_add_header (message, GST_RTSP_HDR_AUTHORIZATION, gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION,
auth_string); auth_string);
g_free (auth_string);
break; break;
} }
default: default:

View File

@ -309,8 +309,7 @@ gst_rtsp_message_init_response (GstRTSPMessage * msg, GstRTSPStatusCode code,
*pos = '\0'; *pos = '\0';
} }
g_strchomp (header); g_strchomp (header);
gst_rtsp_message_add_header (msg, GST_RTSP_HDR_SESSION, header); gst_rtsp_message_take_header (msg, GST_RTSP_HDR_SESSION, header);
g_free (header);
} }
/* FIXME copy more headers? */ /* FIXME copy more headers? */
@ -491,18 +490,21 @@ gst_rtsp_message_free (GstRTSPMessage * msg)
} }
/** /**
* gst_rtsp_message_add_header: * gst_rtsp_message_take_header:
* @msg: a #GstRTSPMessage * @msg: a #GstRTSPMessage
* @field: a #GstRTSPHeaderField * @field: a #GstRTSPHeaderField
* @value: the value of the header * @value: the value of the header
* *
* Add a header with key @field and @value to @msg. * Add a header with key @field and @value to @msg. This function takes
* ownership of @value.
* *
* Returns: a #GstRTSPResult. * Returns: a #GstRTSPResult.
*
* Since: 0.10.23
*/ */
GstRTSPResult GstRTSPResult
gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field, gst_rtsp_message_take_header (GstRTSPMessage * msg, GstRTSPHeaderField field,
const gchar * value) gchar * value)
{ {
RTSPKeyValue key_value; RTSPKeyValue key_value;
@ -510,13 +512,31 @@ gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field,
g_return_val_if_fail (value != NULL, GST_RTSP_EINVAL); g_return_val_if_fail (value != NULL, GST_RTSP_EINVAL);
key_value.field = field; key_value.field = field;
key_value.value = g_strdup (value); key_value.value = value;
g_array_append_val (msg->hdr_fields, key_value); g_array_append_val (msg->hdr_fields, key_value);
return GST_RTSP_OK; return GST_RTSP_OK;
} }
/**
* gst_rtsp_message_add_header:
* @msg: a #GstRTSPMessage
* @field: a #GstRTSPHeaderField
* @value: the value of the header
*
* Add a header with key @field and @value to @msg. This function takes a copy
* of @value.
*
* Returns: a #GstRTSPResult.
*/
GstRTSPResult
gst_rtsp_message_add_header (GstRTSPMessage * msg, GstRTSPHeaderField field,
const gchar * value)
{
return gst_rtsp_message_take_header (msg, field, g_strdup (value));
}
/** /**
* gst_rtsp_message_remove_header: * gst_rtsp_message_remove_header:
* @msg: a #GstRTSPMessage * @msg: a #GstRTSPMessage

View File

@ -147,6 +147,9 @@ GstRTSPResult gst_rtsp_message_parse_data (GstRTSPMessage *msg,
GstRTSPResult gst_rtsp_message_add_header (GstRTSPMessage *msg, GstRTSPResult gst_rtsp_message_add_header (GstRTSPMessage *msg,
GstRTSPHeaderField field, GstRTSPHeaderField field,
const gchar *value); const gchar *value);
GstRTSPResult gst_rtsp_message_take_header (GstRTSPMessage *msg,
GstRTSPHeaderField field,
gchar *value);
GstRTSPResult gst_rtsp_message_remove_header (GstRTSPMessage *msg, GstRTSPResult gst_rtsp_message_remove_header (GstRTSPMessage *msg,
GstRTSPHeaderField field, GstRTSPHeaderField field,
gint indx); gint indx);