diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..bdecb61 --- /dev/null +++ b/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + Builds, tests, and runs the project NovacomInstaller. + + + diff --git a/doctor.txt b/doctor.txt new file mode 100644 index 0000000..c77ae33 --- /dev/null +++ b/doctor.txt @@ -0,0 +1 @@ +http://palm.cdnetworks.net/rom/touchpad/wd300wifi/webosdoctorp300hstnhwifi.jar diff --git a/linux32.txt b/linux32.txt new file mode 100644 index 0000000..a146e60 --- /dev/null +++ b/linux32.txt @@ -0,0 +1 @@ +https://cdn.downloads.palm.com/sdkdownloads/3.0.0.643/sdkBinaries/palm-novacom_1.0.76_i386.deb diff --git a/linux64.txt b/linux64.txt new file mode 100644 index 0000000..f5889d7 --- /dev/null +++ b/linux64.txt @@ -0,0 +1 @@ +https://cdn.downloads.palm.com/sdkdownloads/3.0.0.643/sdkBinaries/palm-novacom_1.0.76_amd64.deb diff --git a/manifest.mf b/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml new file mode 100644 index 0000000..79384c5 --- /dev/null +++ b/nbproject/build-impl.xml @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..b243321 --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=c15f44a5 +build.xml.script.CRC32=c1958190 +build.xml.stylesheet.CRC32=958a1d3e@1.26.2.45 +# 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=c15f44a5 +nbproject/build-impl.xml.script.CRC32=ff7b33f0 +nbproject/build-impl.xml.stylesheet.CRC32=5c621a33@1.26.2.45 diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..669aec5 --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,73 @@ +application.desc= +application.homepage= +application.title=Universal Novacom Installer +application.vendor=Jason Robitaille +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 +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/NovacomInstaller.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +file.reference.tar.jar=C:\\Users\\Jason\\NetBeansProjects\\tar.jar +includes=** +jar.compress=false +javac.classpath=\ + ${libs.swing-app-framework.classpath}:\ + ${file.reference.tar.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.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=local +jnlp.codebase.url=file:/C:/Users/Jason/NetBeansProjects/NovacomInstaller/dist/ +jnlp.descriptor=application +jnlp.enabled=false +jnlp.offline-allowed=false +jnlp.signed=false +main.class=ca.canucksoftware.novacominstaller.NovacomInstallerApp +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +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 +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..513a53a --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,19 @@ + + + org.netbeans.modules.java.j2seproject + + + NovacomInstaller + 1.6.5 + + + + + + + + + + + + diff --git a/src/META-INF/services/org.jdesktop.application.Application b/src/META-INF/services/org.jdesktop.application.Application new file mode 100644 index 0000000..bc693eb --- /dev/null +++ b/src/META-INF/services/org.jdesktop.application.Application @@ -0,0 +1 @@ +novacominstaller.NovacomInstallerApp \ No newline at end of file diff --git a/src/ca/canucksoftware/novacom/Novacom.java b/src/ca/canucksoftware/novacom/Novacom.java new file mode 100644 index 0000000..c6cae3c --- /dev/null +++ b/src/ca/canucksoftware/novacom/Novacom.java @@ -0,0 +1,206 @@ + +package ca.canucksoftware.novacom; + +import ca.canucksoftware.utils.TextStreamConsumer; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.ResourceBundle; + +/** + * @author Jason Robitaille + */ +public class Novacom { + public static String execPath() { + String novacom = "novacom"; + if(new File("/usr/local/bin/novacom").exists()) { //mac or linux + novacom = "/usr/local/bin/novacom"; + } else if(new File("/opt/nova/bin/novacom").exists()) { //mac or linux + novacom = "/opt/nova/bin/novacom"; + } else { //windows + String programPath32 = System.getenv("ProgramFiles"); + String programPath64 = null; + if(programPath32!=null) { + programPath32 = programPath32.replace("\\", "/").trim(); + if(programPath32.endsWith("(x86)")) { + programPath64 = programPath32.substring(0, + programPath32.lastIndexOf("(x86)")).trim(); + programPath64 = programPath64.replace("\\", "/"); + } + + if(programPath64!=null && new File(programPath64 + "/HP webOS/SDK/bin/novacom.exe").exists()) { + novacom = programPath64 + "/HP webOS/SDK/bin/novacom.exe"; + } else if(new File(programPath32 + "/HP webOS/SDK/bin/novacom.exe").exists()) { + novacom = programPath32 + "/HP webOS/SDK/bin/novacom.exe"; + } else if(programPath64!=null && new File(programPath64 + "/Palm, Inc/novacom.exe").exists()) { + novacom = programPath64 + "/Palm, Inc/novacom.exe"; + } else if(new File(programPath32 + "/Palm, Inc/novacom.exe").exists()) { + novacom = programPath32 + "/Palm, Inc/novacom.exe"; + } else if(programPath64!=null && new File(programPath64 + "/Palm, Inc/novacom/novacom.exe") + .exists()) { + novacom = programPath64 + "/Palm, Inc/novacom/novacom.exe"; + } else if(new File(programPath32 + "/Palm, Inc/novacom/novacom.exe").exists()) { + novacom = programPath32 + "/Palm, Inc/novacom/novacom.exe"; + } else if(programPath64!=null && new File(programPath64 + "/Palm/SDK/bin/novacom.exe").exists()) { + novacom = programPath64 + "/Palm/SDK/bin/novacom.exe"; + } else if(new File(programPath32 + "/Palm/SDK/bin/novacom.exe").exists()) { + novacom = programPath32 + "/Palm/SDK/bin/novacom.exe"; + } else if(programPath64!=null && new File(programPath64 + "/PDK/bin/novacom.exe").exists()) { + novacom = programPath64 + "/PDK/bin/novacom.exe"; + } else if(new File(programPath32 + "/PDK/bin/novacom.exe").exists()) { + novacom = programPath32 + "/PDK/bin/novacom.exe"; + } + } else { + if(new File("C:/Program Files/HP webOS/SDK/bin/novacom.exe").exists()) { + novacom = "C:/Program Files/HP webOS/SDK/bin/novacom.exe"; + } else if(new File("C:/Program Files/Palm, Inc/novacom.exe").exists()) { + novacom = "C:/Program Files/Palm, Inc/novacom.exe"; + } else if(new File("C:/Program Files/Palm, Inc/novacom/novacom.exe").exists()) { + novacom = "C:/Program Files/Palm, Inc/novacom/novacom.exe"; + } else if(new File("C:/Program Files/Palm/SDK/bin/novacom.exe").exists()) { + novacom = "C:/Program Files/Palm/SDK/bin/novacom.exe"; + } else if(new File("C:/Program Files/PDK/bin/novacom.exe").exists()) { + novacom = "C:/Program Files/PDK/bin/novacom.exe"; + } + } + } + return novacom; + } + + public static boolean isInstalled() { + boolean isInstalled = false; + String execPath = execPath(); + if(execPath.equals("novacom")) { + try { + Process p = Runtime.getRuntime().exec("novacom -l"); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + stdout.waitFor(); + isInstalled = (p.waitFor()==0); + } catch(Exception e) {} + } else { + isInstalled = new File(execPath).exists(); + } + return isInstalled; + } + + public static boolean serviceInstalled() { + boolean installed = false; + if(new File("/opt/Palm/novacom/novacomd").exists()) { //linux + installed = true; + } else if(new File("/opt/nova/bin/novacomd").exists() || + new File("/Library/LaunchDaemons/com.palm.novacomd").exists()) { //mac + installed = true; + }else { //windows + String programPath32 = System.getenv("ProgramFiles"); + String programPath64 = null; + if(programPath32!=null) { + programPath32 = programPath32.replace("\\", "/").trim(); + if(programPath32.endsWith("(x86)")) { + programPath64 = programPath32.substring(0, + programPath32.lastIndexOf("(x86)")).trim(); + programPath64 = programPath64.replace("\\", "/"); + } + if(new File(programPath32 + "/HP webOS/SDK/bin/novacomd/amd64/novacomd.exe").exists() || + new File(programPath32 + "/HP webOS/SDK/bin/novacomd/x86/novacomd.exe").exists() || + new File(programPath32 + "/Palm, Inc/novacom/amd64/novacomd.exe").exists() || + new File(programPath32 + "/Palm, Inc/novacom/x86/novacomd.exe").exists() || + new File(programPath32 + "/Palm/SDK/novacom/amd64/novacomd.exe").exists() || + new File(programPath32 + "/Palm/SDK/novacom/x86/novacomd.exe").exists() || + new File(programPath32 + "/Palm/SDK/bin/novacom/amd64/novacomd.exe").exists() || + new File(programPath32 + "/Palm/SDK/bin/novacom/x86/novacomd.exe").exists()) { + installed = true; + } + if(programPath64 != null) { + if(new File(programPath64 + "/HP webOS/SDK/bin/novacomd/amd64/novacomd.exe").exists() || + new File(programPath64 + "/HP webOS/SDK/bin/novacomd/x86/novacomd.exe").exists() || + new File(programPath64 + "/Palm, Inc/novacom/amd64/novacomd.exe").exists() || + new File(programPath64 + "/Palm, Inc/novacom/x86/novacomd.exe").exists() || + new File(programPath64 + "/Palm/SDK/novacom/amd64/novacomd.exe").exists() || + new File(programPath64 + "/Palm/SDK/novacom/x86/novacomd.exe").exists() || + new File(programPath64 + "/Palm/SDK/bin/novacom/amd64/novacomd.exe").exists() || + new File(programPath64 + "/Palm/SDK/bin/novacom/x86/novacomd.exe").exists()) { + installed = true; + } + } + } else { + if(new File("C:/Program Files/HP webOS/SDK/bin/novacomd/amd64/novacomd.exe").exists() || + new File("C:/Program Files/HP webOS/SDK/bin/novacomd/x86/novacomd.exe").exists() || + new File("C:/Program Files/Palm, Inc/novacom/amd64/novacomd.exe").exists() || + new File("C:/Program Files/Palm, Inc/novacom/x86/novacomd.exe").exists() || + new File("C:/Program Files/Palm/SDK/novacom/amd64/novacomd.exe").exists() || + new File("C:/Program Files/Palm/SDK/novacom/x86/novacomd.exe").exists() || + new File("C:/Program Files/Palm/SDK/bin/novacom/amd64/novacomd.exe").exists() || + new File("C:/Program Files/Palm/SDK/bin/novacom/x86/novacomd.exe").exists()) { + installed = true; + } + } + } + if(!installed) { + try { + Process p = Runtime.getRuntime().exec("novacom -l"); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + stdout.waitFor(); + installed = (p.waitFor()==0); + } catch(Exception e) {} + } + return installed; + } + + public static void restartService() { + Process restarter = null; + try { + String platform = System.getProperty("os.name").toLowerCase(); + if(platform.contains("windows")) { + restarter = Runtime.getRuntime().exec("net stop novacomd"); + doProcess(restarter); + restarter = Runtime.getRuntime().exec("net start novacomd"); + doProcess(restarter); + } else if(platform.contains("mac")) { + restarter = Runtime.getRuntime().exec("/usr/local/bin/stop-novacomd"); + doProcess(restarter); + restarter = Runtime.getRuntime().exec("/usr/local/bin/start-novacomd"); + doProcess(restarter); + } else if(platform.contains("linux")) { + restarter = Runtime.getRuntime().exec("stop palm-novacomd"); + doProcess(restarter); + restarter = Runtime.getRuntime().exec("killall -v -q novacomd"); + doProcess(restarter); + restarter = Runtime.getRuntime().exec("start palm-novacomd"); + doProcess(restarter); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + private static boolean doProcess(Process p) throws IOException, InterruptedException { + OutputStream os; + TextStreamConsumer stdout, stderr; + os = p.getOutputStream(); + os.flush(); + os.close(); + stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + int exitCode = p.waitFor(); + stdout.waitFor(); + stderr.waitFor(); + return (exitCode==0); + } +} diff --git a/src/ca/canucksoftware/novacom/NovacomDrivers.java b/src/ca/canucksoftware/novacom/NovacomDrivers.java new file mode 100644 index 0000000..3913bf8 --- /dev/null +++ b/src/ca/canucksoftware/novacom/NovacomDrivers.java @@ -0,0 +1,316 @@ + +package ca.canucksoftware.novacom; + +import ca.canucksoftware.utils.TextStreamConsumer; +import com.ice.tar.TarEntry; +import com.ice.tar.TarInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.NumberFormat; +import java.util.zip.GZIPInputStream; +import javax.swing.JLabel; +import javax.swing.JProgressBar; +import java.util.ResourceBundle; + +/** + * @author Jason Robitaille + */ +public class NovacomDrivers { + private Driver driver; + private JProgressBar pBar; + private JLabel label; + + public NovacomDrivers() { + pBar = null; + label = null; + String os = System.getProperty("os.name").toLowerCase(); + if(os.contains("windows")) { + if(System.getenv("ProgramFiles(x86)")==null) { + driver = Driver.Windows_x86; + } else { + driver = Driver.Windows_x64; + } + } else if(os.contains("mac")) { + driver = Driver.Mac; + } else if(os.contains("linux")) { + if(!is64bitLinux()) { + driver = Driver.Linux_x86; + } else { + driver = Driver.Linux_x64; + } + } + } + + public void setGUI(JLabel lbl, JProgressBar bar) { + label = lbl; + pBar = bar; + } + + private boolean is64bitLinux() { + boolean result = false; + try { + Process p = Runtime.getRuntime().exec("dpkg --print-architecture"); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + stdout.waitFor(); + result = !stdout.toString().toLowerCase().contains("i386"); + } catch (IOException e) { + System.err.println("Unable to check Linux system architecture"); + } + return result; + } + + public boolean install() { + boolean result = false; + if(driver==Driver.Windows_x86 || driver==Driver.Windows_x64) { + result = installForWindows(); + } else if(driver==Driver.Mac) { + result = installForMac(); + } else if(driver==Driver.Linux_x86 || driver==Driver.Linux_x64) { + result = installForLinux(); + } + return result; + } + + public boolean installForWindows() { + boolean result = false; + File installer = extractInstaller(); + if(installer!=null) { + if(label!=null) { + label.setText("Installing driver..."); + } + String command = "msiexec /i " + installer.getAbsolutePath() + " /passive"; + if(isStandaloneInstalled()) { + command = "msiexec /i " + installer.getAbsolutePath()+ " REINSTALL=ALL REINSTALLMODE=vomus /norestart /passive"; + } + try { + Process p = Runtime.getRuntime().exec(command); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + result = (p.waitFor()==0); + stdout.waitFor(); + stderr.waitFor(); + installer.delete(); + result = true; + } catch (Exception e) { + System.err.println("Unable to install " + driver.file()); + e.printStackTrace(); + } + } + return result; + } + + public boolean installForMac() { + boolean result = false; + File installer = extractInstaller(); + if(installer!=null) { + if(label!=null) { + label.setText("Installing driver..."); + } + try { + Process p = Runtime.getRuntime().exec("open -W " + installer.getAbsolutePath()); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + result = (p.waitFor()==0); + stdout.waitFor(); + stderr.waitFor(); + deleteItem(installer); + result = true; + } catch (Exception e) { + System.err.println("Unable to install " + driver.file()); + } + } + return result; + } + + private boolean deleteItem(File path) { + if(path.isDirectory()) { + File[] files = path.listFiles(); + for(int i=0; iInstalling driver..."); + } + if(installer!=null) { + try { + Process p = Runtime.getRuntime().exec("xterm +hold -e sudo dpkg -i " + + installer.getAbsolutePath()); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + result = (p.waitFor()==0); + stdout.waitFor(); + stderr.waitFor(); + installer.delete(); + result = true; + } catch (Exception e) { + System.err.println("Unable to install " + driver.file()); + e.printStackTrace(); + } + } + } + return result; + } + + private File extractInstaller() { + String tmpFilePath = System.getProperty("java.io.tmpdir"); + File result = new File(tmpFilePath, driver.file()); + if(result.exists()) { + deleteItem(result); + } + NumberFormat nf = NumberFormat.getNumberInstance(); + nf.setGroupingUsed(false); + nf.setMaximumFractionDigits(2); + TarInputStream tis = null; + try { + HttpURLConnection urlCon = (HttpURLConnection) new URL(driver.url()).openConnection(); + urlCon.setInstanceFollowRedirects(true); + urlCon.setRequestProperty("REFERER", driver.url()); + urlCon.connect(); + tis = new TarInputStream(new GZIPInputStream((urlCon.getInputStream()))); + TarEntry entry = tis.getNextEntry(); + byte data[] = new byte[2048]; + int count = 0; + int kbCount = 0; + while(entry!=null) { + if(!entry.getName().endsWith("hp_license_agreement.pdf")) { + File curr = new File(tmpFilePath, entry.getName()); + if(entry.isDirectory()) { + curr.mkdirs(); + } else { + OutputStream out = new BufferedOutputStream(new FileOutputStream(curr)); + while((count = tis.read(data)) != -1) { + if(label!=null) { + if(kbCount<1000) { + pBar.setString(kbCount + " KB"); + } else { + pBar.setString(nf.format(((double) kbCount)/1024.0) + " MB"); + } + } + kbCount+=2; + out.write(data, 0, count); + } + out.flush(); + out.close(); + + if(driver==Driver.Mac) { + try { + Process p = Runtime.getRuntime().exec("chmod ugoa+x " + curr.getAbsolutePath()); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + p.waitFor(); + stdout.waitFor(); + stderr.waitFor(); + } catch (Exception e) { + System.err.println("Unable to chmod " + curr.getAbsolutePath()); + } + } + } + } + entry = tis.getNextEntry(); + } + tis.close(); + } catch(Exception e) { + e.printStackTrace(); + System.err.println("Unable to extract " + driver.file()); + result = null; + } + return result; + } + + + private boolean isStandaloneInstalled() { + boolean installed = false; + if(new File("/opt/Palm/novacom/novacomd").exists()) { //linux + installed = true; + } else if(new File("/opt/nova/bin/novacomd").exists() || + new File("/Library/LaunchDaemons/com.palm.novacomd").exists()) { //mac + installed = true; + }else { //windows + String programPath32 = System.getenv("ProgramFiles"); + String programPath64 = null; + if(programPath32!=null) { + programPath32 = programPath32.replace("\\", "/").trim(); + if(programPath32.endsWith("(x86)")) { + programPath64 = programPath32.substring(0, + programPath32.lastIndexOf("(x86)")).trim(); + programPath64 = programPath64.replace("\\", "/"); + } + if(new File(programPath32 + "/Palm, Inc/novacom/amd64/novacomd.exe").exists() || + new File(programPath32 + "/Palm, Inc/novacom/x86/novacomd.exe").exists()) { + installed = true; + } + if(programPath64 != null) { + if(new File(programPath64 + "/Palm, Inc/novacom/amd64/novacomd.exe").exists() || + new File(programPath64 + "/Palm, Inc/novacom/x86/novacomd.exe").exists()) { + installed = true; + } + } + } else { + if(new File("C:/Program Files/Palm, Inc/novacom/amd64/novacomd.exe").exists() || + new File("C:/Program Files/Palm, Inc/novacom/x86/novacomd.exe").exists()) { + installed = true; + } + } + } + return installed; + } + + private enum Driver { + Windows_x86("NovacomInstaller_x86.msi", "http://downloads.help.palm.com/opensource/novacom/novacom-win-32.tgz"), + Windows_x64("NovacomInstaller_x64.msi", "http://downloads.help.palm.com/opensource/novacom/novacom-win-64.tgz"), + Mac("NovacomInstaller.pkg", "http://downloads.help.palm.com/opensource/novacom/novacom-mac.tgz"), + Linux_x86("palm-novacom_1.0.76_i386.deb", "http://downloads.help.palm.com/opensource/novacom/novacom-linux-32.tgz"), + Linux_x64("palm-novacom_1.0.76_amd64.deb", "http://downloads.help.palm.com/opensource/novacom/novacom-linux-64.tgz"); + + private String file, url; + Driver(String file, String url) { + this.file = file; + this.url = url; + } + public String file() { return file; } + public String url() { return url; } + } +} diff --git a/src/ca/canucksoftware/novacominstaller/DriverDownloader.form b/src/ca/canucksoftware/novacominstaller/DriverDownloader.form new file mode 100644 index 0000000..bbf0f29 --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/DriverDownloader.form @@ -0,0 +1,99 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ca/canucksoftware/novacominstaller/DriverDownloader.java b/src/ca/canucksoftware/novacominstaller/DriverDownloader.java new file mode 100644 index 0000000..ead5b45 --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/DriverDownloader.java @@ -0,0 +1,123 @@ +/* + * WebOSQuickInstallAboutBox.java + */ + +package ca.canucksoftware.novacominstaller; + +import ca.canucksoftware.novacom.NovacomDrivers; +import java.util.Timer; +import java.util.TimerTask; +import javax.swing.JOptionPane; + + +public class DriverDownloader extends javax.swing.JDialog { + private Timer t; + private boolean downloadStarted; + + public DriverDownloader(java.awt.Frame parent) { + super(parent); + initComponents(); + t = new Timer(); + downloadStarted = 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. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + jLayeredPane1 = new javax.swing.JLayeredPane(); + jProgressBar1 = new javax.swing.JProgressBar(); + jLabel1 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(ca.canucksoftware.novacominstaller.NovacomInstallerApp.class).getContext().getResourceMap(DriverDownloader.class); + setBackground(resourceMap.getColor("transfer.background")); // NOI18N + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + setForeground(resourceMap.getColor("transfer.foreground")); // NOI18N + setIconImage(null); + setModal(true); + setName("transfer"); // NOI18N + setResizable(false); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowActivated(java.awt.event.WindowEvent evt) { + formWindowActivated(evt); + } + public void windowClosed(java.awt.event.WindowEvent evt) { + formWindowClosed(evt); + } + public void windowOpened(java.awt.event.WindowEvent evt) { + formWindowOpened(evt); + } + }); + + jLayeredPane1.setBackground(resourceMap.getColor("jLayeredPane1.background")); // NOI18N + jLayeredPane1.setForeground(resourceMap.getColor("jLayeredPane1.foreground")); // NOI18N + jLayeredPane1.setName("jLayeredPane1"); // NOI18N + jLayeredPane1.setOpaque(true); + + jProgressBar1.setFont(jProgressBar1.getFont()); + jProgressBar1.setMaximum(1); + jProgressBar1.setName("jProgressBar1"); // NOI18N + jProgressBar1.setString(resourceMap.getString("jProgressBar1.string")); // NOI18N + jProgressBar1.setStringPainted(true); + jProgressBar1.setBounds(50, 60, 200, 30); + jLayeredPane1.add(jProgressBar1, javax.swing.JLayeredPane.DEFAULT_LAYER); + + jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getSize()+1f)); + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + jLabel1.setBounds(30, 10, 240, 40); + jLayeredPane1.add(jLabel1, javax.swing.JLayeredPane.DEFAULT_LAYER); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLayeredPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLayeredPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE) + ); + + pack(); + }// //GEN-END:initComponents + + private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened + }//GEN-LAST:event_formWindowOpened + + private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated + if(!downloadStarted) { + t.schedule(new DoDownload(), 100); + downloadStarted = true; + } + }//GEN-LAST:event_formWindowActivated + + private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed + }//GEN-LAST:event_formWindowClosed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + private javax.swing.JLayeredPane jLayeredPane1; + private javax.swing.JProgressBar jProgressBar1; + // End of variables declaration//GEN-END:variables + + class DoDownload extends TimerTask { + public void run() { + t.cancel(); + NovacomDrivers driver = new NovacomDrivers(); + driver.setGUI(jLabel1, jProgressBar1); + if(driver.install()) { + JOptionPane.showMessageDialog(rootPane, "Driver installed successfully."); + } else { + JOptionPane.showMessageDialog(rootPane, "ERROR: Driver installation failed"); + } + dispose(); + } + } +} diff --git a/src/ca/canucksoftware/novacominstaller/NovacomInstallerApp.java b/src/ca/canucksoftware/novacominstaller/NovacomInstallerApp.java new file mode 100644 index 0000000..12dbcd0 --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/NovacomInstallerApp.java @@ -0,0 +1,51 @@ +/* + * NovacomInstallerApp.java + */ + +package ca.canucksoftware.novacominstaller; + +import org.jdesktop.application.Application; +import org.jdesktop.application.SingleFrameApplication; + +/** + * The main class of the application. + */ +public class NovacomInstallerApp extends SingleFrameApplication { + + /** + * At startup create and show the main frame of the application. + */ + @Override protected void startup() { + NovacomInstallerView app = new NovacomInstallerView(this); + app.getFrame().setResizable(false); + app.getFrame().setSize(220, 140); + app.getFrame().setTitle("Universal Novacom Installer"); + app.getFrame().setVisible(true); + app.getFrame().requestFocus(); + + show(app); + } + + /** + * This method is to initialize the specified window by injecting resources. + * Windows shown in our application come fully initialized from the GUI + * builder, so this additional configuration is not needed. + */ + @Override protected void configureWindow(java.awt.Window root) { + } + + /** + * A convenient static getter for the application instance. + * @return the instance of NovacomInstallerApp + */ + public static NovacomInstallerApp getApplication() { + return Application.getInstance(NovacomInstallerApp.class); + } + + /** + * Main method launching the application. + */ + public static void main(String[] args) { + launch(NovacomInstallerApp.class, args); + } +} diff --git a/src/ca/canucksoftware/novacominstaller/NovacomInstallerView.form b/src/ca/canucksoftware/novacominstaller/NovacomInstallerView.form new file mode 100644 index 0000000..bbd922a --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/NovacomInstallerView.form @@ -0,0 +1,87 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/ca/canucksoftware/novacominstaller/NovacomInstallerView.java b/src/ca/canucksoftware/novacominstaller/NovacomInstallerView.java new file mode 100644 index 0000000..c2126c2 --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/NovacomInstallerView.java @@ -0,0 +1,165 @@ +/* + * NovacomInstallerView.java + */ + +package ca.canucksoftware.novacominstaller; + +import ca.canucksoftware.novacom.NovacomDrivers; +import ca.canucksoftware.utils.TextStreamConsumer; +import org.jdesktop.application.SingleFrameApplication; +import org.jdesktop.application.FrameView; +import javax.swing.JOptionPane; +import java.io.*; +import java.util.TimerTask; +import javax.swing.JFrame; + +/** + * The application's main frame. + */ +public class NovacomInstallerView extends FrameView { + public java.util.Timer t; + + public NovacomInstallerView(SingleFrameApplication app) { + super(app); + initComponents(); + String os = System.getProperty("os.name").toLowerCase(); + if(os.contains("windows")) { + if(System.getenv("ProgramFiles(x86)")==null) { + jLabel2.setText("Windows 32bit"); + } else { + jLabel2.setText("Windows 64bit"); + } + } else if(os.contains("mac")) { + jLabel2.setText("Mac OS"); + } else if(os.contains("linux")) { + if(!is64bitLinux()) { + jLabel2.setText("Linux 32bit"); + } else { + jLabel2.setText("Linux 64bit"); + } + } else { + jLabel2.setText(""); + } + } + + private boolean is64bitLinux() { + boolean result = false; + try { + Process p = Runtime.getRuntime().exec("dpkg --print-architecture"); + OutputStream os = p.getOutputStream(); + os.flush(); + os.close(); + TextStreamConsumer stdout = new TextStreamConsumer(p.getInputStream()); + stdout.start(); + TextStreamConsumer stderr = new TextStreamConsumer(p.getErrorStream()); + stderr.start(); + stdout.waitFor(); + result = !stdout.toString().toLowerCase().contains("i386"); + } catch (IOException e) { + System.err.println("Unable to check Linux system architecture"); + } + return result; + } + + /** 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") + // //GEN-BEGIN:initComponents + private void initComponents() { + + mainPanel = new javax.swing.JPanel(); + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + jButton1 = new javax.swing.JButton(); + + mainPanel.setName("mainPanel"); // NOI18N + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(ca.canucksoftware.novacominstaller.NovacomInstallerApp.class).getContext().getResourceMap(NovacomInstallerView.class); + jLabel1.setFont(resourceMap.getFont("jLabel1.font")); // NOI18N + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + jLabel2.setFont(resourceMap.getFont("jLabel2.font")); // NOI18N + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + jButton1.setFont(resourceMap.getFont("jButton1.font")); // NOI18N + jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N + jButton1.setName("jButton1"); // NOI18N + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); + mainPanel.setLayout(mainPanelLayout); + mainPanelLayout.setHorizontalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addComponent(jLabel1) + .addGap(18, 18, 18) + .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 193, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + mainPanelLayout.setVerticalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 24, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(16, Short.MAX_VALUE)) + ); + + setComponent(mainPanel); + }// //GEN-END:initComponents + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + t = new java.util.Timer(); + jButton1.setEnabled(false); + jButton1.setText("Please wait..."); + t.schedule(new DoInstallation(), 200); + }//GEN-LAST:event_jButton1ActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton jButton1; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JPanel mainPanel; + // End of variables declaration//GEN-END:variables + + class DoInstallation extends TimerTask { + public void run() { + JFrame mainFrame = NovacomInstallerApp.getApplication().getMainFrame(); + DriverDownloader downloader = new DriverDownloader(mainFrame); + NovacomInstallerApp.getApplication().show(downloader); + jButton1.setEnabled(true); + jButton1.setText("Install Novacom"); + } + } + + class DoctorChooseFilter extends javax.swing.filechooser.FileFilter { + private final String[] okFileExtensions = new String[] {".jar"}; + + public boolean accept(File f) { + for (String extension : okFileExtensions) + if (f.getName().toLowerCase().endsWith(extension) || f.isDirectory()) + return true; + return false; + } + + public String getDescription() { + return "Jar Files (*.jar)"; + } + } +} diff --git a/src/ca/canucksoftware/novacominstaller/resources/DriverDownloader.properties b/src/ca/canucksoftware/novacominstaller/resources/DriverDownloader.properties new file mode 100644 index 0000000..fab6680 --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/resources/DriverDownloader.properties @@ -0,0 +1,13 @@ +# To change this template, choose Tools | Templates +# and open the template in the editor. + +#NOI18N +jLayeredPane1.background=219, 219, 219 +#NOI18N +transfer.foreground=219, 219, 219 +#NOI18N +transfer.background=219, 219, 219 +#NOI18N +jLayeredPane1.foreground=243, 241, 233 +jLabel1.text=Downloading Novacom Drivers +jProgressBar1.string=Initializing... diff --git a/src/ca/canucksoftware/novacominstaller/resources/NovacomInstallerApp.properties b/src/ca/canucksoftware/novacominstaller/resources/NovacomInstallerApp.properties new file mode 100644 index 0000000..9a429d9 --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/resources/NovacomInstallerApp.properties @@ -0,0 +1,12 @@ +# Application global resources + +Application.name = Universal Novacom Installer +Application.title = Universal Novacom Installer +Application.version = 1.2.1 +Application.vendor = Jason Robitaille +Application.description = +Application.vendorId = JasonRobitaille +Application.id = Universal Novacom Installer +Application.lookAndFeel = system +#NOI18N +Application.homepage= diff --git a/src/ca/canucksoftware/novacominstaller/resources/NovacomInstallerView.properties b/src/ca/canucksoftware/novacominstaller/resources/NovacomInstallerView.properties new file mode 100644 index 0000000..1a08caf --- /dev/null +++ b/src/ca/canucksoftware/novacominstaller/resources/NovacomInstallerView.properties @@ -0,0 +1,37 @@ + +# @Action resources + +showAboutBox.Action.text = &About... +showAboutBox.Action.shortDescription = Show the application's information dialog + +# status bar resources + +StatusBar.messageTimeout = 5000 +StatusBar.busyAnimationRate = 30 +StatusBar.idleIcon = busyicons/idle-icon.png +StatusBar.busyIcons[0] = busyicons/busy-icon0.png +StatusBar.busyIcons[1] = busyicons/busy-icon1.png +StatusBar.busyIcons[2] = busyicons/busy-icon2.png +StatusBar.busyIcons[3] = busyicons/busy-icon3.png +StatusBar.busyIcons[4] = busyicons/busy-icon4.png +StatusBar.busyIcons[5] = busyicons/busy-icon5.png +StatusBar.busyIcons[6] = busyicons/busy-icon6.png +StatusBar.busyIcons[7] = busyicons/busy-icon7.png +StatusBar.busyIcons[8] = busyicons/busy-icon8.png +StatusBar.busyIcons[9] = busyicons/busy-icon9.png +StatusBar.busyIcons[10] = busyicons/busy-icon10.png +StatusBar.busyIcons[11] = busyicons/busy-icon11.png +StatusBar.busyIcons[12] = busyicons/busy-icon12.png +StatusBar.busyIcons[13] = busyicons/busy-icon13.png +StatusBar.busyIcons[14] = busyicons/busy-icon14.png +jLabel1.text=OS Detected: +jLabel2.text= +#NOI18N +jLabel2.font=Tahoma-Plain-14 +jButton1.text=Install Novacom +#NOI18N +jButton1.font=Tahoma-Plain-18 +diffOS.Action.text= +diffOS.Action.shortDescription= +#NOI18N +jLabel1.font=Tahoma-Plain-12 diff --git a/src/ca/canucksoftware/utils/FileUtils.java b/src/ca/canucksoftware/utils/FileUtils.java new file mode 100644 index 0000000..a6ead53 --- /dev/null +++ b/src/ca/canucksoftware/utils/FileUtils.java @@ -0,0 +1,65 @@ + +package ca.canucksoftware.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import org.jdesktop.application.Application; + +/** + * + * @author Jason + */ +public class FileUtils { + public static File appDirectory() { + File app, dir; + try { + app = new File(Application.getInstance() + .getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); + dir = app.getParentFile(); + } catch(Exception e) { + app = new File(Application.getInstance().getClass().getProtectionDomain() + .getCodeSource().getLocation() + .getPath().replaceAll("%20", " ")); + dir = app.getParentFile(); + } + return dir; + } + + public static void copy(File from, File to) throws IOException { + FileInputStream fis = new FileInputStream(from); + FileOutputStream fos = new FileOutputStream(to); + try { + byte[] buf = new byte[1024]; + int i = 0; + while ((i = fis.read(buf)) != -1) { + fos.write(buf, 0, i); + } + } catch (IOException e) { + throw e; + } finally { + if (fis != null) + fis.close(); + if (fos != null) + fos.close(); + } + } + + public static String getFilename(File file) { + return getFilename(file.getName()); + } + + public static String getFilename(String file) { + String name = file; + int index = name.lastIndexOf("\\"); + if(index>-1) { + name = name.substring(index+1, name.length()); + } else { + index = name.lastIndexOf("/"); + if(index>-1) + name = name.substring(index+1, name.length()); + } + return name; + } +} diff --git a/src/ca/canucksoftware/utils/OnlineFile.java b/src/ca/canucksoftware/utils/OnlineFile.java new file mode 100644 index 0000000..bf05913 --- /dev/null +++ b/src/ca/canucksoftware/utils/OnlineFile.java @@ -0,0 +1,87 @@ + +package ca.canucksoftware.utils; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +/** + * @author Jason Robitaille + */ +public class OnlineFile { + private String url; + + public OnlineFile(URL file) { + this(file.toString()); + } + public OnlineFile(String file) { + url = file; + } + + public boolean exists() { + boolean result = false; + try { + HttpURLConnection.setFollowRedirects(false); + HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); + con.setInstanceFollowRedirects(false); + con.setConnectTimeout(3000); + con.setReadTimeout(3000); + con.setRequestMethod("HEAD"); + result = (con.getResponseCode() == HttpURLConnection.HTTP_OK); + } catch (Exception e) { + result = false; + } + return result; + } + + public File download() { + String tmpFilePath = System.getProperty("java.io.tmpdir"); + File output = new File(tmpFilePath, url.substring(url.lastIndexOf("/")+1)); + return download(output); + } + + public File download(File output) { + File result = output; + URLConnection urlCon = null; + if(exists()) { + try { + urlCon = getURL().openConnection(); + urlCon.setRequestProperty("Content-Type", "application/binary"); + if(result.exists()) { + result.delete(); + } + BufferedInputStream bis = new BufferedInputStream(urlCon.getInputStream()); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(result)); + byte[] buf = new byte[1024]; + int len; + while ((len = bis.read(buf)) > 0){ + bos.write(buf, 0, len); + } + bos.flush(); + bis.close(); + bos.close(); + } catch(Exception e) { + e.printStackTrace(); + if(result.exists()) { + result.delete(); + } + result = null; + } + } else { + if(result.exists()) { + result.delete(); + } + result = null; + } + return result; + } + + @Override + public String toString() { return url; } + public URL getURL() throws MalformedURLException { return new URL(url); } +} diff --git a/src/ca/canucksoftware/utils/TextStreamConsumer.java b/src/ca/canucksoftware/utils/TextStreamConsumer.java new file mode 100644 index 0000000..455bbad --- /dev/null +++ b/src/ca/canucksoftware/utils/TextStreamConsumer.java @@ -0,0 +1,51 @@ + +package ca.canucksoftware.utils; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * @author Jason Robitaille + */ +public class TextStreamConsumer extends Thread { + private InputStream is; + private String output; + + public TextStreamConsumer(InputStream stream) { + is = stream; + output = null; + } + + @Override + public void run() { + String result = ""; + try { + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String line = br.readLine(); + while(line!=null) { + result += line; + line = br.readLine(); + if(line!=null) { + result += "\n"; + } + } + br.close(); + is.close(); + } catch(Exception e) {} + output = result; + } + + public void waitFor() { + try { + super.join(); + } catch (InterruptedException e) { + System.err.println("TextStreamConsumer thread interrupted"); + } + } + + @Override + public String toString() { + return output; + } +}