Let's dance baby
16
.gitignore
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
nbproject/private/
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
nbactions.xml
|
||||
nb-configuration.xml
|
||||
|
||||
|
||||
*.class
|
||||
|
||||
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
94
build.xml
Normal file
@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- You may freely edit this file. See commented blocks below for -->
|
||||
<!-- some examples of how to customize the build. -->
|
||||
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||
<!-- the Compile on Save feature is turned off for the project. -->
|
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||
<!-- in the project's Project Properties dialog box.-->
|
||||
<project name="MegaBasterd" default="default" basedir=".">
|
||||
<description>Builds, tests, and runs the project MegaBasterd.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
<!--
|
||||
|
||||
There exist several targets which are by default empty and which can be
|
||||
used for execution of your tasks. These targets are usually executed
|
||||
before and after some main targets. They are:
|
||||
|
||||
-pre-init: called before initialization of project properties
|
||||
-post-init: called after initialization of project properties
|
||||
-pre-compile: called before javac compilation
|
||||
-post-compile: called after javac compilation
|
||||
-pre-compile-single: called before javac compilation of single file
|
||||
-post-compile-single: called after javac compilation of single file
|
||||
-pre-compile-test: called before javac compilation of JUnit tests
|
||||
-post-compile-test: called after javac compilation of JUnit tests
|
||||
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||
-pre-jar: called before JAR building
|
||||
-post-jar: called after JAR building
|
||||
-post-clean: called after cleaning build products
|
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.)
|
||||
|
||||
Example of inserting an obfuscator after compilation could look like this:
|
||||
|
||||
<target name="-post-compile">
|
||||
<obfuscate>
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
</obfuscate>
|
||||
</target>
|
||||
|
||||
For list of available properties check the imported
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets.
|
||||
The targets of interest are:
|
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation
|
||||
-init-macrodef-junit: defines macro for junit execution
|
||||
-init-macrodef-debug: defines macro for class debugging
|
||||
-init-macrodef-java: defines macro for class execution
|
||||
-do-jar: JAR building
|
||||
run: execution of project
|
||||
-javadoc-build: Javadoc generation
|
||||
test-report: JUnit report generation
|
||||
|
||||
An example of overriding the target for project execution could look like this:
|
||||
|
||||
<target name="run" depends="MegaBasterd-impl.jar">
|
||||
<exec dir="bin" executable="launcher.exe">
|
||||
<arg file="${dist.jar}"/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
Notice that the overridden target depends on the jar target and not only on
|
||||
the compile target as the regular run target does. Again, for a list of available
|
||||
properties which you can use, check the target you are overriding in the
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
-->
|
||||
<target name="package-for-store" depends="jar">
|
||||
<property name="store.jar.name" value="MegaBasterd"/>
|
||||
<property name="store.dir" value="store"/>
|
||||
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
|
||||
<echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
|
||||
<delete dir="${store.dir}"/>
|
||||
<mkdir dir="${store.dir}"/>
|
||||
<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
|
||||
<zipgroupfileset dir="dist" includes="*.jar"/>
|
||||
<zipgroupfileset dir="dist/lib" includes="*.jar"/>
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
<attribute name="SplashScreen-Image" value="megabasterd/dot_com.jpg"/>
|
||||
</manifest>
|
||||
</jar>
|
||||
<zip destfile="${store.jar}">
|
||||
<zipfileset src="${store.dir}/temp_final.jar"
|
||||
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
|
||||
</zip>
|
||||
<delete file="${store.dir}/temp_final.jar"/>
|
||||
</target>
|
||||
</project>
|
4
manifest.mf
Normal file
@ -0,0 +1,4 @@
|
||||
Manifest-Version: 1.0
|
||||
SplashScreen-Image: megabasterd/dot_com.jpg
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
1419
nbproject/build-impl.xml
Normal file
8
nbproject/genfiles.properties
Normal file
@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=71569f25
|
||||
build.xml.script.CRC32=cf2d2409
|
||||
build.xml.stylesheet.CRC32=8064a381@1.75.2.48
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=84d88617
|
||||
nbproject/build-impl.xml.script.CRC32=69f27973
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=05530350@1.79.1.48
|
101
nbproject/project.properties
Normal file
@ -0,0 +1,101 @@
|
||||
annotation.processing.enabled=true
|
||||
annotation.processing.enabled.in.editor=false
|
||||
annotation.processing.processors.list=
|
||||
annotation.processing.run.all.processors=true
|
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||
application.title=MegaBasterd
|
||||
application.vendor=tonikelope
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
build.generated.sources.dir=${build.dir}/generated-sources
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
# Uncomment to specify the preferred debugger connection transport:
|
||||
#debug.transport=dt_socket
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
# Files in build.classes.dir which should be excluded from distribution jar
|
||||
dist.archive.excludes=
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/MegaBasterd.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
endorsed.classpath=
|
||||
excludes=
|
||||
file.reference.jackson-core-asl-1.9.13.jar=jackson-core-asl-1.9.13.jar
|
||||
file.reference.jackson-mapper-asl-1.9.13.jar=jackson-mapper-asl-1.9.13.jar
|
||||
file.reference.sqlite-jdbc-3.8.11.2.jar=sqlite-jdbc-3.8.11.2.jar
|
||||
includes=**
|
||||
jar.archive.disabled=${jnlp.enabled}
|
||||
jar.compress=false
|
||||
jar.index=${jnlp.enabled}
|
||||
javac.classpath=\
|
||||
${file.reference.sqlite-jdbc-3.8.11.2.jar}:\
|
||||
${file.reference.jackson-core-asl-1.9.13.jar}:\
|
||||
${file.reference.jackson-mapper-asl-1.9.13.jar}
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.external.vm=false
|
||||
javac.processorpath=\
|
||||
${javac.classpath}
|
||||
javac.source=1.7
|
||||
javac.target=1.7
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
javac.test.processorpath=\
|
||||
${javac.test.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=${source.encoding}
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
jnlp.codebase.type=no.codebase
|
||||
jnlp.descriptor=application
|
||||
jnlp.enabled=false
|
||||
jnlp.mixed.code=default
|
||||
jnlp.offline-allowed=false
|
||||
jnlp.signed=false
|
||||
jnlp.signing=
|
||||
jnlp.signing.alias=
|
||||
jnlp.signing.keystore=
|
||||
main.class=megabasterd.MainPanel
|
||||
# Optional override of default Application-Library-Allowable-Codebase attribute identifying the locations where your signed RIA is expected to be found.
|
||||
manifest.custom.application.library.allowable.codebase=
|
||||
# Optional override of default Caller-Allowable-Codebase attribute identifying the domains from which JavaScript code can make calls to your RIA without security prompts.
|
||||
manifest.custom.caller.allowable.codebase=
|
||||
# Optional override of default Codebase manifest attribute, use to prevent RIAs from being repurposed
|
||||
manifest.custom.codebase=
|
||||
# Optional override of default Permissions manifest attribute (supported values: sandbox, all-permissions)
|
||||
manifest.custom.permissions=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
mkdist.disabled=false
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project.
|
||||
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
|
||||
# To set system properties for unit tests define test-sys-prop.name=value:
|
||||
run.jvmargs=-splash:src/megabasterd/dot_com.jpg
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
source.encoding=UTF-8
|
||||
src.dir=src
|
||||
test.src.dir=test
|
15
nbproject/project.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>MegaBasterd</name>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
182
src/megabasterd/AboutDialog.form
Normal file
@ -0,0 +1,182 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="title" type="java.lang.String" value="About"/>
|
||||
<Property name="iconImage" type="java.awt.Image" editor="org.netbeans.modules.form.ComponentChooserEditor">
|
||||
<ComponentRef name="null"/>
|
||||
</Property>
|
||||
<Property name="resizable" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="subtitle_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="mcdown_url_button" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="check_version_button" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="made_in_spain_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="author_webpage_label" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="pica_roja_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="mc_logo_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
<Component id="title_label" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="title_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="subtitle_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="mcdown_url_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="check_version_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="made_in_spain_label" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="pica_roja_label" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="mc_logo_label" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="author_webpage_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="title_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="48" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="MegaBasterd 1.8.1"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="made_in_spain_label">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/megabasterd/made_in_spain.jpg"/>
|
||||
</Property>
|
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
||||
<Color id="Cursor Por defecto"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="subtitle_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="66" green="66" red="66" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="(Made with love by tonikelope)"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="mc_logo_label">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/megabasterd/mega_crypter.png"/>
|
||||
</Property>
|
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
||||
<Color id="Cursor Por defecto"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="mcdown_url_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Copy MegaBasterd URL"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="mcdown_url_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="author_webpage_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="66" green="66" red="66" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="http://t0ni.xyz"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="pica_roja_label">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/megabasterd/pica_roja_big.png"/>
|
||||
</Property>
|
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
||||
<Color id="Cursor Por defecto"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="check_version_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Check version"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="check_version_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
224
src/megabasterd/AboutDialog.java
Normal file
@ -0,0 +1,224 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JOptionPane;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MainPanel.VERSION;
|
||||
import static megabasterd.MiscTools.copyTextToClipboard;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class AboutDialog extends javax.swing.JDialog {
|
||||
|
||||
private static final String MEGA_URL = "https://mega.nz/#F!lYsRWaQB!uVhntmyKcVECRaOxAbcL4A";
|
||||
|
||||
|
||||
public AboutDialog(MainPanelView parent, boolean modal) {
|
||||
|
||||
super(parent, modal);
|
||||
|
||||
initComponents();
|
||||
|
||||
swingReflectionInvoke("setText", title_label , "MegaBasterd "+ VERSION);
|
||||
updateFont(title_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(subtitle_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(mcdown_url_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(check_version_button, FONT_DEFAULT, Font.PLAIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
title_label = new javax.swing.JLabel();
|
||||
made_in_spain_label = new javax.swing.JLabel();
|
||||
subtitle_label = new javax.swing.JLabel();
|
||||
mc_logo_label = new javax.swing.JLabel();
|
||||
mcdown_url_button = new javax.swing.JButton();
|
||||
author_webpage_label = new javax.swing.JLabel();
|
||||
pica_roja_label = new javax.swing.JLabel();
|
||||
check_version_button = new javax.swing.JButton();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setTitle("About");
|
||||
setIconImage(null);
|
||||
setResizable(false);
|
||||
|
||||
title_label.setFont(new java.awt.Font("Dialog", 1, 48)); // NOI18N
|
||||
title_label.setText("MegaBasterd 1.8.1");
|
||||
title_label.setDoubleBuffered(true);
|
||||
|
||||
made_in_spain_label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/megabasterd/made_in_spain.jpg"))); // NOI18N
|
||||
made_in_spain_label.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
|
||||
made_in_spain_label.setDoubleBuffered(true);
|
||||
|
||||
subtitle_label.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
subtitle_label.setForeground(new java.awt.Color(102, 102, 102));
|
||||
subtitle_label.setText("(Made with love by tonikelope)");
|
||||
subtitle_label.setDoubleBuffered(true);
|
||||
|
||||
mc_logo_label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/megabasterd/mega_crypter.png"))); // NOI18N
|
||||
mc_logo_label.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
|
||||
mc_logo_label.setDoubleBuffered(true);
|
||||
|
||||
mcdown_url_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
mcdown_url_button.setText("Copy MegaBasterd URL");
|
||||
mcdown_url_button.setDoubleBuffered(true);
|
||||
mcdown_url_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
mcdown_url_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
author_webpage_label.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
|
||||
author_webpage_label.setForeground(new java.awt.Color(102, 102, 102));
|
||||
author_webpage_label.setText("http://t0ni.xyz");
|
||||
author_webpage_label.setDoubleBuffered(true);
|
||||
|
||||
pica_roja_label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/megabasterd/pica_roja_big.png"))); // NOI18N
|
||||
pica_roja_label.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
|
||||
pica_roja_label.setDoubleBuffered(true);
|
||||
|
||||
check_version_button.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
|
||||
check_version_button.setText("Check version");
|
||||
check_version_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
check_version_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(subtitle_label)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addGap(0, 0, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(mcdown_url_button, javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(check_version_button, javax.swing.GroupLayout.Alignment.TRAILING)))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(made_in_spain_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(author_webpage_label)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
|
||||
.addComponent(pica_roja_label)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(mc_logo_label))))
|
||||
.addComponent(title_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(title_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(subtitle_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(mcdown_url_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(check_version_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(made_in_spain_label)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(pica_roja_label, javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(mc_logo_label, javax.swing.GroupLayout.Alignment.TRAILING))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(author_webpage_label)))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void mcdown_url_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mcdown_url_buttonActionPerformed
|
||||
|
||||
|
||||
copyTextToClipboard(MEGA_URL);
|
||||
|
||||
JOptionPane.showMessageDialog(this, "MEGA URL was copied to clipboard!");
|
||||
}//GEN-LAST:event_mcdown_url_buttonActionPerformed
|
||||
|
||||
private void check_version_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_check_version_buttonActionPerformed
|
||||
|
||||
|
||||
swingReflectionInvoke("setEnabled", check_version_button, false);
|
||||
|
||||
final AboutDialog main = this;
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
try {
|
||||
|
||||
MegaAPI ma = new MegaAPI();
|
||||
|
||||
HashMap<String, Object> folder_nodes = ma.getFolderNodes("lYsRWaQB", "uVhntmyKcVECRaOxAbcL4A");
|
||||
|
||||
boolean new_version=true;
|
||||
|
||||
for(Object o:folder_nodes.values()) {
|
||||
|
||||
HashMap<String,Object> current_node = (HashMap<String,Object>)o;
|
||||
|
||||
if(((String)current_node.get("name")).contains("_"+VERSION.replaceAll(" *beta *", "")+".")) {
|
||||
|
||||
JOptionPane.showMessageDialog(main, "You have the latest version ;)");
|
||||
|
||||
new_version = false;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(new_version) {
|
||||
|
||||
JOptionPane.showMessageDialog(main, "NEW VERSION IS AVAILABLE!");
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(AboutDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.check_version_button, true);
|
||||
|
||||
}});
|
||||
|
||||
}//GEN-LAST:event_check_version_buttonActionPerformed
|
||||
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel author_webpage_label;
|
||||
private javax.swing.JButton check_version_button;
|
||||
private javax.swing.JLabel made_in_spain_label;
|
||||
private javax.swing.JLabel mc_logo_label;
|
||||
private javax.swing.JButton mcdown_url_button;
|
||||
private javax.swing.JLabel pica_roja_label;
|
||||
private javax.swing.JLabel subtitle_label;
|
||||
private javax.swing.JLabel title_label;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
89
src/megabasterd/Chunk.java
Normal file
@ -0,0 +1,89 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import static java.lang.String.valueOf;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class Chunk {
|
||||
|
||||
private final long _id;
|
||||
private final long _offset;
|
||||
private final long _size;
|
||||
private final ByteArrayOutputStream _data_os;
|
||||
private final String _url;
|
||||
|
||||
|
||||
public Chunk(long id, long file_size, String file_url) throws ChunkInvalidIdException
|
||||
{
|
||||
_id = id;
|
||||
|
||||
_offset = calculateOffset();
|
||||
|
||||
if(file_size > 0)
|
||||
{
|
||||
if(_offset>=file_size) {
|
||||
throw new ChunkInvalidIdException(valueOf(id));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if(id>1) {
|
||||
|
||||
throw new ChunkInvalidIdException(valueOf(id));
|
||||
}
|
||||
}
|
||||
|
||||
_size = calculateSize(file_size);
|
||||
|
||||
_url = file_url!=null?file_url+"/"+_offset+"-"+(_offset+_size-1):null;
|
||||
|
||||
_data_os = new ByteArrayOutputStream((int)_size);
|
||||
}
|
||||
|
||||
public long getOffset() {
|
||||
return _offset;
|
||||
}
|
||||
|
||||
public ByteArrayOutputStream getOutputStream() {
|
||||
return _data_os;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return _id;
|
||||
}
|
||||
|
||||
public long getSize() {
|
||||
return _size;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return _url;
|
||||
}
|
||||
|
||||
public ByteArrayInputStream getInputStream() {
|
||||
return new ByteArrayInputStream(_data_os.toByteArray());
|
||||
}
|
||||
|
||||
private long calculateSize(long file_size)
|
||||
{
|
||||
long chunk_size = (_id>=1 && _id<=7)?_id*128*1024:1024*1024;
|
||||
|
||||
if(_offset + chunk_size > file_size) {
|
||||
chunk_size = file_size - _offset;
|
||||
}
|
||||
|
||||
return chunk_size;
|
||||
}
|
||||
|
||||
private long calculateOffset()
|
||||
{
|
||||
long[] offs = {0, 128, 384, 768, 1280, 1920, 2688};
|
||||
|
||||
return (_id<=7?offs[(int)_id-1]:(3584 + (_id-8)*1024))*1024;
|
||||
}
|
||||
|
||||
}
|
255
src/megabasterd/ChunkDownloader.java
Normal file
@ -0,0 +1,255 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import static megabasterd.MainPanel.THROTTLE_SLICE_SIZE;
|
||||
import static megabasterd.MainPanel.USER_AGENT;
|
||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public class ChunkDownloader implements Runnable, SecureNotifiable {
|
||||
|
||||
private final int _id;
|
||||
private final Download _download;
|
||||
private volatile boolean _exit;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified;
|
||||
|
||||
|
||||
public ChunkDownloader(int id, Download download)
|
||||
{
|
||||
_notified = false;
|
||||
_exit = false;
|
||||
_secure_notify_lock = new Object();
|
||||
_id = id;
|
||||
_download = download;
|
||||
}
|
||||
|
||||
public void setExit(boolean exit) {
|
||||
_exit = exit;
|
||||
}
|
||||
|
||||
public boolean isExit() {
|
||||
return _exit;
|
||||
}
|
||||
|
||||
public Download getDownload() {
|
||||
return _download;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return _id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
String worker_url=null;
|
||||
Chunk chunk;
|
||||
int reads, conta_error, http_status;
|
||||
byte[] buffer = new byte[THROTTLE_SLICE_SIZE];
|
||||
InputStream is;
|
||||
boolean error;
|
||||
|
||||
System.out.println("Worker ["+_id+"]: let's do some work!");
|
||||
|
||||
try
|
||||
{
|
||||
conta_error = 0;
|
||||
|
||||
error = false;
|
||||
|
||||
while(!_exit && !_download.isStopped())
|
||||
{
|
||||
if(worker_url == null || error) {
|
||||
|
||||
worker_url=_download.getDownloadUrlForWorker();
|
||||
}
|
||||
|
||||
chunk = new Chunk(_download.nextChunkId(), _download.getFile_size(), worker_url);
|
||||
|
||||
URL url = new URL(chunk.getUrl());
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setConnectTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setReadTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setRequestProperty("User-Agent", USER_AGENT);
|
||||
conn.setRequestProperty("Connection", "close");
|
||||
|
||||
error = false;
|
||||
|
||||
try{
|
||||
|
||||
if(!_exit && !_download.isStopped()) {
|
||||
|
||||
is = new ThrottledInputStream(conn.getInputStream(), _download.getMain_panel().getStream_supervisor());
|
||||
|
||||
http_status = conn.getResponseCode();
|
||||
|
||||
if ( http_status != HttpURLConnection.HTTP_OK )
|
||||
{
|
||||
System.out.println("Failed : HTTP error code : " + http_status);
|
||||
|
||||
error = true;
|
||||
|
||||
} else {
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
is.close();
|
||||
|
||||
if(chunk.getOutputStream().size() < chunk.getSize()) {
|
||||
|
||||
if(chunk.getOutputStream().size() > 0)
|
||||
{
|
||||
_download.getPartialProgressQueue().add(-1*chunk.getOutputStream().size());
|
||||
|
||||
_download.getProgress_meter().secureNotify();
|
||||
|
||||
}
|
||||
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(error && !_download.isStopped()) {
|
||||
|
||||
_download.rejectChunkId(chunk.getId());
|
||||
|
||||
conta_error++;
|
||||
|
||||
Thread.sleep(getWaitTimeExpBackOff(conta_error)*1000);
|
||||
|
||||
} else if(!error) {
|
||||
|
||||
System.out.println("Worker ["+_id+"] has downloaded chunk ["+chunk.getId()+"]!");
|
||||
|
||||
_download.getChunkwriter().getChunk_queue().put(chunk.getId(), chunk);
|
||||
|
||||
_download.getChunkwriter().secureNotify();
|
||||
|
||||
conta_error = 0;
|
||||
}
|
||||
|
||||
} else if(_exit) {
|
||||
|
||||
_download.rejectChunkId(chunk.getId());
|
||||
}
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
error = true;
|
||||
|
||||
_download.rejectChunkId(chunk.getId());
|
||||
|
||||
if(chunk.getOutputStream().size() > 0)
|
||||
{
|
||||
_download.getPartialProgressQueue().add(-1*chunk.getOutputStream().size());
|
||||
|
||||
_download.getProgress_meter().secureNotify();
|
||||
}
|
||||
|
||||
|
||||
Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
} finally {
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
}catch(ChunkInvalidIdException e) {
|
||||
|
||||
}catch (IOException ex) {
|
||||
_download.emergencyStopDownloader(ex.getMessage());
|
||||
Logger.getLogger(ChunkDownloader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
if(!_exit) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", _download.getView().getSlots_spinner(), false);
|
||||
|
||||
swingReflectionInvoke("setText", _download.getView().getSlot_status_label(), "");
|
||||
|
||||
_download.setFinishing_download(true);
|
||||
|
||||
} else if(!_download.isFinishing_download()) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", _download.getView().getSlots_spinner(), true);
|
||||
|
||||
swingReflectionInvoke("setText", _download.getView().getSlot_status_label(), "");
|
||||
}
|
||||
|
||||
_download.stopThisSlot(this);
|
||||
|
||||
_download.getChunkwriter().secureNotify();
|
||||
|
||||
System.out.println("Worker ["+_id+"]: bye bye");
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
181
src/megabasterd/ChunkDownloaderMono.java
Normal file
@ -0,0 +1,181 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import static megabasterd.MainPanel.THROTTLE_SLICE_SIZE;
|
||||
import static megabasterd.MainPanel.USER_AGENT;
|
||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public class ChunkDownloaderMono extends ChunkDownloader {
|
||||
|
||||
public ChunkDownloaderMono(int id, Download download) {
|
||||
super(id, download);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
String worker_url=null;
|
||||
Chunk chunk;
|
||||
int reads, max_reads, conta_error, http_status=200;
|
||||
byte[] buffer = new byte[THROTTLE_SLICE_SIZE];
|
||||
boolean error;
|
||||
|
||||
System.out.println("Worker ["+getId()+"]: let's do some work!");
|
||||
|
||||
HttpURLConnection conn=null;
|
||||
|
||||
try
|
||||
{
|
||||
conta_error = 0;
|
||||
|
||||
error = false;
|
||||
|
||||
URL url = null;
|
||||
|
||||
InputStream is=null;
|
||||
|
||||
while(!isExit() && !getDownload().isStopped())
|
||||
{
|
||||
if(worker_url == null || error) {
|
||||
|
||||
worker_url=getDownload().getDownloadUrlForWorker();
|
||||
}
|
||||
|
||||
chunk = new Chunk(getDownload().nextChunkId(), getDownload().getFile_size(), worker_url);
|
||||
|
||||
if(url == null || error) {
|
||||
|
||||
url = new URL(worker_url+"/"+chunk.getOffset());
|
||||
conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setConnectTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setReadTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setRequestProperty("User-Agent", USER_AGENT);
|
||||
conn.setRequestProperty("Connection", "close");
|
||||
is = new ThrottledInputStream(conn.getInputStream(), getDownload().getMain_panel().getStream_supervisor());
|
||||
http_status = conn.getResponseCode();
|
||||
}
|
||||
|
||||
if(http_status != HttpURLConnection.HTTP_OK){
|
||||
|
||||
System.out.println("Failed : HTTP error code : " + http_status);
|
||||
|
||||
error = true;
|
||||
|
||||
} else {
|
||||
|
||||
error = false;
|
||||
|
||||
try{
|
||||
|
||||
if(!isExit() && !getDownload().isStopped()) {
|
||||
|
||||
while(!getDownload().isStopped() && !getDownload().getChunkwriter().isExit() && chunk.getOutputStream().size() < chunk.getSize() && (reads=is.read(buffer, 0, (max_reads=(int)(chunk.getSize() - chunk.getOutputStream().size())) <= buffer.length?max_reads:buffer.length))!=-1 )
|
||||
{
|
||||
chunk.getOutputStream().write(buffer, 0, reads);
|
||||
|
||||
getDownload().getPartialProgressQueue().add(reads);
|
||||
|
||||
getDownload().getProgress_meter().secureNotify();
|
||||
|
||||
if(getDownload().isPaused() && !getDownload().isStopped()) {
|
||||
|
||||
getDownload().pause_worker_mono();
|
||||
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
|
||||
if(chunk.getOutputStream().size() < chunk.getSize()) {
|
||||
|
||||
if(chunk.getOutputStream().size() > 0)
|
||||
{
|
||||
getDownload().getPartialProgressQueue().add(-1*chunk.getOutputStream().size());
|
||||
|
||||
getDownload().getProgress_meter().secureNotify();
|
||||
}
|
||||
|
||||
error = true;
|
||||
}
|
||||
|
||||
if(error && !getDownload().isStopped()) {
|
||||
|
||||
getDownload().rejectChunkId(chunk.getId());
|
||||
|
||||
conta_error++;
|
||||
|
||||
Thread.sleep(getWaitTimeExpBackOff(conta_error)*1000);
|
||||
|
||||
} else if(!error) {
|
||||
|
||||
getDownload().getChunkwriter().getChunk_queue().put(chunk.getId(), chunk);
|
||||
|
||||
getDownload().getChunkwriter().secureNotify();
|
||||
|
||||
conta_error = 0;
|
||||
}
|
||||
|
||||
} else if(isExit()) {
|
||||
|
||||
getDownload().rejectChunkId(chunk.getId());
|
||||
}
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
error = true;
|
||||
|
||||
getDownload().rejectChunkId(chunk.getId());
|
||||
|
||||
if(chunk.getOutputStream().size() > 0)
|
||||
{
|
||||
getDownload().getPartialProgressQueue().add(-1*chunk.getOutputStream().size());
|
||||
|
||||
getDownload().getProgress_meter().secureNotify();
|
||||
}
|
||||
|
||||
Logger.getLogger(ChunkDownloaderMono.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(ChunkDownloaderMono.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}catch(ChunkInvalidIdException e) {
|
||||
|
||||
}catch (MalformedURLException ex) {
|
||||
|
||||
Logger.getLogger(ChunkDownloaderMono.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
} catch (IOException ex) {
|
||||
|
||||
Logger.getLogger(ChunkDownloaderMono.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
getDownload().emergencyStopDownloader(ex.getMessage());
|
||||
|
||||
} finally {
|
||||
|
||||
if(conn!=null) {
|
||||
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
getDownload().stopThisSlot(this);
|
||||
|
||||
getDownload().getChunkwriter().secureNotify();
|
||||
|
||||
System.out.println("Worker ["+getId()+"]: bye bye");
|
||||
|
||||
}
|
||||
}
|
15
src/megabasterd/ChunkInvalidIdException.java
Normal file
@ -0,0 +1,15 @@
|
||||
package megabasterd;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class ChunkInvalidIdException extends Exception {
|
||||
|
||||
public ChunkInvalidIdException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
|
||||
}
|
311
src/megabasterd/ChunkUploader.java
Normal file
@ -0,0 +1,311 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import javax.crypto.CipherInputStream;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class ChunkUploader implements Runnable, SecureNotifiable {
|
||||
|
||||
private final int _id;
|
||||
private final Upload _upload;
|
||||
private volatile boolean _exit;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified=false;
|
||||
|
||||
public ChunkUploader(int id, Upload upload)
|
||||
{
|
||||
_secure_notify_lock = new Object();
|
||||
_id = id;
|
||||
_upload = upload;
|
||||
_exit = false;
|
||||
}
|
||||
|
||||
public void setExit(boolean exit) {
|
||||
_exit = exit;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(ChunkUploader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return _id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
System.out.println("ChunkUploader "+_id+" hello!");
|
||||
|
||||
String worker_url=_upload.getUl_url();
|
||||
Chunk chunk;
|
||||
int reads, to_read, conta_error, re, http_status, tot_bytes_up;
|
||||
byte[] buffer = new byte[MainPanel.THROTTLE_SLICE_SIZE];
|
||||
boolean error;
|
||||
OutputStream out;
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
RandomAccessFile f = new RandomAccessFile(_upload.getFile_name(), "r");
|
||||
|
||||
conta_error = 0;
|
||||
|
||||
while(!_exit && !_upload.isStopped())
|
||||
{
|
||||
chunk = new Chunk(_upload.nextChunkId(), _upload.getFile_size(), worker_url);
|
||||
|
||||
f.seek(chunk.getOffset());
|
||||
|
||||
do
|
||||
{
|
||||
to_read = chunk.getSize() - chunk.getOutputStream().size() >= buffer.length?buffer.length:(int)(chunk.getSize() - chunk.getOutputStream().size());
|
||||
|
||||
re=f.read(buffer, 0, to_read);
|
||||
|
||||
chunk.getOutputStream().write(buffer, 0, re);
|
||||
|
||||
}while(!_exit && !_upload.isStopped() && chunk.getOutputStream().size()<chunk.getSize());
|
||||
|
||||
URL url = new URL(chunk.getUrl());
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setConnectTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setReadTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setDoOutput(true);
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
||||
conn.setRequestProperty("Connection", "close");
|
||||
conn.setFixedLengthStreamingMode(chunk.getSize());
|
||||
|
||||
tot_bytes_up=0;
|
||||
|
||||
error = false;
|
||||
|
||||
try{
|
||||
|
||||
if(!_exit && !_upload.isStopped()) {
|
||||
|
||||
CipherInputStream cis = new CipherInputStream(chunk.getInputStream(), CryptTools.genCrypter("AES", "AES/CTR/NoPadding", _upload.getByte_file_key(), CryptTools.forwardMEGALinkKeyIV(_upload.getByte_file_iv(), chunk.getOffset())));
|
||||
|
||||
conn.connect();
|
||||
|
||||
out = new ThrottledOutputStream(conn.getOutputStream(), _upload.getMain_panel().getStream_supervisor());
|
||||
|
||||
System.out.println(" Subiendo chunk "+chunk.getId()+" desde worker "+ _id +"...");
|
||||
|
||||
while( !_exit && !_upload.isStopped() && (reads=cis.read(buffer))!=-1 )
|
||||
{
|
||||
out.write(buffer, 0, reads);
|
||||
|
||||
_upload.getPartialProgress().add(reads);
|
||||
|
||||
_upload.getProgress_meter().secureNotify();
|
||||
|
||||
tot_bytes_up+=reads;
|
||||
|
||||
if(_upload.isPaused() && !_upload.isStopped()) {
|
||||
|
||||
_upload.pause_worker();
|
||||
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
|
||||
if(!_upload.isStopped()) {
|
||||
|
||||
http_status = conn.getResponseCode();
|
||||
|
||||
if (http_status != HttpURLConnection.HTTP_OK )
|
||||
{
|
||||
System.out.println("Failed : HTTP error code : " + http_status);
|
||||
|
||||
error = true;
|
||||
|
||||
} else {
|
||||
|
||||
if(tot_bytes_up < chunk.getSize())
|
||||
{
|
||||
if(tot_bytes_up > 0) {
|
||||
|
||||
_upload.getPartialProgress().add(-1*tot_bytes_up);
|
||||
|
||||
_upload.getProgress_meter().secureNotify();
|
||||
}
|
||||
|
||||
error = true;
|
||||
|
||||
} else {
|
||||
|
||||
String content_encoding = conn.getContentEncoding();
|
||||
|
||||
InputStream is=(content_encoding!=null && content_encoding.equals("gzip"))?new GZIPInputStream(conn.getInputStream()):conn.getInputStream();
|
||||
|
||||
ByteArrayOutputStream byte_res = new ByteArrayOutputStream();
|
||||
|
||||
while( (reads=is.read(buffer)) != -1 ) {
|
||||
|
||||
byte_res.write(buffer, 0, reads);
|
||||
}
|
||||
|
||||
String response = new String(byte_res.toByteArray());
|
||||
|
||||
conn.disconnect();
|
||||
|
||||
if(response.length() > 0) {
|
||||
|
||||
if( MegaAPI.checkMEGAError(response) != 0 )
|
||||
{
|
||||
error = true;
|
||||
|
||||
} else {
|
||||
|
||||
System.out.println("Completion handle -> "+response);
|
||||
|
||||
_upload.setCompletion_handle(response);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
conn.disconnect();
|
||||
|
||||
if(error && !_upload.isStopped()) {
|
||||
|
||||
_upload.rejectChunkId(chunk.getId());
|
||||
|
||||
conta_error++;
|
||||
|
||||
if(!_exit) {
|
||||
|
||||
Thread.sleep(getWaitTimeExpBackOff(conta_error)*1000);
|
||||
}
|
||||
|
||||
} else if(!error) {
|
||||
|
||||
System.out.println(" Worker "+_id+" ha subido chunk "+chunk.getId());
|
||||
|
||||
_upload.getMac_generator().getChunk_queue().put(chunk.getId(), chunk);
|
||||
|
||||
_upload.getMac_generator().secureNotify();
|
||||
|
||||
conta_error = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else if(_exit) {
|
||||
|
||||
_upload.rejectChunkId(chunk.getId());
|
||||
}
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
_upload.rejectChunkId(chunk.getId());
|
||||
|
||||
if(tot_bytes_up > 0) {
|
||||
|
||||
_upload.getPartialProgress().add(-1*tot_bytes_up);
|
||||
|
||||
_upload.getProgress_meter().secureNotify();
|
||||
}
|
||||
|
||||
Logger.getLogger(ChunkUploader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | InterruptedException ex) {
|
||||
Logger.getLogger(ChunkUploader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
} finally {
|
||||
conn.disconnect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}catch(ChunkInvalidIdException e) {
|
||||
|
||||
} catch (IOException ex) {
|
||||
|
||||
_upload.emergencyStopUploader(ex.getMessage());
|
||||
|
||||
Logger.getLogger(ChunkUploader.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
if(!_exit) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", _upload.getView().getSlots_spinner(), false);
|
||||
|
||||
swingReflectionInvoke("setText", _upload.getView().getSlot_status_label(), "");
|
||||
|
||||
_upload.setFinishing_upload(true);
|
||||
|
||||
} else if(!_upload.isFinishing_upload()) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", _upload.getView().getSlots_spinner(), true);
|
||||
|
||||
swingReflectionInvoke("setText", _upload.getView().getSlot_status_label(), "");
|
||||
}
|
||||
|
||||
_upload.stopThisSlot(this);
|
||||
|
||||
_upload.getMac_generator().secureNotify();
|
||||
|
||||
System.out.println("ChunkUploader "+_id+" bye bye...");
|
||||
}
|
||||
|
||||
}
|
206
src/megabasterd/ChunkWriter.java
Normal file
@ -0,0 +1,206 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.crypto.CipherInputStream;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
|
||||
|
||||
public final class ChunkWriter implements Runnable, SecureNotifiable {
|
||||
|
||||
private long _last_chunk_id_written;
|
||||
private long _bytes_written;
|
||||
private final long _file_size;
|
||||
private final ConcurrentHashMap<Long,Chunk> _chunk_queue;
|
||||
private final Download _download;
|
||||
private final byte[] _byte_file_key;
|
||||
private final byte[] _byte_iv;
|
||||
private volatile boolean _exit;
|
||||
private final ConcurrentLinkedQueue<Long> _rejectedChunkIds;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified;
|
||||
public ChunkWriter(Download downloader) throws Exception
|
||||
{
|
||||
_notified = false;
|
||||
_exit = false;
|
||||
_download = downloader;
|
||||
_secure_notify_lock = new Object();
|
||||
_file_size = _download.getFile_size();
|
||||
_byte_file_key = CryptTools.initMEGALinkKey(_download.getFile_key());
|
||||
_byte_iv = CryptTools.initMEGALinkKeyIV(_download.getFile_key());
|
||||
_chunk_queue = new ConcurrentHashMap();
|
||||
_rejectedChunkIds = new ConcurrentLinkedQueue();
|
||||
|
||||
if(_download.getProgress() == 0)
|
||||
{
|
||||
_download.setLast_chunk_id_dispatched(0);
|
||||
|
||||
_last_chunk_id_written = 0;
|
||||
|
||||
_bytes_written = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
_last_chunk_id_written = calculateLastWrittenChunk(_download.getProgress());
|
||||
|
||||
_download.setLast_chunk_id_dispatched(_last_chunk_id_written);
|
||||
|
||||
_bytes_written = _download.getProgress();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(ChunkWriter.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getByte_file_key() {
|
||||
return _byte_file_key;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue getRejectedChunkIds() {
|
||||
return _rejectedChunkIds;
|
||||
}
|
||||
|
||||
|
||||
public boolean isExit() {
|
||||
return _exit;
|
||||
}
|
||||
|
||||
public long getBytes_written() {
|
||||
return _bytes_written;
|
||||
}
|
||||
|
||||
public long getLast_chunk_id_written() {
|
||||
return _last_chunk_id_written;
|
||||
}
|
||||
|
||||
|
||||
public ConcurrentHashMap getChunk_queue()
|
||||
{
|
||||
return _chunk_queue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
Chunk current_chunk;
|
||||
CipherInputStream cis;
|
||||
byte[] buffer = new byte[16*1024];
|
||||
int reads;
|
||||
|
||||
try {
|
||||
|
||||
System.out.println("Filewriter: let's do some work!");
|
||||
|
||||
if(_file_size > 0)
|
||||
{
|
||||
while(!_exit && (!_download.isStopped() || _download.chunkDownloadersRunning()) && _bytes_written < _file_size)
|
||||
{
|
||||
while(_chunk_queue.containsKey(_last_chunk_id_written+1))
|
||||
{
|
||||
current_chunk = _chunk_queue.get(_last_chunk_id_written+1);
|
||||
|
||||
cis = new CipherInputStream(current_chunk.getInputStream(), CryptTools.genDecrypter("AES", "AES/CTR/NoPadding", _byte_file_key, CryptTools.forwardMEGALinkKeyIV(_byte_iv, _bytes_written)));
|
||||
|
||||
while((reads=cis.read(buffer))!=-1)
|
||||
{
|
||||
_download.getOutput_stream().write(buffer, 0, reads);
|
||||
}
|
||||
|
||||
cis.close();
|
||||
|
||||
_bytes_written+=current_chunk.getSize();
|
||||
|
||||
_chunk_queue.remove(current_chunk.getId());
|
||||
|
||||
_last_chunk_id_written = current_chunk.getId();
|
||||
|
||||
}
|
||||
|
||||
if(!_exit && (!_download.isStopped() || _download.chunkDownloadersRunning()) && _bytes_written < _file_size)
|
||||
{
|
||||
|
||||
System.out.println("Filewriter waiting for chunk ["+(_last_chunk_id_written+1)+"]...");
|
||||
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IOException | NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | InvalidAlgorithmParameterException ex) {
|
||||
|
||||
System.out.println(ex.getMessage());
|
||||
|
||||
_download.emergencyStopDownloader(ex.getMessage());
|
||||
}
|
||||
|
||||
_exit = true;
|
||||
|
||||
_download.secureNotify();
|
||||
|
||||
System.out.println("Filewriter: bye bye"+_download.getFile().getName());
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
else
|
||||
{
|
||||
int i=0, tot=0;
|
||||
|
||||
while(tot < temp_file_size)
|
||||
{
|
||||
i++;
|
||||
tot+=i*128*1024;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
16
src/megabasterd/ClipboardChangeObservable.java
Normal file
@ -0,0 +1,16 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.datatransfer.Transferable;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public interface ClipboardChangeObservable {
|
||||
|
||||
void attachObserver(ClipboardChangeObserver observer);
|
||||
void detachObserver(ClipboardChangeObserver observer);
|
||||
Transferable getContents();
|
||||
void notifyChangeToMyObservers();
|
||||
|
||||
}
|
11
src/megabasterd/ClipboardChangeObserver.java
Normal file
@ -0,0 +1,11 @@
|
||||
package megabasterd;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public interface ClipboardChangeObserver {
|
||||
|
||||
void notifyClipboardChange();
|
||||
|
||||
}
|
186
src/megabasterd/ClipboardSpy.java
Normal file
@ -0,0 +1,186 @@
|
||||
package megabasterd;
|
||||
|
||||
import static java.awt.Toolkit.getDefaultToolkit;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.ClipboardOwner;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import static java.lang.System.out;
|
||||
import static java.lang.Thread.sleep;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
|
||||
|
||||
public final class ClipboardSpy implements Runnable, ClipboardOwner, SecureNotifiable, ClipboardChangeObservable {
|
||||
|
||||
private static final int SLEEP = 50;
|
||||
|
||||
private final Clipboard _sysClip = getDefaultToolkit().getSystemClipboard();
|
||||
|
||||
private boolean _notified=false;
|
||||
|
||||
private final ConcurrentLinkedQueue<ClipboardChangeObserver> _observers;
|
||||
|
||||
private Transferable _contents;
|
||||
|
||||
private final Object _secure_notify_lock;
|
||||
|
||||
|
||||
|
||||
public ClipboardSpy() {
|
||||
_contents = null;
|
||||
_secure_notify_lock = new Object();
|
||||
_observers = new ConcurrentLinkedQueue<>();
|
||||
}
|
||||
@Override
|
||||
public Transferable getContents() {
|
||||
return _contents;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
getLogger(ClipboardSpy.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
_contents = getClipboardContents();
|
||||
|
||||
gainOwnership(_contents);
|
||||
|
||||
out.println("Spying clipboard...");
|
||||
|
||||
secureWait();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void lostOwnership(Clipboard c, Transferable t) {
|
||||
|
||||
_contents = getClipboardContents();
|
||||
|
||||
notifyChangeToMyObservers();
|
||||
|
||||
gainOwnership(_contents);
|
||||
}
|
||||
|
||||
|
||||
private Transferable getClipboardContents() {
|
||||
|
||||
boolean error;
|
||||
|
||||
Transferable c = null;
|
||||
|
||||
do{
|
||||
error = false;
|
||||
|
||||
try{
|
||||
|
||||
c = _sysClip.getContents(null);
|
||||
|
||||
} catch(Exception ex) {
|
||||
|
||||
error = true;
|
||||
|
||||
try {
|
||||
sleep(SLEEP);
|
||||
} catch (InterruptedException ex1) {
|
||||
getLogger(ClipboardSpy.class.getName()).log(SEVERE, null, ex1);
|
||||
}
|
||||
}
|
||||
|
||||
}while(error);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
private void gainOwnership(Transferable t) {
|
||||
|
||||
boolean error;
|
||||
|
||||
do{
|
||||
error = false;
|
||||
|
||||
try{
|
||||
|
||||
_sysClip.setContents(t,this);
|
||||
|
||||
} catch(Exception ex) {
|
||||
|
||||
error = true;
|
||||
|
||||
try {
|
||||
sleep(SLEEP);
|
||||
} catch (InterruptedException ex1) {
|
||||
getLogger(ClipboardSpy.class.getName()).log(SEVERE, null, ex1);
|
||||
}
|
||||
}
|
||||
|
||||
}while(error);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void attachObserver(ClipboardChangeObserver observer) {
|
||||
|
||||
if(!_observers.contains(observer)) {
|
||||
|
||||
_observers.add(observer);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detachObserver(ClipboardChangeObserver observer) {
|
||||
|
||||
_observers.remove(observer);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyChangeToMyObservers() {
|
||||
|
||||
for(ClipboardChangeObserver o:_observers) {
|
||||
|
||||
o.notifyClipboardChange();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
59
src/megabasterd/ContentType.java
Normal file
@ -0,0 +1,59 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public final class ContentType {
|
||||
|
||||
private final HashMap<String,String> _content_type;
|
||||
|
||||
|
||||
public ContentType() {
|
||||
|
||||
_content_type = new HashMap();
|
||||
|
||||
_content_type.put("mp2", "audio/x-mpeg");
|
||||
_content_type.put("mp3", "audio/x-mpeg");
|
||||
_content_type.put("mpga", "audio/x-mpeg");
|
||||
_content_type.put("mpega", "audio/x-mpeg");
|
||||
_content_type.put("mpg", "video/x-mpeg-system");
|
||||
_content_type.put("mpeg", "video/x-mpeg-system");
|
||||
_content_type.put("mpe", "video/x-mpeg-system");
|
||||
_content_type.put("vob", "video/x-mpeg-system");
|
||||
_content_type.put("aac", "audio/mp4");
|
||||
_content_type.put("mp4", "video/mp4");
|
||||
_content_type.put("mpg4", "video/mp4");
|
||||
_content_type.put("m4v", "video/x-m4v");
|
||||
_content_type.put("avi", "video/x-msvideo");
|
||||
_content_type.put("ogg", "application/ogg");
|
||||
_content_type.put("ogv", "video/ogg");
|
||||
_content_type.put("asf", "video/x-ms-asf-plugin");
|
||||
_content_type.put("asx", "video/x-ms-asf-plugin");
|
||||
_content_type.put("ogv", "video/ogg");
|
||||
_content_type.put("wmv", "video/x-ms-wmv");
|
||||
_content_type.put("wmx", "video/x-ms-wvx");
|
||||
_content_type.put("wma", "audio/x-ms-wma");
|
||||
_content_type.put("wav", "audio/wav");
|
||||
_content_type.put("3gp", "audio/3gpp");
|
||||
_content_type.put("3gp2", "audio/3gpp2");
|
||||
_content_type.put("divx", "video/divx");
|
||||
_content_type.put("flv", "video/flv");
|
||||
_content_type.put("mkv", "video/x-matroska");
|
||||
_content_type.put("mka", "audio/x-matroska");
|
||||
_content_type.put("m3u", "audio/x-mpegurl");
|
||||
_content_type.put("webm", "video/webm");
|
||||
_content_type.put("rm", "application/vnd.rn-realmedia");
|
||||
_content_type.put("ra", "audio/x-realaudio");
|
||||
_content_type.put("amr", "audio/amr");
|
||||
_content_type.put("flac", "audio/x-flac");
|
||||
_content_type.put("mov", "video/quicktime");
|
||||
_content_type.put("qt", "video/quicktime");
|
||||
}
|
||||
public HashMap<String, String> getContent_type() {
|
||||
return _content_type;
|
||||
}
|
||||
|
||||
public String getMIME(String ext)
|
||||
{
|
||||
return _content_type.get(ext);
|
||||
}
|
||||
}
|
125
src/megabasterd/ContextMenuMouseListener.java
Normal file
@ -0,0 +1,125 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.text.JTextComponent;
|
||||
|
||||
public final class ContextMenuMouseListener extends MouseAdapter {
|
||||
|
||||
private final JPopupMenu _popup;
|
||||
private final Action _cutAction;
|
||||
private final Action _copyAction;
|
||||
private final Action _pasteAction;
|
||||
private final Action _undoAction;
|
||||
private final Action _selectAllAction;
|
||||
private JTextComponent _textComponent;
|
||||
private String _savedString;
|
||||
private _Actions _lastActionSelected;
|
||||
|
||||
|
||||
|
||||
public ContextMenuMouseListener() {
|
||||
_savedString = "";
|
||||
_popup = new JPopupMenu();
|
||||
_undoAction = new AbstractAction("Undo") {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ae) {
|
||||
_textComponent.setText("");
|
||||
_textComponent.replaceSelection(_savedString);
|
||||
_lastActionSelected = _Actions.UNDO;
|
||||
}
|
||||
};
|
||||
|
||||
_popup.add(_undoAction);
|
||||
_popup.addSeparator();
|
||||
_cutAction = new AbstractAction("Cut") {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ae) {
|
||||
_lastActionSelected = _Actions.CUT;
|
||||
_savedString = _textComponent.getText();
|
||||
_textComponent.cut();
|
||||
}
|
||||
};
|
||||
|
||||
_popup.add(_cutAction);
|
||||
|
||||
_copyAction = new AbstractAction("Copy") {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ae) {
|
||||
_lastActionSelected = _Actions.COPY;
|
||||
_textComponent.copy();
|
||||
}
|
||||
};
|
||||
|
||||
_popup.add(_copyAction);
|
||||
|
||||
_pasteAction = new AbstractAction("Paste") {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ae) {
|
||||
_lastActionSelected = _Actions.PASTE;
|
||||
_savedString = _textComponent.getText();
|
||||
_textComponent.paste();
|
||||
}
|
||||
};
|
||||
|
||||
_popup.add(_pasteAction);
|
||||
_popup.addSeparator();
|
||||
|
||||
_selectAllAction = new AbstractAction("Select All") {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ae) {
|
||||
_lastActionSelected = _Actions.SELECT_ALL;
|
||||
_textComponent.selectAll();
|
||||
}
|
||||
};
|
||||
|
||||
_popup.add(_selectAllAction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (e.getModifiers() == InputEvent.BUTTON3_MASK) {
|
||||
if (!(e.getSource() instanceof JTextComponent)) {
|
||||
System.out.println(e.getSource().getClass());
|
||||
return;
|
||||
}
|
||||
|
||||
_textComponent = (JTextComponent) e.getSource();
|
||||
_textComponent.requestFocus();
|
||||
|
||||
boolean enabled = _textComponent.isEnabled();
|
||||
boolean editable = _textComponent.isEditable();
|
||||
boolean nonempty = !(_textComponent.getText() == null || _textComponent.getText().isEmpty());
|
||||
boolean marked = _textComponent.getSelectedText() != null;
|
||||
|
||||
boolean pasteAvailable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).isDataFlavorSupported(DataFlavor.stringFlavor);
|
||||
|
||||
_undoAction.setEnabled(enabled && editable && (_lastActionSelected == _Actions.CUT || _lastActionSelected == _Actions.PASTE));
|
||||
_cutAction.setEnabled(enabled && editable && marked);
|
||||
_copyAction.setEnabled(enabled && marked);
|
||||
_pasteAction.setEnabled(enabled && editable && pasteAvailable);
|
||||
_selectAllAction.setEnabled(enabled && nonempty);
|
||||
|
||||
int nx = e.getX();
|
||||
|
||||
if (nx > 500) {
|
||||
nx -= _popup.getSize().width;
|
||||
}
|
||||
|
||||
_popup.show(e.getComponent(), nx, e.getY() - _popup.getSize().height);
|
||||
}
|
||||
}
|
||||
private enum _Actions { UNDO, CUT, COPY, PASTE, SELECT_ALL }
|
||||
}
|
316
src/megabasterd/CryptTools.java
Normal file
@ -0,0 +1,316 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.interfaces.RSAPrivateKey;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.security.spec.RSAPrivateKeySpec;
|
||||
import java.util.Arrays;
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import static megabasterd.MiscTools.Bin2UrlBASE64;
|
||||
import static megabasterd.MiscTools.UrlBASE642Bin;
|
||||
import static megabasterd.MiscTools.bin2i32a;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
import static megabasterd.MiscTools.hex2bin;
|
||||
import static megabasterd.MiscTools.i32a2bin;
|
||||
import static megabasterd.MiscTools.long2bytearray;
|
||||
|
||||
|
||||
public final class CryptTools {
|
||||
|
||||
public static final int[] AES_ZERO_IV_I32A = {0,0,0,0};
|
||||
|
||||
public static final byte[] AES_ZERO_IV = i32a2bin(AES_ZERO_IV_I32A);
|
||||
|
||||
|
||||
|
||||
public static Cipher genDecrypter(String algo, String mode, byte[] key, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException
|
||||
{
|
||||
SecretKeySpec skeySpec = new SecretKeySpec(key, algo);
|
||||
|
||||
Cipher decryptor = Cipher.getInstance(mode);
|
||||
|
||||
if(iv != null) {
|
||||
|
||||
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
|
||||
|
||||
decryptor.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
|
||||
|
||||
} else {
|
||||
|
||||
decryptor.init(Cipher.DECRYPT_MODE, skeySpec);
|
||||
}
|
||||
|
||||
return decryptor;
|
||||
}
|
||||
|
||||
public static Cipher genCrypter(String algo, String mode, byte[] key, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException
|
||||
{
|
||||
SecretKeySpec skeySpec = new SecretKeySpec(key, algo);
|
||||
|
||||
Cipher cryptor = Cipher.getInstance(mode);
|
||||
|
||||
if(iv != null) {
|
||||
|
||||
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
|
||||
|
||||
cryptor.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);
|
||||
|
||||
} else {
|
||||
|
||||
cryptor.init(Cipher.ENCRYPT_MODE, skeySpec);
|
||||
}
|
||||
|
||||
return cryptor;
|
||||
}
|
||||
|
||||
public static byte[] aes_cbc_encrypt(byte[] data, byte[] key, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher cryptor = CryptTools.genCrypter("AES", "AES/CBC/NoPadding", key, iv);
|
||||
|
||||
return cryptor.doFinal(data);
|
||||
}
|
||||
|
||||
public static byte[] aes_cbc_decrypt(byte[] data, byte[] key, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher decryptor = CryptTools.genDecrypter("AES", "AES/CBC/NoPadding", key, iv);
|
||||
|
||||
return decryptor.doFinal(data);
|
||||
}
|
||||
|
||||
public static byte[] aes_ecb_encrypt(byte[] data, byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher cryptor = CryptTools.genCrypter("AES", "AES/ECB/NoPadding", key, null);
|
||||
|
||||
return cryptor.doFinal(data);
|
||||
}
|
||||
|
||||
public static byte[] aes_ecb_decrypt(byte[] data, byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher decryptor = CryptTools.genDecrypter("AES", "AES/ECB/NoPadding", key, null);
|
||||
|
||||
return decryptor.doFinal(data);
|
||||
}
|
||||
|
||||
public static byte[] aes_ctr_encrypt(byte[] data, byte[] key, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher cryptor = CryptTools.genCrypter("AES", "AES/CTR/NoPadding", key, iv);
|
||||
|
||||
return cryptor.doFinal(data);
|
||||
}
|
||||
|
||||
public static byte[] aes_ctr_decrypt(byte[] data, byte[] key, byte[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher decryptor = CryptTools.genDecrypter("AES", "AES/CTR/NoPadding", key, iv);
|
||||
|
||||
return decryptor.doFinal(data);
|
||||
}
|
||||
|
||||
public static int[] aes_cbc_encrypt_ia32(int[] data, int[] key, int[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher cryptor = CryptTools.genCrypter("AES", "AES/CBC/NoPadding", i32a2bin(key), i32a2bin(iv));
|
||||
|
||||
return bin2i32a(cryptor.doFinal(i32a2bin(data)));
|
||||
}
|
||||
|
||||
public static int[] aes_cbc_decrypt_ia32(int[] data, int[] key, int[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher decryptor = CryptTools.genDecrypter("AES", "AES/CBC/NoPadding", i32a2bin(key), i32a2bin(iv));
|
||||
|
||||
return bin2i32a(decryptor.doFinal(i32a2bin(data)));
|
||||
}
|
||||
|
||||
public static int[] aes_ecb_encrypt_ia32(int[] data, int[] key, int[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher cryptor = CryptTools.genCrypter("AES", "AES/ECB/NoPadding", i32a2bin(key), i32a2bin(iv));
|
||||
|
||||
return bin2i32a(cryptor.doFinal(i32a2bin(data)));
|
||||
}
|
||||
|
||||
public static int[] aes_ecb_decrypt_ia32(int[] data, int[] key, int[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher decryptor = CryptTools.genDecrypter("AES", "AES/ECB/NoPadding", i32a2bin(key), i32a2bin(iv));
|
||||
|
||||
return bin2i32a(decryptor.doFinal(i32a2bin(data)));
|
||||
}
|
||||
|
||||
public static int[] aes_ctr_encrypt_ia32(int[] data, int[] key, int[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher cryptor = CryptTools.genCrypter("AES", "AES/CTR/NoPadding", i32a2bin(key), i32a2bin(iv));
|
||||
|
||||
return bin2i32a(cryptor.doFinal(i32a2bin(data)));
|
||||
}
|
||||
|
||||
public static int[] aes_ctr_decrypt_ia32(int[] data, int[] key, int[] iv) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
Cipher decryptor = CryptTools.genDecrypter("AES", "AES/CTR/NoPadding", i32a2bin(key), i32a2bin(iv));
|
||||
|
||||
return bin2i32a(decryptor.doFinal(i32a2bin(data)));
|
||||
}
|
||||
|
||||
public static byte[] rsaDecrypt(BigInteger enc_data, BigInteger p, BigInteger q, BigInteger d) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
RSAPrivateKeySpec privateSpec = new RSAPrivateKeySpec(p.multiply(q), d);
|
||||
|
||||
KeyFactory factory = KeyFactory.getInstance("RSA");
|
||||
|
||||
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
|
||||
|
||||
RSAPrivateKey privKey = (RSAPrivateKey) factory.generatePrivate(privateSpec);
|
||||
|
||||
cipher.init(Cipher.DECRYPT_MODE, privKey);
|
||||
|
||||
byte[] enc_data_byte = enc_data.toByteArray();
|
||||
|
||||
if(enc_data_byte[0] == 0) {
|
||||
|
||||
enc_data_byte=Arrays.copyOfRange(enc_data_byte, 1, enc_data_byte.length);
|
||||
}
|
||||
|
||||
byte[] plainText = cipher.doFinal(enc_data_byte);
|
||||
|
||||
if(plainText[0] == 0) {
|
||||
|
||||
plainText=Arrays.copyOfRange(plainText, 1, plainText.length);
|
||||
}
|
||||
|
||||
return plainText;
|
||||
}
|
||||
|
||||
public static byte[] initMEGALinkKey(String key_string) throws Exception
|
||||
{
|
||||
int[] int_key = bin2i32a(UrlBASE642Bin(key_string));
|
||||
int[] k=new int[4];
|
||||
|
||||
k[0] = int_key[0] ^ int_key[4];
|
||||
k[1] = int_key[1] ^ int_key[5];
|
||||
k[2] = int_key[2] ^ int_key[6];
|
||||
k[3] = int_key[3] ^ int_key[7];
|
||||
|
||||
return i32a2bin(k);
|
||||
}
|
||||
|
||||
public static byte[] initMEGALinkKeyIV(String key_string) throws Exception
|
||||
{
|
||||
int[] int_key =bin2i32a(UrlBASE642Bin(key_string));
|
||||
int[] iv = new int[4];
|
||||
|
||||
iv[0] = int_key[4];
|
||||
iv[1] = int_key[5];
|
||||
iv[2] = 0;
|
||||
iv[3] = 0;
|
||||
|
||||
return i32a2bin(iv);
|
||||
}
|
||||
|
||||
public static byte[] forwardMEGALinkKeyIV(byte[] iv, long forward_bytes)
|
||||
{
|
||||
byte[] new_iv = new byte[iv.length];
|
||||
|
||||
System.arraycopy(iv, 0, new_iv, 0, iv.length/2);
|
||||
|
||||
byte[] ctr = long2bytearray(forward_bytes/iv.length);
|
||||
|
||||
System.arraycopy(ctr, 0, new_iv, iv.length/2, ctr.length);
|
||||
|
||||
return new_iv;
|
||||
}
|
||||
|
||||
public static String decryptMegaDownloaderLink(String link) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, Exception, IllegalBlockSizeException, BadPaddingException
|
||||
{
|
||||
String[] keys = {"6B316F36416C2D316B7A3F217A30357958585858585858585858585858585858","ED1F4C200B35139806B260563B3D3876F011B4750F3A1A4A5EFD0BBE67554B44"};
|
||||
String iv="79F10A01844A0B27FF5B2D4E0ED3163E";
|
||||
|
||||
String enc_type, folder, dec_link;
|
||||
|
||||
if((enc_type=findFirstRegex("mega://f?(enc[0-9]*)\\?", link, 1)) != null)
|
||||
{
|
||||
Cipher decrypter;
|
||||
|
||||
String the_key=null;
|
||||
|
||||
switch (enc_type.toLowerCase()) {
|
||||
case "enc":
|
||||
the_key = keys[0];
|
||||
break;
|
||||
case "enc2":
|
||||
the_key = keys[1];
|
||||
break;
|
||||
}
|
||||
|
||||
folder=findFirstRegex("mega://(f)?enc[0-9]*\\?", link, 1);
|
||||
|
||||
decrypter = CryptTools.genDecrypter("AES", "AES/CBC/NoPadding", hex2bin(the_key), hex2bin(iv));
|
||||
|
||||
byte[] decrypted_data = decrypter.doFinal(UrlBASE642Bin(findFirstRegex("mega://f?enc[0-9]*\\?([\\da-zA-Z_,-]*)", link, 1)));
|
||||
|
||||
dec_link=new String(decrypted_data).trim();
|
||||
|
||||
return "https://mega.nz/#"+(folder!=null?"f":"")+dec_link;
|
||||
|
||||
} else {
|
||||
return link;
|
||||
}
|
||||
}
|
||||
|
||||
public static String MEGAUserHash(byte[] str, int[] aeskey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, Exception {
|
||||
|
||||
int[] s32 = bin2i32a(str);
|
||||
|
||||
int[] h32 = {0,0,0,0};
|
||||
|
||||
int[] iv = {0,0,0,0};
|
||||
|
||||
for(int i=0; i<s32.length; i++) {
|
||||
|
||||
h32[i%4]^=s32[i];
|
||||
}
|
||||
|
||||
for(int i=0; i<0x4000; i++) {
|
||||
|
||||
h32 = CryptTools.aes_cbc_encrypt_ia32(h32, aeskey, iv);
|
||||
}
|
||||
|
||||
int[] res = {h32[0], h32[2]};
|
||||
|
||||
return Bin2UrlBASE64(i32a2bin(res));
|
||||
}
|
||||
|
||||
public static int[] MEGAPrepareMasterKey(int[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
|
||||
|
||||
int[] pkey = {0x93C467E3, 0x7DB0C7A4, 0xD1BE3F81, 0x0152CB56};
|
||||
|
||||
int[] iv = {0,0,0,0};
|
||||
|
||||
for(int r=0; r<0x10000; r++) {
|
||||
|
||||
for(int j=0; j<key.length; j+=4) {
|
||||
|
||||
int[] k = {0,0,0,0};
|
||||
|
||||
for(int i=0; i<4; i++) {
|
||||
|
||||
if(i+j < key.length) {
|
||||
|
||||
k[i] = key[i+j];
|
||||
}
|
||||
}
|
||||
|
||||
pkey = CryptTools.aes_cbc_encrypt_ia32(pkey, k, iv);
|
||||
}
|
||||
}
|
||||
|
||||
return pkey;
|
||||
}
|
||||
|
||||
private CryptTools() {
|
||||
}
|
||||
}
|
245
src/megabasterd/DBTools.java
Normal file
@ -0,0 +1,245 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class DBTools {
|
||||
|
||||
public static void setupSqliteTables() throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); Statement stat = conn.createStatement()) {
|
||||
|
||||
stat.executeUpdate("CREATE TABLE IF NOT EXISTS downloads(url TEXT, path TEXT, filename TEXT, filekey TEXT, filesize UNSIGNED BIG INT, filepass VARCHAR(64), filenoexpire VARCHAR(64), PRIMARY KEY ('url'), UNIQUE(path, filename));");
|
||||
stat.executeUpdate("CREATE TABLE IF NOT EXISTS uploads(filename TEXT, email TEXT, url TEXT, ul_key TEXT, parent_node TEXT, root_node TEXT, share_key TEXT, folder_link TEXT, PRIMARY KEY ('filename'), UNIQUE(filename, email));");
|
||||
stat.executeUpdate("CREATE TABLE IF NOT EXISTS settings(key VARCHAR(255), value TEXT, PRIMARY KEY('key'));");
|
||||
stat.executeUpdate("CREATE TABLE IF NOT EXISTS mega_accounts(email TEXT, password TEXT, password_aes TEXT, user_hash TEXT, PRIMARY KEY('email'));");
|
||||
}
|
||||
}
|
||||
|
||||
public static void insertDownload(String url, String path, String filename, String filekey, Long size, String filepass, String filenoexpire) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("INSERT INTO downloads (url, path, filename, filekey, filesize, filepass, filenoexpire) VALUES (?,?,?,?,?,?,?)")) {
|
||||
|
||||
ps.setString(1, url);
|
||||
ps.setString(2, path);
|
||||
ps.setString(3, filename);
|
||||
ps.setString(4, filekey);
|
||||
ps.setLong(5, size);
|
||||
ps.setString(6, filepass);
|
||||
ps.setString(7, filenoexpire);
|
||||
|
||||
ps.executeUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public static void deleteDownload(String url) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("DELETE FROM downloads WHERE url=?")) {
|
||||
|
||||
ps.setString(1, url);
|
||||
|
||||
ps.executeUpdate();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static void insertUpload(String filename, String email, String parent_node, String ul_key, String root_node, String share_key, String folder_link) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("INSERT INTO uploads (filename, email, parent_node, ul_key, root_node, share_key, folder_link) VALUES (?,?,?,?,?,?,?)")) {
|
||||
|
||||
ps.setString(1, filename);
|
||||
ps.setString(2, email);
|
||||
ps.setString(3, parent_node);
|
||||
ps.setString(4, ul_key);
|
||||
ps.setString(5, root_node);
|
||||
ps.setString(6, share_key);
|
||||
ps.setString(7, folder_link);
|
||||
|
||||
ps.executeUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public static void updateUploadUrl(String filename, String email, String ul_url) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("UPDATE uploads SET url=? WHERE filename=? AND email=?")) {
|
||||
|
||||
ps.setString(1, ul_url);
|
||||
ps.setString(2, filename);
|
||||
ps.setString(3, email);
|
||||
|
||||
ps.executeUpdate();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static void deleteUpload(String filename, String email) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("DELETE FROM uploads WHERE filename=? AND email=?")) {
|
||||
|
||||
ps.setString(1, filename);
|
||||
|
||||
ps.setString(2, email);
|
||||
|
||||
ps.executeUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public static String selectSettingValueFromDB(String key) {
|
||||
|
||||
String value=null;
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("SELECT value from settings WHERE key=?")) {
|
||||
|
||||
ps.setString(1, key);
|
||||
|
||||
ResultSet res = ps.executeQuery();
|
||||
|
||||
if(res.next()) {
|
||||
value = res.getString(1);
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
Logger.getLogger(DBTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
public static void insertSettingValueInDB(String key, String value) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("INSERT OR REPLACE INTO settings (key,value) VALUES (?, ?)")) {
|
||||
|
||||
ps.setString(1, key);
|
||||
|
||||
ps.setString(2, value);
|
||||
|
||||
ps.executeUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public static ArrayList<HashMap<String,Object>> selectDownloads() throws SQLException {
|
||||
|
||||
ArrayList<HashMap<String,Object>> downloads = new ArrayList<>();
|
||||
|
||||
ResultSet res;
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); Statement stat = conn.createStatement()) {
|
||||
|
||||
res = stat.executeQuery("SELECT * FROM downloads");
|
||||
|
||||
while(res.next()) {
|
||||
|
||||
HashMap<String,Object> download = new HashMap<>();
|
||||
|
||||
download.put("url", res.getString("url"));
|
||||
download.put("path", res.getString("path"));
|
||||
download.put("filename", res.getString("filename"));
|
||||
download.put("filekey", res.getString("filekey"));
|
||||
download.put("filesize", res.getLong("filesize"));
|
||||
download.put("filepass", res.getString("filepass"));
|
||||
download.put("filenoexpire", res.getString("filenoexpire"));
|
||||
|
||||
downloads.add(download);
|
||||
}
|
||||
}
|
||||
|
||||
return downloads;
|
||||
}
|
||||
|
||||
public static ArrayList<HashMap<String,Object>> selectUploads() throws SQLException {
|
||||
|
||||
ArrayList<HashMap<String,Object>> uploads = new ArrayList<>();
|
||||
|
||||
ResultSet res;
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); Statement stat = conn.createStatement()) {
|
||||
|
||||
res = stat.executeQuery("SELECT * FROM uploads");
|
||||
|
||||
while(res.next()) {
|
||||
|
||||
HashMap<String,Object> upload = new HashMap<>();
|
||||
|
||||
upload.put("filename", res.getString("filename"));
|
||||
upload.put("email", res.getString("email"));
|
||||
upload.put("url", res.getString("url"));
|
||||
upload.put("ul_key", res.getString("ul_key"));
|
||||
upload.put("parent_node", res.getString("parent_node"));
|
||||
upload.put("root_node", res.getString("root_node"));
|
||||
upload.put("share_key", res.getString("share_key"));
|
||||
upload.put("folder_link", res.getString("folder_link"));
|
||||
uploads.add(upload);
|
||||
}
|
||||
}
|
||||
|
||||
return uploads;
|
||||
}
|
||||
|
||||
public static HashMap<String,Object> selectMegaAccounts() throws SQLException {
|
||||
|
||||
HashMap<String, Object> accounts = new HashMap<>();
|
||||
|
||||
ResultSet res;
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); Statement stat = conn.createStatement()) {
|
||||
|
||||
res = stat.executeQuery("SELECT * FROM mega_accounts");
|
||||
|
||||
while(res.next()) {
|
||||
|
||||
HashMap<String,Object> account_data = new HashMap<>();
|
||||
|
||||
account_data.put("password", res.getString("password"));
|
||||
account_data.put("password_aes", res.getString("password_aes"));
|
||||
account_data.put("user_hash", res.getString("user_hash"));
|
||||
|
||||
accounts.put(res.getString("email"), account_data);
|
||||
}
|
||||
}
|
||||
|
||||
return accounts;
|
||||
}
|
||||
|
||||
|
||||
public static void insertMegaAccount(String email, String password, String password_aes, String user_hash) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("INSERT OR REPLACE INTO mega_accounts (email,password,password_aes,user_hash) VALUES (?, ?, ?, ?)")) {
|
||||
|
||||
ps.setString(1, email);
|
||||
|
||||
ps.setString(2, password);
|
||||
|
||||
ps.setString(3, password_aes);
|
||||
|
||||
ps.setString(4, user_hash);
|
||||
|
||||
ps.executeUpdate();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void deleteMegaAccount(String email) throws SQLException {
|
||||
|
||||
try (Connection conn = SqliteSingleton.getInstance().getConn(); PreparedStatement ps = conn.prepareStatement("DELETE from mega_accounts WHERE email=?")) {
|
||||
|
||||
ps.setString(1, email);
|
||||
|
||||
ps.executeUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
private DBTools() {
|
||||
}
|
||||
|
||||
}
|
1407
src/megabasterd/Download.java
Normal file
189
src/megabasterd/DownloadManager.java
Normal file
@ -0,0 +1,189 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Component;
|
||||
import static java.lang.System.out;
|
||||
import java.sql.SQLException;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static megabasterd.DBTools.deleteDownload;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
|
||||
|
||||
public final class DownloadManager extends TransferenceManager {
|
||||
|
||||
public DownloadManager(MainPanel main_panel) {
|
||||
|
||||
super(main_panel, main_panel.getView().jPanel_scroll_down);
|
||||
}
|
||||
|
||||
public void remove(Download download) {
|
||||
|
||||
getScroll_panel().remove(download.getView());
|
||||
|
||||
getTransference_start_queue().remove(download);
|
||||
|
||||
getTransference_running_list().remove(download);
|
||||
|
||||
getTransference_finished_queue().remove(download);
|
||||
|
||||
if(download.isProvision_ok()) {
|
||||
|
||||
try {
|
||||
deleteDownload(download.getUrl());
|
||||
} catch (SQLException ex) {
|
||||
getLogger(DownloadManager.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
if(!getTransference_remove_queue().isEmpty()) {
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_down_label(), "Removing "+getTransference_remove_queue().size()+" downloads, please wait...");
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_down_label(), "");
|
||||
}
|
||||
}
|
||||
|
||||
public void provision(Download download, boolean retry) throws MegaAPIException, MegaCrypterAPIException
|
||||
{
|
||||
getScroll_panel().add(download.getView());
|
||||
|
||||
download.provisionIt(retry);
|
||||
|
||||
if(download.isProvision_ok()) {
|
||||
|
||||
out.println("Provision OK!");
|
||||
|
||||
getTransference_start_queue().add(download);
|
||||
|
||||
if(getTransference_provision_queue().isEmpty()) {
|
||||
|
||||
sortTransferenceStartQueue();
|
||||
|
||||
for(Transference down:getTransference_start_queue()) {
|
||||
|
||||
getScroll_panel().remove((Component)down.getView());
|
||||
getScroll_panel().add((Component)down.getView());
|
||||
}
|
||||
|
||||
for(Transference down:getTransference_finished_queue()) {
|
||||
|
||||
getScroll_panel().remove((Component)down.getView());
|
||||
getScroll_panel().add((Component)down.getView());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
out.println("Provision error!");
|
||||
|
||||
getTransference_finished_queue().add(download);
|
||||
}
|
||||
|
||||
if(getTransference_provision_queue().isEmpty()) {
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_down_label(), "");
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_down_label(), getTransference_provision_queue().size() + " downloads waiting for provision...");
|
||||
}
|
||||
|
||||
if(retry) {
|
||||
|
||||
secureNotify();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
out.println("Download manager hello!");
|
||||
|
||||
while(true)
|
||||
{
|
||||
if(!getTransference_provision_queue().isEmpty())
|
||||
{
|
||||
swingReflectionInvoke("setEnabled", getMain_panel().getView().getNew_download_menu(), false);
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_down_label(), getTransference_provision_queue().size() + " downloads waiting for provision...");
|
||||
|
||||
while(!getTransference_provision_queue().isEmpty())
|
||||
{
|
||||
final Download download = (Download)getTransference_provision_queue().poll();
|
||||
|
||||
if(download != null) {
|
||||
|
||||
try{
|
||||
|
||||
provision(download, false);
|
||||
|
||||
}catch (MegaAPIException | MegaCrypterAPIException ex) {
|
||||
|
||||
out.println("Provision failed! Retrying in separated thread...");
|
||||
|
||||
getScroll_panel().remove(download.getView());
|
||||
|
||||
final DownloadManager main = this;
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run(){
|
||||
|
||||
try {
|
||||
|
||||
main.provision(download, true);
|
||||
|
||||
} catch (MegaAPIException | MegaCrypterAPIException ex1) {
|
||||
|
||||
getLogger(DownloadManager.class.getName()).log(SEVERE, null, ex1);
|
||||
}
|
||||
|
||||
}});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!getTransference_remove_queue().isEmpty()) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", getMain_panel().getView().getNew_download_menu(), false);
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_down_label(), "Removing "+getTransference_remove_queue().size()+" downloads, please wait...");
|
||||
|
||||
while(!getTransference_remove_queue().isEmpty()) {
|
||||
|
||||
Download download = (Download)getTransference_remove_queue().poll();
|
||||
|
||||
if(download != null) {
|
||||
|
||||
remove(download);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while(!getTransference_start_queue().isEmpty() && getTransference_running_list().size() < getMain_panel().getMax_dl()) {
|
||||
|
||||
Download download = (Download)getTransference_start_queue().poll();
|
||||
|
||||
if(download != null) {
|
||||
|
||||
start(download);
|
||||
}
|
||||
}
|
||||
|
||||
checkButtonsAndMenus(getMain_panel().getView().getClose_all_finished_down_button(), getMain_panel().getView().getPause_all_down_button(), getMain_panel().getView().getNew_download_menu(), getMain_panel().getView().getClean_all_down_menu());
|
||||
|
||||
out.println("Download manager wait");
|
||||
|
||||
secureWait();
|
||||
|
||||
out.println("Download manager let's go");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
295
src/megabasterd/DownloadView.form
Normal file
@ -0,0 +1,295 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<Properties>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
|
||||
<LineBorder roundedCorners="true" thickness="4">
|
||||
<Color PropertyName="color" blue="ff" green="cc" red="99" type="rgb"/>
|
||||
</LineBorder>
|
||||
</Border>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="close_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="restart_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="keep_temp_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="stop_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="progress_pbar" alignment="0" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="speed_label" min="-2" pref="340" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="73" max="32767" attributes="0"/>
|
||||
<Component id="pause_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="status_label" max="32767" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="slots_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="slots_spinner" min="-2" pref="49" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="file_name_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="copy_link_button" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="slot_status_label" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="remtime_label" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="file_size_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="slots_spinner" alignment="3" min="-2" pref="32" max="-2" attributes="0"/>
|
||||
<Component id="slots_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="status_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="file_name_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="file_size_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="slot_status_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="copy_link_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="remtime_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
||||
<Component id="progress_pbar" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="speed_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pause_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="keep_temp_checkbox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="stop_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="close_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="restart_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="status_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="status"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="slots_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Slots"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="slots_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" value="Slots"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="slots_spinnerStateChanged"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="remtime_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="remaining_time"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="speed_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="26" style="3"/>
|
||||
</Property>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" value="speed"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JProgressBar" name="progress_pbar">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="pause_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="0" green="99" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" id="white" palette="1" red="ff" type="palette"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="PAUSE DOWNLOAD"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pause_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="stop_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="0" green="0" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" id="white" palette="1" red="ff" type="palette"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="CANCEL DOWNLOAD"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="stop_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="keep_temp_checkbox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="selected" type="boolean" value="true"/>
|
||||
<Property name="text" type="java.lang.String" value="Keep temp file"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="file_name_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="file_name"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="close_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Close"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="close_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="copy_link_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Copy link"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="copy_link_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="restart_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Restart"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="restart_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="file_size_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="file_size"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="slot_status_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
497
src/megabasterd/DownloadView.java
Normal file
@ -0,0 +1,497 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JProgressBar;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MiscTools.copyTextToClipboard;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWait;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWaitForReturn;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
|
||||
public final class DownloadView extends javax.swing.JPanel implements TransferenceView {
|
||||
|
||||
private final Download _download;
|
||||
|
||||
public JButton getClose_button() {
|
||||
return close_button;
|
||||
}
|
||||
|
||||
public JButton getCopy_link_button() {
|
||||
return copy_link_button;
|
||||
}
|
||||
|
||||
public JLabel getFile_name_label() {
|
||||
return file_name_label;
|
||||
}
|
||||
|
||||
public JLabel getFile_size_label() {
|
||||
return file_size_label;
|
||||
}
|
||||
|
||||
public JCheckBox getKeep_temp_checkbox() {
|
||||
return keep_temp_checkbox;
|
||||
}
|
||||
|
||||
public JButton getPause_button() {
|
||||
return pause_button;
|
||||
}
|
||||
|
||||
public JProgressBar getProgress_pbar() {
|
||||
return progress_pbar;
|
||||
}
|
||||
|
||||
public JLabel getRemtime_label() {
|
||||
return remtime_label;
|
||||
}
|
||||
|
||||
public JButton getRestart_button() {
|
||||
return restart_button;
|
||||
}
|
||||
|
||||
public JLabel getSlot_status_label() {
|
||||
return slot_status_label;
|
||||
}
|
||||
|
||||
public JLabel getSlots_label() {
|
||||
return slots_label;
|
||||
}
|
||||
|
||||
public JSpinner getSlots_spinner() {
|
||||
return slots_spinner;
|
||||
}
|
||||
|
||||
public JLabel getSpeed_label() {
|
||||
return speed_label;
|
||||
}
|
||||
|
||||
public JLabel getStatus_label() {
|
||||
return status_label;
|
||||
}
|
||||
|
||||
public JButton getStop_button() {
|
||||
return stop_button;
|
||||
}
|
||||
|
||||
public DownloadView(Download download) {
|
||||
|
||||
initComponents();
|
||||
|
||||
_download = download;
|
||||
|
||||
updateFont(status_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(remtime_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(speed_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(progress_pbar, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(slots_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(slots_spinner, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(pause_button, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(stop_button, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(keep_temp_checkbox, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(file_name_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(file_size_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(close_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(copy_link_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(restart_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(slot_status_label, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
swingReflectionInvokeAndWait("setModel", slots_spinner, new SpinnerNumberModel(_download.getMain_panel().getDefault_slots_down(), Download.MIN_WORKERS, Download.MAX_WORKERS, 1));
|
||||
swingReflectionInvoke("setEditable", swingReflectionInvokeAndWaitForReturn("getTextField", swingReflectionInvokeAndWaitForReturn("getEditor", slots_spinner)), false);
|
||||
swingReflectionInvoke("setVisible", slots_spinner, false);
|
||||
swingReflectionInvoke("setVisible", slots_label, false);
|
||||
swingReflectionInvoke("setVisible", pause_button, false);
|
||||
swingReflectionInvoke("setVisible", stop_button, false);
|
||||
swingReflectionInvoke("setForeground", speed_label, new Color(0,128,255));
|
||||
swingReflectionInvoke("setVisible", speed_label, false);
|
||||
swingReflectionInvoke("setVisible", remtime_label, false);
|
||||
swingReflectionInvoke("setVisible", progress_pbar, false);
|
||||
swingReflectionInvoke("setVisible", keep_temp_checkbox, false);
|
||||
swingReflectionInvoke("setVisible", file_name_label, false);
|
||||
swingReflectionInvoke("setVisible", close_button, false);
|
||||
swingReflectionInvoke("setVisible", copy_link_button, false);
|
||||
swingReflectionInvoke("setVisible", restart_button, false);
|
||||
swingReflectionInvoke("setVisible", file_size_label, false);
|
||||
|
||||
}
|
||||
|
||||
public void hideAllExceptStatus()
|
||||
{
|
||||
swingReflectionInvoke("setVisible", speed_label, false);
|
||||
swingReflectionInvoke("setVisible", remtime_label, false);
|
||||
swingReflectionInvoke("setVisible", slots_spinner, false);
|
||||
swingReflectionInvoke("setVisible", slots_label, false);
|
||||
swingReflectionInvoke("setVisible", slot_status_label, false);
|
||||
swingReflectionInvoke("setVisible", pause_button, false);
|
||||
swingReflectionInvoke("setVisible", stop_button, false);
|
||||
swingReflectionInvoke("setVisible", progress_pbar, false);
|
||||
swingReflectionInvoke("setVisible", keep_temp_checkbox, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
status_label = new javax.swing.JLabel();
|
||||
slots_label = new javax.swing.JLabel();
|
||||
slots_spinner = new javax.swing.JSpinner();
|
||||
remtime_label = new javax.swing.JLabel();
|
||||
speed_label = new javax.swing.JLabel();
|
||||
progress_pbar = new javax.swing.JProgressBar();
|
||||
pause_button = new javax.swing.JButton();
|
||||
stop_button = new javax.swing.JButton();
|
||||
keep_temp_checkbox = new javax.swing.JCheckBox();
|
||||
file_name_label = new javax.swing.JLabel();
|
||||
close_button = new javax.swing.JButton();
|
||||
copy_link_button = new javax.swing.JButton();
|
||||
restart_button = new javax.swing.JButton();
|
||||
file_size_label = new javax.swing.JLabel();
|
||||
slot_status_label = new javax.swing.JLabel();
|
||||
|
||||
setBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 204, 255), 4, true));
|
||||
|
||||
status_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
status_label.setText("status");
|
||||
status_label.setDoubleBuffered(true);
|
||||
|
||||
slots_label.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
slots_label.setText("Slots");
|
||||
slots_label.setDoubleBuffered(true);
|
||||
|
||||
slots_spinner.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
slots_spinner.setToolTipText("Slots");
|
||||
slots_spinner.setDoubleBuffered(true);
|
||||
slots_spinner.addChangeListener(new javax.swing.event.ChangeListener() {
|
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
||||
slots_spinnerStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
remtime_label.setFont(new java.awt.Font("Verdana", 1, 18)); // NOI18N
|
||||
remtime_label.setText("remaining_time");
|
||||
remtime_label.setDoubleBuffered(true);
|
||||
|
||||
speed_label.setFont(new java.awt.Font("Verdana", 3, 26)); // NOI18N
|
||||
speed_label.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
speed_label.setText("speed");
|
||||
speed_label.setDoubleBuffered(true);
|
||||
|
||||
progress_pbar.setFont(new java.awt.Font("Verdana", 1, 18)); // NOI18N
|
||||
progress_pbar.setDoubleBuffered(true);
|
||||
|
||||
pause_button.setBackground(new java.awt.Color(255, 153, 0));
|
||||
pause_button.setFont(new java.awt.Font("Verdana", 1, 16)); // NOI18N
|
||||
pause_button.setForeground(java.awt.Color.white);
|
||||
pause_button.setText("PAUSE DOWNLOAD");
|
||||
pause_button.setDoubleBuffered(true);
|
||||
pause_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
pause_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
stop_button.setBackground(new java.awt.Color(255, 0, 0));
|
||||
stop_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
stop_button.setForeground(java.awt.Color.white);
|
||||
stop_button.setText("CANCEL DOWNLOAD");
|
||||
stop_button.setDoubleBuffered(true);
|
||||
stop_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
stop_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
keep_temp_checkbox.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
keep_temp_checkbox.setSelected(true);
|
||||
keep_temp_checkbox.setText("Keep temp file");
|
||||
keep_temp_checkbox.setDoubleBuffered(true);
|
||||
|
||||
file_name_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
file_name_label.setForeground(new java.awt.Color(51, 51, 255));
|
||||
file_name_label.setText("file_name");
|
||||
file_name_label.setDoubleBuffered(true);
|
||||
|
||||
close_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
close_button.setText("Close");
|
||||
close_button.setDoubleBuffered(true);
|
||||
close_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
close_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
copy_link_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
copy_link_button.setText("Copy link");
|
||||
copy_link_button.setDoubleBuffered(true);
|
||||
copy_link_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
copy_link_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
restart_button.setBackground(new java.awt.Color(51, 51, 255));
|
||||
restart_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
restart_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
restart_button.setText("Restart");
|
||||
restart_button.setDoubleBuffered(true);
|
||||
restart_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
restart_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
file_size_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
file_size_label.setForeground(new java.awt.Color(51, 51, 255));
|
||||
file_size_label.setText("file_size");
|
||||
file_size_label.setDoubleBuffered(true);
|
||||
|
||||
slot_status_label.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
|
||||
slot_status_label.setDoubleBuffered(true);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(close_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(restart_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(keep_temp_checkbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(stop_button))
|
||||
.addComponent(progress_pbar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(speed_label, javax.swing.GroupLayout.PREFERRED_SIZE, 340, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 73, Short.MAX_VALUE)
|
||||
.addComponent(pause_button))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(status_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(slots_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(slots_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(file_name_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(copy_link_button, javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(slot_status_label, javax.swing.GroupLayout.Alignment.TRAILING)))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(remtime_label)
|
||||
.addComponent(file_size_label))
|
||||
.addGap(0, 0, Short.MAX_VALUE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(slots_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(slots_label)
|
||||
.addComponent(status_label))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(file_name_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(file_size_label))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(slot_status_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(copy_link_button)))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(remtime_label)
|
||||
.addGap(6, 6, 6)
|
||||
.addComponent(progress_pbar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(speed_label)
|
||||
.addComponent(pause_button))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(keep_temp_checkbox)
|
||||
.addComponent(stop_button)
|
||||
.addComponent(close_button)
|
||||
.addComponent(restart_button))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void slots_spinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_slots_spinnerStateChanged
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
_download.checkSlotsAndWorkers();
|
||||
}
|
||||
});
|
||||
}//GEN-LAST:event_slots_spinnerStateChanged
|
||||
|
||||
|
||||
private void close_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_buttonActionPerformed
|
||||
|
||||
_download.close();
|
||||
}//GEN-LAST:event_close_buttonActionPerformed
|
||||
|
||||
private void copy_link_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copy_link_buttonActionPerformed
|
||||
|
||||
copyTextToClipboard(_download.getUrl());
|
||||
|
||||
JOptionPane.showMessageDialog(_download.getMain_panel().getView(), "Link was copied to clipboard!");
|
||||
}//GEN-LAST:event_copy_link_buttonActionPerformed
|
||||
|
||||
private void restart_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restart_buttonActionPerformed
|
||||
|
||||
_download.restart();
|
||||
}//GEN-LAST:event_restart_buttonActionPerformed
|
||||
|
||||
private void stop_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stop_buttonActionPerformed
|
||||
|
||||
_download.stop();
|
||||
}//GEN-LAST:event_stop_buttonActionPerformed
|
||||
|
||||
private void pause_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pause_buttonActionPerformed
|
||||
|
||||
_download.pause();
|
||||
}//GEN-LAST:event_pause_buttonActionPerformed
|
||||
|
||||
@Override
|
||||
public void pause() {
|
||||
|
||||
printStatusNormal("Pausing download ...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", pause_button, false);
|
||||
swingReflectionInvoke("setEnabled", speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", slots_label, false);
|
||||
swingReflectionInvoke("setEnabled", slots_spinner, false);
|
||||
swingReflectionInvoke("setVisible", stop_button, true);
|
||||
swingReflectionInvoke("setVisible", keep_temp_checkbox, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resume() {
|
||||
|
||||
printStatusNormal("Downloading file from mega ...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", pause_button, false);
|
||||
swingReflectionInvoke("setEnabled", speed_label, true);
|
||||
swingReflectionInvoke("setEnabled", slots_label, true);
|
||||
swingReflectionInvoke("setEnabled", slots_spinner, true);
|
||||
swingReflectionInvoke("setVisible", stop_button, false);
|
||||
swingReflectionInvoke("setVisible", keep_temp_checkbox, false);
|
||||
swingReflectionInvoke("setEnabled", pause_button, true);
|
||||
swingReflectionInvoke("setText", pause_button, "PAUSE DOWNLOAD");
|
||||
swingReflectionInvoke("setVisible", _download.getMain_panel().getView().getPause_all_down_button(), true);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
|
||||
printStatusNormal("Stopping download safely, please wait...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", pause_button, false);
|
||||
swingReflectionInvoke("setEnabled", stop_button, false);
|
||||
swingReflectionInvoke("setEnabled", keep_temp_checkbox, false);
|
||||
swingReflectionInvoke("setEnabled", slots_label, false);
|
||||
swingReflectionInvoke("setEnabled", slots_spinner, false);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void updateSpeed(String speed, Boolean visible) {
|
||||
|
||||
if(speed != null) {
|
||||
|
||||
swingReflectionInvoke("setText", speed_label, speed);
|
||||
}
|
||||
|
||||
if(visible != null) {
|
||||
|
||||
swingReflectionInvoke("setVisible", speed_label, visible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRemainingTime(String rem_time, Boolean visible) {
|
||||
|
||||
if(speed_label != null) {
|
||||
|
||||
swingReflectionInvoke("setText", remtime_label, rem_time);
|
||||
}
|
||||
|
||||
if(visible != null) {
|
||||
|
||||
swingReflectionInvoke("setVisible", remtime_label, visible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProgressBar(long progress, double bar_rate) {
|
||||
|
||||
swingReflectionInvoke("setValue", progress_pbar, (int)Math.ceil(bar_rate*progress));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printStatusError(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", status_label, Color.red);
|
||||
swingReflectionInvoke("setText", status_label, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printStatusOK(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", status_label, new Color(0,128,0));
|
||||
swingReflectionInvoke("setText", status_label, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printStatusNormal(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", status_label, Color.BLACK);
|
||||
swingReflectionInvoke("setText", status_label, message);
|
||||
}
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton close_button;
|
||||
private javax.swing.JButton copy_link_button;
|
||||
private javax.swing.JLabel file_name_label;
|
||||
private javax.swing.JLabel file_size_label;
|
||||
private javax.swing.JCheckBox keep_temp_checkbox;
|
||||
private javax.swing.JButton pause_button;
|
||||
private javax.swing.JProgressBar progress_pbar;
|
||||
private javax.swing.JLabel remtime_label;
|
||||
private javax.swing.JButton restart_button;
|
||||
private javax.swing.JLabel slot_status_label;
|
||||
private javax.swing.JLabel slots_label;
|
||||
private javax.swing.JSpinner slots_spinner;
|
||||
private javax.swing.JLabel speed_label;
|
||||
private javax.swing.JLabel status_label;
|
||||
private javax.swing.JButton stop_button;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
}
|
313
src/megabasterd/FileGrabberDialog.form
Normal file
@ -0,0 +1,313 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.7" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="title" type="java.lang.String" value="FileGrabber"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jPanel2" max="32767" attributes="0"/>
|
||||
<Component id="jPanel1" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="total_file_size_label" alignment="0" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="warning_label" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="skip_rest_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="skip_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="91" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" pref="300" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jPanel2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jPanel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="total_file_size_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="warning_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="skip_rest_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="skip_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="jPanel1">
|
||||
<Properties>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
|
||||
<TitledBorder title="Files"/>
|
||||
</Border>
|
||||
</Property>
|
||||
</Properties>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="file_tree_scrollpane" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="file_tree_scrollpane" alignment="0" pref="290" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="file_tree_scrollpane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTree" name="file_tree">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="model" type="javax.swing.tree.TreeModel" editor="org.netbeans.modules.form.editors2.TreeModelEditor">
|
||||
<TreeModel code=""/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="rootVisible" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="jPanel2">
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="upload_name_label" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="account_label" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="add_files_button" min="-2" pref="250" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="add_folder_button" min="-2" pref="250" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="dir_name_textfield" max="32767" attributes="0"/>
|
||||
<Component id="account_combobox" max="32767" attributes="0"/>
|
||||
<Component id="used_space_label" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="upload_name_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="dir_name_textfield" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="account_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="account_combobox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="used_space_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="add_files_button" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="add_folder_button" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="upload_name_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Upload name:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="dir_name_textfield">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="account_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Account:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JComboBox" name="account_combobox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||
<StringArray count="0"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="account_comboboxItemStateChanged"/>
|
||||
</Events>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<String>"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="used_space_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Used space: 0.00GB"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="add_folder_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Add folder"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="add_folder_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="add_files_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Add files"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="add_files_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="dance_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="cc" red="66" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="24" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Let's dance, baby"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="dance_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="total_file_size_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="28" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="[0 B]"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="warning_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="If you DO NOT want to upload some folder or file you can REMOVE it."/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="skip_rest_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="REMOVE ALL EXCEPT THIS"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="skip_rest_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="skip_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="REMOVE THIS"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="skip_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
642
src/megabasterd/FileGrabberDialog.java
Normal file
@ -0,0 +1,642 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MiscTools.deleteAllExceptSelectedTreeItems;
|
||||
import static megabasterd.MiscTools.deleteSelectedTreeItems;
|
||||
import static megabasterd.MiscTools.formatBytes;
|
||||
import static megabasterd.MiscTools.genID;
|
||||
import static megabasterd.MiscTools.sortTree;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWaitForReturn;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class FileGrabberDialog extends javax.swing.JDialog {
|
||||
|
||||
private boolean _upload;
|
||||
private final ArrayList<File> _files;
|
||||
private String _base_path;
|
||||
private long _total_space;
|
||||
private String _last_selected_account;
|
||||
private final MainPanel _main_panel;
|
||||
|
||||
public boolean isUpload() {
|
||||
return _upload;
|
||||
}
|
||||
|
||||
public ArrayList<File> getFiles() {
|
||||
return _files;
|
||||
}
|
||||
|
||||
public String getBase_path() {
|
||||
return _base_path;
|
||||
}
|
||||
|
||||
public JComboBox<String> getAccount_combobox() {
|
||||
return account_combobox;
|
||||
}
|
||||
|
||||
public JTextField getDir_name_textfield() {
|
||||
return dir_name_textfield;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Creates new form FileGrabber
|
||||
*/
|
||||
public FileGrabberDialog(java.awt.Frame parent, boolean modal) {
|
||||
|
||||
super(parent, modal);
|
||||
|
||||
_last_selected_account = null;
|
||||
_total_space = 0L;
|
||||
_base_path = null;
|
||||
_upload = false;
|
||||
|
||||
initComponents();
|
||||
|
||||
updateFont(dance_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(add_files_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(add_folder_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(account_combobox, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(upload_name_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(account_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(used_space_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(total_file_size_label, FONT_DEFAULT, Font.BOLD);
|
||||
updateFont(file_tree, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(warning_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(dir_name_textfield, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(skip_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(skip_rest_button, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
dir_name_textfield.addMouseListener(new ContextMenuMouseListener());
|
||||
|
||||
_files = new ArrayList<>();
|
||||
|
||||
swingReflectionInvoke("setEnabled", warning_label, false);
|
||||
swingReflectionInvoke("setEnabled", total_file_size_label, false);
|
||||
swingReflectionInvoke("setEnabled", skip_button, false);
|
||||
swingReflectionInvoke("setEnabled", skip_rest_button, false);
|
||||
|
||||
_main_panel = ((MainPanelView)parent).getMain_panel();
|
||||
|
||||
if( _main_panel.getMega_accounts().size() > 0) {
|
||||
|
||||
for (Object o:_main_panel.getMega_accounts().keySet()) {
|
||||
|
||||
account_combobox.addItem((String)o);
|
||||
}
|
||||
|
||||
} else
|
||||
{
|
||||
swingReflectionInvoke("setText", used_space_label, "No MEGA accounts available!!");
|
||||
swingReflectionInvoke("setEnabled", dance_button, false);
|
||||
swingReflectionInvoke("setEnabled", add_files_button, false);
|
||||
swingReflectionInvoke("setEnabled", add_folder_button, false);
|
||||
swingReflectionInvoke("setEnabled", file_tree, false);
|
||||
swingReflectionInvoke("setEnabled", dir_name_textfield, false);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
jPanel1 = new javax.swing.JPanel();
|
||||
file_tree_scrollpane = new javax.swing.JScrollPane();
|
||||
file_tree = new javax.swing.JTree();
|
||||
jPanel2 = new javax.swing.JPanel();
|
||||
upload_name_label = new javax.swing.JLabel();
|
||||
dir_name_textfield = new javax.swing.JTextField();
|
||||
account_label = new javax.swing.JLabel();
|
||||
account_combobox = new javax.swing.JComboBox<>();
|
||||
used_space_label = new javax.swing.JLabel();
|
||||
add_folder_button = new javax.swing.JButton();
|
||||
add_files_button = new javax.swing.JButton();
|
||||
dance_button = new javax.swing.JButton();
|
||||
total_file_size_label = new javax.swing.JLabel();
|
||||
warning_label = new javax.swing.JLabel();
|
||||
skip_rest_button = new javax.swing.JButton();
|
||||
skip_button = new javax.swing.JButton();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setTitle("FileGrabber");
|
||||
|
||||
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Files"));
|
||||
|
||||
file_tree.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root");
|
||||
file_tree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
|
||||
file_tree.setDoubleBuffered(true);
|
||||
file_tree.setRootVisible(false);
|
||||
file_tree_scrollpane.setViewportView(file_tree);
|
||||
|
||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
||||
jPanel1.setLayout(jPanel1Layout);
|
||||
jPanel1Layout.setHorizontalGroup(
|
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(file_tree_scrollpane)
|
||||
);
|
||||
jPanel1Layout.setVerticalGroup(
|
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE)
|
||||
);
|
||||
|
||||
upload_name_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
upload_name_label.setText("Upload name:");
|
||||
upload_name_label.setDoubleBuffered(true);
|
||||
|
||||
dir_name_textfield.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
dir_name_textfield.setDoubleBuffered(true);
|
||||
|
||||
account_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
account_label.setText("Account:");
|
||||
account_label.setDoubleBuffered(true);
|
||||
|
||||
account_combobox.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
account_combobox.setDoubleBuffered(true);
|
||||
account_combobox.addItemListener(new java.awt.event.ItemListener() {
|
||||
public void itemStateChanged(java.awt.event.ItemEvent evt) {
|
||||
account_comboboxItemStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
used_space_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
used_space_label.setText("Used space: 0.00GB");
|
||||
used_space_label.setDoubleBuffered(true);
|
||||
|
||||
add_folder_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
add_folder_button.setText("Add folder");
|
||||
add_folder_button.setDoubleBuffered(true);
|
||||
add_folder_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
add_folder_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
add_files_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
add_files_button.setText("Add files");
|
||||
add_files_button.setDoubleBuffered(true);
|
||||
add_files_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
add_files_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
|
||||
jPanel2.setLayout(jPanel2Layout);
|
||||
jPanel2Layout.setHorizontalGroup(
|
||||
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel2Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(upload_name_label)
|
||||
.addComponent(account_label))
|
||||
.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)
|
||||
.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(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))
|
||||
.addContainerGap())
|
||||
);
|
||||
jPanel2Layout.setVerticalGroup(
|
||||
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel2Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(upload_name_label)
|
||||
.addComponent(dir_name_textfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(account_label)
|
||||
.addComponent(account_combobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(used_space_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(add_files_button)
|
||||
.addComponent(add_folder_button))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
dance_button.setBackground(new java.awt.Color(102, 204, 255));
|
||||
dance_button.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
|
||||
dance_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
dance_button.setText("Let's dance, baby");
|
||||
dance_button.setDoubleBuffered(true);
|
||||
dance_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
dance_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
total_file_size_label.setFont(new java.awt.Font("Dialog", 1, 28)); // NOI18N
|
||||
total_file_size_label.setText("[0 B]");
|
||||
total_file_size_label.setDoubleBuffered(true);
|
||||
|
||||
warning_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
warning_label.setText("If you DO NOT want to upload some folder or file you can REMOVE it.");
|
||||
warning_label.setDoubleBuffered(true);
|
||||
|
||||
skip_rest_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
skip_rest_button.setText("REMOVE ALL EXCEPT THIS");
|
||||
skip_rest_button.setDoubleBuffered(true);
|
||||
skip_rest_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
skip_rest_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
skip_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
skip_button.setText("REMOVE THIS");
|
||||
skip_button.setDoubleBuffered(true);
|
||||
skip_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
skip_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(total_file_size_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(warning_label)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(skip_rest_button)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(skip_button)))
|
||||
.addGap(0, 91, Short.MAX_VALUE))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addGap(0, 0, Short.MAX_VALUE)
|
||||
.addComponent(dance_button, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(total_file_size_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(warning_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(skip_rest_button)
|
||||
.addComponent(skip_button))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(dance_button)
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void add_files_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_add_files_buttonActionPerformed
|
||||
|
||||
|
||||
javax.swing.JFileChooser filechooser = new javax.swing.JFileChooser();
|
||||
|
||||
filechooser.setDialogTitle("Add files");
|
||||
filechooser.setAcceptAllFileFilterUsed(false);
|
||||
filechooser.setMultiSelectionEnabled(true);
|
||||
|
||||
if( filechooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {
|
||||
|
||||
swingReflectionInvoke("setText", total_file_size_label, "");
|
||||
|
||||
File[] files_selected = filechooser.getSelectedFiles();
|
||||
|
||||
_base_path = files_selected[0].getParentFile().getAbsolutePath();
|
||||
|
||||
System.out.println(_base_path);
|
||||
|
||||
swingReflectionInvoke("setText", dir_name_textfield, files_selected[0].getParentFile().getName()+"_"+genID(10));
|
||||
|
||||
DefaultMutableTreeNode root = new DefaultMutableTreeNode(filechooser.getSelectedFile().getParent());
|
||||
|
||||
for(File file:files_selected) {
|
||||
|
||||
DefaultMutableTreeNode current_file = new DefaultMutableTreeNode( file.getName() + (file.isFile()?" ["+ formatBytes(file.length())+"]":"") );
|
||||
|
||||
root.add(current_file);
|
||||
}
|
||||
|
||||
file_tree.setModel(new DefaultTreeModel( sortTree(root)));
|
||||
|
||||
_genFileList();
|
||||
|
||||
file_tree.setRootVisible(root.getChildCount() > 0);
|
||||
}
|
||||
}//GEN-LAST:event_add_files_buttonActionPerformed
|
||||
|
||||
private void add_folder_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_add_folder_buttonActionPerformed
|
||||
|
||||
|
||||
javax.swing.JFileChooser filechooser = new javax.swing.JFileChooser();
|
||||
filechooser.setDialogTitle("Add directory");
|
||||
filechooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
|
||||
filechooser.setAcceptAllFileFilterUsed(false);
|
||||
|
||||
if( filechooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {
|
||||
|
||||
swingReflectionInvoke("setText", total_file_size_label, "");
|
||||
|
||||
_base_path = filechooser.getSelectedFile().getAbsolutePath();
|
||||
|
||||
System.out.println(_base_path);
|
||||
|
||||
swingReflectionInvoke("setText", dir_name_textfield, filechooser.getSelectedFile().getName()+"_"+genID(10));
|
||||
|
||||
DefaultMutableTreeNode root = new DefaultMutableTreeNode(filechooser.getSelectedFile().getAbsolutePath());
|
||||
|
||||
_genFileTree(filechooser.getSelectedFile().getAbsolutePath(), root);
|
||||
|
||||
file_tree.setModel(new DefaultTreeModel(sortTree(root)));
|
||||
|
||||
_genFileList();
|
||||
|
||||
file_tree.setRootVisible(root.getChildCount() > 0);
|
||||
}
|
||||
}//GEN-LAST:event_add_folder_buttonActionPerformed
|
||||
|
||||
private void dance_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dance_buttonActionPerformed
|
||||
|
||||
_upload = true;
|
||||
|
||||
swingReflectionInvoke("setVisible", this, false);
|
||||
}//GEN-LAST:event_dance_buttonActionPerformed
|
||||
|
||||
private void account_comboboxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_account_comboboxItemStateChanged
|
||||
|
||||
|
||||
if(!swingReflectionInvokeAndWaitForReturn("getSelectedItem", account_combobox).equals(_last_selected_account)) {
|
||||
|
||||
_last_selected_account = (String) swingReflectionInvokeAndWaitForReturn("getSelectedItem", account_combobox);
|
||||
|
||||
final String email = (String)account_combobox.getSelectedItem();
|
||||
|
||||
final FileGrabberDialog fg = this;
|
||||
|
||||
swingReflectionInvoke("setForeground", fg.used_space_label, Color.black);
|
||||
|
||||
swingReflectionInvoke("setText", used_space_label, "Checking account quota, please wait...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", account_combobox, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dance_button, false);
|
||||
swingReflectionInvoke("setEnabled", add_files_button, false);
|
||||
swingReflectionInvoke("setEnabled", add_folder_button, false);
|
||||
swingReflectionInvoke("setEnabled", file_tree, false);
|
||||
swingReflectionInvoke("setEnabled", dir_name_textfield, false);
|
||||
swingReflectionInvoke("setEnabled", total_file_size_label, false);
|
||||
swingReflectionInvoke("setEnabled", skip_button, false);
|
||||
swingReflectionInvoke("setEnabled", skip_rest_button, false);
|
||||
swingReflectionInvoke("setEnabled", warning_label, false);
|
||||
|
||||
MainPanel.THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
HashMap<String,Object> account_info = (HashMap)fg._main_panel.getMega_accounts().get(email);
|
||||
|
||||
Long[] quota = null;
|
||||
|
||||
MegaAPI ma = fg._main_panel.getMega_active_accounts().get(fg.account_combobox.getSelectedItem());
|
||||
|
||||
if(ma == null) {
|
||||
|
||||
ma = new MegaAPI();
|
||||
|
||||
try {
|
||||
|
||||
ma.login(email, (String)account_info.get("password"));
|
||||
|
||||
fg._main_panel.getMega_active_accounts().put(email, ma);
|
||||
|
||||
quota = ma.getQuota();
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
||||
Logger.getLogger(FileGrabberDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
quota = ma.getQuota();
|
||||
}
|
||||
|
||||
if(quota != null) {
|
||||
|
||||
if(quota[0] <= Math.round((double)quota[1]/2)) {
|
||||
|
||||
swingReflectionInvoke("setForeground", fg.used_space_label, new Color(0,128,0));
|
||||
|
||||
} else if(quota[0] < quota[1]) {
|
||||
|
||||
swingReflectionInvoke("setForeground", fg.used_space_label, new Color(230,115,0));
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setForeground", fg.used_space_label, Color.red);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", fg.used_space_label, formatBytes(quota[0])+" / "+formatBytes(quota[1]));
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setForeground", fg.used_space_label, Color.red);
|
||||
|
||||
swingReflectionInvoke("setText", fg.used_space_label, "ERROR checking account quota! (Retry in few minutes).");
|
||||
}
|
||||
|
||||
|
||||
swingReflectionInvoke("setEnabled", fg.dance_button, true);
|
||||
swingReflectionInvoke("setEnabled", fg.add_files_button, true);
|
||||
swingReflectionInvoke("setEnabled", fg.add_folder_button, true);
|
||||
swingReflectionInvoke("setEnabled", fg.file_tree, true);
|
||||
swingReflectionInvoke("setEnabled", fg.dir_name_textfield, true);
|
||||
swingReflectionInvoke("setEnabled", fg.account_combobox, true);
|
||||
swingReflectionInvoke("setEnabled", fg.total_file_size_label, true);
|
||||
swingReflectionInvoke("setEnabled", fg.skip_button, true);
|
||||
swingReflectionInvoke("setEnabled", fg.skip_rest_button, true);
|
||||
swingReflectionInvoke("setEnabled", fg.warning_label, true);
|
||||
|
||||
|
||||
} });
|
||||
|
||||
}
|
||||
|
||||
}//GEN-LAST:event_account_comboboxItemStateChanged
|
||||
|
||||
private void skip_rest_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_rest_buttonActionPerformed
|
||||
|
||||
|
||||
if( deleteAllExceptSelectedTreeItems(file_tree)) {
|
||||
|
||||
_genFileList();
|
||||
|
||||
file_tree.setRootVisible(((TreeNode)file_tree.getModel().getRoot()).getChildCount() > 0);
|
||||
}
|
||||
}//GEN-LAST:event_skip_rest_buttonActionPerformed
|
||||
|
||||
private void skip_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_buttonActionPerformed
|
||||
|
||||
|
||||
if(deleteSelectedTreeItems(file_tree)) {
|
||||
|
||||
_genFileList();
|
||||
|
||||
file_tree.setRootVisible(((TreeNode)file_tree.getModel().getRoot()).getChildCount() > 0);
|
||||
}
|
||||
}//GEN-LAST:event_skip_buttonActionPerformed
|
||||
|
||||
private void _genFileTree(String directoryName, DefaultMutableTreeNode root) {
|
||||
|
||||
File directory = new File(directoryName);
|
||||
|
||||
File[] fList = directory.listFiles();
|
||||
|
||||
if(fList != null) {
|
||||
|
||||
for (File file : fList) {
|
||||
|
||||
if (file.isFile()) {
|
||||
|
||||
DefaultMutableTreeNode current_file = new DefaultMutableTreeNode( file.getName() + " ["+formatBytes(file.length())+"]" );
|
||||
|
||||
root.add(current_file);
|
||||
|
||||
} else if (file.isDirectory() && file.listFiles().length > 0) {
|
||||
|
||||
DefaultMutableTreeNode current_dir = new DefaultMutableTreeNode( file.getName() );
|
||||
|
||||
root.add(current_dir);
|
||||
|
||||
_genFileTree(file.getAbsolutePath(), current_dir);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void _genFileList() {
|
||||
|
||||
_files.clear();
|
||||
|
||||
_total_space = 0L;
|
||||
|
||||
DefaultMutableTreeNode root = (DefaultMutableTreeNode)file_tree.getModel().getRoot();
|
||||
|
||||
Enumeration files_tree = root.depthFirstEnumeration();
|
||||
|
||||
int conta_files = 0;
|
||||
|
||||
while(files_tree.hasMoreElements()) {
|
||||
|
||||
DefaultMutableTreeNode node = (DefaultMutableTreeNode)files_tree.nextElement();
|
||||
|
||||
if(node.isLeaf() && node!=root) {
|
||||
|
||||
String path = "";
|
||||
|
||||
Object[] object_path = node.getUserObjectPath();
|
||||
|
||||
for(Object p:object_path) {
|
||||
|
||||
path+="/"+p;
|
||||
}
|
||||
|
||||
path = path.replaceAll("^//", "/").trim().replaceAll(" \\[[0-9,]+ [A-Z]+\\]$", "");
|
||||
|
||||
File file = new File(path);
|
||||
|
||||
if(file.isFile()) {
|
||||
|
||||
conta_files++;
|
||||
|
||||
_total_space+=file.length();
|
||||
|
||||
_files.add(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", total_file_size_label, "["+formatBytes(_total_space)+"]");
|
||||
|
||||
if(conta_files == 0) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", dance_button, false);
|
||||
swingReflectionInvoke("setEnabled", warning_label, false);
|
||||
swingReflectionInvoke("setEnabled", skip_button, false);
|
||||
swingReflectionInvoke("setEnabled", skip_rest_button, false);
|
||||
swingReflectionInvoke("setEnabled", total_file_size_label, false);
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", dance_button, true);
|
||||
swingReflectionInvoke("setEnabled", warning_label, true);
|
||||
swingReflectionInvoke("setEnabled", skip_button, true);
|
||||
swingReflectionInvoke("setEnabled", skip_rest_button, true);
|
||||
swingReflectionInvoke("setEnabled", total_file_size_label, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JComboBox<String> account_combobox;
|
||||
private javax.swing.JLabel account_label;
|
||||
private javax.swing.JButton add_files_button;
|
||||
private javax.swing.JButton add_folder_button;
|
||||
private javax.swing.JButton dance_button;
|
||||
private javax.swing.JTextField dir_name_textfield;
|
||||
private javax.swing.JTree file_tree;
|
||||
private javax.swing.JScrollPane file_tree_scrollpane;
|
||||
private javax.swing.JPanel jPanel1;
|
||||
private javax.swing.JPanel jPanel2;
|
||||
private javax.swing.JButton skip_button;
|
||||
private javax.swing.JButton skip_rest_button;
|
||||
private javax.swing.JLabel total_file_size_label;
|
||||
private javax.swing.JLabel upload_name_label;
|
||||
private javax.swing.JLabel used_space_label;
|
||||
private javax.swing.JLabel warning_label;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
202
src/megabasterd/FolderLinkDialog.form
Normal file
@ -0,0 +1,202 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.7" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="title" type="java.lang.String" value="FolderLink"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="file_tree_scrollpane" alignment="0" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="skip_rest_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="skip_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" pref="300" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="folder_link_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="restore_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="total_space_label" alignment="0" pref="876" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="link_detected_label" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="warning_label" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="link_detected_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="8" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="folder_link_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="restore_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="file_tree_scrollpane" pref="368" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="total_space_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="warning_label" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="-2" pref="22" max="-2" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="skip_rest_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="skip_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="file_tree_scrollpane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTree" name="file_tree">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="model" type="javax.swing.tree.TreeModel" editor="org.netbeans.modules.form.editors2.TreeModelEditor">
|
||||
<TreeModel code=""/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="skip_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="REMOVE THIS"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="skip_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="link_detected_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="30" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Folder link detected!"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="dance_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="cc" red="66" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="24" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Let's dance, baby"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="dance_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="folder_link_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="jLabel2"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="warning_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="If you DO NOT want to download some folder or file you can REMOVE it."/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="skip_rest_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="REMOVE ALL EXCEPT THIS"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="skip_rest_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="restore_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Restore folder data"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="restore_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="total_space_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="28" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="[0 B]"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
452
src/megabasterd/FolderLinkDialog.java
Normal file
@ -0,0 +1,452 @@
|
||||
package megabasterd;
|
||||
|
||||
import static java.awt.Font.BOLD;
|
||||
import static java.awt.Font.PLAIN;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MiscTools.deleteAllExceptSelectedTreeItems;
|
||||
import static megabasterd.MiscTools.deleteSelectedTreeItems;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
import static megabasterd.MiscTools.formatBytes;
|
||||
import static megabasterd.MiscTools.sortTree;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class FolderLinkDialog extends javax.swing.JDialog {
|
||||
|
||||
private String _link;
|
||||
|
||||
private boolean _download;
|
||||
|
||||
private final List<HashMap> _download_links;
|
||||
|
||||
private long _total_space;
|
||||
|
||||
private boolean _mega_error;
|
||||
|
||||
public List<HashMap> getDownload_links() {
|
||||
return _download_links;
|
||||
}
|
||||
|
||||
public boolean isDownload() {
|
||||
return _download;
|
||||
}
|
||||
|
||||
public boolean isMega_error() {
|
||||
return _mega_error;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates new form FolderLink
|
||||
*/
|
||||
public FolderLinkDialog(java.awt.Frame parent, boolean modal, String link) {
|
||||
|
||||
super(parent, modal);
|
||||
|
||||
initComponents();
|
||||
|
||||
_mega_error = false;
|
||||
_total_space = 0L;
|
||||
_download = false;
|
||||
_link = null;
|
||||
|
||||
updateFont(file_tree, FONT_DEFAULT, PLAIN);
|
||||
updateFont(link_detected_label, FONT_DEFAULT, PLAIN);
|
||||
updateFont(warning_label, FONT_DEFAULT, PLAIN);
|
||||
updateFont(skip_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(dance_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(restore_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(skip_rest_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(total_space_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(folder_link_label, FONT_DEFAULT, PLAIN);
|
||||
|
||||
swingReflectionInvoke("setVisible", restore_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", total_space_label, false);
|
||||
|
||||
_link = link;
|
||||
|
||||
swingReflectionInvoke("setText", folder_link_label, link);
|
||||
|
||||
_download_links = new ArrayList<>();
|
||||
|
||||
_loadMegaDirTree();
|
||||
|
||||
if(!_mega_error) {
|
||||
|
||||
_genDownloadLiks();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
file_tree_scrollpane = new javax.swing.JScrollPane();
|
||||
file_tree = new javax.swing.JTree();
|
||||
skip_button = new javax.swing.JButton();
|
||||
link_detected_label = new javax.swing.JLabel();
|
||||
dance_button = new javax.swing.JButton();
|
||||
folder_link_label = new javax.swing.JLabel();
|
||||
warning_label = new javax.swing.JLabel();
|
||||
skip_rest_button = new javax.swing.JButton();
|
||||
restore_button = new javax.swing.JButton();
|
||||
total_space_label = new javax.swing.JLabel();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setTitle("FolderLink");
|
||||
|
||||
file_tree.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root");
|
||||
file_tree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
|
||||
file_tree.setDoubleBuffered(true);
|
||||
file_tree_scrollpane.setViewportView(file_tree);
|
||||
|
||||
skip_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
skip_button.setText("REMOVE THIS");
|
||||
skip_button.setDoubleBuffered(true);
|
||||
skip_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
skip_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
link_detected_label.setFont(new java.awt.Font("Dialog", 1, 30)); // NOI18N
|
||||
link_detected_label.setText("Folder link detected!");
|
||||
link_detected_label.setDoubleBuffered(true);
|
||||
|
||||
dance_button.setBackground(new java.awt.Color(102, 204, 255));
|
||||
dance_button.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
|
||||
dance_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
dance_button.setText("Let's dance, baby");
|
||||
dance_button.setDoubleBuffered(true);
|
||||
dance_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
dance_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
folder_link_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
folder_link_label.setText("jLabel2");
|
||||
folder_link_label.setDoubleBuffered(true);
|
||||
|
||||
warning_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
warning_label.setText("If you DO NOT want to download some folder or file you can REMOVE it.");
|
||||
warning_label.setDoubleBuffered(true);
|
||||
|
||||
skip_rest_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
skip_rest_button.setText("REMOVE ALL EXCEPT THIS");
|
||||
skip_rest_button.setDoubleBuffered(true);
|
||||
skip_rest_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
skip_rest_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
restore_button.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
|
||||
restore_button.setText("Restore folder data");
|
||||
restore_button.setDoubleBuffered(true);
|
||||
restore_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
restore_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
total_space_label.setFont(new java.awt.Font("Dialog", 1, 28)); // NOI18N
|
||||
total_space_label.setText("[0 B]");
|
||||
total_space_label.setDoubleBuffered(true);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(file_tree_scrollpane)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(skip_rest_button)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(skip_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(dance_button, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(folder_link_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(restore_button))
|
||||
.addComponent(total_space_label, javax.swing.GroupLayout.DEFAULT_SIZE, 876, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(link_detected_label)
|
||||
.addComponent(warning_label))
|
||||
.addGap(0, 0, Short.MAX_VALUE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(link_detected_label)
|
||||
.addGap(8, 8, 8)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(folder_link_label)
|
||||
.addComponent(restore_button))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(file_tree_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(total_space_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(warning_label)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(22, 22, 22)
|
||||
.addComponent(dance_button))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(skip_rest_button)
|
||||
.addComponent(skip_button))))
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void skip_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_buttonActionPerformed
|
||||
|
||||
|
||||
if(deleteSelectedTreeItems(file_tree)) {
|
||||
|
||||
_genDownloadLiks();
|
||||
swingReflectionInvoke("setVisible", restore_button, true);
|
||||
}
|
||||
|
||||
}//GEN-LAST:event_skip_buttonActionPerformed
|
||||
|
||||
private void dance_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dance_buttonActionPerformed
|
||||
|
||||
|
||||
|
||||
_download = true;
|
||||
swingReflectionInvoke("setVisible", this, false);
|
||||
}//GEN-LAST:event_dance_buttonActionPerformed
|
||||
|
||||
private void skip_rest_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skip_rest_buttonActionPerformed
|
||||
|
||||
|
||||
if(deleteAllExceptSelectedTreeItems(file_tree)) {
|
||||
|
||||
_genDownloadLiks();
|
||||
swingReflectionInvoke("setVisible", restore_button, true);
|
||||
}
|
||||
|
||||
}//GEN-LAST:event_skip_rest_buttonActionPerformed
|
||||
|
||||
private void restore_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restore_buttonActionPerformed
|
||||
|
||||
|
||||
swingReflectionInvoke("setEnabled", restore_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dance_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", file_tree, false);
|
||||
|
||||
final FolderLinkDialog main = this;
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
main._loadMegaDirTree();
|
||||
|
||||
main._genDownloadLiks();
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.restore_button, true);
|
||||
|
||||
swingReflectionInvoke("setVisible", main.restore_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.dance_button, true);
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.file_tree, true);
|
||||
|
||||
}});
|
||||
}//GEN-LAST:event_restore_buttonActionPerformed
|
||||
|
||||
private void _loadMegaDirTree() {
|
||||
|
||||
try {
|
||||
HashMap<String,Object> folder_nodes;
|
||||
|
||||
MegaAPI ma = new MegaAPI();
|
||||
|
||||
String folder_id = findFirstRegex("#F!([^!]+)", _link, 1);
|
||||
|
||||
String folder_key = findFirstRegex("#F![^!]+!(.+)", _link, 1);
|
||||
|
||||
folder_nodes = ma.getFolderNodes(folder_id, folder_key);
|
||||
|
||||
MegaMutableTreeNode root=null;
|
||||
|
||||
for(Object o:folder_nodes.values()) {
|
||||
|
||||
HashMap<String,Object> current_hashmap_node = (HashMap<String,Object>)o;
|
||||
|
||||
MegaMutableTreeNode current_node;
|
||||
|
||||
if(current_hashmap_node.get("jtree_node") == null) {
|
||||
|
||||
current_node = new MegaMutableTreeNode(current_hashmap_node);
|
||||
|
||||
current_hashmap_node.put("jtree_node", current_node);
|
||||
|
||||
} else {
|
||||
|
||||
current_node = (MegaMutableTreeNode)current_hashmap_node.get("jtree_node");
|
||||
}
|
||||
|
||||
String parent_id=(String)current_hashmap_node.get("parent");
|
||||
|
||||
root=null;
|
||||
|
||||
do{
|
||||
|
||||
if(folder_nodes.get(parent_id) != null) {
|
||||
|
||||
HashMap<String,Object> parent_hashmap_node = (HashMap)folder_nodes.get(parent_id);
|
||||
|
||||
MegaMutableTreeNode parent_node;
|
||||
|
||||
if(parent_hashmap_node.get("jtree_node") == null) {
|
||||
|
||||
parent_node = new MegaMutableTreeNode(parent_hashmap_node);
|
||||
|
||||
parent_hashmap_node.put("jtree_node", parent_node);
|
||||
|
||||
} else {
|
||||
|
||||
parent_node = (MegaMutableTreeNode)parent_hashmap_node.get("jtree_node");
|
||||
}
|
||||
|
||||
parent_node.add(current_node);
|
||||
|
||||
parent_id = (String)parent_hashmap_node.get("parent");
|
||||
|
||||
current_node = parent_node;
|
||||
|
||||
} else {
|
||||
|
||||
root = current_node;
|
||||
}
|
||||
|
||||
}while(current_node != root);
|
||||
}
|
||||
|
||||
file_tree.setModel(new DefaultTreeModel(sortTree(root)));
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
||||
getLogger(FolderLinkDialog.class.getName()).log(SEVERE, null, ex);
|
||||
|
||||
_mega_error = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void _genDownloadLiks(){
|
||||
|
||||
String folder_id = findFirstRegex("#F!([^!]+)", _link, 1);
|
||||
|
||||
_download_links.clear();
|
||||
|
||||
MegaMutableTreeNode root = (MegaMutableTreeNode)file_tree.getModel().getRoot();
|
||||
|
||||
Enumeration files_tree = root.depthFirstEnumeration();
|
||||
|
||||
_total_space = 0L;
|
||||
|
||||
while(files_tree.hasMoreElements()) {
|
||||
|
||||
MegaMutableTreeNode node = (MegaMutableTreeNode)files_tree.nextElement();
|
||||
|
||||
if(node.isLeaf() && node!=root && ((HashMap<String,Object>)node.getUserObject()).get("size") != null) {
|
||||
|
||||
String path = "";
|
||||
|
||||
Object[] object_path = node.getUserObjectPath();
|
||||
|
||||
for(Object p:object_path) {
|
||||
|
||||
path+="/"+((Map<String,Object>)p).get("name");
|
||||
}
|
||||
|
||||
path = path.replaceAll("^/+", "").trim();
|
||||
|
||||
String url = "https://mega.nz/#N!" + ((Map<String, Object>) node.getUserObject()).get("h") + "!" + ((Map<String, Object>) node.getUserObject()).get("key") + "###n=" + folder_id ;
|
||||
|
||||
HashMap<String,Object> download_link = new HashMap<>();
|
||||
|
||||
download_link.put("url", url);
|
||||
|
||||
download_link.put("filename", path);
|
||||
|
||||
download_link.put("filekey", ((Map<String, Object>) node.getUserObject()).get("key"));
|
||||
|
||||
download_link.put("filesize", ((HashMap<String,Object>)node.getUserObject()).get("size"));
|
||||
|
||||
_total_space+=(long)download_link.get("filesize");
|
||||
|
||||
_download_links.add(download_link);
|
||||
}
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", total_space_label, "["+formatBytes(_total_space)+"]");
|
||||
|
||||
if(_total_space == 0) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", dance_button, false);
|
||||
swingReflectionInvoke("setEnabled", warning_label, false);
|
||||
swingReflectionInvoke("setEnabled", skip_button, false);
|
||||
swingReflectionInvoke("setEnabled", skip_rest_button, false);
|
||||
swingReflectionInvoke("setEnabled", total_space_label, false);
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", dance_button, true);
|
||||
swingReflectionInvoke("setEnabled", warning_label, true);
|
||||
swingReflectionInvoke("setEnabled", skip_button, true);
|
||||
swingReflectionInvoke("setEnabled", skip_rest_button, true);
|
||||
swingReflectionInvoke("setEnabled", total_space_label, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton dance_button;
|
||||
private javax.swing.JTree file_tree;
|
||||
private javax.swing.JScrollPane file_tree_scrollpane;
|
||||
private javax.swing.JLabel folder_link_label;
|
||||
private javax.swing.JLabel link_detected_label;
|
||||
private javax.swing.JButton restore_button;
|
||||
private javax.swing.JButton skip_button;
|
||||
private javax.swing.JButton skip_rest_button;
|
||||
private javax.swing.JLabel total_space_label;
|
||||
private javax.swing.JLabel warning_label;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
114
src/megabasterd/GlobalSpeedMeter.java
Normal file
@ -0,0 +1,114 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JLabel;
|
||||
import static megabasterd.MiscTools.formatBytes;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
|
||||
public final class GlobalSpeedMeter implements Runnable, SecureNotifiable
|
||||
{
|
||||
private final JLabel _speed_label;
|
||||
private final ConcurrentLinkedQueue<SpeedMeter> _speedmeters;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified;
|
||||
|
||||
|
||||
GlobalSpeedMeter(JLabel sp_label)
|
||||
{
|
||||
_notified = false;
|
||||
_secure_notify_lock = new Object();
|
||||
_speed_label = sp_label;
|
||||
_speedmeters = new ConcurrentLinkedQueue<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(GlobalSpeedMeter.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public void attachSpeedMeter(SpeedMeter speed) {
|
||||
_speedmeters.add(speed);
|
||||
}
|
||||
|
||||
public void detachSpeedMeter(SpeedMeter speed) {
|
||||
_speedmeters.remove(speed);
|
||||
}
|
||||
|
||||
private long calcSpeed() {
|
||||
|
||||
long sp = 0;
|
||||
|
||||
for(SpeedMeter speed:_speedmeters)
|
||||
{
|
||||
sp+=speed.getLastSpeed();
|
||||
}
|
||||
|
||||
return sp;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
long sp;
|
||||
|
||||
swingReflectionInvoke("setText", _speed_label, "------");
|
||||
swingReflectionInvoke("setVisible", _speed_label, true);
|
||||
|
||||
while(true)
|
||||
{
|
||||
secureWait();
|
||||
|
||||
sp = calcSpeed();
|
||||
|
||||
if(sp > 0) {
|
||||
|
||||
swingReflectionInvoke("setText", _speed_label, formatBytes(sp)+"/s");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
swingReflectionInvoke("setText", _speed_label, "------");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
BIN
src/megabasterd/Gochi.ttf
Normal file
333
src/megabasterd/KissVideoStreamServer.java
Normal file
@ -0,0 +1,333 @@
|
||||
package megabasterd;
|
||||
|
||||
import com.sun.net.httpserver.HttpServer;
|
||||
import java.awt.Color;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
|
||||
|
||||
public final class KissVideoStreamServer {
|
||||
|
||||
public static final int TIMEOUT=30000;
|
||||
public static final int DEFAULT_PORT=1337;
|
||||
public static final int EXP_BACKOFF_BASE=2;
|
||||
public static final int EXP_BACKOFF_SECS_RETRY=1;
|
||||
public static final int EXP_BACKOFF_MAX_WAIT_TIME=128;
|
||||
private HttpServer _httpserver;
|
||||
private final MainPanelView _main_panel;
|
||||
private final ConcurrentHashMap<String, String[]> _link_cache;
|
||||
private final ConcurrentHashMap<Thread, Boolean> _working;
|
||||
private final ContentType _ctype;
|
||||
private KissVideoStreamServerHandler _http_handler;
|
||||
public KissVideoStreamServer(MainPanelView panel) {
|
||||
_main_panel = panel;
|
||||
_link_cache = new ConcurrentHashMap();
|
||||
_working = new ConcurrentHashMap();
|
||||
_ctype = new ContentType();
|
||||
}
|
||||
|
||||
public KissVideoStreamServerHandler getHandler()
|
||||
{
|
||||
return _http_handler;
|
||||
}
|
||||
|
||||
public MainPanelView getPanel()
|
||||
{
|
||||
return _main_panel;
|
||||
}
|
||||
|
||||
public ContentType getCtype()
|
||||
{
|
||||
return _ctype;
|
||||
}
|
||||
|
||||
public ConcurrentHashMap getStreaming()
|
||||
{
|
||||
return _working;
|
||||
}
|
||||
|
||||
public boolean isWorking()
|
||||
{
|
||||
return !_working.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
public void start(int port, String context) throws IOException
|
||||
{
|
||||
_httpserver = HttpServer.create(new InetSocketAddress(port), 0);
|
||||
printStatusOK("Kissvideostreamer on localhost:"+DEFAULT_PORT+" (Waiting for request...)");
|
||||
_httpserver.createContext(context, (_http_handler = new KissVideoStreamServerHandler(this, _main_panel)));
|
||||
_httpserver.setExecutor(Executors.newCachedThreadPool());
|
||||
_httpserver.start();
|
||||
}
|
||||
|
||||
public void stop()
|
||||
{
|
||||
_httpserver.stop(0);
|
||||
}
|
||||
|
||||
public void printStatusError(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", _main_panel.getKiss_server_status(), Color.red);
|
||||
swingReflectionInvoke("setText", _main_panel.getKiss_server_status(), message);
|
||||
}
|
||||
|
||||
public void printStatusOK(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", _main_panel.getKiss_server_status(), new Color(0,128,0));
|
||||
swingReflectionInvoke("setText", _main_panel.getKiss_server_status(), message);
|
||||
}
|
||||
|
||||
public String[] getFromLinkCache(String link)
|
||||
{
|
||||
return _link_cache.containsKey(link)?_link_cache.get(link):null;
|
||||
}
|
||||
|
||||
public void updateLinkCache(String link, String[] info) {
|
||||
|
||||
_link_cache.put(link, info);
|
||||
}
|
||||
|
||||
public void removeFromLinkCache(String link) {
|
||||
_link_cache.remove(link);
|
||||
}
|
||||
|
||||
public String[] getMegaFileMetadata(String link, MainPanelView panel) throws IOException, InterruptedException
|
||||
{
|
||||
|
||||
|
||||
String[] file_info=null;
|
||||
int retry=0, error_code=0;
|
||||
boolean error;
|
||||
|
||||
do
|
||||
{
|
||||
error=false;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
if( findFirstRegex("://mega(\\.co)?\\.nz/", link, 0) != null)
|
||||
{
|
||||
MegaAPI ma = new MegaAPI();
|
||||
|
||||
file_info = ma.getMegaFileMetadata(link);
|
||||
}
|
||||
else
|
||||
{
|
||||
file_info = MegaCrypterAPI.getMegaFileMetadata(link, panel);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch(MegaAPIException | MegaCrypterAPIException e)
|
||||
{
|
||||
error=true;
|
||||
|
||||
error_code = Integer.parseInt(e.getMessage());
|
||||
|
||||
switch(error_code)
|
||||
{
|
||||
case -2:
|
||||
throw new IOException("Mega link is not valid!");
|
||||
|
||||
case -14:
|
||||
throw new IOException("Mega link is not valid!");
|
||||
|
||||
case 22:
|
||||
throw new IOException("MegaCrypter link is not valid!");
|
||||
|
||||
case 23:
|
||||
throw new IOException("MegaCrypter link is blocked!");
|
||||
|
||||
case 24:
|
||||
throw new IOException("MegaCrypter link has expired!");
|
||||
|
||||
default:
|
||||
|
||||
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
||||
{
|
||||
if(error_code == -18)
|
||||
{
|
||||
printStatusError("File temporarily unavailable! (Retrying in "+i+" secs...)");
|
||||
}
|
||||
else
|
||||
{
|
||||
printStatusError("Mega/MC APIException error "+e.getMessage()+" (Retrying in "+i+" secs...)");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException ex) {}
|
||||
}
|
||||
}
|
||||
} catch(Exception ex) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}while(error);
|
||||
|
||||
return file_info;
|
||||
}
|
||||
|
||||
public String getMegaFileDownloadUrl(String link, String pass_hash, String noexpire_token) throws IOException, InterruptedException
|
||||
{
|
||||
|
||||
|
||||
String dl_url=null;
|
||||
int retry=0, error_code;
|
||||
boolean error;
|
||||
|
||||
do
|
||||
{
|
||||
error=false;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
|
||||
if( findFirstRegex("://mega(\\.co)?\\.nz/", link, 0) != null)
|
||||
{
|
||||
MegaAPI ma = new MegaAPI();
|
||||
|
||||
dl_url = ma.getMegaFileDownloadUrl(link);
|
||||
}
|
||||
else
|
||||
{
|
||||
dl_url = MegaCrypterAPI.getMegaFileDownloadUrl(link,pass_hash,noexpire_token);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch(MegaAPIException e)
|
||||
{
|
||||
error=true;
|
||||
|
||||
error_code = Integer.parseInt(e.getMessage());
|
||||
|
||||
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
||||
{
|
||||
if(error_code == -18)
|
||||
{
|
||||
printStatusError("File temporarily unavailable! (Retrying in "+i+" secs...)");
|
||||
}
|
||||
else
|
||||
{
|
||||
printStatusError("MegaAPIException error "+e.getMessage()+" (Retrying in "+i+" secs...)");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException ex) {}
|
||||
}
|
||||
}
|
||||
catch(MegaCrypterAPIException e)
|
||||
{
|
||||
error=true;
|
||||
|
||||
error_code = Integer.parseInt(e.getMessage());
|
||||
|
||||
switch(error_code)
|
||||
{
|
||||
case 22:
|
||||
throw new IOException("MegaCrypter link is not valid!");
|
||||
|
||||
case 23:
|
||||
throw new IOException("MegaCrypter link is blocked!");
|
||||
|
||||
case 24:
|
||||
throw new IOException("MegaCrypter link has expired!");
|
||||
|
||||
default:
|
||||
for(long i=getWaitTimeExpBackOff(retry++); i>0; i--)
|
||||
{
|
||||
if(error_code == -18)
|
||||
{
|
||||
printStatusError("File temporarily unavailable! (Retrying in "+i+" secs...)");
|
||||
}
|
||||
else
|
||||
{
|
||||
printStatusError("MegaCrypterAPIException error "+e.getMessage()+" (Retrying in "+i+" secs...)");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException ex) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}while(error);
|
||||
|
||||
return dl_url;
|
||||
}
|
||||
|
||||
public boolean checkDownloadUrl(String string_url)
|
||||
{
|
||||
try {
|
||||
URL url = new URL(string_url+"/0-0");
|
||||
URLConnection connection = url.openConnection();
|
||||
connection.setConnectTimeout(TIMEOUT);
|
||||
connection.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
||||
connection.setRequestProperty("Connection", "close");
|
||||
try (InputStream is = connection.getInputStream()) {
|
||||
while(is.read()!=-1);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}catch (Exception ex) {
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public long[] parseRangeHeader(String header)
|
||||
{
|
||||
Pattern pattern = Pattern.compile("bytes\\=([0-9]+)\\-([0-9]+)?");
|
||||
|
||||
Matcher matcher = pattern.matcher(header);
|
||||
|
||||
long[] ranges=new long[2];
|
||||
|
||||
if(matcher.find())
|
||||
{
|
||||
ranges[0] = Long.valueOf(matcher.group(1));
|
||||
|
||||
if(matcher.group(2)!=null) {
|
||||
ranges[1] = Long.valueOf(matcher.group(2));
|
||||
} else
|
||||
{
|
||||
ranges[1]=-1;
|
||||
}
|
||||
}
|
||||
|
||||
return ranges;
|
||||
}
|
||||
|
||||
public String cookRangeUrl(String url, long[] ranges, int sync_bytes)
|
||||
{
|
||||
return url+"/"+String.valueOf(ranges[0]-sync_bytes)+(ranges[1]>=0?"-"+String.valueOf(ranges[1]):"");
|
||||
}
|
||||
|
||||
public void restoreMainWindow() {
|
||||
|
||||
_main_panel.setExtendedState(javax.swing.JFrame.NORMAL);
|
||||
swingReflectionInvoke("setVisible", _main_panel, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
301
src/megabasterd/KissVideoStreamServerHandler.java
Normal file
@ -0,0 +1,301 @@
|
||||
package megabasterd;
|
||||
|
||||
import com.sun.net.httpserver.Headers;
|
||||
import com.sun.net.httpserver.HttpExchange;
|
||||
import com.sun.net.httpserver.HttpHandler;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.crypto.CipherInputStream;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import static megabasterd.KissVideoStreamServer.DEFAULT_PORT;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
|
||||
|
||||
public final class KissVideoStreamServerHandler implements HttpHandler {
|
||||
|
||||
private final KissVideoStreamServer _httpserver;
|
||||
|
||||
private final MainPanelView _view;
|
||||
|
||||
private String _file_name;
|
||||
|
||||
private long _file_size;
|
||||
|
||||
private String _file_key;
|
||||
|
||||
private String _pass_hash;
|
||||
|
||||
private String _noexpire_token;
|
||||
|
||||
public KissVideoStreamServerHandler(KissVideoStreamServer server, MainPanelView view) {
|
||||
|
||||
_httpserver = server;
|
||||
_view = view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(HttpExchange xchg) throws IOException {
|
||||
|
||||
_httpserver.getStreaming().put(Thread.currentThread(), true);
|
||||
|
||||
long clength;
|
||||
|
||||
OutputStream os;
|
||||
|
||||
CipherInputStream cis = null;
|
||||
|
||||
String httpmethod = xchg.getRequestMethod();
|
||||
|
||||
_httpserver.printStatusOK("Kissvideostreamer (Request received! Dispatching it...)");
|
||||
|
||||
Headers reqheaders=xchg.getRequestHeaders();
|
||||
|
||||
Headers resheaders = xchg.getResponseHeaders();
|
||||
|
||||
String url_path = xchg.getRequestURI().getPath();
|
||||
|
||||
String link = url_path.substring(url_path.indexOf("/video/")+7);
|
||||
|
||||
if(link.indexOf("mega/") == 0)
|
||||
{
|
||||
link = link.replaceAll("mega/", "https://mega.co.nz/#");
|
||||
}
|
||||
else
|
||||
{
|
||||
String mc_host = findFirstRegex("^[^/]+/", link, 0);
|
||||
|
||||
link = "http://" + mc_host + link;
|
||||
}
|
||||
|
||||
_httpserver.printStatusOK("Kissvideostreamer (Retrieving file metadata...)");
|
||||
|
||||
String[] cache_info, file_info=null;
|
||||
|
||||
cache_info = _httpserver.getFromLinkCache(link);
|
||||
|
||||
if(cache_info!=null) {
|
||||
|
||||
file_info = new String[6];
|
||||
|
||||
System.arraycopy( cache_info, 0, file_info, 0, cache_info.length );
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
|
||||
file_info = _httpserver.getMegaFileMetadata(link, _view);
|
||||
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(KissVideoStreamServerHandler.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
cache_info = new String[6];
|
||||
|
||||
System.arraycopy( file_info, 0, cache_info, 0, file_info.length );
|
||||
|
||||
cache_info[5]=null;
|
||||
}
|
||||
|
||||
_file_name = file_info[0];
|
||||
|
||||
_file_size = Long.parseLong(file_info[1]);
|
||||
|
||||
_file_key = file_info[2];
|
||||
|
||||
if(file_info.length >= 5)
|
||||
{
|
||||
_pass_hash = file_info[3];
|
||||
|
||||
_noexpire_token = file_info[4];
|
||||
|
||||
} else {
|
||||
_pass_hash = null;
|
||||
|
||||
_noexpire_token = null;
|
||||
}
|
||||
|
||||
String file_ext = _file_name.substring(_file_name.lastIndexOf('.')+1).toLowerCase();
|
||||
|
||||
URLConnection urlConn;
|
||||
|
||||
try{
|
||||
|
||||
if(httpmethod.equals("HEAD")) {
|
||||
|
||||
resheaders.add("Accept-Ranges", "bytes");
|
||||
|
||||
resheaders.add("transferMode.dlna.org", "Streaming");
|
||||
|
||||
resheaders.add("contentFeatures.dlna.org", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000");
|
||||
|
||||
resheaders.add("Content-Type", _httpserver.getCtype().getMIME(file_ext));
|
||||
|
||||
resheaders.add("Content-Length", String.valueOf(_file_size));
|
||||
|
||||
resheaders.add("Connection", "close");
|
||||
|
||||
xchg.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0);
|
||||
|
||||
} else if(httpmethod.equals("GET")) {
|
||||
|
||||
resheaders.add("Accept-Ranges", "bytes");
|
||||
|
||||
resheaders.add("transferMode.dlna.org", "Streaming");
|
||||
|
||||
resheaders.add("contentFeatures.dlna.org", "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000");
|
||||
|
||||
resheaders.add("Content-Type", _httpserver.getCtype().getMIME(file_ext));
|
||||
|
||||
resheaders.add("Connection", "close");
|
||||
|
||||
byte[] buffer = new byte[16*1024];
|
||||
|
||||
int reads;
|
||||
|
||||
_httpserver.printStatusOK("Kissvideostreamer (Retrieving mega temp url...)");
|
||||
|
||||
String temp_url;
|
||||
|
||||
if(cache_info[5]!=null) {
|
||||
|
||||
temp_url = cache_info[5];
|
||||
|
||||
if(!_httpserver.checkDownloadUrl(temp_url)) {
|
||||
|
||||
temp_url = _httpserver.getMegaFileDownloadUrl(link,_pass_hash,_noexpire_token);
|
||||
|
||||
cache_info[5] = temp_url;
|
||||
|
||||
_httpserver.updateLinkCache(link, cache_info);
|
||||
}
|
||||
|
||||
} else {
|
||||
temp_url = _httpserver.getMegaFileDownloadUrl(link,_pass_hash,_noexpire_token);
|
||||
|
||||
cache_info[5] = temp_url;
|
||||
|
||||
_httpserver.updateLinkCache(link, cache_info);
|
||||
}
|
||||
|
||||
_httpserver.printStatusOK("Kissvideostreamer (Connecting...)");
|
||||
|
||||
long[] ranges=new long[2];
|
||||
|
||||
int sync_bytes=0;
|
||||
|
||||
String header_range=null;
|
||||
|
||||
InputStream is;
|
||||
|
||||
URL url;
|
||||
|
||||
if(reqheaders.containsKey("Range"))
|
||||
{
|
||||
header_range = "Range";
|
||||
|
||||
} else if(reqheaders.containsKey("range")) {
|
||||
|
||||
header_range = "range";
|
||||
}
|
||||
|
||||
if(header_range != null)
|
||||
{
|
||||
List<String> ranges_raw = reqheaders.get(header_range);
|
||||
|
||||
String range_header=ranges_raw.get(0);
|
||||
|
||||
ranges = _httpserver.parseRangeHeader(range_header);
|
||||
|
||||
sync_bytes = (int)ranges[0] % 16;
|
||||
|
||||
if(ranges[1]>=0 && ranges[1]>=ranges[0]) {
|
||||
|
||||
clength = ranges[1]-ranges[0]+1;
|
||||
|
||||
} else {
|
||||
|
||||
clength = _file_size - ranges[0];
|
||||
}
|
||||
|
||||
resheaders.add("Content-Range", "bytes "+ranges[0]+"-"+(ranges[1]>=0?ranges[1]:(_file_size-1))+"/"+_file_size);
|
||||
|
||||
xchg.sendResponseHeaders(HttpURLConnection.HTTP_PARTIAL, clength);
|
||||
|
||||
url = new URL(_httpserver.cookRangeUrl(temp_url, ranges, sync_bytes));
|
||||
|
||||
} else {
|
||||
|
||||
xchg.sendResponseHeaders(HttpURLConnection.HTTP_OK, _file_size);
|
||||
|
||||
url = new URL(temp_url);
|
||||
}
|
||||
|
||||
urlConn = url.openConnection();
|
||||
urlConn.setConnectTimeout(KissVideoStreamServer.TIMEOUT);
|
||||
urlConn.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
||||
urlConn.setRequestProperty("Connection", "close");
|
||||
is = urlConn.getInputStream();
|
||||
|
||||
byte[] iv = CryptTools.initMEGALinkKeyIV(_file_key);
|
||||
|
||||
try {
|
||||
|
||||
cis = new CipherInputStream(is, CryptTools.genDecrypter("AES", "AES/CTR/NoPadding", CryptTools.initMEGALinkKey(_file_key), (header_range!=null && (ranges[0]-sync_bytes)>0)?CryptTools.forwardMEGALinkKeyIV(iv, ranges[0]-sync_bytes):iv));
|
||||
|
||||
} catch ( NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException ex) {
|
||||
Logger.getLogger(KissVideoStreamServer.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
os = xchg.getResponseBody();
|
||||
|
||||
_httpserver.printStatusOK("Kissvideostreamer (Streaming file "+_file_name+" ...)");
|
||||
|
||||
//Skip sync bytes
|
||||
cis.skip(sync_bytes);
|
||||
|
||||
while((reads=cis.read(buffer))!=-1) {
|
||||
|
||||
os.write(buffer, 0, reads);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
if(cis!=null) {
|
||||
cis.close();
|
||||
}
|
||||
|
||||
xchg.close();
|
||||
|
||||
_httpserver.printStatusOK("Kissvideostreamer on localhost:"+DEFAULT_PORT+" (Waiting for request...)");
|
||||
|
||||
_httpserver.getStreaming().remove(Thread.currentThread());
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(KissVideoStreamServerHandler.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
if(!_httpserver.isWorking()) {
|
||||
|
||||
_httpserver.restoreMainWindow();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
154
src/megabasterd/LinkGrabberDialog.form
Normal file
@ -0,0 +1,154 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="title" type="java.lang.String" value="LinkGrabber"/>
|
||||
<Property name="modal" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="links_scrollpane" alignment="1" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="links_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="change_dir_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="down_dir_to_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="download_dir_label" min="-2" pref="404" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" pref="300" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="links_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="links_scrollpane" pref="282" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="dance_button" min="-2" pref="37" max="-2" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="change_dir_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="down_dir_to_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="download_dir_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="5" pref="5" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="links_scrollpane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTextArea" name="links_textarea">
|
||||
<Properties>
|
||||
<Property name="columns" type="int" value="20"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="rows" type="int" value="5"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_AddingCodePost" type="java.lang.String" value="links_textarea.addMouseListener(new ContextMenuMouseListener());"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="dance_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="cc" red="66" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="24" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Let's dance, baby"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="dance_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="links_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Put your MEGA/MegaCrypter link/s here (one per line):"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="change_dir_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Change it"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="change_dir_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="down_dir_to_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Download to: "/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="download_dir_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="jLabel3"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
202
src/megabasterd/LinkGrabberDialog.java
Normal file
@ -0,0 +1,202 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.File;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JTextArea;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MiscTools.extractMegaLinksFromString;
|
||||
import static megabasterd.MiscTools.extractStringFromClipboardContents;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.truncateText;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
|
||||
public final class LinkGrabberDialog extends javax.swing.JDialog implements ClipboardChangeObserver {
|
||||
|
||||
private boolean _download;
|
||||
private String _download_path;
|
||||
private final ClipboardSpy _clipboardpy;
|
||||
|
||||
public boolean isDownload() {
|
||||
return _download;
|
||||
}
|
||||
|
||||
public String getDownload_path() {
|
||||
return _download_path;
|
||||
}
|
||||
|
||||
public JTextArea getLinks_textarea() {
|
||||
return links_textarea;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public LinkGrabberDialog(java.awt.Frame parent, boolean modal, String download_path, ClipboardSpy clipboardspy) {
|
||||
|
||||
super(parent, modal);
|
||||
_download = false;
|
||||
|
||||
initComponents();
|
||||
|
||||
updateFont(links_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(dance_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(down_dir_to_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(change_dir_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(download_dir_label, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
_download_path = download_path;
|
||||
|
||||
_clipboardpy = clipboardspy;
|
||||
|
||||
swingReflectionInvoke("setText", download_dir_label, truncateText(download_path,80));
|
||||
|
||||
swingReflectionInvoke("setText", links_textarea,extractMegaLinksFromString(extractStringFromClipboardContents(_clipboardpy.getContents())));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
links_scrollpane = new javax.swing.JScrollPane();
|
||||
links_textarea = new javax.swing.JTextArea();
|
||||
dance_button = new javax.swing.JButton();
|
||||
links_label = new javax.swing.JLabel();
|
||||
change_dir_button = new javax.swing.JButton();
|
||||
down_dir_to_label = new javax.swing.JLabel();
|
||||
download_dir_label = new javax.swing.JLabel();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setTitle("LinkGrabber");
|
||||
setModal(true);
|
||||
|
||||
links_textarea.setColumns(20);
|
||||
links_textarea.setFont(new java.awt.Font("Dialog", 0, 14)); // NOI18N
|
||||
links_textarea.setRows(5);
|
||||
links_textarea.setDoubleBuffered(true);
|
||||
links_scrollpane.setViewportView(links_textarea);
|
||||
links_textarea.addMouseListener(new ContextMenuMouseListener());
|
||||
|
||||
dance_button.setBackground(new java.awt.Color(102, 204, 255));
|
||||
dance_button.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
|
||||
dance_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
dance_button.setText("Let's dance, baby");
|
||||
dance_button.setDoubleBuffered(true);
|
||||
dance_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
dance_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
links_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
links_label.setText("Put your MEGA/MegaCrypter link/s here (one per line):");
|
||||
links_label.setDoubleBuffered(true);
|
||||
|
||||
change_dir_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
change_dir_button.setText("Change it");
|
||||
change_dir_button.setDoubleBuffered(true);
|
||||
change_dir_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
change_dir_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
down_dir_to_label.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
down_dir_to_label.setText("Download to: ");
|
||||
down_dir_to_label.setDoubleBuffered(true);
|
||||
|
||||
download_dir_label.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
download_dir_label.setText("jLabel3");
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(links_scrollpane, javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(links_label)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(change_dir_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(down_dir_to_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(download_dir_label, javax.swing.GroupLayout.PREFERRED_SIZE, 404, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(dance_button, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(links_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(links_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(dance_button, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(change_dir_button)
|
||||
.addComponent(down_dir_to_label)
|
||||
.addComponent(download_dir_label))
|
||||
.addGap(5, 5, 5)))
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void dance_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dance_buttonActionPerformed
|
||||
|
||||
_download=true;
|
||||
dispose();
|
||||
}//GEN-LAST:event_dance_buttonActionPerformed
|
||||
|
||||
private void change_dir_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_change_dir_buttonActionPerformed
|
||||
|
||||
|
||||
javax.swing.JFileChooser filechooser = new javax.swing.JFileChooser();
|
||||
|
||||
filechooser.setCurrentDirectory(new java.io.File(_download_path));
|
||||
filechooser.setDialogTitle("Download directory");
|
||||
filechooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
|
||||
filechooser.setAcceptAllFileFilterUsed(false);
|
||||
|
||||
if( filechooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {
|
||||
|
||||
File file = filechooser.getSelectedFile();
|
||||
|
||||
_download_path = file.getAbsolutePath();
|
||||
|
||||
swingReflectionInvoke("setText", download_dir_label, truncateText(_download_path,80));
|
||||
}
|
||||
}//GEN-LAST:event_change_dir_buttonActionPerformed
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton change_dir_button;
|
||||
private javax.swing.JButton dance_button;
|
||||
private javax.swing.JLabel down_dir_to_label;
|
||||
private javax.swing.JLabel download_dir_label;
|
||||
private javax.swing.JLabel links_label;
|
||||
private javax.swing.JScrollPane links_scrollpane;
|
||||
private javax.swing.JTextArea links_textarea;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override
|
||||
public void notifyClipboardChange() {
|
||||
|
||||
swingReflectionInvoke("setText", links_textarea,extractMegaLinksFromString(extractStringFromClipboardContents(_clipboardpy.getContents())));
|
||||
}
|
||||
}
|
629
src/megabasterd/MainPanel.java
Normal file
@ -0,0 +1,629 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.AWTException;
|
||||
import static java.awt.EventQueue.invokeLater;
|
||||
import java.awt.Font;
|
||||
import static java.awt.Font.BOLD;
|
||||
import static java.awt.Frame.NORMAL;
|
||||
import java.awt.Image;
|
||||
import java.awt.MenuItem;
|
||||
import java.awt.PopupMenu;
|
||||
import java.awt.SystemTray;
|
||||
import static java.awt.SystemTray.getSystemTray;
|
||||
import static java.awt.SystemTray.isSupported;
|
||||
import java.awt.Toolkit;
|
||||
import static java.awt.Toolkit.getDefaultToolkit;
|
||||
import java.awt.TrayIcon;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowEvent;
|
||||
import static java.awt.event.WindowEvent.WINDOW_CLOSING;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import static java.lang.Integer.parseInt;
|
||||
import static java.lang.System.exit;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import static java.util.concurrent.Executors.newCachedThreadPool;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static javax.swing.JOptionPane.QUESTION_MESSAGE;
|
||||
import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
|
||||
import static javax.swing.JOptionPane.showOptionDialog;
|
||||
import static megabasterd.DBTools.deleteUpload;
|
||||
import static megabasterd.DBTools.selectDownloads;
|
||||
import static megabasterd.DBTools.selectMegaAccounts;
|
||||
import static megabasterd.DBTools.selectSettingValueFromDB;
|
||||
import static megabasterd.DBTools.selectUploads;
|
||||
import static megabasterd.DBTools.setupSqliteTables;
|
||||
import static megabasterd.KissVideoStreamServer.DEFAULT_PORT;
|
||||
import static megabasterd.MiscTools.BASE642Bin;
|
||||
import static megabasterd.MiscTools.bin2i32a;
|
||||
import static megabasterd.MiscTools.createAndRegisterFont;
|
||||
import static megabasterd.MiscTools.setNimbusLookAndFeel;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWait;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWaitForReturn;
|
||||
import static megabasterd.Transference.LIMIT_TRANSFERENCE_SPEED_DEFAULT;
|
||||
import static megabasterd.Transference.MAX_SIM_TRANSFERENCES;
|
||||
import static megabasterd.Transference.MAX_TRANSFERENCE_SPEED_DEFAULT;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class MainPanel {
|
||||
|
||||
public static final String VERSION="1.0";
|
||||
public static final String LOCK_FILE="megabasterd.lock";
|
||||
public static final String USER_AGENT="Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0";
|
||||
public static final int CONNECTION_TIMEOUT = 30000;
|
||||
public static final int THROTTLE_SLICE_SIZE=16*1024;
|
||||
public static final ExecutorService THREAD_POOL = newCachedThreadPool();
|
||||
public static final Font FONT_DEFAULT = createAndRegisterFont("Gochi.ttf");
|
||||
public static void main(String args[]) {
|
||||
|
||||
setNimbusLookAndFeel();
|
||||
|
||||
final MainPanel main_panel = new MainPanel();
|
||||
|
||||
invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
main_panel.getView().setVisible(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private MainPanelView _view;
|
||||
private final GlobalSpeedMeter _global_dl_speed, _global_up_speed;
|
||||
private final DownloadManager _download_manager;
|
||||
private final UploadManager _upload_manager;
|
||||
private final StreamThrottlerSupervisor _stream_supervisor;
|
||||
private int _max_dl, _max_ul, _default_slots_down, _default_slots_up, _max_dl_speed, _max_up_speed;
|
||||
private boolean _use_slots_down, _use_slots_up, _limit_download_speed, _limit_upload_speed;
|
||||
private String _default_download_path;
|
||||
private HashMap<String, Object> _mega_accounts;
|
||||
private final HashMap<String, MegaAPI> _mega_active_accounts;
|
||||
private TrayIcon _trayicon;
|
||||
private final ClipboardSpy _clipboardspy;
|
||||
private KissVideoStreamServer _streamserver;
|
||||
public MainPanel() {
|
||||
|
||||
checkAppIsRunning();
|
||||
|
||||
try {
|
||||
|
||||
trayIcon();
|
||||
|
||||
} catch (AWTException ex) {
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
setupSqliteTables();
|
||||
|
||||
} catch (SQLException ex) {
|
||||
getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
_view = null; //Lazy init (getter!)
|
||||
|
||||
loadUserSettings();
|
||||
|
||||
_mega_active_accounts = new HashMap<>();
|
||||
|
||||
THREAD_POOL.execute((_global_dl_speed = new GlobalSpeedMeter(getView().getGlobal_speed_down_label())));
|
||||
|
||||
THREAD_POOL.execute((_global_up_speed = new GlobalSpeedMeter(getView().getGlobal_speed_up_label())));
|
||||
|
||||
THREAD_POOL.execute((_download_manager = new DownloadManager(this)));
|
||||
|
||||
THREAD_POOL.execute((_upload_manager = new UploadManager(this)));
|
||||
|
||||
THREAD_POOL.execute((_stream_supervisor = new StreamThrottlerSupervisor(_limit_download_speed?_max_dl_speed*1024:0, _limit_upload_speed?_max_up_speed*1024:0, THROTTLE_SLICE_SIZE)));
|
||||
|
||||
THREAD_POOL.execute((_clipboardspy = new ClipboardSpy()));
|
||||
|
||||
resumeDownloads();
|
||||
|
||||
resumeUploads();
|
||||
|
||||
_streamserver = new KissVideoStreamServer(getView());
|
||||
|
||||
try {
|
||||
_streamserver.start(DEFAULT_PORT, "/video");
|
||||
} catch (IOException ex) {
|
||||
getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
public MainPanelView getView() {
|
||||
return _view == null?(_view = new MainPanelView(this)):_view;
|
||||
}
|
||||
|
||||
public GlobalSpeedMeter getGlobal_dl_speed() {
|
||||
return _global_dl_speed;
|
||||
}
|
||||
|
||||
public GlobalSpeedMeter getGlobal_up_speed() {
|
||||
return _global_up_speed;
|
||||
}
|
||||
|
||||
public DownloadManager getDownload_manager() {
|
||||
return _download_manager;
|
||||
}
|
||||
|
||||
public UploadManager getUpload_manager() {
|
||||
return _upload_manager;
|
||||
}
|
||||
|
||||
public StreamThrottlerSupervisor getStream_supervisor() {
|
||||
return _stream_supervisor;
|
||||
}
|
||||
|
||||
public int getMax_dl() {
|
||||
return _max_dl;
|
||||
}
|
||||
|
||||
public int getMax_ul() {
|
||||
return _max_ul;
|
||||
}
|
||||
|
||||
public int getDefault_slots_down() {
|
||||
return _default_slots_down;
|
||||
}
|
||||
|
||||
public int getDefault_slots_up() {
|
||||
return _default_slots_up;
|
||||
}
|
||||
|
||||
public boolean isUse_slots_down() {
|
||||
return _use_slots_down;
|
||||
}
|
||||
|
||||
public String getDefault_download_path() {
|
||||
return _default_download_path;
|
||||
}
|
||||
|
||||
public HashMap<String, Object> getMega_accounts() {
|
||||
return _mega_accounts;
|
||||
}
|
||||
|
||||
public HashMap<String, MegaAPI> getMega_active_accounts() {
|
||||
return _mega_active_accounts;
|
||||
}
|
||||
|
||||
public TrayIcon getIcon() {
|
||||
return _trayicon;
|
||||
}
|
||||
|
||||
public ClipboardSpy getClipboardspy() {
|
||||
return _clipboardspy;
|
||||
}
|
||||
|
||||
public KissVideoStreamServer getStreamserver() {
|
||||
return _streamserver;
|
||||
}
|
||||
|
||||
public boolean isUse_slots_up() {
|
||||
return _use_slots_up;
|
||||
}
|
||||
|
||||
public int getMax_dl_speed() {
|
||||
return _max_dl_speed;
|
||||
}
|
||||
|
||||
public int getMax_up_speed() {
|
||||
return _max_up_speed;
|
||||
}
|
||||
|
||||
public boolean isLimit_download_speed() {
|
||||
return _limit_download_speed;
|
||||
}
|
||||
|
||||
public boolean isLimit_upload_speed() {
|
||||
return _limit_upload_speed;
|
||||
}
|
||||
|
||||
|
||||
public void loadUserSettings()
|
||||
{
|
||||
String def_slots = selectSettingValueFromDB("default_slots_down");
|
||||
|
||||
if(def_slots != null) {
|
||||
_default_slots_down = parseInt(def_slots);
|
||||
} else {
|
||||
_default_slots_down = Download.WORKERS_DEFAULT;
|
||||
}
|
||||
|
||||
def_slots = selectSettingValueFromDB("default_slots_up");
|
||||
|
||||
if(def_slots != null) {
|
||||
_default_slots_up = parseInt(def_slots);
|
||||
} else {
|
||||
_default_slots_up = Upload.WORKERS_DEFAULT;
|
||||
}
|
||||
|
||||
String use_slots = selectSettingValueFromDB("use_slots_down");
|
||||
|
||||
if(use_slots != null) {
|
||||
_use_slots_down = use_slots.equals("yes");
|
||||
} else {
|
||||
_use_slots_down = Download.USE_SLOTS_DEFAULT;
|
||||
}
|
||||
|
||||
use_slots = selectSettingValueFromDB("use_slots_up");
|
||||
|
||||
if(use_slots != null) {
|
||||
_use_slots_up = use_slots.equals("yes");
|
||||
} else {
|
||||
_use_slots_up = Upload.USE_SLOTS_DEFAULT;
|
||||
}
|
||||
|
||||
String max_downloads = selectSettingValueFromDB("max_downloads");
|
||||
|
||||
if(max_downloads != null) {
|
||||
_max_dl = parseInt(max_downloads);
|
||||
} else {
|
||||
_max_dl=MAX_SIM_TRANSFERENCES;
|
||||
}
|
||||
|
||||
String max_uploads = selectSettingValueFromDB("max_uploads");
|
||||
|
||||
if(max_uploads != null) {
|
||||
_max_ul = parseInt(max_uploads);
|
||||
} else {
|
||||
_max_ul=MAX_SIM_TRANSFERENCES;
|
||||
}
|
||||
|
||||
_default_download_path = selectSettingValueFromDB("default_down_dir");
|
||||
|
||||
if(_default_download_path == null) {
|
||||
_default_download_path = ".";
|
||||
}
|
||||
|
||||
String limit_dl_speed = selectSettingValueFromDB("limit_download_speed");
|
||||
|
||||
if(limit_dl_speed != null) {
|
||||
|
||||
_limit_download_speed = limit_dl_speed.equals("yes");
|
||||
|
||||
} else {
|
||||
|
||||
_limit_download_speed = LIMIT_TRANSFERENCE_SPEED_DEFAULT;
|
||||
}
|
||||
|
||||
String limit_ul_speed = selectSettingValueFromDB("limit_upload_speed");
|
||||
|
||||
if(limit_ul_speed != null) {
|
||||
|
||||
_limit_upload_speed = limit_ul_speed.equals("yes");
|
||||
|
||||
} else {
|
||||
|
||||
_limit_upload_speed = LIMIT_TRANSFERENCE_SPEED_DEFAULT;
|
||||
}
|
||||
|
||||
String max_download_speed = selectSettingValueFromDB("max_download_speed");
|
||||
|
||||
if(max_download_speed != null) {
|
||||
_max_dl_speed = parseInt(max_download_speed);
|
||||
} else {
|
||||
_max_dl_speed=MAX_TRANSFERENCE_SPEED_DEFAULT;
|
||||
}
|
||||
|
||||
String max_upload_speed = selectSettingValueFromDB("max_upload_speed");
|
||||
|
||||
if(max_upload_speed != null) {
|
||||
_max_up_speed = parseInt(max_upload_speed);
|
||||
} else {
|
||||
_max_up_speed=MAX_TRANSFERENCE_SPEED_DEFAULT;
|
||||
}
|
||||
|
||||
try {
|
||||
_mega_accounts = selectMegaAccounts();
|
||||
} catch (SQLException ex) {
|
||||
getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void _byebye() {
|
||||
|
||||
if(_streamserver.isWorking()) {
|
||||
|
||||
Object[] options = {"No",
|
||||
"Yes"};
|
||||
|
||||
int n = showOptionDialog(getView(),
|
||||
"It seems MegaBasterd is streaming video. Do you want to exit?",
|
||||
"Warning!", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
|
||||
if(n==1) {
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
} else if(!getDownload_manager().getTransference_provision_queue().isEmpty() || !getUpload_manager().getTransference_provision_queue().isEmpty()) {
|
||||
|
||||
Object[] options = {"No",
|
||||
"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,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
|
||||
if(n==1) {
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
exit(0);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void checkAppIsRunning()
|
||||
{
|
||||
File lock = new File(LOCK_FILE);
|
||||
|
||||
if(lock.exists()) {
|
||||
|
||||
Object[] options = {"Yes, load it anyway",
|
||||
"No"};
|
||||
|
||||
int n = showOptionDialog(getView(),
|
||||
"It seems MegaBasterd is already running. Do you want to continue?",
|
||||
"Warning!", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[1]);
|
||||
|
||||
if(n==1) {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
lock.createNewFile();
|
||||
|
||||
lock.deleteOnExit();
|
||||
|
||||
} catch (IOException ex) {
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void resumeDownloads() {
|
||||
|
||||
swingReflectionInvoke("setText", getView().getStatus_down_label(), "Resuming previous downloads, please wait...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", getView().getNew_download_menu(), false);
|
||||
|
||||
final MainPanel main =this;
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
int conta_downloads = 0;
|
||||
|
||||
try {
|
||||
|
||||
ArrayList<HashMap<String,Object>> res = selectDownloads();
|
||||
|
||||
for(HashMap<String,Object> o:res) {
|
||||
|
||||
Download download = new Download(main, (String)o.get("url"), (String)o.get("path"), (String)o.get("filename"), (String)o.get("filekey"), (Long)o.get("filesize"), (String)o.get("filepass"), (String)o.get("filenoexpire"), main._use_slots_down, main._default_slots_down, false);
|
||||
|
||||
main.getDownload_manager().getTransference_provision_queue().add(download);
|
||||
|
||||
conta_downloads++;
|
||||
}
|
||||
|
||||
} catch (SQLException ex) {
|
||||
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
if(conta_downloads>0) {
|
||||
|
||||
swingReflectionInvoke("setText", main.getView().getStatus_down_label(), "Starting downloads provisioning, please wait...");
|
||||
|
||||
main.getDownload_manager().secureNotify();
|
||||
|
||||
main.getView().getjTabbedPane1().setSelectedIndex(0);
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.getView().getNew_download_menu(), true);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", main.getView().getStatus_down_label(), "");
|
||||
|
||||
|
||||
}});
|
||||
|
||||
}
|
||||
|
||||
public boolean trayIcon() throws AWTException {
|
||||
|
||||
if (!isSupported()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SystemTray tray = getSystemTray();
|
||||
|
||||
Toolkit toolkit = getDefaultToolkit();
|
||||
|
||||
Image image = toolkit.getImage(getClass().getResource("pica_roja.png"));
|
||||
|
||||
PopupMenu menu = new PopupMenu();
|
||||
|
||||
menu.setFont(FONT_DEFAULT.deriveFont(BOLD, 18));
|
||||
|
||||
final javax.swing.JFrame myframe = getView();
|
||||
|
||||
MenuItem messageItem = new MenuItem("Restore window");
|
||||
|
||||
messageItem.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
|
||||
swingReflectionInvokeAndWait("setExtendedState", myframe, NORMAL);
|
||||
|
||||
swingReflectionInvoke("setVisible", myframe, true);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
menu.add(messageItem);
|
||||
|
||||
MenuItem closeItem = new MenuItem("EXIT");
|
||||
|
||||
final MainPanel main=this;
|
||||
|
||||
closeItem.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
main._byebye();
|
||||
}
|
||||
});
|
||||
|
||||
menu.add(closeItem);
|
||||
|
||||
ActionListener actionListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed( ActionEvent e ) {
|
||||
//Double click code here
|
||||
|
||||
if(!(boolean)swingReflectionInvokeAndWaitForReturn("isVisible", myframe))
|
||||
{
|
||||
swingReflectionInvokeAndWait("setExtendedState", myframe, NORMAL);
|
||||
|
||||
swingReflectionInvoke("setVisible", myframe, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
swingReflectionInvoke("dispatchEvent", myframe, new WindowEvent(myframe, WINDOW_CLOSING));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
_trayicon = new TrayIcon(image, "MegaBasterd", menu);
|
||||
|
||||
_trayicon.setToolTip("MegaBasterd " + VERSION);
|
||||
|
||||
_trayicon.setImageAutoSize(true);
|
||||
|
||||
_trayicon.addActionListener(actionListener);
|
||||
|
||||
tray.add(_trayicon);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private void resumeUploads() {
|
||||
|
||||
swingReflectionInvoke("setText", getView().getStatus_up_label(), "Resuming previous uploads, please wait...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", getView().getNew_upload_menu(), false);
|
||||
|
||||
final MainPanel main =this;
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
try {
|
||||
|
||||
int conta_uploads = 0;
|
||||
|
||||
ArrayList<HashMap<String,Object>> res = selectUploads();
|
||||
|
||||
|
||||
|
||||
for(HashMap<String,Object> o:res) {
|
||||
|
||||
String email = (String)o.get("email");
|
||||
|
||||
MegaAPI ma;
|
||||
|
||||
if(main._mega_accounts.get(email) != null) {
|
||||
|
||||
final HashMap<String,Object> account_info = (HashMap)main._mega_accounts.get(email);
|
||||
|
||||
ma = main._mega_active_accounts.get(email);
|
||||
|
||||
if(ma == null) {
|
||||
|
||||
try {
|
||||
|
||||
ma = new MegaAPI();
|
||||
|
||||
ma.login(email, bin2i32a(BASE642Bin((String)account_info.get("password_aes"))), (String)account_info.get("user_hash"));
|
||||
|
||||
main._mega_active_accounts.put(email, ma);
|
||||
|
||||
} catch (Exception ex) {
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
Upload upload = new Upload(main, ma, (String)o.get("filename"), (String)o.get("parent_node"), (String)o.get("ul_key")!=null?bin2i32a(BASE642Bin((String)o.get("ul_key"))):null, (String)o.get("url"), (String)o.get("root_node"), BASE642Bin((String)o.get("share_key")), (String)o.get("folder_link"), main._use_slots_up, main._default_slots_up, false);
|
||||
|
||||
main.getUpload_manager().getTransference_provision_queue().add(upload);
|
||||
|
||||
conta_uploads++;
|
||||
|
||||
} else {
|
||||
|
||||
deleteUpload((String)o.get("filename"), email);
|
||||
}
|
||||
}
|
||||
|
||||
if(conta_uploads>0) {
|
||||
|
||||
swingReflectionInvoke("setText", main.getView().getStatus_up_label(), "Starting uploads provisioning, please wait...");
|
||||
|
||||
main.getUpload_manager().secureNotify();
|
||||
|
||||
main.getView().getjTabbedPane1().setSelectedIndex(1);
|
||||
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", main.getView().getNew_upload_menu(), true);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", main.getView().getStatus_up_label(), "");
|
||||
|
||||
} catch (Exception ex) {
|
||||
getLogger(MainPanel.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
}});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
460
src/megabasterd/MainPanelView.form
Normal file
@ -0,0 +1,460 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||
<NonVisualComponents>
|
||||
<Menu class="javax.swing.JMenuBar" name="main_menubar">
|
||||
<SubComponents>
|
||||
<Menu class="javax.swing.JMenu" name="file_menu">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="File"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<SubComponents>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="new_download_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="New download"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="new_download_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator6">
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="new_upload_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="New upload"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="new_upload_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator1">
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="new_stream_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="New stream"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="new_stream_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator4">
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="hide_tray_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Hide to tray"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="hide_tray_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator2">
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="clean_all_down_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Remove all waiting downloads"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clean_all_down_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator5">
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="clean_all_up_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Remove all waiting uploads"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clean_all_up_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator3">
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="exit_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="EXIT"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exit_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
</SubComponents>
|
||||
</Menu>
|
||||
<Menu class="javax.swing.JMenu" name="edit_menu">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Edit"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<SubComponents>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="settings_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Settings"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="settings_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
</SubComponents>
|
||||
</Menu>
|
||||
<Menu class="javax.swing.JMenu" name="help_menu">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Help"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<SubComponents>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="about_menu">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="About"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="about_menuActionPerformed"/>
|
||||
</Events>
|
||||
</MenuItem>
|
||||
</SubComponents>
|
||||
</Menu>
|
||||
</SubComponents>
|
||||
</Menu>
|
||||
</NonVisualComponents>
|
||||
<Properties>
|
||||
<Property name="title" type="java.lang.String" value="MegaBasterd"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="menuBar" type="java.lang.String" value="main_menubar"/>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="jTabbedPane1" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="kiss_server_status" min="-2" pref="440" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="logo_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jTabbedPane1" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="kiss_server_status" min="-2" pref="11" max="-2" attributes="0"/>
|
||||
<Component id="logo_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="logo_label">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/megabasterd/mbasterd.png"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="kiss_server_status">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Container class="javax.swing.JTabbedPane" name="jTabbedPane1">
|
||||
<Properties>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="22" style="1"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="downloads_panel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Downloads">
|
||||
<Property name="tabTitle" type="java.lang.String" value="Downloads"/>
|
||||
</JTabbedPaneConstraints>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="global_speed_down_label" min="-2" pref="404" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="338" max="32767" attributes="0"/>
|
||||
<Component id="pause_all_down_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="status_down_label" max="32767" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="close_all_finished_down_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="jScrollPane_down" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||
<Component id="close_all_finished_down_button" max="32767" attributes="0"/>
|
||||
<Component id="status_down_label" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane_down" pref="277" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="global_speed_down_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pause_all_down_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="global_speed_down_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="54" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Speed"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="status_down_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="close_all_finished_down_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Close all finished"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="close_all_finished_down_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane_down">
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="jPanel_scroll_down">
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout">
|
||||
<Property name="axis" type="int" value="1"/>
|
||||
</Layout>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="pause_all_down_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="0" green="99" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="PAUSE ALL"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pause_all_down_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="uploads_panel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Uploads">
|
||||
<Property name="tabTitle" type="java.lang.String" value="Uploads"/>
|
||||
</JTabbedPaneConstraints>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="global_speed_up_label" min="-2" pref="404" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="338" max="32767" attributes="0"/>
|
||||
<Component id="pause_all_up_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="status_up_label" max="32767" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="close_all_finished_up_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="jScrollPane_up" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||
<Component id="close_all_finished_up_button" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="status_up_label" alignment="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane_up" pref="277" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="global_speed_up_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pause_all_up_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="global_speed_up_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="54" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Speed"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="status_up_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="close_all_finished_up_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Close all finished"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="close_all_finished_up_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane_up">
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="jPanel_scroll_up">
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout">
|
||||
<Property name="axis" type="int" value="1"/>
|
||||
</Layout>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="pause_all_up_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="0" green="99" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="PAUSE ALL"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pause_all_up_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Form>
|
915
src/megabasterd/MainPanelView.java
Normal file
@ -0,0 +1,915 @@
|
||||
package megabasterd;
|
||||
|
||||
|
||||
import java.awt.Color;
|
||||
import static java.awt.Font.BOLD;
|
||||
import static java.awt.Font.PLAIN;
|
||||
import java.awt.event.WindowEvent;
|
||||
import static java.awt.event.WindowEvent.WINDOW_CLOSING;
|
||||
import java.io.File;
|
||||
import static java.lang.System.out;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JMenuItem;
|
||||
import static javax.swing.JOptionPane.QUESTION_MESSAGE;
|
||||
import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
|
||||
import static javax.swing.JOptionPane.showOptionDialog;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTabbedPane;
|
||||
import static megabasterd.CryptTools.decryptMegaDownloaderLink;
|
||||
import static megabasterd.DBTools.deleteMegaAccount;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MainPanel.VERSION;
|
||||
import static megabasterd.MiscTools.BASE642Bin;
|
||||
import static megabasterd.MiscTools.bin2i32a;
|
||||
import static megabasterd.MiscTools.findAllRegex;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
import static megabasterd.MiscTools.genID;
|
||||
import static megabasterd.MiscTools.i32a2bin;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWait;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
|
||||
public final class MainPanelView extends javax.swing.JFrame {
|
||||
|
||||
private final MainPanel _main_panel;
|
||||
|
||||
public JLabel getKiss_server_status() {
|
||||
return kiss_server_status;
|
||||
}
|
||||
|
||||
public JMenuItem getClean_all_down_menu() {
|
||||
return clean_all_down_menu;
|
||||
}
|
||||
|
||||
public JMenuItem getClean_all_up_menu() {
|
||||
return clean_all_up_menu;
|
||||
}
|
||||
|
||||
public JButton getClose_all_finished_down_button() {
|
||||
return close_all_finished_down_button;
|
||||
}
|
||||
|
||||
public JButton getClose_all_finished_up() {
|
||||
return close_all_finished_up_button;
|
||||
}
|
||||
|
||||
public JLabel getGlobal_speed_down_label() {
|
||||
return global_speed_down_label;
|
||||
}
|
||||
|
||||
public JLabel getGlobal_speed_up_label() {
|
||||
return global_speed_up_label;
|
||||
}
|
||||
|
||||
public JPanel getjPanel_scroll_down() {
|
||||
return jPanel_scroll_down;
|
||||
}
|
||||
|
||||
public JPanel getjPanel_scroll_up() {
|
||||
return jPanel_scroll_up;
|
||||
}
|
||||
|
||||
public JMenuItem getNew_download_menu() {
|
||||
return new_download_menu;
|
||||
}
|
||||
|
||||
public JMenuItem getNew_upload_menu() {
|
||||
return new_upload_menu;
|
||||
}
|
||||
|
||||
public JButton getPause_all_down_button() {
|
||||
return pause_all_down_button;
|
||||
}
|
||||
|
||||
public JButton getPause_all_up() {
|
||||
return pause_all_up_button;
|
||||
}
|
||||
|
||||
public JLabel getStatus_down_label() {
|
||||
return status_down_label;
|
||||
}
|
||||
|
||||
public JLabel getStatus_up_label() {
|
||||
return status_up_label;
|
||||
}
|
||||
|
||||
public MainPanel getMain_panel() {
|
||||
return _main_panel;
|
||||
}
|
||||
|
||||
public JTabbedPane getjTabbedPane1() {
|
||||
return jTabbedPane1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public MainPanelView(MainPanel main_panel) {
|
||||
|
||||
initComponents();
|
||||
|
||||
_main_panel = main_panel;
|
||||
|
||||
setTitle("MegaBasterd " + VERSION);
|
||||
|
||||
setIconImage(new ImageIcon(getClass().getResource("pica_roja.png")).getImage());
|
||||
|
||||
updateFont(file_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(edit_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(help_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(new_download_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(exit_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(settings_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(hide_tray_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(about_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(new_stream_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(new_upload_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(clean_all_up_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(clean_all_down_menu, FONT_DEFAULT, PLAIN);
|
||||
updateFont(global_speed_down_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(global_speed_up_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(kiss_server_status, FONT_DEFAULT, BOLD);
|
||||
updateFont(status_down_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(status_up_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(close_all_finished_down_button, FONT_DEFAULT, BOLD);
|
||||
updateFont(close_all_finished_up_button, FONT_DEFAULT, BOLD);
|
||||
updateFont(pause_all_down_button, FONT_DEFAULT, BOLD);
|
||||
updateFont(pause_all_up_button, FONT_DEFAULT, BOLD);
|
||||
updateFont(jTabbedPane1, FONT_DEFAULT, PLAIN);
|
||||
|
||||
swingReflectionInvoke("setVisible", global_speed_down_label, false);
|
||||
swingReflectionInvoke("setVisible", global_speed_up_label, false);
|
||||
swingReflectionInvoke("setForeground", global_speed_down_label, getMain_panel().isLimit_download_speed()?new Color(255,0,0):new Color(0,128,255));
|
||||
swingReflectionInvoke("setForeground", global_speed_up_label, getMain_panel().isLimit_upload_speed()?new Color(255,0,0):new Color(0,128,255));
|
||||
swingReflectionInvoke("setVisible", close_all_finished_down_button, false);
|
||||
swingReflectionInvoke("setVisible", pause_all_down_button, false);
|
||||
swingReflectionInvoke("setEnabled", clean_all_down_menu, false);
|
||||
swingReflectionInvoke("setEnabled", clean_all_up_menu, false);
|
||||
|
||||
jScrollPane_down.getVerticalScrollBar().setUnitIncrement(20);
|
||||
jScrollPane_up.getVerticalScrollBar().setUnitIncrement(20);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
logo_label = new javax.swing.JLabel();
|
||||
kiss_server_status = new javax.swing.JLabel();
|
||||
jTabbedPane1 = new javax.swing.JTabbedPane();
|
||||
downloads_panel = new javax.swing.JPanel();
|
||||
global_speed_down_label = new javax.swing.JLabel();
|
||||
status_down_label = new javax.swing.JLabel();
|
||||
close_all_finished_down_button = new javax.swing.JButton();
|
||||
jScrollPane_down = new javax.swing.JScrollPane();
|
||||
jPanel_scroll_down = new javax.swing.JPanel();
|
||||
pause_all_down_button = new javax.swing.JButton();
|
||||
uploads_panel = new javax.swing.JPanel();
|
||||
global_speed_up_label = new javax.swing.JLabel();
|
||||
status_up_label = new javax.swing.JLabel();
|
||||
close_all_finished_up_button = new javax.swing.JButton();
|
||||
jScrollPane_up = new javax.swing.JScrollPane();
|
||||
jPanel_scroll_up = new javax.swing.JPanel();
|
||||
pause_all_up_button = new javax.swing.JButton();
|
||||
main_menubar = new javax.swing.JMenuBar();
|
||||
file_menu = new javax.swing.JMenu();
|
||||
new_download_menu = new javax.swing.JMenuItem();
|
||||
jSeparator6 = new javax.swing.JPopupMenu.Separator();
|
||||
new_upload_menu = new javax.swing.JMenuItem();
|
||||
jSeparator1 = new javax.swing.JPopupMenu.Separator();
|
||||
new_stream_menu = new javax.swing.JMenuItem();
|
||||
jSeparator4 = new javax.swing.JPopupMenu.Separator();
|
||||
hide_tray_menu = new javax.swing.JMenuItem();
|
||||
jSeparator2 = new javax.swing.JPopupMenu.Separator();
|
||||
clean_all_down_menu = new javax.swing.JMenuItem();
|
||||
jSeparator5 = new javax.swing.JPopupMenu.Separator();
|
||||
clean_all_up_menu = new javax.swing.JMenuItem();
|
||||
jSeparator3 = new javax.swing.JPopupMenu.Separator();
|
||||
exit_menu = new javax.swing.JMenuItem();
|
||||
edit_menu = new javax.swing.JMenu();
|
||||
settings_menu = new javax.swing.JMenuItem();
|
||||
help_menu = new javax.swing.JMenu();
|
||||
about_menu = new javax.swing.JMenuItem();
|
||||
|
||||
setTitle("MegaBasterd");
|
||||
|
||||
logo_label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/megabasterd/mbasterd.png"))); // NOI18N
|
||||
logo_label.setDoubleBuffered(true);
|
||||
|
||||
kiss_server_status.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
|
||||
kiss_server_status.setDoubleBuffered(true);
|
||||
|
||||
jTabbedPane1.setDoubleBuffered(true);
|
||||
jTabbedPane1.setFont(new java.awt.Font("Dialog", 1, 22)); // NOI18N
|
||||
|
||||
global_speed_down_label.setFont(new java.awt.Font("Dialog", 1, 54)); // NOI18N
|
||||
global_speed_down_label.setText("Speed");
|
||||
global_speed_down_label.setDoubleBuffered(true);
|
||||
|
||||
status_down_label.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
status_down_label.setDoubleBuffered(true);
|
||||
|
||||
close_all_finished_down_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
close_all_finished_down_button.setText("Close all finished");
|
||||
close_all_finished_down_button.setDoubleBuffered(true);
|
||||
close_all_finished_down_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
close_all_finished_down_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
jPanel_scroll_down.setLayout(new javax.swing.BoxLayout(jPanel_scroll_down, javax.swing.BoxLayout.Y_AXIS));
|
||||
jScrollPane_down.setViewportView(jPanel_scroll_down);
|
||||
|
||||
pause_all_down_button.setBackground(new java.awt.Color(255, 153, 0));
|
||||
pause_all_down_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
pause_all_down_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
pause_all_down_button.setText("PAUSE ALL");
|
||||
pause_all_down_button.setDoubleBuffered(true);
|
||||
pause_all_down_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
pause_all_down_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout downloads_panelLayout = new javax.swing.GroupLayout(downloads_panel);
|
||||
downloads_panel.setLayout(downloads_panelLayout);
|
||||
downloads_panelLayout.setHorizontalGroup(
|
||||
downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addComponent(global_speed_down_label, javax.swing.GroupLayout.PREFERRED_SIZE, 404, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 338, Short.MAX_VALUE)
|
||||
.addComponent(pause_all_down_button))
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(status_down_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(close_all_finished_down_button)
|
||||
.addGap(6, 6, 6))
|
||||
.addComponent(jScrollPane_down)
|
||||
);
|
||||
downloads_panelLayout.setVerticalGroup(
|
||||
downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, downloads_panelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||
.addComponent(close_all_finished_down_button, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(status_down_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jScrollPane_down, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(global_speed_down_label)
|
||||
.addComponent(pause_all_down_button)))
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab("Downloads", downloads_panel);
|
||||
|
||||
global_speed_up_label.setFont(new java.awt.Font("Dialog", 1, 54)); // NOI18N
|
||||
global_speed_up_label.setText("Speed");
|
||||
global_speed_up_label.setDoubleBuffered(true);
|
||||
|
||||
status_up_label.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
|
||||
close_all_finished_up_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
close_all_finished_up_button.setText("Close all finished");
|
||||
close_all_finished_up_button.setDoubleBuffered(true);
|
||||
close_all_finished_up_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
close_all_finished_up_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
jPanel_scroll_up.setLayout(new javax.swing.BoxLayout(jPanel_scroll_up, javax.swing.BoxLayout.Y_AXIS));
|
||||
jScrollPane_up.setViewportView(jPanel_scroll_up);
|
||||
|
||||
pause_all_up_button.setBackground(new java.awt.Color(255, 153, 0));
|
||||
pause_all_up_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
pause_all_up_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
pause_all_up_button.setText("PAUSE ALL");
|
||||
pause_all_up_button.setDoubleBuffered(true);
|
||||
pause_all_up_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
pause_all_up_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout uploads_panelLayout = new javax.swing.GroupLayout(uploads_panel);
|
||||
uploads_panel.setLayout(uploads_panelLayout);
|
||||
uploads_panelLayout.setHorizontalGroup(
|
||||
uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addComponent(global_speed_up_label, javax.swing.GroupLayout.PREFERRED_SIZE, 404, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 338, Short.MAX_VALUE)
|
||||
.addComponent(pause_all_up_button))
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(status_up_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(close_all_finished_up_button)
|
||||
.addGap(6, 6, 6))
|
||||
.addComponent(jScrollPane_up)
|
||||
);
|
||||
uploads_panelLayout.setVerticalGroup(
|
||||
uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, uploads_panelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||
.addComponent(close_all_finished_up_button, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(status_up_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jScrollPane_up, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(global_speed_up_label)
|
||||
.addComponent(pause_all_up_button)))
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab("Uploads", uploads_panel);
|
||||
|
||||
file_menu.setText("File");
|
||||
file_menu.setDoubleBuffered(true);
|
||||
file_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
|
||||
new_download_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
new_download_menu.setText("New download");
|
||||
new_download_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
new_download_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(new_download_menu);
|
||||
file_menu.add(jSeparator6);
|
||||
|
||||
new_upload_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
new_upload_menu.setText("New upload");
|
||||
new_upload_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
new_upload_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(new_upload_menu);
|
||||
file_menu.add(jSeparator1);
|
||||
|
||||
new_stream_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
new_stream_menu.setText("New stream");
|
||||
new_stream_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
new_stream_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(new_stream_menu);
|
||||
file_menu.add(jSeparator4);
|
||||
|
||||
hide_tray_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
hide_tray_menu.setText("Hide to tray");
|
||||
hide_tray_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
hide_tray_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(hide_tray_menu);
|
||||
file_menu.add(jSeparator2);
|
||||
|
||||
clean_all_down_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
clean_all_down_menu.setText("Remove all waiting downloads");
|
||||
clean_all_down_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
clean_all_down_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(clean_all_down_menu);
|
||||
file_menu.add(jSeparator5);
|
||||
|
||||
clean_all_up_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
clean_all_up_menu.setText("Remove all waiting uploads");
|
||||
clean_all_up_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
clean_all_up_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(clean_all_up_menu);
|
||||
file_menu.add(jSeparator3);
|
||||
|
||||
exit_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
exit_menu.setText("EXIT");
|
||||
exit_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
exit_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
file_menu.add(exit_menu);
|
||||
|
||||
main_menubar.add(file_menu);
|
||||
|
||||
edit_menu.setText("Edit");
|
||||
edit_menu.setDoubleBuffered(true);
|
||||
edit_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
|
||||
settings_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
settings_menu.setText("Settings");
|
||||
settings_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
settings_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
edit_menu.add(settings_menu);
|
||||
|
||||
main_menubar.add(edit_menu);
|
||||
|
||||
help_menu.setText("Help");
|
||||
help_menu.setDoubleBuffered(true);
|
||||
help_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
|
||||
about_menu.setFont(new java.awt.Font("Dialog", 0, 20)); // NOI18N
|
||||
about_menu.setText("About");
|
||||
about_menu.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
about_menuActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
help_menu.add(about_menu);
|
||||
|
||||
main_menubar.add(help_menu);
|
||||
|
||||
setJMenuBar(main_menubar);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(jTabbedPane1)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(kiss_server_status, javax.swing.GroupLayout.PREFERRED_SIZE, 440, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(logo_label)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jTabbedPane1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(kiss_server_status, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(logo_label))
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void new_download_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_download_menuActionPerformed
|
||||
|
||||
|
||||
swingReflectionInvoke("setEnabled", new_download_menu, false);
|
||||
|
||||
final LinkGrabberDialog dialog = new LinkGrabberDialog(this, true, _main_panel.getDefault_download_path(), _main_panel.getClipboardspy());
|
||||
|
||||
_main_panel.getClipboardspy().attachObserver(dialog);
|
||||
|
||||
swingReflectionInvokeAndWait("setLocationRelativeTo", dialog, this);
|
||||
|
||||
swingReflectionInvokeAndWait("setVisible", dialog, true);
|
||||
|
||||
_main_panel.getClipboardspy().detachObserver(dialog);
|
||||
|
||||
final String dl_path = dialog.getDownload_path();
|
||||
|
||||
jTabbedPane1.setSelectedIndex(0);
|
||||
|
||||
if(dialog.isDownload()) {
|
||||
|
||||
final MainPanelView main = this;
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
swingReflectionInvoke("setText", main.status_down_label, "Pre-processing downloads, please wait...");
|
||||
|
||||
Set<String> urls = new HashSet(findAllRegex("(?:https?|mega)://[^/]*/(#.*?)?!.+![^\r\n]+", dialog.getLinks_textarea().getText(), 0));
|
||||
|
||||
Set<String> megadownloader = new HashSet(findAllRegex("mega://enc.*?[^\r\n]+", dialog.getLinks_textarea().getText(), 0));
|
||||
|
||||
for (String link : megadownloader ) {
|
||||
|
||||
try {
|
||||
|
||||
urls.add(decryptMegaDownloaderLink(link));
|
||||
|
||||
} catch (Exception ex) {
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
if(!urls.isEmpty()) {
|
||||
|
||||
int conta_downloads = 0;
|
||||
|
||||
for (String url : urls ) {
|
||||
|
||||
url = url.replaceAll("^mega://", "https://mega.nz");
|
||||
|
||||
Download download;
|
||||
|
||||
if(findFirstRegex("#F!", url, 0) != null) {
|
||||
|
||||
FolderLinkDialog fdialog = new FolderLinkDialog(main, true, url);
|
||||
|
||||
if(!fdialog.isMega_error()) {
|
||||
|
||||
swingReflectionInvokeAndWait("setLocationRelativeTo", fdialog, main);
|
||||
|
||||
swingReflectionInvokeAndWait("setVisible", fdialog, true);
|
||||
|
||||
if(fdialog.isDownload()) {
|
||||
|
||||
List<HashMap> folder_links = fdialog.getDownload_links();
|
||||
|
||||
fdialog.dispose();
|
||||
|
||||
for(HashMap folder_link:folder_links) {
|
||||
|
||||
download = new Download(main.getMain_panel(), (String)folder_link.get("url"), dl_path, (String)folder_link.get("filename"), (String)folder_link.get("filekey"), (long)folder_link.get("filesize"), null, null, main.getMain_panel().isUse_slots_down(), main.getMain_panel().getDefault_slots_down(), true);
|
||||
|
||||
main.getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
||||
|
||||
conta_downloads++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fdialog.dispose();
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
download = new Download(main.getMain_panel(), url, dl_path, null, null, null, null, null, main.getMain_panel().isUse_slots_down(), main.getMain_panel().getDefault_slots_down(), false);
|
||||
|
||||
main.getMain_panel().getDownload_manager().getTransference_provision_queue().add(download);
|
||||
|
||||
conta_downloads++;
|
||||
}
|
||||
}
|
||||
|
||||
if(conta_downloads > 0) {
|
||||
|
||||
swingReflectionInvoke("setText", main.status_down_label, "Starting downloads provisioning, please wait...");
|
||||
|
||||
main.getMain_panel().getDownload_manager().secureNotify();
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.new_download_menu, true);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", main.new_download_menu, true);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", main.status_down_label, "");
|
||||
|
||||
}});
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", new_download_menu, true);
|
||||
}
|
||||
|
||||
dialog.dispose();
|
||||
|
||||
}//GEN-LAST:event_new_download_menuActionPerformed
|
||||
|
||||
private void settings_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_settings_menuActionPerformed
|
||||
|
||||
|
||||
SettingsDialog dialog = new SettingsDialog(this, true);
|
||||
|
||||
swingReflectionInvokeAndWait("setLocationRelativeTo", dialog, this);
|
||||
|
||||
swingReflectionInvokeAndWait("setVisible", dialog, true);
|
||||
|
||||
if(dialog.isSettings_ok()) {
|
||||
|
||||
for(String email:dialog.getDeleted_accounts()) {
|
||||
|
||||
try {
|
||||
deleteMegaAccount(email);
|
||||
} catch (SQLException ex) {
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
_main_panel.getMega_accounts().remove(email);
|
||||
|
||||
_main_panel.getMega_active_accounts().remove(email);
|
||||
}
|
||||
|
||||
_main_panel.loadUserSettings();
|
||||
|
||||
_main_panel.getStream_supervisor().setMaxBytesPerSecInput(_main_panel.isLimit_download_speed()?_main_panel.getMax_dl_speed()*1024:0);
|
||||
|
||||
_main_panel.getStream_supervisor().setMaxBytesPerSecOutput( _main_panel.isLimit_upload_speed()?_main_panel.getMax_up_speed()*1024:0);
|
||||
|
||||
swingReflectionInvoke("setForeground", global_speed_down_label, _main_panel.isLimit_download_speed()?new Color(255,0,0):new Color(0,128,255));
|
||||
|
||||
swingReflectionInvoke("setForeground", global_speed_up_label, _main_panel.isLimit_upload_speed()?new Color(255,0,0):new Color(0,128,255));
|
||||
|
||||
_main_panel.getDownload_manager().secureNotify();
|
||||
|
||||
_main_panel.getUpload_manager().secureNotify();
|
||||
}
|
||||
|
||||
dialog.dispose();
|
||||
}//GEN-LAST:event_settings_menuActionPerformed
|
||||
|
||||
private void hide_tray_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hide_tray_menuActionPerformed
|
||||
|
||||
|
||||
dispatchEvent(new WindowEvent(this, WINDOW_CLOSING));
|
||||
}//GEN-LAST:event_hide_tray_menuActionPerformed
|
||||
|
||||
private void about_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_about_menuActionPerformed
|
||||
|
||||
|
||||
AboutDialog dialog = new AboutDialog(this, true);
|
||||
|
||||
swingReflectionInvokeAndWait("setLocationRelativeTo", dialog, this);
|
||||
|
||||
swingReflectionInvokeAndWait("setVisible", dialog, true);
|
||||
}//GEN-LAST:event_about_menuActionPerformed
|
||||
|
||||
private void exit_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exit_menuActionPerformed
|
||||
|
||||
|
||||
_main_panel._byebye();
|
||||
}//GEN-LAST:event_exit_menuActionPerformed
|
||||
|
||||
private void close_all_finished_down_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_all_finished_down_buttonActionPerformed
|
||||
|
||||
_main_panel.getDownload_manager().closeAllFinished();
|
||||
}//GEN-LAST:event_close_all_finished_down_buttonActionPerformed
|
||||
|
||||
private void clean_all_down_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clean_all_down_menuActionPerformed
|
||||
|
||||
|
||||
Object[] options = {"No",
|
||||
"Yes"};
|
||||
|
||||
int n = showOptionDialog(this,
|
||||
"Remove all waiting downloads?",
|
||||
"Warning!", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
|
||||
if(n==1) {
|
||||
_main_panel.getDownload_manager().closeAllWaiting();
|
||||
}
|
||||
}//GEN-LAST:event_clean_all_down_menuActionPerformed
|
||||
|
||||
private void pause_all_down_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pause_all_down_buttonActionPerformed
|
||||
|
||||
|
||||
_main_panel.getDownload_manager().pauseAll();
|
||||
}//GEN-LAST:event_pause_all_down_buttonActionPerformed
|
||||
|
||||
private void new_stream_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_stream_menuActionPerformed
|
||||
|
||||
StreamerDialog dialog = new StreamerDialog(this, true, _main_panel.getClipboardspy());
|
||||
|
||||
_main_panel.getClipboardspy().attachObserver(dialog);
|
||||
|
||||
swingReflectionInvokeAndWait("setLocationRelativeTo", dialog, this);
|
||||
|
||||
swingReflectionInvokeAndWait("setVisible", dialog, true);
|
||||
|
||||
_main_panel.getClipboardspy().detachObserver(dialog);
|
||||
}//GEN-LAST:event_new_stream_menuActionPerformed
|
||||
|
||||
private void new_upload_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_new_upload_menuActionPerformed
|
||||
|
||||
|
||||
swingReflectionInvoke("setEnabled", new_upload_menu, false);
|
||||
|
||||
final FileGrabberDialog dialog = new FileGrabberDialog(this,true);
|
||||
|
||||
swingReflectionInvokeAndWait("setLocationRelativeTo", dialog, this);
|
||||
|
||||
swingReflectionInvokeAndWait("setVisible", dialog, true);
|
||||
|
||||
if(dialog.isUpload() && dialog.getFiles().size() > 0) {
|
||||
|
||||
try {
|
||||
|
||||
swingReflectionInvoke("setText", status_up_label, "Pre-processing uploads, please wait...");
|
||||
|
||||
final String mega_account = (String)dialog.getAccount_combobox().getSelectedItem();
|
||||
|
||||
HashMap<String,Object> data_account = (HashMap)_main_panel.getMega_accounts().get(mega_account);
|
||||
|
||||
final String base_path = dialog.getBase_path();
|
||||
|
||||
final String dir_name=dialog.getDir_name_textfield().getText();
|
||||
|
||||
final int[] mega_aes_pass = bin2i32a(BASE642Bin((String)data_account.get("password_aes")));
|
||||
|
||||
final String mega_user_hash = (String)data_account.get("user_hash");
|
||||
|
||||
final ArrayList<File> files = dialog.getFiles();
|
||||
|
||||
final MainPanelView main = this;
|
||||
|
||||
jTabbedPane1.setSelectedIndex(1);
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
MegaAPI ma=main.getMain_panel().getMega_active_accounts().get(mega_account)!=null?main.getMain_panel().getMega_active_accounts().get(mega_account):new MegaAPI();
|
||||
|
||||
try {
|
||||
|
||||
ma.login(mega_account, mega_aes_pass, mega_user_hash);
|
||||
|
||||
main.getMain_panel().getMega_active_accounts().put(mega_account, ma);
|
||||
|
||||
byte[] parent_key = ma.genFolderKey();
|
||||
|
||||
byte[] share_key = ma.genShareKey();
|
||||
|
||||
HashMap<String,Object> res = ma.createDir(dir_name!=null?dir_name:files.get(0).getName()+"_"+genID(10), ma.getRoot_id(), parent_key, i32a2bin(ma.getMaster_key()));
|
||||
|
||||
String parent_node = (String)((Map)((List)res.get("f")).get(0)).get("h");
|
||||
|
||||
out.println("Dir "+ parent_node+" created");
|
||||
|
||||
ma.shareFolder(parent_node, parent_key, share_key);
|
||||
|
||||
String folder_link = ma.getPublicFolderLink(parent_node, share_key);
|
||||
|
||||
MegaDirNode file_paths = new MegaDirNode(parent_node);
|
||||
|
||||
int conta = 1;
|
||||
|
||||
for(File f:files) {
|
||||
|
||||
swingReflectionInvoke("setText", main.status_up_label, "Pre-processing ("+(conta++)+"/"+files.size()+") uploads, please wait...");
|
||||
|
||||
String file_path = f.getParentFile().getAbsolutePath().replace(base_path, "");
|
||||
|
||||
String[] dirs = file_path.split("/");
|
||||
|
||||
out.println(file_path);
|
||||
|
||||
MegaDirNode current_node = file_paths;
|
||||
|
||||
String file_parent = current_node.getNode_id();
|
||||
|
||||
for(String d:dirs) {
|
||||
|
||||
if(!d.isEmpty()) {
|
||||
|
||||
if(current_node.getChildren().get(d) != null) {
|
||||
|
||||
current_node = current_node.getChildren().get(d);
|
||||
|
||||
file_parent = current_node.getNode_id();
|
||||
|
||||
} else {
|
||||
|
||||
res = ma.createDirInsideAnotherSharedDir(d, current_node.getNode_id(), ma.genFolderKey(), i32a2bin(ma.getMaster_key()), parent_node, share_key);
|
||||
|
||||
file_parent = (String)((Map)((List)res.get("f")).get(0)).get("h");
|
||||
|
||||
current_node.getChildren().put(d, new MegaDirNode(file_parent));
|
||||
|
||||
current_node = current_node.getChildren().get(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Upload upload = new Upload(main.getMain_panel(), ma, f.getAbsolutePath(), file_parent, null, null, parent_node, share_key, folder_link, main.getMain_panel().isUse_slots_up(), main.getMain_panel().getDefault_slots_up(), false);
|
||||
|
||||
main.getMain_panel().getUpload_manager().getTransference_provision_queue().add(upload);
|
||||
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", main.status_up_label, "Starting uploads provisioning, please wait...");
|
||||
|
||||
main.getMain_panel().getUpload_manager().secureNotify();
|
||||
|
||||
} catch (Exception ex) {
|
||||
swingReflectionInvoke("setEnabled", main.new_upload_menu, true);
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
} catch (Exception ex) {
|
||||
getLogger(MainPanelView.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", new_upload_menu, true);
|
||||
}
|
||||
|
||||
dialog.dispose();
|
||||
}//GEN-LAST:event_new_upload_menuActionPerformed
|
||||
|
||||
private void close_all_finished_up_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_all_finished_up_buttonActionPerformed
|
||||
|
||||
|
||||
_main_panel.getUpload_manager().closeAllFinished();
|
||||
}//GEN-LAST:event_close_all_finished_up_buttonActionPerformed
|
||||
|
||||
private void pause_all_up_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pause_all_up_buttonActionPerformed
|
||||
|
||||
|
||||
_main_panel.getUpload_manager().pauseAll();
|
||||
}//GEN-LAST:event_pause_all_up_buttonActionPerformed
|
||||
|
||||
private void clean_all_up_menuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clean_all_up_menuActionPerformed
|
||||
|
||||
Object[] options = {"No",
|
||||
"Yes"};
|
||||
|
||||
int n = showOptionDialog(this,
|
||||
"Remove all waiting uploads?",
|
||||
"Warning!", YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
|
||||
null,
|
||||
options,
|
||||
options[0]);
|
||||
|
||||
if(n==1) {
|
||||
_main_panel.getUpload_manager().closeAllWaiting();
|
||||
}
|
||||
}//GEN-LAST:event_clean_all_up_menuActionPerformed
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JMenuItem about_menu;
|
||||
private javax.swing.JMenuItem clean_all_down_menu;
|
||||
private javax.swing.JMenuItem clean_all_up_menu;
|
||||
private javax.swing.JButton close_all_finished_down_button;
|
||||
private javax.swing.JButton close_all_finished_up_button;
|
||||
private javax.swing.JPanel downloads_panel;
|
||||
private javax.swing.JMenu edit_menu;
|
||||
private javax.swing.JMenuItem exit_menu;
|
||||
private javax.swing.JMenu file_menu;
|
||||
private javax.swing.JLabel global_speed_down_label;
|
||||
private javax.swing.JLabel global_speed_up_label;
|
||||
private javax.swing.JMenu help_menu;
|
||||
private javax.swing.JMenuItem hide_tray_menu;
|
||||
protected javax.swing.JPanel jPanel_scroll_down;
|
||||
protected javax.swing.JPanel jPanel_scroll_up;
|
||||
private javax.swing.JScrollPane jScrollPane_down;
|
||||
private javax.swing.JScrollPane jScrollPane_up;
|
||||
private javax.swing.JPopupMenu.Separator jSeparator1;
|
||||
private javax.swing.JPopupMenu.Separator jSeparator2;
|
||||
private javax.swing.JPopupMenu.Separator jSeparator3;
|
||||
private javax.swing.JPopupMenu.Separator jSeparator4;
|
||||
private javax.swing.JPopupMenu.Separator jSeparator5;
|
||||
private javax.swing.JPopupMenu.Separator jSeparator6;
|
||||
private javax.swing.JTabbedPane jTabbedPane1;
|
||||
private javax.swing.JLabel kiss_server_status;
|
||||
protected javax.swing.JLabel logo_label;
|
||||
private javax.swing.JMenuBar main_menubar;
|
||||
private javax.swing.JMenuItem new_download_menu;
|
||||
private javax.swing.JMenuItem new_stream_menu;
|
||||
private javax.swing.JMenuItem new_upload_menu;
|
||||
private javax.swing.JButton pause_all_down_button;
|
||||
private javax.swing.JButton pause_all_up_button;
|
||||
private javax.swing.JMenuItem settings_menu;
|
||||
private javax.swing.JLabel status_down_label;
|
||||
private javax.swing.JLabel status_up_label;
|
||||
private javax.swing.JPanel uploads_panel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
878
src/megabasterd/MegaAPI.java
Normal file
@ -0,0 +1,878 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.math.BigInteger;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import javax.crypto.Cipher;
|
||||
import static megabasterd.MiscTools.Bin2UrlBASE64;
|
||||
import static megabasterd.MiscTools.UrlBASE642Bin;
|
||||
import static megabasterd.MiscTools.bin2i32a;
|
||||
import static megabasterd.MiscTools.cleanFilename;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
import static megabasterd.MiscTools.genID;
|
||||
import static megabasterd.MiscTools.genRandomByteArray;
|
||||
import static megabasterd.MiscTools.getWaitTimeExpBackOff;
|
||||
import static megabasterd.MiscTools.i32a2bin;
|
||||
import static megabasterd.MiscTools.mpi2big;
|
||||
import org.codehaus.jackson.map.ObjectMapper;
|
||||
|
||||
|
||||
|
||||
public final class MegaAPI {
|
||||
|
||||
public static final String API_URL = "https://g.api.mega.co.nz";
|
||||
|
||||
public static final int REQ_ID_LENGTH = 10;
|
||||
public static int checkMEGAError(String data)
|
||||
{
|
||||
String error = findFirstRegex("^\\[?(\\-[0-9]+)\\]?$", data, 1);
|
||||
|
||||
return error != null?Integer.parseInt(error):0;
|
||||
}
|
||||
|
||||
private int _seqno;
|
||||
|
||||
private String _sid;
|
||||
|
||||
private String _api_key;
|
||||
|
||||
private int[] _master_key;
|
||||
|
||||
private BigInteger[] _rsa_priv_key;
|
||||
|
||||
private int[] _password_aes;
|
||||
|
||||
private String _user_hash;
|
||||
|
||||
private String _root_id;
|
||||
|
||||
|
||||
private String _inbox_id;
|
||||
|
||||
private String _email;
|
||||
|
||||
|
||||
private String _trashbin_id;
|
||||
|
||||
private String _req_id;
|
||||
public MegaAPI()
|
||||
{
|
||||
_req_id = null;
|
||||
_trashbin_id = null;
|
||||
_email = null;
|
||||
_inbox_id = null;
|
||||
_root_id = null;
|
||||
_user_hash = null;
|
||||
_password_aes = null;
|
||||
_rsa_priv_key = null;
|
||||
_master_key = null;
|
||||
_api_key = null;
|
||||
_sid = null;
|
||||
|
||||
Random randomno = new Random();
|
||||
|
||||
_seqno=randomno.nextInt();
|
||||
|
||||
_req_id = genID(REQ_ID_LENGTH);
|
||||
}
|
||||
public MegaAPI(String ak)
|
||||
{
|
||||
_req_id = null;
|
||||
_trashbin_id = null;
|
||||
_email = null;
|
||||
_inbox_id = null;
|
||||
_root_id = null;
|
||||
_user_hash = null;
|
||||
_password_aes = null;
|
||||
_rsa_priv_key = null;
|
||||
_master_key = null;
|
||||
_api_key = null;
|
||||
_sid = null;
|
||||
|
||||
Random randomno = new Random();
|
||||
|
||||
_seqno=randomno.nextInt();
|
||||
|
||||
_api_key=ak;
|
||||
|
||||
_req_id = genID(REQ_ID_LENGTH);
|
||||
}
|
||||
public String getEmail() {
|
||||
return _email;
|
||||
}
|
||||
public int[] getPassword_aes() {
|
||||
return _password_aes;
|
||||
}
|
||||
public String getUser_hash() {
|
||||
return _user_hash;
|
||||
}
|
||||
|
||||
public String getSid() {
|
||||
return _sid;
|
||||
}
|
||||
|
||||
public String getApi_key() {
|
||||
return _api_key;
|
||||
}
|
||||
|
||||
public int[] getMaster_key() {
|
||||
return _master_key;
|
||||
}
|
||||
|
||||
public BigInteger[] getRsa_priv_key() {
|
||||
return _rsa_priv_key;
|
||||
}
|
||||
|
||||
public String getRoot_id() {
|
||||
return _root_id;
|
||||
}
|
||||
|
||||
public String getInbox_id() {
|
||||
return _inbox_id;
|
||||
}
|
||||
|
||||
public String getTrashbin_id() {
|
||||
return _trashbin_id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void _realLogin() throws Exception, MegaAPIException {
|
||||
|
||||
String request = "[{\"a\":\"us\", \"user\":\""+_email+"\", \"uh\":\""+_user_hash+"\"}]";
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res = _rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
String k = (String)res_map[0].get("k");
|
||||
|
||||
String privk = (String)res_map[0].get("privk");
|
||||
|
||||
_master_key = bin2i32a(decryptKey(UrlBASE642Bin(k), i32a2bin(_password_aes)));
|
||||
|
||||
String csid = (String)res_map[0].get("csid");
|
||||
|
||||
if(csid != null) {
|
||||
|
||||
int[] enc_rsa_priv_key = bin2i32a(UrlBASE642Bin(privk));
|
||||
|
||||
byte[] privk_byte = decryptKey(i32a2bin(enc_rsa_priv_key), i32a2bin(_master_key));
|
||||
|
||||
_rsa_priv_key = _extractRSAPrivKey(privk_byte);
|
||||
|
||||
|
||||
byte[] raw_sid = CryptTools.rsaDecrypt(mpi2big(UrlBASE642Bin(csid)), _rsa_priv_key[0], _rsa_priv_key[1], _rsa_priv_key[2]);
|
||||
|
||||
_sid = Bin2UrlBASE64(Arrays.copyOfRange(raw_sid, 0, 43));
|
||||
}
|
||||
|
||||
fetchNodes();
|
||||
}
|
||||
|
||||
public void login(String email, String password) throws Exception, MegaAPIException {
|
||||
|
||||
_email = email;
|
||||
|
||||
_password_aes = CryptTools.MEGAPrepareMasterKey(bin2i32a(password.getBytes()));
|
||||
|
||||
_user_hash = CryptTools.MEGAUserHash(email.toLowerCase().getBytes(), _password_aes);
|
||||
|
||||
_realLogin();
|
||||
}
|
||||
|
||||
public void login(String email, int[] password_aes, String user_hash) throws Exception, MegaAPIException {
|
||||
|
||||
_email = email;
|
||||
|
||||
_password_aes = password_aes;
|
||||
|
||||
_user_hash = user_hash;
|
||||
|
||||
_realLogin();
|
||||
}
|
||||
|
||||
public Long[] getQuota() {
|
||||
|
||||
Long[] quota = new Long[2];
|
||||
|
||||
try {
|
||||
String request = "[{\"a\": \"uq\", \"xfer\": 1, \"strg\": 1}]";
|
||||
|
||||
URL url_api;
|
||||
|
||||
url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res = _rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
if(res_map[0].get("cstrg") instanceof Integer) {
|
||||
|
||||
quota[0] = ((Number)res_map[0].get("cstrg")).longValue();
|
||||
|
||||
} else if(res_map[0].get("cstrg") instanceof Long) {
|
||||
|
||||
quota[0] = (Long)res_map[0].get("cstrg");
|
||||
}
|
||||
|
||||
if(res_map[0].get("mstrg") instanceof Integer) {
|
||||
|
||||
quota[1] = ((Number)res_map[0].get("mstrg")).longValue();
|
||||
|
||||
} else if(res_map[0].get("mstrg") instanceof Long) {
|
||||
|
||||
quota[1] = (Long)res_map[0].get("mstrg");
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return quota;
|
||||
}
|
||||
|
||||
public void fetchNodes() throws IOException {
|
||||
|
||||
String request = "[{\"a\":\"f\", \"c\":1}]";
|
||||
|
||||
URL url_api;
|
||||
|
||||
try {
|
||||
|
||||
url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res = _rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
for(Object o:((Iterable<? extends Object>)res_map[0].get("f"))) {
|
||||
|
||||
HashMap element = (HashMap<String,Object>)o;
|
||||
|
||||
int file_type = (int)element.get("t");
|
||||
|
||||
switch (file_type) {
|
||||
|
||||
case 2:
|
||||
_root_id = (String)element.get("h");
|
||||
break;
|
||||
case 3:
|
||||
_inbox_id = (String)element.get("h");
|
||||
break;
|
||||
case 4:
|
||||
_trashbin_id = (String)element.get("h");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String _rawRequest(String request, URL url_api) throws IOException, MegaAPIException {
|
||||
|
||||
boolean error;
|
||||
|
||||
int conta_error=0;
|
||||
|
||||
String response=null;
|
||||
|
||||
do{
|
||||
error = false;
|
||||
|
||||
_seqno++;
|
||||
|
||||
HttpURLConnection conn = (HttpURLConnection) url_api.openConnection();
|
||||
conn.setConnectTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setDoOutput(true);
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("Content-Type", "application/json");
|
||||
//conn.setRequestProperty("User-Agent", ""); -> Skips 509 error MEGA BUG????
|
||||
conn.setRequestProperty("Connection", "close");
|
||||
|
||||
OutputStream out;
|
||||
out = conn.getOutputStream();
|
||||
out.write(request.getBytes());
|
||||
out.close();
|
||||
|
||||
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK)
|
||||
{
|
||||
System.out.println("Failed : HTTP error code : " + conn.getResponseCode());
|
||||
|
||||
error = true;
|
||||
|
||||
try {
|
||||
Thread.sleep( getWaitTimeExpBackOff(conta_error));
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
String content_encoding = conn.getContentEncoding();
|
||||
|
||||
InputStream is=(content_encoding!=null && content_encoding.equals("gzip"))?new GZIPInputStream(conn.getInputStream()):conn.getInputStream();
|
||||
|
||||
ByteArrayOutputStream byte_res = new ByteArrayOutputStream();
|
||||
|
||||
byte[] buffer = new byte[16*1024];
|
||||
|
||||
int reads;
|
||||
|
||||
while( (reads=is.read(buffer)) != -1 ) {
|
||||
|
||||
byte_res.write(buffer, 0, reads);
|
||||
}
|
||||
|
||||
response = new String(byte_res.toByteArray());
|
||||
|
||||
conn.disconnect();
|
||||
|
||||
int mega_error;
|
||||
|
||||
if( (mega_error=checkMEGAError(response))!=0 )
|
||||
{
|
||||
if(mega_error == -3) {
|
||||
|
||||
error = true;
|
||||
|
||||
try {
|
||||
Thread.sleep(getWaitTimeExpBackOff(conta_error));
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
} else {
|
||||
|
||||
throw new MegaAPIException(String.valueOf(mega_error));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}while(error);
|
||||
|
||||
return response;
|
||||
|
||||
}
|
||||
|
||||
public String getMegaFileDownloadUrl(String link) throws IOException, MegaAPIException
|
||||
{
|
||||
link=link.replace("/#!N?", "/#N!");
|
||||
|
||||
String file_id = findFirstRegex("#.*?!([^!]+)", link, 1);
|
||||
|
||||
String request;
|
||||
|
||||
URL url_api;
|
||||
|
||||
if(findFirstRegex("#N!", link, 0) != null)
|
||||
{
|
||||
String folder_id = findFirstRegex("###n=(.+)$", link, 1);
|
||||
|
||||
request = "[{\"a\":\"g\", \"g\":\"1\", \"n\":\""+file_id+"\"}]";
|
||||
|
||||
url_api = new URL(API_URL+"/cs?id="+_seqno+(_api_key!=null?"&ak="+_api_key:"")+"&n="+folder_id);
|
||||
|
||||
} else {
|
||||
|
||||
request = "[{\"a\":\"g\", \"g\":\"1\", \"p\":\""+file_id+"\"}]";
|
||||
url_api = new URL(API_URL+"/cs?id="+_seqno+(_api_key!=null?"&ak="+_api_key:""));
|
||||
}
|
||||
|
||||
String data = _rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(data, HashMap[].class);
|
||||
|
||||
return (String)res_map[0].get("g");
|
||||
}
|
||||
|
||||
|
||||
public String[] getMegaFileMetadata(String link) throws Exception, MegaAPIException
|
||||
{
|
||||
|
||||
link=link.replace("/#!N?", "/#N!");
|
||||
|
||||
String file_id = findFirstRegex("#.*?!([^!]+)", link, 1);
|
||||
|
||||
String file_key = findFirstRegex("#.*?![^!]+!([^!#]+)", link, 1);
|
||||
|
||||
String request;
|
||||
|
||||
URL url_api;
|
||||
|
||||
if(findFirstRegex("#N!", link, 0) != null)
|
||||
{
|
||||
String folder_id = findFirstRegex("###n=(.+)$", link, 1);
|
||||
|
||||
request = "[{\"a\":\"g\", \"g\":\"1\", \"n\":\""+file_id+"\"}]";
|
||||
|
||||
url_api = new URL(API_URL+"/cs?id="+_seqno+(_api_key!=null?"&ak="+_api_key:"")+"&n="+folder_id);
|
||||
|
||||
} else {
|
||||
|
||||
request = "[{\"a\":\"g\", \"p\":\""+file_id+"\"}]";
|
||||
|
||||
url_api = new URL(API_URL+"/cs?id="+_seqno+(_api_key!=null?"&ak="+_api_key:""));
|
||||
}
|
||||
|
||||
String data = _rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(data, HashMap[].class);
|
||||
|
||||
String fsize = String.valueOf(res_map[0].get("s"));
|
||||
|
||||
String at = (String)res_map[0].get("at");
|
||||
|
||||
String[] file_data = null;
|
||||
|
||||
HashMap att_map = _decAttr(at, CryptTools.initMEGALinkKey(file_key));
|
||||
|
||||
if(att_map != null) {
|
||||
|
||||
String fname = cleanFilename((String)att_map.get("n"));
|
||||
|
||||
file_data = new String[]{fname, fsize, file_key};
|
||||
|
||||
} else {
|
||||
|
||||
throw new MegaAPIException("-14");
|
||||
}
|
||||
|
||||
return file_data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private byte[] _encAttr(String attr, byte[] key) {
|
||||
|
||||
byte[] attr_byte = ("MEGA"+attr).getBytes();
|
||||
|
||||
int l = (int)(16 * Math.ceil((double)attr_byte.length/16));
|
||||
|
||||
byte[] new_attr_byte = Arrays.copyOfRange(attr_byte, 0, l);
|
||||
|
||||
byte[] ret = null;
|
||||
|
||||
try {
|
||||
|
||||
ret = CryptTools.aes_cbc_encrypt(new_attr_byte, key, CryptTools.AES_ZERO_IV);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private HashMap _decAttr(String encAttr, byte[] key) {
|
||||
|
||||
HashMap res_map = null;
|
||||
|
||||
byte[] decrypted_at = null;
|
||||
|
||||
try {
|
||||
|
||||
Cipher decrypter = CryptTools.genDecrypter("AES", "AES/CBC/NoPadding", key, CryptTools.AES_ZERO_IV);
|
||||
|
||||
decrypted_at = decrypter.doFinal(UrlBASE642Bin(encAttr));
|
||||
|
||||
String att = new String(decrypted_at).replaceAll("[\0]+$","").replaceAll("^MEGA", "");
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
res_map = objectMapper.readValue(att, HashMap.class);
|
||||
|
||||
}
|
||||
catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
}
|
||||
|
||||
return res_map;
|
||||
}
|
||||
|
||||
public String initUploadFile(String filename) {
|
||||
|
||||
String ul_url = null;
|
||||
|
||||
try {
|
||||
|
||||
File f = new File(filename);
|
||||
|
||||
String request = "[{\"a\":\"u\", \"s\":"+String.valueOf(f.length())+"}]";
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res = _rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
ul_url = (String)res_map[0].get("p");
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return ul_url;
|
||||
}
|
||||
|
||||
public HashMap<String,Object> finishUploadFile(String fbasename, int[] ul_key, int[] fkey, int[] meta_mac, String completion_handle, String mega_parent, byte[] master_key, String root_node, byte[] share_key) {
|
||||
|
||||
HashMap[] res_map = null;
|
||||
|
||||
try {
|
||||
|
||||
byte[] enc_att = _encAttr("{\"n\":\""+fbasename+"\"}", i32a2bin(Arrays.copyOfRange(ul_key, 0, 4)));
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String request = "[{\"a\":\"p\", \"t\":\""+mega_parent+"\", \"n\":[{\"h\":\""+completion_handle+"\", \"t\":0, \"a\":\""+Bin2UrlBASE64(enc_att)+"\", \"k\":\""+Bin2UrlBASE64(encryptKey(i32a2bin(fkey), master_key))+"\"}], \"i\":\""+_req_id+"\", \"cr\" : [ [\"" + root_node + "\"] , [\""+completion_handle+"\"] , [0,0, \""+Bin2UrlBASE64(encryptKey(i32a2bin(fkey), share_key))+"\"]]}]";
|
||||
|
||||
String res = _rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return res_map[0];
|
||||
}
|
||||
|
||||
public byte[] encryptKey(byte[] a, byte[] key) throws Exception {
|
||||
|
||||
return CryptTools.aes_ecb_encrypt(a, key);
|
||||
}
|
||||
|
||||
public byte[] decryptKey(byte[] a, byte[] key) throws Exception {
|
||||
|
||||
return CryptTools.aes_ecb_decrypt(a, key);
|
||||
}
|
||||
|
||||
private BigInteger[] _extractRSAPrivKey(byte[] rsa_data) {
|
||||
|
||||
BigInteger[] rsa_key = new BigInteger[4];
|
||||
|
||||
for(int i=0, offset=0; i<4; i++) {
|
||||
|
||||
int l = ( ( 256*( (((int)rsa_data[offset]) & 0xFF )) + ( ((int)rsa_data[offset+1]) & 0xFF ) + 7 ) /8 ) + 2;
|
||||
|
||||
rsa_key[i] = mpi2big(Arrays.copyOfRange(rsa_data, offset, offset+l));
|
||||
|
||||
offset+=l;
|
||||
}
|
||||
|
||||
return rsa_key;
|
||||
}
|
||||
|
||||
public HashMap<String,Object> createDir(String name, String parent_node, byte[] node_key, byte[] master_key) {
|
||||
|
||||
HashMap[] res_map=null;
|
||||
|
||||
try {
|
||||
|
||||
byte[] enc_att = _encAttr("{\"n\":\""+name+"\"}", node_key);
|
||||
|
||||
byte[] enc_node_key = encryptKey(node_key, master_key);
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String request="[{\"a\":\"p\", \"t\":\""+parent_node+"\", \"n\":[{\"h\":\"xxxxxxxx\",\"t\":1,\"a\":\""+Bin2UrlBASE64(enc_att)+"\",\"k\":\""+Bin2UrlBASE64(enc_node_key)+"\"}],\"i\":\""+_req_id+"\"}]";
|
||||
|
||||
String res=_rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return res_map[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
public HashMap<String,Object> createDirInsideAnotherSharedDir(String name, String parent_node, byte[] node_key, byte[] master_key, String root_node, byte[] share_key) {
|
||||
|
||||
HashMap[] res_map=null;
|
||||
|
||||
try {
|
||||
|
||||
byte[] enc_att = _encAttr("{\"n\":\""+name+"\"}", node_key);
|
||||
|
||||
byte[] enc_node_key = encryptKey(node_key, master_key);
|
||||
|
||||
byte[] enc_node_key_s = encryptKey(node_key, share_key);
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String request="[{\"a\":\"p\", \"t\":\""+parent_node+"\", \"n\":[{\"h\":\"xxxxxxxx\",\"t\":1,\"a\":\""+Bin2UrlBASE64(enc_att)+"\",\"k\":\""+Bin2UrlBASE64(enc_node_key)+"\"}],\"i\":\""+_req_id+"\", \"cr\" : [ [\"" + root_node + "\"] , [\"xxxxxxxx\"] , [0,0, \""+Bin2UrlBASE64(enc_node_key_s)+"\"]]}]";
|
||||
|
||||
String res=_rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return res_map[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
public String getPublicFileLink(String node, byte[] node_key) {
|
||||
|
||||
String public_link=null;
|
||||
|
||||
try {
|
||||
|
||||
String file_id = null;
|
||||
|
||||
List res_map=null;
|
||||
|
||||
String request = "[{\"a\":\"l\", \"n\":\""+node+"\"}]";
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res=_rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
res_map = objectMapper.readValue(res, List.class);
|
||||
|
||||
file_id = (String)res_map.get(0);
|
||||
|
||||
public_link = "https://mega.nz/#!"+file_id+"!"+Bin2UrlBASE64(node_key);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return public_link;
|
||||
}
|
||||
|
||||
public String getPublicFolderLink(String node, byte[] node_key) {
|
||||
|
||||
String public_link=null;
|
||||
|
||||
try {
|
||||
|
||||
String folder_id = null;
|
||||
|
||||
List res_map=null;
|
||||
|
||||
String request = "[{\"a\":\"l\", \"n\":\""+node+"\", \"i\":\""+_req_id+"\"}]";
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res=_rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
res_map = objectMapper.readValue(res, List.class);
|
||||
|
||||
folder_id = (String)res_map.get(0);
|
||||
|
||||
public_link = "https://mega.nz/#F!"+folder_id+"!"+Bin2UrlBASE64(node_key);
|
||||
|
||||
}catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return public_link;
|
||||
}
|
||||
|
||||
public int[] genUploadKey() {
|
||||
|
||||
return bin2i32a(genRandomByteArray(24));
|
||||
}
|
||||
|
||||
public byte[] genFolderKey() {
|
||||
|
||||
return genRandomByteArray(16);
|
||||
}
|
||||
|
||||
public byte[] genShareKey() {
|
||||
|
||||
return genRandomByteArray(16);
|
||||
}
|
||||
|
||||
|
||||
public void shareFolder(String node, byte[] node_key, byte[] share_key) {
|
||||
|
||||
try {
|
||||
|
||||
String ok=Bin2UrlBASE64(encryptKey(share_key, i32a2bin(getMaster_key())));
|
||||
|
||||
String enc_nk = Bin2UrlBASE64(encryptKey(node_key, share_key));
|
||||
|
||||
String ha=cryptoHandleauth(node);
|
||||
|
||||
String request = "[{\"a\":\"s2\",\"n\":\""+node+"\",\"s\":[{\"u\":\"EXP\",\"r\":0}],\"i\":\""+_req_id+"\",\"ok\":\""+ok+"\",\"ha\":\""+ha+"\",\"cr\":[[\""+node+"\"],[\""+node+"\"],[0,0,\""+enc_nk+"\"]]}]";
|
||||
|
||||
System.out.println(request);
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+"&sid="+_sid+(_api_key!=null?"&ak="+_api_key:""));
|
||||
|
||||
String res=_rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public String cryptoHandleauth(String h) {
|
||||
|
||||
String ch = null;
|
||||
|
||||
try {
|
||||
|
||||
ch = Bin2UrlBASE64(encryptKey((h+h).getBytes(), i32a2bin(getMaster_key())));
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
public HashMap<String,Object> getFolderNodes(String folder_id, String folder_key) throws Exception {
|
||||
|
||||
HashMap<String,Object> folder_nodes = null;
|
||||
|
||||
String request = "[{\"a\":\"f\", \"c\":\"1\", \"r\":\"1\"}]";
|
||||
|
||||
URL url_api = new URL(API_URL+"/cs?id="+_seqno+(_api_key!=null?"&ak="+_api_key:"")+"&n="+folder_id);
|
||||
|
||||
String res=_rawRequest(request, url_api);
|
||||
|
||||
System.out.println(res);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap[] res_map = objectMapper.readValue(res, HashMap[].class);
|
||||
|
||||
List nodes = (List)res_map[0].get("f");
|
||||
|
||||
folder_nodes = new HashMap<>();
|
||||
|
||||
for(Object o:nodes) {
|
||||
|
||||
HashMap<String,Object> node = (HashMap<String,Object>)o;
|
||||
|
||||
String[] node_k = ((String)node.get("k")).split(":");
|
||||
|
||||
String dec_node_k = Bin2UrlBASE64(decryptKey(UrlBASE642Bin(node_k[1]), _urlBase64KeyDecode(folder_key)));
|
||||
|
||||
HashMap at = _decAttr((String)node.get("a"), _urlBase64KeyDecode(dec_node_k));
|
||||
|
||||
HashMap<String,Object> the_node = new HashMap<>();
|
||||
|
||||
the_node.put("type", node.get("t"));
|
||||
|
||||
the_node.put("parent", node.get("p"));
|
||||
|
||||
the_node.put("key", dec_node_k);
|
||||
|
||||
if(node.get("s") != null) {
|
||||
|
||||
if(node.get("s") instanceof Integer) {
|
||||
|
||||
long size = ((Number)node.get("s")).longValue();
|
||||
the_node.put("size", size);
|
||||
|
||||
} else if(node.get("s") instanceof Long) {
|
||||
|
||||
long size = (Long)node.get("s");
|
||||
the_node.put("size", size);
|
||||
}
|
||||
}
|
||||
|
||||
the_node.put("name", at.get("n"));
|
||||
|
||||
the_node.put("h", node.get("h"));
|
||||
|
||||
folder_nodes.put((String)node.get("h"), the_node);
|
||||
}
|
||||
|
||||
return folder_nodes;
|
||||
}
|
||||
|
||||
private byte[] _urlBase64KeyDecode(String key) {
|
||||
|
||||
try {
|
||||
byte[] key_bin = UrlBASE642Bin(key);
|
||||
|
||||
if(key_bin.length < 32) {
|
||||
|
||||
return Arrays.copyOfRange(key_bin, 0, 16);
|
||||
|
||||
} else {
|
||||
|
||||
int[] key_i32a = bin2i32a(Arrays.copyOfRange(key_bin, 0, 32));
|
||||
|
||||
int[] k = {key_i32a[0] ^ key_i32a[4], key_i32a[1] ^ key_i32a[5], key_i32a[2] ^ key_i32a[6], key_i32a[3] ^ key_i32a[7]};
|
||||
|
||||
return i32a2bin(k);
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
11
src/megabasterd/MegaAPIException.java
Normal file
@ -0,0 +1,11 @@
|
||||
package megabasterd;
|
||||
|
||||
|
||||
public final class MegaAPIException extends Exception {
|
||||
|
||||
public MegaAPIException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
|
||||
}
|
306
src/megabasterd/MegaCrypterAPI.java
Normal file
@ -0,0 +1,306 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.security.spec.KeySpec;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.SecretKeyFactory;
|
||||
import javax.crypto.spec.PBEKeySpec;
|
||||
import javax.swing.JOptionPane;
|
||||
import static megabasterd.MiscTools.BASE642Bin;
|
||||
import static megabasterd.MiscTools.Bin2BASE64;
|
||||
import static megabasterd.MiscTools.Bin2UrlBASE64;
|
||||
import static megabasterd.MiscTools.cleanFilePath;
|
||||
import static megabasterd.MiscTools.cleanFilename;
|
||||
import static megabasterd.MiscTools.findFirstRegex;
|
||||
import org.codehaus.jackson.map.ObjectMapper;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class MegaCrypterAPI {
|
||||
|
||||
private static String _rawRequest(String request, URL url_api) throws IOException, MegaCrypterAPIException {
|
||||
|
||||
HttpURLConnection conn = (HttpURLConnection) url_api.openConnection();
|
||||
conn.setConnectTimeout(MainPanel.CONNECTION_TIMEOUT);
|
||||
conn.setDoOutput(true);
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("Content-Type", "application/json");
|
||||
conn.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
||||
conn.setRequestProperty("Connection", "close");
|
||||
|
||||
OutputStream out;
|
||||
out = conn.getOutputStream();
|
||||
out.write(request.getBytes());
|
||||
out.close();
|
||||
|
||||
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK)
|
||||
{
|
||||
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
|
||||
}
|
||||
|
||||
String content_encoding = conn.getContentEncoding();
|
||||
|
||||
InputStream is=(content_encoding!=null && content_encoding.equals("gzip"))?new GZIPInputStream(conn.getInputStream()):conn.getInputStream();
|
||||
|
||||
ByteArrayOutputStream byte_res = new ByteArrayOutputStream();
|
||||
|
||||
byte[] buffer = new byte[16*1024];
|
||||
|
||||
int reads;
|
||||
|
||||
while( (reads=is.read(buffer)) != -1 ) {
|
||||
|
||||
byte_res.write(buffer, 0, reads);
|
||||
}
|
||||
|
||||
String response = new String(byte_res.toByteArray());
|
||||
|
||||
conn.disconnect();
|
||||
|
||||
int mc_error;
|
||||
|
||||
if((mc_error=MegaCrypterAPI.checkMCError(response))!=0)
|
||||
{
|
||||
throw new MegaCrypterAPIException(String.valueOf(mc_error));
|
||||
}
|
||||
|
||||
return response;
|
||||
|
||||
}
|
||||
|
||||
public static String getMegaFileDownloadUrl(String link, String pass_hash, String noexpire_token) throws IOException, MegaCrypterAPIException
|
||||
{
|
||||
String request = noexpire_token != null?"{\"m\":\"dl\", \"link\": \""+link+"\", \"noexpire\": \""+noexpire_token+"\"}":"{\"m\":\"dl\", \"link\": \""+link+"\"}";
|
||||
|
||||
URL url_api = new URL(findFirstRegex("https?://[^/]+", link, 0)+"/api");
|
||||
|
||||
String res = MegaCrypterAPI._rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap res_map = objectMapper.readValue(res, HashMap.class);
|
||||
|
||||
String dl_url = (String)res_map.get("url");
|
||||
|
||||
if(pass_hash != null)
|
||||
{
|
||||
try {
|
||||
String pass = (String)res_map.get("pass");
|
||||
|
||||
byte[] iv = BASE642Bin(pass);
|
||||
|
||||
Cipher decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", BASE642Bin(pass_hash),iv);
|
||||
|
||||
byte[] decrypted_url = decrypter.doFinal(BASE642Bin(dl_url));
|
||||
|
||||
dl_url = new String(decrypted_url);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaCrypterAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
return dl_url;
|
||||
}
|
||||
|
||||
public static String[] getMegaFileMetadata(String link, MainPanelView panel) throws Exception, MegaCrypterAPIException
|
||||
{
|
||||
String request = "{\"m\":\"info\", \"link\": \""+link+"\"}";
|
||||
|
||||
URL url_api = new URL(findFirstRegex("https?://[^/]+", link, 0)+"/api");
|
||||
|
||||
String res = MegaCrypterAPI._rawRequest(request, url_api);
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
HashMap res_map = objectMapper.readValue(res, HashMap.class);
|
||||
|
||||
String fname = cleanFilename((String)res_map.get("name"));
|
||||
|
||||
String fpath=null;
|
||||
|
||||
Object fpath_val = res_map.get("path");
|
||||
|
||||
if(fpath_val instanceof Boolean) {
|
||||
|
||||
fpath = null;
|
||||
|
||||
} else if (fpath_val instanceof String) {
|
||||
|
||||
fpath = cleanFilePath((String)fpath_val);
|
||||
}
|
||||
|
||||
String file_size;
|
||||
|
||||
try {
|
||||
|
||||
file_size = String.valueOf(res_map.get("size"));
|
||||
|
||||
} catch(java.lang.ClassCastException ex) {
|
||||
|
||||
file_size = String.valueOf(res_map.get("size"));
|
||||
}
|
||||
|
||||
String fkey = (String)res_map.get("key");
|
||||
|
||||
String noexpire_token=null;
|
||||
|
||||
Object expire_val = res_map.get("expire");
|
||||
|
||||
if(expire_val instanceof Boolean) {
|
||||
|
||||
noexpire_token = null;
|
||||
|
||||
} else if (expire_val instanceof String) {
|
||||
|
||||
String aux[] = ((String) expire_val).split("#");
|
||||
|
||||
noexpire_token = aux[1];
|
||||
}
|
||||
|
||||
String pass=null;
|
||||
|
||||
Object pass_val = res_map.get("pass");
|
||||
|
||||
if(pass_val instanceof Boolean) {
|
||||
|
||||
pass = null;
|
||||
|
||||
} else if (expire_val instanceof String) {
|
||||
|
||||
pass = (String)pass_val;
|
||||
}
|
||||
|
||||
System.out.println(noexpire_token);
|
||||
|
||||
if(pass != null)
|
||||
{
|
||||
String[] pass_items = pass.split("#");
|
||||
|
||||
if(pass_items.length != 4)
|
||||
{
|
||||
throw new MegaCrypterAPIException("Bad password data!");
|
||||
}
|
||||
|
||||
int iterations = Integer.parseInt(pass_items[0]);
|
||||
|
||||
byte[] key_check = BASE642Bin(pass_items[1]);
|
||||
|
||||
byte[] salt = BASE642Bin(pass_items[2]);
|
||||
|
||||
byte[] iv = BASE642Bin(pass_items[3]);
|
||||
|
||||
String password;
|
||||
|
||||
byte[] info_key = null;
|
||||
|
||||
boolean bad_pass;
|
||||
|
||||
Cipher decrypter;
|
||||
|
||||
try {
|
||||
do
|
||||
{
|
||||
bad_pass = false;
|
||||
|
||||
password = JOptionPane.showInputDialog(panel, "Enter password:");
|
||||
|
||||
if(password!=null) {
|
||||
|
||||
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
|
||||
|
||||
KeySpec ks = new PBEKeySpec(password.toCharArray(), salt, (int)Math.pow(2, iterations), 256);
|
||||
|
||||
try {
|
||||
|
||||
info_key=f.generateSecret(ks).getEncoded();
|
||||
|
||||
decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv);
|
||||
|
||||
try {
|
||||
|
||||
bad_pass = !Arrays.equals(info_key, decrypter.doFinal(key_check));
|
||||
|
||||
} catch (IllegalBlockSizeException | BadPaddingException ex) {
|
||||
|
||||
bad_pass=true;
|
||||
}
|
||||
|
||||
} catch (InvalidKeySpecException ex) {
|
||||
|
||||
bad_pass=true;
|
||||
}
|
||||
}
|
||||
|
||||
}while(password!=null && bad_pass);
|
||||
|
||||
if(password==null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv);
|
||||
|
||||
byte[] decrypted_key = decrypter.doFinal(BASE642Bin(fkey));
|
||||
|
||||
fkey = Bin2UrlBASE64(decrypted_key);
|
||||
|
||||
decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv);
|
||||
|
||||
byte[] decrypted_name = decrypter.doFinal(BASE642Bin(fname));
|
||||
|
||||
fname = new String(decrypted_name);
|
||||
|
||||
if(fpath != null)
|
||||
{
|
||||
byte[] decrypted_fpath = decrypter.doFinal(BASE642Bin(fpath));
|
||||
|
||||
fpath = new String(decrypted_fpath);
|
||||
}
|
||||
|
||||
pass=Bin2BASE64(info_key);
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MegaCrypterAPI.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
if(fpath != null)
|
||||
{
|
||||
fname = fpath+fname;
|
||||
}
|
||||
|
||||
String file_data[] = {fname, file_size, fkey, pass, noexpire_token};
|
||||
|
||||
return file_data;
|
||||
}
|
||||
|
||||
private static int checkMCError(String data)
|
||||
{
|
||||
String error = findFirstRegex("\"error\" *: *([0-9-]+)", data, 1);
|
||||
|
||||
return error != null?Integer.parseInt(error):0;
|
||||
}
|
||||
|
||||
private MegaCrypterAPI() {
|
||||
}
|
||||
}
|
10
src/megabasterd/MegaCrypterAPIException.java
Normal file
@ -0,0 +1,10 @@
|
||||
package megabasterd;
|
||||
|
||||
public final class MegaCrypterAPIException extends Exception {
|
||||
|
||||
public MegaCrypterAPIException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
|
||||
}
|
30
src/megabasterd/MegaDirNode.java
Normal file
@ -0,0 +1,30 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class MegaDirNode {
|
||||
|
||||
private final String _node_id;
|
||||
|
||||
private final HashMap <String,MegaDirNode> _children;
|
||||
|
||||
public MegaDirNode(String node_id) {
|
||||
|
||||
_node_id = node_id;
|
||||
|
||||
_children = new HashMap<>();
|
||||
}
|
||||
|
||||
public String getNode_id() {
|
||||
return _node_id;
|
||||
}
|
||||
|
||||
public HashMap<String, MegaDirNode> getChildren() {
|
||||
return _children;
|
||||
}
|
||||
|
||||
}
|
39
src/megabasterd/MegaMutableTreeNode.java
Normal file
@ -0,0 +1,39 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.HashMap;
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class MegaMutableTreeNode extends DefaultMutableTreeNode {
|
||||
|
||||
public MegaMutableTreeNode() {
|
||||
super();
|
||||
}
|
||||
|
||||
public MegaMutableTreeNode(Object o) {
|
||||
super(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
if(userObject instanceof HashMap) {
|
||||
|
||||
HashMap<String,Object> user_object = (HashMap<String,Object>)userObject;
|
||||
|
||||
return user_object.get("name") + ((isLeaf() && user_object.get("size")!=null)?" ["+MiscTools.formatBytes((long)user_object.get("size"))+"]":"");
|
||||
|
||||
} else if(userObject instanceof Object) {
|
||||
|
||||
return userObject.toString();
|
||||
|
||||
} else {
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
820
src/megabasterd/MiscTools.java
Normal file
@ -0,0 +1,820 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.FontFormatException;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.math.BigInteger;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Base64;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.FutureTask;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
import javax.swing.tree.MutableTreeNode;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.swing.tree.TreePath;
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
|
||||
public final class MiscTools {
|
||||
|
||||
public static final int EXP_BACKOFF_BASE=2;
|
||||
public static final int EXP_BACKOFF_SECS_RETRY=1;
|
||||
public static final int EXP_BACKOFF_MAX_WAIT_TIME=128;
|
||||
private static final ConcurrentHashMap<String, Method> REFLECTION_METHOD_CACHE = new ConcurrentHashMap<>();
|
||||
private static final Comparator<DefaultMutableTreeNode> _treeNodeComparator = new Comparator< DefaultMutableTreeNode>() {
|
||||
|
||||
@Override public int compare(DefaultMutableTreeNode a, DefaultMutableTreeNode b) {
|
||||
|
||||
|
||||
if (a.isLeaf() && !b.isLeaf()) {
|
||||
return 1;
|
||||
} else if (!a.isLeaf() && b.isLeaf()) {
|
||||
return -1;
|
||||
} else {
|
||||
String sa = a.getUserObject().toString();
|
||||
String sb = b.getUserObject().toString();
|
||||
return sa.compareToIgnoreCase(sb);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static Font createAndRegisterFont(String name) {
|
||||
|
||||
Font font = null;
|
||||
|
||||
try {
|
||||
|
||||
font = Font.createFont(Font.TRUETYPE_FONT, MiscTools.class.getResourceAsStream(name));
|
||||
|
||||
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
|
||||
ge.registerFont(font);
|
||||
|
||||
} catch (FontFormatException | IOException ex) {
|
||||
Logger.getLogger(DownloadView.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
public static void setNimbusLookAndFeel() {
|
||||
|
||||
try {
|
||||
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
|
||||
if ("Nimbus".equals(info.getName())) {
|
||||
javax.swing.UIManager.setLookAndFeel(info.getClassName());
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
|
||||
java.util.logging.Logger.getLogger(MainPanelView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static int[] bin2i32a(byte[] bin)
|
||||
{
|
||||
int l = (int)(4 * Math.ceil((double)bin.length/4));
|
||||
|
||||
byte[] new_bin = Arrays.copyOfRange(bin, 0, l);
|
||||
|
||||
bin = new_bin;
|
||||
|
||||
ByteBuffer bin_buffer = ByteBuffer.wrap(bin);
|
||||
IntBuffer int_buffer = bin_buffer.asIntBuffer();
|
||||
|
||||
if(int_buffer.hasArray()) {
|
||||
return int_buffer.array();
|
||||
}
|
||||
else
|
||||
{
|
||||
ArrayList<Integer> list = new ArrayList();
|
||||
|
||||
while(int_buffer.hasRemaining()) {
|
||||
list.add(int_buffer.get());
|
||||
}
|
||||
|
||||
int[] aux = new int[list.size()];
|
||||
|
||||
for(int i=0; i<aux.length; i++) {
|
||||
aux[i] = list.get(i);
|
||||
}
|
||||
|
||||
return aux;
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] i32a2bin(int[] i32a)
|
||||
{
|
||||
ByteBuffer bin_buffer = ByteBuffer.allocate(i32a.length * 4);
|
||||
IntBuffer int_buffer = bin_buffer.asIntBuffer();
|
||||
int_buffer.put(i32a);
|
||||
|
||||
if(bin_buffer.hasArray()) {
|
||||
return bin_buffer.array();
|
||||
}
|
||||
else
|
||||
{
|
||||
ArrayList<Byte> list = new ArrayList();
|
||||
|
||||
while(int_buffer.hasRemaining()) {
|
||||
list.add(bin_buffer.get());
|
||||
}
|
||||
|
||||
byte[] aux = new byte[list.size()];
|
||||
|
||||
for(int i=0; i<aux.length; i++) {
|
||||
aux[i] = list.get(i);
|
||||
}
|
||||
|
||||
return aux;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static BigInteger mpi2big(byte[] s) {
|
||||
|
||||
byte[] ns = Arrays.copyOfRange(s, 2, s.length);
|
||||
|
||||
BigInteger bigi = new BigInteger(1,ns);
|
||||
|
||||
return bigi;
|
||||
}
|
||||
|
||||
public static String genID(int length) {
|
||||
|
||||
String pos = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
|
||||
String res="";
|
||||
|
||||
Random randomno = new Random();
|
||||
|
||||
for(int i=0; i<length; i++) {
|
||||
|
||||
res+=pos.charAt(randomno.nextInt(pos.length()));
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public static byte[] long2bytearray(long val) {
|
||||
|
||||
byte [] b = new byte[8];
|
||||
|
||||
for (int i = 7; i >= 0; i--) {
|
||||
b[i] = (byte) val;
|
||||
val >>>= 8;
|
||||
}
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
public static long bytearray2long(byte[] val) {
|
||||
|
||||
long l=0;
|
||||
|
||||
for (int i = 0; i <=7; i++) {
|
||||
l+=val[i];
|
||||
l<<=8;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
public static String findFirstRegex(String regex, String data, int group)
|
||||
{
|
||||
Pattern pattern = Pattern.compile(regex);
|
||||
|
||||
Matcher matcher = pattern.matcher(data);
|
||||
|
||||
return matcher.find()?matcher.group(group):null;
|
||||
}
|
||||
|
||||
public static ArrayList<String> findAllRegex(String regex, String data, int group)
|
||||
{
|
||||
Pattern pattern = Pattern.compile(regex);
|
||||
|
||||
Matcher matcher = pattern.matcher(data);
|
||||
|
||||
ArrayList<String> matches = new ArrayList<>();
|
||||
|
||||
while(matcher.find()) {
|
||||
matches.add(matcher.group(group));
|
||||
}
|
||||
|
||||
return matches;
|
||||
}
|
||||
|
||||
public static void updateFont(javax.swing.JComponent label, Font font, int layout)
|
||||
{
|
||||
label.setFont(font.deriveFont(layout, label.getFont().getSize()));
|
||||
}
|
||||
|
||||
|
||||
public static String HashString(String algo, String data) throws NoSuchAlgorithmException, UnsupportedEncodingException
|
||||
{
|
||||
MessageDigest md = MessageDigest.getInstance(algo);
|
||||
|
||||
byte[] thedigest = md.digest(data.getBytes("UTF-8"));
|
||||
|
||||
return bin2hex(thedigest);
|
||||
}
|
||||
|
||||
public static String HashString(String algo, byte[] data) throws NoSuchAlgorithmException
|
||||
{
|
||||
MessageDigest md = MessageDigest.getInstance(algo);
|
||||
|
||||
byte[] thedigest = md.digest(data);
|
||||
|
||||
return bin2hex(thedigest);
|
||||
}
|
||||
|
||||
public static byte[] HashBin(String algo, String data) throws NoSuchAlgorithmException, UnsupportedEncodingException
|
||||
{
|
||||
MessageDigest md = MessageDigest.getInstance(algo);
|
||||
|
||||
return md.digest(data.getBytes("UTF-8"));
|
||||
}
|
||||
|
||||
public static byte[] HashBin(String algo, byte[] data) throws NoSuchAlgorithmException
|
||||
{
|
||||
MessageDigest md = MessageDigest.getInstance(algo);
|
||||
|
||||
return md.digest(data);
|
||||
}
|
||||
|
||||
public static byte[] BASE642Bin(String data) throws Exception
|
||||
{
|
||||
return Base64.getDecoder().decode(data);
|
||||
}
|
||||
|
||||
public static String Bin2BASE64(byte[] data) throws Exception
|
||||
{
|
||||
return Base64.getEncoder().encodeToString(data);
|
||||
}
|
||||
|
||||
public static byte[] UrlBASE642Bin(String data) throws Exception
|
||||
{
|
||||
return Base64.getUrlDecoder().decode(data);
|
||||
}
|
||||
|
||||
public static String Bin2UrlBASE64(byte[] data) throws Exception
|
||||
{
|
||||
return Base64.getUrlEncoder().withoutPadding().encodeToString(data);
|
||||
}
|
||||
|
||||
|
||||
public static long getWaitTimeExpBackOff(int retryCount) {
|
||||
|
||||
long waitTime = ((long) Math.pow(EXP_BACKOFF_BASE, retryCount) * EXP_BACKOFF_SECS_RETRY);
|
||||
|
||||
return Math.min(waitTime, EXP_BACKOFF_MAX_WAIT_TIME);
|
||||
}
|
||||
|
||||
public static void swingReflectionInvoke(final String method_name, final Object obj, final Object... params) {
|
||||
|
||||
_swingReflectionInvoke(method_name, obj, false, params);
|
||||
}
|
||||
|
||||
public static void swingReflectionInvokeAndWait(final String method_name, final Object obj, final Object... params) {
|
||||
|
||||
_swingReflectionInvoke(method_name, obj, true, params);
|
||||
}
|
||||
|
||||
private static void _swingReflectionInvoke(final String method_name, final Object obj, final boolean wait, final Object... params) {
|
||||
|
||||
Runnable r = new Runnable(){
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
Method method;
|
||||
|
||||
try {
|
||||
|
||||
if( (method=REFLECTION_METHOD_CACHE.get( method_name+"#"+obj.getClass().toString()+"#"+String.valueOf(params.length))) != null) {
|
||||
|
||||
try {
|
||||
|
||||
method.invoke(obj, params);
|
||||
|
||||
} catch(SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
|
||||
|
||||
method = null;
|
||||
}
|
||||
}
|
||||
|
||||
if(method == null) {
|
||||
|
||||
for(Method m:obj.getClass().getMethods()) {
|
||||
|
||||
if(m.getName().equals(method_name) && m.getParameterCount() == params.length) {
|
||||
|
||||
try {
|
||||
|
||||
m.invoke(obj, params);
|
||||
|
||||
REFLECTION_METHOD_CACHE.put(method_name+"#"+obj.getClass().toString()+"#"+String.valueOf(params.length), m);
|
||||
|
||||
method = m;
|
||||
|
||||
break;
|
||||
|
||||
}catch(SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(method == null) {
|
||||
|
||||
throw new NoSuchMethodException();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SecurityException | IllegalArgumentException | NoSuchMethodException ex) {
|
||||
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
System.out.println("REFLECTION METHOD NOT FOUND -> "+method_name+"#"+obj.getClass().toString()+"#"+String.valueOf(params.length));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
swingInvokeIt(r, wait);
|
||||
}
|
||||
|
||||
|
||||
public static Object swingReflectionInvokeAndWaitForReturn(final String method_name, final Object obj, final Object... params) {
|
||||
|
||||
Callable c = new Callable(){
|
||||
|
||||
@Override
|
||||
public Object call() {
|
||||
|
||||
Object ret = null;
|
||||
|
||||
Method method;
|
||||
|
||||
try {
|
||||
|
||||
if( (method=REFLECTION_METHOD_CACHE.get( method_name+"#"+obj.getClass().toString()+"#"+String.valueOf(params.length))) != null) {
|
||||
|
||||
try {
|
||||
|
||||
ret = method.invoke(obj, params);
|
||||
|
||||
} catch(SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
|
||||
|
||||
method = null;
|
||||
}
|
||||
}
|
||||
|
||||
if(method == null) {
|
||||
|
||||
for(Method m:obj.getClass().getMethods()) {
|
||||
|
||||
if(m.getName().equals(method_name) && m.getParameterCount() == params.length) {
|
||||
|
||||
try {
|
||||
|
||||
ret = m.invoke(obj, params);
|
||||
|
||||
REFLECTION_METHOD_CACHE.put(method_name+"#"+obj.getClass().toString()+"#"+String.valueOf(params.length), m);
|
||||
|
||||
method = m;
|
||||
|
||||
break;
|
||||
|
||||
}catch(SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(method == null) {
|
||||
|
||||
throw new NoSuchMethodException();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SecurityException | IllegalArgumentException | NoSuchMethodException ex) {
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
return swingInvokeItAndWaitForReturn(c);
|
||||
}
|
||||
|
||||
|
||||
private static void swingInvokeIt(Runnable r, boolean wait) {
|
||||
|
||||
if(wait) {
|
||||
|
||||
if(SwingUtilities.isEventDispatchThread()) {
|
||||
|
||||
r.run();
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
/* OJO!!! El thread que lanza esto NO PUEDE poseer locks que necesite el EDT o se producirá un DEADLOCK */
|
||||
SwingUtilities.invokeAndWait(r);
|
||||
|
||||
} catch (InterruptedException | InvocationTargetException ex) {
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
SwingUtilities.invokeLater(r);
|
||||
}
|
||||
}
|
||||
|
||||
private static Object swingInvokeItAndWaitForReturn(Callable c)
|
||||
{
|
||||
Object ret=null;
|
||||
|
||||
if(SwingUtilities.isEventDispatchThread()) {
|
||||
|
||||
try {
|
||||
ret = c.call();
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
FutureTask<Object> futureTask = new FutureTask<>(c);
|
||||
|
||||
SwingUtilities.invokeLater(futureTask);
|
||||
|
||||
try {
|
||||
ret = futureTask.get();
|
||||
} catch (InterruptedException | ExecutionException ex) {
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static String bin2hex(byte[] b){
|
||||
|
||||
BigInteger bi = new BigInteger(1, b);
|
||||
|
||||
return String.format("%0" + (b.length << 1) + "x", bi);
|
||||
}
|
||||
|
||||
public static byte[] hex2bin(String s) {
|
||||
return DatatypeConverter.parseHexBinary(s);
|
||||
}
|
||||
|
||||
public static void copyTextToClipboard(String text) {
|
||||
|
||||
StringSelection stringSelection = new StringSelection (text);
|
||||
Clipboard clpbrd = Toolkit.getDefaultToolkit ().getSystemClipboard ();
|
||||
clpbrd.setContents (stringSelection, null);
|
||||
|
||||
}
|
||||
|
||||
public static String deflateURL(String link) throws MalformedURLException, IOException {
|
||||
|
||||
String urlString = "http://tinyurl.com/api-create.php?url="+URLEncoder.encode(link.trim(), "UTF-8");
|
||||
|
||||
URL url = new URL(urlString);
|
||||
|
||||
URLConnection conn = url.openConnection();
|
||||
|
||||
conn.setRequestProperty("User-Agent", MainPanel.USER_AGENT);
|
||||
|
||||
String content_encoding = conn.getContentEncoding();
|
||||
|
||||
InputStream is=(content_encoding!=null && content_encoding.equals("gzip"))?new GZIPInputStream(conn.getInputStream()):conn.getInputStream();
|
||||
|
||||
ByteArrayOutputStream byte_res = new ByteArrayOutputStream();
|
||||
|
||||
byte[] buffer = new byte[16*1024];
|
||||
|
||||
int reads;
|
||||
|
||||
while( (reads=is.read(buffer)) != -1 ) {
|
||||
|
||||
byte_res.write(buffer, 0, reads);
|
||||
}
|
||||
|
||||
String response = new String(byte_res.toByteArray()).trim();
|
||||
|
||||
return MiscTools.findFirstRegex("http", response, 0)!=null?response:link;
|
||||
}
|
||||
|
||||
public static String formatBytes(Long bytes) {
|
||||
|
||||
String[] units = {"B", "KB", "MB", "GB", "TB"};
|
||||
|
||||
bytes = Math.max(bytes, 0L);
|
||||
|
||||
int pow = Math.min((int)((bytes>0L?Math.log(bytes):0) / Math.log(1024)), units.length - 1);
|
||||
|
||||
Double bytes_double = (double)bytes/(1 << (10 * pow));
|
||||
|
||||
DecimalFormat df = new DecimalFormat("#.##");
|
||||
|
||||
return df.format(bytes_double) + ' ' + units[pow];
|
||||
}
|
||||
|
||||
public static DefaultMutableTreeNode sortTree(DefaultMutableTreeNode root) {
|
||||
|
||||
Enumeration e = root.depthFirstEnumeration();
|
||||
|
||||
while (e.hasMoreElements()) {
|
||||
|
||||
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
|
||||
|
||||
if (!node.isLeaf()) {
|
||||
|
||||
_sortTreeNode(node);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return root;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static void _sortTreeNode(DefaultMutableTreeNode parent) {
|
||||
|
||||
int n = parent.getChildCount();
|
||||
|
||||
List<DefaultMutableTreeNode> children = new ArrayList<>(n);
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
|
||||
children.add((DefaultMutableTreeNode) parent.getChildAt(i));
|
||||
}
|
||||
|
||||
Collections.sort(children, _treeNodeComparator);
|
||||
|
||||
parent.removeAllChildren();
|
||||
|
||||
for (DefaultMutableTreeNode node: children) {
|
||||
|
||||
parent.add(node);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean deleteSelectedTreeItems(JTree tree) {
|
||||
|
||||
TreePath[] paths = tree.getSelectionPaths();
|
||||
|
||||
if(paths != null) {
|
||||
|
||||
DefaultTreeModel model = (DefaultTreeModel) (tree.getModel());
|
||||
|
||||
DefaultMutableTreeNode node;
|
||||
|
||||
for (TreePath path : paths) {
|
||||
|
||||
node = (DefaultMutableTreeNode) (path.getLastPathComponent());
|
||||
|
||||
if(node != null && node != model.getRoot()) {
|
||||
|
||||
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
|
||||
|
||||
model.removeNodeFromParent(node);
|
||||
|
||||
while(parent.isLeaf() && parent != model.getRoot()) {
|
||||
|
||||
DefaultMutableTreeNode parent_aux = (DefaultMutableTreeNode) parent.getParent();
|
||||
|
||||
model.removeNodeFromParent(parent);
|
||||
|
||||
parent = parent_aux;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean deleteAllExceptSelectedTreeItems(JTree tree) {
|
||||
|
||||
TreePath[] paths = tree.getSelectionPaths();
|
||||
|
||||
HashMap<DefaultMutableTreeNode,DefaultMutableTreeNode> hashmap_old = new HashMap<>();
|
||||
|
||||
if(paths != null) {
|
||||
|
||||
Class node_class = tree.getModel().getRoot().getClass();
|
||||
|
||||
Object new_root = null;
|
||||
|
||||
try {
|
||||
|
||||
new_root = node_class.newInstance();
|
||||
|
||||
((MutableTreeNode)new_root).setUserObject( ((DefaultMutableTreeNode)tree.getModel().getRoot()).getUserObject() );
|
||||
|
||||
} catch (InstantiationException | IllegalAccessException ex) {
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
for (TreePath path : paths) {
|
||||
|
||||
Object parent = new_root;
|
||||
|
||||
for(Object path_element:path.getPath()) {
|
||||
|
||||
if((DefaultMutableTreeNode)path_element != (DefaultMutableTreeNode)tree.getModel().getRoot()) {
|
||||
|
||||
if(hashmap_old.get(path_element) == null) {
|
||||
|
||||
Object node=null;
|
||||
|
||||
if((DefaultMutableTreeNode)path_element == (DefaultMutableTreeNode)path.getLastPathComponent()) {
|
||||
|
||||
node = path_element;
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
|
||||
node = node_class.newInstance();
|
||||
|
||||
((MutableTreeNode)node).setUserObject( ((DefaultMutableTreeNode)path_element).getUserObject() );
|
||||
|
||||
} catch (InstantiationException | IllegalAccessException ex) {
|
||||
Logger.getLogger(MiscTools.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
((DefaultMutableTreeNode)parent).add((MutableTreeNode)node);
|
||||
|
||||
if(!((TreeNode)path_element).isLeaf()) {
|
||||
|
||||
hashmap_old.put((DefaultMutableTreeNode)path_element, (DefaultMutableTreeNode)node);
|
||||
|
||||
parent = node;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
parent = hashmap_old.get(path_element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tree.setModel(new DefaultTreeModel(MiscTools.sortTree((DefaultMutableTreeNode)new_root)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String truncateText(String text, int max_length) {
|
||||
|
||||
String separator = " ... ";
|
||||
|
||||
max_length-=separator.length();
|
||||
|
||||
if(max_length %2 != 0) {
|
||||
|
||||
max_length--;
|
||||
}
|
||||
|
||||
return (text.length() > max_length)?text.replaceAll("^(.{1,"+(max_length/2)+"}).*?(.{1,"+(max_length/2)+"})$", "$1"+separator+"$2"):text;
|
||||
}
|
||||
|
||||
public static String cleanFilename(String filename) {
|
||||
|
||||
return (System.getProperty("os.name").toLowerCase().contains("win")?filename.replaceAll("[<>:\"/\\\\\\|\\?\\*]+", "").replaceAll("[ \\.]{1,}/{1,}", "/"):filename).replaceAll("[\\.]{1,}$", "").trim();
|
||||
}
|
||||
|
||||
public static String cleanFilePath(String path) {
|
||||
|
||||
return path.equals(".")?((System.getProperty("os.name").toLowerCase().contains("win")?path.replaceAll("[<>:\"\\|\\?\\*]+", "").replaceAll("[ \\.]{1,}/{1,}", "/"):path).replaceAll("[\\.]{1,}$", "").trim()):path;
|
||||
}
|
||||
|
||||
public static byte[] genRandomByteArray(int length) {
|
||||
|
||||
byte[] the_array = new byte[length];
|
||||
|
||||
Random randomno = new Random();
|
||||
|
||||
randomno.nextBytes(the_array);
|
||||
|
||||
return the_array;
|
||||
}
|
||||
|
||||
public static String extractStringFromClipboardContents(Transferable contents) {
|
||||
|
||||
String ret = null;
|
||||
|
||||
if(contents != null) {
|
||||
|
||||
try {
|
||||
|
||||
Object o = contents.getTransferData(DataFlavor.stringFlavor);
|
||||
|
||||
if(o instanceof String) {
|
||||
|
||||
ret = (String)o;
|
||||
}
|
||||
|
||||
} catch (Exception ex) {}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
public static String extractMegaLinksFromString(String data) {
|
||||
|
||||
String res = "";
|
||||
|
||||
if(data != null) {
|
||||
|
||||
ArrayList<String> links = MiscTools.findAllRegex("(?:https?|mega)://[^/]*/(#.*?)?!.+![^\r\n]+", data, 0);
|
||||
|
||||
links.addAll(MiscTools.findAllRegex("mega://enc.*?[^\r\n]+", data, 0));
|
||||
|
||||
for(String s:links) {
|
||||
|
||||
res+=s+"\n";
|
||||
}
|
||||
}
|
||||
|
||||
return res.trim();
|
||||
}
|
||||
|
||||
public static String extractFirstMegaLinkFromString(String data) {
|
||||
|
||||
String res = "";
|
||||
|
||||
if(data != null) {
|
||||
|
||||
ArrayList<String> links = MiscTools.findAllRegex("(?:https?|mega)://[^/]*/(#.*?)?!.+![^\r\n]+", data, 0);
|
||||
|
||||
links.addAll(MiscTools.findAllRegex("mega://enc.*?[^\r\n]+", data, 0));
|
||||
|
||||
if(links.size()>0) {
|
||||
|
||||
res = links.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
private MiscTools() {
|
||||
}
|
||||
|
||||
|
||||
}
|
88
src/megabasterd/ProgressMeter.java
Normal file
@ -0,0 +1,88 @@
|
||||
package megabasterd;
|
||||
|
||||
import static java.lang.System.out;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
|
||||
public final class ProgressMeter implements Runnable, SecureNotifiable
|
||||
{
|
||||
private final Transference _transference;
|
||||
private volatile boolean _exit;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified=false;
|
||||
|
||||
ProgressMeter(Transference transference)
|
||||
{
|
||||
_secure_notify_lock = new Object();
|
||||
_transference = transference;
|
||||
_exit = false;
|
||||
}
|
||||
|
||||
public void setExit(boolean value)
|
||||
{
|
||||
_exit = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
getLogger(ProgressMeter.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
out.println("ProgressMeter hello!");
|
||||
|
||||
while(!_exit || !_transference.getPartialProgress().isEmpty())
|
||||
{
|
||||
Integer reads;
|
||||
|
||||
while( (reads=_transference.getPartialProgress().poll()) !=null )
|
||||
{
|
||||
_transference.updateProgress(reads);
|
||||
}
|
||||
|
||||
if(!_exit)
|
||||
{
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
14
src/megabasterd/SecureNotifiable.java
Normal file
@ -0,0 +1,14 @@
|
||||
package megabasterd;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public interface SecureNotifiable {
|
||||
|
||||
public void secureNotify();
|
||||
|
||||
public void secureNotifyAll();
|
||||
|
||||
public void secureWait();
|
||||
}
|
542
src/megabasterd/SettingsDialog.form
Normal file
@ -0,0 +1,542 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="title" type="java.lang.String" value="Settings"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jTabbedPane1" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="status" max="32767" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="ok_button" min="-2" pref="130" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="cancel_button" min="-2" pref="130" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jTabbedPane1" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="ok_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cancel_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="status" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JButton" name="ok_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="22" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="OK"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="ok_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="cancel_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="22" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="CANCEL"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancel_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Container class="javax.swing.JTabbedPane" name="jTabbedPane1">
|
||||
<Properties>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="22" style="1"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="downloads_panel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Downloads">
|
||||
<Property name="tabTitle" type="java.lang.String" value="Downloads"/>
|
||||
</JTabbedPaneConstraints>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="change_download_dir_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="default_dir_label" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="verify_file_down_checkbox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="max_down_speed_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="max_down_speed_spinner" min="-2" pref="100" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="max_downloads_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="79" max="-2" attributes="0"/>
|
||||
<Component id="max_downloads_spinner" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="default_slots_down_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="default_slots_down_spinner" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Component id="limit_download_speed_checkbox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="multi_slot_down_checkbox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="down_dir_label" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" pref="14" max="-2" attributes="0"/>
|
||||
<Component id="down_dir_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="change_download_dir_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="default_dir_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="max_downloads_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="max_downloads_spinner" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="multi_slot_down_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="default_slots_down_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="default_slots_down_spinner" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="limit_download_speed_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="max_down_speed_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="max_down_speed_spinner" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="verify_file_down_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="221" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JSpinner" name="default_slots_down_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="value" type="java.lang.Object" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="2" type="code"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="max_downloads_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Max sim downloads:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="max_downloads_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="verify_file_down_checkbox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Verify file integrity (when download is finished)"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="down_dir_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Default downloads directory:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="change_download_dir_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Change it"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="change_download_dir_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="default_slots_down_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Default slots per file:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="multi_slot_down_checkbox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Use multi slot download mode (NOT recommended. Download restart needed.)"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="multi_slot_down_checkboxStateChanged"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="limit_download_speed_checkbox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Limit download speed"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="limit_download_speed_checkboxStateChanged"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="max_down_speed_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Max speed (KB/s):"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="max_down_speed_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="default_dir_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="uploads_panel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Uploads">
|
||||
<Property name="tabTitle" type="java.lang.String" value="Uploads"/>
|
||||
</JTabbedPaneConstraints>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="accounts_scrollpane" alignment="0" pref="924" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="accounts_label" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="defaut_slots_up_label" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" alignment="1" groupAlignment="0" attributes="0">
|
||||
<Component id="max_up_speed_label" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="limit_upload_speed_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="default_slots_up" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="max_up_speed_spinner" min="-2" pref="100" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="max_uploads_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="123" max="-2" attributes="0"/>
|
||||
<Component id="max_uploads_spinner" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="multi_slot_up_checkbox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="remove_account_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="add_account_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
||||
<Component id="accounts_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="accounts_scrollpane" min="-2" pref="250" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="remove_account_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="add_account_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="max_uploads_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="max_uploads_spinner" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="multi_slot_up_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="defaut_slots_up_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="default_slots_up" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="limit_upload_speed_checkbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="max_up_speed_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="max_up_speed_spinner" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="25" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="accounts_scrollpane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTable" name="jTable1">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="0"/>
|
||||
</Property>
|
||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||
<Table columnCount="2" rowCount="0">
|
||||
<Column editable="true" title="Email" type="java.lang.Object"/>
|
||||
<Column editable="true" title="Password" type="java.lang.Object"/>
|
||||
</Table>
|
||||
</Property>
|
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
|
||||
<Color id="Cursor Por defecto"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="rowHeight" type="int" value="24"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JLabel" name="accounts_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Your MEGA accounts:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="remove_account_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Remove selected"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="remove_account_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="add_account_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Add account"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="add_account_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="defaut_slots_up_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Default slots per file:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="max_uploads_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Max sim uploads:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="default_slots_up">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
<Property name="value" type="java.lang.Object" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="2" type="code"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="max_uploads_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="multi_slot_up_checkbox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Use multi slot upload mode (Recommended. Upload restart needed.)"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="multi_slot_up_checkboxStateChanged"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="max_up_speed_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Max speed (KB/s):"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="max_up_speed_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="limit_upload_speed_checkbox">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Limit upload speed"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="limit_upload_speed_checkboxStateChanged"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JLabel" name="status">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
925
src/megabasterd/SettingsDialog.java
Normal file
@ -0,0 +1,925 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.File;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
import javax.swing.table.DefaultTableModel;
|
||||
import static megabasterd.DBTools.insertSettingValueInDB;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MiscTools.Bin2BASE64;
|
||||
import static megabasterd.MiscTools.i32a2bin;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWaitForReturn;
|
||||
import static megabasterd.MiscTools.truncateText;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
|
||||
|
||||
public final class SettingsDialog extends javax.swing.JDialog {
|
||||
|
||||
private String _download_path;
|
||||
private boolean _settings_ok;
|
||||
private final Set<String> _deleted_accounts;
|
||||
private final MainPanel _main_panel;
|
||||
|
||||
public boolean isSettings_ok() {
|
||||
return _settings_ok;
|
||||
}
|
||||
|
||||
public Set<String> getDeleted_accounts() {
|
||||
return _deleted_accounts;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Creates new form Settings
|
||||
* @param parent
|
||||
* @param modal
|
||||
*/
|
||||
public SettingsDialog(javax.swing.JFrame parent, boolean modal) {
|
||||
super(parent, modal);
|
||||
initComponents();
|
||||
|
||||
updateFont(change_download_dir_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(down_dir_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(ok_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(cancel_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(default_slots_down_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(default_slots_down_spinner, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(default_slots_up, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(max_downloads_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(max_downloads_spinner, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(max_uploads_spinner, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(verify_file_down_checkbox, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(multi_slot_down_checkbox, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(multi_slot_up_checkbox, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(jTabbedPane1, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(status, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(remove_account_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(add_account_button, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(accounts_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(defaut_slots_up_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(max_uploads_label, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
updateFont(max_down_speed_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(limit_download_speed_checkbox, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(max_down_speed_spinner, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
updateFont(max_up_speed_spinner, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(max_up_speed_label, FONT_DEFAULT, Font.PLAIN);
|
||||
updateFont(limit_upload_speed_checkbox, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
updateFont(default_dir_label, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
_main_panel = ((MainPanelView)parent).getMain_panel();
|
||||
|
||||
String default_download_dir = DBTools.selectSettingValueFromDB("default_down_dir");
|
||||
|
||||
if(default_download_dir == null) {
|
||||
default_download_dir = ".";
|
||||
}
|
||||
|
||||
_download_path = default_download_dir;
|
||||
|
||||
swingReflectionInvoke("setText", default_dir_label, truncateText(_download_path, 80));
|
||||
|
||||
String slots = DBTools.selectSettingValueFromDB("default_slots_down");
|
||||
|
||||
int default_slots=Download.WORKERS_DEFAULT;
|
||||
|
||||
if(slots != null) {
|
||||
default_slots = Integer.parseInt(slots);
|
||||
}
|
||||
|
||||
default_slots_down_spinner.setModel(new SpinnerNumberModel(default_slots, Download.MIN_WORKERS, Download.MAX_WORKERS, 1));
|
||||
((JSpinner.DefaultEditor)default_slots_down_spinner.getEditor()).getTextField().setEditable(false);
|
||||
|
||||
|
||||
slots = DBTools.selectSettingValueFromDB("default_slots_up");
|
||||
|
||||
default_slots=Upload.WORKERS_DEFAULT;
|
||||
|
||||
if(slots != null) {
|
||||
default_slots = Integer.parseInt(slots);
|
||||
}
|
||||
|
||||
default_slots_up.setModel(new SpinnerNumberModel(default_slots, Upload.MIN_WORKERS, Upload.MAX_WORKERS, 1));
|
||||
((JSpinner.DefaultEditor)default_slots_up.getEditor()).getTextField().setEditable(false);
|
||||
|
||||
String max_down = DBTools.selectSettingValueFromDB("max_downloads");
|
||||
|
||||
int max_dl = Download.SIM_TRANSFERENCES_DEFAULT;
|
||||
|
||||
if(max_down != null) {
|
||||
max_dl = Integer.parseInt(max_down);
|
||||
}
|
||||
|
||||
|
||||
this.max_downloads_spinner.setModel(new SpinnerNumberModel(max_dl, 1, Download.MAX_SIM_TRANSFERENCES, 1));
|
||||
((JSpinner.DefaultEditor)this.max_downloads_spinner.getEditor()).getTextField().setEditable(false);
|
||||
|
||||
|
||||
String max_up = DBTools.selectSettingValueFromDB("max_uploads");
|
||||
|
||||
int max_ul = Upload.SIM_TRANSFERENCES_DEFAULT;
|
||||
|
||||
if(max_up != null) {
|
||||
max_ul = Integer.parseInt(max_up);
|
||||
}
|
||||
|
||||
|
||||
this.max_uploads_spinner.setModel(new SpinnerNumberModel(max_ul, 1, Upload.MAX_SIM_TRANSFERENCES, 1));
|
||||
((JSpinner.DefaultEditor)this.max_uploads_spinner.getEditor()).getTextField().setEditable(false);
|
||||
|
||||
|
||||
|
||||
boolean limit_dl_speed = Download.LIMIT_TRANSFERENCE_SPEED_DEFAULT;
|
||||
|
||||
String limit_download_speed = DBTools.selectSettingValueFromDB("limit_download_speed");
|
||||
|
||||
if(limit_download_speed != null) {
|
||||
limit_dl_speed = limit_download_speed.equals("yes");
|
||||
}
|
||||
|
||||
limit_download_speed_checkbox.setSelected(limit_dl_speed);
|
||||
|
||||
if(!limit_dl_speed) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_spinner, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_label, true);
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_spinner, true);
|
||||
}
|
||||
|
||||
String max_dl_speed = DBTools.selectSettingValueFromDB("max_download_speed");
|
||||
|
||||
int max_download_speed = Download.MAX_TRANSFERENCE_SPEED_DEFAULT;
|
||||
|
||||
if(max_dl_speed != null) {
|
||||
max_download_speed = Integer.parseInt(max_dl_speed);
|
||||
}
|
||||
|
||||
|
||||
max_down_speed_spinner.setModel(new SpinnerNumberModel(max_download_speed, 0, Integer.MAX_VALUE, 1));
|
||||
((JSpinner.DefaultEditor)max_down_speed_spinner.getEditor()).getTextField().setEditable(true);
|
||||
|
||||
|
||||
boolean limit_ul_speed = Upload.LIMIT_TRANSFERENCE_SPEED_DEFAULT;
|
||||
|
||||
String limit_upload_speed = DBTools.selectSettingValueFromDB("limit_upload_speed");
|
||||
|
||||
if(limit_upload_speed != null) {
|
||||
limit_ul_speed = limit_upload_speed.equals("yes");
|
||||
}
|
||||
|
||||
limit_upload_speed_checkbox.setSelected(limit_ul_speed);
|
||||
|
||||
if(!limit_ul_speed) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_spinner, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_label, true);
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_spinner, true);
|
||||
}
|
||||
|
||||
String max_ul_speed = DBTools.selectSettingValueFromDB("max_upload_speed");
|
||||
|
||||
int max_upload_speed = Upload.MAX_TRANSFERENCE_SPEED_DEFAULT;
|
||||
|
||||
if(max_ul_speed != null) {
|
||||
max_upload_speed = Integer.parseInt(max_ul_speed);
|
||||
}
|
||||
|
||||
max_up_speed_spinner.setModel(new SpinnerNumberModel(max_upload_speed, 0, Integer.MAX_VALUE, 1));
|
||||
|
||||
((JSpinner.DefaultEditor)max_up_speed_spinner.getEditor()).getTextField().setEditable(true);
|
||||
|
||||
|
||||
boolean cbc_mac = Download.VERIFY_CBC_MAC_DEFAULT;
|
||||
|
||||
String verify_file = DBTools.selectSettingValueFromDB("verify_down_file");
|
||||
|
||||
if(verify_file != null) {
|
||||
cbc_mac = (verify_file.equals("yes"));
|
||||
}
|
||||
|
||||
verify_file_down_checkbox.setSelected(cbc_mac);
|
||||
|
||||
boolean use_slots = Download.USE_SLOTS_DEFAULT;
|
||||
|
||||
String use_slots_val = DBTools.selectSettingValueFromDB("use_slots_down");
|
||||
|
||||
if(use_slots_val != null) {
|
||||
use_slots = use_slots_val.equals("yes");
|
||||
}
|
||||
|
||||
multi_slot_down_checkbox.setSelected(use_slots);
|
||||
|
||||
if(!use_slots) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_label, false);
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_spinner, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_label, true);
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_spinner, true);
|
||||
}
|
||||
|
||||
|
||||
use_slots = Upload.USE_SLOTS_DEFAULT;
|
||||
|
||||
use_slots_val = DBTools.selectSettingValueFromDB("use_slots_up");
|
||||
|
||||
if(use_slots_val != null) {
|
||||
use_slots = use_slots_val.equals("yes");
|
||||
}
|
||||
|
||||
multi_slot_up_checkbox.setSelected(use_slots);
|
||||
|
||||
if(!use_slots) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", defaut_slots_up_label, false);
|
||||
swingReflectionInvoke("setEnabled", default_slots_up, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", max_uploads_label, true);
|
||||
swingReflectionInvoke("setEnabled", default_slots_up, true);
|
||||
}
|
||||
|
||||
DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
|
||||
|
||||
for (HashMap.Entry pair : _main_panel.getMega_accounts().entrySet()) {
|
||||
|
||||
HashMap<String,Object> data = (HashMap)pair.getValue();
|
||||
|
||||
String[] new_row_data = {(String)pair.getKey(), (String)data.get("password")};
|
||||
|
||||
model.addRow(new_row_data);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setEnabled", remove_account_button, (jTable1.getRowCount()>0));
|
||||
|
||||
_deleted_accounts = new HashSet();
|
||||
|
||||
_settings_ok = false;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
ok_button = new javax.swing.JButton();
|
||||
cancel_button = new javax.swing.JButton();
|
||||
jTabbedPane1 = new javax.swing.JTabbedPane();
|
||||
downloads_panel = new javax.swing.JPanel();
|
||||
default_slots_down_spinner = new javax.swing.JSpinner();
|
||||
max_downloads_label = new javax.swing.JLabel();
|
||||
max_downloads_spinner = new javax.swing.JSpinner();
|
||||
verify_file_down_checkbox = new javax.swing.JCheckBox();
|
||||
down_dir_label = new javax.swing.JLabel();
|
||||
change_download_dir_button = new javax.swing.JButton();
|
||||
default_slots_down_label = new javax.swing.JLabel();
|
||||
multi_slot_down_checkbox = new javax.swing.JCheckBox();
|
||||
limit_download_speed_checkbox = new javax.swing.JCheckBox();
|
||||
max_down_speed_label = new javax.swing.JLabel();
|
||||
max_down_speed_spinner = new javax.swing.JSpinner();
|
||||
default_dir_label = new javax.swing.JLabel();
|
||||
uploads_panel = new javax.swing.JPanel();
|
||||
accounts_scrollpane = new javax.swing.JScrollPane();
|
||||
jTable1 = new javax.swing.JTable();
|
||||
accounts_label = new javax.swing.JLabel();
|
||||
remove_account_button = new javax.swing.JButton();
|
||||
add_account_button = new javax.swing.JButton();
|
||||
defaut_slots_up_label = new javax.swing.JLabel();
|
||||
max_uploads_label = new javax.swing.JLabel();
|
||||
default_slots_up = new javax.swing.JSpinner();
|
||||
max_uploads_spinner = new javax.swing.JSpinner();
|
||||
multi_slot_up_checkbox = new javax.swing.JCheckBox();
|
||||
max_up_speed_label = new javax.swing.JLabel();
|
||||
max_up_speed_spinner = new javax.swing.JSpinner();
|
||||
limit_upload_speed_checkbox = new javax.swing.JCheckBox();
|
||||
status = new javax.swing.JLabel();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setTitle("Settings");
|
||||
|
||||
ok_button.setFont(new java.awt.Font("Dialog", 1, 22)); // NOI18N
|
||||
ok_button.setText("OK");
|
||||
ok_button.setDoubleBuffered(true);
|
||||
ok_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
ok_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
cancel_button.setFont(new java.awt.Font("Dialog", 1, 22)); // NOI18N
|
||||
cancel_button.setText("CANCEL");
|
||||
cancel_button.setDoubleBuffered(true);
|
||||
cancel_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
cancel_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
jTabbedPane1.setDoubleBuffered(true);
|
||||
jTabbedPane1.setFont(new java.awt.Font("Dialog", 1, 22)); // NOI18N
|
||||
|
||||
default_slots_down_spinner.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
default_slots_down_spinner.setDoubleBuffered(true);
|
||||
default_slots_down_spinner.setValue(2);
|
||||
|
||||
max_downloads_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
max_downloads_label.setText("Max sim downloads:");
|
||||
max_downloads_label.setDoubleBuffered(true);
|
||||
|
||||
max_downloads_spinner.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
max_downloads_spinner.setDoubleBuffered(true);
|
||||
|
||||
verify_file_down_checkbox.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
verify_file_down_checkbox.setText("Verify file integrity (when download is finished)");
|
||||
verify_file_down_checkbox.setDoubleBuffered(true);
|
||||
|
||||
down_dir_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
down_dir_label.setText("Default downloads directory:");
|
||||
down_dir_label.setDoubleBuffered(true);
|
||||
|
||||
change_download_dir_button.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
change_download_dir_button.setText("Change it");
|
||||
change_download_dir_button.setDoubleBuffered(true);
|
||||
change_download_dir_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
change_download_dir_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
default_slots_down_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
default_slots_down_label.setText("Default slots per file:");
|
||||
default_slots_down_label.setDoubleBuffered(true);
|
||||
|
||||
multi_slot_down_checkbox.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
multi_slot_down_checkbox.setText("Use multi slot download mode (NOT recommended. Download restart needed.)");
|
||||
multi_slot_down_checkbox.setDoubleBuffered(true);
|
||||
multi_slot_down_checkbox.addChangeListener(new javax.swing.event.ChangeListener() {
|
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
||||
multi_slot_down_checkboxStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
limit_download_speed_checkbox.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
limit_download_speed_checkbox.setText("Limit download speed");
|
||||
limit_download_speed_checkbox.addChangeListener(new javax.swing.event.ChangeListener() {
|
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
||||
limit_download_speed_checkboxStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
max_down_speed_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
max_down_speed_label.setText("Max speed (KB/s):");
|
||||
|
||||
max_down_speed_spinner.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
|
||||
default_dir_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout downloads_panelLayout = new javax.swing.GroupLayout(downloads_panel);
|
||||
downloads_panel.setLayout(downloads_panelLayout);
|
||||
downloads_panelLayout.setHorizontalGroup(
|
||||
downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addComponent(change_download_dir_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(default_dir_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(verify_file_down_checkbox)
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, downloads_panelLayout.createSequentialGroup()
|
||||
.addComponent(max_down_speed_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(max_down_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addComponent(max_downloads_label)
|
||||
.addGap(79, 79, 79)
|
||||
.addComponent(max_downloads_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addComponent(default_slots_down_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(default_slots_down_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addComponent(limit_download_speed_checkbox)
|
||||
.addComponent(multi_slot_down_checkbox)
|
||||
.addComponent(down_dir_label))
|
||||
.addGap(0, 0, Short.MAX_VALUE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
downloads_panelLayout.setVerticalGroup(
|
||||
downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(downloads_panelLayout.createSequentialGroup()
|
||||
.addGap(14, 14, 14)
|
||||
.addComponent(down_dir_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(change_download_dir_button)
|
||||
.addComponent(default_dir_label))
|
||||
.addGap(18, 18, 18)
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(max_downloads_label)
|
||||
.addComponent(max_downloads_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(multi_slot_down_checkbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(default_slots_down_label)
|
||||
.addComponent(default_slots_down_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(limit_download_speed_checkbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(downloads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(max_down_speed_label)
|
||||
.addComponent(max_down_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(verify_file_down_checkbox)
|
||||
.addContainerGap(221, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab("Downloads", downloads_panel);
|
||||
|
||||
jTable1.setFont(new java.awt.Font("Dialog", 0, 18)); // NOI18N
|
||||
jTable1.setModel(new javax.swing.table.DefaultTableModel(
|
||||
new Object [][] {
|
||||
|
||||
},
|
||||
new String [] {
|
||||
"Email", "Password"
|
||||
}
|
||||
));
|
||||
jTable1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
|
||||
jTable1.setDoubleBuffered(true);
|
||||
jTable1.setRowHeight(24);
|
||||
accounts_scrollpane.setViewportView(jTable1);
|
||||
|
||||
accounts_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
accounts_label.setText("Your MEGA accounts:");
|
||||
accounts_label.setDoubleBuffered(true);
|
||||
|
||||
remove_account_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
remove_account_button.setText("Remove selected");
|
||||
remove_account_button.setDoubleBuffered(true);
|
||||
remove_account_button.setEnabled(false);
|
||||
remove_account_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
remove_account_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
add_account_button.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
add_account_button.setText("Add account");
|
||||
add_account_button.setDoubleBuffered(true);
|
||||
add_account_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
add_account_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
defaut_slots_up_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
defaut_slots_up_label.setText("Default slots per file:");
|
||||
defaut_slots_up_label.setDoubleBuffered(true);
|
||||
|
||||
max_uploads_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
max_uploads_label.setText("Max sim uploads:");
|
||||
max_uploads_label.setDoubleBuffered(true);
|
||||
|
||||
default_slots_up.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
default_slots_up.setDoubleBuffered(true);
|
||||
default_slots_up.setValue(2);
|
||||
|
||||
max_uploads_spinner.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
max_uploads_spinner.setDoubleBuffered(true);
|
||||
|
||||
multi_slot_up_checkbox.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
multi_slot_up_checkbox.setText("Use multi slot upload mode (Recommended. Upload restart needed.)");
|
||||
multi_slot_up_checkbox.setDoubleBuffered(true);
|
||||
multi_slot_up_checkbox.addChangeListener(new javax.swing.event.ChangeListener() {
|
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
||||
multi_slot_up_checkboxStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
max_up_speed_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
max_up_speed_label.setText("Max speed (KB/s):");
|
||||
|
||||
max_up_speed_spinner.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
|
||||
limit_upload_speed_checkbox.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
limit_upload_speed_checkbox.setText("Limit upload speed");
|
||||
limit_upload_speed_checkbox.addChangeListener(new javax.swing.event.ChangeListener() {
|
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
||||
limit_upload_speed_checkboxStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout uploads_panelLayout = new javax.swing.GroupLayout(uploads_panel);
|
||||
uploads_panel.setLayout(uploads_panelLayout);
|
||||
uploads_panelLayout.setHorizontalGroup(
|
||||
uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(accounts_scrollpane, javax.swing.GroupLayout.DEFAULT_SIZE, 924, Short.MAX_VALUE)
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(accounts_label)
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(defaut_slots_up_label)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(max_up_speed_label)
|
||||
.addComponent(limit_upload_speed_checkbox)))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(default_slots_up, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(max_up_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addComponent(max_uploads_label)
|
||||
.addGap(123, 123, 123)
|
||||
.addComponent(max_uploads_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addComponent(multi_slot_up_checkbox))
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addComponent(remove_account_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(add_account_button)))
|
||||
.addContainerGap())
|
||||
);
|
||||
uploads_panelLayout.setVerticalGroup(
|
||||
uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(uploads_panelLayout.createSequentialGroup()
|
||||
.addGap(6, 6, 6)
|
||||
.addComponent(accounts_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(accounts_scrollpane, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(remove_account_button)
|
||||
.addComponent(add_account_button))
|
||||
.addGap(18, 18, 18)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(max_uploads_label)
|
||||
.addComponent(max_uploads_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(multi_slot_up_checkbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(defaut_slots_up_label)
|
||||
.addComponent(default_slots_up, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(limit_upload_speed_checkbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(uploads_panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(max_up_speed_label)
|
||||
.addComponent(max_up_speed_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addContainerGap(25, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab("Uploads", uploads_panel);
|
||||
|
||||
status.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
status.setDoubleBuffered(true);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jTabbedPane1)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(status, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(ok_button, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(cancel_button, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(ok_button)
|
||||
.addComponent(cancel_button))
|
||||
.addContainerGap())
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(status)
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void change_download_dir_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_change_download_dir_buttonActionPerformed
|
||||
|
||||
|
||||
javax.swing.JFileChooser filechooser = new javax.swing.JFileChooser();
|
||||
|
||||
filechooser.setCurrentDirectory(new java.io.File(_download_path));
|
||||
filechooser.setDialogTitle("Default download directory");
|
||||
filechooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
|
||||
filechooser.setAcceptAllFileFilterUsed(false);
|
||||
|
||||
if( filechooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {
|
||||
|
||||
File file = filechooser.getSelectedFile();
|
||||
|
||||
_download_path = file.getAbsolutePath();
|
||||
|
||||
swingReflectionInvoke("setText", default_dir_label, truncateText(_download_path, 80));
|
||||
|
||||
}
|
||||
}//GEN-LAST:event_change_download_dir_buttonActionPerformed
|
||||
|
||||
private void cancel_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancel_buttonActionPerformed
|
||||
|
||||
|
||||
swingReflectionInvoke("setVisible", this, false);
|
||||
}//GEN-LAST:event_cancel_buttonActionPerformed
|
||||
|
||||
private void ok_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ok_buttonActionPerformed
|
||||
|
||||
try {
|
||||
|
||||
|
||||
_settings_ok = true;
|
||||
|
||||
insertSettingValueInDB("default_down_dir", _download_path);
|
||||
insertSettingValueInDB("default_slots_down", String.valueOf((int)swingReflectionInvokeAndWaitForReturn("getValue", default_slots_down_spinner)));
|
||||
insertSettingValueInDB("default_slots_up", String.valueOf((int)swingReflectionInvokeAndWaitForReturn("getValue", default_slots_up)));
|
||||
insertSettingValueInDB("use_slots_down", (boolean)swingReflectionInvokeAndWaitForReturn("isSelected", multi_slot_down_checkbox)?"yes":"no");
|
||||
insertSettingValueInDB("use_slots_up", (boolean)swingReflectionInvokeAndWaitForReturn("isSelected", multi_slot_up_checkbox)?"yes":"no");
|
||||
insertSettingValueInDB("max_downloads", String.valueOf((int)swingReflectionInvokeAndWaitForReturn("getValue", max_downloads_spinner)));
|
||||
insertSettingValueInDB("max_uploads", String.valueOf((int)swingReflectionInvokeAndWaitForReturn("getValue", max_uploads_spinner)));
|
||||
insertSettingValueInDB("verify_down_file", (boolean)swingReflectionInvokeAndWaitForReturn("isSelected", verify_file_down_checkbox)?"yes":"no");
|
||||
insertSettingValueInDB("limit_download_speed", (boolean)swingReflectionInvokeAndWaitForReturn("isSelected", limit_download_speed_checkbox)?"yes":"no");
|
||||
insertSettingValueInDB("max_download_speed", String.valueOf((int)swingReflectionInvokeAndWaitForReturn("getValue", max_down_speed_spinner)));
|
||||
insertSettingValueInDB("limit_upload_speed", (boolean)swingReflectionInvokeAndWaitForReturn("isSelected", limit_upload_speed_checkbox)?"yes":"no");
|
||||
insertSettingValueInDB("max_upload_speed", String.valueOf((int)swingReflectionInvokeAndWaitForReturn("getValue", max_up_speed_spinner)));
|
||||
|
||||
|
||||
final DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
|
||||
|
||||
swingReflectionInvoke("setText", status, "Checking your MEGA accounts, please wait...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", ok_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", cancel_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", remove_account_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", add_account_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", jTable1, false);
|
||||
|
||||
final SettingsDialog dialog = this;
|
||||
|
||||
MainPanel.THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
ArrayList<String> email_error = new ArrayList<>();
|
||||
|
||||
for(int i=0; i<model.getRowCount(); i++) {
|
||||
|
||||
String email = (String)model.getValueAt(i, 0);
|
||||
|
||||
String pass = (String)model.getValueAt(i, 1);
|
||||
|
||||
if(!email.isEmpty() && !pass.isEmpty()) {
|
||||
|
||||
MegaAPI ma;
|
||||
|
||||
if(dialog._main_panel.getMega_accounts().get(email) == null){
|
||||
|
||||
ma = new MegaAPI();
|
||||
|
||||
try {
|
||||
ma.login(email, pass);
|
||||
|
||||
dialog._main_panel.getMega_active_accounts().put(email, ma);
|
||||
|
||||
DBTools.insertMegaAccount(email, pass, Bin2BASE64(i32a2bin(ma.getPassword_aes())), ma.getUser_hash());
|
||||
|
||||
} catch(Exception ex) {
|
||||
|
||||
email_error.add(email);
|
||||
Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
HashMap<String,Object> mega_account_data = (HashMap)dialog._main_panel.getMega_accounts().get(email);
|
||||
|
||||
if(!mega_account_data.get("password").equals(pass)) {
|
||||
|
||||
ma = new MegaAPI();
|
||||
|
||||
try {
|
||||
ma.login(email, pass);
|
||||
|
||||
dialog._main_panel.getMega_active_accounts().put(email, ma);
|
||||
|
||||
DBTools.insertMegaAccount(email, pass, Bin2BASE64(i32a2bin(ma.getPassword_aes())), ma.getUser_hash());
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
||||
email_error.add(email);
|
||||
Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(email_error.size() > 0) {
|
||||
|
||||
String email_error_s = "";
|
||||
|
||||
for(String s:email_error) {
|
||||
|
||||
email_error_s+=s+"\n";
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setText", dialog.status, "");
|
||||
|
||||
JOptionPane.showMessageDialog(dialog, "There were errors with some accounts. Please, check them:\n\n"+email_error_s);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dialog.ok_button, true);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dialog.cancel_button, true);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dialog.remove_account_button, true);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dialog.add_account_button, true);
|
||||
|
||||
swingReflectionInvoke("setEnabled", dialog.jTable1, true);
|
||||
|
||||
} else {
|
||||
swingReflectionInvoke("setVisible", dialog, false);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
} catch (SQLException ex) {
|
||||
Logger.getLogger(SettingsDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}//GEN-LAST:event_ok_buttonActionPerformed
|
||||
|
||||
private void multi_slot_down_checkboxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_multi_slot_down_checkboxStateChanged
|
||||
|
||||
|
||||
if(!(boolean)swingReflectionInvokeAndWaitForReturn("isSelected", multi_slot_down_checkbox)) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_spinner, false);
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_label, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_spinner, true);
|
||||
swingReflectionInvoke("setEnabled", default_slots_down_label, true);
|
||||
}
|
||||
}//GEN-LAST:event_multi_slot_down_checkboxStateChanged
|
||||
|
||||
private void remove_account_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_remove_account_buttonActionPerformed
|
||||
|
||||
|
||||
DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
|
||||
|
||||
int selected = jTable1.getSelectedRow();
|
||||
|
||||
while(selected >= 0) {
|
||||
|
||||
String email = (String)model.getValueAt(jTable1.convertRowIndexToModel(selected),0);
|
||||
|
||||
_deleted_accounts.add(email);
|
||||
|
||||
model.removeRow(jTable1.convertRowIndexToModel(selected));
|
||||
|
||||
selected = jTable1.getSelectedRow();
|
||||
}
|
||||
|
||||
jTable1.clearSelection();
|
||||
|
||||
if(model.getRowCount() == 0) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", remove_account_button, false);
|
||||
}
|
||||
}//GEN-LAST:event_remove_account_buttonActionPerformed
|
||||
|
||||
private void add_account_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_add_account_buttonActionPerformed
|
||||
|
||||
|
||||
DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
|
||||
|
||||
model.addRow(new Object[]{"",""});
|
||||
|
||||
jTable1.clearSelection();
|
||||
|
||||
swingReflectionInvoke("setEnabled", ok_button, true);
|
||||
}//GEN-LAST:event_add_account_buttonActionPerformed
|
||||
|
||||
private void multi_slot_up_checkboxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_multi_slot_up_checkboxStateChanged
|
||||
|
||||
|
||||
if(!(boolean)swingReflectionInvokeAndWaitForReturn("isSelected", multi_slot_up_checkbox)) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", defaut_slots_up_label, false);
|
||||
swingReflectionInvoke("setEnabled", default_slots_up, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", defaut_slots_up_label, true);
|
||||
swingReflectionInvoke("setEnabled", default_slots_up, true);
|
||||
}
|
||||
}//GEN-LAST:event_multi_slot_up_checkboxStateChanged
|
||||
|
||||
private void limit_download_speed_checkboxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_limit_download_speed_checkboxStateChanged
|
||||
|
||||
|
||||
if(!(boolean)swingReflectionInvokeAndWaitForReturn("isSelected", limit_download_speed_checkbox)) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_spinner, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_label, true);
|
||||
swingReflectionInvoke("setEnabled", max_down_speed_spinner, true);
|
||||
}
|
||||
}//GEN-LAST:event_limit_download_speed_checkboxStateChanged
|
||||
|
||||
private void limit_upload_speed_checkboxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_limit_upload_speed_checkboxStateChanged
|
||||
|
||||
|
||||
if(!(boolean)swingReflectionInvokeAndWaitForReturn("isSelected", limit_upload_speed_checkbox)) {
|
||||
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_spinner, false);
|
||||
} else {
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_label, true);
|
||||
swingReflectionInvoke("setEnabled", max_up_speed_spinner, true);
|
||||
}
|
||||
}//GEN-LAST:event_limit_upload_speed_checkboxStateChanged
|
||||
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel accounts_label;
|
||||
private javax.swing.JScrollPane accounts_scrollpane;
|
||||
private javax.swing.JButton add_account_button;
|
||||
private javax.swing.JButton cancel_button;
|
||||
private javax.swing.JButton change_download_dir_button;
|
||||
private javax.swing.JLabel default_dir_label;
|
||||
private javax.swing.JLabel default_slots_down_label;
|
||||
private javax.swing.JSpinner default_slots_down_spinner;
|
||||
private javax.swing.JSpinner default_slots_up;
|
||||
private javax.swing.JLabel defaut_slots_up_label;
|
||||
private javax.swing.JLabel down_dir_label;
|
||||
private javax.swing.JPanel downloads_panel;
|
||||
private javax.swing.JTabbedPane jTabbedPane1;
|
||||
private javax.swing.JTable jTable1;
|
||||
private javax.swing.JCheckBox limit_download_speed_checkbox;
|
||||
private javax.swing.JCheckBox limit_upload_speed_checkbox;
|
||||
private javax.swing.JLabel max_down_speed_label;
|
||||
private javax.swing.JSpinner max_down_speed_spinner;
|
||||
private javax.swing.JLabel max_downloads_label;
|
||||
private javax.swing.JSpinner max_downloads_spinner;
|
||||
private javax.swing.JLabel max_up_speed_label;
|
||||
private javax.swing.JSpinner max_up_speed_spinner;
|
||||
private javax.swing.JLabel max_uploads_label;
|
||||
private javax.swing.JSpinner max_uploads_spinner;
|
||||
private javax.swing.JCheckBox multi_slot_down_checkbox;
|
||||
private javax.swing.JCheckBox multi_slot_up_checkbox;
|
||||
private javax.swing.JButton ok_button;
|
||||
private javax.swing.JButton remove_account_button;
|
||||
private javax.swing.JLabel status;
|
||||
private javax.swing.JPanel uploads_panel;
|
||||
private javax.swing.JCheckBox verify_file_down_checkbox;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
183
src/megabasterd/SpeedMeter.java
Normal file
@ -0,0 +1,183 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import static megabasterd.MiscTools.formatBytes;
|
||||
|
||||
public final class SpeedMeter implements Runnable, SecureNotifiable
|
||||
{
|
||||
public static final int SLEEP = 3000;
|
||||
private long _progress;
|
||||
private final Transference _transference;
|
||||
private final GlobalSpeedMeter _gspeed;
|
||||
private volatile long _lastSpeed;
|
||||
private volatile boolean _exit;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified=false;
|
||||
|
||||
|
||||
SpeedMeter(Transference transference, GlobalSpeedMeter gspeed)
|
||||
{
|
||||
_secure_notify_lock = new Object();
|
||||
_transference = transference;
|
||||
_progress = transference.getProgress();
|
||||
_lastSpeed=0;
|
||||
_gspeed = gspeed;
|
||||
_exit=false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(UploadMACGenerator.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setExit(boolean exit) {
|
||||
_exit = exit;
|
||||
}
|
||||
|
||||
public long getLastSpeed()
|
||||
{
|
||||
return _lastSpeed;
|
||||
}
|
||||
|
||||
public void setLastSpeed(long speed)
|
||||
{
|
||||
_lastSpeed = speed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
System.out.println("SpeedMeter hello!");
|
||||
|
||||
long p, sp=0;
|
||||
int no_data_count;
|
||||
|
||||
_transference.getView().updateSpeed("------", true);
|
||||
_transference.getView().updateRemainingTime("--d --:--:--", true);
|
||||
|
||||
try
|
||||
{
|
||||
no_data_count = 0;
|
||||
|
||||
while(!_exit)
|
||||
{
|
||||
Thread.sleep(SpeedMeter.SLEEP*(no_data_count+1));
|
||||
|
||||
if(!_exit)
|
||||
{
|
||||
p = _transference.getProgress();
|
||||
|
||||
if(_transference.isPaused()) {
|
||||
|
||||
_transference.getView().updateSpeed("------", true);
|
||||
|
||||
_transference.getView().updateRemainingTime("--d --:--:--", true);
|
||||
|
||||
setLastSpeed(0);
|
||||
|
||||
_gspeed.secureNotify();
|
||||
|
||||
secureWait();
|
||||
|
||||
} else if( p > _progress) {
|
||||
|
||||
double sleep_time = ((double)SpeedMeter.SLEEP*(no_data_count+1))/1000 ;
|
||||
|
||||
double current_speed = (p - _progress) / sleep_time;
|
||||
|
||||
_progress = p;
|
||||
|
||||
sp = Math.round(current_speed);
|
||||
|
||||
if(sp > 0) {
|
||||
|
||||
_transference.getView().updateSpeed(formatBytes(sp)+"/s", true);
|
||||
|
||||
_transference.getView().updateRemainingTime(calculateRemTime((long)Math.floor((_transference.getFile_size()-p)/sp ) ), true);
|
||||
|
||||
setLastSpeed(sp);
|
||||
|
||||
_gspeed.secureNotify();
|
||||
}
|
||||
|
||||
no_data_count=0;
|
||||
|
||||
} else {
|
||||
|
||||
_transference.getView().updateSpeed("------", true);
|
||||
|
||||
_transference.getView().updateRemainingTime("--d --:--:--", true);
|
||||
|
||||
setLastSpeed(0);
|
||||
|
||||
_gspeed.secureNotify();
|
||||
|
||||
no_data_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InterruptedException ex)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String calculateRemTime(long seconds)
|
||||
{
|
||||
int days = (int) TimeUnit.SECONDS.toDays(seconds);
|
||||
|
||||
long hours = TimeUnit.SECONDS.toHours(seconds) -
|
||||
TimeUnit.DAYS.toHours(days);
|
||||
|
||||
long minutes = TimeUnit.SECONDS.toMinutes(seconds) -
|
||||
TimeUnit.DAYS.toMinutes(days) -
|
||||
TimeUnit.HOURS.toMinutes(hours);
|
||||
|
||||
long secs = TimeUnit.SECONDS.toSeconds(seconds) -
|
||||
TimeUnit.DAYS.toSeconds(days) -
|
||||
TimeUnit.HOURS.toSeconds(hours) -
|
||||
TimeUnit.MINUTES.toSeconds(minutes);
|
||||
|
||||
return String.format("%dd %d:%02d:%02d", days, hours, minutes, secs);
|
||||
}
|
||||
}
|
44
src/megabasterd/SqliteSingleton.java
Normal file
@ -0,0 +1,44 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class SqliteSingleton {
|
||||
|
||||
public static final String SQLITE_FILE="megabasterd.db";
|
||||
public static SqliteSingleton getInstance() {
|
||||
|
||||
return LazyHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private SqliteSingleton() {}
|
||||
public Connection getConn() {
|
||||
|
||||
Connection conn=null;
|
||||
|
||||
try {
|
||||
|
||||
Class.forName("org.sqlite.JDBC");
|
||||
|
||||
conn = DriverManager.getConnection("jdbc:sqlite:"+SQLITE_FILE);
|
||||
|
||||
}catch(ClassNotFoundException | SQLException ex) {
|
||||
Logger.getLogger(SqliteSingleton.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
return conn;
|
||||
}
|
||||
|
||||
private final static class LazyHolder {
|
||||
|
||||
private static final SqliteSingleton INSTANCE = new SqliteSingleton();
|
||||
}
|
||||
|
||||
}
|
154
src/megabasterd/StreamThrottlerSupervisor.java
Normal file
@ -0,0 +1,154 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class StreamThrottlerSupervisor implements Runnable, SecureNotifiable {
|
||||
|
||||
private final ConcurrentLinkedQueue<Integer> _input_slice_queue;
|
||||
|
||||
private final ConcurrentLinkedQueue<Integer> _output_slice_queue;
|
||||
|
||||
private final int _slice_size;
|
||||
|
||||
private volatile int _maxBytesPerSecInput;
|
||||
|
||||
private volatile int _maxBytesPerSecOutput;
|
||||
|
||||
private final Object _secure_notify_lock;
|
||||
|
||||
private boolean _notified=false;
|
||||
public StreamThrottlerSupervisor(int maxBytesPerSecInput, int maxBytesPerSecOutput, int slice_size) {
|
||||
|
||||
_secure_notify_lock = new Object();
|
||||
|
||||
_maxBytesPerSecInput = maxBytesPerSecInput;
|
||||
|
||||
_maxBytesPerSecOutput = maxBytesPerSecOutput;
|
||||
|
||||
_slice_size = slice_size;
|
||||
|
||||
_input_slice_queue = new ConcurrentLinkedQueue<>();
|
||||
|
||||
_output_slice_queue = new ConcurrentLinkedQueue<>();
|
||||
}
|
||||
|
||||
public int getMaxBytesPerSecInput() {
|
||||
return _maxBytesPerSecInput;
|
||||
}
|
||||
|
||||
public void setMaxBytesPerSecInput(int _maxBytesPerSecInput) {
|
||||
this._maxBytesPerSecInput = _maxBytesPerSecInput;
|
||||
}
|
||||
|
||||
public int getMaxBytesPerSecOutput() {
|
||||
return _maxBytesPerSecOutput;
|
||||
}
|
||||
|
||||
public void setMaxBytesPerSecOutput(int _maxBytesPerSecOutput) {
|
||||
this._maxBytesPerSecOutput = _maxBytesPerSecOutput;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Integer> getInput_slice_queue() {
|
||||
return _input_slice_queue;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Integer> getOutput_slice_queue() {
|
||||
return _output_slice_queue;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(UploadMACGenerator.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
while(true) {
|
||||
|
||||
if(_maxBytesPerSecInput > 0) {
|
||||
|
||||
_input_slice_queue.clear();
|
||||
|
||||
int slice_num = (int)Math.floor((double)_maxBytesPerSecInput / _slice_size);
|
||||
|
||||
for(int i=0; i<slice_num; i++)
|
||||
{
|
||||
_input_slice_queue.add(_slice_size);
|
||||
}
|
||||
|
||||
if(_maxBytesPerSecInput % _slice_size != 0) {
|
||||
|
||||
_input_slice_queue.add(_maxBytesPerSecInput % _slice_size);
|
||||
}
|
||||
}
|
||||
|
||||
if(_maxBytesPerSecOutput > 0) {
|
||||
|
||||
_output_slice_queue.clear();
|
||||
|
||||
int slice_num = (int)Math.floor((double)_maxBytesPerSecOutput / _slice_size);
|
||||
|
||||
for(int i=0; i<slice_num; i++)
|
||||
{
|
||||
_output_slice_queue.add(_slice_size);
|
||||
}
|
||||
|
||||
if(_maxBytesPerSecOutput % _slice_size != 0) {
|
||||
|
||||
_output_slice_queue.add(_maxBytesPerSecOutput % _slice_size);
|
||||
}
|
||||
}
|
||||
|
||||
secureNotifyAll();
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(StreamThrottlerSupervisor.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
99
src/megabasterd/StreamerDialog.form
Normal file
@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="title" type="java.lang.String" value="Streamer"/>
|
||||
<Property name="resizable" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" pref="300" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="put_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="original_link_textfield" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="put_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="original_link_textfield" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="dance_button" min="-2" pref="37" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="put_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Put your mega/megacrypter link here in order to get a streaming link:"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="dance_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="cc" red="66" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="24" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Let's dance, baby"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="dance_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="original_link_textfield">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_AddingCodePost" type="java.lang.String" value="original_link_textfield.addMouseListener(new ContextMenuMouseListener());"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
184
src/megabasterd/StreamerDialog.java
Normal file
@ -0,0 +1,184 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JOptionPane;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class StreamerDialog extends javax.swing.JDialog implements ClipboardChangeObserver {
|
||||
|
||||
private final ClipboardSpy _clipboardspy;
|
||||
|
||||
/**
|
||||
* Creates new form Streamer
|
||||
*/
|
||||
public StreamerDialog(java.awt.Frame parent, boolean modal, ClipboardSpy clipboardspy) {
|
||||
super(parent, modal);
|
||||
initComponents();
|
||||
|
||||
_clipboardspy = clipboardspy;
|
||||
|
||||
MiscTools.updateFont(put_label, FONT_DEFAULT, Font.PLAIN);
|
||||
MiscTools.updateFont(dance_button, FONT_DEFAULT, Font.PLAIN);
|
||||
|
||||
MiscTools.swingReflectionInvoke("setText", original_link_textfield, MiscTools.extractFirstMegaLinkFromString(MiscTools.extractStringFromClipboardContents(clipboardspy.getContents())));
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
put_label = new javax.swing.JLabel();
|
||||
dance_button = new javax.swing.JButton();
|
||||
original_link_textfield = new javax.swing.JTextField();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setTitle("Streamer");
|
||||
setResizable(false);
|
||||
|
||||
put_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
put_label.setText("Put your mega/megacrypter link here in order to get a streaming link:");
|
||||
put_label.setDoubleBuffered(true);
|
||||
|
||||
dance_button.setBackground(new java.awt.Color(102, 204, 255));
|
||||
dance_button.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
|
||||
dance_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
dance_button.setText("Let's dance, baby");
|
||||
dance_button.setDoubleBuffered(true);
|
||||
dance_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
dance_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
original_link_textfield.setFont(new java.awt.Font("Dialog", 0, 14)); // NOI18N
|
||||
original_link_textfield.setDoubleBuffered(true);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addGap(0, 0, Short.MAX_VALUE)
|
||||
.addComponent(dance_button, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(put_label)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addComponent(original_link_textfield))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(put_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(original_link_textfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(dance_button, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
original_link_textfield.addMouseListener(new ContextMenuMouseListener());
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void dance_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dance_buttonActionPerformed
|
||||
|
||||
|
||||
String link=((String)MiscTools.swingReflectionInvokeAndWaitForReturn("getText", original_link_textfield)).trim();
|
||||
|
||||
if(link.length() == 0) {
|
||||
|
||||
JOptionPane.showMessageDialog(this, "Please, paste a mega/megacrypter link!");
|
||||
|
||||
MiscTools.swingReflectionInvoke("setText", original_link_textfield, "");
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
|
||||
link = CryptTools.decryptMegaDownloaderLink(link);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(StreamerDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
String data;
|
||||
|
||||
link=link.replace("/#!N?", "/#N!");
|
||||
|
||||
if( MiscTools.findFirstRegex("://mega(\\.co)?\\.nz/#[^fF]", link, 0) != null)
|
||||
{
|
||||
data=MiscTools.findFirstRegex("/#(N?!.+)", link, 1);
|
||||
|
||||
_cookLink("http://localhost:1337/video/mega/"+data);
|
||||
|
||||
} else if( (data=MiscTools.findFirstRegex("https?://([^/]+/![^!]+![0-9a-fA-F]+)", link, 1)) != null) {
|
||||
|
||||
_cookLink("http://localhost:1337/video/"+data);
|
||||
|
||||
} else {
|
||||
|
||||
JOptionPane.showMessageDialog(this, "Please, paste a mega/megacrypter link!");
|
||||
|
||||
MiscTools.swingReflectionInvoke("setText", original_link_textfield, "");
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_dance_buttonActionPerformed
|
||||
|
||||
private void _cookLink(final String streamlink)
|
||||
{
|
||||
MiscTools.swingReflectionInvoke("setEnabled", dance_button, false);
|
||||
MiscTools.swingReflectionInvoke("setEnabled", original_link_textfield, false);
|
||||
|
||||
final StreamerDialog streamer_run = this;
|
||||
|
||||
MainPanel.THREAD_POOL.execute(new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
try {
|
||||
MiscTools.copyTextToClipboard(MiscTools.deflateURL(streamlink));
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(StreamerDialog.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
JOptionPane.showMessageDialog(streamer_run, "Streaming link was copied to clipboard!\n(Remember to keep MegaBasterd running in background while playing)");
|
||||
|
||||
streamer_run.dispose();
|
||||
|
||||
streamer_run.getParent().dispatchEvent(new WindowEvent(streamer_run, WindowEvent.WINDOW_CLOSING));
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton dance_button;
|
||||
private javax.swing.JTextField original_link_textfield;
|
||||
private javax.swing.JLabel put_label;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override
|
||||
public void notifyClipboardChange() {
|
||||
|
||||
MiscTools.swingReflectionInvoke("setText", original_link_textfield, MiscTools.extractFirstMegaLinkFromString(MiscTools.extractStringFromClipboardContents(_clipboardspy.getContents()))); }
|
||||
}
|
220
src/megabasterd/ThrottledInputStream.java
Normal file
@ -0,0 +1,220 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class ThrottledInputStream extends InputStream {
|
||||
|
||||
private final InputStream _rawStream;
|
||||
|
||||
private final StreamThrottlerSupervisor _stream_supervisor;
|
||||
|
||||
private Integer _slice_size;
|
||||
|
||||
private boolean _stream_finish;
|
||||
|
||||
|
||||
public ThrottledInputStream(InputStream rawStream, StreamThrottlerSupervisor stream_supervisor) {
|
||||
|
||||
_rawStream = rawStream;
|
||||
|
||||
_stream_supervisor = stream_supervisor;
|
||||
|
||||
_stream_finish = false;
|
||||
|
||||
_slice_size = null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
|
||||
if(_stream_supervisor.getMaxBytesPerSecInput() > 0) {
|
||||
|
||||
if(!_stream_finish) {
|
||||
|
||||
int r;
|
||||
|
||||
throttle(1);
|
||||
|
||||
if(_slice_size != null) {
|
||||
|
||||
r = _rawStream.read();
|
||||
|
||||
if(r == -1) {
|
||||
|
||||
_stream_finish = true;
|
||||
}
|
||||
|
||||
return r;
|
||||
|
||||
} else {
|
||||
|
||||
return _rawStream.read();
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
return _rawStream.read();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int read(byte[] b) throws IOException {
|
||||
|
||||
if(_stream_supervisor.getMaxBytesPerSecInput() > 0) {
|
||||
|
||||
if(!_stream_finish) {
|
||||
|
||||
int readLen = 0, readSlice, len=b.length, r=0;
|
||||
|
||||
do {
|
||||
|
||||
throttle(len - readLen);
|
||||
|
||||
if(_slice_size != null) {
|
||||
|
||||
readSlice=0;
|
||||
|
||||
do{
|
||||
r = _rawStream.read(b, readLen+readSlice, _slice_size-readSlice );
|
||||
|
||||
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 );
|
||||
|
||||
return readLen;
|
||||
|
||||
} else {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
return _rawStream.read(b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
|
||||
if(_stream_supervisor.getMaxBytesPerSecInput() > 0) {
|
||||
|
||||
if(!_stream_finish) {
|
||||
|
||||
int readLen = 0, r=0;
|
||||
|
||||
do {
|
||||
|
||||
throttle(len-readLen);
|
||||
|
||||
if(_slice_size != null) {
|
||||
|
||||
int readSlice=0;
|
||||
|
||||
do{
|
||||
r = _rawStream.read(b, off+readSlice+readLen, _slice_size - readSlice);
|
||||
|
||||
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 );
|
||||
|
||||
return readLen;
|
||||
|
||||
} else {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
return _rawStream.read(b, off, len);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void reset() throws IOException {
|
||||
|
||||
_stream_finish = false;
|
||||
|
||||
_rawStream.reset();
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void throttle(int size) throws IOException {
|
||||
|
||||
_slice_size = null;
|
||||
|
||||
while(_stream_supervisor.getMaxBytesPerSecInput() > 0 && (_slice_size=_stream_supervisor.getInput_slice_queue().poll()) == null) {
|
||||
|
||||
_stream_supervisor.secureWait();
|
||||
}
|
||||
|
||||
if(_slice_size != null && size < _slice_size) {
|
||||
|
||||
_stream_supervisor.getInput_slice_queue().add(_slice_size - size);
|
||||
|
||||
_stream_supervisor.secureNotifyAll();
|
||||
|
||||
_slice_size = size;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
97
src/megabasterd/ThrottledOutputStream.java
Normal file
@ -0,0 +1,97 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class ThrottledOutputStream extends OutputStream {
|
||||
|
||||
private final OutputStream _rawStream;
|
||||
|
||||
private final StreamThrottlerSupervisor _stream_supervisor;
|
||||
|
||||
private Integer slice_size;
|
||||
|
||||
|
||||
public ThrottledOutputStream(OutputStream rawStream, StreamThrottlerSupervisor stream_supervisor) {
|
||||
|
||||
_rawStream = rawStream;
|
||||
|
||||
_stream_supervisor = stream_supervisor;
|
||||
|
||||
slice_size = null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void write(byte[] b, int off, int len) throws IOException {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(int i) throws IOException {
|
||||
|
||||
if(_stream_supervisor.getMaxBytesPerSecOutput() > 0) {
|
||||
|
||||
throttle(1);
|
||||
|
||||
_rawStream.write(i);
|
||||
|
||||
} else {
|
||||
|
||||
_rawStream.write(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void throttle(int size) throws IOException {
|
||||
|
||||
slice_size = null;
|
||||
|
||||
while(_stream_supervisor.getMaxBytesPerSecOutput() > 0 && (slice_size=_stream_supervisor.getOutput_slice_queue().poll()) == null) {
|
||||
|
||||
_stream_supervisor.secureWait();
|
||||
}
|
||||
|
||||
if(slice_size != null && size < slice_size) {
|
||||
|
||||
_stream_supervisor.getOutput_slice_queue().add(slice_size - size);
|
||||
|
||||
_stream_supervisor.secureNotifyAll();
|
||||
|
||||
slice_size = size;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
52
src/megabasterd/Transference.java
Normal file
@ -0,0 +1,52 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public interface Transference {
|
||||
|
||||
int MIN_WORKERS = 1;
|
||||
int MAX_WORKERS = 10;
|
||||
int MAX_SIM_TRANSFERENCES=20;
|
||||
int WORKERS_DEFAULT = 4;
|
||||
int SIM_TRANSFERENCES_DEFAULT=2;
|
||||
boolean LIMIT_TRANSFERENCE_SPEED_DEFAULT=false;
|
||||
int MAX_TRANSFERENCE_SPEED_DEFAULT=1;
|
||||
|
||||
void start();
|
||||
|
||||
void stop();
|
||||
|
||||
void pause();
|
||||
|
||||
void restart();
|
||||
|
||||
void close();
|
||||
|
||||
boolean isPaused();
|
||||
|
||||
boolean isStopped();
|
||||
|
||||
void checkSlotsAndWorkers();
|
||||
|
||||
ConcurrentLinkedQueue<Integer> getPartialProgress();
|
||||
|
||||
long getProgress();
|
||||
|
||||
void updateProgress(int reads);
|
||||
|
||||
String getFile_name();
|
||||
|
||||
long getFile_size();
|
||||
|
||||
ProgressMeter getProgress_meter();
|
||||
|
||||
SpeedMeter getSpeed_meter();
|
||||
|
||||
MainPanel getMain_panel();
|
||||
|
||||
TransferenceView getView();
|
||||
}
|
206
src/megabasterd/TransferenceManager.java
Normal file
@ -0,0 +1,206 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
abstract public class TransferenceManager implements Runnable, SecureNotifiable {
|
||||
|
||||
private final ConcurrentLinkedQueue<Transference> _transference_provision_queue;
|
||||
private final ConcurrentLinkedQueue<Transference> _transference_start_queue;
|
||||
private final ConcurrentLinkedQueue<Transference> _transference_remove_queue;
|
||||
private final ConcurrentLinkedQueue<Transference> _transference_finished_queue;
|
||||
private final ConcurrentLinkedQueue<Transference> _transference_running_list;
|
||||
private final javax.swing.JPanel _scroll_panel;
|
||||
private final MainPanel _main_panel;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified=false;
|
||||
|
||||
public TransferenceManager(MainPanel main_panel, javax.swing.JPanel scroll_panel) {
|
||||
|
||||
_main_panel = main_panel;
|
||||
_scroll_panel = scroll_panel;
|
||||
_secure_notify_lock = new Object();
|
||||
_transference_start_queue = new ConcurrentLinkedQueue();
|
||||
_transference_provision_queue = new ConcurrentLinkedQueue();
|
||||
_transference_remove_queue = new ConcurrentLinkedQueue();
|
||||
_transference_finished_queue = new ConcurrentLinkedQueue();
|
||||
_transference_running_list = new ConcurrentLinkedQueue();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(TransferenceManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public MainPanel getMain_panel() {
|
||||
return _main_panel;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Transference> getTransference_provision_queue() {
|
||||
return _transference_provision_queue;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Transference> getTransference_start_queue() {
|
||||
return _transference_start_queue;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Transference> getTransference_remove_queue() {
|
||||
return _transference_remove_queue;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Transference> getTransference_finished_queue() {
|
||||
return _transference_finished_queue;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Transference> getTransference_running_list() {
|
||||
return _transference_running_list;
|
||||
}
|
||||
|
||||
public JPanel getScroll_panel() {
|
||||
return _scroll_panel;
|
||||
}
|
||||
|
||||
public void closeAllFinished()
|
||||
{
|
||||
_transference_remove_queue.addAll(new ArrayList(_transference_finished_queue));
|
||||
|
||||
_transference_finished_queue.clear();
|
||||
|
||||
secureNotify();
|
||||
}
|
||||
|
||||
public void closeAllWaiting()
|
||||
{
|
||||
_transference_remove_queue.addAll(new ArrayList(_transference_start_queue));
|
||||
|
||||
_transference_start_queue.clear();
|
||||
|
||||
secureNotify();
|
||||
}
|
||||
|
||||
public void start(Transference transference) {
|
||||
|
||||
_transference_running_list.add(transference);
|
||||
|
||||
_scroll_panel.add((Component)transference.getView(), 0);
|
||||
|
||||
transference.start();
|
||||
}
|
||||
|
||||
public void pauseAll()
|
||||
{
|
||||
for(Transference transference:_transference_running_list) {
|
||||
|
||||
if(!transference.isPaused()) {
|
||||
|
||||
transference.pause();
|
||||
}
|
||||
}
|
||||
|
||||
secureNotify();
|
||||
}
|
||||
|
||||
public void sortTransferenceStartQueue()
|
||||
{
|
||||
ArrayList<Transference> trans_list = new ArrayList(_transference_start_queue);
|
||||
|
||||
trans_list.sort(new Comparator<Transference> () {
|
||||
|
||||
@Override
|
||||
public int compare(Transference o1, Transference o2) {
|
||||
|
||||
return o1.getFile_name().compareToIgnoreCase(o2.getFile_name());
|
||||
}
|
||||
});
|
||||
|
||||
_transference_start_queue.clear();
|
||||
|
||||
_transference_start_queue.addAll(trans_list);
|
||||
}
|
||||
|
||||
public void checkButtonsAndMenus(javax.swing.JButton close_all_finished_button, javax.swing.JButton pause_all_button,
|
||||
javax.swing.MenuElement new_trans_menu, javax.swing.MenuElement clean_all_waiting_trans_menu) {
|
||||
|
||||
if(!_transference_running_list.isEmpty()) {
|
||||
|
||||
boolean show_pause_all = false;
|
||||
|
||||
for(Transference trans:_transference_running_list) {
|
||||
|
||||
if((show_pause_all = !trans.isPaused())) {
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MiscTools.swingReflectionInvoke("setVisible", pause_all_button, show_pause_all);
|
||||
|
||||
} else {
|
||||
|
||||
MiscTools.swingReflectionInvoke("setVisible", pause_all_button, false);
|
||||
}
|
||||
|
||||
MiscTools.swingReflectionInvoke("setEnabled", new_trans_menu, _transference_provision_queue.isEmpty());
|
||||
|
||||
MiscTools.swingReflectionInvoke("setEnabled", clean_all_waiting_trans_menu, !_transference_start_queue.isEmpty());
|
||||
|
||||
if(!_transference_finished_queue.isEmpty()) {
|
||||
|
||||
MiscTools.swingReflectionInvoke("setText", close_all_finished_button, "Close all finished ("+_transference_finished_queue.size()+")" );
|
||||
|
||||
MiscTools.swingReflectionInvoke("setVisible", close_all_finished_button, true);
|
||||
|
||||
} else {
|
||||
|
||||
MiscTools.swingReflectionInvoke("setVisible", close_all_finished_button, false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
19
src/megabasterd/TransferenceView.java
Normal file
@ -0,0 +1,19 @@
|
||||
package megabasterd;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public interface TransferenceView {
|
||||
|
||||
void pause();
|
||||
void stop();
|
||||
void resume();
|
||||
void updateSpeed(String speed, Boolean visible);
|
||||
void updateRemainingTime(String rem_time, Boolean visible);
|
||||
void updateProgressBar(long progress, double bar_rate);
|
||||
void printStatusNormal(String msg);
|
||||
void printStatusOK(String msg);
|
||||
void printStatusError(String msg);
|
||||
|
||||
}
|
969
src/megabasterd/Upload.java
Normal file
@ -0,0 +1,969 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MiscTools.BASE642Bin;
|
||||
import static megabasterd.MiscTools.Bin2BASE64;
|
||||
import static megabasterd.MiscTools.HashString;
|
||||
import static megabasterd.MiscTools.bin2i32a;
|
||||
import static megabasterd.MiscTools.formatBytes;
|
||||
import static megabasterd.MiscTools.i32a2bin;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWait;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWaitForReturn;
|
||||
import static megabasterd.MiscTools.truncateText;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class Upload implements Transference, Runnable, SecureNotifiable {
|
||||
|
||||
public static final boolean USE_SLOTS_DEFAULT=true;
|
||||
public static final int WORKERS_DEFAULT = 2;
|
||||
|
||||
private final MainPanel _main_panel;
|
||||
private UploadView _view;
|
||||
private String _exit_message;
|
||||
private String _dir_name;
|
||||
private volatile boolean _exit;
|
||||
private final int _slots;
|
||||
private final Object _secure_notify_lock;
|
||||
private byte[] _byte_file_key;
|
||||
private String _fatal_error;
|
||||
private volatile long _progress;
|
||||
private byte[] _byte_file_iv;
|
||||
private final ConcurrentLinkedQueue<Long> _rejectedChunkIds;
|
||||
private long _last_chunk_id_dispatched;
|
||||
protected final ConcurrentLinkedQueue<Integer> _partialProgressQueue;
|
||||
private final ExecutorService _thread_pool;
|
||||
private volatile int[] _file_meta_mac;
|
||||
private boolean _finishing_upload;
|
||||
private String _fid;
|
||||
private SpeedMeter _speed_meter;
|
||||
private ProgressMeter _progress_meter;
|
||||
private boolean _notified;
|
||||
private String _completion_handle;
|
||||
private int _paused_workers;
|
||||
private Double _progress_bar_rate;
|
||||
private volatile boolean _pause;
|
||||
protected final ArrayList<ChunkUploader> _chunkworkers;
|
||||
private long _file_size;
|
||||
private UploadMACGenerator _mac_generator;
|
||||
private boolean _create_dir;
|
||||
private boolean _provision_ok;
|
||||
private boolean _status_error;
|
||||
private String _file_link;
|
||||
private int[] _saved_file_mac;
|
||||
private final MegaAPI _ma;
|
||||
private final String _file_name;
|
||||
private final String _parent_node;
|
||||
private int[] _ul_key;
|
||||
private String _ul_url;
|
||||
private final String _root_node;
|
||||
private final byte[] _share_key;
|
||||
private final String _folder_link;
|
||||
private final boolean _use_slots;
|
||||
private final boolean _restart;
|
||||
public Upload(MainPanel main_panel, MegaAPI ma, String filename, String parent_node, int[] ul_key, String ul_url, String root_node, byte[] share_key, String folder_link, boolean use_slots, int slots, boolean restart) {
|
||||
_saved_file_mac = new int[]{0, 0, 0, 0};
|
||||
_notified = false;
|
||||
_provision_ok = true;
|
||||
_main_panel = main_panel;
|
||||
_ma = ma;
|
||||
_file_name = filename;
|
||||
_parent_node = parent_node;
|
||||
_ul_key = ul_key;
|
||||
_ul_url = ul_url;
|
||||
_root_node = root_node;
|
||||
_share_key = share_key;
|
||||
_folder_link = folder_link;
|
||||
_use_slots = use_slots;
|
||||
_slots = slots;
|
||||
_restart = restart;
|
||||
_secure_notify_lock = new Object();
|
||||
_chunkworkers = new ArrayList();
|
||||
_partialProgressQueue = new ConcurrentLinkedQueue();
|
||||
_rejectedChunkIds = new ConcurrentLinkedQueue();
|
||||
_thread_pool = Executors.newCachedThreadPool();
|
||||
_view = null; //Lazy init (getter!)
|
||||
_speed_meter = null; //Lazy init (getter!)
|
||||
_progress_meter = null; //Lazy init (getter!)
|
||||
}
|
||||
|
||||
public String getDir_name() {
|
||||
return _dir_name;
|
||||
}
|
||||
|
||||
public boolean isExit() {
|
||||
return _exit;
|
||||
}
|
||||
|
||||
public int getSlots() {
|
||||
return _slots;
|
||||
}
|
||||
|
||||
public Object getSecure_notify_lock() {
|
||||
return _secure_notify_lock;
|
||||
}
|
||||
|
||||
public byte[] getByte_file_key() {
|
||||
return _byte_file_key;
|
||||
}
|
||||
|
||||
public String getFatal_error() {
|
||||
return _fatal_error;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getProgress() {
|
||||
return _progress;
|
||||
}
|
||||
|
||||
public byte[] getByte_file_iv() {
|
||||
return _byte_file_iv;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Long> getRejectedChunkIds() {
|
||||
return _rejectedChunkIds;
|
||||
}
|
||||
|
||||
public long getLast_chunk_id_dispatched() {
|
||||
return _last_chunk_id_dispatched;
|
||||
}
|
||||
|
||||
public ConcurrentLinkedQueue<Integer> getPartialProgressQueue() {
|
||||
return _partialProgressQueue;
|
||||
}
|
||||
|
||||
public ExecutorService getThread_pool() {
|
||||
return _thread_pool;
|
||||
}
|
||||
|
||||
public int[] getFile_meta_mac() {
|
||||
return _file_meta_mac;
|
||||
}
|
||||
|
||||
public boolean isFinishing_upload() {
|
||||
return _finishing_upload;
|
||||
}
|
||||
|
||||
public String getFid() {
|
||||
return _fid;
|
||||
}
|
||||
|
||||
public boolean isNotified() {
|
||||
return _notified;
|
||||
}
|
||||
|
||||
public String getCompletion_handle() {
|
||||
return _completion_handle;
|
||||
}
|
||||
|
||||
public int getPaused_workers() {
|
||||
return _paused_workers;
|
||||
}
|
||||
|
||||
public Double getProgress_bar_rate() {
|
||||
return _progress_bar_rate;
|
||||
}
|
||||
|
||||
public boolean isPause() {
|
||||
return _pause;
|
||||
}
|
||||
|
||||
public ArrayList<ChunkUploader> getChunkworkers() {
|
||||
return _chunkworkers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getFile_size() {
|
||||
return _file_size;
|
||||
}
|
||||
|
||||
public UploadMACGenerator getMac_generator() {
|
||||
return _mac_generator;
|
||||
}
|
||||
|
||||
public boolean isCreate_dir() {
|
||||
return _create_dir;
|
||||
}
|
||||
|
||||
public boolean isProvision_ok() {
|
||||
return _provision_ok;
|
||||
}
|
||||
|
||||
public boolean isStatus_error() {
|
||||
return _status_error;
|
||||
}
|
||||
|
||||
public String getFile_link() {
|
||||
return _file_link;
|
||||
}
|
||||
|
||||
public int[] getSaved_file_mac() {
|
||||
return _saved_file_mac;
|
||||
}
|
||||
|
||||
public MegaAPI getMa() {
|
||||
return _ma;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFile_name() {
|
||||
return _file_name;
|
||||
}
|
||||
|
||||
public String getParent_node() {
|
||||
return _parent_node;
|
||||
}
|
||||
|
||||
public int[] getUl_key() {
|
||||
return _ul_key;
|
||||
}
|
||||
|
||||
public String getUl_url() {
|
||||
return _ul_url;
|
||||
}
|
||||
|
||||
public String getRoot_node() {
|
||||
return _root_node;
|
||||
}
|
||||
|
||||
public byte[] getShare_key() {
|
||||
return _share_key;
|
||||
}
|
||||
|
||||
public String getFolder_link() {
|
||||
return _folder_link;
|
||||
}
|
||||
|
||||
public boolean isUse_slots() {
|
||||
return _use_slots;
|
||||
}
|
||||
|
||||
public boolean isRestart() {
|
||||
return _restart;
|
||||
}
|
||||
|
||||
public void setCompletion_handle(String completion_handle) {
|
||||
_completion_handle = completion_handle;
|
||||
}
|
||||
|
||||
public void setFinishing_upload(boolean finishing_upload) {
|
||||
_finishing_upload = finishing_upload;
|
||||
}
|
||||
|
||||
public void setFile_meta_mac(int[] file_meta_mac) {
|
||||
_file_meta_mac = file_meta_mac;
|
||||
}
|
||||
|
||||
public void setPaused_workers(int paused_workers) {
|
||||
_paused_workers = paused_workers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProgressMeter getProgress_meter() {
|
||||
return _progress_meter == null?(_progress_meter = new ProgressMeter(this)):_progress_meter;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SpeedMeter getSpeed_meter() {
|
||||
return _speed_meter == null?(_speed_meter = new SpeedMeter(this, getMain_panel().getGlobal_up_speed())):_speed_meter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UploadView getView() {
|
||||
return _view == null?(_view = new UploadView(this)):_view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void provisionIt() {
|
||||
|
||||
printStatus("Provisioning upload, please wait...");
|
||||
|
||||
String exit_msg=null;
|
||||
|
||||
File the_file = new File(_file_name);
|
||||
|
||||
if(!the_file.exists()) {
|
||||
|
||||
_provision_ok=false;
|
||||
|
||||
exit_msg = "ERROR: FILE NOT FOUND -> "+_file_name;
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
_file_size = the_file.length();
|
||||
|
||||
File temp_file;
|
||||
|
||||
temp_file = new File("."+HashString("SHA-1", _file_name));
|
||||
|
||||
if(_ul_key!=null && temp_file.exists() && temp_file.length()>0) {
|
||||
|
||||
FileInputStream fis = new FileInputStream(temp_file);
|
||||
|
||||
byte[] data = new byte[(int)temp_file.length()];
|
||||
|
||||
fis.read(data);
|
||||
|
||||
String[] fdata = new String(data).split("\\|");
|
||||
|
||||
_last_chunk_id_dispatched = Long.parseLong(fdata[0]);
|
||||
|
||||
_progress = Long.parseLong(fdata[1]);
|
||||
|
||||
_saved_file_mac = bin2i32a(BASE642Bin(fdata[2]));
|
||||
|
||||
} else if(temp_file.exists()) {
|
||||
|
||||
temp_file.delete();
|
||||
}
|
||||
|
||||
if(_ul_key == null || _restart) {
|
||||
|
||||
try {
|
||||
|
||||
_ul_key = _ma.genUploadKey();
|
||||
|
||||
DBTools.insertUpload(_file_name, _ma.getEmail(), _parent_node, Bin2BASE64(i32a2bin(_ul_key)), _root_node, Bin2BASE64(_share_key), _folder_link);
|
||||
|
||||
} catch (IOException | SQLException ex) {
|
||||
|
||||
_provision_ok=false;
|
||||
|
||||
exit_msg = ex.getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
if(!_provision_ok) {
|
||||
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
if(_fatal_error != null) {
|
||||
|
||||
printStatusError(_fatal_error);
|
||||
|
||||
}else if(exit_msg!=null) {
|
||||
|
||||
printStatusError(exit_msg);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getRestart_button(), true);
|
||||
|
||||
} else {
|
||||
|
||||
printStatus("Waiting to start...");
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getFile_name_label(), true);
|
||||
|
||||
swingReflectionInvoke("setText", getView().getFile_name_label(), _file_name);
|
||||
|
||||
swingReflectionInvoke("setText", getView().getFile_name_label(), truncateText(_file_name, 100));
|
||||
|
||||
swingReflectionInvoke("setToolTipText", getView().getFile_name_label(), _file_name);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getFile_size_label(), true);
|
||||
|
||||
swingReflectionInvoke("setText", getView().getFile_size_label(), formatBytes(_file_size));
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getClose_button(), true);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
|
||||
THREAD_POOL.execute(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
if(!isExit()) {
|
||||
stopUploader();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pause() {
|
||||
|
||||
if(isPaused()) {
|
||||
|
||||
setPause(false);
|
||||
|
||||
getSpeed_meter().secureNotify();
|
||||
|
||||
for(ChunkUploader uploader:getChunkworkers()) {
|
||||
|
||||
uploader.secureNotify();
|
||||
}
|
||||
|
||||
setPaused_workers(0);
|
||||
|
||||
getView().resume();
|
||||
|
||||
} else {
|
||||
|
||||
setPause(true);
|
||||
|
||||
getView().pause();
|
||||
}
|
||||
|
||||
_main_panel.getUpload_manager().secureNotify();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restart() {
|
||||
|
||||
Upload new_upload = new Upload(getMain_panel(), getMa(), getFile_name(), getParent_node(), getUl_key(), getUl_url(), getRoot_node(), getShare_key(), getFolder_link(), getMain_panel().isUse_slots_up(), getMain_panel().getDefault_slots_up(), true);
|
||||
|
||||
getMain_panel().getUpload_manager().getTransference_remove_queue().add(this);
|
||||
|
||||
getMain_panel().getUpload_manager().getTransference_provision_queue().add(new_upload);
|
||||
|
||||
getMain_panel().getUpload_manager().secureNotify();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
|
||||
_main_panel.getUpload_manager().getTransference_remove_queue().add(this);
|
||||
|
||||
_main_panel.getUpload_manager().secureNotify();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPaused() {
|
||||
return isPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStopped() {
|
||||
return isExit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkSlotsAndWorkers() {
|
||||
if(!isExit()) {
|
||||
|
||||
int sl = (int)swingReflectionInvokeAndWaitForReturn("getValue", getView().getSlots_spinner());
|
||||
|
||||
int cworkers = getChunkworkers().size();
|
||||
|
||||
if(sl != cworkers) {
|
||||
|
||||
if(sl > cworkers) {
|
||||
|
||||
startSlot();
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setEnabled", getView().getSlots_spinner(), false);
|
||||
|
||||
swingReflectionInvoke("setText", getView().getSlot_status_label(), "Removing slot...");
|
||||
|
||||
stopLastStartedSlot();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConcurrentLinkedQueue<Integer> getPartialProgress() {
|
||||
return getPartialProgressQueue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProgress(int reads)
|
||||
{
|
||||
_progress+=reads;
|
||||
|
||||
getView().updateProgressBar(_progress, _progress_bar_rate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MainPanel getMain_panel() {
|
||||
return _main_panel;
|
||||
}
|
||||
|
||||
public synchronized void startSlot()
|
||||
{
|
||||
int chunkthiser_id = _chunkworkers.size()+1;
|
||||
|
||||
ChunkUploader c = new ChunkUploader(chunkthiser_id, this);
|
||||
|
||||
_chunkworkers.add(c);
|
||||
|
||||
try {
|
||||
|
||||
_thread_pool.execute(c);
|
||||
|
||||
}catch(java.util.concurrent.RejectedExecutionException e){System.out.println(e.getMessage());}
|
||||
}
|
||||
|
||||
public void setPause(boolean pause) {
|
||||
_pause = pause;
|
||||
}
|
||||
|
||||
public synchronized void stopLastStartedSlot()
|
||||
{
|
||||
if(!_chunkworkers.isEmpty()) {
|
||||
|
||||
ChunkUploader chunkuploader = _chunkworkers.remove(_chunkworkers.size()-1);
|
||||
chunkuploader.setExit(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void rejectChunkId(long chunk_id)
|
||||
{
|
||||
_rejectedChunkIds.add(chunk_id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
System.out.println("Uploader hello!");
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getClose_button(), false);
|
||||
|
||||
printStatus("Starting upload, please wait...");
|
||||
|
||||
if(!_exit)
|
||||
{
|
||||
if(_ul_url == null) {
|
||||
|
||||
_ul_url = _ma.initUploadFile(_file_name);
|
||||
|
||||
try {
|
||||
|
||||
DBTools.updateUploadUrl(_file_name, _ma.getEmail(), _ul_url);
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
int[] file_iv = {_ul_key[4], _ul_key[5], 0, 0};
|
||||
|
||||
_byte_file_key = i32a2bin(Arrays.copyOfRange(_ul_key, 0, 4));
|
||||
|
||||
_byte_file_iv = i32a2bin(file_iv);
|
||||
|
||||
if(!_exit)
|
||||
{
|
||||
|
||||
swingReflectionInvoke("setMinimum", getView().getProgress_pbar(), 0);
|
||||
swingReflectionInvoke("setMaximum", getView().getProgress_pbar(), Integer.MAX_VALUE);
|
||||
swingReflectionInvoke("setStringPainted", getView().getProgress_pbar(), true);
|
||||
|
||||
if(_file_size > 0) {
|
||||
|
||||
_progress_bar_rate = Integer.MAX_VALUE/(double)_file_size;
|
||||
|
||||
swingReflectionInvoke("setValue", getView().getProgress_pbar(), 0);
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setValue", getView().getProgress_pbar(), Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
_thread_pool.execute(getProgress_meter());
|
||||
|
||||
_thread_pool.execute(getSpeed_meter());
|
||||
|
||||
getMain_panel().getGlobal_up_speed().attachSpeedMeter(getSpeed_meter());
|
||||
|
||||
getMain_panel().getGlobal_up_speed().secureNotify();
|
||||
|
||||
_mac_generator = new UploadMACGenerator(this);
|
||||
|
||||
_thread_pool.execute(_mac_generator);
|
||||
|
||||
if(_use_slots) {
|
||||
|
||||
for(int t=1; t <= _slots; t++)
|
||||
{
|
||||
ChunkUploader c = new ChunkUploader(t, this);
|
||||
|
||||
_chunkworkers.add(c);
|
||||
|
||||
_thread_pool.execute(c);
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getSlots_label(), true);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getSlots_spinner(), true);
|
||||
|
||||
} else {
|
||||
|
||||
ChunkUploader c = new ChunkUploader(1, this);
|
||||
|
||||
_chunkworkers.add(c);
|
||||
|
||||
_thread_pool.execute(c);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getSlots_label(), false);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getSlots_spinner(), false);
|
||||
}
|
||||
|
||||
printStatus("Uploading file to mega ("+_ma.getEmail()+") ...");
|
||||
|
||||
getMain_panel().getUpload_manager().secureNotify();
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getPause_button(), true);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getProgress_pbar(), true);
|
||||
|
||||
secureWait();
|
||||
|
||||
System.out.println("Chunkuploaders finished!");
|
||||
|
||||
getSpeed_meter().setExit(true);
|
||||
|
||||
getSpeed_meter().secureNotify();
|
||||
|
||||
getProgress_meter().setExit(true);
|
||||
|
||||
getProgress_meter().secureNotify();
|
||||
|
||||
_thread_pool.shutdown();
|
||||
|
||||
while(!_thread_pool.isTerminated())
|
||||
{
|
||||
try {
|
||||
|
||||
_thread_pool.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Uploader thread pool finished!");
|
||||
|
||||
getMain_panel().getGlobal_up_speed().detachSpeedMeter(getSpeed_meter());
|
||||
|
||||
getMain_panel().getGlobal_up_speed().secureNotify();
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getSpeed_label(), false);
|
||||
swingReflectionInvoke("setVisible", getView().getRemtime_label(), false);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getPause_button(), false);
|
||||
swingReflectionInvoke("setVisible", getView().getStop_button(), false);
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getSlots_label(), false);
|
||||
swingReflectionInvoke("setVisible", getView().getSlots_spinner(), false);
|
||||
|
||||
getMain_panel().getUpload_manager().secureNotify();
|
||||
|
||||
if(!_exit) {
|
||||
|
||||
if(_completion_handle != null) {
|
||||
|
||||
File f = new File(_file_name);
|
||||
|
||||
HashMap<String, Object> upload_res=null;
|
||||
|
||||
int[] ul_key = _ul_key;
|
||||
|
||||
int[] node_key = {ul_key[0] ^ ul_key[4], ul_key[1] ^ ul_key[5], ul_key[2] ^ _file_meta_mac[0], ul_key[3] ^ _file_meta_mac[1], ul_key[4], ul_key[5], _file_meta_mac[0], _file_meta_mac[1]};
|
||||
|
||||
upload_res = _ma.finishUploadFile(f.getName(), ul_key, node_key, _file_meta_mac, _completion_handle, _parent_node, i32a2bin(_ma.getMaster_key()), _root_node, _share_key);
|
||||
|
||||
System.out.println(upload_res);
|
||||
|
||||
List files = (List)upload_res.get("f");
|
||||
|
||||
_fid = (String)((Map<String,Object>)files.get(0)).get("h");
|
||||
|
||||
_exit_message = "File successfully uploaded! ("+_ma.getEmail()+")";
|
||||
|
||||
try {
|
||||
|
||||
_file_link = _ma.getPublicFileLink(_fid, i32a2bin(node_key));
|
||||
|
||||
swingReflectionInvoke("setEnabled", getView().getFile_link_button(), true);
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
printStatusOK(_exit_message);
|
||||
|
||||
} else {
|
||||
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
_exit_message = "Upload failed!";
|
||||
|
||||
printStatusError(_exit_message);
|
||||
|
||||
_status_error = true;
|
||||
}
|
||||
|
||||
} else if(_fatal_error != null) {
|
||||
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
printStatusError(_fatal_error);
|
||||
|
||||
_status_error = true;
|
||||
|
||||
} else {
|
||||
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
_exit_message = "Upload CANCELED!";
|
||||
|
||||
printStatusError(_exit_message);
|
||||
|
||||
_status_error = true;
|
||||
}
|
||||
|
||||
}
|
||||
else if(_fatal_error != null)
|
||||
{
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
printStatusError(_fatal_error);
|
||||
|
||||
_status_error = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
_exit_message = "Upload CANCELED!";
|
||||
|
||||
printStatusError(_exit_message);
|
||||
|
||||
_status_error = true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else if(_fatal_error != null)
|
||||
{
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
_exit_message = _fatal_error;
|
||||
|
||||
printStatusError(_fatal_error);
|
||||
|
||||
_status_error = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
getView().hideAllExceptStatus();
|
||||
|
||||
_exit_message = "Upload CANCELED!";
|
||||
|
||||
printStatusError(_exit_message);
|
||||
|
||||
_status_error = true;
|
||||
|
||||
}
|
||||
|
||||
if(!_exit) {
|
||||
|
||||
try {
|
||||
DBTools.deleteUpload(_file_name, _ma.getEmail());
|
||||
} catch (SQLException ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
getMain_panel().getUpload_manager().getTransference_running_list().remove(this);
|
||||
|
||||
getMain_panel().getUpload_manager().getTransference_finished_queue().add(this);
|
||||
|
||||
getMain_panel().getView().jPanel_scroll_up.remove(getView());
|
||||
|
||||
getMain_panel().getView().jPanel_scroll_up.add(getView());
|
||||
|
||||
getMain_panel().getUpload_manager().secureNotify();
|
||||
}
|
||||
|
||||
swingReflectionInvoke("setVisible", getView().getClose_button(), true);
|
||||
|
||||
if(_status_error) {
|
||||
swingReflectionInvoke("setVisible", getView().getRestart_button(), true);
|
||||
}
|
||||
|
||||
System.out.println("Uploader BYE BYE");
|
||||
}
|
||||
|
||||
public synchronized boolean chunkUploadersRunning()
|
||||
{
|
||||
return !_chunkworkers.isEmpty();
|
||||
}
|
||||
|
||||
public synchronized void pause_worker() {
|
||||
|
||||
if(++_paused_workers >= _chunkworkers.size() && !_exit) {
|
||||
|
||||
printStatus("Upload paused!");
|
||||
swingReflectionInvoke("setText", getView().getPause_button(), "RESUME UPLOAD");
|
||||
swingReflectionInvoke("setEnabled", getView().getPause_button(), true);
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void stopThisSlot(ChunkUploader chunkuploader)
|
||||
{
|
||||
if(_chunkworkers.remove(chunkuploader))
|
||||
{
|
||||
swingReflectionInvokeAndWait("setValue", getView().getSlots_spinner(), (int)swingReflectionInvokeAndWaitForReturn("getValue", getView().getSlots_spinner())-1);
|
||||
|
||||
if(!_exit && _pause && _paused_workers == _chunkworkers.size()) {
|
||||
|
||||
printStatus("Upload paused!");
|
||||
swingReflectionInvoke("setText", getView().getPause_button(), "RESUME UPLOAD");
|
||||
swingReflectionInvoke("setEnabled", getView().getPause_button(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void emergencyStopUploader(String reason)
|
||||
{
|
||||
if(_fatal_error == null)
|
||||
{
|
||||
_fatal_error = reason!=null?reason:"FATAL ERROR!";
|
||||
|
||||
stopUploader();
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized long nextChunkId()
|
||||
{
|
||||
Long next_id;
|
||||
|
||||
if((next_id=_rejectedChunkIds.poll()) != null) {
|
||||
return next_id;
|
||||
}
|
||||
else {
|
||||
return ++_last_chunk_id_dispatched;
|
||||
}
|
||||
}
|
||||
|
||||
public void setExit(boolean exit) {
|
||||
_exit = exit;
|
||||
}
|
||||
|
||||
public synchronized void stopUploader()
|
||||
{
|
||||
if(!_exit)
|
||||
{
|
||||
setExit(true);
|
||||
|
||||
try {
|
||||
DBTools.deleteUpload(_file_name, _ma.getEmail());
|
||||
} catch (SQLException ex) {
|
||||
Logger.getLogger(Upload.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
getMain_panel().getUpload_manager().getTransference_running_list().remove(this);
|
||||
|
||||
getMain_panel().getUpload_manager().getTransference_finished_queue().add(this);
|
||||
|
||||
_main_panel.getView().jPanel_scroll_up.remove(getView());
|
||||
|
||||
_main_panel.getView().jPanel_scroll_up.add(getView());
|
||||
|
||||
getMain_panel().getUpload_manager().secureNotify();
|
||||
|
||||
getView().stop();
|
||||
|
||||
for(ChunkUploader uploader:_chunkworkers) {
|
||||
|
||||
uploader.secureNotify();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void printStatusError(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", getView().getStatus_label(), Color.red);
|
||||
swingReflectionInvoke("setText", getView().getStatus_label(), message);
|
||||
}
|
||||
|
||||
protected void printStatusOK(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", getView().getStatus_label(), new Color(0,128,0));
|
||||
swingReflectionInvoke("setText", getView().getStatus_label(), message);
|
||||
}
|
||||
|
||||
protected void printStatus(String message)
|
||||
{
|
||||
swingReflectionInvoke("setForeground", getView().getStatus_label(), Color.BLACK);
|
||||
swingReflectionInvoke("setText", getView().getStatus_label(), message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
216
src/megabasterd/UploadMACGenerator.java
Normal file
@ -0,0 +1,216 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.crypto.BadPaddingException;
|
||||
import javax.crypto.IllegalBlockSizeException;
|
||||
import javax.crypto.NoSuchPaddingException;
|
||||
import static megabasterd.MiscTools.Bin2BASE64;
|
||||
import static megabasterd.MiscTools.HashString;
|
||||
import static megabasterd.MiscTools.bin2i32a;
|
||||
import static megabasterd.MiscTools.i32a2bin;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class UploadMACGenerator implements Runnable, SecureNotifiable {
|
||||
|
||||
private long _last_chunk_id_read;
|
||||
private final ConcurrentHashMap<Long,Chunk> _chunk_queue;
|
||||
private final Upload _upload;
|
||||
private final Object _secure_notify_lock;
|
||||
private boolean _notified;
|
||||
private volatile boolean _exit;
|
||||
private long _bytes_read;
|
||||
public UploadMACGenerator(Upload upload) {
|
||||
_secure_notify_lock = new Object();
|
||||
_notified = false;
|
||||
_upload = upload;
|
||||
_chunk_queue = new ConcurrentHashMap();
|
||||
_bytes_read = _upload.getProgress();
|
||||
_last_chunk_id_read = _upload.getLast_chunk_id_dispatched();
|
||||
_exit=false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void secureNotify()
|
||||
{
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureWait() {
|
||||
|
||||
synchronized(_secure_notify_lock)
|
||||
{
|
||||
while(!_notified) {
|
||||
|
||||
try {
|
||||
_secure_notify_lock.wait();
|
||||
} catch (InterruptedException ex) {
|
||||
Logger.getLogger(UploadMACGenerator.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void secureNotifyAll() {
|
||||
|
||||
synchronized(_secure_notify_lock) {
|
||||
|
||||
_notified = true;
|
||||
|
||||
_secure_notify_lock.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
public long getLast_chunk_id_read() {
|
||||
return _last_chunk_id_read;
|
||||
}
|
||||
|
||||
public ConcurrentHashMap<Long, Chunk> getChunk_queue() {
|
||||
return _chunk_queue;
|
||||
}
|
||||
|
||||
public Upload getUpload() {
|
||||
return _upload;
|
||||
}
|
||||
|
||||
public long getBytes_read() {
|
||||
return _bytes_read;
|
||||
}
|
||||
|
||||
public boolean isExit() {
|
||||
return _exit;
|
||||
}
|
||||
|
||||
public void setExit(boolean exit) {
|
||||
_exit = exit;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
try{
|
||||
|
||||
File temp_file = new File("."+HashString("SHA-1", _upload.getFile_name()));
|
||||
|
||||
FileOutputStream temp_file_out;
|
||||
|
||||
Chunk chunk;
|
||||
int[] file_iv = bin2i32a(_upload.getByte_file_iv()), int_block, file_mac = _upload.getSaved_file_mac(), mac_iv = CryptTools.AES_ZERO_IV_I32A;
|
||||
int reads;
|
||||
byte[] byte_block = new byte[16];
|
||||
String temp_file_data = "";
|
||||
boolean new_chunk=false;
|
||||
|
||||
while(!_exit && (!_upload.isStopped() || _upload.chunkUploadersRunning()) && (_bytes_read < _upload.getFile_size() || (_upload.getFile_size() == 0 && _last_chunk_id_read < 1)))
|
||||
{
|
||||
while(_chunk_queue.containsKey(_last_chunk_id_read+1))
|
||||
{
|
||||
chunk = _chunk_queue.get(_last_chunk_id_read+1);
|
||||
|
||||
try
|
||||
{
|
||||
int[] chunk_mac = {file_iv[0], file_iv[1], file_iv[0], file_iv[1]};
|
||||
|
||||
InputStream chunk_is = chunk.getInputStream();
|
||||
|
||||
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 = CryptTools.aes_cbc_encrypt_ia32(chunk_mac, bin2i32a(_upload.getByte_file_key()), mac_iv);
|
||||
}
|
||||
|
||||
for(int i=0; i<file_mac.length; i++)
|
||||
{
|
||||
file_mac[i]^=chunk_mac[i];
|
||||
}
|
||||
|
||||
file_mac = CryptTools.aes_cbc_encrypt_ia32(file_mac, bin2i32a(_upload.getByte_file_key()), mac_iv);
|
||||
|
||||
_bytes_read+=chunk.getSize();
|
||||
|
||||
} catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
|
||||
Logger.getLogger(UploadMACGenerator.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
_chunk_queue.remove(chunk.getId());
|
||||
|
||||
_last_chunk_id_read = chunk.getId();
|
||||
|
||||
new_chunk = true;
|
||||
|
||||
}
|
||||
|
||||
if(new_chunk) {
|
||||
|
||||
System.out.println("Macgenerator -> "+(String.valueOf(_last_chunk_id_read)+"|"+String.valueOf(_bytes_read)+"|"+Bin2BASE64(i32a2bin(file_mac))));
|
||||
|
||||
temp_file_out = new FileOutputStream(temp_file);
|
||||
|
||||
temp_file_out.write(temp_file_data.getBytes());
|
||||
|
||||
temp_file_out.close();
|
||||
|
||||
new_chunk = false;
|
||||
}
|
||||
|
||||
if(!_exit && (!_upload.isStopped() || _upload.chunkUploadersRunning()) && (_bytes_read < _upload.getFile_size() || (_upload.getFile_size() == 0 && _last_chunk_id_read < 1)))
|
||||
{
|
||||
System.out.println("METAMAC wait...");
|
||||
secureWait();
|
||||
}
|
||||
}
|
||||
|
||||
if(_bytes_read == _upload.getFile_size()) {
|
||||
|
||||
int[] meta_mac={file_mac[0]^file_mac[1], file_mac[2]^file_mac[3]};
|
||||
|
||||
_upload.setFile_meta_mac(meta_mac);
|
||||
}
|
||||
|
||||
temp_file.delete();
|
||||
|
||||
_upload.secureNotify();
|
||||
|
||||
System.out.println("MAC GENERATOR BYE BYE...");
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.getLogger(UploadMACGenerator.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
168
src/megabasterd/UploadManager.java
Normal file
@ -0,0 +1,168 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.io.File;
|
||||
import java.sql.SQLException;
|
||||
import static java.util.logging.Level.SEVERE;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static megabasterd.DBTools.deleteUpload;
|
||||
import static megabasterd.MiscTools.HashString;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class UploadManager extends TransferenceManager {
|
||||
|
||||
public UploadManager(MainPanel main_panel) {
|
||||
|
||||
super(main_panel, main_panel.getView().jPanel_scroll_up);
|
||||
}
|
||||
|
||||
public void provision(Upload upload)
|
||||
{
|
||||
getScroll_panel().add(upload.getView());
|
||||
|
||||
upload.provisionIt();
|
||||
|
||||
if(upload.isProvision_ok()) {
|
||||
|
||||
getTransference_start_queue().add(upload);
|
||||
|
||||
if(getTransference_provision_queue().isEmpty()) {
|
||||
|
||||
sortTransferenceStartQueue();
|
||||
|
||||
for(Transference up:getTransference_start_queue()) {
|
||||
|
||||
getScroll_panel().remove((Component)up.getView());
|
||||
getScroll_panel().add((Component)up.getView());
|
||||
}
|
||||
|
||||
for(Transference up:getTransference_finished_queue()) {
|
||||
|
||||
getScroll_panel().remove((Component)up.getView());
|
||||
getScroll_panel().add((Component)up.getView());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
getTransference_finished_queue().add(upload);
|
||||
}
|
||||
|
||||
if(getTransference_provision_queue().isEmpty()) {
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_up_label(), "");
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_up_label(), getTransference_provision_queue().size() + " uploads waiting for provision...");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void remove(Upload upload) {
|
||||
|
||||
getScroll_panel().remove(upload.getView());
|
||||
|
||||
getTransference_start_queue().remove(upload);
|
||||
|
||||
getTransference_running_list().remove(upload);
|
||||
|
||||
getTransference_finished_queue().remove(upload);
|
||||
|
||||
if(upload.isProvision_ok()) {
|
||||
|
||||
try {
|
||||
deleteUpload(upload.getFile_name(), upload.getMa().getEmail());
|
||||
} catch (SQLException ex) {
|
||||
getLogger(UploadManager.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
File temp_file = new File("."+HashString("SHA-1", upload.getFile_name()));
|
||||
|
||||
if(temp_file.exists()) {
|
||||
|
||||
temp_file.delete();
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
getLogger(UploadManager.class.getName()).log(SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
if(!getTransference_remove_queue().isEmpty()) {
|
||||
|
||||
swingReflectionInvoke("setText", upload.getMain_panel().getView().getStatus_up_label(), "Removing "+getTransference_remove_queue().size()+" uploads, please wait...");
|
||||
|
||||
} else {
|
||||
|
||||
swingReflectionInvoke("setText", upload.getMain_panel().getView().getStatus_up_label(), "");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
while(true)
|
||||
{
|
||||
if(!getTransference_provision_queue().isEmpty())
|
||||
{
|
||||
swingReflectionInvoke("setEnabled", getMain_panel().getView().getNew_upload_menu(), false);
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_up_label(), getTransference_provision_queue().size() + " uploads waiting for provision...");
|
||||
|
||||
while(!getTransference_provision_queue().isEmpty())
|
||||
{
|
||||
Upload upload = (Upload)getTransference_provision_queue().poll();
|
||||
|
||||
if(upload != null) {
|
||||
|
||||
provision(upload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!getTransference_remove_queue().isEmpty()){
|
||||
|
||||
swingReflectionInvoke("setEnabled", getMain_panel().getView().getNew_upload_menu(), false);
|
||||
|
||||
swingReflectionInvoke("setText", getMain_panel().getView().getStatus_up_label(), "Removing "+getTransference_remove_queue().size()+" uploads, please wait...");
|
||||
|
||||
while(!getTransference_remove_queue().isEmpty()) {
|
||||
|
||||
Upload upload = (Upload)getTransference_remove_queue().poll();
|
||||
|
||||
if(upload != null) {
|
||||
|
||||
remove(upload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while(!getTransference_start_queue().isEmpty() && getTransference_running_list().size() < getMain_panel().getMax_ul()) {
|
||||
|
||||
Upload upload = (Upload)getTransference_start_queue().poll();
|
||||
|
||||
if(upload != null) {
|
||||
|
||||
start(upload);
|
||||
}
|
||||
}
|
||||
|
||||
checkButtonsAndMenus(getMain_panel().getView().getClose_all_finished_up(), getMain_panel().getView().getPause_all_up(), getMain_panel().getView().getNew_upload_menu(), getMain_panel().getView().getClean_all_up_menu());
|
||||
|
||||
secureWait();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
292
src/megabasterd/UploadView.form
Normal file
@ -0,0 +1,292 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<Properties>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
|
||||
<LineBorder roundedCorners="true" thickness="4">
|
||||
<Color PropertyName="color" blue="ff" green="cc" red="99" type="rgb"/>
|
||||
</LineBorder>
|
||||
</Border>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="file_size_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="folder_link_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="file_link_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="remtime_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="progress_pbar" alignment="0" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="speed_label" min="-2" pref="340" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="106" max="32767" attributes="0"/>
|
||||
<Component id="pause_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="close_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="restart_button" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="stop_button" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="status_label" max="32767" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="slots_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="slots_spinner" min="-2" pref="49" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="file_name_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="slot_status_label" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="slots_spinner" alignment="3" min="-2" pref="32" max="-2" attributes="0"/>
|
||||
<Component id="slots_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="status_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="file_name_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="slot_status_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="file_size_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="folder_link_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="file_link_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="remtime_label" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
||||
<Component id="progress_pbar" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="speed_label" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pause_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="stop_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="close_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="restart_button" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="status_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="status"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="slots_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Slots"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JSpinner" name="slots_spinner">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" value="Slots"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="slots_spinnerStateChanged"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="speed_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="26" style="3"/>
|
||||
</Property>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" value="speed"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="remtime_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="remaining_time"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JProgressBar" name="progress_pbar">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="18" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="pause_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="0" green="99" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Verdana" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" id="white" palette="1" red="ff" type="palette"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="PAUSE UPLOAD"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pause_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="stop_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="0" green="0" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" id="white" palette="1" red="ff" type="palette"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="CANCEL UPLOAD"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="stop_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="file_name_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="file_name"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="close_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Close"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="close_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="restart_button">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="ff" red="ff" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Restart"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="restart_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="file_size_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="20" style="1"/>
|
||||
</Property>
|
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="ff" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="file_size"/>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="slot_status_label">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="14" style="1"/>
|
||||
</Property>
|
||||
<Property name="doubleBuffered" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="folder_link_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Copy folder link"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="folder_link_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="file_link_button">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Dialog" size="16" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" value="Copy file link"/>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="file_link_buttonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
526
src/megabasterd/UploadView.java
Normal file
@ -0,0 +1,526 @@
|
||||
package megabasterd;
|
||||
|
||||
import java.awt.Color;
|
||||
import static java.awt.Font.BOLD;
|
||||
import static java.awt.Font.PLAIN;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JProgressBar;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
import static megabasterd.MainPanel.FONT_DEFAULT;
|
||||
import static megabasterd.MainPanel.THREAD_POOL;
|
||||
import static megabasterd.MiscTools.copyTextToClipboard;
|
||||
import static megabasterd.MiscTools.swingReflectionInvoke;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWait;
|
||||
import static megabasterd.MiscTools.swingReflectionInvokeAndWaitForReturn;
|
||||
import static megabasterd.MiscTools.updateFont;
|
||||
import static megabasterd.Transference.MAX_WORKERS;
|
||||
import static megabasterd.Transference.MIN_WORKERS;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author tonikelope
|
||||
*/
|
||||
public final class UploadView extends javax.swing.JPanel implements TransferenceView {
|
||||
|
||||
private final Upload _upload;
|
||||
|
||||
public JLabel getSlot_status_label() {
|
||||
return slot_status_label;
|
||||
}
|
||||
|
||||
public JSpinner getSlots_spinner() {
|
||||
return slots_spinner;
|
||||
}
|
||||
|
||||
public JLabel getFile_name_label() {
|
||||
return file_name_label;
|
||||
}
|
||||
|
||||
public JLabel getFile_size_label() {
|
||||
return file_size_label;
|
||||
}
|
||||
|
||||
public JProgressBar getProgress_pbar() {
|
||||
return progress_pbar;
|
||||
}
|
||||
|
||||
public JButton getRestart_button() {
|
||||
return restart_button;
|
||||
}
|
||||
|
||||
public JButton getClose_button() {
|
||||
return close_button;
|
||||
}
|
||||
|
||||
public JButton getPause_button() {
|
||||
return pause_button;
|
||||
}
|
||||
|
||||
public JLabel getSlots_label() {
|
||||
return slots_label;
|
||||
}
|
||||
|
||||
public JLabel getSpeed_label() {
|
||||
return speed_label;
|
||||
}
|
||||
|
||||
public JLabel getRemtime_label() {
|
||||
return remtime_label;
|
||||
}
|
||||
|
||||
public JButton getStop_button() {
|
||||
return stop_button;
|
||||
}
|
||||
|
||||
public JButton getFile_link_button() {
|
||||
return file_link_button;
|
||||
}
|
||||
|
||||
public JLabel getStatus_label() {
|
||||
return status_label;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public UploadView(Upload upload){
|
||||
|
||||
initComponents();
|
||||
|
||||
_upload = upload;
|
||||
|
||||
updateFont(status_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(remtime_label, FONT_DEFAULT, PLAIN);
|
||||
updateFont(speed_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(progress_pbar, FONT_DEFAULT, PLAIN);
|
||||
updateFont(slots_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(slots_spinner, FONT_DEFAULT, PLAIN);
|
||||
updateFont(pause_button, FONT_DEFAULT, BOLD);
|
||||
updateFont(stop_button, FONT_DEFAULT, BOLD);
|
||||
updateFont(folder_link_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(file_link_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(file_name_label, FONT_DEFAULT, PLAIN);
|
||||
updateFont(file_size_label, FONT_DEFAULT, BOLD);
|
||||
updateFont(close_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(restart_button, FONT_DEFAULT, PLAIN);
|
||||
updateFont(slot_status_label, FONT_DEFAULT, PLAIN);
|
||||
|
||||
swingReflectionInvokeAndWait("setModel", slots_spinner, new SpinnerNumberModel(_upload.getMain_panel().getDefault_slots_up(), MIN_WORKERS, MAX_WORKERS, 1));
|
||||
swingReflectionInvoke("setEditable", swingReflectionInvokeAndWaitForReturn("getTextField", swingReflectionInvokeAndWaitForReturn("getEditor", slots_spinner)), false);
|
||||
swingReflectionInvoke("setVisible", slots_spinner, false);
|
||||
swingReflectionInvoke("setVisible", slots_label, false);
|
||||
swingReflectionInvoke("setVisible", pause_button, false);
|
||||
swingReflectionInvoke("setVisible", stop_button, false);
|
||||
swingReflectionInvoke("setForeground", speed_label, new Color(0,128,255));
|
||||
swingReflectionInvoke("setVisible", speed_label, false);
|
||||
swingReflectionInvoke("setVisible", remtime_label, false);
|
||||
swingReflectionInvoke("setVisible", progress_pbar, false);
|
||||
swingReflectionInvoke("setVisible", file_name_label, false);
|
||||
swingReflectionInvoke("setVisible", close_button, false);
|
||||
swingReflectionInvoke("setVisible", restart_button, false);
|
||||
swingReflectionInvoke("setVisible", file_size_label, false);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
status_label = new javax.swing.JLabel();
|
||||
slots_label = new javax.swing.JLabel();
|
||||
slots_spinner = new javax.swing.JSpinner();
|
||||
speed_label = new javax.swing.JLabel();
|
||||
remtime_label = new javax.swing.JLabel();
|
||||
progress_pbar = new javax.swing.JProgressBar();
|
||||
pause_button = new javax.swing.JButton();
|
||||
stop_button = new javax.swing.JButton();
|
||||
file_name_label = new javax.swing.JLabel();
|
||||
close_button = new javax.swing.JButton();
|
||||
restart_button = new javax.swing.JButton();
|
||||
file_size_label = new javax.swing.JLabel();
|
||||
slot_status_label = new javax.swing.JLabel();
|
||||
folder_link_button = new javax.swing.JButton();
|
||||
file_link_button = new javax.swing.JButton();
|
||||
|
||||
setBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 204, 255), 4, true));
|
||||
|
||||
status_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
status_label.setText("status");
|
||||
status_label.setDoubleBuffered(true);
|
||||
|
||||
slots_label.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
slots_label.setText("Slots");
|
||||
slots_label.setDoubleBuffered(true);
|
||||
|
||||
slots_spinner.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
|
||||
slots_spinner.setToolTipText("Slots");
|
||||
slots_spinner.setDoubleBuffered(true);
|
||||
slots_spinner.addChangeListener(new javax.swing.event.ChangeListener() {
|
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
||||
slots_spinnerStateChanged(evt);
|
||||
}
|
||||
});
|
||||
|
||||
speed_label.setFont(new java.awt.Font("Verdana", 3, 26)); // NOI18N
|
||||
speed_label.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
speed_label.setText("speed");
|
||||
speed_label.setDoubleBuffered(true);
|
||||
|
||||
remtime_label.setFont(new java.awt.Font("Verdana", 1, 18)); // NOI18N
|
||||
remtime_label.setText("remaining_time");
|
||||
remtime_label.setDoubleBuffered(true);
|
||||
|
||||
progress_pbar.setFont(new java.awt.Font("Verdana", 1, 18)); // NOI18N
|
||||
progress_pbar.setDoubleBuffered(true);
|
||||
|
||||
pause_button.setBackground(new java.awt.Color(255, 153, 0));
|
||||
pause_button.setFont(new java.awt.Font("Verdana", 1, 16)); // NOI18N
|
||||
pause_button.setForeground(java.awt.Color.white);
|
||||
pause_button.setText("PAUSE UPLOAD");
|
||||
pause_button.setDoubleBuffered(true);
|
||||
pause_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
pause_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
stop_button.setBackground(new java.awt.Color(255, 0, 0));
|
||||
stop_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
stop_button.setForeground(java.awt.Color.white);
|
||||
stop_button.setText("CANCEL UPLOAD");
|
||||
stop_button.setDoubleBuffered(true);
|
||||
stop_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
stop_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
file_name_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
file_name_label.setForeground(new java.awt.Color(51, 51, 255));
|
||||
file_name_label.setText("file_name");
|
||||
file_name_label.setDoubleBuffered(true);
|
||||
|
||||
close_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
close_button.setText("Close");
|
||||
close_button.setDoubleBuffered(true);
|
||||
close_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
close_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
restart_button.setBackground(new java.awt.Color(51, 51, 255));
|
||||
restart_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
restart_button.setForeground(new java.awt.Color(255, 255, 255));
|
||||
restart_button.setText("Restart");
|
||||
restart_button.setDoubleBuffered(true);
|
||||
restart_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
restart_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
file_size_label.setFont(new java.awt.Font("Dialog", 1, 20)); // NOI18N
|
||||
file_size_label.setForeground(new java.awt.Color(51, 51, 255));
|
||||
file_size_label.setText("file_size");
|
||||
file_size_label.setDoubleBuffered(true);
|
||||
|
||||
slot_status_label.setFont(new java.awt.Font("Dialog", 1, 14)); // NOI18N
|
||||
slot_status_label.setDoubleBuffered(true);
|
||||
|
||||
folder_link_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
folder_link_button.setText("Copy folder link");
|
||||
folder_link_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
folder_link_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
file_link_button.setFont(new java.awt.Font("Dialog", 1, 16)); // NOI18N
|
||||
file_link_button.setText("Copy file link");
|
||||
file_link_button.setEnabled(false);
|
||||
file_link_button.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
file_link_buttonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(file_size_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(folder_link_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(file_link_button))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(remtime_label)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addComponent(progress_pbar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(speed_label, javax.swing.GroupLayout.PREFERRED_SIZE, 340, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 106, Short.MAX_VALUE)
|
||||
.addComponent(pause_button))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(close_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(restart_button)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(stop_button))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(status_label, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(slots_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(slots_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(file_name_label)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(slot_status_label)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(slots_spinner, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(slots_label)
|
||||
.addComponent(status_label))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(file_name_label)
|
||||
.addComponent(slot_status_label))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(file_size_label)
|
||||
.addComponent(folder_link_button)
|
||||
.addComponent(file_link_button))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(remtime_label)
|
||||
.addGap(6, 6, 6)
|
||||
.addComponent(progress_pbar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(speed_label)
|
||||
.addComponent(pause_button))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(stop_button)
|
||||
.addComponent(close_button)
|
||||
.addComponent(restart_button))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void slots_spinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_slots_spinnerStateChanged
|
||||
|
||||
THREAD_POOL.execute(new Runnable(){
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
_upload.checkSlotsAndWorkers();
|
||||
}
|
||||
});
|
||||
}//GEN-LAST:event_slots_spinnerStateChanged
|
||||
|
||||
private void close_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_close_buttonActionPerformed
|
||||
_upload.close();
|
||||
}//GEN-LAST:event_close_buttonActionPerformed
|
||||
|
||||
private void restart_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restart_buttonActionPerformed
|
||||
|
||||
_upload.restart();
|
||||
}//GEN-LAST:event_restart_buttonActionPerformed
|
||||
|
||||
private void stop_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stop_buttonActionPerformed
|
||||
|
||||
_upload.stop();
|
||||
}//GEN-LAST:event_stop_buttonActionPerformed
|
||||
|
||||
private void pause_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pause_buttonActionPerformed
|
||||
|
||||
_upload.pause();
|
||||
|
||||
}//GEN-LAST:event_pause_buttonActionPerformed
|
||||
|
||||
public void hideAllExceptStatus()
|
||||
{
|
||||
swingReflectionInvoke("setVisible", speed_label, false);
|
||||
swingReflectionInvoke("setVisible", remtime_label, false);
|
||||
swingReflectionInvoke("setVisible", slots_spinner, false);
|
||||
swingReflectionInvoke("setVisible", slots_label, false);
|
||||
swingReflectionInvoke("setVisible", slot_status_label, false);
|
||||
swingReflectionInvoke("setVisible", pause_button, false);
|
||||
swingReflectionInvoke("setVisible", stop_button, false);
|
||||
swingReflectionInvoke("setVisible", progress_pbar, false);
|
||||
|
||||
}
|
||||
|
||||
private void folder_link_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_folder_link_buttonActionPerformed
|
||||
|
||||
swingReflectionInvoke("setEnabled", folder_link_button, false);
|
||||
|
||||
swingReflectionInvoke("setText", folder_link_button, "Please wait...");
|
||||
|
||||
copyTextToClipboard(_upload.getFolder_link());
|
||||
|
||||
swingReflectionInvoke("setText", folder_link_button, "Copy folder link");
|
||||
|
||||
JOptionPane.showMessageDialog(_upload.getMain_panel().getView(), "MEGA folder link was copied to clipboard!");
|
||||
|
||||
swingReflectionInvoke("setEnabled", folder_link_button, true);
|
||||
}//GEN-LAST:event_folder_link_buttonActionPerformed
|
||||
|
||||
private void file_link_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_file_link_buttonActionPerformed
|
||||
|
||||
swingReflectionInvoke("setEnabled", file_link_button, false);
|
||||
|
||||
swingReflectionInvoke("setText", file_link_button, "Please wait...");
|
||||
|
||||
copyTextToClipboard(_upload.getFile_link());
|
||||
|
||||
swingReflectionInvoke("setText", file_link_button, "Copy file link");
|
||||
|
||||
JOptionPane.showMessageDialog(_upload.getMain_panel().getView(), "MEGA file link was copied to clipboard!");
|
||||
|
||||
swingReflectionInvoke("setEnabled", file_link_button, true);
|
||||
|
||||
}//GEN-LAST:event_file_link_buttonActionPerformed
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton close_button;
|
||||
private javax.swing.JButton file_link_button;
|
||||
private javax.swing.JLabel file_name_label;
|
||||
private javax.swing.JLabel file_size_label;
|
||||
private javax.swing.JButton folder_link_button;
|
||||
private javax.swing.JButton pause_button;
|
||||
private javax.swing.JProgressBar progress_pbar;
|
||||
private javax.swing.JLabel remtime_label;
|
||||
private javax.swing.JButton restart_button;
|
||||
private javax.swing.JLabel slot_status_label;
|
||||
private javax.swing.JLabel slots_label;
|
||||
private javax.swing.JSpinner slots_spinner;
|
||||
private javax.swing.JLabel speed_label;
|
||||
private javax.swing.JLabel status_label;
|
||||
private javax.swing.JButton stop_button;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
|
||||
@Override
|
||||
public void pause() {
|
||||
|
||||
printStatusNormal("Pausing upload ...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", pause_button, false);
|
||||
swingReflectionInvoke("setEnabled", speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", slots_label, false);
|
||||
swingReflectionInvoke("setEnabled", slots_spinner, false);
|
||||
|
||||
swingReflectionInvoke("setVisible", stop_button, true);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
|
||||
printStatusNormal("Stopping upload safely, please wait...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", speed_label, false);
|
||||
swingReflectionInvoke("setEnabled", pause_button, false);
|
||||
swingReflectionInvoke("setEnabled", stop_button, false);
|
||||
swingReflectionInvoke("setEnabled", slots_label, false);
|
||||
swingReflectionInvoke("setEnabled", slots_spinner, false);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resume() {
|
||||
|
||||
printStatusNormal("Uploading file to mega ...");
|
||||
|
||||
swingReflectionInvoke("setEnabled", pause_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", speed_label, true);
|
||||
swingReflectionInvoke("setEnabled", slots_label, true);
|
||||
swingReflectionInvoke("setEnabled", slots_spinner, true);
|
||||
|
||||
swingReflectionInvoke("setVisible", stop_button, false);
|
||||
|
||||
swingReflectionInvoke("setEnabled", pause_button, true);
|
||||
|
||||
swingReflectionInvoke("setText", pause_button, "PAUSE UPLOAD");
|
||||
|
||||
swingReflectionInvoke("setVisible", _upload.getMain_panel().getView().getPause_all_up(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSpeed(String sp, Boolean visible) {
|
||||
|
||||
if(sp != null) {
|
||||
|
||||
swingReflectionInvoke("setText", speed_label, sp);
|
||||
}
|
||||
|
||||
if(visible != null) {
|
||||
|
||||
swingReflectionInvoke("setVisible", speed_label, visible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRemainingTime(String remtime, Boolean visible) {
|
||||
|
||||
if(remtime != null) {
|
||||
|
||||
swingReflectionInvoke("setText", remtime_label, remtime);
|
||||
}
|
||||
|
||||
if(visible != null) {
|
||||
|
||||
swingReflectionInvoke("setVisible", remtime_label, visible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProgressBar(long progress, double bar_rate) {
|
||||
|
||||
swingReflectionInvoke("setValue", this.progress_pbar, (int)Math.ceil(bar_rate*progress));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printStatusNormal(String msg) {
|
||||
swingReflectionInvoke("setForeground", status_label, Color.BLACK);
|
||||
swingReflectionInvoke("setText", status_label, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printStatusOK(String msg) {
|
||||
swingReflectionInvoke("setForeground", status_label, new Color(0,128,0));
|
||||
swingReflectionInvoke("setText", status_label, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printStatusError(String msg) {
|
||||
|
||||
swingReflectionInvoke("setForeground", status_label, Color.red);
|
||||
swingReflectionInvoke("setText", status_label, msg);
|
||||
}
|
||||
|
||||
|
||||
}
|
BIN
src/megabasterd/dot_com.jpg
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
src/megabasterd/made_in_spain.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
src/megabasterd/mbasterd.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
src/megabasterd/mega_crypter.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src/megabasterd/pica_roja.ico
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
src/megabasterd/pica_roja.png
Normal file
After Width: | Height: | Size: 807 B |
BIN
src/megabasterd/pica_roja_big.png
Normal file
After Width: | Height: | Size: 7.4 KiB |