From 425d2ddffd30eea3ba416fd539ac2f13a964e6d3 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 23 Sep 2016 12:34:51 +0300 Subject: [PATCH] BroadcastOperations.sendEvent with excludedClient added. #389 --- .../socketio/BroadcastOperations.java | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/BroadcastOperations.java b/src/main/java/com/corundumstudio/socketio/BroadcastOperations.java index d1ded5d..06a4b05 100644 --- a/src/main/java/com/corundumstudio/socketio/BroadcastOperations.java +++ b/src/main/java/com/corundumstudio/socketio/BroadcastOperations.java @@ -15,11 +15,10 @@ */ package com.corundumstudio.socketio; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.List; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -39,28 +38,28 @@ import com.corundumstudio.socketio.store.pubsub.PubSubType; public class BroadcastOperations implements ClientOperations { private final Iterable clients; - private final Map> namespaceRooms = new HashMap>(); private final StoreFactory storeFactory; public BroadcastOperations(Iterable clients, StoreFactory storeFactory) { super(); this.clients = clients; + this.storeFactory = storeFactory; + } + + private void dispatch(Packet packet) { + Map> namespaceRooms = new HashMap>(); for (SocketIOClient socketIOClient : clients) { Namespace namespace = (Namespace)socketIOClient.getNamespace(); Set rooms = namespace.getRooms(socketIOClient); - - List roomsList = namespaceRooms.get(namespace.getName()); + + Set roomsList = namespaceRooms.get(namespace.getName()); if (roomsList == null) { - roomsList = new ArrayList(); + roomsList = new HashSet(); namespaceRooms.put(namespace.getName(), roomsList); } roomsList.addAll(rooms); } - this.storeFactory = storeFactory; - } - - private void dispatch(Packet packet) { - for (Entry> entry : namespaceRooms.entrySet()) { + for (Entry> entry : namespaceRooms.entrySet()) { for (String room : entry.getValue()) { storeFactory.pubSubStore().publish(PubSubType.DISPATCH, new DispatchMessage(room, packet, entry.getKey())); } @@ -93,6 +92,21 @@ public class BroadcastOperations implements ClientOperations { } } + public void sendEvent(String name, SocketIOClient excludedClient, Object... data) { + Packet packet = new Packet(PacketType.MESSAGE); + packet.setSubType(PacketType.EVENT); + packet.setName(name); + packet.setData(Arrays.asList(data)); + + for (SocketIOClient client : clients) { + if (client.getSessionId().equals(excludedClient.getSessionId())) { + continue; + } + client.send(packet); + } + dispatch(packet); + } + @Override public void sendEvent(String name, Object... data) { Packet packet = new Packet(PacketType.MESSAGE); @@ -108,5 +122,16 @@ public class BroadcastOperations implements ClientOperations { } ackCallback.loopFinished(); } + + public void sendEvent(String name, Object data, SocketIOClient excludedClient, BroadcastAckCallback ackCallback) { + for (SocketIOClient client : clients) { + if (client.getSessionId().equals(excludedClient.getSessionId())) { + continue; + } + client.sendEvent(name, ackCallback.createClientCallback(client), data); + } + ackCallback.loopFinished(); + } + }