package de.mas.wiiu.jnus.jnustool; import java.io.File; import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger; import de.mas.wiiu.jnus.jnustool.util.Downloader; import de.mas.wiiu.jnus.jnustool.util.Settings; import de.mas.wiiu.jnus.jnustool.util.Util; /** * Content file of the NUSTitle. Holds the encrpyted files * * Thanks to crediar for the offsets in CDecrypt * @author Maschell * */ public class Content { /** * TODO: make it simpler */ int ID; // 0 0xB04 short index; // 4 0xB08 short type; // 6 0xB0A long size; // 8 0xB0C byte[] SHA2 = new byte[32]; // 16 0xB14 TitleMetaData tmd; AtomicInteger error_output_done = new AtomicInteger(0); public Content(int ID, short index, short type, long size, byte[] SHA2,TitleMetaData tmd) { this.ID = ID; this.index = index; this.type = type; this.size = size; this.SHA2 = SHA2; this.tmd = tmd; } /** * Downloads the content files (encrypted) * @param progress: A progress object can be used to get informations of the progress. Will be ignored when null is used. * @throws IOException */ public void download(Progress progress) throws IOException{ String tmpPath = tmd.getContentPath(); File f = new File(tmpPath + "/" + String.format("%08X", ID ) + ".app"); if(f.exists()){ if(f.length() == size){ Logger.log("Skipping Content: " + String.format("%08X", ID)); if(progress != null){ progress.addCurrent((int) size); } }else{ if(Settings.downloadWhenCachedFilesMissingOrBroken){ Logger.log("Content " +String.format("%08X", ID) + " has a different filesize and may be broken. Downloading it again."); new File(tmpPath).delete(); Logger.log("Downloading Content: " + String.format("%08X", ID)); Downloader.getInstance().downloadContent(tmd.titleID,ID,tmpPath,progress); }else{ if(Settings.skipBrokenFiles){ Logger.log("Content " +String.format("%08X", ID) + " is broken. Ignoring it."); }else{ Logger.log("Content " +String.format("%08X", ID) + " is broken. Downloading not allowed."); System.exit(2); } } } }else{ Logger.log("Downloading Content: " + String.format("%08X", ID)); Downloader.getInstance().downloadContent(tmd.titleID,ID,tmpPath,progress); } if ((type & 0x2003) == 0x2003){ f = new File(tmpPath + "/" + String.format("%08X", ID ) + ".h3"); if(!f.exists()){ Logger.log("Downloading H3: " + String.format("%08X.h3", ID)); Downloader.getInstance().downloadContentH3(tmd.titleID,ID,tmpPath,null); }else{ Logger.log("Skipping H3: " + String.format("%08X.h3", ID)); } } } @Override public String toString(){ return "ID: " + ID +" index: " + index + " type: " + type + " size: " + size + " SHA2: " + Util.ByteArrayToString(SHA2); } public long getSize() { return size; } public void setSize(long size) { this.size = size; } public int getContentID() { return ID; } }