Candidate GetSingleMatch(CandidateSet cset, Message message)
        {
            int candiCount = cset.candidates.Count;

            if (cset.qnames.Count == 0)
            {
                if (candiCount == 0)
                {
                    return(null);
                }
                else if (candiCount == 1)
                {
                    return(cset.candidates[0]);
                }
                else
                {
                    Collection <MessageFilter> matches = new Collection <MessageFilter>();
                    for (int i = 0; i < candiCount; ++i)
                    {
                        matches.Add(cset.candidates[i].filter);
                    }
                    throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.FilterMultipleMatches, null, matches), message);
                }
            }

            EndpointAddressProcessor context = CreateProcessor(size);

            context.ProcessHeaders(message, cset.qnames, headerLookup);

            Candidate        can    = null;
            List <Candidate> candis = cset.candidates;

            for (int i = 0; i < candiCount; ++i)
            {
                if (context.TestMask(candis[i].mask))
                {
                    if (can != null)
                    {
                        Collection <MessageFilter> matches = new Collection <MessageFilter>();
                        matches.Add(can.filter);
                        matches.Add(candis[i].filter);
                        throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.FilterMultipleMatches, null, matches), message);
                    }
                    can = candis[i];
                }
            }

            ReleaseProcessor(context);

            return(can);
        }
Exemple #2
0
        internal bool Match(Message message)
        {
            if (size == 0)
            {
                return(true);
            }

            EndpointAddressProcessor context = CreateProcessor(size);

            context.ProcessHeaders(message, qnameLookup, headerLookup);
            bool result = context.TestExact(mask);

            ReleaseProcessor(context);
            return(result);
        }
        void InnerMatchFilters(Message message, ICollection <MessageFilter> results, CandidateSet cset)
        {
            EndpointAddressProcessor context = CreateProcessor(size);

            context.ProcessHeaders(message, cset.qnames, headerLookup);

            List <Candidate> candis = cset.candidates;

            for (int i = 0; i < candis.Count; ++i)
            {
                if (context.TestMask(candis[i].mask))
                {
                    results.Add(candis[i].filter);
                }
            }

            ReleaseProcessor(context);
        }