Dependency fix + Local/Remote Library support
[fanfix.git] / src / be / nikiroo / fanfix / Main.java
index db4316e8c499d22fad8417bddde2fe2cb41f9c9e..a05df434fb81fdf8edbc57ce391ec78de940678b 100644 (file)
@@ -15,7 +15,8 @@ import be.nikiroo.fanfix.reader.BasicReader.ReaderType;
 import be.nikiroo.fanfix.supported.BasicSupport;
 import be.nikiroo.fanfix.supported.BasicSupport.SupportType;
 import be.nikiroo.utils.Progress;
-import be.nikiroo.utils.ui.UIUtils;
+import be.nikiroo.utils.Version;
+import be.nikiroo.utils.serial.Server;
 
 /**
  * Main program entry point.
@@ -24,7 +25,7 @@ import be.nikiroo.utils.ui.UIUtils;
  */
 public class Main {
        private enum MainAction {
-               IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START,
+               IMPORT, EXPORT, CONVERT, READ, READ_URL, LIST, HELP, SET_READER, START, VERSION, SERVER, REMOTE,
        }
 
        /**
@@ -35,8 +36,8 @@ public class Main {
         * <li>NOUTF: if set to 1 or 'true', the program will prefer non-unicode
         * {@link String}s when possible</li>
         * <li>CONFIG_DIR: a path where to look for the <tt>.properties</tt> files
-        * before taking the included ones; they will also be saved/updated into
-        * this path when the program starts</li>
+        * before taking the usual ones; they will also be saved/updated into this
+        * path when the program starts</li>
         * <li>DEBUG: if set to 1 or 'true', the program will override the DEBUG_ERR
         * configuration value with 'true'</li>
         * </ul>
@@ -51,8 +52,11 @@ public class Main {
         * <li>--read-url [URL] ([chapter number]): convert on the fly and read the
         * story, without saving it</li>
         * <li>--list ([type]): list the stories present in the library</li>
-        * <li>--set-reader [reader type]: set the reader type to CLI or LOCAL for
-        * this command</li>
+        * <li>--set-reader [reader type]: set the reader type to CLI, TUI or LOCAL
+        * for this command</li>
+        * <li>--version: get the version of the program</li>
+        * <li>--server [port]: start a server on this port</li>
+        * <li>--remote [host] [port]: use a the given remote library</li>
         * </ul>
         * 
         * @param args
@@ -61,11 +65,13 @@ public class Main {
        public static void main(String[] args) {
                String urlString = null;
                String luid = null;
-               String typeString = null;
+               String sourceString = null;
                String chapString = null;
                String target = null;
                MainAction action = MainAction.START;
                Boolean plusInfo = null;
+               String host = null;
+               Integer port = null;
 
                boolean noMoreActions = false;
 
@@ -100,8 +106,8 @@ public class Main {
                        case EXPORT:
                                if (luid == null) {
                                        luid = args[i];
-                               } else if (typeString == null) {
-                                       typeString = args[i];
+                               } else if (sourceString == null) {
+                                       sourceString = args[i];
                                } else if (target == null) {
                                        target = args[i];
                                } else {
@@ -111,8 +117,8 @@ public class Main {
                        case CONVERT:
                                if (urlString == null) {
                                        urlString = args[i];
-                               } else if (typeString == null) {
-                                       typeString = args[i];
+                               } else if (sourceString == null) {
+                                       sourceString = args[i];
                                } else if (target == null) {
                                        target = args[i];
                                } else if (plusInfo == null) {
@@ -126,8 +132,8 @@ public class Main {
                                }
                                break;
                        case LIST:
-                               if (typeString == null) {
-                                       typeString = args[i];
+                               if (sourceString == null) {
+                                       sourceString = args[i];
                                } else {
                                        exitCode = 255;
                                }
@@ -155,10 +161,33 @@ public class Main {
                                break;
                        case SET_READER:
                                exitCode = setReaderType(args[i]);
+                               action = MainAction.START;
                                break;
                        case START:
                                exitCode = 255; // not supposed to be selected by user
                                break;
+                       case VERSION:
+                               exitCode = 255; // no arguments for this option
+                               break;
+                       case SERVER:
+                               if (port == null) {
+                                       port = Integer.parseInt(args[i]);
+                               } else {
+                                       exitCode = 255;
+                               }
+                               break;
+                       case REMOTE:
+                               if (host == null) {
+                                       host = args[i];
+                               } else if (port == null) {
+                                       port = Integer.parseInt(args[i]);
+                                       BasicReader
+                                                       .setDefaultLibrary(new RemoteLibrary(host, port));
+                                       action = MainAction.START;
+                               } else {
+                                       exitCode = 255;
+                               }
+                               break;
                        }
                }
 
@@ -185,20 +214,41 @@ public class Main {
                Progress pg = new Progress();
                mainProgress.addProgress(pg, mainProgress.getMax());
 
+               VersionCheck updates = VersionCheck.check();
+               if (updates.isNewVersionAvailable()) {
+                       // Sent to syserr so not to cause problem if one tries to capture a
+                       // story content in text mode
+                       System.err
+                                       .println("A new version of the program is available at https://github.com/nikiroo/fanfix/releases");
+                       System.err.println("");
+                       for (Version v : updates.getNewer()) {
+                               System.err.println("\tVersion " + v);
+                               System.err.println("\t-------------");
+                               System.err.println("");
+                               for (String item : updates.getChanges().get(v)) {
+                                       System.err.println("\t- " + item);
+                               }
+                               System.err.println("");
+                       }
+               }
+
                if (exitCode != 255) {
                        switch (action) {
                        case IMPORT:
                                exitCode = imprt(urlString, pg);
+                               updates.ok(); // we consider it read
                                break;
                        case EXPORT:
-                               exitCode = export(luid, typeString, target, pg);
+                               exitCode = export(luid, sourceString, target, pg);
+                               updates.ok(); // we consider it read
                                break;
                        case CONVERT:
-                               exitCode = convert(urlString, typeString, target,
+                               exitCode = convert(urlString, sourceString, target,
                                                plusInfo == null ? false : plusInfo, pg);
+                               updates.ok(); // we consider it read
                                break;
                        case LIST:
-                               exitCode = list(typeString);
+                               exitCode = list(sourceString);
                                break;
                        case READ:
                                exitCode = read(luid, chapString, true);
@@ -211,11 +261,34 @@ public class Main {
                                exitCode = 0;
                                break;
                        case SET_READER:
+                               exitCode = 255;
+                               break;
+                       case VERSION:
+                               System.out
+                                               .println(String.format("Fanfix version %s"
+                                                               + "\nhttps://github.com/nikiroo/fanfix/"
+                                                               + "\n\tWritten by Nikiroo",
+                                                               Version.getCurrentVersion()));
+                               updates.ok(); // we consider it read
                                break;
                        case START:
-                               UIUtils.setLookAndFeel();
-                               BasicReader.setDefaultReaderType(ReaderType.LOCAL);
-                               BasicReader.getReader().start(null);
+                               BasicReader.getReader().browse(null);
+                               break;
+                       case SERVER:
+                               if (port == null) {
+                                       exitCode = 255;
+                                       break;
+                               }
+                               try {
+                                       Server server = new RemoteLibraryServer(port);
+                                       server.start();
+                                       System.out.println("Remote server started on: " + port);
+                               } catch (IOException e) {
+                                       Instance.syserr(e);
+                               }
+                               return;
+                       case REMOTE:
+                               exitCode = 255;
                                break;
                        }
                }
@@ -230,7 +303,7 @@ public class Main {
        }
 
        /**
-        * Import the given resource into the {@link Library}.
+        * Import the given resource into the {@link LocalLibrary}.
         * 
         * @param urlString
         *            the resource to import
@@ -254,7 +327,8 @@ public class Main {
        }
 
        /**
-        * Export the {@link Story} from the {@link Library} to the given target.
+        * Export the {@link Story} from the {@link LocalLibrary} to the given
+        * target.
         * 
         * @param luid
         *            the story LUID
@@ -287,17 +361,17 @@ public class Main {
        }
 
        /**
-        * List the stories of the given type from the {@link Library} (unless NULL
-        * is passed, in which case all stories will be listed).
+        * List the stories of the given source from the {@link LocalLibrary}
+        * (unless NULL is passed, in which case all stories will be listed).
         * 
-        * @param typeString
-        *            the type to list the known stories of, or NULL to list all
+        * @param source
+        *            the source to list the known stories of, or NULL to list all
         *            stories
         * 
         * @return the exit return code (0 = success)
         */
-       private static int list(String type) {
-               BasicReader.getReader().start(type);
+       private static int list(String source) {
+               BasicReader.getReader().browse(source);
                return 0;
        }
 
@@ -305,8 +379,8 @@ public class Main {
         * Start the CLI reader for this {@link Story}.
         * 
         * @param story
-        *            the LUID of the {@link Story} in the {@link Library} <b>or</b>
-        *            the {@link Story} {@link URL}
+        *            the LUID of the {@link Story} in the {@link LocalLibrary}
+        *            <b>or</b> the {@link Story} {@link URL}
         * @param chapString
         *            which {@link Chapter} to read (starting at 1), or NULL to get
         *            the {@link Story} description
@@ -456,7 +530,7 @@ public class Main {
 
                        for (OutputType type : OutputType.values()) {
                                builder.append(trans(StringId.ERR_SYNTAX_TYPE, type.toString(),
-                                               type.getDesc()));
+                                               type.getDesc(true)));
                                builder.append('\n');
                        }