pakfire_xfer_send_callback send;
pakfire_xfer_close_callback close;
void* data;
+
+ // Response
+ pakfire_xfer_response_callback response;
} callbacks;
+ // Output Buffer
+ struct {
+ char* buffer;
+ size_t length;
+ } output;
+
// WebSocket Receive Buffer
struct pakfire_buffer recv_buffer;
if (xfer->payload)
free(xfer->payload);
+ // Output Buffer
+ if (xfer->output.buffer)
+ free(xfer->output.buffer);
+
// cURL stuff
if (xfer->handle)
curl_easy_cleanup(xfer->handle);
return pakfire_xfer_set_output(xfer, f);
}
+int pakfire_xfer_set_response_callback(struct pakfire_xfer* self,
+ pakfire_xfer_response_callback callback, void* data) {
+ int r;
+
+ // Create an output buffer
+ r = pakfire_xfer_set_output_buffer(self, &self->output.buffer, &self->output.length);
+ if (r < 0)
+ return r;
+
+ // Set the callback
+ self->callbacks.response = callback;
+ self->callbacks.data = data;
+
+ return 0;
+}
+
int pakfire_xfer_set_input(struct pakfire_xfer* xfer, FILE* f) {
struct stat stat;
int r;
return r;
}
+static int pakfire_xfer_call_response_callback(struct pakfire_xfer* self, pakfire_xfer_error_code_t code) {
+ struct json_object* response = NULL;
+ char* error = NULL;
+ int r;
+
+ // Parse the API response
+ switch (code) {
+ case PAKFIRE_XFER_OK:
+ r = pakfire_json_parse(&response, &error, self->output.buffer, self->output.length);
+ if (r < 0) {
+ ERROR(self->ctx, "Failed to parse JSON response: %s\n", error);
+ goto ERROR;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // Run the callback
+ r = self->callbacks.response(self, code, response, self->callbacks.data);
+
+ERROR:
+ if (response)
+ json_object_put(response);
+ if (error)
+ free(error);
+
+ return r;
+}
+
static int pakfire_xfer_fail(struct pakfire_xfer* xfer, int code) {
int r;
}
}
+ // Call the response callback
+ if (xfer->callbacks.response) {
+ r = pakfire_xfer_call_response_callback(xfer, code);
+ if (r < 0)
+ return r;
+ }
+
return code;
}
if (xfer->fin)
fflush(xfer->fin);
+ // Call the output callback if configured
+ if (xfer->callbacks.response)
+ return pakfire_xfer_call_response_callback(xfer, PAKFIRE_XFER_OK);
+
// Nothing to do if path isn't set
if (!*xfer->path)
return 0;
int pakfire_xfer_set_output_buffer(struct pakfire_xfer* xfer, char** buffer, size_t* length);
int pakfire_xfer_set_output_path(struct pakfire_xfer* xfer, const char* path);
+typedef int (*pakfire_xfer_response_callback)(struct pakfire_xfer* xfer,
+ pakfire_xfer_error_code_t status, json_object* response, void* data);
+
+int pakfire_xfer_set_response_callback(struct pakfire_xfer* xfer,
+ pakfire_xfer_response_callback callback, void* data);
+
// Input
int pakfire_xfer_set_input(struct pakfire_xfer* xfer, FILE* f);