scpReadFileAsString method

String scpReadFileAsString(
  1. ssh_session session,
  2. String fullPath, {
  3. 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;
}