PageCompiler.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. base.AddStatementsToFrameworkInitialize (method);
  82. }
  83. private CodeExpression[] OutputCacheParams ()
  84. {
  85. return new CodeExpression [] {
  86. new CodePrimitiveExpression (pageParser.OutputCacheDuration),
  87. new CodePrimitiveExpression (pageParser.OutputCacheVaryByHeader),
  88. new CodePrimitiveExpression (pageParser.OutputCacheVaryByCustom),
  89. new CodeSnippetExpression (typeof (OutputCacheLocation).ToString () +
  90. "." + pageParser.OutputCacheLocation.ToString ()),
  91. new CodePrimitiveExpression (pageParser.OutputCacheVaryByParam)
  92. };
  93. }
  94. protected override void CreateMethods ()
  95. {
  96. base.CreateMethods ();
  97. CreateGetTypeHashCode ();
  98. }
  99. public static Type CompilePageType (PageParser pageParser)
  100. {
  101. PageCompiler compiler = new PageCompiler (pageParser);
  102. return compiler.GetCompiledType ();
  103. }
  104. }
  105. }