PageCompiler.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. base.AddStatementsToFrameworkInitialize (method);
  66. }
  67. protected override void CreateMethods ()
  68. {
  69. base.CreateMethods ();
  70. CreateGetTypeHashCode ();
  71. }
  72. public static Type CompilePageType (PageParser pageParser)
  73. {
  74. PageCompiler compiler = new PageCompiler (pageParser);
  75. return compiler.GetCompiledType ();
  76. }
  77. }
  78. }