@@ -93,26 +93,23 @@ impl Rdp {
9393 fn set_rdp_settings ( & self ) {
9494 #[ cfg( debug_assertions) ]
9595 self . debug_assert_instance ( ) ;
96-
97- if let Some ( settings) = self . settings ( ) {
98- unsafe {
96+ unsafe {
97+ if let Some ( settings) = self . settings ( ) {
9998 // Set Falses first
100- for i in [
99+ [
101100 FreeRDP_Settings_Keys_Bool_FreeRDP_FastPathInput ,
102101 FreeRDP_Settings_Keys_Bool_FreeRDP_FastPathOutput ,
103102 FreeRDP_Settings_Keys_Bool_FreeRDP_BitmapCompressionDisabled ,
104103 FreeRDP_Settings_Keys_Bool_FreeRDP_RemoteConsoleAudio , // So audio is not played on server
105104 ]
106105 . iter ( )
107- {
106+ . for_each ( |i| {
108107 freerdp_settings_set_bool ( settings, * i, false . into ( ) ) ;
109- }
108+ } ) ;
110109 // Then Trues
111- for i in [
110+ [
112111 FreeRDP_Settings_Keys_Bool_FreeRDP_GfxThinClient ,
113112 FreeRDP_Settings_Keys_Bool_FreeRDP_GfxProgressive ,
114- FreeRDP_Settings_Keys_Bool_FreeRDP_AllowFontSmoothing ,
115- FreeRDP_Settings_Keys_Bool_FreeRDP_AllowDesktopComposition ,
116113 FreeRDP_Settings_Keys_Bool_FreeRDP_AllowCacheWaitingList ,
117114 FreeRDP_Settings_Keys_Bool_FreeRDP_DesktopResize ,
118115 FreeRDP_Settings_Keys_Bool_FreeRDP_DynamicResolutionUpdate ,
@@ -128,17 +125,18 @@ impl Rdp {
128125 FreeRDP_Settings_Keys_Bool_FreeRDP_GfxAVC444v2 ,
129126 FreeRDP_Settings_Keys_Bool_FreeRDP_GfxAVC444 ,
130127 FreeRDP_Settings_Keys_Bool_FreeRDP_GfxH264 ,
131- // FreeRDP_Settings_Keys_Bool_FreeRDP_RemoteFxCodec,
128+ FreeRDP_Settings_Keys_Bool_FreeRDP_GfxProgressiveV2 ,
129+ //FreeRDP_Settings_Keys_Bool_FreeRDP_RemoteFxCodec,
132130 FreeRDP_Settings_Keys_Bool_FreeRDP_SupportGraphicsPipeline ,
133131 ]
134132 . iter ( )
135- {
133+ . for_each ( |i| {
136134 // Ignore the result, try with best effort
137135 freerdp_settings_set_bool ( settings, * i, true . into ( ) ) ;
138- }
136+ } ) ;
139137
140138 // Set uint32 values
141- for ( i , v ) in [
139+ [
142140 ( FreeRDP_Settings_Keys_UInt32_FreeRDP_ColorDepth , 32 ) ,
143141 (
144142 FreeRDP_Settings_Keys_UInt32_FreeRDP_DesktopWidth ,
@@ -155,19 +153,18 @@ impl Rdp {
155153 ( FreeRDP_Settings_Keys_UInt32_FreeRDP_FrameAcknowledge , 0 ) ,
156154 ]
157155 . iter ( )
158- {
156+ . for_each ( | ( i , v ) | {
159157 freerdp_settings_set_uint32 ( settings, * i, * v) ;
160- }
161- }
162-
163- fn channels (
164- settings : * mut rdpSettings ,
165- name : & str ,
166- channel : Option < & String > ,
167- add_static : bool ,
168- add_dynamic : bool ,
169- ) {
170- unsafe {
158+ } ) ;
159+
160+ // Audio redirection settings
161+ fn channels (
162+ settings : * mut rdpSettings ,
163+ name : & str ,
164+ channel : Option < & String > ,
165+ add_static : bool ,
166+ add_dynamic : bool ,
167+ ) {
171168 // Note: We can use the internal freerdp rdpsnd channel subsystems
172169
173170 let channel = if let Some ( channel) = channel {
@@ -186,67 +183,144 @@ impl Rdp {
186183 let cchannel = std:: ffi:: CString :: new ( channel) . unwrap ( ) ;
187184 let channels: [ * const std:: os:: raw:: c_char ; 2 ] =
188185 [ cname. as_ptr ( ) , cchannel. as_ptr ( ) ] ;
189- if add_static {
190- freerdp_client_add_static_channel (
191- settings,
192- channels. len ( ) ,
193- channels. as_ptr ( ) ,
194- ) ;
195- }
196- if add_dynamic {
197- freerdp_client_add_dynamic_channel (
198- settings,
199- channels. len ( ) ,
200- channels. as_ptr ( ) ,
201- ) ;
186+ unsafe {
187+ if add_static {
188+ freerdp_client_add_static_channel (
189+ settings,
190+ channels. len ( ) ,
191+ channels. as_ptr ( ) ,
192+ ) ;
193+ }
194+ if add_dynamic {
195+ freerdp_client_add_dynamic_channel (
196+ settings,
197+ channels. len ( ) ,
198+ channels. as_ptr ( ) ,
199+ ) ;
200+ }
202201 }
203202 }
204- }
205203
206- // Sound redirection
207- unsafe {
208- // true-false = play on client
209- // false-true = play on server
210- // false-false = no audio
204+ if self . config . settings . audio_redirection {
205+ // Sound redirection
206+ // true-false = play on client
207+ // false-true = play on server
208+ // false-false = no audio
209+ freerdp_settings_set_bool (
210+ settings,
211+ FreeRDP_Settings_Keys_Bool_FreeRDP_AudioPlayback ,
212+ true . into ( ) ,
213+ ) ;
214+ freerdp_settings_set_bool (
215+ settings,
216+ FreeRDP_Settings_Keys_Bool_FreeRDP_RemoteConsoleAudio ,
217+ false . into ( ) , // Always false, we want audio on client
218+ ) ;
219+ let channel = format ! ( "sys:{}" , crate :: addins:: RDPSND_SUBSYSTEM_CUSTOM ) ;
220+ channels ( settings, "rdpsnd" , Some ( & channel) , true , true ) ;
221+ // Default subsystem right now
222+ // channels(settings, "rdpsnd", None, true, true);
223+ }
224+ // Microphone redirection
225+ if self . config . settings . microphone_redirection {
226+ freerdp_settings_set_bool (
227+ settings,
228+ FreeRDP_Settings_Keys_Bool_FreeRDP_AudioCapture ,
229+ true . into ( ) ,
230+ ) ;
231+ channels ( settings, "audin" , None , false , true ) ;
232+ }
233+
234+ // Set config settings for clipboard redirection
211235 freerdp_settings_set_bool (
212236 settings,
213- FreeRDP_Settings_Keys_Bool_FreeRDP_AudioPlayback ,
214- true . into ( ) ,
237+ FreeRDP_Settings_Keys_Bool_FreeRDP_RedirectClipboard ,
238+ self . config . settings . clipboard_redirection . into ( ) ,
215239 ) ;
240+
241+ if self . config . settings . printer_redirection {
242+ freerdp_settings_set_bool (
243+ settings,
244+ FreeRDP_Settings_Keys_Bool_FreeRDP_RedirectPrinters ,
245+ true . into ( ) ,
246+ ) ;
247+ }
248+
216249 freerdp_settings_set_bool (
217250 settings,
218- FreeRDP_Settings_Keys_Bool_FreeRDP_RemoteConsoleAudio ,
219- false . into ( ) ,
251+ FreeRDP_Settings_Keys_Bool_FreeRDP_IgnoreCertificate ,
252+ ( ! self . config . settings . verify_cert ) . into ( ) ,
220253 ) ;
221- let channel = format ! ( "sys:{}" , crate :: addins:: RDPSND_SUBSYSTEM_CUSTOM ) ;
222- channels ( settings, "rdpsnd" , Some ( & channel) , true , true ) ;
223- // Default subsystem right now
224- // channels(settings, "rdpsnd", None, true, true);
225- }
226- // Microphone redirection
227- unsafe {
254+
255+ // NLA setting
228256 freerdp_settings_set_bool (
229257 settings,
230- FreeRDP_Settings_Keys_Bool_FreeRDP_AudioCapture ,
231- true . into ( ) ,
258+ FreeRDP_Settings_Keys_Bool_FreeRDP_NlaSecurity ,
259+ self . config . settings . use_nla . into ( ) ,
232260 ) ;
233- // TODO: Allow configuration of the audio capture device
234- channels ( settings, "audin" , None , false , true ) ;
235- }
236261
237- // Set config settings for clipboard redirection
238- unsafe {
262+ let drives_to_redirect = std:: ffi:: CString :: new (
263+ self . config
264+ . settings
265+ . drives_to_redirect
266+ . iter ( )
267+ . map ( |s| match s. as_str ( ) {
268+ "all" => "*" ,
269+ "DynamicDrives" => "DynamicDrives" ,
270+ other => other,
271+ } )
272+ . collect :: < Vec < & str > > ( )
273+ . join ( ";" ) ,
274+ )
275+ . unwrap ( ) ;
276+
277+ let all_drives = self
278+ . config
279+ . settings
280+ . drives_to_redirect
281+ . iter ( )
282+ . any ( |s| s. as_str ( ) == "all" ) ;
283+ let len_drives = self . config . settings . drives_to_redirect . len ( ) ;
239284 freerdp_settings_set_bool (
240285 settings,
241- FreeRDP_Settings_Keys_Bool_FreeRDP_RedirectClipboard ,
242- self . config . settings . clipboard_redirection . into ( ) ,
286+ FreeRDP_Settings_Keys_Bool_FreeRDP_RedirectDrives ,
287+ ( len_drives != 0 ) as BOOL ,
243288 ) ;
244- }
289+ if !all_drives {
290+ // Remove "all" and, if any rameaining, use FreeRDP_RedirectDrives
291+ freerdp_settings_set_string (
292+ settings,
293+ FreeRDP_Settings_Keys_String_FreeRDP_DrivesToRedirect ,
294+ drives_to_redirect. as_ptr ( ) ,
295+ ) ;
296+ }
245297
246- // Set perfromance flags from settings
247- unsafe { freerdp_sys:: freerdp_performance_flags_make ( settings) } ;
248- } else {
249- log:: debug!( "Connection not built, cannot optimize settings." ) ;
298+ if self . config . settings . best_experience {
299+ [
300+ FreeRDP_Settings_Keys_Bool_FreeRDP_DisableWallpaper ,
301+ FreeRDP_Settings_Keys_Bool_FreeRDP_DisableFullWindowDrag ,
302+ FreeRDP_Settings_Keys_Bool_FreeRDP_DisableMenuAnims ,
303+ FreeRDP_Settings_Keys_Bool_FreeRDP_DisableThemes ,
304+ ]
305+ . iter ( )
306+ . for_each ( |key| {
307+ freerdp_settings_set_bool ( settings, * key, false . into ( ) ) ;
308+ } ) ;
309+ [
310+ FreeRDP_Settings_Keys_Bool_FreeRDP_AllowFontSmoothing ,
311+ FreeRDP_Settings_Keys_Bool_FreeRDP_AllowDesktopComposition ,
312+ ]
313+ . iter ( )
314+ . for_each ( |key| {
315+ freerdp_settings_set_bool ( settings, * key, true . into ( ) ) ;
316+ } ) ;
317+ }
318+
319+ // Set perfromance flags from settings
320+ freerdp_sys:: freerdp_performance_flags_make ( settings) ;
321+ } else {
322+ log:: debug!( "Connection not built, cannot optimize settings." ) ;
323+ }
250324 }
251325 }
252326
0 commit comments