mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-20 14:49:53 +01:00
Each request packet should contain the unique ID of the offer to which
it responds.
This commit is contained in:
@@ -11,6 +11,9 @@ public interface Offer {
|
|||||||
*/
|
*/
|
||||||
static final int MAX_SIZE = (1024 * 1024) - 100;
|
static final int MAX_SIZE = (1024 * 1024) - 100;
|
||||||
|
|
||||||
|
/** Returns the offer's unique identifier. */
|
||||||
|
OfferId getId();
|
||||||
|
|
||||||
/** Returns the message IDs contained in the offer. */
|
/** Returns the message IDs contained in the offer. */
|
||||||
Collection<MessageId> getMessageIds();
|
Collection<MessageId> getMessageIds();
|
||||||
}
|
}
|
||||||
|
|||||||
26
api/net/sf/briar/api/protocol/OfferId.java
Normal file
26
api/net/sf/briar/api/protocol/OfferId.java
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package net.sf.briar.api.protocol;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import net.sf.briar.api.serial.Writer;
|
||||||
|
|
||||||
|
/** Type-safe wrapper for a byte array that uniquely identifies an offer. */
|
||||||
|
public class OfferId extends UniqueId {
|
||||||
|
|
||||||
|
public OfferId(byte[] id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeTo(Writer w) throws IOException {
|
||||||
|
w.writeUserDefinedTag(Tags.OFFER_ID);
|
||||||
|
w.writeBytes(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if(o instanceof OfferId)
|
||||||
|
return Arrays.equals(id, ((OfferId) o).id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,12 @@ public interface Request {
|
|||||||
*/
|
*/
|
||||||
static final int MAX_SIZE = (1024 * 1024) - 100;
|
static final int MAX_SIZE = (1024 * 1024) - 100;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the unique identifier of the offer to which this request
|
||||||
|
* responds.
|
||||||
|
*/
|
||||||
|
OfferId getOfferId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a sequence of bits corresponding to the sequence of messages in
|
* Returns a sequence of bits corresponding to the sequence of messages in
|
||||||
* the offer, where the i^th bit is set if the i^th message should be sent.
|
* the offer, where the i^th bit is set if the i^th message should be sent.
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ public interface Tags {
|
|||||||
static final int MESSAGE = 7;
|
static final int MESSAGE = 7;
|
||||||
static final int MESSAGE_ID = 8;
|
static final int MESSAGE_ID = 8;
|
||||||
static final int OFFER = 9;
|
static final int OFFER = 9;
|
||||||
static final int REQUEST = 10;
|
static final int OFFER_ID = 10;
|
||||||
static final int SUBSCRIPTIONS = 11;
|
static final int REQUEST = 11;
|
||||||
static final int TRANSPORTS = 12;
|
static final int SUBSCRIPTIONS = 12;
|
||||||
|
static final int TRANSPORTS = 13;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package net.sf.briar.api.protocol.writers;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
|
||||||
/** An interface for creating a have notification. */
|
/** An interface for creating a have notification. */
|
||||||
public interface OfferWriter {
|
public interface OfferWriter {
|
||||||
@@ -13,6 +14,6 @@ public interface OfferWriter {
|
|||||||
*/
|
*/
|
||||||
boolean writeMessageId(MessageId m) throws IOException;
|
boolean writeMessageId(MessageId m) throws IOException;
|
||||||
|
|
||||||
/** Finishes writing the offer. */
|
/** Finishes writing the offer and returns its unique identifier. */
|
||||||
void finish() throws IOException;
|
OfferId finish() throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ package net.sf.briar.api.protocol.writers;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
|
||||||
/** An interface for creating a request packet. */
|
/** An interface for creating a request packet. */
|
||||||
public interface RequestWriter {
|
public interface RequestWriter {
|
||||||
|
|
||||||
/** Writes the contents of the request. */
|
/** Writes the contents of the request. */
|
||||||
void writeBitmap(BitSet b, int length) throws IOException;
|
void writeRequest(OfferId offerId, BitSet b, int length) throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -815,7 +815,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
|
|||||||
db.abortTransaction(txn);
|
db.abortTransaction(txn);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
r.writeBitmap(request, offered.size());
|
r.writeRequest(o.getId(), request, offered.size());
|
||||||
} finally {
|
} finally {
|
||||||
subscriptionLock.readLock().unlock();
|
subscriptionLock.readLock().unlock();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -627,7 +627,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
|
|||||||
db.abortTransaction(txn);
|
db.abortTransaction(txn);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
r.writeBitmap(request, offered.size());
|
r.writeRequest(o.getId(), request, offered.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,14 +10,11 @@ import net.sf.briar.api.serial.Consumer;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class AckReader implements ObjectReader<Ack> {
|
class AckReader implements ObjectReader<Ack> {
|
||||||
|
|
||||||
private final ObjectReader<BatchId> batchIdReader;
|
private final ObjectReader<BatchId> batchIdReader;
|
||||||
private final AckFactory ackFactory;
|
private final AckFactory ackFactory;
|
||||||
|
|
||||||
@Inject
|
|
||||||
AckReader(ObjectReader<BatchId> batchIdReader, AckFactory ackFactory) {
|
AckReader(ObjectReader<BatchId> batchIdReader, AckFactory ackFactory) {
|
||||||
this.batchIdReader = batchIdReader;
|
this.batchIdReader = batchIdReader;
|
||||||
this.ackFactory = ackFactory;
|
this.ackFactory = ackFactory;
|
||||||
|
|||||||
@@ -11,14 +11,11 @@ import net.sf.briar.api.protocol.Tags;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class AuthorReader implements ObjectReader<Author> {
|
class AuthorReader implements ObjectReader<Author> {
|
||||||
|
|
||||||
private final MessageDigest messageDigest;
|
private final MessageDigest messageDigest;
|
||||||
private final AuthorFactory authorFactory;
|
private final AuthorFactory authorFactory;
|
||||||
|
|
||||||
@Inject
|
|
||||||
AuthorReader(CryptoComponent crypto, AuthorFactory authorFactory) {
|
AuthorReader(CryptoComponent crypto, AuthorFactory authorFactory) {
|
||||||
messageDigest = crypto.getMessageDigest();
|
messageDigest = crypto.getMessageDigest();
|
||||||
this.authorFactory = authorFactory;
|
this.authorFactory = authorFactory;
|
||||||
|
|||||||
@@ -13,15 +13,12 @@ import net.sf.briar.api.serial.Consumer;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class BatchReader implements ObjectReader<Batch> {
|
class BatchReader implements ObjectReader<Batch> {
|
||||||
|
|
||||||
private final MessageDigest messageDigest;
|
private final MessageDigest messageDigest;
|
||||||
private final ObjectReader<Message> messageReader;
|
private final ObjectReader<Message> messageReader;
|
||||||
private final BatchFactory batchFactory;
|
private final BatchFactory batchFactory;
|
||||||
|
|
||||||
@Inject
|
|
||||||
BatchReader(CryptoComponent crypto, ObjectReader<Message> messageReader,
|
BatchReader(CryptoComponent crypto, ObjectReader<Message> messageReader,
|
||||||
BatchFactory batchFactory) {
|
BatchFactory batchFactory) {
|
||||||
messageDigest = crypto.getMessageDigest();
|
messageDigest = crypto.getMessageDigest();
|
||||||
|
|||||||
@@ -11,14 +11,11 @@ import net.sf.briar.api.protocol.Tags;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class GroupReader implements ObjectReader<Group> {
|
class GroupReader implements ObjectReader<Group> {
|
||||||
|
|
||||||
private final MessageDigest messageDigest;
|
private final MessageDigest messageDigest;
|
||||||
private final GroupFactory groupFactory;
|
private final GroupFactory groupFactory;
|
||||||
|
|
||||||
@Inject
|
|
||||||
GroupReader(CryptoComponent crypto, GroupFactory groupFactory) {
|
GroupReader(CryptoComponent crypto, GroupFactory groupFactory) {
|
||||||
messageDigest = crypto.getMessageDigest();
|
messageDigest = crypto.getMessageDigest();
|
||||||
this.groupFactory = groupFactory;
|
this.groupFactory = groupFactory;
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ import net.sf.briar.api.serial.FormatException;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class MessageReader implements ObjectReader<Message> {
|
class MessageReader implements ObjectReader<Message> {
|
||||||
|
|
||||||
private final ObjectReader<MessageId> messageIdReader;
|
private final ObjectReader<MessageId> messageIdReader;
|
||||||
@@ -29,7 +27,6 @@ class MessageReader implements ObjectReader<Message> {
|
|||||||
private final Signature signature;
|
private final Signature signature;
|
||||||
private final MessageDigest messageDigest;
|
private final MessageDigest messageDigest;
|
||||||
|
|
||||||
@Inject
|
|
||||||
MessageReader(CryptoComponent crypto,
|
MessageReader(CryptoComponent crypto,
|
||||||
ObjectReader<MessageId> messageIdReader,
|
ObjectReader<MessageId> messageIdReader,
|
||||||
ObjectReader<Group> groupReader,
|
ObjectReader<Group> groupReader,
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ import java.util.Collection;
|
|||||||
|
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
|
||||||
interface OfferFactory {
|
interface OfferFactory {
|
||||||
|
|
||||||
Offer createOffer(Collection<MessageId> offered);
|
Offer createOffer(OfferId id, Collection<MessageId> offered);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,11 @@ import java.util.Collection;
|
|||||||
|
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
|
||||||
class OfferFactoryImpl implements OfferFactory {
|
class OfferFactoryImpl implements OfferFactory {
|
||||||
|
|
||||||
public Offer createOffer(Collection<MessageId> offered) {
|
public Offer createOffer(OfferId id, Collection<MessageId> offered) {
|
||||||
return new OfferImpl(offered);
|
return new OfferImpl(id, offered);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
20
components/net/sf/briar/protocol/OfferIdReader.java
Normal file
20
components/net/sf/briar/protocol/OfferIdReader.java
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package net.sf.briar.protocol;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
import net.sf.briar.api.protocol.Tags;
|
||||||
|
import net.sf.briar.api.protocol.UniqueId;
|
||||||
|
import net.sf.briar.api.serial.FormatException;
|
||||||
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
|
class OfferIdReader implements ObjectReader<OfferId> {
|
||||||
|
|
||||||
|
public OfferId readObject(Reader r) throws IOException {
|
||||||
|
r.readUserDefinedTag(Tags.OFFER_ID);
|
||||||
|
byte[] b = r.readBytes(UniqueId.LENGTH);
|
||||||
|
if(b.length != UniqueId.LENGTH) throw new FormatException();
|
||||||
|
return new OfferId(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,15 +4,22 @@ import java.util.Collection;
|
|||||||
|
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
|
||||||
class OfferImpl implements Offer {
|
class OfferImpl implements Offer {
|
||||||
|
|
||||||
|
private final OfferId id;
|
||||||
private final Collection<MessageId> offered;
|
private final Collection<MessageId> offered;
|
||||||
|
|
||||||
OfferImpl(Collection<MessageId> offered) {
|
OfferImpl(OfferId id, Collection<MessageId> offered) {
|
||||||
|
this.id = id;
|
||||||
this.offered = offered;
|
this.offered = offered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OfferId getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
public Collection<MessageId> getMessageIds() {
|
public Collection<MessageId> getMessageIds() {
|
||||||
return offered;
|
return offered;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,47 @@
|
|||||||
package net.sf.briar.protocol;
|
package net.sf.briar.protocol;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.security.MessageDigest;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import net.sf.briar.api.crypto.CryptoComponent;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
import net.sf.briar.api.serial.Consumer;
|
import net.sf.briar.api.serial.Consumer;
|
||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class OfferReader implements ObjectReader<Offer> {
|
class OfferReader implements ObjectReader<Offer> {
|
||||||
|
|
||||||
|
private final MessageDigest messageDigest;
|
||||||
private final ObjectReader<MessageId> messageIdReader;
|
private final ObjectReader<MessageId> messageIdReader;
|
||||||
private final OfferFactory offerFactory;
|
private final OfferFactory offerFactory;
|
||||||
|
|
||||||
@Inject
|
OfferReader(CryptoComponent crypto, ObjectReader<MessageId> messageIdReader,
|
||||||
OfferReader(ObjectReader<MessageId> messageIdReader,
|
|
||||||
OfferFactory offerFactory) {
|
OfferFactory offerFactory) {
|
||||||
|
messageDigest = crypto.getMessageDigest();
|
||||||
this.messageIdReader = messageIdReader;
|
this.messageIdReader = messageIdReader;
|
||||||
this.offerFactory = offerFactory;
|
this.offerFactory = offerFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Offer readObject(Reader r) throws IOException {
|
public Offer readObject(Reader r) throws IOException {
|
||||||
// Initialise the consumer
|
// Initialise the consumers
|
||||||
Consumer counting = new CountingConsumer(Offer.MAX_SIZE);
|
Consumer counting = new CountingConsumer(Offer.MAX_SIZE);
|
||||||
|
DigestingConsumer digesting = new DigestingConsumer(messageDigest);
|
||||||
|
messageDigest.reset();
|
||||||
// Read the data
|
// Read the data
|
||||||
r.addConsumer(counting);
|
r.addConsumer(counting);
|
||||||
|
r.addConsumer(digesting);
|
||||||
r.readUserDefinedTag(Tags.OFFER);
|
r.readUserDefinedTag(Tags.OFFER);
|
||||||
r.addObjectReader(Tags.MESSAGE_ID, messageIdReader);
|
r.addObjectReader(Tags.MESSAGE_ID, messageIdReader);
|
||||||
Collection<MessageId> messages = r.readList(MessageId.class);
|
Collection<MessageId> messages = r.readList(MessageId.class);
|
||||||
r.removeObjectReader(Tags.MESSAGE_ID);
|
r.removeObjectReader(Tags.MESSAGE_ID);
|
||||||
|
r.removeConsumer(digesting);
|
||||||
r.removeConsumer(counting);
|
r.removeConsumer(counting);
|
||||||
// Build and return the offer
|
// Build and return the offer
|
||||||
return offerFactory.createOffer(messages);
|
OfferId id = new OfferId(messageDigest.digest());
|
||||||
|
return offerFactory.createOffer(id, messages);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import net.sf.briar.api.protocol.Message;
|
|||||||
import net.sf.briar.api.protocol.MessageEncoder;
|
import net.sf.briar.api.protocol.MessageEncoder;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
||||||
@@ -81,14 +82,21 @@ public class ProtocolModule extends AbstractModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
ObjectReader<Offer> getOfferReader(ObjectReader<MessageId> messageIdReader,
|
ObjectReader<OfferId> getOfferIdReader() {
|
||||||
OfferFactory offerFactory) {
|
return new OfferIdReader();
|
||||||
return new OfferReader(messageIdReader, offerFactory);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
ObjectReader<Request> getRequestReader(RequestFactory requestFactory) {
|
ObjectReader<Offer> getOfferReader(CryptoComponent crypto,
|
||||||
return new RequestReader(requestFactory);
|
ObjectReader<MessageId> messageIdReader,
|
||||||
|
OfferFactory offerFactory) {
|
||||||
|
return new OfferReader(crypto, messageIdReader, offerFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
ObjectReader<Request> getRequestReader(ObjectReader<OfferId> offerIdReader,
|
||||||
|
RequestFactory requestFactory) {
|
||||||
|
return new RequestReader(offerIdReader, requestFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ package net.sf.briar.protocol;
|
|||||||
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
|
|
||||||
interface RequestFactory {
|
interface RequestFactory {
|
||||||
|
|
||||||
Request createRequest(BitSet requested);
|
Request createRequest(OfferId offerId, BitSet requested);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ package net.sf.briar.protocol;
|
|||||||
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
|
|
||||||
class RequestFactoryImpl implements RequestFactory {
|
class RequestFactoryImpl implements RequestFactory {
|
||||||
|
|
||||||
public Request createRequest(BitSet requested) {
|
public Request createRequest(OfferId offerId, BitSet requested) {
|
||||||
return new RequestImpl(requested);
|
return new RequestImpl(offerId, requested);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,16 +2,23 @@ package net.sf.briar.protocol;
|
|||||||
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
|
|
||||||
class RequestImpl implements Request {
|
class RequestImpl implements Request {
|
||||||
|
|
||||||
|
private final OfferId offerId;
|
||||||
private final BitSet requested;
|
private final BitSet requested;
|
||||||
|
|
||||||
RequestImpl(BitSet requested) {
|
RequestImpl(OfferId offerId, BitSet requested) {
|
||||||
|
this.offerId = offerId;
|
||||||
this.requested = requested;
|
this.requested = requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OfferId getOfferId() {
|
||||||
|
return offerId;
|
||||||
|
}
|
||||||
|
|
||||||
public BitSet getBitmap() {
|
public BitSet getBitmap() {
|
||||||
return requested;
|
return requested;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,20 +3,21 @@ package net.sf.briar.protocol;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
import net.sf.briar.api.serial.Consumer;
|
import net.sf.briar.api.serial.Consumer;
|
||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class RequestReader implements ObjectReader<Request> {
|
class RequestReader implements ObjectReader<Request> {
|
||||||
|
|
||||||
|
private final ObjectReader<OfferId> offerIdReader;
|
||||||
private final RequestFactory requestFactory;
|
private final RequestFactory requestFactory;
|
||||||
|
|
||||||
@Inject
|
RequestReader(ObjectReader<OfferId> offerIdReader,
|
||||||
RequestReader(RequestFactory requestFactory) {
|
RequestFactory requestFactory) {
|
||||||
|
this.offerIdReader = offerIdReader;
|
||||||
this.requestFactory = requestFactory;
|
this.requestFactory = requestFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,6 +27,8 @@ class RequestReader implements ObjectReader<Request> {
|
|||||||
// Read the data
|
// Read the data
|
||||||
r.addConsumer(counting);
|
r.addConsumer(counting);
|
||||||
r.readUserDefinedTag(Tags.REQUEST);
|
r.readUserDefinedTag(Tags.REQUEST);
|
||||||
|
r.addObjectReader(Tags.OFFER_ID, offerIdReader);
|
||||||
|
OfferId offerId = r.readUserDefined(Tags.OFFER_ID, OfferId.class);
|
||||||
byte[] bitmap = r.readBytes(Request.MAX_SIZE);
|
byte[] bitmap = r.readBytes(Request.MAX_SIZE);
|
||||||
r.removeConsumer(counting);
|
r.removeConsumer(counting);
|
||||||
// Convert the bitmap into a BitSet
|
// Convert the bitmap into a BitSet
|
||||||
@@ -36,6 +39,6 @@ class RequestReader implements ObjectReader<Request> {
|
|||||||
if((bitmap[i] & bit) != 0) b.set(i * 8 + j);
|
if((bitmap[i] & bit) != 0) b.set(i * 8 + j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return requestFactory.createRequest(b);
|
return requestFactory.createRequest(offerId, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,14 +10,11 @@ import net.sf.briar.api.serial.Consumer;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class SubscriptionReader implements ObjectReader<SubscriptionUpdate> {
|
class SubscriptionReader implements ObjectReader<SubscriptionUpdate> {
|
||||||
|
|
||||||
private final ObjectReader<Group> groupReader;
|
private final ObjectReader<Group> groupReader;
|
||||||
private final SubscriptionFactory subscriptionFactory;
|
private final SubscriptionFactory subscriptionFactory;
|
||||||
|
|
||||||
@Inject
|
|
||||||
SubscriptionReader(ObjectReader<Group> groupReader,
|
SubscriptionReader(ObjectReader<Group> groupReader,
|
||||||
SubscriptionFactory subscriptionFactory) {
|
SubscriptionFactory subscriptionFactory) {
|
||||||
this.groupReader = groupReader;
|
this.groupReader = groupReader;
|
||||||
|
|||||||
@@ -10,13 +10,10 @@ import net.sf.briar.api.serial.Consumer;
|
|||||||
import net.sf.briar.api.serial.ObjectReader;
|
import net.sf.briar.api.serial.ObjectReader;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
|
|
||||||
class TransportReader implements ObjectReader<TransportUpdate> {
|
class TransportReader implements ObjectReader<TransportUpdate> {
|
||||||
|
|
||||||
private final TransportFactory transportFactory;
|
private final TransportFactory transportFactory;
|
||||||
|
|
||||||
@Inject
|
|
||||||
TransportReader(TransportFactory transportFactory) {
|
TransportReader(TransportFactory transportFactory) {
|
||||||
this.transportFactory = transportFactory;
|
this.transportFactory = transportFactory;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,12 @@ package net.sf.briar.protocol.writers;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.security.DigestOutputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
import net.sf.briar.api.protocol.writers.OfferWriter;
|
import net.sf.briar.api.protocol.writers.OfferWriter;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
@@ -14,17 +17,20 @@ class OfferWriterImpl implements OfferWriter {
|
|||||||
|
|
||||||
private final OutputStream out;
|
private final OutputStream out;
|
||||||
private final Writer w;
|
private final Writer w;
|
||||||
|
private final MessageDigest messageDigest;
|
||||||
|
|
||||||
private boolean started = false, finished = false;
|
private boolean started = false;
|
||||||
|
|
||||||
OfferWriterImpl(OutputStream out, WriterFactory writerFactory) {
|
OfferWriterImpl(OutputStream out, WriterFactory writerFactory,
|
||||||
this.out = out;
|
MessageDigest messageDigest) {
|
||||||
|
this.out = new DigestOutputStream(out, messageDigest);
|
||||||
w = writerFactory.createWriter(out);
|
w = writerFactory.createWriter(out);
|
||||||
|
this.messageDigest = messageDigest;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean writeMessageId(MessageId m) throws IOException {
|
public boolean writeMessageId(MessageId m) throws IOException {
|
||||||
if(finished) throw new IllegalStateException();
|
|
||||||
if(!started) {
|
if(!started) {
|
||||||
|
messageDigest.reset();
|
||||||
w.writeUserDefinedTag(Tags.OFFER);
|
w.writeUserDefinedTag(Tags.OFFER);
|
||||||
w.writeListStart();
|
w.writeListStart();
|
||||||
started = true;
|
started = true;
|
||||||
@@ -35,15 +41,16 @@ class OfferWriterImpl implements OfferWriter {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void finish() throws IOException {
|
public OfferId finish() throws IOException {
|
||||||
if(finished) throw new IllegalStateException();
|
|
||||||
if(!started) {
|
if(!started) {
|
||||||
|
messageDigest.reset();
|
||||||
w.writeUserDefinedTag(Tags.OFFER);
|
w.writeUserDefinedTag(Tags.OFFER);
|
||||||
w.writeListStart();
|
w.writeListStart();
|
||||||
started = true;
|
started = true;
|
||||||
}
|
}
|
||||||
w.writeListEnd();
|
w.writeListEnd();
|
||||||
out.flush();
|
out.flush();
|
||||||
finished = true;
|
started = false;
|
||||||
|
return new OfferId(messageDigest.digest());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class ProtocolWriterFactoryImpl implements ProtocolWriterFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public OfferWriter createOfferWriter(OutputStream out) {
|
public OfferWriter createOfferWriter(OutputStream out) {
|
||||||
return new OfferWriterImpl(out, writerFactory);
|
return new OfferWriterImpl(out, writerFactory, messageDigest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RequestWriter createRequestWriter(OutputStream out) {
|
public RequestWriter createRequestWriter(OutputStream out) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import java.io.IOException;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
import net.sf.briar.api.protocol.writers.RequestWriter;
|
import net.sf.briar.api.protocol.writers.RequestWriter;
|
||||||
import net.sf.briar.api.serial.Writer;
|
import net.sf.briar.api.serial.Writer;
|
||||||
@@ -19,8 +20,11 @@ class RequestWriterImpl implements RequestWriter {
|
|||||||
w = writerFactory.createWriter(out);
|
w = writerFactory.createWriter(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeBitmap(BitSet b, int length) throws IOException {
|
public void writeRequest(OfferId offerId, BitSet b, int length)
|
||||||
|
throws IOException {
|
||||||
w.writeUserDefinedTag(Tags.REQUEST);
|
w.writeUserDefinedTag(Tags.REQUEST);
|
||||||
|
w.writeUserDefinedTag(Tags.OFFER_ID);
|
||||||
|
w.writeBytes(offerId.getBytes());
|
||||||
// If the number of bits isn't a multiple of 8, round up to a byte
|
// If the number of bits isn't a multiple of 8, round up to a byte
|
||||||
int bytes = length % 8 == 0 ? length / 8 : length / 8 + 1;
|
int bytes = length % 8 == 0 ? length / 8 : length / 8 + 1;
|
||||||
byte[] bitmap = new byte[bytes];
|
byte[] bitmap = new byte[bytes];
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import net.sf.briar.api.protocol.Message;
|
|||||||
import net.sf.briar.api.protocol.MessageEncoder;
|
import net.sf.briar.api.protocol.MessageEncoder;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.ProtocolReader;
|
import net.sf.briar.api.protocol.ProtocolReader;
|
||||||
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
@@ -78,6 +79,7 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
private final Message message, message1, message2, message3;
|
private final Message message, message1, message2, message3;
|
||||||
private final String authorName = "Alice";
|
private final String authorName = "Alice";
|
||||||
private final String messageBody = "Hello world";
|
private final String messageBody = "Hello world";
|
||||||
|
private final OfferId offerId;
|
||||||
private final Map<String, Map<String, String>> transports;
|
private final Map<String, Map<String, String>> transports;
|
||||||
|
|
||||||
public FileReadWriteTest() throws Exception {
|
public FileReadWriteTest() throws Exception {
|
||||||
@@ -114,6 +116,7 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
message3 = messageEncoder.encodeMessage(MessageId.NONE, group1,
|
message3 = messageEncoder.encodeMessage(MessageId.NONE, group1,
|
||||||
groupKeyPair.getPrivate(), author, authorKeyPair.getPrivate(),
|
groupKeyPair.getPrivate(), author, authorKeyPair.getPrivate(),
|
||||||
messageBody.getBytes("UTF-8"));
|
messageBody.getBytes("UTF-8"));
|
||||||
|
offerId = new OfferId(TestUtils.getRandomId());
|
||||||
transports = Collections.singletonMap("foo",
|
transports = Collections.singletonMap("foo",
|
||||||
Collections.singletonMap("bar", "baz"));
|
Collections.singletonMap("bar", "baz"));
|
||||||
}
|
}
|
||||||
@@ -155,7 +158,7 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
BitSet requested = new BitSet(4);
|
BitSet requested = new BitSet(4);
|
||||||
requested.set(1);
|
requested.set(1);
|
||||||
requested.set(3);
|
requested.set(3);
|
||||||
r.writeBitmap(requested, 4);
|
r.writeRequest(offerId, requested, 4);
|
||||||
packetWriter.finishPacket();
|
packetWriter.finishPacket();
|
||||||
|
|
||||||
SubscriptionWriter s =
|
SubscriptionWriter s =
|
||||||
@@ -231,6 +234,7 @@ public class FileReadWriteTest extends TestCase {
|
|||||||
assertTrue(protocolReader.hasRequest());
|
assertTrue(protocolReader.hasRequest());
|
||||||
Request r = protocolReader.readRequest();
|
Request r = protocolReader.readRequest();
|
||||||
packetReader.finishPacket();
|
packetReader.finishPacket();
|
||||||
|
assertEquals(offerId, r.getOfferId());
|
||||||
BitSet requested = r.getBitmap();
|
BitSet requested = r.getBitmap();
|
||||||
assertFalse(requested.get(0));
|
assertFalse(requested.get(0));
|
||||||
assertTrue(requested.get(1));
|
assertTrue(requested.get(1));
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import org.junit.Test;
|
|||||||
public class DatabaseCleanerImplTest extends TestCase {
|
public class DatabaseCleanerImplTest extends TestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStoppingCleanerWakesItUp() throws DbException {
|
public void testStoppingCleanerWakesItUp() throws Exception {
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
Callback callback = new Callback() {
|
Callback callback = new Callback() {
|
||||||
|
|
||||||
@@ -31,11 +31,7 @@ public class DatabaseCleanerImplTest extends TestCase {
|
|||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
// Start the cleaner and check that shouldCheckFreeSpace() is called
|
// Start the cleaner and check that shouldCheckFreeSpace() is called
|
||||||
cleaner.startCleaning();
|
cleaner.startCleaning();
|
||||||
try {
|
assertTrue(latch.await(5, TimeUnit.SECONDS));
|
||||||
assertTrue(latch.await(5, TimeUnit.SECONDS));
|
|
||||||
} catch(InterruptedException e) {
|
|
||||||
fail();
|
|
||||||
}
|
|
||||||
// Stop the cleaner (it should be waiting between sweeps)
|
// Stop the cleaner (it should be waiting between sweeps)
|
||||||
cleaner.stopCleaning();
|
cleaner.stopCleaning();
|
||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ import net.sf.briar.api.ContactId;
|
|||||||
import net.sf.briar.api.Rating;
|
import net.sf.briar.api.Rating;
|
||||||
import net.sf.briar.api.db.DatabaseComponent;
|
import net.sf.briar.api.db.DatabaseComponent;
|
||||||
import net.sf.briar.api.db.DatabaseListener;
|
import net.sf.briar.api.db.DatabaseListener;
|
||||||
|
import net.sf.briar.api.db.DatabaseListener.Event;
|
||||||
import net.sf.briar.api.db.DbException;
|
import net.sf.briar.api.db.DbException;
|
||||||
import net.sf.briar.api.db.NoSuchContactException;
|
import net.sf.briar.api.db.NoSuchContactException;
|
||||||
import net.sf.briar.api.db.Status;
|
import net.sf.briar.api.db.Status;
|
||||||
import net.sf.briar.api.db.DatabaseListener.Event;
|
|
||||||
import net.sf.briar.api.protocol.Ack;
|
import net.sf.briar.api.protocol.Ack;
|
||||||
import net.sf.briar.api.protocol.AuthorId;
|
import net.sf.briar.api.protocol.AuthorId;
|
||||||
import net.sf.briar.api.protocol.Batch;
|
import net.sf.briar.api.protocol.Batch;
|
||||||
@@ -25,6 +25,7 @@ import net.sf.briar.api.protocol.GroupId;
|
|||||||
import net.sf.briar.api.protocol.Message;
|
import net.sf.briar.api.protocol.Message;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
import net.sf.briar.api.protocol.SubscriptionUpdate;
|
||||||
import net.sf.briar.api.protocol.TransportUpdate;
|
import net.sf.briar.api.protocol.TransportUpdate;
|
||||||
import net.sf.briar.api.protocol.writers.AckWriter;
|
import net.sf.briar.api.protocol.writers.AckWriter;
|
||||||
@@ -49,6 +50,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
|||||||
protected final ContactId contactId;
|
protected final ContactId contactId;
|
||||||
protected final GroupId groupId;
|
protected final GroupId groupId;
|
||||||
protected final MessageId messageId, parentId;
|
protected final MessageId messageId, parentId;
|
||||||
|
protected final OfferId offerId;
|
||||||
private final long timestamp;
|
private final long timestamp;
|
||||||
private final int size;
|
private final int size;
|
||||||
private final byte[] raw;
|
private final byte[] raw;
|
||||||
@@ -65,6 +67,7 @@ public abstract class DatabaseComponentTest extends TestCase {
|
|||||||
groupId = new GroupId(TestUtils.getRandomId());
|
groupId = new GroupId(TestUtils.getRandomId());
|
||||||
messageId = new MessageId(TestUtils.getRandomId());
|
messageId = new MessageId(TestUtils.getRandomId());
|
||||||
parentId = new MessageId(TestUtils.getRandomId());
|
parentId = new MessageId(TestUtils.getRandomId());
|
||||||
|
offerId = new OfferId(TestUtils.getRandomId());
|
||||||
timestamp = System.currentTimeMillis();
|
timestamp = System.currentTimeMillis();
|
||||||
size = 1234;
|
size = 1234;
|
||||||
raw = new byte[size];
|
raw = new byte[size];
|
||||||
@@ -1031,7 +1034,9 @@ public abstract class DatabaseComponentTest extends TestCase {
|
|||||||
will(returnValue(true)); // Visible - do not request message # 1
|
will(returnValue(true)); // Visible - do not request message # 1
|
||||||
oneOf(database).setStatusSeenIfVisible(txn, contactId, messageId2);
|
oneOf(database).setStatusSeenIfVisible(txn, contactId, messageId2);
|
||||||
will(returnValue(false)); // Not visible - request message # 2
|
will(returnValue(false)); // Not visible - request message # 2
|
||||||
oneOf(requestWriter).writeBitmap(expectedRequest, 3);
|
oneOf(offer).getId();
|
||||||
|
will(returnValue(offerId));
|
||||||
|
oneOf(requestWriter).writeRequest(offerId, expectedRequest, 3);
|
||||||
}});
|
}});
|
||||||
DatabaseComponent db = createDatabaseComponent(database, cleaner);
|
DatabaseComponent db = createDatabaseComponent(database, cleaner);
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import net.sf.briar.api.protocol.Message;
|
|||||||
import net.sf.briar.api.protocol.MessageEncoder;
|
import net.sf.briar.api.protocol.MessageEncoder;
|
||||||
import net.sf.briar.api.protocol.MessageId;
|
import net.sf.briar.api.protocol.MessageId;
|
||||||
import net.sf.briar.api.protocol.Offer;
|
import net.sf.briar.api.protocol.Offer;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.ProtocolReader;
|
import net.sf.briar.api.protocol.ProtocolReader;
|
||||||
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
import net.sf.briar.api.protocol.ProtocolReaderFactory;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
@@ -46,6 +47,7 @@ public class ProtocolReadWriteTest extends TestCase {
|
|||||||
private final Group group;
|
private final Group group;
|
||||||
private final Message message;
|
private final Message message;
|
||||||
private final String messageBody = "Hello world";
|
private final String messageBody = "Hello world";
|
||||||
|
private final OfferId offerId;
|
||||||
private final BitSet bitSet;
|
private final BitSet bitSet;
|
||||||
private final Map<Group, Long> subscriptions;
|
private final Map<Group, Long> subscriptions;
|
||||||
private final Map<String, Map<String, String>> transports;
|
private final Map<String, Map<String, String>> transports;
|
||||||
@@ -62,6 +64,7 @@ public class ProtocolReadWriteTest extends TestCase {
|
|||||||
MessageEncoder messageEncoder = i.getInstance(MessageEncoder.class);
|
MessageEncoder messageEncoder = i.getInstance(MessageEncoder.class);
|
||||||
message = messageEncoder.encodeMessage(MessageId.NONE, group,
|
message = messageEncoder.encodeMessage(MessageId.NONE, group,
|
||||||
messageBody.getBytes("UTF-8"));
|
messageBody.getBytes("UTF-8"));
|
||||||
|
offerId = new OfferId(TestUtils.getRandomId());
|
||||||
bitSet = new BitSet();
|
bitSet = new BitSet();
|
||||||
bitSet.set(3);
|
bitSet.set(3);
|
||||||
bitSet.set(7);
|
bitSet.set(7);
|
||||||
@@ -90,7 +93,7 @@ public class ProtocolReadWriteTest extends TestCase {
|
|||||||
o.finish();
|
o.finish();
|
||||||
|
|
||||||
RequestWriter r = writerFactory.createRequestWriter(out);
|
RequestWriter r = writerFactory.createRequestWriter(out);
|
||||||
r.writeBitmap(bitSet, 10);
|
r.writeRequest(offerId, bitSet, 10);
|
||||||
|
|
||||||
SubscriptionWriter s = writerFactory.createSubscriptionWriter(out);
|
SubscriptionWriter s = writerFactory.createSubscriptionWriter(out);
|
||||||
s.writeSubscriptions(subscriptions);
|
s.writeSubscriptions(subscriptions);
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ import java.io.ByteArrayOutputStream;
|
|||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
import net.sf.briar.api.protocol.Request;
|
import net.sf.briar.api.protocol.Request;
|
||||||
import net.sf.briar.api.protocol.Tags;
|
import net.sf.briar.api.protocol.Tags;
|
||||||
|
import net.sf.briar.api.protocol.UniqueId;
|
||||||
import net.sf.briar.api.serial.FormatException;
|
import net.sf.briar.api.serial.FormatException;
|
||||||
import net.sf.briar.api.serial.Reader;
|
import net.sf.briar.api.serial.Reader;
|
||||||
import net.sf.briar.api.serial.ReaderFactory;
|
import net.sf.briar.api.serial.ReaderFactory;
|
||||||
@@ -38,7 +40,8 @@ public class RequestReaderTest extends TestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testFormatExceptionIfRequestIsTooLarge() throws Exception {
|
public void testFormatExceptionIfRequestIsTooLarge() throws Exception {
|
||||||
RequestFactory requestFactory = context.mock(RequestFactory.class);
|
RequestFactory requestFactory = context.mock(RequestFactory.class);
|
||||||
RequestReader requestReader = new RequestReader(requestFactory);
|
RequestReader requestReader =
|
||||||
|
new RequestReader(new OfferIdReader(), requestFactory);
|
||||||
|
|
||||||
byte[] b = createRequest(true);
|
byte[] b = createRequest(true);
|
||||||
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
||||||
@@ -56,10 +59,12 @@ public class RequestReaderTest extends TestCase {
|
|||||||
public void testNoFormatExceptionIfRequestIsMaximumSize() throws Exception {
|
public void testNoFormatExceptionIfRequestIsMaximumSize() throws Exception {
|
||||||
final RequestFactory requestFactory =
|
final RequestFactory requestFactory =
|
||||||
context.mock(RequestFactory.class);
|
context.mock(RequestFactory.class);
|
||||||
RequestReader requestReader = new RequestReader(requestFactory);
|
RequestReader requestReader =
|
||||||
|
new RequestReader(new OfferIdReader(), requestFactory);
|
||||||
final Request request = context.mock(Request.class);
|
final Request request = context.mock(Request.class);
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
oneOf(requestFactory).createRequest(with(any(BitSet.class)));
|
oneOf(requestFactory).createRequest(with(any(OfferId.class)),
|
||||||
|
with(any(BitSet.class)));
|
||||||
will(returnValue(request));
|
will(returnValue(request));
|
||||||
}});
|
}});
|
||||||
|
|
||||||
@@ -95,8 +100,8 @@ public class RequestReaderTest extends TestCase {
|
|||||||
// Deserialise the request
|
// Deserialise the request
|
||||||
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
ByteArrayInputStream in = new ByteArrayInputStream(b);
|
||||||
Reader reader = readerFactory.createReader(in);
|
Reader reader = readerFactory.createReader(in);
|
||||||
RequestReader requestReader =
|
RequestReader requestReader = new RequestReader(new OfferIdReader(),
|
||||||
new RequestReader(new RequestFactoryImpl());
|
new RequestFactoryImpl());
|
||||||
reader.addObjectReader(Tags.REQUEST, requestReader);
|
reader.addObjectReader(Tags.REQUEST, requestReader);
|
||||||
Request r = reader.readUserDefined(Tags.REQUEST, Request.class);
|
Request r = reader.readUserDefined(Tags.REQUEST, Request.class);
|
||||||
BitSet decoded = r.getBitmap();
|
BitSet decoded = r.getBitmap();
|
||||||
@@ -115,10 +120,15 @@ public class RequestReaderTest extends TestCase {
|
|||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
Writer w = writerFactory.createWriter(out);
|
Writer w = writerFactory.createWriter(out);
|
||||||
w.writeUserDefinedTag(Tags.REQUEST);
|
w.writeUserDefinedTag(Tags.REQUEST);
|
||||||
// Allow one byte for the REQUEST tag, one byte for the BYTES tag, and
|
w.writeUserDefinedTag(Tags.OFFER_ID);
|
||||||
// five bytes for the length as an int32
|
w.writeBytes(new byte[UniqueId.LENGTH]);
|
||||||
if(tooBig) w.writeBytes(new byte[Request.MAX_SIZE - 6]);
|
// Allow one byte for the REQUEST tag, one byte for the OFFER_ID tag,
|
||||||
else w.writeBytes(new byte[Request.MAX_SIZE - 7]);
|
// one byte for the BYTES tag, one byte for the length as a uint7,
|
||||||
|
// UniqueID.LENGTH bytes for the offer ID, one byte for the BYTES tag,
|
||||||
|
// and five bytes for the length as an int32
|
||||||
|
int overhead = UniqueId.LENGTH + 10;
|
||||||
|
if(tooBig) w.writeBytes(new byte[Request.MAX_SIZE - overhead + 1]);
|
||||||
|
else w.writeBytes(new byte[Request.MAX_SIZE - overhead]);
|
||||||
assertEquals(tooBig, out.size() > Request.MAX_SIZE);
|
assertEquals(tooBig, out.size() > Request.MAX_SIZE);
|
||||||
return out.toByteArray();
|
return out.toByteArray();
|
||||||
}
|
}
|
||||||
@@ -127,6 +137,8 @@ public class RequestReaderTest extends TestCase {
|
|||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
Writer w = writerFactory.createWriter(out);
|
Writer w = writerFactory.createWriter(out);
|
||||||
w.writeUserDefinedTag(Tags.REQUEST);
|
w.writeUserDefinedTag(Tags.REQUEST);
|
||||||
|
w.writeUserDefinedTag(Tags.OFFER_ID);
|
||||||
|
w.writeBytes(new byte[UniqueId.LENGTH]);
|
||||||
w.writeBytes(bitmap);
|
w.writeBytes(bitmap);
|
||||||
return out.toByteArray();
|
return out.toByteArray();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import java.io.IOException;
|
|||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
import net.sf.briar.api.protocol.OfferId;
|
||||||
|
import net.sf.briar.api.protocol.UniqueId;
|
||||||
import net.sf.briar.api.protocol.writers.RequestWriter;
|
import net.sf.briar.api.protocol.writers.RequestWriter;
|
||||||
import net.sf.briar.api.serial.WriterFactory;
|
import net.sf.briar.api.serial.WriterFactory;
|
||||||
import net.sf.briar.serial.SerialModule;
|
import net.sf.briar.serial.SerialModule;
|
||||||
@@ -18,11 +20,13 @@ import com.google.inject.Injector;
|
|||||||
public class RequestWriterImplTest extends TestCase {
|
public class RequestWriterImplTest extends TestCase {
|
||||||
|
|
||||||
private final WriterFactory writerFactory;
|
private final WriterFactory writerFactory;
|
||||||
|
private final OfferId offerId;
|
||||||
|
|
||||||
public RequestWriterImplTest() {
|
public RequestWriterImplTest() {
|
||||||
super();
|
super();
|
||||||
Injector i = Guice.createInjector(new SerialModule());
|
Injector i = Guice.createInjector(new SerialModule());
|
||||||
writerFactory = i.getInstance(WriterFactory.class);
|
writerFactory = i.getInstance(WriterFactory.class);
|
||||||
|
offerId = new OfferId(new byte[UniqueId.LENGTH]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -41,10 +45,14 @@ public class RequestWriterImplTest extends TestCase {
|
|||||||
b.set(11);
|
b.set(11);
|
||||||
b.set(12);
|
b.set(12);
|
||||||
b.set(15);
|
b.set(15);
|
||||||
r.writeBitmap(b, 16);
|
r.writeRequest(offerId, b, 16);
|
||||||
// Short user tag 10, short bytes with length 2, 0xD959
|
// Short user tag 11, short user tag 10, bytes with length 32 as a
|
||||||
|
// uint7, 32 zero bytes, short bytes with length 2, 0xD959
|
||||||
byte[] output = out.toByteArray();
|
byte[] output = out.toByteArray();
|
||||||
assertEquals("CA" + "92" + "D959", StringUtils.toHexString(output));
|
assertEquals("CB" + "CA" + "F6" + "20"
|
||||||
|
+ "00000000000000000000000000000000"
|
||||||
|
+ "00000000000000000000000000000000"
|
||||||
|
+ "92" + "D959", StringUtils.toHexString(output));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -62,9 +70,13 @@ public class RequestWriterImplTest extends TestCase {
|
|||||||
b.set(9);
|
b.set(9);
|
||||||
b.set(11);
|
b.set(11);
|
||||||
b.set(12);
|
b.set(12);
|
||||||
r.writeBitmap(b, 13);
|
r.writeRequest(offerId, b, 13);
|
||||||
// Short user tag 10, short bytes with length 2, 0x59D8
|
// Short user tag 11, short user tag 10, bytes with length 32 as a
|
||||||
|
// uint7, 32 zero bytes, short bytes with length 2, 0x59D8
|
||||||
byte[] output = out.toByteArray();
|
byte[] output = out.toByteArray();
|
||||||
assertEquals("CA" + "92" + "59D8", StringUtils.toHexString(output));
|
assertEquals("CB" + "CA" + "F6" + "20"
|
||||||
|
+ "00000000000000000000000000000000"
|
||||||
|
+ "00000000000000000000000000000000"
|
||||||
|
+ "92" + "59D8", StringUtils.toHexString(output));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user