public override bool IsSubsetOf(IPermission target)
        {
            if (target == null)
            {
                return(false);
            }
            if (!(target is MessageQueuePermission))
            {
                throw new ArgumentException(Res.GetString("InvalidParameter", new object[] { "target", target.ToString() }));
            }
            MessageQueuePermission permission = (MessageQueuePermission)target;

            if (!permission.IsUnrestricted())
            {
                IDictionaryEnumerator enumerator;
                if (this.IsUnrestricted())
                {
                    return(false);
                }
                this.ResolveFormatNames();
                permission.ResolveFormatNames();
                if (((this.resolvedFormatNames.Count == 0) && (permission.resolvedFormatNames.Count != 0)) || ((this.resolvedFormatNames.Count != 0) && (permission.resolvedFormatNames.Count == 0)))
                {
                    return(false);
                }
                if (permission.resolvedFormatNames.ContainsKey("*"))
                {
                    MessageQueuePermissionAccess access = (MessageQueuePermissionAccess)permission.resolvedFormatNames["*"];
                    enumerator = this.resolvedFormatNames.GetEnumerator();
                    while (enumerator.MoveNext())
                    {
                        MessageQueuePermissionAccess access2 = (MessageQueuePermissionAccess)enumerator.Value;
                        if ((access2 & access) != access2)
                        {
                            return(false);
                        }
                    }
                    return(true);
                }
                enumerator = this.resolvedFormatNames.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    string key = (string)enumerator.Key;
                    if (!permission.resolvedFormatNames.ContainsKey(key))
                    {
                        return(false);
                    }
                    MessageQueuePermissionAccess access3 = (MessageQueuePermissionAccess)enumerator.Value;
                    MessageQueuePermissionAccess access4 = (MessageQueuePermissionAccess)permission.resolvedFormatNames[key];
                    if ((access3 & access4) != access3)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
        /// <include file='doc\MessageQueuePermission.uex' path='docs/doc[@for="MessageQueuePermission.Intersect"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public override IPermission Intersect(IPermission target)
        {
            if (target == null)
            {
                return(null);
            }

            if (!(target is MessageQueuePermission))
            {
                throw new ArgumentException(Res.GetString(Res.InvalidParameter, "target", target.ToString()));
            }

            MessageQueuePermission targetQueuePermission = (MessageQueuePermission)target;

            if (this.IsUnrestricted())
            {
                return(targetQueuePermission.Copy());
            }

            if (targetQueuePermission.IsUnrestricted())
            {
                return(this.Copy());
            }

            this.ResolveFormatNames();
            targetQueuePermission.ResolveFormatNames();
            MessageQueuePermission newPermission = new MessageQueuePermission();
            Hashtable newFormatNames             = new Hashtable(new CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture), new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

            newPermission.resolvedFormatNames = newFormatNames;
            IDictionaryEnumerator formatNamesEnumerator;
            Hashtable             formatNamesTable;

            if (this.resolvedFormatNames.Count < targetQueuePermission.resolvedFormatNames.Count)
            {
                formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator();
                formatNamesTable      = targetQueuePermission.resolvedFormatNames;
            }
            else
            {
                formatNamesEnumerator = targetQueuePermission.resolvedFormatNames.GetEnumerator();
                formatNamesTable      = this.resolvedFormatNames;
            }

            while (formatNamesEnumerator.MoveNext())
            {
                if (formatNamesTable.ContainsKey(formatNamesEnumerator.Key))
                {
                    string currentFormatName = (string)formatNamesEnumerator.Key;
                    MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)formatNamesEnumerator.Value;
                    MessageQueuePermissionAccess targetAccess  = (MessageQueuePermissionAccess)formatNamesTable[currentFormatName];
                    newFormatNames.Add(currentFormatName, currentAccess & targetAccess);
                }
            }

            return(newPermission);
        }
        public override IPermission Intersect(IPermission target)
        {
            IDictionaryEnumerator enumerator;
            Hashtable             resolvedFormatNames;

            if (target == null)
            {
                return(null);
            }
            if (!(target is MessageQueuePermission))
            {
                throw new ArgumentException(Res.GetString("InvalidParameter", new object[] { "target", target.ToString() }));
            }
            MessageQueuePermission permission = (MessageQueuePermission)target;

            if (this.IsUnrestricted())
            {
                return(permission.Copy());
            }
            if (permission.IsUnrestricted())
            {
                return(this.Copy());
            }
            this.ResolveFormatNames();
            permission.ResolveFormatNames();
            MessageQueuePermission permission2 = new MessageQueuePermission();
            Hashtable hashtable = new Hashtable(GetComparer());

            permission2.resolvedFormatNames = hashtable;
            if (this.resolvedFormatNames.Count < permission.resolvedFormatNames.Count)
            {
                enumerator          = this.resolvedFormatNames.GetEnumerator();
                resolvedFormatNames = permission.resolvedFormatNames;
            }
            else
            {
                enumerator          = permission.resolvedFormatNames.GetEnumerator();
                resolvedFormatNames = this.resolvedFormatNames;
            }
            while (enumerator.MoveNext())
            {
                if (resolvedFormatNames.ContainsKey(enumerator.Key))
                {
                    string key = (string)enumerator.Key;
                    MessageQueuePermissionAccess access  = (MessageQueuePermissionAccess)enumerator.Value;
                    MessageQueuePermissionAccess access2 = (MessageQueuePermissionAccess)resolvedFormatNames[key];
                    hashtable.Add(key, access & access2);
                }
            }
            return(permission2);
        }
        /// <include file='doc\MessageQueuePermission.uex' path='docs/doc[@for="MessageQueuePermission.Union"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public override IPermission Union(IPermission target)
        {
            if (target == null)
            {
                return(this.Copy());
            }

            if (!(target is MessageQueuePermission))
            {
                throw new ArgumentException(Res.GetString(Res.InvalidParameter, "target", target.ToString()));
            }

            MessageQueuePermission targetQueuePermission = (MessageQueuePermission)target;
            MessageQueuePermission newPermission         = new MessageQueuePermission();

            if (this.IsUnrestricted() || targetQueuePermission.IsUnrestricted())
            {
                newPermission.isUnrestricted = true;
                return(newPermission);
            }

            Hashtable newFormatNames = new Hashtable(new CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture), new CaseInsensitiveComparer(CultureInfo.InvariantCulture));

            this.ResolveFormatNames();
            targetQueuePermission.ResolveFormatNames();

            IDictionaryEnumerator formatNamesEnumerator       = this.resolvedFormatNames.GetEnumerator();
            IDictionaryEnumerator targetFormatNamesEnumerator = targetQueuePermission.resolvedFormatNames.GetEnumerator();

            while (formatNamesEnumerator.MoveNext())
            {
                newFormatNames[(string)formatNamesEnumerator.Key] = formatNamesEnumerator.Value;
            }

            while (targetFormatNamesEnumerator.MoveNext())
            {
                if (!newFormatNames.ContainsKey(targetFormatNamesEnumerator.Key))
                {
                    newFormatNames[targetFormatNamesEnumerator.Key] = targetFormatNamesEnumerator.Value;
                }
                else
                {
                    MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)newFormatNames[targetFormatNamesEnumerator.Key];
                    newFormatNames[targetFormatNamesEnumerator.Key] = currentAccess | (MessageQueuePermissionAccess)targetFormatNamesEnumerator.Value;
                }
            }

            newPermission.resolvedFormatNames = newFormatNames;
            return(newPermission);
        }
        public override IPermission Union(IPermission target)
        {
            if (target == null)
            {
                return(this.Copy());
            }
            if (!(target is MessageQueuePermission))
            {
                throw new ArgumentException(Res.GetString("InvalidParameter", new object[] { "target", target.ToString() }));
            }
            MessageQueuePermission permission  = (MessageQueuePermission)target;
            MessageQueuePermission permission2 = new MessageQueuePermission();

            if (this.IsUnrestricted() || permission.IsUnrestricted())
            {
                permission2.isUnrestricted = true;
                return(permission2);
            }
            Hashtable hashtable = new Hashtable(GetComparer());

            this.ResolveFormatNames();
            permission.ResolveFormatNames();
            IDictionaryEnumerator enumerator  = this.resolvedFormatNames.GetEnumerator();
            IDictionaryEnumerator enumerator2 = permission.resolvedFormatNames.GetEnumerator();

            while (enumerator.MoveNext())
            {
                hashtable[(string)enumerator.Key] = enumerator.Value;
            }
            while (enumerator2.MoveNext())
            {
                if (!hashtable.ContainsKey(enumerator2.Key))
                {
                    hashtable[enumerator2.Key] = enumerator2.Value;
                }
                else
                {
                    MessageQueuePermissionAccess access = (MessageQueuePermissionAccess)hashtable[enumerator2.Key];
                    hashtable[enumerator2.Key] = access | ((MessageQueuePermissionAccess)enumerator2.Value);
                }
            }
            permission2.resolvedFormatNames = hashtable;
            return(permission2);
        }
        /// <include file='doc\MessageQueuePermission.uex' path='docs/doc[@for="MessageQueuePermission.IsSubsetOf"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public override bool IsSubsetOf(IPermission target)
        {
            if (target == null)
            {
                return(false);
            }

            if (!(target is MessageQueuePermission))
            {
                throw new ArgumentException(Res.GetString(Res.InvalidParameter, "target", target.ToString()));
            }

            MessageQueuePermission targetQueuePermission = (MessageQueuePermission)target;

            if (targetQueuePermission.IsUnrestricted())
            {
                return(true);
            }
            else if (this.IsUnrestricted())
            {
                return(false);
            }

            this.ResolveFormatNames();
            targetQueuePermission.ResolveFormatNames();

            //If one of the tables is empty the subset cannot be resolved reliably, should assume
            //then that they are not subset of each other.
            if ((this.resolvedFormatNames.Count == 0 && targetQueuePermission.resolvedFormatNames.Count != 0) ||
                (this.resolvedFormatNames.Count != 0 && targetQueuePermission.resolvedFormatNames.Count == 0))
            {
                return(false);
            }

            //If the target table contains a wild card, all the current formatName access need to be
            //a subset of the target.
            IDictionaryEnumerator formatNamesEnumerator;

            if (targetQueuePermission.resolvedFormatNames.ContainsKey(Any))
            {
                MessageQueuePermissionAccess targetAccess = (MessageQueuePermissionAccess)targetQueuePermission.resolvedFormatNames[Any];
                formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator();
                while (formatNamesEnumerator.MoveNext())
                {
                    MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)formatNamesEnumerator.Value;
                    if ((currentAccess & targetAccess) != currentAccess)
                    {
                        return(false);
                    }
                }

                return(true);
            }

            //If the current table contains a wild card it can be treated as any other format name.
            formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator();
            while (formatNamesEnumerator.MoveNext())
            {
                string currentFormatName = (string)formatNamesEnumerator.Key;
                if (!targetQueuePermission.resolvedFormatNames.ContainsKey(currentFormatName))
                {
                    return(false);
                }
                else
                {
                    MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)formatNamesEnumerator.Value;
                    MessageQueuePermissionAccess targetAccess  = (MessageQueuePermissionAccess)targetQueuePermission.resolvedFormatNames[currentFormatName];
                    if ((currentAccess & targetAccess) != currentAccess)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }