/* * This file is part of the arma3launcher distribution. * Copyright (c) 2020-2020 Niklas Schütrumpf (Gurkengewuerz) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package de.mc8051.arma3launcher; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; import java.util.concurrent.CompletionStage; import java.util.concurrent.Flow; import java.util.logging.Level; import java.util.logging.Logger; /** * Created by gurkengewuerz.de on 29.03.2020. */ public class Arma3LauncherPatcher { public static void main(String[] args) { if (args.length != 2) { Logger.getLogger(Arma3LauncherPatcher.class.getName()).log(Level.SEVERE, " "); return; } try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ignored) { } JFrame frame = new JFrame("Auto Patcher"); Patcher patcher = new Patcher(); frame.setContentPane(patcher.mainpanel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setMinimumSize(new Dimension(500, 100)); frame.setResizable(false); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { frame.dispose(); } }); frame.pack(); frame.setIconImage(createIcon()); frame.setLocationRelativeTo(null); frame.setVisible(true); HttpClient client = HttpClient.newHttpClient(); try { HttpRequest request = HttpRequest.newBuilder() .uri(new URI(args[0])) .GET() .build(); File f = new File(args[1]); String fileName = Paths.get(f.getPath()).getFileName().toString(); String fileExt = ""; if (fileName.indexOf(".") > 0) { fileExt = fileName.substring(fileName.lastIndexOf(".") + 1); fileName = fileName.substring(0, fileName.lastIndexOf(".")); } Path tempFile = Files.createTempFile(fileName, fileExt); HttpResponse response = client.send(request, responseInfo -> { HttpResponse.BodyHandler bodyHandler = HttpResponse.BodyHandlers.ofFile(tempFile); final String s = responseInfo.headers().firstValue("content-length").get(); long contentSize = Long.parseLong(s); return new DownloadObserver(bodyHandler.apply(responseInfo), contentSize, patcher.progressBar1); }); if (response.statusCode() != 200) throw new IllegalStateException("Download file is invalid. Got response code " + response.statusCode()); Files.copy(tempFile, f.toPath(), StandardCopyOption.REPLACE_EXISTING); run(f.getAbsolutePath()); JOptionPane.showMessageDialog( frame, "Launcher has been successfully updated.", "Update", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } catch (IOException | URISyntaxException | InterruptedException | IllegalStateException e) { Logger.getLogger(Arma3LauncherPatcher.class.getName()).log(Level.SEVERE, null, e); JOptionPane.showMessageDialog( null, "An error occured.\n" + e.getMessage() + "\nUpdate process aborded.", "Update failed", JOptionPane.ERROR_MESSAGE); System.exit(1); } } public static void run(String path) { try { Runtime.getRuntime().exec("\"" + System.getProperty("java.home") + File.separator + "bin" + File.separator + "java\" -jar \"" + path + "\""); } catch (IOException ignored) { } } static BufferedImage createIcon() { try { return ImageIO.read(Arma3LauncherPatcher.class.getResourceAsStream("/icons/logo_32.png")); } catch (IOException e) { Logger.getLogger(Arma3LauncherPatcher.class.getName()).log(Level.SEVERE, null, e); return null; } } private static class DownloadObserver implements HttpResponse.BodySubscriber { private int counter = 0; private long total = 0L; private long contentSize = 0L; private HttpResponse.BodySubscriber subscriber; private JProgressBar progressBar; public DownloadObserver(HttpResponse.BodySubscriber subscriber, long contentSize, JProgressBar progressBar) { this.subscriber = subscriber; this.contentSize = contentSize; this.progressBar = progressBar; } @Override public void onSubscribe(Flow.Subscription subscription) { subscriber.onSubscribe(subscription); } @Override public void onNext(List item) { item.forEach((size) -> { total += size.remaining(); }); int progress = (int) (((double) total / (double) contentSize) * 100); SwingUtilities.invokeLater(() -> progressBar.setValue(progress)); counter++; subscriber.onNext(item); } @Override public void onError(Throwable throwable) { subscriber.onError(throwable); } @Override public void onComplete() { subscriber.onComplete(); } @Override public CompletionStage getBody() { return subscriber.getBody(); } } }