mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 06:09:55 +01:00
Merge branch 'remote-transport-properties' into 'master'
Store transport properties received by other means We may receive transport properties while adding a contact, before the first sync connection is made. Store them in the group shared with the contact, flagged as remote properties in the metadata, but don't share them with the contact. Use a version number of zero so any properties synced from the contact will supersede them. See merge request !92
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package org.briarproject.api.properties;
|
package org.briarproject.api.properties;
|
||||||
|
|
||||||
|
import org.briarproject.api.DeviceId;
|
||||||
import org.briarproject.api.TransportId;
|
import org.briarproject.api.TransportId;
|
||||||
import org.briarproject.api.contact.ContactId;
|
import org.briarproject.api.contact.ContactId;
|
||||||
import org.briarproject.api.db.DbException;
|
import org.briarproject.api.db.DbException;
|
||||||
@@ -8,6 +9,13 @@ import java.util.Map;
|
|||||||
|
|
||||||
public interface TransportPropertyManager {
|
public interface TransportPropertyManager {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores the given properties received while adding a contact - they will
|
||||||
|
* be superseded by any properties synced from the contact.
|
||||||
|
*/
|
||||||
|
void addRemoteProperties(ContactId c, DeviceId dev,
|
||||||
|
Map<TransportId, TransportProperties> props) throws DbException;
|
||||||
|
|
||||||
/** Returns the local transport properties for all transports. */
|
/** Returns the local transport properties for all transports. */
|
||||||
Map<TransportId, TransportProperties> getLocalProperties()
|
Map<TransportId, TransportProperties> getLocalProperties()
|
||||||
throws DbException;
|
throws DbException;
|
||||||
|
|||||||
@@ -103,8 +103,10 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
|
|||||||
// Copy the latest local properties into the group
|
// Copy the latest local properties into the group
|
||||||
DeviceId dev = db.getDeviceId();
|
DeviceId dev = db.getDeviceId();
|
||||||
Map<TransportId, TransportProperties> local = getLocalProperties();
|
Map<TransportId, TransportProperties> local = getLocalProperties();
|
||||||
for (Entry<TransportId, TransportProperties> e : local.entrySet())
|
for (Entry<TransportId, TransportProperties> e : local.entrySet()) {
|
||||||
storeMessage(g.getId(), dev, e.getKey(), e.getValue(), 0);
|
storeMessage(g.getId(), dev, e.getKey(), e.getValue(), 1, true,
|
||||||
|
true);
|
||||||
|
}
|
||||||
} catch (DbException e) {
|
} catch (DbException e) {
|
||||||
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
|
||||||
} catch (FormatException e) {
|
} catch (FormatException e) {
|
||||||
@@ -121,16 +123,16 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void storeMessage(GroupId g, DeviceId dev, TransportId t,
|
private void storeMessage(GroupId g, DeviceId dev, TransportId t,
|
||||||
TransportProperties p, long version) throws DbException,
|
TransportProperties p, long version, boolean local, boolean shared)
|
||||||
IOException {
|
throws DbException, IOException {
|
||||||
byte[] body = encodeProperties(dev, t, p, version);
|
byte[] body = encodeProperties(dev, t, p, version);
|
||||||
long now = clock.currentTimeMillis();
|
long now = clock.currentTimeMillis();
|
||||||
Message m = messageFactory.createMessage(g, now, body);
|
Message m = messageFactory.createMessage(g, now, body);
|
||||||
BdfDictionary d = new BdfDictionary();
|
BdfDictionary d = new BdfDictionary();
|
||||||
d.put("transportId", t.getString());
|
d.put("transportId", t.getString());
|
||||||
d.put("version", version);
|
d.put("version", version);
|
||||||
d.put("local", true);
|
d.put("local", local);
|
||||||
db.addLocalMessage(m, CLIENT_ID, metadataEncoder.encode(d), true);
|
db.addLocalMessage(m, CLIENT_ID, metadataEncoder.encode(d), shared);
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeProperties(DeviceId dev, TransportId t,
|
private byte[] encodeProperties(DeviceId dev, TransportId t,
|
||||||
@@ -163,6 +165,23 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRemoteProperties(ContactId c, DeviceId dev,
|
||||||
|
Map<TransportId, TransportProperties> props) throws DbException {
|
||||||
|
lock.writeLock().lock();
|
||||||
|
try {
|
||||||
|
Group g = getContactGroup(db.getContact(c));
|
||||||
|
for (Entry<TransportId, TransportProperties> e : props.entrySet()) {
|
||||||
|
storeMessage(g.getId(), dev, e.getKey(), e.getValue(), 0, false,
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new DbException(e);
|
||||||
|
} finally {
|
||||||
|
lock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<TransportId, TransportProperties> getLocalProperties()
|
public Map<TransportId, TransportProperties> getLocalProperties()
|
||||||
throws DbException {
|
throws DbException {
|
||||||
@@ -292,14 +311,15 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
|
|||||||
}
|
}
|
||||||
// Store the merged properties in the local group
|
// Store the merged properties in the local group
|
||||||
DeviceId dev = db.getDeviceId();
|
DeviceId dev = db.getDeviceId();
|
||||||
long version = latest == null ? 0 : latest.version + 1;
|
long version = latest == null ? 1 : latest.version + 1;
|
||||||
storeMessage(localGroup.getId(), dev, t, merged, version);
|
storeMessage(localGroup.getId(), dev, t, merged, version, true,
|
||||||
|
false);
|
||||||
// Store the merged properties in each contact's group
|
// Store the merged properties in each contact's group
|
||||||
for (Contact c : db.getContacts()) {
|
for (Contact c : db.getContacts()) {
|
||||||
Group g = getContactGroup(c);
|
Group g = getContactGroup(c);
|
||||||
latest = findLatest(g.getId(), true).get(t);
|
latest = findLatest(g.getId(), true).get(t);
|
||||||
version = latest == null ? 0 : latest.version + 1;
|
version = latest == null ? 1 : latest.version + 1;
|
||||||
storeMessage(g.getId(), dev, t, merged, version);
|
storeMessage(g.getId(), dev, t, merged, version, true, true);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new DbException(e);
|
throw new DbException(e);
|
||||||
|
|||||||
Reference in New Issue
Block a user