void rarch_main_data_http_iterate(bool is_thread, void *data) { data_runloop_t *runloop = (data_runloop_t*)data; http_handle_t *http = runloop ? &runloop->http : NULL; if (!http) return; switch (http->status) { case HTTP_STATUS_CONNECTION_TRANSFER_PARSE: rarch_main_data_http_conn_iterate_transfer_parse(http); http->status = HTTP_STATUS_TRANSFER; break; case HTTP_STATUS_CONNECTION_TRANSFER: if (!rarch_main_data_http_con_iterate_transfer(http)) http->status = HTTP_STATUS_CONNECTION_TRANSFER_PARSE; break; case HTTP_STATUS_TRANSFER_PARSE: rarch_main_data_http_iterate_transfer_parse(http); http->status = HTTP_STATUS_POLL; break; case HTTP_STATUS_TRANSFER: if (!rarch_main_data_http_iterate_transfer(http)) http->status = HTTP_STATUS_TRANSFER_PARSE; break; case HTTP_STATUS_POLL: default: if (rarch_main_data_http_iterate_poll(http) == 0) http->status = HTTP_STATUS_CONNECTION_TRANSFER; break; } }
void rarch_main_data_http_iterate(bool is_thread) { http_handle_t *http = (http_handle_t*)http_ptr; if (!http) return; switch (http->status) { case HTTP_STATUS_CONNECTION_TRANSFER_PARSE: rarch_main_data_http_conn_iterate_transfer_parse(http); http->status = HTTP_STATUS_TRANSFER; break; case HTTP_STATUS_CONNECTION_TRANSFER: if (!rarch_main_data_http_con_iterate_transfer(http)) http->status = HTTP_STATUS_CONNECTION_TRANSFER_PARSE; break; case HTTP_STATUS_TRANSFER_PARSE: rarch_main_data_http_iterate_transfer_parse(http); http->status = HTTP_STATUS_POLL; break; case HTTP_STATUS_TRANSFER: if (!rarch_main_data_http_iterate_transfer(http)) http->status = HTTP_STATUS_TRANSFER_PARSE; break; case HTTP_STATUS_POLL: default: if (rarch_main_data_http_iterate_poll(http) == 0) http->status = HTTP_STATUS_CONNECTION_TRANSFER; break; } }
static void rarch_main_data_http_iterate(http_handle_t *http) { if (!http) return; if (http->connection.handle) { if (!rarch_main_data_http_con_iterate_transfer(http)) rarch_main_data_http_conn_iterate_transfer_parse(http); } if (http->handle) { if (!rarch_main_data_http_iterate_transfer(http)) rarch_main_data_http_iterate_transfer_parse(http); } else rarch_main_data_http_iterate_poll(http); }
static void rarch_task_http_transfer_handler(rarch_task_t *task) { http_handle_t *http = (http_handle_t*)task->state; http_transfer_data_t *data; switch (http->status) { case HTTP_STATUS_CONNECTION_TRANSFER_PARSE: rarch_main_data_http_conn_iterate_transfer_parse(http); http->status = HTTP_STATUS_TRANSFER; break; case HTTP_STATUS_CONNECTION_TRANSFER: if (!rarch_main_data_http_con_iterate_transfer(http)) http->status = HTTP_STATUS_CONNECTION_TRANSFER_PARSE; break; case HTTP_STATUS_TRANSFER: if (!rarch_main_data_http_iterate_transfer(task)) goto task_finished; break; case HTTP_STATUS_TRANSFER_PARSE: case HTTP_STATUS_POLL: goto task_finished; default: break; } if (task->cancelled || http->error) goto task_finished; return; task_finished: task->finished = true; if (http->handle) { size_t len = 0; char *tmp = (char*)net_http_data(http->handle, &len, false); if (tmp && http->cb) http->cb(tmp, len); if (net_http_error(http->handle) || task->cancelled) { tmp = (char*)net_http_data(http->handle, &len, true); if (tmp) free(tmp); if (task->cancelled) task->error = strdup("Task cancelled."); else task->error = strdup("Download failed."); } else { data = (http_transfer_data_t*)calloc(1, sizeof(*data)); data->data = tmp; data->len = len; task->task_data = data; } net_http_delete(http->handle); } else if (http->error) task->error = strdup("Internal error."); free(http); }