From 626104209d636d3fdf957aa64c232eb150d46528 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sat, 6 Feb 2016 18:25:08 +0100 Subject: [PATCH] Added multi selection and meta downloader -added a progress function -added a meta download button -added mutli selection of titles -fixed byte[] to String function --- .gitignore | 3 +- jar/JNUSTool.jar | Bin 59097 -> 69735 bytes src/de/mas/jnustool/FEntry.java | 8 +- src/de/mas/jnustool/FEntryDownloader.java | 13 ++- src/de/mas/jnustool/FST.java | 18 +++- src/de/mas/jnustool/Logger.java | 8 ++ src/de/mas/jnustool/NUSTitle.java | 5 +- src/de/mas/jnustool/Progress.java | 92 ++++++++++++++++++ .../mas/jnustool/ProgressUpdateListener.java | 9 ++ src/de/mas/jnustool/Starter.java | 73 ++++++++++++-- src/de/mas/jnustool/gui/NUSGUI.java | 5 +- src/de/mas/jnustool/gui/UpdateChooser.java | 76 ++++++++++++--- src/de/mas/jnustool/util/Decryption.java | 25 ++++- src/de/mas/jnustool/util/Downloader.java | 5 +- .../jnustool/util/NUSTitleInformation.java | 16 +++ src/de/mas/jnustool/util/Util.java | 2 +- 16 files changed, 315 insertions(+), 43 deletions(-) create mode 100644 src/de/mas/jnustool/Progress.java create mode 100644 src/de/mas/jnustool/ProgressUpdateListener.java diff --git a/.gitignore b/.gitignore index af0b415..820ffc1 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,5 @@ bin /config /tmp* UpdateGrabber.java -updatetitles.csv \ No newline at end of file +updatetitles.csv +src/de/mas/jnustool/StarterPRIATE.java \ No newline at end of file diff --git a/jar/JNUSTool.jar b/jar/JNUSTool.jar index e58ef4d8902f47889b414f5644ef460c2fc5ae13..718d764290b0397e80b4198716742c23be465653 100644 GIT binary patch delta 49512 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 Od`y@mpFSpVkpBf^67Dzv delta 39077 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�)QEHD-B$U8~hirME6eMB-4}?}9;{f9j4n4u>WpOIyw$ z96wT#!ZL!8@t2SA^anK`)1uR`t}5K>WuRG)2Tn}W9*Rd4xpH0rTnI;H_4OOybQ`1-D6N!c*;x} zMd!KhHO&)J+`F8VTY*5p86AjKC3v-|pl(hNAMQ-sV@<%+{MFp;(RF&?e;;`=&D97>aVz+gfcxk0tj+Cz&M^Wwc72-ZkVX&u&!Z>}fERFOU^| z+(`A}EZs$lk#}yu2Zk5c<4vE^EzizvoG@58R9BtLTX`7I`c5FY%jp)q(<(xG$JTG3 zppfzf(*6Zxar+JSVuj%np{*My=}CiG{8;Y<3|lUqBOactb`?*mO^baEKs%H^d~3;z zubg9WKe<5b_rB(cksxD$nS&nw{%~aXJ5eXL?Yj<9`jmRL-pWrTty4&p$>%SAd)8JE zXi*?bwmyE#BPeJ>96!{BQL)}Qgr_tUE(R_5crZ`t?JH|Pis>q~{{C7mjK4st+dHE& z6i}InD^p{o7AjFrlMBSMWVNas#-EJR1=Tji+_t!Ua?~B#$uv7>8FwZn zUN~=t2XMWlZv+rf~Eew?!aVX85u-ORG-G{%jrnPu>ipZ1^2sDjnEwQn>-OvhK|~ zKt>>IC36wMcETqe);9_;>!aaU#+H;fHpOf=>3a`_Xp82=adhHz~nRrOj#u3l&S zHci<`g;D2iTH@ZgX<-?WH2<}guS1p&;{oLYQL0=BieF|O(mD`}?qoAS{8cU&uEpDt zRlNFpvBU?hTI>EYs$YC$G&W3xp@XXq9%ls9cpI*U7U`=RdF!af?o%fxb| z`a`=BX-m?~s9mJLgW~Jrv7^YUSpnGQVFQ7Nxw_2ac+(Dh%dGw?Z{6yNvxNis+>r>7 zk=eC;=ch|{=fpeKQkyPQUF1*OM|93+I2@~;J;V9L-g}d=(I?Vf!%et?>^wCOLbp&B zQ6|)OO`ebz4H8`F?~H|F`sS=N8&!-s2X0rySlw-puiDLlX9|1oUlp{dF*=Qz7yGTT z2iu)wTf5;Ltf~4%F&-7cDH*vm3l>(^C*-qFV9IhBJ@@YFd9L&bQbo(cY#%Peb&H%v ztc6*QsD*3Ed&KRmp1km1?9wz{(=_J(fvVN+0jkzdMgzPLQ4gNw*?hmuS}f+Ltrx67 zn8J*pm$nVxZ=%c}ddb}s!VUnbQUejSV4M zluE9cg031)t$ai+c~Jdq1h4ZXMRhlq)2i z;avUK&ubjlDklJeLTIkG#DXy>LH~I)ZHB6-U6{9sXri5Rv_OC~7%WL#k9N^{<1$Dn ziQY^ehyy$agP|$-U`#B_(Z|R^pcM?J!XUx|Cct18pp^(r3gBRXiHYdY;T+vM!Rs_H^3@{_}0(uDIt?+^&B%ymTp`&eLFj7|mbDgD1LnDp1eJY-SlJ~V(UHdqLQP!q_+1`GU= zaK4hT(nF;|Ie-$(|MmX=7KsJuO_ZG1WU#EzGTeYFF}kzAZg?Qj_0I0vpk$R9|4;z- z)!|j!p~naTq_M#GKrIoNhLrM}s+%K_fCE;*$Z`ap1)z-! z7RF$EbX9P~X!8bi@xWpL6CV0l3Vp8%E*O`OuNrxPH9W95#tr|g0vm7}A56}C<+Sv# z>lgdAuHj)Qj|ysF1|N(Ipzy(zfAD`Tn^>>mic$ZM)BYj<_2gi_M$Se5Aq5D)G|cGj z+-m>&9`IZvB@@vkI}k+xruaktyC?iQDVmHX`2e09V8TD-zZ+eZu4y`@{?U{p0`vbN z|1MMqfw-=bxM*vf3O1mW2z@eNyiNRc6F4G5pZVsik0_xb;;V0w7bCAI5pCw1N&LSH z$yN6!E4}D`F|h<%5oeVups%L^53-?=%@W_0gW|R zgUcoXQ~$X`{!R&iKpfXV^QJ3shXhRj2mJT< { FEntry f; + Progress progress = null; public void setTitle(FEntry f){ this.f = f; } - public FEntryDownloader(FEntry f){ + public FEntryDownloader(FEntry f,Progress fatherProgress){ setTitle(f); + createProgressListener(fatherProgress); } + private void createProgressListener(Progress fatherProgress) { + if(fatherProgress != null){ + progress = new Progress(); + progress.setTotal(f.getFileLength()); + fatherProgress.add(progress); + } + } @Override public Integer call() throws Exception { - f.downloadAndDecrypt(); + f.downloadAndDecrypt(progress); return null; } diff --git a/src/de/mas/jnustool/FST.java b/src/de/mas/jnustool/FST.java index 0d82986..5fb7b89 100644 --- a/src/de/mas/jnustool/FST.java +++ b/src/de/mas/jnustool/FST.java @@ -19,6 +19,7 @@ public class FST { int totalEntries = 0; int dirEntries = 0; public FEntry metaFENtry; + public List metaFolder = new ArrayList<>(); private Directory FSTDirectory = new Directory("root"); private Directory contentDirectory = new Directory("root"); @@ -165,6 +166,8 @@ public class FST { this.totalContentSize += fileLength; if(in_nus_title)this.totalContentSizeInNUS += fileLength; + boolean metafolder = false; + List pathList = new ArrayList<>(); //getting the full path of entry if(dir) @@ -180,7 +183,7 @@ public class FST { StringBuilder sb = new StringBuilder(); int k = 0; int nameoffoff,nameoff_entrypath; - + for( j=0; j getMetaFolder() { + return metaFolder; + } + public List getFileEntries() { return fileEntries; diff --git a/src/de/mas/jnustool/Logger.java b/src/de/mas/jnustool/Logger.java index 23fdfa5..d0046f9 100644 --- a/src/de/mas/jnustool/Logger.java +++ b/src/de/mas/jnustool/Logger.java @@ -1,5 +1,8 @@ package de.mas.jnustool; +import javax.swing.JFrame; +import javax.swing.JOptionPane; + import de.mas.jnustool.gui.NUSGUI; public class Logger { @@ -7,7 +10,12 @@ public class Logger { public static void log(String string) { NUSGUI.output.append(string + "\n"); NUSGUI.output.setCaretPosition(NUSGUI.output.getDocument().getLength()); + //System.out.println(string); } + + public static void messageBox(String string) { + JOptionPane.showMessageDialog(new JFrame(), string); + } } diff --git a/src/de/mas/jnustool/NUSTitle.java b/src/de/mas/jnustool/NUSTitle.java index 0a7a784..f66e8a7 100644 --- a/src/de/mas/jnustool/NUSTitle.java +++ b/src/de/mas/jnustool/NUSTitle.java @@ -214,15 +214,14 @@ public class NUSTitle { this.titleID = titleId; } - public void decryptFEntries(List list) { + public void decryptFEntries(List list,Progress progress) { ForkJoinPool pool = ForkJoinPool.commonPool(); List dlList = new ArrayList<>(); for(FEntry f : list){ if(!f.isDir() && f.isInNUSTitle()){ - dlList.add(new FEntryDownloader(f)); + dlList.add(new FEntryDownloader(f,progress)); } } - pool.invokeAll(dlList); Logger.log("Done!"); } diff --git a/src/de/mas/jnustool/Progress.java b/src/de/mas/jnustool/Progress.java new file mode 100644 index 0000000..36c2870 --- /dev/null +++ b/src/de/mas/jnustool/Progress.java @@ -0,0 +1,92 @@ +package de.mas.jnustool; + +import java.util.ArrayList; +import java.util.List; + +public class Progress { + private long total; + private long current; + private ProgressUpdateListener progressUpdateListener = null; + List children = new ArrayList<>(); + Progress father = null; + + + public long getTotalOfSingle() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public long getCurrentOfSingle() { + return current; + } + + public void setCurrent(long current) { + this.current = current; + update(); + } + + public void addCurrent(int i) { + if(this.current + i > getTotalOfSingle()){ + setCurrent(getTotalOfSingle()); + }else{ + setCurrent(getCurrent() + i); + } + + + } + + private void update() { + if(father != null) father.update(); + + if(progressUpdateListener != null){ + progressUpdateListener.updatePerformed(this); + } + } + + public void add(Progress progress) { + progress.setFather(this); + children.add(progress); + } + + private void setFather(Progress progressListener) { + this.father = progressListener; + } + + public long getCurrent() { + long tmp = getCurrentOfSingle(); + for(Progress p : children){ + tmp +=p.getCurrent(); + } + return tmp; + } + + public long getTotal() { + long tmp = getTotalOfSingle(); + for(Progress p : children){ + tmp +=p.getTotal(); + } + return tmp; + } + + public void setProgressUpdateListener(ProgressUpdateListener progressUpdateListener) { + this.progressUpdateListener = progressUpdateListener; + } + + public void clear() { + setCurrent(0); + setTotal(0); + children = new ArrayList<>(); + } + + public int statusInPercent() { + return (int) ((getCurrent()*1.0)/(getTotal()*1.0)*100); + } + + public void finish() { + setCurrent(getTotalOfSingle()); + } + +} diff --git a/src/de/mas/jnustool/ProgressUpdateListener.java b/src/de/mas/jnustool/ProgressUpdateListener.java new file mode 100644 index 0000000..6c921ee --- /dev/null +++ b/src/de/mas/jnustool/ProgressUpdateListener.java @@ -0,0 +1,9 @@ +package de.mas.jnustool; + +public interface ProgressUpdateListener { + /** + * Invoked when an action occurs. + */ + public void updatePerformed(Progress p); + +} diff --git a/src/de/mas/jnustool/Starter.java b/src/de/mas/jnustool/Starter.java index 6947fc3..2516f7a 100644 --- a/src/de/mas/jnustool/Starter.java +++ b/src/de/mas/jnustool/Starter.java @@ -6,6 +6,10 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; import de.mas.jnustool.gui.NUSGUI; import de.mas.jnustool.gui.UpdateChooser; @@ -37,23 +41,37 @@ public class Starter { if( args.length > 1 && args[1].length() == 32){ key = args[1].substring(0, 32); } + if(titleID != 0){ + NUSGUI m = new NUSGUI(new NUSTitle(titleID, key)); + m.setVisible(true); + } }else{ - titleID = getTitleID().getTitleID(); - } - if(titleID != 0){ - NUSGUI m = new NUSGUI(new NUSTitle(titleID, key), null); - m.setVisible(true); + for(NUSTitleInformation nus : getTitleID()){ + + final long tID = nus.getTitleID(); + new Thread(new Runnable() { + + @Override + public void run() { + NUSGUI m = new NUSGUI(new NUSTitle(tID, null)); + m.setVisible(true); + + } + }).start();; + } + } + } - private static NUSTitleInformation getTitleID() { + private static List getTitleID() { List updatelist = readUpdateCSV(); - NUSTitleInformation result = null; + List result = null; if(updatelist != null){ - result = new NUSTitleInformation(); + result = new ArrayList<>(); UpdateChooser.createAndShowGUI(updatelist,result); synchronized (result) { try { @@ -63,6 +81,9 @@ public class Starter { e.printStackTrace(); } } + }else{ + Logger.messageBox("Updatefile is missing or not in config?"); + System.exit(2); } return result; } @@ -80,6 +101,7 @@ public class Starter { while((line = in.readLine()) != null){ String[] infos = line.split(";"); if(infos.length != 7) { + Logger.messageBox("Updatelist is broken!"); System.out.println("Updatelist is broken!"); return null; } @@ -96,9 +118,10 @@ public class Starter { in.close(); } catch (IOException | NumberFormatException e) { try { - in.close(); + if(in != null)in.close(); } catch (IOException e1) { } + Logger.messageBox("Updatelist is broken or missing"); System.out.println("Updatelist is broken!"); return null; } @@ -112,6 +135,7 @@ public class Starter { Downloader.URL_BASE = in.readLine(); String commonkey = in.readLine(); if(commonkey.length() != 32){ + Logger.messageBox("CommonKey length is wrong"); System.out.println("Commonkey length is wrong"); System.exit(1); } @@ -121,4 +145,35 @@ public class Starter { } + + + public static void downloadMeta(List output_, Progress totalProgress) { + ForkJoinPool pool = ForkJoinPool.commonPool(); + List> list = new ArrayList<>(); + for(NUSTitleInformation nus : output_){ + final long tID = nus.getTitleID(); + list.add(pool.submit(new Callable(){ + @Override + public Boolean call() throws Exception { + NUSTitle nus = new NUSTitle(tID, null); + Progress childProgress = new Progress(); + totalProgress.add(childProgress); + nus.decryptFEntries(nus.getFst().getMetaFolder(),childProgress); + return true; + } + })); + } + for(ForkJoinTask task : list){ + try { + task.get(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } diff --git a/src/de/mas/jnustool/gui/NUSGUI.java b/src/de/mas/jnustool/gui/NUSGUI.java index af1d2fb..803174a 100644 --- a/src/de/mas/jnustool/gui/NUSGUI.java +++ b/src/de/mas/jnustool/gui/NUSGUI.java @@ -18,13 +18,12 @@ import javax.swing.tree.TreePath; import de.mas.jnustool.FEntry; import de.mas.jnustool.NUSTitle; -import de.mas.jnustool.util.Settings; public class NUSGUI extends JFrame { private static final long serialVersionUID = 4648172894076113183L; public static JTextArea output = new JTextArea(1,10); - public NUSGUI(NUSTitle nus,Settings mode) { + public NUSGUI(NUSTitle nus) { super(); this.setResizable(false); setSize(600, 768); @@ -64,7 +63,7 @@ public class NUSGUI extends JFrame { } } - nus.decryptFEntries(list); + nus.decryptFEntries(list, null); }}).start(); } diff --git a/src/de/mas/jnustool/gui/UpdateChooser.java b/src/de/mas/jnustool/gui/UpdateChooser.java index 7bda788..9ecb2df 100644 --- a/src/de/mas/jnustool/gui/UpdateChooser.java +++ b/src/de/mas/jnustool/gui/UpdateChooser.java @@ -15,7 +15,9 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; +import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; @@ -25,6 +27,9 @@ import javax.swing.ScrollPaneConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import de.mas.jnustool.Progress; +import de.mas.jnustool.ProgressUpdateListener; +import de.mas.jnustool.Starter; import de.mas.jnustool.util.NUSTitleInformation; public class UpdateChooser extends JPanel { @@ -42,7 +47,8 @@ public class UpdateChooser extends JPanel { setSize(800, 600); Collections.sort(list_); - output_.init(list_.get(0)); + + output_.add(list_.get(0)); String[] columnNames = { "TitleID", "Region", "Name" }; String[][] tableData = new String[list_.size()][]; int i = 0; @@ -95,7 +101,7 @@ public class UpdateChooser extends JPanel { listSelectionModel.setSelectionMode( - ListSelectionModel.SINGLE_SELECTION); + ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); //Build output area. output = new JTextArea(1, 10); @@ -123,38 +129,75 @@ public class UpdateChooser extends JPanel { splitPane.add(topHalf); JPanel listContainer = new JPanel(new GridLayout(1,1)); add(listContainer, BorderLayout.NORTH); - JButton btnNewButton = new JButton("Okay"); + + JPanel panel = new JPanel(); + add(panel, BorderLayout.SOUTH); + JButton btnNewButton = new JButton("Open FST"); + panel.add(btnNewButton); + JProgressBar progressBar; + progressBar = new JProgressBar(0, 100); + progressBar.setValue(0); + progressBar.setStringPainted(true); + + JButton btnDownloadMeta = new JButton("Download META"); + JProgressBar progressBar_1 = new JProgressBar(); + panel.add(progressBar_1); + progressBar_1.setValue(0); + Progress progress = new Progress(); + progress.setProgressUpdateListener(new ProgressUpdateListener() { + + @Override + public void updatePerformed(Progress p) { + progressBar_1.setValue((int)p.statusInPercent()); + } + }); + + btnDownloadMeta.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(progressBar_1.getValue() == 0 || progressBar_1.getValue() == 100){ + progressBar_1.setValue(1); + progress.clear(); + new Thread(new Runnable(){ + @Override + public void run() { + Starter.downloadMeta(output_,progress); + JOptionPane.showMessageDialog(window, "Finished"); + } + + }).start(); + + }else{ + JOptionPane.showMessageDialog(window, "Operation still in progress, please wait"); + } + } + }); + panel.add(btnDownloadMeta); + + btnNewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - System.out.println("lol"); + public void actionPerformed(ActionEvent e) { synchronized (output_) { window.setVisible(false); output_.notifyAll(); } - } }); - - - add(btnNewButton, BorderLayout.SOUTH); JPanel bottomHalf = new JPanel(new BorderLayout()); bottomHalf.add(controlPane, BorderLayout.PAGE_START); bottomHalf.add(outputPane, BorderLayout.CENTER); - //XXX: next line needed if bottomHalf is a scroll pane: - //bottomHalf.setMinimumSize(new Dimension(400, 50)); } - private static NUSTitleInformation output_; + private static List output_; static List list_; - public static void createAndShowGUI(List list,NUSTitleInformation output) { + public static void createAndShowGUI(List list,List result) { //Create and set up the window. JFrame frame = new JFrame("Select the title"); //Create and set up the content pane. list_ = list; - output_ =output; + output_ =result; UpdateChooser demo = new UpdateChooser(frame); demo.setOpaque(true); frame.setContentPane(demo); @@ -178,9 +221,12 @@ public class UpdateChooser extends JPanel { // Find out which indexes are selected. int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); + output_.clear(); for (int i = minIndex; i <= maxIndex; i++) { if (lsm.isSelectedIndex(i)) { - output_.init(list_.get(i)); + if(!output_.contains(list_.get(i))){ + output_.add(list_.get(i)); + } } } } diff --git a/src/de/mas/jnustool/util/Decryption.java b/src/de/mas/jnustool/util/Decryption.java index f2ebc43..cfe0467 100644 --- a/src/de/mas/jnustool/util/Decryption.java +++ b/src/de/mas/jnustool/util/Decryption.java @@ -20,6 +20,7 @@ import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import de.mas.jnustool.FEntry; +import de.mas.jnustool.Progress; import de.mas.jnustool.TIK; public class Decryption { @@ -171,6 +172,10 @@ public class Decryption { boolean first = true; ByteArrayBuffer overflow = new ByteArrayBuffer(BLOCKSIZE); + if(progressListener != null){ + progressListener.setTotal(toDownload.getFileLength()); + progressListener.setCurrent(0); + } do{ inBlockBuffer = getChunkFromStream(inputStream,blockBuffer,overflow,BLOCKSIZE); if(first){ @@ -184,7 +189,9 @@ public class Decryption { if((wrote + inBlockBuffer) > toDownload.getFileLength()){ inBlockBuffer = (int) (toDownload.getFileLength()- wrote); } - + if(progressListener != null){ + progressListener.addCurrent(inBlockBuffer); + } wrote += inBlockBuffer; outputStream.write(output, 0, inBlockBuffer); }while(inBlockBuffer == BLOCKSIZE); @@ -209,9 +216,16 @@ public class Decryption { long wrote = 0; int inBlockBuffer; + + if(progressListener != null){ + progressListener.setTotal(toDownload.getFileLength()/HASHBLOCKSIZE*BLOCKSIZE); + progressListener.setCurrent(0); + } do{ inBlockBuffer = getChunkFromStream(inputStream,encryptedBlockBuffer,overflow,BLOCKSIZE); - + if(progressListener != null){ + progressListener.addCurrent(inBlockBuffer); + } if( writeSize > size ) writeSize = size; @@ -295,5 +309,12 @@ public class Decryption { return inBlockBuffer; } + private Progress progressListener = null; + + public void setProgressListener(Progress progressOfFile) { + this.progressListener = progressOfFile; + + } + } diff --git a/src/de/mas/jnustool/util/Downloader.java b/src/de/mas/jnustool/util/Downloader.java index 6989f6b..41a26fc 100644 --- a/src/de/mas/jnustool/util/Downloader.java +++ b/src/de/mas/jnustool/util/Downloader.java @@ -7,6 +7,7 @@ import java.net.HttpURLConnection; import java.net.URL; import de.mas.jnustool.FEntry; +import de.mas.jnustool.Progress; public class Downloader { private static Downloader instance; @@ -22,7 +23,7 @@ public class Downloader { } - public void downloadAndDecrypt(FEntry toDownload) throws IOException{ + public void downloadAndDecrypt(FEntry toDownload, Progress progressOfFile) throws IOException{ String URL = URL_BASE + "/" + String.format("%016X", toDownload.getTitleID()) + "/" + String.format("%08X", toDownload.getNUScontentID()); URL url = new URL(URL); String [] path = toDownload.getFullPath().split("/"); @@ -45,7 +46,7 @@ public class Downloader { connection.connect(); Decryption decryption = new Decryption(toDownload.getTicket()); - + decryption.setProgressListener(progressOfFile); InputStream input = connection.getInputStream(); FileOutputStream outputStream = new FileOutputStream(String.format("%016X", toDownload.getTitleID()) +"/" + toDownload.getFullPath().substring(1, toDownload.getFullPath().length())); if(!decryptWithHash){ diff --git a/src/de/mas/jnustool/util/NUSTitleInformation.java b/src/de/mas/jnustool/util/NUSTitleInformation.java index b73b418..2083050 100644 --- a/src/de/mas/jnustool/util/NUSTitleInformation.java +++ b/src/de/mas/jnustool/util/NUSTitleInformation.java @@ -12,6 +12,7 @@ public class NUSTitleInformation implements Comparable, Ser private String content_platform; private String company_code; private int region; + private byte[] key; public enum Region{ @@ -123,6 +124,21 @@ public class NUSTitleInformation implements Comparable, Ser setID6(n.ID6); setLongnameEN(n.longnameEN); setProduct_code(n.product_code); + setKey(n.key); } + public byte[] getKey() { + return key; + } + + public void setKey(byte[] key) { + this.key = key; + } + + @Override + public boolean equals(Object o){ + return titleID == ((NUSTitleInformation)o).titleID; + } + + } diff --git a/src/de/mas/jnustool/util/Util.java b/src/de/mas/jnustool/util/Util.java index f4a366f..c7eff97 100644 --- a/src/de/mas/jnustool/util/Util.java +++ b/src/de/mas/jnustool/util/Util.java @@ -23,7 +23,7 @@ public class Util { { StringBuilder hex = new StringBuilder(ba.length * 2); for(byte b : ba){ - hex.append(String.format("%X", b)); + hex.append(String.format("%02X", b)); } return hex.toString(); }