/// <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()); }
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())); } }
/// <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()); }
/// <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])); }
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())); }