@@ -13,6 +13,7 @@ import 'package:dart_rfb/src/constants.dart';
1313import 'package:dart_rfb/src/extensions/byte_data_extensions.dart' ;
1414import 'package:dart_rfb/src/extensions/int_extensions.dart' ;
1515import 'package:dart_rfb/src/extensions/raw_socket_extensions.dart' ;
16+ import 'package:dart_rfb/src/protocol/client_cut_text_message.dart' ;
1617import 'package:dart_rfb/src/protocol/client_init_message.dart' ;
1718import 'package:dart_rfb/src/protocol/encoding_type.dart' ;
1819import 'package:dart_rfb/src/protocol/frame_buffer_update_message.dart' ;
@@ -24,6 +25,7 @@ import 'package:dart_rfb/src/protocol/protocol_version_handshake_message.dart';
2425import 'package:dart_rfb/src/protocol/security_handshake_message.dart' ;
2526import 'package:dart_rfb/src/protocol/security_result_handshake_message.dart' ;
2627import 'package:dart_rfb/src/protocol/security_type.dart' ;
28+ import 'package:dart_rfb/src/protocol/server_cut_text_message.dart' ;
2729import 'package:dart_rfb/src/protocol/server_init_message.dart' ;
2830import 'package:dart_rfb/src/protocol/set_encodings_message.dart' ;
2931import 'package:dart_rfb/src/protocol/set_pixel_format_message.dart' ;
@@ -35,25 +37,32 @@ import 'package:logging/logging.dart';
3537class RemoteFrameBufferClient {
3638 static final Logger logger = Logger ('RemoteFrameBufferClient' );
3739
38- final StreamController <RemoteFrameBufferClientUpdate >
39- _updateStreamController =
40- StreamController <RemoteFrameBufferClientUpdate >.broadcast ();
41-
4240 Option <Config > _config = none ();
4341
44- Option <RawSocket > _socket = none ();
42+ Option <String > _password = none ();
4543
4644 bool _readLoopRunning = false ;
4745
48- Option <String > _password = none ();
49-
5046 Option <RemoteFrameBufferProtocolVersion > _selectedProtocolVersion = none ();
5147
5248 Option <RemoteFrameBufferSecurityType > _selectedSecurityType = none ();
5349
50+ Option <RawSocket > _socket = none ();
51+
52+ final StreamController <String > _serverClipBoardStreamController =
53+ StreamController <String >();
54+
55+ final StreamController <RemoteFrameBufferClientUpdate >
56+ _updateStreamController =
57+ StreamController <RemoteFrameBufferClientUpdate >.broadcast ();
58+
5459 /// The config used by the underlying session.
5560 Option <Config > get config => _config;
5661
62+ /// A [Stream] that will give access to the server's clipboard updates.
63+ Stream <String > get serverClipBoardStream =>
64+ _serverClipBoardStreamController.stream;
65+
5766 /// A [Stream] that will give access to all incoming framebuffer updates.
5867 Stream <RemoteFrameBufferClientUpdate > get updateStream =>
5968 _updateStreamController.stream;
@@ -116,6 +125,19 @@ class RemoteFrameBufferClient {
116125 ),
117126 );
118127
128+ void sendClientCutText ({
129+ required final String text,
130+ }) =>
131+ _socket.match (
132+ () {},
133+ (final RawSocket socket) {
134+ final RemoteFrameBufferClientCutTextMessage message =
135+ RemoteFrameBufferClientCutTextMessage (text: text);
136+ logger.info ('> $message ' );
137+ socket.write (message.toBytes ().buffer.asUint8List ());
138+ },
139+ );
140+
119141 void sendKeyEvent ({
120142 required final RemoteFrameBufferClientKeyEvent keyEvent,
121143 }) =>
@@ -234,13 +256,20 @@ class RemoteFrameBufferClient {
234256 // no data, just ignore for now
235257 break ;
236258 case 3 : // ServerCutText
237- final int length =
238- (await socket.readSync (length: 7 ).run ()).getUint32 (3 );
239- socket.readSync (length: length);
259+ final RemoteFrameBufferServerCutTextMessage message =
260+ (await RemoteFrameBufferServerCutTextMessage
261+ .readFromSocket (socket: socket)
262+ .run ())
263+ .getOrElse (
264+ (final Object error) => throw Exception (
265+ 'Error reading server cut text: $error ' ,
266+ ),
267+ );
268+ logger.info ('< $message ' );
269+ _serverClipBoardStreamController.add (message.text);
240270 break ;
241271 default :
242- logger.log (
243- Level .INFO ,
272+ logger.info (
244273 'Receive unsupported message type: $messageType ' ,
245274 );
246275 break ;
0 commit comments