From 5bde14c694b9a9547bba3e3ee0dea1a564db984c Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Thu, 18 Feb 2016 14:46:43 -0200 Subject: [PATCH] Add a `contactExists()` method to the `contactManager` This requires exposing the `containsContact()` method to the `DatabaseComponent` and is needed for finding out efficiently whether a contact already exists. --- .../api/contact/ContactManager.java | 9 +++++++++ .../api/db/DatabaseComponent.java | 7 +++++++ .../contact/ContactManagerImpl.java | 20 +++++++++++++++++++ .../db/DatabaseComponentImpl.java | 8 ++++++++ 4 files changed, 44 insertions(+) diff --git a/briar-api/src/org/briarproject/api/contact/ContactManager.java b/briar-api/src/org/briarproject/api/contact/ContactManager.java index 183378060f..f18bd1dc3b 100644 --- a/briar-api/src/org/briarproject/api/contact/ContactManager.java +++ b/briar-api/src/org/briarproject/api/contact/ContactManager.java @@ -5,6 +5,7 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; import org.briarproject.api.identity.Author; import org.briarproject.api.identity.AuthorId; +import org.briarproject.api.identity.LocalAuthor; import java.util.Collection; @@ -44,6 +45,14 @@ public interface ContactManager { /** Marks a contact as active or inactive. */ void setContactActive(ContactId c, boolean active) throws DbException; + /** Return true if a contact with this name and public key already exists */ + boolean contactExists(Transaction txn, AuthorId remoteAuthorID, + AuthorId localAuthorId) throws DbException; + + /** Return true if a contact with this name and public key already exists */ + boolean contactExists(AuthorId remoteAuthorID, AuthorId localAuthorId) + throws DbException; + interface AddContactHook { void addingContact(Transaction txn, Contact c) throws DbException; } diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java index 2292bc0ba2..a360fa98b6 100644 --- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java +++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java @@ -162,6 +162,13 @@ public interface DatabaseComponent { Collection<ContactId> getContacts(Transaction txn, AuthorId a) throws DbException; + /** + * Returns true if the database contains the given contact for the given + * local pseudonym. + */ + boolean containsContact(Transaction txn, AuthorId remote, AuthorId local) + throws DbException; + /** * Returns the unique ID for this device. * <p/> diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java index e04878d43f..23ec838802 100644 --- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java +++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java @@ -125,6 +125,26 @@ class ContactManagerImpl implements ContactManager, RemoveIdentityHook { } } + @Override + public boolean contactExists(Transaction txn, AuthorId remoteAuthorID, + AuthorId localAuthorId) throws DbException { + return db.containsContact(txn, remoteAuthorID, localAuthorId); + } + + @Override + public boolean contactExists(AuthorId remoteAuthorID, + AuthorId localAuthorId) throws DbException { + boolean exists = false; + Transaction txn = db.startTransaction(true); + try { + exists = contactExists(txn, remoteAuthorID, localAuthorId); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + return exists; + } + private void removeContact(Transaction txn, ContactId c) throws DbException { Contact contact = db.getContact(txn, c); diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java index d001599035..150d0a43a2 100644 --- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java +++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java @@ -342,6 +342,14 @@ class DatabaseComponentImpl<T> implements DatabaseComponent { return db.getContacts(txn, a); } + public boolean containsContact(Transaction transaction, AuthorId remote, + AuthorId local) throws DbException { + T txn = unbox(transaction); + if (!db.containsLocalAuthor(txn, local)) + throw new NoSuchLocalAuthorException(); + return db.containsContact(txn, remote, local); + } + public DeviceId getDeviceId(Transaction transaction) throws DbException { T txn = unbox(transaction); return db.getDeviceId(txn); -- GitLab