package net.vhati.modmanager.ui; import java.awt.Frame; import java.io.File; import java.io.InputStream; import java.io.IOException; import java.util.List; import javax.swing.JDialog; import javax.swing.SwingUtilities; import net.vhati.ftldat.FTLDat; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class DatExtractDialog extends ProgressDialog { private static final Logger log = LogManager.getLogger(DatExtractDialog.class); private boolean started = false; private File extractDir; private File[] datFiles; private DatExtractThread workerThread = null; public DatExtractDialog( Frame owner, File extractDir, File[] datFiles ) { super( owner, false ); this.setTitle( "Extracting..." ); this.extractDir = extractDir; this.datFiles = datFiles; this.setSize( 400, 160 ); this.setMinimumSize( this.getPreferredSize() ); this.setLocationRelativeTo( owner ); workerThread = new DatExtractThread( extractDir, datFiles ); } /** * Returns the worker thread that does the extracting. * * This method is provided so other classes can customize the thread * before calling extract(). */ public Thread getWorkerThread() { return workerThread; } /** * Starts the background extraction thread. * Call this immediately before setVisible(). */ public void extract() { if ( started ) return; workerThread.start(); started = true; } @Override protected void setTaskOutcome( boolean outcome, Exception e ) { super.setTaskOutcome( outcome, e ); if ( !this.isShowing() ) return; if ( succeeded ) { setStatusText( "All resources extracted successfully." ); } else { setStatusText( String.format( "Error extracting dats: %s", e ) ); } } private class DatExtractThread extends Thread { private File extractDir; private File[] datFiles; public DatExtractThread( File extractDir, File[] datFiles ) { this.extractDir = extractDir; this.datFiles = datFiles; } @Override public void run() { FTLDat.AbstractPack srcP = null; FTLDat.AbstractPack dstP = null; InputStream is = null; int progress = 0; try { if ( !extractDir.exists() ) extractDir.mkdirs(); dstP = new FTLDat.FolderPack( extractDir ); for ( File datFile : datFiles ) { srcP = new FTLDat.FTLPack( datFile, "r" ); progress = 0; List<String> innerPaths = srcP.list(); setProgressLater( progress, innerPaths.size() ); for ( String innerPath : innerPaths ) { setStatusTextLater( innerPath ); if ( dstP.contains( innerPath ) ) { log.info( "While extracting resources, this file was overwritten: "+ innerPath ); dstP.remove( innerPath ); } is = srcP.getInputStream( innerPath ); dstP.add( innerPath, is ); setProgressLater( progress++ ); } srcP.close(); } setTaskOutcomeLater( true, null ); } catch ( Exception ex ) { log.error( "Error extracting dats.", ex ); setTaskOutcomeLater( false, ex ); } finally { try {if ( is != null ) is.close();} catch ( IOException ex ) {} try {if ( srcP != null ) srcP.close();} catch ( IOException ex ) {} try {if ( dstP != null ) dstP.close();} catch ( IOException ex ) {} } } } }