X-Git-Url: http://git.nikiroo.be/?p=jvcard.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Fremote%2FSync.java;h=70bf93c3f7e942e74bc0576ab6b50459aa5ed4a3;hp=dbf03242fb3e82083a6ef601ee50b3edb66ad975;hb=7da41ecd30228908bf2afcd07ff7943ab59d4c01;hpb=ebead449cce5df1849d54796fd2515a9e0556fee diff --git a/src/be/nikiroo/jvcard/remote/Sync.java b/src/be/nikiroo/jvcard/remote/Sync.java index dbf0324..70bf93c 100644 --- a/src/be/nikiroo/jvcard/remote/Sync.java +++ b/src/be/nikiroo/jvcard/remote/Sync.java @@ -12,16 +12,19 @@ import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import java.security.InvalidParameterException; +import java.util.LinkedList; import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; import be.nikiroo.jvcard.Card; +import be.nikiroo.jvcard.Contact; +import be.nikiroo.jvcard.Data; import be.nikiroo.jvcard.parsers.Format; -import be.nikiroo.jvcard.parsers.Parser; +import be.nikiroo.jvcard.parsers.Vcard21Parser; import be.nikiroo.jvcard.remote.Command.Verb; import be.nikiroo.jvcard.resources.Bundles; -import be.nikiroo.jvcard.tui.StringUtils; +import be.nikiroo.jvcard.resources.StringUtils; /** * This class will synchronise {@link Card}s between a local instance an a @@ -138,6 +141,7 @@ public class Sync { } // return: synced or not + //TODO jDoc public boolean sync(Card card, boolean force) throws UnknownHostException, IOException { @@ -188,34 +192,40 @@ public class Sync { // Check changes boolean serverChanges = (tsServer - tsOriginal) > GRACE_TIME; boolean localChanges = false; + Card local = null; + Card original = null; if (tsOriginal != -1) { - Card local = new Card(getCache(cacheDir), Format.VCard21); - Card original = new Card(getCache(cacheDirOrig), Format.VCard21); - localChanges = !local.isEquals(original); + local = new Card(getCache(cacheDir), Format.VCard21); + original = new Card(getCache(cacheDirOrig), Format.VCard21); + localChanges = !local.isEquals(original, true); } Verb action = null; // Sync to server if: if (localChanges) { - // TODO: sync instead (with PUT) - action = Verb.POST; + action = Verb.PUT_CARD; } - // Sync from server if + // Sync from/to server if if (serverChanges && localChanges) { - // TODO - throw new IOException("Sync operation not supported yet :("); + action = Verb.PUT_CARD; + } + + // Sync from server if: + if (serverChanges) { + // TODO: only sends changed cstate if serverChanges + action = Verb.GET_CARD; } // PUT the whole file if: if (tsServer == -1) { - action = Verb.POST; + action = Verb.POST_CARD; } // GET the whole file if: - if (tsOriginal == -1 || serverChanges) { - action = Verb.GET; + if (tsOriginal == -1) { + action = Verb.GET_CARD; } System.err.println("remote: " + (tsServer / 1000) % 1000 + " (" @@ -228,19 +238,56 @@ public class Sync { if (action != null) { switch (action) { - case GET: - s.sendCommand(Verb.GET, name); + case GET_CARD: + s.sendCommand(Verb.GET_CARD, name); List data = s.receiveBlock(); setLastModified(data.remove(0)); - Card server = new Card(Parser.parse(data, Format.VCard21)); + Card server = new Card(Vcard21Parser.parseContact(data)); card.replaceListContent(server); + if (card.isDirty()) card.save(); card.saveAs(getCache(cacheDirOrig), Format.VCard21); break; - case POST: - s.sendCommand(Verb.POST, name); - s.sendLine(card.toString(Format.VCard21)); + case POST_CARD: + s.sendCommand(Verb.POST_CARD, name); + s.sendBlock(Vcard21Parser.toStrings(card)); + card.saveAs(getCache(cacheDirOrig), Format.VCard21); + setLastModified(s.receiveLine()); + break; + case PUT_CARD: + List added = new LinkedList(); + List removed = new LinkedList(); + List from = new LinkedList(); + List to = new LinkedList(); + original.compare(local, added, removed, from, to); + s.sendCommand(Verb.PUT_CARD, name); + for (Contact c : removed) { + s.sendCommand(Verb.DELETE_CONTACT, c.getId()); + } + for (Contact c : added) { + s.sendCommand(Verb.POST_CONTACT, c.getId()); + s.sendBlock(Vcard21Parser.toStrings(c, -1)); + } + if (from.size() > 0) { + for (int index = 0; index < from.size(); index++) { + Contact f = from.get(index); + Contact t = to.get(index); + + List subadded = new LinkedList(); + List subremoved = new LinkedList(); + f.compare(t, subadded, subremoved, subremoved, subadded); + s.sendCommand(Verb.PUT_CONTACT, name); + for (Data d : subremoved) { + s.sendCommand(Verb.DELETE_DATA, d.getContentState()); + } + for (Data d : subadded) { + s.sendCommand(Verb.POST_DATA, d.getContentState()); + s.sendBlock(Vcard21Parser.toStrings(d)); + } + } + } + s.sendCommand(Verb.PUT_CARD); break; default: // TODO @@ -294,7 +341,7 @@ public class Sync { return StringUtils.toTime(line); } catch (FileNotFoundException e) { return -1; - } catch (IOException e) { + } catch (Exception e) { return -1; } }