// // System.Web.Services.Protocols.SoapExtension.cs // // Author: // Tim Coleman (tim@timcoleman.com) // // Copyright (C) Tim Coleman, 2002 // using System.IO; using System.Collections; using System.Web.Services.Configuration; namespace System.Web.Services.Protocols { public abstract class SoapExtension { #region Fields Stream stream; #endregion #region Constructors protected SoapExtension () { } #endregion // Constructors #region Methods public virtual Stream ChainStream (Stream stream) { return stream; } public abstract object GetInitializer (Type serviceType); public abstract object GetInitializer (LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute); public abstract void Initialize (object initializer); public abstract void ProcessMessage (SoapMessage message); static ArrayList[] globalExtensions; internal static SoapExtension[] CreateExtensionChain (SoapExtensionRuntimeConfig[] extensionConfigs) { if (extensionConfigs == null) return null; SoapExtension[] res = new SoapExtension [extensionConfigs.Length]; CreateExtensionChain (extensionConfigs, res, 0); return res; } internal static SoapExtension[] CreateExtensionChain (SoapExtensionRuntimeConfig[] hiPrioExts, SoapExtensionRuntimeConfig[] medPrioExts, SoapExtensionRuntimeConfig[] lowPrioExts) { int len = 0; if (hiPrioExts != null) len += hiPrioExts.Length; if (medPrioExts != null) len += medPrioExts.Length; if (lowPrioExts != null) len += lowPrioExts.Length; if (len == 0) return null; SoapExtension[] res = new SoapExtension [len]; int pos = 0; if (hiPrioExts != null) pos = CreateExtensionChain (hiPrioExts, res, pos); if (medPrioExts != null) pos = CreateExtensionChain (medPrioExts, res, pos); if (lowPrioExts != null) pos = CreateExtensionChain (lowPrioExts, res, pos); return res; } static int CreateExtensionChain (SoapExtensionRuntimeConfig[] extensionConfigs, SoapExtension[] destArray, int pos) { for (int n=0; n econf.Priority) { destList.Insert (n, econf); added = true; } if (!added) destList.Add (econf); } } internal static SoapExtensionRuntimeConfig[][] GetTypeExtensions (Type serviceType) { if (globalExtensions == null) InitializeGlobalExtensions(); SoapExtensionRuntimeConfig[][] exts = new SoapExtensionRuntimeConfig[2][]; for (int group = 0; group < 2; group++) { ArrayList globList = globalExtensions[group]; if (globList == null) continue; exts [group] = new SoapExtensionRuntimeConfig [globList.Count]; for (int n=0; n= 0; n--) extensions[n].ProcessMessage (message); } else { for (int n = 0; n < extensions.Length; n++) extensions[n].ProcessMessage (message); } } #endregion // Methods } internal class SoapExtensionRuntimeConfig { public Type Type; public int Priority; public object InitializationInfo; } }