/* * @(#)Start.java - main start class * * Copyright (c) 2005-2009 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, * as a non-commercial test project. * * * 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 2 of the License, or * (at your option) 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * X is completely designed as a test, therefore it mostly implements its * own code instead of a derivation of an ISO reference source or * any other code. Considerable effort has been expended to ensure * an useful implementation, even in cases where the standards * are ambiguous or misleading. * Do not expect any useful output, even if that may be possible. * * For a program compliant to the international standards ISO 11172 * and ISO 13818 it is inevitable to use methods covered by patents * in various countries. The authors of this program disclaim any * liability for patent infringement caused by using, modifying or * redistributing this program. * */ package net.sourceforge.dvb.projectx.common; import java.io.StringWriter; import java.io.PrintWriter; import java.io.File; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.StringTokenizer; import net.sourceforge.dvb.projectx.xinput.XInputFile; /** * the holy start */ public class Start extends Object { private static ArrayList cli_switches = new ArrayList(); public Start() {} /** * main */ public static void main(String[] args) { boolean iniSet = false; boolean showGUI = args.length == 0; boolean help = false; boolean switch_error = false; int index = -1; String inifile = null; String str = null; String[] version; Object[] environment; /** * */ for (int i = 0; i < args.length; i++) cli_switches.add(args[i]); try { /** * don't change the order!! */ /** * remove the stdout re-direction of sys infos */ if ((index = getSwitch(">")) >= 0) { if (index < cli_switches.size()) cli_switches.remove(index); } /** * get version switch */ // if (getBooleanSwitch("-version")) System.out.println("Version: " + Common.getVersionName() + "/" + Common.getVersionDate()); System.out.println("Reading GUI-Switch..."); /** * get gui switch */ if (getBooleanSwitch("-gui")) showGUI = true; System.out.println("Reading Help Switch..."); /** * get help switch */ if (getBooleanSwitch("-?")) help = true; System.out.println("Reading Config File Switch..."); /** * get 'config file' switch */ if ((index = getSwitch("-ini")) >= 0) { switch_error = false; if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); if (new File(str).exists()) { inifile = str; iniSet = true; } else switch_error = true; cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("stopped, config file '" + inifile + "' not found ..."); System.exit(1); } } System.out.println(showGUI ? "Start with GUI..." : "Start without GUI..."); /** * use 'config file' */ if (!iniSet) { System.out.println("Loading last Config or Standard File..."); Common.setSettings(); } else { System.out.println("Loading Config File: '" + inifile + "' ..."); Common.setSettings(inifile); } /** * initialize language */ Resource.loadLang(Common.getSettings().getProperty(Keys.KEY_Language)); Common.getSettings().setProperty(Keys.KEY_Language[0], Resource.getChosenLanguage()); System.out.println("Loading Language -> '" + Resource.getChosenLanguage() + "'"); /** * dont save settings on exit on CLI, see cli-switches */ if (args.length != 0) Common.getSettings().setProperty(Keys.KEY_SaveSettingsOnExit[0], "0"); /** * version */ version = Common.getVersion(); System.out.println(); System.out.println(version[0] + "/" + version[1] + " " + version[2] + " " + version[3]); System.out.println(); /** * terms */ System.out.println(Resource.getString("terms")); /** * environment */ environment = Common.getJavaEV(Common.getSettings().getInifile()); for (int i = 0; i < environment.length; i++) System.out.println(environment[i].toString()); System.out.println(); /** * usage */ System.out.println(Resource.getString("usage")); System.out.println(); /** * stop on help switch */ if (help) Common.exitApplication(0); System.out.println("Loading Basic Classes..."); /** * load main stuff */ Common.init(); // access after the keys has been loaded!, separate to userinterface later System.out.println("Reading CLI Switches..."); /** * read cli switches */ if (readSwitches(cli_switches)) System.out.println("Error while reading CLI Switches ..."); System.out.println("Preparing GUI (if enabled)..."); /** * initialize the gui interface */ Common.prepareGui(showGUI); // access after the keys has been loaded!, separate to userinterface later System.out.println("Check Commons-Net library access..."); /** * planned to disable ftp only, if commons-net is missing */ if ((str = Common.checkLibraryAccess()) != null) { throw new Exception(str); //System.out.println(ret); } System.out.println("Loading AC3 frames..."); /** * load silent ac3 frames */ Common.loadAC3(); //Common.clearMessageLog(); if (Common.getSettings().getBooleanProperty(Keys.KEY_autostartWebServer)) Common.startWebServer(); /** * starts CL processing */ if (!showGUI) { if (!Common.getSettings().getBooleanProperty(Keys.KEY_autostartWebServer)) { if (Common.isCollectionListEmpty()) { System.out.println("Error: No Collection to Process ..."); Common.exitApplication(2); } System.out.println("Starting Collection Process..."); Common.setRunningCLI(true); Common.setRunningProcess(true); Common.startMainProcess(); } else System.out.println("Starting WebIF..."); } else { if (!Common.getGuiInterface().isAvailable()) System.out.println("Stopped! Can't start GUI, Classes not available..."); else if (!Common.isCollectionListEmpty()) { Common.getGuiInterface().addCollectionAtEnd(); Common.getGuiInterface().showActiveCollection(0); } } } /** * catch all other unhandled exception */ catch(Exception e) { /** * in GUI mode clean GUI and show GUI message */ if (showGUI) { /** * show exception messge */ StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); /** * message to the commandline */ String message = Resource.getString("StartUp.Error") + Common.getLineSeparator() + Common.getLineSeparator() + sw.toString(); System.err.println(message); Common.getGuiInterface().showErrorMessageDialog(message, Resource.getString("StartUp.Error.Title")); } /** * in CLI mode simply show stackTrace */ else { System.out.println("Stopped! An Error has occured..."); e.printStackTrace(); } System.exit(1); } } /** * create single collection */ private static JobCollection createCollection(JobCollection collection) { if (collection == null) { collection = Common.addCollection(false); Common.setActiveCollection(0); } return collection; } /** * get switch */ private static boolean getBooleanSwitch(String str) { return (getSwitch(str) >= 0); } /** * get switch */ private static int getSwitch(String str) { int index; if ((index = cli_switches.indexOf(str)) >= 0) cli_switches.remove(index); return index; } /** * read cli */ private static boolean readSwitches(ArrayList cli_switches) { JobCollection collection = null; boolean error = false; boolean switch_error = false; String str = null; int index = -1; try { /** * get switches */ if (getBooleanSwitch("-dvx1")) Common.getSettings().setProperty(Keys.KEY_ExternPanel_splitProjectFile[0], "1"); if (getBooleanSwitch("-dvx2")) { Common.getSettings().setProperty(Keys.KEY_ExternPanel_splitProjectFile[0], "1"); Common.getSettings().setProperty(Keys.KEY_AudioPanel_addRiffToAc3[0], "1"); } if (getBooleanSwitch("-dvx3")) { Common.getSettings().setProperty(Keys.KEY_ExternPanel_splitProjectFile[0], "1"); Common.getSettings().setProperty(Keys.KEY_AudioPanel_addRiffToMpgAudio[0], "1"); } if (getBooleanSwitch("-dvx4")) { Common.getSettings().setProperty(Keys.KEY_ExternPanel_splitProjectFile[0], "1"); Common.getSettings().setProperty(Keys.KEY_AudioPanel_addRiffToAc3[0], "1"); Common.getSettings().setProperty(Keys.KEY_AudioPanel_addRiffToMpgAudio[0], "1"); } /** * save normal log */ if (getBooleanSwitch("-log")) Common.getSettings().setProperty(Keys.KEY_NormalLog[0], "1"); /** * save on exit */ if (getBooleanSwitch("-saveini")) Common.getSettings().setProperty(Keys.KEY_SaveSettingsOnExit[0], "1"); /** * web if */ if (getBooleanSwitch("-webif")) Common.getSettings().setProperty(Keys.KEY_autostartWebServer[0], "1"); /** * action type */ if (getBooleanSwitch("-demux")) Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "0"); if (getBooleanSwitch("-tovdr")) Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "1"); if (getBooleanSwitch("-tom2p")) Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "2"); if (getBooleanSwitch("-topva")) Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "3"); if (getBooleanSwitch("-tots")) Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "4"); if (getBooleanSwitch("-filter")) Common.getSettings().setProperty(Keys.KEY_ConversionMode[0], "5"); /** * any ini key from CLI, must be a loop */ while ((index = getSwitch("-set")) >= 0) { switch_error = false; if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); Common.getSettings().setProperty(str.substring(0, str.indexOf("=")), str.substring(str.indexOf("=") + 1)); cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set property ..."); error = true; } } /** * split output */ if ((index = getSwitch("-split")) >= 0) { switch_error = false; if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); try { int val = Integer.parseInt(str); Common.getSettings().setProperty(Keys.KEY_SplitSize[0], "1"); Common.getSettings().setProperty(Keys.KEY_ExportPanel_SplitSize_Value[0], String.valueOf(val)); } catch (Exception e) { switch_error = true; } cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set split size value ..."); error = true; } } /** * new output base directory */ if ((index = getSwitch("-out")) >= 0) { switch_error = false; collection = createCollection(collection); if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); if (new File(str).exists()) collection.setOutputDirectory(str); else switch_error = true; cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set output directory ..."); error = true; } } /** * new output name */ if ((index = getSwitch("-name")) >= 0) { switch_error = false; collection = createCollection(collection); if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); if (str.length() > 0) collection.setOutputName(str); else switch_error = false; cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set output name ..."); error = true; } } /** * load point list */ if ((index = getSwitch("-cut")) >= 0) { switch_error = false; collection = createCollection(collection); if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); if (new File(str).exists()) loadCutPoints(collection, str); else switch_error = false; cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set cutpoints ..."); error = true; } } /** * load point list */ if ((index = getSwitch("-chp")) >= 0) { switch_error = false; collection = createCollection(collection); if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); if (new File(str).exists()) loadChapterPoints(collection, str); else switch_error = false; cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set chapterpoints ..."); error = true; } } /** * load PID list */ if ((index = getSwitch("-id")) >= 0) { switch_error = false; collection = createCollection(collection); if (index < cli_switches.size()) { str = cli_switches.get(index).toString(); if (str.length() > 0) loadIDs(collection, str); else switch_error = false; cli_switches.remove(index); } else switch_error = false; if (switch_error) { System.out.println("can't set pidfilter ..."); error = true; } } /** * jrmann1999, patch to work with batch file list (.bfl, .tpl) */ for (int i = 0; i < cli_switches.size(); i++) { collection = createCollection(collection); try { String _str = cli_switches.get(i).toString(); str = _str.toLowerCase(); XInputFile xif = null; if (str.endsWith("bfl") || str.endsWith("tpl")) { XInputFile _xif = Common.getInputFile(_str); if (_xif != null) { _xif.randomAccessOpen("r"); _xif.randomAccessSeek(0); /** * note: readline does not yet support full unicode here */ while ((str = _xif.randomAccessReadLine()) != null) { xif = Common.getInputFile(str); if (xif != null) collection.addInputFile(xif); } _xif.randomAccessClose(); } } else { xif = Common.getInputFile(_str); if (xif != null) collection.addInputFile(xif); } } catch (Exception e) { System.err.println("File input error"); error = true; } } } catch (Exception ex) { error = true; } catch (Error er) { error = true; } return error; } /** * */ private static void loadIDs(JobCollection collection, String nIDs) { StringTokenizer st = new StringTokenizer(nIDs, ","); String nID = null; int i = 0; collection.clearPIDs(); while (st.hasMoreTokens()) { nID = st.nextToken(); if (!nID.startsWith("0x")) nID = "0x" + Integer.toHexString(Integer.parseInt(nID)); collection.addPID(nID); i++; } Common.setMessage(Resource.getString("msg.loading.pids", String.valueOf(collection.getPIDCount()))); } /** * load cutfile */ private static void loadCutPoints(JobCollection collection, String file) { try { BufferedReader points = new BufferedReader(new FileReader(file)); String point = ""; while (true) { point = points.readLine(); if (point == null) break; if (point.trim().equals("")) continue; if (point.startsWith(Keys.KEY_CutMode[0])) { Common.getSettings().setProperty(Keys.KEY_CutMode[0], point.substring(point.indexOf("=") + 1).trim()); continue; } if (point.startsWith("(")) continue; collection.addCutpoint(point); } points.close(); Common.setMessage("Successful reading of " + String.valueOf(collection.getCutpointCount()) + " cutpoints"); } catch (Exception e5) { Common.setMessage("Error while reading file: '" + file + "'"); Common.setExceptionMessage(e5); } } /** * load chapterfile */ private static void loadChapterPoints(JobCollection collection, String file) { try { BufferedReader points = new BufferedReader(new FileReader(file)); String point = ""; while (true) { point = points.readLine(); if (point == null) break; if (point.trim().equals("")) continue; collection.addChapterpoint(point); } points.close(); Common.setMessage("Successful reading of " + String.valueOf(collection.getChapterpointCount()) + " chapterpoints"); } catch (Exception e5) { Common.setMessage("Error while reading file: '" + file + "'"); Common.setExceptionMessage(e5); } } }