[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