Class SMSDeliver

  • All Implemented Interfaces:
    DataObject, FastSerializable, Serializable

    public final class SMSDeliver
    extends SMSTPDUWithData
    implements FastSerializable
    Representation of a SMS-DELIVER TPDU.

    The API offered by this class is as if the type were specified in ASN.1 as follows.

     SMSDeliver ::= SEQUENCE {
         onlyHeader              NULL OPTIONAL,
         replyPath               ReplyPath,
         userDataHeaderIndicator UserDataHeaderIndicator,
         statusReportIndication  StatusReportIndication,
         moreMessagesToSend      MoreMessagesToSend,
         loopPrevention          BOOLEAN OPTIONAL,
         originatingAddress      SMSAddress,
         protocolId              SMSProtocolId,
         dataCodingScheme        SMSDataCodingScheme,
         serviceCentreTimeStamp  SMSTimeStamp,
         userDataLength          INTEGER OPTIONAL,
         userData                OCTET STRING OPTIONAL
     }
    The class takes care of encoding the field values into a byte-array and decoding field values from a byte-array, the encoded representation being as tabulated below.

    Data Encoding - based on 3GPP TS 23.040 V9.0.0 (2009-06) §9.2.2.1 pp50-53
    76543210
    1 octetReply pathUser data header indicatorStatus report indication0Loop prevention?More messages to sendMessage type
    00
    2-12 octetsOriginating address
    1 octetProtocol id
    1 octetData coding scheme
    7 octetsService center time stamp
    1 octetUser data length
    0-141 octetsUser data

    In the above table, field names ending in ? are booleans: 1 for true, 0 for false.

    Field loopPrevention is optional because that bit was spare prior to release 6 of 3GPP TS 23.040.

    See Also:
    Serialized Form
    • Constructor Detail

      • SMSDeliver

        public SMSDeliver()
        Constructs a new SMSDeliver object with no fields set.
      • SMSDeliver

        public SMSDeliver​(byte[] data)
        Constructs a new SMSDeliver object from network-encoded data. The data is not decoded and might not be decodable.
        Parameters:
        data - network-encoded data
        Throws:
        NullPointerException - if data is null
      • SMSDeliver

        public SMSDeliver​(byte[] data,
                          int start,
                          int len)
        Constructs a new SMSDeliver object from part of network-encoded data. The part starts at index start and is len bytes long. The data is not decoded and might not be decodable.
        Parameters:
        data - network-encoded data
        start - starting offset of network-encoded data in byte array
        len - default length if not predictable
        Throws:
        NullPointerException - if data is null
        IllegalArgumentException - if len is negative
      • SMSDeliver

        public SMSDeliver​(DataInput in)
                   throws IOException
        Constructs a new SMSDeliver object from data deserialized from a stream that was written by toStream(DataOutput).
        Parameters:
        in - the stream to read from
        Throws:
        EOFException - if reading is pre-empted by end-of-file
        IOException - if the data cannot be read
    • Method Detail

      • hasMoreMessagesToSend

        public boolean hasMoreMessagesToSend()
                                      throws DecodeException
        Tests whether the field MoreMessagesToSend has a value.
        Returns:
        whether the field has a value
        Throws:
        DecodeException - if encoded state cannot be decoded
      • hasLoopPrevention

        public boolean hasLoopPrevention()
                                  throws DecodeException
        Tests whether the field LoopPrevention has a value.
        Returns:
        whether the field has a value
        Throws:
        DecodeException - if encoded state cannot be decoded
      • setLoopPreventionPresent

        public SMSDeliver setLoopPreventionPresent​(boolean flag)
                                            throws IllegalStateException
        Sets the presence or absence of the field LoopPrevention.
        Parameters:
        flag - whether the field should be marked as present
        Returns:
        this
        Throws:
        IllegalStateException - if this instance has been marked as read-only
      • hasStatusReportIndication

        public boolean hasStatusReportIndication()
                                          throws DecodeException
        Tests whether the field StatusReportIndication has a value.
        Returns:
        whether the field has a value
        Throws:
        DecodeException - if encoded state cannot be decoded
      • hasReplyPath

        public boolean hasReplyPath()
                             throws DecodeException
        Tests whether the field ReplyPath has a value.
        Returns:
        whether the field has a value
        Throws:
        DecodeException - if encoded state cannot be decoded
      • hasOriginatingAddress

        public boolean hasOriginatingAddress()
                                      throws DecodeException
        Tests whether the field OriginatingAddress has a value.
        Returns:
        whether the field has a value
        Throws:
        DecodeException - if encoded state cannot be decoded
      • hasServiceCentreTimeStamp

        public boolean hasServiceCentreTimeStamp()
                                          throws DecodeException
        Tests whether the field ServiceCentreTimeStamp has a value.
        Returns:
        whether the field has a value
        Throws:
        DecodeException - if encoded state cannot be decoded
      • getMoreMessagesToSend

        public SMSDeliver.MoreMessagesToSend getMoreMessagesToSend()
                                                            throws DecodeException
        Gets the value of whether there are no more messages to send.
        Returns:
        MoreMessagesToSend representation of whether there are no more messages to send
        Throws:
        DecodeException - if encoded state cannot be decoded
      • getLoopPrevention

        public boolean getLoopPrevention()
                                  throws DecodeException
        Gets the value of whether SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping.
        Returns:
        boolean representation of whether SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping
        Throws:
        DecodeException - if encoded state cannot be decoded
      • getStatusReportIndication

        public SMSDeliver.StatusReportIndication getStatusReportIndication()
                                                                    throws DecodeException
        Gets the value of whether the SME has requested a status report.
        Returns:
        StatusReportIndication representation of whether the SME has requested a status report
        Throws:
        DecodeException - if encoded state cannot be decoded
      • getReplyPath

        public SMSDeliver.ReplyPath getReplyPath()
                                          throws DecodeException
        Gets the value of whether reply path exists.
        Returns:
        ReplyPath representation of whether reply path exists
        Throws:
        DecodeException - if encoded state cannot be decoded
      • getOriginatingAddress

        public SMSAddress getOriginatingAddress()
                                         throws DecodeException
        Gets the value of address of the originating SME.
        Returns:
        SMSAddress representation of address of the originating SME
        Throws:
        DecodeException - if encoded state cannot be decoded
      • getServiceCentreTimeStamp

        public SMSTimeStamp getServiceCentreTimeStamp()
                                               throws DecodeException
        Gets the value of the time when the SC received the message.
        Returns:
        SMSTimeStamp representation of the time when the SC received the message
        Throws:
        DecodeException - if encoded state cannot be decoded
      • setLoopPrevention

        public SMSDeliver setLoopPrevention​(boolean value)
                                     throws IllegalStateException
        Sets the value of whether SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping.
        Parameters:
        value - boolean representation of whether SMS applications should inhibit forwarding or automatic message generation that could cause infinite looping
        Returns:
        this
        Throws:
        IllegalStateException
      • setServiceCentreTimeStamp

        public SMSDeliver setServiceCentreTimeStamp​(SMSTimeStamp value)
                                             throws IllegalStateException
        Sets the value of the time when the SC received the message.
        Parameters:
        value - SMSTimeStamp representation of the time when the SC received the message
        Returns:
        this
        Throws:
        IllegalStateException
      • copyOf

        public static SMSDeliver copyOf​(SMSDeliver from)
        Creates a new object of this type, cloning the values of common fields from the given object of any subclass of the same base type.
        Parameters:
        from - the object from which to copy
        Returns:
        SMSDeliver
      • getFieldAccessors

        public static FieldAccessor[] getFieldAccessors()
        Gets a new array of the accessors for fields of this type.
        Returns:
        FieldAccessor[]
      • getFieldsMap

        public Map<String,​Object> getFieldsMap​(boolean withAbsents)
        Gets a Map from field-name to field-value for the fields of a sequence. For a field of primitive type, the field-value is boxed. For an absent optional field, the field-value is AbstractFieldsObject.FIELD_ABSENT. For an uninitialised mandatory field, the field-value is AbstractFieldsObject.FIELD_UNINITIALISED. For a field of String type, the encoded form is used if the String cannot be decoded. For a type that represents an OCTET STRING that cannot be decoded, a map from "encodedValue" to the byte array value is returned.
        Specified by:
        getFieldsMap in class AbstractFieldsObject
        Parameters:
        withAbsents - whether to put absent optional fields into Map
        Returns:
        Map from field-name to field-value
      • encodedIsInvalid

        protected boolean encodedIsInvalid()
        Determines whether the encoded form is invalid.
        Returns:
        boolean
      • getType

        public SMSTPDU.Type getType()
        Description copied from class: SMSTPDU
        Return the message type of this PDU
        Specified by:
        getType in class SMSTPDU
        Returns:
        the type
      • getContainedLength

        public int getContainedLength​(byte[] data,
                                      int start,
                                      int len)
        Determines the length of the encoded value that commences at offset start in the given data. The value is not fully decoded and might not be decodable. If the encoded value ends with a filling field, then the given len is returned. If the encoded value is so currupt that its length cannot be determined, then 0 is returned.
        Parameters:
        data - network-encoded data
        start - index into data where value commences
        len - length in data to be considered
        Returns:
        length of encoded value, or 0 if not decodable
        Throws:
        NullPointerException - if data is null
      • newInstanceOnlyHeader

        public static SMSDeliver newInstanceOnlyHeader()
        Factory method that creates an instance for representing only a header (no data).
        Returns:
        SMSDeliver
      • decodeRPUIHeaderDeliver

        public static SMSDeliver decodeRPUIHeaderDeliver​(byte[] message,
                                                         int start,
                                                         int len)
        Constructs a new SMSDeliver with no data (header only) from the given data. Decoding is deferred until needed.
        Parameters:
        message - a bytearray containing the encoded header
        start - the offset within 'message' to begin decoding
        len - the number of valid bytes after 'offset' to decode (must be at least 1)
        Returns:
        SMSDeliver
        Throws:
        NullPointerException - if message is null
        ArrayIndexOutOfBoundsException - if start or len are out of range
      • decodeRPUIHeaderDeliver

        public static SMSDeliver decodeRPUIHeaderDeliver​(byte[] message)
        Constructs a new SMSDeliver with no data (header only) from the given data. Equivalent to decodeRPUIHeaderDeliver(message, 0, message.length)
        Parameters:
        message - a bytearray containing the encoded header
        Returns:
        SMSDeliver
        Throws:
        NullPointerException - if message is null
      • encodeRPUIHeaderDeliver

        public static byte[] encodeRPUIHeaderDeliver​(SMSDeliver smsDeliver)
                                              throws EncodeException
        Encodes the given SMSDeliver for sending as the payload of a SM-RP-UIHeader message.
        Parameters:
        smsDeliver - the pdu to encode
        Returns:
        the encoded form of smsDeliver
        Throws:
        EncodeException - if smsDeliver is not only a header