feat: file transfer tab works

Signed-off-by: Kingtous <kingtous@qq.com>
This commit is contained in:
Kingtous
2022-06-21 17:58:27 +08:00
parent 97509127d5
commit 0eacb6706a
7 changed files with 93 additions and 53 deletions

View File

@@ -36,14 +36,13 @@ class _FileManagerPageState extends State<FileManagerPage>
@override
void initState() {
super.initState();
Get.put(FFI(), tag: 'ft_${widget.id}');
_ffi.ffiModel.platformFFI = gFFI.ffiModel.platformFFI;
_ffi.connect(widget.id, isFileTransfer: true);
_ffi.ffiModel.updateEventListener(widget.id);
Get.put(FFI.newFFI()..connect(widget.id, isFileTransfer: true),
tag: 'ft_${widget.id}');
// _ffi.ffiModel.updateEventListener(widget.id);
if (!Platform.isLinux) {
Wakelock.enable();
}
print("init success with id ${widget.id}");
}
@override

View File

@@ -519,6 +519,10 @@ class FileModel extends ChangeNotifier {
_currentRemoteDir.changeSortStyle(sort);
notifyListeners();
}
initFileFetcher() {
_fileFetcher.id = _ffi.target?.id;
}
}
class JobResultListener<T> {
@@ -566,6 +570,17 @@ class FileFetcher {
Map<String, Completer<FileDirectory>> remoteTasks = Map();
Map<int, Completer<FileDirectory>> readRecursiveTasks = Map();
String? _id;
String? get id => _id;
set id(String? id) {
_id = id;
}
// if id == null, means to fetch global FFI
FFI get _ffi => ffi(_id == null ? "" : 'ft_${_id}');
Future<FileDirectory> registerReadTask(bool isLocal, String path) {
// final jobs = isLocal?localJobs:remoteJobs; // maybe we will use read local dir async later
final tasks = remoteTasks; // bypass now
@@ -633,13 +648,14 @@ class FileFetcher {
Future<FileDirectory> fetchDirectory(
String path, bool isLocal, bool showHidden) async {
try {
final msg = {"path": path, "show_hidden": showHidden.toString()};
if (isLocal) {
final res = gFFI.getByName("read_local_dir_sync", jsonEncode(msg));
final res = await _ffi.bind.sessionReadLocalDirSync(
id: id ?? "", path: path, showHidden: showHidden);
final fd = FileDirectory.fromJson(jsonDecode(res));
return fd;
} else {
gFFI.setByName("read_remote_dir", jsonEncode(msg));
await _ffi.bind.sessionReadRemoteDir(
id: id ?? "", path: path, includeHidden: showHidden);
return registerReadTask(isLocal, path);
}
} catch (e) {
@@ -657,7 +673,8 @@ class FileFetcher {
"show_hidden": showHidden.toString(),
"is_remote": (!isLocal).toString()
};
gFFI.setByName("read_dir_recursive", jsonEncode(msg));
// TODO
_ffi.setByName("read_dir_recursive", jsonEncode(msg));
return registerReadRecursiveTask(id);
} catch (e) {
return Future.error(e);

View File

@@ -784,6 +784,13 @@ class FFI {
this.fileModel = FileModel(WeakReference(this));
}
static FFI newFFI() {
final ffi = FFI();
// keep platformFFI only once
ffi.ffiModel.platformFFI = gFFI.ffiModel.platformFFI;
return ffi;
}
/// Get the remote id for current client.
String getId() {
return getByName('remote_id'); // TODO
@@ -888,32 +895,32 @@ class FFI {
setByName('connect_file_transfer', id);
} else {
chatModel.resetClientMode();
// setByName('connect', id);
// TODO multi model instances
canvasModel.id = id;
imageModel._id = id;
cursorModel.id = id;
final stream =
bind.sessionConnect(id: id, isFileTransfer: isFileTransfer);
final cb = ffiModel.startEventListener(id);
() async {
await for (final message in stream) {
if (message is Event) {
try {
debugPrint("event:${message.field0}");
Map<String, dynamic> event = json.decode(message.field0);
cb(event);
} catch (e) {
print('json.decode fail(): $e');
}
} else if (message is Rgba) {
imageModel.onRgba(message.field0);
}
}
}();
// every instance will bind a stream
}
final stream = bind.sessionConnect(id: id, isFileTransfer: isFileTransfer);
final cb = ffiModel.startEventListener(id);
() async {
await for (final message in stream) {
if (message is Event) {
try {
debugPrint("event:${message.field0}");
Map<String, dynamic> event = json.decode(message.field0);
cb(event);
} catch (e) {
print('json.decode fail(): $e');
}
} else if (message is Rgba) {
imageModel.onRgba(message.field0);
}
}
}();
// every instance will bind a stream
this.id = id;
if (isFileTransfer) {
this.fileModel.initFileFetcher();
}
}
/// Login with [password], choose if the client should [remember] it.

View File

@@ -93,7 +93,12 @@ class PlatformFFI {
_ffiBind = RustdeskImpl(dylib);
_startListenEvent(_ffiBind); // global event
try {
_homeDir = (await ExternalPath.getExternalStorageDirectories())[0];
if (isAndroid) {
// only support for android
_homeDir = (await ExternalPath.getExternalStorageDirectories())[0];
} else {
_homeDir = (await getDownloadsDirectory())?.path ?? "";
}
} catch (e) {
print(e);
}

View File

@@ -149,6 +149,11 @@ void wire_session_create_dir(int64_t port_,
struct wire_uint_8_list *path,
bool is_remote);
void wire_session_read_local_dir_sync(int64_t port_,
struct wire_uint_8_list *id,
struct wire_uint_8_list *path,
bool show_hidden);
struct wire_uint_8_list *new_uint_8_list(int32_t len);
void free_WireSyncReturnStruct(struct WireSyncReturnStruct val);
@@ -194,6 +199,7 @@ static int64_t dummy_method_to_enforce_bundling(void) {
dummy_var ^= ((int64_t) (void*) wire_session_remove_all_empty_dirs);
dummy_var ^= ((int64_t) (void*) wire_session_cancel_job);
dummy_var ^= ((int64_t) (void*) wire_session_create_dir);
dummy_var ^= ((int64_t) (void*) wire_session_read_local_dir_sync);
dummy_var ^= ((int64_t) (void*) new_uint_8_list);
dummy_var ^= ((int64_t) (void*) free_WireSyncReturnStruct);
dummy_var ^= ((int64_t) (void*) store_dart_post_cobject);