PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/CompressPage.cs

https://bitbucket.org/Leonscape/eswctrls
C# | 214 lines | 140 code | 36 blank | 38 comment | 6 complexity | 8effd4e525c38b4e20c5062124d57d60 MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.IO.Compression;
  4. using System.Web.UI;
  5. namespace ESWCtrls
  6. {
  7. /// <summary>
  8. /// Base class for eliminating white space from pages, and compressing viewstate
  9. /// </summary>
  10. public class CompressPage : System.Web.UI.Page
  11. {
  12. protected override void OnPreRenderComplete(EventArgs e)
  13. {
  14. Script.PreRenderComplete(this);
  15. base.OnPreRenderComplete(e);
  16. }
  17. /// <summary>
  18. /// Loads the compressed viewstate
  19. /// </summary>
  20. /// <returns></returns>
  21. /// <remarks></remarks>
  22. protected override object LoadPageStateFromPersistenceMedium()
  23. {
  24. string viewState = Request.Form["__VSTATE"];
  25. if (viewState.StartsWith("C$"))
  26. {
  27. byte[] bytes = Convert.FromBase64String(viewState.Substring(2));
  28. MemoryStream ms = new MemoryStream();
  29. ms.Write(bytes, 0, bytes.Length);
  30. ms.Position = 0;
  31. GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress, true);
  32. MemoryStream ms2 = new MemoryStream();
  33. byte[] buff = new byte[65];
  34. int read = -1;
  35. read = gzip.Read(buff, 0, buff.Length);
  36. while (read > 0)
  37. {
  38. ms2.Write(buff, 0, read);
  39. read = gzip.Read(buff, 0, buff.Length);
  40. }
  41. gzip.Close();
  42. bytes = ms2.ToArray();
  43. LosFormatter format = new LosFormatter();
  44. return format.Deserialize(Convert.ToBase64String(bytes));
  45. }
  46. else
  47. {
  48. LosFormatter format = new LosFormatter();
  49. return format.Deserialize(viewState);
  50. }
  51. }
  52. /// <summary>
  53. /// saves the compressed viewstate
  54. /// </summary>
  55. /// <param name="viewState">The viewstate object to compress</param>
  56. protected override void SavePageStateToPersistenceMedium(object viewState)
  57. {
  58. LosFormatter format = new LosFormatter();
  59. StringWriter sw = new StringWriter();
  60. format.Serialize(sw, viewState);
  61. string vss = sw.ToString();
  62. if (vss.Length > 512)
  63. {
  64. byte[] bytes = Convert.FromBase64String(vss);
  65. MemoryStream ms = new MemoryStream();
  66. GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true);
  67. gzip.Write(bytes, 0, bytes.Length);
  68. gzip.Close();
  69. bytes = ms.ToArray();
  70. string vsc = Convert.ToBase64String(bytes);
  71. if (vsc.Length < vss.Length)
  72. ScriptManager.RegisterHiddenField(Page, "__VSTATE", "C$" + vsc);
  73. else
  74. ScriptManager.RegisterHiddenField(Page, "__VSTATE", vss);
  75. }
  76. else
  77. ScriptManager.RegisterHiddenField(Page, "__VSTATE", vss);
  78. }
  79. ///
  80. protected override System.Web.UI.HtmlTextWriter CreateHtmlTextWriter(System.IO.TextWriter tw)
  81. {
  82. if (Context.IsDebuggingEnabled)
  83. return base.CreateHtmlTextWriter(tw);
  84. else
  85. return new CompactHtmlTextWriter(tw);
  86. }
  87. }
  88. /// <summary>
  89. /// HtmlWriter that eliminates white space from HTML Output
  90. /// </summary>
  91. public class CompactHtmlTextWriter : HtmlTextWriter
  92. {
  93. /// <summary>
  94. /// Default Constructor
  95. /// </summary>
  96. /// <param name="writer">The text writer to use</param>
  97. public CompactHtmlTextWriter(TextWriter writer)
  98. : base(writer)
  99. { }
  100. /// <summary>
  101. /// Constructor
  102. /// </summary>
  103. /// <param name="writer">The text writer to use</param>
  104. /// <param name="tabString">Whatever character is given is replaced by string.Empty</param>
  105. public CompactHtmlTextWriter(TextWriter writer, string tabString)
  106. : base(writer, string.Empty)
  107. { }
  108. ///
  109. protected override void OutputTabs()
  110. { }
  111. ///
  112. public override string NewLine
  113. {
  114. get { return " "; }
  115. set { base.NewLine = value; }
  116. }
  117. #region WriteLine
  118. ///
  119. public override void WriteLine()
  120. { }
  121. ///
  122. public override void WriteLine(string format, object arg0)
  123. {
  124. base.WriteLine(StripWhiteSpace(format).Trim(), arg0);
  125. }
  126. ///
  127. public override void WriteLine(string format, object arg0, object arg1)
  128. {
  129. base.WriteLine(StripWhiteSpace(format).Trim(), arg0, arg1);
  130. }
  131. ///
  132. public override void WriteLine(string format, object arg0, object arg1, object arg2)
  133. {
  134. base.WriteLine(StripWhiteSpace(format).Trim(), arg0, arg1, arg2);
  135. }
  136. ///
  137. public override void WriteLine(string format, params object[] arg)
  138. {
  139. base.WriteLine(StripWhiteSpace(format).Trim(), arg);
  140. }
  141. ///
  142. public override void WriteLine(string s)
  143. {
  144. base.WriteLine(this.StripWhiteSpace(s).Trim());
  145. }
  146. #endregion
  147. #region Tags
  148. ///
  149. protected override string RenderAfterContent()
  150. {
  151. return null;
  152. }
  153. ///
  154. protected override string RenderAfterTag()
  155. {
  156. return null;
  157. }
  158. ///
  159. protected override string RenderBeforeContent()
  160. {
  161. return null;
  162. }
  163. ///
  164. protected override string RenderBeforeTag()
  165. {
  166. return null;
  167. }
  168. #endregion
  169. ///
  170. private string StripWhiteSpace(string s)
  171. {
  172. s = s.Replace("\t", " ");
  173. while (s.Contains(" "))
  174. s = s.Replace(" ", " ");
  175. return s;
  176. }
  177. }
  178. }