private ICollection<SFTPFileInfo> ReadDir(uint requestId, byte[] handle)
{
SFTPPacket packet =
new SFTPPacket(SFTPPacketType.SSH_FXP_READDIR)
.WriteUInt32(requestId)
.WriteAsString(handle);
List<SFTPFileInfo> fileList = new List<SFTPFileInfo>();
bool result = false;
_eventHandler.ClearResponseBuffer();
Transmit(packet);
_eventHandler.WaitResponse(
(packetType, dataReader) => {
if (packetType == SFTPPacketType.SSH_FXP_STATUS) {
SFTPClientErrorException exception = SFTPClientErrorException.Create(dataReader);
if (exception.ID == requestId) {
if (exception.Code == SFTPStatusCode.SSH_FX_EOF) {
result = true;
return true; // processed
}
else {
throw exception;
}
}
}
else if (packetType == SFTPPacketType.SSH_FXP_NAME) {
uint id = dataReader.ReadUInt32();
if (id == requestId) {
uint count = (uint)dataReader.ReadInt32();
// use Encoding object with replacement fallback
Encoding encoding = Encoding.GetEncoding(
_encoding.CodePage,
EncoderFallback.ReplacementFallback,
DecoderFallback.ReplacementFallback);
for (int i = 0; i < count; i++) {
SFTPFileInfo fileInfo = ReadFileInfo(dataReader, encoding);
fileList.Add(fileInfo);
}
result = true; // OK, received SSH_FXP_NAME
return true; // processed
}
}
return false; // ignored
},
_protocolTimeout
);
// sanity check
if (!Volatile.Read(ref result)) {
throw new SFTPClientException("Missing SSH_FXP_NAME");
}
return fileList;
}