From: <bal...@us...> - 2003-11-14 22:18:05
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1:/tmp/cvs-serv29945 Added Files: SaveGameIterator.h SaveGameIterator.cpp Log Message: SaveGameIterator class --- NEW FILE: SaveGameIterator.h --- #ifndef SAVEGAMEITERATOR_H #define SAVEGAMEITERATOR_H #include "FileStream.h" class SaveGame { public: SaveGame(char * Path, char * Name, char * prefix, int pCount) { strcpy(Prefix, prefix); strcpy(this->Path, Path); strcpy(this->Name, Name); PortraitCount = pCount; }; ~SaveGame() {}; int GetPortraitCount() { return PortraitCount; }; DataStream * GetPortrait(int index) { if(index > PortraitCount) return NULL; char nPath[_MAX_PATH]; sprintf(nPath, "%s%sPORTRT%d.bmp", Path, SPathDelimiter, index); FileStream * fs = new FileStream(); fs->Open(nPath, true); return fs; }; DataStream * GetScreen() { char nPath[_MAX_PATH]; sprintf(nPath, "%s%s%s.bmp", Path, SPathDelimiter, Prefix); FileStream * fs = new FileStream(); fs->Open(nPath, true); return fs; }; private: char Path[_MAX_PATH]; char Prefix[_MAX_PATH]; char Name[_MAX_PATH]; int PortraitCount; }; class SaveGameIterator { public: SaveGameIterator(void); ~SaveGameIterator(void); int GetSaveGameCount(); SaveGame * GetSaveGame(int index); }; #endif --- NEW FILE: SaveGameIterator.cpp --- #include "SaveGameIterator.h" #ifdef WIN32 #include <io.h> #include <windows.h> #else #include <sys/types.h> #include <dirent.h> #include <fnmatch.h> #include <dlfcn.h> #endif #include "Interface.h" extern Interface * core; SaveGameIterator::SaveGameIterator(void) { } SaveGameIterator::~SaveGameIterator(void) { } int SaveGameIterator::GetSaveGameCount() { #ifdef WIN32 //The windows _findfirst/_findnext functions allow the use of wildcards so we'll use them :) struct _finddata_t c_file; long hFile; #endif int count = 0; char Path[_MAX_PATH]; #ifdef WIN32 sprintf(Path, "%smpsave%s*.*", core->GamePath, SPathDelimiter); if((hFile = _findfirst(Path, &c_file)) == -1L) //If there is no file matching our search return -1; #else sprintf(Path, "%smpsave", core->GamePath); DIR * dir = opendir(path); if(dir == NULL) //If we cannot open the Directory return -1; #endif #ifndef WIN32 //Linux Statement struct dirent * de = readdir(dir); //Lookup the first entry in the Directory if(de == NULL) //If no entry exists just return return; #endif do { //Iterate through all the available modules to load #ifdef WIN32 if(c_file.attrib & _A_SUBDIR) { if(c_file.name[0] == '.') continue; char Name[_MAX_PATH], Text[_MAX_PATH]; int cnt = sscanf(c_file.name, "%*d-%s - %s", Name, Text); #else char dtmp[_MAX_PATH]; struct stat fst; sprintf(dtmp, "%s%s%s", path, SPathDelimiter, de->d_name); stat(dtmp, &fst); if(S_ISDIR(fst.st_mode)) { if(de->d_name[0] == '.') continue; char Name[_MAX_PATH], Text[_MAX_PATH]; int cnt = sscanf(de->d_name, "%*d-%s - %s", Name, Text); #endif if(cnt == 2) { printf("[Name = %s, Text = %s]\n", Name, Text); count++; } if(cnt == 1) { printf("[Name = %s, No Description]\n", Name); count++; } } #ifdef WIN32 } while(_findnext(hFile, &c_file) == 0); _findclose(hFile); #else } while((de = readdir(dir)) != NULL); closedir(dir); //No other files in the directory, close it #endif return count; } SaveGame * SaveGameIterator::GetSaveGame(int index) { #ifdef WIN32 //The windows _findfirst/_findnext functions allow the use of wildcards so we'll use them :) struct _finddata_t c_file; long hFile; #endif int count = -1, prtrt = 0; char Path[_MAX_PATH]; #ifdef WIN32 sprintf(Path, "%smpsave%s*.*", core->GamePath, SPathDelimiter); if((hFile = _findfirst(Path, &c_file)) == -1L) //If there is no file matching our search return NULL; #else sprintf(Path, "%smpsave", core->GamePath); DIR * dir = opendir(path); if(dir == NULL) //If we cannot open the Directory return NULL; #endif #ifndef WIN32 //Linux Statement struct dirent * de = readdir(dir); //Lookup the first entry in the Directory if(de == NULL) //If no entry exists just return return; #endif char Name[_MAX_PATH], Text[_MAX_PATH]; do { //Iterate through all the available modules to load #ifdef WIN32 if(c_file.attrib & _A_SUBDIR) { if(c_file.name[0] == '.') continue; int cnt = sscanf(c_file.name, "%*d-%s - %s", Name, Text); #else char dtmp[_MAX_PATH]; struct stat fst; sprintf(dtmp, "%s%s%s", path, SPathDelimiter, de->d_name); stat(dtmp, &fst); if(S_ISDIR(fst.st_mode)) { if(de->d_name[0] == '.') continue; int cnt = sscanf(de->d_name, "%*d-%s - %s", Name, Text); #endif if(cnt == 2) { printf("[Name = %s, Text = %s]\n", Name, Text); count++; } if(cnt == 1) { printf("[Name = %s, No Description]\n", Name); count++; } if(count == index) { char tmp[_MAX_PATH]; #ifdef WIN32 long file; struct _finddata_t bmpf; sprintf(tmp, "%smpsave%s%s%s*.bmp", core->GamePath, SPathDelimiter, c_file.name, SPathDelimiter); file = _findfirst(tmp, &bmpf); #else sprintf(Path, "%smpsave", core->GamePath); DIR * ndir = opendir(Path); if(ndir == NULL) //If we cannot open the Directory return NULL; #endif #ifndef WIN32 //Linux Statement struct dirent * de = readdir(dir); //Lookup the first entry in the Directory #endif do { #ifdef WIN32 if(strnicmp(bmpf.name, "PORTRT", 6) == 0) #else if(strnicmp(de->d_name, "PORTRT", 6) == 0) #endif prtrt++; #ifdef WIN32 } while(_findnext(file, &bmpf) == 0); _findclose(file); #else } while((de = readdir(ndir)) != NULL); closedir(ndir); //No other files in the directory, close it #endif break; } } #ifdef WIN32 } while(_findnext(hFile, &c_file) == 0); _findclose(hFile); sprintf(Path, "%smpsave%s%s", core->GamePath, SPathDelimiter, c_file.name); #else } while((de = readdir(dir)) != NULL); closedir(dir); //No other files in the directory, close it #endif char Prefix[10]; sscanf(core->INIConfig, "%[^.]", Prefix); SaveGame * sg = new SaveGame(Path, Name, Prefix, prtrt); return sg; } |