public static Message ReadPredefBinMessage(string currentFileName, Stream s, string filename) { Message m = new Message(); s.Seek(0xB0, SeekOrigin.Begin); int MsgHeaderFlags = s.ReadByte(); bool udhi = (MsgHeaderFlags & 0x40) > 0; int MsgType = MsgHeaderFlags & 0x0F; bool ucs2; switch (MsgType) { case 0: case 4: m.Direction = MessageDirection.Incoming; m.PhoneNumber = StreamUtilsPdu.ReadPhoneNumber(s); s.ReadByte(); // 00 expected ucs2 = (s.ReadByte() == 8); try { m.MessageTime = StreamUtilsPdu.ReadDateTime(s); } catch { } s.ReadByte(); m.DecodeMessageBody(udhi, ucs2, s); break; case 1: m.Direction = MessageDirection.Outgoing; s.ReadByte(); m.PhoneNumber = StreamUtilsPdu.ReadPhoneNumber(s); if (m.PhoneNumber == "+35856789123456789123") { m.PhoneNumber = ""; } s.ReadByte(); ucs2 = (s.ReadByte() == 8); s.ReadByte(); m.DecodeMessageBody(udhi, ucs2, s); if (string.IsNullOrEmpty(m.PhoneNumber)) { s.Seek(0x5F, SeekOrigin.Begin); StreamUtils.SeekTo(UnicodeZero, s); if (s.Position > 0x61) { int len = (int)(s.Position - 0x5F) / 2; s.Seek(0x5F, SeekOrigin.Begin); m.PhoneNumber = StreamUtils.ReadString(s, len); } } break; case 0x0C: s.Seek(-1, SeekOrigin.Current); try { m.Mms = new Mms(currentFileName, s, s.Length); m.MessageTime = m.Mms.Time; m.MessageText = m.Mms.ParseLog; } catch { } break; default: throw new ApplicationException("Unknown message type"); } if (m.messageTime == DateTime.MinValue && filename.Length > 16) { try { string tmp = filename.Substring(8, 8); Int64 sec = Int64.Parse(tmp, System.Globalization.NumberStyles.HexNumber); m.MessageTime = new DateTime(1980, 1, 1).AddSeconds(sec); if (RecalculateUtcToLocal) { m.MessageTime = m.MessageTime.ToLocalTime(); } } catch { } } return(m); }
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); }
public static Message ReadSymbianMessage(Stream s) { int test; if (StreamUtils.SeekTo(UnicodeExpander.msgBodyStartSeq, s)) { Message m = new Message(); m.messageText = UnicodeExpander.Expand(s); try { test = StreamUtils.ReadUInt16(s); if (test != 0x1834) { if (test != 0x2920) { throw new ApplicationException("Not sms"); } test = StreamUtils.ReadUInt16(s); if (test != 0x1834) { throw new ApplicationException("Not sms"); } } s.Seek(3, SeekOrigin.Current); int dirByte = s.ReadByte(); if (dirByte == 1 || dirByte == 0) { m.direction = MessageDirection.Unknown; s.Seek(21 + dirByte, SeekOrigin.Current); m.messageTime = StreamUtils.ReadNokiaDateTime3(s); } else if (dirByte == 2) { m.direction = MessageDirection.Unknown; s.Seek(2, SeekOrigin.Current); test = s.ReadByte(); if (test == 1) { s.Seek(25, SeekOrigin.Current); m.phoneNumber = UnicodeExpander.ReadShortString(s); } else { s.Seek(20, SeekOrigin.Current); m.messageTime = StreamUtils.ReadNokiaDateTime3(s); s.Seek(2, SeekOrigin.Current); m.smscNumber = UnicodeExpander.ReadShortString(s); s.ReadByte(); test = s.ReadByte(); if (test > 0) { m.phoneNumber = UnicodeExpander.ReadShortString(s); } } } else if (dirByte > 4 && dirByte < 11) { m.direction = MessageDirection.Outgoing; s.Seek(2, SeekOrigin.Current); test = s.ReadByte(); if (test > 0) { s.Seek(17, SeekOrigin.Current); try { m.messageTime = StreamUtils.ReadNokiaDateTime3(s); } catch { } m.phoneNumber = UnicodeExpander.ReadShortString(s); m.name = UnicodeExpander.ReadShortString(s); } else { s.Seek(16, SeekOrigin.Current); m.messageTime = StreamUtils.ReadNokiaDateTime3(s); m.phoneNumber = UnicodeExpander.ReadShortString(s); if (StreamUtils.SeekTo(new byte[] { 0x02, 0x03, 0xC2, 0x01 }, s)) { s.Seek(9, SeekOrigin.Current); StreamUtils.ReadNokiaDateTime3(s); s.Seek(2, SeekOrigin.Current); m.smscNumber = UnicodeExpander.ReadShortString(s); } } } else if (dirByte == 3 || dirByte == 4) { s.Seek(2, SeekOrigin.Current); test = s.ReadByte(); if (test == 0) { m.direction = MessageDirection.Incoming; s.Seek(20, SeekOrigin.Current); m.messageTime = StreamUtils.ReadNokiaDateTime3(s); s.Seek(2, SeekOrigin.Current); m.smscNumber = UnicodeExpander.ReadShortString(s); s.ReadByte(); test = s.ReadByte(); if (test == 6) { s.ReadByte(); test = s.ReadByte(); } if (test > 0) { m.phoneNumber = UnicodeExpander.ReadShortString(s); } } else if (test == 1) { m.direction = MessageDirection.Unknown; s.Seek(17, SeekOrigin.Current); try { m.messageTime = StreamUtils.ReadNokiaDateTime3(s); } catch { } m.phoneNumber = UnicodeExpander.ReadShortString(s); m.name = UnicodeExpander.ReadShortString(s); if (m.MessageTime == DateTime.MinValue) { test = s.ReadByte(); if (test == 1) { s.Seek(2, SeekOrigin.Current); } s.Seek(21, SeekOrigin.Current); m.messageTime = StreamUtils.ReadNokiaDateTime3(s); } } else if (test == 2) { s.Seek(25, SeekOrigin.Current); m.phoneNumber = UnicodeExpander.ReadShortString(s); m.name = UnicodeExpander.ReadShortString(s); s.Seek(27, SeekOrigin.Current); m.MessageText = UnicodeExpander.ReadShortString(s); s.Seek(23, SeekOrigin.Current); m.messageTime = StreamUtils.ReadNokiaDateTime3(s); } else { throw new ApplicationException(string.Format("Unexpected test value ({0})", test)); } } else { throw new ApplicationException(string.Format("Unknown direction ({0})", dirByte)); } } catch { if (m.messageText.Length == 0) { throw new ApplicationException(string.Format("No message found. File size: ({0})", s.Length)); } } return(m); } else { throw new ApplicationException(string.Format("Starting sequence not found. File size: ({0})", s.Length)); } }