Skip to content

Commit

Permalink
Merge pull request #129 from Settlers4Modding/feature/correcing-insta…
Browse files Browse the repository at this point in the history
…llation-bugs

Fix bugs
  • Loading branch information
XanatosX authored Feb 11, 2021
2 parents 713ec86 + 0952d37 commit 133ffcd
Showing 1 changed file with 129 additions and 22 deletions.
151 changes: 129 additions & 22 deletions src/CommunityLauncherPatcher/Program.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Threading;

namespace CommunityLauncherPatcher
Expand All @@ -11,59 +13,82 @@ namespace CommunityLauncherPatcher
/// </summary>
class Program
{
/// <summary>
/// The explicit files to ignore for deletion
/// </summary>
private static HashSet<string> ignoreDeleteFilesStarts;

/// <summary>
/// Writer to use for logging
/// </summary>
private static StreamWriter writer;

/// <summary>
/// Main method
/// </summary>
/// <param name="args">Argument srequired for patching</param>
static void Main(string[] args)
{
if (args.Length != 5)
{
Console.WriteLine("Seems like some parameters are wrong upgrade did not work, please restart the launcher");
Console.WriteLine("Press any key to close this window");
LogLine("Seems like some parameters are wrong upgrade did not work, please restart the launcher");
LogLine("Press any key to close this window", false);
Console.ReadLine();
return;
}

ignoreDeleteFilesStarts = new HashSet<string>();
ignoreDeleteFilesStarts.Add("unins");

string logFile = Path.GetTempPath();
logFile = Path.Combine(logFile, DateTime.Now.ToString("yyyyMMdd_HHmmss") + " _launcherUpdate.log");
writer = new StreamWriter(logFile);

string caller = args[0];
string callerId = args[1];
string sourceFile = args[2];
string targetFolder = args[3];
string fileToIgnore = args[4];

Console.WriteLine("Caller: " + caller);
Console.WriteLine("callerId: " + callerId);
Console.WriteLine("sourceFile: " + sourceFile);
Console.WriteLine("targetFolder: " + targetFolder);
Console.WriteLine("fileToIgnore: " + fileToIgnore);
LogLine("Caller: " + caller);
LogLine("callerId: " + callerId);
LogLine("sourceFile: " + sourceFile);
LogLine("targetFolder: " + targetFolder);
LogLine("fileToIgnore: " + fileToIgnore);
int processId = -1;
int.TryParse(callerId, out processId);

if (!File.Exists(sourceFile) || !File.Exists(caller))
{
Console.WriteLine("Launcher (caller) or patch file not available, please restart the launcher!");
Console.WriteLine("Press any key to close this window");
LogLine("Launcher (caller) or patch file not available, please restart the launcher!");
LogLine("Press any key to close this window", false);
writer.Close();
Console.ReadLine();
}

try
{
Process mainWindow = Process.GetProcessById(processId);
Console.WriteLine("Waiting for max 10 seconds for caller to close");
LogLine("Waiting for max 10 seconds for caller to close", false);
mainWindow?.WaitForExit(10000);
}
catch (Exception)
{
Console.WriteLine("Application already stopped");
LogLine("Application already stopped", false);
}
DirectoryInfo directoryInfo = null;
if (Directory.Exists(targetFolder))
{
directoryInfo = new DirectoryInfo(targetFolder);
}
Console.WriteLine("Waiting 2 seconds to be sure");
LogLine("Waiting 2 seconds to be sure", false);
Thread.Sleep(2000);
Console.WriteLine("Ready to patch");
LogLine("Ready to patch");
PatchLauncher(sourceFile, fileToIgnore, directoryInfo);
Console.WriteLine("Restarting patcher:" + caller);
LogLine("Restarting launcher: " + caller);
Process.Start(caller);
Console.WriteLine("Done closing in 10 seconds");
LogLine("Done closing in 10 seconds");
writer.Close();
Thread.Sleep(10000);
}

Expand All @@ -75,41 +100,123 @@ static void Main(string[] args)
/// <param name="targetFolder">The target to unzip the content to</param>
private static void PatchLauncher(string zipArchive, string fileToIgnore, DirectoryInfo targetFolder)
{
List<string> currentFiles = GetInstallFolderFiles(targetFolder.FullName);
bool extractionCompleted = true;
using (ZipArchive archive = ZipFile.OpenRead(zipArchive))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (entry.Name == fileToIgnore)
{
Console.WriteLine("Ignore file " + fileToIgnore);
LogLine("Ignore file \"" + fileToIgnore + "\"");
continue;
}
string targetFile = Path.Combine(targetFolder.FullName, entry.FullName);
targetFile = Path.GetFullPath(targetFile);
FileInfo fileInfo = new FileInfo(targetFile);
if (!fileInfo.DirectoryName.StartsWith(targetFolder.FullName))
{
Console.WriteLine("Tried to extract file to wrong directory! Extraction of file canceled!");
Console.WriteLine("Filename: " + targetFile);
LogLine("Tried to extract file to wrong directory! Extraction of file canceled!");
LogLine("Filename: " + targetFile);
Thread.Sleep(1000);
continue;
}
Console.WriteLine("Extracts file " + entry.FullName + " to " + targetFile);
if (!Directory.Exists(fileInfo.DirectoryName))
{
LogLine("Creating missing directory: " + fileInfo.DirectoryName);
Directory.CreateDirectory(fileInfo.DirectoryName);
}
LogLine("Extracts file \"" + entry.FullName + "\" to \"" + targetFile + "\"");
try
{
if (entry.Name == string.Empty)
{
Console.WriteLine("Folder " + entry.FullName + " ignoring!");
LogLine("Folder \"" + entry.FullName + "\" ignoring!");
continue;
}
entry.ExtractToFile(targetFile, true);
currentFiles.Remove(targetFile);
}
catch (Exception ex)
{
Console.WriteLine("Something went wrong, aborting");
Console.WriteLine(ex.Message);
LogLine("Something went wrong, aborting");
LogLine(ex.Message);
extractionCompleted = false;
writer.Close();
break;
}
}
if (extractionCompleted)
{
foreach(string file in currentFiles)
{
bool ignoreFile = false;

FileInfo info = new FileInfo(file);
foreach (string start in ignoreDeleteFilesStarts)
{
if (info.Name.StartsWith(start))
{
ignoreFile = true;
break;
}
}
if (ignoreFile)
{
continue;
}
if (info.DirectoryName.StartsWith(targetFolder.FullName) && File.Exists(info.FullName))
{
LogLine("Delete additional file: " + info.FullName);
File.Delete(info.FullName);
}
}
}
}
}

/// <summary>
/// Get all the files in the installation folder
/// </summary>
/// <param name="root">The folder to use as root</param>
/// <returns>A list with all the files in the installation folder</returns>
private static List<string> GetInstallFolderFiles(string root)
{
List<string> returnFiles = new List<string>();
if (!Directory.Exists(root))
{
return returnFiles;
}

returnFiles = Directory.GetFiles(root).ToList();
foreach(string directory in Directory.GetDirectories(root))
{
returnFiles.AddRange(GetInstallFolderFiles(directory));
}

return returnFiles;
}

/// <summary>
/// Write the current log line
/// </summary>
/// <param name="logline">The line to write</param>
private static void LogLine(string logline)
{
LogLine(logline, true);
}

/// <summary>
/// Write the current line to the log
/// </summary>
/// <param name="logline">The logline to write</param>
/// <param name="writeToFile">Should be written to the file</param>
private static void LogLine(string logline, bool writeToFile)
{
Console.WriteLine(logline);
if (writeToFile && writer.BaseStream != null)
{
writer?.WriteLine(logline);
}
}
}
Expand Down

0 comments on commit 133ffcd

Please sign in to comment.