October3d55/M/RuntimeAdd95a179eaf4V8/Source/RuntimeArchiver/Private/ArchiverTar/RuntimeArchiverTarHeader.h

122 lines
2.9 KiB
C
Raw Normal View History

// Georgy Treshchev 2024.
#pragma once
#include "Engine/EngineBaseTypes.h"
#include "Misc/EngineVersionComparison.h"
#include "Misc/CString.h"
// On UE < 5.0, UTF-8 characters are not supported, so we should at least use ANSI characters
#if UE_VERSION_OLDER_THAN(5, 0, 0)
using RA_UTF8CHAR = ANSICHAR;
#else
using RA_UTF8CHAR = UTF8CHAR;
#endif
class FTarChecksumHelper;
struct FRuntimeArchiveEntry;
/**
* Tar header used to denote archived data
*/
struct FTarHeader
{
friend FTarChecksumHelper;
FTarHeader();
private:
/** Entry name */
RA_UTF8CHAR Name[100 / sizeof(RA_UTF8CHAR)];
/** Permission bits */
ANSICHAR Mode[8];
/** Owner user ID (UID) */
ANSICHAR Owner[8];
/** Group ID (GID) */
ANSICHAR Group[8];
/** Size in bytes */
ANSICHAR Size[12];
/** Time of last modification */
ANSICHAR Time[12];
/** Sum of all bytes in the header block */
ANSICHAR Checksum[8];
/** Entry type (e.g. directory or file) */
ANSICHAR TypeFlag;
/** Name of target file name. Not used, but denotes some rarely used entry types */
ANSICHAR LinkName[100];
/** Unused padding */
ANSICHAR Padding[255];
// TODO: Replace Padding with additional fields (Magic, Version, UName, GName, DevMajor, DevMinor, Prefix) for better compatibility
public:
/**
* Convert a tar header to an archive entry
*
* @param Header Tar header to convert from
* @param Index Tar header index
* @param Entry Filled archive entry
* @return Whether the conversion was successful or not
*/
static bool ToEntry(const FTarHeader& Header, int32 Index, FRuntimeArchiveEntry& Entry);
/**
* Convert an archive entry to a tar header
*
* @param Entry Archive entry to convert from
* @param Header Filled tar header
* @return Whether the conversion was successful or not
*/
static bool FromEntry(const FRuntimeArchiveEntry& Entry, FTarHeader& Header);
/**
* Generate tar header based on input
*
* @param Name Entry name
* @param Size Data size
* @param CreationTime Entry creation time
* @param bIsDirectory Whether the entry is a directory or a file
* @param Header Filled tar header
* @return Whether the conversion was successful or not
*/
static bool GenerateHeader(const FString& Name, int64 Size, const FDateTime& CreationTime, bool bIsDirectory, FTarHeader& Header);
//~ Writing and reading tar header data
const RA_UTF8CHAR* GetName() const;
bool SetName(const RA_UTF8CHAR* InName);
uint32 GetMode() const;
void SetMode(uint32 InMode);
uint32 GetOwner() const;
void SetOwner(uint32 InOwner);
const ANSICHAR* GetGroup() const;
bool SetGroup(const ANSICHAR* InGroup);
int64 GetSize() const;
void SetSize(int64 InSize);
int64 GetTime() const;
void SetTime(int64 InTime);
uint32 GetChecksum() const;
void SetChecksum(uint32 InChecksum);
ANSICHAR GetTypeFlag() const;
void SetTypeFlag(ANSICHAR InTypeFlag);
const ANSICHAR* GetLinkName() const;
bool SetLinkName(const ANSICHAR* InLinkName);
};