mirror of
https://github.com/tonikelope/megabasterd.git
synced 2025-05-28 12:30:23 +02:00
3.1
This commit is contained in:
parent
a049646f93
commit
6f0bb56067
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.tonikelope</groupId>
|
||||
<artifactId>MegaBasterd</artifactId>
|
||||
<version>3.0</version>
|
||||
<version>3.1</version>
|
||||
<packaging>jar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
|
@ -2,6 +2,8 @@ package com.tonikelope.megabasterd;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import static java.lang.String.valueOf;
|
||||
|
||||
/**
|
||||
@ -10,14 +12,35 @@ import static java.lang.String.valueOf;
|
||||
*/
|
||||
public final class Chunk {
|
||||
|
||||
public class ByteArrayOutInputStream extends ByteArrayOutputStream {
|
||||
|
||||
public ByteArrayOutInputStream(int size) {
|
||||
super(size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an input stream based on the contents of this output stream. Do
|
||||
* not use the output stream after calling this method.
|
||||
*
|
||||
* @return an {@link InputStream}
|
||||
*/
|
||||
public ByteArrayInputStream toInputStream() {
|
||||
return new ByteArrayInputStream(this.buf, 0, this.count);
|
||||
}
|
||||
}
|
||||
|
||||
private final long _id;
|
||||
private final long _offset;
|
||||
private final long _size;
|
||||
private final ByteArrayOutputStream _data_os;
|
||||
private final ByteArrayOutInputStream _data_os;
|
||||
private final String _url;
|
||||
private final int _size_multi;
|
||||
private boolean _can_write;
|
||||
|
||||
public Chunk(long id, long file_size, String file_url) throws ChunkInvalidException, IOException {
|
||||
|
||||
_can_write = true;
|
||||
|
||||
public Chunk(long id, long file_size, String file_url) throws ChunkInvalidException {
|
||||
_size_multi = 1;
|
||||
|
||||
_id = id;
|
||||
@ -41,10 +64,13 @@ public final class Chunk {
|
||||
|
||||
_url = file_url != null ? file_url + "/" + _offset + "-" + (_offset + _size - 1) : null;
|
||||
|
||||
_data_os = new ByteArrayOutputStream((int) _size);
|
||||
_data_os = new ByteArrayOutInputStream((int) _size);
|
||||
}
|
||||
|
||||
public Chunk(long id, long file_size, String file_url, int size_multi) throws ChunkInvalidException {
|
||||
|
||||
_can_write = true;
|
||||
|
||||
_size_multi = size_multi;
|
||||
|
||||
_id = id;
|
||||
@ -68,7 +94,7 @@ public final class Chunk {
|
||||
|
||||
_url = file_url != null ? file_url + "/" + _offset + "-" + (_offset + _size - 1) : null;
|
||||
|
||||
_data_os = new ByteArrayOutputStream((int) _size);
|
||||
_data_os = new ByteArrayOutInputStream((int) _size);
|
||||
}
|
||||
|
||||
public int getSize_multi() {
|
||||
@ -79,7 +105,13 @@ public final class Chunk {
|
||||
return _offset;
|
||||
}
|
||||
|
||||
public ByteArrayOutputStream getOutputStream() {
|
||||
public ByteArrayOutputStream getOutputStream() throws IOException {
|
||||
|
||||
if (!_can_write) {
|
||||
|
||||
throw new IOException("Chunk outputstream is not available!");
|
||||
}
|
||||
|
||||
return _data_os;
|
||||
}
|
||||
|
||||
@ -96,7 +128,8 @@ public final class Chunk {
|
||||
}
|
||||
|
||||
public ByteArrayInputStream getInputStream() {
|
||||
return new ByteArrayInputStream(_data_os.toByteArray());
|
||||
_can_write = false;
|
||||
return _data_os.toInputStream();
|
||||
}
|
||||
|
||||
private long calculateSize(long file_size) {
|
||||
|
@ -4,7 +4,6 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import static com.tonikelope.megabasterd.MiscTools.*;
|
||||
@ -93,23 +92,15 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
String worker_url = null;
|
||||
Chunk chunk;
|
||||
int reads, conta_error, http_status;
|
||||
InputStream is;
|
||||
boolean error, error509;
|
||||
String current_proxy = null;
|
||||
CloseableHttpClient httpclient = null;
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Worker [{1}]: let''s do some work!", new Object[]{Thread.currentThread().getName(), _id});
|
||||
|
||||
CloseableHttpClient httpclient = null;
|
||||
|
||||
try {
|
||||
|
||||
conta_error = 0;
|
||||
|
||||
error = false;
|
||||
|
||||
error509 = false;
|
||||
int conta_error = 0;
|
||||
String worker_url = null, current_proxy = null;;
|
||||
boolean error = false, error509 = false;
|
||||
|
||||
while (!_exit && !_download.isStopped() && (error509 || conta_error < MAX_SLOT_ERROR || _download.getMain_panel().isUse_smart_proxy())) {
|
||||
|
||||
@ -159,7 +150,7 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable {
|
||||
worker_url = _download.getDownloadUrlForWorker();
|
||||
}
|
||||
|
||||
chunk = new Chunk(_download.nextChunkId(), _download.getFile_size(), worker_url, Download.CHUNK_SIZE_MULTI);
|
||||
Chunk chunk = new Chunk(_download.nextChunkId(), _download.getFile_size(), worker_url, Download.CHUNK_SIZE_MULTI);
|
||||
|
||||
HttpGet httpget = new HttpGet(new URI(chunk.getUrl()));
|
||||
|
||||
@ -175,51 +166,53 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable {
|
||||
|
||||
if (!_exit && !_download.isStopped()) {
|
||||
|
||||
is = new ThrottledInputStream(httpresponse.getEntity().getContent(), _download.getMain_panel().getStream_supervisor());
|
||||
try (InputStream is = new ThrottledInputStream(httpresponse.getEntity().getContent(), _download.getMain_panel().getStream_supervisor())) {
|
||||
|
||||
http_status = httpresponse.getStatusLine().getStatusCode();
|
||||
int http_status = httpresponse.getStatusLine().getStatusCode();
|
||||
|
||||
if (http_status != HttpStatus.SC_OK) {
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Failed : HTTP error code : {1}", new Object[]{Thread.currentThread().getName(), http_status});
|
||||
if (http_status != HttpStatus.SC_OK) {
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Failed : HTTP error code : {1}", new Object[]{Thread.currentThread().getName(), http_status});
|
||||
|
||||
error = true;
|
||||
error = true;
|
||||
|
||||
if (http_status == 509) {
|
||||
if (http_status == 509) {
|
||||
|
||||
error509 = true;
|
||||
error509 = true;
|
||||
|
||||
getDownload().getView().set509Error(true);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
byte[] buffer = new byte[THROTTLE_SLICE_SIZE];
|
||||
|
||||
while (!_exit && !_download.isStopped() && !_download.getChunkwriter().isExit() && chunk.getOutputStream().size() < chunk.getSize() && (reads = is.read(buffer)) != -1) {
|
||||
|
||||
chunk.getOutputStream().write(buffer, 0, reads);
|
||||
|
||||
_download.getPartialProgressQueue().add(reads);
|
||||
|
||||
_download.getProgress_meter().secureNotify();
|
||||
|
||||
if (_download.isPaused() && !_download.isStopped()) {
|
||||
|
||||
_download.pause_worker();
|
||||
|
||||
secureWait();
|
||||
|
||||
} else if (!_download.isPaused() && _download.getMain_panel().getDownload_manager().isPaused_all()) {
|
||||
|
||||
_download.pause();
|
||||
|
||||
_download.pause_worker();
|
||||
|
||||
secureWait();
|
||||
getDownload().getView().set509Error(true);
|
||||
}
|
||||
}
|
||||
|
||||
is.close();
|
||||
} else {
|
||||
|
||||
byte[] buffer = new byte[THROTTLE_SLICE_SIZE];
|
||||
|
||||
int reads;
|
||||
|
||||
while (!_exit && !_download.isStopped() && !_download.getChunkwriter().isExit() && chunk.getOutputStream().size() < chunk.getSize() && (reads = is.read(buffer)) != -1) {
|
||||
|
||||
chunk.getOutputStream().write(buffer, 0, reads);
|
||||
|
||||
_download.getPartialProgressQueue().add(reads);
|
||||
|
||||
_download.getProgress_meter().secureNotify();
|
||||
|
||||
if (_download.isPaused() && !_download.isStopped()) {
|
||||
|
||||
_download.pause_worker();
|
||||
|
||||
secureWait();
|
||||
|
||||
} else if (!_download.isPaused() && _download.getMain_panel().getDownload_manager().isPaused_all()) {
|
||||
|
||||
_download.pause();
|
||||
|
||||
_download.pause_worker();
|
||||
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (chunk.getOutputStream().size() < chunk.getSize()) {
|
||||
|
||||
@ -318,12 +311,8 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable {
|
||||
|
||||
} catch (ChunkInvalidException e) {
|
||||
|
||||
} catch (IOException ex) {
|
||||
_download.stopDownloader(ex.getMessage());
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
} catch (URISyntaxException ex) {
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
} catch (Exception ex) {
|
||||
_download.stopDownloader(ex.getMessage());
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
} finally {
|
||||
|
||||
|
@ -3,7 +3,6 @@ package com.tonikelope.megabasterd;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import static com.tonikelope.megabasterd.MiscTools.*;
|
||||
@ -26,21 +25,15 @@ public class ChunkDownloaderMono extends ChunkDownloader {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
String worker_url = null;
|
||||
Chunk chunk;
|
||||
int reads, conta_error, http_status = 200;
|
||||
boolean error, error509;
|
||||
HttpGet httpget = null;
|
||||
CloseableHttpResponse httpresponse = null;
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Worker [{1}]: let''s do some work!", new Object[]{Thread.currentThread().getName(), getId()});
|
||||
|
||||
try (CloseableHttpClient httpclient = MiscTools.getApacheKissHttpClient()) {
|
||||
conta_error = 0;
|
||||
|
||||
error = false;
|
||||
|
||||
error509 = false;
|
||||
String worker_url = null;
|
||||
int conta_error = 0, http_status = 200;
|
||||
boolean error = false, error509 = false;
|
||||
HttpGet httpget = null;
|
||||
CloseableHttpResponse httpresponse = null;
|
||||
|
||||
getDownload().getView().set509Error(false);
|
||||
|
||||
@ -58,7 +51,7 @@ public class ChunkDownloaderMono extends ChunkDownloader {
|
||||
}
|
||||
}
|
||||
|
||||
chunk = new Chunk(getDownload().nextChunkId(), getDownload().getFile_size(), null);
|
||||
Chunk chunk = new Chunk(getDownload().nextChunkId(), getDownload().getFile_size(), null);
|
||||
|
||||
try {
|
||||
|
||||
@ -114,6 +107,8 @@ public class ChunkDownloaderMono extends ChunkDownloader {
|
||||
|
||||
byte[] buffer = new byte[THROTTLE_SLICE_SIZE];
|
||||
|
||||
int reads;
|
||||
|
||||
while (!getDownload().isStopped() && !getDownload().getChunkwriter().isExit() && chunk.getOutputStream().size() < chunk.getSize() && (reads = is.read(buffer, 0, Math.min((int) (chunk.getSize() - chunk.getOutputStream().size()), buffer.length))) != -1) {
|
||||
chunk.getOutputStream().write(buffer, 0, reads);
|
||||
|
||||
@ -199,16 +194,10 @@ public class ChunkDownloaderMono extends ChunkDownloader {
|
||||
|
||||
} catch (ChunkInvalidException e) {
|
||||
|
||||
} catch (IOException ex) {
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
getDownload().stopDownloader(ex.getMessage());
|
||||
|
||||
} catch (URISyntaxException ex) {
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
} catch (Exception ex) {
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
getDownload().stopDownloader(ex.getMessage());
|
||||
}
|
||||
|
||||
getDownload().stopThisSlot(this);
|
||||
|
@ -9,7 +9,6 @@ import java.io.PipedOutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
@ -107,20 +106,20 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} ChunkUploader {1} hello! {2}", new Object[]{Thread.currentThread().getName(), getId(), getUpload().getFile_name()});
|
||||
|
||||
String worker_url = _upload.getUl_url();
|
||||
Chunk chunk;
|
||||
int reads, conta_error, http_status, tot_bytes_up;
|
||||
boolean error;
|
||||
OutputStream out;
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} ChunkUploader {1} hello! {2}", new Object[]{Thread.currentThread().getName(), getId(), getUpload().getFile_name()});
|
||||
|
||||
try (final CloseableHttpClient httpclient = getApacheKissHttpClient(); RandomAccessFile f = new RandomAccessFile(_upload.getFile_name(), "r");) {
|
||||
|
||||
conta_error = 0;
|
||||
String worker_url = _upload.getUl_url();
|
||||
|
||||
int conta_error = 0;
|
||||
|
||||
while (!_upload.getMain_panel().isExit() && !_exit && !_upload.isStopped() && conta_error < MAX_SLOT_ERROR) {
|
||||
chunk = new Chunk(_upload.nextChunkId(), _upload.getFile_size(), worker_url, Upload.CHUNK_SIZE_MULTI);
|
||||
|
||||
int reads, http_status, tot_bytes_up;
|
||||
|
||||
Chunk chunk = new Chunk(_upload.nextChunkId(), _upload.getFile_size(), worker_url, Upload.CHUNK_SIZE_MULTI);
|
||||
|
||||
f.seek(chunk.getOffset());
|
||||
|
||||
@ -138,7 +137,7 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable {
|
||||
|
||||
tot_bytes_up = 0;
|
||||
|
||||
error = false;
|
||||
boolean error = false;
|
||||
|
||||
CloseableHttpResponse httpresponse = null;
|
||||
|
||||
@ -165,35 +164,37 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable {
|
||||
});
|
||||
|
||||
THREAD_POOL.execute(futureTask);
|
||||
out = new ThrottledOutputStream(pipeout, _upload.getMain_panel().getStream_supervisor());
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Uploading chunk {1} from worker {2}...", new Object[]{Thread.currentThread().getName(), chunk.getId(), _id});
|
||||
try (OutputStream out = new ThrottledOutputStream(pipeout, _upload.getMain_panel().getStream_supervisor())) {
|
||||
|
||||
while (!_exit && !_upload.isStopped() && (reads = cis.read(buffer)) != -1) {
|
||||
out.write(buffer, 0, reads);
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Uploading chunk {1} from worker {2}...", new Object[]{Thread.currentThread().getName(), chunk.getId(), _id});
|
||||
|
||||
_upload.getPartialProgress().add(reads);
|
||||
while (!_exit && !_upload.isStopped() && (reads = cis.read(buffer)) != -1) {
|
||||
out.write(buffer, 0, reads);
|
||||
|
||||
_upload.getProgress_meter().secureNotify();
|
||||
_upload.getPartialProgress().add(reads);
|
||||
|
||||
tot_bytes_up += reads;
|
||||
_upload.getProgress_meter().secureNotify();
|
||||
|
||||
if (_upload.isPaused() && !_upload.isStopped()) {
|
||||
tot_bytes_up += reads;
|
||||
|
||||
_upload.pause_worker();
|
||||
if (_upload.isPaused() && !_upload.isStopped()) {
|
||||
|
||||
secureWait();
|
||||
_upload.pause_worker();
|
||||
|
||||
} else if (!_upload.isPaused() && _upload.getMain_panel().getUpload_manager().isPaused_all()) {
|
||||
secureWait();
|
||||
|
||||
_upload.pause();
|
||||
} else if (!_upload.isPaused() && _upload.getMain_panel().getUpload_manager().isPaused_all()) {
|
||||
|
||||
_upload.pause_worker();
|
||||
_upload.pause();
|
||||
|
||||
secureWait();
|
||||
_upload.pause_worker();
|
||||
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
out.close();
|
||||
}
|
||||
|
||||
if (!_upload.isStopped()) {
|
||||
@ -414,7 +415,7 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable {
|
||||
|
||||
} catch (ChunkInvalidException e) {
|
||||
|
||||
} catch (IOException | URISyntaxException ex) {
|
||||
} catch (Exception ex) {
|
||||
|
||||
_upload.stopUploader();
|
||||
|
||||
|
@ -8,7 +8,6 @@ import java.io.PipedInputStream;
|
||||
import java.io.PipedOutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
@ -41,16 +40,12 @@ public class ChunkUploaderMono extends ChunkUploader {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} ChunkUploaderMONO {1} hello! {2}", new Object[]{Thread.currentThread().getName(), getId(), getUpload().getFile_name()});
|
||||
|
||||
String worker_url = getUpload().getUl_url();
|
||||
Chunk chunk;
|
||||
int reads, conta_error, http_status, tot_bytes_up = -1;
|
||||
boolean error = false;
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} ChunkUploaderMONO {1} hello! {2}", new Object[]{Thread.currentThread().getName(), getId(), getUpload().getFile_name()});
|
||||
|
||||
try (CloseableHttpClient httpclient = getApacheKissHttpClient(); RandomAccessFile f = new RandomAccessFile(getUpload().getFile_name(), "r");) {
|
||||
|
||||
conta_error = 0;
|
||||
String worker_url = getUpload().getUl_url();
|
||||
|
||||
OutputStream out = null;
|
||||
|
||||
@ -58,9 +53,13 @@ public class ChunkUploaderMono extends ChunkUploader {
|
||||
|
||||
while (!isExit() && !getUpload().isStopped()) {
|
||||
|
||||
int conta_error = 0, reads, http_status, tot_bytes_up = -1;
|
||||
|
||||
boolean error = false;
|
||||
|
||||
CloseableHttpResponse httpresponse = null;
|
||||
|
||||
chunk = new Chunk(getUpload().nextChunkId(), getUpload().getFile_size(), null);
|
||||
Chunk chunk = new Chunk(getUpload().nextChunkId(), getUpload().getFile_size(), null);
|
||||
|
||||
f.seek(chunk.getOffset());
|
||||
|
||||
@ -293,7 +292,7 @@ public class ChunkUploaderMono extends ChunkUploader {
|
||||
|
||||
} catch (ChunkInvalidException e) {
|
||||
|
||||
} catch (URISyntaxException | IOException ex) {
|
||||
} catch (Exception ex) {
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
@ -121,7 +121,7 @@ public final class ChunkWriter implements Runnable, SecureSingleThreadNotifiable
|
||||
if (_file_size > 0) {
|
||||
while (!_exit && (!_download.isStopped() || !_download.getChunkworkers().isEmpty()) && _bytes_written < _file_size) {
|
||||
while (_chunk_queue.containsKey(_last_chunk_id_written + 1)) {
|
||||
current_chunk = _chunk_queue.get(_last_chunk_id_written + 1);
|
||||
current_chunk = _chunk_queue.remove(_last_chunk_id_written + 1);
|
||||
|
||||
try (CipherInputStream cis = new CipherInputStream(current_chunk.getInputStream(), genDecrypter("AES", "AES/CTR/NoPadding", _byte_file_key, forwardMEGALinkKeyIV(_byte_iv, _bytes_written)))) {
|
||||
while ((reads = cis.read(buffer)) != -1) {
|
||||
@ -133,8 +133,6 @@ public final class ChunkWriter implements Runnable, SecureSingleThreadNotifiable
|
||||
|
||||
_bytes_written += current_chunk.getSize();
|
||||
|
||||
_chunk_queue.remove(current_chunk.getId());
|
||||
|
||||
_last_chunk_id_written = current_chunk.getId();
|
||||
|
||||
}
|
||||
|
@ -1199,36 +1199,38 @@ public final class Download implements Transference, Runnable, SecureSingleThrea
|
||||
|
||||
} while (!_exit && chunk.getOutputStream().size() < chunk.getSize());
|
||||
|
||||
InputStream chunk_is = chunk.getInputStream();
|
||||
try (InputStream chunk_is = chunk.getInputStream()) {
|
||||
|
||||
while (!_exit && (reads = chunk_is.read(byte_block)) != -1) {
|
||||
while (!_exit && (reads = chunk_is.read(byte_block)) != -1) {
|
||||
|
||||
if (reads < byte_block.length) {
|
||||
if (reads < byte_block.length) {
|
||||
|
||||
for (int i = reads; i < byte_block.length; i++) {
|
||||
byte_block[i] = 0;
|
||||
for (int i = reads; i < byte_block.length; i++) {
|
||||
byte_block[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int_block = bin2i32a(byte_block);
|
||||
|
||||
for (int i = 0; i < chunk_mac.length; i++) {
|
||||
chunk_mac[i] ^= int_block[i];
|
||||
}
|
||||
|
||||
chunk_mac = bin2i32a(cryptor.doFinal(i32a2bin(chunk_mac)));
|
||||
}
|
||||
|
||||
int_block = bin2i32a(byte_block);
|
||||
|
||||
for (int i = 0; i < chunk_mac.length; i++) {
|
||||
chunk_mac[i] ^= int_block[i];
|
||||
for (int i = 0; i < file_mac.length; i++) {
|
||||
file_mac[i] ^= chunk_mac[i];
|
||||
}
|
||||
|
||||
chunk_mac = bin2i32a(cryptor.doFinal(i32a2bin(chunk_mac)));
|
||||
file_mac = bin2i32a(cryptor.doFinal(i32a2bin(file_mac)));
|
||||
|
||||
setProgress(tot);
|
||||
}
|
||||
|
||||
for (int i = 0; i < file_mac.length; i++) {
|
||||
file_mac[i] ^= chunk_mac[i];
|
||||
}
|
||||
|
||||
file_mac = bin2i32a(cryptor.doFinal(i32a2bin(file_mac)));
|
||||
|
||||
setProgress(tot);
|
||||
}
|
||||
|
||||
} catch (ChunkInvalidException e) {
|
||||
|
||||
}
|
||||
|
||||
int[] cbc = {file_mac[0] ^ file_mac[1], file_mac[2] ^ file_mac[3]};
|
||||
|
@ -48,7 +48,7 @@ import org.apache.http.auth.UsernamePasswordCredentials;
|
||||
*/
|
||||
public final class MainPanel {
|
||||
|
||||
public static final String VERSION = "3.0";
|
||||
public static final String VERSION = "3.1";
|
||||
public static final int THROTTLE_SLICE_SIZE = 16 * 1024;
|
||||
public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024;
|
||||
public static final int STREAMER_PORT = 1337;
|
||||
|
@ -2,6 +2,7 @@ package com.tonikelope.megabasterd;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -9,12 +10,30 @@ import java.io.ByteArrayOutputStream;
|
||||
*/
|
||||
public final class StreamChunk {
|
||||
|
||||
public class ByteArrayOutInputStream extends ByteArrayOutputStream {
|
||||
|
||||
public ByteArrayOutInputStream(int size) {
|
||||
super(size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an input stream based on the contents of this output stream. Do
|
||||
* not use the output stream after calling this method.
|
||||
*
|
||||
* @return an {@link InputStream}
|
||||
*/
|
||||
public ByteArrayInputStream toInputStream() {
|
||||
return new ByteArrayInputStream(this.buf, 0, this.count);
|
||||
}
|
||||
}
|
||||
|
||||
private final long _offset;
|
||||
private final long _size;
|
||||
private final String _url;
|
||||
private final ByteArrayOutputStream _data_os;
|
||||
private final ByteArrayOutInputStream _data_os;
|
||||
private boolean _can_write;
|
||||
|
||||
public StreamChunk(long offset, long size, String url) throws ChunkInvalidException {
|
||||
public StreamChunk(long offset, long size, String url) throws ChunkInvalidException, IOException {
|
||||
|
||||
if (offset < 0 || size < 0 || url == null) {
|
||||
throw new ChunkInvalidException("Offset: " + offset + " Size: " + size);
|
||||
@ -23,11 +42,12 @@ public final class StreamChunk {
|
||||
_offset = offset;
|
||||
_size = size;
|
||||
_url = url + "/" + _offset + "-" + (_offset + _size - 1);
|
||||
_data_os = new ByteArrayOutputStream((int) _size);
|
||||
_data_os = new ByteArrayOutInputStream((int) _size);
|
||||
}
|
||||
|
||||
public ByteArrayInputStream getInputStream() {
|
||||
return new ByteArrayInputStream(_data_os.toByteArray());
|
||||
_can_write = false;
|
||||
return _data_os.toInputStream();
|
||||
}
|
||||
|
||||
public long getOffset() {
|
||||
@ -42,7 +62,12 @@ public final class StreamChunk {
|
||||
return _url;
|
||||
}
|
||||
|
||||
public ByteArrayOutputStream getOutputStream() {
|
||||
public ByteArrayOutputStream getOutputStream() throws IOException {
|
||||
|
||||
if (!_can_write) {
|
||||
|
||||
throw new IOException("Chunk outputstream is not available!");
|
||||
}
|
||||
return _data_os;
|
||||
}
|
||||
|
||||
|
@ -43,8 +43,8 @@ public class StreamChunkDownloader implements Runnable {
|
||||
|
||||
String url = _chunkwriter.getUrl();
|
||||
|
||||
boolean error = false;
|
||||
boolean error509 = false;
|
||||
boolean error = false, error509 = false;
|
||||
|
||||
String current_proxy = null;
|
||||
|
||||
long offset = -1;
|
||||
|
@ -87,7 +87,7 @@ public class StreamChunkWriter implements Runnable, SecureMultiThreadNotifiable
|
||||
|
||||
while (!_exit && _bytes_written < _end_offset && _chunk_queue.containsKey(_bytes_written)) {
|
||||
|
||||
StreamChunk current_chunk = _chunk_queue.get(_bytes_written);
|
||||
StreamChunk current_chunk = _chunk_queue.remove(_bytes_written);
|
||||
|
||||
InputStream is = current_chunk.getInputStream();
|
||||
|
||||
@ -102,8 +102,6 @@ public class StreamChunkWriter implements Runnable, SecureMultiThreadNotifiable
|
||||
_bytes_written += reads;
|
||||
}
|
||||
|
||||
_chunk_queue.remove(current_chunk.getOffset());
|
||||
|
||||
secureNotifyAll();
|
||||
|
||||
Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} StreamChunkWriter has written {1} / {2} ...", new Object[]{Thread.currentThread().getName(), _bytes_written, _end_offset});
|
||||
|
@ -135,58 +135,20 @@ public final class UploadMACGenerator implements Runnable, SecureSingleThreadNot
|
||||
upload_workers_finish = true;
|
||||
}
|
||||
|
||||
chunk = _chunk_queue.get(_last_chunk_id_read + 1);
|
||||
chunk = _chunk_queue.remove(_last_chunk_id_read + 1);
|
||||
|
||||
InputStream chunk_is = chunk.getInputStream();
|
||||
try (InputStream chunk_is = chunk.getInputStream()) {
|
||||
|
||||
if (Upload.CHUNK_SIZE_MULTI == 1 || chunk.getId() <= 7) {
|
||||
if (Upload.CHUNK_SIZE_MULTI == 1 || chunk.getId() <= 7) {
|
||||
|
||||
try {
|
||||
try {
|
||||
|
||||
int[] chunk_mac = {file_iv[0], file_iv[1], file_iv[0], file_iv[1]};
|
||||
byte[] byte_block = new byte[16];
|
||||
int[] chunk_mac = {file_iv[0], file_iv[1], file_iv[0], file_iv[1]};
|
||||
byte[] byte_block = new byte[16];
|
||||
|
||||
while ((reads = chunk_is.read(byte_block)) != -1) {
|
||||
|
||||
if (reads < byte_block.length) {
|
||||
for (int i = reads; i < byte_block.length; i++) {
|
||||
byte_block[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int_block = bin2i32a(byte_block);
|
||||
|
||||
for (int i = 0; i < chunk_mac.length; i++) {
|
||||
chunk_mac[i] ^= int_block[i];
|
||||
}
|
||||
|
||||
chunk_mac = bin2i32a(cryptor.doFinal(i32a2bin(chunk_mac)));
|
||||
}
|
||||
|
||||
for (int i = 0; i < file_mac.length; i++) {
|
||||
file_mac[i] ^= chunk_mac[i];
|
||||
}
|
||||
|
||||
file_mac = bin2i32a(cryptor.doFinal(i32a2bin(file_mac)));
|
||||
|
||||
} catch (IOException | IllegalBlockSizeException | BadPaddingException ex) {
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
} else {
|
||||
|
||||
do {
|
||||
int[] chunk_mac = {file_iv[0], file_iv[1], file_iv[0], file_iv[1]};
|
||||
|
||||
byte[] byte_block = new byte[16];
|
||||
|
||||
long chunk_size = 0;
|
||||
|
||||
do {
|
||||
|
||||
if ((reads = chunk_is.read(byte_block)) != -1) {
|
||||
while ((reads = chunk_is.read(byte_block)) != -1) {
|
||||
|
||||
if (reads < byte_block.length) {
|
||||
|
||||
for (int i = reads; i < byte_block.length; i++) {
|
||||
byte_block[i] = 0;
|
||||
}
|
||||
@ -199,22 +161,62 @@ public final class UploadMACGenerator implements Runnable, SecureSingleThreadNot
|
||||
}
|
||||
|
||||
chunk_mac = bin2i32a(cryptor.doFinal(i32a2bin(chunk_mac)));
|
||||
|
||||
chunk_size += byte_block.length;
|
||||
}
|
||||
|
||||
} while (reads != -1 && chunk_size < 1024 * 1024);
|
||||
|
||||
if (chunk_size > 0) {
|
||||
|
||||
for (int i = 0; i < file_mac.length; i++) {
|
||||
file_mac[i] ^= chunk_mac[i];
|
||||
}
|
||||
|
||||
file_mac = bin2i32a(cryptor.doFinal(i32a2bin(file_mac)));
|
||||
}
|
||||
|
||||
} while (reads != -1);
|
||||
} catch (IOException | IllegalBlockSizeException | BadPaddingException ex) {
|
||||
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
} else {
|
||||
|
||||
do {
|
||||
int[] chunk_mac = {file_iv[0], file_iv[1], file_iv[0], file_iv[1]};
|
||||
|
||||
byte[] byte_block = new byte[16];
|
||||
|
||||
long chunk_size = 0;
|
||||
|
||||
do {
|
||||
|
||||
if ((reads = chunk_is.read(byte_block)) != -1) {
|
||||
|
||||
if (reads < byte_block.length) {
|
||||
|
||||
for (int i = reads; i < byte_block.length; i++) {
|
||||
byte_block[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int_block = bin2i32a(byte_block);
|
||||
|
||||
for (int i = 0; i < chunk_mac.length; i++) {
|
||||
chunk_mac[i] ^= int_block[i];
|
||||
}
|
||||
|
||||
chunk_mac = bin2i32a(cryptor.doFinal(i32a2bin(chunk_mac)));
|
||||
|
||||
chunk_size += byte_block.length;
|
||||
}
|
||||
|
||||
} while (reads != -1 && chunk_size < 1024 * 1024);
|
||||
|
||||
if (chunk_size > 0) {
|
||||
|
||||
for (int i = 0; i < file_mac.length; i++) {
|
||||
file_mac[i] ^= chunk_mac[i];
|
||||
}
|
||||
|
||||
file_mac = bin2i32a(cryptor.doFinal(i32a2bin(file_mac)));
|
||||
}
|
||||
|
||||
} while (reads != -1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -222,8 +224,6 @@ public final class UploadMACGenerator implements Runnable, SecureSingleThreadNot
|
||||
|
||||
_last_chunk_id_read = chunk.getId();
|
||||
|
||||
_chunk_queue.remove(chunk.getId());
|
||||
|
||||
new_chunk = true;
|
||||
|
||||
temp_file_data = (String.valueOf(_bytes_read) + "|" + Bin2BASE64(i32a2bin(file_mac)));
|
||||
|
Loading…
x
Reference in New Issue
Block a user