bool TestParseLBN() { const char *validStrings[] = { "/sce_lbn0x5fa0_size0x1428", "/sce_lbn7050_sizeee850", "/sce_lbn0x5eeeh_size0x234x", // Check for trailing chars. See #7960. "/sce_lbneee__size434.", // Check for trailing chars. See #7960. }; int expectedResults[][2] = { {0x5fa0, 0x1428}, {0x7050, 0xee850}, {0x5eee, 0x234}, {0xeee, 0x434}, }; const char *invalidStrings[] = { "/sce_lbn0x5fa0_sze0x1428", "", "//", }; for (int i = 0; i < ARRAY_SIZE(validStrings); i++) { u32 startSector = 0, readSize = 0; // printf("testing %s\n", validStrings[i]); EXPECT_TRUE(parseLBN(validStrings[i], &startSector, &readSize)); EXPECT_EQ_INT(startSector, expectedResults[i][0]); EXPECT_EQ_INT(readSize, expectedResults[i][1]); } for (int i = 0; i < ARRAY_SIZE(invalidStrings); i++) { u32 startSector, readSize; EXPECT_FALSE(parseLBN(invalidStrings[i], &startSector, &readSize)); } return true; }
PSPFileInfo ISOFileSystem::GetFileInfo(std::string filename) { if (filename.compare(0,8,"/sce_lbn") == 0) { u32 sectorStart = 0xFFFFFFFF, readSize = 0xFFFFFFFF; parseLBN(filename, §orStart, &readSize); PSPFileInfo fileInfo; fileInfo.name = filename; fileInfo.exists = true; fileInfo.size = readSize; fileInfo.startSector = sectorStart; fileInfo.isOnSectorSystem = true; fileInfo.numSectors = (readSize + sectorSize - 1) / sectorSize; return fileInfo; } TreeEntry *entry = GetFromPath(filename, false); PSPFileInfo x; if (!entry) { x.size = 0; x.exists = false; } else { x.name = entry->name; x.access = FILEACCESS_READ; x.size = entry->size; x.exists = true; x.type = entry->isDirectory ? FILETYPE_DIRECTORY : FILETYPE_NORMAL; x.isOnSectorSystem = true; x.startSector = entry->startingPosition / 2048; } return x; }
u32 ISOFileSystem::OpenFile(std::string filename, FileAccess access, const char *devicename) { OpenFileEntry entry; entry.isRawSector = false; entry.isBlockSectorMode = false; if (filename.compare(0, 8, "/sce_lbn") == 0) { // Raw sector read. u32 sectorStart = 0xFFFFFFFF, readSize = 0xFFFFFFFF; parseLBN(filename, §orStart, &readSize); if (sectorStart > blockDevice->GetNumBlocks()) { WARN_LOG(FILESYS, "Unable to open raw sector, out of range: %s, sector %08x, max %08x", filename.c_str(), sectorStart, blockDevice->GetNumBlocks()); return 0; } else if (sectorStart == blockDevice->GetNumBlocks()) { ERROR_LOG(FILESYS, "Should not be able to open the block after the last on disc! %08x", sectorStart); } DEBUG_LOG(FILESYS, "Got a raw sector open: %s, sector %08x, size %08x", filename.c_str(), sectorStart, readSize); u32 newHandle = hAlloc->GetNewHandle(); entry.seekPos = 0; entry.file = 0; entry.isRawSector = true; entry.sectorStart = sectorStart; entry.openSize = readSize; // when open as "umd1:/sce_lbn0x0_size0x6B49D200", that mean open umd1 as a block device. // the param in sceIoLseek and sceIoRead is lba mode. we must mark it. if (strncmp(devicename, "umd0:", 5)==0 || strncmp(devicename, "umd1:", 5)==0) entry.isBlockSectorMode = true; entries[newHandle] = entry; return newHandle; } if (access & FILEACCESS_WRITE) { ERROR_LOG(FILESYS, "Can't open file %s with write access on an ISO partition", filename.c_str()); return 0; } // May return entireISO for "umd0:" entry.file = GetFromPath(filename); if (!entry.file){ return 0; } if (entry.file == &entireISO) entry.isBlockSectorMode = true; entry.seekPos = 0; u32 newHandle = hAlloc->GetNewHandle(); entries[newHandle] = entry; return newHandle; }
u32 ISOFileSystem::OpenFile(std::string filename, FileAccess access) { // LBN unittest /* u32 a, b; if (parseLBN("/sce_lbn0x307aa_size0xefffe000", &a, &b)) { ERROR_LOG(FILESYS, "lbn: %08x %08x", a, b); } else { ERROR_LOG(FILESYS, "faillbn: %08x %08x", a, b); }*/ OpenFileEntry entry; if (filename.compare(0,8,"/sce_lbn") == 0) { u32 sectorStart = 0xFFFFFFFF, readSize = 0xFFFFFFFF; parseLBN(filename, §orStart, &readSize); if (sectorStart >= blockDevice->GetNumBlocks()) { WARN_LOG(FILESYS, "Unable to open raw sector: %s, sector %08x, max %08x", filename.c_str(), sectorStart, blockDevice->GetNumBlocks()); return 0; } INFO_LOG(FILESYS, "Got a raw sector open: %s, sector %08x, size %08x", filename.c_str(), sectorStart, readSize); u32 newHandle = hAlloc->GetNewHandle(); entry.seekPos = 0; entry.file = 0; entry.isRawSector = true; entry.sectorStart = sectorStart; entry.openSize = readSize; entries[newHandle] = entry; return newHandle; } entry.isRawSector = false; if (access & FILEACCESS_WRITE) { ERROR_LOG(FILESYS, "Can't open file %s with write access on an ISO partition", filename.c_str()); return 0; } // May return entireISO for "umd0:" entry.file = GetFromPath(filename); if (!entry.file) return 0; entry.seekPos = 0; u32 newHandle = hAlloc->GetNewHandle(); entries[newHandle] = entry; return newHandle; }
PSPFileInfo VirtualDiscFileSystem::GetFileInfo(std::string filename) { PSPFileInfo x; x.name = filename; x.access = FILEACCESS_READ; if (filename.compare(0,8,"/sce_lbn") == 0) { u32 sectorStart = 0xFFFFFFFF, readSize = 0xFFFFFFFF; parseLBN(filename, §orStart, &readSize); PSPFileInfo fileInfo; fileInfo.name = filename; fileInfo.exists = true; fileInfo.size = readSize; fileInfo.startSector = sectorStart; fileInfo.isOnSectorSystem = true; fileInfo.numSectors = (readSize + 2047) / 2048; return fileInfo; } int fileIndex = getFileListIndex(filename); if (fileIndex != -1 && fileList[fileIndex].handler != NULL) { x.type = FILETYPE_NORMAL; x.isOnSectorSystem = true; x.startSector = fileList[fileIndex].firstBlock; HandlerFileHandle temp; if (temp.Open(basePath, filename, FILEACCESS_READ)) { x.exists = true; x.size = temp.Seek(0, FILEMOVE_END); temp.Close(); } // TODO: Probably should include dates or something... return x; } std::string fullName = GetLocalPath(filename); if (! File::Exists(fullName)) { #if HOST_IS_CASE_SENSITIVE if (! FixPathCase(basePath,filename, FPC_FILE_MUST_EXIST)) return x; fullName = GetLocalPath(filename); if (! File::Exists(fullName)) return x; #else return x; #endif } x.type = File::IsDirectory(fullName) ? FILETYPE_DIRECTORY : FILETYPE_NORMAL; x.exists = true; if (fileIndex != -1) { x.isOnSectorSystem = true; x.startSector = fileList[fileIndex].firstBlock; } if (x.type != FILETYPE_DIRECTORY) { struct stat s; stat(fullName.c_str(), &s); x.size = File::GetSize(fullName); x.startSector = fileList[fileIndex].firstBlock; x.numSectors = (x.size+2047)/2048; localtime_r((time_t*)&s.st_atime,&x.atime); localtime_r((time_t*)&s.st_ctime,&x.ctime); localtime_r((time_t*)&s.st_mtime,&x.mtime); } return x; }
u32 VirtualDiscFileSystem::OpenFile(std::string filename, FileAccess access, const char *devicename) { OpenFileEntry entry; entry.curOffset = 0; entry.size = 0; entry.startOffset = 0; if (filename == "") { entry.type = VFILETYPE_ISO; entry.fileIndex = -1; u32 newHandle = hAlloc->GetNewHandle(); entries[newHandle] = entry; return newHandle; } if (filename.compare(0,8,"/sce_lbn") == 0) { u32 sectorStart = 0xFFFFFFFF, readSize = 0xFFFFFFFF; parseLBN(filename, §orStart, &readSize); entry.type = VFILETYPE_LBN; entry.size = readSize; int fileIndex = getFileListIndex(sectorStart,readSize); if (fileIndex == -1) { ERROR_LOG(FILESYS, "VirtualDiscFileSystem: sce_lbn used without calling fileinfo."); return 0; } entry.fileIndex = (u32)fileIndex; entry.startOffset = (sectorStart-fileList[entry.fileIndex].firstBlock)*2048; // now we just need an actual file handle if (fileList[entry.fileIndex].handler != NULL) { entry.handler = fileList[entry.fileIndex].handler; } bool success = entry.Open(basePath, fileList[entry.fileIndex].fileName, FILEACCESS_READ); if (!success) { #ifdef _WIN32 ERROR_LOG(FILESYS, "VirtualDiscFileSystem::OpenFile: FAILED, %i", GetLastError()); #else ERROR_LOG(FILESYS, "VirtualDiscFileSystem::OpenFile: FAILED"); #endif return 0; } // seek to start entry.Seek(entry.startOffset, FILEMOVE_BEGIN); u32 newHandle = hAlloc->GetNewHandle(); entries[newHandle] = entry; return newHandle; } entry.type = VFILETYPE_NORMAL; entry.fileIndex = getFileListIndex(filename); if (entry.fileIndex != (u32)-1 && fileList[entry.fileIndex].handler != NULL) { entry.handler = fileList[entry.fileIndex].handler; } bool success = entry.Open(basePath, filename, access); if (!success) { #ifdef _WIN32 ERROR_LOG(FILESYS, "VirtualDiscFileSystem::OpenFile: FAILED, %i - access = %i", GetLastError(), (int)access); #else ERROR_LOG(FILESYS, "VirtualDiscFileSystem::OpenFile: FAILED, access = %i", (int)access); #endif //wwwwaaaaahh!! return 0; } else { u32 newHandle = hAlloc->GetNewHandle(); entries[newHandle] = entry; return newHandle; } }