Exemplo n.º 1
0
        public void queueWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Server            server      = (Server)e.Argument;
            Queue <QueueItem> ps4PkgQueue = new Queue <QueueItem>();

            ps4PkgList.Where(pkg => pkg.TaskType == Enums.TaskType.Queued).ToList().ForEach(p => ps4PkgQueue.Enqueue(p));
            int       totalQueue = ps4PkgQueue.Count;
            Stopwatch stopwatch  = new Stopwatch();

            stopwatch.Start();
            while (ps4PkgQueue.Count > 0)
            {
                this.labelProgressNotify.InvokeIfRequired(() => labelProgressNotify.Text = $"Items left in queue {ps4PkgQueue.Count} of {totalQueue}");
                var queueItem = ps4PkgQueue.Dequeue();

                try {
                    bool        checkedPrereqs = false;
                    PkgTransfer pkgTransfer    = new PkgTransfer(queueItem, queueBackgroundWorker, fileRenameService, server);
                    while (!queueBackgroundWorker.CancellationPending)
                    {
                        if (!checkedPrereqs)
                        {
                            if (SanitizePathNeeded(queueItem.PkgInfo, out var renameInfo))
                            {
                                queueItem.FileRenameInfo = renameInfo;
                                if (!fileRenameService.Rename(renameInfo))
                                {
                                    throw new SkipItemException(Enums.TaskType.Failed, "Failed to sanitize file. Rename this file manually and re-add to the sender.");
                                }
                                queueItem.PkgInfo.FilePath = renameInfo.CurrentPath;
                            }
                            checkedPrereqs = true;
                        }

                        if (!server.IsRunning)
                        {
                            server.StartServer(queueItem.PkgInfo);
                        }

                        var transferProgress = pkgTransfer.Transfer();

                        if (transferProgress.TimeLeft > 0)
                        {
                            this.progressBar1.InvokeIfRequired(() => progressBar1.ExtraText = $" ({transferProgress.TimeLeft})");
                        }

                        if (transferProgress.TransferStatus == Enums.TransferStatus.Completed)
                        {
                            progressBar1.InvokeIfRequired(() => progressBar1.ResetProgressBar());
                            queueItem.UpdateTask(Enums.TaskType.Finished, queueItem.Uninstall ? "Uninstalled" : "Installed", listViewItemsQueue);
                            server.StopServer();

                            System.Threading.Thread.Sleep(1000); //Sleep some seconds so we don't piss the server off
                            break;
                        }

                        System.Threading.Thread.Sleep(500);
                    }
                }  catch (SkipItemException ex) {
                    //Skip Item
                    queueItem.UpdateTask(ex.TaskType, ex.Message, listViewItemsQueue);
                    server.StopServer();
                }catch (ServerInitializationException ex) {
                    queueItem.UpdateTask(Enums.TaskType.Failed, $"Failed to initialize server - {ex.Message}", listViewItemsQueue);
                }

                if (queueItem.FileRenameInfo != null)
                {
                    //Queue the file to the service, so we can rename it to the old filename
                    fileRenameService.FileRenameQueue.Enqueue(queueItem.FileRenameInfo);
                }
            }

            if (!queueBackgroundWorker.CancellationPending)
            {
                this.labelProgressNotify.InvokeIfRequired(() => labelProgressNotify.Text = $"All Done!");
                this.InvokeIfRequired(() => buttonProcessQueue_Click(null, null));
            }
            else
            {
                this.labelProgressNotify.InvokeIfRequired(() => labelProgressNotify.Text = $"Items left in queue {ps4PkgQueue.Count} of {totalQueue}");
            }
            server.StopServer();
            connected = false;
        }