cm: update a port-forward row's targets as tunnel channels come and go

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EZ49AbZJYfm8NTp5yDPMab
This commit is contained in:
rustdesk
2026-09-04 01:05:06 +08:00
parent 3fdbaf5006
commit 5daa020516
8 changed files with 46 additions and 1 deletions

View File

@@ -436,6 +436,8 @@ class FfiModel with ChangeNotifier {
parent.target?.chatModel.onVoiceCallIncoming();
} else if (name == 'update_voice_call_state') {
parent.target?.serverModel.updateVoiceCallState(evt);
} else if (name == 'update_port_forward') {
parent.target?.serverModel.updatePortForward(evt);
} else if (name == 'fingerprint') {
FingerprintState.find(peerId).value = evt['fingerprint'] ?? '';
} else if (name == "sync_peer_hash_password_to_personal_ab") {

View File

@@ -768,6 +768,16 @@ class ServerModel with ChangeNotifier {
}
}
void updatePortForward(Map<String, dynamic> evt) {
final id = int.tryParse(evt['id']?.toString() ?? '');
final portForward = evt['port_forward']?.toString() ?? '';
if (id == null || portForward.isEmpty) return;
final index = _clients.indexWhere((c) => c.id == id);
if (index < 0) return;
_clients[index].portForward = portForward;
notifyListeners();
}
void androidUpdatekeepScreenOn() async {
if (!isAndroid) return;
var floatingWindowDisabled =

View File

@@ -1517,6 +1517,13 @@ pub mod connection_manager {
);
}
fn update_port_forward(&self, id: i32, port_forward: String) {
self.push_event(
"update_port_forward",
&[("id", &id.to_string()), ("port_forward", &port_forward)],
);
}
fn change_theme(&self, dark: String) {
self.push_event("theme", &[("dark", &dark)]);
}

View File

@@ -348,6 +348,7 @@ pub enum Data {
name: String,
enabled: bool,
},
UpdatePortForward(String),
SystemInfo(Option<String>),
ClickTime(i64),
#[cfg(not(any(target_os = "android", target_os = "ios")))]

View File

@@ -2241,7 +2241,8 @@ impl Connection {
return;
};
self.port_forward_address = label.clone();
log::debug!("port forward targets now {}", label);
log::info!("port forward targets now {}", label);
self.send_to_cm(ipc::Data::UpdatePortForward(label));
}
#[inline]

View File

@@ -72,6 +72,10 @@ impl InvokeUiCM for SciterHandler {
);
}
fn update_port_forward(&self, id: i32, port_forward: String) {
self.call("updatePortForward", &make_args!(id, port_forward));
}
fn file_transfer_log(&self, _action: &str, _log: &str) {}
}

View File

@@ -434,6 +434,13 @@ handler.addConnection = function(id, is_file_transfer, is_view_camera, is_termin
}
}
handler.updatePortForward = function(id, port_forward) {
connections.map(function(c) {
if (c.id == id) c.port_forward = port_forward;
});
update();
}
handler.removeConnection = function(id, close) {
var i = -1;
connections.map(function(c, idx) {

View File

@@ -196,6 +196,8 @@ pub trait InvokeUiCM: Send + Clone + 'static + Sized {
fn update_voice_call_state(&self, client: &Client);
fn file_transfer_log(&self, action: &str, log: &str);
fn update_port_forward(&self, id: i32, port_forward: String);
}
impl<T: InvokeUiCM> Deref for ConnectionManager<T> {
@@ -602,6 +604,17 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
}
}
}
Data::UpdatePortForward(port_forward) => {
let updated = {
let mut clients = CLIENTS.write().unwrap();
clients.get_mut(&self.conn_id).map(|c| {
c.port_forward = port_forward.clone();
})
};
if updated.is_some() {
self.cm.ui_handler.update_port_forward(self.conn_id, port_forward);
}
}
Data::FS(mut fs) => {
if let ipc::FS::WriteBlock { id, file_num, data: _, compressed } = fs {
if let Ok(bytes) = self.stream.next_raw().await {