diff options
author | Andrew Comminos <andrew@comminos.com> | 2016-04-28 03:46:39 +0300 |
---|---|---|
committer | Andrew Comminos <andrew@comminos.com> | 2016-04-28 03:46:39 +0300 |
commit | 04c75c4ed139f02c985eaf29ab544c05c2229533 (patch) | |
tree | 9e47ada7ca4effc6e0d4b607a2e971a3c43cfc6f | |
parent | 607255d01c1f50268cb44308c7c05a196212e759 (diff) |
Add channel linking functionality.
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) |