1 //
2 // StandardBindingElement.cs
3 //
4 // Author:
5 //	Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc.  http://www.novell.com
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 
29 using System;
30 using System.Collections;
31 using System.Collections.Generic;
32 using System.Collections.ObjectModel;
33 using System.ComponentModel;
34 using System.Configuration;
35 using System.Net;
36 using System.Net.Security;
37 using System.Reflection;
38 using System.Security.Cryptography.X509Certificates;
39 using System.Security.Principal;
40 using System.IdentityModel.Claims;
41 using System.IdentityModel.Policy;
42 using System.IdentityModel.Tokens;
43 using System.ServiceModel;
44 using System.ServiceModel.Channels;
45 using System.ServiceModel.Description;
46 using System.ServiceModel.Diagnostics;
47 using System.ServiceModel.Dispatcher;
48 using System.ServiceModel.MsmqIntegration;
49 using System.ServiceModel.PeerResolvers;
50 using System.ServiceModel.Security;
51 using System.Runtime.Serialization;
52 using System.Text;
53 using System.Xml;
54 
55 namespace System.ServiceModel.Configuration
56 {
57 	public abstract class StandardBindingElement
58 		 : ConfigurationElement,  IBindingConfigurationElement
59 	{
60 		ConfigurationPropertyCollection _properties;
61 
StandardBindingElement()62 		protected StandardBindingElement ()
63 		{
64 		}
65 
StandardBindingElement(string name)66 		protected StandardBindingElement (string name) {
67 			Name = name;
68 		}
69 
70 
71 		// Properties
72 		protected abstract Type BindingElementType { get;  }
73 
74 		[ConfigurationProperty ("closeTimeout",
75 			 Options = ConfigurationPropertyOptions.None,
76 			 DefaultValue = "00:01:00")]
77 		[TypeConverter (typeof (TimeSpanConverter))]
78 		public TimeSpan CloseTimeout {
79 			get { return (TimeSpan) this ["closeTimeout"]; }
80 			set { this ["closeTimeout"] = value; }
81 		}
82 
83 		[StringValidator ( MinLength = 1,
84 			MaxLength = int.MaxValue,
85 			 InvalidCharacters = null)]
86 		[ConfigurationProperty ("name",
87 			 Options = ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey,
88 			IsRequired = true,
89 			IsKey = true)]
90 		public string Name {
91 			get { return (string) this ["name"]; }
92 			set { this ["name"] = value; }
93 		}
94 
95 		[ConfigurationProperty ("openTimeout",
96 			 Options = ConfigurationPropertyOptions.None,
97 			 DefaultValue = "00:01:00")]
98 		[TypeConverter (typeof (TimeSpanConverter))]
99 		public TimeSpan OpenTimeout {
100 			get { return (TimeSpan) this ["openTimeout"]; }
101 			set { this ["openTimeout"] = value; }
102 		}
103 
104 		protected override ConfigurationPropertyCollection Properties {
105 			get {
106 				if (_properties == null) {
107 					_properties = new ConfigurationPropertyCollection ();
108 					_properties.Add (new ConfigurationProperty ("closeTimeout", typeof (TimeSpan), "00:01:00", null, null, ConfigurationPropertyOptions.None));
109 					_properties.Add (new ConfigurationProperty ("name", typeof (string), null, null, new StringValidator (1), ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey));
110 					_properties.Add (new ConfigurationProperty ("openTimeout", typeof (TimeSpan), "00:01:00", null, null, ConfigurationPropertyOptions.None));
111 					_properties.Add (new ConfigurationProperty ("receiveTimeout", typeof (TimeSpan), "00:10:00", null, null, ConfigurationPropertyOptions.None));
112 					_properties.Add (new ConfigurationProperty ("sendTimeout", typeof (TimeSpan), "00:01:00", null, null, ConfigurationPropertyOptions.None));
113 				}
114 				return _properties;
115 			}
116 		}
117 
118 		[ConfigurationProperty ("receiveTimeout",
119 			 Options = ConfigurationPropertyOptions.None,
120 			 DefaultValue = "00:10:00")]
121 		[TypeConverter (typeof (TimeSpanConverter))]
122 		public TimeSpan ReceiveTimeout {
123 			get { return (TimeSpan) this ["receiveTimeout"]; }
124 			set { this ["receiveTimeout"] = value; }
125 		}
126 
127 		[ConfigurationProperty ("sendTimeout",
128 			 Options = ConfigurationPropertyOptions.None,
129 			 DefaultValue = "00:01:00")]
130 		[TypeConverter (typeof (TimeSpanConverter))]
131 		public TimeSpan SendTimeout {
132 			get { return (TimeSpan) this ["sendTimeout"]; }
133 			set { this ["sendTimeout"] = value; }
134 		}
135 
OnApplyConfiguration(Binding binding)136 		protected abstract void OnApplyConfiguration (Binding binding);
137 
ApplyConfiguration(Binding binding)138 		public void ApplyConfiguration (Binding binding) {
139 			binding.CloseTimeout = CloseTimeout;
140 			binding.OpenTimeout = OpenTimeout;
141 			binding.ReceiveTimeout = ReceiveTimeout;
142 			binding.SendTimeout = SendTimeout;
143 			OnApplyConfiguration (binding);
144 		}
145 
InitializeFrom(Binding binding)146 		protected internal virtual void InitializeFrom (Binding binding)
147 		{
148 			CloseTimeout = binding.CloseTimeout;
149 			OpenTimeout = binding.OpenTimeout;
150 			ReceiveTimeout = binding.ReceiveTimeout;
151 			SendTimeout = binding.SendTimeout;
152 		}
153 	}
154 
155 }
156