refactor all [setByName] [getByName] to async bridge function

This commit is contained in:
csf
2022-08-08 22:27:27 +08:00
parent c5d0628291
commit e420178750
18 changed files with 332 additions and 470 deletions

View File

@@ -1,5 +1,3 @@
import 'dart:convert';
import 'package:dash_chat_2/dash_chat_2.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hbb/models/platform_model.dart';
@@ -106,12 +104,11 @@ class ChatModel with ChangeNotifier {
if (message.text.isNotEmpty) {
_messages[_currentID]?.insert(message);
if (_currentID == clientModeID) {
_ffi.target?.setByName("chat_client_mode", message.text);
if (_ffi.target != null) {
bind.sessionSendChat(id: _ffi.target!.id, text: message.text);
}
} else {
final msg = Map()
..["id"] = _currentID
..["text"] = message.text;
_ffi.target?.setByName("chat_server_mode", jsonEncode(msg));
bind.serverSendChat(connId: _currentID, msg: message.text);
}
}
notifyListeners();

View File

@@ -290,7 +290,7 @@ class FileModel extends ChangeNotifier {
}
onReady() async {
_localOption.home = _ffi.target?.getByName("get_home_dir") ?? "";
_localOption.home = await bind.mainGetHomeDir();
_localOption.showHidden = (await bind.sessionGetPeerOption(
id: _ffi.target?.id ?? "", name: "local_show_hidden"))
.isNotEmpty;

View File

@@ -889,8 +889,10 @@ class FFI {
/// Send scroll event with scroll distance [y].
void scroll(int y) {
setByName('send_mouse',
json.encode(modify({'id': id, 'type': 'wheel', 'y': y.toString()})));
bind.sessionSendMouse(
id: id,
msg: json
.encode(modify({'id': id, 'type': 'wheel', 'y': y.toString()})));
}
/// Reconnect to the remote peer.
@@ -916,8 +918,9 @@ class FFI {
/// Send mouse press event.
void sendMouse(String type, MouseButtons button) {
if (!ffiModel.keyboard()) return;
setByName('send_mouse',
json.encode(modify({'id': id, 'type': type, 'buttons': button.value})));
bind.sessionSendMouse(
id: id,
msg: json.encode(modify({'type': type, 'buttons': button.value})));
}
/// Send key stroke event.
@@ -953,8 +956,8 @@ class FFI {
if (!ffiModel.keyboard()) return;
var x2 = x.toInt();
var y2 = y.toInt();
setByName(
'send_mouse', json.encode(modify({'id': id, 'x': '$x2', 'y': '$y2'})));
bind.sessionSendMouse(
id: id, msg: json.encode(modify({'x': '$x2', 'y': '$y2'})));
}
/// List the saved peers.
@@ -1032,14 +1035,14 @@ class FFI {
/// Send **get** command to the Rust core based on [name] and [arg].
/// Return the result as a string.
String getByName(String name, [String arg = '']) {
return platformFFI.getByName(name, arg);
}
// String getByName(String name, [String arg = '']) {
// return platformFFI.getByName(name, arg);
// }
/// Send **set** command to the Rust core based on [name] and [value].
void setByName(String name, [String value = '']) {
platformFFI.setByName(name, value);
}
// void setByName(String name, [String value = '']) {
// platformFFI.setByName(name, value);
// }
handleMouse(Map<String, dynamic> evt, {double tabBarHeight = 0.0}) {
var type = '';
@@ -1092,8 +1095,7 @@ class FFI {
break;
}
evt['buttons'] = buttons;
evt['id'] = id;
setByName('send_mouse', json.encode(evt));
bind.sessionSendMouse(id: id, msg: json.encode(evt));
}
listenToMouse(bool yesOrNo) {

View File

@@ -30,8 +30,6 @@ class PlatformFFI {
String _dir = '';
String _homeDir = '';
F2? _translate;
F2? _getByName;
F3? _setByName;
var _eventHandlers = Map<String, Map<String, HandleEvent>>();
late RustdeskImpl _ffiBind;
late String _appType;
@@ -89,31 +87,6 @@ class PlatformFFI {
return res;
}
/// Send **get** command to the Rust core based on [name] and [arg].
/// Return the result as a string.
String getByName(String name, [String arg = '']) {
if (_getByName == null) return '';
var a = name.toNativeUtf8();
var b = arg.toNativeUtf8();
var p = _getByName!(a, b);
assert(p != nullptr);
var res = p.toDartString();
calloc.free(p);
calloc.free(a);
calloc.free(b);
return res;
}
/// Send **set** command to the Rust core based on [name] and [value].
void setByName(String name, [String value = '']) {
if (_setByName == null) return;
var a = name.toNativeUtf8();
var b = value.toNativeUtf8();
_setByName!(a, b);
calloc.free(a);
calloc.free(b);
}
/// Init the FFI class, loads the native Rust core library.
Future<Null> init(String appType) async {
_appType = appType;
@@ -133,10 +106,6 @@ class PlatformFFI {
debugPrint('initializing FFI ${_appType}');
try {
_translate = dylib.lookupFunction<F2, F2>('translate');
_getByName = dylib.lookupFunction<F2, F2>('get_by_name');
_setByName =
dylib.lookupFunction<Void Function(Pointer<Utf8>, Pointer<Utf8>), F3>(
'set_by_name');
_dir = (await getApplicationDocumentsDirectory()).path;
_ffiBind = RustdeskImpl(dylib);
_startListenEvent(_ffiBind); // global event
@@ -177,10 +146,10 @@ class PlatformFFI {
}
print(
"_appType:$_appType,info1-id:$id,info2-name:$name,dir:$_dir,homeDir:$_homeDir");
setByName('info1', id);
setByName('info2', name);
setByName('home_dir', _homeDir);
setByName('init', _dir);
await _ffiBind.mainDeviceId(id: id);
await _ffiBind.mainDeviceName(name: name);
await _ffiBind.mainSetHomeDir(home: _homeDir);
await _ffiBind.mainInit(appDir: _dir);
} catch (e) {
print(e);
}

View File

@@ -99,42 +99,29 @@ class ServerModel with ChangeNotifier {
// audio
if (androidVersion < 30 || !await PermissionManager.check("audio")) {
_audioOk = false;
parent.target?.setByName(
'option',
jsonEncode(Map()
..["name"] = "enable-audio"
..["value"] = "N"));
bind.mainSetOption(key: "enable-audio", value: "N");
} else {
final audioOption = parent.target?.getByName('option', 'enable-audio');
_audioOk = audioOption?.isEmpty ?? false;
final audioOption = await bind.mainGetOption(key: 'enable-audio');
_audioOk = audioOption.isEmpty;
}
// file
if (!await PermissionManager.check("file")) {
_fileOk = false;
parent.target?.setByName(
'option',
jsonEncode(Map()
..["name"] = "enable-file-transfer"
..["value"] = "N"));
bind.mainSetOption(key: "enable-file-transfer", value: "N");
} else {
final fileOption =
parent.target?.getByName('option', 'enable-file-transfer');
_fileOk = fileOption?.isEmpty ?? false;
await bind.mainGetOption(key: 'enable-file-transfer');
_fileOk = fileOption.isEmpty;
}
// input (mouse control)
Map<String, String> res = Map()
..["name"] = "enable-keyboard"
..["value"] = 'N';
parent.target
?.setByName('option', jsonEncode(res)); // input false by default
// input (mouse control) false by default
bind.mainSetOption(key: "enable-keyboard", value: "N");
notifyListeners();
}();
Timer.periodic(Duration(seconds: 1), (timer) {
var status =
int.tryParse(parent.target?.getByName('connect_statue') ?? "") ?? 0;
Timer.periodic(Duration(seconds: 1), (timer) async {
var status = await bind.mainGetOnlineStatue();
if (status > 0) {
status = 1;
}
@@ -142,10 +129,8 @@ class ServerModel with ChangeNotifier {
_connectStatus = status;
notifyListeners();
}
final res = parent.target
?.getByName('check_clients_length', _clients.length.toString()) ??
"";
if (res.isNotEmpty) {
final res = await bind.mainCheckClientsLength(length: _clients.length);
if (res != null) {
debugPrint("clients not match!");
updateClientState(res);
}
@@ -156,7 +141,7 @@ class ServerModel with ChangeNotifier {
updatePasswordModel() async {
var update = false;
final temporaryPassword = gFFI.getByName("temporary_password");
final temporaryPassword = await bind.mainGetTemporaryPassword();
final verificationMethod =
await bind.mainGetOption(key: "verification-method");
final temporaryPasswordLength =
@@ -194,10 +179,7 @@ class ServerModel with ChangeNotifier {
}
_audioOk = !_audioOk;
Map<String, String> res = Map()
..["name"] = "enable-audio"
..["value"] = _audioOk ? '' : 'N';
parent.target?.setByName('option', jsonEncode(res));
bind.mainSetOption(key: "enable-audio", value: _audioOk ? '' : 'N');
notifyListeners();
}
@@ -211,10 +193,7 @@ class ServerModel with ChangeNotifier {
}
_fileOk = !_fileOk;
Map<String, String> res = Map()
..["name"] = "enable-file-transfer"
..["value"] = _fileOk ? '' : 'N';
parent.target?.setByName('option', jsonEncode(res));
bind.mainSetOption(key: "enable-file-transfer", value: _fileOk ? '' : 'N');
notifyListeners();
}
@@ -284,7 +263,7 @@ class ServerModel with ChangeNotifier {
// TODO
parent.target?.ffiModel.updateEventListener("");
await parent.target?.invokeMethod("init_service");
parent.target?.setByName("start_service");
await bind.mainStartService();
_fetchID();
updateClientState();
if (!Platform.isLinux) {
@@ -299,7 +278,7 @@ class ServerModel with ChangeNotifier {
// TODO
parent.target?.serverModel.closeAll();
await parent.target?.invokeMethod("stop_service");
parent.target?.setByName("stop_service");
await bind.mainStopService();
notifyListeners();
if (!Platform.isLinux) {
// current linux is not supported
@@ -312,9 +291,9 @@ class ServerModel with ChangeNotifier {
}
Future<bool> setPermanentPassword(String newPW) async {
parent.target?.setByName("permanent_password", newPW);
await bind.mainSetPermanentPassword(password: newPW);
await Future.delayed(Duration(milliseconds: 500));
final pw = parent.target?.getByName("permanent_password");
final pw = await bind.mainGetPermanentPassword();
if (newPW == pw) {
return true;
} else {
@@ -355,10 +334,7 @@ class ServerModel with ChangeNotifier {
break;
case "input":
if (_inputOk != value) {
Map<String, String> res = Map()
..["name"] = "enable-keyboard"
..["value"] = value ? '' : 'N';
parent.target?.setByName('option', jsonEncode(res));
bind.mainSetOption(key: "enable-keyboard", value: value ? '' : 'N');
}
_inputOk = value;
break;
@@ -368,8 +344,8 @@ class ServerModel with ChangeNotifier {
notifyListeners();
}
updateClientState([String? json]) {
var res = json ?? parent.target?.getByName("clients_state") ?? "";
updateClientState([String? json]) async {
var res = await bind.mainGetClientsState();
try {
final List clientsJson = jsonDecode(res);
for (var clientJson in clientsJson) {
@@ -451,12 +427,9 @@ class ServerModel with ChangeNotifier {
});
}
void sendLoginResponse(Client client, bool res) {
final Map<String, dynamic> response = Map();
response["id"] = client.id;
response["res"] = res;
void sendLoginResponse(Client client, bool res) async {
if (res) {
parent.target?.setByName("login_res", jsonEncode(response));
bind.serverLoginRes(connId: client.id, res: res);
if (!client.isFileTransfer) {
parent.target?.invokeMethod("start_capture");
}
@@ -464,7 +437,7 @@ class ServerModel with ChangeNotifier {
_clients[client.id]?.authorized = true;
notifyListeners();
} else {
parent.target?.setByName("login_res", jsonEncode(response));
bind.serverLoginRes(connId: client.id, res: res);
parent.target?.invokeMethod("cancel_notification", client.id);
_clients.remove(client.id);
}
@@ -496,7 +469,7 @@ class ServerModel with ChangeNotifier {
closeAll() {
_clients.forEach((id, client) {
parent.target?.setByName("close_conn", id.toString());
bind.serverCloseConnection(connId: id);
});
_clients.clear();
}