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); }
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); }