/*
* 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;
import com.jidesoft.utils.SystemInfo;
import com.jidesoft.utils.ThreadCheckingRepaintManager;
import javafx.application.Platform;
import mSearch.Config;
import mSearch.tool.Log;
import mSearch.tool.SingleInstance;
import mSearch.tool.SysMsg;
import mediathek.config.Daten;
import mediathek.config.Konstanten;
import mediathek.config.Messages;
import mediathek.mac.MediathekGuiMac;
import javax.swing.*;
import java.awt.*;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static mediathek.tool.MVFunctionSys.startMeldungen;
public class Main {
private final class ProgramArguments {
private static final String STARTUPMODE_AUTO = "-auto";
private static final String STARTUPMODE_FASTAUTO = "-fastauto";
private static final String STARTUPMODE_DEBUG = "-d";
private static final String STARTUPMODE_MAXIMIZED = "-m";
private static final String STARTUPMODE_VERBOSE = "-v";
}
private static final String JAVAFX_CLASSNAME_APPLICATION_PLATFORM = "javafx.application.Platform";
private static final String LOG_TEXT_SYSTEMMELDUNG = "Systemmeldung";
private static final String LOG_TEXT_FEHLERMELDUNG = "Fehlermeldung";
private static final String HTTP_PROXY_USER = "http.proxyUser";
private static final String HTTP_PROXY_PW = "http.proxyPassword";
private static final String LOG_TEXT_PROXY_AUTHENTICATION_SUCESSFUL = "Proxy Authentication: (%s)";
private static final String LOG_TEXT_PROXY_AUTHENTICATION_NOT_CONFIGURED = "Proxy Authentication: not configured";
private static final String LOG_TEXT_PROXY_PASSWORD_NOT_SET = "Proxy Authentication: Password is not set";
private static final String LOG_TEXT_PROXY_AUTHENTICATION_CANNOT_ACCESS_PROXY_USER_PROXY_PW = "Proxy Authentication: cannot access proxyUser / proxyPassword";
private static final String MAC_SYSTEM_PROPERTY_APPLE_LAF_USE_SCREEN_MENU_BAR = "apple.laf.useScreenMenuBar";
private static final String LOG_TEXT_MEDIATHEK_VIEW_IS_ALREADY_RUNNING = "MediathekView is already running!";
private static final String X11_AWT_APP_CLASS_NAME = "awtAppClassName";
public static final String TEXT_LINE = "===========================================";
private enum StartupMode {
GUI, AUTO, FASTAUTO
}
/**
* Ensures that old film lists in .mediathek directory get deleted because they were moved to
* ~/Library/Caches/MediathekView
*/
private static void cleanupOsxFiles() {
try {
Path oldFilmList = Paths.get(Daten.getSettingsDirectory_String(), Konstanten.JSON_DATEI_FILME);
Files.deleteIfExists(oldFilmList);
} catch (Exception ignored) {
}
}
/**
* Tests if javafx is in the classpath by loading a well known class.
*/
private static boolean hasJavaFx() {
try {
Class.forName(JAVAFX_CLASSNAME_APPLICATION_PLATFORM);
return true;
} catch (ClassNotFoundException e) {
System.out.println(TEXT_LINE);
System.out.printf(Messages.ERROR_NO_JAVAFX_INSTALLED.getText());
System.out.println(TEXT_LINE);
return false;
}
}
/*
* Aufruf:
* java -jar Mediathek [Pfad zur Konfigdatei, sonst homeverzeichnis] [Schalter]
*
* Programmschalter:
*
* -M Fenster maximiert starten
* -A Automodus
* -noGui ohne GUI starten und die Filmliste laden
*
* */
/**
* @param args the command line arguments
*/
public static void main(final String args[]) {
new Main().start(args);
}
private void start(String... args) {
if (hasJavaFx()) {
StartupMode startupMode = StartupMode.GUI;
proxyAuthentication();
if (args != null) {
startupMode = processArgs(startupMode, args);
}
startUI(startupMode, args);
}
}
private void startUI(StartupMode aStartupMode, final String... aArguments) {
aStartupMode = switchToCLIModeIfNecessary(aStartupMode);
switch (aStartupMode) {
case AUTO:
startAutoMode(aArguments);
break;
case FASTAUTO:
startFastAutoMode(aArguments);
break;
case GUI:
startGuiMode(aArguments);
break;
default:
startUI(StartupMode.GUI);
}
}
private void startGuiMode(final String[] args) {
EventQueue.invokeLater(() ->
{
//JavaFX stuff
Platform.setImplicitExit(false);
if (SystemInfo.isMacOSX()) {
System.setProperty(MAC_SYSTEM_PROPERTY_APPLE_LAF_USE_SCREEN_MENU_BAR, Boolean.TRUE.toString());
cleanupOsxFiles();
}
if (Daten.isDebug()) {
// use for debugging EDT violations
RepaintManager.setCurrentManager(new ThreadCheckingRepaintManager());
if (SystemInfo.isMacOSX()) {
//prevent startup of multiple instances...useful during debugging :(
SingleInstance singleInstanceWatcher = new SingleInstance();
if (singleInstanceWatcher.isAppAlreadyActive()) {
JOptionPane.showMessageDialog(null, LOG_TEXT_MEDIATHEK_VIEW_IS_ALREADY_RUNNING);
}
}
}
if (SystemInfo.isMacOSX()) {
new MediathekGuiMac(args).setVisible(true);
} else {
if (SystemInfo.isUnix()) {
setupX11WindowManagerClassName();
}
new MediathekGui(args).setVisible(true);
}
});
}
/**
* Setup the X11 window manager WM_CLASS hint.
* Enables e.g. GNOME to determine application name and to enable app specific functionality.
*/
private void setupX11WindowManagerClassName() {
try {
Toolkit xToolkit = Toolkit.getDefaultToolkit();
java.lang.reflect.Field awtAppClassNameField = xToolkit.getClass().getDeclaredField(X11_AWT_APP_CLASS_NAME);
awtAppClassNameField.setAccessible(true);
awtAppClassNameField.set(xToolkit, Konstanten.PROGRAMMNAME);
} catch (Exception ignored) {
System.err.println("Couldn't set awtAppClassName");
}
}
private void startFastAutoMode(final String[] args) {
final MediathekAuto mvAuto = new MediathekAuto(args);
mvAuto.setFastAuto(true);
mvAuto.starten();
}
private void startAutoMode(final String[] args) {
new MediathekAuto(args).starten();
}
private StartupMode switchToCLIModeIfNecessary(final StartupMode aState) {
/*
If user tries to start MV from command-line without proper options,
instead of crashing while trying to open Swing windows, just change to CLI mode and warn the user.
*/
if (GraphicsEnvironment.isHeadless() && (aState == StartupMode.GUI)) {
System.err.println("MediathekView wurde nicht als Kommandozeilenprogramm gestartet.");
System.err.println("Startmodus wurde auf -auto geƤndert.");
System.err.println();
return StartupMode.AUTO;
}
return aState;
}
private StartupMode processArgs(final StartupMode aStartupMode, final String... aArguments) {
StartupMode newStartupMode = null;
for (String argument : aArguments) {
argument = argument.toLowerCase();
switch (argument) {
case ProgramArguments.STARTUPMODE_AUTO:
newStartupMode = StartupMode.AUTO;
break;
case ProgramArguments.STARTUPMODE_FASTAUTO:
newStartupMode = StartupMode.FASTAUTO;
break;
case ProgramArguments.STARTUPMODE_VERBOSE:
EventQueue.invokeLater(() ->
{
startMeldungen();
SysMsg.sysMsg(LOG_TEXT_SYSTEMMELDUNG);
Log.errorLog(100000000, LOG_TEXT_FEHLERMELDUNG);
Log.endMsg();
System.exit(0);
});
break;
case ProgramArguments.STARTUPMODE_DEBUG:
Daten.setDebug(true);
Config.debug = true;
break;
case ProgramArguments.STARTUPMODE_MAXIMIZED:
Daten.setStartMaximized(true);
break;
}
}
return newStartupMode == null ? aStartupMode : newStartupMode;
}
private void proxyAuthentication() {
try {
final String prxUser = System.getProperty(HTTP_PROXY_USER, null);
final String prxPassword = System.getProperty(HTTP_PROXY_PW, null);
if (prxUser != null && prxPassword != null) {
final PasswordAuthentication authenticator = new PasswordAuthentication(prxUser, prxPassword.toCharArray());
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return authenticator;
}
});
SysMsg.sysMsg(String.format(LOG_TEXT_PROXY_AUTHENTICATION_SUCESSFUL, prxUser));
} else if (prxUser != null && prxPassword == null) {
SysMsg.sysMsg(LOG_TEXT_PROXY_PASSWORD_NOT_SET);
} else {
SysMsg.sysMsg(LOG_TEXT_PROXY_AUTHENTICATION_NOT_CONFIGURED);
}
} catch (SecurityException se) {
SysMsg.sysMsg(LOG_TEXT_PROXY_AUTHENTICATION_CANNOT_ACCESS_PROXY_USER_PROXY_PW + se.toString());
}
}
}