For Qt GUI, store archive file index so that a hard reload knows how to refind the ROM inside the archive. For netplay, don't send entire zip archives. Instead just send the single extracted ROM of interest.
This commit is contained in:
parent
4b36de6ec9
commit
0ea2670ae0
|
@ -343,14 +343,20 @@ int NetPlayServer::sendRomLoadReq( NetPlayClient *client )
|
|||
char buf[BufferSize];
|
||||
size_t bytesRead;
|
||||
long fileSize = 0;
|
||||
int userCancel = 0;
|
||||
int archiveIndex = -1;
|
||||
netPlayLoadRomReq msg;
|
||||
const char* romextensions[] = { "nes", "fds", "nsf", 0 };
|
||||
|
||||
const char *filepath = nullptr;
|
||||
|
||||
if ( GameInfo )
|
||||
if ( GameInfo == nullptr)
|
||||
{
|
||||
printf("filename: '%s' \n", GameInfo->filename );
|
||||
printf("archiveFilename: '%s' \n", GameInfo->archiveFilename );
|
||||
return -1;
|
||||
}
|
||||
|
||||
//printf("filename: '%s' \n", GameInfo->filename );
|
||||
//printf("archiveFilename: '%s' \n", GameInfo->archiveFilename );
|
||||
|
||||
if (GameInfo->archiveFilename)
|
||||
{
|
||||
|
@ -360,6 +366,11 @@ int NetPlayServer::sendRomLoadReq( NetPlayClient *client )
|
|||
{
|
||||
filepath = GameInfo->filename;
|
||||
}
|
||||
archiveIndex = GameInfo->archiveIndex;
|
||||
|
||||
if (archiveIndex >= 0)
|
||||
{
|
||||
msg.archiveIndex = archiveIndex;
|
||||
}
|
||||
|
||||
if (filepath == nullptr)
|
||||
|
@ -367,17 +378,14 @@ int NetPlayServer::sendRomLoadReq( NetPlayClient *client )
|
|||
return -1;
|
||||
}
|
||||
printf("Prep ROM Load Request: %s \n", filepath );
|
||||
FILE *fp = ::fopen( filepath, "rb");
|
||||
|
||||
FCEUFILE* fp = FCEU_fopen( filepath, nullptr, "rb", 0, archiveIndex, romextensions, &userCancel);
|
||||
|
||||
if (fp == nullptr)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
fseek( fp, 0, SEEK_END);
|
||||
|
||||
fileSize = ftell(fp);
|
||||
|
||||
rewind(fp);
|
||||
fileSize = fp->size;
|
||||
|
||||
QFileInfo fileInfo(GameInfo->filename);
|
||||
|
||||
|
@ -389,13 +397,13 @@ int NetPlayServer::sendRomLoadReq( NetPlayClient *client )
|
|||
|
||||
sendMsg( client, &msg, sizeof(netPlayLoadRomReq), [&msg]{ msg.toNetworkByteOrder(); } );
|
||||
|
||||
while ( (bytesRead = fread( buf, 1, sizeof(buf), fp )) > 0 )
|
||||
while ( (bytesRead = FCEU_fread( buf, 1, sizeof(buf), fp )) > 0 )
|
||||
{
|
||||
sendMsg( client, buf, bytesRead );
|
||||
}
|
||||
client->flushData();
|
||||
|
||||
::fclose(fp);
|
||||
FCEU_fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1977,7 +1985,9 @@ void NetPlayClient::clientProcessMessage( void *msgBuf, size_t msgSize )
|
|||
tmpFile.close();
|
||||
|
||||
FCEU_WRAPPER_LOCK();
|
||||
fceuWrapperSetArchiveFileLoadIndex( msg->archiveIndex );
|
||||
LoadGame( filepath.toLocal8Bit().constData(), true, true );
|
||||
fceuWrapperClearArchiveFileLoadIndex();
|
||||
|
||||
opsCrc32 = 0;
|
||||
netPlayFrameData.reset();
|
||||
|
|
|
@ -236,10 +236,11 @@ struct netPlayLoadRomReq
|
|||
netPlayMsgHdr hdr;
|
||||
|
||||
uint32_t fileSize;
|
||||
uint32_t archiveIndex;
|
||||
char fileName[256];
|
||||
|
||||
netPlayLoadRomReq(void)
|
||||
: hdr(NETPLAY_LOAD_ROM_REQ, sizeof(netPlayLoadRomReq)), fileSize(0)
|
||||
: hdr(NETPLAY_LOAD_ROM_REQ, sizeof(netPlayLoadRomReq)), fileSize(0), archiveIndex(0)
|
||||
{
|
||||
memset(fileName, 0, sizeof(fileName));
|
||||
}
|
||||
|
@ -248,12 +249,14 @@ struct netPlayLoadRomReq
|
|||
{
|
||||
hdr.toHostByteOrder();
|
||||
fileSize = netPlayByteSwap(fileSize);
|
||||
archiveIndex = netPlayByteSwap(archiveIndex);
|
||||
}
|
||||
|
||||
void toNetworkByteOrder()
|
||||
{
|
||||
hdr.toNetworkByteOrder();
|
||||
fileSize = netPlayByteSwap(fileSize);
|
||||
archiveIndex = netPlayByteSwap(archiveIndex);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
#include "common/os_utils.h"
|
||||
#include "common/configSys.h"
|
||||
#include "utils/timeStamp.h"
|
||||
#include "utils/StringUtils.h"
|
||||
#include "../../oldmovie.h"
|
||||
#include "../../types.h"
|
||||
|
||||
|
@ -109,6 +110,7 @@ static int mutexLocks = 0;
|
|||
static int mutexPending = 0;
|
||||
static bool emulatorHasMutex = 0;
|
||||
unsigned int emulatorCycleCount = 0;
|
||||
static int archiveFileLoadIndex = -1;
|
||||
|
||||
extern double g_fpsScale;
|
||||
|
||||
|
@ -341,16 +343,6 @@ int LoadGame(const char *path, bool silent, bool netPlayRequested)
|
|||
{
|
||||
fullpath.assign( path );
|
||||
}
|
||||
//#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
||||
//
|
||||
// // Resolve absolute path to file
|
||||
// if ( realpath( path, fullpath ) == NULL )
|
||||
// {
|
||||
// strcpy( fullpath, path );
|
||||
// }
|
||||
//#else
|
||||
// strcpy( fullpath, path );
|
||||
//#endif
|
||||
|
||||
//printf("Fullpath: %zi '%s'\n", sizeof(fullpath), fullpath );
|
||||
|
||||
|
@ -600,12 +592,13 @@ int fceuWrapperHardReset(void)
|
|||
|
||||
if ( GameInfo->archiveFilename )
|
||||
{
|
||||
strcpy( romPath, GameInfo->archiveFilename );
|
||||
Strlcpy( romPath, GameInfo->archiveFilename, sizeof(romPath) );
|
||||
}
|
||||
else if ( GameInfo->filename )
|
||||
{
|
||||
strcpy( romPath, GameInfo->filename );
|
||||
Strlcpy( romPath, GameInfo->filename, sizeof(romPath) );
|
||||
}
|
||||
fceuWrapperSetArchiveFileLoadIndex( GameInfo->archiveIndex );
|
||||
|
||||
if ( romPath[0] != 0 )
|
||||
{
|
||||
|
@ -613,6 +606,7 @@ int fceuWrapperHardReset(void)
|
|||
//printf("Loading: '%s'\n", romPath );
|
||||
LoadGame ( romPath );
|
||||
}
|
||||
fceuWrapperClearArchiveFileLoadIndex();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1739,7 +1733,7 @@ static FCEUFILE* minizip_OpenArchive(ArchiveScanRecord& asr, std::string &fname,
|
|||
|
||||
//printf("Filename: %u '%s' \n", fi.uncompressed_size, filename );
|
||||
|
||||
if (searchFile)
|
||||
if ( (searchFile != nullptr) && !searchFile->empty())
|
||||
{
|
||||
if ( strcmp( searchFile->c_str(), filename ) == 0 )
|
||||
{
|
||||
|
@ -1858,7 +1852,8 @@ static FCEUFILE* libarchive_OpenArchive( ArchiveScanRecord& asr, std::string& fn
|
|||
filename = archive_entry_pathname(entry);
|
||||
fileSize = archive_entry_size(entry);
|
||||
|
||||
if (searchFile)
|
||||
printf("ArchiveFile:%i %s\n", idx, filename);
|
||||
if ( (searchFile != nullptr) && !searchFile->empty())
|
||||
{
|
||||
if (strcmp( filename, searchFile->c_str() ) == 0)
|
||||
{
|
||||
|
@ -1923,6 +1918,16 @@ static FCEUFILE* libarchive_OpenArchive( ArchiveScanRecord& asr, std::string& fn
|
|||
|
||||
#endif
|
||||
|
||||
void fceuWrapperSetArchiveFileLoadIndex(int idx)
|
||||
{
|
||||
archiveFileLoadIndex = idx;
|
||||
}
|
||||
|
||||
void fceuWrapperClearArchiveFileLoadIndex()
|
||||
{
|
||||
archiveFileLoadIndex = -1;
|
||||
}
|
||||
|
||||
FCEUFILE* FCEUD_OpenArchive(ArchiveScanRecord& asr, std::string& fname, std::string* innerFilename, int* userCancel)
|
||||
{
|
||||
FCEUFILE* fp = nullptr;
|
||||
|
@ -1940,6 +1945,7 @@ FCEUFILE* FCEUD_OpenArchive(ArchiveScanRecord& asr, std::string& fname, std::str
|
|||
{
|
||||
char base[512], suffix[128];
|
||||
|
||||
//printf("File:%zi %s\n", i, asr.files[i].name.c_str() );
|
||||
getFileBaseName( asr.files[i].name.c_str(), base, suffix );
|
||||
|
||||
if ( (strcasecmp( suffix, ".nes" ) == 0) ||
|
||||
|
@ -1954,7 +1960,11 @@ FCEUFILE* FCEUD_OpenArchive(ArchiveScanRecord& asr, std::string& fname, std::str
|
|||
|
||||
if ( fileList.size() > 1 )
|
||||
{
|
||||
if ( consoleWindow != NULL )
|
||||
if ( (archiveFileLoadIndex >= 0) && (static_cast<size_t>(archiveFileLoadIndex) < asr.files.size()))
|
||||
{
|
||||
searchFile.clear();
|
||||
}
|
||||
else if ( consoleWindow != NULL )
|
||||
{
|
||||
int sel = consoleWindow->showListSelectDialog( "Select ROM From Archive", fileList );
|
||||
|
||||
|
@ -1973,16 +1983,18 @@ FCEUFILE* FCEUD_OpenArchive(ArchiveScanRecord& asr, std::string& fname, std::str
|
|||
{
|
||||
searchFile = fileList[0];
|
||||
}
|
||||
//printf("Archive Search File: %s\n", searchFile.c_str());
|
||||
}
|
||||
|
||||
#ifdef _USE_LIBARCHIVE
|
||||
fp = libarchive_OpenArchive(asr, fname, &searchFile, -1 );
|
||||
fp = libarchive_OpenArchive(asr, fname, &searchFile, archiveFileLoadIndex );
|
||||
#endif
|
||||
|
||||
if (fp == nullptr)
|
||||
{
|
||||
fp = minizip_OpenArchive(asr, fname, &searchFile, -1 );
|
||||
fp = minizip_OpenArchive(asr, fname, &searchFile, archiveFileLoadIndex );
|
||||
}
|
||||
//printf("Archive File Index: %i\n", fp->archiveIndex);
|
||||
return fp;
|
||||
}
|
||||
|
||||
|
|
|
@ -48,6 +48,8 @@ int fceuWrapperHardReset(void);
|
|||
int fceuWrapperTogglePause(void);
|
||||
bool fceuWrapperGameLoaded(void);
|
||||
void fceuWrapperRequestAppExit(void);
|
||||
void fceuWrapperClearArchiveFileLoadIndex(void);
|
||||
void fceuWrapperSetArchiveFileLoadIndex(int idx);
|
||||
|
||||
class fceuCriticalSection
|
||||
{
|
||||
|
|
|
@ -483,6 +483,7 @@ FCEUGI *FCEUI_LoadGameVirtual(const char *name, int OverwriteVidMode, bool silen
|
|||
if (fp->archiveFilename != "")
|
||||
GameInfo->archiveFilename = strdup(fp->archiveFilename.c_str());
|
||||
GameInfo->archiveCount = fp->archiveCount;
|
||||
GameInfo->archiveIndex = fp->archiveIndex;
|
||||
|
||||
GameInfo->soundchan = 0;
|
||||
GameInfo->soundrate = 0;
|
||||
|
|
|
@ -173,7 +173,8 @@ struct FCEUGI
|
|||
|
||||
char* filename = nullptr;
|
||||
char* archiveFilename = nullptr;
|
||||
int archiveCount = 0;
|
||||
int archiveCount = 0; // the number of files that were in the archive
|
||||
int archiveIndex = -1; // the index of the file within the archive
|
||||
bool loadedFromTmpFile = false; // Was loaded from temporary file, file most likely no longer exists
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue