using System.Globalization; using System.IO; using Renci.SshNet.Common; namespace Renci.SshNet.Sftp { internal abstract class SftpMessage : SshData { /// /// Gets the size of the message in bytes. /// /// /// The size of the messages in bytes. /// protected override int BufferCapacity { get { // 4 bytes for the length of the SFTP data // 1 byte for the SFTP message type return 5; } } public abstract SftpMessageTypes SftpMessageType { get; } protected override void LoadData() { } protected override void SaveData() { Write((byte) SftpMessageType); } /// /// Writes the current message to the specified . /// /// The to write the message to. protected override void WriteBytes(SshDataStream stream) { const int sizeOfDataLengthBytes = 4; var startPosition = stream.Position; // skip 4 bytes for the length of the SFTP message data _ = stream.Seek(sizeOfDataLengthBytes, SeekOrigin.Current); // write the SFTP message data to the stream base.WriteBytes(stream); // save where we were positioned when we finished writing the SSH message data var endPosition = stream.Position; // determine the length of the SSH message data var dataLength = endPosition - startPosition - sizeOfDataLengthBytes; // write the length of the SFTP message where we were positioned before we started // writing the SFTP message data stream.Position = startPosition; stream.Write((uint) dataLength); // move back to we were positioned when we finished writing the SFTP message data stream.Position = endPosition; } protected SftpFileAttributes ReadAttributes() { return SftpFileAttributes.FromBytes(DataStream); } public override string ToString() { return string.Format(CultureInfo.CurrentCulture, "SFTP Message : {0}", SftpMessageType); } } }