scpReadFileAsString method
String
scpReadFileAsString(
- ssh_session session,
- String fullPath, {
- Allocator allocator = calloc,
fullPath
example => "helloworld/helloworld.txt"
Implementation
String scpReadFileAsString(ssh_session session, String fullPath,
{Allocator allocator = calloc}) {
var path = fullPath.toNativeUtf8(allocator: allocator);
var scp = ssh_scp_new(session, SSH_SCP_READ, path.cast<Int8>());
if (scp.address == nullptr.address) {
throw Exception(
'Error allocating scp session: ${ssh_get_error(session.cast()).cast<Utf8>().toDartString()}');
}
var rc = ssh_scp_init(scp);
if (rc != SSH_OK) {
ssh_scp_free(scp);
throw Exception(
"Error initializing scp session: ${ssh_get_error(session.cast()).cast<Utf8>().toDartString()}");
}
rc = ssh_scp_pull_request(scp);
if (rc != ssh_scp_request_types.SSH_SCP_REQUEST_NEWFILE) {
throw Exception(
"Error receiving information about file: ${ssh_get_error(session.cast()).cast<Utf8>().toDartString()}");
}
var remoteFileLength = ssh_scp_request_get_size64(scp);
//var filename = ssh_scp_request_get_filename(scp).cast<Utf8>();
//var mode = ssh_scp_request_get_permissions(scp);
//var controller = StreamController<List<int>>();
int bufferSize =
MAX_XFER_BUF_SIZE; //remoteFileLength > bs ? bs : remoteFileLength;
var nbytes = 0, nwritten = 0;
final buffer = allocator<Int8>(bufferSize);
var receive = '';
while (true) {
nbytes = ssh_scp_read(scp, buffer.cast(), sizeOf<Int8>() * bufferSize);
nwritten += nbytes;
var data = buffer.asTypedList(nbytes);
receive += utf8.decode(data);
if (nbytes < 0 || nbytes == SSH_ERROR) {
ssh_scp_close(scp);
ssh_scp_free(scp);
allocator.free(buffer);
break;
}
}
allocator.free(path);
if (nwritten < remoteFileLength) {
throw Exception("Error Incomplete file");
}
return receive;
}