internal static SftpFileAttributes FromBytes(SshDataStream stream)
{
var flag = stream.ReadUInt32();
long size = -1;
var userId = -1;
var groupId = -1;
uint permissions = 0;
var accessTime = DateTime.MinValue;
var modifyTime = DateTime.MinValue;
IDictionary<string, string> extensions = null;
if ((flag & 0x00000001) == 0x00000001) // SSH_FILEXFER_ATTR_SIZE
{
size = (long) stream.ReadUInt64();
}
if ((flag & 0x00000002) == 0x00000002) // SSH_FILEXFER_ATTR_UIDGID
{
userId = (int) stream.ReadUInt32();
groupId = (int) stream.ReadUInt32();
}
if ((flag & 0x00000004) == 0x00000004) // SSH_FILEXFER_ATTR_PERMISSIONS
{
permissions = stream.ReadUInt32();
}
if ((flag & 0x00000008) == 0x00000008) // SSH_FILEXFER_ATTR_ACMODTIME
{
var time = stream.ReadUInt32();
accessTime = DateTime.FromFileTime((time + 11644473600) * 10000000);
time = stream.ReadUInt32();
modifyTime = DateTime.FromFileTime((time + 11644473600) * 10000000);
}
if ((flag & 0x80000000) == 0x80000000) // SSH_FILEXFER_ATTR_EXTENDED
{
var extendedCount = (int) stream.ReadUInt32();
extensions = new Dictionary<string, string>(extendedCount);
for (var i = 0; i < extendedCount; i++)
{
var extensionName = stream.ReadString(SshData.Utf8);
var extensionData = stream.ReadString(SshData.Utf8);
extensions.Add(extensionName, extensionData);
}
}
return new SftpFileAttributes(accessTime, modifyTime, size, userId, groupId, permissions, extensions);
}