Files
BinaryObjectScanner/BinaryObjectScanner/FileType/GCF.cs
HeroponRikiBestest 8ca25c6370 Update GCF output string for encrypted GCFs (#417)
* Update GCF output string for encrypted GCFs

* Use Array.Exists since some early GCFs have only some files encrypted
2026-06-26 20:45:18 -04:00

37 lines
1.6 KiB
C#

using System;
using System.IO;
namespace BinaryObjectScanner.FileType
{
/// <summary>
/// Game Cache File (GCF)
/// </summary>
public class GCF : DetectableBase<SabreTools.Wrappers.GCF>
{
/// <inheritdoc/>
public GCF(SabreTools.Wrappers.GCF wrapper) : base(wrapper) { }
/// <inheritdoc/>
public override string? Detect(Stream stream, string file, bool includeDebug)
{
// Filename is worth reporting, since it's descriptive and has to match the Steam2 CDN in order to work.
string fileName = Path.GetFileName(file);
uint depotId = _wrapper.Model.Header.CacheID;
uint depotVersion = _wrapper.Model.Header.LastVersionPlayed;
// While there is a depot-level encrypted flag on the GCF, it's unfortunately completely unreliable.
// Technically speaking, there are some known GCFs that only have some files encrypted. HL2 discs from
// 2004 have several GCFs like this, one being base_source_engine.gcf (depot 200). Thus, it's necessary
// to iterate all file info to check if any files are encrypted
bool encrypted = false;
if (_wrapper.Files != null && _wrapper.Files.Length > 0)
encrypted = Array.Exists(_wrapper.Files, fileInfo => fileInfo.Encrypted);
// Only note encryption status if the GCF is encrypted
string encryptedString = encrypted ? ", encrypted" : "";
string returnString = $"{fileName} - {depotId} (v{depotVersion}{encryptedString})";
return returnString;
}
}
}