From d8d239e35da4afc678fb2528c2010efeb16661e0 Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 23 Dec 2008 01:07:55 +0000 Subject: [PATCH] Movie auto-back feature implemented --- changelog.txt | 1 + src/drivers/win/window.cpp | 3 +- src/fceu.cpp | 88 ------------------------------------ src/movie.cpp | 92 ++++++++++++++++++++++++++++++++++++++ src/movie.h | 10 +++-- src/state.cpp | 7 ++- 6 files changed, 106 insertions(+), 95 deletions(-) diff --git a/changelog.txt b/changelog.txt index a7afea4b..ddaad7c7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,5 @@ ---version 2.0.4 yet to be released--- +22-dec-2008 - adelikat - Movie auto-backup feature implemented 22-dec-2008 - adelikat - win32 - moved movie related menu items to a movie options dialog box 22-dec-2008 - adelikat - Win32 - context menu item "create backup" for backing up movie files 21-dec-2008 - adelikat - Win32 - Name Table Viewer - Refresh value default to 15, Refresh value stored in config file diff --git a/src/drivers/win/window.cpp b/src/drivers/win/window.cpp index 902b0c49..66ccce47 100644 --- a/src/drivers/win/window.cpp +++ b/src/drivers/win/window.cpp @@ -94,7 +94,6 @@ void ShowNetplayConsole(void); //mbg merge 7/17/06 YECH had to add void MapInput(void); extern BOOL CALLBACK ReplayMetadataDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //Metadata dialog -extern void MakeBackupMovie(bool dispMessage); //Makes a backup of current movie file extern bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists //AutoFire----------------------------------------------- @@ -1315,7 +1314,7 @@ UpdateContextMenuItems(hfceuxcontextsub, whichContext); //Create a backup movie file case FCEUX_CONTEXT_MAKEBACKUP: - MakeBackupMovie(true); + FCEUI_MakeBackupMovie(true); break; //Game + Movie - Help case FCEU_CONTEXT_MOVIEHELP: diff --git a/src/fceu.cpp b/src/fceu.cpp index cec1a944..f7f12596 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -74,11 +74,6 @@ bool justLagged = false; bool frameAdvanceLagSkip = false; //If this is true, frame advance will skip over lag frame (i.e. it will emulate 2 frames instead of 1) bool movieSubtitles = true; //Toggle for displaying movie subtitles -bool autoMovieBackup = false; //Toggle that determines if movies should be backed up automatically before altering them - -// Function declarations -void MakeBackupMovie(bool dispMessage); //Makes a backup of current movie file -bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists FCEUGI::FCEUGI() : filename(0) @@ -1088,87 +1083,4 @@ uint8 FCEU_ReadRomByte(uint32 i) { if(i < 16+PRGsize[0])return PRGptr[0][i-16]; if(i < 16+PRGsize[0]+CHRsize[0])return CHRptr[0][i-16-PRGsize[0]]; return 0; -} - -void MakeBackupMovie(bool dispMessage) -{ - //This function generates backup movie files - string currentFn; //Current movie fillename - string backupFn; //Target backup filename - string tempFn; //temp used in back filename creation - stringstream stream; - int x; //Temp variable for string manip - bool exist = false; //Used to test if filename exists - bool overflow = false; //Used for special situation when backup numbering exceeds limit - - currentFn = curMovieFilename; //Get current moviefilename - backupFn = curMovieFilename; //Make backup filename the same as current moviefilename - x = backupFn.find_last_of("."); //Find file extension - backupFn = backupFn.substr(0,x); //Remove extension - tempFn = backupFn; //Store the filename at this point - for (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files - { - stream.str(""); //Clear stream - if (backNum > 99) - stream << "-" << backNum; //assign backNum to stream - else if (backNum <=99 && backNum >= 10) - stream << "-0"; //Make it 010, etc if two digits - else - stream << "-00" << backNum; //Make it 001, etc if single digit - backupFn.append(stream.str()); //add number to bak filename - backupFn.append(".bak"); //add extension - - exist = CheckFileExists(backupFn.c_str()); //Check if file exists - - if (!exist) - break; //Yeah yeah, I should use a do loop or something - else - { - backupFn = tempFn; //Before we loop again, reset the filename - - if (backNum == 999) //If 999 exists, we have overflowed, let's handle that - { - backupFn.append("-001.bak"); //We are going to simply overwrite 001.bak - overflow = true; //Flag that we have exceeded limit - break; //Just in case - } - } - } - - MovieData md = currMovieData; //Get current movie data - std::fstream* outf = FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file - md.dump(outf,false); //dump movie data - delete outf; //clean up, delete file object - - //TODO, decide if fstream successfully opened the file and print error message if it doesn't - - if (dispMessage) //If we should inform the user - { - if (overflow) - FCEUI_DispMessage("Overwriting %s",backupFn.c_str()); //Inform user of overflow - else - FCEUI_DispMessage("%s created",backupFn.c_str()); //Inform user of backup filename - } -} - -bool CheckFileExists(const char* filename) -{ - //This function simply checks to see if the given filename exists - string checkFilename; - checkFilename = filename; - - //Check if this filename exists - fstream test; - test.open(checkFilename.c_str(),fstream::in); - - if (test.fail()) - { - test.close(); - return false; - } - else - { - test.close(); - return true; - } } \ No newline at end of file diff --git a/src/movie.cpp b/src/movie.cpp index d3e57361..4f8c9b04 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -46,6 +46,12 @@ std::vector subtitleFrames; //Frame numbers for subtitle messages std::vector subtitleMessages; //Messages of subtitles bool subtitlesOnAVI = false; +bool autoMovieBackup = false; //Toggle that determines if movies should be backed up automatically before altering them +bool freshMovie = false; //True when a movie loads, false when movie is altered. Used to determine if a movie has been altered since opening + +// Function declarations------------------------ +bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists + //TODO - remove the synchack stuff from the replay gui and require it to be put into the fm2 file //which the user would have already converted from fcm @@ -620,6 +626,7 @@ void FCEUI_StopMovie() StopRecording(); curMovieFilename[0] = 0; + freshMovie = false; } static void poweron(bool shouldDisableBatteryLoading) @@ -734,6 +741,8 @@ void FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _paus LoadSubtitles(); delete fp; + freshMovie = true; //Movie has been loaded, so it must be unaltered + //fully reload the game to reinitialize everything before playing any movie poweron(true); @@ -1227,3 +1236,86 @@ void FCEU_DisplaySubtitles(char *format, ...) subtitleMessage.howlong = 300; subtitleMessage.isMovieMessage = subtitlesOnAVI; } + +void FCEUI_MakeBackupMovie(bool dispMessage) +{ + //This function generates backup movie files + string currentFn; //Current movie fillename + string backupFn; //Target backup filename + string tempFn; //temp used in back filename creation + stringstream stream; + int x; //Temp variable for string manip + bool exist = false; //Used to test if filename exists + bool overflow = false; //Used for special situation when backup numbering exceeds limit + + currentFn = curMovieFilename; //Get current moviefilename + backupFn = curMovieFilename; //Make backup filename the same as current moviefilename + x = backupFn.find_last_of("."); //Find file extension + backupFn = backupFn.substr(0,x); //Remove extension + tempFn = backupFn; //Store the filename at this point + for (unsigned int backNum=0;backNum<999;backNum++) //999 = arbituary limit to backup files + { + stream.str(""); //Clear stream + if (backNum > 99) + stream << "-" << backNum; //assign backNum to stream + else if (backNum <=99 && backNum >= 10) + stream << "-0"; //Make it 010, etc if two digits + else + stream << "-00" << backNum; //Make it 001, etc if single digit + backupFn.append(stream.str()); //add number to bak filename + backupFn.append(".bak"); //add extension + + exist = CheckFileExists(backupFn.c_str()); //Check if file exists + + if (!exist) + break; //Yeah yeah, I should use a do loop or something + else + { + backupFn = tempFn; //Before we loop again, reset the filename + + if (backNum == 999) //If 999 exists, we have overflowed, let's handle that + { + backupFn.append("-001.bak"); //We are going to simply overwrite 001.bak + overflow = true; //Flag that we have exceeded limit + break; //Just in case + } + } + } + + MovieData md = currMovieData; //Get current movie data + std::fstream* outf = FCEUD_UTF8_fstream(backupFn, "wb"); //open/create file + md.dump(outf,false); //dump movie data + delete outf; //clean up, delete file object + + //TODO, decide if fstream successfully opened the file and print error message if it doesn't + + if (dispMessage) //If we should inform the user + { + if (overflow) + FCEUI_DispMessage("Overwriting %s",backupFn.c_str()); //Inform user of overflow + else + FCEUI_DispMessage("%s created",backupFn.c_str()); //Inform user of backup filename + } +} + +bool CheckFileExists(const char* filename) +{ + //This function simply checks to see if the given filename exists + string checkFilename; + checkFilename = filename; + + //Check if this filename exists + fstream test; + test.open(checkFilename.c_str(),fstream::in); + + if (test.fail()) + { + test.close(); + return false; + } + else + { + test.close(); + return true; + } +} \ No newline at end of file diff --git a/src/movie.h b/src/movie.h index cdccf587..c7b1777a 100644 --- a/src/movie.h +++ b/src/movie.h @@ -234,8 +234,12 @@ extern MovieData currMovieData; extern int currFrameCounter; extern char curMovieFilename[512]; extern bool subtitlesOnAVI; -//--------- +extern bool freshMovie; +extern bool movie_readonly; +extern bool autoMovieBackup; +//-------------------------------------------------- +void FCEUI_MakeBackupMovie(bool dispMessage); void FCEUI_SaveMovie(const char *fname, EMOVIE_FLAG flags, std::wstring author); void FCEUI_LoadMovie(const char *fname, bool read_only, bool tasedit, int _stopframe); void FCEUI_MoviePlayFromBeginning(void); @@ -251,6 +255,4 @@ void LoadSubtitles(void); void ProcessSubtitles(void); void FCEU_DisplaySubtitles(char *format, ...); - - -#endif //__MOVIE_H_ +#endif //__MOVIE_H_ \ No newline at end of file diff --git a/src/state.cpp b/src/state.cpp index 20f9fd9d..a693d026 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -799,7 +799,11 @@ void FCEUI_LoadState(const char *fname) from this ;)). */ BackupSaveState(); - + + if (!movie_readonly && autoMovieBackup && freshMovie) //If auto-backup is on, movie has not been altered this session and the movie is in read+write mode + { + FCEUI_MakeBackupMovie(false); //Backup the movie before the contents get altered, but do not display messages + } if(FCEUSS_Load(fname)) { //mbg todo netplay @@ -825,6 +829,7 @@ void FCEUI_LoadState(const char *fname) free(fn); }*/ + freshMovie = false; //The movie has been altered so it is no longer fresh } else {