package be.nikiroo.fanfix.reader;
-import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
private static ReaderType defaultType = ReaderType.GUI;
private BasicLibrary lib;
+ private MetaData meta;
private Story story;
+ private int chapter;
/**
* Take the default reader type configuration from the config file.
}
}
- public Story getStory() {
+ @Override
+ public synchronized Story getStory(Progress pg) {
+ if (story == null) {
+ story = getLibrary().getStory(meta.getLuid(), pg);
+ }
+
return story;
}
+ @Override
public BasicLibrary getLibrary() {
if (lib == null) {
lib = defaultLibrary;
return lib;
}
- public void setLibrary(LocalLibrary lib) {
+ @Override
+ public void setLibrary(BasicLibrary lib) {
this.lib = lib;
}
- public void setStory(String luid, Progress pg) throws IOException {
- story = lib.getStory(luid, pg);
- if (story == null) {
+ @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);
+
+ if (meta == null) {
throw new IOException("Cannot retrieve story from library: " + luid);
}
}
- public void setStory(URL source, Progress pg) throws IOException {
+ @Override
+ public synchronized void setMeta(URL source, Progress pg)
+ throws IOException {
BasicSupport support = BasicSupport.getSupport(source);
if (support == null) {
throw new IOException("URL not supported: " + source.toString());
}
- story = support.process(source, pg);
+ story = support.process(pg);
if (story == null) {
throw new IOException(
"Cannot retrieve story from external source: "
+ source.toString());
-
}
+
+ meta = story.getMeta();
+ }
+
+ @Override
+ public int getChapter() {
+ return chapter;
+ }
+
+ @Override
+ public void setChapter(int chapter) {
+ this.chapter = chapter;
}
/**
.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;
}
/**
- * The default {@link ReaderType} used when calling
+ * The default {@link Reader.ReaderType} used when calling
* {@link BasicReader#getReader()}.
*
* @return the default type
}
/**
- * The default {@link ReaderType} used when calling
+ * The default {@link Reader.ReaderType} used when calling
* {@link BasicReader#getReader()}.
*
* @param defaultType
* @throws IOException
* in case of I/O error
*/
- public static void open(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);
- open(meta, target);
+ openExternal(meta, target);
}
/**
* @throws IOException
* in case of I/O error
*/
- protected static void open(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(
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 {
+ 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 {
Runtime.getRuntime().exec(