Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add missing support for Handle Mirror Failure Callback (hmfcb) while …
…downloading repomd.xml (related to RhBug: 1093014)
  • Loading branch information
Tojaj committed May 5, 2014
1 parent 51d32c6 commit dbbb485
Showing 1 changed file with 61 additions and 50 deletions.
111 changes: 61 additions & 50 deletions librepo/yum.c
Expand Up @@ -156,6 +156,54 @@ lr_yum_repomd_record_enabled(LrHandle *handle, const char *type)
return TRUE;
}

/** Mirror Failure Callback Data
*/
typedef struct CbData_s {
void *userdata; /*!< User data */
LrProgressCb progresscb; /*!< Progress callback */
LrHandleMirrorFailureCb hmfcb; /*!< Handle mirror failure callback */
char *metadata; /*!< "primary", "filelists", ... */
} CbData;

static CbData *cbdata_new(void *userdata,
LrProgressCb progresscb,
LrHandleMirrorFailureCb hmfcb,
const char *metadata)
{
CbData *data = calloc(1, sizeof(*data));
data->userdata = userdata;
data->progresscb = progresscb;
data->hmfcb = hmfcb;
data->metadata = g_strdup(metadata);
return data;
}

static void
cbdata_free(CbData *data)
{
if (!data) return;
free(data->metadata);
free(data);
}

static int
progresscb(void *clientp, double total_to_download, double downloaded)
{
CbData *data = clientp;
if (data->progresscb)
return data->progresscb(data->userdata, total_to_download, downloaded);
return LR_CB_OK;
}

static int
hmfcb(void *clientp, const char *msg, const char *url)
{
CbData *data = clientp;
if (data->hmfcb)
return data->hmfcb(data->userdata, msg, url, data->metadata);
return LR_CB_OK;
}

static gboolean
lr_yum_download_repomd(LrHandle *handle,
LrMetalink *metalink,
Expand Down Expand Up @@ -201,6 +249,14 @@ lr_yum_download_repomd(LrHandle *handle,
}
}

CbData *cbdata = NULL;
if (handle->hmfcb) {
cbdata = cbdata_new(handle->user_data,
NULL,
handle->hmfcb,
"repomd.xml");
}

LrDownloadTarget *target = lr_downloadtarget_new(handle,
"repodata/repomd.xml",
NULL,
Expand All @@ -210,16 +266,19 @@ lr_yum_download_repomd(LrHandle *handle,
0,
0,
NULL,
cbdata,
NULL,
NULL,
NULL,
(cbdata) ? hmfcb : NULL,
NULL,
0,
0);

ret = lr_download_target(target, &tmp_err);
assert((ret && !tmp_err) || (!ret && tmp_err));

if (cbdata)
cbdata_free(cbdata);

if (tmp_err) {
g_propagate_prefixed_error(err, tmp_err,
"Cannot download repomd.xml: ");
Expand All @@ -245,54 +304,6 @@ lr_yum_download_repomd(LrHandle *handle,
return ret;
}

/** Mirror Failure Callback Data
*/
typedef struct CbData_s {
void *userdata; /*!< User data */
LrProgressCb progresscb; /*!< Progress callback */
LrHandleMirrorFailureCb hmfcb; /*!< Handle mirror failure callback */
char *metadata; /*!< "primary", "filelists", ... */
} CbData;

static CbData *cbdata_new(void *userdata,
LrProgressCb progresscb,
LrHandleMirrorFailureCb hmfcb,
const char *metadata)
{
CbData *data = calloc(1, sizeof(*data));
data->userdata = userdata;
data->progresscb = progresscb;
data->hmfcb = hmfcb;
data->metadata = g_strdup(metadata);
return data;
}

static void
cbdata_free(CbData *data)
{
if (!data) return;
free(data->metadata);
free(data);
}

static int
progresscb(void *clientp, double total_to_download, double downloaded)
{
CbData *data = clientp;
if (data->progresscb)
return data->progresscb(data->userdata, total_to_download, downloaded);
return LR_CB_OK;
}

static int
hmfcb(void *clientp, const char *msg, const char *url)
{
CbData *data = clientp;
if (data->hmfcb)
return data->hmfcb(data->userdata, msg, url, data->metadata);
return LR_CB_OK;
}

static gboolean
lr_yum_download_repo(LrHandle *handle,
LrYumRepo *repo,
Expand Down

0 comments on commit dbbb485

Please sign in to comment.