internal SimpleWebHandlerParser(HttpContext context, string virtualPath, string physicalPath, TextReader reader) { this.reader = reader; cachedType = CachingCompiler.GetTypeFromCache(physicalPath); if (cachedType != null) { return; // We don't need anything else. } // context is obsolete in 2.0+ - MSDN recommends passing null, so we need to // take that into account if (context != null) { this.context = context; } else { this.context = HttpContext.Current; } this.vPath = virtualPath; AddDependency(virtualPath); // physicalPath is obsolete in 2.0+ - same note what for context applies here if (physicalPath != null && physicalPath.Length > 0) { this.physPath = physicalPath; } else { HttpRequest req = this.context != null ? context.Request : null; if (req != null) { this.physPath = req.MapPath(virtualPath); } } assemblies = new ArrayList(); string location = Context.ApplicationInstance.AssemblyLocation; if (location != typeof(TemplateParser).Assembly.Location) { appAssemblyIndex = assemblies.Add(location); } bool addAssembliesInBin = false; foreach (AssemblyInfo info in CompilationConfig.Assemblies) { if (info.Assembly == "*") { addAssembliesInBin = true; } else { AddAssemblyByName(info.Assembly, null); } } if (addAssembliesInBin) { AddAssembliesInBin(); } language = CompilationConfig.DefaultLanguage; GetDirectivesAndContent(); }
void GetDirectivesAndContent() { string line; bool directiveFound = false; bool inDirective = false; StringBuilder directive = null; StringBuilder content = new StringBuilder(); int idxStart, idxEnd, length; StreamReader sr; if (reader != null) { sr = reader as StreamReader; } else { sr = new StreamReader(File.OpenRead(physPath), WebEncoding.FileEncoding); } using (sr) { while ((line = sr.ReadLine()) != null && cachedType == null) { length = line.Length; if (length == 0) { content.Append("\n"); continue; } idxStart = line.IndexOf("<%"); if (idxStart > -1) { idxEnd = line.IndexOf("%>"); if (idxStart > 0) { content.Append(line.Substring(0, idxStart)); } if (directive == null) { directive = new StringBuilder(); } else { directive.Length = 0; } if (idxEnd > -1) { directiveFound = true; inDirective = false; directive.Append(line.Substring(idxStart, idxEnd - idxStart + 2)); if (idxEnd < length - 2) { content.Append(line.Substring(idxEnd + 2, length - idxEnd - 2)); } } else { inDirective = true; directiveFound = false; directive.Append(line.Substring(idxStart)); continue; } } if (inDirective) { int idx = line.IndexOf("%>"); if (idx > -1) { directive.Append(line.Substring(0, idx + 2)); if (idx < length) { content.Append(line.Substring(idx + 2) + "\n"); } inDirective = false; directiveFound = true; } else { directive.Append(line); continue; } } if (directiveFound) { ParseDirective(directive.ToString()); directiveFound = false; if (gotDefault) { cachedType = CachingCompiler.GetTypeFromCache(physPath); if (cachedType != null) { break; } } continue; } content.Append(line + "\n"); } directive = null; } if (!gotDefault) { throw new ParseException(null, "No @" + DefaultDirectiveName + " directive found"); } if (cachedType == null) { this.program = content.ToString(); } }