private void btnSendSession_Click(object sender, EventArgs e) { if (lvSessions.SelectedItems.Count == 0) { return; } SimSession objSession = (SimSession)lvSessions.SelectedItems[0].Tag; frmSmsMessage frm = new frmSmsMessage(objSession, null, frmSmsMessage.EFrmType.SEND, m_objSimModel.MultipartMode, m_objSimModel.UseGsmEncoding); if (frm.ShowDialog() == DialogResult.OK) { SimMessage objMessage = frm.Message; objMessage.SessionId = objSession.Id; objMessage.SystemId = objSession.SystemId; SimCommand objCommand = new SimCommand(); objCommand.CommandId = SimCommand.ECommandId.SENDMESSAGE; objCommand.Message = new SimMessage(objMessage); objCommand.SessionId = objSession.Id; // Sending a new message is a kind of 'fire and forget', this // is because the message will be added to the back of the queue // in the worker thread. Actually waiting for the message to be // submitted to the session for delivery may take a while when // doing stress tests. m_objSimWorker.PushWorker(objCommand); } }
public SimMessage(SimMessage objOther) { m_nUserTag = objOther.m_nUserTag; m_strToAddress = objOther.m_strToAddress; m_strFromAddress = objOther.m_strFromAddress; m_strBody = objOther.m_strBody; m_bRequestDeliveryReport = objOther.m_bRequestDeliveryReport; m_nToAddressTon = objOther.m_nToAddressTon; m_nToAddressNpi = objOther.m_nToAddressNpi; m_nFromAddressTon = objOther.m_nFromAddressTon; m_nFromAddressNpi = objOther.m_nFromAddressNpi; m_strReference = objOther.m_strReference; m_nDataCoding = objOther.m_nDataCoding; m_nBodyFormat = objOther.m_nBodyFormat; m_bHasUdh = objOther.m_bHasUdh; m_bIsDeliveryReport = objOther.m_bIsDeliveryReport; m_nCommandStatus = objOther.m_nCommandStatus; m_nSequenceNumber = objOther.m_nSequenceNumber; m_nTotalParts = objOther.m_nTotalParts; m_nPartNumber = objOther.m_nPartNumber; m_nMultipartReference = objOther.m_nMultipartReference; m_nLanguageShift = objOther.m_nLanguageShift; m_nSessionId = objOther.m_nSessionId; m_strSystemId = objOther.m_strSystemId; m_strStatus = objOther.m_strStatus; m_eDirection = objOther.m_eDirection; foreach (SimTlv objTlv in objOther.m_lsTlvs) { m_lsTlvs.Add(new SimTlv(objTlv)); } }
private void AddToMessages(SimMessage objMessage) { string strReference = objMessage.Reference; if (objMessage.Direction == SimMessage.EMsgDir.OUT) { strReference = "n/a"; } // Add new item to the top of the listview ListViewItem objLvi = null; lvMessages.Items.Insert(0, objLvi = new ListViewItem(new string[] { objMessage.Direction.ToString(), objMessage.SystemId, objMessage.ToAddress, strReference, objMessage.Status, objMessage.Body })); objLvi.Name = objMessage.UserTag.ToString(); objLvi.Tag = objMessage; while (lvMessages.Items.Count > m_nKeepMaxMessages) { lvMessages.Items.RemoveAt(lvMessages.Items.Count - 1); } }
public frmSmsMessage(SimSession objSession, SimMessage objMessage, EFrmType eType, int nMultipartMode, int nUseGsmEncoding) { InitializeComponent(); m_objConstants = new AxSms.Constants(); m_objSmsAsm = new AxSms.Smpp(); m_objSmsAsm.MultipartMode = nMultipartMode; m_objSmsAsm.UseGsmEncoding = nUseGsmEncoding; m_eFrmType = eType; switch (m_eFrmType) { case EFrmType.CREATE: Text = "Create new SMS message"; btnSend.Text = "Ok"; break; case EFrmType.EDIT: Text = "Edit SMS message"; btnSend.Text = "Ok"; break; case EFrmType.VIEW: Text = "View SMS message"; btnCancel.Text = "Close"; btnSend.Visible = false; break; case EFrmType.SEND: Text = "Send SMS message"; btnSend.Text = "Send"; break; } if (objSession != null) { if (objSession.Ip.Contains(".")) { // IPv4 notation lblIp.Text = string.Format("{0}:{1}", objSession.Ip, objSession.Port); } else { // IPv6 notiation lblIp.Text = string.Format("[{0}]:{1}", objSession.Ip, objSession.Port); } lblSystemId.Text = objSession.SystemId; } if (objMessage == null) { m_objMessage = new SimMessage(); } else { m_objMessage = objMessage; } }
private void AddToAutoMessage(SimMessage objMessage) { ListViewItem objLvi = null; lvAutoMessage.Items.Add(objLvi = new ListViewItem(new string[] { objMessage.FromAddress, objMessage.ToAddress, objMessage.Body })); objLvi.Tag = objMessage; }
SimMessage bw_CreateDlr(SimMessage objIn, int nVersion, int nStatusCode, string strStatusText, AxSms.Constants objSmsConst) { SimMessage objDlr = new SimMessage(); // Swap adress objDlr.FromAddress = objIn.ToAddress; objDlr.FromAddressNpi = objIn.ToAddressNpi; objDlr.FromAddressTon = objIn.FromAddressTon; objDlr.ToAddress = ""; objDlr.ToAddressNpi = 0; objDlr.ToAddressTon = objSmsConst.TON_ALPHANUMERIC; // Set session information objDlr.SessionId = objIn.SessionId; objDlr.SystemId = objIn.SystemId; // Add TLV's, only for 3.4 or 5.0 clients. if (nVersion != objSmsConst.SMPP_VERSION_33) { objDlr.Tlvs.Clear(); AxSms.Tlv objAxTlv = new AxSms.Tlv(); SimTlv objTlv = new SimTlv(); objTlv.Tag = objSmsConst.SMPP_TLV_MESSAGE_STATE; objAxTlv.ValueAsInt8 = nStatusCode; objTlv.TlvType = SimTlv.TlvTypes.HEX; objTlv.TypedValue = objAxTlv.ValueAsHexString; objTlv.HexValue = objTlv.TypedValue; objDlr.Tlvs.Add(objTlv); objTlv = new SimTlv(); objTlv.Tag = objSmsConst.SMPP_TLV_RECEIPTED_MESSAGE_ID; objAxTlv.ValueAsString = objIn.Reference; objTlv.TlvType = SimTlv.TlvTypes.HEX; objTlv.TypedValue = objAxTlv.ValueAsHexString; objTlv.HexValue = objTlv.TypedValue; objDlr.Tlvs.Add(objTlv); } // NOTE: submit date and done date are the same! string strExcerpt = objIn.Body.Substring(0, Math.Min(objIn.Body.Length, 60)); int iNumSmsDelivered = nStatusCode == objSmsConst.SMPP_MESSAGESTATE_DELIVERED ? 1: 0; string strBody = string.Format("id:{0} sub:001 dlvrd:{1:D3} submit date:{2:yyMMddHHmmss} done date:{2:yyMMddHHmmss} stat:{3} err:000 text:{4}", objIn.Reference, iNumSmsDelivered, DateTime.Now, strStatusText, strExcerpt); // Complete delivery report formatting objDlr.IsDeliveryReport = true; objDlr.Body = strBody.Substring(0, Math.Min(strBody.Length, 160)); return(objDlr); }
private void lvMessages_DoubleClick(object sender, EventArgs e) { if (lvMessages.SelectedItems.Count <= 0) { return; } SimMessage objMessage = (SimMessage)lvMessages.SelectedItems[0].Tag; // See if I can find an active session for this message as well. // It's no problem if it's no longer there. SimSession objSession = null; ListViewItem[] lvs = lvSessions.Items.Find(objMessage.SessionId.ToString(), false); if (lvs.Length > 0) { objSession = (SimSession)lvs[0].Tag; } frmSmsMessage frm = new frmSmsMessage(objSession, objMessage, frmSmsMessage.EFrmType.VIEW, m_objSimModel.MultipartMode, m_objSimModel.UseGsmEncoding); // if it's a multipart message, try to find the rest of the parts as well if (objMessage.TotalParts > 1) { var lsParts = new List <SimMessage>(); foreach (ListViewItem lvi in lvMessages.Items) { SimMessage objPart = (SimMessage)lvi.Tag; if (objPart.TotalParts > 1 && objPart.MultipartReference == objMessage.MultipartReference && objPart.Direction == objMessage.Direction) { lsParts.Add(objPart); if (lsParts.Count == objMessage.TotalParts) { break; } } } frm.Parts = lsParts; } frm.ShowDialog(); }
private void btnEditAutoMessage_Click(object sender, EventArgs e) { if (lvAutoMessage.SelectedItems.Count <= 0) { return; } SimMessage objMessage = (SimMessage)lvAutoMessage.SelectedItems[0].Tag; frmSmsMessage frm = new frmSmsMessage(null, objMessage, frmSmsMessage.EFrmType.EDIT, m_objSimModel.MultipartMode, m_objSimModel.UseGsmEncoding); if (frm.ShowDialog() == DialogResult.OK) { ListViewItem lvi = lvAutoMessage.SelectedItems[0]; lvi.SubItems[AUTOMESSAGE_FROMADDRESS].Text = objMessage.FromAddress; lvi.SubItems[AUTOMESSAGE_TOADDRESS].Text = objMessage.ToAddress; lvi.SubItems[AUTOMESSAGE_BODY].Text = objMessage.Body; } PushAutoMessages(); }
void bw_AddOutgoing(SimMessage objMessage, Queue <SimMessage> qOut, List <SimMessage> lsGenerated, bool bCouldBeMultipart) { var lsParts = new List <SimMessage>(); if (bCouldBeMultipart) { AxSms.Message objRoot = objMessage.CreateAxSms(); if (m_objSplitSms.CountParts(objRoot) > 1) { AxSms.Message objPart = m_objSplitSms.GetFirstPart(objRoot); while (m_objSplitSms.LastError == 0) { lsParts.Add(new SimMessage(objPart)); objPart = m_objSplitSms.GetNextPart(); } } } if (lsParts.Count == 0) { lsParts.Add(objMessage); } if (qOut.Count > MAX_OUTGOING) { foreach (SimMessage objPart in lsParts) { objPart.Status = "SIMQFULL"; lsGenerated.Add(objPart); } } else { foreach (SimMessage objPart in lsParts) { objPart.Status = "QUEUED"; objPart.UserTag = m_objSimModel.GetAndIncLastUserTag(); lsGenerated.Add(objPart); qOut.Enqueue(objPart); } } }
private void bw_DoWork(BackgroundWorker objWorker, Logger objLogger, AxSms.SmppServer objServer) { if (m_objSimModel.IsServerLogEnabled) { objServer.LogFile = m_objSimModel.ServerLog; } AxSms.Constants objSmsConsts = new AxSms.Constants(); objServer.LastReference = m_objSimModel.LastReference; objServer.Start(m_objSimModel.Port, m_objSimModel.IpVersion, m_objSimModel.Certificate); SimCommand objCommand = new SimCommand(); objCommand.CommandId = SimCommand.ECommandId.RESPONSECODE; objCommand.LastError = objServer.LastError; objCommand.LastErrorDescription = objServer.GetErrorDescription(objServer.LastError); m_objSimModel.IsServerStarted = objServer.LastError == 0; PushGui(objCommand); if (objServer.LastError != 0) { objLogger.WriteLine("SmppServer, failed: [{0}:{1}]", objCommand.LastError, objCommand.LastErrorDescription); return; } else { objLogger.WriteLine("SmppServer started"); } // Initialize Smpp instance to do SMS splitting // This is very convenient because we don't need to use the orginal SmppSession object m_objSplitSms = new AxSms.Smpp(); m_objSplitSms.MultipartMode = m_objSimModel.MultipartMode; m_objSplitSms.UseGsmEncoding = m_objSimModel.UseGsmEncoding; // Replies long nLastReloadReplies = GetTickCount(); bool bEcho = m_objSimModel.Echo; SimErrorRates objErrorRates = m_objSimModel.GetErrorRates(); // Auto messages long nLastReloadAutoMsg = GetTickCount(); var lsAutoMessages = new List <SimMessage>(); lsAutoMessages = m_objSimModel.GetAutoMessages(); int nGeneratePerMinute = m_objSimModel.GeneratePerMinute; bool bRandomOrder = m_objSimModel.RandomOrder; int nAutoMsgIndex = 0; Random objRandom = new Random(); var dctWrkSessions = new Dictionary <int, WrkSession>(); while (!objWorker.CancellationPending) { var lsMessagesUpdated = new List <SimMessage>(); var lsMessagesGenerated = new List <SimMessage>(); var lsMessagesReceived = new List <SimMessage>(); // Check if the GUI has some requests while ((objCommand = PollGui()) != null) { WrkSession objWrkSession = null; dctWrkSessions.TryGetValue(objCommand.SessionId, out objWrkSession); switch (objCommand.CommandId) { case SimCommand.ECommandId.DROPSESSION: if (objWrkSession != null) { objWrkSession.bDrop = true; } break; case SimCommand.ECommandId.SENDMESSAGE: if (objWrkSession != null) { bw_AddOutgoing(objCommand.Message, objWrkSession.qOutMessages, lsMessagesGenerated, true); } break; } } // Quit if the server stopped for some reason if (!objServer.IsStarted) { m_objSimModel.IsServerStarted = false; break; } // Reset statistics count int nRecvPerSecond = 0, nSentPerSecond = 0; // Handle connected sessions var lsSessions = new List <SimSession>(); AxSms.SmppSession objSession = objServer.GetFirstSession(); while (objServer.LastError == 0) { // Creating objSimSession object early and only access it's properties since // accessing ActiveX properties (and methods) seems to be expensive in C# SimSession objSimSession = new SimSession(objSession); lsSessions.Add(objSimSession); // Get the current worker session WrkSession objWrkSession = null; if (!dctWrkSessions.ContainsKey(objSession.Id)) { dctWrkSessions[objSession.Id] = objWrkSession = new WrkSession(objSimSession, GetTickCount()); } else { objWrkSession = dctWrkSessions[objSession.Id]; } // Handle session bind requests if (objSimSession.ConnectionState == objSmsConsts.SMPP_SESSIONSTATE_BINDING) { // Respond to a bind required. If authentication is required test sysid int iResponse = 0; if (m_objSimModel.IsAuthRequired && (objSimSession.SystemId != m_objSimModel.SystemId || objSimSession.Password != m_objSimModel.Password)) { iResponse = objSmsConsts.SMPP_ESME_RINVPASWD; } objSession.RespondToBind(iResponse); // Generate a logfile path and set it if (m_objSimModel.IsSessionLogEnabled) { string strLogIp; if (objSimSession.Ip.Contains(".")) { // IPv4; np strLogIp = objSimSession.Ip; } else { // IPv6, can't have ':''s in a filename ! strLogIp = string.Format("[{0}]", objSimSession.Ip).Replace(':', '_'); } string strLogPath = string.Format("{0}{1}_{2}.log", m_objSimModel.SessionLog, strLogIp, objSimSession.Port); objSession.LogPduDetails = m_objSimModel.IsPduLogEnabled; objSession.LogFile = strLogPath; } // Apply server settings objSession.PduTimeout = m_objSimModel.PduTimeout; objSession.EnquireInterval = m_objSimModel.EnquireInterval; objSession.UseGsmEncoding = m_objSimModel.UseGsmEncoding; objSession.DeliverMode = m_objSimModel.DeliverMode; } // Generate auto-messages. int iNumMessages = objWrkSession.CalculateMessagesToSend(GetTickCount(), nGeneratePerMinute); if (lsAutoMessages.Count > 0) { for (int i = 0; i < iNumMessages; i++) { // Determine the message index of the auto-message to sent if (bRandomOrder) { nAutoMsgIndex = objRandom.Next(lsAutoMessages.Count); } else { if (nAutoMsgIndex < lsAutoMessages.Count - 1) { nAutoMsgIndex++; } else { nAutoMsgIndex = 0; } } // If there's room in the output queue, add it to the output queue // othewise, reject the message, queue full.. SimMessage objMessage = new SimMessage(lsAutoMessages[nAutoMsgIndex]); objMessage.SessionId = objSimSession.Id; objMessage.SystemId = objSimSession.SystemId; bw_AddOutgoing(objMessage, objWrkSession.qOutMessages, lsMessagesGenerated, true); } } // Sent SMS messages in sent queue int nOut = objSession.CountSmsDeliverySpace(); while (objWrkSession.qOutMessages.Count > 0 && nOut > 0) { SimMessage objSimMessage = objWrkSession.qOutMessages.Dequeue(); AxSms.Message objMessage = objSimMessage.CreateAxSms(); // reject multipart messages because they should all have been splitup before beeing // added to the output queue. objSession.DeliverSms(objMessage, objSmsConsts.MULTIPART_REJECT); if (objSession.LastError != 0) { objSimMessage.Status = string.Format("SUBMITERROR({0})", objSession.LastError); } else { objSimMessage.Status = "DELIVERED"; } lsMessagesUpdated.Add(objSimMessage); } // Fetch updates for messages that have been sent AxSms.Message objResponse = objSession.ReceiveDeliverResponse(); while (objSession.LastError == 0) { SimMessage objSimMessage = new SimMessage(objResponse); objSimMessage.SystemId = objSimSession.SystemId; objSimMessage.SessionId = objSimSession.Id; objSimMessage.Status = objSmsConsts.SmppEsmeToString(objSimMessage.CommandStatus).Replace("SMPP_ESME_", ""); lsMessagesUpdated.Add(objSimMessage); objResponse = objSession.ReceiveDeliverResponse(); } // Fetch received messages AxSms.Message objReceived = objSession.ReceiveSubmitSms(); while (objSession.LastError == 0) { SimMessage objSimMessage = new SimMessage(objReceived); objSimMessage.SystemId = objSimSession.SystemId; objSimMessage.SessionId = objSimSession.Id; // Determine command status int nCommandStatus = 0; int nRandCmdStatus = objRandom.Next(100); int nRandCmdStatusOffs = 0; foreach (SimMessageErrorRate objErrr in objErrorRates.MessageErrorRates) { nRandCmdStatusOffs += objErrr.Occurance; if (nRandCmdStatus <= nRandCmdStatusOffs) { nCommandStatus = objErrr.StatusCode; break; } } // Respond to SMS message objReceived.SmppCommandStatus = objSimMessage.CommandStatus = nCommandStatus; objSession.RespondToSubmitSms(objReceived); // Set message status text and add it to the 'received' list // generate a usertag for received messages as well. The GUI relies on every message to have a unique ID objSimMessage.Status = objSmsConsts.SmppEsmeToString(objSimMessage.CommandStatus).Replace("SMPP_ESME_", ""); objSimMessage.UserTag = m_objSimModel.GetAndIncLastUserTag(); lsMessagesReceived.Add(objSimMessage); // Determine command status if (objSimMessage.RequestDeliveryReport && nCommandStatus == 0) { int nRandDlrStatus = objRandom.Next(100); int nRandDlrStatusOffs = 0; int nStatusCode = objSmsConsts.SMPP_MESSAGESTATE_DELIVERED; string strStatusText = "DELIVRD"; foreach (SimDeliveryErrorRate objErrr in objErrorRates.DeliveryErrorRates) { nRandDlrStatusOffs += objErrr.Occurance; if (nRandDlrStatus <= nRandDlrStatusOffs) { nStatusCode = objErrr.Code; strStatusText = objErrr.Text; break; } } SimMessage objDlr = bw_CreateDlr(objSimMessage, objSimSession.Version, nStatusCode, strStatusText, objSmsConsts); bw_AddOutgoing(objDlr, objWrkSession.qOutMessages, lsMessagesGenerated, false); } if (bEcho) { SimMessage objEcho = new SimMessage(objSimMessage); objEcho.FromAddress = objSimMessage.ToAddress; objEcho.FromAddressNpi = objSimMessage.ToAddressNpi; objEcho.FromAddressTon = objSimMessage.ToAddressTon; objEcho.ToAddress = objSimMessage.FromAddress; objEcho.ToAddressNpi = objSimMessage.FromAddressNpi; objEcho.ToAddressTon = objSimMessage.FromAddressTon; bw_AddOutgoing(objEcho, objWrkSession.qOutMessages, lsMessagesGenerated, false); } objReceived = objSession.ReceiveSubmitSms(); } // Don't support SMS queries objReceived = objSession.ReceiveQuerySms(); while (objSession.LastError == 0) { // Just immediately respond with an error. objReceived.SmppCommandStatus = objSmsConsts.SMPP_ESME_RINVCMDID; objSession.RespondToQuerySms(objReceived); objReceived = objSession.ReceiveQuerySms(); } if (objWrkSession.bDrop) { objSession.Disconnect(); } // Update statistics nRecvPerSecond += objSession.SmsReceivedPerSecond; nSentPerSecond += objSession.SmsSentPerSecond; objSession = objServer.GetNextSession(); } // Make a list of disconnected sessions var lsDisconnected = new List <SimSession>(); objSession = objServer.GetClosedSession(); while (objServer.LastError == 0) { SimSession objSimSession = new SimSession(objSession); lsDisconnected.Add(objSimSession); dctWrkSessions.Remove(objSimSession.Id); objSession = objServer.GetClosedSession(); } // Set global stats m_objSimModel.RecvPerSecond = nRecvPerSecond; m_objSimModel.SentPerSecond = nSentPerSecond; m_objSimModel.LastReference = objServer.LastReference; // See if there's a need to sent the delta messages to the GUI if (lsMessagesUpdated.Count > 0 || lsMessagesReceived.Count > 0 || lsMessagesGenerated.Count > 0) { objCommand = new SimCommand(); objCommand.CommandId = SimCommand.ECommandId.MESSAGESDELTA; objCommand.MessagesUpdated = lsMessagesUpdated; objCommand.MessagesReceived = lsMessagesReceived; objCommand.MessagesGenerated = lsMessagesGenerated; PushGui(objCommand); } if (lsDisconnected.Count > 0) { objCommand = new SimCommand(); objCommand.CommandId = SimCommand.ECommandId.DROPSESSION; objCommand.Sessions = lsDisconnected; PushGui(objCommand); } // Don't continuously refresh the auto-messages. They are not updated that often and // a small lag here is not very noticable. if (GetTickCount() - nLastReloadAutoMsg > AUTOMESSAGE_RELOAD_TOMS) { nLastReloadAutoMsg = GetTickCount(); lsAutoMessages = m_objSimModel.GetAutoMessages(); nGeneratePerMinute = m_objSimModel.GeneratePerMinute; bRandomOrder = m_objSimModel.RandomOrder; } // Don't continuously refresh reply settings, but do refresh them a bit // more often than the autoreply settings because its very visible. if (GetTickCount() - nLastReloadReplies > REPLIES_RELOAD_TOMS) { nLastReloadReplies = GetTickCount(); bEcho = m_objSimModel.Echo; objErrorRates = m_objSimModel.GetErrorRates(); } m_objSimModel.SetSessions(lsSessions); Thread.Sleep(100); } }
private void frmMain_Load(object sender, EventArgs e) { var objSettings = Settings.Default; // force save settings right away objSettings.LastReference = objSettings.LastReference; objSettings.Save(); m_Logger = new Logger(objSettings.ViewLogFile); m_Logger.WriteLine("Startup SMPP Simulator"); m_objSimWorker = new SimWorker(); m_objSimModel = m_objSimWorker.SimModel; m_objSmsConstants = new AxSms.Constants(); // IP Version combo box var dctIpVersion = new Dictionary <string, int>(); dctIpVersion.Add("IPv6/IPv4", m_objSmsConstants.SMPP_IPVERSION_BOTH); dctIpVersion.Add("IPv6", m_objSmsConstants.SMPP_IPVERSION_6); dctIpVersion.Add("IPv4", m_objSmsConstants.SMPP_IPVERSION_4); cbxIpVersion.DisplayMember = "Key"; cbxIpVersion.ValueMember = "Value"; cbxIpVersion.DataSource = new BindingSource(dctIpVersion, null); // Make sure to update all the SESSION_ constants when changing stuff here !!!! lvSessions.Columns.Add("Client IP", (int)(lvSessions.Width * .25), HorizontalAlignment.Left); lvSessions.Columns.Add("Client Port", (int)(lvSessions.Width * .25), HorizontalAlignment.Left); lvSessions.Columns.Add("SystemID", (int)(lvSessions.Width * .24), HorizontalAlignment.Left); lvSessions.Columns.Add("Connection State", (int)(lvSessions.Width * .25), HorizontalAlignment.Left); lvSessions.AutoResizeColumn(3, ColumnHeaderAutoResizeStyle.HeaderSize); // Make sure to update all the MESSAGE_ constants when changing stuff here !!!! lvMessages.Columns.Add("Dir.", (int)(lvMessages.Width * .1), HorizontalAlignment.Left); lvMessages.Columns.Add("SystemID", (int)(lvMessages.Width * .20), HorizontalAlignment.Left); lvMessages.Columns.Add("ToAddress", (int)(lvMessages.Width * .15), HorizontalAlignment.Left); lvMessages.Columns.Add("Reference", (int)(lvMessages.Width * .15), HorizontalAlignment.Left); lvMessages.Columns.Add("State", (int)(lvMessages.Width * .15), HorizontalAlignment.Left); lvMessages.Columns.Add("Body", -2, HorizontalAlignment.Left); // Make sure to update all the AUTOMESSAGE_ constants when changing stuff here !!!! lvAutoMessage.Columns.Add("FromAddress", (int)(lvAutoMessage.Width * .20), HorizontalAlignment.Left); lvAutoMessage.Columns.Add("ToAddress", (int)(lvAutoMessage.Width * .20), HorizontalAlignment.Left); lvAutoMessage.Columns.Add("Body", (int)(lvAutoMessage.Width * .59), HorizontalAlignment.Left); // Set the hyperlinks in the GUI llblAxLink.Text = "Try other SMS software products by Auron Software."; llblAxLink.Links.Add(llblAxLink.Text.IndexOf("SMS software products"), "SMS software products".Length, "https://www.auronsoftware.com/products/"); llblAxLink.LinkClicked += new LinkLabelLinkClickedEventHandler(llblAxLink_LinkClicked); llblFooterText.Text = "Auron SMPP Simulator is freeware. It uses Auron SMS Component.\r\n"; llblFooterText.Text += "For more information on Auron SMS products, click here."; llblFooterText.Links.Add(llblFooterText.Text.IndexOf("click here"), "click here".Length, "https://www.auronsoftware.com/products/"); llblFooterText.LinkClicked += new LinkLabelLinkClickedEventHandler(llblAxLink_LinkClicked); // Initialize model m_objSimModel.LastReference = objSettings.LastReference + SimConstants.ADDREFERENCES_ONAPPSTART; m_objSimModel.Port = objSettings.Port; m_objSimModel.IpVersion = objSettings.IpVersion; m_objSimModel.IsAuthRequired = objSettings.AuthRequired; m_objSimModel.SystemId = objSettings.SystemId; m_objSimModel.Password = objSettings.Password; m_objSimModel.IsPduLogEnabled = objSettings.PduLogEnabled; m_objSimModel.IsServerLogEnabled = objSettings.ServerLogEnabled; m_objSimModel.IsSessionLogEnabled = objSettings.SessionLogEnabled; m_objSimModel.ServerLog = objSettings.ServerLog; m_objSimModel.SessionLog = objSettings.SessionLog; m_objSimModel.GeneratePerMinute = objSettings.GeneratePerMinute; m_objSimModel.RandomOrder = objSettings.RandomOrder; m_objSimModel.Echo = objSettings.Echo; m_objSimModel.PduTimeout = objSettings.PduTimeout; m_objSimModel.EnquireInterval = objSettings.EnquireInterval; m_objSimModel.UseGsmEncoding = objSettings.UseGsmEncoding; m_objSimModel.MultipartMode = objSettings.MultipartMode; m_objSimModel.DeliverMode = objSettings.DeliverMode; m_objSimModel.CertificateStore = objSettings.CertificateStore; m_nKeepMaxMessages = objSettings.KeepMessages; m_strAutoMessagesFile = objSettings.AutoMessageFile; // pre-load auto messages if (LoadAutoMessages(m_strAutoMessagesFile) != 0) { SimMessage objMessage = null; AddToAutoMessage(new SimMessage("+123123123", SimConstants.DEFAULT_FROMADDRESS, "Hello, World!")); AddToAutoMessage(objMessage = new SimMessage("+321321321", SimConstants.DEFAULT_FROMADDRESS, "مرحبا، العالم")); objMessage.DataCoding = m_objSmsConstants.DATACODING_UNICODE; AddToAutoMessage(objMessage = new SimMessage("+231231231", SimConstants.DEFAULT_FROMADDRESS, "नमस्ते दुनिया")); objMessage.DataCoding = m_objSmsConstants.DATACODING_DEFAULT; objMessage.LanguageShift = m_objSmsConstants.LANGUAGE_SINGLESHIFT_HINDI; AddToAutoMessage(objMessage = new SimMessage("+123123123", SimConstants.DEFAULT_FROMADDRESS, "48656c6c6f2c20576f726c6421")); objMessage.BodyFormat = m_objSmsConstants.BODYFORMAT_HEX; } PushAutoMessages(); // Push error rates to model. SimErrorRates objErrorRates = new SimErrorRates(); string strMessageRates = objSettings.MessageErrorRates; string strDeliveryRates = objSettings.DeliveryErrorRates; string[] aMessageRates = strMessageRates.Split(';'); try { foreach (string strMessageRate in aMessageRates) { SimMessageErrorRate objErrr = new SimMessageErrorRate(); string[] aMessageRate = strMessageRate.Split(','); objErrr.StatusCode = int.Parse(aMessageRate[0]); objErrr.Occurance = int.Parse(aMessageRate[1]); objErrorRates.MessageErrorRates.Add(objErrr); } } catch (Exception x) { m_Logger.WriteLine("Error while parsing message rates: {0}", x.ToString()); } string[] aDeliveryRates = strDeliveryRates.Split(';'); try { foreach (string strDeliveryRate in aDeliveryRates) { SimDeliveryErrorRate objErrr = new SimDeliveryErrorRate(); string[] aDeliveryRate = strDeliveryRate.Split(','); objErrr.Code = int.Parse(aDeliveryRate[0]); objErrr.Text = aDeliveryRate[1]; objErrr.Occurance = int.Parse(aDeliveryRate[2]); objErrorRates.DeliveryErrorRates.Add(objErrr); } } catch (Exception x) { m_Logger.WriteLine("Error while parsing delivery rates: {0}", x.ToString()); } m_objSimModel.SetErrorRates(objErrorRates); // Set other control values txtServerLog.Text = m_objSimModel.ServerLog; txtSessionLog.Text = m_objSimModel.SessionLog; cbEnableServerLog.Checked = m_objSimModel.IsServerLogEnabled; cbEnableSessionLog.Checked = m_objSimModel.IsSessionLogEnabled; cbEnablePduLog.Checked = m_objSimModel.IsPduLogEnabled; cbAuthentication.Checked = m_objSimModel.IsAuthRequired; txtSystemId.Text = m_objSimModel.SystemId; txtPassword.Text = m_objSimModel.Password; txtMaxSendPerMinute.Text = m_objSimModel.GeneratePerMinute.ToString(); cbRandom.Checked = m_objSimModel.RandomOrder; cbEcho.Checked = m_objSimModel.Echo; ReloadCertificates(); objSettings.Save(); UpdateControls(); }
private void btnSaveAutoMessage_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "XML Files|*.xml"; if (dlg.ShowDialog() != DialogResult.OK) { return; } XmlWriter objXmlWriter = null; try { // Save to an XML file XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; objXmlWriter = XmlWriter.Create(dlg.FileName, settings); objXmlWriter.WriteStartDocument(); objXmlWriter.WriteStartElement(SimConstants.XML_AUTOMESSAGE_ROOT_NODE); foreach (ListViewItem objLvi in lvAutoMessage.Items) { SimMessage objMessage = (SimMessage)objLvi.Tag; objXmlWriter.WriteStartElement(SimConstants.XML_AUTOMESSAGE_ELEMENT_NODE); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TOADDRESS, objMessage.ToAddress); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TONPI, objMessage.ToAddressNpi.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TOTON, objMessage.ToAddressTon.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_FROMADDRESS, objMessage.FromAddress); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_FROMNPI, objMessage.FromAddressNpi.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_FROMTON, objMessage.FromAddressTon.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_BODY, objMessage.Body); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_HASUDH, objMessage.HasUdh.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_ISDLR, objMessage.IsDeliveryReport.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_BODYFORMAT, objMessage.BodyFormat.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_DATACODING, objMessage.DataCoding.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_LANGUAGESHIFT, objMessage.LanguageShift.ToString()); foreach (SimTlv objTlv in objMessage.Tlvs) { objXmlWriter.WriteStartElement(SimConstants.XML_AUTOMESSAGE_ELEMENT_TLV); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TAG, objTlv.Tag.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TYPE, objTlv.TlvType.ToString()); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_HEXVALUE, objTlv.HexValue); objXmlWriter.WriteAttributeString(SimConstants.XML_AUTOMESSAGE_FIELD_TYPEDVALUE, objTlv.TypedValue); objXmlWriter.WriteEndElement(); } objXmlWriter.WriteEndElement(); } objXmlWriter.WriteEndElement(); objXmlWriter.WriteEndDocument(); } catch { m_Logger.WriteLine("SaveAutoMessages failed, exception: {0}", e.ToString()); MessageBox.Show("Error while saving XML file.", Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); } if (objXmlWriter != null) { objXmlWriter.Close(); } }
private int LoadAutoMessages(string strFile) { XmlTextReader objXml = null; try { var lsAutoMsg = new List <SimMessage>(); objXml = new XmlTextReader(strFile); SimMessage objMessage = null; while (objXml.Read()) { if (objXml.NodeType == XmlNodeType.Element && objXml.Name == SimConstants.XML_AUTOMESSAGE_ELEMENT_NODE) { objMessage = new SimMessage(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TOADDRESS], objXml[SimConstants.XML_AUTOMESSAGE_FIELD_FROMADDRESS], objXml[SimConstants.XML_AUTOMESSAGE_FIELD_BODY]); objMessage.ToAddressNpi = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TONPI]); objMessage.ToAddressTon = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TOTON]); objMessage.FromAddressNpi = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_FROMNPI]); objMessage.FromAddressTon = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_FROMTON]); objMessage.HasUdh = bool.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_HASUDH]); objMessage.IsDeliveryReport = bool.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_ISDLR]); objMessage.DataCoding = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_DATACODING]); objMessage.BodyFormat = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_BODYFORMAT]); objMessage.LanguageShift = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_LANGUAGESHIFT]); lsAutoMsg.Add(objMessage); } else if (objXml.NodeType == XmlNodeType.Element && objXml.Name == SimConstants.XML_AUTOMESSAGE_ELEMENT_TLV) { SimTlv objTlv = new SimTlv(); objTlv.Tag = int.Parse(objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TAG]); objTlv.TlvType = (SimTlv.TlvTypes)Enum.Parse(typeof(SimTlv.TlvTypes), objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TYPE]); objTlv.HexValue = objXml[SimConstants.XML_AUTOMESSAGE_FIELD_HEXVALUE]; objTlv.TypedValue = objXml[SimConstants.XML_AUTOMESSAGE_FIELD_TYPEDVALUE]; if (objMessage != null) { objMessage.Tlvs.Add(objTlv); } } } lvAutoMessage.Items.Clear(); foreach (SimMessage objSms in lsAutoMsg) { AddToAutoMessage(objSms); } PushAutoMessages(); } catch (Exception e) { // Error while reading the XML file m_Logger.WriteLine("LoadAutoMessages failed, exception: {0}", e.ToString()); return(1); } if (objXml != null) { objXml.Close(); } return(0); }
private void tmrServer_Tick(object sender, EventArgs e) { //////////////////////////////////////////////////////////////////////////////// // Update server status //////////////////////////////////////////////////////////////////////////////// if (!m_objSimModel.IsServerStarted) { tmrServer.Stop(); UpdateControls(); return; } //////////////////////////////////////////////////////////////////////////////// // Update session information //////////////////////////////////////////////////////////////////////////////// var lsSessions = m_objSimModel.GetSessions(); foreach (SimSession objSession in lsSessions) { ListViewItem[] lvs = lvSessions.Items.Find(objSession.Id.ToString(), false); if (lvs.Length == 0) { // Add new session information ListViewItem lvi = new ListViewItem(new String[] { objSession.Ip, objSession.Port.ToString(), objSession.SystemId, getSessionStateString(objSession.ConnectionState) }); lvi.Tag = objSession; lvi.Name = objSession.Id.ToString(); lvSessions.Items.Add(lvi); } else { // Update session information ListViewItem lvi = lvs[0]; lvi.SubItems[LVI_SESSION_SYSTEMID].Text = objSession.SystemId; lvi.SubItems[LVI_SESSION_CONNECTIONSTATE].Text = getSessionStateString(objSession.ConnectionState); } } //////////////////////////////////////////////////////////////////////////////// // Handle worker messages //////////////////////////////////////////////////////////////////////////////// SimCommand objCommand = null; while ((objCommand = m_objSimWorker.PollWorker()) != null) { if (objCommand.CommandId == SimCommand.ECommandId.DROPSESSION) { foreach (SimSession objSession in objCommand.Sessions) { lvSessions.Items.RemoveByKey(objSession.Id.ToString()); } } else if (objCommand.CommandId == SimCommand.ECommandId.MESSAGESDELTA) { // These are new SMS messages that have been gerenated inside the worker thread m_nTotalMessages += objCommand.MessagesGenerated.Count; foreach (SimMessage objSms in objCommand.MessagesGenerated) { SimMessage objMessage = new SimMessage(objSms); objMessage.Direction = SimMessage.EMsgDir.OUT; AddToMessages(objMessage); } // These are SMS messages that are received in the worker thread m_nTotalMessages += objCommand.MessagesReceived.Count; foreach (SimMessage objSms in objCommand.MessagesReceived) { SimMessage objMessage = new SimMessage(objSms); objMessage.Direction = SimMessage.EMsgDir.IN; AddToMessages(objMessage); } // These are updates for SMS messages we already know about foreach (SimMessage objSms in objCommand.MessagesUpdated) { ListViewItem[] lvs = lvMessages.Items.Find(objSms.UserTag.ToString(), false); if (lvs.Length == 0) { continue; } ListViewItem objLvi = lvs[0]; objLvi.SubItems[LVI_MESSAGE_STATE].Text = objSms.Status; if (objSms.Reference != null) { objLvi.SubItems[LVI_MESSAGE_REFERENCE].Text = objSms.Reference; } SimMessage objOther = (SimMessage)objLvi.Tag; objOther.Reference = objSms.Reference; } } } //////////////////////////////////////////////////////////////////////////////// // Update settings //////////////////////////////////////////////////////////////////////////////// m_objSimModel.SystemId = txtSystemId.Text; m_objSimModel.Password = txtPassword.Text; m_objSimModel.IsAuthRequired = cbAuthentication.Checked; m_objSimModel.GeneratePerMinute = int.Parse(txtMaxSendPerMinute.Text); m_objSimModel.RandomOrder = cbRandom.Checked; m_objSimModel.Echo = cbEcho.Checked; m_nKeepMaxMessages = int.Parse(txtKeepNumberMessages.Text); int nReceived = m_objSimModel.RecvPerSecond; int nSent = m_objSimModel.SentPerSecond; UpdateLables(nReceived, nSent); }