diff --git a/src/java/com/threerings/presents/dobj/DEvent.java b/src/java/com/threerings/presents/dobj/DEvent.java index 29b757673..abffa797c 100644 --- a/src/java/com/threerings/presents/dobj/DEvent.java +++ b/src/java/com/threerings/presents/dobj/DEvent.java @@ -152,6 +152,23 @@ public abstract class DEvent implements Streamable return _transport; } + /** + * Notes the actual transport with which the event was transmitted. + */ + public void noteActualTransport (Transport transport) + { + _actualTransport = transport; + } + + /** + * Returns the actual transport with which the event was transmitted, or null if + * not yet known. + */ + public Transport getActualTransport () + { + return _actualTransport; + } + /** * Events with associated listener interfaces should implement this function and notify the * supplied listener if it implements their event listening interface. For example, the {@link @@ -195,6 +212,9 @@ public abstract class DEvent implements Streamable /** The transport parameters. */ protected transient Transport _transport = Transport.DEFAULT; + /** The actual transport with which the event was transmitted (null if as yet unknown). */ + protected transient Transport _actualTransport; + /** Used to differentiate between null meaning we haven't initialized our old value and null * being the actual old value. */ protected static final Object UNSET_OLD_VALUE = new Object(); diff --git a/src/java/com/threerings/presents/net/EventNotification.java b/src/java/com/threerings/presents/net/EventNotification.java index ac025b2c3..5435a99af 100644 --- a/src/java/com/threerings/presents/net/EventNotification.java +++ b/src/java/com/threerings/presents/net/EventNotification.java @@ -62,6 +62,12 @@ public class EventNotification extends DownstreamMessage return _event.getTransport(); } + @Override // documentation inherited + public void noteActualTransport (Transport transport) + { + _event.noteActualTransport(transport); + } + @Override public String toString () { diff --git a/src/java/com/threerings/presents/net/Message.java b/src/java/com/threerings/presents/net/Message.java index 98d5eb985..9ea16189b 100644 --- a/src/java/com/threerings/presents/net/Message.java +++ b/src/java/com/threerings/presents/net/Message.java @@ -50,4 +50,14 @@ public abstract class Message extends SimpleStreamableObject { return Transport.DEFAULT; } + + /** + * For messages sent over the network, this notes the actual type of transport used to deliver + * the message. This may not be the same as the hinted transport for various reasons (message + * too large to send as datagram, no datagram connection established, etc.) + */ + public void noteActualTransport (Transport transport) + { + // no-op by default + } } diff --git a/src/java/com/threerings/presents/server/net/ConnectionManager.java b/src/java/com/threerings/presents/server/net/ConnectionManager.java index 8e45c32f5..6704ca395 100644 --- a/src/java/com/threerings/presents/server/net/ConnectionManager.java +++ b/src/java/com/threerings/presents/server/net/ConnectionManager.java @@ -62,6 +62,7 @@ import com.threerings.presents.client.Client; import com.threerings.presents.data.ConMgrStats; import com.threerings.presents.net.Message; import com.threerings.presents.net.PongResponse; +import com.threerings.presents.net.Transport; import com.threerings.presents.server.Authenticator; import com.threerings.presents.server.ChainedAuthenticator; import com.threerings.presents.server.ClientManager; @@ -923,6 +924,9 @@ public class ConnectionManager extends LoopingThread return; } + // note the actual transport + msg.noteActualTransport(Transport.RELIABLE_ORDERED); + _framer.resetFrame(); // flatten this message using the connection's output stream @@ -963,6 +967,9 @@ public class ConnectionManager extends LoopingThread return false; } + // note the actual transport + msg.noteActualTransport(Transport.UNRELIABLE_UNORDERED); + // extract as a byte array byte[] data = _flattener.toByteArray();