private void UploadAllFiles(string gameName, UploadResumeReport uploadResumeReport)
        {
            long totalSizeToUpload = uploadResumeReport.RemainingFiles.Sum(x => x.UncompressedSize);

            ReportTotalBytesToUpload(gameName, totalSizeToUpload);

            BlockingCollection <IXboxTransferRequest> finishedRequests = new BlockingCollection <IXboxTransferRequest>();

            XboxTransferWorker         fileWorker1    = new XboxTransferWorker(_xboxGameRepositoryFactory, gameName, _xboxFtpRequests, finishedRequests, _notifier);
            XboxTransferWorker         fileWorker2    = new XboxTransferWorker(_xboxGameRepositoryFactory, gameName, _xboxFtpRequests, finishedRequests, _notifier);
            XboxTransferProgressWorker progressWorker = new XboxTransferProgressWorker(_xboxGameRepositoryFactory, gameName, _notifier, finishedRequests,
                                                                                       totalSizeToUpload, uploadResumeReport.SizeUploaded);

            progressWorker.Start();
            fileWorker1.Start();
            fileWorker2.Start();

            _notifier.ReportTotalFilesToTransfer(gameName, uploadResumeReport.RemainingFiles.Count);

            foreach (var zipEntry in uploadResumeReport.RemainingFiles)
            {
                WaitIfMaxOutstandingRequests();
                WaitIfMaxMemoryInQueue();

                if (zipEntry.UncompressedSize > 14572800)
                {
                    ExtractZipToDisk(zipEntry, gameName);
                }
                else
                {
                    ExtractZipToMemory(zipEntry, gameName);
                }
            }

            _notifier.WaitingForUploadsToComplete(gameName);
            WaitForRequestsToComplete();
            fileWorker1.Stop();
            fileWorker2.Stop();
        }
        private UploadResumeReport CheckForResumeUpload(string gameName, string archivePath)
        {
            IXboxGameRepository xboxGameRepository = _xboxGameRepositoryFactory.Create();

            xboxGameRepository.Connect();

            UploadResumeReport uploadResumeReport = null;

            using (IZipFile zip = _zipFileProcessor.Read(archivePath))
            {
                // Order files alphabetically to ensure we can resume interrupted uploads
                List <IZipEntry> files = zip.ReadAllFiles();

                _notifier.CheckingForUploadedFiles(gameName);

                IUploadResumeStrategy uploadResumeStrategy = new BinarySearchUploadResumeStrategy(files, _notifier, gameName, xboxGameRepository);

                uploadResumeReport = uploadResumeStrategy.GetRemainingFiles();
            }

            xboxGameRepository.Disconnect();

            return(uploadResumeReport);
        }