From 04c75c4ed139f02c985eaf29ab544c05c2229533 Mon Sep 17 00:00:00 2001 From: Andrew Comminos Date: Wed, 27 Apr 2016 17:46:39 -0700 Subject: Add channel linking functionality. --- .../java/com/morlunk/jumble/IJumbleService.java | 16 ++++++++++++++ .../java/com/morlunk/jumble/JumbleService.java | 25 ++++++++++++++++++++++ .../com/morlunk/jumble/protocol/ModelHandler.java | 18 +++++++++++----- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/morlunk/jumble/IJumbleService.java b/src/main/java/com/morlunk/jumble/IJumbleService.java index 6e149d0..b7be8ed 100644 --- a/src/main/java/com/morlunk/jumble/IJumbleService.java +++ b/src/main/java/com/morlunk/jumble/IJumbleService.java @@ -222,4 +222,20 @@ public interface IJumbleService { void registerObserver(IJumbleObserver observer); void unregisterObserver(IJumbleObserver observer); + + /** + * Links the provided two channels together. + */ + void linkChannels(IChannel channelA, IChannel channelB); + + /** + * Unlinks the two provided channels. + */ + void unlinkChannels(IChannel channelA, IChannel channelB); + + /** + * Unlinks all channels from the provided channel. + * @param channel The channel to be unlinked. + */ + void unlinkAllChannels(IChannel channel); } diff --git a/src/main/java/com/morlunk/jumble/JumbleService.java b/src/main/java/com/morlunk/jumble/JumbleService.java index 90fa7d7..cbeb45c 100644 --- a/src/main/java/com/morlunk/jumble/JumbleService.java +++ b/src/main/java/com/morlunk/jumble/JumbleService.java @@ -1055,6 +1055,31 @@ public class JumbleService extends Service implements IJumbleService, JumbleConn mCallbacks.unregisterObserver(observer); } + @Override + public void linkChannels(IChannel channelA, IChannel channelB) { + Mumble.ChannelState.Builder csb = Mumble.ChannelState.newBuilder(); + csb.setChannelId(channelA.getId()); + csb.addLinksAdd(channelB.getId()); + getConnection().sendTCPMessage(csb.build(), JumbleTCPMessageType.ChannelState); + } + + @Override + public void unlinkChannels(IChannel channelA, IChannel channelB) { + Mumble.ChannelState.Builder csb = Mumble.ChannelState.newBuilder(); + csb.setChannelId(channelA.getId()); + csb.addLinksRemove(channelB.getId()); + getConnection().sendTCPMessage(csb.build(), JumbleTCPMessageType.ChannelState); + } + + @Override + public void unlinkAllChannels(IChannel channel) { + Mumble.ChannelState.Builder csb = Mumble.ChannelState.newBuilder(); + csb.setChannelId(channel.getId()); + for (IChannel linked : channel.getLinks()) { + csb.addLinksRemove(linked.getId()); + } + getConnection().sendTCPMessage(csb.build(), JumbleTCPMessageType.ChannelState); + } /** * The current connection state of the service. diff --git a/src/main/java/com/morlunk/jumble/protocol/ModelHandler.java b/src/main/java/com/morlunk/jumble/protocol/ModelHandler.java index a14b803..a032532 100644 --- a/src/main/java/com/morlunk/jumble/protocol/ModelHandler.java +++ b/src/main/java/com/morlunk/jumble/protocol/ModelHandler.java @@ -151,18 +151,26 @@ public class ModelHandler extends JumbleTCPMessageListener.Stub { if(msg.getLinksCount() > 0) { channel.clearLinks(); for(int link : msg.getLinksList()) { - channel.addLink(mChannels.get(link)); + Channel linked = mChannels.get(link); + channel.addLink(linked); + linked.addLink(channel); } } if(msg.getLinksRemoveCount() > 0) { - for(int link : msg.getLinksRemoveList()) - channel.removeLink(mChannels.get(link)); + for(int link : msg.getLinksRemoveList()) { + Channel linked = mChannels.get(link); + channel.removeLink(linked); + linked.removeLink(channel); + } } if(msg.getLinksAddCount() > 0) { - for(int link : msg.getLinksAddList()) - channel.addLink(mChannels.get(link)); + for(int link : msg.getLinksAddList()) { + Channel linked = mChannels.get(link); + channel.addLink(linked); + linked.addLink(channel); + } } if(newChannel) -- cgit v1.2.3