@@ -9,14 +9,16 @@ use crate::config::Config;
99use crate :: constants:: Blocked ;
1010use crate :: contact:: ContactId ;
1111use crate :: context:: Context ;
12- use crate :: log:: LogExt ;
13- use crate :: log:: warn;
12+ use crate :: events:: EventType ;
13+ use crate :: log:: { LogExt as _, warn} ;
14+ use crate :: login_param:: EnteredLoginParam ;
1415use crate :: message:: { Message , MsgId , Viewtype } ;
1516use crate :: mimeparser:: SystemMessage ;
1617use crate :: param:: Param ;
1718use crate :: sync:: SyncData :: { AddQrToken , AlterChat , DeleteQrToken } ;
1819use crate :: token:: Namespace ;
1920use crate :: tools:: time;
21+ use crate :: transport:: { ConfiguredLoginParamJson , save_transport} ;
2022use crate :: { message, stock_str, token} ;
2123use std:: collections:: HashSet ;
2224
@@ -52,6 +54,29 @@ pub(crate) struct QrTokenData {
5254 pub ( crate ) grpid : Option < String > ,
5355}
5456
57+ #[ derive( Debug , Serialize , Deserialize ) ]
58+ pub ( crate ) struct TransportData {
59+ /// Configured login parameters.
60+ pub ( crate ) configured : ConfiguredLoginParamJson ,
61+
62+ /// Login parameters entered by the user.
63+ ///
64+ /// They can be used to reconfigure the transport.
65+ pub ( crate ) entered : EnteredLoginParam ,
66+
67+ /// Timestamp of when the transport was last time (re)configured.
68+ pub ( crate ) timestamp : i64 ,
69+ }
70+
71+ #[ derive( Debug , Serialize , Deserialize ) ]
72+ pub ( crate ) struct RemovedTransportData {
73+ /// Address of the removed transport.
74+ pub ( crate ) addr : String ,
75+
76+ /// Timestamp of when the transport was removed.
77+ pub ( crate ) timestamp : i64 ,
78+ }
79+
5580#[ derive( Debug , Serialize , Deserialize ) ]
5681pub ( crate ) enum SyncData {
5782 AddQrToken ( QrTokenData ) ,
@@ -71,6 +96,13 @@ pub(crate) enum SyncData {
7196 DeleteMessages {
7297 msgs : Vec < String > , // RFC724 id (i.e. "Message-Id" header)
7398 } ,
99+
100+ /// Update transport configuration.
101+ Transports {
102+ transports : Vec < TransportData > ,
103+
104+ removed_transports : Vec < RemovedTransportData > ,
105+ } ,
74106}
75107
76108#[ derive( Debug , Serialize , Deserialize ) ]
@@ -274,6 +306,10 @@ impl Context {
274306 SyncData :: Config { key, val } => self . sync_config ( key, val) . await ,
275307 SyncData :: SaveMessage { src, dest } => self . save_message ( src, dest) . await ,
276308 SyncData :: DeleteMessages { msgs } => self . sync_message_deletion ( msgs) . await ,
309+ SyncData :: Transports {
310+ transports,
311+ removed_transports,
312+ } => self . sync_transports ( transports, removed_transports) . await ,
277313 } ,
278314 SyncDataOrUnknown :: Unknown ( data) => {
279315 warn ! ( self , "Ignored unknown sync item: {data}." ) ;
@@ -347,6 +383,46 @@ impl Context {
347383 message:: delete_msgs_locally_done ( self , & msg_ids, modified_chat_ids) . await ?;
348384 Ok ( ( ) )
349385 }
386+
387+ /// Process received data for transport synchronization.
388+ async fn sync_transports (
389+ & self ,
390+ transports : & [ TransportData ] ,
391+ removed_transports : & [ RemovedTransportData ] ,
392+ ) -> Result < ( ) > {
393+ for TransportData {
394+ configured,
395+ entered,
396+ timestamp,
397+ } in transports
398+ {
399+ save_transport ( self , entered, configured, * timestamp) . await ?;
400+ }
401+
402+ self . sql
403+ . transaction ( |transaction| {
404+ for RemovedTransportData { addr, timestamp } in removed_transports {
405+ transaction. execute (
406+ "DELETE FROM transports
407+ WHERE addr=? AND add_timestamp<=?" ,
408+ ( addr, timestamp) ,
409+ ) ?;
410+ transaction. execute (
411+ "INSERT INTO removed_transports (addr, remove_timestamp)
412+ VALUES (?, ?)
413+ ON CONFLICT (addr) DO
414+ UPDATE SET remove_timestamp = excluded.remove_timestamp
415+ WHERE excluded.remove_timestamp > remove_timestamp" ,
416+ ( addr, timestamp) ,
417+ ) ?;
418+ }
419+ Ok ( ( ) )
420+ } )
421+ . await ?;
422+
423+ self . emit_event ( EventType :: TransportsModified ) ;
424+ Ok ( ( ) )
425+ }
350426}
351427
352428#[ cfg( test) ]
0 commit comments