int ps2_fclose(FILE *stream) { Ps2File *file = (Ps2File*)stream; if (file->_cacheId > 0) { // this is a file on the CD, could be smart to cache it FioHandleCache *newHandle = new FioHandleCache; newHandle->file = file; file->seek(0, SEEK_SET); WaitSema(cacheListSema); if (!cacheListEnd) { assert(!cacheListStart); newHandle->prev = newHandle->next = NULL; cacheListEnd = cacheListStart = newHandle; } else { assert(cacheListStart); newHandle->prev = NULL; newHandle->next = cacheListStart; cacheListStart->prev = newHandle; cacheListStart = newHandle; } cacheListLen++; checkCacheListLen(); SignalSema(cacheListSema); } else { openFileCount--; delete file; } return 0; }
PS2FileStream *PS2FileStream::makeFromPath(const Common::String &path, bool writeMode) { Ps2File *file = new Ps2File(); int mode = writeMode ? (O_WRONLY | O_CREAT) : O_RDONLY; if (file->open(path.c_str(), mode)) return new PS2FileStream(file); delete file; return 0; }
FILE *ps2_fopen(const char *fname, const char *mode) { if (cacheListSema == -1) { ee_sema_t newSema; newSema.init_count = 1; newSema.max_count = 1; cacheListSema = CreateSema(&newSema); assert(cacheListSema >= 0); } printf("ps2_fopen: %s, %s\n", fname, mode); if (!checkedPath && g_engine) { // are we playing from cd/dvd? const char *gameDataPath = ConfMan.get("path").c_str(); printf("Read TOC dir: %s\n", gameDataPath); if (strncmp(gameDataPath, "cdfs:", 5) != 0) driveStop(); // no, we aren't. stop the drive. it's noisy. // now cache the dir tree tocManager.readEntries(gameDataPath); checkedPath = true; } if (((mode[0] != 'r') && (mode[0] != 'w')) || ((mode[1] != '\0') && (mode[1] != 'b'))) { printf("unsupported mode \"%s\" for file \"%s\"\n", mode, fname); return NULL; } bool rdOnly = (mode[0] == 'r'); int64 cacheId = -1; if (rdOnly && tocManager.haveEntries()) cacheId = tocManager.fileExists(fname); if (cacheId != 0) { Ps2File *file = findInCache(cacheId); if (file) return (FILE*)file; if (rdOnly) { bool isAudioFile = strstr(fname, ".bun") || strstr(fname, ".BUN") || strstr(fname, ".Bun"); file = new Ps2ReadFile(cacheId, isAudioFile); } else file = new Ps2WriteFile(cacheId); if (file->open(fname)) { openFileCount++; return (FILE*)file; } else delete file; } return NULL; }
FILE *ps2_fopen(const char *fname, const char *mode) { Ps2File *file = new Ps2File(); int _mode = O_RDONLY; dbg_printf("fopen(%s, %s)\n", fname, mode); if (mode[0] == 'r' && mode [1] == 'w') _mode = O_RDWR; else if (mode[0] == 'w') _mode = O_WRONLY | O_CREAT; else if (mode[0] == 'a') _mode = O_RDWR | O_CREAT | O_APPEND; if (file->open(fname, _mode)) return (FILE *)file; delete file; return NULL; }