@@ -23,21 +23,24 @@ import {
23
23
FileWriteOptions , FileOpenOptions , FileChangeType ,
24
24
FileSystemProviderCapabilities , FileChange , Stat , FileOverwriteOptions , WatchOptions , FileType , FileSystemProvider , FileDeleteOptions ,
25
25
hasOpenReadWriteCloseCapability , hasFileFolderCopyCapability , hasReadWriteCapability , hasAccessCapability ,
26
- FileSystemProviderError , FileSystemProviderErrorCode , FileUpdateOptions , hasUpdateCapability , FileUpdateResult , FileReadStreamOptions , hasFileReadStreamCapability
26
+ FileSystemProviderError , FileSystemProviderErrorCode , FileUpdateOptions , hasUpdateCapability , FileUpdateResult , FileReadStreamOptions , hasFileReadStreamCapability ,
27
+ ReadOnlyMessageFileSystemProvider
27
28
} from './files' ;
28
29
import { RpcServer , RpcProxy , RpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory' ;
29
30
import { ApplicationError } from '@theia/core/lib/common/application-error' ;
30
31
import { Deferred } from '@theia/core/lib/common/promise-util' ;
31
32
import type { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol' ;
32
33
import { newWriteableStream , ReadableStreamEvents } from '@theia/core/lib/common/stream' ;
33
34
import { CancellationToken , cancelled } from '@theia/core/lib/common/cancellation' ;
35
+ import { MarkdownString } from '@theia/core/lib/common/markdown-rendering' ;
34
36
35
37
export const remoteFileSystemPath = '/services/remote-filesystem' ;
36
38
37
39
export const RemoteFileSystemServer = Symbol ( 'RemoteFileSystemServer' ) ;
38
40
export interface RemoteFileSystemServer extends RpcServer < RemoteFileSystemClient > {
39
41
getCapabilities ( ) : Promise < FileSystemProviderCapabilities >
40
42
stat ( resource : string ) : Promise < Stat > ;
43
+ getReadOnlyMessage ( ) : Promise < MarkdownString | undefined > ;
41
44
access ( resource : string , mode ?: number ) : Promise < void > ;
42
45
fsPath ( resource : string ) : Promise < string > ;
43
46
open ( resource : string , opts : FileOpenOptions ) : Promise < number > ;
@@ -70,6 +73,7 @@ export interface RemoteFileSystemClient {
70
73
notifyDidChangeFile ( event : { changes : RemoteFileChange [ ] } ) : void ;
71
74
notifyFileWatchError ( ) : void ;
72
75
notifyDidChangeCapabilities ( capabilities : FileSystemProviderCapabilities ) : void ;
76
+ notifyDidChangeReadOnlyMessage ( readOnlyMessage : MarkdownString | undefined ) : void ;
73
77
onFileStreamData ( handle : number , data : Uint8Array ) : void ;
74
78
onFileStreamEnd ( handle : number , error : RemoteFileStreamError | undefined ) : void ;
75
79
}
@@ -109,7 +113,7 @@ export class RemoteFileSystemProxyFactory<T extends object> extends RpcProxyFact
109
113
* Wraps the remote filesystem provider living on the backend.
110
114
*/
111
115
@injectable ( )
112
- export class RemoteFileSystemProvider implements Required < FileSystemProvider > , Disposable {
116
+ export class RemoteFileSystemProvider implements Required < FileSystemProvider > , Disposable , ReadOnlyMessageFileSystemProvider {
113
117
114
118
private readonly onDidChangeFileEmitter = new Emitter < readonly FileChange [ ] > ( ) ;
115
119
readonly onDidChangeFile = this . onDidChangeFileEmitter . event ;
@@ -120,6 +124,9 @@ export class RemoteFileSystemProvider implements Required<FileSystemProvider>, D
120
124
private readonly onDidChangeCapabilitiesEmitter = new Emitter < void > ( ) ;
121
125
readonly onDidChangeCapabilities = this . onDidChangeCapabilitiesEmitter . event ;
122
126
127
+ private readonly onDidChangeReadOnlyMessageEmitter = new Emitter < MarkdownString | undefined > ( ) ;
128
+ readonly onDidChangeReadOnlyMessage = this . onDidChangeReadOnlyMessageEmitter . event ;
129
+
123
130
private readonly onFileStreamDataEmitter = new Emitter < [ number , Uint8Array ] > ( ) ;
124
131
private readonly onFileStreamData = this . onFileStreamDataEmitter . event ;
125
132
@@ -129,6 +136,7 @@ export class RemoteFileSystemProvider implements Required<FileSystemProvider>, D
129
136
protected readonly toDispose = new DisposableCollection (
130
137
this . onDidChangeFileEmitter ,
131
138
this . onDidChangeCapabilitiesEmitter ,
139
+ this . onDidChangeReadOnlyMessageEmitter ,
132
140
this . onFileStreamDataEmitter ,
133
141
this . onFileStreamEndEmitter
134
142
) ;
@@ -146,6 +154,11 @@ export class RemoteFileSystemProvider implements Required<FileSystemProvider>, D
146
154
private _capabilities : FileSystemProviderCapabilities = 0 ;
147
155
get capabilities ( ) : FileSystemProviderCapabilities { return this . _capabilities ; }
148
156
157
+ private _readOnlyMessage : MarkdownString | undefined = undefined ;
158
+ get readOnlyMessage ( ) : MarkdownString | undefined {
159
+ return this . _readOnlyMessage ;
160
+ }
161
+
149
162
protected readonly readyDeferred = new Deferred < void > ( ) ;
150
163
readonly ready = this . readyDeferred . promise ;
151
164
@@ -161,6 +174,9 @@ export class RemoteFileSystemProvider implements Required<FileSystemProvider>, D
161
174
this . _capabilities = capabilities ;
162
175
this . readyDeferred . resolve ( ) ;
163
176
} , this . readyDeferred . reject ) ;
177
+ this . server . getReadOnlyMessage ( ) . then ( readOnlyMessage => {
178
+ this . _readOnlyMessage = readOnlyMessage ;
179
+ } ) ;
164
180
this . server . setClient ( {
165
181
notifyDidChangeFile : ( { changes } ) => {
166
182
this . onDidChangeFileEmitter . fire ( changes . map ( event => ( { resource : new URI ( event . resource ) , type : event . type } ) ) ) ;
@@ -169,6 +185,7 @@ export class RemoteFileSystemProvider implements Required<FileSystemProvider>, D
169
185
this . onFileWatchErrorEmitter . fire ( ) ;
170
186
} ,
171
187
notifyDidChangeCapabilities : capabilities => this . setCapabilities ( capabilities ) ,
188
+ notifyDidChangeReadOnlyMessage : readOnlyMessage => this . setReadOnlyMessage ( readOnlyMessage ) ,
172
189
onFileStreamData : ( handle , data ) => this . onFileStreamDataEmitter . fire ( [ handle , data ] ) ,
173
190
onFileStreamEnd : ( handle , error ) => this . onFileStreamEndEmitter . fire ( [ handle , error ] )
174
191
} ) ;
@@ -188,6 +205,11 @@ export class RemoteFileSystemProvider implements Required<FileSystemProvider>, D
188
205
this . onDidChangeCapabilitiesEmitter . fire ( undefined ) ;
189
206
}
190
207
208
+ protected setReadOnlyMessage ( readOnlyMessage : MarkdownString | undefined ) : void {
209
+ this . _readOnlyMessage = readOnlyMessage ;
210
+ this . onDidChangeReadOnlyMessageEmitter . fire ( readOnlyMessage ) ;
211
+ }
212
+
191
213
// --- forwarding calls
192
214
193
215
stat ( resource : URI ) : Promise < Stat > {
@@ -362,6 +384,14 @@ export class FileSystemProviderServer implements RemoteFileSystemServer {
362
384
this . client . notifyDidChangeCapabilities ( this . provider . capabilities ) ;
363
385
}
364
386
} ) ) ;
387
+ if ( ReadOnlyMessageFileSystemProvider . is ( this . provider ) ) {
388
+ const providerWithReadOnlyMessage : ReadOnlyMessageFileSystemProvider = this . provider ;
389
+ this . toDispose . push ( this . provider . onDidChangeReadOnlyMessage ( ( ) => {
390
+ if ( this . client ) {
391
+ this . client . notifyDidChangeReadOnlyMessage ( providerWithReadOnlyMessage . readOnlyMessage ) ;
392
+ }
393
+ } ) ) ;
394
+ }
365
395
this . toDispose . push ( this . provider . onDidChangeFile ( changes => {
366
396
if ( this . client ) {
367
397
this . client . notifyDidChangeFile ( {
@@ -380,6 +410,14 @@ export class FileSystemProviderServer implements RemoteFileSystemServer {
380
410
return this . provider . capabilities ;
381
411
}
382
412
413
+ async getReadOnlyMessage ( ) : Promise < MarkdownString | undefined > {
414
+ if ( ReadOnlyMessageFileSystemProvider . is ( this . provider ) ) {
415
+ return this . provider . readOnlyMessage ;
416
+ } else {
417
+ return undefined ;
418
+ }
419
+ }
420
+
383
421
stat ( resource : string ) : Promise < Stat > {
384
422
return this . provider . stat ( new URI ( resource ) ) ;
385
423
}
0 commit comments