Review: Needs Fixing
Diff comments: > === modified file 'src/logic/save_handler.cc' > --- src/logic/save_handler.cc 2017-01-25 18:55:59 +0000 > +++ src/logic/save_handler.cc 2017-04-21 16:12:49 +0000 > @@ -37,25 +37,119 @@ > #include "wlapplication.h" > #include "wui/interactive_base.h" > > +// The actual work of saving is done by the GameSaver > using Widelands::GameSaver; > > -/** > -* Check if autosave is not needed. > +SaveHandler::SaveHandler() > + : next_save_realtime_(0), > + initialized_(false), > + allow_saving_(true), > + save_requested_(false), > + saving_next_tick_(false), > + save_filename_(""), > + autosave_filename_("wl_autosave"), > + fs_type_(FileSystem::ZIP), > + autosave_interval_in_ms_(DEFAULT_AUTOSAVE_INTERVAL * 60 * 1000), > + number_of_rolls_(5) > +{ > +} > + > +void SaveHandler::rollSaveFiles(const std::string& filename) { Widelands style uses snake_case_for_functions. You have some Javaisms here :) > + > + int32_t rolls = number_of_rolls_; > + log("Autosave: Rolling savefiles (count): %d\n", rolls); > + rolls--; > + std::string filename_previous = create_file_name( > + get_base_dir(), (boost::format("%s_%02d") % filename % rolls).str()); > + if (rolls > 0 && g_fs->file_exists(filename_previous)) { > + g_fs->fs_unlink(filename_previous); // Delete last of the > rolling files > + log("Autosave: Deleted %s\n", filename_previous.c_str()); > + } > + rolls--; > + while (rolls >= 0) { > + const std::string filename_next = create_file_name( > + get_base_dir(), (boost::format("%s_%02d") % filename % > rolls).str()); > + if (g_fs->file_exists(filename_next)) { > + g_fs->fs_rename(filename_next, filename_previous); // > e.g. wl_autosave_08 -> wl_autosave_09 > + log("Autosave: Rolled %s to %s\n", > filename_next.c_str(), filename_previous.c_str()); > + } > + filename_previous = filename_next; > + rolls--; > + } > +} > + > +/** > + * Check if game should be saved at next tick / think. > + * > + * @return true if game should be saved ad next think(). > + */ > +bool SaveHandler::checkNextTick(Widelands::Game& game, uint32_t realtime) { > + > + // Perhaps save is due now? > + if (autosave_interval_in_ms_ <= 0 || next_save_realtime_ > realtime) { > + return false; // no autosave or not due, yet > + } > + > + next_save_realtime_ = realtime + autosave_interval_in_ms_; > + > + // check if game is paused (in any way) > + if (game.game_controller()->is_paused_or_zero_speed()) { > + return false; > + } > + > + log("Autosave: %d ms interval elapsed, current gametime: %s, > saving...\n", autosave_interval_in_ms_, > + gametimestring(game.get_gametime(), true).c_str()); > + > + game.get_ibase()->log_message(_("Saving gameā¦")); > + return true; > +} > + > +/** > + * If saving fails restore the backup file. > + * > + * @return true when save was a success. > + */ > +bool SaveHandler::saveAndHandleError(Widelands::Game& game, > + const std::string& > complete_filename, > + const std::string& > backup_filename) { > + std::string error; > + bool result = save_game(game, complete_filename, &error); > + if (!result) { > + log("Autosave: ERROR! - %s\n", error.c_str()); > + game.get_ibase()->log_message(_("Saving failed!")); > + > + // if backup file was created, move it back > + if (backup_filename.length() > 0) { > + if (g_fs->file_exists(complete_filename)) { > + g_fs->fs_unlink(complete_filename); > + } > + g_fs->fs_rename(backup_filename, complete_filename); > + } > + // Wait 30 seconds until next save try > + next_save_realtime_ += 30000; > + } else { > + // if backup file was created, time to remove it > + if (backup_filename.length() > 0 && > g_fs->file_exists(backup_filename)) > + g_fs->fs_unlink(backup_filename); > + } > + return result; > +} > + > +/** > + * Check if autosave is needed and allowed or save was requested by user. > */ > void SaveHandler::think(Widelands::Game& game) { > + > + if (!allow_saving_ || game.is_replay()) { > + return; > + } > + > uint32_t realtime = SDL_GetTicks(); > initialize(realtime); > - std::string filename = autosave_filename_; > - > - if (!allow_saving_) { > - return; > - } > - if (game.is_replay()) { > - return; > - } > > // Are we saving now? > if (saving_next_tick_ || save_requested_) { > + std::string filename = autosave_filename_; > if (save_requested_) { > // Requested by user > if (!save_filename_.empty()) { -- https://code.launchpad.net/~widelands-dev/widelands/save_refactor/+merge/322622 Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/save_refactor. _______________________________________________ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp