//
// System.Web.VirtualPath.cs
//
// Authors:
// Marek Habersack (mhabersack@novell.com)
//
// (C) 2008-2009 Novell, Inc
//
//
// 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.
//
using System.IO;
using System.Web.Compilation;
using System.Web.Util;
namespace System.Web{
internal class VirtualPath : IDisposable
{
string _absolute;
string _appRelative;
string _appRelativeNotRooted;
string _extension;
string _directory;
string _directoryNoNormalize;
string _currentRequestDirectory;
string _physicalPath;
public bool IsAbsolute {
get;
private set;
}
public bool IsFake {
get;
private set;
}
public bool IsRooted {
get;
private set;
}
public bool IsAppRelative {
get;
private set;
}
public string Original {
get;
private set;
}
public string Absolute {
get {
if (IsAbsolute)
return Original;
if (_absolute == null) {
string original = Original;
if (!VirtualPathUtility.IsRooted (original))
_absolute = MakeRooted (original);
else
_absolute = original;
if (VirtualPathUtility.IsAppRelative (_absolute))
_absolute = VirtualPathUtility.ToAbsolute (_absolute);
}
return _absolute;
}
}
public string AppRelative {
get {
if (IsAppRelative)
return Original;
if (_appRelative == null) {
string original = Original;
if (!VirtualPathUtility.IsRooted (original))
_appRelative = MakeRooted (original);
else
_appRelative = original;
if (VirtualPathUtility.IsAbsolute (_appRelative))
_appRelative = VirtualPathUtility.ToAppRelative (_appRelative);
}
return _appRelative;
}
}
public string AppRelativeNotRooted {
get {
if (_appRelativeNotRooted == null)
_appRelativeNotRooted = AppRelative.Substring (2);
return _appRelativeNotRooted;
}
}
public string Extension {
get {
if (_extension == null)
_extension = VirtualPathUtility.GetExtension (Original);
return _extension;
}
}
public string Directory {
get {
if (_directory == null)
_directory = VirtualPathUtility.GetDirectory (Absolute);
return _directory;
}
}
public string DirectoryNoNormalize {
get {
if (_directoryNoNormalize == null)
_directoryNoNormalize = VirtualPathUtility.GetDirectory (Absolute, false);
return _directoryNoNormalize;
}
}
public string CurrentRequestDirectory {
get {
if (_currentRequestDirectory != null)
return _currentRequestDirectory;
HttpContext ctx = HttpContext.Current;
HttpRequest req = ctx != null ? ctx.Request : null;
if (req != null)
return VirtualPathUtility.GetDirectory (req.CurrentExecutionFilePath);
return null;
}
set { _currentRequestDirectory = value; }
}
public string PhysicalPath {
get {
if (_physicalPath != null)
return _physicalPath;
HttpContext ctx = HttpContext.Current;
HttpRequest req = ctx != null ? ctx.Request : null;
if (req != null)
_physicalPath = req.MapPath (Absolute);
else
return null;
return _physicalPath;
}
}
public VirtualPath (string vpath)
: this (vpath, null, false)
{
}
public VirtualPath (string vpath, string baseVirtualDir)
: this (vpath, null, false)
{
CurrentRequestDirectory = baseVirtualDir;
}
public VirtualPath (string vpath, string physicalPath, bool isFake)
{
IsRooted = VirtualPathUtility.IsRooted (vpath);
IsAbsolute = VirtualPathUtility.IsAbsolute (vpath);
IsAppRelative = VirtualPathUtility.IsAppRelative (vpath);
if (isFake) {
if (String.IsNullOrEmpty (physicalPath))
throw new ArgumentException ("physicalPath");
_physicalPath = physicalPath;
Original = "~/" + Path.GetFileName (_physicalPath);
IsFake = true;
} else {
Original = vpath;
IsFake = false;
}
}
public bool StartsWith (string s)
{
return StrUtils.StartsWith (Original, s);
}
// Assumes 'original' is NOT rooted
string MakeRooted (string original)
{
string reqdir = CurrentRequestDirectory;
if (!String.IsNullOrEmpty (reqdir))
return VirtualPathUtility.Combine (reqdir, original);
else
return VirtualPathUtility.Combine (HttpRuntime.AppDomainAppVirtualPath, original);
}
public void Dispose ()
{
_absolute = null;
_appRelative = null;
_appRelativeNotRooted = null;
_extension = null;
_directory = null;
}
public override string ToString ()
{
string ret = Original;
if (String.IsNullOrEmpty (ret))
return GetType ().ToString ();
if (IsFake)
ret += " [fake: " + PhysicalPath + "]";
return ret;
}
public static VirtualPath PhysicalToVirtual (string physical_path)
{
if (String.IsNullOrEmpty (physical_path))
return null;
string appPhysicalPath = HttpRuntime.AppDomainAppPath;
if (!StrUtils.StartsWith (physical_path, appPhysicalPath))
return null;
string vp = physical_path.Substring (appPhysicalPath.Length - 1);
if (vp [0] != '/')
return null;
return new VirtualPath (vp);
}
}
}
|