Esempio n. 1
0
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;
}