1 //
2 // System.Web.Hosting.VirtualPathProvider
3 //
4 // Author:
5 //	Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 //
8 // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29 using System;
30 using System.Collections;
31 using System.IO;
32 using System.Web.Caching;
33 using System.Web.Util;
34 
35 namespace System.Web.Hosting {
36 
37 	public abstract class VirtualPathProvider : MarshalByRefObject
38 	{
39 		VirtualPathProvider prev;
40 
VirtualPathProvider()41 		protected VirtualPathProvider ()
42 		{
43 		}
44 
45 		protected internal VirtualPathProvider Previous {
46 			get { return prev; }
47 		}
48 
Initialize()49 		protected virtual void Initialize ()
50 		{
51 		}
52 
InitializeAndSetPrevious(VirtualPathProvider prev)53 		internal void InitializeAndSetPrevious (VirtualPathProvider prev)
54 		{
55 			this.prev = prev;
56 			Initialize ();
57 		}
58 
CombineVirtualPaths(string basePath, string relativePath)59 		public virtual string CombineVirtualPaths (string basePath, string relativePath)
60 		{
61 			return VirtualPathUtility.Combine (basePath, relativePath);
62 		}
63 
DirectoryExists(string virtualDir)64 		public virtual bool DirectoryExists (string virtualDir)
65 		{
66 			if (prev != null)
67 				return prev.DirectoryExists (virtualDir);
68 
69 			return false;
70 		}
71 
FileExists(string virtualPath)72 		public virtual bool FileExists (string virtualPath)
73 		{
74 			if (prev != null)
75 				return prev.FileExists (virtualPath);
76 
77 			return false;
78 		}
79 
GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)80 		public virtual CacheDependency GetCacheDependency (string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
81 		{
82 			if (prev != null)
83 				return prev.GetCacheDependency (virtualPath, virtualPathDependencies, utcStart);
84 
85 			return null;
86 		}
87 
GetCacheKey(string virtualPath)88 		public virtual string GetCacheKey (string virtualPath)
89 		{
90 			if (prev != null)
91 				return prev.GetCacheKey (virtualPath);
92 
93 			return null;
94 		}
95 
GetDirectory(string virtualDir)96 		public virtual VirtualDirectory GetDirectory (string virtualDir)
97 		{
98 			if (prev != null)
99 				return prev.GetDirectory (virtualDir);
100 
101 			return null;
102 		}
103 
GetFile(string virtualPath)104 		public virtual VirtualFile GetFile (string virtualPath)
105 		{
106 			if (prev != null)
107 				return prev.GetFile (virtualPath);
108 
109 			return null;
110 		}
111 
GetFileHash(string virtualPath, IEnumerable virtualPathDependencies)112 		public virtual string GetFileHash (string virtualPath, IEnumerable virtualPathDependencies)
113 		{
114 			if (prev != null)
115 				return prev.GetFileHash (virtualPath, virtualPathDependencies);
116 
117 			return null;
118 		}
119 
InitializeLifetimeService()120 		public override object InitializeLifetimeService ()
121 		{
122 			return null; // forever young
123 		}
124 
OpenFile(string virtualPath)125 		public static Stream OpenFile (string virtualPath)
126 		{
127 			// This thing throws a nullref when we're not inside an ASP.NET appdomain, which is what MS does.
128 			VirtualPathProvider provider = HostingEnvironment.VirtualPathProvider;
129 			VirtualFile file = provider.GetFile (virtualPath);
130 			if (file != null)
131 				return file.Open ();
132 
133 			return null;
134 		}
135 	}
136 }
137 
138