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,37 +288,49 @@ format_size_pair (guint64 start,
char * char *
ostree_fetcher_query_state_text (OstreeFetcher *self) ostree_fetcher_query_state_text (OstreeFetcher *self)
{ {
OstreeFetcherPendingURI *active; guint n_active;
if (self->sending_message) n_active = g_hash_table_size (self->sending_messages);
active = g_hash_table_lookup (self->message_to_request, self->sending_message); if (n_active > 0)
else
active = NULL;
if (active)
{ {
ot_lfree char *active_uri = soup_uri_to_string (active->uri, TRUE); GHashTableIter hash_iter;
gpointer key, value;
GString *buf;
if (active->tmpfile) 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))
{ {
ot_lobj GFileInfo *file_info = NULL; OstreeFetcherPendingURI *active;
file_info = g_file_query_info (active->tmpfile, OSTREE_GIO_FAST_QUERYINFO, active = g_hash_table_lookup (self->message_to_request, key);
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, g_assert (active != NULL);
NULL, NULL);
if (file_info) if (active->tmpfile)
{ {
ot_lfree char *size = format_size_pair (g_file_info_get_size (file_info), ot_lobj GFileInfo *file_info = NULL;
active->content_length);
return g_strdup_printf ("Downloading %s [ %s, %.1f KiB downloaded ]", file_info = g_file_query_info (active->tmpfile, OSTREE_GIO_FAST_QUERYINFO,
active_uri, size, ((double)self->total_downloaded) / 1024); G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
NULL, NULL);
if (file_info)
{
ot_lfree char *size = format_size_pair (g_file_info_get_size (file_info),
active->content_length);
g_string_append_printf (buf, " [%s]", size);
}
}
else
{
g_string_append_printf (buf, " [Requesting]");
} }
} }
else
{
return g_strdup_printf ("Requesting %s [ %.1f KiB downloaded ]",
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");
} }