1 //-----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //-----------------------------------------------------------------------------
4 
5 namespace System.ServiceModel.Description
6 {
7     using System.IO;
8     using System.ServiceModel.Channels;
9     using System.Xml;
10     using System.Collections.Generic;
11     using System.Collections.ObjectModel;
12     using WsdlNS = System.Web.Services.Description;
13 
14     public class WsdlEndpointConversionContext
15     {
16 
17         readonly ServiceEndpoint endpoint;
18         readonly WsdlNS.Binding wsdlBinding;
19         readonly WsdlNS.Port wsdlPort;
20         readonly WsdlContractConversionContext contractContext;
21 
22         readonly Dictionary<OperationDescription, WsdlNS.OperationBinding> wsdlOperationBindings;
23         readonly Dictionary<WsdlNS.OperationBinding, OperationDescription> operationDescriptionBindings;
24         readonly Dictionary<MessageDescription, WsdlNS.MessageBinding> wsdlMessageBindings;
25         readonly Dictionary<FaultDescription, WsdlNS.FaultBinding> wsdlFaultBindings;
26         readonly Dictionary<WsdlNS.MessageBinding, MessageDescription> messageDescriptionBindings;
27         readonly Dictionary<WsdlNS.FaultBinding, FaultDescription> faultDescriptionBindings;
28 
WsdlEndpointConversionContext(WsdlContractConversionContext contractContext, ServiceEndpoint endpoint, WsdlNS.Binding wsdlBinding, WsdlNS.Port wsdlport)29         internal WsdlEndpointConversionContext(WsdlContractConversionContext contractContext, ServiceEndpoint endpoint, WsdlNS.Binding wsdlBinding, WsdlNS.Port wsdlport)
30         {
31 
32             this.endpoint = endpoint;
33             this.wsdlBinding = wsdlBinding;
34             this.wsdlPort = wsdlport;
35             this.contractContext = contractContext;
36 
37             this.wsdlOperationBindings = new Dictionary<OperationDescription, WsdlNS.OperationBinding>();
38             this.operationDescriptionBindings = new Dictionary<WsdlNS.OperationBinding, OperationDescription>();
39             this.wsdlMessageBindings = new Dictionary<MessageDescription, WsdlNS.MessageBinding>();
40             this.messageDescriptionBindings = new Dictionary<WsdlNS.MessageBinding, MessageDescription>();
41             this.wsdlFaultBindings = new Dictionary<FaultDescription, WsdlNS.FaultBinding>();
42             this.faultDescriptionBindings = new Dictionary<WsdlNS.FaultBinding, FaultDescription>();
43         }
44 
WsdlEndpointConversionContext(WsdlEndpointConversionContext bindingContext, ServiceEndpoint endpoint, WsdlNS.Port wsdlport)45         internal WsdlEndpointConversionContext(WsdlEndpointConversionContext bindingContext, ServiceEndpoint endpoint, WsdlNS.Port wsdlport)
46         {
47 
48             this.endpoint = endpoint;
49             this.wsdlBinding = bindingContext.WsdlBinding;
50             this.wsdlPort = wsdlport;
51             this.contractContext = bindingContext.contractContext;
52 
53             this.wsdlOperationBindings = bindingContext.wsdlOperationBindings;
54             this.operationDescriptionBindings = bindingContext.operationDescriptionBindings;
55             this.wsdlMessageBindings = bindingContext.wsdlMessageBindings;
56             this.messageDescriptionBindings = bindingContext.messageDescriptionBindings;
57             this.wsdlFaultBindings = bindingContext.wsdlFaultBindings;
58             this.faultDescriptionBindings = bindingContext.faultDescriptionBindings;
59         }
60 
61         internal IEnumerable<IWsdlExportExtension> ExportExtensions
62         {
63             get
64             {
65                 foreach (IWsdlExportExtension extension in endpoint.Behaviors.FindAll<IWsdlExportExtension>())
66                 {
67                     yield return extension;
68                 }
69 
70                 foreach (IWsdlExportExtension extension in endpoint.Binding.CreateBindingElements().FindAll<IWsdlExportExtension>())
71                 {
72                     yield return extension;
73                 }
74 
75                 foreach (IWsdlExportExtension extension in endpoint.Contract.Behaviors.FindAll<IWsdlExportExtension>())
76                 {
77                     yield return extension;
78                 }
79 
80                 foreach (OperationDescription operation in endpoint.Contract.Operations)
81                 {
82                     if (!WsdlExporter.OperationIsExportable(operation))
83                     {
84                         continue;
85                     }
86 
87                     // In 3.0SP1, the DCSOB and XSOB were moved from before to after the custom behaviors.  For
88                     // IWsdlExportExtension compat, run them in the pre-SP1 order.
89                     // TEF QFE 367607
90                     Collection<IWsdlExportExtension> extensions = operation.Behaviors.FindAll<IWsdlExportExtension>();
91                     for (int i = 0; i < extensions.Count;)
92                     {
93                         if (WsdlExporter.IsBuiltInOperationBehavior(extensions[i]))
94                         {
95                             yield return extensions[i];
96                             extensions.RemoveAt(i);
97                         }
98                         else
99                         {
100                             i++;
101                         }
102                     }
103                     foreach (IWsdlExportExtension extension in extensions)
104                     {
105                         yield return extension;
106                     }
107                 }
108             }
109         }
110 
111         public ServiceEndpoint Endpoint { get { return endpoint; } }
112         public WsdlNS.Binding WsdlBinding { get { return wsdlBinding; } }
113         public WsdlNS.Port WsdlPort { get { return wsdlPort; } }
114         public WsdlContractConversionContext ContractConversionContext { get { return contractContext; } }
115 
GetOperationBinding(OperationDescription operation)116         public WsdlNS.OperationBinding GetOperationBinding(OperationDescription operation)
117         {
118             return this.wsdlOperationBindings[operation];
119         }
120 
GetMessageBinding(MessageDescription message)121         public WsdlNS.MessageBinding GetMessageBinding(MessageDescription message)
122         {
123             return this.wsdlMessageBindings[message];
124         }
125 
GetFaultBinding(FaultDescription fault)126         public WsdlNS.FaultBinding GetFaultBinding(FaultDescription fault)
127         {
128             return this.wsdlFaultBindings[fault];
129         }
130 
GetOperationDescription(WsdlNS.OperationBinding operationBinding)131         public OperationDescription GetOperationDescription(WsdlNS.OperationBinding operationBinding)
132         {
133             return this.operationDescriptionBindings[operationBinding];
134         }
135 
GetMessageDescription(WsdlNS.MessageBinding messageBinding)136         public MessageDescription GetMessageDescription(WsdlNS.MessageBinding messageBinding)
137         {
138             return this.messageDescriptionBindings[messageBinding];
139         }
140 
GetFaultDescription(WsdlNS.FaultBinding faultBinding)141         public FaultDescription GetFaultDescription(WsdlNS.FaultBinding faultBinding)
142         {
143             return this.faultDescriptionBindings[faultBinding];
144         }
145 
146         // --------------------------------------------------------------------------------------------------
147 
AddOperationBinding(OperationDescription operationDescription, WsdlNS.OperationBinding wsdlOperationBinding)148         internal void AddOperationBinding(OperationDescription operationDescription, WsdlNS.OperationBinding wsdlOperationBinding)
149         {
150             this.wsdlOperationBindings.Add(operationDescription, wsdlOperationBinding);
151             this.operationDescriptionBindings.Add(wsdlOperationBinding, operationDescription);
152         }
153 
AddMessageBinding(MessageDescription messageDescription, WsdlNS.MessageBinding wsdlMessageBinding)154         internal void AddMessageBinding(MessageDescription messageDescription, WsdlNS.MessageBinding wsdlMessageBinding)
155         {
156             this.wsdlMessageBindings.Add(messageDescription, wsdlMessageBinding);
157             this.messageDescriptionBindings.Add(wsdlMessageBinding, messageDescription);
158         }
159 
AddFaultBinding(FaultDescription faultDescription, WsdlNS.FaultBinding wsdlFaultBinding)160         internal void AddFaultBinding(FaultDescription faultDescription, WsdlNS.FaultBinding wsdlFaultBinding)
161         {
162             this.wsdlFaultBindings.Add(faultDescription, wsdlFaultBinding);
163             this.faultDescriptionBindings.Add(wsdlFaultBinding, faultDescription);
164         }
165     }
166 
167 }
168