Bläddra i källkod

adapt ssh example (still using the Terminal directly)

devmil 4 år sedan
förälder
incheckning
14e7a34d07
2 ändrade filer med 52 tillägg och 19 borttagningar
  1. 51 19
      example/lib/ssh.dart
  2. 1 0
      lib/xterm.dart

+ 51 - 19
example/lib/ssh.dart

@@ -1,3 +1,4 @@
+import 'dart:async';
 import 'dart:convert';
 
 import 'package:dartssh/client.dart';
@@ -34,42 +35,76 @@ class MyHomePage extends StatefulWidget {
   _MyHomePageState createState() => _MyHomePageState();
 }
 
-class _MyHomePageState extends State<MyHomePage> {
-  Terminal terminal;
+class SSHTerminalBackend implements TerminalBackend {
   SSHClient client;
 
-  @override
-  void initState() {
-    super.initState();
-    terminal = Terminal(onInput: onInput);
-    connect();
+  String _host;
+  String _username;
+  String _password;
+
+  Completer<int> _exitCodeCompleter;
+  StreamController<String> _outStream;
+
+  SSHTerminalBackend(this._host, this._username, this._password);
+
+  void onWrite(String data) {
+    _outStream.sink.add(data);
   }
 
-  void connect() {
-    terminal.write('connecting $host...');
+  @override
+  Future<int> get exitCode => _exitCodeCompleter.future;
+
+  @override
+  void init() {
+    _exitCodeCompleter = Completer<int>();
+    _outStream = StreamController<String>();
+
+    onWrite('connecting $_host...');
     client = SSHClient(
-      hostport: Uri.parse(host),
-      login: username,
+      hostport: Uri.parse(_host),
+      login: _username,
       print: print,
       termWidth: 80,
       termHeight: 25,
       termvar: 'xterm-256color',
-      getPassword: () => utf8.encode(password),
+      getPassword: () => utf8.encode(_password),
       response: (transport, data) {
-        terminal.write(data);
+        onWrite(data);
       },
       success: () {
-        terminal.write('connected.\n');
+        onWrite('connected.\n');
       },
       disconnected: () {
-        terminal.write('disconnected.');
+        onWrite('disconnected.');
+        _outStream.close();
       },
     );
   }
 
-  void onInput(String input) {
+  @override
+  Stream<String> get out => _outStream.stream;
+
+  @override
+  void resize(int width, int height) {
+    client.setTerminalWindowSize(width, height);
+  }
+
+  @override
+  void write(String input) {
     client?.sendChannelData(utf8.encode(input));
   }
+}
+
+class _MyHomePageState extends State<MyHomePage> {
+  Terminal terminal;
+  SSHTerminalBackend backend;
+
+  @override
+  void initState() {
+    super.initState();
+    backend = SSHTerminalBackend(host, username, password);
+    terminal = Terminal(backend: backend, maxLines: 10000);
+  }
 
   @override
   Widget build(BuildContext context) {
@@ -77,9 +112,6 @@ class _MyHomePageState extends State<MyHomePage> {
       body: SafeArea(
         child: TerminalView(
           terminal: terminal,
-          onResize: (width, height) {
-            client?.setTerminalWindowSize(width, height);
-          },
         ),
       ),
     );

+ 1 - 0
lib/xterm.dart

@@ -1,5 +1,6 @@
 library xterm;
 
+export 'terminal/terminal.dart';
 export 'terminal/terminal_isolate.dart';
 export 'terminal/terminal_backend.dart';
 export 'terminal/terminal_ui_interaction.dart';