Skip to content

Commit 7dc4750

Browse files
authored
Add Deserializer for AppPkgHeader (#14)
* Add Deserializer for AppPkgHeader * Fix typo * add using System.Text * Fix typo
1 parent b5f3666 commit 7dc4750

File tree

2 files changed

+152
-0
lines changed

2 files changed

+152
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System.IO;
2+
using System.Linq;
3+
using SabreTools.Serialization.Deserializers;
4+
using Xunit;
5+
6+
namespace SabreTools.Serialization.Test.Deserializers
7+
{
8+
public class AppPkgHeaderTests
9+
{
10+
[Fact]
11+
public void NullArray_Null()
12+
{
13+
byte[]? data = null;
14+
int offset = 0;
15+
var deserializer = new AppPkgHeader();
16+
17+
var actual = deserializer.Deserialize(data, offset);
18+
Assert.Null(actual);
19+
}
20+
21+
[Fact]
22+
public void EmptyArray_Null()
23+
{
24+
byte[]? data = [];
25+
int offset = 0;
26+
var deserializer = new AppPkgHeader();
27+
28+
var actual = deserializer.Deserialize(data, offset);
29+
Assert.Null(actual);
30+
}
31+
32+
[Fact]
33+
public void InvalidArray_Null()
34+
{
35+
byte[]? data = [.. Enumerable.Repeat<byte>(0xFF, 1024)];
36+
int offset = 0;
37+
var deserializer = new AppPkgHeader();
38+
39+
var actual = deserializer.Deserialize(data, offset);
40+
Assert.Null(actual);
41+
}
42+
43+
[Fact]
44+
public void NullStream_Null()
45+
{
46+
Stream? data = null;
47+
var deserializer = new AppPkgHeader();
48+
49+
var actual = deserializer.Deserialize(data);
50+
Assert.Null(actual);
51+
}
52+
53+
[Fact]
54+
public void EmptyStream_Null()
55+
{
56+
Stream? data = new MemoryStream([]);
57+
var deserializer = new AppPkgHeader();
58+
59+
var actual = deserializer.Deserialize(data);
60+
Assert.Null(actual);
61+
}
62+
63+
[Fact]
64+
public void InvalidStream_Null()
65+
{
66+
Stream? data = new MemoryStream([.. Enumerable.Repeat<byte>(0xFF, 1024)]);
67+
var deserializer = new AppPkgHeader();
68+
69+
var actual = deserializer.Deserialize(data);
70+
Assert.Null(actual);
71+
}
72+
}
73+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System.IO;
2+
using System.Text;
3+
using SabreTools.IO.Extensions;
4+
using static SabreTools.Models.PlayStation4.Constants;
5+
6+
namespace SabreTools.Serialization.Deserializers
7+
{
8+
public class AppPkgHeader : BaseBinaryDeserializer<Models.PlayStation4.AppPkgHeader>
9+
{
10+
/// <inheritdoc/>
11+
public override Models.PlayStation4.AppPkgHeader? Deserialize(Stream? data)
12+
{
13+
// If the data is invalid
14+
if (data == null || !data.CanRead)
15+
return null;
16+
17+
try
18+
{
19+
// Create a new app.pkg header to fill
20+
var appPkgHeader = new Models.PlayStation4.AppPkgHeader();
21+
22+
appPkgHeader.Magic = data.ReadUInt32BigEndian();
23+
if (appPkgHeader.Magic != AppPkgMagic)
24+
return null;
25+
26+
appPkgHeader.Type = data.ReadUInt32BigEndian();
27+
appPkgHeader.PKGUnknown = data.ReadUInt32BigEndian();
28+
appPkgHeader.FileCount = data.ReadUInt32BigEndian();
29+
appPkgHeader.EntryCount = data.ReadUInt32BigEndian();
30+
appPkgHeader.SCEntryCount = data.ReadUInt16BigEndian();
31+
appPkgHeader.EntryCount2 = data.ReadUInt16BigEndian();
32+
appPkgHeader.TableOffset = data.ReadUInt32BigEndian();
33+
appPkgHeader.EntryDataSize = data.ReadUInt32BigEndian();
34+
appPkgHeader.BodyOffset = data.ReadUInt64BigEndian();
35+
appPkgHeader.BodySize = data.ReadUInt64BigEndian();
36+
appPkgHeader.ContentOffset = data.ReadUInt64BigEndian();
37+
appPkgHeader.ContentSize = data.ReadUInt64BigEndian();
38+
byte[] contentID = data.ReadBytes(0x24);
39+
appPkgHeader.ContentID = Encoding.ASCII.GetString(contentID).TrimEnd('\0');
40+
appPkgHeader.ContentZeroes = data.ReadBytes(0xC);
41+
appPkgHeader.DRMType = data.ReadUInt32BigEndian();
42+
appPkgHeader.ContentType = data.ReadUInt32BigEndian();
43+
appPkgHeader.ContentFlags = data.ReadUInt32BigEndian();
44+
appPkgHeader.PromoteSize = data.ReadUInt32BigEndian();
45+
appPkgHeader.VersionDate = data.ReadUInt32BigEndian();
46+
appPkgHeader.VersionHash = data.ReadUInt32BigEndian();
47+
appPkgHeader.Zeroes1 = data.ReadBytes(0x78);
48+
appPkgHeader.MainEntry1SHA256 = data.ReadBytes(0x20);
49+
appPkgHeader.MainEntry2SHA256 = data.ReadBytes(0x20);
50+
appPkgHeader.DigestTableSHA256 = data.ReadBytes(0x20);
51+
appPkgHeader.MainTableSHA256 = data.ReadBytes(0x20);
52+
appPkgHeader.Zeroes2 = data.ReadBytes(0x280);
53+
appPkgHeader.PFSUnknown = data.ReadUInt32BigEndian();
54+
appPkgHeader.PFSImageCount = data.ReadUInt32BigEndian();
55+
appPkgHeader.PFSImageFlags = data.ReadUInt64BigEndian();
56+
appPkgHeader.PFSImageOffset = data.ReadUInt64BigEndian();
57+
appPkgHeader.PFSImageSize = data.ReadUInt64BigEndian();
58+
appPkgHeader.MountImageOffset = data.ReadUInt64BigEndian();
59+
appPkgHeader.MountImageSize = data.ReadUInt64BigEndian();
60+
appPkgHeader.PKGSize = data.ReadUInt64BigEndian();
61+
appPkgHeader.PKGSignedSize = data.ReadUInt32BigEndian();
62+
appPkgHeader.PKGCacheSize = data.ReadUInt32BigEndian();
63+
appPkgHeader.PFSImageSHA256 = data.ReadBytes(0x20);
64+
appPkgHeader.PFSSignedSHA256 = data.ReadBytes(0x20);
65+
appPkgHeader.PFSSplitSize0 = data.ReadUInt64BigEndian();
66+
appPkgHeader.PFSSplitSize1 = data.ReadUInt64BigEndian();
67+
appPkgHeader.Zeroes3 = data.ReadBytes(0xB50);
68+
appPkgHeader.PKGSHA256 = data.ReadBytes(0x20);
69+
70+
return appPkgHeader;
71+
}
72+
catch
73+
{
74+
// Ignore the actual error
75+
return null;
76+
}
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)