return r;
// Call the done callback
- r = pakfire_xfer_done(xfer, msg->data.result);
+ r = pakfire_xfer_done(xfer, self->loop, msg->data.result);
if (r < 0) {
switch (-r) {
case EAGAIN:
return NULL;
}
-sd_event* pakfire_httpclient_loop(struct pakfire_httpclient* self) {
- return sd_event_ref(self->loop);
-}
-
int pakfire_httpclient_enqueue_xfer(struct pakfire_httpclient* self,
struct pakfire_xfer* xfer) {
struct pakfire_httpclient_xfer* e = NULL;
// Keep a reference to the xfer
TAILQ_INSERT_TAIL(&self->xfers, e, nodes);
- // Transfer enqueued
- return pakfire_xfer_enqueued(xfer, self);
+ return 0;
}
int pakfire_httpclient_dequeue_xfer(struct pakfire_httpclient* self,
struct pakfire_ctx* ctx;
int nrefs;
- // Reference to the HTTP client
- struct pakfire_httpclient* client;
-
// Reference to the progress indicator
struct pakfire_progress* progress;
if (xfer->evp)
EVP_MD_CTX_free(xfer->evp);
- // Remove the cURL handle
- if (xfer->client)
- pakfire_httpclient_dequeue_xfer(xfer->client, xfer);
-
// systemd
if (xfer->event)
sd_event_source_unref(xfer->event);
pakfire_mirrorlist_unref(xfer->mirrors);
if (xfer->progress)
pakfire_progress_unref(xfer->progress);
- if (xfer->client)
- pakfire_httpclient_unref(xfer->client);
if (xfer->ctx)
pakfire_ctx_unref(xfer->ctx);
return xfer->handle;
}
-int pakfire_xfer_enqueued(struct pakfire_xfer* xfer, struct pakfire_httpclient* client) {
- // Remove the reference to the old client
- if (xfer->client) {
- pakfire_httpclient_unref(xfer->client);
- xfer->client = NULL;
- }
-
- // Store the new client
- xfer->client = pakfire_httpclient_ref(client);
-
- return 0;
-}
-
int pakfire_xfer_set_method(struct pakfire_xfer* xfer,
const pakfire_xfer_method_t method) {
const char* m = NULL;
This is being called once a WebSocket connection has connected and is ready to
send or receive data.
*/
-static pakfire_xfer_error_code_t pakfire_xfer_done_socket(struct pakfire_xfer* xfer, int code) {
+static pakfire_xfer_error_code_t pakfire_xfer_done_socket(
+ struct pakfire_xfer* xfer, sd_event* loop, int code) {
curl_socket_t socket = -1;
int events = 0;
int r;
- // Fetch the event loop
- sd_event* loop = pakfire_httpclient_loop(xfer->client);
-
// Fetch the socket
r = curl_easy_getinfo(xfer->handle, CURLINFO_ACTIVESOCKET, &socket);
if (r) {
return 0;
}
-pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code) {
+pakfire_xfer_error_code_t pakfire_xfer_done(
+ struct pakfire_xfer* xfer, sd_event* loop, int code) {
CURL* h = xfer->handle;
int r;
const char* scheme = NULL;
#ifdef CURL_HAS_WEBSOCKETS
case PAKFIRE_XFER_SOCKET:
- r = pakfire_xfer_done_socket(xfer, code);
+ r = pakfire_xfer_done_socket(xfer, loop, code);
if (r < 0)
return r;
#endif /* CURL_HAS_WEBSOCKETS */
r = curl_easy_perform(xfer->handle);
// Handle the result
- r = pakfire_xfer_done(xfer, r);
+ r = pakfire_xfer_done(xfer, NULL, r);
// Repeat if asked
if (r == -EAGAIN)
#include <json.h>
+#include <systemd/sd-event.h>
+
struct pakfire_xfer;
typedef enum pakfire_xfer_error_code {
CURL* pakfire_xfer_handle(struct pakfire_xfer* xfer);
-int pakfire_xfer_enqueued(struct pakfire_xfer* xfer, struct pakfire_httpclient* client);
-
int pakfire_xfer_set_method(struct pakfire_xfer* xfer,
const pakfire_xfer_method_t method);
int pakfire_xfer_auth(struct pakfire_xfer* xfer);
int pakfire_xfer_prepare(struct pakfire_xfer* xfer, struct pakfire_progress* progress, int flags);
-pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code);
+pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, sd_event* loop, int code);
pakfire_xfer_error_code_t pakfire_xfer_run(struct pakfire_xfer* xfer, int flags);
pakfire_xfer_error_code_t pakfire_xfer_run_api_request(