internal bool UploadFile(string name, string mimeType, string parentId, Stream fileStream,
                                 IProgress <long> progress, Func <int, bool> shouldAbort)
        {
            var fileMetadata = new File
            {
                Name     = name,
                MimeType = mimeType,
                Parents  = new List <string> {
                    parentId
                }
            };

            FilesResource.CreateMediaUpload request =
                _driveService.Files.Create(fileMetadata, fileStream, fileMetadata.MimeType);
            request.Fields = "id";
            if (progress != null)
            {
                request.ProgressChanged += u => progress.Report(u.BytesSent);
            }

            IUploadProgress uploadProgress = request.Upload();

            int currentTry = 0;

            while (uploadProgress.Status != UploadStatus.Completed)
            {
                if (!shouldAbort(currentTry))
                {
                    return(false);
                }
                ++currentTry;
                request.Resume();
            }
            return(true);
        }