import 'dart:async'; import 'dart:js' as js; import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:uuid/uuid.dart'; import 'dart:html' as html; import 'package:flutter_hbb/consts.dart'; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); mixin _$EventToUI { Object get field0 => throw _privateConstructorUsedError; } sealed class EventToUI { const factory EventToUI.event( String field0, ) = EventToUI_Event; const factory EventToUI.rgba( int field0, ) = EventToUI_Rgba; const factory EventToUI.texture( int field0, bool field1, ) = EventToUI_Texture; } class EventToUI_Event implements EventToUI { const EventToUI_Event(final String field0) : this.field = field0; final String field; String get field0 => field; } class EventToUI_Rgba implements EventToUI { const EventToUI_Rgba(final int field0) : field = field0; final int field; int get field0 => field; } class EventToUI_Texture implements EventToUI { const EventToUI_Texture(final int field0, final bool field1) : f0 = field0, f1 = field1; final int f0; final bool f1; int get field0 => f0; bool get field1 => f1; } class RustdeskImpl { Future stopGlobalEventStream({required String appType, dynamic hint}) { throw UnimplementedError("stopGlobalEventStream"); } Future hostStopSystemKeyPropagate( {required bool stopped, dynamic hint}) { throw UnimplementedError("hostStopSystemKeyPropagate"); } int peerGetDefaultSessionsCount({required String id, dynamic hint}) { return 0; } String sessionAddExistedSync( {required String id, required UuidValue sessionId, required Int32List displays, dynamic hint}) { return ''; } String sessionAddSync( {required UuidValue sessionId, required String id, required bool isFileTransfer, required bool isPortForward, required bool isRdp, required String switchUuid, required bool forceRelay, required String password, required bool isSharedPassword, dynamic hint}) { return js.context.callMethod('setByName', [ 'session_add_sync', jsonEncode({ 'id': id, 'password': password, 'is_shared_password': isSharedPassword, 'isFileTransfer': isFileTransfer }) ]); } Stream sessionStart( {required UuidValue sessionId, required String id, dynamic hint}) { js.context.callMethod('setByName', [ 'session_start', jsonEncode({'id': id}) ]); return Stream.empty(); } Stream sessionStartWithDisplays( {required UuidValue sessionId, required String id, required Int32List displays, dynamic hint}) { throw UnimplementedError("sessionStartWithDisplays"); } Future sessionGetRemember( {required UuidValue sessionId, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['remember']) == 'true'); } Future sessionGetToggleOption( {required UuidValue sessionId, required String arg, dynamic hint}) { return Future( () => sessionGetToggleOptionSync(sessionId: sessionId, arg: arg)); } bool sessionGetToggleOptionSync( {required UuidValue sessionId, required String arg, dynamic hint}) { return 'true' == js.context.callMethod('getByName', ['option:toggle', arg]); } Future sessionGetOption( {required UuidValue sessionId, required String arg, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['option:session', arg])); } Future sessionLogin( {required UuidValue sessionId, required String osUsername, required String osPassword, required String password, required bool remember, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'login', jsonEncode({ 'os_username': osUsername, 'os_password': osPassword, 'password': password, 'remember': remember }) ])); } Future sessionSend2Fa( {required UuidValue sessionId, required String code, required bool trustThisDevice, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'send_2fa', jsonEncode({'code': code, 'trust_this_device': trustThisDevice}) ])); } Future sessionClose({required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['session_close'])); } Future sessionRefresh( {required UuidValue sessionId, required int display, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['refresh'])); } Future sessionRecordScreen( {required UuidValue sessionId, required bool start, required int display, required int width, required int height, dynamic hint}) { throw UnimplementedError("sessionRecordScreen"); } Future sessionRecordStatus( {required UuidValue sessionId, required bool status, dynamic hint}) { throw UnimplementedError("sessionRecordStatus"); } Future sessionReconnect( {required UuidValue sessionId, required bool forceRelay, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['reconnect'])); } Future sessionToggleOption( {required UuidValue sessionId, required String value, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['option:toggle', value])); } Future sessionTogglePrivacyMode( {required UuidValue sessionId, required String implKey, required bool on, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'toggle_privacy_mode', jsonEncode({'impl_key': implKey, 'on': on}) ])); } Future sessionGetFlutterOption( {required UuidValue sessionId, required String k, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['option:flutter:peer', k])); } Future sessionSetFlutterOption( {required UuidValue sessionId, required String k, required String v, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:flutter:peer', jsonEncode({'name': k, 'value': v}) ])); } int getNextTextureKey({dynamic hint}) { return 0; } String getLocalFlutterOption({required String k, dynamic hint}) { return js.context.callMethod('getByName', ['option:flutter:local', k]); } Future setLocalFlutterOption( {required String k, required String v, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:flutter:local', jsonEncode({'name': k, 'value': v}) ])); } String getLocalKbLayoutType({dynamic hint}) { return js.context.callMethod('getByName', ['option:local', 'kb_layout']); } Future setLocalKbLayoutType( {required String kbLayoutType, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:local', jsonEncode({'name': 'kb_layout', 'value': kbLayoutType}) ])); } Future sessionGetViewStyle( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['option:session', 'view_style'])); } Future sessionSetViewStyle( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'view_style', 'value': value}) ])); } Future sessionGetScrollStyle( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['option:session', 'scroll_style'])); } Future sessionSetScrollStyle( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'scroll_style', 'value': value}) ])); } Future sessionGetImageQuality( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['image_quality'])); } Future sessionSetImageQuality( {required UuidValue sessionId, required String value, dynamic hint}) { print('set image quality: $value'); return Future( () => js.context.callMethod('setByName', ['image_quality', value])); } Future sessionGetKeyboardMode( {required UuidValue sessionId, dynamic hint}) { final mode = js.context.callMethod('getByName', ['option:session', 'keyboard_mode']); return Future(() => mode == '' ? null : mode); } Future sessionSetKeyboardMode( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'keyboard_mode', 'value': value}) ])); } String? sessionGetReverseMouseWheelSync( {required UuidValue sessionId, dynamic hint}) { return js.context .callMethod('getByName', ['option:session', 'reverse_mouse_wheel']); } Future sessionSetReverseMouseWheel( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'reverse_mouse_wheel', 'value': value}) ])); } String? sessionGetDisplaysAsIndividualWindows( {required UuidValue sessionId, dynamic hint}) { return js.context.callMethod( 'getByName', ['option:session', 'displays_as_individual_windows']); } Future sessionSetDisplaysAsIndividualWindows( {required UuidValue sessionId, required String value, dynamic hint}) { return Future.value(); } String? sessionGetUseAllMyDisplaysForTheRemoteSession( {required UuidValue sessionId, dynamic hint}) { return ''; } Future sessionSetUseAllMyDisplaysForTheRemoteSession( {required UuidValue sessionId, required String value, dynamic hint}) { return Future.value(); } Future sessionGetCustomImageQuality( {required UuidValue sessionId, dynamic hint}) { try { return Future(() => Int32List.fromList([ int.parse(js.context.callMethod( 'getByName', ['option:session', 'custom_image_quality'])) ])); } catch (e) { return Future.value(null); } } bool sessionIsKeyboardModeSupported( {required UuidValue sessionId, required String mode, dynamic hint}) { if (mainGetInputSource(hint: hint) == 'Input source 1') { return [kKeyMapMode, kKeyTranslateMode].contains(mode); } else { return [kKeyLegacyMode, kKeyMapMode].contains(mode); } } bool sessionIsMultiUiSession({required UuidValue sessionId, dynamic hint}) { return false; } Future sessionSetCustomImageQuality( {required UuidValue sessionId, required int value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'custom_image_quality', value, ])); } Future sessionSetCustomFps( {required UuidValue sessionId, required int fps, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['custom-fps', fps])); } Future sessionLockScreen({required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['lock_screen'])); } Future sessionCtrlAltDel({required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['ctrl_alt_del'])); } Future sessionSwitchDisplay( {required bool isDesktop, required UuidValue sessionId, required Int32List value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'switch_display', jsonEncode({ 'isDesktop': isDesktop, 'sessionId': sessionId.toString(), 'value': value }) ])); } Future sessionHandleFlutterKeyEvent( {required UuidValue sessionId, required String character, required int usbHid, required int lockModes, required bool downOrUp, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'flutter_key_event', jsonEncode({ 'name': character, 'usb_hid': usbHid, 'lock_modes': lockModes, if (downOrUp) 'down': 'true', }) ])); } Future sessionHandleFlutterRawKeyEvent( {required UuidValue sessionId, required String name, required int platformCode, required int positionCode, required int lockModes, required bool downOrUp, dynamic hint}) { throw UnimplementedError("sessionHandleFlutterRawKeyEvent"); } void sessionEnterOrLeave( {required UuidValue sessionId, required bool enter, dynamic hint}) { js.context.callMethod('setByName', ['enter_or_leave', enter]); } Future sessionInputKey( {required UuidValue sessionId, required String name, required bool down, required bool press, required bool alt, required bool ctrl, required bool shift, required bool command, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'input_key', jsonEncode({ 'name': name, if (down) 'down': 'true', if (press) 'press': 'true', if (alt) 'alt': 'true', if (ctrl) 'ctrl': 'true', if (shift) 'shift': 'true', if (command) 'command': 'true' }) ])); } Future sessionInputString( {required UuidValue sessionId, required String value, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['input_string', value])); } Future sessionSendChat( {required UuidValue sessionId, required String text, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['send_chat', text])); } Future sessionPeerOption( {required UuidValue sessionId, required String name, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': name, 'value': value}) ])); } Future sessionGetPeerOption( {required UuidValue sessionId, required String name, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['option:session', name])); } Future sessionInputOsPassword( {required UuidValue sessionId, required String value, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['input_os_password', value])); } Future sessionReadRemoteDir( {required UuidValue sessionId, required String path, required bool includeHidden, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'read_remote_dir', jsonEncode({'path': path, 'include_hidden': includeHidden}) ])); } Future sessionSendFiles( {required UuidValue sessionId, required int actId, required String path, required String to, required int fileNum, required bool includeHidden, required bool isRemote, required bool isDir, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'send_files', jsonEncode({ 'id': actId, 'path': path, 'to': to, 'file_num': fileNum, 'include_hidden': includeHidden, 'is_remote': isRemote, 'is_dir': isDir, }) ])); } Future sessionSetConfirmOverrideFile( {required UuidValue sessionId, required int actId, required int fileNum, required bool needOverride, required bool remember, required bool isUpload, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'confirm_override_file', jsonEncode({ 'id': actId, 'file_num': fileNum, 'need_override': needOverride, 'remember': remember, 'is_upload': isUpload }) ])); } Future sessionRemoveFile( {required UuidValue sessionId, required int actId, required String path, required int fileNum, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'remove_file', jsonEncode({ 'id': actId, 'path': path, 'file_num': fileNum, 'is_remote': isRemote }) ])); } Future sessionReadDirToRemoveRecursive( {required UuidValue sessionId, required int actId, required String path, required bool isRemote, required bool showHidden, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'read_dir_to_remove_recursive', jsonEncode({ 'id': actId, 'path': path, 'is_remote': isRemote, 'show_hidden': showHidden }) ])); } Future sessionRemoveAllEmptyDirs( {required UuidValue sessionId, required int actId, required String path, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'remove_all_empty_dirs', jsonEncode({'id': actId, 'path': path, 'is_remote': isRemote}) ])); } Future sessionCancelJob( {required UuidValue sessionId, required int actId, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['cancel_job', actId])); } Future sessionCreateDir( {required UuidValue sessionId, required int actId, required String path, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'create_dir', jsonEncode({'id': actId, 'path': path, 'is_remote': isRemote}) ])); } Future sessionReadLocalDirSync( {required UuidValue sessionId, required String path, required bool showHidden, dynamic hint}) { throw UnimplementedError("sessionReadLocalDirSync"); } Future sessionGetPlatform( {required UuidValue sessionId, required bool isRemote, dynamic hint}) { if (isRemote) { return Future(() => js.context.callMethod('getByName', ['platform'])); } else { return Future(() => 'Web'); } } Future sessionLoadLastTransferJobs( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionLoadLastTransferJobs"); } Future sessionAddJob( {required UuidValue sessionId, required int actId, required String path, required String to, required int fileNum, required bool includeHidden, required bool isRemote, dynamic hint}) { throw UnimplementedError("sessionAddJob"); } Future sessionResumeJob( {required UuidValue sessionId, required int actId, required bool isRemote, dynamic hint}) { throw UnimplementedError("sessionResumeJob"); } Future sessionElevateDirect( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['elevate_direct'])); } Future sessionElevateWithLogon( {required UuidValue sessionId, required String username, required String password, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'elevate_with_logon', jsonEncode({'username': username, 'password': password}) ])); } Future sessionSwitchSides( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionSwitchSides"); } Future sessionChangeResolution( {required UuidValue sessionId, required int display, required int width, required int height, dynamic hint}) { // note: restore on disconnected return Future(() => js.context.callMethod('setByName', [ 'change_resolution', jsonEncode({'display': display, 'width': width, 'height': height}) ])); } Future sessionSetSize( {required UuidValue sessionId, required int display, required int width, required int height, dynamic hint}) { return Future.value(); } Future sessionSendSelectedSessionId( {required UuidValue sessionId, required String sid, dynamic hint}) { throw UnimplementedError("sessionSendSelectedSessionId"); } Future> mainGetSoundInputs({dynamic hint}) { throw UnimplementedError("mainGetSoundInputs"); } Future mainGetDefaultSoundInput({dynamic hint}) { throw UnimplementedError("mainGetDefaultSoundInput"); } String mainGetLoginDeviceInfo({dynamic hint}) { String userAgent = html.window.navigator.userAgent; String appName = html.window.navigator.appName; String appVersion = html.window.navigator.appVersion; String? platform = html.window.navigator.platform; return jsonEncode({ 'os': '$userAgent, $appName $appVersion ($platform)', 'type': 'Web client', 'name': js.context.callMethod('getByName', ['my_name']), }); } Future mainChangeId({required String newId, dynamic hint}) { throw UnimplementedError("mainChangeId"); } Future mainGetAsyncStatus({dynamic hint}) { throw UnimplementedError("mainGetAsyncStatus"); } Future mainGetOption({required String key, dynamic hint}) { return Future.value(mainGetOptionSync(key: key)); } String mainGetOptionSync({required String key, dynamic hint}) { return js.context.callMethod('getByName', ['option', key]); } Future mainGetError({dynamic hint}) { throw UnimplementedError("mainGetError"); } bool mainShowOption({required String key, dynamic hint}) { throw UnimplementedError("mainShowOption"); } Future mainSetOption( {required String key, required String value, dynamic hint}) { js.context.callMethod('setByName', [ 'option', jsonEncode({'name': key, 'value': value}) ]); return Future.value(); } // get server settings Future mainGetOptions({dynamic hint}) { return Future(() => mainGetOptionsSync()); } // get server settings String mainGetOptionsSync({dynamic hint}) { return js.context.callMethod('getByName', ['options']); } Future mainSetOptions({required String json, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['options', json])); } Future mainTestIfValidServer( {required String server, required bool testWithProxy, dynamic hint}) { // TODO: implement return Future.value(''); } Future mainSetSocks( {required String proxy, required String username, required String password, dynamic hint}) { throw UnimplementedError("mainSetSocks"); } Future> mainGetSocks({dynamic hint}) { throw UnimplementedError("mainGetSocks"); } Future mainGetAppName({dynamic hint}) { return Future.value(mainGetAppNameSync(hint: hint)); } String mainGetAppNameSync({dynamic hint}) { return 'RustDesk'; } String mainUriPrefixSync({dynamic hint}) { throw UnimplementedError("mainUriPrefixSync"); } Future mainGetLicense({dynamic hint}) { // TODO: implement return Future(() => ''); } Future mainGetVersion({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['version'])); } Future> mainGetFav({dynamic hint}) { List favs = []; try { favs = (jsonDecode(js.context.callMethod('getByName', ['fav'])) as List) .map((e) => e.toString()) .toList(); } catch (e) { debugPrint('Failed to load favs: $e'); } return Future.value(favs); } Future mainStoreFav({required List favs, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['fav', jsonEncode(favs)])); } String mainGetPeerSync({required String id, dynamic hint}) { // TODO: throw UnimplementedError("mainGetPeerSync"); } Future mainGetLanPeers({dynamic hint}) { throw UnimplementedError("mainGetLanPeers"); } Future mainGetConnectStatus({dynamic hint}) { return Future( () => js.context.callMethod('getByName', ["get_conn_status"])); } Future mainCheckConnectStatus({dynamic hint}) { throw UnimplementedError("mainCheckConnectStatus"); } Future mainIsUsingPublicServer({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ["is_using_public_server"]) == 'true'); } Future mainDiscover({dynamic hint}) { throw UnimplementedError("mainDiscover"); } Future mainGetApiServer({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['api_server'])); } Future mainPostRequest( {required String url, required String body, required String header, dynamic hint}) { throw UnimplementedError("mainPostRequest"); } Future mainGetProxyStatus({dynamic hint}) { return Future(() => false); } Future mainHttpRequest({ required String url, required String method, String? body, required String header, dynamic hint, }) { throw UnimplementedError("mainHttpRequest"); } Future mainGetHttpStatus({required String url, dynamic hint}) { throw UnimplementedError("mainGetHttpStatus"); } String mainGetLocalOption({required String key, dynamic hint}) { return js.context.callMethod('getByName', ['option:local', key]); } String mainGetEnv({required String key, dynamic hint}) { throw UnimplementedError("mainGetEnv"); } Future mainSetLocalOption( {required String key, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:local', jsonEncode({'name': key, 'value': value}) ])); } String mainGetInputSource({dynamic hint}) { final inputSource = js.context.callMethod('getByName', ['option:local', 'input-source']); // // js grab mode // export const CONFIG_INPUT_SOURCE_1 = "Input source 1"; // // flutter grab mode // export const CONFIG_INPUT_SOURCE_2 = "Input source 2"; return inputSource != '' ? inputSource : 'Input source 1'; } Future mainSetInputSource( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:local', jsonEncode({'name': 'input-source', 'value': value}) ])); } Future mainGetMyId({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['my_id'])); } Future mainGetUuid({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['uuid'])); } Future mainGetPeerOption( {required String id, required String key, dynamic hint}) { return Future(() => mainGetPeerOptionSync(id: id, key: key, hint: hint)); } String mainGetPeerOptionSync( {required String id, required String key, dynamic hint}) { return js.context.callMethod('getByName', [ 'option:peer', jsonEncode({'id': id, 'name': key}) ]); } String mainGetPeerFlutterOptionSync( {required String id, required String k, dynamic hint}) { return js.context.callMethod('getByName', ['option:flutter:peer', k]); } void mainSetPeerFlutterOptionSync( {required String id, required String k, required String v, dynamic hint}) { js.context.callMethod('setByName', [ 'option:flutter:peer', jsonEncode({'name': k, 'value': v}) ]); } Future mainSetPeerOption( {required String id, required String key, required String value, dynamic hint}) { mainSetPeerOptionSync(id: id, key: key, value: value, hint: hint); return Future.value(); } bool mainSetPeerOptionSync( {required String id, required String key, required String value, dynamic hint}) { js.context.callMethod('setByName', [ 'option:peer', jsonEncode({'id': id, 'name': key, 'value': value}) ]); return true; } Future mainSetPeerAlias( {required String id, required String alias, dynamic hint}) { mainSetPeerOptionSync(id: id, key: 'alias', value: alias, hint: hint); return Future.value(); } Future mainGetNewStoredPeers({dynamic hint}) { throw UnimplementedError("mainGetNewStoredPeers"); } Future mainForgetPassword({required String id, dynamic hint}) { return mainSetPeerOption(id: id, key: 'password', value: ''); } Future mainPeerHasPassword({required String id, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['peer_has_password', id]) == 'true'); } Future mainPeerExists({required String id, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['peer_exists', id])); } Future mainLoadRecentPeers({dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['load_recent_peers'])); } String mainLoadRecentPeersSync({dynamic hint}) { return js.context.callMethod('getByName', ['load_recent_peers_sync']); } String mainLoadLanPeersSync({dynamic hint}) { return '{}'; } Future mainLoadRecentPeersForAb( {required String filter, dynamic hint}) { throw UnimplementedError("mainLoadRecentPeersForAb"); } Future mainLoadFavPeers({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['load_fav_peers'])); } Future mainLoadLanPeers({dynamic hint}) { throw UnimplementedError("mainLoadLanPeers"); } Future mainRemoveDiscovered({required String id, dynamic hint}) { throw UnimplementedError("mainRemoveDiscovered"); } Future mainChangeTheme({required String dark, dynamic hint}) { throw UnimplementedError("mainChangeTheme"); } Future mainChangeLanguage({required String lang, dynamic hint}) { throw UnimplementedError("mainChangeLanguage"); } String mainVideoSaveDirectory({required bool root, dynamic hint}) { throw UnimplementedError("mainVideoSaveDirectory"); } Future mainSetUserDefaultOption( {required String key, required String value, dynamic hint}) { js.context.callMethod('setByName', [ 'option:user:default', jsonEncode({'name': key, 'value': value}) ]); return Future.value(); } String mainGetUserDefaultOption({required String key, dynamic hint}) { return js.context.callMethod('getByName', ['option:user:default', key]); } Future mainHandleRelayId({required String id, dynamic hint}) { var newId = id; if (id.endsWith("\\r") || id.endsWith("/r")) { newId = id.substring(0, id.length - 2); } return Future.value(newId); } String mainGetMainDisplay({dynamic hint}) { return js.context.callMethod('getByName', ['main_display']); } String mainGetDisplays({dynamic hint}) { throw UnimplementedError("mainGetDisplays"); } Future sessionAddPortForward( {required UuidValue sessionId, required int localPort, required String remoteHost, required int remotePort, dynamic hint}) { throw UnimplementedError("sessionAddPortForward"); } Future sessionRemovePortForward( {required UuidValue sessionId, required int localPort, dynamic hint}) { throw UnimplementedError("sessionRemovePortForward"); } Future sessionNewRdp({required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionNewRdp"); } Future sessionRequestVoiceCall( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionRequestVoiceCall"); } Future sessionCloseVoiceCall( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionCloseVoiceCall"); } Future cmHandleIncomingVoiceCall( {required int id, required bool accept, dynamic hint}) { throw UnimplementedError("cmHandleIncomingVoiceCall"); } Future cmCloseVoiceCall({required int id, dynamic hint}) { throw UnimplementedError("cmCloseVoiceCall"); } Future mainGetLastRemoteId({dynamic hint}) { return Future(() => mainGetLocalOption(key: 'last_remote_id')); } Future mainGetSoftwareUpdateUrl({dynamic hint}) { throw UnimplementedError("mainGetSoftwareUpdateUrl"); } Future mainGetHomeDir({dynamic hint}) { return Future.value(''); } Future mainGetLangs({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['langs'])); } Future mainGetTemporaryPassword({dynamic hint}) { return Future.value(''); } Future mainGetPermanentPassword({dynamic hint}) { return Future.value(''); } Future mainGetFingerprint({dynamic hint}) { return Future.value(''); } Future cmGetClientsState({dynamic hint}) { throw UnimplementedError("cmGetClientsState"); } Future cmCheckClientsLength({required int length, dynamic hint}) { throw UnimplementedError("cmCheckClientsLength"); } Future cmGetClientsLength({dynamic hint}) { throw UnimplementedError("cmCheckClientsLength"); } Future mainInit({required String appDir, dynamic hint}) { return Future.value(); } Future mainDeviceId({required String id, dynamic hint}) { // TODO: ? throw UnimplementedError("mainDeviceId"); } Future mainDeviceName({required String name, dynamic hint}) { // TODO: ? throw UnimplementedError("mainDeviceName"); } Future mainRemovePeer({required String id, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['remove_peer', id])); } bool mainHasHwcodec({dynamic hint}) { throw UnimplementedError("mainHasHwcodec"); } bool mainHasVram({dynamic hint}) { throw UnimplementedError("mainHasVram"); } String mainSupportedHwdecodings({dynamic hint}) { return '{}'; } Future mainIsRoot({dynamic hint}) { throw UnimplementedError("mainIsRoot"); } int getDoubleClickTime({dynamic hint}) { return 500; } Future mainStartDbusServer({dynamic hint}) { throw UnimplementedError("mainStartDbusServer"); } Future mainSaveAb({required String json, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['save_ab', json])); } Future mainClearAb({dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['clear_ab'])); } Future mainLoadAb({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['load_ab'])); } Future mainSaveGroup({required String json, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['save_group', json])); } Future mainClearGroup({dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['clear_group'])); } Future mainLoadGroup({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['load_group'])); } Future sessionSendPointer( {required UuidValue sessionId, required String msg, dynamic hint}) { throw UnimplementedError("sessionSendPointer"); } Future sessionSendMouse( {required UuidValue sessionId, required String msg, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['send_mouse', msg])); } Future sessionRestartRemoteDevice( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['restart'])); } String sessionGetAuditServerSync( {required UuidValue sessionId, required String typ, dynamic hint}) { return js.context.callMethod('getByName', ['audit_server', typ]); } Future sessionSendNote( {required UuidValue sessionId, required String note, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['send_note', note])); } Future sessionAlternativeCodecs( {required UuidValue sessionId, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['alternative_codecs'])); } Future sessionChangePreferCodec( {required UuidValue sessionId, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['change_prefer_codec'])); } Future sessionOnWaitingForImageDialogShow( {required UuidValue sessionId, dynamic hint}) { return Future.value(); } Future sessionToggleVirtualDisplay( {required UuidValue sessionId, required int index, required bool on, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'toggle_virtual_display', jsonEncode({'index': index, 'on': on}) ])); } Future mainSetHomeDir({required String home, dynamic hint}) { throw UnimplementedError("mainSetHomeDir"); } String mainGetDataDirIos({dynamic hint}) { throw UnimplementedError("mainGetDataDirIos"); } Future mainStopService({dynamic hint}) { throw UnimplementedError("mainStopService"); } Future mainStartService({dynamic hint}) { throw UnimplementedError("mainStartService"); } Future mainUpdateTemporaryPassword({dynamic hint}) { throw UnimplementedError("mainUpdateTemporaryPassword"); } Future mainSetPermanentPassword( {required String password, dynamic hint}) { throw UnimplementedError("mainSetPermanentPassword"); } Future mainCheckSuperUserPermission({dynamic hint}) { throw UnimplementedError("mainCheckSuperUserPermission"); } Future mainCheckMouseTime({dynamic hint}) { throw UnimplementedError("mainCheckMouseTime"); } Future mainGetMouseTime({dynamic hint}) { throw UnimplementedError("mainGetMouseTime"); } Future mainWol({required String id, dynamic hint}) { throw UnimplementedError("mainWol"); } Future mainCreateShortcut({required String id, dynamic hint}) { throw UnimplementedError("mainCreateShortcut"); } Future cmSendChat( {required int connId, required String msg, dynamic hint}) { throw UnimplementedError("cmSendChat"); } Future cmLoginRes( {required int connId, required bool res, dynamic hint}) { throw UnimplementedError("cmLoginRes"); } Future cmCloseConnection({required int connId, dynamic hint}) { throw UnimplementedError("cmCloseConnection"); } Future cmRemoveDisconnectedConnection( {required int connId, dynamic hint}) { throw UnimplementedError("cmRemoveDisconnectedConnection"); } Future cmCheckClickTime({required int connId, dynamic hint}) { throw UnimplementedError("cmCheckClickTime"); } Future cmGetClickTime({dynamic hint}) { throw UnimplementedError("cmGetClickTime"); } Future cmSwitchPermission( {required int connId, required String name, required bool enabled, dynamic hint}) { throw UnimplementedError("cmSwitchPermission"); } bool cmCanElevate({dynamic hint}) { throw UnimplementedError("cmCanElevate"); } Future cmElevatePortable({required int connId, dynamic hint}) { throw UnimplementedError("cmElevatePortable"); } Future cmSwitchBack({required int connId, dynamic hint}) { throw UnimplementedError("cmSwitchBack"); } Future cmGetConfig({required String name, dynamic hint}) { throw UnimplementedError("cmGetConfig"); } Future mainGetBuildDate({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['build_date'])); } String translate( {required String name, required String locale, dynamic hint}) { return js.context.callMethod('getByName', [ 'translate', jsonEncode({'locale': locale, 'text': name}) ]); } int sessionGetRgbaSize( {required UuidValue sessionId, required int display, dynamic hint}) { return 0; } void sessionNextRgba( {required UuidValue sessionId, required int display, dynamic hint}) {} void sessionRegisterPixelbufferTexture( {required UuidValue sessionId, required int display, required int ptr, dynamic hint}) {} void sessionRegisterGpuTexture( {required UuidValue sessionId, required int display, required int ptr, dynamic hint}) {} Future queryOnlines({required List ids, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['query_onlines', jsonEncode(ids)])); } // Dup to the function in hbb_common, lib.rs // Maybe we need to move this function to js part. int versionToNumber({required String v, dynamic hint}) { return int.tryParse( js.context.callMethod('getByName', ['get_version_number', v])) ?? 0; } Future optionSynced({dynamic hint}) { return Future.value(true); } bool mainIsInstalled({dynamic hint}) { throw UnimplementedError("mainIsInstalled"); } void mainInitInputSource({dynamic hint}) { throw UnimplementedError("mainIsInstalled"); } bool mainIsInstalledLowerVersion({dynamic hint}) { throw UnimplementedError("mainIsInstalledLowerVersion"); } bool mainIsInstalledDaemon({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsInstalledDaemon"); } bool mainIsProcessTrusted({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsProcessTrusted"); } bool mainIsCanScreenRecording({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsCanScreenRecording"); } bool mainIsCanInputMonitoring({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsCanInputMonitoring"); } bool mainIsShareRdp({dynamic hint}) { throw UnimplementedError("mainIsShareRdp"); } Future mainSetShareRdp({required bool enable, dynamic hint}) { throw UnimplementedError("mainSetShareRdp"); } bool mainGotoInstall({dynamic hint}) { throw UnimplementedError("mainGotoInstall"); } String mainGetNewVersion({dynamic hint}) { throw UnimplementedError("mainGetNewVersion"); } bool mainUpdateMe({dynamic hint}) { throw UnimplementedError("mainUpdateMe"); } Future setCurSessionId({required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("setCurSessionId"); } bool installShowRunWithoutInstall({dynamic hint}) { throw UnimplementedError("installShowRunWithoutInstall"); } Future installRunWithoutInstall({dynamic hint}) { throw UnimplementedError("installRunWithoutInstall"); } Future installInstallMe( {required String options, required String path, dynamic hint}) { throw UnimplementedError("installInstallMe"); } String installInstallPath({dynamic hint}) { throw UnimplementedError("installInstallPath"); } Future mainAccountAuth( {required String op, required bool rememberMe, dynamic hint}) { throw UnimplementedError("mainAccountAuth"); } Future mainAccountAuthCancel({dynamic hint}) { throw UnimplementedError("mainAccountAuthCancel"); } Future mainAccountAuthResult({dynamic hint}) { throw UnimplementedError("mainAccountAuthResult"); } Future mainOnMainWindowClose({dynamic hint}) { throw UnimplementedError("mainOnMainWindowClose"); } bool mainCurrentIsWayland({dynamic hint}) { return false; } bool mainIsLoginWayland({dynamic hint}) { return false; } bool mainHideDock({dynamic hint}) { throw UnimplementedError("mainHideDock"); } bool mainHasFileClipboard({dynamic hint}) { return false; } bool mainHasGpuTextureRender({dynamic hint}) { return false; } Future cmInit({dynamic hint}) { throw UnimplementedError("cmInit"); } Future mainStartIpcUrlServer({dynamic hint}) { throw UnimplementedError("mainStartIpcUrlServer"); } Future mainTestWallpaper({required int second, dynamic hint}) { // TODO: implement mainTestWallpaper return Future.value(); } Future mainSupportRemoveWallpaper({dynamic hint}) { // TODO: implement mainSupportRemoveWallpaper return Future.value(false); } bool isIncomingOnly({dynamic hint}) { return false; } bool isOutgoingOnly({dynamic hint}) { return false; } bool isCustomClient({dynamic hint}) { return false; } bool isDisableSettings({dynamic hint}) { return false; } bool isDisableAb({dynamic hint}) { return false; } bool isDisableGroupPanel({dynamic hint}) { return false; } bool isDisableAccount({dynamic hint}) { return false; } bool isDisableInstallation({dynamic hint}) { return false; } Future isPresetPassword({dynamic hint}) { return Future.value(false); } Future sendUrlScheme({required String url, dynamic hint}) { throw UnimplementedError("sendUrlScheme"); } Future pluginEvent( {required String id, required String peer, required Uint8List event, dynamic hint}) { throw UnimplementedError("pluginEvent"); } Stream pluginRegisterEventStream( {required String id, dynamic hint}) { throw UnimplementedError("pluginRegisterEventStream"); } String? pluginGetSessionOption( {required String id, required String peer, required String key, dynamic hint}) { throw UnimplementedError("pluginGetSessionOption"); } Future pluginSetSessionOption( {required String id, required String peer, required String key, required String value, dynamic hint}) { throw UnimplementedError("pluginSetSessionOption"); } String? pluginGetSharedOption( {required String id, required String key, dynamic hint}) { throw UnimplementedError("pluginGetSharedOption"); } Future pluginSetSharedOption( {required String id, required String key, required String value, dynamic hint}) { throw UnimplementedError("pluginSetSharedOption"); } Future pluginReload({required String id, dynamic hint}) { throw UnimplementedError("pluginReload"); } void pluginEnable({required String id, required bool v, dynamic hint}) { throw UnimplementedError("pluginEnable"); } bool pluginIsEnabled({required String id, dynamic hint}) { throw UnimplementedError("pluginIsEnabled"); } bool pluginFeatureIsEnabled({dynamic hint}) { throw UnimplementedError("pluginFeatureIsEnabled"); } Future pluginSyncUi({required String syncTo, dynamic hint}) { throw UnimplementedError("pluginSyncUi"); } Future pluginListReload({dynamic hint}) { throw UnimplementedError("pluginListReload"); } Future pluginInstall( {required String id, required bool b, dynamic hint}) { throw UnimplementedError("pluginInstall"); } bool isSupportMultiUiSession({required String version, dynamic hint}) { return versionToNumber(v: version) > versionToNumber(v: '1.2.4'); } bool isSelinuxEnforcing({dynamic hint}) { return false; } String mainDefaultPrivacyModeImpl({dynamic hint}) { throw UnimplementedError("mainDefaultPrivacyModeImpl"); } String mainSupportedPrivacyModeImpls({dynamic hint}) { throw UnimplementedError("mainSupportedPrivacyModeImpls"); } String mainSupportedInputSource({dynamic hint}) { return jsonEncode([ ['Input source 1', 'input_source_1_tip'], ['Input source 2', 'input_source_2_tip'] ]); } Future mainGenerate2Fa({dynamic hint}) { throw UnimplementedError("mainGenerate2Fa"); } Future mainVerify2Fa({required String code, dynamic hint}) { throw UnimplementedError("mainVerify2Fa"); } bool mainHasValid2FaSync({dynamic hint}) { throw UnimplementedError("mainHasValid2FaSync"); } String mainGetHardOption({required String key, dynamic hint}) { throw UnimplementedError("mainGetHardOption"); } Future mainCheckHwcodec({dynamic hint}) { throw UnimplementedError("mainCheckHwcodec"); } Future sessionRequestNewDisplayInitMsgs( {required UuidValue sessionId, required int display, dynamic hint}) { throw UnimplementedError("sessionRequestNewDisplayInitMsgs"); } Future mainHandleWaylandScreencastRestoreToken( {required String key, required String value, dynamic hint}) { throw UnimplementedError("mainHandleWaylandScreencastRestoreToken"); } bool mainIsOptionFixed({required String key, dynamic hint}) { return false; } bool mainGetUseTextureRender({dynamic hint}) { throw UnimplementedError("mainGetUseTextureRender"); } bool mainHasValidBotSync({dynamic hint}) { throw UnimplementedError("mainHasValidBotSync"); } Future mainVerifyBot({required String token, dynamic hint}) { throw UnimplementedError("mainVerifyBot"); } String mainGetUnlockPin({dynamic hint}) { throw UnimplementedError("mainGetUnlockPin"); } String mainSetUnlockPin({required String pin, dynamic hint}) { throw UnimplementedError("mainSetUnlockPin"); } bool sessionGetEnableTrustedDevices( {required UuidValue sessionId, dynamic hint}) { return js.context.callMethod('getByName', ['enable_trusted_devices']) == 'Y'; } Future mainGetTrustedDevices({dynamic hint}) { throw UnimplementedError("mainGetTrustedDevices"); } Future mainRemoveTrustedDevices({required String json, dynamic hint}) { throw UnimplementedError("mainRemoveTrustedDevices"); } Future mainClearTrustedDevices({dynamic hint}) { throw UnimplementedError("mainClearTrustedDevices"); } Future getVoiceCallInputDevice({required bool isCm, dynamic hint}) { throw UnimplementedError("getVoiceCallInputDevice"); } Future setVoiceCallInputDevice( {required bool isCm, required String device, dynamic hint}) { throw UnimplementedError("setVoiceCallInputDevice"); } bool isPresetPasswordMobileOnly({dynamic hint}) { throw UnimplementedError("isPresetPasswordMobileOnly"); } String mainGetBuildinOption({required String key, dynamic hint}) { return ''; } String installInstallOptions({dynamic hint}) { throw UnimplementedError("installInstallOptions"); } int mainMaxEncryptLen({dynamic hint}) { throw UnimplementedError("mainMaxEncryptLen"); } Future sessionRenameFile( {required UuidValue sessionId, required int actId, required String path, required String newName, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'rename_file', jsonEncode({ 'id': actId, 'path': path, 'new_name': newName, 'is_remote': isRemote }) ])); } Future sessionSelectFiles( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['select_files'])); } void dispose() {} }