PageCompiler.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. int lcid = pageParser.LCID;
  73. if (lcid != -1)
  74. method.Statements.Add (CreatePropertyAssign ("LCID", lcid));
  75. string culture = pageParser.Culture;
  76. if (culture != null)
  77. method.Statements.Add (CreatePropertyAssign ("Culture", culture));
  78. culture = pageParser.UICulture;
  79. if (culture != null)
  80. method.Statements.Add (CreatePropertyAssign ("UICulture", culture));
  81. string errorPage = pageParser.ErrorPage;
  82. if (errorPage != null)
  83. method.Statements.Add (CreatePropertyAssign ("ErrorPage", errorPage));
  84. if (pageParser.Trace) {
  85. CodeAssignStatement stmt = new CodeAssignStatement ();
  86. stmt.Left = new CodePropertyReferenceExpression (thisRef, "TraceEnabled");
  87. stmt.Right = new CodePrimitiveExpression (true);
  88. method.Statements.Add (stmt);
  89. }
  90. if (pageParser.TraceMode != TraceMode.Default) {
  91. CodeAssignStatement stmt = new CodeAssignStatement ();
  92. CodeTypeReferenceExpression tm = new CodeTypeReferenceExpression ("System.Web.TraceMode");
  93. stmt.Left = new CodePropertyReferenceExpression (thisRef, "TraceModeValue");
  94. stmt.Right = new CodeFieldReferenceExpression (tm, pageParser.TraceMode.ToString ());
  95. method.Statements.Add (stmt);
  96. }
  97. base.AddStatementsToFrameworkInitialize (method);
  98. }
  99. private CodeExpression[] OutputCacheParams ()
  100. {
  101. return new CodeExpression [] {
  102. new CodePrimitiveExpression (pageParser.OutputCacheDuration),
  103. new CodePrimitiveExpression (pageParser.OutputCacheVaryByHeader),
  104. new CodePrimitiveExpression (pageParser.OutputCacheVaryByCustom),
  105. new CodeSnippetExpression (typeof (OutputCacheLocation).ToString () +
  106. "." + pageParser.OutputCacheLocation.ToString ()),
  107. new CodePrimitiveExpression (pageParser.OutputCacheVaryByParam)
  108. };
  109. }
  110. protected override void CreateMethods ()
  111. {
  112. base.CreateMethods ();
  113. CreateGetTypeHashCode ();
  114. }
  115. public static Type CompilePageType (PageParser pageParser)
  116. {
  117. PageCompiler compiler = new PageCompiler (pageParser);
  118. return compiler.GetCompiledType ();
  119. }
  120. }
  121. }