Skip to content

Commit

Permalink
Merge pull request #13 from basharast/main
Browse files Browse the repository at this point in the history
FFU update improvements
  • Loading branch information
fadilfadz01 authored Oct 20, 2024
2 parents 76d1cb5 + 7e16ddf commit 0d4cdb2
Show file tree
Hide file tree
Showing 9 changed files with 899 additions and 176 deletions.
172 changes: 129 additions & 43 deletions Universal Updater/DownloadPackages.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ namespace Universal_Updater
class DownloadPackages
{
static Tuple<DateTime, long, long> DownloadingProgress = new Tuple<DateTime, long, long>(DateTime.MinValue, 0, 0);
static string[] installedPackages = Program.useConnectedDevice ? File.ReadAllLines(Program.tempDirectory + @"\InstalledPackages.csv") : new string[] { };
public static string[] installedPackages = new string[] { "Dummy" };
static List<string> filteredPackages = new List<string>();
static bool isFeatureInstalled = false;
static bool filterCBSPackagesOnly = false;
static readonly string[] knownPackages = { "ms_commsenhancementglobal.mainos", "ms_commsmessagingglobal.mainos", "microsoftphonefm.platformmanifest.efiesp", "microsoftphonefm.platformmanifest.mainos", "microsoftphonefm.platformmanifest.updateos", "UserInstallableFM.PlatformManifest" };
static readonly string[] featurePackages = { "MS_RCS_FEATURE_PACK.MainOS.cbsr", "ms_projecta.mainos", "arcadia.services.mainos", "arcadia.drivers.mainos" , "projecta.arcadia.mainos" };
public static FFUEntry FFUMountData = null;
static readonly string[] skippedPackages = { };
static readonly string[] packageCBSExtension = { ".cab", ".cbs_" };
static readonly string[] packageSPKGExtension = { ".spkg", ".spkg_" };
Expand Down Expand Up @@ -81,7 +81,7 @@ public static bool OnlineUpdate(string updateBuild)
return isFeatureInstalled;
}

public static bool OfflineUpdate(string[] folderFiles, string pushFeature)
public static async Task<bool> OfflineUpdate(string[] folderFiles)
{
filterPackages:
filteredPackages.Clear();
Expand Down Expand Up @@ -132,20 +132,17 @@ public static bool OfflineUpdate(string[] folderFiles, string pushFeature)
}

ConsoleKeyInfo packagesFilterAction = default(ConsoleKeyInfo);
if (Program.useConnectedDevice)
// Allow user to push all package if he want
Program.WriteLine("\nFilter packages options: ", ConsoleColor.Blue);
Program.WriteLine("1. Filter packages", ConsoleColor.Green);
Program.WriteLine("2. Include all", ConsoleColor.DarkYellow);
Program.Write("Choice: ", ConsoleColor.Magenta);
do
{
// Allow user to push all package if he want
Program.WriteLine("\nFilter packages options: ", ConsoleColor.Blue);
Program.WriteLine("1. Filter packages", ConsoleColor.Green);
Program.WriteLine("2. Include all", ConsoleColor.DarkYellow);
Program.Write("Choice: ", ConsoleColor.Magenta);
do
{
packagesFilterAction = Console.ReadKey(true);
}
while (packagesFilterAction.KeyChar != '1' && packagesFilterAction.KeyChar != '2');
Program.Write(packagesFilterAction.KeyChar.ToString() + "\n");
packagesFilterAction = Console.ReadKey(true);
}
while (packagesFilterAction.KeyChar != '1' && packagesFilterAction.KeyChar != '2');
Program.Write(packagesFilterAction.KeyChar.ToString() + "\n");

var targetExtensionList = getExtensionsList();
var previewType = "cbs";
Expand All @@ -154,38 +151,71 @@ public static bool OfflineUpdate(string[] folderFiles, string pushFeature)
previewType = "spkg";
}

if (!Program.useConnectedDevice || packagesFilterAction.KeyChar == '1')
if (Program.pushToFFU)
{
Program.WriteLine($"\nFiltering packages (type: {previewType}), please wait...", ConsoleColor.DarkGray);
if (Program.useConnectedDevice)
Program.WriteLine("");
// For FFU we start mount from here
// Mount and fetch FFU info
mountFFUArea:
FFUMountData = await PushPackages.mountFFU(Program.FFUPath);
if (FFUMountData == null)
{
if (PushPackages.showRetryQuestion("Mount FFU failed!, retry?"))
{
goto mountFFUArea;
}
else
{
Program.WriteLine("Couldn't mount target FFU.", ConsoleColor.Red);
return false;
}
}
else
{
Program.appendLog("\n[INSTALLED PACKAGES]\n");
for (int i = 0; i < installedPackages.Length; i++)
getInstalledPackagesArea:
installedPackages = (await GetDeviceInfo.GetInstalledPackagesFromFFU(FFUMountData)).ToArray();
if (installedPackages.Length == 0)
{
for (int j = 0; j < targetExtensionList.Length; j++)
if (PushPackages.showRetryQuestion("Cannot get installed packages!, retry?"))
{
var checkName = installedPackages[i].Split(',')[1] + targetExtensionList[j];
var requiredPackages = folderFiles.Where(k => k.IndexOf(checkName, StringComparison.OrdinalIgnoreCase) >= 0).FirstOrDefault();
if (requiredPackages != null)
{
if (!shouldSkip(requiredPackages))
{
filteredPackages.Add(requiredPackages);
}
}
goto getInstalledPackagesArea;
}
else
{
Program.WriteLine("Couldn't mount target FFU.", ConsoleColor.Red);
return false;
}
Program.appendLog($"{installedPackages[i]}\n");
}
}
else

Program.Write("\nPUSH MODE: ", ConsoleColor.Gray);
Program.WriteLine((PushPackages.useOldTools ? "FFU (SPKG)" : "FFU (CBS)"), (PushPackages.useOldTools ? ConsoleColor.DarkYellow : ConsoleColor.Blue));
}

if (packagesFilterAction.KeyChar == '1')
{
Program.WriteLine($"\nFiltering packages (type: {previewType}), please wait...", ConsoleColor.DarkGray);
Program.appendLog("\n[INSTALLED PACKAGES]\n");
for (int i = 0; i < installedPackages.Length; i++)
{
foreach (var package in folderFiles)
for (int j = 0; j < targetExtensionList.Length; j++)
{
if (!shouldSkip(package))
// Packages fetched from device info has `,`, from FFU usually clean
var checkName = installedPackages[i] + targetExtensionList[j];
if (checkName.IndexOf(",") >= 0)
{
checkName = installedPackages[i].Split(',')[1] + targetExtensionList[j];
}
var requiredPackages = folderFiles.Where(k => k.IndexOf(checkName, StringComparison.OrdinalIgnoreCase) >= 0).FirstOrDefault();
if (requiredPackages != null)
{
filteredPackages.Add(package);
if (!shouldSkip(requiredPackages))
{
filteredPackages.Add(requiredPackages);
}
}
}
Program.appendLog($"{installedPackages[i]}\n");
}

for (int i = 0; i < knownPackages.Length; i++)
Expand Down Expand Up @@ -222,14 +252,62 @@ public static bool OfflineUpdate(string[] folderFiles, string pushFeature)
}
}
}
if (pushFeature == "Y")

// Features packages
foreach (var feature in Program.GlobalFeaturesList)
{
for (int i = 0; i < featurePackages.Length; i++)
if (feature.ShouldPresent)
{
var requiredPackages = folderFiles.Where(j => j.IndexOf(featurePackages[i], StringComparison.OrdinalIgnoreCase) >= 0).FirstOrDefault();
if (requiredPackages != null)
if (feature.State)
{
filteredPackages.Add(requiredPackages);
for (int i = 0; i < feature.FeaturePackages.Length; i++)
{
var requiredPackages = folderFiles.Where(j => j.IndexOf(feature.FeaturePackages[i].PackageName, StringComparison.OrdinalIgnoreCase) >= 0).FirstOrDefault();
if (requiredPackages != null)
{
if (feature.FeaturePackages[i].ReplaceStock)
{
// Ensure to remove stock on from the list
var stockName = feature.FeaturePackages[i].TargetStockName;
for (int j = 0; j < targetExtensionList.Length; j++)
{
// Packages fetched from device info has `,`, from FFU usually clean
var checkName = stockName + targetExtensionList[j];
var packageRemoval = folderFiles.Where(a => a.IndexOf(checkName, StringComparison.OrdinalIgnoreCase) >= 0).FirstOrDefault();
if (packageRemoval != null)
{
if (filteredPackages.Remove(packageRemoval))
{
Program.WriteLine($"Stock ({stockName}) replaced with feature", ConsoleColor.DarkYellow);
Program.appendLog($"Package ({stockName}) replaced with feature ({feature.FeaturePackages[i].PackageName})\n");
}
else
{
Program.WriteLine($"Stock ({stockName}) is not presented in filtered list!", ConsoleColor.DarkYellow);
}
}
}
}

if (!shouldSkip(requiredPackages))
{
filteredPackages.Add(requiredPackages);
Program.appendLog($"Feature Package ({requiredPackages}) added to filtered list\n");
}
}
}
}
else
{
// Ensure package removed from the list
for (int i = 0; i < feature.FeaturePackages.Length; i++)
{
var requiredPackages = folderFiles.Where(j => j.IndexOf(feature.FeaturePackages[i].PackageName, StringComparison.OrdinalIgnoreCase) >= 0).FirstOrDefault();
if (requiredPackages != null)
{
filteredPackages.Remove(requiredPackages);
}
}
}
}
}
Expand Down Expand Up @@ -387,30 +465,35 @@ public static bool OfflineUpdate(string[] folderFiles, string pushFeature)
Program.WriteLine(filteredPackages.Count.ToString(), ConsoleColor.DarkYellow);
Program.WriteLine("1. Push packages", ConsoleColor.Green);
Program.WriteLine("2. Retry");
Program.WriteLine("3. Exit");
Program.Write("Choice: ", ConsoleColor.Magenta);
ConsoleKeyInfo packagesAction;
do
{
packagesAction = Console.ReadKey(true);
}
while (packagesAction.KeyChar != '1' && packagesAction.KeyChar != '2');
while (packagesAction.KeyChar != '1' && packagesAction.KeyChar != '2' && packagesAction.KeyChar != '3');
Program.Write(packagesAction.KeyChar.ToString() + "\n");

Program.WriteLine("\n[PREPARING]\nPlease wait...", ConsoleColor.DarkYellow);
if (packagesAction.KeyChar == '1')
{
Program.WriteLine("\n[PREPARING]\nPlease wait...", ConsoleColor.DarkYellow);
for (int i = 0; i < filteredPackages.Where(j => !string.IsNullOrWhiteSpace(j)).Count(); i++)
{
Program.resetCursorPosition();
Program.WriteLine($@"[{i + 1}/{filteredPackages.Where(j => !string.IsNullOrWhiteSpace(j)).Count()}] {filteredPackages[i].Split('\\').Last()}", ConsoleColor.DarkGray);
File.Copy(filteredPackages[i], Program.filteredDirectory + $@"\{GetDeviceInfo.SerialNumber[0]}\Packages\{filteredPackages[i].Split('\\').Last()}", true);
}
}
else
else if (packagesAction.KeyChar == '2')
{
Program.WriteLine("");
goto filterPackages;
}
else
{
return false;
}
}
else
{
Expand Down Expand Up @@ -504,6 +587,7 @@ public static bool shouldSkip(string package, bool onlinePackage = false)
if (package.IndexOf(testCheck, StringComparison.OrdinalIgnoreCase) > 0)
{
// Package exists in the skip list
Program.appendLog($"Package ({package}) skipped!, member of skipped list\n");
return true;
}
}
Expand All @@ -516,13 +600,15 @@ public static bool shouldSkip(string package, bool onlinePackage = false)
if (sizeInBytes <= 0)
{
// Package has 0MB size, not a valid package
Program.appendLog($"Package ({package}) skipped!, 0MB size, not a valid package\n");
return true;
}
}

if (filteredPackages.Contains(package))
{
// Package already added, this happens due to extension and prefix match
Program.appendLog($"Package ({package}) skipped!, already exists\n");
return true;
}

Expand Down
Loading

0 comments on commit 0d4cdb2

Please sign in to comment.