Пример #1
0
        private void ButtonClick(object sender, RoutedEventArgs e)
        {
            var button = (Button)sender;

            switch (button.Name)
            {
            case "Retry":
                Result = new TransferErrorDialogResult(ErrorResolutionBehavior.Retry);
                break;

            case "Skip":
                Result = new TransferErrorDialogResult(ErrorResolutionBehavior.Skip);
                break;

            case "SkipAll":
                Result = new TransferErrorDialogResult(ErrorResolutionBehavior.Skip, CopyActionScope.All);
                break;

            case "Cancel":
                Result = new TransferErrorDialogResult(ErrorResolutionBehavior.Cancel);
                break;
            }
            DialogResult = true;
            Close();
        }
        public void InitializeTransfer(Queue <QueueItem> queue, FileOperation mode)
        {
            _queue = queue;
            _paneCache.Clear();
            _isPaused                    = false;
            _isAborted                   = false;
            _isContinued                 = false;
            _deleteAll                   = false;
            _skipAll                     = null;
            UserAction                   = mode;
            TransferAction               = mode == FileOperation.Copy ? GetCopyActionText() : Resx.ResourceManager.GetString(mode.ToString());
            _rememberedCopyAction        = CopyAction.CreateNew;
            _currentFileBytesTransferred = 0;
            CurrentFileProgress          = 0;
            FilesTransferred             = 0;
            FileCount                    = _queue.Count;
            BytesTransferred             = 0;
            TotalBytes                   = _queue.Where(item => item.FileSystemItem.Type == ItemType.File).Sum(item => item.FileSystemItem.Size ?? 0);
            Speed         = 0;
            ElapsedTime   = new TimeSpan(0);
            RemainingTime = new TimeSpan(0);

            WorkHandler.Run(BeforeTransferStart, BeforeTransferStartCallback);
        }
        internal TransferErrorDialogResult ShowCorrespondingErrorDialog(Exception exception, bool feedbackNeeded = true)
        {
            var transferException = exception as TransferException;
            var exceptionType     = transferException != null ? transferException.Type : TransferErrorType.NotSpecified;

            _elapsedTimeMeter.Stop();

            var result = new TransferErrorDialogResult(ErrorResolutionBehavior.Cancel);

            switch (exceptionType)
            {
            case TransferErrorType.NotSpecified:
            {
                if (feedbackNeeded)
                {
                    result = _skipAll ?? WindowManager.ShowIoErrorDialog(exception);
                }
                else
                {
                    WindowManager.ShowMessage(Resx.IOError, exception.Message);
                }
            }
            break;

            case TransferErrorType.WriteAccessError:
            case TransferErrorType.NotSupporterCharactersInPath:
            case TransferErrorType.NameIsTooLong:
            case TransferErrorType.PathIsTooLong:
            {
                if (_skipAll != null)
                {
                    result = _skipAll;
                }
                else
                {
                    if (_queue == null)
                    {
                        WindowManager.ShowMessage(Resx.IOError, exception.Message);
                    }
                    else
                    {
                        var sourceFile = _queue.Peek().FileSystemItem;
                        var viewModel  = WindowManager.GetWriteErrorDialogViewModel(transferException);
                        if (exceptionType == TransferErrorType.WriteAccessError)
                        {
                            if (IsResumeSupported && sourceFile.Size > transferException.TargetFileSize)
                            {
                                viewModel.IsResumeEnabled    = true;
                                viewModel.IsResumeAllEnabled = true;
                            }
                            if (transferException.TargetFile != null)
                            {
                                TargetPane.GetItemViewModel(transferException.TargetFile);
                            }
                        }
                        SourcePane.GetItemViewModel(sourceFile.Path);
                        result = WindowManager.ShowWriteErrorDialog(viewModel);
                    }
                }
            }
            break;

            case TransferErrorType.LostConnection:
                var ftp = (FtpContentViewModel)transferException.Pane;
                if (WindowManager.ShowReconnectionDialog(exception) == true)
                {
                    try
                    {
                        ftp.RestoreConnection();
                        ftp.Refresh(false);
                    }
                    catch (Exception ex)
                    {
                        WindowManager.ShowMessage(Resx.ConnectionFailed, string.Format(Resx.CannotReestablishConnection, ex.Message));
                        ftp.CloseCommand.Execute();
                    }
                }
                else
                {
                    ftp.CloseCommand.Execute();
                }
                break;

            default:
                throw new NotSupportedException("Invalid transfer error type: " + exceptionType);
            }

            //TODO: refactor scoping
            if (result.Scope == CopyActionScope.All)
            {
                if (result.Action.HasValue)
                {
                    _rememberedCopyAction = result.Action.Value;
                }
                if (result.Behavior == ErrorResolutionBehavior.Skip)
                {
                    _skipAll = result;
                }
            }
            _elapsedTimeMeter.Start();
            return(result);
        }