internal static void WriteRTData(Stream stream, RTData instance)
        {
            BinaryWriteMemoryStream ms = (BinaryWriteMemoryStream)PooledObjects.MemoryStreamPool.Pop();

            for (uint index = 1; index < instance.data.Length; index++)
            {
                RTVal entry = instance.data [index];

                if (entry.long_val.HasValue)
                {
                    ProtocolParser.WriteUInt32(ms, index << 3);
                    //ms.WriteByte ((byte)(index << 3));
                    ProtocolParser.WriteZInt64(ms, (long)entry.long_val.Value);
                }
                else if (entry.double_val.HasValue)
                {
                    ProtocolParser.WriteUInt32(ms, (index << 3) | ((uint)1));
                    //ms.WriteByte ((byte)((index << 3) + 1));
                    ms.BinaryWriter.Write((double)entry.double_val.Value);
                }
                else if (entry.float_val.HasValue)
                {
                    ProtocolParser.WriteUInt32(ms, (index << 3) | ((uint)5));
                    //ms.WriteByte ((byte)((index << 3) + 5));
                    ms.BinaryWriter.Write((float)entry.float_val.Value);
                }
                else if (entry.data_val != null || entry.string_val != null || entry.vec_val != null)
                {
                    ProtocolParser.WriteUInt32(ms, (index << 3) | ((uint)2));
                    //ms.WriteByte ((byte)((index << 3) + 2));
                    entry.SerializeLengthDelimited(ms);
                }
            }

#if __WINDOWS__
            var buffer = ms.ToArray();
#else
            var buffer = ms.GetBuffer();
#endif

            global::GameSparks.RT.Proto.ProtocolParser.WriteUInt32(stream, (uint)ms.Position);
            stream.Write(buffer, 0, (int)ms.Position);

            PooledObjects.MemoryStreamPool.Push(ms);
        }
예제 #2
0
        internal void OnBinaryMessageReceived(byte[] message)
        {
            if (stopped)
            {
                if (socket != null)
                {
                    socket.Terminate();
                    socket = null;
                }

                return;
            }

            BinaryWriteMemoryStream ms = new BinaryWriteMemoryStream();
            int length = message.Length;

            ms.Write(message, 0, length);
            ms.Position = 0;

            while (ms.Position < length)
            {
                int    bytesRead;
                Packet p = PooledObjects.PacketPool.Pop();

                if (stopped)
                {
                    return;
                }

                p.Session  = session;
                p.Reliable = true;

                bytesRead = Packet.DeserializeLengthDelimited(ms, ms.BinaryReader, p);

                p.Reliable = p.Reliable.GetValueOrDefault(true);

                OnPacketReceived(p, bytesRead);

                PooledObjects.PacketPool.Push(p);
            }
        }
        /// <summary>Helper: Serialize with a varint length prefix</summary>
        internal static void WriteRTVal(Stream stream, RTVal val)
        {
            BinaryWriteMemoryStream ms = (BinaryWriteMemoryStream)PooledObjects.MemoryStreamPool.Pop();

            try
            {
                if (val.string_val != null)
                {
                    // Key for field: 1, LengthDelimited
                    ms.WriteByte(10);
                    global::GameSparks.RT.Proto.ProtocolParser.WriteBytes(ms, System.Text.Encoding.UTF8.GetBytes(val.string_val));
                }
                else if (val.data_val != null)
                {
                    ms.WriteByte(114);
                    RTData.WriteRTData(ms, val.data_val);
                }
                else if (val.vec_val != null)
                {
                    RTVector vec_value = val.vec_val.Value;
                    // Key for field: 2, LengthDelimited
                    ms.WriteByte(18);
                    int numberOfFloatsSet = vec_value.w != null ? 4 : (vec_value.z != null ? 3 : (vec_value.y != null ? 2 : (vec_value.x != null ? 1 : 0)));
                    global::GameSparks.RT.Proto.ProtocolParser.WriteUInt32(ms, 4u * (uint)numberOfFloatsSet);

                    for (int i = 0; i < numberOfFloatsSet; i++)
                    {
                        switch (i)
                        {
                        case 0:
                            ms.BinaryWriter.Write(vec_value.x.Value);
                            break;

                        case 1:
                            ms.BinaryWriter.Write(vec_value.y.Value);
                            break;

                        case 2:
                            ms.BinaryWriter.Write(vec_value.z.Value);
                            break;

                        case 3:
                            ms.BinaryWriter.Write(vec_value.w.Value);
                            break;

                        default:
                            break;
                        }
                    }
                }

#if __WINDOWS__
                var data = ms.ToArray();
#else
                var data = ms.GetBuffer();
#endif
                global::GameSparks.RT.Proto.ProtocolParser.WriteUInt32(stream, (uint)ms.Position);
                stream.Write(data, 0, (int)ms.Position);
            }
            finally
            {
                PooledObjects.MemoryStreamPool.Push(ms);
            }
        }