Commit 430e8db5 authored by Olivier Crête's avatar Olivier Crête

agent: Replace nice_agent_build_io_stream() with nice_agent_get_io_stream()

Also made the GIOStream into a singleton, it always returns the same one.
Also make it impossible to create a GIOStream for a non-existing stream/component
parent 4f456a46
......@@ -4465,33 +4465,32 @@ nice_agent_parse_remote_candidate_sdp (NiceAgent *agent, guint stream_id,
return candidate;
}
/**
* nice_agent_build_io_stream:
* @agent: A reliable #NiceAgent
* @stream_id: The ID of the agent’s stream to wrap
* @component_id: The ID of the agent’s component to wrap
*
* Create a new #NiceIOStream wrapping the given stream/component from @agent,
* which must be a reliable #NiceAgent. The given stream/component must be
* created using nice_agent_add_stream() before any I/O operations are performed
* on the #NiceIOStream.
*
* Note that if multiple I/O streams are created for a single stream/component,
* only one of them may be used at any time.
*
* Returns: (transfer full): The new #NiceIOStream object
*
* Since: 0.1.5
*/
NICEAPI_EXPORT GIOStream *
nice_agent_build_io_stream (NiceAgent *agent, guint stream_id,
nice_agent_get_io_stream (NiceAgent *agent, guint stream_id,
guint component_id)
{
GIOStream *iostream = NULL;
Component *component;
g_return_val_if_fail (NICE_IS_AGENT (agent), NULL);
g_return_val_if_fail (stream_id >= 1, NULL);
g_return_val_if_fail (component_id >= 1, NULL);
g_return_val_if_fail (agent->reliable, NULL);
return nice_io_stream_new (agent, stream_id, component_id);
agent_lock ();
if (!agent_find_component (agent, stream_id, component_id, NULL, &component))
goto done;
if (component->iostream == NULL)
component->iostream = nice_io_stream_new (agent, stream_id, component_id);
iostream = g_object_ref (component->iostream);
done:
agent_unlock ();
return iostream;
}
......@@ -60,7 +60,7 @@
* Each stream can receive data in one of two ways: using
* nice_agent_attach_recv() or nice_agent_recv_messages() (and the derived
* #NiceInputStream and #NiceIOStream classes accessible using
* nice_agent_build_io_stream()). nice_agent_attach_recv() is non-blocking: it
* nice_agent_get_io_stream()). nice_agent_attach_recv() is non-blocking: it
* takes a user-provided callback function and attaches the stream’s socket to
* the provided #GMainContext, invoking the callback in that context for every
* packet received. nice_agent_recv_messages() instead blocks on receiving a
......@@ -1373,25 +1373,26 @@ nice_agent_parse_remote_candidate_sdp (
const gchar *sdp);
/**
* nice_agent_build_io_stream:
* nice_agent_get_io_stream:
* @agent: A #NiceAgent
* @stream_id: The ID of the stream to wrap
* @component_id: The ID of the component to wrap
*
* Build a #GIOStream wrapper around the given stream and component in
* Gets a #GIOStream wrapper around the given stream and component in
* @agent. The I/O stream will be valid for as long as @stream_id is valid.
* The #GInputStream and #GOutputStream implement #GPollableInputStream and
* #GPollableOutputStream.
*
* This function may only be called on reliable #NiceAgents. It is an error to
* try and create an I/O stream wrapper for an unreliable stream.
* This function may only be called on reliable #NiceAgents. It is a
* programming error to try and create an I/O stream wrapper for an
* unreliable stream.
*
* Returns: (transfer full): A new #GIOStream.
* Returns: (transfer full): A #GIOStream.
*
* Since: 0.1.5
*/
GIOStream *
nice_agent_build_io_stream (
nice_agent_get_io_stream (
NiceAgent *agent,
guint stream_id,
guint component_id);
......
......@@ -209,6 +209,8 @@ component_free (Component *cmp)
g_slice_free (GOutputVector, vec);
}
g_clear_object (&cmp->iostream);
g_mutex_clear (&cmp->io_mutex);
g_slice_free (Component, cmp);
......
......@@ -190,6 +190,8 @@ struct _Component
gboolean tcp_readable;
GCancellable *tcp_writable_cancellable;
GIOStream *iostream;
guint min_port;
guint max_port;
......
......@@ -16,7 +16,6 @@ nice_address_set_port
nice_address_to_string
nice_agent_add_local_address
nice_agent_add_stream
nice_agent_build_io_stream
nice_agent_recv
nice_agent_recv_messages
nice_agent_recv_nonblocking
......@@ -27,6 +26,7 @@ nice_agent_generate_local_candidate_sdp
nice_agent_generate_local_sdp
nice_agent_generate_local_stream_sdp
nice_agent_get_default_local_candidate
nice_agent_get_io_stream
nice_agent_get_local_candidates
nice_agent_get_local_credentials
nice_agent_get_remote_candidates
......
......@@ -47,39 +47,18 @@ test_invalid_stream (NiceAddress *addr)
{
NiceAgent *agent;
GIOStream *io_stream;
GInputStream *input_stream;
GOutputStream *output_stream;
uint8_t data[65536];
GError *error = NULL;
agent = nice_agent_new_reliable (NULL, NICE_COMPATIBILITY_RFC5245);
nice_agent_add_local_address (agent, addr);
/* Try building an I/O stream for an invalid stream. All its operations should
* return G_IO_ERROR_BROKEN_PIPE. */
io_stream = nice_agent_build_io_stream (agent, 5, 5);
g_assert (G_IS_IO_STREAM (io_stream));
g_assert (NICE_IS_IO_STREAM (io_stream));
input_stream = g_io_stream_get_input_stream (G_IO_STREAM (io_stream));
g_assert (
g_input_stream_read (input_stream, data, G_N_ELEMENTS (data),
NULL, &error) == -1);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_BROKEN_PIPE);
g_clear_error (&error);
output_stream = g_io_stream_get_output_stream (G_IO_STREAM (io_stream));
g_assert (
g_output_stream_write (output_stream, data, G_N_ELEMENTS (data),
NULL, &error) == -1);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_BROKEN_PIPE);
g_clear_error (&error);
g_object_unref (io_stream);
io_stream = nice_agent_get_io_stream (agent, 5, 5);
g_assert (io_stream == NULL);
}
static void
test_io_stream_properties (NiceAddress *addr, gboolean add_stream_first)
test_io_stream_properties (NiceAddress *addr)
{
NiceAgent *agent;
guint stream_id;
......@@ -90,26 +69,13 @@ test_io_stream_properties (NiceAddress *addr, gboolean add_stream_first)
agent = nice_agent_new_reliable (NULL, NICE_COMPATIBILITY_RFC5245);
nice_agent_add_local_address (agent, addr);
if (add_stream_first) {
/* Add a stream. */
stream_id = nice_agent_add_stream (agent, 1);
} else {
/* Guess at the stream ID, then check it later. This tests the case where
* the I/O stream is built before the stream is created in the NiceAgent
* (but no I/O operations are performed on it until after both have been
* created). */
stream_id = 1;
}
stream_id = nice_agent_add_stream (agent, 1);
/* Try building an I/O stream around it. */
io_stream = nice_agent_build_io_stream (agent, stream_id, 1);
io_stream = nice_agent_get_io_stream (agent, stream_id, 1);
g_assert (G_IS_IO_STREAM (io_stream));
g_assert (NICE_IS_IO_STREAM (io_stream));
if (!add_stream_first) {
g_assert (stream_id == nice_agent_add_stream (agent, 1));
}
/* Check various initial properties. */
g_assert (!g_io_stream_is_closed (G_IO_STREAM (io_stream)));
g_assert (!g_io_stream_has_pending (G_IO_STREAM (io_stream)));
......@@ -163,7 +129,7 @@ test_pollable_properties (NiceAddress *addr)
stream_id = nice_agent_add_stream (agent, 1);
/* Try building an I/O stream around it. */
io_stream = nice_agent_build_io_stream (agent, stream_id, 1);
io_stream = nice_agent_get_io_stream (agent, stream_id, 1);
g_assert (G_IS_IO_STREAM (io_stream));
g_assert (NICE_IS_IO_STREAM (io_stream));
......@@ -334,7 +300,7 @@ test_pollable_cancellation (NiceAddress *addr)
stream_id = nice_agent_add_stream (agent, 1);
/* Try building an I/O stream around it. */
io_stream = nice_agent_build_io_stream (agent, stream_id, 1);
io_stream = nice_agent_get_io_stream (agent, stream_id, 1);
g_assert (G_IS_IO_STREAM (io_stream));
g_assert (NICE_IS_IO_STREAM (io_stream));
......@@ -410,7 +376,7 @@ test_zero_length_reads_writes (NiceAddress *addr)
stream_id = nice_agent_add_stream (agent, 1);
/* Try building an I/O stream around it. */
io_stream = nice_agent_build_io_stream (agent, stream_id, 1);
io_stream = nice_agent_get_io_stream (agent, stream_id, 1);
g_assert (G_IS_IO_STREAM (io_stream));
g_assert (NICE_IS_IO_STREAM (io_stream));
......@@ -477,8 +443,7 @@ main (void)
g_assert (nice_address_set_from_string (&addr, "127.0.0.1"));
test_invalid_stream (&addr);
test_io_stream_properties (&addr, TRUE);
test_io_stream_properties (&addr, FALSE);
test_io_stream_properties (&addr);
test_pollable_properties (&addr);
test_pollable_cancellation (&addr);
test_zero_length_reads_writes (&addr);
......
......@@ -292,7 +292,7 @@ run_agent (TestIOStreamThreadData *data, NiceAgent *agent)
if (data->reliable) {
data->io_stream =
G_IO_STREAM (nice_agent_build_io_stream (agent, stream_id, 1));
G_IO_STREAM (nice_agent_get_io_stream (agent, stream_id, 1));
g_object_set_data (G_OBJECT (agent), "io-stream", data->io_stream);
} else {
data->io_stream = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment