[Red5commits] [1647] added support for shared objects when using AMF3

jbauch luke at codegent.com
Wed Jan 24 11:14:05 EST 2007


added support for shared objects when using AMF3


Timestamp: 01/23/07 16:16:56 EST (19 hours ago) 
Change: 1647 
Author: jbauch

Files (see diff or trac for details): 
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/BaseRTMPHandler.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventDecoder.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventEncoder.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/event/FlexMessage.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/message/Constants.java
java/server/branches/joachim_amf3_integration/src/org/red5/server/so/FlexSharedObjectMessage.java


Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1647

Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/so/FlexSharedObjectMessage.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/so/FlexSharedObjectMessage.java (revision 1647)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/so/FlexSharedObjectMessage.java (revision 1647)
@@ -0,0 +1,39 @@
+package org.red5.server.so;
+
+import org.red5.server.api.event.IEventListener;
+
+public class FlexSharedObjectMessage extends SharedObjectMessage {
+
+    /**
+     * Creates Flex2 Shared Object event with given name, version and persistence flag
+     *
+     * @param name          Event name
+     * @param version       SO version
+     * @param persistent    SO persistence flag
+     */
+    public FlexSharedObjectMessage(String name, int version, boolean persistent) {
+		this(null, name, version, persistent);
+	}
+
+    /**
+     * Creates Flex2 Shared Object event with given listener, name, SO version and persistence flag
+     *
+     * @param source         Event listener
+     * @param name           Event name
+     * @param version        SO version
+     * @param persistent     SO persistence flag
+     */
+    public FlexSharedObjectMessage(IEventListener source, String name, int version,
+			boolean persistent) {
+    	super(source, name, version, persistent);
+    	
+    }
+
+	/** {@inheritDoc} */
+    @Override
+	public byte getDataType() {
+		return TYPE_FLEX_SHARED_OBJECT;
+	}
+
+
+}
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/event/FlexMessage.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/event/FlexMessage.java (revision 1606)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/event/FlexMessage.java (revision 1647)
@@ -10,7 +10,7 @@
 	}
 	
-	@Override
+	/** {@inheritDoc} */
+    @Override
 	public byte getDataType() {
-		// TODO Auto-generated method stub
 		return TYPE_FLEX_MESSAGE;
 	}
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/message/Constants.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/message/Constants.java (revision 1628)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/message/Constants.java (revision 1647)
@@ -69,6 +69,11 @@
     public static final byte TYPE_VIDEO_DATA = 0x09;
 
-	// Unknown: 0x0A ...  0x10
-
+	// Unknown: 0x0A ...  0x0F
+
+    /**
+     * AMF3 shared object
+     */
+    public static final byte TYPE_FLEX_SHARED_OBJECT = 0x10;
+    
     /**
      * AMF3 message
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/BaseRTMPHandler.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/BaseRTMPHandler.java (revision 1631)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/BaseRTMPHandler.java (revision 1647)
@@ -157,4 +157,5 @@
 						((IEventDispatcher) stream).dispatchEvent(message);
 					break;
+				case TYPE_FLEX_SHARED_OBJECT:
 				case TYPE_SHARED_OBJECT:
 					onSharedObject(conn, channel, header,
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventDecoder.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventDecoder.java (revision 1631)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventDecoder.java (revision 1647)
@@ -60,4 +60,12 @@
 
     /**
+     * Decodes shared object message event from AMF3 encoding
+     * @param in                     Byte buffer to decode
+     * @param rtmp					 RTMP protocol state
+     * @return                       ISharedObjectMessage event
+     */
+	public abstract ISharedObjectMessage decodeFlexSharedObject(ByteBuffer in, RTMP rtmp);
+
+    /**
      * Decodes notification event
      * @param in                     Byte buffer to decode
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java (revision 1631)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java (revision 1647)
@@ -26,7 +26,5 @@
 import org.red5.io.object.Serializer;
 import org.red5.io.utils.BufferUtils;
-import org.red5.server.api.IConnection;
 import org.red5.server.api.IConnection.Encoding;
-import org.red5.server.api.Red5;
 import org.red5.server.api.service.IPendingServiceCall;
 import org.red5.server.api.service.IServiceCall;
@@ -69,17 +67,4 @@
      */
     private Serializer serializer;
-
-    /**
-     * Creates output object from byte buffer
-     * @param buffer
-     * @return
-     */
-    private Output getOutput(RTMP rtmp, ByteBuffer buffer) {
-		if (rtmp.getEncoding() == Encoding.AMF3) {
-			return new org.red5.io.amf3.Output(buffer);
-		} else {
-			return new org.red5.io.amf.Output(buffer);
-		}
-	}
 
 	/** {@inheritDoc} */
@@ -250,4 +235,6 @@
 			case TYPE_VIDEO_DATA:
 				return encodeVideoData((VideoData) message);
+			case TYPE_FLEX_SHARED_OBJECT:
+				return encodeFlexSharedObject((ISharedObjectMessage) message, rtmp);
 			case TYPE_SHARED_OBJECT:
 				return encodeSharedObject((ISharedObjectMessage) message, rtmp);
@@ -259,4 +246,5 @@
 				return encodeFlexMessage((FlexMessage) message, rtmp);
 			default:
+				log.warn("Unknown object type: " + header.getDataType());
 				return null;
 		}
@@ -294,9 +282,29 @@
 
 	/** {@inheritDoc} */
-    public ByteBuffer encodeSharedObject(ISharedObjectMessage so, RTMP rtmp) {
-
+    public ByteBuffer encodeFlexSharedObject(ISharedObjectMessage so, RTMP rtmp) {
 		final ByteBuffer out = ByteBuffer.allocate(128);
 		out.setAutoExpand(true);
-		final Output output = getOutput(rtmp, out);
+		out.put((byte) 0x00);
+    	doEncodeSharedObject(so, rtmp, out);
+    	return out;
+    }
+    
+	/** {@inheritDoc} */
+    public ByteBuffer encodeSharedObject(ISharedObjectMessage so, RTMP rtmp) {
+		final ByteBuffer out = ByteBuffer.allocate(128);
+		out.setAutoExpand(true);
+    	doEncodeSharedObject(so, rtmp, out);
+    	return out;
+    }
+
+    /**
+     * Perform the actual encoding of the shared object contents.
+     * 
+     * @param so
+     * @param rtmp
+     * @param out
+     */
+    public void doEncodeSharedObject(ISharedObjectMessage so, RTMP rtmp, ByteBuffer out) {
+		final Output output = new org.red5.io.amf.Output(out);
 
 		output.putString(so.getName());
@@ -409,5 +417,4 @@
             }
         }
-        return out;
 	}
 
@@ -469,5 +476,9 @@
 			output = new org.red5.io.amf.Output(out);
 		} else {
-			output = getOutput(rtmp, out);
+			if (rtmp.getEncoding() == Encoding.AMF3) {
+				output = new org.red5.io.amf3.Output(out);
+			} else {
+				output = new org.red5.io.amf.Output(out);
+			}
 		}
 		
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventEncoder.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventEncoder.java (revision 1631)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/IEventEncoder.java (revision 1647)
@@ -101,3 +101,11 @@
     public abstract ByteBuffer encodeSharedObject(ISharedObjectMessage so, RTMP rtmp);
 
+    /**
+     * Encodes SharedObjectMessage event to byte buffer using AMF3 encoding
+     * @param so                 ISharedObjectMessage event
+     * @param rtmp			 RTMP protocol state
+     * @return                   Byte buffer
+     */
+    public ByteBuffer encodeFlexSharedObject(ISharedObjectMessage so, RTMP rtmp);
+
 }
Index: /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
===================================================================
--- /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java (revision 1631)
+++ /java/server/branches/joachim_amf3_integration/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java (revision 1647)
@@ -27,7 +27,5 @@
 import org.red5.io.object.Input;
 import org.red5.io.utils.BufferUtils;
-import org.red5.server.api.IConnection;
 import org.red5.server.api.IConnection.Encoding;
-import org.red5.server.api.Red5;
 import org.red5.server.net.protocol.ProtocolException;
 import org.red5.server.net.protocol.ProtocolState;
@@ -41,4 +39,5 @@
 import org.red5.server.service.Call;
 import org.red5.server.service.PendingCall;
+import org.red5.server.so.FlexSharedObjectMessage;
 import org.red5.server.so.ISharedObjectEvent;
 import org.red5.server.so.ISharedObjectMessage;
@@ -74,19 +73,4 @@
     public RTMPProtocolDecoder() {
 
-	}
-
-    /**
-     * Return input (data values provider) object from byte buffer. 
-     *
-     * @param rtmp			RTMP protocol state
-     * @param buffer        Byte buffer
-     * @return              Input object
-     */
-    private Input getInput(RTMP rtmp, ByteBuffer buffer) {
-		if (rtmp.getEncoding() == Encoding.AMF3) {
-			return new org.red5.io.amf3.Input(buffer);
-		} else {
-			return new org.red5.io.amf.Input(buffer);
-		}
 	}
 
@@ -425,4 +409,7 @@
 				message = decodeVideoData(in);
 				break;
+			case TYPE_FLEX_SHARED_OBJECT:
+				message = decodeFlexSharedObject(in, rtmp);
+				break;
 			case TYPE_SHARED_OBJECT:
 				message = decodeSharedObject(in, rtmp);
@@ -438,4 +425,5 @@
 				break;
 			default:
+				log.warn("Unknown object type: " + header.getDataType());
 				message = decodeUnknown(header.getDataType(), in);
 				break;
@@ -475,7 +463,8 @@
 
 	/** {@inheritDoc} */
-	public ISharedObjectMessage decodeSharedObject(ByteBuffer in, RTMP rtmp) {
-
-		final Input input = getInput(rtmp, in);
+	public ISharedObjectMessage decodeFlexSharedObject(ByteBuffer in, RTMP rtmp) {
+		// Unknown byte, always 0?
+		in.skip(1);
+		final Input input = new org.red5.io.amf.Input(in);
 		String name = input.getString();
 		// Read version of SO to modify
@@ -486,7 +475,35 @@
 		in.skip(4);
 
-		final SharedObjectMessage so = new SharedObjectMessage(null, name,
+		final SharedObjectMessage so = new FlexSharedObjectMessage(null, name,
 				version, persistent);
-
+		doDecodeSharedObject(so, in, input);
+		return so;
+	}
+	
+	/** {@inheritDoc} */
+	public ISharedObjectMessage decodeSharedObject(ByteBuffer in, RTMP rtmp) {
+		final Input input = new org.red5.io.amf.Input(in);
+		String name = input.getString();
+		// Read version of SO to modify
+		int version = in.getInt();
+		// Read persistence informations
+		boolean persistent = in.getInt() == 2;
+		// Skip unknown bytes
+		in.skip(4);
+
+		final SharedObjectMessage so = new FlexSharedObjectMessage(null, name,
+				version, persistent);
+		doDecodeSharedObject(so, in, input);
+		return so;
+	}
+
+	/**
+	 * Perform the actual decoding of the shared object contents.
+	 * 
+	 * @param so
+	 * @param in
+	 * @param rtmp
+	 */
+	protected void doDecodeSharedObject(SharedObjectMessage so, ByteBuffer in, Input input) {
 		// Parse request body
 		while (in.hasRemaining()) {
@@ -541,5 +558,4 @@
 			so.addEvent(type, key, value);
 		}
-		return so;
 	}
 
@@ -585,5 +601,9 @@
 		// TODO: we should use different code depending on server or client mode
 		int start = in.position();
-		Input input = getInput(rtmp, in);
+		Input input;
+		if (rtmp.getEncoding() == Encoding.AMF3)
+			input = new org.red5.io.amf3.Input(in);
+		else
+			input = new org.red5.io.amf.Input(in);
 
 		String action = (String) deserializer.deserialize(input);


Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.



More information about the Red5commits mailing list