/** * Identifies and loads a bootable file * @param filename String filename of bootable file * @return ResultStatus result of function */ ResultStatus LoadFile(const std::string& filename) { INFO_LOG(LOADER, "Loading file %s...", filename.c_str()); switch (IdentifyFile(filename)) { // Standard ELF file format... case FileType::ELF: { return AppLoader_ELF(filename).Load(); } // NCCH/NCSD container formats... case FileType::CXI: case FileType::CCI: { return AppLoader_NCCH(filename).Load(); } // Error occurred durring IdentifyFile... case FileType::Error: // IdentifyFile could know identify file type... case FileType::Unknown: default: return ResultStatus::ErrorInvalidFormat; } return ResultStatus::Error; }
ResultStatus LoadFile(const std::string& filename) { std::unique_ptr<FileUtil::IOFile> file(new FileUtil::IOFile(filename, "rb")); if (!file->IsOpen()) { LOG_ERROR(Loader, "Failed to load file %s", filename.c_str()); return ResultStatus::Error; } std::string filename_filename, filename_extension; Common::SplitPath(filename, nullptr, &filename_filename, &filename_extension); FileType type = IdentifyFile(*file); FileType filename_type = GuessFromExtension(filename_extension); if (type != filename_type) { LOG_WARNING(Loader, "File %s has a different type than its extension.", filename.c_str()); if (FileType::Unknown == type) type = filename_type; } LOG_INFO(Loader, "Loading file %s as %s...", filename.c_str(), GetFileTypeString(type)); switch (type) { //3DSX file format... case FileType::THREEDSX: return AppLoader_THREEDSX(std::move(file), filename_filename).Load(); // Standard ELF file format... case FileType::ELF: return AppLoader_ELF(std::move(file), filename_filename).Load(); // NCCH/NCSD container formats... case FileType::CXI: case FileType::CCI: { AppLoader_NCCH app_loader(std::move(file), filename); // Load application and RomFS if (ResultStatus::Success == app_loader.Load()) { Service::FS::RegisterArchiveType(Common::make_unique<FileSys::ArchiveFactory_RomFS>(app_loader), Service::FS::ArchiveIdCode::RomFS); return ResultStatus::Success; } break; } // Error occurred durring IdentifyFile... case FileType::Error: // IdentifyFile could know identify file type... case FileType::Unknown: { LOG_CRITICAL(Loader, "File %s is of unknown type.", filename.c_str()); return ResultStatus::ErrorInvalidFormat; } } return ResultStatus::Error; }