Полная реализация синхронизации
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package im.rosetta.service.dispatch;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import im.rosetta.Failures;
|
||||
@@ -96,6 +97,11 @@ public class MessageDispatcher {
|
||||
* Сохраняем сообщение в буфер на случай если получатель офлайн, или нам нужна будет синхронизация сообщений для получателя
|
||||
*/
|
||||
this.bufferService.pushPacketToBuffer(fromPublicKey, toPublicKey, packet);
|
||||
|
||||
/**
|
||||
* Ретранслируем сообщение всем авторизованным сессиям отправителя, чтобы синхронизировать отправленные сообщения
|
||||
*/
|
||||
this.retranslate(packet, client);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,5 +117,34 @@ public class MessageDispatcher {
|
||||
this.sendPeer(packet, client, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Сообщает всем авторизованным сессиям отправителя о том, что он отправил сообщения,
|
||||
* для того чтобы синхронизировать отправленные сообщения на всех устройствах отправителя
|
||||
* @param packet пакет сообщения
|
||||
* @param client клиент отправляющий пакет
|
||||
* @throws ProtocolException
|
||||
*/
|
||||
public void retranslate(PacketBaseDialog packet, Client client) throws ProtocolException {
|
||||
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
|
||||
HashSet<Client> clients = this.clientManager.getClientIndexer()
|
||||
.getClients(ECIAuthentificate.class, "publicKey", eciAuthentificate.getPublicKey());
|
||||
if(clients == null){
|
||||
/**
|
||||
* Нет авторизованных сессий с таким публичным ключом
|
||||
*/
|
||||
return;
|
||||
}
|
||||
for(Client c : clients){
|
||||
/**
|
||||
* Проходим по всем устройствам с таким публичным ключом и ретранслируем им пакет, кроме того устройства что
|
||||
* отправило пакет
|
||||
*/
|
||||
if(c.equals(client)){
|
||||
continue;
|
||||
}
|
||||
c.send(packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user