File: LocalService\MessageQueueKey.cs
Project: ndp\cdf\src\WF\Activities\System.Workflow.Activities.csproj (System.Workflow.Activities)
#pragma warning disable 1634, 1691
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
using System;
using System.Text;
using System.Workflow.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Workflow.Runtime;
 
namespace System.Workflow.Activities
{
    [Serializable]
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public sealed class EventQueueName : IComparable
    {
        Type interfaceType;
        string operation;
        CorrelationProperty[] correlationValues;
        string activityId;
 
        [NonSerialized]
        string assemblyQualifiedName;
 
        [NonSerialized]
        String stringifiedKey;
 
        private string AssemblyQualifiedName
        {
            get
            {
                if (assemblyQualifiedName == null)
                {
                    assemblyQualifiedName = this.interfaceType.AssemblyQualifiedName;
                }
                return assemblyQualifiedName;
            }
        }
 
 
        public EventQueueName(Type interfaceType, string operation)
        {
            if (interfaceType == null)
                throw new ArgumentNullException("interfaceType");
            if (operation == null)
                throw new ArgumentNullException("operation");
 
            this.interfaceType = interfaceType;
            this.operation = operation;
        }
 
        public EventQueueName(Type interfaceType, string operation, ICollection<CorrelationProperty> propertyValues)
            : this(interfaceType, operation)
        {
            if (propertyValues != null)
            {
                this.correlationValues = new CorrelationProperty[propertyValues.Count];
                propertyValues.CopyTo(this.correlationValues, 0);
            }
        }
 
        internal EventQueueName(Type interfaceType, string operation, string activityId)
            : this(interfaceType, operation)
        {
            this.activityId = activityId;
        }
 
        // properties
        public Type InterfaceType
        {
            get
            {
                return this.interfaceType;
            }
        }
 
        public string MethodName
        {
            get
            {
                return this.operation;
            }
        }
 
        public CorrelationProperty[] GetCorrelationValues()
        {
            return this.correlationValues;
        }
 
        public int CompareTo(Object toCompare)
        {
            if (toCompare is EventQueueName)
                return this.CompareTo(toCompare as EventQueueName);
            else
                return -1;
        }
 
        // IComparable implementation
        public int CompareTo(EventQueueName eventQueueName)
        {
            if (eventQueueName == null)
                return -1;
 
            // compare operation
            int compared = StringComparer.Ordinal.Compare(this.MethodName, eventQueueName.MethodName);
 
            if (compared == 0)
            {
                // compare type names
#pragma warning disable 56506
                compared = StringComparer.Ordinal.Compare(AssemblyQualifiedName, eventQueueName.AssemblyQualifiedName);
#pragma warning restore 56506
 
                if (compared == 0)
                {
                    if (this.correlationValues != null)
                    {
                        compared = (eventQueueName.correlationValues != null) ? (this.correlationValues.Length - eventQueueName.correlationValues.Length) : -1;
 
                        if (compared == 0)
                        {
                            // compare correlation values
                            for (int i = 0; i < this.correlationValues.Length; i++)
                            {
                                if (this.correlationValues[i] == null || eventQueueName.correlationValues[i] == null)
                                {
                                    compared = -1;
                                    break; // match failed
                                }
 
                                object leftValue = this.correlationValues[i].Value;
                                object rightValue = FindCorrelationValue(this.correlationValues[i].Name, eventQueueName.correlationValues);
 
#pragma warning suppress 56506
                                if (leftValue == null && rightValue == null)
                                {
                                    continue;
                                }
 
                                // do the explicit equals check
                                if (leftValue != null)
                                {
                                    IComparable comparable = leftValue as IComparable;
                                    if (comparable != null)
                                    {
                                        compared = comparable.CompareTo(rightValue);
                                        if (compared != 0)
                                        {
                                            break; // match failed
                                        }
                                    }
                                    else if ((!leftValue.Equals(rightValue)))
                                    {
                                        compared = -1;
                                        break; // match failed
                                    }
                                }
                                else
                                {
                                    compared = -1;
                                    break; // match failed
                                }
                            }
                        }
                    }
                }
            }
            return compared;
        }
 
        public override bool Equals(object obj)
        {
            EventQueueName k = obj as EventQueueName;
            //Without the cast we end up in op_Equality below
            if ((object)k == null)
                return false;
 
            return 0 == CompareTo(k);
        }
 
        public static bool operator ==(EventQueueName queueKey1, EventQueueName queueKey2)
        {
            bool equality = false;
 
            if ((object)queueKey1 != null)
            {
                if ((object)queueKey2 != null)
                {
                    equality = (0 == queueKey1.CompareTo(queueKey2));
                }
            }
            else if ((object)queueKey2 == null)
            {
                equality = true;
            }
 
            return equality;
        }
 
        public static bool operator !=(EventQueueName queueKey1, EventQueueName queueKey2)
        {
            return !(queueKey1 == queueKey2);
        }
 
        public static bool operator <(EventQueueName queueKey1, EventQueueName queueKey2)
        {
            if (queueKey1 == null)
                throw new ArgumentNullException("queueKey1");
 
            if (queueKey2 == null)
                throw new ArgumentNullException("queueKey2");
 
            return (queueKey1.CompareTo(queueKey2) < 0);
        }
 
        public static bool operator >(EventQueueName queueKey1, EventQueueName queueKey2)
        {
            if (queueKey1 == null)
                throw new ArgumentNullException("queueKey1");
 
            if (queueKey2 == null)
                throw new ArgumentNullException("queueKey2");
 
            return (queueKey1.CompareTo(queueKey2) > 0);
        }
 
        public override int GetHashCode()
        {
            if (String.IsNullOrEmpty(this.activityId))
                return (AssemblyQualifiedName.GetHashCode() ^ this.operation.GetHashCode());
 
            return (AssemblyQualifiedName.GetHashCode() ^ this.operation.GetHashCode() ^ this.activityId.GetHashCode());
        }
 
        public override string ToString()
        {
            if (stringifiedKey == null)
            {
                StringBuilder stringBuilder = new StringBuilder();
 
                stringBuilder.AppendLine("Message Properties");
                stringBuilder.AppendLine("Interface Type:" + this.interfaceType.ToString());
                stringBuilder.AppendLine("Method Name:" + this.operation.ToString());
                stringBuilder.AppendLine("CorrelationValues:");
 
                if (correlationValues != null)
                {
                    foreach (CorrelationProperty pred in correlationValues)
                    {
                        if (pred != null && pred.Value != null)
                            stringBuilder.AppendLine(pred.Value.ToString());
                    }
                }
 
                stringifiedKey = stringBuilder.ToString();
            }
 
            return stringifiedKey;
        }
 
        object FindCorrelationValue(string name, CorrelationProperty[] correlationValues)
        {
            object value = null;
            foreach (CorrelationProperty property in correlationValues)
            {
                if (property != null && property.Name == name)
                {
                    value = property.Value;
                    break;
                }
            }
 
            return value;
        }
    }
}