Exemple #1
0
        /// <summary>
        /// Method adds `Concat` information into the User Header
        /// </summary>
        /// <param name="udhStruct">stucture representing the </param>
        /// <param name="messageUDH">message user header</param>
        private byte[] GetConcatPdu(ConcatedUDH udhStruct, byte[] messageUDH)
        {
            const byte CONCATED_UDH_DATA_LENGTH = 0x06;

            using (var stream = new MemoryStream())
            {
                // If we have message for concating, write concating header
                if (udhStruct.Parts > 1)
                {
                    stream.WriteByte((byte)(CONCATED_UDH_DATA_LENGTH + messageUDH.Length));

                    stream.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT);
                    stream.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT_HEADERLENGTH);

                    stream.WriteByte((byte)(udhStruct.Reference >> 8));
                    stream.WriteByte((byte)udhStruct.Reference);

                    stream.WriteByte(udhStruct.Parts);
                    stream.WriteByte(udhStruct.Sequence);
                }
                // if we have some messageuUDH, write the header length
                else if (messageUDH.Length > 0)
                {
                    stream.WriteByte((byte)messageUDH.Length);
                }

                stream.Write(messageUDH, 0, messageUDH.Length);
                return(stream.ToArray());
            }
        }
Exemple #2
0
        /// <summary>
        /// Method adds `Concat` information into the User Header
        /// </summary>
        /// <param name="udhStruct">stucture representing the </param>
        /// <param name="messageUDH">message user header</param>        
        private byte[] GetConcatPdu(ConcatedUDH udhStruct, byte[] messageUDH)
        {
            MemoryStream stream = new MemoryStream();

            // If we have message for concating, write concating header
            if (udhStruct.Parts > 1)
            {
                MemoryStream concatHeader = new MemoryStream();
                concatHeader.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT);
                concatHeader.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT_HEADERLENGTH);

                concatHeader.WriteByte((byte)(udhStruct.Reference >> 8));
                concatHeader.WriteByte((byte)udhStruct.Reference);

                concatHeader.WriteByte(udhStruct.Parts);
                concatHeader.WriteByte(udhStruct.Sequence);

                stream.WriteByte((byte)(concatHeader.Length + messageUDH.Length));
                concatHeader.WriteTo(stream);
            }
            // if we have some messageuUDH, write the header length
            else if (messageUDH.Length > 0)
                stream.WriteByte((byte)messageUDH.Length);

            stream.Write(messageUDH, 0, messageUDH.Length);
            return stream.ToArray();
        }
Exemple #3
0
        /// <summary>
        /// Method returns list of PDU formated messages.
        /// If data fits into one message than the list has only one item.
        /// Otherwise the data is concated into more messages.
        /// </summary>
        /// <returns></returns>
        public List <byte[]> GetPDUList()
        {
            int maxOctetsCount;

            switch (MessageToSend.DataEncoding)
            {
            case DataEncoding.Default7bit:
                maxOctetsCount = 160;
                break;

            case DataEncoding.Data8bit:
                maxOctetsCount = 140;     // Might be lower, some roaming partners don't like it when set to 140
                break;

            case DataEncoding.UCS2_16bit:
                maxOctetsCount = 140;
                break;

            default:
                maxOctetsCount = 140;
                break;
            }

            byte[] body       = MessageToSend.GetSMSBytes();
            byte[] messageUdh = MessageToSend.GetUDHBytes();

            // If UDH exists then reserve one more byte for UDH length
            int maxLen = maxOctetsCount - messageUdh.Length;

            maxLen -= (messageUdh.Length > 0) ? 1 : 0;

            // Count parts
            int parts = (int)Math.Ceiling((double)body.Length / (double)maxLen);

            parts = (int)Math.Ceiling((double)(body.Length + parts * messageUdh.Length) / (double)maxLen);

            if (parts > 1)
            {
                parts = (int)Math.Ceiling((double)(body.Length + parts * messageUdh.Length + parts * (CONCATED_UDH_FULL_LENGTH + 1)) / (double)maxLen);
            }

            List <byte[]> messagePart = new List <byte[]>();

            byte[]      udhByteArray;
            byte[]      messageByteArray;
            ConcatedUDH conUDH = new ConcatedUDH();

            // This will hold the byteCount send in message (without UDH)
            int bytesCount = maxOctetsCount;
            // Thiis will hold the position in the message array
            int messagePos = 0;

            if (parts > 1)
            {
                conUDH.Reference = 01;
                conUDH.Parts     = (byte)parts;

                for (int i = 0; i < parts; i++)
                {
                    conUDH.Sequence = (byte)(i + 1);
                    udhByteArray    = GetConcatPdu(conUDH, messageUdh);

                    // if it's not last message then
                    if (i < (parts - 1))
                    {
                        bytesCount = maxOctetsCount - udhByteArray.Length - 1;
                    }
                    else
                    {
                        bytesCount = body.Length - messagePos;
                    }

                    byte[] bodyPart = new byte[bytesCount];
                    Array.Copy(body, messagePos, bodyPart, 0, bytesCount);

                    // Encode message with given encoding
                    byte[] encodedBody = GetEncodedMessage(bodyPart);

                    // Takes the message length before encoding
                    int messageLength = (bodyPart.Length) + udhByteArray.Length;

                    // There is a align in 7bit encoding
                    if (MessageToSend.DataEncoding == DataEncoding.Default7bit)
                    {
                        messageLength++;
                    }

                    //creates message
                    messageByteArray = new byte[encodedBody.Length + udhByteArray.Length];
                    Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length);
                    Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length);
                    messagePos += bytesCount;

                    messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0));
                    messagePart.Add(messageByteArray);
                }
            }
            else
            {
                conUDH.Parts = 1;
                udhByteArray = GetConcatPdu(conUDH, messageUdh);

                // Encode body according to given Encoding :)
                byte[] encodedBody = GetEncodedMessage(body);

                // Takes the message length before encoding
                int messageLength = (body.Length) + udhByteArray.Length;

                messageByteArray = new byte[encodedBody.Length + udhByteArray.Length];
                Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length);
                Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length);

                messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0));
                messagePart.Add(messageByteArray);
            }

            return(messagePart);
        }
Exemple #4
0
        /// <summary>
        /// Method returns list of PDU formated messages.
        /// If data fits into one message than the list has only one item. 
        /// Otherwise the data is concated into more messages.
        /// </summary>
        /// <returns></returns>
        public List<byte[]> GetPDUList()
        {
            int maxOctetsCount;

            switch (MessageToSend.DataEncoding)
            {
                case DataEncoding.Default7bit:
                    maxOctetsCount = 160;
                    break;
                case DataEncoding.Data8bit:
                    maxOctetsCount = 140;     // Might be lower, some roaming partners don't like it when set to 140
                    break;
                case DataEncoding.UCS2_16bit:
                    maxOctetsCount = 140;
                    break;
                default:
                    maxOctetsCount = 140;
                    break;
            }

            byte[] body = MessageToSend.GetSMSBytes();
            byte[] messageUdh = MessageToSend.GetUDHBytes();

            // If UDH exists then reserve one more byte for UDH length
            int maxLen = maxOctetsCount - messageUdh.Length;
            maxLen -= (messageUdh.Length > 0) ? 1 : 0;

            // Count parts
            int parts = (int)Math.Ceiling((double)body.Length / (double)maxLen);
            parts = (int)Math.Ceiling((double)(body.Length + parts*messageUdh.Length) / (double)maxLen);

            List<byte[]> messagePart = new List<byte[]>();
            byte[] udhByteArray;
            byte[] messageByteArray;
            ConcatedUDH conUDH = new ConcatedUDH();

            // This will hold the byteCount send in message (without UDH)
            int bytesCount = maxOctetsCount;
            // Thiis will hold the position in the message array
            int messagePos = 0;

            if (parts > 1)
            {
                conUDH.Reference = 01;
                conUDH.Parts = (byte)parts;

                for (int i = 0; i < parts; i++)
                {
                    conUDH.Sequence = (byte)(i + 1);
                    udhByteArray = GetConcatPdu(conUDH, messageUdh);

                    // if it's not last message then
                    if (i < (parts - 1))
                        bytesCount = maxOctetsCount - udhByteArray.Length - 1;
                    else
                        bytesCount = body.Length - messagePos;

                    byte[] bodyPart = new byte[bytesCount];
                    Array.Copy(body, messagePos, bodyPart, 0, bytesCount);

                    // Encode message with given encoding
                    byte[] encodedBody = GetEncodedMessage(bodyPart);

                    // Takes the message length before encoding
                    int messageLength = (bodyPart.Length) + udhByteArray.Length;

                    // There is a align in 7bit encoding
                    if (MessageToSend.DataEncoding == DataEncoding.Default7bit)
                        messageLength++;

                    //creates message
                    messageByteArray = new byte[encodedBody.Length + udhByteArray.Length];
                    Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length);
                    Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length);
                    messagePos += bytesCount;

                    messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0));
                    messagePart.Add(messageByteArray);
                }
            }
            else
            {
                conUDH.Parts = 1;
                udhByteArray = GetConcatPdu(conUDH, messageUdh);

                // Encode body according to given Encoding :)
                byte[] encodedBody = GetEncodedMessage(body);

                // Takes the message length before encoding
                int messageLength = (body.Length) + udhByteArray.Length;

                messageByteArray = new byte[encodedBody.Length + udhByteArray.Length];
                Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length);
                Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length);

                messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0));
                messagePart.Add(messageByteArray);
            }

            return messagePart;
        }