1+ diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts
2+ index 7b4e9cc8d6..7722cb12c6 100644
3+ --- a/src/vs/base/common/buffer.ts
4+ +++ b/src/vs/base/common/buffer.ts
5+ @@ -138,7 +138,7 @@ export interface VSBufferReadable {
6+ * Read data from the underlying source. Will return
7+ * null to indicate that no more data can be read.
8+ */
9+ - read(): VSBuffer | null;
10+ + read(): VSBuffer | null | Promise<VSBuffer | null>;
11+ }
12+
13+ /**
14+ @@ -185,11 +185,11 @@ export interface VSBufferReadableStream {
15+ /**
16+ * Helper to fully read a VSBuffer readable into a single buffer.
17+ */
18+ - export function readableToBuffer(readable: VSBufferReadable): VSBuffer {
19+ + export async function readableToBuffer(readable: VSBufferReadable): Promise<VSBuffer> {
20+ const chunks: VSBuffer[] = [];
21+
22+ let chunk: VSBuffer | null;
23+ - while (chunk = readable.read()) {
24+ + while (chunk = await readable.read()) {
25+ chunks.push(chunk);
26+ }
27+
128diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts
229index c175034f96..de7e29906a 100644
330--- a/src/vs/editor/browser/services/openerService.ts
@@ -311,6 +338,36 @@ index 8e1b68eb36..2b6a0d5b15 100644
311338+ return true;
312339+ }
313340+ }
341+ diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts
342+ index 2054ceece3..f99dfd0b73 100644
343+ --- a/src/vs/workbench/browser/dnd.ts
344+ +++ b/src/vs/workbench/browser/dnd.ts
345+ @@ -31,6 +31,7 @@ import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsSe
346+ import { IRecentFile } from 'vs/platform/history/common/history';
347+ import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
348+ import { withNullAsUndefined } from 'vs/base/common/types';
349+ + import { IUploadService } from 'vs/server/src/upload';
350+
351+ export interface IDraggedResource {
352+ resource: URI;
353+ @@ -166,14 +167,15 @@ export class ResourcesDropHandler {
354+ @IUntitledEditorService private readonly untitledEditorService: IUntitledEditorService,
355+ @IEditorService private readonly editorService: IEditorService,
356+ @IConfigurationService private readonly configurationService: IConfigurationService,
357+ - @IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService
358+ + @IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,
359+ + @IUploadService private readonly uploadService: IUploadService,
360+ ) {
361+ }
362+
363+ async handleDrop(event: DragEvent, resolveTargetGroup: () => IEditorGroup | undefined, afterDrop: (targetGroup: IEditorGroup | undefined) => void, targetIndex?: number): Promise<void> {
364+ const untitledOrFileResources = extractResources(event).filter(r => this.fileService.canHandleResource(r.resource) || r.resource.scheme === Schemas.untitled);
365+ if (!untitledOrFileResources.length) {
366+ - return;
367+ + return this.uploadService.handleDrop(event, resolveTargetGroup, afterDrop, targetIndex);
368+ }
369+
370+ // Make the window active to handle the drop properly within
314371diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts
315372index 1986fb6642..1bf169a4b4 100644
316373--- a/src/vs/workbench/browser/web.main.ts
@@ -357,10 +414,10 @@ index 1986fb6642..1bf169a4b4 100644
357414\ No newline at end of file
358415+ }
359416diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts
360- index b253e573ae..bde667d045 100644
417+ index b253e573ae..e23d9c970e 100644
361418--- a/src/vs/workbench/browser/web.simpleservices.ts
362419+++ b/src/vs/workbench/browser/web.simpleservices.ts
363- @@ -53,6 +53,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
420+ @@ -53,6 +53,14 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
364421 import { ParsedArgs } from 'vs/platform/environment/common/environment';
365422 import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings';
366423 import { IProcessEnvironment } from 'vs/base/common/platform';
@@ -369,10 +426,13 @@ index b253e573ae..bde667d045 100644
369426+ import { ExtensionGalleryChannelClient } from 'vs/platform/extensionManagement/node/extensionGalleryIpc';
370427+ import { TelemetryChannelClient } from 'vs/platform/telemetry/node/telemetryIpc';
371428+ import { IProductService } from 'vs/platform/product/common/product';
429+ + import { IUploadService, UploadService } from 'vs/server/src/upload';
430+ +
431+ + registerSingleton(IUploadService, UploadService, true);
372432
373433 //#region Backup File
374434
375- @@ -125,13 +130 ,11 @@ export class SimpleClipboardService implements IClipboardService {
435+ @@ -125,13 +133 ,11 @@ export class SimpleClipboardService implements IClipboardService {
376436 writeText(text: string, type?: string): void { }
377437
378438 readText(type?: string): string {
@@ -388,7 +448,7 @@ index b253e573ae..bde667d045 100644
388448 }
389449
390450 writeFindText(text: string): void { }
391- @@ -239,7 +242 ,17 @@ export class SimpleExtensionGalleryService implements IExtensionGalleryService {
451+ @@ -239,7 +245 ,17 @@ export class SimpleExtensionGalleryService implements IExtensionGalleryService {
392452 }
393453 }
394454
@@ -407,7 +467,7 @@ index b253e573ae..bde667d045 100644
407467
408468 //#endregion
409469
410- @@ -262,7 +275 ,7 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer
470+ @@ -262,7 +278 ,7 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer
411471 checkForUpdates: any;
412472 allowedBadgeProviders: string[];
413473 }
@@ -416,7 +476,7 @@ index b253e573ae..bde667d045 100644
416476 //#endregion
417477
418478 //#region ICommentService
419- @@ -375,7 +388 ,10 @@ export class SimpleExtensionTipsService implements IExtensionTipsService {
479+ @@ -375,7 +391 ,10 @@ export class SimpleExtensionTipsService implements IExtensionTipsService {
420480 }
421481
422482 getAllIgnoredRecommendations(): { global: string[]; workspace: string[]; } {
@@ -428,7 +488,7 @@ index b253e573ae..bde667d045 100644
428488 }
429489 }
430490
431- @@ -436,7 +452 ,16 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer
491+ @@ -436,7 +455 ,16 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer
432492 }
433493 }
434494
@@ -446,7 +506,7 @@ index b253e573ae..bde667d045 100644
446506
447507 //#endregion
448508
449- @@ -680,7 +705 ,15 @@ export class SimpleTelemetryService implements ITelemetryService {
509+ @@ -680,7 +708 ,15 @@ export class SimpleTelemetryService implements ITelemetryService {
450510 }
451511 }
452512
@@ -463,7 +523,7 @@ index b253e573ae..bde667d045 100644
463523
464524 //#endregion
465525
466- @@ -1288,4 +1321 ,4 @@ class SimpleTunnelService implements ITunnelService {
526+ @@ -1288,4 +1324 ,4 @@ class SimpleTunnelService implements ITunnelService {
467527
468528 registerSingleton(ITunnelService, SimpleTunnelService);
469529
@@ -1050,6 +1110,49 @@ index c08a6e37c1..31640d7e66 100644
10501110 }
10511111 return this._extensionAllowedBadgeProviders;
10521112 }
1113+ diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts
1114+ index 88ad0027e9..17476d5f26 100644
1115+ --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts
1116+ +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts
1117+ @@ -200,7 +200,7 @@ configurationRegistry.registerConfiguration({
1118+ 'files.exclude': {
1119+ 'type': 'object',
1120+ 'markdownDescription': nls.localize('exclude', "Configure glob patterns for excluding files and folders. For example, the files explorer decides which files and folders to show or hide based on this setting. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)."),
1121+ - 'default': { '**/.git': true, '**/.svn': true, '**/.hg': true, '**/CVS': true, '**/.DS_Store': true },
1122+ + 'default': { '**/.git': true, '**/.svn': true, '**/.hg': true, '**/CVS': true, '**/.DS_Store': true, '**/.code-server-partial-upload-*': true },
1123+ 'scope': ConfigurationScope.RESOURCE,
1124+ 'additionalProperties': {
1125+ 'anyOf': [
1126+ diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts
1127+ index 4592b3918e..346292d086 100644
1128+ --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts
1129+ +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts
1130+ @@ -46,6 +46,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic
1131+ import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces';
1132+ import { findValidPasteFileTarget } from 'vs/workbench/contrib/files/browser/fileActions';
1133+ import { FuzzyScore, createMatches } from 'vs/base/common/filters';
1134+ + import { IUploadService } from 'vs/server/src/upload';
1135+
1136+ export class ExplorerDelegate implements IListVirtualDelegate<ExplorerItem> {
1137+
1138+ @@ -453,7 +454,8 @@ export class FileDragAndDrop implements ITreeDragAndDrop<ExplorerItem> {
1139+ @IInstantiationService private instantiationService: IInstantiationService,
1140+ @ITextFileService private textFileService: ITextFileService,
1141+ @IWindowService private windowService: IWindowService,
1142+ - @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService
1143+ + @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService,
1144+ + @IUploadService private readonly uploadService: IUploadService,
1145+ ) {
1146+ this.toDispose = [];
1147+
1148+ @@ -615,6 +617,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop<ExplorerItem> {
1149+
1150+
1151+ private async handleExternalDrop(data: DesktopDragAndDropData, target: ExplorerItem, originalEvent: DragEvent): Promise<void> {
1152+ + return this.uploadService.handleExternalDrop(data, target, originalEvent);
1153+ const droppedResources = extractResources(originalEvent, true);
1154+ // Check for dropped external files to be folders
1155+ const result = await this.fileService.resolveAll(droppedResources);
10531156diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts
10541157index 9235c739fb..32d203eb32 100644
10551158--- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts
@@ -1148,6 +1251,35 @@ index 611ab9aec9..4e4bea89be 100644
11481251- registerSingleton(IExtensionManagementServerService, ExtensionManagementServerService);
11491252\ No newline at end of file
11501253+ registerSingleton(IExtensionManagementServerService, ExtensionManagementServerService);
1254+ diff --git a/src/vs/workbench/services/files/common/fileService.ts b/src/vs/workbench/services/files/common/fileService.ts
1255+ index a788aadc1f..09e6947fb7 100644
1256+ --- a/src/vs/workbench/services/files/common/fileService.ts
1257+ +++ b/src/vs/workbench/services/files/common/fileService.ts
1258+ @@ -859,7 +859,7 @@ export class FileService extends Disposable implements IFileService {
1259+ let posInFile = 0;
1260+
1261+ let chunk: VSBuffer | null;
1262+ - while (chunk = readable.read()) {
1263+ + while (chunk = await readable.read()) {
1264+ await this.doWriteBuffer(provider, handle, chunk, chunk.byteLength, posInFile, 0);
1265+
1266+ posInFile += chunk.byteLength;
1267+ @@ -888,7 +888,7 @@ export class FileService extends Disposable implements IFileService {
1268+ if (bufferOrReadable instanceof VSBuffer) {
1269+ buffer = bufferOrReadable;
1270+ } else {
1271+ - buffer = readableToBuffer(bufferOrReadable);
1272+ + buffer = await readableToBuffer(bufferOrReadable);
1273+ }
1274+
1275+ return provider.writeFile(resource, buffer.buffer, { create: true, overwrite: true });
1276+ @@ -1026,4 +1026,4 @@ export class FileService extends Disposable implements IFileService {
1277+ }
1278+
1279+ //#endregion
1280+ - }
1281+ \ No newline at end of file
1282+ + }
11511283diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts
11521284index c28adc0ad9..4517c308da 100644
11531285--- a/src/vs/workbench/workbench.web.main.ts
0 commit comments