@@ -7,7 +7,23 @@ import Service from '@ember/service';
77import { service } from '@ember/service' ;
88import { tracked } from '@glimmer/tracking' ;
99
10+ export const RDP_CLIENT_NONE = 'none' ;
11+ export const RDP_CLIENT_WINDOWS_APP = 'windows-app' ;
12+ export const RDP_CLIENT_MSTSC = 'mstsc' ;
13+ export const RDP_CLIENT_WINDOWS_APP_LINK =
14+ 'https://apps.apple.com/us/app/windows-app/id1295203466' ;
15+ export const RDP_CLIENT_MSTSC_LINK =
16+ 'https://learn.microsoft.com/windows-server/remote/remote-desktop-services/remotepc/uninstall-remote-desktop-connection' ;
17+
1018const { __electronLog } = globalThis ;
19+ const macRecommendedRdpClient = {
20+ name : RDP_CLIENT_WINDOWS_APP ,
21+ link : RDP_CLIENT_WINDOWS_APP_LINK ,
22+ } ;
23+ const windowsRecommendedRdpClient = {
24+ name : RDP_CLIENT_MSTSC ,
25+ link : RDP_CLIENT_MSTSC_LINK ,
26+ } ;
1127
1228export default class RdpService extends Service {
1329 // =services
@@ -19,17 +35,21 @@ export default class RdpService extends Service {
1935 /**
2036 * The preferred RDP client set by the user.
2137 * @type {string|null }
22- * @private
2338 */
2439 @tracked preferredRdpClient = null ;
2540
2641 /**
2742 * The list of available RDP clients fetched from the main process.
2843 * @type {Array<String> }
29- * @private
3044 */
3145 @tracked rdpClients = [ ] ;
3246
47+ /**
48+ * The recommended RDP client based on platform when only 'none' is available.
49+ * @type {Object|null }
50+ */
51+ @tracked recommendedRdpClient = null ;
52+
3353 // =attributes
3454
3555 /**
@@ -40,12 +60,21 @@ export default class RdpService extends Service {
4060 */
4161 get isPreferredRdpClientSet ( ) {
4262 return (
43- this . preferredRdpClient !== null && this . preferredRdpClient !== 'none'
63+ this . preferredRdpClient !== null &&
64+ this . preferredRdpClient !== RDP_CLIENT_NONE
4465 ) ;
4566 }
4667
4768 // =methods
4869
70+ async initialize ( ) {
71+ await Promise . all ( [
72+ this . getRdpClients ( ) ,
73+ this . getPreferredRdpClient ( ) ,
74+ this . getRecommendedRdpClient ( ) ,
75+ ] ) ;
76+ }
77+
4978 /**
5079 * Fetches the list of available RDP clients from the main process.
5180 */
@@ -60,11 +89,35 @@ export default class RdpService extends Service {
6089 } catch ( error ) {
6190 __electronLog ?. error ( 'Failed to fetch RDP clients' , error . message ) ;
6291 // default to 'none' option if it fails
63- this . rdpClients = [ 'none' ] ;
92+ this . rdpClients = [ RDP_CLIENT_NONE ] ;
6493 return this . rdpClients ;
6594 }
6695 }
6796
97+ /**
98+ * Gets the recommended RDP client based on OS platform.
99+ */
100+ async getRecommendedRdpClient ( ) {
101+ try {
102+ // return cached recommended client if already set
103+ if ( this . recommendedRdpClient !== null ) {
104+ return this . recommendedRdpClient ;
105+ }
106+ const { isWindows, isMac } = await this . ipc . invoke ( 'checkOS' ) ;
107+ if ( isWindows ) {
108+ this . recommendedRdpClient = windowsRecommendedRdpClient ;
109+ } else if ( isMac ) {
110+ this . recommendedRdpClient = macRecommendedRdpClient ;
111+ }
112+ } catch ( error ) {
113+ __electronLog ?. error (
114+ 'Failed to set recommended RDP client' ,
115+ error . message ,
116+ ) ;
117+ this . recommendedRdpClient = null ;
118+ }
119+ }
120+
68121 /**
69122 * Fetches the preferred RDP client from the main process.
70123 * @returns {string } The preferred RDP client
@@ -83,7 +136,7 @@ export default class RdpService extends Service {
83136 error . message ,
84137 ) ;
85138 // default to 'none' if it fails
86- this . preferredRdpClient = 'none' ;
139+ this . preferredRdpClient = RDP_CLIENT_NONE ;
87140 return this . preferredRdpClient ;
88141 }
89142 }
@@ -101,7 +154,7 @@ export default class RdpService extends Service {
101154 } catch ( error ) {
102155 __electronLog ?. error ( 'Failed to set preferred RDP client' , error . message ) ;
103156 // set to 'none' if it fails
104- this . preferredRdpClient = 'none' ;
157+ this . preferredRdpClient = RDP_CLIENT_NONE ;
105158 }
106159 }
107160
0 commit comments