diff --git a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java index 489e51a5917bc5f477cef44bd6ff2d71d82d9218..2add861af2104abd66061a4aa9f49b90d71f674f 100644 --- a/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java +++ b/briar-api/src/org/briarproject/api/privategroup/invitation/GroupInvitationManager.java @@ -4,6 +4,7 @@ import org.briarproject.api.clients.SessionId; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; +import org.briarproject.api.messaging.ConversationManager.ConversationClient; import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.sharing.InvitationMessage; @@ -15,7 +16,7 @@ import java.util.Collection; import javax.annotation.Nullable; @NotNullByDefault -public interface GroupInvitationManager { +public interface GroupInvitationManager extends ConversationClient { /** * The unique ID of the private group invitation client. diff --git a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java index 86e8688a0da4f839669fad67ac05f9bd2abe489f..ddf3b5ae20c304b3dfae078dc27461e3651e902a 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java @@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; +import org.briarproject.api.clients.MessageTracker; import org.briarproject.api.contact.ContactId; import org.briarproject.api.data.BdfDictionary; import org.briarproject.api.data.BdfList; @@ -42,6 +43,7 @@ abstract class AbstractProtocolEngine<S extends Session> protected final ClientHelper clientHelper; protected final PrivateGroupManager privateGroupManager; protected final PrivateGroupFactory privateGroupFactory; + protected final MessageTracker messageTracker; private final GroupMessageFactory groupMessageFactory; private final IdentityManager identityManager; @@ -54,7 +56,8 @@ abstract class AbstractProtocolEngine<S extends Session> PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, Clock clock) { + MessageEncoder messageEncoder, MessageTracker messageTracker, + Clock clock) { this.db = db; this.clientHelper = clientHelper; this.privateGroupManager = privateGroupManager; @@ -63,6 +66,7 @@ abstract class AbstractProtocolEngine<S extends Session> this.identityManager = identityManager; this.messageParser = messageParser; this.messageEncoder = messageEncoder; + this.messageTracker = messageTracker; this.clock = clock; } diff --git a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java index e3e6c0540443c144196cafced5c7fd85ac70ce5c..f58630c4c8b73c6a00d439648c945ae241ef96fb 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java @@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; +import org.briarproject.api.clients.MessageTracker; import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.SessionId; import org.briarproject.api.contact.ContactId; @@ -37,10 +38,11 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, Clock clock) { + MessageEncoder messageEncoder, MessageTracker messageTracker, + Clock clock) { super(db, clientHelper, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, clock); + messageEncoder, messageTracker, clock); } @Override @@ -144,8 +146,10 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { throws DbException { // Send an INVITE message Message sent = sendInviteMessage(txn, s, message, timestamp, signature); - long localTimestamp = Math.max(timestamp, getLocalTimestamp(s)); + // Track the message + messageTracker.trackOutgoingMessage(txn, sent); // Move to the INVITED state + long localTimestamp = Math.max(timestamp, getLocalTimestamp(s)); return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), s.getLastRemoteMessageId(), localTimestamp, timestamp, INVITED); @@ -176,6 +180,9 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { return abort(txn, s); // Mark the response visible in the UI markMessageVisibleInUi(txn, m.getId(), true); + // Track the message + messageTracker.trackMessage(txn, m.getContactGroupId(), + m.getTimestamp(), false); // Start syncing the private group with the contact syncPrivateGroupWithContact(txn, s, true); // Broadcast an event @@ -197,6 +204,9 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { return abort(txn, s); // Mark the response visible in the UI markMessageVisibleInUi(txn, m.getId(), true); + // Track the message + messageTracker.trackMessage(txn, m.getContactGroupId(), + m.getTimestamp(), false); // Broadcast an event ContactId contactId = getContactId(txn, m.getContactGroupId()); txn.attach(new GroupInvitationResponseReceivedEvent(contactId, diff --git a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java index 1526e23bd923ac65e3c4257d6f68a01643379e0a..60579d46f5c4339a441092788c5d418a2c535664 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java @@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; +import org.briarproject.api.clients.MessageTracker; import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.clients.SessionId; import org.briarproject.api.contact.ContactId; @@ -40,10 +41,11 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, Clock clock) { + MessageEncoder messageEncoder, MessageTracker messageTracker, + Clock clock) { super(db, clientHelper, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, clock); + messageEncoder, messageTracker, clock); } @Override @@ -150,6 +152,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { markMessageAvailableToAnswer(txn, inviteId, false); // Send a JOIN message Message sent = sendJoinMessage(txn, s, true); + // Track the message + messageTracker.trackOutgoingMessage(txn, sent); try { // Subscribe to the private group subscribeToPrivateGroup(txn, inviteId); @@ -172,6 +176,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { markMessageAvailableToAnswer(txn, inviteId, false); // Send a LEAVE message Message sent = sendLeaveMessage(txn, s, true); + // Track the message + messageTracker.trackOutgoingMessage(txn, sent); // Move to the START state return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), @@ -200,6 +206,9 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { // Mark the invite message visible in the UI and available to answer markMessageVisibleInUi(txn, m.getId(), true); markMessageAvailableToAnswer(txn, m.getId(), true); + // Track the message + messageTracker.trackMessage(txn, m.getContactGroupId(), + m.getTimestamp(), false); // Broadcast an event PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup( m.getGroupName(), m.getCreator(), m.getSalt()); diff --git a/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java index 6d3c721f38fea70a2a25c5396abc0e0f54bce442..488c3cc74fde3087e49ca1189980af2c30b89cf3 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/PeerProtocolEngine.java @@ -2,6 +2,7 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; +import org.briarproject.api.clients.MessageTracker; import org.briarproject.api.clients.ProtocolStateException; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; @@ -34,10 +35,11 @@ class PeerProtocolEngine extends AbstractProtocolEngine<PeerSession> { PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, Clock clock) { + MessageEncoder messageEncoder, MessageTracker messageTracker, + Clock clock) { super(db, clientHelper, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, - messageEncoder, clock); + messageEncoder, messageTracker, clock); } @Override diff --git a/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java b/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java index 3c2c9ce84c25a46a9f98a4ae1eb259d7dc0d10e3..ed48f1224135ec32b5c0e6c23e5205f9b8935374 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/ProtocolEngineFactoryImpl.java @@ -1,6 +1,7 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.clients.ClientHelper; +import org.briarproject.api.clients.MessageTracker; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.nullsafety.NotNullByDefault; @@ -24,6 +25,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { private final IdentityManager identityManager; private final MessageParser messageParser; private final MessageEncoder messageEncoder; + private final MessageTracker messageTracker; private final Clock clock; @Inject @@ -32,7 +34,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, - MessageEncoder messageEncoder, + MessageEncoder messageEncoder, MessageTracker messageTracker, Clock clock) { this.db = db; this.clientHelper = clientHelper; @@ -42,6 +44,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { this.identityManager = identityManager; this.messageParser = messageParser; this.messageEncoder = messageEncoder; + this.messageTracker = messageTracker; this.clock = clock; } @@ -49,20 +52,20 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { public ProtocolEngine<CreatorSession> createCreatorEngine() { return new CreatorProtocolEngine(db, clientHelper, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, clock); + messageParser, messageEncoder, messageTracker, clock); } @Override public ProtocolEngine<InviteeSession> createInviteeEngine() { return new InviteeProtocolEngine(db, clientHelper, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, clock); + messageParser, messageEncoder, messageTracker, clock); } @Override public ProtocolEngine<PeerSession> createPeerEngine() { return new PeerProtocolEngine(db, clientHelper, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, clock); + messageParser, messageEncoder, messageTracker, clock); } }