FAFile* FAfopen(const std::string& filename) { bfs::path path(filename); path.make_preferred(); if(!bfs::exists(filename)) { int nError = ERROR_SUCCESS; if(diabdat == NULL && !SFileOpenArchive(getMPQFileName().c_str(), 0, STREAM_FLAG_READ_ONLY, &diabdat)) nError = GetLastError(); if(nError != ERROR_SUCCESS) { std::cerr << "Failed to open " << DIABDAT_MPQ << std::endl; return NULL; } std::string stormPath = getStormLibPath(path); if(!SFileHasFile(diabdat, stormPath.c_str())) { std::cerr << "File " << path << " not found" << std::endl; return NULL; } FAFile* file = new FAFile(); file->data.mpqFile = malloc(sizeof(HANDLE)); if(!SFileOpenFileEx(diabdat, stormPath.c_str(), 0, (HANDLE*)file->data.mpqFile)) { std::cerr << "Failed to open " << filename << " in " << DIABDAT_MPQ; delete file; return NULL; } file->mode = FAFile::MPQFile; return file; } else { FILE* plainFile = fopen(filename.c_str(), "rb"); if(plainFile == NULL) return NULL; FAFile* file = new FAFile(); file->mode = FAFile::PlainFile; file->data.plainFile.file = plainFile; file->data.plainFile.filename = new std::string(filename); return file; } }
bool exists(const std::string& filename) { bfs::path path(filename); path.make_preferred(); if(bfs::exists(filename)) return true; std::lock_guard<std::mutex> lock(m); std::string stormPath = getStormLibPath(path); return SFileHasFile(diabdat, stormPath.c_str()); }
FAFile* FAfopen(const std::string& filename) { bfs::path path(filename); path.make_preferred(); if(!bfs::exists(filename)) { std::lock_guard<std::mutex> lock(m); std::string stormPath = getStormLibPath(path); if(!SFileHasFile(diabdat, stormPath.c_str())) { std::cerr << "File " << path << " not found" << std::endl; return NULL; } FAFile* file = new FAFile(); file->data.mpqFile = malloc(sizeof(HANDLE)); if(!SFileOpenFileEx(diabdat, stormPath.c_str(), 0, (HANDLE*)file->data.mpqFile)) { std::cerr << "Failed to open " << filename << " in " << DIABDAT_MPQ; delete file; return NULL; } file->mode = FAFile::MPQFile; return file; } else { FILE* plainFile = fopen(filename.c_str(), "rb"); if(plainFile == NULL) return NULL; FAFile* file = new FAFile(); file->mode = FAFile::PlainFile; file->data.plainFile.file = plainFile; file->data.plainFile.filename = new std::string(filename); return file; } }