mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-18 05:27:53 +08:00
Revert "Fix/mobile connection login state"
This commit is contained in:
parent
74dc8536be
commit
e30f09e7f7
@ -1,6 +1,7 @@
|
|||||||
// main window right pane
|
// main window right pane
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:auto_size_text/auto_size_text.dart';
|
import 'package:auto_size_text/auto_size_text.dart';
|
||||||
@ -8,6 +9,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart';
|
import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/user_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
@ -35,12 +37,13 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
/// Nested scroll controller
|
/// Nested scroll controller
|
||||||
final _scrollController = ScrollController();
|
final _scrollController = ScrollController();
|
||||||
|
|
||||||
Timer? _svcStatusTimer;
|
Timer? _updateTimer;
|
||||||
|
|
||||||
final RxBool _idInputFocused = false.obs;
|
final RxBool _idInputFocused = false.obs;
|
||||||
final FocusNode _idFocusNode = FocusNode();
|
final FocusNode _idFocusNode = FocusNode();
|
||||||
|
|
||||||
var svcStopped = Get.find<RxBool>(tag: 'stop-service');
|
var svcStopped = Get.find<RxBool>(tag: 'stop-service');
|
||||||
|
var svcIsUsingPublicServer = true.obs;
|
||||||
|
|
||||||
bool isWindowMinimized = false;
|
bool isWindowMinimized = false;
|
||||||
|
|
||||||
@ -57,8 +60,8 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
_svcStatusTimer = periodic_immediate(Duration(seconds: 1), () async {
|
_updateTimer = periodic_immediate(Duration(seconds: 1), () async {
|
||||||
stateGlobal.updateSvcStatus();
|
updateStatus();
|
||||||
});
|
});
|
||||||
_idFocusNode.addListener(() {
|
_idFocusNode.addListener(() {
|
||||||
_idInputFocused.value = _idFocusNode.hasFocus;
|
_idInputFocused.value = _idFocusNode.hasFocus;
|
||||||
@ -72,8 +75,7 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_idController.dispose();
|
_idController.dispose();
|
||||||
_svcStatusTimer?.cancel();
|
_updateTimer?.cancel();
|
||||||
_svcStatusTimer = null;
|
|
||||||
windowManager.removeListener(this);
|
windowManager.removeListener(this);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
@ -286,7 +288,7 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
child: Offstage(
|
child: Offstage(
|
||||||
offstage: !(!svcStopped.value &&
|
offstage: !(!svcStopped.value &&
|
||||||
stateGlobal.svcStatus.value == SvcStatus.ready &&
|
stateGlobal.svcStatus.value == SvcStatus.ready &&
|
||||||
stateGlobal.svcIsUsingPublicServer.value),
|
svcIsUsingPublicServer.value),
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
@ -325,4 +327,31 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateStatus() async {
|
||||||
|
final status =
|
||||||
|
jsonDecode(await bind.mainGetConnectStatus()) as Map<String, dynamic>;
|
||||||
|
final statusNum = status['status_num'] as int;
|
||||||
|
final preStatus = stateGlobal.svcStatus.value;
|
||||||
|
if (statusNum == 0) {
|
||||||
|
stateGlobal.svcStatus.value = SvcStatus.connecting;
|
||||||
|
} else if (statusNum == -1) {
|
||||||
|
stateGlobal.svcStatus.value = SvcStatus.notReady;
|
||||||
|
} else if (statusNum == 1) {
|
||||||
|
stateGlobal.svcStatus.value = SvcStatus.ready;
|
||||||
|
if (preStatus != SvcStatus.ready) {
|
||||||
|
gFFI.userModel.refreshCurrentUser();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stateGlobal.svcStatus.value = SvcStatus.notReady;
|
||||||
|
}
|
||||||
|
if (stateGlobal.svcStatus.value != SvcStatus.ready) {
|
||||||
|
gFFI.userModel.isAdmin.value = false;
|
||||||
|
gFFI.groupModel.reset();
|
||||||
|
}
|
||||||
|
if (preStatus != stateGlobal.svcStatus.value) {
|
||||||
|
UserModel.updateOtherModels();
|
||||||
|
}
|
||||||
|
svcIsUsingPublicServer.value = await bind.mainIsUsingPublicServer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,6 @@ void runMobileApp() async {
|
|||||||
await initEnv(kAppTypeMain);
|
await initEnv(kAppTypeMain);
|
||||||
if (isAndroid) androidChannelInit();
|
if (isAndroid) androidChannelInit();
|
||||||
platformFFI.syncAndroidServiceAppDirConfigPath();
|
platformFFI.syncAndroidServiceAppDirConfigPath();
|
||||||
gFFI.userModel.refreshCurrentUser();
|
|
||||||
runApp(App());
|
runApp(App());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ import '../../common/widgets/dialog.dart';
|
|||||||
import '../../consts.dart';
|
import '../../consts.dart';
|
||||||
import '../../models/platform_model.dart';
|
import '../../models/platform_model.dart';
|
||||||
import '../../models/server_model.dart';
|
import '../../models/server_model.dart';
|
||||||
import '../../models/state_model.dart';
|
|
||||||
import 'home_page.dart';
|
import 'home_page.dart';
|
||||||
|
|
||||||
class ServerPage extends StatefulWidget implements PageShape {
|
class ServerPage extends StatefulWidget implements PageShape {
|
||||||
@ -201,6 +200,7 @@ class ServerInfo extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final isPermanent = model.verificationMethod == kUsePermanentPassword;
|
final isPermanent = model.verificationMethod == kUsePermanentPassword;
|
||||||
|
final serverModel = Provider.of<ServerModel>(context);
|
||||||
|
|
||||||
const Color colorPositive = Colors.green;
|
const Color colorPositive = Colors.green;
|
||||||
const Color colorNegative = Colors.red;
|
const Color colorNegative = Colors.red;
|
||||||
@ -216,29 +216,28 @@ class ServerInfo extends StatelessWidget {
|
|||||||
showToast(translate('Copied'));
|
showToast(translate('Copied'));
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget ConnectionStateNotification() => Obx(() {
|
Widget ConnectionStateNotification() {
|
||||||
if (stateGlobal.svcStatus.value == SvcStatus.notReady) {
|
if (serverModel.connectStatus == -1) {
|
||||||
return Row(children: [
|
return Row(children: [
|
||||||
const Icon(Icons.warning_amber_sharp,
|
const Icon(Icons.warning_amber_sharp,
|
||||||
color: colorNegative, size: iconSize)
|
color: colorNegative, size: iconSize)
|
||||||
.marginOnly(right: iconMarginRight),
|
.marginOnly(right: iconMarginRight),
|
||||||
Expanded(child: Text(translate('not_ready_status')))
|
Expanded(child: Text(translate('not_ready_status')))
|
||||||
]);
|
]);
|
||||||
} else if (stateGlobal.svcStatus.value == SvcStatus.connecting) {
|
} else if (serverModel.connectStatus == 0) {
|
||||||
return Row(children: [
|
return Row(children: [
|
||||||
SizedBox(
|
SizedBox(width: 20, height: 20, child: CircularProgressIndicator())
|
||||||
width: 20, height: 20, child: CircularProgressIndicator())
|
.marginOnly(left: 4, right: iconMarginRight),
|
||||||
.marginOnly(left: 4, right: iconMarginRight),
|
Expanded(child: Text(translate('connecting_status')))
|
||||||
Expanded(child: Text(translate('connecting_status')))
|
]);
|
||||||
]);
|
} else {
|
||||||
} else {
|
return Row(children: [
|
||||||
return Row(children: [
|
const Icon(Icons.check, color: colorPositive, size: iconSize)
|
||||||
const Icon(Icons.check, color: colorPositive, size: iconSize)
|
.marginOnly(right: iconMarginRight),
|
||||||
.marginOnly(right: iconMarginRight),
|
Expanded(child: Text(translate('Ready')))
|
||||||
Expanded(child: Text(translate('Ready')))
|
]);
|
||||||
]);
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return PaddingCard(
|
return PaddingCard(
|
||||||
title: translate('Your Device'),
|
title: translate('Your Device'),
|
||||||
|
@ -15,8 +15,7 @@ import '../common/formatter/id_formatter.dart';
|
|||||||
import '../desktop/pages/server_page.dart' as desktop;
|
import '../desktop/pages/server_page.dart' as desktop;
|
||||||
import '../desktop/widgets/tabbar_widget.dart';
|
import '../desktop/widgets/tabbar_widget.dart';
|
||||||
import '../mobile/pages/server_page.dart';
|
import '../mobile/pages/server_page.dart';
|
||||||
import './model.dart';
|
import 'model.dart';
|
||||||
import './state_model.dart';
|
|
||||||
|
|
||||||
const kLoginDialogTag = "LOGIN";
|
const kLoginDialogTag = "LOGIN";
|
||||||
|
|
||||||
@ -32,6 +31,7 @@ class ServerModel with ChangeNotifier {
|
|||||||
bool _fileOk = false;
|
bool _fileOk = false;
|
||||||
bool _showElevation = false;
|
bool _showElevation = false;
|
||||||
bool _hideCm = false;
|
bool _hideCm = false;
|
||||||
|
int _connectStatus = 0; // Rendezvous Server status
|
||||||
String _verificationMethod = "";
|
String _verificationMethod = "";
|
||||||
String _temporaryPasswordLength = "";
|
String _temporaryPasswordLength = "";
|
||||||
String _approveMode = "";
|
String _approveMode = "";
|
||||||
@ -61,6 +61,8 @@ class ServerModel with ChangeNotifier {
|
|||||||
|
|
||||||
bool get hideCm => _hideCm;
|
bool get hideCm => _hideCm;
|
||||||
|
|
||||||
|
int get connectStatus => _connectStatus;
|
||||||
|
|
||||||
String get verificationMethod {
|
String get verificationMethod {
|
||||||
final index = [
|
final index = [
|
||||||
kUseTemporaryPassword,
|
kUseTemporaryPassword,
|
||||||
@ -118,7 +120,15 @@ class ServerModel with ChangeNotifier {
|
|||||||
_serverId = IDTextEditingController(text: _emptyIdShow);
|
_serverId = IDTextEditingController(text: _emptyIdShow);
|
||||||
|
|
||||||
timerCallback() async {
|
timerCallback() async {
|
||||||
stateGlobal.updateSvcStatus();
|
var status = await bind.mainGetOnlineStatue();
|
||||||
|
if (status > 0) {
|
||||||
|
status = 1;
|
||||||
|
}
|
||||||
|
if (status != _connectStatus) {
|
||||||
|
_connectStatus = status;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
if (desktopType == DesktopType.cm) {
|
if (desktopType == DesktopType.cm) {
|
||||||
final res = await bind.cmCheckClientsLength(length: _clients.length);
|
final res = await bind.cmCheckClientsLength(length: _clients.length);
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
|
@ -1,15 +1,10 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../consts.dart';
|
import '../consts.dart';
|
||||||
import '../common.dart';
|
|
||||||
|
|
||||||
import './platform_model.dart';
|
|
||||||
|
|
||||||
enum SvcStatus { notReady, connecting, ready }
|
enum SvcStatus { notReady, connecting, ready }
|
||||||
|
|
||||||
@ -23,9 +18,7 @@ class StateGlobal {
|
|||||||
final RxDouble _windowBorderWidth = RxDouble(kWindowBorderWidth);
|
final RxDouble _windowBorderWidth = RxDouble(kWindowBorderWidth);
|
||||||
final RxBool showRemoteToolBar = false.obs;
|
final RxBool showRemoteToolBar = false.obs;
|
||||||
final RxInt displaysCount = 0.obs;
|
final RxInt displaysCount = 0.obs;
|
||||||
|
|
||||||
final svcStatus = SvcStatus.notReady.obs;
|
final svcStatus = SvcStatus.notReady.obs;
|
||||||
final svcIsUsingPublicServer = true.obs;
|
|
||||||
|
|
||||||
// Use for desktop -> remote toolbar -> resolution
|
// Use for desktop -> remote toolbar -> resolution
|
||||||
final Map<String, Map<int, String?>> _lastResolutionGroupValues = {};
|
final Map<String, Map<int, String?>> _lastResolutionGroupValues = {};
|
||||||
@ -91,31 +84,6 @@ class StateGlobal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSvcStatus() async {
|
|
||||||
final status =
|
|
||||||
jsonDecode(await bind.mainGetConnectStatus()) as Map<String, dynamic>;
|
|
||||||
final statusNum = status['status_num'] as int;
|
|
||||||
final preStatus = stateGlobal.svcStatus.value;
|
|
||||||
if (statusNum == 0) {
|
|
||||||
stateGlobal.svcStatus.value = SvcStatus.connecting;
|
|
||||||
} else if (statusNum == -1) {
|
|
||||||
stateGlobal.svcStatus.value = SvcStatus.notReady;
|
|
||||||
} else if (statusNum == 1) {
|
|
||||||
stateGlobal.svcStatus.value = SvcStatus.ready;
|
|
||||||
if (preStatus != SvcStatus.ready) {
|
|
||||||
gFFI.userModel.refreshCurrentUser();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
stateGlobal.svcStatus.value = SvcStatus.notReady;
|
|
||||||
}
|
|
||||||
if (stateGlobal.svcStatus.value != SvcStatus.ready) {
|
|
||||||
gFFI.userModel.isAdmin.value = false;
|
|
||||||
gFFI.groupModel.reset();
|
|
||||||
}
|
|
||||||
stateGlobal.svcIsUsingPublicServer.value =
|
|
||||||
await bind.mainIsUsingPublicServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
StateGlobal._();
|
StateGlobal._();
|
||||||
|
|
||||||
static final StateGlobal instance = StateGlobal._();
|
static final StateGlobal instance = StateGlobal._();
|
||||||
|
@ -44,7 +44,7 @@ lazy_static::lazy_static! {
|
|||||||
static ref CONFIG: Arc<RwLock<Config>> = Arc::new(RwLock::new(Config::load()));
|
static ref CONFIG: Arc<RwLock<Config>> = Arc::new(RwLock::new(Config::load()));
|
||||||
static ref CONFIG2: Arc<RwLock<Config2>> = Arc::new(RwLock::new(Config2::load()));
|
static ref CONFIG2: Arc<RwLock<Config2>> = Arc::new(RwLock::new(Config2::load()));
|
||||||
static ref LOCAL_CONFIG: Arc<RwLock<LocalConfig>> = Arc::new(RwLock::new(LocalConfig::load()));
|
static ref LOCAL_CONFIG: Arc<RwLock<LocalConfig>> = Arc::new(RwLock::new(LocalConfig::load()));
|
||||||
static ref ONLINE: Arc<Mutex<HashMap<String, i64>>> = Default::default();
|
pub static ref ONLINE: Arc<Mutex<HashMap<String, i64>>> = Default::default();
|
||||||
pub static ref PROD_RENDEZVOUS_SERVER: Arc<RwLock<String>> = Arc::new(RwLock::new(match option_env!("RENDEZVOUS_SERVER") {
|
pub static ref PROD_RENDEZVOUS_SERVER: Arc<RwLock<String>> = Arc::new(RwLock::new(match option_env!("RENDEZVOUS_SERVER") {
|
||||||
Some(key) if !key.is_empty() => key,
|
Some(key) if !key.is_empty() => key,
|
||||||
_ => "",
|
_ => "",
|
||||||
@ -309,11 +309,6 @@ pub struct TransferSerde {
|
|||||||
pub read_jobs: Vec<String>,
|
pub read_jobs: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn get_online_statue() -> i64 {
|
|
||||||
*ONLINE.lock().unwrap().values().max().unwrap_or(&0)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
fn patch(path: PathBuf) -> PathBuf {
|
fn patch(path: PathBuf) -> PathBuf {
|
||||||
if let Some(_tmp) = path.to_str() {
|
if let Some(_tmp) = path.to_str() {
|
||||||
|
@ -14,11 +14,12 @@ use flutter_rust_bridge::{StreamSink, SyncReturn};
|
|||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
use hbb_common::allow_err;
|
use hbb_common::allow_err;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
config::{self, LocalConfig, PeerConfig, PeerInfoSerde},
|
config::{self, LocalConfig, PeerConfig, PeerInfoSerde, ONLINE},
|
||||||
fs, log,
|
fs, log,
|
||||||
message_proto::KeyboardMode,
|
message_proto::KeyboardMode,
|
||||||
ResultType,
|
ResultType,
|
||||||
};
|
};
|
||||||
|
use serde_json::json;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
ffi::{CStr, CString},
|
ffi::{CStr, CString},
|
||||||
@ -679,18 +680,14 @@ pub fn main_get_lan_peers() -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_get_connect_status() -> String {
|
pub fn main_get_connect_status() -> String {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
let status = get_connect_status();
|
||||||
{
|
// (status_num, key_confirmed, mouse_time, id)
|
||||||
serde_json::to_string(&get_connect_status()).unwrap_or("".to_string())
|
let mut m = serde_json::Map::new();
|
||||||
}
|
m.insert("status_num".to_string(), json!(status.0));
|
||||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
m.insert("key_confirmed".to_string(), json!(status.1));
|
||||||
{
|
m.insert("mouse_time".to_string(), json!(status.2));
|
||||||
let mut state = hbb_common::config::get_online_statue();
|
m.insert("id".to_string(), json!(status.3));
|
||||||
if state > 0 {
|
serde_json::to_string(&m).unwrap_or("".to_string())
|
||||||
state = 1;
|
|
||||||
}
|
|
||||||
serde_json::json!({ "status_num": state }).to_string()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_check_connect_status() {
|
pub fn main_check_connect_status() {
|
||||||
@ -998,6 +995,10 @@ pub fn main_get_fingerprint() -> String {
|
|||||||
get_fingerprint()
|
get_fingerprint()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main_get_online_statue() -> i64 {
|
||||||
|
ONLINE.lock().unwrap().values().max().unwrap_or(&0).clone()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn cm_get_clients_state() -> String {
|
pub fn cm_get_clients_state() -> String {
|
||||||
crate::ui_cm_interface::get_clients_state()
|
crate::ui_cm_interface::get_clients_state()
|
||||||
}
|
}
|
||||||
@ -1193,14 +1194,7 @@ pub fn main_check_mouse_time() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_get_mouse_time() -> f64 {
|
pub fn main_get_mouse_time() -> f64 {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
get_mouse_time()
|
||||||
{
|
|
||||||
get_mouse_time()
|
|
||||||
}
|
|
||||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
|
||||||
{
|
|
||||||
0.0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_wol(id: String) {
|
pub fn main_wol(id: String) {
|
||||||
|
@ -216,7 +216,7 @@ impl OidcSession {
|
|||||||
let query_timeout = OIDC_SESSION.read().unwrap().query_timeout;
|
let query_timeout = OIDC_SESSION.read().unwrap().query_timeout;
|
||||||
while OIDC_SESSION.read().unwrap().keep_querying && begin.elapsed() < query_timeout {
|
while OIDC_SESSION.read().unwrap().keep_querying && begin.elapsed() < query_timeout {
|
||||||
match Self::query(&code_url.code, &id, &uuid) {
|
match Self::query(&code_url.code, &id, &uuid) {
|
||||||
Ok(HbbHttpResponse::<_>::Data(auth_body)) => {
|
Ok(HbbHttpResponse::<_>::Data(mut auth_body)) => {
|
||||||
if remember_me {
|
if remember_me {
|
||||||
LocalConfig::set_option(
|
LocalConfig::set_option(
|
||||||
"access_token".to_owned(),
|
"access_token".to_owned(),
|
||||||
|
10
src/ipc.rs
10
src/ipc.rs
@ -186,7 +186,6 @@ pub enum Data {
|
|||||||
},
|
},
|
||||||
SystemInfo(Option<String>),
|
SystemInfo(Option<String>),
|
||||||
ClickTime(i64),
|
ClickTime(i64),
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
MouseMoveTime(i64),
|
MouseMoveTime(i64),
|
||||||
Authorize,
|
Authorize,
|
||||||
Close,
|
Close,
|
||||||
@ -333,7 +332,6 @@ async fn handle(data: Data, stream: &mut Connection) {
|
|||||||
let t = crate::server::CLICK_TIME.load(Ordering::SeqCst);
|
let t = crate::server::CLICK_TIME.load(Ordering::SeqCst);
|
||||||
allow_err!(stream.send(&Data::ClickTime(t)).await);
|
allow_err!(stream.send(&Data::ClickTime(t)).await);
|
||||||
}
|
}
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
Data::MouseMoveTime(_) => {
|
Data::MouseMoveTime(_) => {
|
||||||
let t = crate::server::MOUSE_MOVE_TIME.load(Ordering::SeqCst);
|
let t = crate::server::MOUSE_MOVE_TIME.load(Ordering::SeqCst);
|
||||||
allow_err!(stream.send(&Data::MouseMoveTime(t)).await);
|
allow_err!(stream.send(&Data::MouseMoveTime(t)).await);
|
||||||
@ -347,7 +345,13 @@ async fn handle(data: Data, stream: &mut Connection) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Data::OnlineStatus(_) => {
|
Data::OnlineStatus(_) => {
|
||||||
let x = config::get_online_statue();
|
let x = config::ONLINE
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.values()
|
||||||
|
.max()
|
||||||
|
.unwrap_or(&0)
|
||||||
|
.clone();
|
||||||
let confirmed = Config::get_key_confirmed();
|
let confirmed = Config::get_key_confirmed();
|
||||||
allow_err!(stream.send(&Data::OnlineStatus(Some((x, confirmed)))).await);
|
allow_err!(stream.send(&Data::OnlineStatus(Some((x, confirmed)))).await);
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,6 @@ lazy_static::lazy_static! {
|
|||||||
static ref SWITCH_SIDES_UUID: Arc::<Mutex<HashMap<String, (Instant, uuid::Uuid)>>> = Default::default();
|
static ref SWITCH_SIDES_UUID: Arc::<Mutex<HashMap<String, (Instant, uuid::Uuid)>>> = Default::default();
|
||||||
}
|
}
|
||||||
pub static CLICK_TIME: AtomicI64 = AtomicI64::new(0);
|
pub static CLICK_TIME: AtomicI64 = AtomicI64::new(0);
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
pub static MOUSE_MOVE_TIME: AtomicI64 = AtomicI64::new(0);
|
pub static MOUSE_MOVE_TIME: AtomicI64 = AtomicI64::new(0);
|
||||||
|
|
||||||
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]
|
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]
|
||||||
@ -164,7 +163,6 @@ pub struct Connection {
|
|||||||
// by peer
|
// by peer
|
||||||
disable_audio: bool,
|
disable_audio: bool,
|
||||||
// by peer
|
// by peer
|
||||||
#[cfg(windows)]
|
|
||||||
enable_file_transfer: bool,
|
enable_file_transfer: bool,
|
||||||
// by peer
|
// by peer
|
||||||
audio_sender: Option<MediaSender>,
|
audio_sender: Option<MediaSender>,
|
||||||
@ -293,7 +291,6 @@ impl Connection {
|
|||||||
show_remote_cursor: false,
|
show_remote_cursor: false,
|
||||||
ip: "".to_owned(),
|
ip: "".to_owned(),
|
||||||
disable_audio: false,
|
disable_audio: false,
|
||||||
#[cfg(windows)]
|
|
||||||
enable_file_transfer: false,
|
enable_file_transfer: false,
|
||||||
disable_clipboard: false,
|
disable_clipboard: false,
|
||||||
disable_keyboard: false,
|
disable_keyboard: false,
|
||||||
@ -1115,7 +1112,6 @@ impl Connection {
|
|||||||
self.audio && !self.disable_audio
|
self.audio && !self.disable_audio
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
fn file_transfer_enabled(&self) -> bool {
|
fn file_transfer_enabled(&self) -> bool {
|
||||||
self.file && self.enable_file_transfer
|
self.file && self.enable_file_transfer
|
||||||
}
|
}
|
||||||
|
@ -362,9 +362,9 @@ impl UI {
|
|||||||
fn get_connect_status(&mut self) -> Value {
|
fn get_connect_status(&mut self) -> Value {
|
||||||
let mut v = Value::array(0);
|
let mut v = Value::array(0);
|
||||||
let x = get_connect_status();
|
let x = get_connect_status();
|
||||||
v.push(x.status_num);
|
v.push(x.0);
|
||||||
v.push(x.key_confirmed);
|
v.push(x.1);
|
||||||
v.push(x.id);
|
v.push(x.3);
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,10 +454,10 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(data) = self.rx.recv() => {
|
Some(data) = self.rx.recv() => {
|
||||||
if let Data::SwitchPermission{name: _name, enabled: _enabled} = &data {
|
if let Data::SwitchPermission{name, enabled} = &data {
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
if _name == "file" {
|
if name == "file" {
|
||||||
self.file_transfer_enabled = *_enabled;
|
self.file_transfer_enabled = *enabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if self.stream.send(&data).await.is_err() {
|
if self.stream.send(&data).await.is_err() {
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
|
process::Child,
|
||||||
|
sync::{Arc, Mutex},
|
||||||
|
};
|
||||||
|
|
||||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||||
use hbb_common::password_security;
|
use hbb_common::password_security;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
@ -10,12 +16,6 @@ use hbb_common::{
|
|||||||
sleep,
|
sleep,
|
||||||
tokio::{sync::mpsc, time},
|
tokio::{sync::mpsc, time},
|
||||||
};
|
};
|
||||||
use serde_derive::Serialize;
|
|
||||||
use std::{
|
|
||||||
collections::HashMap,
|
|
||||||
process::Child,
|
|
||||||
sync::{Arc, Mutex},
|
|
||||||
};
|
|
||||||
|
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
config::{CONNECT_TIMEOUT, RENDEZVOUS_PORT},
|
config::{CONNECT_TIMEOUT, RENDEZVOUS_PORT},
|
||||||
@ -32,28 +32,10 @@ use crate::ipc;
|
|||||||
type Message = RendezvousMessage;
|
type Message = RendezvousMessage;
|
||||||
|
|
||||||
pub type Children = Arc<Mutex<(bool, HashMap<(String, String), Child>)>>;
|
pub type Children = Arc<Mutex<(bool, HashMap<(String, String), Child>)>>;
|
||||||
|
type Status = (i32, bool, i64, String); // (status_num, key_confirmed, mouse_time, id)
|
||||||
#[derive(Clone, Debug, Serialize)]
|
|
||||||
pub struct UiStatus {
|
|
||||||
pub status_num: i32,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
pub key_confirmed: bool,
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
pub mouse_time: i64,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
pub id: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
static ref UI_STATUS : Arc<Mutex<UiStatus>> = Arc::new(Mutex::new(UiStatus{
|
static ref UI_STATUS : Arc<Mutex<Status>> = Arc::new(Mutex::new((0, false, 0, "".to_owned())));
|
||||||
status_num: 0,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
key_confirmed: false,
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
mouse_time: 0,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
id: "".to_owned(),
|
|
||||||
}));
|
|
||||||
static ref OPTIONS : Arc<Mutex<HashMap<String, String>>> = Arc::new(Mutex::new(Config::get_options()));
|
static ref OPTIONS : Arc<Mutex<HashMap<String, String>>> = Arc::new(Mutex::new(Config::get_options()));
|
||||||
static ref ASYNC_JOB_STATUS : Arc<Mutex<String>> = Default::default();
|
static ref ASYNC_JOB_STATUS : Arc<Mutex<String>> = Default::default();
|
||||||
static ref TEMPORARY_PASSWD : Arc<Mutex<String>> = Arc::new(Mutex::new("".to_owned()));
|
static ref TEMPORARY_PASSWD : Arc<Mutex<String>> = Arc::new(Mutex::new("".to_owned()));
|
||||||
@ -411,9 +393,10 @@ pub fn is_installed_lower_version() -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
pub fn get_mouse_time() -> f64 {
|
pub fn get_mouse_time() -> f64 {
|
||||||
UI_STATUS.lock().unwrap().mouse_time as f64
|
let ui_status = UI_STATUS.lock().unwrap();
|
||||||
|
let res = ui_status.2 as f64;
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -426,9 +409,10 @@ pub fn check_mouse_time() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
pub fn get_connect_status() -> Status {
|
||||||
pub fn get_connect_status() -> UiStatus {
|
let ui_statue = UI_STATUS.lock().unwrap();
|
||||||
UI_STATUS.lock().unwrap().clone()
|
let res = ui_statue.clone();
|
||||||
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -873,13 +857,10 @@ pub fn get_hostname() -> String {
|
|||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
#[tokio::main(flavor = "current_thread")]
|
#[tokio::main(flavor = "current_thread")]
|
||||||
async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc::Data>) {
|
async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc::Data>) {
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
let mut key_confirmed = false;
|
let mut key_confirmed = false;
|
||||||
let mut rx = rx;
|
let mut rx = rx;
|
||||||
let mut mouse_time = 0;
|
let mut mouse_time = 0;
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
let mut id = "".to_owned();
|
let mut id = "".to_owned();
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
let mut enable_file_transfer = "".to_owned();
|
let mut enable_file_transfer = "".to_owned();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@ -893,10 +874,9 @@ async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc:
|
|||||||
log::error!("ipc connection closed: {}", err);
|
log::error!("ipc connection closed: {}", err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
Ok(Some(ipc::Data::MouseMoveTime(v))) => {
|
Ok(Some(ipc::Data::MouseMoveTime(v))) => {
|
||||||
mouse_time = v;
|
mouse_time = v;
|
||||||
UI_STATUS.lock().unwrap().mouse_time = v;
|
UI_STATUS.lock().unwrap().2 = v;
|
||||||
}
|
}
|
||||||
Ok(Some(ipc::Data::Options(Some(v)))) => {
|
Ok(Some(ipc::Data::Options(Some(v)))) => {
|
||||||
*OPTIONS.lock().unwrap() = v;
|
*OPTIONS.lock().unwrap() = v;
|
||||||
@ -913,31 +893,17 @@ async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc:
|
|||||||
}
|
}
|
||||||
Ok(Some(ipc::Data::Config((name, Some(value))))) => {
|
Ok(Some(ipc::Data::Config((name, Some(value))))) => {
|
||||||
if name == "id" {
|
if name == "id" {
|
||||||
#[cfg(not(feature = "flutter"))]
|
id = value;
|
||||||
{
|
|
||||||
id = value;
|
|
||||||
}
|
|
||||||
} else if name == "temporary-password" {
|
} else if name == "temporary-password" {
|
||||||
*TEMPORARY_PASSWD.lock().unwrap() = value;
|
*TEMPORARY_PASSWD.lock().unwrap() = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(Some(ipc::Data::OnlineStatus(Some((mut x, _c))))) => {
|
Ok(Some(ipc::Data::OnlineStatus(Some((mut x, c))))) => {
|
||||||
if x > 0 {
|
if x > 0 {
|
||||||
x = 1
|
x = 1
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "flutter"))]
|
key_confirmed = c;
|
||||||
{
|
*UI_STATUS.lock().unwrap() = (x as _, key_confirmed, mouse_time, id.clone());
|
||||||
key_confirmed = _c;
|
|
||||||
}
|
|
||||||
*UI_STATUS.lock().unwrap() = UiStatus {
|
|
||||||
status_num: x as _,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
key_confirmed: _c,
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
mouse_time,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
id: id.clone(),
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@ -961,15 +927,7 @@ async fn check_connect_status_(reconnect: bool, rx: mpsc::UnboundedReceiver<ipc:
|
|||||||
.insert("ipc-closed".to_owned(), "Y".to_owned());
|
.insert("ipc-closed".to_owned(), "Y".to_owned());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*UI_STATUS.lock().unwrap() = UiStatus {
|
*UI_STATUS.lock().unwrap() = (-1, key_confirmed, mouse_time, id.clone());
|
||||||
status_num: -1,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
key_confirmed,
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
mouse_time,
|
|
||||||
#[cfg(not(feature = "flutter"))]
|
|
||||||
id: id.clone(),
|
|
||||||
};
|
|
||||||
sleep(1.).await;
|
sleep(1.).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user