From 0132848dae398426653774d3cda133ed5bb0a02b Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 4 Jun 2019 12:14:08 +0200 Subject: [PATCH] Refactor the WUD loading. --- .../PartitionFuseContainer.java | 38 ++++++++++ .../RecursivePartitionFuseContainer.java | 72 +++++++++++++++++++ .../implementation/WUDFuseContainer.java | 34 +++------ .../WUDMountedFuseContainer.java | 66 +++-------------- 4 files changed, 132 insertions(+), 78 deletions(-) create mode 100644 src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/PartitionFuseContainer.java create mode 100644 src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/RecursivePartitionFuseContainer.java diff --git a/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/PartitionFuseContainer.java b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/PartitionFuseContainer.java new file mode 100644 index 0000000..6ee5464 --- /dev/null +++ b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/PartitionFuseContainer.java @@ -0,0 +1,38 @@ +package de.mas.wiiu.jnus.fuse_wiiu.implementation; + +import java.io.File; +import java.util.List; +import java.util.Optional; + +import de.mas.wiiu.jnus.fuse_wiiu.interfaces.FuseDirectory; +import de.mas.wiiu.jnus.interfaces.FSTDataProvider; +import lombok.val; + +public abstract class PartitionFuseContainer extends GroupFuseContainer { + private final File file; + + public PartitionFuseContainer(Optional parent, File file) { + super(parent); + this.file = file; + } + + @Override + protected void doInit() { + Optional infoOpt = loadInfo(file); + if (infoOpt.isPresent()) { + parseContents(getDataProvider(infoOpt.get())); + } else { + System.err.println("Failed to parse " + file.getAbsolutePath()); + } + } + + protected abstract Optional loadInfo(File input); + + abstract protected List getDataProvider(T info); + + void parseContents(List dps) { + for (val dp : dps) { + this.addFuseContainer(dp.getName(), new FSTDataProviderContainer(getParent(), dp)); + } + } +} diff --git a/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/RecursivePartitionFuseContainer.java b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/RecursivePartitionFuseContainer.java new file mode 100644 index 0000000..806cea3 --- /dev/null +++ b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/RecursivePartitionFuseContainer.java @@ -0,0 +1,72 @@ +package de.mas.wiiu.jnus.fuse_wiiu.implementation; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.List; +import java.util.Optional; + +import de.mas.wiiu.jnus.NUSTitleLoaderFST; +import de.mas.wiiu.jnus.entities.fst.FSTEntry; +import de.mas.wiiu.jnus.fuse_wiiu.Settings; +import de.mas.wiiu.jnus.fuse_wiiu.interfaces.FuseDirectory; +import de.mas.wiiu.jnus.implementations.FSTDataProviderNUSTitle; +import de.mas.wiiu.jnus.interfaces.FSTDataProvider; +import de.mas.wiiu.jnus.interfaces.HasNUSTitle; +import de.mas.wiiu.jnus.utils.FSTUtils; + +public abstract class RecursivePartitionFuseContainer extends PartitionFuseContainer { + public RecursivePartitionFuseContainer(Optional parent, File input) { + super(parent, input); + } + + @Override + void parseContents(List dps) { + try { + for (FSTDataProvider dp : dps) { + for (FSTEntry tmd : FSTUtils.getFSTEntriesByRegEx(dp.getRoot(), ".*tmd")) { + Optional parentOpt = tmd.getParent(); + if (parentOpt.isPresent()) { + FSTEntry parent = parentOpt.get(); + if (parent.getFileChildren().stream().filter(f -> f.getFilename().endsWith(".app")).findAny().isPresent()) { + FSTDataProvider fdp = null; + + try { + fdp = new FSTDataProviderNUSTitle(NUSTitleLoaderFST.loadNUSTitle(dp, parent, Settings.retailCommonKey)); + } catch (IOException | ParseException e) { + try { + fdp = new FSTDataProviderNUSTitle(NUSTitleLoaderFST.loadNUSTitle(dp, parent, Settings.devCommonKey)); + } catch (Exception e1) { + System.out.println("Ignoring " + parent.getFilename() + " :" + e1.getClass().getName() + " " + e1.getMessage()); + continue; + } + } catch (Exception e) { + System.out.println("Ignoring " + parent.getFilename() + " :" + e.getClass().getName() + " " + e.getMessage()); + continue; + } + + FSTDataProvider fdpCpy = fdp; + + this.addFuseContainer("[DECRYPTED] [" + dp.getName() + "] " + parent.getFilename(), + new FSTDataProviderContainer(getParent(), fdpCpy)); + } + } + + } + + if (dp instanceof HasNUSTitle) { + try { + this.addFuseContainer("[ENCRYPTED] " + dp.getName(), new NUSTitleEncryptedFuseContainer(getParent(), ((HasNUSTitle) dp).getNUSTitle())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + +} diff --git a/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDFuseContainer.java b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDFuseContainer.java index a363ad2..27a2805 100644 --- a/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDFuseContainer.java +++ b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDFuseContainer.java @@ -13,49 +13,37 @@ import de.mas.wiiu.jnus.fuse_wiiu.interfaces.FuseDirectory; import de.mas.wiiu.jnus.fuse_wiiu.utils.WUDUtils; import de.mas.wiiu.jnus.implementations.wud.parser.WUDInfo; import de.mas.wiiu.jnus.interfaces.FSTDataProvider; -import lombok.val; -public class WUDFuseContainer extends GroupFuseContainer { - private final File input; +public class WUDFuseContainer extends PartitionFuseContainer { public WUDFuseContainer(Optional parent, File input) { - super(parent); - this.input = input; + super(parent, input); } @Override - protected void doInit() { - Optional WUDInfoOpt = WUDUtils.loadWUDInfo(input); - if (WUDInfoOpt.isPresent()) { - parseContents(WUDInfoOpt.get()); - } else { - System.out.println("Failed to parse WUD/WUX " + input.getAbsolutePath()); - } + protected Optional loadInfo(File input) { + return WUDUtils.loadWUDInfo(input); } - protected void parseContents(WUDInfo wudInfo) { + @Override + protected List getDataProvider(WUDInfo info) { List dps = new ArrayList<>(); try { - dps = WUDLoader.getPartitonsAsFSTDataProvider(wudInfo, Settings.retailCommonKey); + dps = WUDLoader.getPartitonsAsFSTDataProvider(info, Settings.retailCommonKey); } catch (ParseException e) { try { - dps = WUDLoader.getPartitonsAsFSTDataProvider(wudInfo, Settings.devCommonKey); + dps = WUDLoader.getPartitonsAsFSTDataProvider(info, Settings.devCommonKey); } catch (IOException | ParseException e1) { e.printStackTrace(); e1.printStackTrace(); - System.out.println("Ignoring " + input.getAbsolutePath() + " :" + e1.getClass().getName() + " " + e1.getMessage()); + // System.out.println("Ignoring " + input.getAbsolutePath() + " :" + e1.getClass().getName() + " " + e1.getMessage()); } } catch (Exception e) { e.printStackTrace(); - System.out.println("Ignoring " + input.getAbsolutePath() + " :" + e.getClass().getName() + " " + e.getMessage()); + // System.out.println("Ignoring " + input.getAbsolutePath() + " :" + e.getClass().getName() + " " + e.getMessage()); } - - for (val dp : dps) { - this.addFuseContainer(dp.getName(), new FSTDataProviderContainer(getParent(), dp)); - } - + return dps; } - } diff --git a/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDMountedFuseContainer.java b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDMountedFuseContainer.java index c1277c9..bf07303 100644 --- a/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDMountedFuseContainer.java +++ b/src/main/java/de/mas/wiiu/jnus/fuse_wiiu/implementation/WUDMountedFuseContainer.java @@ -7,81 +7,37 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import de.mas.wiiu.jnus.NUSTitleLoaderFST; import de.mas.wiiu.jnus.WUDLoader; -import de.mas.wiiu.jnus.entities.fst.FSTEntry; import de.mas.wiiu.jnus.fuse_wiiu.Settings; import de.mas.wiiu.jnus.fuse_wiiu.interfaces.FuseDirectory; -import de.mas.wiiu.jnus.implementations.FSTDataProviderNUSTitle; +import de.mas.wiiu.jnus.fuse_wiiu.utils.WUDUtils; import de.mas.wiiu.jnus.implementations.wud.parser.WUDInfo; import de.mas.wiiu.jnus.interfaces.FSTDataProvider; -import de.mas.wiiu.jnus.interfaces.HasNUSTitle; -import de.mas.wiiu.jnus.utils.FSTUtils; -public class WUDMountedFuseContainer extends WUDFuseContainer { +public class WUDMountedFuseContainer extends RecursivePartitionFuseContainer { public WUDMountedFuseContainer(Optional parent, File input) { super(parent, input); } @Override - protected void parseContents(WUDInfo wudinfo) { + protected List getDataProvider(WUDInfo info) { List dps = new ArrayList<>(); try { - dps = WUDLoader.getPartitonsAsFSTDataProvider(wudinfo, Settings.retailCommonKey); + dps = WUDLoader.getPartitonsAsFSTDataProvider(info, Settings.retailCommonKey); } catch (Exception e) { try { - dps = WUDLoader.getPartitonsAsFSTDataProvider(wudinfo, Settings.devCommonKey); + dps = WUDLoader.getPartitonsAsFSTDataProvider(info, Settings.devCommonKey); } catch (IOException | ParseException e1) { - return; + return dps; } } + return dps; + } - try { - for (FSTDataProvider dp : dps) { - for (FSTEntry tmd : FSTUtils.getFSTEntriesByRegEx(dp.getRoot(), ".*tmd")) { - Optional parentOpt = tmd.getParent(); - if (parentOpt.isPresent()) { - FSTEntry parent = parentOpt.get(); - if (parent.getFileChildren().stream().filter(f -> f.getFilename().endsWith(".app")).findAny().isPresent()) { - FSTDataProvider fdp = null; - - try { - fdp = new FSTDataProviderNUSTitle(NUSTitleLoaderFST.loadNUSTitle(dp, parent, Settings.retailCommonKey)); - } catch (IOException | ParseException e) { - try { - fdp = new FSTDataProviderNUSTitle(NUSTitleLoaderFST.loadNUSTitle(dp, parent, Settings.devCommonKey)); - } catch (Exception e1) { - System.out.println("Ignoring " + parent.getFilename() + " :" + e1.getClass().getName() + " " + e1.getMessage()); - continue; - } - } catch (Exception e) { - System.out.println("Ignoring " + parent.getFilename() + " :" + e.getClass().getName() + " " + e.getMessage()); - continue; - } - - FSTDataProvider fdpCpy = fdp; - - this.addFuseContainer("[DECRYPTED] [" + dp.getName() + "] " + parent.getFilename(), - new FSTDataProviderContainer(getParent(), fdpCpy)); - } - } - - } - - if (dp instanceof HasNUSTitle) { - try { - this.addFuseContainer("[ENCRYPTED] " + dp.getName(), new NUSTitleEncryptedFuseContainer(getParent(), ((HasNUSTitle) dp).getNUSTitle())); - } catch (Exception e) { - e.printStackTrace(); - } - } - - } - } catch (Exception e) { - e.printStackTrace(); - } - + @Override + protected Optional loadInfo(File input) { + return WUDUtils.loadWUDInfo(input); } }