Exemplo n.º 1
0
// Encode converts the query string into bytes according to the
// specified encoding.
func (u *Ussd) Encode(enc Encoding) ([]byte, error) {
	switch enc {
	case Encodings.Gsm7Bit:
		return pdu.Encode7Bit(u.String()), nil
	case Encodings.UCS2:
		return pdu.EncodeUcs2(u.String()), nil
	default:
		return nil, ErrUnknownEncoding
	}
}
Exemplo n.º 2
0
// PDU serializes the message into octets ready to be transferred.
// Returns the number of TPDU bytes in the produced PDU.
// Complies with 3GPP TS 23.040.
func (s *Message) PDU() (int, []byte, error) {
	var buf bytes.Buffer
	if len(s.ServiceCenterAddress) < 1 {
		buf.WriteByte(0x00) // SMSC info length
	} else {
		_, octets, err := s.ServiceCenterAddress.PDU()
		if err != nil {
			return 0, nil, err
		}
		buf.WriteByte(byte(len(octets)))
		buf.Write(octets)
	}

	switch s.Type {
	case MessageTypes.Deliver:
		var sms smsDeliver
		sms.MessageTypeIndicator = byte(s.Type)
		sms.MoreMessagesToSend = s.MoreMessagesToSend
		sms.LoopPrevention = s.LoopPrevention
		sms.ReplyPath = s.ReplyPathExists
		sms.UserDataHeaderIndicator = s.UserDataStartsWithHeader
		sms.StatusReportIndication = s.StatusReportIndication

		addrLen, addr, err := s.Address.PDU()
		if err != nil {
			return 0, nil, err
		}
		var addrBuf bytes.Buffer
		addrBuf.WriteByte(byte(addrLen))
		addrBuf.Write(addr)
		sms.OriginatingAddress = addrBuf.Bytes()

		sms.ProtocolIdentifier = 0x00 // Short Message Type 0
		sms.DataCodingScheme = byte(s.Encoding)
		sms.ServiceCentreTimestamp = s.ServiceCenterTime.PDU()

		var userDataBuf bytes.Buffer
		if s.UserDataStartsWithHeader {
			if _, udh, err := s.UserDataHeader.PDU(); err == nil {
				userDataBuf.Write(udh)
			} else {
				return 0, nil, err
			}
		}
		if s.Encoding == Encodings.Gsm7Bit {
			sms.UserDataLength = byte(userDataBuf.Len())
			userDataBuf.Write(pdu.Encode7Bit(s.Text))
			sms.UserDataLength += byte(len(s.Text))
		} else if s.Encoding == Encodings.UCS2 {
			userDataBuf.Write(pdu.EncodeUcs2(s.Text))
			sms.UserDataLength = byte(userDataBuf.Len())
		} else {
			return 0, nil, ErrUnknownEncoding
		}

		// sms.UserDataLength = byte(len(userData))
		sms.UserData = userDataBuf.Bytes()
		n, err := buf.Write(sms.Bytes())
		if err != nil {
			return 0, nil, err
		}
		return n, buf.Bytes(), nil
	case MessageTypes.Submit:
		var sms smsSubmit
		sms.MessageTypeIndicator = byte(s.Type)
		sms.RejectDuplicates = s.RejectDuplicates
		sms.ValidityPeriodFormat = byte(s.VPFormat)
		sms.ReplyPath = s.ReplyPathExists
		sms.UserDataHeaderIndicator = s.UserDataStartsWithHeader
		sms.StatusReportRequest = s.StatusReportRequest
		sms.MessageReference = s.MessageReference

		addrLen, addr, err := s.Address.PDU()
		if err != nil {
			return 0, nil, err
		}
		var addrBuf bytes.Buffer
		addrBuf.WriteByte(byte(addrLen))
		addrBuf.Write(addr)
		sms.DestinationAddress = addrBuf.Bytes()

		sms.ProtocolIdentifier = 0x00 // Short Message Type 0
		sms.DataCodingScheme = byte(s.Encoding)

		switch s.VPFormat {
		case ValidityPeriodFormats.Relative:
			sms.ValidityPeriod = byte(s.VP.Octet())
		case ValidityPeriodFormats.Absolute, ValidityPeriodFormats.Enhanced:
			return 0, nil, ErrNonRelative
		}

		var userDataBuf bytes.Buffer
		if s.UserDataStartsWithHeader {
			if _, udh, err := s.UserDataHeader.PDU(); err == nil {
				userDataBuf.Write(udh)
			} else {
				return 0, nil, err
			}
		}
		if s.Encoding == Encodings.Gsm7Bit {
			sms.UserDataLength = byte(userDataBuf.Len())
			userDataBuf.Write(pdu.Encode7Bit(s.Text))
			sms.UserDataLength += byte(len(s.Text))
		} else if s.Encoding == Encodings.UCS2 {
			userDataBuf.Write(pdu.EncodeUcs2(s.Text))
			sms.UserDataLength = byte(userDataBuf.Len())
		} else {
			return 0, nil, ErrUnknownEncoding
		}

		// sms.UserDataLength = byte(len(userData))
		sms.UserData = userDataBuf.Bytes()
		n, err := buf.Write(sms.Bytes())
		if err != nil {
			return 0, nil, err
		}
		return n, buf.Bytes(), nil
	default:
		return 0, nil, ErrUnknownMessageType
	}
}