PageCompiler.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // System.Web.Compilation.PageCompiler
  3. //
  4. // Authors:
  5. // Gonzalo Paniagua Javier ([email protected])
  6. //
  7. // (C) 2002,2003 Ximian, Inc (http://www.ximian.com)
  8. //
  9. using System;
  10. using System.CodeDom;
  11. using System.IO;
  12. using System.Reflection;
  13. using System.Text;
  14. using System.Web.UI;
  15. using System.Web.SessionState;
  16. using System.Web.Util;
  17. namespace System.Web.Compilation
  18. {
  19. class PageCompiler : TemplateControlCompiler
  20. {
  21. PageParser pageParser;
  22. static CodeTypeReference intRef = new CodeTypeReference (typeof (int));
  23. public PageCompiler (PageParser pageParser)
  24. : base (pageParser)
  25. {
  26. this.pageParser = pageParser;
  27. }
  28. protected override void AddInterfaces ()
  29. {
  30. base.AddInterfaces ();
  31. if (pageParser.EnableSessionState)
  32. mainClass.BaseTypes.Add (new CodeTypeReference (typeof(IRequiresSessionState)));
  33. if (pageParser.ReadOnlySessionState)
  34. mainClass.BaseTypes.Add (new CodeTypeReference (typeof (IReadOnlySessionState)));
  35. }
  36. void CreateGetTypeHashCode ()
  37. {
  38. CodeMemberMethod method = new CodeMemberMethod ();
  39. method.ReturnType = intRef;
  40. method.Name = "GetTypeHashCode";
  41. method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
  42. Random rnd = new Random (pageParser.InputFile.GetHashCode ());
  43. method.Statements.Add (new CodeMethodReturnStatement (new CodePrimitiveExpression (rnd.Next ())));
  44. mainClass.Members.Add (method);
  45. }
  46. static CodeAssignStatement CreatePropertyAssign (string name, object value)
  47. {
  48. CodePropertyReferenceExpression prop;
  49. prop = new CodePropertyReferenceExpression (thisRef, name);
  50. CodePrimitiveExpression prim;
  51. prim = new CodePrimitiveExpression (value);
  52. return new CodeAssignStatement (prop, prim);
  53. }
  54. protected override void AddStatementsToFrameworkInitialize (CodeMemberMethod method)
  55. {
  56. string responseEncoding = pageParser.ResponseEncoding;
  57. if (responseEncoding != null)
  58. method.Statements.Add (CreatePropertyAssign ("ResponseEncoding", responseEncoding));
  59. int codepage = pageParser.CodePage;
  60. if (codepage != -1)
  61. method.Statements.Add (CreatePropertyAssign ("CodePage", codepage));
  62. string contentType = pageParser.ContentType;
  63. if (contentType != null)
  64. method.Statements.Add (CreatePropertyAssign ("ContentType", contentType));
  65. if (pageParser.OutputCache) {
  66. CodeMethodReferenceExpression init = new CodeMethodReferenceExpression (null,
  67. "InitOutputCache");
  68. CodeMethodInvokeExpression invoke = new CodeMethodInvokeExpression (init,
  69. OutputCacheParams ());
  70. method.Statements.Add (invoke);
  71. }
  72. base.AddStatementsToFrameworkInitialize (method);
  73. }
  74. private CodeExpression[] OutputCacheParams ()
  75. {
  76. return new CodeExpression [] {
  77. new CodePrimitiveExpression (pageParser.OutputCacheDuration),
  78. new CodePrimitiveExpression (pageParser.OutputCacheVaryByHeader),
  79. new CodePrimitiveExpression (pageParser.OutputCacheVaryByCustom),
  80. new CodeSnippetExpression (typeof (OutputCacheLocation).ToString () +
  81. "." + pageParser.OutputCacheLocation.ToString ()),
  82. new CodePrimitiveExpression (pageParser.OutputCacheVaryByParam)
  83. };
  84. }
  85. protected override void CreateMethods ()
  86. {
  87. base.CreateMethods ();
  88. CreateGetTypeHashCode ();
  89. }
  90. public static Type CompilePageType (PageParser pageParser)
  91. {
  92. PageCompiler compiler = new PageCompiler (pageParser);
  93. return compiler.GetCompiledType ();
  94. }
  95. }
  96. }