URL API: work towards callback w/struct -- actually this is an interim step

This commit is contained in:
Bram Matthys 2023-11-24 12:04:28 +01:00
parent 3548b7e2af
commit eed9d22e3b
No known key found for this signature in database
GPG key ID: BF8116B163EAAE98
5 changed files with 40 additions and 8 deletions

View file

@ -1474,3 +1474,4 @@ extern int valid_operclass_name(const char *str);
#define safe_free_outgoingwebrequest(x) do { if (x) { free_outgoingwebrequest(x); x = NULL; } } while(0)
extern void free_outgoingwebrequest(OutgoingWebRequest *r);
extern OutgoingWebRequest *duplicate_outgoingwebrequest(OutgoingWebRequest *orig);
extern void url_callback(OutgoingWebRequest *r, const char *file, const char *memory, int memory_len, const char *errorbuf, int cached, void *ptr);

View file

@ -1900,6 +1900,18 @@ struct OutgoingWebRequest
// 2) and update url_free_handle_request_portion() there as well
};
typedef struct OutgoingWebResult OutgoingWebResult;
struct OutgoingWebResult
{
const char *file;
const char *memory;
int memory_len;
const char *errorbuf;
int cached;
void *ptr;
// If you add or modify fields, update url_callback() in src/misc.c!
};
typedef struct WebRequest WebRequest;
/** An incoming web request */
struct WebRequest {

View file

@ -3237,3 +3237,22 @@ void download_file_async(const char *url, time_t cachetime, vFP callback, void *
request->store_in_file = 1;
url_start_async(request);
}
void url_callback(OutgoingWebRequest *r, const char *file, const char *memory, int memory_len, const char *errorbuf, int cached, void *ptr)
{
OutgoingWebResult *result;
if (!r->callback)
return; /* Nothing to do */
result = safe_alloc(sizeof(OutgoingWebResult));
result->file = file;
result->memory = memory;
result->memory_len = memory_len;
result->errorbuf = errorbuf;
result->cached = cached;
result->ptr = ptr;
//r->callback(r, result);
r->callback(r->url, file, memory, memory_len, errorbuf, cached, ptr);
safe_free(result);
}

View file

@ -184,7 +184,7 @@ static void url_check_multi_handles(void)
{
if (code == 304 || (last_mod != -1 && last_mod <= handle->request->cachetime))
{
handle->request->callback(handle->request->url, NULL, handle->memory_data, handle->memory_data_len, NULL, 1, handle->request->callback_data);
url_callback(handle->request, NULL, handle->memory_data, handle->memory_data_len, NULL, 1, handle->request->callback_data);
if (handle->filename)
remove(handle->filename);
}
@ -193,14 +193,14 @@ static void url_check_multi_handles(void)
if ((last_mod != -1) && handle->filename)
unreal_setfilemodtime(handle->filename, last_mod);
handle->request->callback(handle->request->url, handle->filename, handle->memory_data, handle->memory_data_len, NULL, 0, handle->request->callback_data);
url_callback(handle->request, handle->filename, handle->memory_data, handle->memory_data_len, NULL, 0, handle->request->callback_data);
if (handle->filename)
remove(handle->filename);
}
}
else
{
handle->request->callback(handle->request->url, NULL, NULL, 0, handle->errorbuf, 0, handle->request->callback_data);
url_callback(handle->request, NULL, NULL, 0, handle->errorbuf, 0, handle->request->callback_data);
if (handle->filename)
remove(handle->filename);
}
@ -321,7 +321,7 @@ void url_start_async(OutgoingWebRequest *request)
if (!handle->file_fd)
{
snprintf(errorbuf, sizeof(errorbuf), "Cannot create '%s': %s", tmp, strerror(ERRNO));
handle->request->callback(handle->request->url, NULL, NULL, 0, errorbuf, 0, handle->request->callback_data);
url_callback(handle->request, NULL, NULL, 0, errorbuf, 0, handle->request->callback_data);
safe_free(file);
safe_free(handle);
return;

View file

@ -133,7 +133,7 @@ int https_cancel(Download *handle, FORMAT_STRING(const char *pattern), ...)
vsnprintf(handle->errorbuf, sizeof(handle->errorbuf), pattern, vl);
va_end(vl);
if (handle->request->callback)
handle->request->callback(handle->request->url, NULL, NULL, 0, handle->errorbuf, 0, handle->request->callback_data);
url_callback(handle->request, NULL, NULL, 0, handle->errorbuf, 0, handle->request->callback_data);
url_free_handle(handle);
return -1;
}
@ -929,12 +929,12 @@ void https_done(Download *handle)
if (!handle->request->callback)
; /* No special action, request was cancelled */
else if (!handle->got_response)
handle->request->callback(handle->request->url, NULL, NULL, 0, "HTTPS response not received", 0, handle->request->callback_data);
url_callback(handle->request, NULL, NULL, 0, "HTTPS response not received", 0, handle->request->callback_data);
else
{
if ((handle->last_modified > 0) && handle->filename)
unreal_setfilemodtime(handle->filename, handle->last_modified);
handle->request->callback(handle->request->url, handle->filename, handle->memory_data, handle->memory_data_len, NULL, 0, handle->request->callback_data);
url_callback(handle->request, handle->filename, handle->memory_data, handle->memory_data_len, NULL, 0, handle->request->callback_data);
}
url_free_handle(handle);
return;
@ -948,7 +948,7 @@ void https_done_cached(Download *handle)
handle->file_fd = NULL;
}
if (handle->request->callback)
handle->request->callback(handle->request->url, NULL, NULL, 0, NULL, 1, handle->request->callback_data);
url_callback(handle->request, NULL, NULL, 0, NULL, 1, handle->request->callback_data);
url_free_handle(handle);
}