Beispiel #1
0
        /// <summary>
        /// Fills the object with values from the data byte.
        /// </summary>
        /// <param name="b">The byte value.</param>
        protected override void FromByte(byte b)
        {
            OutgoingMessageType outgoingMessageType = OutgoingMessageType.SmsSubmit;

            if ((b & 1) > 0)
            {
                outgoingMessageType = OutgoingMessageType.SmsSubmit;
            }
            if (outgoingMessageType == OutgoingMessageType.SmsSubmit)
            {
                this.rejectDuplicates     = (b & 4) > 0;
                this.validityPeriodFormat = ValidityPeriodFormat.Unspecified;
                if ((b & 24) > 0)
                {
                    this.validityPeriodFormat = ValidityPeriodFormat.Absolute;
                }
                if ((b & 16) > 0)
                {
                    this.validityPeriodFormat = ValidityPeriodFormat.Relative;
                }
                if ((b & 8) > 0)
                {
                    this.validityPeriodFormat = ValidityPeriodFormat.Enhanced;
                }
                this.requestStatusReport   = (b & 32) > 0;
                this.userDataHeaderPresent = (b & 64) > 0;
                this.replyPathExists       = (b & 128) > 0;
                return;
            }
            else
            {
                throw new ArgumentException("Not an SMS-SUBMIT message.");
            }
        }
Beispiel #2
0
 /// <summary>
 /// Decodes an outgoing SMS PDU stream.
 /// </summary>
 /// <param name="pdu">The PDU string to decode</param>
 /// <param name="includesSmscData">Specify true if the PDU data contains an SMSC header, otherwise false.</param>
 /// <param name="actualLength">The length of the PDU in bytes, not including the SMSC header.</param>
 /// <returns>An <see cref="T:GsmComm.PduConverter.OutgoingSmsPdu" /> object representing the decoded message.</returns>
 public static OutgoingSmsPdu Decode(string pdu, bool includesSmscData, int actualLength)
 {
     if (pdu != string.Empty)
     {
         int num = 0;
         if (includesSmscData)
         {
             int num1 = num;
             num = num1 + 1;
             byte num2 = BcdWorker.GetByte(pdu, num1);
             if (num2 > 0)
             {
                 num = num + num2;
             }
         }
         int num3 = num;
         OutgoingMessageType messageType         = OutgoingSmsPdu.GetMessageType(BcdWorker.GetByte(pdu, num3));
         OutgoingMessageType outgoingMessageType = messageType;
         if (outgoingMessageType != OutgoingMessageType.SmsSubmit)
         {
             throw new NotSupportedException(string.Concat("Message type ", messageType.ToString(), " recognized, but not supported by the SMS decoder."));
         }
         else
         {
             return(new SmsSubmitPdu(pdu, includesSmscData, actualLength));
         }
     }
     else
     {
         throw new ArgumentException("pdu must not be an empty string.");
     }
 }
        /// <summary>
        /// Handles the SelectedIndexChanged event of the cboMessageType control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void cboMessageType_SelectedIndexChanged(object sender, EventArgs e)
        {
            OutgoingMessageType messageType =(OutgoingMessageType)StringEnum.Parse(typeof(OutgoingMessageType), cboMessageType.Text);
            if (messageType == OutgoingMessageType.SMS)
            {
                pnlMessage.Visible = true;
                pnlWapPush.Visible = false;
            }
            else if (messageType == OutgoingMessageType.WAPPush)
            {
                pnlMessage.Visible = false;
                pnlWapPush.Visible = true;
            }

        }
        /// <summary>
        /// Presets the message details.
        /// </summary>
        /// <param name="msg">The MSG.</param>
        private void PresetMessageDetails(IActiveRecord rec)
        {
            if (rec.GetType() == typeof(IncomingMessage))
            {
                IncomingMessage msg = rec as IncomingMessage;
                txtMessageContent.Text = msg.Message;
                pnlMessage.Visible = true;
                pnlWapPush.Visible = false;
            }
            else if (rec.GetType() == typeof(OutgoingMessage))
            {
                 OutgoingMessage msg = rec as OutgoingMessage;
                 OutgoingMessageType messageType = (OutgoingMessageType)StringEnum.Parse(typeof(OutgoingMessageType), msg.MessageType);
                 if (messageType == OutgoingMessageType.SMS)
                 {
                     txtMessageContent.Text = msg.Message;
                     pnlMessage.Visible = true;
                     pnlWapPush.Visible = false;
                 }
                 else if (messageType == OutgoingMessageType.WAPPush)
                 {
                     cboMessageType.Text = msg.MessageType;
                     txtWapPushMessage.Text = msg.Message;
                     txtWapPushUrl.Text = msg.WapUrl;
                     cboWapPushSignal.Text = msg.WapSignal;

                     if (msg.WapCreateDate.HasValue)
                     {
                         chkWapPushCreated.Checked = true;
                         dtpWapPushCreated.Value = msg.WapCreateDate.Value;
                     }

                     if (msg.WapExpiryDate.HasValue)
                     {
                         chkWapPushExpiry.Checked = true;
                         dtpWapPushExpiryDate.Value = msg.WapExpiryDate.Value;
                     }

                     pnlMessage.Visible = false;
                     pnlWapPush.Visible = true;
                 }
            }
        }
        /// <summary>
        /// Handles the SelectedIndexChanged event of the lvwMessages control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void lvwMessages_SelectedIndexChanged(object sender, EventArgs e)
        {
            OutgoingMessage selectedMessage = (OutgoingMessage)lvwMessages.SelectedObject;

            if (selectedMessage != null)
            {
                OutgoingMessageType messageType = (OutgoingMessageType)StringEnum.Parse(typeof(OutgoingMessageType), selectedMessage.MessageType);
                lblTo.Text          = selectedMessage.Recipient;
                lblStatus.Text      = selectedMessage.Status;
                lblID.Text          = selectedMessage.Id;
                lblFrom.Text        = selectedMessage.Originator;
                lblPriority.Text    = selectedMessage.Priority;
                lblMessageType.Text = selectedMessage.MessageType;
                lblGatewayID.Text   = selectedMessage.GatewayId;
                lblLastUpdate.Text  = selectedMessage.LastUpdate.ToString();
                rtbContent.Text     = selectedMessage.Message;

                if (messageType == OutgoingMessageType.SMS)
                {
                    lblURL.Text = string.Empty;
                }
                else if (messageType == OutgoingMessageType.WAPPush)
                {
                    lblURL.Text = selectedMessage.WapUrl;
                }

                if (selectedMessage.ScheduledDate.HasValue)
                {
                    lblScheduled.Text = selectedMessage.ScheduledDate.ToString();
                }
                else
                {
                    lblScheduled.Text = Resources.MsgNow;
                }
            }
        }
Beispiel #6
0
 public static bool TryDeserializeOutgoing(string message, out OutgoingMessageType messageType, out ArraySegment <JsonElement> args)
 => TryDeserialize(message, out messageType, out args);
Beispiel #7
0
 public static string Serialize(OutgoingMessageType messageType, params object[] args)
 => Serialize(messageType.ToString(), args);
        /// <summary>
        /// Saves the changes.
        /// </summary>
        /// <returns></returns>
        private bool SaveChanges()
        {
            OutgoingMessageType messageType =(OutgoingMessageType)StringEnum.Parse(typeof(OutgoingMessageType), cboMessageType.Text);
          
            // Validate recipients are not empty
            if (!FormHelper.ValidateNotEmpty(txtTo, Resources.MsgRecipientsRequired))
            {
                return false;
            }

            if (messageType == OutgoingMessageType.SMS) 
            {
                // Validate message is not empty
                if (!FormHelper.ValidateNotEmpty(txtMessageContent, Resources.MsgContentRequired))
                {
                    return false;
                }
            } 
            else if (messageType == OutgoingMessageType.WAPPush)
            {
                 // Validate URL
                if (!FormHelper.ValidateNotEmpty(txtWapPushUrl, Resources.MsgURLRequired))
                {
                    return false;
                }

                // Validate message is not empty
                if (!FormHelper.ValidateNotEmpty(txtWapPushMessage, Resources.MsgContentRequired))
                {
                    return false;
                }
            }


            // The To list can be separated by comma or semicolon
            string[] toList = txtTo.Text.Split(GuiHelper.SupportedSeparators, StringSplitOptions.RemoveEmptyEntries);                                   
            try
            {  
                string groupId = GatewayHelper.GenerateUniqueIdentifier();  
                using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope())
                {                    
                    using (TransactionScope ts = new TransactionScope())
                    {
                        try
                        {
                            foreach (string to in toList)
                            {
                                OutgoingMessage message = new OutgoingMessage();
                                message.Id = GatewayHelper.GenerateUniqueIdentifier();
                                message.GatewayId = cboChannel.Text;
                                message.Recipient = to.Trim();
                                message.Originator = txtFrom.Text;
                                message.MessageType = cboMessageType.Text;                                
                                message.MessageFormat = cboMessageFormat.Text;
                                message.LastUpdate = DateTime.Now;
                                message.CreateDate = message.LastUpdate;
                                message.SrcPort = Convert.ToInt32(npdSourcePort.Value);
                                message.DestPort = Convert.ToInt32(npdDestinationPort.Value);
                                message.Status = StringEnum.GetStringValue(MessageStatus.Pending);
                                message.MessageClass = cboMessageClass.Text;
                                message.Priority = cboPriority.Text;
                                message.StatusReport = cboStatusReport.Text;
                                message.Quantity = Convert.ToInt32(npdQuantity.Value);
                                message.GroupId = groupId;
                                if (chkScheduleSendTime.Checked)
                                    message.ScheduledDate = dtpScheduleTime.Value;

                                if (messageType == OutgoingMessageType.SMS)
                                {
                                    message.Message = txtMessageContent.Text;
                                }
                                else if (messageType == OutgoingMessageType.WAPPush)
                                {
                                    message.WapUrl = txtWapPushUrl.Text;
                                    message.WapSignal = cboWapPushSignal.Text;
                                    message.Message = txtWapPushMessage.Text;
                                    if (chkWapPushCreated.Checked)
                                        message.WapCreateDate = dtpWapPushCreated.Value;
                                    if (chkWapPushExpiry.Checked)                                    
                                        message.WapExpiryDate = dtpWapPushExpiryDate.Value;
                                    
                                }

                                message.Save();
                            }
                        }
                        finally
                        {
                            try
                            {
                                ts.Complete();
                            }
                            catch (Exception) { }   
                            
                            // Refresh the message view
                            RefreshMessageView(ViewAction.RefreshOutbox);
                        }
                    }
                }
               
            }
            catch (Exception ex)
            {
                FormHelper.ShowError(ex.Message);
                return false;
            }

            // Show successful save message
            if (toList.Count() == 1)
            {
                FormHelper.ShowInfo(Resources.MsgSingleMessageCreated);
            }
            else
            {
                FormHelper.ShowInfo(string.Format(Resources.MsgMultipleMessagesCreated, toList.Count()));
            }

            return true;
        }
        /// <summary>
        /// Handles the Load event of the frmMessageDetails control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void frmMessageDetails_Load(object sender, EventArgs e)
        {
            if (Message == null)
            {
                FormHelper.ShowError(Resources.MsgNoMessageToDisplay);
                return;
            }

            if (this.Message.GetType() == typeof(IncomingMessage))
            {
                IncomingMessage msg = this.Message as IncomingMessage;
                txtID.Text         = msg.Id;
                txtType.Text       = msg.MessageType;
                txtLastUpdate.Text = msg.LastUpdate.ToString();
                txtSent.Text       = string.Empty;
                txtReceived.Text   = msg.ReceivedDate.ToString();
                txtScheduled.Text  = string.Empty;
                txtChannel.Text    = msg.GatewayId;
                txtReference.Text  = msg.Indexes;
                txtStatus.Text     = msg.Status;
                txtFrom.Text       = msg.Originator;
                txtTo.Text         = string.Empty;
                txtFormat.Text     = string.Empty;
                txtPriority.Text   = string.Empty;
                rtbBody.Text       = msg.Message;
                grpSms.Visible     = true;
                grpWapPush.Visible = false;

                tsbMessageReply.Enabled = true;
            }
            else if (this.Message.GetType() == typeof(OutgoingMessage))
            {
                OutgoingMessage msg = this.Message as OutgoingMessage;
                txtID.Text         = msg.Id;
                txtType.Text       = msg.MessageType;
                txtLastUpdate.Text = msg.LastUpdate.ToString();
                txtSent.Text       = msg.SentDate.ToString();
                txtReceived.Text   = string.Empty;
                if (msg.ScheduledDate.HasValue)
                {
                    txtScheduled.Text = msg.ScheduledDate.ToString();
                }
                else
                {
                    txtScheduled.Text = Resources.MsgNow;
                }
                txtChannel.Text   = msg.GatewayId;
                txtReference.Text = msg.RefNo;
                txtStatus.Text    = msg.Status;
                txtFrom.Text      = msg.Originator;
                txtTo.Text        = msg.Recipient;
                txtFormat.Text    = msg.MessageFormat;
                txtPriority.Text  = msg.Priority;

                OutgoingMessageType messageType = (OutgoingMessageType)StringEnum.Parse(typeof(OutgoingMessageType), msg.MessageType);
                if (messageType == OutgoingMessageType.SMS)
                {
                    rtbBody.Text       = msg.Message;
                    grpSms.Visible     = true;
                    grpWapPush.Visible = false;
                }
                else if (messageType == OutgoingMessageType.WAPPush)
                {
                    txtWapPushMessage.Text = msg.Message;
                    txtWapPushUrl.Text     = msg.WapUrl;
                    txtCreated.Text        = msg.WapCreateDate.ToString();
                    txtExpiry.Text         = msg.WapExpiryDate.ToString();
                    txtSignal.Text         = msg.WapSignal;
                    grpSms.Visible         = false;
                    grpWapPush.Visible     = true;
                }

                tsbMessageReply.Enabled = false;
            }
        }
        /// <summary>
        /// Does the work.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public override void DoWork(object sender, ElapsedEventArgs e)
        {
            if (messageGatewayService.Gateways.Count() == 0)
            {
                return;
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Checking outgoing message");
            }

            IOrderedQueryable <OutgoingMessage> messages = OutgoingMessage.All().Where(msg => msg.Status != StringEnum.GetStringValue(MessageStatus.Archived) &&
                                                                                       msg.Status != StringEnum.GetStringValue(MessageStatus.Failed) &&
                                                                                       msg.Status != StringEnum.GetStringValue(MessageStatus.Sending) &&
                                                                                       msg.Status != StringEnum.GetStringValue(MessageStatus.Sent) &&
                                                                                       (
                                                                                           msg.ScheduledDate == null ||
                                                                                           msg.ScheduledDate <= DateTime.Now
                                                                                       )).OrderBy(msg => msg.LastUpdate);


            // Send out messages
            foreach (OutgoingMessage message in messages)
            {
                List <IMessage>     outgoingMessages = new List <IMessage>(messages.Count());
                OutgoingMessageType messageType      = (OutgoingMessageType)StringEnum.Parse(typeof(OutgoingMessageType), message.MessageType);
                if (messageType == OutgoingMessageType.SMS)
                {
                    // Get the target routed gateway
                    Sms sms = Sms.NewInstance();
                    sms.Identifier         = message.Id;
                    sms.DestinationAddress = message.Recipient;
                    sms.Content            = message.Message;
                    MessageFormat format = (MessageFormat)StringEnum.Parse(typeof(MessageFormat), message.MessageFormat);
                    sms.DataCodingScheme = EnumMatcher.MessageCoding[format];
                    sms.ValidityPeriod   = MessageValidPeriod.OneDay;

                    MessageStatusReport statusReport = (MessageStatusReport)StringEnum.Parse(typeof(MessageStatusReport), message.StatusReport);
                    if (statusReport == MessageStatusReport.StatusReport)
                    {
                        sms.StatusReportRequest = MessageStatusReportRequest.SmsReportRequest;
                    }
                    else if (statusReport == MessageStatusReport.NoStatusReport)
                    {
                        sms.StatusReportRequest = MessageStatusReportRequest.NoSmsReportRequest;
                    }

                    sms.DcsMessageClass = EnumMatcher.MessageClass[message.MessageClass];
                    sms.QueuePriority   = EnumMatcher.MessagePriority[message.Priority];

                    IGateway      gateway       = messageGatewayService.Router.GetRoute(sms);
                    GatewayConfig gatewayConfig = GatewayConfig.SingleOrDefault(g => g.Id == gateway.Id);
                    if (gatewayConfig != null)
                    {
                        // Message validity period
                        if (!string.IsNullOrEmpty(gatewayConfig.MessageValidity))
                        {
                            sms.ValidityPeriod = EnumMatcher.ValidityPeriod[gatewayConfig.MessageValidity];
                        }

                        // Status report
                        if (statusReport == MessageStatusReport.FollowChannel)
                        {
                            if (gatewayConfig.RequestStatusReport.Value)
                            {
                                sms.StatusReportRequest = MessageStatusReportRequest.SmsReportRequest;
                            }
                            else
                            {
                                sms.StatusReportRequest = MessageStatusReportRequest.NoSmsReportRequest;
                            }
                        }

                        if (gatewayConfig.UseSimSmsc.HasValue && !gatewayConfig.UseSimSmsc.Value && !string.IsNullOrEmpty(gatewayConfig.Smsc))
                        {
                            sms.ServiceCenterNumber = gatewayConfig.Smsc;
                        }
                    }
                    outgoingMessages.Add(sms);

                    // Update status to "Sending"
                    message.Status     = StringEnum.GetStringValue(MessageStatus.Sending);
                    message.LastUpdate = DateTime.Now;
                    message.Update();
                }
                else if (messageType == OutgoingMessageType.WAPPush)
                {
                    Wappush wappush = Wappush.NewInstance(message.Recipient, message.WapUrl, message.Message);

                    ServiceIndicationAction signal;
                    if (EnumMatcher.ServiceIndication.TryGetValue(message.WapSignal, out signal))
                    {
                        wappush.Signal = signal;
                    }
                    wappush.CreateDate = message.WapCreateDate.Value;
                    wappush.ExpireDate = message.WapExpiryDate.Value;

                    MessageStatusReport statusReport = (MessageStatusReport)StringEnum.Parse(typeof(MessageStatusReport), message.StatusReport);
                    if (statusReport == MessageStatusReport.StatusReport)
                    {
                        wappush.StatusReportRequest = MessageStatusReportRequest.SmsReportRequest;
                    }
                    else if (statusReport == MessageStatusReport.NoStatusReport)
                    {
                        wappush.StatusReportRequest = MessageStatusReportRequest.NoSmsReportRequest;
                    }

                    wappush.DcsMessageClass = EnumMatcher.MessageClass[message.MessageClass];
                    wappush.QueuePriority   = EnumMatcher.MessagePriority[message.Priority];

                    IGateway      gateway       = messageGatewayService.Router.GetRoute(wappush);
                    GatewayConfig gatewayConfig = GatewayConfig.SingleOrDefault(g => g.Id == gateway.Id);
                    if (gatewayConfig != null)
                    {
                        // Message validity period
                        if (!string.IsNullOrEmpty(gatewayConfig.MessageValidity))
                        {
                            wappush.ValidityPeriod = EnumMatcher.ValidityPeriod[gatewayConfig.MessageValidity];
                        }

                        // Status report
                        if (statusReport == MessageStatusReport.FollowChannel)
                        {
                            if (gatewayConfig.RequestStatusReport.Value)
                            {
                                wappush.StatusReportRequest = MessageStatusReportRequest.SmsReportRequest;
                            }
                            else
                            {
                                wappush.StatusReportRequest = MessageStatusReportRequest.NoSmsReportRequest;
                            }
                        }
                    }

                    outgoingMessages.Add(wappush);

                    // Update status to "Sending"
                    message.Status     = StringEnum.GetStringValue(MessageStatus.Sending);
                    message.LastUpdate = DateTime.Now;
                    message.Update();
                }

                int count = messageGatewayService.SendMessages(outgoingMessages);
                log.Debug(string.Format("Messages are queued for sending. Count of number of messages is [{0}]", count));
            }
        }