Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/files/electron-main/diskFileSystemProviderServer.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { shell } from 'electron';
7
import { localize } from '../../../nls.js';
8
import { isWindows } from '../../../base/common/platform.js';
9
import { Emitter } from '../../../base/common/event.js';
10
import { URI, UriComponents } from '../../../base/common/uri.js';
11
import { IFileDeleteOptions, IFileChange, IWatchOptions, createFileSystemProviderError, FileSystemProviderErrorCode } from '../common/files.js';
12
import { DiskFileSystemProvider } from '../node/diskFileSystemProvider.js';
13
import { basename, normalize } from '../../../base/common/path.js';
14
import { IDisposable } from '../../../base/common/lifecycle.js';
15
import { ILogService } from '../../log/common/log.js';
16
import { AbstractDiskFileSystemProviderChannel, AbstractSessionFileWatcher, ISessionFileWatcher } from '../node/diskFileSystemProviderServer.js';
17
import { DefaultURITransformer, IURITransformer } from '../../../base/common/uriIpc.js';
18
import { IEnvironmentService } from '../../environment/common/environment.js';
19
import { toErrorMessage } from '../../../base/common/errorMessage.js';
20
21
export class DiskFileSystemProviderChannel extends AbstractDiskFileSystemProviderChannel<unknown> {
22
23
constructor(
24
provider: DiskFileSystemProvider,
25
logService: ILogService,
26
private readonly environmentService: IEnvironmentService
27
) {
28
super(provider, logService);
29
}
30
31
protected override getUriTransformer(ctx: unknown): IURITransformer {
32
return DefaultURITransformer;
33
}
34
35
protected override transformIncoming(uriTransformer: IURITransformer, _resource: UriComponents): URI {
36
return URI.revive(_resource);
37
}
38
39
//#region Delete: override to support Electron's trash support
40
41
protected override async delete(uriTransformer: IURITransformer, _resource: UriComponents, opts: IFileDeleteOptions): Promise<void> {
42
if (!opts.useTrash) {
43
return super.delete(uriTransformer, _resource, opts);
44
}
45
46
const resource = this.transformIncoming(uriTransformer, _resource);
47
const filePath = normalize(resource.fsPath);
48
try {
49
await shell.trashItem(filePath);
50
} catch (error) {
51
throw createFileSystemProviderError(isWindows ? localize('binFailed', "Failed to move '{0}' to the recycle bin ({1})", basename(filePath), toErrorMessage(error)) : localize('trashFailed', "Failed to move '{0}' to the trash ({1})", basename(filePath), toErrorMessage(error)), FileSystemProviderErrorCode.Unknown);
52
}
53
}
54
55
//#endregion
56
57
//#region File Watching
58
59
protected createSessionFileWatcher(uriTransformer: IURITransformer, emitter: Emitter<IFileChange[] | string>): ISessionFileWatcher {
60
return new SessionFileWatcher(uriTransformer, emitter, this.logService, this.environmentService);
61
}
62
63
//#endregion
64
65
}
66
67
class SessionFileWatcher extends AbstractSessionFileWatcher {
68
69
override watch(req: number, resource: URI, opts: IWatchOptions): IDisposable {
70
if (opts.recursive) {
71
throw createFileSystemProviderError('Recursive file watching is not supported from main process for performance reasons.', FileSystemProviderErrorCode.Unavailable);
72
}
73
74
return super.watch(req, resource, opts);
75
}
76
}
77
78