/// <inheritdoc/> public async Task <IUnixFileSystemEntry> SetMacTimeAsync(IUnixFileSystemEntry entry, DateTimeOffset?modify, DateTimeOffset?access, DateTimeOffset?create, CancellationToken cancellationToken) { var dirEntry = entry as GoogleDriveDirectoryEntry; var fileEntry = entry as GoogleDriveFileEntry; var item = dirEntry == null ? fileEntry?.File : dirEntry.File; if (item == null) { throw new InvalidOperationException(); } var newItemValues = new File() { ModifiedDate = modify?.UtcDateTime, CreatedDate = create?.UtcDateTime, LastViewedByMeDate = access?.UtcDateTime, }; var newItem = await Service.UpdateAsync(item.Id, newItemValues, cancellationToken); var fullName = dirEntry == null ? fileEntry.FullName : dirEntry.FullName; var targetFullName = FileSystemExtensions.CombinePath(fullName.GetParentPath(), newItem.Title); if (dirEntry != null) { return(new GoogleDriveDirectoryEntry(this, newItem, targetFullName, dirEntry.IsRoot)); } return(new GoogleDriveFileEntry(this, newItem, fullName, fileEntry.Size)); }
/// <inheritdoc/> public async Task <IUnixDirectoryEntry> CreateDirectoryAsync(IUnixDirectoryEntry targetDirectory, string directoryName, CancellationToken cancellationToken) { var dirEntry = (GoogleDriveDirectoryEntry)targetDirectory; var newDir = await Service.CreateDirectoryAsync(dirEntry.File, directoryName, cancellationToken); return(new GoogleDriveDirectoryEntry(this, newDir, FileSystemExtensions.CombinePath(dirEntry.FullName, newDir.Title))); }
/// <inheritdoc/> public async Task <IUnixDirectoryEntry> CreateDirectoryAsync( IUnixDirectoryEntry targetDirectory, string directoryName, CancellationToken cancellationToken) { var dirEntry = (GoogleDriveDirectoryEntry)targetDirectory; var body = new File { Name = directoryName, Parents = new List <string>() { dirEntry.File.Id, }, }.AsDirectory(); var request = Service.Files.Create(body); request.Fields = FileExtensions.DefaultFileFields; var newDir = await request.ExecuteAsync(cancellationToken); return(new GoogleDriveDirectoryEntry( this, newDir, FileSystemExtensions.CombinePath(dirEntry.FullName, newDir.Name))); }
/// <inheritdoc/> public async Task <IUnixFileSystemEntry> MoveAsync( IUnixDirectoryEntry parent, IUnixFileSystemEntry source, IUnixDirectoryEntry target, string fileName, CancellationToken cancellationToken) { var parentEntry = (GoogleDriveDirectoryEntry)parent; var targetEntry = (GoogleDriveDirectoryEntry)target; var targetName = FileSystemExtensions.CombinePath(targetEntry.FullName, fileName); if (source is GoogleDriveFileEntry sourceFileEntry) { var newFile = await MoveItem( parentEntry.File.Id, targetEntry.File.Id, sourceFileEntry.File.Id, fileName, cancellationToken); return(new GoogleDriveFileEntry(this, newFile, targetName)); } else { var sourceDirEntry = (GoogleDriveDirectoryEntry)source; var newDir = await MoveItem( parentEntry.File.Id, targetEntry.File.Id, sourceDirEntry.File.Id, fileName, cancellationToken); return(new GoogleDriveDirectoryEntry(this, newDir, targetName)); } }
/// <inheritdoc/> public async Task <IBackgroundTransfer> CreateAsync( IUnixDirectoryEntry targetDirectory, string fileName, Stream data, CancellationToken cancellationToken) { var targetEntry = (GoogleDriveDirectoryEntry)targetDirectory; var body = new File { Name = fileName, Parents = new List <string>() { targetEntry.File.Id, }, }; var request = Service.Files.Create(body); request.Fields = FileExtensions.DefaultFileFields; var newFileEntry = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false); if (!_useBackgroundUpload) { var upload = Service.Files.Update(new File(), newFileEntry.Id, data, "application/octet-stream"); var result = await upload.UploadAsync(cancellationToken).ConfigureAwait(false); if (result.Status == UploadStatus.Failed) { throw new Exception(result.Exception.Message, result.Exception); } return(null); } var expectedSize = data.CanSeek ? data.Length : (long?)null; var tempData = await _temporaryDataFactory.CreateAsync(data, expectedSize, cancellationToken).ConfigureAwait(false); var fullPath = FileSystemExtensions.CombinePath(targetEntry.FullName, fileName); var backgroundUploads = new BackgroundUpload(fullPath, newFileEntry, tempData, this); await _uploadsLock.WaitAsync(cancellationToken).ConfigureAwait(false); try { _uploads.Add(backgroundUploads.File.Id, backgroundUploads); } finally { _uploadsLock.Release(); } return(backgroundUploads); }
private async Task <IReadOnlyList <IUnixFileSystemEntry> > ConvertEntries( GoogleDriveDirectoryEntry dirEntry, Func <Task <IReadOnlyCollection <File> > > getEntriesFunc, CancellationToken cancellationToken) { var result = new List <IUnixFileSystemEntry>(); await _uploadsLock.WaitAsync(cancellationToken).ConfigureAwait(false); try { var baseDir = dirEntry.FullName; var children = await getEntriesFunc().ConfigureAwait(false); foreach (var child in children.Where(x => !x.Trashed.GetValueOrDefault())) { var fullName = FileSystemExtensions.CombinePath(baseDir, child.Name); if (child.IsDirectory()) { result.Add(new GoogleDriveDirectoryEntry(child, fullName)); } else { long?fileSize; if (_uploads.TryGetValue(child.Id, out var uploader)) { fileSize = uploader.FileSize; } else { fileSize = null; } result.Add(new GoogleDriveFileEntry(child, fullName, fileSize)); } } } finally { _uploadsLock.Release(); } return(result); }
/// <inheritdoc/> public async Task <IBackgroundTransfer> CreateAsync(IUnixDirectoryEntry targetDirectory, string fileName, Stream data, CancellationToken cancellationToken) { var targetEntry = (GoogleDriveDirectoryEntry)targetDirectory; var newFileEntry = await Service.CreateItemAsync(targetEntry.File, fileName, cancellationToken); var tempData = await _requestFactory.CreateTemporaryData(data, cancellationToken); var fullPath = FileSystemExtensions.CombinePath(targetEntry.FullName, fileName); var backgroundUploads = new BackgroundUpload(fullPath, newFileEntry, tempData, this); await _uploadsLock.WaitAsync(cancellationToken); try { _uploads.Add(backgroundUploads.File.Id, backgroundUploads); } finally { _uploadsLock.Release(); } return(backgroundUploads); }
/// <inheritdoc/> public async Task <IBackgroundTransfer> CreateAsync( IUnixDirectoryEntry targetDirectory, string fileName, Stream data, CancellationToken cancellationToken) { var targetEntry = (GoogleDriveDirectoryEntry)targetDirectory; var body = new File { Name = fileName, Parents = new List <string>() { targetEntry.File.Id, }, }; var request = Service.Files.Create(body); request.Fields = FileExtensions.DefaultFileFields; var newFileEntry = await request.ExecuteAsync(cancellationToken); var expectedSize = data.CanSeek ? data.Length : (long?)null; var tempData = await _temporaryDataFactory.CreateAsync(data, expectedSize, cancellationToken); var fullPath = FileSystemExtensions.CombinePath(targetEntry.FullName, fileName); var backgroundUploads = new BackgroundUpload(fullPath, newFileEntry, tempData, this); await _uploadsLock.WaitAsync(cancellationToken); try { _uploads.Add(backgroundUploads.File.Id, backgroundUploads); } finally { _uploadsLock.Release(); } return(backgroundUploads); }
/// <inheritdoc/> public async Task <IUnixFileSystemEntry> SetMacTimeAsync( IUnixFileSystemEntry entry, DateTimeOffset?modify, DateTimeOffset?access, DateTimeOffset?create, CancellationToken cancellationToken) { var dirEntry = entry as GoogleDriveDirectoryEntry; var fileEntry = entry as GoogleDriveFileEntry; var item = dirEntry == null ? fileEntry?.File : dirEntry.File; if (item == null) { throw new InvalidOperationException(); } var newItemValues = new File() { ModifiedTime = modify?.UtcDateTime, CreatedTime = create?.UtcDateTime, ViewedByMeTime = access?.UtcDateTime, }; var request = Service.Files.Update(newItemValues, item.Id); request.Fields = FileExtensions.DefaultFileFields; var newItem = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false); var fullName = dirEntry == null ? fileEntry.FullName : dirEntry.FullName; var targetFullName = FileSystemExtensions.CombinePath(fullName.GetParentPath(), newItem.Name); if (dirEntry != null) { return(new GoogleDriveDirectoryEntry(newItem, targetFullName, dirEntry.IsRoot)); } return(new GoogleDriveFileEntry(newItem, fullName, fileEntry.Size)); }
private async Task <IReadOnlyList <IUnixFileSystemEntry> > ConvertEntries(GoogleDriveDirectoryEntry dirEntry, Func <Task <IReadOnlyList <File> > > getEntriesFunc, CancellationToken cancellationToken) { var result = new List <IUnixFileSystemEntry>(); await _uploadsLock.WaitAsync(cancellationToken); try { var baseDir = dirEntry.FullName; foreach (var child in (await getEntriesFunc()).Where(x => x.Labels == null || !x.Labels.Trashed)) { var fullName = FileSystemExtensions.CombinePath(baseDir, child.Title); if (child.IsDirectory()) { result.Add(new GoogleDriveDirectoryEntry(this, child, fullName)); } else { long? fileSize; BackgroundUpload uploader; if (_uploads.TryGetValue(child.Id, out uploader)) { fileSize = uploader.FileSize; } else { fileSize = null; } result.Add(new GoogleDriveFileEntry(this, child, fullName, fileSize)); } } } finally { _uploadsLock.Release(); } return(result); }