public static FSDir MakeRoot(ParamSfo sfo = null, FSFile[] sc0Files = null) { if (sfo == null) { sfo = ParamSfo.DefaultAC; } var root = new FSDir(); var sysDir = new FSDir() { name = "sce_sys", Parent = root, }; sysDir.Files.Add(new FSFile(s => sfo.Write(s), "param.sfo", sfo.FileSize) { Parent = sysDir }); if (sc0Files != null) { foreach (var f in sc0Files) { sysDir.Files.Add(f); f.Parent = sysDir; } } root.Dirs.Add(sysDir); return(root); }
public void SerializationConformanceTest() { var testFiles = GetTestFiles(); foreach (var testFile in testFiles) { var filename = Path.GetFileNameWithoutExtension(testFile); TestContext.Progress.WriteLine(filename); using (var originalStream = new MemoryStream()) { using (var file = File.Open(testFile, FileMode.Open, FileAccess.Read, FileShare.Read)) file.CopyTo(originalStream); originalStream.Seek(0, SeekOrigin.Begin); var sfo = ParamSfo.ReadFrom(originalStream); var title = sfo.Items.FirstOrDefault(i => i.Key == "TITLE"); Assert.That(title, Is.Not.Null); var text = title.StringValue; Assert.That(text, Is.Not.Null); title.StringValue = text; using (var resultStream = new MemoryStream()) { sfo.WriteTo(resultStream); var originalBytes = originalStream.ToArray(); var resultBytes = resultStream.ToArray(); Assert.That(resultBytes, Is.EqualTo(originalBytes), filename); } } } }
public static async Task Identify() { string directory = await Interaction.Instance.GetJBDirectory(); if (string.IsNullOrEmpty(directory)) { return; } if (!IsValidDirectory(directory)) { Interaction.Instance.ReportMessage("Invalid JB directory", ReportType.Fail); return; } // Parse PARAM.SFO ParamSfo sfo = ParamSfo.Load(System.IO.Path.Combine(directory, "PS3_GAME\\PARAM.SFO")); string gameid = sfo.GetStringValue("TITLE_ID"); string appver = sfo.GetStringValue("APP_VER"); string gamever = sfo.GetStringValue("VERSION"); Interaction.Instance.ReportMessage("Title: " + sfo.GetStringValue("TITLE")); Interaction.Instance.ReportMessage("Game ID: " + gameid); Interaction.Instance.ReportMessage("App version: " + appver); Interaction.Instance.ReportMessage("Release version: " + gamever); await IrdUploader.Search(gameid, appver, gamever); }
public void TestSfoValueAddRemove() { var sfo = new ParamSfo(); sfo.SetValue("TestKey", SfoEntryType.Integer, "1234"); Assert.IsNotNull(sfo["TestKey"]); sfo["TestKey"] = null; Assert.IsNull(sfo["TestKey"]); Assert.AreEqual(0, sfo.Values.Count); }
private static FSDir MakeRoot(ParamSfo sfo = null) { if (sfo == null) { sfo = ParamSfo.DefaultAC; } var root = new FSDir(); var sysDir = new FSDir() { name = "sce_sys", Parent = root, }; sysDir.Files.Add(new FSFile(s => sfo.Write(s), "param.sfo", sfo.FileSize) { Parent = sysDir }); root.Dirs.Add(sysDir); return(root); }
public void TestSfoWriteRead() { var sfo = new ParamSfo(); sfo.SetValue("KEY1", SfoEntryType.Integer, "1234"); sfo.SetValue("KEY2", SfoEntryType.Utf8, "This is the title", 32); sfo.SetValue("KEY3", SfoEntryType.Utf8Special, "This is a special string", 32); sfo.SetValue("KEY4", SfoEntryType.Integer, "0x1234"); using (var ms = new MemoryStream()) { sfo.Write(ms); ms.Seek(0, SeekOrigin.Begin); var sfo2 = ParamSfo.FromStream(ms); Assert.AreEqual((sfo2["KEY1"] as IntegerValue).Value, 1234); Assert.AreEqual((sfo2["KEY2"] as Utf8Value).Value, "This is the title"); Assert.AreEqual((sfo2["KEY3"] as Utf8SpecialValue).Value, "This is a special string"); Assert.AreEqual((sfo2["KEY4"] as IntegerValue).Value, 0x1234); } }
public static List <ValidateResult> ValidateProject(Gp4Project proj, string projDir) { var ret = new List <ValidateResult>(); foreach (var check in commonChecks) { var result = check(proj, projDir); if (result != null) { ret.Add(result); } } // Checks with project and SFO file if (proj.files.Items.Where(f => f.TargetPath == "sce_sys/param.sfo").FirstOrDefault() is Gp4File sfoFile && Path.Combine(projDir, sfoFile.OrigPath) is string sfoPath && File.Exists(sfoPath)) { ParamSfo sfoObject = null; try { using (var f = File.OpenRead(sfoPath)) { sfoObject = ParamSfo.FromStream(f); } } catch (Exception e) { ret.Add(ValidateResult.Fatal("Could not load param.sfo file: " + e.Message)); } if (sfoObject != null) { foreach (var check in sfoChecks) { var result = check(proj, projDir, sfoObject); if (result != null) { ret.Add(result); } } } }
private bool CheckParams(IrdFile irdFile) { // Check the game id ParamSfo sfo = ParamSfo.Load(System.IO.Path.Combine(Path, @"PS3_GAME\PARAM.SFO")); string gameID = sfo.GetStringValue("TITLE_ID"); if (gameID != irdFile.GameID) { Interaction.Instance.ReportMessage( string.Format("This IRD file is for another game (IRD File: {0}, JB Rip: {1})", irdFile.GameID, gameID), ReportType.Fail); return(false); } // Check the game version string gameVersion = sfo.GetStringValue("VERSION"); if (gameVersion != irdFile.GameVersion) { Interaction.Instance.ReportMessage( string.Format("This IRD file is for another release version (IRD File: {0}, JB Rip: {1})", irdFile.GameVersion, gameVersion), ReportType.Fail); return(false); } // Check the game version string appVersion = sfo.GetStringValue("APP_VER"); if (appVersion != irdFile.AppVersion) { Interaction.Instance.ReportMessage( string.Format("This IRD file is for another application version (IRD File: {0}, JB Rip: {1})", irdFile.AppVersion, appVersion), ReportType.Fail); return(false); } return(true); }
private static ValidateResult checkCategoryMatchesPkgType(Gp4Project proj, string dir, ParamSfo sfo) { var sfoCategory = sfo["CATEGORY"].ToString(); var pkgType = proj.volume.Type; bool ok = true; switch (pkgType) { case VolumeType.pkg_ps4_app: if (!sfoCategory.StartsWith("g")) { ok = false; } break; case VolumeType.pkg_ps4_ac_data: case VolumeType.pkg_ps4_ac_nodata: case VolumeType.pkg_ps4_theme: case VolumeType.pkg_ps4_sf_theme: if (sfoCategory != "ac") { ok = false; } break; } if (!ok) { return(ValidateResult.Warning( $"SFO CATEGORY {sfoCategory} is not valid for PKG volume type {pkgType}.")); } return(null); }
private static ValidateResult checkContentIdMatchesTitleIdSfo(Gp4Project proj, string dir, ParamSfo sfo) { var sfoContentId = sfo["CONTENT_ID"].ToString(); var sfoTitleId = sfo["TITLE_ID"].ToString(); if (sfoContentId.Substring(7).StartsWith(sfoTitleId)) { return(null); } return(ValidateResult.Warning( $"SFO TITLE_ID {sfoTitleId} does not match the CONTENT_ID {sfoContentId}.")); }
private static ValidateResult checkContentIdMatchesSfo(Gp4Project proj, string dir, ParamSfo sfo) { var pkgContentId = proj.volume.Package.ContentId; var sfoContentId = sfo["CONTENT_ID"].ToString(); if (pkgContentId != sfoContentId) { return(ValidateResult.Warning( $"PKG Content ID {pkgContentId} does not match CONTENT_ID {sfoContentId} in param.sfo.")); } return(null); }