private void DecodeMessageText(bool udhi, bool ucs2, int len, byte[] buff) { if (udhi) { int headLength = buff[0]; int skipChars = (headLength + 1); // multipart if (ucs2) { this.MessageText = System.Text.Encoding.BigEndianUnicode.GetString(buff, skipChars, buff.Length - skipChars); } else { skipChars = (int)Math.Ceiling(skipChars * 8.0 / 7); this.MessageText = StreamUtilsPdu.Decode7bit(buff, len).Substring(skipChars); } if (headLength > 4 && buff[2] == 3 && buff[4] > 1) { this.MultipartInfo = new MultipartData { MessageNumber = buff[3], TotalParts = buff[4], PartNumber = buff[5] }; } else if (headLength > 5 && buff[2] == 4) { this.MultipartInfo = new MultipartData { MessageNumber = buff[4], TotalParts = buff[5], PartNumber = buff[6] }; } if (this.MultipartInfo != null) { this.MessageText = this.MultipartInfo.AddMultipartPrefix(this.MessageText); } } else { if (ucs2) { this.MessageText = System.Text.Encoding.BigEndianUnicode.GetString(buff); } else { this.MessageText = StreamUtilsPdu.Decode7bit(buff, len); } } }
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 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); }