Add support for CreamAPI's new proxy mode
This commit is contained in:
parent
97f14a8dba
commit
5e288a3fc8
9 changed files with 192 additions and 82 deletions
|
@ -133,7 +133,7 @@ internal sealed class CustomTreeView : TreeView
|
||||||
if (form is SelectForm)
|
if (form is SelectForm)
|
||||||
{
|
{
|
||||||
Selection selection = Selection.FromId(platform, id);
|
Selection selection = Selection.FromId(platform, id);
|
||||||
if (selection is not null && selection.CanUseProxy)
|
if (selection is not null)
|
||||||
{
|
{
|
||||||
if (bounds == node.Bounds)
|
if (bounds == node.Bounds)
|
||||||
{
|
{
|
||||||
|
@ -238,16 +238,11 @@ internal sealed class CustomTreeView : TreeView
|
||||||
|
|
||||||
if (comboBoxBounds.Count > 0 && selectForm is not null)
|
if (comboBoxBounds.Count > 0 && selectForm is not null)
|
||||||
foreach (KeyValuePair<Selection, Rectangle> pair in comboBoxBounds)
|
foreach (KeyValuePair<Selection, Rectangle> pair in comboBoxBounds)
|
||||||
if (!Selection.All.ContainsKey(pair.Key) || !pair.Key.CanUseProxy)
|
if (!Selection.All.ContainsKey(pair.Key))
|
||||||
_ = comboBoxBounds.Remove(pair.Key);
|
_ = comboBoxBounds.Remove(pair.Key);
|
||||||
else if (pair.Value.Contains(clickPoint))
|
else if (pair.Value.Contains(clickPoint))
|
||||||
{
|
{
|
||||||
HashSet<string> proxies = EmbeddedResources
|
IEnumerable<string> proxies = pair.Key.GetAvailableProxies();
|
||||||
.Where(r => r.StartsWith("Koaloader", StringComparison.Ordinal)).Select(p =>
|
|
||||||
{
|
|
||||||
p.GetProxyInfoFromIdentifier(out string proxyName, out _);
|
|
||||||
return proxyName;
|
|
||||||
}).ToHashSet();
|
|
||||||
comboBoxDropDown ??= new();
|
comboBoxDropDown ??= new();
|
||||||
comboBoxDropDown.ShowItemToolTips = false;
|
comboBoxDropDown.ShowItemToolTips = false;
|
||||||
comboBoxDropDown.Items.Clear();
|
comboBoxDropDown.Items.Clear();
|
||||||
|
@ -257,7 +252,9 @@ internal sealed class CustomTreeView : TreeView
|
||||||
foreach ((string directory, BinaryType _) in pair.Key.ExecutableDirectories)
|
foreach ((string directory, BinaryType _) in pair.Key.ExecutableDirectories)
|
||||||
{
|
{
|
||||||
string path = directory + @"\" + proxy + ".dll";
|
string path = directory + @"\" + proxy + ".dll";
|
||||||
if (!path.FileExists() || path.IsResourceFile(ResourceIdentifier.Koaloader))
|
if (!path.FileExists() || path.IsResourceFile(ResourceIdentifier.Koaloader) ||
|
||||||
|
path.IsResourceFile(ResourceIdentifier.Steamworks32) ||
|
||||||
|
path.IsResourceFile(ResourceIdentifier.Steamworks64))
|
||||||
continue;
|
continue;
|
||||||
canUse = false;
|
canUse = false;
|
||||||
break;
|
break;
|
||||||
|
@ -276,7 +273,7 @@ internal sealed class CustomTreeView : TreeView
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (KeyValuePair<Selection, Rectangle> pair in checkBoxBounds)
|
foreach (KeyValuePair<Selection, Rectangle> pair in checkBoxBounds)
|
||||||
if (!Selection.All.ContainsKey(pair.Key) || !pair.Key.CanUseProxy)
|
if (!Selection.All.ContainsKey(pair.Key))
|
||||||
_ = checkBoxBounds.Remove(pair.Key);
|
_ = checkBoxBounds.Remove(pair.Key);
|
||||||
else if (pair.Value.Contains(clickPoint))
|
else if (pair.Value.Contains(clickPoint))
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,11 +65,13 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
}
|
}
|
||||||
|
|
||||||
bool useKoaloader = selection.UseProxy && (Program.UseSmokeAPI || selection.Platform is not Platform.Steam);
|
bool useKoaloader = selection.UseProxy && (Program.UseSmokeAPI || selection.Platform is not Platform.Steam);
|
||||||
|
bool useCreamApiProxy = selection.UseProxy && !Program.UseSmokeAPI &&
|
||||||
|
(selection.Platform is Platform.Steam || selection.Platform is Platform.Paradox &&
|
||||||
|
selection.ExtraSelections.Any(s => s.Platform is Platform.Steam));
|
||||||
|
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
$"{(uninstalling ? "Uninstalling" : "Installing")}" + $" {(uninstalling ? "from" : "for")} " +
|
$"{(uninstalling ? "Uninstalling" : "Installing")}" + $" {(uninstalling ? "from" : "for")} " +
|
||||||
selection.Name
|
selection.Name + $" with root directory \"{selection.RootDirectory}\" . . . ", LogTextBox.Operation);
|
||||||
+ $" with root directory \"{selection.RootDirectory}\" . . . ", LogTextBox.Operation);
|
|
||||||
IEnumerable<string> invalidDirectories = (await selection.RootDirectory.GetExecutables())
|
IEnumerable<string> invalidDirectories = (await selection.RootDirectory.GetExecutables())
|
||||||
?.Where(d => selection.ExecutableDirectories.All(s => s.directory != Path.GetDirectoryName(d.path)))
|
?.Where(d => selection.ExecutableDirectories.All(s => s.directory != Path.GetDirectoryName(d.path)))
|
||||||
.Select(d => Path.GetDirectoryName(d.path));
|
.Select(d => Path.GetDirectoryName(d.path));
|
||||||
|
@ -81,6 +83,7 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
{
|
{
|
||||||
if (Program.Canceled)
|
if (Program.Canceled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
directory.GetKoaloaderComponents(out string old_config, out string config);
|
directory.GetKoaloaderComponents(out string old_config, out string config);
|
||||||
if (directory.GetKoaloaderProxies().Any(proxy =>
|
if (directory.GetKoaloaderProxies().Any(proxy =>
|
||||||
proxy.FileExists() && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
|
proxy.FileExists() && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
|
||||||
|
@ -93,32 +96,63 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
$" in incorrect directory \"{directory}\" . . . ", LogTextBox.Operation);
|
$" in incorrect directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
await Koaloader.Uninstall(directory, selection.RootDirectory, this);
|
await Koaloader.Uninstall(directory, selection.RootDirectory, this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (uninstalling || !useKoaloader)
|
directory.GetCreamApiComponents(out _, out _, out _, out _, out config);
|
||||||
foreach ((string directory, BinaryType _) in selection.ExecutableDirectories)
|
if (directory.GetCreamApiProxies().Any(proxy =>
|
||||||
{
|
proxy.FileExists() && (proxy.IsResourceFile(ResourceIdentifier.Steamworks32) ||
|
||||||
if (Program.Canceled)
|
proxy.IsResourceFile(ResourceIdentifier.Steamworks64))))
|
||||||
return;
|
|
||||||
directory.GetKoaloaderComponents(out string old_config, out string config);
|
|
||||||
if (directory.GetKoaloaderProxies().Any(proxy =>
|
|
||||||
proxy.FileExists() && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
|
|
||||||
|| Koaloader.AutoLoadDLLs.Any(pair => (directory + @"\" + pair.dll).FileExists()) ||
|
|
||||||
old_config.FileExists() || config.FileExists())
|
|
||||||
{
|
{
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
"Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ",
|
"Uninstalling CreamAPI in proxy mode from " + selection.Name +
|
||||||
LogTextBox.Operation);
|
$" in incorrect directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
await Koaloader.Uninstall(directory, selection.RootDirectory, this);
|
await CreamAPI.ProxyUninstall(directory, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool uninstallingForKoaloader = uninstalling || useKoaloader;
|
if (uninstalling || !useKoaloader || !useCreamApiProxy)
|
||||||
|
foreach ((string directory, _) in selection.ExecutableDirectories)
|
||||||
|
{
|
||||||
|
if (Program.Canceled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (uninstalling || !useKoaloader)
|
||||||
|
{
|
||||||
|
directory.GetKoaloaderComponents(out string old_config, out string config);
|
||||||
|
if (directory.GetKoaloaderProxies().Any(proxy =>
|
||||||
|
proxy.FileExists() && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
|
||||||
|
|| Koaloader.AutoLoadDLLs.Any(pair => (directory + @"\" + pair.dll).FileExists()) ||
|
||||||
|
old_config.FileExists() || config.FileExists())
|
||||||
|
{
|
||||||
|
UpdateUser(
|
||||||
|
"Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ",
|
||||||
|
LogTextBox.Operation);
|
||||||
|
await Koaloader.Uninstall(directory, selection.RootDirectory, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uninstalling || !useCreamApiProxy)
|
||||||
|
{
|
||||||
|
directory.GetCreamApiComponents(out _, out _, out _, out _, out string config);
|
||||||
|
if (directory.GetCreamApiProxies().Any(proxy =>
|
||||||
|
proxy.FileExists() && (proxy.IsResourceFile(ResourceIdentifier.Steamworks32) ||
|
||||||
|
proxy.IsResourceFile(ResourceIdentifier.Steamworks64))) ||
|
||||||
|
config.FileExists())
|
||||||
|
{
|
||||||
|
UpdateUser(
|
||||||
|
"Uninstalling CreamAPI in proxy mode from " + selection.Name +
|
||||||
|
$" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
|
await CreamAPI.ProxyUninstall(directory, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool uninstallingForProxy = uninstalling || useKoaloader || useCreamApiProxy;
|
||||||
int count = selection.DllDirectories.Count, cur = 0;
|
int count = selection.DllDirectories.Count, cur = 0;
|
||||||
foreach (string directory in selection.DllDirectories)
|
foreach (string directory in selection.DllDirectories)
|
||||||
{
|
{
|
||||||
if (Program.Canceled)
|
if (Program.Canceled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (selection.Platform is Platform.Steam or Platform.Paradox)
|
if (selection.Platform is Platform.Steam or Platform.Paradox)
|
||||||
{
|
{
|
||||||
if (Program.UseSmokeAPI)
|
if (Program.UseSmokeAPI)
|
||||||
|
@ -126,17 +160,17 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64,
|
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64,
|
||||||
out string api64_o, out string old_config,
|
out string api64_o, out string old_config,
|
||||||
out string config, out string old_log, out string log, out string cache);
|
out string config, out string old_log, out string log, out string cache);
|
||||||
if (uninstallingForKoaloader
|
if (uninstallingForProxy
|
||||||
? api32_o.FileExists() || api64_o.FileExists() || old_config.FileExists() ||
|
? api32_o.FileExists() || api64_o.FileExists() || old_config.FileExists() ||
|
||||||
config.FileExists() || old_log.FileExists() || log.FileExists()
|
config.FileExists() || old_log.FileExists() || log.FileExists()
|
||||||
|| cache.FileExists()
|
|| cache.FileExists()
|
||||||
: api32.FileExists() || api64.FileExists())
|
: api32.FileExists() || api64.FileExists())
|
||||||
{
|
{
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
$"{(uninstallingForKoaloader ? "Uninstalling" : "Installing")} SmokeAPI" +
|
$"{(uninstallingForProxy ? "Uninstalling" : "Installing")} SmokeAPI" +
|
||||||
$" {(uninstallingForKoaloader ? "from" : "for")} " + selection.Name
|
$" {(uninstallingForProxy ? "from" : "for")} " + selection.Name
|
||||||
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
if (uninstallingForKoaloader)
|
if (uninstallingForProxy)
|
||||||
await SmokeAPI.Uninstall(directory, this);
|
await SmokeAPI.Uninstall(directory, this);
|
||||||
else
|
else
|
||||||
await SmokeAPI.Install(directory, selection, this);
|
await SmokeAPI.Install(directory, selection, this);
|
||||||
|
@ -146,15 +180,15 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
{
|
{
|
||||||
directory.GetCreamApiComponents(out string api32, out string api32_o, out string api64,
|
directory.GetCreamApiComponents(out string api32, out string api32_o, out string api64,
|
||||||
out string api64_o, out string config);
|
out string api64_o, out string config);
|
||||||
if (uninstalling
|
if (uninstallingForProxy
|
||||||
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists()
|
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists()
|
||||||
: api32.FileExists() || api64.FileExists())
|
: api32.FileExists() || api64.FileExists())
|
||||||
{
|
{
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
$"{(uninstalling ? "Uninstalling" : "Installing")} CreamAPI" +
|
$"{(uninstallingForProxy ? "Uninstalling" : "Installing")} CreamAPI" +
|
||||||
$" {(uninstalling ? "from" : "for")} " + selection.Name
|
$" {(uninstallingForProxy ? "from" : "for")} " + selection.Name
|
||||||
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
if (uninstalling)
|
if (uninstallingForProxy)
|
||||||
await CreamAPI.Uninstall(directory, this);
|
await CreamAPI.Uninstall(directory, this);
|
||||||
else
|
else
|
||||||
await CreamAPI.Install(directory, selection, this);
|
await CreamAPI.Install(directory, selection, this);
|
||||||
|
@ -166,15 +200,15 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
{
|
{
|
||||||
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64,
|
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64,
|
||||||
out string api64_o, out string config, out string log);
|
out string api64_o, out string config, out string log);
|
||||||
if (uninstallingForKoaloader
|
if (uninstallingForProxy
|
||||||
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists() || log.FileExists()
|
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists() || log.FileExists()
|
||||||
: api32.FileExists() || api64.FileExists())
|
: api32.FileExists() || api64.FileExists())
|
||||||
{
|
{
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
$"{(uninstallingForKoaloader ? "Uninstalling" : "Installing")} ScreamAPI" +
|
$"{(uninstallingForProxy ? "Uninstalling" : "Installing")} ScreamAPI" +
|
||||||
$" {(uninstallingForKoaloader ? "from" : "for")} " + selection.Name
|
$" {(uninstallingForProxy ? "from" : "for")} " + selection.Name
|
||||||
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
if (uninstallingForKoaloader)
|
if (uninstallingForProxy)
|
||||||
await ScreamAPI.Uninstall(directory, this);
|
await ScreamAPI.Uninstall(directory, this);
|
||||||
else
|
else
|
||||||
await ScreamAPI.Install(directory, selection, this);
|
await ScreamAPI.Install(directory, selection, this);
|
||||||
|
@ -185,15 +219,15 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
{
|
{
|
||||||
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64,
|
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64,
|
||||||
out string api64_o, out string config, out string log);
|
out string api64_o, out string config, out string log);
|
||||||
if (uninstallingForKoaloader
|
if (uninstallingForProxy
|
||||||
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists() || log.FileExists()
|
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists() || log.FileExists()
|
||||||
: api32.FileExists() || api64.FileExists())
|
: api32.FileExists() || api64.FileExists())
|
||||||
{
|
{
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
$"{(uninstallingForKoaloader ? "Uninstalling" : "Installing")} Uplay R1 Unlocker" +
|
$"{(uninstallingForProxy ? "Uninstalling" : "Installing")} Uplay R1 Unlocker" +
|
||||||
$" {(uninstallingForKoaloader ? "from" : "for")} " + selection.Name
|
$" {(uninstallingForProxy ? "from" : "for")} " + selection.Name
|
||||||
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
if (uninstallingForKoaloader)
|
if (uninstallingForProxy)
|
||||||
await UplayR1.Uninstall(directory, this);
|
await UplayR1.Uninstall(directory, this);
|
||||||
else
|
else
|
||||||
await UplayR1.Install(directory, selection, this);
|
await UplayR1.Install(directory, selection, this);
|
||||||
|
@ -201,15 +235,15 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
|
|
||||||
directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o,
|
directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o,
|
||||||
out api64, out api64_o, out config, out log);
|
out api64, out api64_o, out config, out log);
|
||||||
if (uninstallingForKoaloader
|
if (uninstallingForProxy
|
||||||
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists() || log.FileExists()
|
? api32_o.FileExists() || api64_o.FileExists() || config.FileExists() || log.FileExists()
|
||||||
: old_api32.FileExists() || old_api64.FileExists() || api32.FileExists() || api64.FileExists())
|
: old_api32.FileExists() || old_api64.FileExists() || api32.FileExists() || api64.FileExists())
|
||||||
{
|
{
|
||||||
UpdateUser(
|
UpdateUser(
|
||||||
$"{(uninstallingForKoaloader ? "Uninstalling" : "Installing")} Uplay R2 Unlocker" +
|
$"{(uninstallingForProxy ? "Uninstalling" : "Installing")} Uplay R2 Unlocker" +
|
||||||
$" {(uninstallingForKoaloader ? "from" : "for")} " + selection.Name
|
$" {(uninstallingForProxy ? "from" : "for")} " + selection.Name
|
||||||
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
+ $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
|
||||||
if (uninstallingForKoaloader)
|
if (uninstallingForProxy)
|
||||||
await UplayR2.Uninstall(directory, this);
|
await UplayR2.Uninstall(directory, this);
|
||||||
else
|
else
|
||||||
await UplayR2.Install(directory, selection, this);
|
await UplayR2.Install(directory, selection, this);
|
||||||
|
@ -219,14 +253,26 @@ internal sealed partial class InstallForm : CustomForm
|
||||||
UpdateProgress(++cur / count * 100);
|
UpdateProgress(++cur / count * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useKoaloader && !uninstalling)
|
if ((useCreamApiProxy || useKoaloader) && !uninstalling)
|
||||||
foreach ((string directory, BinaryType binaryType) in selection.ExecutableDirectories)
|
foreach ((string directory, BinaryType binaryType) in selection.ExecutableDirectories)
|
||||||
{
|
{
|
||||||
if (Program.Canceled)
|
if (Program.Canceled)
|
||||||
return;
|
return;
|
||||||
UpdateUser("Installing Koaloader to " + selection.Name + $" in directory \"{directory}\" . . . ",
|
|
||||||
LogTextBox.Operation);
|
if (useCreamApiProxy)
|
||||||
await Koaloader.Install(directory, binaryType, selection, selection.RootDirectory, this);
|
{
|
||||||
|
UpdateUser(
|
||||||
|
"Installing CreamAPI in proxy mode for " + selection.Name +
|
||||||
|
$" in directory \"{directory}\" . . . ",
|
||||||
|
LogTextBox.Operation);
|
||||||
|
await CreamAPI.ProxyInstall(directory, binaryType, selection, this);
|
||||||
|
}
|
||||||
|
else if (useKoaloader)
|
||||||
|
{
|
||||||
|
UpdateUser("Installing Koaloader for " + selection.Name + $" in directory \"{directory}\" . . . ",
|
||||||
|
LogTextBox.Operation);
|
||||||
|
await Koaloader.Install(directory, binaryType, selection, selection.RootDirectory, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateProgress(100);
|
UpdateProgress(100);
|
||||||
|
|
|
@ -22,9 +22,6 @@ namespace CreamInstaller.Forms;
|
||||||
|
|
||||||
internal sealed partial class SelectForm : CustomForm
|
internal sealed partial class SelectForm : CustomForm
|
||||||
{
|
{
|
||||||
// TODO: fix the form display reset save load buttons for proxy
|
|
||||||
// consolidate all reset save load functionality into only 3 buttons instead of 6?
|
|
||||||
|
|
||||||
private const string HelpButtonListPrefix = "\n • ";
|
private const string HelpButtonListPrefix = "\n • ";
|
||||||
|
|
||||||
private static SelectForm current;
|
private static SelectForm current;
|
||||||
|
@ -1167,7 +1164,7 @@ internal sealed partial class SelectForm : CustomForm
|
||||||
saveButton.Enabled = CanSaveSelections();
|
saveButton.Enabled = CanSaveSelections();
|
||||||
resetButton.Enabled = CanResetSelections();
|
resetButton.Enabled = CanResetSelections();
|
||||||
proxyAllCheckBox.CheckedChanged -= OnProxyAllCheckBoxChanged;
|
proxyAllCheckBox.CheckedChanged -= OnProxyAllCheckBoxChanged;
|
||||||
proxyAllCheckBox.Checked = Selection.All.Keys.All(selection => !selection.CanUseProxy || selection.UseProxy);
|
proxyAllCheckBox.Checked = Selection.All.Keys.All(selection => selection.UseProxy);
|
||||||
proxyAllCheckBox.CheckedChanged += OnProxyAllCheckBoxChanged;
|
proxyAllCheckBox.CheckedChanged += OnProxyAllCheckBoxChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,9 +83,6 @@ internal static class ParadoxLauncher
|
||||||
byte[] epicOriginalSdk64 = null;
|
byte[] epicOriginalSdk64 = null;
|
||||||
foreach (string directory in selection.DllDirectories.TakeWhile(_ => !Program.Canceled))
|
foreach (string directory in selection.DllDirectories.TakeWhile(_ => !Program.Canceled))
|
||||||
{
|
{
|
||||||
bool koaloaderInstalled = Koaloader.AutoLoadDLLs
|
|
||||||
.Select(pair => (pair.unlocker, path: directory + @"\" + pair.dll))
|
|
||||||
.Any(pair => pair.path.FileExists() && pair.path.IsResourceFile());
|
|
||||||
string api32;
|
string api32;
|
||||||
string api32_o;
|
string api32_o;
|
||||||
string api64;
|
string api64;
|
||||||
|
@ -93,17 +90,16 @@ internal static class ParadoxLauncher
|
||||||
if (Program.UseSmokeAPI)
|
if (Program.UseSmokeAPI)
|
||||||
{
|
{
|
||||||
directory.GetSmokeApiComponents(out api32, out api32_o, out api64, out api64_o,
|
directory.GetSmokeApiComponents(out api32, out api32_o, out api64, out api64_o,
|
||||||
out string old_config, out string config, out _, out _, out _);
|
out _, out _, out _, out _, out _);
|
||||||
creamInstalled = creamInstalled || api32_o.FileExists() || api64_o.FileExists()
|
creamInstalled = creamInstalled || api32_o.FileExists() || api64_o.FileExists()
|
||||||
|| (old_config.FileExists() || config.FileExists()) && !koaloaderInstalled
|
|
||||||
|| api32.FileExists() && api32.IsResourceFile(ResourceIdentifier.Steamworks32)
|
|| api32.FileExists() && api32.IsResourceFile(ResourceIdentifier.Steamworks32)
|
||||||
|| api64.FileExists() && api64.IsResourceFile(ResourceIdentifier.Steamworks64);
|
|| api64.FileExists() && api64.IsResourceFile(ResourceIdentifier.Steamworks64);
|
||||||
await SmokeAPI.Uninstall(directory, deleteOthers: false);
|
await SmokeAPI.Uninstall(directory, deleteOthers: false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
directory.GetCreamApiComponents(out api32, out api32_o, out api64, out api64_o, out string config);
|
directory.GetCreamApiComponents(out api32, out api32_o, out api64, out api64_o, out _);
|
||||||
creamInstalled = creamInstalled || api32_o.FileExists() || api64_o.FileExists() || config.FileExists()
|
creamInstalled = creamInstalled || api32_o.FileExists() || api64_o.FileExists()
|
||||||
|| api32.FileExists() && api32.IsResourceFile(ResourceIdentifier.Steamworks32)
|
|| api32.FileExists() && api32.IsResourceFile(ResourceIdentifier.Steamworks32)
|
||||||
|| api64.FileExists() && api64.IsResourceFile(ResourceIdentifier.Steamworks64);
|
|| api64.FileExists() && api64.IsResourceFile(ResourceIdentifier.Steamworks64);
|
||||||
await CreamAPI.Uninstall(directory, deleteOthers: false);
|
await CreamAPI.Uninstall(directory, deleteOthers: false);
|
||||||
|
@ -115,10 +111,8 @@ internal static class ParadoxLauncher
|
||||||
if (steamOriginalSdk64 is null && api64.FileExists() &&
|
if (steamOriginalSdk64 is null && api64.FileExists() &&
|
||||||
!api64.IsResourceFile(ResourceIdentifier.Steamworks64))
|
!api64.IsResourceFile(ResourceIdentifier.Steamworks64))
|
||||||
steamOriginalSdk64 = api64.ReadFileBytes(true);
|
steamOriginalSdk64 = api64.ReadFileBytes(true);
|
||||||
directory.GetScreamApiComponents(out api32, out api32_o, out api64, out api64_o, out string screamConfig,
|
directory.GetScreamApiComponents(out api32, out api32_o, out api64, out api64_o, out _, out _);
|
||||||
out string log);
|
|
||||||
screamInstalled = screamInstalled || api32_o.FileExists() || api64_o.FileExists()
|
screamInstalled = screamInstalled || api32_o.FileExists() || api64_o.FileExists()
|
||||||
|| (screamConfig.FileExists() || log.FileExists()) && !koaloaderInstalled
|
|
||||||
|| api32.FileExists() && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32)
|
|| api32.FileExists() && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32)
|
||||||
|| api64.FileExists() && api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64);
|
|| api64.FileExists() && api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64);
|
||||||
await ScreamAPI.Uninstall(directory, deleteOthers: false);
|
await ScreamAPI.Uninstall(directory, deleteOthers: false);
|
||||||
|
@ -136,8 +130,15 @@ internal static class ParadoxLauncher
|
||||||
bool neededRepair = false;
|
bool neededRepair = false;
|
||||||
foreach (string directory in selection.DllDirectories.TakeWhile(_ => !Program.Canceled))
|
foreach (string directory in selection.DllDirectories.TakeWhile(_ => !Program.Canceled))
|
||||||
{
|
{
|
||||||
directory.GetSmokeApiComponents(out string api32, out _, out string api64, out _, out _, out _, out _,
|
string api32;
|
||||||
out _, out _);
|
string api64;
|
||||||
|
if (Program.UseSmokeAPI)
|
||||||
|
directory.GetSmokeApiComponents(out api32, out _, out api64, out _, out _, out _,
|
||||||
|
out _,
|
||||||
|
out _, out _);
|
||||||
|
else
|
||||||
|
directory.GetCreamApiComponents(out api32, out _, out api64, out _, out _);
|
||||||
|
|
||||||
if (steamOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.Steamworks32))
|
if (steamOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.Steamworks32))
|
||||||
{
|
{
|
||||||
steamOriginalSdk32.WriteResource(api32);
|
steamOriginalSdk32.WriteResource(api32);
|
||||||
|
@ -160,13 +161,9 @@ internal static class ParadoxLauncher
|
||||||
|
|
||||||
if (creamInstalled)
|
if (creamInstalled)
|
||||||
if (Program.UseSmokeAPI)
|
if (Program.UseSmokeAPI)
|
||||||
{
|
|
||||||
await SmokeAPI.Install(directory, selection, generateConfig: false);
|
await SmokeAPI.Install(directory, selection, generateConfig: false);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
await CreamAPI.Install(directory, selection, generateConfig: false);
|
await CreamAPI.Install(directory, selection, generateConfig: false);
|
||||||
}
|
|
||||||
|
|
||||||
directory.GetScreamApiComponents(out api32, out _, out api64, out _, out _, out _);
|
directory.GetScreamApiComponents(out api32, out _, out api64, out _, out _, out _);
|
||||||
if (epicOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32))
|
if (epicOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32))
|
||||||
|
|
|
@ -36,7 +36,7 @@ internal static class Program
|
||||||
internal static readonly int CurrentProcessId = CurrentProcess.Id;
|
internal static readonly int CurrentProcessId = CurrentProcess.Id;
|
||||||
|
|
||||||
// this may forever be false, but who knows, maybe acidicoala makes it once again better than CreamAPI some day
|
// this may forever be false, but who knows, maybe acidicoala makes it once again better than CreamAPI some day
|
||||||
internal static bool UseSmokeAPI = false;
|
internal const bool UseSmokeAPI = false;
|
||||||
|
|
||||||
internal static bool BlockProtectedGames = true;
|
internal static bool BlockProtectedGames = true;
|
||||||
internal static readonly string[] ProtectedGames = ["PAYDAY 2"];
|
internal static readonly string[] ProtectedGames = ["PAYDAY 2"];
|
||||||
|
|
|
@ -12,7 +12,10 @@ namespace CreamInstaller.Resources;
|
||||||
|
|
||||||
internal static class CreamAPI
|
internal static class CreamAPI
|
||||||
{
|
{
|
||||||
// TODO: add proxy mode support
|
internal static readonly List<string> ProxyDLLs = ["winmm", "winhttp", "version"];
|
||||||
|
|
||||||
|
internal static IEnumerable<string> GetCreamApiProxies(this string directory)
|
||||||
|
=> from proxy in ProxyDLLs select directory + @"\" + proxy + ".dll";
|
||||||
|
|
||||||
internal static void GetCreamApiComponents(this string directory, out string api32, out string api32_o,
|
internal static void GetCreamApiComponents(this string directory, out string api32, out string api32_o,
|
||||||
out string api64, out string api64_o, out string config)
|
out string api64, out string api64_o, out string config)
|
||||||
|
@ -113,7 +116,7 @@ internal static class CreamAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
|
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
|
||||||
=> await Task.Run(() =>
|
=> await Task.Run(async () =>
|
||||||
{
|
{
|
||||||
DeleteSmokeApiComponents(directory, installForm);
|
DeleteSmokeApiComponents(directory, installForm);
|
||||||
|
|
||||||
|
@ -149,11 +152,14 @@ internal static class CreamAPI
|
||||||
|
|
||||||
if (!deleteOthers)
|
if (!deleteOthers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (config.FileExists())
|
if (config.FileExists())
|
||||||
{
|
{
|
||||||
config.DeleteFile();
|
config.DeleteFile();
|
||||||
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
|
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await SmokeAPI.Uninstall(directory, installForm, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
internal static async Task Install(string directory, Selection selection, InstallForm installForm = null,
|
internal static async Task Install(string directory, Selection selection, InstallForm installForm = null,
|
||||||
|
@ -194,6 +200,59 @@ internal static class CreamAPI
|
||||||
CheckConfig(directory, selection, installForm);
|
CheckConfig(directory, selection, installForm);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
internal static async Task ProxyUninstall(string directory, InstallForm installForm = null,
|
||||||
|
bool deleteOthers = true)
|
||||||
|
=> await Task.Run(() =>
|
||||||
|
{
|
||||||
|
foreach (string proxy in directory.GetCreamApiProxies().Where(proxy =>
|
||||||
|
proxy.FileExists() && (proxy.IsResourceFile(ResourceIdentifier.Steamworks32) ||
|
||||||
|
proxy.IsResourceFile(ResourceIdentifier.Steamworks64))))
|
||||||
|
{
|
||||||
|
proxy.DeleteFile(true);
|
||||||
|
installForm?.UpdateUser($"Deleted CreamAPI: {Path.GetFileName(proxy)}", LogTextBox.Action, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!deleteOthers)
|
||||||
|
return;
|
||||||
|
directory.GetCreamApiComponents(out _, out _, out _, out _, out string config);
|
||||||
|
if (config.FileExists())
|
||||||
|
{
|
||||||
|
config.DeleteFile();
|
||||||
|
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
internal static async Task ProxyInstall(string directory, BinaryType binaryType, Selection selection,
|
||||||
|
InstallForm installForm = null, bool generateConfig = true)
|
||||||
|
=> await Task.Run(async () =>
|
||||||
|
{
|
||||||
|
await Koaloader.Uninstall(directory, selection.RootDirectory, installForm);
|
||||||
|
|
||||||
|
string proxy = selection.Proxy ?? Selection.DefaultProxy;
|
||||||
|
string path = directory + @"\" + proxy + ".dll";
|
||||||
|
foreach (string _path in directory.GetCreamApiProxies().Where(p =>
|
||||||
|
p != path && p.FileExists() && (p.IsResourceFile(ResourceIdentifier.Steamworks32) ||
|
||||||
|
p.IsResourceFile(ResourceIdentifier.Steamworks64))))
|
||||||
|
{
|
||||||
|
_path.DeleteFile(true);
|
||||||
|
installForm?.UpdateUser($"Deleted CreamAPI: {Path.GetFileName(_path)}", LogTextBox.Action, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path.FileExists() && !path.IsResourceFile(ResourceIdentifier.Steamworks32) &&
|
||||||
|
!path.IsResourceFile(ResourceIdentifier.Steamworks64))
|
||||||
|
throw new CustomMessageException("A non-CreamAPI DLL named " + proxy +
|
||||||
|
".dll already exists in this directory!");
|
||||||
|
(binaryType == BinaryType.BIT32 ? "CreamAPI.steam_api.dll" : "CreamAPI.steam_api64.dll")
|
||||||
|
.WriteManifestResource(path);
|
||||||
|
installForm?.UpdateUser(
|
||||||
|
$"Wrote {(binaryType == BinaryType.BIT32 ? "32-bit" : "64-bit")} CreamAPI: {Path.GetFileName(path)}",
|
||||||
|
LogTextBox.Action,
|
||||||
|
false);
|
||||||
|
|
||||||
|
if (generateConfig)
|
||||||
|
CheckConfig(directory, selection, installForm);
|
||||||
|
});
|
||||||
|
|
||||||
internal static readonly Dictionary<ResourceIdentifier, HashSet<string>> ResourceMD5s = new()
|
internal static readonly Dictionary<ResourceIdentifier, HashSet<string>> ResourceMD5s = new()
|
||||||
{
|
{
|
||||||
[ResourceIdentifier.Steamworks32] =
|
[ResourceIdentifier.Steamworks32] =
|
||||||
|
|
|
@ -182,7 +182,7 @@ internal static class Koaloader
|
||||||
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
|
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Program.UseSmokeAPI) await SmokeAPI.Uninstall(directory, installForm, deleteConfig);
|
await SmokeAPI.Uninstall(directory, installForm, deleteConfig);
|
||||||
await ScreamAPI.Uninstall(directory, installForm, deleteConfig);
|
await ScreamAPI.Uninstall(directory, installForm, deleteConfig);
|
||||||
await UplayR1.Uninstall(directory, installForm, deleteConfig);
|
await UplayR1.Uninstall(directory, installForm, deleteConfig);
|
||||||
await UplayR2.Uninstall(directory, installForm, deleteConfig);
|
await UplayR2.Uninstall(directory, installForm, deleteConfig);
|
||||||
|
@ -193,8 +193,10 @@ internal static class Koaloader
|
||||||
internal static async Task Install(string directory, BinaryType binaryType, Selection selection,
|
internal static async Task Install(string directory, BinaryType binaryType, Selection selection,
|
||||||
string rootDirectory = null,
|
string rootDirectory = null,
|
||||||
InstallForm installForm = null, bool generateConfig = true)
|
InstallForm installForm = null, bool generateConfig = true)
|
||||||
=> await Task.Run(() =>
|
=> await Task.Run(async () =>
|
||||||
{
|
{
|
||||||
|
await CreamAPI.ProxyUninstall(directory, installForm);
|
||||||
|
|
||||||
string proxy = selection.Proxy ?? Selection.DefaultProxy;
|
string proxy = selection.Proxy ?? Selection.DefaultProxy;
|
||||||
string path = directory + @"\" + proxy + ".dll";
|
string path = directory + @"\" + proxy + ".dll";
|
||||||
foreach (string _path in directory.GetKoaloaderProxies().Where(p =>
|
foreach (string _path in directory.GetKoaloaderProxies().Where(p =>
|
||||||
|
|
|
@ -186,7 +186,7 @@ internal static class SmokeAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
|
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
|
||||||
=> await Task.Run(() =>
|
=> await Task.Run(async () =>
|
||||||
{
|
{
|
||||||
DeleteCreamApiComponents(directory, installForm);
|
DeleteCreamApiComponents(directory, installForm);
|
||||||
|
|
||||||
|
@ -222,6 +222,7 @@ internal static class SmokeAPI
|
||||||
|
|
||||||
if (!deleteOthers)
|
if (!deleteOthers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (old_config.FileExists())
|
if (old_config.FileExists())
|
||||||
{
|
{
|
||||||
old_config.DeleteFile();
|
old_config.DeleteFile();
|
||||||
|
@ -252,6 +253,8 @@ internal static class SmokeAPI
|
||||||
log.DeleteFile();
|
log.DeleteFile();
|
||||||
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(log)}", LogTextBox.Action, false);
|
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(log)}", LogTextBox.Action, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await CreamAPI.Uninstall(directory, installForm, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
internal static async Task Install(string directory, Selection selection, InstallForm installForm = null,
|
internal static async Task Install(string directory, Selection selection, InstallForm installForm = null,
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CreamInstaller.Forms;
|
using CreamInstaller.Forms;
|
||||||
|
using CreamInstaller.Resources;
|
||||||
using CreamInstaller.Utility;
|
using CreamInstaller.Utility;
|
||||||
using static CreamInstaller.Resources.Resources;
|
using static CreamInstaller.Resources.Resources;
|
||||||
|
|
||||||
|
@ -20,16 +21,13 @@ public enum Platform
|
||||||
|
|
||||||
internal sealed class Selection : IEquatable<Selection>
|
internal sealed class Selection : IEquatable<Selection>
|
||||||
{
|
{
|
||||||
internal const string DefaultProxy = "version";
|
internal const string DefaultProxy = "winmm";
|
||||||
|
|
||||||
// TODO: add proxy mode support for CreamAPI and set this to true
|
|
||||||
internal bool CanUseProxy => Program.UseSmokeAPI || Platform is not Platform.Steam;
|
|
||||||
|
|
||||||
internal static readonly ConcurrentDictionary<Selection, byte> All = new();
|
internal static readonly ConcurrentDictionary<Selection, byte> All = new();
|
||||||
|
|
||||||
internal readonly HashSet<string> DllDirectories;
|
internal readonly HashSet<string> DllDirectories;
|
||||||
internal readonly List<(string directory, BinaryType binaryType)> ExecutableDirectories;
|
internal readonly List<(string directory, BinaryType binaryType)> ExecutableDirectories;
|
||||||
internal readonly HashSet<Selection> ExtraSelections = new();
|
internal readonly HashSet<Selection> ExtraSelections = [];
|
||||||
internal readonly string Id;
|
internal readonly string Id;
|
||||||
internal readonly string Name;
|
internal readonly string Name;
|
||||||
internal readonly Platform Platform;
|
internal readonly Platform Platform;
|
||||||
|
@ -43,6 +41,17 @@ internal sealed class Selection : IEquatable<Selection>
|
||||||
internal string SubIcon;
|
internal string SubIcon;
|
||||||
internal string Website;
|
internal string Website;
|
||||||
|
|
||||||
|
internal IEnumerable<string> GetAvailableProxies()
|
||||||
|
{
|
||||||
|
if (!Program.UseSmokeAPI && Platform is Platform.Steam or Platform.Paradox)
|
||||||
|
return CreamAPI.ProxyDLLs;
|
||||||
|
return EmbeddedResources.Where(r => r.StartsWith("Koaloader", StringComparison.Ordinal)).Select(p =>
|
||||||
|
{
|
||||||
|
p.GetProxyInfoFromIdentifier(out string proxyName, out _);
|
||||||
|
return proxyName;
|
||||||
|
}).ToHashSet();
|
||||||
|
}
|
||||||
|
|
||||||
private Selection(Platform platform, string id, string name, string rootDirectory, HashSet<string> dllDirectories,
|
private Selection(Platform platform, string id, string name, string rootDirectory, HashSet<string> dllDirectories,
|
||||||
List<(string directory, BinaryType binaryType)> executableDirectories)
|
List<(string directory, BinaryType binaryType)> executableDirectories)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue