avalonia-port #3

Merged
waffle.lord merged 10 commits from avalonia-port into main 2021-12-25 20:26:58 -05:00
Showing only changes of commit d54a41ca9d - Show all commits

View File

@ -22,6 +22,10 @@ namespace PatcherUtils
private List<LineItem> AdditionalInfo = new List<LineItem>(); private List<LineItem> AdditionalInfo = new List<LineItem>();
/// <summary>
/// Reports patch creation or application progress
/// </summary>
/// <remarks>Includes an array of <see cref="LineItem"/> with details for each type of patch</remarks>
public event ProgressChangedHandler ProgressChanged; public event ProgressChangedHandler ProgressChanged;
protected virtual void RaiseProgressChanged(int progress, int total, string Message = "", params LineItem[] AdditionalLineItems) protected virtual void RaiseProgressChanged(int progress, int total, string Message = "", params LineItem[] AdditionalLineItems)
@ -31,6 +35,13 @@ namespace PatcherUtils
ProgressChanged?.Invoke(this, progress, total, percent, Message, AdditionalLineItems); ProgressChanged?.Invoke(this, progress, total, percent, Message, AdditionalLineItems);
} }
/// <summary>
/// A helper class to create and apply patches to folders
/// </summary>
/// <param name="SourceFolder">The directory that will have patches applied to it.</param>
/// <param name="TargetFolder">The directory to compare against during patch creation.</param>
/// <param name="DeltaFolder">The directory where the patches are/will be located.</param>
/// <remarks><paramref name="TargetFolder"/> can be null if you only plan to apply patches.</remarks>
public PatchHelper(string SourceFolder, string TargetFolder, string DeltaFolder) public PatchHelper(string SourceFolder, string TargetFolder, string DeltaFolder)
{ {
this.SourceFolder = SourceFolder; this.SourceFolder = SourceFolder;
@ -38,11 +49,24 @@ namespace PatcherUtils
this.DeltaFolder = DeltaFolder; this.DeltaFolder = DeltaFolder;
} }
/// <summary>
/// Get the delta folder file path.
/// </summary>
/// <param name="SourceFilePath"></param>
/// <param name="SourceFolderPath"></param>
/// <param name="FileExtension">The extension to append to the file</param>
/// <returns>A file path inside the delta folder</returns>
private string GetDeltaPath(string SourceFilePath, string SourceFolderPath, string FileExtension) private string GetDeltaPath(string SourceFilePath, string SourceFolderPath, string FileExtension)
{ {
return Path.Join(DeltaFolder, $"{SourceFilePath.Replace(SourceFolderPath, "")}.{FileExtension}"); return Path.Join(DeltaFolder, $"{SourceFilePath.Replace(SourceFolderPath, "")}.{FileExtension}");
} }
/// <summary>
/// Check if two files have the same MD5 hash
/// </summary>
/// <param name="SourceFilePath"></param>
/// <param name="TargetFilePath"></param>
/// <returns>True if the hashes match</returns>
private bool CompareFileHashes(string SourceFilePath, string TargetFilePath) private bool CompareFileHashes(string SourceFilePath, string TargetFilePath)
{ {
using (MD5 md5Service = MD5.Create()) using (MD5 md5Service = MD5.Create())
@ -56,6 +80,11 @@ namespace PatcherUtils
} }
} }
/// <summary>
/// Apply a delta to a file using xdelta
/// </summary>
/// <param name="SourceFilePath"></param>
/// <param name="DeltaFilePath"></param>
private void ApplyDelta(string SourceFilePath, string DeltaFilePath) private void ApplyDelta(string SourceFilePath, string DeltaFilePath)
{ {
string decodedPath = SourceFilePath + ".decoded"; string decodedPath = SourceFilePath + ".decoded";
@ -75,6 +104,12 @@ namespace PatcherUtils
} }
} }
/// <summary>
/// Create a .delta file using xdelta
/// </summary>
/// <param name="SourceFilePath"></param>
/// <param name="TargetFilePath"></param>
/// <remarks>Used to patch an existing file with xdelta</remarks>
private void CreateDelta(string SourceFilePath, string TargetFilePath) private void CreateDelta(string SourceFilePath, string TargetFilePath)
{ {
FileInfo sourceFileInfo = new FileInfo(SourceFilePath); FileInfo sourceFileInfo = new FileInfo(SourceFilePath);
@ -94,6 +129,11 @@ namespace PatcherUtils
.WaitForExit(); .WaitForExit();
} }
/// <summary>
/// Create a .del file
/// </summary>
/// <param name="SourceFile"></param>
/// <remarks>Used to mark a file for deletion</remarks>
private void CreateDelFile(string SourceFile) private void CreateDelFile(string SourceFile)
{ {
FileInfo sourceFileInfo = new FileInfo(SourceFile); FileInfo sourceFileInfo = new FileInfo(SourceFile);
@ -105,6 +145,11 @@ namespace PatcherUtils
File.Create(deltaPath); File.Create(deltaPath);
} }
/// <summary>
/// Create a .new file
/// </summary>
/// <param name="TargetFile"></param>
/// <remarks>Used to mark a file that needs to be added</remarks>
private void CreateNewFile(string TargetFile) private void CreateNewFile(string TargetFile)
{ {
FileInfo targetSourceInfo = new FileInfo(TargetFile); FileInfo targetSourceInfo = new FileInfo(TargetFile);
@ -116,6 +161,11 @@ namespace PatcherUtils
targetSourceInfo.CopyTo(deltaPath, true); targetSourceInfo.CopyTo(deltaPath, true);
} }
/// <summary>
/// Generate a full set of patches using the source and target folders specified during contruction./>
/// </summary>
/// <returns></returns>
/// <remarks>Patches are created in the delta folder specified during contruction</remarks>
public bool GeneratePatches() public bool GeneratePatches()
{ {
//get all directory information needed //get all directory information needed
@ -162,7 +212,7 @@ namespace PatcherUtils
} }
//if a matching source file was found, check the file hashes and get the delta. //if a matching source file was found, check the file hashes and get the delta.
if(CompareFileHashes(sourceFile.FullName, targetFile.FullName)) if(!CompareFileHashes(sourceFile.FullName, targetFile.FullName))
{ {
CreateDelta(sourceFile.FullName, targetFile.FullName); CreateDelta(sourceFile.FullName, targetFile.FullName);
deltaCount++; deltaCount++;
@ -199,6 +249,10 @@ namespace PatcherUtils
return true; return true;
} }
/// <summary>
/// Apply a set of patches using the source and delta folders specified during construction.
/// </summary>
/// <returns></returns>
public string ApplyPatches() public string ApplyPatches()
{ {
//get needed directory information //get needed directory information