using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; using System.Text.RegularExpressions; namespace SafeMobileLib.MessageDecoders { public class SMSdecoder { private int suid; private byte[] data; private DBsmsManager DBsms; private DBTicketingManager DBTicketing; private String seqID; private Boolean withDB = false; public String messBody = ""; public String emailAddr = ""; public int delete_ticket_id = -1; public sqlResponse sqlResp; public bool isEmail; private bool hyt; public SMSdecoder(int suid, byte[] data, DBsmsManager DBsms, DBTicketingManager DBTicketing, String seqID, bool _hyt, string msg) { withDB = true; this.suid = suid; this.data = data; this.DBsms = DBsms; this.DBTicketing = DBTicketing; this.seqID = seqID; hyt = _hyt; //decode and add to DB in DecodePacket if (!hyt) { header_T hret = DecodePacket(data); } else { DecodePacketHyt(msg); } } public SMSdecoder(bool _hyt) { withDB = false; hyt = _hyt; } // ------------------------------------------------------------------- // Aux functions // ------------------------------------------------------------------- public struct header_T { public bool ext, ext2, ack, cntl; public byte pdu_type; public byte seq_no; public byte encoding; public byte header; } public static string Static_dec(Byte[] data) { header_T hret = new header_T(); string str_msg=""; int i, j, pdata; pdata = (int)data[0]; pdata <<= 8; pdata |= (int)data[1]; Console.WriteLine("Length =" + pdata + "(0x" + data[0].ToString("X") + "," + data[1].ToString("X") + ")"); Console.Write("Data: "); for (i = 2; i < pdata + 2; i++) Console.Write(" 0x" + data[i].ToString("X")); Console.WriteLine(); // parse header int header = data[2]; hret.header = data[2]; Console.WriteLine("Header: " + header.ToString("X")); if ((header & 0x80) != 0) hret.ext = true; else hret.ext = false; if ((header & 0x40) != 0) hret.ack = true; else hret.ack = false; if ((header & 0x10) != 0) hret.cntl = true; else hret.cntl = false; // txt message hret.pdu_type = (byte)(header & 0x0f); // parse address int addrsize = data[3]; i = 4; Console.Write("Address: "); for (j = 0; j < addrsize; j++) { Console.Write(data[i + j].ToString("X")); } i += j; if (addrsize == 0) Console.WriteLine("no len"); else Console.WriteLine(); // parse rest of headers if (hret.ext) { byte h2 = data[i]; if ((h2 & 0x80) != 0) hret.ext2 = true; else hret.ext2 = false; hret.seq_no = (byte)(h2 & 0x1F); i++; if (hret.ext2) { // parse third header byte seqNr_MSB = (byte)(data[i] & 0x60); hret.seq_no += seqNr_MSB; hret.encoding = (byte)(data[i] & 0x0f); i++; } } int crc = 0; if ((!hret.cntl) && (hret.pdu_type == 0)) { // the rest is the txt message Console.Write("SMS Message: "); Char[] cs = new Char[100]; int k; for (j = i, k = 0; j < pdata + 2; j++) { Console.Write(" 0x" + data[j].ToString("X")); if (data[j] != 0) { cs[k++] = (Char)data[j]; crc |= (Char)data[j]; } } Console.WriteLine(); // save message in inbox ht string s = new string(cs, 0, k); s = s.Replace(System.Environment.NewLine, string.Empty); str_msg = s; } return str_msg; } public header_T DecodePacket(Byte[] data) { header_T hret = new header_T(); int i, j, pdata; pdata = (int)data[0]; pdata <<= 8; pdata |= (int)data[1]; Console.WriteLine("Length =" + pdata + "(0x" + data[0].ToString("X") + "," + data[1].ToString("X") + ")"); Console.Write("Data: "); for (i = 2; i < pdata + 2; i++) Console.Write(" 0x" + data[i].ToString("X")); Console.WriteLine(); if (!withDB) { messBody = ""; emailAddr = ""; } // parse header int header = data[2]; hret.header = data[2]; Console.WriteLine("Header: " + header.ToString("X")); if ((header & 0x80) != 0) hret.ext = true; else hret.ext = false; if ((header & 0x40) != 0) hret.ack = true; else hret.ack = false; if ((header & 0x10) != 0) hret.cntl = true; else hret.cntl = false; // txt message hret.pdu_type = (byte)(header & 0x0f); // parse address int addrsize = data[3]; i = 4; Console.Write("Address: "); for (j = 0; j < addrsize; j++) { Console.Write(data[i + j].ToString("X")); } i += j; if (addrsize == 0) Console.WriteLine("no len"); else Console.WriteLine(); // parse rest of headers if (hret.ext) { byte h2 = data[i]; if ((h2 & 0x80) != 0) hret.ext2 = true; else hret.ext2 = false; hret.seq_no = (byte)(h2 & 0x1F); i++; if (hret.ext2) { // parse third header byte seqNr_MSB = (byte)(data[i] & 0x60); hret.seq_no += seqNr_MSB; hret.encoding = (byte)(data[i] & 0x0f); i++; } } int crc = 0; if ((!hret.cntl) && (hret.pdu_type == 0)) { // the rest is the txt message Console.Write("SMS Message: "); Char[] cs = new Char[100]; int k; for (j = i, k = 0; j < pdata + 2; j++) { Console.Write(" 0x" + data[j].ToString("X")); if (data[j] != 0) { cs[k++] = (Char)data[j]; crc |= (Char)data[j]; } } Console.WriteLine(); // save message in inbox ht string s = new string(cs, 0, k); string key = suid + " | " + DateTime.Now + " | " + crc.ToString(); htSMSMessage_t msg = new htSMSMessage_t(); msg.message = s; msg.suid = suid.ToString(); s.Replace("\r\n", ""); s = s.Replace(System.Environment.NewLine, string.Empty); Console.WriteLine("Message [" + s + "]"); bool is_email = false; string email_addr = ""; string email_body = ""; if (s.Contains("@") && s.Contains(":") && s.Contains(".")) { // this may be an email so analyze further char[] sep = { ':' }; string[] all_msg = s.Split(sep); email_addr = all_msg[0]; email_body = all_msg[1]; if (email_addr.Contains("@") && email_addr.Contains(".")) { messBody = email_body; emailAddr = email_addr; is_email = true; this.isEmail = true; } } try { if (withDB) { if (is_email) { sqlResp = DBsms.insert_sms_sent2email(suid.ToString(), email_body, email_addr, seqID); } else { //new db insert for job tickets if (s.Contains("")) { s = s.Replace("", ""); sqlResp = DBTicketing.insert_ticket_response(suid.ToString(), s); if (sqlResp == sqlResponse.noUpdate) delete_ticket_id = Convert.ToInt32(Regex.Replace(s, "[a-zA-z]", "")); } else sqlResp = DBsms.insert_sms_received(suid.ToString(), s, 3, "", seqID); } } else { if (is_email) { messBody = email_body; emailAddr = email_addr; } else { messBody = s; emailAddr = ""; } } } catch (Exception ex) { Console.WriteLine("ERROR in insert_sms_received:\r\n" + ex.ToString()); } } return hret; } public void DecodePacketHyt(string msg) { messBody = ""; emailAddr = ""; string s = msg; s.Replace("\r\n", ""); s = s.Replace(System.Environment.NewLine, string.Empty); Console.WriteLine("Message [" + s + "]"); bool is_email = false; string email_addr = ""; string email_body = ""; if (s.Contains("@") && s.Contains(":") && s.Contains(".")) { // this may be an email so analyze further char[] sep = { ':' }; string[] all_msg = s.Split(sep); email_addr = all_msg[0]; email_body = all_msg[1]; if (email_addr.Contains("@") && email_addr.Contains(".")) { messBody = email_body; emailAddr = email_addr; is_email = true; this.isEmail = true; } } try { if (withDB) { if (is_email) { sqlResp = DBsms.insert_sms_sent2email(suid.ToString(), email_body, email_addr, seqID); } else { if (s.Contains("")) { s = s.Replace("", ""); sqlResp = DBTicketing.insert_ticket_response(suid.ToString(), s); if (sqlResp == sqlResponse.noUpdate) delete_ticket_id = Convert.ToInt32(Regex.Replace(s, "[a-zA-z]", "")); } else sqlResp = DBsms.insert_sms_received(suid.ToString(), s, 3, "", seqID); } } else { if (is_email) { messBody = email_body; emailAddr = email_addr; } else { messBody = s; emailAddr = ""; } } } catch (Exception ex) { Console.WriteLine("ERROR in insert_sms_received:\r\n" + ex.ToString()); } } } }