package org.sinrel.engine.actions;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import org.sinrel.engine.Engine;
import org.sinrel.engine.library.NetManager;
import org.sinrel.engine.library.OSManager;
import org.sinrel.engine.library.ZipManager;
public class DefaultDownloader extends Downloader{
private ArrayList< String > basic = new ArrayList< String >(),
archives = new ArrayList< String >();
public DefaultDownloader() {
basic.add( "jinput.jar" );
basic.add( "lwjgl.jar" );
basic.add( "lwjgl_util.jar" );
basic.add( "minecraft.jar" );
archives.add( "client.zip" );
archives.add( "natives/"+OSManager.getPlatform().toString()+".zip" );
}
private DownloadEvent event = new DownloadEvent();
private Engine engine = null;
private String clientName = null;
private ArrayList< String > temp = new ArrayList< String >();
public DownloadResult downloadClient( Engine e , String clientName ) {
this.engine = e;
this.clientName = clientName;
basic.addAll( additionalFiles );
archives.addAll( additionalArchives );
temp.addAll( basic );
temp.addAll( archives );
event = new DownloadEvent();
event.setCurrentFileAddress( getFileAddress( basic.get( 0 ) ) );
event.setCurrentFileName( basic.get( 0 ) );
event.setCurrentFileNumber( 0 );
event.setCurrentFilePercents( 0 );
event.setCurrentFileSize( getFileSizeKB( basic.get( 0 ) ) );
event.setFilesAmount( temp.size() - 1 );
event.setTotalSize( getTotalSize() );
event.setNextFileAddress( getFileAddress( basic.get( 1 ) ) );
event.setNextFileName( basic.get( 1 ) );
for ( String s : temp ) {
if( !fileExist( getFileAddress( s ) ) ) {
System.err.println( "Файл не найден: " + getFileAddress( s ) );
return DownloadResult.FILE_NOT_EXIST;
}
}
onStartDownload( event );
delete( new File ( OSManager.getWorkingDirectory( engine ), clientName ) );
for ( int num = 0; num < temp.size(); num++ ) {
String filename = temp.get( num );
event.setCurrentFileAddress( getFileAddress( filename ) );
event.setCurrentFileName( filename );
event.setCurrentFileNumber( num );
event.setCurrentFileSize( getFileSizeKB( filename ) );
if( num != temp.size() - 1 ) {
event.setNextFileAddress( getFileAddress( temp.get( num + 1 ) ) );
event.setNextFileName( temp.get( num + 1 ) );
event.setNextFileSize( getFileSizeKB( temp.get( num + 1 ) ) );
}else{
event.setNextFileAddress( null );
event.setNextFileName( null );
event.setNextFileSize( -1 );
}
try {
download( event.getCurrentFileAddress(), new File( OSManager.getClientFolder( engine, clientName ), event.getCurrentFileName() ) );
} catch ( IOException ex ) {
return DownloadResult.FILE_NOT_EXIST;
}
onFileChange( event );
}
File to = OSManager.getClientWorkingDirectory( engine, clientName ),
from = OSManager.getClientFolder( engine, clientName );
for ( String s : archives ) {
if( s.equalsIgnoreCase( "natives/"+OSManager.getPlatform().toString()+".zip" ) ) {
ZipManager.unzip( new File( from, s ), new File( OSManager.getClientFolder( engine, clientName ), "natives") );
}else
ZipManager.unzip( new File( from, s ), to );
}
ZipManager.removeAllZipFiles( from );
ZipManager.removeAllZipFiles( new File( OSManager.getClientFolder( engine, clientName ), "natives") );
return DownloadResult.OK;
}
private boolean fileExist( URL address ) {
try {
HttpURLConnection con = (HttpURLConnection) address.openConnection();
if( con.getResponseCode() != 200 ) {
return false;
}
return true;
} catch ( IOException e ) {
return false;
}
}
private int getTotalSize() {
int sum = 0;
for ( String s : basic ) {
sum += getFileSizeKB( s );
}
for ( String s : archives ) {
sum += getFileSizeKB( s );
}
return sum;
}
private int getFileSizeKB( String filename ) {
try {
URLConnection connection = getFileAddress( filename ).openConnection();
connection.setDefaultUseCaches(false);
return connection.getContentLength() / 1024;
}catch( IOException e ) {
return 0;
}
}
private URL getFileAddress( String filename ) {
try {
return new URL( NetManager.getServerLink( this.engine ).concat( "clients/".concat( this.clientName.concat( "/bin/".concat( filename ) ) ) ) );
} catch ( MalformedURLException e ) {
return null;
}
}
private void download( URL url, File f ) throws IOException {
int size = getFileSizeKB( event.getCurrentFileName() );
f.mkdirs();
f.delete();
f.createNewFile();
URLConnection connection = url.openConnection();
long down = connection.getContentLength();
long downm = f.length();
if (downm != down) {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
BufferedInputStream bis = new BufferedInputStream(
conn.getInputStream());
FileOutputStream fw = new FileOutputStream(f);
byte[] b = new byte[1024];
int count = 0;
long total = 0;
while ((count = bis.read(b)) != -1) {
total += count;
fw.write(b, 0, count);
event.setCurrentFilePercents( (int) ( total * 100 ) / ( size * 1024 ) );
this.onPercentChange( event );
}
fw.close();
}else{
return;
}
}
private static void delete( File file ) {
if( !file.exists() ) return;
if( file.isDirectory() ) {
for(File f : file.listFiles())
delete(f);
file.delete();
}else{
file.delete();
}
}
}