/* * MediathekView * Copyright (C) 2008 W. Xaver * W.Xaver[at]googlemail.com * http://zdfmediathk.sourceforge.net/ * * 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, either version 3 of the License, or * any later version. * * 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 <http://www.gnu.org/licenses/>. */ package mediathek.update; import mSearch.Const; import mSearch.tool.Functions; import mSearch.tool.Log; import mediathek.config.Daten; import mediathek.config.Konstanten; import mediathek.config.MVConfig; import javax.swing.*; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Optional; public class ProgrammUpdateSuchen { private static final String UPDATE_SEARCH_TITLE = "Software-Aktualisierung"; private static final String UPDATE_ERROR_MESSAGE = "<html>Es ist ein Fehler bei der Softwareaktualisierung aufgetreten.<br>" + "Die aktuelle Version konnte nicht ermittelt werden.</html>"; /** * Connection timeout in milliseconds. */ private static final int TIMEOUT = 10_000; private final ArrayList<String[]> listInfos = new ArrayList<>(); private boolean neueVersion = false; public boolean checkVersion(boolean anzeigen, boolean showProgramInformation, boolean showAllInformation) { // prüft auf neue Version, aneigen: wenn true, dann AUCH wenn es keine neue Version gibt ein Fenster neueVersion = false; Optional<ServerProgramInformation> opt = retrieveProgramInformation(); if (!opt.isPresent()) SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(null, UPDATE_ERROR_MESSAGE, UPDATE_SEARCH_TITLE, JOptionPane.ERROR_MESSAGE)); else { // Update-Info anzeigen final ServerProgramInformation progInfo = opt.get(); SwingUtilities.invokeLater(() -> { if (showProgramInformation) showProgramInformation(showAllInformation); if (progInfo.getVersion() == -1) JOptionPane.showMessageDialog(null, UPDATE_ERROR_MESSAGE, UPDATE_SEARCH_TITLE, JOptionPane.ERROR_MESSAGE); else { MVConfig.add(MVConfig.Configs.SYSTEM_BUILD_NR, Functions.getBuildNr()); MVConfig.add(MVConfig.Configs.SYSTEM_UPDATE_DATUM, new SimpleDateFormat("yyyyMMdd").format(new Date())); if (checkForNewerVersion(progInfo.getVersion())) { neueVersion = true; //TODO beautify this dialog. Looks really ugly. new DialogHinweisUpdate(null, true, "Eine neue Version liegt vor", " ==================================================\n" + " Neue Version:\n" + " " + progInfo.getVersion() + "\n\n" + " ==================================================\n" + " Änderungen:\n" + " " + progInfo.getReleaseNotes() + "\n\n" + " ==================================================\n" + " URL:\n" + " " + progInfo.getUpdateUrl() + "\n\n").setVisible(true); } else if (anzeigen) { JOptionPane.showMessageDialog(null, "Sie benutzen die neueste Version von MediathekView.", UPDATE_SEARCH_TITLE, JOptionPane.INFORMATION_MESSAGE); } } }); } return neueVersion; } private void showProgramInformation(boolean showAll) { if (listInfos.isEmpty()) { //no info available if (showAll) { JOptionPane.showMessageDialog(null, "Es liegen keine Programminfos vor.", UPDATE_SEARCH_TITLE, JOptionPane.INFORMATION_MESSAGE); } } else { //display available info... try { StringBuilder text = new StringBuilder(); int angezeigt = 0; if (MVConfig.get(MVConfig.Configs.SYSTEM_HINWEIS_NR_ANGEZEIGT).isEmpty()) { MVConfig.add(MVConfig.Configs.SYSTEM_HINWEIS_NR_ANGEZEIGT, Integer.toString(-1)); } else { angezeigt = Integer.parseInt(MVConfig.get(MVConfig.Configs.SYSTEM_HINWEIS_NR_ANGEZEIGT)); } int index = 0; for (String[] h : listInfos) { index = Integer.parseInt(h[0]); if (showAll || angezeigt < index) { text.append("=======================================\n"); text.append(h[1]); text.append('\n'); text.append('\n'); } } if (text.length() > 0) { new DialogHinweisUpdate(null, true, "Infos", text.toString()).setVisible(true); MVConfig.add(MVConfig.Configs.SYSTEM_HINWEIS_NR_ANGEZEIGT, Integer.toString(index)); } } catch (Exception ex) { Log.errorLog(693298731, ex); } } } /** * Check if a newer version exists. * * @param info the remote version number. * @return true if there is a newer version */ private boolean checkForNewerVersion(int info) { boolean result = false; try { final int currentVersion = Integer.parseInt(Const.VERSION); if (info > currentVersion) { result = true; } } catch (NumberFormatException ex) { Log.errorLog(683021193, ex); } return result; } private InputStream connectToServer() throws IOException { URLConnection conn = new URL(Konstanten.ADRESSE_PROGRAMM_VERSION).openConnection(); conn.setRequestProperty("User-Agent", Daten.getUserAgent()); conn.setReadTimeout(TIMEOUT); conn.setConnectTimeout(TIMEOUT); return conn.getInputStream(); } /** * Load and parse the update information. * * @return parsed update info for further use when successful */ private Optional<ServerProgramInformation> retrieveProgramInformation() { int event; XMLStreamReader parser = null; ServerProgramInformation progInfo; XMLInputFactory inFactory = XMLInputFactory.newInstance(); inFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE); try (InputStreamReader inReader = new InputStreamReader(connectToServer(), Const.KODIERUNG_UTF)) { parser = inFactory.createXMLStreamReader(inReader); progInfo = new ServerProgramInformation(); while (parser.hasNext()) { event = parser.next(); if (event == XMLStreamConstants.START_ELEMENT) { switch (parser.getLocalName()) { case ServerProgramInformation.ParserTags.VERSION: progInfo.setVersion(parser.getElementText()); break; case ServerProgramInformation.ParserTags.RELEASE_NOTES: progInfo.setReleaseNotes(parser.getElementText()); break; case ServerProgramInformation.ParserTags.UPDATE_URL: progInfo.setUpdateUrl(parser.getElementText()); break; case ServerProgramInformation.ParserTags.INFO: int count = parser.getAttributeCount(); String nummer = ""; for (int i = 0; i < count; ++i) { if (parser.getAttributeName(i).toString().equals(ServerProgramInformation.ParserTags.INFO_NO)) { nummer = parser.getAttributeValue(i); } } String info = parser.getElementText(); if (!nummer.isEmpty() && !info.isEmpty()) { listInfos.add(new String[]{nummer, info}); } break; default: break; } } } return Optional.of(progInfo); } catch (Exception ex) { return Optional.empty(); } finally { try { if (parser != null) parser.close(); } catch (Exception ignored) { } } } }