private static bool Equal(EventHandler?key, Delegate?otherKey)
 {
     return(ReferenceEquals(key?.Target, otherKey?.Target) &&
            ReferenceEquals(key?.GetMethodInfo(), otherKey?.GetMethodInfo()));
 }
示例#2
0
 public static void FastStart(this EventHandler?Handler, object Sender, EventArgs e) => Handler?.Invoke(Sender, e);
 private static int GetHashCode(EventHandler?key)
 {
     return(key is null
            ? _implementationDelegateType.GetHashCode()
            : HashCode.Combine(key.Target, key.GetMethodInfo()));
 }
示例#4
0
 public static void SafeInvoke(this EventHandler?handler, object?sender)
 => SafeInvoke(handler, sender, EventArgs.Empty);
示例#5
0
        /// <inheritdoc/>
        public void RaisePlaylistChanged()
        {
            EventHandler?handler = PlaylistChanged;

            handler?.Invoke(this, null);
        }
示例#6
0
 internal ClosableStream(Stream stream, EventHandler?onClose) : base(stream)
 {
     _onClose = onClose;
 }
示例#7
0
        /// <summary>
        /// Starts the job.
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task RunAsync(CancellationToken cancellationToken)
        {
            JobState = JobState.Running;
            if (CancellationToken.CanBeCanceled)
            {
                CancellationTokenSource?cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, CancellationToken);
                cancellationToken = cts.Token;
                cts.Dispose();
                cts = null;
            }
            JobStage = JobStage.Downloading;
            Exception?   exception = null;
            bool         canceled  = false;
            EventHandler?handler   = JobStarted;

            handler?.Invoke(this, null);
            DownloadContainer?  downloadContainer = null;
            List <TargetResult> completedTargets  = new List <TargetResult>(_targets.Length);
            List <SongTarget>   pendingTargets    = new List <SongTarget>(_targets.Length);

            foreach (SongTarget?target in _targets)
            {
                SongState songState = await target.CheckSongExistsAsync(Song).ConfigureAwait(false);

                if (songState != SongState.Wanted)
                {
                    completedTargets.Add(new TargetResult(target, songState, true, null));
                }
                else
                {
                    pendingTargets.Add(target);
                }
            }
            try
            {
                cancellationToken.ThrowIfCancellationRequested();
                if (string.IsNullOrEmpty(Song.Key) && Song.Hash != null && Song.Hash.Length > 0)
                {
                    SongInfoResponse?result = await WebUtils.SongInfoManager.GetSongByHashAsync(Song.Hash, cancellationToken).ConfigureAwait(false);

                    if (result.Success)
                    {
                        Song.Key = result.Song?.Key;
                    }
                }
                if (pendingTargets.Count > 0)
                {
                    _downloadJob.JobProgressChanged += _downloadJob_JobProgressChanged;
                    DownloadResult = await _downloadJob.RunAsync(cancellationToken).ConfigureAwait(false);

                    downloadContainer = DownloadResult.DownloadContainer;
                    if (DownloadResult.Exception != null)
                    {
                        throw DownloadResult.Exception;
                    }
                    if (downloadContainer != null)
                    {
                        _stageIndex = 1;
                        ReportProgress(JobProgress.CreateDownloadCompletion(CurrentProgress, DownloadResult));
                        JobStage = JobStage.TransferringToTargets;
                        // Report progress on the targets that do not want the song.
                        foreach (TargetResult?targetResult in completedTargets)
                        {
                            _stageIndex++;
                            ReportProgress(JobProgress.CreateTargetCompletion(CurrentProgress, targetResult));
                        }
                        // Transfer to targets that do want the song.
                        completedTargets.AddRange(await TransferToTargets(pendingTargets, downloadContainer, cancellationToken).ConfigureAwait(false));
                    }
                    else
                    {
                        Logger.log?.Warn($"DownloadResult has no exception, but returned a null DownloadContainer.");
                    }
                }
                else
                {
                    DownloadResult = new DownloadResult(null, DownloadResultStatus.Skipped, 0);
                    _stageIndex    = 1;
                    _downloadJob_JobProgressChanged(this, new DownloadJobProgressChangedEventArgs(DownloadJobStatus.Finished));
                    JobStage = JobStage.TransferringToTargets;
                    foreach (TargetResult?targetResult in completedTargets)
                    {
                        _stageIndex++;
                        ReportProgress(JobProgress.CreateTargetCompletion(CurrentProgress, targetResult));
                    }
                }
                TargetResult[] failedTargets = completedTargets.Where(t => !t.Success).ToArray();
                if (failedTargets.Length > 0)
                {
                    Exception?firstException = failedTargets.FirstOrDefault(t => t.Exception != null)?.Exception;
                    if (firstException != null)
                    {
                        throw firstException;
                    }
                }
                TargetResults = completedTargets.ToArray();
            }
            catch (OperationCanceledException ex)
            {
                if (TargetResults == null && completedTargets.Count > 0)
                {
                    TargetResults = completedTargets.ToArray();
                }
                else
                {
                    TargetResults = Array.Empty <TargetResult>();
                }

                canceled  = true;
                exception = ex;
                ReportProgress(JobProgress.CreateFromFault(JobProgressType.Cancellation, JobStage, CurrentProgress));
                JobState = JobState.Cancelled;
            }
            catch (Exception ex)
            {
                if (TargetResults == null && completedTargets.Count > 0)
                {
                    TargetResults = completedTargets.ToArray();
                }
                else
                {
                    TargetResults = Array.Empty <TargetResult>();
                }
                exception = ex;
                JobState  = JobState.Error;
                ReportProgress(JobProgress.CreateFromFault(JobProgressType.Error, JobStage, CurrentProgress));
            }
            finally
            {
                JobStage = JobStage.Finishing;
                try
                {
                    downloadContainer?.Dispose();
                }
                catch { }
                if (DownloadResult == null)
                {
                    // TODO: What was this for?
                }
                FinishJob(canceled, exception);
                JobFinishedAsyncCallback?asyncCallback = JobFinishedAsyncCallback;
                if (asyncCallback != null)
                {
                    await asyncCallback(Result).ConfigureAwait(false);
                }
            }
        }
示例#8
0
        private static void Slide(FrameworkElement parentContainer, FrameworkElement ctrl, int ms, bool slideIn, EventHandler?onCompleted = null)
        {
            var storyboard = new Storyboard();
            var duration   = TimeSpan.FromMilliseconds(ms);

            var height = ctrl.ActualHeight;

            var animation = new ThicknessAnimation
            {
                Duration     = new Duration(duration),
                FillBehavior = FillBehavior.Stop
            };

            if (slideIn)
            {
                animation.To   = ctrl.Margin;
                animation.From =
                    new Thickness(ctrl.Margin.Left, ctrl.Margin.Top + height, ctrl.Margin.Right, ctrl.Margin.Bottom);
            }
            else
            {
                animation.From = ctrl.Margin;
                animation.To   =
                    new Thickness(ctrl.Margin.Left, ctrl.Margin.Top + height, ctrl.Margin.Right, ctrl.Margin.Bottom);
            }

            Storyboard.SetTargetName(animation, ctrl.Name);
            Storyboard.SetTargetProperty(animation, new PropertyPath(FrameworkElement.MarginProperty));
            storyboard.Children.Add(animation);

            storyboard.Children.Add(CreateFadeAnimation(ctrl, ms, slideIn, onCompleted));

            storyboard.Begin(parentContainer);
        }
示例#9
0
        public static void DropDown(FrameworkElement parentContainer, FrameworkElement ctrl, int ms, EventHandler?onCompleted = null)
        {
            var storyboard = new Storyboard();
            var duration   = TimeSpan.FromMilliseconds(ms);

            var height = ctrl.ActualHeight;

            var animation = new ThicknessAnimation
            {
                Duration     = new Duration(duration),
                FillBehavior = FillBehavior.Stop,
                From         = new Thickness(ctrl.Margin.Left, ctrl.Margin.Top - height, ctrl.Margin.Right, ctrl.Margin.Bottom),
                To           = new Thickness(ctrl.Margin.Left, ctrl.Margin.Top, ctrl.Margin.Right, ctrl.Margin.Bottom)
            };

            Storyboard.SetTargetName(animation, ctrl.Name);
            Storyboard.SetTargetProperty(animation, new PropertyPath(FrameworkElement.MarginProperty));
            storyboard.Children.Add(animation);
            storyboard.Children.Add(CreateFadeAnimation(ctrl, ms, true, onCompleted));

            storyboard.Begin(parentContainer);
        }
示例#10
0
        private static void Fade(FrameworkElement parentContainer, FrameworkElement ctrl, int ms, bool fadeIn, EventHandler?onCompleted = null)
        {
            var storyboard = new Storyboard();

            storyboard.Children.Add(CreateFadeAnimation(ctrl, ms, fadeIn, onCompleted));
            storyboard.Begin(parentContainer);
        }
示例#11
0
        private static void Fade(FrameworkElement parentContainer, FrameworkElement?[] ctrls, int ms, bool fadeIn, EventHandler?onCompleted = null)
        {
            var storyboard = new Storyboard();

            foreach (var ctrl in ctrls)
            {
                if (ctrl != null)
                {
                    storyboard.Children.Add(CreateFadeAnimation(ctrl, ms, fadeIn));
                }
            }

            if (onCompleted != null)
            {
                storyboard.Completed += onCompleted;
            }

            storyboard.Begin(parentContainer);
        }
示例#12
0
        private static DoubleAnimation CreateFadeAnimation(FrameworkElement ctrl, int ms, bool fadeIn, EventHandler?onCompleted = null)
        {
            var duration = TimeSpan.FromMilliseconds(ms);

            var animation = new DoubleAnimation
            {
                From     = fadeIn ? 0.0 : 1.0,
                To       = fadeIn ? 1.0 : 0.0,
                Duration = new Duration(duration)
            };

            Storyboard.SetTargetName(animation, ctrl.Name);
            Storyboard.SetTargetProperty(animation, new PropertyPath(UIElement.OpacityProperty));

            if (onCompleted != null)
            {
                animation.Completed += onCompleted;
            }

            return(animation);
        }
示例#13
0
        private const int SUPPORTED = 0x01; // tagOLECMDF.OLECMDF_SUPPORTED

        /// <summary>
        /// Initializes a new instance of <see cref='System.ComponentModel.Design.MenuCommand'/>.
        /// </summary>
        public MenuCommand(EventHandler?handler, CommandID?command)
        {
            _execHandler = handler;
            CommandID    = command;
            _status      = SUPPORTED | ENABLED;
        }
示例#14
0
 public static Task InvokeAsync(this EventHandler?handler, object sender, EventArgs e) =>
 handler is null ? Task.CompletedTask : Task.Run(() => handler(sender, e));
 /// <summary>
 /// Maps handler for detachment.
 /// </summary>
 /// <param name="handler">Handler to map.</param>
 /// <returns>Mapped handler</returns>
 public TImplementationDelegate?TryMapForDetachment(EventHandler?handler)
 {
     if (handler == null || !_lookup.TryGetValue(handler, out var ctx))
     {
         return(default);
示例#16
0
        public static Storyboard Flash(FrameworkElement parentContainer, FrameworkElement ctrl, EventHandler?onCompleted = null)
        {
            var anim = CreateFadeAnimation(ctrl, FadeMs, true, onCompleted);

            anim.AutoReverse    = true;
            anim.RepeatBehavior = RepeatBehavior.Forever;

            var storyboard = new Storyboard();

            storyboard.Children.Add(anim);
            storyboard.Begin(parentContainer, true);

            return(storyboard);
        }
示例#17
0
        private static OleMenuCommand CreateMenuCommand([NotNull] IMenuCommandService mcs, int cmdId, EventHandler?invokeHandler)
        {
            var menuCommandId = new CommandID(GuidList.guidResXManager_VSIXCmdSet, cmdId);
            var menuCommand   = new OleMenuCommand(invokeHandler, menuCommandId);

            mcs.AddCommand(menuCommand);
            return(menuCommand);
        }
示例#18
0
        public static void FlashIn(FrameworkElement parentContainer, FrameworkElement ctrl, EventHandler?onCompleted = null)
        {
            var storyboard = new Storyboard();

            var anim = CreateFadeAnimation(ctrl, 350, false, onCompleted);

            anim.AutoReverse    = true;
            anim.RepeatBehavior = new RepeatBehavior(3.0);
            storyboard.Children.Add(anim);
            storyboard.Begin(parentContainer);
        }
示例#19
0
 public static void Reset()
 {
     EventHandlerCount = 0;
     event1            = null;
 }
示例#20
0
 public static void SlideOut(FrameworkElement parentContainer, FrameworkElement ctrl, int ms = 500, EventHandler?onCompleted = null)
 {
     Slide(parentContainer, ctrl, ms, false, onCompleted);
 }
示例#21
0
 public static void SafeInvoke(this EventHandler?handler)
 => SafeInvoke(handler, null, EventArgs.Empty);
示例#22
0
 public static void FadeIn(FrameworkElement parentContainer, FrameworkElement[] ctrls, EventHandler?onCompleted = null)
 {
     Fade(parentContainer, ctrls, FadeMs, true, onCompleted);
 }
示例#23
0
 public static void SafeInvoke(this EventHandler?handler, EventArgs e)
 => SafeInvoke(handler, null, e);
示例#24
0
 public static void FadeOut(FrameworkElement parentContainer, FrameworkElement ctrl, EventHandler?onCompleted = null)
 {
     Fade(parentContainer, ctrl, FadeMs, false, onCompleted);
 }
示例#25
0
 public static void Raise(this EventHandler?handler, object sender)
 {
     handler?.Invoke(sender, EventArgs.Empty);
 }
示例#26
0
 public static IAsyncResult?StartAsync(this EventHandler?Handler, object Sender, EventArgs e, AsyncCallback?CallBack = null, object?State = null) =>
 Handler is null ? null : ((Action)(() => Handler.Invoke(Sender, e))).BeginInvoke(CallBack, State);