Exemple #1
0
        /// <summary>
        /// Get the debug string representation of the message
        /// </summary>
        /// <returns></returns>
        /// <remarks>
        /// To futher developers:
        /// You cannot simply apply Encoding.UTF8.GetString(GetByte()) in this function
        /// since the InnerMessage of MSNMessage may contain binary data.
        /// </remarks>
        public override string ToString()
        {
            StringBuilder builder = new StringBuilder(128);

            builder.Append(Command);

            if (noTransactionIDCommands.IndexOf(Command) == -1)
            {
                if (TransactionID != -1)
                {
                    builder.Append(' ');
                    builder.Append(TransactionID.ToString(CultureInfo.InvariantCulture));
                }
            }

            foreach (string val in CommandValues)
            {
                builder.Append(' ');
                builder.Append(val);
            }

            if (InnerMessage != null)
            {
                builder.Append(' ');
                builder.Append(InnerMessage.GetBytes().Length);
            }

            //For toString, we do not return the inner message's string.
            return(builder.ToString());
        }
Exemple #2
0
        public override byte[] GetBytes()
        {
            StringBuilder builder = new StringBuilder(128);

            builder.Append(Command);

            if (noTransactionIDCommands.IndexOf(Command) == -1)
            {
                if (TransactionID != -1)
                {
                    builder.Append(' ');
                    builder.Append(TransactionID.ToString(CultureInfo.InvariantCulture));
                }
            }

            foreach (string val in CommandValues)
            {
                builder.Append(' ');
                builder.Append(val);
            }

            if (InnerMessage != null)
            {
                builder.Append(' ');
                builder.Append(InnerMessage.GetBytes().Length);
                builder.Append("\r\n");
                return(AppendArray(System.Text.Encoding.UTF8.GetBytes(builder.ToString()), InnerMessage.GetBytes()));
            }
            else
            {
                builder.Append("\r\n");
                return(System.Text.Encoding.UTF8.GetBytes(builder.ToString()));
            }
        }
Exemple #3
0
        /// <summary>
        /// Split big P2PMessages to transport over sb or dc.
        /// </summary>
        /// <param name="maxSize"></param>
        /// <returns></returns>
        public P2PMessage[] SplitMessage(int maxSize)
        {
            uint payloadMessageSize = 0;

            if (Version == P2PVersion.P2PV1)
            {
                payloadMessageSize = V1Header.MessageSize;
            }

            if (Version == P2PVersion.P2PV2)
            {
                payloadMessageSize = (uint)V2Header.MessageSize - (uint)V2Header.DataPacketHeaderLength;
            }

            if (payloadMessageSize <= maxSize)
            {
                return new P2PMessage[] { this }
            }
            ;

            List <P2PMessage> chunks = new List <P2PMessage>();

            byte[] totalMessage = (InnerBody != null)
                ? InnerBody
                : InnerMessage.GetBytes();

            long offset = 0;

            if (Version == P2PVersion.P2PV1)
            {
                while (offset < totalMessage.LongLength)
                {
                    P2PMessage chunkMessage = new P2PMessage(Version);
                    uint       messageSize  = (uint)Math.Min((uint)maxSize, (totalMessage.LongLength - offset));
                    byte[]     chunk        = new byte[messageSize];
                    Buffer.BlockCopy(totalMessage, (int)offset, chunk, 0, (int)messageSize);

                    chunkMessage.V1Header.Flags         = V1Header.Flags;
                    chunkMessage.V1Header.AckIdentifier = V1Header.AckIdentifier;
                    chunkMessage.V1Header.AckTotalSize  = V1Header.AckTotalSize;
                    chunkMessage.V1Header.Identifier    = V1Header.Identifier;
                    chunkMessage.V1Header.SessionId     = V1Header.SessionId;
                    chunkMessage.V1Header.TotalSize     = V1Header.TotalSize;
                    chunkMessage.V1Header.Offset        = (ulong)offset;
                    chunkMessage.V1Header.MessageSize   = messageSize;
                    chunkMessage.InnerBody = chunk;

                    chunkMessage.V1Header.AckSessionId = V1Header.AckSessionId;

                    chunkMessage.Footer = Footer;

                    chunkMessage.PrepareMessage();
                    chunks.Add(chunkMessage);

                    offset += messageSize;
                }
            }


            if (Version == P2PVersion.P2PV2)
            {
                uint nextId = Header.Identifier;

                long dataRemain = (long)V2Header.DataRemaining;
                while (offset < totalMessage.LongLength)
                {
                    P2PMessage chunkMessage = new P2PMessage(Version);
                    int        maxDataSize  = maxSize;

                    if (offset == 0 && V2Header.HeaderTLVs.Count > 0)
                    {
                        foreach (KeyValuePair <byte, byte[]> keyvalue in V2Header.HeaderTLVs)
                        {
                            chunkMessage.V2Header.HeaderTLVs[keyvalue.Key] = keyvalue.Value;
                        }

                        maxDataSize = maxSize - chunkMessage.V2Header.HeaderLength;
                    }


                    uint dataSize = (uint)Math.Min((uint)maxDataSize, (totalMessage.LongLength - offset));

                    byte[] chunk = new byte[dataSize];
                    Buffer.BlockCopy(totalMessage, (int)offset, chunk, 0, (int)dataSize);

                    if (offset == 0)
                    {
                        chunkMessage.V2Header.OperationCode = V2Header.OperationCode;
                    }

                    chunkMessage.V2Header.SessionId     = V2Header.SessionId;
                    chunkMessage.V2Header.TFCombination = V2Header.TFCombination;
                    chunkMessage.V2Header.PackageNumber = V2Header.PackageNumber;

                    if (totalMessage.LongLength + dataRemain - (dataSize + offset) > 0)
                    {
                        chunkMessage.V2Header.DataRemaining = (ulong)(totalMessage.LongLength + dataRemain - (dataSize + offset));
                    }

                    if ((offset != 0) &&
                        TFCombination.First == (V2Header.TFCombination & TFCombination.First))
                    {
                        chunkMessage.V2Header.TFCombination = (TFCombination)(V2Header.TFCombination - TFCombination.First);
                    }

                    chunkMessage.InnerBody         = chunk;
                    chunkMessage.Header.Identifier = nextId;
                    nextId += chunkMessage.Header.MessageSize;

                    chunks.Add(chunkMessage);

                    offset += dataSize;
                }
            }

            return(chunks.ToArray());
        }
Exemple #4
0
 /// <summary>
 /// Returns the inner message as a byte array.
 /// </summary>
 /// <remarks>
 /// If the inner message is set the GetBytes() method is called upon that inner message.
 /// If there is no inner message set, but the InnerBody property contains data then
 /// that data is returned.
 /// </remarks>
 /// <returns></returns>
 protected virtual byte[] GetInnerBytes()
 {
     return((InnerBody != null)
         ? InnerBody
         : (InnerMessage != null ? InnerMessage.GetBytes() : new byte[0]));
 }
Exemple #5
0
        public override byte[] GetBytes()
        {
            StringBuilder builder = new StringBuilder();

            foreach (StrKeyValuePair entry in MimeHeader)
            {
                builder.Append(entry.Key).Append(": ").Append(entry.Value).Append("\r\n");
            }

            builder.Append("\r\n");

            if (InnerMessage != null)
            {
                return(AppendArray(System.Text.Encoding.UTF8.GetBytes(builder.ToString()), InnerMessage.GetBytes()));
            }

            return(System.Text.Encoding.UTF8.GetBytes(builder.ToString()));
        }