diff --git a/engine/src/networking/com/jme3/network/Filter.java b/engine/src/networking/com/jme3/network/Filter.java new file mode 100644 index 000000000..72d5cadea --- /dev/null +++ b/engine/src/networking/com/jme3/network/Filter.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2011 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.network; + + +/** + * Determines a true or false value for a given input. + * + * @version $Revision$ + * @author Paul Speed + */ +public interface Filter +{ + /** + * Returns true if the specified input is accepted by this + * filter. + */ + public boolean apply( T input ); +} + + diff --git a/engine/src/networking/com/jme3/network/Server.java b/engine/src/networking/com/jme3/network/Server.java index 9f36e9a33..0a7c0de86 100644 --- a/engine/src/networking/com/jme3/network/Server.java +++ b/engine/src/networking/com/jme3/network/Server.java @@ -50,9 +50,11 @@ public interface Server /** * Sends the specified message to all connected clients that match - * the filter. + * the filter. If no filter is specified then this is the same as + * calling broadcast(message) and the message will be delivered to + * all connections. */ - public void broadcast( Object filter, Message message ); + public void broadcast( Filter filter, Message message ); /** * Start the server so that it will began accepting new connections diff --git a/engine/src/networking/com/jme3/network/base/DefaultServer.java b/engine/src/networking/com/jme3/network/base/DefaultServer.java index c02d28d8a..0328134ae 100644 --- a/engine/src/networking/com/jme3/network/base/DefaultServer.java +++ b/engine/src/networking/com/jme3/network/base/DefaultServer.java @@ -143,17 +143,19 @@ public class DefaultServer implements Server broadcast( null, message ); } - public void broadcast( Object filter, Message message ) + public void broadcast( Filter filter, Message message ) { ByteBuffer buffer = MessageProtocol.messageToBuffer(message, null); - + + FilterAdapter adapter = filter == null ? null : new FilterAdapter(filter); + // Ignore the filter for the moment if( message.isReliable() || fast == null ) { if( reliable == null ) throw new RuntimeException( "No reliable kernel configured" ); - reliable.broadcast( filter, buffer, true ); + reliable.broadcast( adapter, buffer, true ); } else { - fast.broadcast( filter, buffer, false ); + fast.broadcast( adapter, buffer, false ); } } @@ -410,4 +412,21 @@ public class DefaultServer implements Server } } + protected class FilterAdapter implements Filter + { + private Filter delegate; + + public FilterAdapter( Filter delegate ) + { + this.delegate = delegate; + } + + public boolean apply( Endpoint input ) + { + HostedConnection conn = getConnection( input ); + if( conn == null ) + return false; + return delegate.apply(conn); + } + } } diff --git a/engine/src/networking/com/jme3/network/kernel/Kernel.java b/engine/src/networking/com/jme3/network/kernel/Kernel.java index b2b927996..30e69c754 100644 --- a/engine/src/networking/com/jme3/network/kernel/Kernel.java +++ b/engine/src/networking/com/jme3/network/kernel/Kernel.java @@ -35,6 +35,8 @@ package com.jme3.network.kernel; import java.nio.ByteBuffer; import java.util.Collection; +import com.jme3.network.Filter; + /** * Defines the basic byte[] passing messaging * kernel. @@ -58,9 +60,9 @@ public interface Kernel /** * Dispatches the data to all endpoints managed by the - * kernel. 'routing' is currently ignored. + * kernel that match the specified endpoint filter.. */ - public void broadcast( Object routing, ByteBuffer data, boolean reliable ); + public void broadcast( Filter filter, ByteBuffer data, boolean reliable ); /** * Returns true if there are waiting envelopes. diff --git a/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java b/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java index 11ea25c58..bbd94ce2d 100644 --- a/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java +++ b/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java @@ -45,6 +45,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import com.jme3.network.Filter; import com.jme3.network.kernel.*; @@ -111,7 +112,7 @@ public class SelectorKernel extends AbstractKernel } } - public void broadcast( Object routing, ByteBuffer data, boolean reliable ) + public void broadcast( Filter filter, ByteBuffer data, boolean reliable ) { if( !reliable ) throw new UnsupportedOperationException( "Unreliable send not supported by this kernel." ); @@ -122,7 +123,9 @@ public class SelectorKernel extends AbstractKernel // Hand it to all of the endpoints that match our routing for( NioEndpoint p : endpoints.values() ) { - // Does it match the routing information? FIXME + // Does it match the filter? + if( !filter.apply(p) ) + continue; // Give it the data p.send( data, false, false ); diff --git a/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java b/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java index 7e2ed2421..2f66cb65a 100644 --- a/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java +++ b/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java @@ -41,6 +41,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import com.jme3.network.Filter; import com.jme3.network.kernel.*; /** @@ -113,14 +114,16 @@ public class UdpKernel extends AbstractKernel * Dispatches the data to all endpoints managed by the * kernel. 'routing' is currently ignored. */ - public void broadcast( Object routing, ByteBuffer data, boolean reliable ) + public void broadcast( Filter filter, ByteBuffer data, boolean reliable ) { if( reliable ) throw new UnsupportedOperationException( "Reliable send not supported by this kernel." ); // Hand it to all of the endpoints that match our routing for( UdpEndpoint p : socketEndpoints.values() ) { - // Does it match the routing information? FIXME + // Does it match the filter? + if( !filter.apply(p) ) + continue; // Send the data p.send( data );