Пример #1
0
        /// <summary>
        /// 解析包体,从buf的开头位置解析起
        /// <remark>abu 2008-02-18 </remark>
        /// </summary>
        /// <param name="buf">The buf.</param>
        protected override void ParseBody(ByteBuffer buf)
        {
            #if DEBUG
            Client.LogManager.Log(ToString() + " " + Utils.Util.ToHex(buf.ToByteArray()));
            #endif
            Empty = false;
            // 检查消息长度,至少要有16字节,因为我们需要前16字节做为确认发回
            if (buf.Remaining() < 16)
            {
                throw new PacketParseException("收到的消息太短,抛弃该消息");
            }
            // 得到前16个字节用作回复
            Reply = buf.GetByteArray(16);
            // 读取消息头
            buf.Position = 0;
            Header = new ReceiveIMHeader();
            Header.Read(buf);
            // 检查输入流可用字节
            if (!buf.HasRemaining())
            {
                Empty = true;
                return;
            }
            // 判断消息类型
            int len = 0;
            switch (Header.Type)
            {
                case RecvSource.FRIEND_0801: //手机消息
                    buf.Position += 10;//buf.GetInt();
                    ParseNormalIM(buf);
                    break;
                case RecvSource.FRIEND_0802:
                    ParseNormalIM(buf);
                    break;
                case RecvSource.FRIEND_09:
                    buf.Position += 11;
                    ParseNormalIM(buf);
                    break;
                case RecvSource.FRIEND_09SP1:
                    buf.Position += 2;
                    int len1 = buf.GetUShort();
                    buf.Position += len1;
                    ParseNormalIM(buf);
                    break;
                case RecvSource.STRANGER:
                    /* 是从好友或者陌生人处发来的消息 */
                    ParseNormalIM(buf);
                    break;

                case RecvSource.TEMP_SESSION:
                    TempSessionIM = new TempSessionIM();
                    TempSessionIM.Read(buf);
                    break;
                case RecvSource.SYS_MESSAGE:
                    /* 是系统消息 */
                    buf.GetInt();//00 00 00 00
                    ParseSystemMessage(buf);
                    break;
                case RecvSource.CLUSTER_09:
                    /* 群消息09 */
                    ParseClusterIM09(buf);
                    break;
                case RecvSource.CLUSTER:

                    /* 群消息 */
                    ParseClusterIM(buf);
                    break;
                case RecvSource.TEMP_CLUSTER:
                    /* 临时群消息 */
                    ParseTempClusterIM(buf);
                    break;
                case RecvSource.UNKNOWN_CLUSTER:
                    ParseUnknownClusterIM(buf);
                    break;
                case RecvSource.BIND_USER:
                    SMS = new SMS();
                    SMS.ReadBindUserSMS(buf);
                    break;
                case RecvSource.MOBILE_QQ:
                    SMS = new SMS();
                    SMS.ReadMobileQQSMS(buf);
                    break;
                case RecvSource.MOBILE_QQ_2 :
                    SMS = new SMS();
                    SMS.ReadMobileQQ2SMS(buf);
                    break;
                case RecvSource.MOBILE:
                    SMS = new SMS();
                    SMS.ReadMobileSMS(buf);
                    break;
                case RecvSource.CREATE_CLUSTER:
                case RecvSource.ADDED_TO_CLUSTER:
                case RecvSource.DELETED_FROM_CLUSTER:
                    ExternalId = buf.GetInt();
                    ClusterType = (ClusterType)buf.Get();
                    Sender = buf.GetInt();
                    break;
                case RecvSource.APPROVE_JOIN_CLUSTER:
                case RecvSource.REJECT_JOIN_CLUSTER:
                case RecvSource.REQUEST_JOIN_CLUSTER:
                    ExternalId = buf.GetInt();
                    ClusterType = (ClusterType)buf.Get();
                    Sender = buf.GetInt();
                    len = buf.Get() & 0xFF;
                    byte[] b = buf.GetByteArray(len);
                    Message = Utils.Util.GetString(b);
                    break;
                case RecvSource.CLUSTER_NOTIFICATION:
                    ExternalId = buf.GetInt();
                    ClusterType = (ClusterType)buf.Get();
                    OpCode = buf.Get();
                    MemberQQ = buf.GetInt();
                    Role = buf.Get();
                    Sender = ExternalId;
                    break;
                case RecvSource.SIGNATURE_CHANGE:
                    SignatureOwner = buf.GetInt();
                    ModifiedTime = buf.GetInt();
                    len = buf.Get() & 0xFF;
                    Signature = Utils.Util.GetString(buf, len);
                    break;
                case RecvSource.QQLIVE:
                    QQLive = new QQLive();
                    QQLive.Read(buf);
                    break;
                case RecvSource.MEMBER_LOGIN_HINT:
                    buf.Get();
                    break;
                case RecvSource.CUSTOM_HEAD_CHANGE:
                    int count = buf.Get() & 0xFF;
                    if (count > 0)
                    {
                        HeadChanges = new List<CustomHead>();
                        while (buf.HasRemaining())
                        {
                            CustomHead change = new CustomHead();
                            change.Read(buf);
                            HeadChanges.Add(change);
                        }
                    }
                    break;
                case RecvSource.PROPERTY_CHANGE :
                    PropertyChange = new UserPropertyChange();
                    PropertyChange.Read(buf);
                    break;
                case RecvSource.INPUT_STATE_CHANGE: //输入状态
                    buf.GetInt();//00 00 00 00
                    Sender = buf.GetInt();//09 58 8C 87
                    buf.Get();//00
                    break;
                default:
                    // 其他类型的消息我们现在没有办法处理,忽略
                    Client.LogManager.Log(ToString() + " Unknown RecvSource=0x" + Header.Type.ToString("X"));
                    break;
            }
        }
Пример #2
0
        /// <summary>
        /// 解析包体,从buf的开头位置解析起
        /// <remark>abu 2008-02-18 </remark>
        /// </summary>
        /// <param name="buf">The buf.</param>
        protected override void ParseBody(ByteBuffer buf)
        {
#if DEBUG
            Client.LogManager.Log(ToString() + " " + Utils.Util.ToHex(buf.ToByteArray()));
#endif
            Empty = false;
            // 检查消息长度,至少要有16字节,因为我们需要前16字节做为确认发回
            if (buf.Remaining() < 16)
            {
                throw new PacketParseException("收到的消息太短,抛弃该消息");
            }
            // 得到前16个字节用作回复
            Reply = buf.GetByteArray(16);
            // 读取消息头
            buf.Position = 0;
            Header       = new ReceiveIMHeader();
            Header.Read(buf);
            // 检查输入流可用字节
            if (!buf.HasRemaining())
            {
                Empty = true;
                return;
            }
            // 判断消息类型
            int len = 0;
            switch (Header.Type)
            {
            case RecvSource.FRIEND_0801: //手机消息
                buf.Position += 10;      //buf.GetInt();
                ParseNormalIM(buf);
                break;

            case RecvSource.FRIEND_0802:
                ParseNormalIM(buf);
                break;

            case RecvSource.FRIEND_09:
                buf.Position += 11;
                ParseNormalIM(buf);
                break;

            case RecvSource.FRIEND_09SP1:
                buf.Position += 2;
                int len1 = buf.GetUShort();
                buf.Position += len1;
                ParseNormalIM(buf);
                break;

            case RecvSource.STRANGER:
                /* 是从好友或者陌生人处发来的消息 */
                ParseNormalIM(buf);
                break;

            case RecvSource.TEMP_SESSION:
                TempSessionIM = new TempSessionIM();
                TempSessionIM.Read(buf);
                break;

            case RecvSource.SYS_MESSAGE:
                /* 是系统消息 */
                buf.GetInt();    //00 00 00 00
                ParseSystemMessage(buf);
                break;

            case RecvSource.CLUSTER_09:
                /* 群消息09 */
                ParseClusterIM09(buf);
                break;

            case RecvSource.CLUSTER:

                /* 群消息 */
                ParseClusterIM(buf);
                break;

            case RecvSource.TEMP_CLUSTER:
                /* 临时群消息 */
                ParseTempClusterIM(buf);
                break;

            case RecvSource.UNKNOWN_CLUSTER:
                ParseUnknownClusterIM(buf);
                break;

            case RecvSource.BIND_USER:
                SMS = new SMS();
                SMS.ReadBindUserSMS(buf);
                break;

            case RecvSource.MOBILE_QQ:
                SMS = new SMS();
                SMS.ReadMobileQQSMS(buf);
                break;

            case RecvSource.MOBILE_QQ_2:
                SMS = new SMS();
                SMS.ReadMobileQQ2SMS(buf);
                break;

            case RecvSource.MOBILE:
                SMS = new SMS();
                SMS.ReadMobileSMS(buf);
                break;

            case RecvSource.CREATE_CLUSTER:
            case RecvSource.ADDED_TO_CLUSTER:
            case RecvSource.DELETED_FROM_CLUSTER:
                ExternalId  = buf.GetInt();
                ClusterType = (ClusterType)buf.Get();
                Sender      = buf.GetInt();
                break;

            case RecvSource.APPROVE_JOIN_CLUSTER:
            case RecvSource.REJECT_JOIN_CLUSTER:
            case RecvSource.REQUEST_JOIN_CLUSTER:
                ExternalId  = buf.GetInt();
                ClusterType = (ClusterType)buf.Get();
                Sender      = buf.GetInt();
                len         = buf.Get() & 0xFF;
                byte[] b = buf.GetByteArray(len);
                Message = Utils.Util.GetString(b);
                break;

            case RecvSource.CLUSTER_NOTIFICATION:
                ExternalId  = buf.GetInt();
                ClusterType = (ClusterType)buf.Get();
                OpCode      = buf.Get();
                MemberQQ    = buf.GetInt();
                Role        = buf.Get();
                Sender      = ExternalId;
                break;

            case RecvSource.SIGNATURE_CHANGE:
                SignatureOwner = buf.GetInt();
                ModifiedTime   = buf.GetInt();
                len            = buf.Get() & 0xFF;
                Signature      = Utils.Util.GetString(buf, len);
                break;

            case RecvSource.QQLIVE:
                QQLive = new QQLive();
                QQLive.Read(buf);
                break;

            case RecvSource.MEMBER_LOGIN_HINT:
                buf.Get();
                break;

            case RecvSource.CUSTOM_HEAD_CHANGE:
                int count = buf.Get() & 0xFF;
                if (count > 0)
                {
                    HeadChanges = new List <CustomHead>();
                    while (buf.HasRemaining())
                    {
                        CustomHead change = new CustomHead();
                        change.Read(buf);
                        HeadChanges.Add(change);
                    }
                }
                break;

            case RecvSource.PROPERTY_CHANGE:
                PropertyChange = new UserPropertyChange();
                PropertyChange.Read(buf);
                break;

            case RecvSource.INPUT_STATE_CHANGE: //输入状态
                buf.GetInt();                   //00 00 00 00
                Sender = buf.GetInt();          //09 58 8C 87
                buf.Get();                      //00
                break;

            default:
                // 其他类型的消息我们现在没有办法处理,忽略
                Client.LogManager.Log(ToString() + " Unknown RecvSource=0x" + Header.Type.ToString("X"));
                break;
            }
        }