Browse Source

2005-06-23 Lluis Sanchez Gual <[email protected]>

	* VirtualDirectoryMapping.cs: Implemented.
	* WebConfigurationManager.cs: Initial implementation.
	* VirtualDirectoryMappingCollection.cs: Implemented.
	* WebConfigurationFileMap.cs: Implemented.
	* WebConfigurationHost.cs: Initial implementation of class
	that supports IInternalConfigHost.



svn path=/trunk/mcs/; revision=46445
Lluis Sanchez 20 years ago
parent
commit
63aa2b250f

+ 10 - 1
mcs/class/System.Web/System.Web.Configuration/ChangeLog

@@ -1,9 +1,18 @@
+2005-06-23  Lluis Sanchez Gual <[email protected]>
+
+	* VirtualDirectoryMapping.cs: Implemented.
+	* WebConfigurationManager.cs: Initial implementation.
+	* VirtualDirectoryMappingCollection.cs: Implemented.
+	* WebConfigurationFileMap.cs: Implemented.
+	* WebConfigurationHost.cs: Initial implementation of class
+	that supports IInternalConfigHost.
+
 2005-06-19 Ilya Kharmatsky <ilyak-at-mainsoft.com>
 
     * HttpRuntimeConfig.cs: Added TARGET_JVM directive in "using clause"
       in order to exclude in J2EE configuration usage of unsupported
       CodeDome API.
-       
+
 2005-06-15  Lluis Sanchez Gual <[email protected]>
 
 	* CodeSubDirectory.cs:

+ 82 - 0
mcs/class/System.Web/System.Web.Configuration/VirtualDirectoryMapping.cs

@@ -0,0 +1,82 @@
+//
+// System.Configuration.VirtualDirectoryMapping.cs
+//
+// Authors:
+//  Lluis Sanchez Gual ([email protected])
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+
+#if NET_2_0
+
+using System.Collections.Specialized;
+
+namespace System.Web.Configuration
+{
+	public sealed class VirtualDirectoryMapping
+	{
+		string physicalDirectory;
+		bool isAppRoot;
+		string configFileBaseName;
+		string virtualDirectory;
+		
+		public VirtualDirectoryMapping (string physicalDirectory, bool isAppRoot)
+		{
+			this.physicalDirectory = physicalDirectory;
+			this.isAppRoot = isAppRoot;
+		}
+		
+		public VirtualDirectoryMapping (string physicalDirectory, bool isAppRoot, string configFileBaseName)
+		{
+			this.physicalDirectory = physicalDirectory;
+			this.isAppRoot = isAppRoot;
+			this.configFileBaseName = configFileBaseName;
+		}
+		
+		internal void SetVirtualDirectory (string dir)
+		{
+			virtualDirectory = dir;
+		}
+		
+		[MonoTODO ("Do something with this")]
+		public string ConfigFileBaseName {
+			get { return configFileBaseName; }
+			set { configFileBaseName = value; }
+		}
+		
+		[MonoTODO ("Do something with this")]
+		public bool IsAppRoot {
+			get { return isAppRoot; }
+			set { isAppRoot = value; }
+		}
+		
+		public string PhysicalDirectory {
+			get { return physicalDirectory; }
+			set { physicalDirectory = value; }
+		}
+		
+		public string VirtualDirectory {
+			get { return virtualDirectory; }
+		}
+	}
+}
+#endif

+ 92 - 0
mcs/class/System.Web/System.Web.Configuration/VirtualDirectoryMappingCollection.cs

@@ -0,0 +1,92 @@
+//
+// System.Configuration.VirtualDirectoryMappingCollection.cs
+//
+// Authors:
+//  Lluis Sanchez Gual ([email protected])
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+
+#if NET_2_0
+
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace System.Web.Configuration
+{
+	public sealed class VirtualDirectoryMappingCollection: NameObjectCollectionBase
+	{
+		public void Add (string virtualDirectory, VirtualDirectoryMapping mapping)
+		{
+			mapping.SetVirtualDirectory (virtualDirectory);
+			BaseAdd (virtualDirectory, mapping);
+		}
+		
+		public void Clear ()
+		{
+			BaseClear ();
+		}
+		
+		public void CopyTo (VirtualDirectoryMapping[] array, int index)
+		{
+			((ICollection)this).CopyTo (array, index);
+		}
+		
+		public VirtualDirectoryMapping Get (int index)
+		{
+			return (VirtualDirectoryMapping) BaseGet (index);
+		}
+		
+		public VirtualDirectoryMapping Get (string virtualDirectory)
+		{
+			return (VirtualDirectoryMapping) BaseGet (virtualDirectory);
+		}
+		
+		public string GetKey (int index)
+		{
+			return BaseGetKey (index);
+		}
+		
+		public void Remove (string virtualDirectory)
+		{
+			BaseRemove (virtualDirectory);
+		}
+		
+		public void RemoveAt (int index)
+		{
+			BaseRemoveAt (index);
+		}
+		
+		public ICollection AllKeys {
+			get { return BaseGetAllKeys (); }
+		}
+		
+		public VirtualDirectoryMapping this [int index] {
+			get { return (VirtualDirectoryMapping) BaseGet (index); }
+		}
+		
+		public VirtualDirectoryMapping this [string virtualDirectory] {
+			get { return (VirtualDirectoryMapping) BaseGet (virtualDirectory); }
+		}
+	}
+}
+#endif

+ 65 - 0
mcs/class/System.Web/System.Web.Configuration/WebConfigurationFileMap.cs

@@ -0,0 +1,65 @@
+//
+// System.Configuration.ExeConfigurationFileMap.cs
+//
+// Authors:
+//  Lluis Sanchez Gual ([email protected])
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+
+#if NET_2_0
+
+using System;
+using System.Configuration;
+
+namespace System.Web.Configuration
+{
+	[Serializable]
+	public sealed class WebConfigurationFileMap: ConfigurationFileMap
+	{
+		VirtualDirectoryMappingCollection virtualDirectories;
+		
+		public WebConfigurationFileMap ()
+		{
+			virtualDirectories = new VirtualDirectoryMappingCollection ();
+		}
+		
+		public VirtualDirectoryMappingCollection VirtualDirectories {
+			get { return virtualDirectories; }
+		}
+		
+		public override object Clone ()
+		{
+			WebConfigurationFileMap map = new WebConfigurationFileMap ();
+			map.MachineConfigFilename = MachineConfigFilename;
+			
+			map.virtualDirectories = new VirtualDirectoryMappingCollection ();
+			foreach (VirtualDirectoryMapping vmap in virtualDirectories) {
+				VirtualDirectoryMapping nvmap = new VirtualDirectoryMapping (vmap.PhysicalDirectory, vmap.IsAppRoot, vmap.ConfigFileBaseName);
+				map.virtualDirectories.Add (vmap.VirtualDirectory, nvmap);
+			}
+			
+			return map;
+		}
+	}
+}
+#endif

+ 317 - 0
mcs/class/System.Web/System.Web.Configuration/WebConfigurationHost.cs

@@ -0,0 +1,317 @@
+//
+// System.Web.Configuration.WebConfigurationHost.cs
+//
+// Authors:
+//  Lluis Sanchez Gual ([email protected])
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+
+#if NET_2_0
+
+using System;
+using System.IO;
+using System.Security;
+using System.Configuration;
+using System.Configuration.Internal;
+using System.Web.Util;
+
+namespace System.Web.Configuration
+{
+	class WebConfigurationHost: IInternalConfigHost
+	{
+		WebConfigurationFileMap map;
+		const string MachinePath = "machine:";
+		
+		public virtual object CreateConfigurationContext (string configPath, string locationSubPath)
+		{
+			return null;
+		}
+		
+		public virtual object CreateDeprecatedConfigContext (string configPath)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual string DecryptSection (string encryptedXml, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedSection)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual void DeleteStream (string streamName)
+		{
+			File.Delete (streamName);
+		}
+		
+		public virtual string EncryptSection (string encryptedXml, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedSection)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual string GetConfigPathFromLocationSubPath (string configPath, string locatinSubPath)
+		{
+			return configPath + "/" + locatinSubPath;
+		}
+		
+		public virtual Type GetConfigType (string typeName, bool throwOnError)
+		{
+			Type type = Type.GetType (typeName);
+			if (type == null && throwOnError)
+				throw new ConfigurationErrorsException ("Type not found: '" + typeName + "'");
+			return type;
+		}
+		
+		public virtual string GetConfigTypeName (Type t)
+		{
+			return t.AssemblyQualifiedName;
+		}
+		
+		public virtual void GetRestrictedPermissions (IInternalConfigRecord configRecord, out PermissionSet permissionSet, out bool isHostReady)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual string GetStreamName (string configPath)
+		{
+			if (configPath == MachinePath) {
+				if (map == null)
+					return System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile;
+				else
+					return map.MachineConfigFilename;
+			}
+			
+			string dir = MapPath (configPath);
+			return GetWebConfigFileName (dir);
+		}
+		
+		public virtual string GetStreamNameForConfigSource (string streamName, string configSource)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual object GetStreamVersion (string streamName)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual IDisposable Impersonate ()
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual void Init (IInternalConfigRoot root, params object[] hostInitParams)
+		{
+		}
+		
+		public virtual void InitForConfiguration (ref string locationSubPath, out string configPath, out string locationConfigPath, IInternalConfigRoot root, params object[] hostInitConfigurationParams)
+		{
+			string fullPath = (string) hostInitConfigurationParams [1];
+			
+			map = (WebConfigurationFileMap) hostInitConfigurationParams [0];
+			
+			if (locationSubPath == MachinePath) {
+				locationSubPath = null;
+				configPath = MachinePath;
+				locationConfigPath = null;
+				return;
+			}
+			
+			int i;
+			if (locationSubPath == null) {
+				configPath = fullPath;
+				i = fullPath.LastIndexOf ("/");
+			} else {
+				configPath = locationSubPath;
+				if (locationSubPath != "/")
+					i = locationSubPath.LastIndexOf ('/');
+				else
+					i = -1;
+			}
+			
+			if (i != -1) {
+				locationConfigPath = configPath.Substring (i+1);
+				
+				if (i == 0)
+					locationSubPath = "/";
+				else
+					locationSubPath = fullPath.Substring (0, i);
+				
+				string dir = MapPath (configPath);
+				if (GetWebConfigFileName (dir) == null) {
+					InitForConfiguration (ref locationSubPath, out configPath, out locationConfigPath, root, hostInitConfigurationParams);
+				}
+			} else {
+				locationSubPath = MachinePath;
+				locationConfigPath = null;
+				return;
+			}
+		}
+		
+		public string MapPath (string virtualPath)
+		{
+			if (map != null)
+				return MapPathFromMapper (virtualPath);
+			else
+				return HttpContext.Current.Request.MapPath (virtualPath);
+		}
+		
+		public string NormalizeVirtualPath (string virtualPath)
+		{
+			if (virtualPath == null || virtualPath.Length == 0)
+				virtualPath = ".";
+			else
+				virtualPath = virtualPath.Trim ();
+
+			if (virtualPath [0] == '~' && virtualPath.Length > 2 && virtualPath [1] == '/')
+				virtualPath = virtualPath.Substring (1);
+				
+			if (System.IO.Path.DirectorySeparatorChar != '/')
+				virtualPath = virtualPath.Replace (System.IO.Path.DirectorySeparatorChar, '/');
+
+			if (UrlUtils.IsRooted (virtualPath)) {
+				virtualPath = UrlUtils.Reduce (virtualPath);
+			} else {
+				if (map.VirtualDirectories.Count > 0) {
+					string root = map.VirtualDirectories [0].VirtualDirectory;
+					virtualPath = UrlUtils.Combine (root, virtualPath);
+					virtualPath = UrlUtils.Reduce (virtualPath);
+				}
+			}
+			return virtualPath;
+		}
+
+		public string MapPathFromMapper (string virtualPath)
+		{
+			string path = NormalizeVirtualPath (virtualPath);
+			
+			foreach (VirtualDirectoryMapping mapping in map.VirtualDirectories) {
+				if (path.StartsWith (mapping.VirtualDirectory)) {
+					int i = mapping.VirtualDirectory.Length;
+					if (path.Length == i) {
+						return mapping.PhysicalDirectory;
+					}
+					else if (path [i] == '/') {
+						string pathPart = path.Substring (i + 1).Replace ('/', Path.DirectorySeparatorChar);
+						return Path.Combine (mapping.PhysicalDirectory, pathPart);
+					}
+				}
+			}
+			throw new HttpException ("Invalid virtual directory: " + virtualPath);
+		}
+
+		string GetWebConfigFileName (string dir)
+		{
+			string file = Path.Combine (dir, "Web.config");
+			if (File.Exists (file))
+				return file;
+			file = Path.Combine (dir, "web.config");
+			if (File.Exists (file))
+				return file;
+			return null;
+		}
+		
+		public virtual bool IsAboveApplication (string configPath)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual bool IsConfigRecordRequired (string configPath)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual bool IsDefinitionAllowed (string configPath, ConfigurationAllowDefinition allowDefinition, ConfigurationAllowExeDefinition allowExeDefinition)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual bool IsFile (string streamName)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual bool IsLocationApplicable (string configPath)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual Stream OpenStreamForRead (string streamName)
+		{
+			if (!File.Exists (streamName))
+				throw new ConfigurationException ("File '" + streamName + "' not found");
+				
+			return new FileStream (streamName, FileMode.Open, FileAccess.Read);
+		}
+		
+		public virtual Stream OpenStreamForWrite (string streamName, string templateStreamName, ref object writeContext)
+		{
+			return new FileStream (streamName, FileMode.Create, FileAccess.Write);
+		}
+		
+		public virtual bool PrefetchAll (string configPath, string streamName)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual bool PrefetchSection (string sectionGroupName, string sectionName)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual object StartMonitoringStreamForChanges (string streamName, StreamChangeCallback callback)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual void StopMonitoringStreamForChanges (string streamName, StreamChangeCallback callback)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual void VerifyDefinitionAllowed (string configPath, ConfigurationAllowDefinition allowDefinition, ConfigurationAllowExeDefinition allowExeDefinition, IConfigErrorInfo errorInfo)
+		{
+			throw new NotImplementedException ();
+		}
+		
+		public virtual void WriteCompleted (string streamName, bool success, object writeContext)
+		{
+		}
+		
+		public virtual bool SupportsChangeNotifications {
+			get { return false; }
+		}
+		
+		public virtual bool SupportsLocation {
+			get { return false; }
+		}
+		
+		public virtual bool SupportsPath {
+			get { return false; }
+		}
+		
+		public virtual bool SupportsRefresh {
+			get { return false; }
+		}
+	}
+}
+
+#endif

+ 155 - 0
mcs/class/System.Web/System.Web.Configuration/WebConfigurationManager.cs

@@ -0,0 +1,155 @@
+//
+// System.Web.Configuration.WebConfigurationManager.cs
+//
+// Authors:
+// 	Lluis Sanchez Gual ([email protected])
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+
+#if NET_2_0
+using System;
+using System.IO;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+using System.Xml;
+using System.Configuration;
+using System.Configuration.Internal;
+using _Configuration = System.Configuration.Configuration;
+
+namespace System.Web.Configuration {
+
+	public abstract class WebConfigurationManager
+	{
+		static IInternalConfigConfigurationFactory configFactory;
+		static Hashtable configurations = new Hashtable ();
+		
+		static WebConfigurationManager ()
+		{
+			PropertyInfo prop = typeof(ConfigurationManager).GetProperty ("ConfigurationFactory", BindingFlags.Static | BindingFlags.NonPublic);
+			if (prop != null)
+				configFactory = prop.GetValue (null, null) as IInternalConfigConfigurationFactory;
+		}
+		
+		WebConfigurationManager ()
+		{
+		}
+		
+		public static _Configuration OpenWebConfiguration (string path)
+		{
+			return OpenWebConfiguration (path, null, null, null, IntPtr.Zero, null);
+		}
+		
+		public static _Configuration OpenWebConfiguration (string path, string site)
+		{
+			return OpenWebConfiguration (path, site, null, null, IntPtr.Zero, null);
+		}
+		
+		public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath)
+		{
+			return OpenWebConfiguration (path, site, locationSubPath, null, IntPtr.Zero, null);
+		}
+		
+		public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server, IntPtr userToken)
+		{
+			return OpenWebConfiguration (path, site, locationSubPath, server, userToken, null);
+		}
+		
+		[MonoTODO ("Do something with the extra parameters")]
+		public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server, IntPtr userToken, string password)
+		{
+			string basePath = GetBasePath (path);
+			_Configuration conf;
+			
+			lock (configurations) {
+				conf = (_Configuration) configurations [basePath];
+				if (conf == null) {
+					conf = ConfigurationFactory.Create (typeof(WebConfigurationHost), null, path, site, locationSubPath, server, userToken, password);
+					configurations [basePath] = conf;
+				}
+			}
+			if (basePath.Length < path.Length) {
+			
+				// If the path has a file name, look for a location specific configuration
+				
+				int dif = path.Length - basePath.Length;
+				string file = path.Substring (path.Length - dif);
+				int i=0;
+				while (i < file.Length && file [i] == '/')
+					i++;
+				if (i != 0)
+					file = file.Substring (i);
+
+				if (file.Length != 0) {
+					foreach (ConfigurationLocation loc in conf.Locations) {
+						if (loc.Path == file)
+							return loc.OpenConfiguration ();
+					}
+				}
+			}
+			return conf;
+		}
+		
+		public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path)
+		{
+			return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path);
+		}
+		
+		[MonoTODO ("Do something with the extra parameters")]
+		public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path, string site)
+		{
+			return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path, site);
+		}
+		
+		[MonoTODO ("Do something with the extra parameters")]
+		public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path, string site, string locationSubPath)
+		{
+			return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path, site, locationSubPath);
+		}
+		
+		public static _Configuration OpenMappedMachineConfiguration (ConfigurationFileMap fileMap)
+		{
+			return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap);
+		}
+		
+		internal static IInternalConfigConfigurationFactory ConfigurationFactory {
+			get { return configFactory; }
+		}
+		
+		static string GetBasePath (string path)
+		{
+			string pd = HttpContext.Current.Request.MapPath (path);
+
+			if (!Directory.Exists (pd)) {
+				int i = path.LastIndexOf ('/');
+				path = path.Substring (0, i);
+			} 
+			
+			while (path [path.Length - 1] == '/')
+				path = path.Substring (0, path.Length - 1);
+			return path;
+		}
+	}
+}
+
+#endif