예제 #1
0
        public void read(Stream stream)
        {
            // read as mch as possible
            int bytesRead = stream.Read(buf.GetBuffer(), (int)buf.Length, (int)(buf.Capacity - buf.Length));

            //		buf.Write (buf.GetBuffer(), (int)buf.Length, (int)(bytesRead));
            //		DEBUG.Info("old length="+buf.Length+" bytesRead="+bytesRead+" new length=" + (buf.Length + bytesRead));


            buf.SetLength(buf.Length + bytesRead);

            //		if (bytesRead > 0) {
            //			DEBUG.Info ("read = " + bytesRead + " pos = " + buf.Position + " len=" + buf.Length + " remaining=" + (buf.Capacity - buf.Length));
            //		}

            buf.Position = 0;

            //		DEBUG.Info (BitConverter.ToString(buf.GetBuffer(), (int)buf.Position, (int)buf.Length));
//			bool messageRead = false;
            while (true)
            {
                if (buf.Length - buf.Position < 2)
                {
                    //no message avilable now
                    break;
                }

                UInt16 length = binaryReader.GetUInt16((int)buf.Position);
                if (buf.Length - buf.Position < length + 2)
                {
                    break;
                }

                // skip the length field
                UInt16 lengthRead = binaryReader.ReadUInt16();

                int pid = binaryReader.GetByte((int)buf.Position);
                //			DEBUG.Info ("pid=" + pid + " length=" + lengthRead + " expected=" + length);
                MemoryStream tmpStream = new MemoryStream(length);
                buf.Read(tmpStream.GetBuffer(), 0, (int)(length));
                tmpStream.SetLength(length);

                //			MemoryEndianBinaryReader tmpReader = new MemoryEndianBinaryReader (EndianBitConverter.Big, tmpStream);

                if (listener != null)
                {
                    Message message = new Message(tmpStream);
                    listener.OnMessage(message);
                }

                //			BattleToPlayerDispatcher.Dispatch(tmpReader, proxy);
            }

            MemoryStream newBuf = new MemoryStream(64 * 1024);

            if (buf.Length - buf.Position > 0)
            {
                newBuf.Write(buf.GetBuffer(), (int)buf.Position, (int)(buf.Length - buf.Position));
            }

            buf          = newBuf;
            binaryReader = new MemoryEndianBinaryReader(EndianBitConverter.Big, buf);
        }