Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Public/Serialization/FilePackageWriterUtil.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

75 lines
2.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "IO/IoChunkId.h"
#include "Memory/CompositeBuffer.h"
#include "Memory/SharedBuffer.h"
#include "Serialization/PackageWriterToSharedBuffer.h"
/**
* Class containing functions to save cooked packages in separate .uasset,.uexp,.ubulk files.
*/
class FFilePackageWriterUtil
{
public:
/** Version of the superclass's per-package record that includes our class-specific data. */
struct FRecord : public FPackageWriterRecords::FPackage
{
bool bCompletedExportsArchiveForDiff = false;
};
struct FWritePackageParameters
{
FRecord& Record;
const IPackageWriter::FCommitPackageInfo& Info;
UE::PackageWriter::Private::ICookerInterface* Cooker = nullptr;
TMap<FName, TRefCountPtr<FPackageHashes>>* AllPackageHashes = nullptr;
FCriticalSection* PackageHashesLock = nullptr;
bool bProvidePerPackageResult = false;
UE_DEPRECATED(5.7, "Use constructor that takes only the non-null parameters, and set other parameters individually.")
FWritePackageParameters(FRecord& InRecord,
const IPackageWriter::FCommitPackageInfo& InInfo,
TMap<FName, TRefCountPtr<FPackageHashes>>* InAllPackageHashes,
FCriticalSection* InPackageHashesLock,
bool bInProvidePerPackageResult);
FWritePackageParameters(FRecord& InRecord,
const IPackageWriter::FCommitPackageInfo& InInfo);
};
static void WritePackage(FWritePackageParameters& Parameters);
private:
/** Buffers that are combined into the HeaderAndExports file (which is then split into .uasset + .uexp or .uoasset + .uoexp). */
struct FExportBuffer
{
FSharedBuffer Buffer;
TArray<FFileRegion> Regions;
};
/** Stack data for the helper functions of CommitPackageInternal. */
struct FCommitContext
{
const IPackageWriter::FCommitPackageInfo& Info;
TArray<TArray<FExportBuffer>> ExportsBuffers;
TArray<UE::PackageWriter::Private::FWriteFileData> OutputFiles;
UE::PackageWriter::Private::ICookerInterface* Cooker = nullptr;
};
static void AsyncSave(FWritePackageParameters& Parameters);
static void CollectForSavePackageData(FRecord& Record, FCommitContext& Context);
static void CollectForSaveBulkData(FRecord& Record, FCommitContext& Context);
static void CollectForSaveLinkerAdditionalDataRecords(FRecord& Record, FCommitContext& Context);
static void CollectForSaveAdditionalFileRecords(FRecord& Record, FCommitContext& Context);
static void CollectForSaveExportsFooter(FRecord& Record, FCommitContext& Context);
static void CollectForSaveExportsPackageTrailer(FRecord& Record, FCommitContext& Context);
static void CollectForSaveExportsBuffers(FRecord& Record, FCommitContext& Context);
static void AsyncSaveOutputFiles(FCommitContext& Context,
TMap<FName,TRefCountPtr<FPackageHashes>>* AllPackageHashes, FCriticalSection* PackageHashesLock,
bool bProvidePerPackageResult);
};