void gui_download_window_done(struct gui_download_window *dw) { os_error *error; if (dw->ctx != NULL) download_context_destroy(dw->ctx); dw->ctx = NULL; ro_gui_download_update_status(dw); error = xosfind_closew(dw->file); if (error) { LOG(("xosfind_closew: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); } dw->file = 0; if (dw->saved) { error = xosfile_set_type(dw->path, dw->file_type); if (error) { LOG(("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); } if (dw->send_dataload) ro_gui_download_send_dataload(dw); schedule(200, ro_gui_download_window_destroy_wrapper, dw); } }
os_error *ro_gui_download_move(struct gui_download_window *dw, const char *dest_file, const char *src_file) { os_error *error; /* close temporary file */ if (dw->file) { error = xosfind_closew(dw->file); dw->file = 0; if (error) { LOG(("xosfind_closew: 0x%x: %s", error->errnum, error->errmess)); return error; } } /* move or copy temporary file to destination file */ error = xosfscontrol_rename(src_file, dest_file); /* Errors from a filing system have number 0x1XXnn, where XX is the FS * number, and nn the error number. 0x9F is "Not same disc". */ if (error && (error->errnum == error_BAD_RENAME || (error->errnum & 0xFF00FFu) == 0x1009Fu)) { /* rename failed: copy with delete */ error = xosfscontrol_copy(src_file, dest_file, osfscontrol_COPY_FORCE | osfscontrol_COPY_DELETE | osfscontrol_COPY_LOOK, 0, 0, 0, 0, 0); if (error) { LOG(("xosfscontrol_copy: 0x%x: %s", error->errnum, error->errmess)); return error; } } else if (error) { LOG(("xosfscontrol_rename: 0x%x: %s", error->errnum, error->errmess)); return error; } if (dw->ctx) { /* open new destination file if still fetching */ error = xosfile_write(dest_file, 0xdeaddead, 0xdeaddead, fileswitch_ATTR_OWNER_READ | fileswitch_ATTR_OWNER_WRITE); if (error) { LOG(("xosfile_write: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); } error = xosfind_openupw(osfind_NO_PATH | osfind_ERROR_IF_DIR, dest_file, 0, &dw->file); if (error) { LOG(("xosfind_openupw: 0x%x: %s", error->errnum, error->errmess)); return error; } error = xosargs_set_ptrw(dw->file, dw->received); if (error) { LOG(("xosargs_set_ptrw: 0x%x: %s", error->errnum, error->errmess)); return error; } } else { /* otherwise just set the file type */ error = xosfile_set_type(dest_file, dw->file_type); if (error) { LOG(("xosfile_set_type: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); } } /* success */ return NULL; }
bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit) { bool safe = dw->saved && !dw->ctx; os_error *error; if (!safe && !dw->close_confirmed) { query_reason rsn = quit ? QueryRsn_Quit : QueryRsn_Abort; if (dw->query != QUERY_INVALID) { /* can we just reuse the existing query? */ if (rsn == dw->query_rsn) { ro_gui_query_window_bring_to_front(dw->query); return false; } query_close(dw->query); dw->query = QUERY_INVALID; } if (quit) { /* bring all download windows to the front of the desktop as a convenience if there are lots of windows open */ struct gui_download_window *d = download_window_list; while (d) { ro_gui_dialog_open_top(d->window, NULL, 0, 0); d = d->next; } } dw->query_rsn = rsn; dw->query = query_user(quit ? "QuitDownload" : "AbortDownload", NULL, &close_funcs, dw, NULL, NULL); return false; } schedule_remove(ro_gui_download_update_status_wrapper, dw); schedule_remove(ro_gui_download_window_destroy_wrapper, dw); /* remove from list */ if (dw->prev) dw->prev->next = dw->next; else download_window_list = dw->next; if (dw->next) dw->next->prev = dw->prev; /* delete window */ error = xwimp_delete_window(dw->window); if (error) { LOG(("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } ro_gui_wimp_event_finalise(dw->window); /* close download file */ if (dw->file) { error = xosfind_closew(dw->file); if (error) { LOG(("xosfind_closew: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); } } /* delete temporary file */ if (!dw->saved) { const char *temp_name = ro_gui_download_temp_name(dw); error = xosfile_delete(temp_name, 0, 0, 0, 0, 0); if (error) { LOG(("xosfile_delete: 0x%x: %s", error->errnum, error->errmess)); warn_user("SaveError", error->errmess); } } if (dw->ctx) { download_context_abort(dw->ctx); download_context_destroy(dw->ctx); } free(dw); return true; }
bool ro_gui_load_theme(char *path) { os_error *error; struct theme_file_header *file_header; char *workspace; int workspace_size, file_size, output_left; fileswitch_object_type obj_type; squash_output_status status; os_fw file_handle; char *raw_data; char *compressed; char *decompressed; /* Get memory for the header */ file_header = (struct theme_file_header *)calloc(1, sizeof (struct theme_file_header)); if (!file_header) { LOG(("No memory for calloc()")); warn_user("NoMemory", 0); } /* Load the header */ error = xosfind_openinw(osfind_NO_PATH, path, 0, &file_handle); if (error) { free(file_header); LOG(("xosfind_openinw: 0x%x: %s", error->errnum, error->errmess)); warn_user("FileError", error->errmess); return false; } if (file_handle == 0) { free(file_header); LOG(("File not present")); warn_user("FileError", error->errmess); return false; } error = xosgbpb_read_atw(file_handle, (char *)file_header, sizeof (struct theme_file_header), 0, &output_left); xosfind_closew(file_handle); if (error) { free(file_header); LOG(("xosbgpb_read_atw: 0x%x: %s", error->errnum, error->errmess)); warn_user("FileError", error->errmess); return false; } if (output_left > 0) { free(file_header); LOG(("Insufficient data")); warn_user("FileError", error->errmess); return false; } /* Check the header is OK */ if ((file_header->magic_value != 0x4d54534e) || (file_header->parser_version > 2)) return false; /* Try to load the sprite file */ if (file_header->decompressed_sprite_size > 0) { error = xosfile_read_stamped_no_path(path, &obj_type, 0, 0, &file_size, 0, 0); if (error) { free(file_header); LOG(("xosfile_read_stamped_no_path: 0x%x: %s", error->errnum, error->errmess)); warn_user("FileError", error->errmess); return false; } if (obj_type != fileswitch_IS_FILE) { free(file_header); return false; } raw_data = malloc(file_size); if (!raw_data) { free(file_header); LOG(("No memory for malloc()")); warn_user("NoMemory", 0); return false; } error = xosfile_load_stamped_no_path(path, (byte *)raw_data, 0, 0, 0, 0, 0); if (error) { free(raw_data); free(file_header); LOG(("xosfile_load_stamped_no_path: 0x%x: %s", error->errnum, error->errmess)); warn_user("FileError", error->errmess); return false; } /* Decompress the data */ decompressed = malloc(file_header->decompressed_sprite_size); if (!decompressed) { free(raw_data); free(file_header); LOG(("No memory for malloc()")); warn_user("NoMemory", 0); } error = xsquash_decompress_return_sizes(-1, &workspace_size, 0); if (error) { free(decompressed); free(raw_data); free(file_header); LOG(("xsquash_decompress_return_sizes: 0x%x: %s", error->errnum, error->errmess)); warn_user("MiscError", error->errmess); return false; } workspace = malloc(workspace_size); if (!workspace) { free(decompressed); free(raw_data); free(file_header); LOG(("No memory for malloc()")); warn_user("NoMemory", 0); return false; } compressed = raw_data + sizeof(struct theme_file_header); error = xsquash_decompress(0, /*squash_INPUT_ALL_PRESENT,*/ workspace, (byte *)compressed, file_header->compressed_sprite_size, (byte *)decompressed, file_header->decompressed_sprite_size, &status, 0, 0, 0, 0); free(workspace); free(raw_data); if (error) { free(decompressed); LOG(("xsquash_decompress: 0x%x: %s", error->errnum, error->errmess)); warn_user("MiscError", error->errmess); return false; } if (status != 0) { free(decompressed); return false; } if (theme_sprites) free(theme_sprites); theme_sprites = (osspriteop_area *)decompressed; } else { if (theme_sprites) free(theme_sprites); theme_sprites = NULL; } /* Set out values */ ro_gui_set_icon_string(dialog_main, ICON_MAIN_NAME, file_header->name); ro_gui_set_icon_string(dialog_main, ICON_MAIN_AUTHOR, file_header->author); ro_gui_set_icon_background_colour(dialog_main, ICON_MAIN_BROWSER_COLOUR, file_header->browser_bg); ro_gui_set_icon_background_colour(dialog_main, ICON_MAIN_HOTLIST_COLOUR, file_header->hotlist_bg); ro_gui_set_icon_background_colour(dialog_main, ICON_MAIN_STATUSBG_COLOUR, file_header->status_bg); ro_gui_set_icon_background_colour(dialog_main, ICON_MAIN_STATUSFG_COLOUR, file_header->status_fg); if (file_header->parser_version >= 2) { ro_gui_set_icon_selected_state(dialog_main, ICON_MAIN_THROBBER_LEFT, file_header->theme_flags & (1 << 0)); ro_gui_set_icon_selected_state(dialog_main, ICON_MAIN_THROBBER_REDRAW, file_header->theme_flags & (1 << 1)); } else { ro_gui_set_icon_selected_state(dialog_main, ICON_MAIN_THROBBER_LEFT, file_header->theme_flags); ro_gui_set_icon_selected_state(dialog_main, ICON_MAIN_THROBBER_REDRAW, true); } /* Remember the filename for saving later on */ if (theme_filename) free(theme_filename); theme_filename = malloc(strlen(path) + 1); sprintf(theme_filename, "%s", path); if (sprite_filename) free(sprite_filename); sprite_filename = NULL; /* Exit cleanly */ free(file_header); return true; }