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 |