// Copy file contents bool FileSpecifier::CopyContents(FileSpecifier &source_name) { err = 0; OpenedFile src, dst; if (source_name.Open(src)) { Delete(); if (Open(dst, true)) { const int BUFFER_SIZE = 1024; uint8 buffer[BUFFER_SIZE]; int32 length = 0; src.GetLength(length); while (length && err == 0) { int32 count = length > BUFFER_SIZE ? BUFFER_SIZE : length; if (src.Read(count, buffer)) { if (!dst.Write(count, buffer)) err = dst.GetError(); } else err = src.GetError(); length -= count; } } } else err = source_name.GetError(); if (err) Delete(); return err == 0; }
static void dialog_export(void *arg) { dialog *d = static_cast<dialog *>(arg); w_saves *saves_w = static_cast<w_saves *>(d->get_widget_by_id(iDIALOG_SAVES_W)); QuickSave sel = saves_w->selected_save(); std::string name = sel.name; if (!name.length()) name = sel.level_name; FileSpecifier dstFile; dstFile.SetToSavedGamesDir(); dstFile += "unused.sgaA"; char prompt[256]; if (dstFile.WriteDialog(_typecode_savegame, getcstr(prompt, strPROMPTS, _save_replay_prompt), utf8_to_mac_roman(name).c_str())) { dstFile.CopyContents(sel.save_file); int error = dstFile.GetError(); if (error) alert_user(infoError, strERRORS, fileError, error); } }