File: System\ServiceModel\Discovery\DefaultDiscoveryService.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Discovery\System.ServiceModel.Discovery.csproj (System.ServiceModel.Discovery)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
 
namespace System.ServiceModel.Discovery
{
    using System.Collections.ObjectModel;
    using System.Runtime;
 
    class DefaultDiscoveryService : DiscoveryService
    {
        readonly ReadOnlyCollection<EndpointDiscoveryMetadata> publishedEndpoints;
 
        public DefaultDiscoveryService(
            DiscoveryServiceExtension discoveryServiceExtension,
            DiscoveryMessageSequenceGenerator discoveryMessageSequenceGenerator,
            int duplicateMessageHistoryLength)
            : base(discoveryMessageSequenceGenerator, duplicateMessageHistoryLength)
 
        {
            Fx.Assert(discoveryServiceExtension != null, "The discoveryServiceExtension must be non null.");
            this.publishedEndpoints = discoveryServiceExtension.PublishedEndpoints;
        }
 
        protected override IAsyncResult OnBeginFind(
            FindRequestContext findRequestContext, 
            AsyncCallback callback, 
            object state)
        {
            this.Match(findRequestContext);
            return new CompletedAsyncResult(callback, state);
        }
 
        protected override void OnEndFind(IAsyncResult result)
        {
            CompletedAsyncResult.End(result);
        }
 
        protected override IAsyncResult OnBeginResolve(ResolveCriteria resolveCriteria, AsyncCallback callback, object state)
        {
            return new CompletedAsyncResult<EndpointDiscoveryMetadata>(
                this.Match(resolveCriteria),
                callback,
                state);
        }
 
        protected override EndpointDiscoveryMetadata OnEndResolve(IAsyncResult result)
        {
            return CompletedAsyncResult<EndpointDiscoveryMetadata>.End(result);
        }
 
        EndpointDiscoveryMetadata Match(ResolveCriteria criteria)
        {
            for (int i = 0; i < this.publishedEndpoints.Count; i++)
            {
                if (this.publishedEndpoints[i].Address.Equals(criteria.Address))
                {
                    return this.publishedEndpoints[i];
                }
            }
 
            return null;
        }
 
        void Match(FindRequestContext findRequestContext)
        {
            FindCriteria criteria = findRequestContext.Criteria;
 
            if (!ScopeCompiler.IsSupportedMatchingRule(criteria.ScopeMatchBy))
            {
                return;
            }
 
            CompiledScopeCriteria[] compiledScopeCriterias = ScopeCompiler.CompileMatchCriteria(
                criteria.InternalScopes, 
                criteria.ScopeMatchBy);
 
            int matchingEndpointCount = 0;
            for (int i = 0; i < this.publishedEndpoints.Count; i++)
            {
                if (criteria.IsMatch(this.publishedEndpoints[i], compiledScopeCriterias))
                {
                    findRequestContext.AddMatchingEndpoint(this.publishedEndpoints[i]);
                    matchingEndpointCount++;
 
                    if (matchingEndpointCount == criteria.MaxResults)
                    {
                        break;
                    }
                }
            }
        }
    }
}