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);
-int pakfire_xfer_fail(struct pakfire_xfer* xfer);
pakfire_xfer_error_code_t pakfire_xfer_run(struct pakfire_xfer* xfer, int flags);
pakfire_xfer_error_code_t pakfire_xfer_run_api_request(
// WebSocket
typedef int (*pakfire_xfer_recv_callback)(struct pakfire_xfer* xfer, const char* message, const size_t size, void* data);
typedef int (*pakfire_xfer_send_callback)(struct pakfire_xfer* xfer, const char* message, const size_t size, void* data);
-typedef int (*pakfire_xfer_close_callback)(struct pakfire_xfer* xfer, void* data);
+typedef int (*pakfire_xfer_close_callback)(struct pakfire_xfer* xfer, int code, void* data);
int pakfire_xfer_socket(struct pakfire_xfer* xfer, pakfire_xfer_recv_callback recv,
pakfire_xfer_send_callback send, pakfire_xfer_close_callback close, void* data);
}
}
-int pakfire_xfer_fail(struct pakfire_xfer* xfer) {
+static int pakfire_xfer_fail(struct pakfire_xfer* xfer, int code) {
int r;
CTX_DEBUG(xfer->ctx, "Xfer failed\n");
return -EAGAIN;
}
- return 0;
+ // Call the close callback for WebSockets
+ if (xfer->direction == PAKFIRE_XFER_SOCKET) {
+ if (xfer->callbacks.close) {
+ r = xfer->callbacks.close(xfer, code, xfer->callbacks.data);
+ if (r)
+ return r;
+ }
+ }
+
+ return code;
}
pakfire_xfer_error_code_t pakfire_xfer_done(struct pakfire_xfer* xfer, int code) {
free(expected_hexdigest);
// Make this download fail
- r = pakfire_xfer_fail(xfer);
+ r = pakfire_xfer_fail(xfer, PAKFIRE_XFER_DIGEST_MISMATCH);
if (r)
- return r;
-
- return PAKFIRE_XFER_DIGEST_MISMATCH;
+ goto ERROR;
}
}
- // Handle WebSockets separately
- switch (xfer->direction) {
- case PAKFIRE_XFER_SOCKET:
- return pakfire_xfer_done_socket(xfer, code);
+ // All okay?
+ if (code == CURLE_OK) {
+ // Handle actions for different transfer types
+ switch (xfer->direction) {
+ case PAKFIRE_XFER_DOWNLOAD:
+ r = pakfire_xfer_save(xfer);
+ if (r)
+ goto ERROR;
+ break;
- default:
- break;
- }
+ case PAKFIRE_XFER_SOCKET:
+ return pakfire_xfer_done_socket(xfer, code);
- // Remove the handle
- if (xfer->client) {
- r = pakfire_httpclient_remove_xfer(xfer->client, xfer);
- if (r)
- return r;
- }
+ default:
+ break;
+ }
// Handle any errors
- if (code) {
- r = pakfire_xfer_fail(xfer);
- if (r)
- return r;
+ } else {
+ // Convert the code
+ code = pakfire_xfer_code(code, code);
// Report that something went wrong
- return pakfire_xfer_code(code, response_code);
+ r = pakfire_xfer_fail(xfer, code);
+ if (r)
+ goto ERROR;
}
- // Otherwise save the file
- return pakfire_xfer_save(xfer);
+ERROR:
+ // Remove the handle
+ if (xfer->client)
+ pakfire_httpclient_remove_xfer(xfer->client, xfer);
+
+ return r;
}
static int pakfire_xfer_update(void* data,