bool FPackageReader::OpenPackageFile(const FString& InPackageFilename) { PackageFilename = InPackageFilename; Loader = IFileManager::Get().CreateFileReader( *PackageFilename ); if( Loader == NULL ) { // Couldn't open the file return false; } // Read package file summary from the file *this << PackageFileSummary; // Validate the summary. // Make sure this is indeed a package if( PackageFileSummary.Tag != PACKAGE_FILE_TAG ) { // Unrecognized or malformed package file return false; } // Don't read packages that are too old if( PackageFileSummary.GetFileVersionUE4() < VER_UE4_OLDEST_LOADABLE_PACKAGE ) { return false; } // Don't read packages that were saved with an package version newer than the current one. if( (PackageFileSummary.GetFileVersionUE4() > GPackageFileUE4Version) || (PackageFileSummary.GetFileVersionLicenseeUE4() > GPackageFileLicenseeUE4Version) ) { return false; } // Check serialized custom versions against latest custom versions. const FCustomVersionContainer& LatestCustomVersions = FCustomVersionContainer::GetRegistered(); const FCustomVersionSet& PackageCustomVersions = PackageFileSummary.GetCustomVersionContainer().GetAllVersions(); for (const FCustomVersion& SerializedCustomVersion : PackageCustomVersions) { auto* LatestVersion = LatestCustomVersions.GetVersion(SerializedCustomVersion.Key); if (!LatestVersion || SerializedCustomVersion.Version > LatestVersion->Version) { return false; } } // check if this is a compressed package and decompress header if ( !!(PackageFileSummary.PackageFlags & PKG_StoreCompressed) ) { check(PackageFileSummary.CompressedChunks.Num() > 0); int64 CurPos = Loader->Tell(); if ( !Loader->SetCompressionMap(&PackageFileSummary.CompressedChunks, (ECompressionFlags)PackageFileSummary.CompressionFlags) ) { delete Loader; Loader = new FArchiveAsync(*PackageFilename); check(!Loader->IsError()); verify(Loader->SetCompressionMap(&PackageFileSummary.CompressedChunks, (ECompressionFlags)PackageFileSummary.CompressionFlags)); } Seek(Loader->Tell()); } //make sure the filereader gets the correct version number (it defaults to latest version) SetUE4Ver(PackageFileSummary.GetFileVersionUE4()); SetLicenseeUE4Ver(PackageFileSummary.GetFileVersionLicenseeUE4()); SetEngineVer(PackageFileSummary.SavedByEngineVersion); Loader->SetUE4Ver(PackageFileSummary.GetFileVersionUE4()); Loader->SetLicenseeUE4Ver(PackageFileSummary.GetFileVersionLicenseeUE4()); Loader->SetEngineVer(PackageFileSummary.SavedByEngineVersion); const FCustomVersionContainer& PackageFileSummaryVersions = PackageFileSummary.GetCustomVersionContainer(); SetCustomVersions(PackageFileSummaryVersions); Loader->SetCustomVersions(PackageFileSummaryVersions); return true; }
bool FPackageReader::OpenPackageFile(EOpenPackageResult* OutErrorCode) { auto SetPackageErrorCode = [&](const EOpenPackageResult InErrorCode) { if (OutErrorCode) { *OutErrorCode = InErrorCode; } }; if( Loader == NULL ) { // Couldn't open the file SetPackageErrorCode(EOpenPackageResult::NoLoader); return false; } // Read package file summary from the file *this << PackageFileSummary; // Validate the summary. // Make sure this is indeed a package if( PackageFileSummary.Tag != PACKAGE_FILE_TAG ) { // Unrecognized or malformed package file SetPackageErrorCode(EOpenPackageResult::MalformedTag); return false; } // Don't read packages that are too old if( PackageFileSummary.GetFileVersionUE4() < VER_UE4_OLDEST_LOADABLE_PACKAGE ) { SetPackageErrorCode(EOpenPackageResult::VersionTooOld); return false; } // Don't read packages that were saved with an package version newer than the current one. if( (PackageFileSummary.GetFileVersionUE4() > GPackageFileUE4Version) || (PackageFileSummary.GetFileVersionLicenseeUE4() > GPackageFileLicenseeUE4Version) ) { SetPackageErrorCode(EOpenPackageResult::VersionTooNew); return false; } // Check serialized custom versions against latest custom versions. const FCustomVersionContainer& LatestCustomVersions = FCustomVersionContainer::GetRegistered(); const FCustomVersionSet& PackageCustomVersions = PackageFileSummary.GetCustomVersionContainer().GetAllVersions(); for (const FCustomVersion& SerializedCustomVersion : PackageCustomVersions) { auto* LatestVersion = LatestCustomVersions.GetVersion(SerializedCustomVersion.Key); if (!LatestVersion) { SetPackageErrorCode(EOpenPackageResult::CustomVersionMissing); return false; } else if (SerializedCustomVersion.Version > LatestVersion->Version) { SetPackageErrorCode(EOpenPackageResult::VersionTooNew); return false; } } // check if this is a compressed package and decompress header if ( !!(PackageFileSummary.PackageFlags & PKG_StoreCompressed) ) { #if USE_NEW_ASYNC_IO check(!"Package level compression cannot be used with the async io scheme."); #else check(PackageFileSummary.CompressedChunks.Num() > 0); int64 CurPos = Loader->Tell(); if ( !Loader->SetCompressionMap(&PackageFileSummary.CompressedChunks, (ECompressionFlags)PackageFileSummary.CompressionFlags) ) { delete Loader; Loader = new FArchiveAsync(*PackageFilename); check(!Loader->IsError()); verify(Loader->SetCompressionMap(&PackageFileSummary.CompressedChunks, (ECompressionFlags)PackageFileSummary.CompressionFlags)); } Seek(Loader->Tell()); #endif } //make sure the filereader gets the correct version number (it defaults to latest version) SetUE4Ver(PackageFileSummary.GetFileVersionUE4()); SetLicenseeUE4Ver(PackageFileSummary.GetFileVersionLicenseeUE4()); SetEngineVer(PackageFileSummary.SavedByEngineVersion); Loader->SetUE4Ver(PackageFileSummary.GetFileVersionUE4()); Loader->SetLicenseeUE4Ver(PackageFileSummary.GetFileVersionLicenseeUE4()); Loader->SetEngineVer(PackageFileSummary.SavedByEngineVersion); const FCustomVersionContainer& PackageFileSummaryVersions = PackageFileSummary.GetCustomVersionContainer(); SetCustomVersions(PackageFileSummaryVersions); Loader->SetCustomVersions(PackageFileSummaryVersions); SetPackageErrorCode(EOpenPackageResult::Success); return true; }