trim HttpHeaders
石头 编写于 2024-06-22 08:55:23
X
using System;
using System.Xml.Serialization;
using NewLife.Serialization;

namespace NewLife.Messaging
{
    /// <summary>通道消息。封装带有通道编号的消息</summary>
    public class ChannelMessage : Message, IAccessor
    {
        /// <summary>消息类型</summary>
        [XmlIgnore]
        public override MessageKind Kind { get { return MessageKind.Channel; } }

        private Byte _Channel;
        /// <summary>消息通道</summary>
        public Byte Channel { get { return _Channel; } set { _Channel = value; } }

        private Int32 _SessionID;
        /// <summary>会话编号</summary>
        public Int32 SessionID { get { return _SessionID; } set { _SessionID = value; } }

        [NonSerialized]
        private Message _Message;
        /// <summary>内部消息对象</summary>
        public Message Message { get { return _Message; } set { _Message = value; } }

        #region IAccessor 成员
        Boolean IAccessor.Read(IReader reader)
        {
            var r = reader as IReader2;
            Channel = r.ReadByte();
            SessionID = r.ReadInt32();
            //if (reader.Stream.Position != reader.Stream.Length)
            {
                // 读取对象引用
                var rf = reader.Stream.ReadByte();
                if (rf != 0) Message = Message.Read(reader.Stream, reader.GetKind());
            }

            return true;
        }

        Boolean IAccessor.ReadComplete(IReader reader, Boolean success) { return success; }

        Boolean IAccessor.Write(IWriter writer)
        {
            writer.Depth++;
            writer.WriteMember("Channel", Channel, Channel.GetType(), 0, null);
            writer.WriteMember("SessionID", SessionID, SessionID.GetType(), 1, null);
            if (Message != null)
            {
                writer.WriteMember("Ref", (Byte)2, typeof(Byte), 0, null);
                Message.Write(writer.Stream, writer.GetKind());
            }
            else
                writer.WriteMember("Null", (Byte)0, typeof(Byte), 0, null);
            writer.Depth--;

            return true;
        }

        Boolean IAccessor.WriteComplete(IWriter writer, Boolean success) { return success; }
        #endregion

        #region 辅助
        /// <summary>已重载。</summary>
        /// <returns></returns>
        public override string ToString()
        {
            var msg = Message;
            if (msg != null)
                return String.Format("{0} {1} {2}", base.ToString(), Channel, msg);
            else
                return base.ToString();
        }
        #endregion
    }
}