Exemple #1
0
 public IPMsgUdpPacketEncoder(IPMsgUdpPacket packet)
 {
     this._packet = packet;
 }
        public Packet Resolve()
        {
            IPMsgUdpPacket packet = new IPMsgUdpPacket();
            //更改在线状态消息示例:1:1559263918:hyron-<06f73d2bf8f254bd>:DESKTOP-904FV8J:258212096:202?��?[�H����]\0202g\0\nUN:hyron-<06f73d2bf8f254bd>\nHN:DESKTOP-904FV8J\nNN:202张小锋[食事中]\nGN:202g\nVS:00010002:4:99:106"
            string str   = Encoding.UTF8.GetString(_datagram);
            int    index = str.IndexOf(":");

            if (index < 0)
            {
                return(null);
            }
            string strTmp = str.Substring(0, index);
            short  ver    = 0;

            if (!short.TryParse(strTmp, out ver))
            {
                return(null);
            }
            packet.Version = ver;

            int index2 = str.IndexOf(":", index + 1);

            if (index2 < 0)
            {
                return(null);
            }
            strTmp = str.Substring(index + 1, index2 - index - 1);
            long id = 0;

            if (!long.TryParse(strTmp, out id))
            {
                return(null);
            }
            packet.ID = id;

            index = str.IndexOf(":", index2 + 1);
            if (index < 0)
            {
                return(null);
            }
            packet.Sender = str.Substring(index2 + 1, index - index2 - 1);

            index2 = str.IndexOf(":", index + 1);
            if (index2 < 0)
            {
                return(null);
            }
            packet.SenderHost = str.Substring(index + 1, index2 - index - 1);

            index = str.IndexOf(":", index2 + 1);
            if (index < 0)
            {
                return(null);
            }
            strTmp = str.Substring(index2 + 1, index - index2 - 1);
            ulong cmd = 0;

            if (!ulong.TryParse(strTmp, out cmd))
            {
                return(null);
            }
            packet.Command = cmd;

            //查找消息扩展区
            index2 = str.IndexOf("\0", index + 1);
            if (index2 < 0)
            {
                //无扩展区
                packet.Message = str.Substring(index + 1);
            }
            else
            {
                packet.Message = str.Substring(index + 1, index2 - index - 1);
                packet.Extend  = str.Substring(index2 + 1);
            }

            if ((packet.Command & IPMsgUdpPacket.IPMSG_CMD_OPT_UTF8) == 0)
            {
                //如果不是UTF8编码的话,前面已经用UTF8编码给转化了,所以要ASCII转换回来
                //TODO 此处稍微和IPMsg有差异,暂未调查清楚编码问题(除了上下线以外一般是UTF8编码的)
                packet.Sender     = UTF82ASCII(packet.Sender);
                packet.SenderHost = UTF82ASCII(packet.SenderHost);
                packet.Message    = UTF82ASCII(packet.Message);
            }

            //处理扩展区消息
            if (!string.IsNullOrEmpty(packet.ExtendMessage))
            {
                index = packet.ExtendMessage.IndexOf("\0");
                string strExt  = null;
                string strExt2 = null;
                if (index < 0)
                {
                    strExt = packet.ExtendMessage;
                }
                else
                {
                    strExt  = packet.ExtendMessage.Substring(0, index);
                    strExt2 = packet.ExtendMessage.Substring(index + 1);
                }

                if (strExt[0] != '\n')
                {
                    if ((packet.Command & IPMsgUdpPacket.IPMSG_CMD_OPT_UTF8) == 0)
                    {
                        strExt = UTF82ASCII(strExt);
                    }
                    packet.Extend = strExt;
                }
                else if (string.IsNullOrEmpty(strExt2))
                {
                    strExt2 = strExt;
                }

                if (!string.IsNullOrEmpty(strExt2) &&
                    strExt2[0] == '\n' &&
                    (packet.Command & IPMsgUdpPacket.IPMSG_CAPUTF8OPT) != 0)
                {
                    string[] fields = strExt2.Split('\n');
                    foreach (string field in fields)
                    {
                        if (field.StartsWith("UN"))
                        {
                            packet.Sender = field.Substring(3);
                        }
                        else if (field.StartsWith("HN"))
                        {
                            packet.SenderHost = field.Substring(3);
                        }
                        else if (field.StartsWith("NN"))
                        {
                            switch (packet.CommandMode)
                            {
                            case IPMsgUdpPacket.IPMSG_CMD_BR_ENTRY:
                            case IPMsgUdpPacket.IPMSG_CMD_BR_ABSENCE:
                                packet.Message = field.Substring(3);
                                break;
                            }
                        }
                        else if (field.StartsWith("GN"))
                        {
                            switch (packet.CommandMode)
                            {
                            case IPMsgUdpPacket.IPMSG_CMD_BR_ENTRY:
                            case IPMsgUdpPacket.IPMSG_CMD_BR_ABSENCE:
                                packet.Extend = field.Substring(3);
                                break;
                            }
                        }
                        else if (field.StartsWith("VS"))
                        {
                            //IPMsg 4.x的消息,暂时未对应
                        }
                    }
                }
            }

            return(packet);
        }