mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-05 08:53:39 +02:00
gnetworkaddress: Factor out initializing address list into function
This commit is contained in:
committed by
Patrick Griffis
parent
6d8c8f509e
commit
c83291049e
@@ -1097,20 +1097,54 @@ g_network_address_address_enumerator_next (GSocketAddressEnumerator *enumerator
|
|||||||
return g_object_ref (sockaddr);
|
return g_object_ref (sockaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Each enumeration lazily initializes the internal address list from the
|
||||||
|
* master list. It does this since addresses come in asynchronously and
|
||||||
|
* they need to be resorted into the list already in use.
|
||||||
|
*/
|
||||||
|
static GSocketAddress *
|
||||||
|
init_and_query_next_address (GNetworkAddressAddressEnumerator *addr_enum)
|
||||||
|
{
|
||||||
|
GNetworkAddress *addr = addr_enum->addr;
|
||||||
|
GSocketAddress *sockaddr;
|
||||||
|
|
||||||
|
if (addr_enum->addresses == NULL)
|
||||||
|
{
|
||||||
|
addr_enum->current_item = addr_enum->addresses = list_copy_interleaved (addr->priv->sockaddrs);
|
||||||
|
addr_enum->last_tail = g_list_last (addr_enum->addr->priv->sockaddrs);
|
||||||
|
if (addr_enum->current_item)
|
||||||
|
sockaddr = g_object_ref (addr_enum->current_item->data);
|
||||||
|
else
|
||||||
|
sockaddr = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GList *parent_tail = g_list_last (addr_enum->addr->priv->sockaddrs);
|
||||||
|
|
||||||
|
if (addr_enum->last_tail != parent_tail)
|
||||||
|
{
|
||||||
|
addr_enum->current_item = list_concat_interleaved (addr_enum->current_item, g_list_next (addr_enum->last_tail));
|
||||||
|
addr_enum->last_tail = parent_tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr_enum->current_item->next)
|
||||||
|
{
|
||||||
|
addr_enum->current_item = g_list_next (addr_enum->current_item);
|
||||||
|
sockaddr = g_object_ref (addr_enum->current_item->data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sockaddr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sockaddr;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
complete_queued_task (GNetworkAddressAddressEnumerator *addr_enum,
|
complete_queued_task (GNetworkAddressAddressEnumerator *addr_enum,
|
||||||
GTask *task,
|
GTask *task,
|
||||||
GError *error)
|
GError *error)
|
||||||
{
|
{
|
||||||
GSocketAddress *sockaddr;
|
GSocketAddress *sockaddr = init_and_query_next_address (addr_enum);
|
||||||
|
|
||||||
addr_enum->current_item = addr_enum->addresses = list_copy_interleaved (addr_enum->addr->priv->sockaddrs);
|
|
||||||
addr_enum->last_tail = g_list_last (addr_enum->addr->priv->sockaddrs);
|
|
||||||
|
|
||||||
if (addr_enum->current_item)
|
|
||||||
sockaddr = g_object_ref (addr_enum->current_item->data);
|
|
||||||
else
|
|
||||||
sockaddr = NULL;
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
g_task_return_error (task, error);
|
g_task_return_error (task, error);
|
||||||
@@ -1262,7 +1296,6 @@ g_network_address_address_enumerator_next_async (GSocketAddressEnumerator *enum
|
|||||||
G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (enumerator);
|
G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (enumerator);
|
||||||
GSocketAddress *sockaddr;
|
GSocketAddress *sockaddr;
|
||||||
GTask *task;
|
GTask *task;
|
||||||
GNetworkAddress *addr = addr_enum->addr;
|
|
||||||
|
|
||||||
task = g_task_new (addr_enum, cancellable, callback, user_data);
|
task = g_task_new (addr_enum, cancellable, callback, user_data);
|
||||||
g_task_set_source_tag (task, g_network_address_address_enumerator_next_async);
|
g_task_set_source_tag (task, g_network_address_address_enumerator_next_async);
|
||||||
@@ -1311,32 +1344,7 @@ g_network_address_address_enumerator_next_async (GSocketAddressEnumerator *enum
|
|||||||
g_object_unref (resolver);
|
g_object_unref (resolver);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr_enum->addresses == NULL)
|
sockaddr = init_and_query_next_address (addr_enum);
|
||||||
{
|
|
||||||
g_assert (addr->priv->sockaddrs);
|
|
||||||
|
|
||||||
addr_enum->current_item = addr_enum->addresses = list_copy_interleaved (addr->priv->sockaddrs);
|
|
||||||
sockaddr = g_object_ref (addr_enum->current_item->data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GList *parent_tail = g_list_last (addr_enum->addr->priv->sockaddrs);
|
|
||||||
|
|
||||||
if (addr_enum->last_tail != parent_tail)
|
|
||||||
{
|
|
||||||
addr_enum->current_item = list_concat_interleaved (addr_enum->current_item, g_list_next (addr_enum->last_tail));
|
|
||||||
addr_enum->last_tail = parent_tail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addr_enum->current_item->next)
|
|
||||||
{
|
|
||||||
addr_enum->current_item = g_list_next (addr_enum->current_item);
|
|
||||||
sockaddr = g_object_ref (addr_enum->current_item->data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sockaddr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_task_return_pointer (task, sockaddr, g_object_unref);
|
g_task_return_pointer (task, sockaddr, g_object_unref);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user