From e00219c15fd03d8a016ad5b7e67b402b61e75bd8 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Tue, 18 Oct 2016 08:49:34 -0200
Subject: [PATCH] Allow responding to sharing invitations based on SessionId

---
 .../api/forum/ForumInvitationRequest.java     |  7 +--
 .../api/sharing/SharingManager.java           | 10 +++-
 .../sharing/SharingManagerImpl.java           | 57 ++++++++++++-------
 3 files changed, 50 insertions(+), 24 deletions(-)

diff --git a/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java b/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java
index 3e90116c0b..5d4c8d5542 100644
--- a/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java
+++ b/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java
@@ -5,16 +5,15 @@ import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.sharing.InvitationRequest;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
-import org.jetbrains.annotations.Nullable;
 
 public class ForumInvitationRequest extends InvitationRequest {
 
 	private final String forumName;
 
 	public ForumInvitationRequest(MessageId id, SessionId sessionId,
-			GroupId groupId, ContactId contactId, String forumName, String message,
-			boolean available, long time, boolean local, boolean sent,
-			boolean seen, boolean read) {
+			GroupId groupId, ContactId contactId, String forumName,
+			String message, boolean available, long time, boolean local,
+			boolean sent, boolean seen, boolean read) {
 
 		super(id, sessionId, groupId, contactId, message, available, time,
 				local, sent, seen, read);
diff --git a/briar-api/src/org/briarproject/api/sharing/SharingManager.java b/briar-api/src/org/briarproject/api/sharing/SharingManager.java
index 3e37191ddd..c7b1c80049 100644
--- a/briar-api/src/org/briarproject/api/sharing/SharingManager.java
+++ b/briar-api/src/org/briarproject/api/sharing/SharingManager.java
@@ -1,6 +1,7 @@
 package org.briarproject.api.sharing;
 
 import org.briarproject.api.clients.MessageTracker;
+import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
@@ -30,7 +31,14 @@ public interface SharingManager<S extends Shareable> extends MessageTracker {
 			throws DbException;
 
 	/**
-	 * Returns all group sharing messages sent by the given contact.
+	 * Responds to a pending group invitation
+	 */
+	void respondToInvitation(SessionId id, boolean accept)
+			throws DbException;
+
+	/**
+	 * Returns all group sharing messages sent by the Contact
+	 * identified by contactId.
 	 */
 	Collection<InvitationMessage> getInvitationMessages(
 			ContactId contactId) throws DbException;
diff --git a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java
index dd06fc2c44..a355018773 100644
--- a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java
+++ b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java
@@ -316,27 +316,23 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 		try {
 			// find session state based on shareable
 			IS localState = getSessionStateForResponse(txn, f, c);
+			respondToInvitation(txn, localState, accept);
+			txn.setComplete();
+		} catch (FormatException e) {
+			throw new DbException(e);
+		} finally {
+			db.endTransaction(txn);
+		}
+	}
 
-			// define action
-			InviteeSessionState.Action localAction;
-			if (accept) {
-				localAction = InviteeSessionState.Action.LOCAL_ACCEPT;
-			} else {
-				localAction = InviteeSessionState.Action.LOCAL_DECLINE;
-			}
-
-			// start engine and process its state update
-			InviteeEngine<IS, IR> engine =
-					new InviteeEngine<IS, IR>(getIRFactory(), clock);
-			StateUpdate<IS, BaseMessage> update =
-					engine.onLocalAction(localState, localAction);
-			processInviteeStateUpdate(txn, null, update);
-
-			// track message
-			// TODO handle this properly without engine hacks (#376)
-			long time = update.toSend.get(0).getTime();
-			trackMessage(txn, localState.getGroupId(), time, true);
+	@Override
+	public void respondToInvitation(SessionId id, boolean accept)
+			throws DbException {
 
+		Transaction txn = db.startTransaction(false);
+		try {
+			IS localState = (IS) getSessionState(txn, id, true);
+			respondToInvitation(txn, localState, accept);
 			txn.setComplete();
 		} catch (FormatException e) {
 			throw new DbException(e);
@@ -345,6 +341,29 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
 		}
 	}
 
+	private void respondToInvitation(Transaction txn, IS localState,
+			boolean accept) throws DbException, FormatException {
+		// define action
+		InviteeSessionState.Action localAction;
+		if (accept) {
+			localAction = InviteeSessionState.Action.LOCAL_ACCEPT;
+		} else {
+			localAction = InviteeSessionState.Action.LOCAL_DECLINE;
+		}
+
+		// start engine and process its state update
+		InviteeEngine<IS, IR> engine =
+				new InviteeEngine<IS, IR>(getIRFactory(), clock);
+		StateUpdate<IS, BaseMessage> update =
+				engine.onLocalAction(localState, localAction);
+		processInviteeStateUpdate(txn, null, update);
+
+		// track message
+		// TODO handle this properly without engine hacks (#376)
+		long time = update.toSend.get(0).getTime();
+		trackMessage(txn, localState.getGroupId(), time, true);
+	}
+
 	@Override
 	public Collection<InvitationMessage> getInvitationMessages(ContactId contactId)
 			throws DbException {
-- 
GitLab