예제 #1
0
		public static DsoAmfBody Read(AMFReader reader, bool isAmf3) {
			reader.Reset();

			ushort targetUriLen = reader.ReadUInt16();
			string targetUri = reader.ReadUTF(targetUriLen); // When the message holds a response from a remote endpoint, the target URI specifies which method on the local client (i.e. reader request originator) should be invoked to handle the response.
			ushort responseUriLen = reader.ReadUInt16();
			string responseUri = reader.ReadUTF(responseUriLen); // The response's target URI is set to the request's response URI with an '/onResult' suffix to denote a success or an '/onStatus' suffix to denote a failure.

			long dataLen = reader.ReadUInt32();
			if (dataLen >= 2147483648) {
				dataLen = -4294967296;
			}

			object bodyObj;
			// Check for AMF3 kAvmPlusObjectType object type
			if (isAmf3) {
				byte typeMarker = reader.ReadByte();
				if (typeMarker == 17) {
					bodyObj = reader.ReadAMF3Data();
				} else {
					bodyObj = reader.ReadData();
				}
			} else {
				bodyObj = reader.ReadData();
			}


			DsoAmfBody body = new DsoAmfBody(targetUri, responseUri, bodyObj);
			return body;
		}
예제 #2
0
        public static DsoAmfBody Read(AMFReader reader, bool isAmf3)
        {
            reader.Reset();

            ushort targetUriLen   = reader.ReadUInt16();
            string targetUri      = reader.ReadUTF(targetUriLen);        // When the message holds a response from a remote endpoint, the target URI specifies which method on the local client (i.e. reader request originator) should be invoked to handle the response.
            ushort responseUriLen = reader.ReadUInt16();
            string responseUri    = reader.ReadUTF(responseUriLen);      // The response's target URI is set to the request's response URI with an '/onResult' suffix to denote a success or an '/onStatus' suffix to denote a failure.

            long dataLen = reader.ReadUInt32();

            if (dataLen >= 2147483648)
            {
                dataLen = -4294967296;
            }

            object bodyObj;

            // Check for AMF3 kAvmPlusObjectType object type
            if (isAmf3)
            {
                byte typeMarker = reader.ReadByte();
                if (typeMarker == 17)
                {
                    bodyObj = reader.ReadAMF3Data();
                }
                else
                {
                    bodyObj = reader.ReadData();
                }
            }
            else
            {
                bodyObj = reader.ReadData();
            }


            DsoAmfBody body = new DsoAmfBody(targetUri, responseUri, bodyObj);

            return(body);
        }
예제 #3
0
        public void Read(byte[] data)
        {
            using (MemoryStream ms = new MemoryStream(data)) {
                using (AMFReader amf = new AMFReader(ms)) {
                    Header = new List <object>();
                    Bodies = new List <object>();


                    // AMF0_VERSION = 0;
                    // AMF1_VERSION = 1; // There is no AMF1 but FMS uses it for some reason, hence special casing.
                    // AMF3_VERSION = 3;
                    ushort version = amf.ReadUInt16();

                    // Number of headers
                    ushort numHeaders = amf.ReadUInt16();
                    while (numHeaders-- > 0)
                    {
                        var head = DsoAmfHeader.Read(amf);
                        if (head != null)
                        {
                            Header.Add(head);
                        }
                    }

                    // Number of bodys
                    ushort numBodies = amf.ReadUInt16();
                    while (numBodies-- > 0)
                    {
                        var body = DsoAmfBody.Read(amf, (version == 3));
                        if (body != null)
                        {
                            Bodies.Add(body);
                        }
                    }
                }
            }
        }