From 01413659639b1a03ca3ec88032aa7a796017d74b Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Mon, 28 Jan 2013 20:43:43 +0000
Subject: [PATCH] Created expiry update and expiry ack packets for BMP.

---
 .../net/sf/briar/api/protocol/ExpiryAck.java  | 15 ++++++++++++
 .../sf/briar/api/protocol/ExpiryUpdate.java   | 23 ++++++++++++++++++
 .../sf/briar/api/protocol/ProtocolReader.java |  6 +++++
 .../sf/briar/api/protocol/ProtocolWriter.java |  4 ++++
 .../api/protocol/SubscriptionUpdate.java      |  2 +-
 .../briar/api/protocol/TransportUpdate.java   |  4 +++-
 .../src/net/sf/briar/api/protocol/Types.java  | 22 +++++++++--------
 .../sf/briar/protocol/ExpiryAckReader.java    | 20 ++++++++++++++++
 .../sf/briar/protocol/ExpiryUpdateReader.java | 22 +++++++++++++++++
 .../net/sf/briar/protocol/MessageReader.java  | 20 ++++------------
 .../net/sf/briar/protocol/ProtocolModule.java | 20 ++++++++++++----
 .../protocol/ProtocolReaderFactoryImpl.java   |  9 +++++++
 .../sf/briar/protocol/ProtocolReaderImpl.java | 24 +++++++++++++++++++
 .../sf/briar/protocol/ProtocolWriterImpl.java | 17 +++++++++++++
 14 files changed, 176 insertions(+), 32 deletions(-)
 create mode 100644 briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java
 create mode 100644 briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java
 create mode 100644 briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java
 create mode 100644 briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java

diff --git a/briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java b/briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java
new file mode 100644
index 0000000000..08640279d2
--- /dev/null
+++ b/briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java
@@ -0,0 +1,15 @@
+package net.sf.briar.api.protocol;
+
+/** A packet acknowledging a (@link ExpiryUpdate} */
+public class ExpiryAck {
+
+	private final long version;
+
+	public ExpiryAck(long version) {
+		this.version = version;
+	}
+
+	public long getVersionNumber() {
+		return version;
+	}
+}
diff --git a/briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java b/briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java
new file mode 100644
index 0000000000..4b3c81f308
--- /dev/null
+++ b/briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java
@@ -0,0 +1,23 @@
+package net.sf.briar.api.protocol;
+
+/**
+ * A packet updating the recipient's view of the expiry time of the sender's
+ * database.
+ */
+public class ExpiryUpdate {
+
+	private final long expiry, version;
+
+	public ExpiryUpdate(long expiry, long version) {
+		this.expiry = expiry;
+		this.version = version;
+	}
+
+	public long getExpiryTime() {
+		return expiry;
+	}
+
+	public long getVersionNumber() {
+		return version;
+	}
+}
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java b/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java
index 4712c83457..0499180c03 100644
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java
+++ b/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java
@@ -9,6 +9,12 @@ public interface ProtocolReader {
 	boolean hasAck() throws IOException;
 	Ack readAck() throws IOException;
 
+	boolean hasExpiryAck() throws IOException;
+	ExpiryAck readExpiryAck() throws IOException;
+
+	boolean hasExpiryUpdate() throws IOException;
+	ExpiryUpdate readExpiryUpdate() throws IOException;
+
 	boolean hasMessage() throws IOException;
 	UnverifiedMessage readMessage() throws IOException;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java b/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java
index 4637fdffc5..58785a290c 100644
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java
+++ b/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java
@@ -10,6 +10,10 @@ public interface ProtocolWriter {
 
 	void writeAck(Ack a) throws IOException;
 
+	void writeExpiryAck(ExpiryAck a) throws IOException;
+
+	void writeExpiryUpdate(ExpiryUpdate e) throws IOException;
+
 	void writeMessage(byte[] raw) throws IOException;
 
 	void writeOffer(Offer o) throws IOException;
diff --git a/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java b/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java
index 8b7c1e8733..1e96168f80 100644
--- a/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java
+++ b/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java
@@ -2,7 +2,7 @@ package net.sf.briar.api.protocol;
 
 import java.util.Collection;
 
-/** A packet updating the sender's subscriptions. */
+/** A packet updating the recipient's view of the sender's subscriptions. */
 public class SubscriptionUpdate {
 
 	private final Collection<Group> subs;
diff --git a/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java b/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java
index b36c32eaa9..b4372c4dd8 100644
--- a/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java
+++ b/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java
@@ -2,7 +2,9 @@ package net.sf.briar.api.protocol;
 
 import net.sf.briar.api.TransportProperties;
 
-/** A packet updating the sender's transport properties. */
+/**
+ * A packet updating the recipient's view of the sender's transport properties.
+ */
 public class TransportUpdate {
 
 	private final TransportId id;
diff --git a/briar-api/src/net/sf/briar/api/protocol/Types.java b/briar-api/src/net/sf/briar/api/protocol/Types.java
index 248d6731b6..d17e26ab5f 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Types.java
+++ b/briar-api/src/net/sf/briar/api/protocol/Types.java
@@ -3,14 +3,16 @@ package net.sf.briar.api.protocol;
 /** Struct identifiers for encoding and decoding protocol objects. */
 public interface Types {
 
-	int ACK = 0;
-	int AUTHOR = 1;
-	int GROUP = 3;
-	int MESSAGE = 4;
-	int OFFER = 5;
-	int REQUEST = 6;
-	int SUBSCRIPTION_ACK = 7;
-	int SUBSCRIPTION_UPDATE = 8;
-	int TRANSPORT_ACK = 9;
-	int TRANSPORT_UPDATE = 10;
+	int AUTHOR = 0;
+	int GROUP = 1;
+	int ACK = 2;
+	int EXPIRY_ACK = 3;
+	int EXPIRY_UPDATE = 4;
+	int MESSAGE = 5;
+	int OFFER = 6;
+	int REQUEST = 7;
+	int SUBSCRIPTION_ACK = 8;
+	int SUBSCRIPTION_UPDATE = 9;
+	int TRANSPORT_ACK = 10;
+	int TRANSPORT_UPDATE = 11;
 }
diff --git a/briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java b/briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java
new file mode 100644
index 0000000000..48b24de6c0
--- /dev/null
+++ b/briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java
@@ -0,0 +1,20 @@
+package net.sf.briar.protocol;
+
+import static net.sf.briar.api.protocol.Types.EXPIRY_ACK;
+
+import java.io.IOException;
+
+import net.sf.briar.api.FormatException;
+import net.sf.briar.api.protocol.ExpiryAck;
+import net.sf.briar.api.serial.Reader;
+import net.sf.briar.api.serial.StructReader;
+
+class ExpiryAckReader implements StructReader<ExpiryAck> {
+
+	public ExpiryAck readStruct(Reader r) throws IOException {
+		r.readStructId(EXPIRY_ACK);
+		long version = r.readInt64();
+		if(version < 0L) throw new FormatException();
+		return new ExpiryAck(version);
+	}
+}
diff --git a/briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java b/briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java
new file mode 100644
index 0000000000..7b8fe7b761
--- /dev/null
+++ b/briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java
@@ -0,0 +1,22 @@
+package net.sf.briar.protocol;
+
+import static net.sf.briar.api.protocol.Types.EXPIRY_UPDATE;
+
+import java.io.IOException;
+
+import net.sf.briar.api.FormatException;
+import net.sf.briar.api.protocol.ExpiryUpdate;
+import net.sf.briar.api.serial.Reader;
+import net.sf.briar.api.serial.StructReader;
+
+class ExpiryUpdateReader implements StructReader<ExpiryUpdate> {
+
+	public ExpiryUpdate readStruct(Reader r) throws IOException {
+		r.readStructId(EXPIRY_UPDATE);
+		long expiry = r.readInt64();
+		if(expiry < 0L) throw new FormatException();
+		long version = r.readInt64();
+		if(version < 0L) throw new FormatException();
+		return new ExpiryUpdate(expiry, version);
+	}
+}
diff --git a/briar-core/src/net/sf/briar/protocol/MessageReader.java b/briar-core/src/net/sf/briar/protocol/MessageReader.java
index f86ae4dfa9..eb000103e8 100644
--- a/briar-core/src/net/sf/briar/protocol/MessageReader.java
+++ b/briar-core/src/net/sf/briar/protocol/MessageReader.java
@@ -5,8 +5,6 @@ import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
 import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SIGNATURE_LENGTH;
 import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SUBJECT_LENGTH;
 import static net.sf.briar.api.protocol.ProtocolConstants.SALT_LENGTH;
-import static net.sf.briar.api.protocol.Types.AUTHOR;
-import static net.sf.briar.api.protocol.Types.GROUP;
 import static net.sf.briar.api.protocol.Types.MESSAGE;
 
 import java.io.IOException;
@@ -51,22 +49,12 @@ class MessageReader implements StructReader<UnverifiedMessage> {
 		}
 		// Read the group, if there is one
 		Group group = null;
-		if(r.hasNull()) {
-			r.readNull();
-		} else {
-			r.addStructReader(GROUP, groupReader);
-			group = r.readStruct(GROUP, Group.class);
-			r.removeStructReader(GROUP);
-		}
+		if(r.hasNull()) r.readNull();
+		else group = groupReader.readStruct(r);
 		// Read the author, if there is one
 		Author author = null;
-		if(r.hasNull()) {
-			r.readNull();
-		} else {
-			r.addStructReader(AUTHOR, authorReader);
-			author = r.readStruct(AUTHOR, Author.class);
-			r.removeStructReader(AUTHOR);
-		}
+		if(r.hasNull()) r.readNull();
+		else author = authorReader.readStruct(r);
 		// Read the subject
 		String subject = r.readString(MAX_SUBJECT_LENGTH);
 		// Read the timestamp
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolModule.java b/briar-core/src/net/sf/briar/protocol/ProtocolModule.java
index dfce9b987c..e30884ac8f 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolModule.java
+++ b/briar-core/src/net/sf/briar/protocol/ProtocolModule.java
@@ -6,6 +6,8 @@ import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.protocol.Ack;
 import net.sf.briar.api.protocol.Author;
 import net.sf.briar.api.protocol.AuthorFactory;
+import net.sf.briar.api.protocol.ExpiryAck;
+import net.sf.briar.api.protocol.ExpiryUpdate;
 import net.sf.briar.api.protocol.Group;
 import net.sf.briar.api.protocol.GroupFactory;
 import net.sf.briar.api.protocol.MessageFactory;
@@ -58,19 +60,29 @@ public class ProtocolModule extends AbstractModule {
 								MIN_VERIFIER_THREADS, MAX_VERIFIER_THREADS));
 	}
 
+	@Provides
+	StructReader<Author> getAuthorReader(CryptoComponent crypto) {
+		return new AuthorReader(crypto);
+	}
+
+	@Provides
+	StructReader<Group> getGroupReader(CryptoComponent crypto) {
+		return new GroupReader(crypto);
+	}
+
 	@Provides
 	StructReader<Ack> getAckReader() {
 		return new AckReader();
 	}
 
 	@Provides
-	StructReader<Author> getAuthorReader(CryptoComponent crypto) {
-		return new AuthorReader(crypto);
+	StructReader<ExpiryAck> getExpiryAckReader() {
+		return new ExpiryAckReader();
 	}
 
 	@Provides
-	StructReader<Group> getGroupReader(CryptoComponent crypto) {
-		return new GroupReader(crypto);
+	StructReader<ExpiryUpdate> getExpiryUpdateReader() {
+		return new ExpiryUpdateReader();
 	}
 
 	@Provides
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java
index fc42c841da..dbfb622ac8 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java
@@ -3,6 +3,8 @@ package net.sf.briar.protocol;
 import java.io.InputStream;
 
 import net.sf.briar.api.protocol.Ack;
+import net.sf.briar.api.protocol.ExpiryAck;
+import net.sf.briar.api.protocol.ExpiryUpdate;
 import net.sf.briar.api.protocol.Offer;
 import net.sf.briar.api.protocol.ProtocolReader;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
@@ -23,6 +25,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory {
 
 	private final ReaderFactory readerFactory;
 	private final Provider<StructReader<Ack>> ackProvider;
+	private final Provider<StructReader<ExpiryAck>> expiryAckProvider;
+	private final Provider<StructReader<ExpiryUpdate>> expiryUpdateProvider;
 	private final Provider<StructReader<UnverifiedMessage>> messageProvider;
 	private final Provider<StructReader<Offer>> offerProvider;
 	private final Provider<StructReader<Request>> requestProvider;
@@ -35,6 +39,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory {
 	ProtocolReaderFactoryImpl(ReaderFactory readerFactory,
 			Provider<StructReader<Ack>> ackProvider,
 			Provider<StructReader<UnverifiedMessage>> messageProvider,
+			Provider<StructReader<ExpiryAck>> expiryAckProvider,
+			Provider<StructReader<ExpiryUpdate>> expiryUpdateProvider,
 			Provider<StructReader<Offer>> offerProvider,
 			Provider<StructReader<Request>> requestProvider,
 			Provider<StructReader<SubscriptionAck>> subscriptionAckProvider,
@@ -43,6 +49,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory {
 			Provider<StructReader<TransportUpdate>> transportUpdateProvider) {
 		this.readerFactory = readerFactory;
 		this.ackProvider = ackProvider;
+		this.expiryAckProvider = expiryAckProvider;
+		this.expiryUpdateProvider = expiryUpdateProvider;
 		this.messageProvider = messageProvider;
 		this.offerProvider = offerProvider;
 		this.requestProvider = requestProvider;
@@ -54,6 +62,7 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory {
 
 	public ProtocolReader createProtocolReader(InputStream in) {
 		return new ProtocolReaderImpl(in, readerFactory, ackProvider.get(),
+				expiryAckProvider.get(), expiryUpdateProvider.get(),
 				messageProvider.get(), offerProvider.get(),
 				requestProvider.get(), subscriptionAckProvider.get(),
 				subscriptionUpdateProvider.get(), transportAckProvider.get(),
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java
index b13cfe8adf..b2dd6287ee 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java
+++ b/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java
@@ -1,6 +1,8 @@
 package net.sf.briar.protocol;
 
 import static net.sf.briar.api.protocol.Types.ACK;
+import static net.sf.briar.api.protocol.Types.EXPIRY_ACK;
+import static net.sf.briar.api.protocol.Types.EXPIRY_UPDATE;
 import static net.sf.briar.api.protocol.Types.MESSAGE;
 import static net.sf.briar.api.protocol.Types.OFFER;
 import static net.sf.briar.api.protocol.Types.REQUEST;
@@ -13,6 +15,8 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import net.sf.briar.api.protocol.Ack;
+import net.sf.briar.api.protocol.ExpiryAck;
+import net.sf.briar.api.protocol.ExpiryUpdate;
 import net.sf.briar.api.protocol.Offer;
 import net.sf.briar.api.protocol.ProtocolReader;
 import net.sf.briar.api.protocol.Request;
@@ -31,6 +35,8 @@ class ProtocolReaderImpl implements ProtocolReader {
 
 	ProtocolReaderImpl(InputStream in, ReaderFactory readerFactory,
 			StructReader<Ack> ackReader,
+			StructReader<ExpiryAck> expiryAckReader,
+			StructReader<ExpiryUpdate> expiryUpdateReader,
 			StructReader<UnverifiedMessage> messageReader,
 			StructReader<Offer> offerReader,
 			StructReader<Request> requestReader,
@@ -43,6 +49,8 @@ class ProtocolReaderImpl implements ProtocolReader {
 		reader.addStructReader(MESSAGE, messageReader);
 		reader.addStructReader(OFFER, offerReader);
 		reader.addStructReader(REQUEST, requestReader);
+		reader.addStructReader(EXPIRY_ACK, expiryAckReader);
+		reader.addStructReader(EXPIRY_UPDATE, expiryUpdateReader);
 		reader.addStructReader(SUBSCRIPTION_ACK, subscriptionAckReader);
 		reader.addStructReader(SUBSCRIPTION_UPDATE, subscriptionUpdateReader);
 		reader.addStructReader(TRANSPORT_ACK, transportAckReader);
@@ -61,6 +69,22 @@ class ProtocolReaderImpl implements ProtocolReader {
 		return reader.readStruct(ACK, Ack.class);
 	}
 
+	public boolean hasExpiryAck() throws IOException {
+		return reader.hasStruct(EXPIRY_ACK);
+	}
+
+	public ExpiryAck readExpiryAck() throws IOException {
+		return reader.readStruct(EXPIRY_ACK, ExpiryAck.class);
+	}
+
+	public boolean hasExpiryUpdate() throws IOException {
+		return reader.hasStruct(EXPIRY_UPDATE);
+	}
+
+	public ExpiryUpdate readExpiryUpdate() throws IOException {
+		return reader.readStruct(EXPIRY_UPDATE, ExpiryUpdate.class);
+	}
+
 	public boolean hasMessage() throws IOException {
 		return reader.hasStruct(MESSAGE);
 	}
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java
index 633ec17d88..d5ed0e1f38 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java
+++ b/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java
@@ -2,6 +2,8 @@ package net.sf.briar.protocol;
 
 import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
 import static net.sf.briar.api.protocol.Types.ACK;
+import static net.sf.briar.api.protocol.Types.EXPIRY_ACK;
+import static net.sf.briar.api.protocol.Types.EXPIRY_UPDATE;
 import static net.sf.briar.api.protocol.Types.GROUP;
 import static net.sf.briar.api.protocol.Types.OFFER;
 import static net.sf.briar.api.protocol.Types.REQUEST;
@@ -15,6 +17,8 @@ import java.io.OutputStream;
 import java.util.BitSet;
 
 import net.sf.briar.api.protocol.Ack;
+import net.sf.briar.api.protocol.ExpiryAck;
+import net.sf.briar.api.protocol.ExpiryUpdate;
 import net.sf.briar.api.protocol.Group;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
@@ -70,6 +74,19 @@ class ProtocolWriterImpl implements ProtocolWriter {
 		if(flush) out.flush();
 	}
 
+	public void writeExpiryAck(ExpiryAck a) throws IOException {
+		w.writeStructId(EXPIRY_ACK);
+		w.writeInt64(a.getVersionNumber());
+		if(flush) out.flush();
+	}
+
+	public void writeExpiryUpdate(ExpiryUpdate e) throws IOException {
+		w.writeStructId(EXPIRY_UPDATE);
+		w.writeInt64(e.getExpiryTime());
+		w.writeInt64(e.getVersionNumber());
+		if(flush) out.flush();
+	}
+
 	public void writeMessage(byte[] raw) throws IOException {
 		out.write(raw);
 		if(flush) out.flush();
-- 
GitLab