mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 06:09:55 +01:00
Mark a received message as seen by the sender.
This commit is contained in:
@@ -196,7 +196,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
if (!db.containsGroup(txn, m.getGroupId()))
|
if (!db.containsGroup(txn, m.getGroupId()))
|
||||||
throw new NoSuchGroupException();
|
throw new NoSuchGroupException();
|
||||||
if (!db.containsMessage(txn, m.getId())) {
|
if (!db.containsMessage(txn, m.getId())) {
|
||||||
addMessage(txn, m, DELIVERED, shared);
|
addMessage(txn, m, DELIVERED, shared, null);
|
||||||
transaction.attach(new MessageAddedEvent(m, null));
|
transaction.attach(new MessageAddedEvent(m, null));
|
||||||
transaction.attach(new MessageStateChangedEvent(m.getId(), true,
|
transaction.attach(new MessageStateChangedEvent(m.getId(), true,
|
||||||
DELIVERED));
|
DELIVERED));
|
||||||
@@ -205,12 +205,13 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
db.mergeMessageMetadata(txn, m.getId(), meta);
|
db.mergeMessageMetadata(txn, m.getId(), meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMessage(T txn, Message m, State state, boolean shared)
|
private void addMessage(T txn, Message m, State state, boolean shared,
|
||||||
throws DbException {
|
@Nullable ContactId sender) throws DbException {
|
||||||
db.addMessage(txn, m, state, shared);
|
db.addMessage(txn, m, state, shared);
|
||||||
for (ContactId c : db.getVisibility(txn, m.getGroupId())) {
|
for (ContactId c : db.getVisibility(txn, m.getGroupId())) {
|
||||||
boolean offered = db.removeOfferedMessage(txn, c, m.getId());
|
boolean offered = db.removeOfferedMessage(txn, c, m.getId());
|
||||||
db.addStatus(txn, c, m.getId(), offered, offered);
|
boolean seen = offered || c.equals(sender);
|
||||||
|
db.addStatus(txn, c, m.getId(), seen, seen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -608,11 +609,13 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
if (!db.containsContact(txn, c))
|
if (!db.containsContact(txn, c))
|
||||||
throw new NoSuchContactException();
|
throw new NoSuchContactException();
|
||||||
if (db.containsVisibleGroup(txn, c, m.getGroupId())) {
|
if (db.containsVisibleGroup(txn, c, m.getGroupId())) {
|
||||||
if (!db.containsMessage(txn, m.getId())) {
|
if (db.containsMessage(txn, m.getId())) {
|
||||||
addMessage(txn, m, UNKNOWN, false);
|
db.raiseSeenFlag(txn, c, m.getId());
|
||||||
|
db.raiseAckFlag(txn, c, m.getId());
|
||||||
|
} else {
|
||||||
|
addMessage(txn, m, UNKNOWN, false, c);
|
||||||
transaction.attach(new MessageAddedEvent(m, c));
|
transaction.attach(new MessageAddedEvent(m, c));
|
||||||
}
|
}
|
||||||
db.raiseAckFlag(txn, c, m.getId());
|
|
||||||
transaction.attach(new MessageToAckEvent(c));
|
transaction.attach(new MessageToAckEvent(c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1136,29 +1136,42 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
oneOf(database).startTransaction();
|
oneOf(database).startTransaction();
|
||||||
will(returnValue(txn));
|
will(returnValue(txn));
|
||||||
|
// First time
|
||||||
oneOf(database).containsContact(txn, contactId);
|
oneOf(database).containsContact(txn, contactId);
|
||||||
will(returnValue(true));
|
will(returnValue(true));
|
||||||
|
oneOf(database).containsVisibleGroup(txn, contactId, groupId);
|
||||||
|
will(returnValue(true));
|
||||||
oneOf(database).containsMessage(txn, messageId);
|
oneOf(database).containsMessage(txn, messageId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
oneOf(database).containsVisibleGroup(txn, contactId, groupId);
|
|
||||||
will(returnValue(true));
|
|
||||||
oneOf(database).addMessage(txn, message, UNKNOWN, false);
|
oneOf(database).addMessage(txn, message, UNKNOWN, false);
|
||||||
oneOf(database).getVisibility(txn, groupId);
|
oneOf(database).getVisibility(txn, groupId);
|
||||||
will(returnValue(Collections.singletonList(contactId)));
|
will(returnValue(Collections.singletonList(contactId)));
|
||||||
oneOf(database).removeOfferedMessage(txn, contactId, messageId);
|
oneOf(database).removeOfferedMessage(txn, contactId, messageId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
oneOf(database).addStatus(txn, contactId, messageId, false, false);
|
oneOf(database).addStatus(txn, contactId, messageId, true, true);
|
||||||
|
// Second time
|
||||||
|
oneOf(database).containsContact(txn, contactId);
|
||||||
|
will(returnValue(true));
|
||||||
|
oneOf(database).containsVisibleGroup(txn, contactId, groupId);
|
||||||
|
will(returnValue(true));
|
||||||
|
oneOf(database).containsMessage(txn, messageId);
|
||||||
|
will(returnValue(true));
|
||||||
|
oneOf(database).raiseSeenFlag(txn, contactId, messageId);
|
||||||
oneOf(database).raiseAckFlag(txn, contactId, messageId);
|
oneOf(database).raiseAckFlag(txn, contactId, messageId);
|
||||||
oneOf(database).commitTransaction(txn);
|
oneOf(database).commitTransaction(txn);
|
||||||
// The message was received and added
|
// First time: the message was received and added
|
||||||
oneOf(eventBus).broadcast(with(any(MessageToAckEvent.class)));
|
oneOf(eventBus).broadcast(with(any(MessageToAckEvent.class)));
|
||||||
oneOf(eventBus).broadcast(with(any(MessageAddedEvent.class)));
|
oneOf(eventBus).broadcast(with(any(MessageAddedEvent.class)));
|
||||||
|
// Second time: the message needs to be acked
|
||||||
|
oneOf(eventBus).broadcast(with(any(MessageToAckEvent.class)));
|
||||||
}});
|
}});
|
||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
shutdown);
|
shutdown);
|
||||||
|
|
||||||
Transaction transaction = db.startTransaction(false);
|
Transaction transaction = db.startTransaction(false);
|
||||||
try {
|
try {
|
||||||
|
// Receive the message twice
|
||||||
|
db.receiveMessage(transaction, contactId, message);
|
||||||
db.receiveMessage(transaction, contactId, message);
|
db.receiveMessage(transaction, contactId, message);
|
||||||
transaction.setComplete();
|
transaction.setComplete();
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Reference in New Issue
Block a user