MetaforceInstaller/MetaforceInstaller.Core/Services/ZipScrapper.cs

118 lines
No EOL
4.4 KiB
C#

using System.IO.Compression;
using MetaforceInstaller.Core.Models;
namespace MetaforceInstaller.Core.Services;
public class ZipScrapper
{
public static InstallationParts PeekFiles(ZipArchive archive)
{
return new InstallationParts
{
AndroidContentPath = DoesAndroidContentExists(archive),
OculusClientPath = DoesOculusClientExists(archive),
PicoClientPath = DoesPicoClientExists(archive),
AndroidAdminPath = DoesAndroidAdminExists(archive),
WindowsAdminPath = DoesPcAdminExists(archive),
WindowsContentPath = DoesWindowsContentExists(archive),
WindowsServerPath = DoesServerExists(archive),
};
// Console.WriteLine($"Contents of {archive}:");
// Console.WriteLine("----------------------------------");
//
// foreach (ZipArchiveEntry entry in archive.Entries)
// {
// // You can access properties like entry.Name, entry.FullName, entry.Length (uncompressed size), entry.CompressedLength
// Console.WriteLine($"Entry: {entry.FullName}");
// Console.WriteLine($" Uncompressed Size: {entry.Length} bytes");
// Console.WriteLine($" Compressed Size: {entry.CompressedLength} bytes");
// Console.WriteLine("----------------------------------");
// }
}
public static string ExtractZip(ZipArchive archive, string outputPath, IProgress<double>? progress = null)
{
var entries = archive.Entries.Where(e => !string.IsNullOrEmpty(e.Name)).ToList();
var totalEntries = entries.Count;
var processedEntries = 0;
foreach (var entry in entries)
{
var destinationPath = Path.Combine(outputPath, entry.FullName);
var destinationDir = Path.GetDirectoryName(destinationPath);
if (!string.IsNullOrEmpty(destinationDir))
{
Directory.CreateDirectory(destinationDir);
Console.WriteLine($"Extracting {entry.FullName} to {destinationPath}");
}
entry.ExtractToFile(destinationPath, overwrite: true);
processedEntries++;
progress?.Report((double)processedEntries / totalEntries * 100);
}
return outputPath;
}
private static string? DoesPicoClientExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.Name.Contains("MetaforcePico")
&& entry.Name.EndsWith(".apk"));
return entry?.FullName;
}
private static string? DoesOculusClientExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.Name.Contains("MetaforceOculus")
&& entry.Name.EndsWith(".apk"));
return entry?.FullName;
}
private static string? DoesAndroidAdminExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.Name.Contains("MetaforceAdmin")
&& entry.Name.EndsWith(".apk"));
return entry?.FullName;
}
private static string? DoesAndroidContentExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.Name.Contains("Content_Android")
&& entry.Name.EndsWith(".zip"));
return entry?.FullName;
}
private static string? DoesWindowsContentExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.Name.Contains("Content_StandaloneWindows")
&& entry.Name.EndsWith(".zip"));
return entry?.FullName;
}
private static string? DoesPcAdminExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.FullName.Contains("MetaforceAdminPC") &&
entry.Name.EndsWith(".exe")
&& !entry.Name.Contains("UnityCrashHandler") &&
!entry.Name.Contains("crashpad_handler"));
return entry?.FullName;
}
private static string? DoesServerExists(ZipArchive archive)
{
var entry = archive.Entries.FirstOrDefault(entry =>
entry.FullName.Contains("MetaforceServer") &&
entry.Name.EndsWith(".exe")
&& !entry.Name.Contains("UnityCrashHandler") &&
!entry.Name.Contains("crashpad_handler"));
return entry?.FullName;
}
}