diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java index 84b4b3028..a3bc6f007 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java @@ -29,6 +29,12 @@ public interface IntroductionManager extends ConversationClient { */ boolean canIntroduce(Contact c1, Contact c2) throws DbException; + /** + * Returns true if both contacts can be introduced at this moment. + */ + boolean canIntroduce(Transaction txn, Contact c1, Contact c2) + throws DbException; + /** * The current minor version of the introduction client. */ @@ -40,6 +46,12 @@ public interface IntroductionManager extends ConversationClient { void makeIntroduction(Contact c1, Contact c2, @Nullable String text) throws DbException; + /** + * Sends two initial introduction messages. + */ + void makeIntroduction(Transaction txn, Contact c1, Contact c2, + @Nullable String text) throws DbException; + /** * Responds to an introduction. */ diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java index ceeb8d9c6..756231bd8 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java @@ -52,11 +52,21 @@ public interface PrivateGroupManager { void addPrivateGroup(Transaction txn, PrivateGroup group, GroupMessage joinMsg, boolean creator) throws DbException; + /** + * Removes a dissolved private group. + */ + void removePrivateGroup(Transaction txn, GroupId g) throws DbException; + /** * Removes a dissolved private group. */ void removePrivateGroup(GroupId g) throws DbException; + /** + * Returns the ID of the user's previous message sent to the group + */ + MessageId getPreviousMsgId(Transaction txn, GroupId g) throws DbException; + /** * Returns the ID of the user's previous message sent to the group */ @@ -112,7 +122,8 @@ public interface PrivateGroupManager { /** * Returns true if the given private group was created by us. */ - boolean isOurPrivateGroup(Transaction txn, PrivateGroup g) throws DbException; + boolean isOurPrivateGroup(Transaction txn, PrivateGroup g) + throws DbException; /** * Returns the text of the private group message with the given ID. @@ -161,6 +172,12 @@ public interface PrivateGroupManager { */ GroupCount getGroupCount(GroupId g) throws DbException; + /** + * Marks a message as read or unread and updates the group count. + */ + void setReadFlag(Transaction txn, GroupId g, MessageId m, boolean read) + throws DbException; + /** * Marks a message as read or unread and updates the group count. */ diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index b3b1a6077..e3bfb9943 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -300,36 +300,37 @@ class IntroductionManagerImpl extends ConversationClientImpl @Override public boolean canIntroduce(Contact c1, Contact c2) throws DbException { - Transaction txn = db.startTransaction(true); + return db.transactionWithResult(true, + txn -> canIntroduce(txn, c1, c2)); + } + + public boolean canIntroduce(Transaction txn, Contact c1, Contact c2) + throws DbException { try { - boolean can = canIntroduce(txn, c1, c2); - db.commitTransaction(txn); - return can; + // Look up the session, if there is one + Author introducer = identityManager.getLocalAuthor(txn); + SessionId sessionId = + crypto.getSessionId(introducer, c1.getAuthor(), + c2.getAuthor()); + StoredSession ss = getSession(txn, sessionId); + if (ss == null) return true; + IntroducerSession session = + sessionParser.parseIntroducerSession(ss.bdfSession); + return session.getState().isComplete(); } catch (FormatException e) { throw new DbException(e); - } finally { - db.endTransaction(txn); } } - private boolean canIntroduce(Transaction txn, Contact c1, Contact c2) - throws DbException, FormatException { - // Look up the session, if there is one - Author introducer = identityManager.getLocalAuthor(txn); - SessionId sessionId = - crypto.getSessionId(introducer, c1.getAuthor(), - c2.getAuthor()); - StoredSession ss = getSession(txn, sessionId); - if (ss == null) return true; - IntroducerSession session = - sessionParser.parseIntroducerSession(ss.bdfSession); - return session.getState().isComplete(); + public void makeIntroduction(Contact c1, Contact c2, @Nullable String text) + throws DbException { + db.transaction(false, + txn -> makeIntroduction(txn, c1, c2, text)); } @Override - public void makeIntroduction(Contact c1, Contact c2, @Nullable String text) - throws DbException { - Transaction txn = db.startTransaction(false); + public void makeIntroduction(Transaction txn, Contact c1, Contact c2, + @Nullable String text) throws DbException { try { // Look up the session, if there is one Author introducer = identityManager.getLocalAuthor(txn); @@ -363,11 +364,8 @@ class IntroductionManagerImpl extends ConversationClientImpl session = introducerEngine.onRequestAction(txn, session, text); // Store the updated session storeSession(txn, storageId, session); - db.commitTransaction(txn); } catch (FormatException e) { throw new DbException(e); - } finally { - db.endTransaction(txn); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java index 088cbc4ce..1e06214ca 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java @@ -150,40 +150,35 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook } @Override - public void removePrivateGroup(GroupId g) throws DbException { - Transaction txn = db.startTransaction(false); - try { - for (PrivateGroupHook hook : hooks) { - hook.removingGroup(txn, g); - } - Group group = db.getGroup(txn, g); - db.removeGroup(txn, group); - db.commitTransaction(txn); - } finally { - db.endTransaction(txn); + public void removePrivateGroup(Transaction txn, GroupId g) + throws DbException { + for (PrivateGroupHook hook : hooks) { + hook.removingGroup(txn, g); } + Group group = db.getGroup(txn, g); + db.removeGroup(txn, group); + } + + @Override + public void removePrivateGroup(GroupId g) throws DbException { + db.transaction(false, txn -> removePrivateGroup(txn, g)); } @Override public MessageId getPreviousMsgId(GroupId g) throws DbException { - MessageId previousMsgId; - Transaction txn = db.startTransaction(true); - try { - previousMsgId = getPreviousMsgId(txn, g); - db.commitTransaction(txn); - } catch (FormatException e) { - throw new DbException(e); - } finally { - db.endTransaction(txn); - } - return previousMsgId; + return db.transactionWithResult(true, + txn -> getPreviousMsgId(txn, g)); } - private MessageId getPreviousMsgId(Transaction txn, GroupId g) - throws DbException, FormatException { - BdfDictionary d = clientHelper.getGroupMetadataAsDictionary(txn, g); - byte[] previousMsgIdBytes = d.getRaw(KEY_PREVIOUS_MSG_ID); - return new MessageId(previousMsgIdBytes); + public MessageId getPreviousMsgId(Transaction txn, GroupId g) + throws DbException { + try { + BdfDictionary d = clientHelper.getGroupMetadataAsDictionary(txn, g); + byte[] previousMsgIdBytes = d.getRaw(KEY_PREVIOUS_MSG_ID); + return new MessageId(previousMsgIdBytes); + } catch (FormatException e) { + throw new DbException(e); + } } private void setPreviousMsgId(Transaction txn, GroupId g, @@ -483,11 +478,16 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook return messageTracker.getGroupCount(g); } + @Override + public void setReadFlag(Transaction txn, GroupId g, MessageId m, + boolean read) throws DbException { + messageTracker.setReadFlag(txn, g, m, read); + } + @Override public void setReadFlag(GroupId g, MessageId m, boolean read) throws DbException { - db.transaction(false, txn -> - messageTracker.setReadFlag(txn, g, m, read)); + db.transaction(false, txn -> setReadFlag(txn, g, m, read)); } @Override