static void nsgtk_download_store_cancel_item (struct gui_download_window *dl) { if (dl->sensitivity & NSGTK_DOWNLOAD_CANCEL) { dl->speed = 0; dl->size_downloaded = 0; dl->progress = 0; dl->time_remaining = -1; nsgtk_download_change_sensitivity(dl, NSGTK_DOWNLOAD_CLEAR); nsgtk_download_change_status(dl, NSGTK_DOWNLOAD_CANCELED); download_context_abort(dl->ctx); g_unlink(download_context_get_filename(dl->ctx)); nsgtk_download_update(TRUE); } }
void ami_download_window_abort(struct gui_download_window *dw) { download_context_abort(dw->ctx); dw->result = AMINS_DLOAD_ABORT; gui_download_window_done(dw); }
nserror gui_download_window_data(struct gui_download_window *dw, const char *data, unsigned int size) { while (true) { const char *msg; int unwritten; os_error *error; error = xosgbpb_writew(dw->file, (const byte *) data, size, &unwritten); if (error) { LOG(("xosgbpb_writew: 0x%x: %s", error->errnum, error->errmess)); msg = error->errmess; } else if (unwritten) { LOG(("xosgbpb_writew: unwritten %i", unwritten)); msg = messages_get("Unwritten"); } else { dw->received += size; return NSERROR_OK; } warn_user("SaveError", msg); if (dw->saved) { /* try to continue with the temporary file */ const char *temp_name = ro_gui_download_temp_name(dw); error = ro_gui_download_move(dw, temp_name, dw->path); if (!error) { /* re-allow saving */ dw->saved = false; error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON, wimp_ICON_SHADED, 0); if (error) { LOG(("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_DESTINATION, wimp_ICON_DELETED, wimp_ICON_DELETED); if (error) { LOG(("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_PATH, wimp_ICON_DELETED, 0); if (error) { LOG(("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } continue; } } /* give up then */ assert(dw->ctx); download_context_abort(dw->ctx); gui_download_window_error(dw, msg); return NSERROR_SAVE_FAILED; } }
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_download_save(struct gui_download_window *dw, const char *file_name, bool force_overwrite) { fileswitch_object_type obj_type; const char *temp_name; os_error *error; if (dw->saved || dw->error) return true; temp_name = ro_gui_download_temp_name(dw); /* does the user want to check for collisions when saving? */ if (!force_overwrite) { /* check whether the destination file/dir already exists */ error = xosfile_read_stamped(file_name, &obj_type, NULL, NULL, NULL, NULL, NULL); if (error) { LOG(("xosfile_read_stamped: 0x%x:%s", error->errnum, error->errmess)); return false; } switch (obj_type) { case osfile_NOT_FOUND: break; case osfile_IS_FILE: dw->query = query_user("OverwriteFile", NULL, &overwrite_funcs, dw, messages_get("Replace"), messages_get("DontReplace")); dw->query_rsn = QueryRsn_Overwrite; return false; default: error = xosfile_make_error(file_name, obj_type); assert(error); warn_user("SaveError", error->errmess); return false; } } if (!ro_gui_download_check_space(dw, file_name, temp_name)) { warn_user("SaveError", messages_get("NoDiscSpace")); return false; } error = ro_gui_download_move(dw, file_name, temp_name); if (error) { warn_user("SaveError", error->errmess); /* try to reopen at old location so that the download can continue to the temporary file */ error = xosfind_openupw(osfind_NO_PATH | osfind_ERROR_IF_DIR, temp_name, 0, &dw->file); if (error) { LOG(("xosfind_openupw: 0x%x: %s", error->errnum, error->errmess)); } else { error = xosargs_set_ptrw(dw->file, dw->received); if (error) { LOG(("xosargs_set_ptrw: 0x%x: %s", error->errnum, error->errmess)); } } if (error) { if (dw->ctx) download_context_abort(dw->ctx); gui_download_window_error(dw, error->errmess); } return false; } dw->saved = true; strncpy(dw->path, file_name, sizeof dw->path); if (!dw->send_dataload || dw->save_message.data.data_xfer.est_size != -1) ro_gui_download_remember_dir(file_name); /* grey out file icon */ error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_ICON, wimp_ICON_SHADED, wimp_ICON_SHADED); if (error) { LOG(("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } /* hide writeable path icon and show destination icon Note: must redraw icon bounding box because the destination icon has rounded edges on RISC OS Select/Adjust and doesn't completely cover the writeable icon */ ro_gui_force_redraw_icon(dw->window, ICON_DOWNLOAD_PATH); error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_PATH, wimp_ICON_DELETED, wimp_ICON_DELETED); if (error) { LOG(("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } error = xwimp_set_icon_state(dw->window, ICON_DOWNLOAD_DESTINATION, wimp_ICON_DELETED, 0); if (error) { LOG(("xwimp_set_icon_state: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } ro_gui_download_window_hide_caret(dw); return true; }
NSDownloadWindow::~NSDownloadWindow() { download_context_abort(ctx); download_context_destroy(ctx); }