diff --git a/src/megabasterd/ChunkDownloader.java b/src/megabasterd/ChunkDownloader.java index 8e5a63728..b5c7cf201 100644 --- a/src/megabasterd/ChunkDownloader.java +++ b/src/megabasterd/ChunkDownloader.java @@ -131,7 +131,7 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { try { httpclient.close(); } catch (IOException ex) { - Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @@ -280,14 +280,14 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { } catch (URISyntaxException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { - Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } finally { if (httpclient != null) { try { httpclient.close(); } catch (IOException ex) { - Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } } diff --git a/src/megabasterd/ChunkDownloaderMono.java b/src/megabasterd/ChunkDownloaderMono.java index e81eb4cde..f2d2e95e1 100644 --- a/src/megabasterd/ChunkDownloaderMono.java +++ b/src/megabasterd/ChunkDownloaderMono.java @@ -182,7 +182,7 @@ public class ChunkDownloaderMono extends ChunkDownloader { } catch (URISyntaxException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { - Logger.getLogger(ChunkDownloaderMono.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } getDownload().stopThisSlot(this); diff --git a/src/megabasterd/ChunkUploader.java b/src/megabasterd/ChunkUploader.java index 1076983ae..18f19900b 100644 --- a/src/megabasterd/ChunkUploader.java +++ b/src/megabasterd/ChunkUploader.java @@ -207,6 +207,7 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { } else { if (tot_bytes_up < chunk.getSize()) { + if (tot_bytes_up > 0) { _upload.getPartialProgress().add(-1 * tot_bytes_up); @@ -220,6 +221,8 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { if (httpresponse != null && _upload.getCompletion_handle() == null) { + Logger.getLogger(getClass().getName()).log(Level.WARNING, "{0} all chunks uploaded. Waiting for completion handle...", new Object[]{Thread.currentThread().getName()}); + InputStream is = httpresponse.getEntity().getContent(); try (ByteArrayOutputStream byte_res = new ByteArrayOutputStream()) { @@ -319,6 +322,7 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { _upload.rejectChunkId(chunk.getId()); } + } catch (IOException ex) { Logger.getLogger(getClass().getName()).log(Level.WARNING, "{0} Uploading chunk {1} from worker {2} FAILED!...", new Object[]{Thread.currentThread().getName(), chunk.getId(), _id}); @@ -348,15 +352,12 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { } catch (ChunkInvalidException e) { - } catch (IOException ex) { + } catch (IOException | URISyntaxException ex) { - _upload.emergencyStopUploader(ex.getMessage()); + _upload.stopUploader(); Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); - } catch (URISyntaxException ex) { - - Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } _upload.stopThisSlot(this); diff --git a/src/megabasterd/ChunkUploaderMono.java b/src/megabasterd/ChunkUploaderMono.java index ccf0b4065..f78ef1336 100644 --- a/src/megabasterd/ChunkUploaderMono.java +++ b/src/megabasterd/ChunkUploaderMono.java @@ -131,6 +131,7 @@ public class ChunkUploaderMono extends ChunkUploader { if (!getUpload().isStopped()) { if (tot_bytes_up < chunk.getSize()) { + if (tot_bytes_up > 0) { getUpload().getPartialProgress().add(-1 * tot_bytes_up); @@ -164,16 +165,12 @@ public class ChunkUploaderMono extends ChunkUploader { Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} {1} {2}", new Object[]{chunk.getOffset(), tot_bytes_up, getUpload().getFile_size()}); - if (chunk.getOffset() + tot_bytes_up < getUpload().getFile_size()) { + getUpload().getMac_generator().getChunk_queue().put(chunk.getId(), chunk); - getUpload().getMac_generator().getChunk_queue().put(chunk.getId(), chunk); + getUpload().getMac_generator().secureNotify(); - getUpload().getMac_generator().secureNotify(); - - conta_error = 0; - } + conta_error = 0; } - } } else if (isExit()) { @@ -205,6 +202,8 @@ public class ChunkUploaderMono extends ChunkUploader { if (!error && chunk.getOffset() + tot_bytes_up == getUpload().getFile_size() && futureTask != null) { + Logger.getLogger(getClass().getName()).log(Level.WARNING, "{0} has finished uploading all chunks. Waiting for completion handle...", new Object[]{Thread.currentThread().getName()}); + try { httpresponse = futureTask.get(); @@ -212,6 +211,7 @@ public class ChunkUploaderMono extends ChunkUploader { http_status = httpresponse.getStatusLine().getStatusCode(); if (http_status != HttpStatus.SC_OK) { + throw new IOException("UPLOAD FAILED! (HTTP STATUS: " + http_status + ")"); } else { @@ -230,6 +230,7 @@ public class ChunkUploaderMono extends ChunkUploader { if (response.length() > 0) { if (MegaAPI.checkMEGAError(response) != 0) { + throw new IOException("UPLOAD FAILED! (MEGA ERROR: " + MegaAPI.checkMEGAError(response) + ")"); } else { @@ -237,34 +238,18 @@ public class ChunkUploaderMono extends ChunkUploader { Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Completion handle -> {1}", new Object[]{Thread.currentThread().getName(), response}); getUpload().setCompletion_handle(response); - - conta_error = 0; - - getUpload().getMac_generator().getChunk_queue().put(chunk.getId(), chunk); - - getUpload().getMac_generator().secureNotify(); } + } else { - throw new IOException("UPLOAD FAILED! (UPLOAD RESPONSE IS EMPTY)"); + throw new IOException("UPLOAD FAILED! (Completion handle is empty)"); } } } } catch (ExecutionException | InterruptedException | CancellationException exception) { - Logger.getLogger(getClass().getName()).log(Level.WARNING, "{0} Uploading chunk {1} FAILED!...", new Object[]{Thread.currentThread().getName(), chunk.getId()}); - - error = true; - - getUpload().rejectChunkId(chunk.getId()); - - if (tot_bytes_up > 0) { - - getUpload().getPartialProgress().add(-1 * tot_bytes_up); - - getUpload().getProgress_meter().secureNotify(); - } + throw new IOException("UPLOAD FAILED! (Completion handle is empty)"); } finally { @@ -273,7 +258,6 @@ public class ChunkUploaderMono extends ChunkUploader { } if (httpresponse != null) { - httpresponse.close(); } } @@ -293,13 +277,8 @@ public class ChunkUploaderMono extends ChunkUploader { } catch (ChunkInvalidException e) { - } catch (IOException ex) { + } catch (URISyntaxException | IOException ex) { - getUpload().emergencyStopUploader(ex.getMessage()); - - Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); - - } catch (URISyntaxException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } diff --git a/src/megabasterd/ChunkWriter.java b/src/megabasterd/ChunkWriter.java index 9f0817c5d..ac9aac664 100644 --- a/src/megabasterd/ChunkWriter.java +++ b/src/megabasterd/ChunkWriter.java @@ -128,7 +128,7 @@ public final class ChunkWriter implements Runnable, SecureSingleThreadNotifiable _download.getOutput_stream().write(buffer, 0, reads); } } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException ex) { - Logger.getLogger(ChunkWriter.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } _bytes_written += current_chunk.getSize(); @@ -163,7 +163,7 @@ public final class ChunkWriter implements Runnable, SecureSingleThreadNotifiable private long calculateLastWrittenChunk(long temp_file_size) { if (temp_file_size > 3584 * 1024) { - return 7 + (long) Math.ceil((temp_file_size - 3584 * 1024) / (1024 * 1024 * (_download.isUse_slots() ? Download.CHUNK_SIZE_MULTI : 1))); + return 7 + (long) Math.ceil((float) (temp_file_size - 3584 * 1024) / (1024 * 1024 * (_download.isUse_slots() ? Download.CHUNK_SIZE_MULTI : 1))); } else { int i = 0, tot = 0; diff --git a/src/megabasterd/Download.java b/src/megabasterd/Download.java index a74a02e8b..e485e4067 100644 --- a/src/megabasterd/Download.java +++ b/src/megabasterd/Download.java @@ -276,7 +276,7 @@ public final class Download implements Transference, Runnable, SecureSingleThrea try { Thread.sleep(250); } catch (InterruptedException ex) { - Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @@ -290,7 +290,7 @@ public final class Download implements Transference, Runnable, SecureSingleThrea try { Thread.sleep(250); } catch (InterruptedException ex) { - Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } diff --git a/src/megabasterd/FileGrabberDialog.form b/src/megabasterd/FileGrabberDialog.form index 1a21b78c6..797aa2c19 100644 --- a/src/megabasterd/FileGrabberDialog.form +++ b/src/megabasterd/FileGrabberDialog.form @@ -91,7 +91,7 @@ - + @@ -121,6 +121,13 @@ + + + + + + + @@ -134,9 +141,9 @@ - + - + diff --git a/src/megabasterd/FileGrabberDialog.java b/src/megabasterd/FileGrabberDialog.java index b6916a48c..b99a13171 100644 --- a/src/megabasterd/FileGrabberDialog.java +++ b/src/megabasterd/FileGrabberDialog.java @@ -141,9 +141,11 @@ public final class FileGrabberDialog extends javax.swing.JDialog { ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 237, Short.MAX_VALUE) + .addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 215, Short.MAX_VALUE) ); + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Upload info")); + dir_name_label.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N dir_name_label.setText("Upload name:"); dir_name_label.setDoubleBuffered(true); @@ -203,9 +205,9 @@ public final class FileGrabberDialog extends javax.swing.JDialog { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() - .addComponent(add_files_button, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(add_files_button, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(add_folder_button, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(add_folder_button, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(dir_name_textfield) .addComponent(account_combobox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(used_space_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) @@ -519,7 +521,7 @@ public final class FileGrabberDialog extends javax.swing.JDialog { warning_label.setEnabled(false); file_tree.setEnabled(false); - swingInvoke(new Runnable() { + THREAD_POOL.execute(new Runnable() { @Override public void run() { @@ -553,37 +555,50 @@ public final class FileGrabberDialog extends javax.swing.JDialog { used_space_color = Color.red; } - boolean root_childs = ((TreeNode) file_tree.getModel().getRoot()).getChildCount() > 0; + final String quota_message = "Quota used: " + formatBytes(quota[0]) + "/" + formatBytes(quota[1]); - used_space_label.setText("Quota used: " + formatBytes(quota[0]) + "/" + formatBytes(quota[1])); + swingInvoke(new Runnable() { + @Override + public void run() { - used_space_label.setForeground(used_space_color); + boolean root_childs = ((TreeNode) file_tree.getModel().getRoot()).getChildCount() > 0; - for (JComponent c : new JComponent[]{add_files_button, add_folder_button, account_combobox, account_label}) { + used_space_label.setText(quota_message); - c.setEnabled(true); - } + used_space_label.setForeground(used_space_color); - for (JComponent c : new JComponent[]{dir_name_textfield, dir_name_label, warning_label, dance_button, file_tree, total_file_size_label, skip_button, skip_rest_button}) { + for (JComponent c : new JComponent[]{add_files_button, add_folder_button, account_combobox, account_label}) { - c.setEnabled(root_childs); - } + c.setEnabled(true); + } + + for (JComponent c : new JComponent[]{dir_name_textfield, dir_name_label, warning_label, dance_button, file_tree, total_file_size_label, skip_button, skip_rest_button}) { + + c.setEnabled(root_childs); + } + } + }); } else { _last_selected_account = null; - account_combobox.setEnabled(true); + swingInvoke(new Runnable() { + @Override + public void run() { - account_label.setEnabled(true); + account_combobox.setEnabled(true); - account_combobox.setSelectedIndex(-1); + account_label.setEnabled(true); - used_space_label.setForeground(Color.red); + account_combobox.setSelectedIndex(-1); - used_space_label.setText("ERROR checking account quota!"); + used_space_label.setForeground(Color.red); + + used_space_label.setText("ERROR checking account quota!"); + } + }); } - } }); } diff --git a/src/megabasterd/MainPanel.java b/src/megabasterd/MainPanel.java index 014bfbdc7..abdc8eb33 100644 --- a/src/megabasterd/MainPanel.java +++ b/src/megabasterd/MainPanel.java @@ -32,6 +32,7 @@ import static java.util.logging.Level.SEVERE; import java.util.logging.Logger; import javax.swing.JOptionPane; import static javax.swing.JOptionPane.QUESTION_MESSAGE; +import static javax.swing.JOptionPane.WARNING_MESSAGE; import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION; import static javax.swing.JOptionPane.showOptionDialog; import javax.swing.UIManager; @@ -47,7 +48,7 @@ import org.apache.http.auth.UsernamePasswordCredentials; */ public final class MainPanel { - public static final String VERSION = "2.70"; + public static final String VERSION = "2.71"; 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; @@ -344,7 +345,7 @@ public final class MainPanel { try { Thread.sleep(250); } catch (InterruptedException ex) { - Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex); } } @@ -654,8 +655,8 @@ public final class MainPanel { "Yes"}; int n = showOptionDialog(getView(), - "It seems MegaBasterd is provisioning down/uploads.\nIf you exit now, unprovisioned down/uploads will be lost.\nDo you want to continue?", - "Warning!", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE, + "It seems MegaBasterd is provisioning down/uploads.\n\nIf you exit now, unprovisioned down/uploads will be lost.\n\nDo you want to continue?", + "Warning!", YES_NO_CANCEL_OPTION, WARNING_MESSAGE, null, options, options[0]); @@ -665,6 +666,22 @@ public final class MainPanel { exit = false; } + } else if (!getUpload_manager().getFinishing_uploads_queue().isEmpty()) { + + Object[] options = {"No", + "Yes"}; + + int n = showOptionDialog(getView(), + "It seems MegaBasterd is just finishing uploading some files.\n\nIF YOU EXIT NOW, THOSE UPLOADS WILL FAIL.\n\nDo you want to continue?", + "Warning!", YES_NO_CANCEL_OPTION, WARNING_MESSAGE, + null, + options, + options[0]); + + if (n == 0) { + + exit = false; + } } if (exit) { @@ -741,7 +758,7 @@ public final class MainPanel { new Runnable() { @Override public void run() { - getView().getStatus_down_label().setText("Checking it there are previous downloads, please wait..."); + getView().getStatus_down_label().setText("Checking if there are previous downloads, please wait..."); } }); @@ -913,7 +930,7 @@ public final class MainPanel { new Runnable() { @Override public void run() { - getView().getStatus_up_label().setText("Checking it there are previous uploads, please wait..."); + getView().getStatus_up_label().setText("Checking if there are previous uploads, please wait..."); } }); diff --git a/src/megabasterd/MainPanelView.java b/src/megabasterd/MainPanelView.java index d235ee765..5b5462b39 100644 --- a/src/megabasterd/MainPanelView.java +++ b/src/megabasterd/MainPanelView.java @@ -672,7 +672,7 @@ public final class MainPanelView extends javax.swing.JFrame { getMain_panel().getDownload_manager().secureNotify(); } catch (UnsupportedEncodingException ex) { - Logger.getLogger(MainPanelView.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } diff --git a/src/megabasterd/SettingsDialog.java b/src/megabasterd/SettingsDialog.java index 0a4bb40ed..a3a74808a 100644 --- a/src/megabasterd/SettingsDialog.java +++ b/src/megabasterd/SettingsDialog.java @@ -1599,6 +1599,8 @@ public final class SettingsDialog extends javax.swing.JDialog { final DefaultTableModel model = (DefaultTableModel) mega_accounts_table.getModel(); + final int model_row_count = model.getRowCount(); + status.setText("Checking your MEGA accounts, please wait..."); pack(); @@ -1625,13 +1627,13 @@ public final class SettingsDialog extends javax.swing.JDialog { final Dialog tthis = this; - swingInvoke(new Runnable() { + THREAD_POOL.execute(new Runnable() { @Override public void run() { ArrayList email_error = new ArrayList<>(); - for (int i = 0; i < model.getRowCount(); i++) { + for (int i = 0; i < model_row_count; i++) { String email = (String) model.getValueAt(i, 0); @@ -1730,36 +1732,50 @@ public final class SettingsDialog extends javax.swing.JDialog { email_error_s += s + "\n"; } - status.setText(""); + final String final_email_error = email_error_s; - pack(); + swingInvoke(new Runnable() { + @Override + public void run() { - JOptionPane.showMessageDialog(tthis, "There were errors with some accounts. Please, check them:\n\n" + email_error_s, "Error", JOptionPane.ERROR_MESSAGE); + status.setText(""); - save_button.setEnabled(true); + pack(); - cancel_button.setEnabled(true); + JOptionPane.showMessageDialog(tthis, "There were errors with some accounts. Please, check them:\n\n" + final_email_error, "Error", JOptionPane.ERROR_MESSAGE); - remove_mega_account_button.setEnabled(mega_accounts_table.getModel().getRowCount() > 0); + save_button.setEnabled(true); - remove_elc_account_button.setEnabled(elc_accounts_table.getModel().getRowCount() > 0); + cancel_button.setEnabled(true); - add_mega_account_button.setEnabled(true); + remove_mega_account_button.setEnabled(mega_accounts_table.getModel().getRowCount() > 0); - add_elc_account_button.setEnabled(true); + remove_elc_account_button.setEnabled(elc_accounts_table.getModel().getRowCount() > 0); - mega_accounts_table.setEnabled(true); + add_mega_account_button.setEnabled(true); - elc_accounts_table.setEnabled(true); + add_elc_account_button.setEnabled(true); - delete_all_accounts_button.setEnabled(true); + mega_accounts_table.setEnabled(true); - encrypt_pass_checkbox.setEnabled(true); + elc_accounts_table.setEnabled(true); + + delete_all_accounts_button.setEnabled(true); + + encrypt_pass_checkbox.setEnabled(true); + + } + }); } else { - status.setText(""); - JOptionPane.showMessageDialog(tthis, "Settings successfully saved!", "Settings saved", JOptionPane.INFORMATION_MESSAGE); - setVisible(false); + swingInvoke(new Runnable() { + @Override + public void run() { + status.setText(""); + JOptionPane.showMessageDialog(tthis, "Settings successfully saved!", "Settings saved", JOptionPane.INFORMATION_MESSAGE); + setVisible(false); + } + }); } } }); @@ -2245,11 +2261,11 @@ public final class SettingsDialog extends javax.swing.JDialog { setVisible(false); } catch (SQLException | ClassNotFoundException ex) { - Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } catch (IOException ex) { - Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @@ -2292,11 +2308,11 @@ public final class SettingsDialog extends javax.swing.JDialog { setVisible(false); } catch (SQLException ex) { - Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } catch (IOException ex) { - Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } }//GEN-LAST:event_export_settings_buttonActionPerformed diff --git a/src/megabasterd/SmartMegaProxyManager.java b/src/megabasterd/SmartMegaProxyManager.java index 3b57cd699..8af093038 100644 --- a/src/megabasterd/SmartMegaProxyManager.java +++ b/src/megabasterd/SmartMegaProxyManager.java @@ -165,7 +165,7 @@ public class SmartMegaProxyManager implements Runnable { } } - Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.INFO, "{0} Smart Proxy Manager: proxy list refreshed ({1})", new Object[]{Thread.currentThread().getName(), _proxy_list.size()}); + Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Smart Proxy Manager: proxy list refreshed ({1})", new Object[]{Thread.currentThread().getName(), _proxy_list.size()}); if (_enabled) { @@ -176,16 +176,16 @@ public class SmartMegaProxyManager implements Runnable { } } catch (MalformedURLException ex) { - Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } catch (IOException | URISyntaxException ex) { - Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @Override public void run() { - Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.INFO, "{0} Smart Proxy Manager: hello!", new Object[]{Thread.currentThread().getName()}); + Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Smart Proxy Manager: hello!", new Object[]{Thread.currentThread().getName()}); _main_panel.getView().updateSmartProxyStatus(""); @@ -198,14 +198,14 @@ public class SmartMegaProxyManager implements Runnable { try { _refresh_lock.wait(1000 * REFRESH_PROXY_LIST_TIMEOUT); } catch (InterruptedException ex) { - Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } } _main_panel.getView().updateSmartProxyStatus(""); - Logger.getLogger(SmartMegaProxyManager.class.getName()).log(Level.INFO, "{0} Smart Proxy Manager: bye bye", new Object[]{Thread.currentThread().getName()}); + Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Smart Proxy Manager: bye bye", new Object[]{Thread.currentThread().getName()}); } diff --git a/src/megabasterd/StreamChunkDownloader.java b/src/megabasterd/StreamChunkDownloader.java index 9196ff9d4..684541328 100644 --- a/src/megabasterd/StreamChunkDownloader.java +++ b/src/megabasterd/StreamChunkDownloader.java @@ -79,7 +79,7 @@ public class StreamChunkDownloader implements Runnable { try { httpclient.close(); } catch (IOException ex) { - Logger.getLogger(StreamChunkDownloader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @@ -184,13 +184,13 @@ public class StreamChunkDownloader implements Runnable { } catch (IOException | URISyntaxException | ChunkInvalidException | InterruptedException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { - Logger.getLogger(StreamChunkDownloader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } finally { if (httpclient != null) { try { httpclient.close(); } catch (IOException ex) { - Logger.getLogger(StreamChunkDownloader.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } } diff --git a/src/megabasterd/StreamerDialog.java b/src/megabasterd/StreamerDialog.java index 18bc488c7..ae956d08e 100644 --- a/src/megabasterd/StreamerDialog.java +++ b/src/megabasterd/StreamerDialog.java @@ -243,7 +243,7 @@ public final class StreamerDialog extends javax.swing.JDialog implements Clipboa getParent().dispatchEvent(new WindowEvent(tthis, WINDOW_CLOSING)); } } catch (UnsupportedEncodingException ex) { - Logger.getLogger(StreamerDialog.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } diff --git a/src/megabasterd/ThrottledInputStream.java b/src/megabasterd/ThrottledInputStream.java index 0b6f311a0..af9a46aca 100644 --- a/src/megabasterd/ThrottledInputStream.java +++ b/src/megabasterd/ThrottledInputStream.java @@ -31,30 +31,23 @@ public final class ThrottledInputStream extends InputStream { @Override public int read() throws IOException { + int r; + if (_stream_supervisor.getMaxBytesPerSecInput() > 0) { if (!_stream_finish) { - int r; - throttle(1); - if (_slice_size != null) { + r = _rawStream.read(); - r = _rawStream.read(); + if (r == -1) { - if (r == -1) { - - _stream_finish = true; - } - - return r; - - } else { - - return _rawStream.read(); + _stream_finish = true; } + return r; + } else { return -1; @@ -62,7 +55,14 @@ public final class ThrottledInputStream extends InputStream { } else { - return _rawStream.read(); + r = _rawStream.read(); + + if (r == -1) { + + _stream_finish = true; + } + + return r; } } @@ -70,42 +70,26 @@ public final class ThrottledInputStream extends InputStream { @Override public int read(byte[] b) throws IOException { + int readLen, len = b.length; + if (_stream_supervisor.getMaxBytesPerSecInput() > 0) { if (!_stream_finish) { - int readLen = 0, readSlice, len = b.length, r = 0; + throttle(len); - do { + readLen = _rawStream.read(b, 0, _slice_size != null ? _slice_size : len); - throttle(len - readLen); + if (readLen == -1) { - if (_slice_size != null) { + _stream_finish = true; - readSlice = 0; + } else if (_slice_size != null && readLen < _slice_size && !_stream_supervisor.isQueue_swapping()) { - do { - r = _rawStream.read(b, readLen + readSlice, _slice_size - readSlice); + _stream_supervisor.getInput_slice_queue().add(_slice_size - readLen); - if (r != -1) { - - readSlice += r; - - } else { - - _stream_finish = true; - } - - } while (r != -1 && readSlice < _slice_size); - - readLen += readSlice; - - } else { - - return _rawStream.read(b); - } - - } while (r != -1 && readLen < len); + _stream_supervisor.secureNotifyAll(); + } return readLen; @@ -123,51 +107,26 @@ public final class ThrottledInputStream extends InputStream { @Override public int read(byte[] b, int off, int len) throws IOException { + int readLen; + if (_stream_supervisor.getMaxBytesPerSecInput() > 0) { if (!_stream_finish) { - int readLen = 0, r = 0; + throttle(len); - do { + readLen = _rawStream.read(b, off, _slice_size != null ? _slice_size : len); - throttle(len - readLen); + if (readLen == -1) { - if (_slice_size != null) { + _stream_finish = true; - int readSlice = 0; + } else if (_slice_size != null && readLen < _slice_size && !_stream_supervisor.isQueue_swapping()) { - do { - r = _rawStream.read(b, off + readSlice + readLen, _slice_size - readSlice); + _stream_supervisor.getInput_slice_queue().add(_slice_size - readLen); - if (r != -1) { - - readSlice += r; - - } else { - - _stream_finish = true; - } - - } while (r != -1 && readSlice < _slice_size); - - readLen += readSlice; - - } else { - - r = _rawStream.read(b, off + readLen, len - readLen); - - if (r != -1) { - - readLen += r; - - } else { - - _stream_finish = true; - } - } - - } while (r != -1 && readLen < len); + _stream_supervisor.secureNotifyAll(); + } return readLen; @@ -180,7 +139,6 @@ public final class ThrottledInputStream extends InputStream { return _rawStream.read(b, off, len); } - } @Override @@ -189,10 +147,9 @@ public final class ThrottledInputStream extends InputStream { _stream_finish = false; _rawStream.reset(); - } - private void throttle(int size) throws IOException { + private void throttle(int req_slice_size) throws IOException { _slice_size = null; @@ -201,16 +158,16 @@ public final class ThrottledInputStream extends InputStream { _stream_supervisor.secureWait(); } - if (_slice_size != null && size < _slice_size) { + if (_slice_size != null && req_slice_size < _slice_size) { if (!_stream_supervisor.isQueue_swapping()) { - _stream_supervisor.getInput_slice_queue().add(_slice_size - size); + _stream_supervisor.getInput_slice_queue().add(_slice_size - req_slice_size); _stream_supervisor.secureNotifyAll(); } - _slice_size = size; + _slice_size = req_slice_size; } } diff --git a/src/megabasterd/ThrottledOutputStream.java b/src/megabasterd/ThrottledOutputStream.java index ed55be529..cd6ae77ee 100644 --- a/src/megabasterd/ThrottledOutputStream.java +++ b/src/megabasterd/ThrottledOutputStream.java @@ -13,7 +13,7 @@ public final class ThrottledOutputStream extends OutputStream { private final StreamThrottlerSupervisor _stream_supervisor; - private Integer slice_size; + private Integer _slice_size; public ThrottledOutputStream(OutputStream rawStream, StreamThrottlerSupervisor stream_supervisor) { @@ -21,8 +21,7 @@ public final class ThrottledOutputStream extends OutputStream { _stream_supervisor = stream_supervisor; - slice_size = null; - + _slice_size = null; } @Override @@ -30,31 +29,10 @@ public final class ThrottledOutputStream extends OutputStream { if (_stream_supervisor.getMaxBytesPerSecOutput() > 0) { - int writeLen = 0; - - do { - - throttle(len - writeLen); - - if (slice_size != null) { - - _rawStream.write(b, off + writeLen, slice_size); - - writeLen += slice_size; - - } else { - - _rawStream.write(b, off + writeLen, len - writeLen); - - writeLen = len; - } - - } while (writeLen < len); - - } else { - - _rawStream.write(b, off, len); + throttle(len); } + + _rawStream.write(b, off, _slice_size != null ? _slice_size : len); } @Override @@ -63,34 +41,30 @@ public final class ThrottledOutputStream extends OutputStream { if (_stream_supervisor.getMaxBytesPerSecOutput() > 0) { throttle(1); - - _rawStream.write(i); - - } else { - - _rawStream.write(i); } + + _rawStream.write(i); } - private void throttle(int size) throws IOException { + private void throttle(int req_slice_size) throws IOException { - slice_size = null; + _slice_size = null; - while (_stream_supervisor.getMaxBytesPerSecOutput() > 0 && (_stream_supervisor.isQueue_swapping() || (slice_size = _stream_supervisor.getOutput_slice_queue().poll()) == null)) { + while (_stream_supervisor.getMaxBytesPerSecOutput() > 0 && (_stream_supervisor.isQueue_swapping() || (_slice_size = _stream_supervisor.getOutput_slice_queue().poll()) == null)) { _stream_supervisor.secureWait(); } - if (slice_size != null && size < slice_size) { + if (_slice_size != null && req_slice_size < _slice_size) { if (!_stream_supervisor.isQueue_swapping()) { - _stream_supervisor.getOutput_slice_queue().add(slice_size - size); + _stream_supervisor.getOutput_slice_queue().add(_slice_size - req_slice_size); _stream_supervisor.secureNotifyAll(); } - slice_size = size; + _slice_size = req_slice_size; } } diff --git a/src/megabasterd/Transference.java b/src/megabasterd/Transference.java index 15cc342c7..dddf3654e 100644 --- a/src/megabasterd/Transference.java +++ b/src/megabasterd/Transference.java @@ -14,7 +14,7 @@ public interface Transference { int SIM_TRANSFERENCES_DEFAULT = 4; boolean LIMIT_TRANSFERENCE_SPEED_DEFAULT = false; int MAX_TRANSFERENCE_SPEED_DEFAULT = 5; - int MAX_WAIT_WORKERS_SHUTDOWN = 15; + int MAX_WAIT_WORKERS_SHUTDOWN = 60; Integer[] FATAL_ERROR_API_CODES = {-2, -8, -9, -10, -11, -12, -13, -14, -15, -16, 22, 23, 24, 25}; void start(); diff --git a/src/megabasterd/Upload.java b/src/megabasterd/Upload.java index c7b126e4a..0e0f0b9fb 100644 --- a/src/megabasterd/Upload.java +++ b/src/megabasterd/Upload.java @@ -37,7 +37,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN private final Object _workers_lock; private final Object _chunkid_lock; private byte[] _byte_file_key; - private String _fatal_error; private volatile long _progress; private byte[] _byte_file_iv; private final ConcurrentLinkedQueue _rejectedChunkIds; @@ -156,10 +155,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN return _byte_file_key; } - public String getFatal_error() { - return _fatal_error; - } - @Override public long getProgress() { return _progress; @@ -302,7 +297,7 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN try { Thread.sleep(250); } catch (InterruptedException ex) { - Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @@ -316,7 +311,7 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN try { Thread.sleep(250); } catch (InterruptedException ex) { - Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } @@ -410,11 +405,7 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN getView().hideAllExceptStatus(); - if (_fatal_error != null) { - - getView().printStatusError(_fatal_error); - - } else if (exit_msg != null) { + if (exit_msg != null) { getView().printStatusError(exit_msg); } @@ -682,7 +673,7 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN try { Thread.sleep(wait_time * 1000); } catch (InterruptedException ex) { - Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } while (_ul_url == null && !_exit); @@ -851,6 +842,10 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN getView().printStatusNormal("Creating new MEGA node ... ***DO NOT EXIT MEGABASTERD NOW***"); + if (!getMain_panel().getUpload_manager().getFinishing_uploads_queue().contains(this)) { + getMain_panel().getUpload_manager().getFinishing_uploads_queue().add(this); + } + File f = new File(_file_name); HashMap upload_res; @@ -897,14 +892,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN _status_error = true; } - } else if (_fatal_error != null) { - - getView().hideAllExceptStatus(); - - getView().printStatusError(_fatal_error); - - _status_error = true; - } else { getView().hideAllExceptStatus(); @@ -916,12 +903,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN _status_error = true; } - } else if (_fatal_error != null) { - getView().hideAllExceptStatus(); - - getView().printStatusError(_fatal_error); - - _status_error = true; } else { getView().hideAllExceptStatus(); @@ -932,14 +913,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN _status_error = true; } - } else if (_fatal_error != null) { - getView().hideAllExceptStatus(); - - _exit_message = _fatal_error; - - getView().printStatusError(_fatal_error); - - _status_error = true; } else { getView().hideAllExceptStatus(); @@ -948,7 +921,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN getView().printStatusError(_exit_message); _status_error = true; - } if (!_exit) { @@ -986,6 +958,8 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN } }); + getMain_panel().getUpload_manager().getFinishing_uploads_queue().remove(this); + Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Uploader finished with message -> {1} {2}...", new Object[]{Thread.currentThread().getName(), _exit_message, this.getFile_name()}); Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Uploader {1} BYE BYE", new Object[]{Thread.currentThread().getName(), this.getFile_name()}); @@ -1071,14 +1045,6 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN } } - public void emergencyStopUploader(String reason) { - if (!_exit && _fatal_error == null) { - _fatal_error = reason != null ? reason : "FATAL ERROR!"; - - stopUploader(); - } - } - public long nextChunkId() { synchronized (_chunkid_lock) { @@ -1100,6 +1066,7 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN public void stopUploader() { if (!_exit) { + _exit = true; try { @@ -1147,8 +1114,9 @@ public final class Upload implements Transference, Runnable, SecureSingleThreadN } public long calculateLastUploadedChunk(long bytes_read) { + if (bytes_read > 3584 * 1024) { - return 7 + (long) Math.ceil((bytes_read - 3584 * 1024) / (1024 * 1024)); + return 7 + (long) Math.ceil((float) (bytes_read - 3584 * 1024) / (1024 * 1024)); } else { int i = 0, tot = 0; diff --git a/src/megabasterd/UploadMACGenerator.java b/src/megabasterd/UploadMACGenerator.java index 452de3d5d..d7833299e 100644 --- a/src/megabasterd/UploadMACGenerator.java +++ b/src/megabasterd/UploadMACGenerator.java @@ -128,6 +128,10 @@ public final class UploadMACGenerator implements Runnable, SecureSingleThreadNot _upload.getView().getPause_button().setEnabled(false); + if (!_upload.getMain_panel().getUpload_manager().getFinishing_uploads_queue().contains(_upload)) { + _upload.getMain_panel().getUpload_manager().getFinishing_uploads_queue().add(_upload); + } + upload_workers_finish = true; } @@ -174,14 +178,15 @@ public final class UploadMACGenerator implements Runnable, SecureSingleThreadNot _chunk_queue.remove(chunk.getId()); new_chunk = true; - } - - if (!upload_workers_finish && new_chunk) { temp_file_data = (String.valueOf(_bytes_read) + "|" + Bin2BASE64(i32a2bin(file_mac))); Logger.getLogger(getClass().getName()).log(Level.INFO, "{0} Macgenerator -> {1} {2} {3} {4}", new Object[]{Thread.currentThread().getName(), temp_file_data, _upload.calculateLastUploadedChunk(_bytes_read), _last_chunk_id_read, this.getUpload().getFile_name()}); + } + + if (!upload_workers_finish && new_chunk) { + DBTools.updateUploadProgres(_upload.getFile_name(), _upload.getMa().getEmail(), _bytes_read, Bin2BASE64(i32a2bin(file_mac))); new_chunk = false; diff --git a/src/megabasterd/UploadManager.java b/src/megabasterd/UploadManager.java index 7ef62e437..b72a0355e 100644 --- a/src/megabasterd/UploadManager.java +++ b/src/megabasterd/UploadManager.java @@ -6,6 +6,7 @@ import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.sql.SQLException; import java.util.ArrayList; +import java.util.concurrent.ConcurrentLinkedQueue; import static java.util.logging.Level.SEVERE; import java.util.logging.Logger; import static megabasterd.MiscTools.*; @@ -16,10 +17,16 @@ import static megabasterd.MiscTools.*; */ public final class UploadManager extends TransferenceManager { + private final ConcurrentLinkedQueue _finishing_uploads_queue; + + public ConcurrentLinkedQueue getFinishing_uploads_queue() { + return _finishing_uploads_queue; + } + public UploadManager(MainPanel main_panel) { super(main_panel, main_panel.getMax_ul(), main_panel.getView().getStatus_up_label(), main_panel.getView().getjPanel_scroll_up(), main_panel.getView().getClose_all_finished_up_button(), main_panel.getView().getPause_all_up_button(), main_panel.getView().getClean_all_up_menu()); - + _finishing_uploads_queue = new ConcurrentLinkedQueue<>(); } @Override