add new setting n stuff

This commit is contained in:
Li 2024-04-12 16:50:25 +12:00
parent 58b6de3d00
commit 2ef6e0c65d
16 changed files with 211 additions and 37 deletions

View File

@ -2,6 +2,7 @@ using Avalonia.Controls;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Threading; using Avalonia.Threading;
using ChovySign_GUI.Popup.Global; using ChovySign_GUI.Popup.Global;
using ChovySign_GUI.Settings;
using Li.Progress; using Li.Progress;
using LibChovy; using LibChovy;
using System; using System;
@ -13,6 +14,8 @@ namespace ChovySign_GUI.Global
public partial class ProgressStatus : UserControl public partial class ProgressStatus : UserControl
{ {
public ChovySignParameters? Parameters = null; public ChovySignParameters? Parameters = null;
public event EventHandler<EventArgs>? Finished;
public event EventHandler<EventArgs>? BeforeStart;
private ChovySign chovySign; private ChovySign chovySign;
public ProgressStatus() public ProgressStatus()
{ {
@ -21,14 +24,12 @@ namespace ChovySign_GUI.Global
chovySign = new ChovySign(); chovySign = new ChovySign();
chovySign.RegisterCallback(onProgress); chovySign.RegisterCallback(onProgress);
} }
public event EventHandler<EventArgs>? BeforeStart;
protected virtual void OnBeforeStart(EventArgs e) protected virtual void OnBeforeStart(EventArgs e)
{ {
if (BeforeStart is not null) if (BeforeStart is not null)
BeforeStart(this, e); BeforeStart(this, e);
} }
public event EventHandler<EventArgs>? Finished;
protected virtual void OnFinished(EventArgs e) protected virtual void OnFinished(EventArgs e)
{ {
@ -45,8 +46,10 @@ namespace ChovySign_GUI.Global
this.goButton.IsEnabled = false; this.goButton.IsEnabled = false;
OnBeforeStart(new EventArgs()); OnBeforeStart(new EventArgs());
// sanity check it
if(Parameters is null) { await MessageBox.Show(currentWindow, "ChovySignParameters was null, cannot start!", "Invalid Parameters", MessageBoxButtons.Ok); return; } if(Parameters is null) { await MessageBox.Show(currentWindow, "ChovySignParameters was null, cannot start!", "Invalid Parameters", MessageBoxButtons.Ok); return; }
// apply settings that are global to all signs
if(SettingsTab.Settings is not null) Parameters.BuildStreamType = SettingsTab.Settings.BuildStreamType;
try try
{ {

View File

@ -3,7 +3,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Global="clr-namespace:ChovySign_GUI.Global" xmlns:Global="clr-namespace:ChovySign_GUI.Global"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="80" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="85"
x:Class="ChovySign_GUI.Settings.ConfigDropDown"> x:Class="ChovySign_GUI.Settings.ConfigDropDown">
<Grid> <Grid>
<Global:LabeledComboBox Name="configComboBox" Label="Label"/> <Global:LabeledComboBox Name="configComboBox" Label="Label"/>

View File

@ -17,6 +17,7 @@
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Settings:ConfigToggle Name="devkitAccount" <Settings:ConfigToggle Name="devkitAccount"
ConfigKey="USE_DEVKIT_ACCOUNT_ID" ConfigKey="USE_DEVKIT_ACCOUNT_ID"
@ -45,6 +46,12 @@
Label="LibCrypt Method:" Label="LibCrypt Method:"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
Grid.Row="3"/> Grid.Row="3"/>
<Settings:ConfigDropDown Name="streamType"
ConfigKey="USE_STREAM_TYPE"
Label="Build Stream Type:"
HorizontalAlignment="Stretch"
Grid.Row="4"/>
</Grid> </Grid>
</Grid> </Grid>

View File

@ -1,5 +1,6 @@
using Avalonia.Controls; using Avalonia.Controls;
using GameBuilder.Pops.LibCrypt; using GameBuilder.Pops.LibCrypt;
using GameBuilder;
using System.IO; using System.IO;
using Vita.ContentManager; using Vita.ContentManager;
@ -9,6 +10,14 @@ namespace ChovySign_GUI.Settings
{ {
public static SettingsTab? Settings; public static SettingsTab? Settings;
public StreamType BuildStreamType
{
get
{
return (StreamType) this.streamType.SelectedIndex;
}
}
public LibCryptMethod LibcryptMode public LibCryptMethod LibcryptMode
{ {
get get
@ -51,10 +60,12 @@ namespace ChovySign_GUI.Settings
InitializeComponent(); InitializeComponent();
libCryptMode.Items = new string[2] { "Magic Word in ISO Header", "Sub Channel PGD" }; libCryptMode.Items = new string[2] { "Magic Word in ISO Header", "Sub Channel PGD" };
streamType.Items = new string[2] { "MemoryStream - Create EBOOT in memory, faster, but high memory usage", "FileStream - Create EBOOT with temporary files, slower, but less memory usage" };
if (!Directory.Exists(this.CmaDirectory)) if (!Directory.Exists(this.CmaDirectory))
cmaDirectory.Value = SettingsReader.BackupsFolder; cmaDirectory.Value = SettingsReader.BackupsFolder;
Settings = this; Settings = this;
} }
} }

133
GameBuilder/BuildStream.cs Normal file
View File

@ -0,0 +1,133 @@
using DiscUtils.Streams;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameBuilder
{
public class BuildStream : Stream
{
public static StreamType BuildUsingStreamType = StreamType.TYPE_MEMORY_STREAM;
private Stream underylingStream;
private StreamType uStreamType;
private string? filename = null;
private void init()
{
this.uStreamType = BuildUsingStreamType;
if (this.uStreamType == StreamType.TYPE_MEMORY_STREAM)
{
this.underylingStream = new MemoryStream();
}
else if (this.uStreamType == StreamType.TYPE_FILE_STREAM)
{
string tmpFolder = Path.Combine(Path.GetTempPath(), "chovysign2");
Directory.CreateDirectory(tmpFolder);
this.filename = Path.Combine(tmpFolder, Guid.NewGuid().ToString());
this.underylingStream = File.Create(this.filename);
}
else
{
throw new Exception("unknown stream type");
}
}
public BuildStream(byte[] data)
{
init();
this.Write(data, 0, data.Length);
this.Seek(0x00, SeekOrigin.Begin);
}
public BuildStream()
{
init();
}
public override bool CanRead {
get {
return underylingStream.CanRead;
}
}
public override bool CanSeek {
get {
return underylingStream.CanSeek;
}
}
public override bool CanWrite {
get {
return underylingStream.CanWrite;
}
}
public override long Length {
get {
return underylingStream.Length;
}
}
public override long Position {
get {
return underylingStream.Position;
}
set {
underylingStream.Position = value;
}
}
public override void Close()
{
this.underylingStream.Close();
if(this.uStreamType == StreamType.TYPE_FILE_STREAM && this.filename is not null)
File.Delete(this.filename);
base.Close();
}
public override void Flush()
{
underylingStream.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return underylingStream.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return underylingStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
underylingStream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
underylingStream.Write(buffer, offset, count);
}
public byte[] ToArray()
{
long oldLocation = this.Position;
this.Seek(0x00, SeekOrigin.Begin);
byte[] rdData = new byte[this.Length];
this.Read(rdData, 0x00, rdData.Length);
this.Seek(oldLocation, SeekOrigin.Begin);
return rdData;
}
}
}

View File

@ -269,7 +269,7 @@ namespace GameBuilder.Cue
public byte[] CreateToc() public byte[] CreateToc()
{ {
using (MemoryStream toc = new MemoryStream()) using (BuildStream toc = new BuildStream())
{ {
StreamUtil tocUtil = new StreamUtil(toc); StreamUtil tocUtil = new StreamUtil(toc);
tocUtil.WriteBytes(createDummyTracks()); tocUtil.WriteBytes(createDummyTracks());

View File

@ -26,8 +26,8 @@ namespace GameBuilder.Pops
this.disc = disc; this.disc = disc;
this.cue = new CueReader(disc.CueFile); this.cue = new CueReader(disc.CueFile);
this.IsoHeader = new MemoryStream(); this.IsoHeader = new BuildStream();
this.CompressedIso = new MemoryStream(); this.CompressedIso = new BuildStream();
this.isoHeaderUtil = new StreamUtil(IsoHeader); this.isoHeaderUtil = new StreamUtil(IsoHeader);
this.atrac3Encoder = encoder; this.atrac3Encoder = encoder;
@ -189,9 +189,9 @@ namespace GameBuilder.Pops
writeCDAEntry(Convert.ToInt32(CompressedIso.Position), atracData.Length, key); writeCDAEntry(Convert.ToInt32(CompressedIso.Position), atracData.Length, key);
using (MemoryStream atracStream = new MemoryStream(atracData)) using (BuildStream atracStream = new BuildStream(atracData))
{ {
using (MemoryStream encryptedAtracStream = new MemoryStream()) using (BuildStream encryptedAtracStream = new BuildStream())
{ {
AtracCrypto.ScrambleAtracData(atracStream, encryptedAtracStream, key); AtracCrypto.ScrambleAtracData(atracStream, encryptedAtracStream, key);
encryptedAtracStream.Seek(0x00, SeekOrigin.Begin); encryptedAtracStream.Seek(0x00, SeekOrigin.Begin);
@ -241,8 +241,8 @@ namespace GameBuilder.Pops
private CueReader cue; private CueReader cue;
private PopsImg srcImg; private PopsImg srcImg;
public MemoryStream IsoHeader; public BuildStream IsoHeader;
public MemoryStream CompressedIso; public BuildStream CompressedIso;
private StreamUtil isoHeaderUtil; private StreamUtil isoHeaderUtil;
private IAtracEncoderBase atrac3Encoder; private IAtracEncoderBase atrac3Encoder;

View File

@ -12,7 +12,7 @@ namespace GameBuilder.Pops.LibCrypt
{ {
public static byte[] CreateSubchannelDat(int magicWord) public static byte[] CreateSubchannelDat(int magicWord)
{ {
using(MemoryStream subChannels = new MemoryStream()) using(BuildStream subChannels = new BuildStream())
{ {
StreamUtil subChannelsUtil = new StreamUtil(subChannels); StreamUtil subChannelsUtil = new StreamUtil(subChannels);
// this header seems to mark the start of the sub channel data. // this header seems to mark the start of the sub channel data.

View File

@ -17,7 +17,7 @@ namespace GameBuilder.Pops
public PopsImg(NpDrmInfo versionKey) : base(versionKey) public PopsImg(NpDrmInfo versionKey) : base(versionKey)
{ {
simple = new MemoryStream(); simple = new BuildStream();
simpleUtil = new StreamUtil(simple); simpleUtil = new StreamUtil(simple);
this.StartDat = NpDrmPsar.CreateStartDat(Resources.STARTDATPOPS); this.StartDat = NpDrmPsar.CreateStartDat(Resources.STARTDATPOPS);
@ -86,7 +86,7 @@ namespace GameBuilder.Pops
return loaderEnc.ToArray(); return loaderEnc.ToArray();
} }
private MemoryStream simple; private BuildStream simple;
private StreamUtil simpleUtil; private StreamUtil simpleUtil;
public byte[] EbootElf; public byte[] EbootElf;

View File

@ -50,10 +50,10 @@ namespace GameBuilder.Pops
} }
isoMap = new MemoryStream(); isoMap = new BuildStream();
isoMapUtil = new StreamUtil(isoMap); isoMapUtil = new StreamUtil(isoMap);
isoPart = new MemoryStream(); isoPart = new BuildStream();
isoPartUtil = new StreamUtil(isoPart); isoPartUtil = new StreamUtil(isoPart);
@ -174,10 +174,10 @@ namespace GameBuilder.Pops
private PSInfo[] discs; private PSInfo[] discs;
private DiscCompressor[] compressors; private DiscCompressor[] compressors;
private MemoryStream isoPart; private BuildStream isoPart;
private StreamUtil isoPartUtil; private StreamUtil isoPartUtil;
private MemoryStream isoMap; private BuildStream isoMap;
private StreamUtil isoMapUtil; private StreamUtil isoMapUtil;
} }
} }

View File

@ -17,19 +17,19 @@ namespace GameBuilder.Psp
{ {
DrmInfo = npDrmInfo; DrmInfo = npDrmInfo;
Psar = new MemoryStream(); Psar = new BuildStream();
psarUtil = new StreamUtil(Psar); psarUtil = new StreamUtil(Psar);
} }
public NpDrmInfo DrmInfo; public NpDrmInfo DrmInfo;
public MemoryStream Psar; public BuildStream Psar;
internal StreamUtil psarUtil; internal StreamUtil psarUtil;
public abstract void CreatePsar(); public abstract void CreatePsar();
public abstract byte[] GenerateDataPsp(); public abstract byte[] GenerateDataPsp();
public static byte[] CreateStartDat(byte[] image) public static byte[] CreateStartDat(byte[] image)
{ {
using(MemoryStream startDatStream = new MemoryStream()) using(BuildStream startDatStream = new BuildStream())
{ {
StreamUtil startDatUtil = new StreamUtil(startDatStream); StreamUtil startDatUtil = new StreamUtil(startDatStream);

View File

@ -21,16 +21,16 @@ namespace GameBuilder.Psp
{ {
this.compress = compress; this.compress = compress;
this.npHdr = new MemoryStream(); this.npHdr = new BuildStream();
this.npHdrUtil = new StreamUtil(npHdr); this.npHdrUtil = new StreamUtil(npHdr);
this.npHdrBody = new MemoryStream(); this.npHdrBody = new BuildStream();
this.npHdrBodyUtil = new StreamUtil(npHdrBody); this.npHdrBodyUtil = new StreamUtil(npHdrBody);
this.npTbl = new MemoryStream(); this.npTbl = new BuildStream();
this.npTblUtil = new StreamUtil(npTbl); this.npTblUtil = new StreamUtil(npTbl);
this.isoData = new MemoryStream(); this.isoData = new BuildStream();
this.isoDataUtil = new StreamUtil(isoData); this.isoDataUtil = new StreamUtil(isoData);
this.headerKey = Rng.RandomBytes(0x10); this.headerKey = Rng.RandomBytes(0x10);
@ -101,7 +101,7 @@ namespace GameBuilder.Psp
public override byte[] GenerateDataPsp() public override byte[] GenerateDataPsp()
{ {
byte[] startDat = CreateStartDat(umdImage.Minis ? Resources.STARTDATMINIS : Resources.STARTDATPSP); byte[] startDat = CreateStartDat(umdImage.Minis ? Resources.STARTDATMINIS : Resources.STARTDATPSP);
using (MemoryStream dataPsp = new MemoryStream()) using (BuildStream dataPsp = new BuildStream())
{ {
StreamUtil dataPspUtil = new StreamUtil(dataPsp); StreamUtil dataPspUtil = new StreamUtil(dataPsp);
byte[] signature = signParamSfo(umdImage.DataFiles["PARAM.SFO"]); byte[] signature = signParamSfo(umdImage.DataFiles["PARAM.SFO"]);
@ -288,16 +288,16 @@ namespace GameBuilder.Psp
private byte[] dataKey; private byte[] dataKey;
private MemoryStream npHdr; private BuildStream npHdr;
private StreamUtil npHdrUtil; private StreamUtil npHdrUtil;
private MemoryStream npHdrBody; private BuildStream npHdrBody;
private StreamUtil npHdrBodyUtil; private StreamUtil npHdrBodyUtil;
private MemoryStream isoData; private BuildStream isoData;
private StreamUtil isoDataUtil; private StreamUtil isoDataUtil;
private MemoryStream npTbl; private BuildStream npTbl;
private StreamUtil npTblUtil; private StreamUtil npTblUtil;
} }
} }

View File

@ -18,7 +18,7 @@ namespace GameBuilder.Psp
private byte[]? snd0At3; private byte[]? snd0At3;
private NpDrmPsar psar; private NpDrmPsar psar;
private short pbpVersion; private short pbpVersion;
private MemoryStream pbpStream; private BuildStream pbpStream;
public PbpBuilder(byte[] paramSfo, byte[] icon0Png, byte[]? icon1Pmf, public PbpBuilder(byte[] paramSfo, byte[] icon0Png, byte[]? icon1Pmf,
byte[]? pic0Png, byte[]? pic1Png, byte[]? snd0At3, byte[]? pic0Png, byte[]? pic1Png, byte[]? snd0At3,
@ -33,11 +33,11 @@ namespace GameBuilder.Psp
this.psar = dataPsar; this.psar = dataPsar;
this.pbpVersion = version; this.pbpVersion = version;
pbpStream = new MemoryStream(); pbpStream = new BuildStream();
psar.RegisterCallback(onProgress); psar.RegisterCallback(onProgress);
} }
public MemoryStream PbpStream public BuildStream PbpStream
{ {
get get
{ {

14
GameBuilder/StreamType.cs Normal file
View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameBuilder
{
public enum StreamType : uint
{
TYPE_MEMORY_STREAM,
TYPE_FILE_STREAM
}
}

View File

@ -1,4 +1,5 @@
using GameBuilder.Pops; using GameBuilder;
using GameBuilder.Pops;
using GameBuilder.Psp; using GameBuilder.Psp;
using Li.Progress; using Li.Progress;
using PspCrypto; using PspCrypto;
@ -149,6 +150,8 @@ namespace LibChovy
SceNpDrm.Aid = parameters.DrmRif.AccountId; SceNpDrm.Aid = parameters.DrmRif.AccountId;
BuildStream.BuildUsingStreamType = parameters.BuildStreamType;
if (!Directory.Exists(parameters.OutputFolder)) if (!Directory.Exists(parameters.OutputFolder))
Directory.CreateDirectory(parameters.OutputFolder); Directory.CreateDirectory(parameters.OutputFolder);

View File

@ -1,4 +1,5 @@
using GameBuilder.Psp; using GameBuilder;
using GameBuilder.Psp;
using LibChovy.Config; using LibChovy.Config;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -19,6 +20,7 @@ namespace LibChovy
this.Account = new Account(DrmRif.AccountId); this.Account = new Account(DrmRif.AccountId);
this.CreatePsvImg = true; this.CreatePsvImg = true;
this.FirmwareVersion = 0x3600000; this.FirmwareVersion = 0x3600000;
this.BuildStreamType = StreamType.TYPE_MEMORY_STREAM;
} }
public int FirmwareVersion; public int FirmwareVersion;
@ -27,7 +29,8 @@ namespace LibChovy
public NpDrmRif DrmRif; public NpDrmRif DrmRif;
public Account Account; public Account Account;
public ChovyTypes Type; public ChovyTypes Type;
public StreamType BuildStreamType;
protected string? outputFolderOverride; protected string? outputFolderOverride;