diff --git a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java index 61d9c4ff0..cae1204eb 100644 --- a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java +++ b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java @@ -27,6 +27,7 @@ import org.apache.log4j.Logger; import org.mobicents.protocols.ss7.map.api.smstpdu.DataCodingScheme; import org.mobicents.protocols.ss7.map.smstpdu.DataCodingSchemeImpl; +import org.mobicents.smsc.mproc.DeliveryReceiptData; /** * @@ -76,7 +77,8 @@ public static void generateCdr(Sms smsEvent, String status, String reason, boole boolean messageIsSplitted, boolean lastSegment, boolean calculateMsgPartsLenCdr, boolean delayParametersInCdr) { // Format is // SUBMIT_DATE,SOURCE_ADDRESS,SOURCE_TON,SOURCE_NPI,DESTINATION_ADDRESS,DESTINATION_TON,DESTINATION_NPI,STATUS,SYSTEM-ID,MESSAGE-ID, - // VLR, IMSI, CorrelationID, First 20 char of SMS, REASON + // VLR, IMSI, CorrelationID, First 20 char of SMS, REASON, DELIVERY_RECEIPT_MESSAGE_STATUS, DELIVERY_RECEIPT_MESSAGE_STATE_TLV, + // DELIVERY_RECEIPT_MESSAGE_ERR if (!generateCdr) return; @@ -166,6 +168,21 @@ public static void generateCdr(Sms smsEvent, String status, String reason, boole .append("\"") .append(getEscapedString(reason)) .append("\""); + + DeliveryReceiptData deliveryReceiptData = MessageUtil.parseDeliveryReceipt(smsEvent.getShortMessageText(), + smsEvent.getTlvSet()); + if (deliveryReceiptData != null) { + String st = deliveryReceiptData.getStatus(); + int tlvMessageState = deliveryReceiptData.getTlvMessageState(); + + sb.append(CdrGenerator.CDR_SEPARATOR) + .append(st != null ? st : CdrGenerator.CDR_EMPTY); + sb.append(CdrGenerator.CDR_SEPARATOR) + .append(tlvMessageState != 0 ? tlvMessageState : CdrGenerator.CDR_EMPTY); + sb.append(CdrGenerator.CDR_SEPARATOR) + .append(deliveryReceiptData.getError()); + } + CdrGenerator.generateCdr(sb.toString()); } diff --git a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/MessageUtil.java b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/MessageUtil.java index a3ccdfa1f..d622fbb1c 100644 --- a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/MessageUtil.java +++ b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/MessageUtil.java @@ -850,10 +850,10 @@ public static DeliveryReceiptData parseDeliveryReceipt(String msg, TlvSet tlvSet } tlv = tlvSet.getOptionalParameter(SmppConstants.TAG_MSG_STATE); if (tlv != null) { - byte[] data = tlv.getValue(); - if (data.length > 0) { - int val = data[0] & 0xFF; - deliveryReceiptData.setTlvMessageState(val); + try { + byte val = tlv.getValueAsByte(); + deliveryReceiptData.setTlvMessageState(new Integer(val)); + } catch (TlvConvertException e) { } } diff --git a/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/ClientSmppSessionHandler.java b/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/ClientSmppSessionHandler.java index 91e8a53c1..0435c49b4 100644 --- a/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/ClientSmppSessionHandler.java +++ b/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/ClientSmppSessionHandler.java @@ -37,6 +37,7 @@ import org.mobicents.protocols.ss7.map.datacoding.Gsm7EncodingStyle; import org.mobicents.protocols.ss7.map.smstpdu.DataCodingSchemeImpl; import org.mobicents.smsc.library.ErrorCode; +import org.mobicents.smsc.library.MessageState; import org.mobicents.smsc.library.MessageUtil; import org.mobicents.smsc.tools.smppsimulator.SmppSimulatorParameters.DeliveryResponseGenerating; @@ -211,6 +212,20 @@ public PduResponse firePduRequestReceived(PduRequest pduRequest) { msgId2 = msgId2 + "XYZ"; msgId3 = null; } + MessageState msgState = null; + + if (this.testingForm.getSmppSimulatorParameters().isIdResponseTlvMessageState()) { + if (this.testingForm.getSmppSimulatorParameters().isRejectIncomingDeliveryMessage()) + //message will have message_state set to REJECTED (value 8) + msgState = MessageState.REJECTED; + else if (this.testingForm.getSmppSimulatorParameters().getDeliveryResponseGenerating().equals(DeliveryResponseGenerating.Error8)) { + //message will have message_state set to UNDELIVERABLE (value 5) + msgState = MessageState.UNDELIVERABLE; + } else { + //message should have message_state set to DELIVERED (value 2) + msgState = MessageState.DELIVERED; + } + } ((BaseSmResp) resp).setMessageId(msgId); @@ -222,7 +237,7 @@ public PduResponse firePduRequestReceived(PduRequest pduRequest) { this.testingForm.getExecutor().schedule( new DeliveryReceiptSender( this.testingForm.getSmppSimulatorParameters().getDeliveryResponseGenerating(), new Date(), - msgId2, msgId3), delay, TimeUnit.MILLISECONDS); + msgId2, msgId3, msgState), delay, TimeUnit.MILLISECONDS); } testingForm.addMessage("PduResponseSent: " + resp.getName(), resp.toString()); @@ -303,13 +318,15 @@ public class DeliveryReceiptSender implements Runnable { private Date submitDate; private String messageId; private String messageIdTlv; + private MessageState messageStateTlv; public DeliveryReceiptSender(DeliveryResponseGenerating deliveryResponseGenerating, Date submitDate, String messageId, - String messageIdTlv) { + String messageIdTlv, MessageState messageStateTlv) { this.deliveryResponseGenerating = deliveryResponseGenerating; this.submitDate = submitDate; this.messageId = messageId; this.messageIdTlv = messageIdTlv; + this.messageStateTlv = messageStateTlv; } @Override @@ -370,6 +387,13 @@ public void run() { Tlv tlv = new Tlv(SmppConstants.TAG_RECEIPTED_MSG_ID, data, "rec_msg_id"); pdu.addOptionalParameter(tlv); } + + if (messageStateTlv != null) { + byte[] data = new byte[1]; + data[0] = (byte)messageStateTlv.getCode(); + Tlv tlv = new Tlv(SmppConstants.TAG_MSG_STATE, data, "msg_state"); + pdu.addOptionalParameter(tlv); + } try { pdu.setShortMessage(buf); diff --git a/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppMessageParamForm.java b/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppMessageParamForm.java index bd7dc2fa5..2636b0f77 100644 --- a/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppMessageParamForm.java +++ b/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppMessageParamForm.java @@ -100,6 +100,7 @@ public class SmppMessageParamForm extends JDialog { private JRadioButton rbDR_Error8; private JCheckBox cbDRAfter2Min; private JCheckBox cbIdResponseTlv; + private JCheckBox cbIdResponseTlvMessageState; private JCheckBox cbWrongMessageIdInDlr; private final ButtonGroup buttonGroup_2 = new ButtonGroup(); @@ -359,7 +360,7 @@ public void itemStateChanged(ItemEvent arg0) { panel_resp.setLayout(null); cbRejectIncomingDeliveryMessage = new JCheckBox("Rejecting of incoming SMPP delivery messages"); - cbRejectIncomingDeliveryMessage.setBounds(6, 7, 320, 23); + cbRejectIncomingDeliveryMessage.setBounds(6, 7, 400, 23); panel_resp.add(cbRejectIncomingDeliveryMessage); rbDR_Success = new JRadioButton("Success receipt"); @@ -388,9 +389,13 @@ public void itemStateChanged(ItemEvent arg0) { cbIdResponseTlv = new JCheckBox("Tlv fields usage in delivery receipt"); cbIdResponseTlv.setBounds(6, 125, 364, 23); panel_resp.add(cbIdResponseTlv); + + cbIdResponseTlvMessageState = new JCheckBox("Tlv \"Message State\" in delivery receipt"); + cbIdResponseTlvMessageState.setBounds(6, 151, 364, 23); + panel_resp.add(cbIdResponseTlvMessageState); cbWrongMessageIdInDlr = new JCheckBox("Wrong messageId in delivery receipt"); - cbWrongMessageIdInDlr.setBounds(6, 151, 364, 23); + cbWrongMessageIdInDlr.setBounds(6, 177, 364, 23); panel_resp.add(cbWrongMessageIdInDlr); JPanel panel_bulk = new JPanel(); @@ -608,6 +613,7 @@ else if (data.getSmppEncoding() == 1) this.cbRejectIncomingDeliveryMessage.setSelected(this.data.isRejectIncomingDeliveryMessage()); this.cbDRAfter2Min.setSelected(this.data.isDeliveryResponseAfter2Min()); this.cbIdResponseTlv.setSelected(this.data.isIdResponseTlv()); + this.cbIdResponseTlvMessageState.setSelected(this.data.isIdResponseTlvMessageState()); this.cbWrongMessageIdInDlr.setSelected(this.data.isWrongMessageIdInDlr()); switch (this.data.getDeliveryResponseGenerating()) { case No: @@ -726,6 +732,7 @@ else if (this.rbUnicode.isSelected()) this.data.setRejectIncomingDeliveryMessage(this.cbRejectIncomingDeliveryMessage.isSelected()); this.data.setDeliveryResponseAfter2Min(this.cbDRAfter2Min.isSelected()); this.data.setIdResponseTlv(this.cbIdResponseTlv.isSelected()); + this.data.setIdResponseTlvMessageState(this.cbIdResponseTlvMessageState.isSelected()); this.data.setWrongMessageIdInDlr(this.cbWrongMessageIdInDlr.isSelected()); if (rbDR_No.isSelected()) diff --git a/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppSimulatorParameters.java b/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppSimulatorParameters.java index 017cd7a4c..350130693 100644 --- a/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppSimulatorParameters.java +++ b/tools/smpp-simulator/simulator/src/main/java/org/mobicents/smsc/tools/smppsimulator/SmppSimulatorParameters.java @@ -51,6 +51,7 @@ public class SmppSimulatorParameters { private DeliveryResponseGenerating deliveryResponseGenerating = DeliveryResponseGenerating.No; private boolean deliveryResponseAfter2Min = false; private boolean idResponseTlv = false; + private boolean idResponseTlvMessageState = false; private boolean wrongMessageIdInDlr = false; private TON sourceTon = TON.International; @@ -387,6 +388,14 @@ public boolean isIdResponseTlv() { public void setIdResponseTlv(boolean hexMessageIdResponse) { this.idResponseTlv = hexMessageIdResponse; } + + public boolean isIdResponseTlvMessageState() { + return idResponseTlvMessageState; + } + + public void setIdResponseTlvMessageState(boolean hexMessageIdResponseMessageState) { + this.idResponseTlvMessageState = hexMessageIdResponseMessageState; + } public boolean isWrongMessageIdInDlr() { return wrongMessageIdInDlr;