tui: fix meta/story use
[fanfix.git] / src / be / nikiroo / fanfix / reader / BasicReader.java
index cf83788e7bfc2c239198bdfff4761a677cd85f02..778b6338b108f847bea745fbe8fe04c77a0454ec 100644 (file)
@@ -1,6 +1,5 @@
 package be.nikiroo.fanfix.reader;
 
-import java.awt.Desktop;
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -48,6 +47,7 @@ public abstract class BasicReader implements Reader {
                }
        }
 
+       @Override
        public synchronized Story getStory(Progress pg) {
                if (story == null) {
                        story = getLibrary().getStory(meta.getLuid(), pg);
@@ -56,6 +56,7 @@ public abstract class BasicReader implements Reader {
                return story;
        }
 
+       @Override
        public BasicLibrary getLibrary() {
                if (lib == null) {
                        lib = defaultLibrary;
@@ -64,18 +65,22 @@ public abstract class BasicReader implements Reader {
                return lib;
        }
 
+       @Override
        public void setLibrary(BasicLibrary lib) {
                this.lib = lib;
        }
 
-       public MetaData getMeta() {
+       @Override
+       public synchronized MetaData getMeta() {
                return meta;
        }
 
+       @Override
        public synchronized void setMeta(MetaData meta) throws IOException {
                setMeta(meta == null ? null : meta.getLuid()); // must check the library
        }
 
+       @Override
        public synchronized void setMeta(String luid) throws IOException {
                story = null;
                meta = getLibrary().getInfo(luid);
@@ -85,27 +90,30 @@ public abstract class BasicReader implements Reader {
                }
        }
 
-       public synchronized void setMeta(URL source, Progress pg)
+       @Override
+       public synchronized void setMeta(URL url, Progress pg)
                        throws IOException {
-               BasicSupport support = BasicSupport.getSupport(source);
+               BasicSupport support = BasicSupport.getSupport(url);
                if (support == null) {
-                       throw new IOException("URL not supported: " + source.toString());
+                       throw new IOException("URL not supported: " + url.toString());
                }
 
-               story = support.process(source, pg);
+               story = support.process(pg);
                if (story == null) {
                        throw new IOException(
                                        "Cannot retrieve story from external source: "
-                                                       + source.toString());
+                                                       + url.toString());
                }
 
                meta = story.getMeta();
        }
 
+       @Override
        public int getChapter() {
                return chapter;
        }
 
+       @Override
        public void setChapter(int chapter) {
                this.chapter = chapter;
        }
@@ -124,8 +132,9 @@ public abstract class BasicReader implements Reader {
                                                .getTypeName());
                        }
                } catch (Exception e) {
-                       Instance.syserr(new Exception("Cannot create a reader of type: "
-                                       + defaultType + " (Not compiled in?)", e));
+                       Instance.getTraceHandler().error(
+                                       new Exception("Cannot create a reader of type: "
+                                                       + defaultType + " (Not compiled in?)", e));
                }
 
                return null;
@@ -203,10 +212,10 @@ public abstract class BasicReader implements Reader {
         * @throws IOException
         *             in case of I/O error
         */
-       public static void openExternal(BasicLibrary lib, String luid)
-                       throws IOException {
+       @Override
+       public void openExternal(BasicLibrary lib, String luid) throws IOException {
                MetaData meta = lib.getInfo(luid);
-               File target = lib.getFile(luid);
+               File target = lib.getFile(luid, null);
 
                openExternal(meta, target);
        }
@@ -223,8 +232,7 @@ public abstract class BasicReader implements Reader {
         * @throws IOException
         *             in case of I/O error
         */
-       protected static void openExternal(MetaData meta, File target)
-                       throws IOException {
+       protected void openExternal(MetaData meta, File target) throws IOException {
                String program = null;
                if (meta.isImageDocument()) {
                        program = Instance.getUiConfig().getString(
@@ -238,15 +246,41 @@ public abstract class BasicReader implements Reader {
                        program = null;
                }
 
-               if (program == null) {
-                       try {
-                               Desktop.getDesktop().browse(target.toURI());
-                       } catch (UnsupportedOperationException e) {
-                               Runtime.getRuntime().exec(
-                                               new String[] { "xdg-open", target.getAbsolutePath() });
+               start(target, program);
+       }
 
+       /**
+        * Start a file and open it with the given program if given or the first
+        * default system starter we can find.
+        * 
+        * @param target
+        *            the target to open
+        * @param program
+        *            the program to use or NULL for the default system starter
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       protected void start(File target, String program) throws IOException {
+               if (program == null) {
+                       boolean ok = false;
+                       for (String starter : new String[] { "xdg-open", "open", "see",
+                                       "start", "run" }) {
+                               try {
+                                       Instance.getTraceHandler().trace(
+                                                       "starting external program");
+                                       Runtime.getRuntime().exec(
+                                                       new String[] { starter, target.getAbsolutePath() });
+                                       ok = true;
+                                       break;
+                               } catch (IOException e) {
+                               }
+                       }
+                       if (!ok) {
+                               throw new IOException("Cannot find a program to start the file");
                        }
                } else {
+                       Instance.getTraceHandler().trace("starting external program");
                        Runtime.getRuntime().exec(
                                        new String[] { program, target.getAbsolutePath() });
                }