using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Security.Permissions; using Umbraco.Core.Models; namespace Umbraco.Core.Events { /// /// Used as a base class for the generic type CancellableObjectEventArgs{T} so that we can get direct 'object' access to the underlying EventObject /// [HostProtection(SecurityAction.LinkDemand, SharedState = true)] public abstract class CancellableObjectEventArgs : CancellableEventArgs { protected CancellableObjectEventArgs(object eventObject, bool canCancel, EventMessages messages, IDictionary additionalData) : base(canCancel, messages, additionalData) { EventObject = eventObject; } protected CancellableObjectEventArgs(object eventObject, bool canCancel, EventMessages eventMessages) : base(canCancel, eventMessages) { EventObject = eventObject; } protected CancellableObjectEventArgs(object eventObject, EventMessages eventMessages) : this(eventObject, true, eventMessages) { } protected CancellableObjectEventArgs(object eventObject, bool canCancel) : base(canCancel) { EventObject = eventObject; } protected CancellableObjectEventArgs(object eventObject) : this(eventObject, true) { } /// /// Returns the object relating to the event /// /// /// This is protected so that inheritors can expose it with their own name /// internal object EventObject { get; set; } } /// /// Event args for a strongly typed object that can support cancellation /// /// [HostProtection(SecurityAction.LinkDemand, SharedState = true)] public class CancellableObjectEventArgs : CancellableObjectEventArgs, IEquatable> { public CancellableObjectEventArgs(T eventObject, bool canCancel, EventMessages messages, IDictionary additionalData) : base(eventObject, canCancel, messages, additionalData) { } public CancellableObjectEventArgs(T eventObject, bool canCancel, EventMessages eventMessages) : base(eventObject, canCancel, eventMessages) { } public CancellableObjectEventArgs(T eventObject, EventMessages eventMessages) : base(eventObject, eventMessages) { } public CancellableObjectEventArgs(T eventObject, bool canCancel) : base(eventObject, canCancel) { } public CancellableObjectEventArgs(T eventObject) : base(eventObject) { } /// /// Returns the object relating to the event /// /// /// This is protected so that inheritors can expose it with their own name /// protected new T EventObject { get { return (T) base.EventObject; } set { base.EventObject = value; } } public bool Equals(CancellableObjectEventArgs other) { if (other is null) return false; if (ReferenceEquals(this, other)) return true; return base.Equals(other) && EqualityComparer.Default.Equals(EventObject, other.EventObject); } public override bool Equals(object obj) { if (obj is null) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != this.GetType()) return false; return Equals((CancellableObjectEventArgs)obj); } public override int GetHashCode() { unchecked { return (base.GetHashCode() * 397) ^ EqualityComparer.Default.GetHashCode(EventObject); } } public static bool operator ==(CancellableObjectEventArgs left, CancellableObjectEventArgs right) { return Equals(left, right); } public static bool operator !=(CancellableObjectEventArgs left, CancellableObjectEventArgs right) { return !Equals(left, right); } } [HostProtection(SecurityAction.LinkDemand, SharedState = true)] public class CancellableEnumerableObjectEventArgs : CancellableObjectEventArgs>, IEquatable> { public CancellableEnumerableObjectEventArgs(IEnumerable eventObject, bool canCancel, EventMessages messages, IDictionary additionalData) : base(eventObject, canCancel, messages, additionalData) { } public CancellableEnumerableObjectEventArgs(IEnumerable eventObject, bool canCancel, EventMessages eventMessages) : base(eventObject, canCancel, eventMessages) { } public CancellableEnumerableObjectEventArgs(IEnumerable eventObject, EventMessages eventMessages) : base(eventObject, eventMessages) { } public CancellableEnumerableObjectEventArgs(IEnumerable eventObject, bool canCancel) : base(eventObject, canCancel) { } public CancellableEnumerableObjectEventArgs(IEnumerable eventObject) : base(eventObject) { } public bool Equals(CancellableEnumerableObjectEventArgs other) { if (other is null) return false; if (ReferenceEquals(this, other)) return true; return EventObject.SequenceEqual(other.EventObject); } public override bool Equals(object obj) { if (obj is null) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != this.GetType()) return false; return Equals((CancellableEnumerableObjectEventArgs)obj); } public override int GetHashCode() { return HashCodeHelper.GetHashCode(EventObject); } } }