metalink: have a single entry to the metalink module

Replace _ostree_metalink_request_async with a synchronous version.

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2014-11-04 17:33:41 +01:00 committed by Colin Walters
parent d5d73debd8
commit c832e9b751
3 changed files with 75 additions and 81 deletions

View File

@ -658,33 +658,21 @@ static const GMarkupParser metalink_parser = {
NULL
};
void
_ostree_metalink_request_async (OstreeMetalink *self,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
typedef struct
{
GTask *task = g_task_new (self, cancellable, callback, user_data);
OstreeMetalinkRequest *request = g_new0 (OstreeMetalinkRequest, 1);
SoupURI **out_target_uri;
GFile **out_data;
gboolean success;
GError **error;
GMainLoop *loop;
} FetchMetalinkSyncData;
request->metalink = g_object_ref (self);
request->urls = g_ptr_array_new_with_free_func ((GDestroyNotify) soup_uri_free);
request->task = task; /* Unowned */
request->parser = g_markup_parse_context_new (&metalink_parser, G_MARKUP_PREFIX_ERROR_POSITION, task, NULL);
g_task_set_task_data (task, request, ostree_metalink_request_unref);
_ostree_fetcher_stream_uri_async (self->fetcher, self->uri,
self->max_size, cancellable,
on_retrieved_metalink, task);
}
gboolean
_ostree_metalink_request_finish (OstreeMetalink *self,
GAsyncResult *result,
SoupURI **out_target_uri,
GFile **out_data,
GError **error)
static gboolean
ostree_metalink_request_finish (OstreeMetalink *self,
GAsyncResult *result,
SoupURI **out_target_uri,
GFile **out_data,
GError **error)
{
OstreeMetalinkRequest *request;
@ -703,6 +691,54 @@ _ostree_metalink_request_finish (OstreeMetalink *self,
return FALSE;
}
static void
on_metalink_fetched (GObject *src,
GAsyncResult *result,
gpointer user_data)
{
FetchMetalinkSyncData *data = user_data;
data->success = ostree_metalink_request_finish ((OstreeMetalink*)src,
result,
data->out_target_uri,
data->out_data,
data->error);
g_main_loop_quit (data->loop);
}
gboolean
_ostree_metalink_request_sync (OstreeMetalink *self,
GMainLoop *loop,
SoupURI **out_target_uri,
GFile **out_data,
SoupURI **fetching_sync_uri,
GCancellable *cancellable,
GError **error)
{
OstreeMetalinkRequest *request = g_new0 (OstreeMetalinkRequest, 1);
FetchMetalinkSyncData data = { 0, };
GTask *task = g_task_new (self, cancellable, on_metalink_fetched, &data);
data.out_target_uri = out_target_uri;
data.out_data = out_data;
data.loop = loop;
data.error = error;
*fetching_sync_uri = _ostree_metalink_get_uri (self);
request->metalink = g_object_ref (self);
request->urls = g_ptr_array_new_with_free_func ((GDestroyNotify) soup_uri_free);
request->task = task; /* Unowned */
request->parser = g_markup_parse_context_new (&metalink_parser, G_MARKUP_PREFIX_ERROR_POSITION, task, NULL);
g_task_set_task_data (task, request, ostree_metalink_request_unref);
_ostree_fetcher_stream_uri_async (self->fetcher, self->uri,
self->max_size, cancellable,
on_retrieved_metalink, task);
g_main_loop_run (loop);
return data.success;
}
SoupURI *
_ostree_metalink_get_uri (OstreeMetalink *self)
{

View File

@ -50,17 +50,13 @@ OstreeMetalink *_ostree_metalink_new (OstreeFetcher *fetcher,
SoupURI *_ostree_metalink_get_uri (OstreeMetalink *self);
void _ostree_metalink_request_async (OstreeMetalink *self,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean _ostree_metalink_request_finish (OstreeMetalink *self,
GAsyncResult *result,
SoupURI **out_target_uri,
GFile **out_data,
GError **error);
gboolean _ostree_metalink_request_sync (OstreeMetalink *self,
GMainLoop *loop,
SoupURI **out_target_uri,
GFile **out_data,
SoupURI **fetching_sync_uri,
GCancellable *cancellable,
GError **error);
G_END_DECLS
#endif

View File

@ -303,49 +303,6 @@ fetch_uri_contents_utf8_sync (OtPullData *pull_data,
return ret;
}
typedef struct
{
OtPullData *pull_data;
SoupURI **out_target_uri;
GFile **out_data;
gboolean success;
} FetchMetalinkSyncData;
static void
on_metalink_fetched (GObject *src,
GAsyncResult *result,
gpointer user_data)
{
FetchMetalinkSyncData *data = user_data;
data->success = _ostree_metalink_request_finish ((OstreeMetalink*)src, result,
data->out_target_uri, data->out_data,
data->pull_data->async_error);
g_main_loop_quit (data->pull_data->loop);
}
static gboolean
request_metalink_sync (OtPullData *pull_data,
OstreeMetalink *metalink,
SoupURI **out_target_uri,
GFile **out_data,
GCancellable *cancellable,
GError **error)
{
FetchMetalinkSyncData data = { 0, };
data.pull_data = pull_data;
data.out_target_uri = out_target_uri;
data.out_data = out_data;
pull_data->fetching_sync_uri = _ostree_metalink_get_uri (metalink);
_ostree_metalink_request_async (metalink, cancellable, on_metalink_fetched, &data);
g_main_loop_run (pull_data->loop);
return data.success;
}
static void
enqueue_one_object_request (OtPullData *pull_data,
const char *checksum,
@ -1387,8 +1344,13 @@ ostree_repo_pull_with_options (OstreeRepo *self,
OSTREE_MAX_METADATA_SIZE, metalink_uri);
soup_uri_free (metalink_uri);
if (!request_metalink_sync (pull_data, metalink, &target_uri, &metalink_data,
cancellable, error))
if (! _ostree_metalink_request_sync (metalink,
pull_data->loop,
&target_uri,
&metalink_data,
&pull_data->fetching_sync_uri,
cancellable,
error))
goto out;
{