示例#1
0
        /// <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));
        }
示例#2
0
        /// <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)));
        }
示例#3
0
        /// <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)));
        }
示例#4
0
        /// <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));
            }
        }
示例#5
0
        /// <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);
        }
示例#6
0
        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);
        }
示例#7
0
        /// <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);
        }
示例#8
0
        /// <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);
        }
示例#9
0
        /// <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));
        }
示例#10
0
        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);
        }