File: Hosting\SimpleApplicationHost.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="SimpleApplicationHost.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Web.Hosting {
    using System;
    using System.Collections;
    using System.Configuration;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;  
    using System.Security.Permissions;
    using System.Web;
    using System.Web.Configuration;
    using System.Web.UI;
    using System.Web.Util;
    using Microsoft.Win32;
    using Debug = System.Web.Util.Debug;
 
    internal class SimpleApplicationHost : MarshalByRefObject, IApplicationHost {
 
        private VirtualPath _appVirtualPath;
        private String _appPhysicalPath;
 
        internal SimpleApplicationHost(VirtualPath virtualPath, string physicalPath) {
 
            if (String.IsNullOrEmpty(physicalPath))
                throw ExceptionUtil.ParameterNullOrEmpty("physicalPath");
 
            // Throw if the physical path is not canonical, to prevent potential
            // security issues (VSWhidbey 418125)
            if (FileUtil.IsSuspiciousPhysicalPath(physicalPath)) {
                throw ExceptionUtil.ParameterInvalid(physicalPath);
            }
 
            _appVirtualPath = virtualPath;
            _appPhysicalPath = StringUtil.StringEndsWith(physicalPath, "\\") ? physicalPath : physicalPath + "\\";
        }
 
        public override Object InitializeLifetimeService() {
            return null; // never expire lease
        }
 
        // IApplicationHost implementation
        public string GetVirtualPath() {
            return _appVirtualPath.VirtualPathString;
        }
 
        String IApplicationHost.GetPhysicalPath() {
            return _appPhysicalPath;
        }
 
        IConfigMapPathFactory IApplicationHost.GetConfigMapPathFactory() {
            return new SimpleConfigMapPathFactory();
        }
 
        IntPtr IApplicationHost.GetConfigToken() {
            return IntPtr.Zero;
        }
 
        String IApplicationHost.GetSiteName() {
            return WebConfigurationHost.DefaultSiteName;
        }
 
        String IApplicationHost.GetSiteID() {
            return WebConfigurationHost.DefaultSiteID;
        }
 
        public void MessageReceived() {
            // nothing
        }
    }
 
    [Serializable()]
    internal class SimpleConfigMapPathFactory : IConfigMapPathFactory {
        IConfigMapPath IConfigMapPathFactory.Create(string virtualPath, string physicalPath) {
            WebConfigurationFileMap webFileMap = new WebConfigurationFileMap();
            VirtualPath vpath = VirtualPath.Create(virtualPath);
 
            // Application path
            webFileMap.VirtualDirectories.Add(vpath.VirtualPathStringNoTrailingSlash,
                new VirtualDirectoryMapping(physicalPath, true));
 
            // Client script file path
            webFileMap.VirtualDirectories.Add(
                    HttpRuntime.AspClientScriptVirtualPath, 
                    new VirtualDirectoryMapping(HttpRuntime.AspClientScriptPhysicalPathInternal, false));
 
            return new UserMapPath(webFileMap);
        }
    }
}