Remote: try to send the stories image-per-image
[fanfix.git] / src / be / nikiroo / fanfix / library / RemoteLibrary.java
index 29d2bcda594f353afc882436438d071686db2dc0..7869b694b23a562e3d6201bf603541089fcafd36 100644 (file)
@@ -11,7 +11,7 @@ import be.nikiroo.fanfix.data.MetaData;
 import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.utils.Progress;
 import be.nikiroo.utils.Version;
-import be.nikiroo.utils.serial.ConnectActionClient;
+import be.nikiroo.utils.serial.server.ConnectActionClientObject;
 
 /**
  * This {@link BasicLibrary} will access a remote server to list the available
@@ -23,16 +23,21 @@ import be.nikiroo.utils.serial.ConnectActionClient;
 public class RemoteLibrary extends BasicLibrary {
        private String host;
        private int port;
+       private final String key;
 
        /**
         * Create a {@link RemoteLibrary} linked to the given server.
         * 
+        * @param key
+        *            the key that will allow us to exchange information with the
+        *            server
         * @param host
         *            the host to contact or NULL for localhost
         * @param port
         *            the port to contact it on
         */
-       public RemoteLibrary(String host, int port) {
+       public RemoteLibrary(String key, String host, int port) {
+               this.key = key;
                this.host = host;
                this.port = port;
        }
@@ -46,8 +51,8 @@ public class RemoteLibrary extends BasicLibrary {
        protected List<MetaData> getMetas(Progress pg) {
                // TODO: progress
                final List<MetaData> metas = new ArrayList<MetaData>();
-               MetaData[] fromNetwork = this.<MetaData[]> getRemoteObject( //
-                               new Object[] { "GET_METADATA", "*" });
+               MetaData[] fromNetwork = this.getRemoteObject( //
+                               new Object[] { key, "GET_METADATA", "*" });
 
                if (fromNetwork != null) {
                        for (MetaData meta : fromNetwork) {
@@ -60,19 +65,20 @@ public class RemoteLibrary extends BasicLibrary {
 
        @Override
        public BufferedImage getCover(final String luid) {
-               return this.<BufferedImage> getRemoteObject( //
-                               new Object[] { "GET_COVER", luid });
+               return this.getRemoteObject( //
+                               new Object[] { key, "GET_COVER", luid });
        }
 
        @Override
        public BufferedImage getSourceCover(final String source) {
-               return this.<BufferedImage> getRemoteObject( //
-                               new Object[] { "GET_SOURCE_COVER", source });
+               return this.getRemoteObject( //
+                               new Object[] { key, "GET_SOURCE_COVER", source });
        }
 
        @Override
        public synchronized Story getStory(final String luid, Progress pg) {
-               return this.<Story> getRemoteObject(new Object[] { "GET_STORY", luid });
+               return this.getRemoteStory( //
+                               new Object[] { key, "GET_STORY", luid });
        }
 
        @Override
@@ -82,7 +88,7 @@ public class RemoteLibrary extends BasicLibrary {
        @Override
        public synchronized Story save(Story story, String luid, Progress pg)
                        throws IOException {
-               getRemoteObject(new Object[] { "SAVE_STORY", story, luid });
+               getRemoteObject(new Object[] { key, "SAVE_STORY", story, luid });
 
                // because the meta changed:
                clearCache();
@@ -93,13 +99,13 @@ public class RemoteLibrary extends BasicLibrary {
 
        @Override
        public synchronized void delete(String luid) throws IOException {
-               getRemoteObject(new Object[] { "DELETE_STORY", luid });
+               getRemoteObject(new Object[] { key, "DELETE_STORY", luid });
        }
 
        @Override
        public void setSourceCover(String source, String luid) {
                this.<BufferedImage> getRemoteObject( //
-               new Object[] { "SET_SOURCE_COVER", source, luid });
+               new Object[] { key, "SET_SOURCE_COVER", source, luid });
        }
 
        @Override
@@ -131,33 +137,77 @@ public class RemoteLibrary extends BasicLibrary {
         * @param <T>
         *            the expected type of object
         * @param command
-        *            the command to send
+        *            the command to send (can contain at most ONE {@link Story})
         * 
         * @return the object or NULL
         */
-       @SuppressWarnings("unchecked")
        private <T> T getRemoteObject(final Object[] command) {
+               return getRemoteObjectOrStory(command, false);
+       }
+
+       /**
+        * Return an object from the server.
+        * 
+        * @param command
+        *            the command to send (can contain at most ONE {@link Story})
+        * 
+        * @return the object or NULL
+        */
+       private Story getRemoteStory(final Object[] command) {
+               return getRemoteObjectOrStory(command, true);
+       }
+
+       /**
+        * Return an object from the server.
+        * 
+        * @param <T>
+        *            the expected type of object
+        * @param command
+        *            the command to send (can contain at most ONE {@link Story})
+        * 
+        * @return the object or NULL
+        */
+       @SuppressWarnings("unchecked")
+       private <T> T getRemoteObjectOrStory(final Object[] command,
+                       final boolean getStory) {
                final Object[] result = new Object[1];
                try {
-                       new ConnectActionClient(host, port, true) {
+                       new ConnectActionClientObject(host, port, true) {
                                @Override
                                public void action(Version serverVersion) throws Exception {
                                        try {
+                                               Story story = null;
+                                               for (int i = 0; i < command.length; i++) {
+                                                       if (command[i] instanceof Story) {
+                                                               story = (Story) command[i];
+                                                               command[i] = null;
+                                                       }
+                                               }
+
                                                Object rep = send(command);
+
+                                               if (story != null) {
+                                                       RemoteLibraryServer.sendStory(story, this);
+                                               }
+
+                                               if (getStory) {
+                                                       rep = RemoteLibraryServer.recStory(this);
+                                               }
+
                                                result[0] = rep;
                                        } catch (Exception e) {
-                                               Instance.syserr(e);
+                                               Instance.getTraceHandler().error(e);
                                        }
                                }
                        }.connect();
                } catch (IOException e) {
-                       Instance.syserr(e);
+                       Instance.getTraceHandler().error(e);
                }
 
                try {
                        return (T) result[0];
                } catch (Exception e) {
-                       Instance.syserr(e);
+                       Instance.getTraceHandler().error(e);
                        return null;
                }
        }