From edf79e5e06e8dc177cc13b9bad5bf848e6f9741d Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 2 Dec 2017 20:25:21 +0100 Subject: [PATCH] Update nikiroo-utils, Remote: - nikiroo-utils fix for serialisation of objects within custom objects - remote change source now works on server (not client + delete + re-upload) - remote import now works on server (not client + delete + re-upload) --- changelog.md | 5 +- ...es.jar => nikiroo-utils-3.1.6-sources.jar} | Bin 274830 -> 277629 bytes src/be/nikiroo/fanfix/Main.java | 2 +- .../nikiroo/fanfix/library/CacheLibrary.java | 21 ++++ .../nikiroo/fanfix/library/RemoteLibrary.java | 99 +++++++++++++++++- .../fanfix/library/RemoteLibraryServer.java | 18 +++- 6 files changed, 137 insertions(+), 8 deletions(-) rename libs/{nikiroo-utils-3.1.5-sources.jar => nikiroo-utils-3.1.6-sources.jar} (87%) diff --git a/changelog.md b/changelog.md index d820412..5b725d1 100644 --- a/changelog.md +++ b/changelog.md @@ -3,7 +3,10 @@ # Version WIP - Bug fixes -- Remote server/client improvements (progress report, can send large files, detect server state) +- Remote server/client improvement: progress report +- Remote server/client improvement: can send large files +- Remote server/client improvement: detect server state +- Remote server/client improvement: import and change source on server - Better support for some CBZ files (if SUMMARY or URL files are present in it) - Fix cover images not deleted on story delete - Fix some images not supported because not jpeg-able (now try again in png) diff --git a/libs/nikiroo-utils-3.1.5-sources.jar b/libs/nikiroo-utils-3.1.6-sources.jar similarity index 87% rename from libs/nikiroo-utils-3.1.5-sources.jar rename to libs/nikiroo-utils-3.1.6-sources.jar index 38d88a67c60d68239a1824f121b6d04679560471..5f2dbae17e1ec5c599c565d6a1e040b0db80cfbc 100644 GIT binary patch delta 28951 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 F{{dKczX<>U diff --git a/src/be/nikiroo/fanfix/Main.java b/src/be/nikiroo/fanfix/Main.java index f18e03c..0da6bba 100644 --- a/src/be/nikiroo/fanfix/Main.java +++ b/src/be/nikiroo/fanfix/Main.java @@ -333,7 +333,7 @@ public class Main { try { ServerObject server = new RemoteLibraryServer(key, port); server.setTraceHandler(Instance.getTraceHandler()); - server.start(); + server.run(); } catch (IOException e) { Instance.getTraceHandler().error(e); } diff --git a/src/be/nikiroo/fanfix/library/CacheLibrary.java b/src/be/nikiroo/fanfix/library/CacheLibrary.java index 28f5682..14113e4 100644 --- a/src/be/nikiroo/fanfix/library/CacheLibrary.java +++ b/src/be/nikiroo/fanfix/library/CacheLibrary.java @@ -3,6 +3,7 @@ package be.nikiroo.fanfix.library; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.List; import be.nikiroo.fanfix.Instance; @@ -101,6 +102,7 @@ public class CacheLibrary extends BasicLibrary { @Override public BufferedImage getCover(final String luid) { + // TODO: cache doesn't seem to work if (isCached(luid)) { return cacheLib.getCover(luid); } @@ -211,6 +213,25 @@ public class CacheLibrary extends BasicLibrary { } } + @Override + public Story imprt(URL url, Progress pg) throws IOException { + if (pg == null) { + pg = new Progress(); + } + + Progress pgImprt = new Progress(); + Progress pgCache = new Progress(); + pg.setMinMax(0, 10); + pg.addProgress(pgImprt, 7); + pg.addProgress(pgCache, 3); + + Story story = lib.imprt(url, pgImprt); + cacheLib.save(story, story.getMeta().getLuid(), pgCache); + + pg.done(); + return story; + } + // All the following methods are only used by Save and Delete in // BasicLibrary: diff --git a/src/be/nikiroo/fanfix/library/RemoteLibrary.java b/src/be/nikiroo/fanfix/library/RemoteLibrary.java index f310413..7b52fe3 100644 --- a/src/be/nikiroo/fanfix/library/RemoteLibrary.java +++ b/src/be/nikiroo/fanfix/library/RemoteLibrary.java @@ -3,6 +3,7 @@ package be.nikiroo.fanfix.library; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.net.URL; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; @@ -220,8 +221,7 @@ public class RemoteLibrary extends BasicLibrary { pg.add(1); } - send(null); // done sending the story - luidSaved[0] = (String) send(null); // get LUID + luidSaved[0] = (String) send(null); pg.done(); } @@ -235,7 +235,10 @@ public class RemoteLibrary extends BasicLibrary { // because the meta changed: clearCache(); refresh(pgRefresh); - story.setMeta(getInfo(luidSaved[0])); + + MetaData meta = getInfo(luidSaved[0]); + meta.setCover(story.getMeta().getCover()); + story.setMeta(meta); pg.done(); @@ -276,6 +279,96 @@ public class RemoteLibrary extends BasicLibrary { } } + @Override + // Could work (more slowly) without it + public Story imprt(final URL url, Progress pg) throws IOException { + if (pg == null) { + pg = new Progress(); + } + + pg.setMinMax(0, 2); + Progress pgImprt = new Progress(); + Progress pgGet = new Progress(); + pg.addProgress(pgImprt, 1); + pg.addProgress(pgGet, 1); + + final Progress pgF = pgImprt; + final String[] luid = new String[1]; + + try { + new ConnectActionClientObject(host, port, true) { + @Override + public void action(Version serverVersion) throws Exception { + Progress pg = pgF; + + Object rep = send(new Object[] { md5, "IMPORT", + url.toString() }); + + while (true) { + if (!RemoteLibraryServer.updateProgress(pg, rep)) { + break; + } + + rep = send(null); + } + + pg.done(); + luid[0] = (String) rep; + } + + @Override + protected void onError(Exception e) { + Instance.getTraceHandler().error(e); + } + }.connect(); + } catch (IOException e) { + Instance.getTraceHandler().error(e); + } + + if (luid[0] == null) { + throw new IOException("Remote failure"); + } + + Story story = getStory(luid[0], pgGet); + pgGet.done(); + + pg.done(); + return story; + } + + @Override + // Could work (more slowly) without it + public synchronized void changeSource(final String luid, + final String newSource, Progress pg) throws IOException { + final Progress pgF = pg == null ? new Progress() : pg; + + try { + new ConnectActionClientObject(host, port, true) { + @Override + public void action(Version serverVersion) throws Exception { + Progress pg = pgF; + + Object rep = send(new Object[] { md5, "CHANGE_SOURCE", + luid, newSource }); + while (true) { + if (!RemoteLibraryServer.updateProgress(pg, rep)) { + break; + } + + rep = send(null); + } + } + + @Override + protected void onError(Exception e) { + Instance.getTraceHandler().error(e); + } + }.connect(); + } catch (IOException e) { + Instance.getTraceHandler().error(e); + } + } + @Override public synchronized File getFile(final String luid, Progress pg) { throw new java.lang.InternalError( diff --git a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java index c93f0f3..adef7ed 100644 --- a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java +++ b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java @@ -1,6 +1,7 @@ package be.nikiroo.fanfix.library; import java.io.IOException; +import java.net.URL; import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.List; @@ -33,11 +34,15 @@ import be.nikiroo.utils.serial.server.ServerObject; * if not) *
  • [md5] SAVE_STORY [luid]: save the story (that must be sent just after the * command) with the given LUID, then return the LUID
  • + *
  • [md5] IMPORT [url]: save the story found at the given URL, then return + * the LUID
  • *
  • [md5] DELETE_STORY [luid]: delete the story of LUID luid
  • *
  • [md5] GET_COVER [luid]: return the cover of the story
  • *
  • [md5] GET_SOURCE_COVER [source]: return the cover for this source
  • *
  • [md5] SET_SOURCE_COVER [source], [luid]: set the default cover for the * given source to the cover of the story denoted by luid
  • + *
  • [md5] CHANGE_SOURCE [luid] [new source]: change the source of the story + * of LUID luid
  • *
  • [md5] EXIT: stop the server
  • * * @@ -74,13 +79,13 @@ public class RemoteLibraryServer extends ServerObject { if (data instanceof Object[]) { Object[] dataArray = (Object[]) data; if (dataArray.length >= 2) { + md5 = "" + dataArray[0]; + command = "" + dataArray[1]; + args = new Object[dataArray.length - 2]; for (int i = 2; i < dataArray.length; i++) { args[i - 2] = dataArray[i]; } - - md5 = "" + dataArray[0]; - command = "" + dataArray[1]; } } @@ -133,6 +138,10 @@ public class RemoteLibraryServer extends ServerObject { Story story = rebuildStory(list); Instance.getLibrary().save(story, (String) args[0], null); return story.getMeta().getLuid(); + } else if ("IMPORT".equals(command)) { + Story story = Instance.getLibrary().imprt( + new URL((String) args[0]), createPgForwarder(action)); + return story.getMeta().getLuid(); } else if ("DELETE_STORY".equals(command)) { Instance.getLibrary().delete((String) args[0]); } else if ("GET_COVER".equals(command)) { @@ -142,6 +151,9 @@ public class RemoteLibraryServer extends ServerObject { } else if ("SET_SOURCE_COVER".equals(command)) { Instance.getLibrary().setSourceCover((String) args[0], (String) args[1]); + } else if ("CHANGE_SOURCE".equals(command)) { + Instance.getLibrary().changeSource((String) args[0], + (String) args[1], createPgForwarder(action)); } else if ("EXIT".equals(command)) { stop(0, false); } -- 2.27.0