pull: Correctly display concurrent libsoup requests

The "status text" code was assuming that libsoup was only doing one
thing at a time, but that's never been the case.  Change the code to
display the status of all active requests.
This commit is contained in:
Colin Walters 2012-07-12 11:19:15 -04:00
parent 664e9b404d
commit 95921bcbf0
1 changed files with 45 additions and 29 deletions

View File

@ -77,9 +77,9 @@ struct OstreeFetcher
SoupSession *session; SoupSession *session;
SoupRequester *requester; SoupRequester *requester;
SoupMessage *sending_message; GHashTable *sending_messages; /* SoupMessage */
GHashTable *message_to_request; GHashTable *message_to_request; /* SoupMessage -> SoupRequest */
guint64 total_downloaded; guint64 total_downloaded;
}; };
@ -95,6 +95,9 @@ ostree_fetcher_finalize (GObject *object)
g_clear_object (&self->session); g_clear_object (&self->session);
g_hash_table_destroy (self->sending_messages);
g_hash_table_destroy (self->message_to_request);
G_OBJECT_CLASS (ostree_fetcher_parent_class)->finalize (object); G_OBJECT_CLASS (ostree_fetcher_parent_class)->finalize (object);
} }
@ -113,7 +116,7 @@ on_request_started (SoupSession *session,
gpointer user_data) gpointer user_data)
{ {
OstreeFetcher *self = user_data; OstreeFetcher *self = user_data;
self->sending_message = msg; g_hash_table_insert (self->sending_messages, msg, g_object_ref (msg));
} }
static void static void
@ -122,8 +125,7 @@ on_request_unqueued (SoupSession *session,
gpointer user_data) gpointer user_data)
{ {
OstreeFetcher *self = user_data; OstreeFetcher *self = user_data;
if (msg == self->sending_message) g_hash_table_remove (self->sending_messages, msg);
self->sending_message = NULL;
g_hash_table_remove (self->message_to_request, msg); g_hash_table_remove (self->message_to_request, msg);
} }
@ -141,6 +143,8 @@ ostree_fetcher_init (OstreeFetcher *self)
g_signal_connect (self->session, "request-unqueued", g_signal_connect (self->session, "request-unqueued",
G_CALLBACK (on_request_unqueued), self); G_CALLBACK (on_request_unqueued), self);
self->sending_messages = g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify)g_object_unref);
self->message_to_request = g_hash_table_new_full (NULL, NULL, (GDestroyNotify)g_object_unref, self->message_to_request = g_hash_table_new_full (NULL, NULL, (GDestroyNotify)g_object_unref,
(GDestroyNotify)pending_uri_free); (GDestroyNotify)pending_uri_free);
} }
@ -284,15 +288,26 @@ format_size_pair (guint64 start,
char * char *
ostree_fetcher_query_state_text (OstreeFetcher *self) ostree_fetcher_query_state_text (OstreeFetcher *self)
{ {
guint n_active;
n_active = g_hash_table_size (self->sending_messages);
if (n_active > 0)
{
GHashTableIter hash_iter;
gpointer key, value;
GString *buf;
buf = g_string_new ("");
g_string_append_printf (buf, "%u requests", n_active);
g_hash_table_iter_init (&hash_iter, self->sending_messages);
while (g_hash_table_iter_next (&hash_iter, &key, &value))
{
OstreeFetcherPendingURI *active; OstreeFetcherPendingURI *active;
if (self->sending_message) active = g_hash_table_lookup (self->message_to_request, key);
active = g_hash_table_lookup (self->message_to_request, self->sending_message); g_assert (active != NULL);
else
active = NULL;
if (active)
{
ot_lfree char *active_uri = soup_uri_to_string (active->uri, TRUE);
if (active->tmpfile) if (active->tmpfile)
{ {
@ -305,16 +320,17 @@ ostree_fetcher_query_state_text (OstreeFetcher *self)
{ {
ot_lfree char *size = format_size_pair (g_file_info_get_size (file_info), ot_lfree char *size = format_size_pair (g_file_info_get_size (file_info),
active->content_length); active->content_length);
return g_strdup_printf ("Downloading %s [ %s, %.1f KiB downloaded ]", g_string_append_printf (buf, " [%s]", size);
active_uri, size, ((double)self->total_downloaded) / 1024);
} }
} }
else else
{ {
return g_strdup_printf ("Requesting %s [ %.1f KiB downloaded ]", g_string_append_printf (buf, " [Requesting]");
active_uri, ((double)self->total_downloaded) / 1024);
} }
} }
return g_strdup_printf ("Idle [ %.1f KiB downloaded ]", ((double)self->total_downloaded) / 1024); return g_string_free (buf, FALSE);
}
else
return g_strdup_printf ("Idle");
} }