示例#1
0
        private void DecodeMessageBody(bool udhi, bool ucs2, Stream s)
        {
            int len = s.ReadByte();

            byte[] buff;
            if (ucs2)
            {
                buff = StreamUtils.ReadBuff(s, len);
            }
            else
            {
                int len7 = (int)Math.Ceiling(7.0 * len / 8);
                buff = StreamUtils.ReadBuff(s, len7);
            }
            this.DecodeMessageText(udhi, ucs2, len, buff);
        }
示例#2
0
        public static Message ReadBinMessage(Stream s)
        {
            Message m = new Message();

            s.Seek(4, SeekOrigin.Current);
            int  MsgHeaderFlags = s.ReadByte();
            bool udhi           = ((MsgHeaderFlags & 0x40) > 0);
            int  MsgType        = MsgHeaderFlags & 0x0F;

            s.ReadByte();
            bool ucs2 = (s.ReadByte() == 8);

            s.ReadByte();

            int test, len, len2;

            byte[] buff;

            switch (MsgType)
            {
            case 0x00:
            case 0x04:                     // incoming message
                m.Direction = MessageDirection.Incoming;

                s.ReadByte();
                m.MessageTime = StreamUtilsPdu.ReadDateTime(s);
                s.Seek(8, SeekOrigin.Current);
                m.PhoneNumber = StreamUtilsPdu.ReadPhoneNumber(s);
                s.Seek(5, SeekOrigin.Current);
                m.SmscNumber = StreamUtilsPdu.ReadPhoneNumber(s, true);

                s.Seek(4, SeekOrigin.Current);
                len  = StreamUtils.ReadUInt16(s);
                len2 = StreamUtils.ReadUInt16(s);
                s.Seek(2, SeekOrigin.Current);
                buff = StreamUtils.ReadBuff(s, len2);
                m.DecodeMessageText(udhi, ucs2, len, buff);
                StreamUtils.Counter += len2;

                break;

            case 0x01:                     // outgoing message
                m.Direction = MessageDirection.Outgoing;

                s.Seek(2, SeekOrigin.Current);

                test = s.ReadByte();
                if (test == 1)
                {
                    m.MessageTime = StreamUtils.ReadNokiaDateTime2(s).ToLocalTime();
                    s.Seek(7, SeekOrigin.Current);
                }

                test = s.ReadByte();
                if (test == 1)
                {
                    s.Seek(4, SeekOrigin.Current);
                    m.PhoneNumber = StreamUtilsPdu.ReadPhoneNumber(s);
                    s.Seek(5, SeekOrigin.Current);
                    m.SmscNumber = StreamUtilsPdu.ReadPhoneNumber(s, true);
                }
                else
                {
                    s.Seek(9, SeekOrigin.Current);
                }

                s.Seek(4, SeekOrigin.Current);
                len  = StreamUtils.ReadUInt16(s);
                len2 = StreamUtils.ReadUInt16(s);
                s.Seek(2, SeekOrigin.Current);
                buff = StreamUtils.ReadBuff(s, len2);
                m.DecodeMessageText(udhi, ucs2, len, buff);
                StreamUtils.Counter += len2;

                break;

            case 0x06:                     // delivery report message
                m.Direction = MessageDirection.Incoming;

                s.ReadByte();
                m.MessageTime = StreamUtilsPdu.ReadDateTime(s);
                s.Seek(15, SeekOrigin.Current);
                m.PhoneNumber = StreamUtilsPdu.ReadPhoneNumber(s);
                s.Seek(5, SeekOrigin.Current);
                m.SmscNumber = StreamUtilsPdu.ReadPhoneNumber(s, true);
                s.Seek(10, SeekOrigin.Current);

                m.MessageText = "Delivery report message";
                m.IsDelivery  = true;
                break;

            default:
                throw new ApplicationException("Unknown message type");
            }
            return(m);
        }