diff --git a/desmume/src/mc.cpp b/desmume/src/mc.cpp index d677d8093..daa1897a5 100644 --- a/desmume/src/mc.cpp +++ b/desmume/src/mc.cpp @@ -1,7 +1,7 @@ /* Copyright (C) 2006 thoduv Copyright (C) 2006-2007 Theo Berkau - Copyright (C) 2008-2017 DeSmuME team + Copyright (C) 2008-2018 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -164,14 +164,14 @@ bool BackupDevice::load_state(EMUFILE &is) if (is.read_32LE(version) != 1) return false; - is.read_bool32(write_enable); - is.read_32LE(com); - is.read_32LE(addr_size); - is.read_32LE(addr_counter); - is.read_32LE(temp); - state = (STATE)temp; - is.read_buffer(data); - is.read_buffer(data_autodetect); + is.read_bool32(write_enable); + is.read_32LE(com); + is.read_32LE(addr_size); + is.read_32LE(addr_counter); + is.read_32LE(temp); + state = (STATE)temp; + is.read_buffer(data); + is.read_buffer(data_autodetect); if (version >= 1) is.read_32LE(addr); @@ -1653,35 +1653,25 @@ bool BackupDevice::import_dsv(const char *filename) return result; } -bool BackupDevice::load_movie(EMUFILE &is) +bool BackupDevice::load_movie(EMUFILE *is) { - const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie); - - is.fseek(-cookieLen, SEEK_END); - is.fseek(-4, SEEK_CUR); - - u32 version = is.read_u32LE(); - if (version != 0) - { - printf("Unknown save file format\n"); - return false; - } - is.fseek(-24, SEEK_CUR); - - BackupDeviceFileInfo info; + delete fpMC; + fpMC = is; - is.read_32LE(info.size); - is.read_32LE(info.padSize); - is.read_32LE(info.type); - is.read_32LE(info.addr_size); - is.read_32LE(info.mem_size); + int ok = readFooter(); + // TODO - in case we ever change the format again (and we should probably entirely rewrite this if we do) we'd need to detect the old versions + // (that is, returning -1 or -2 here or some other errors) + + is->fseek(0, SEEK_SET); - is.fseek(0, SEEK_SET); - fpMC = &is; + EMUFILE_MEMORY* scratchbuf = new EMUFILE_MEMORY(this->_info.padSize); + is->fread(scratchbuf->buf(),_info.padSize); + fpMC = scratchbuf; + //this is what load_movie has always done. + //seems sloppy, the original intention was for this to basically be a savestate, so that all fields are saved, but someone wrecked that state = RUNNING; - addr_size = info.addr_size; - //none of the other fields are used right now + addr_size = _info.addr_size; return true; } @@ -1692,6 +1682,8 @@ void BackupDevice::load_movie_blank() fpMC = new EMUFILE_MEMORY(); state = DETECTING; + fsize = 0; + addr_size = 0; } void BackupDevice::forceManualBackupType() diff --git a/desmume/src/mc.h b/desmume/src/mc.h index b506210f8..472fdc77b 100644 --- a/desmume/src/mc.h +++ b/desmume/src/mc.h @@ -1,7 +1,7 @@ /* Copyright (C) 2006 thoduv Copyright (C) 2006 Theo Berkau - Copyright (C) 2008-2017 DeSmuME team + Copyright (C) 2008-2018 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -147,7 +147,7 @@ public: bool export_raw(const char* filename); bool no_gba_unpack(u8 *&buf, u32 &size); - bool load_movie(EMUFILE &is); + bool load_movie(EMUFILE *is); void load_movie_blank(); u32 importDataSize(const char *filename); diff --git a/desmume/src/movie.cpp b/desmume/src/movie.cpp index 18a098ec5..2fab4dd7b 100644 --- a/desmume/src/movie.cpp +++ b/desmume/src/movie.cpp @@ -1,5 +1,5 @@ /* - Copyright 2008-2017 DeSmuME team + Copyright 2008-2018 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -606,8 +606,8 @@ static void openRecordingMovie(const char* fname) bool MovieData::loadSramFrom(std::vector* buf) { - EMUFILE_MEMORY* ms = new EMUFILE_MEMORY(buf); // change to new to avoid automatic destruction - MMU_new.backupDevice.load_movie(*ms); + EMUFILE_MEMORY ms(buf); + MMU_new.backupDevice.load_movie(&ms); return true; }