예제 #1
0
 public BackupProgressEventArgs(OperationProgressDetails details, long bytesPending, long bytesComplete, int operationsPending, int operationsComplete)
 {
     this.OperationDetails = details;
     this.BytesPending = bytesPending;
     this.BytesComplete = bytesComplete;
     this.OperationsPending = operationsPending;
     this.OperationsComplete = operationsComplete;
 }
예제 #2
0
        private void Manager_ProgressMade(object sender, OperationProgressDetails progress)
        {
            BackupProgressEventArgs args = new BackupProgressEventArgs(progress, manager.BytesPending, manager.BytesProcessed, manager.OperationsPending, manager.OperationsProcessed);
            OnBackupProgress(args);

            if (scanComplete && manager.OperationsPending == 0)
            {
                manager.Dispose();
                OnComplete();
            }
        }
예제 #3
0
 private void Worker_ProgressMade(object sender, OperationProgressDetails progress)
 {
     if (progress.Completed)
     {
         ((OperationWorker)sender).Dispose();
         OnComplete();
     }
     else
     {
         OnBackupProgress(new BackupProgressEventArgs(progress, progress.BytesPending, progress.BytesProcessed, 1, 0));
     }
 }
예제 #4
0
        private void ProcessOperation(IOOperation operation)
        {
            lock (statLock)
                bytesPending -= operation.EffectiveFileSize;

            try
            {
                //Copy operations get some special callbacks and tracking
                OngoingOperation progressOp = operation as OngoingOperation;
                if (progressOp != null)
                {
                    IOProgressCallback copyCall = new IOProgressCallback((pending, transferred, sourceFile, destinationFile) => {
                        OperationProgressDetails details = new OperationProgressDetails(operation, transferred, pending);
                        activeOperations[operation] = details;
                        OnProgress(details);

                        //TODO: potentially add in-file pause to this? Right now we only support one in-file operation: cancel.
                        if (State == OperationState.Terminated)
                            return IOProgressResult.PROGRESS_CANCEL;
                        else
                            return IOProgressResult.PROGRESS_CONTINUE;
                    });
                    progressOp.DoOperation(copyCall);
                }
                else
                {
                    operation.DoOperation();
                }
            }
            catch (Exception e) //We're catching everything (*gasp!*) so we can bubble it up without blowing up stacks of threads.
            {
                OnProgress(new OperationProgressDetails(operation, e));
            }
            finally
            {
                lock(statLock)
                {
                    if (operation.EffectiveFileSize > 0 && activeOperations.ContainsKey(operation))
                        activeOperations.Remove(operation);

                    bytesProcessed += operation.EffectiveFileSize;
                    operationsProcessed += 1;
                }

                //Notify the caller that the operation has completed
                OnProgress(new OperationProgressDetails(operation, true));
            }
        }
예제 #5
0
 private void OnProgress(OperationProgressDetails details)
 {
     OperationProgressHandler handler;
     lock (eventLock)
     {
         handler = progressHandler;
     }
     if (handler != null)
     {
         handler(this, details);
     }
 }
예제 #6
0
 private void Worker_ProgressMade(object sender, OperationProgressDetails progress)
 {
     OnProgress(progress);
 }