Use database events to trigger transmission of packets.

This commit is contained in:
akwizgran
2013-01-30 20:28:52 +00:00
parent 520b6da5ac
commit 43e1014d6c

View File

@@ -21,16 +21,22 @@ import java.util.logging.Logger;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.FormatException; import net.sf.briar.api.FormatException;
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.DatabaseExecutor; import net.sf.briar.api.db.DatabaseExecutor;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.db.event.ContactRemovedEvent; import net.sf.briar.api.db.event.ContactRemovedEvent;
import net.sf.briar.api.db.event.DatabaseEvent; import net.sf.briar.api.db.event.DatabaseEvent;
import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.DatabaseListener;
import net.sf.briar.api.db.event.LocalRetentionTimeUpdatedEvent;
import net.sf.briar.api.db.event.LocalSubscriptionsUpdatedEvent; import net.sf.briar.api.db.event.LocalSubscriptionsUpdatedEvent;
import net.sf.briar.api.db.event.LocalTransportsUpdatedEvent; import net.sf.briar.api.db.event.LocalTransportsUpdatedEvent;
import net.sf.briar.api.db.event.MessageAddedEvent; import net.sf.briar.api.db.event.MessageAddedEvent;
import net.sf.briar.api.db.event.MessageReceivedEvent; import net.sf.briar.api.db.event.MessageReceivedEvent;
import net.sf.briar.api.db.event.RatingChangedEvent;
import net.sf.briar.api.db.event.RemoteRetentionTimeUpdatedEvent;
import net.sf.briar.api.db.event.RemoteSubscriptionsUpdatedEvent;
import net.sf.briar.api.db.event.RemoteTransportsUpdatedEvent;
import net.sf.briar.api.messaging.Ack; import net.sf.briar.api.messaging.Ack;
import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.Message;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
@@ -122,22 +128,33 @@ abstract class DuplexConnection implements DatabaseListener {
throws IOException; throws IOException;
public void eventOccurred(DatabaseEvent e) { public void eventOccurred(DatabaseEvent e) {
if(e instanceof MessageReceivedEvent) { if(e instanceof ContactRemovedEvent) {
dbExecutor.execute(new GenerateAcks()); ContactRemovedEvent c = (ContactRemovedEvent) e;
} else if(e instanceof ContactRemovedEvent) { if(contactId.equals(c.getContactId())) dispose(false, true);
ContactId c = ((ContactRemovedEvent) e).getContactId(); } else if(e instanceof LocalRetentionTimeUpdatedEvent) {
if(contactId.equals(c)) dispose(false, true); dbExecutor.execute(new GenerateRetentionUpdate());
} else if(e instanceof LocalSubscriptionsUpdatedEvent) {
LocalSubscriptionsUpdatedEvent l =
(LocalSubscriptionsUpdatedEvent) e;
if(l.getAffectedContacts().contains(contactId))
dbExecutor.execute(new GenerateSubscriptionUpdate());
} else if(e instanceof LocalTransportsUpdatedEvent) {
dbExecutor.execute(new GenerateTransportUpdates());
} else if(e instanceof MessageAddedEvent) { } else if(e instanceof MessageAddedEvent) {
if(canSendOffer.getAndSet(false)) if(canSendOffer.getAndSet(false))
dbExecutor.execute(new GenerateOffer()); dbExecutor.execute(new GenerateOffer());
} else if(e instanceof LocalSubscriptionsUpdatedEvent) { } else if(e instanceof MessageReceivedEvent) {
Collection<ContactId> affected = dbExecutor.execute(new GenerateAcks());
((LocalSubscriptionsUpdatedEvent) e).getAffectedContacts(); } else if(e instanceof RatingChangedEvent) {
if(affected.contains(contactId)) { RatingChangedEvent r = (RatingChangedEvent) e;
dbExecutor.execute(new GenerateSubscriptionUpdate()); if(r.getRating() == Rating.GOOD && canSendOffer.getAndSet(false))
} dbExecutor.execute(new GenerateOffer());
} else if(e instanceof LocalTransportsUpdatedEvent) { } else if(e instanceof RemoteRetentionTimeUpdatedEvent) {
dbExecutor.execute(new GenerateTransportUpdate()); dbExecutor.execute(new GenerateRetentionAck());
} else if(e instanceof RemoteSubscriptionsUpdatedEvent) {
dbExecutor.execute(new GenerateSubscriptionAck());
} else if(e instanceof RemoteTransportsUpdatedEvent) {
dbExecutor.execute(new GenerateTransportAcks());
} }
} }
@@ -213,13 +230,14 @@ abstract class DuplexConnection implements DatabaseListener {
transport.shouldFlush()); transport.shouldFlush());
// Send the initial packets: updates, acks, offer // Send the initial packets: updates, acks, offer
dbExecutor.execute(new GenerateTransportAcks()); dbExecutor.execute(new GenerateTransportAcks());
dbExecutor.execute(new GenerateTransportUpdate()); dbExecutor.execute(new GenerateTransportUpdates());
dbExecutor.execute(new GenerateSubscriptionAck()); dbExecutor.execute(new GenerateSubscriptionAck());
dbExecutor.execute(new GenerateSubscriptionUpdate()); dbExecutor.execute(new GenerateSubscriptionUpdate());
dbExecutor.execute(new GenerateRetentionAck()); dbExecutor.execute(new GenerateRetentionAck());
dbExecutor.execute(new GenerateRetentionUpdate()); dbExecutor.execute(new GenerateRetentionUpdate());
dbExecutor.execute(new GenerateAcks()); dbExecutor.execute(new GenerateAcks());
dbExecutor.execute(new GenerateOffer()); if(canSendOffer.getAndSet(false))
dbExecutor.execute(new GenerateOffer());
// Main loop // Main loop
while(true) { while(true) {
Runnable task = writerTasks.take(); Runnable task = writerTasks.take();
@@ -693,7 +711,7 @@ abstract class DuplexConnection implements DatabaseListener {
} }
// This task runs on a database thread // This task runs on a database thread
private class GenerateTransportUpdate implements Runnable { private class GenerateTransportUpdates implements Runnable {
public void run() { public void run() {
try { try {