* TraceData.cs: New class for storing trace data. Data is stored
authorJackson Harper <jackson@novell.com>
Sat, 10 Jan 2004 09:06:39 +0000 (09:06 -0000)
committerJackson Harper <jackson@novell.com>
Sat, 10 Jan 2004 09:06:39 +0000 (09:06 -0000)
here instead of the trace context so it can be saved and accessed
from the trace handler.
* TraceContext.cs: Save data in the TraceData object, let the
trace data object handle the rendering.

svn path=/trunk/mcs/; revision=21896

mcs/class/System.Web/System.Web/ChangeLog
mcs/class/System.Web/System.Web/TraceContext.cs
mcs/class/System.Web/System.Web/TraceData.cs [new file with mode: 0644]

index 3a7b94762be121d04542c308f79dcf8be0e01b78..0f8f716b916da44a96bb3baea00eab33a6fc0447 100644 (file)
@@ -1,3 +1,11 @@
+2004-01-10  Jackson Harper <jackson@ximian.com>
+
+       * TraceData.cs: New class for storing trace data. Data is stored
+       here instead of the trace context so it can be saved and accessed
+       from the trace handler.
+       * TraceContext.cs: Save data in the TraceData object, let the
+       trace data object handle the rendering.
+       
 2004-01-08  Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * HttpRequest.cs: use ContentEncoding for QueryString. Fixes bug #52577.
index d608f09d4775ce84da3a09d240c66de6b1e5224f..9924b6e3af39e13279736fa1a4af0e49350c5703 100644 (file)
@@ -19,16 +19,12 @@ namespace System.Web {
       private HttpContext _Context;\r
       private bool _Enabled;\r
       private TraceMode _Mode;\r
-      private DataTable info;\r
-      private bool is_first;\r
-      private DateTime first_time;\r
-      private double prev_time;\r
-      private int control_pos;\r
-\r
+      private TraceData data;\r
+      private bool data_saved;\r
+           \r
       public TraceContext(HttpContext Context) {\r
         _Context = Context;\r
         _Enabled = false;\r
-         is_first = true;\r
       }\r
 \r
       public bool IsEnabled {\r
@@ -37,8 +33,8 @@ namespace System.Web {
         }\r
 \r
         set {\r
-                if (value && info == null)\r
-                        InitInfoTable ();\r
+                if (value && data == null)\r
+                        data = new TraceData ();\r
            _Enabled = value;\r
         }\r
       }\r
@@ -81,300 +77,52 @@ namespace System.Web {
       private void Write(string category, string msg, Exception error, bool Warning) {\r
              if (!_Enabled)\r
                      return;\r
-               \r
-              double time;\r
-             if (is_first) {\r
-                  time = 0;\r
-                  is_first = false;\r
-                  first_time = DateTime.Now;\r
-              } else\r
-                  time = (DateTime.Now - first_time).TotalSeconds;\r
-\r
-             DataRow r = info.NewRow ();\r
-             r ["Category"] = category;\r
-             r ["Message"] = msg;\r
-             r ["Exception"] = (error != null ? error.ToString () : null);\r
-             r ["TimeSinceFirst"] = time;\r
-             r ["IsWarning"] = Warning;\r
-\r
-             info.Rows.Add (r);\r
+             data.Write (category, msg, error, Warning);\r
       }\r
 \r
-          private void InitInfoTable ()\r
-          {\r
-                  info = new DataTable ();\r
-                  info.Columns.Add (new DataColumn ("Category", typeof (string)));\r
-                  info.Columns.Add (new DataColumn ("Message", typeof (string)));\r
-                  info.Columns.Add (new DataColumn ("Exception", typeof (string)));\r
-                  info.Columns.Add (new DataColumn ("TimeSinceFirst", typeof (double)));\r
-                  info.Columns.Add (new DataColumn ("IsWarning", typeof (bool)));\r
-          }\r
-\r
+           internal void SaveData ()\r
+           {\r
+                   SetRequestDetails ();\r
+                  data.AddControlTree ((Page) _Context.Handler);\r
+                  AddCookies ();\r
+                  AddHeaders ();\r
+                  AddServerVars ();\r
+                   data_saved = true;\r
+           }\r
+           \r
           internal void Render (HtmlTextWriter output)\r
           {\r
-                  output.AddAttribute ("id", "__asptrace");\r
-                  output.RenderBeginTag (HtmlTextWriterTag.Div);\r
-\r
-                  RenderStyleSheet (output);\r
-\r
-                  output.AddAttribute ("class", "tracecontent");\r
-                  output.RenderBeginTag (HtmlTextWriterTag.Span);\r
-                  \r
-                  RenderRequestDetails (output);\r
-                  RenderTraceInfo (output);\r
-                  RenderControlTree (output);\r
-                  RenderCookies (output);\r
-                  RenderHeaders (output);\r
-                  RenderServerVars (output);\r
-                  \r
-                  output.RenderEndTag ();\r
-                  output.RenderEndTag ();\r
-          }\r
-\r
-          private void RenderRequestDetails (HtmlTextWriter output)\r
-          {\r
-                  Table table = CreateTable ();\r
-\r
-                  table.Rows.Add (AltRow ("Request Details:"));\r
-                  table.Rows.Add (InfoRow2 ("Session Id:", _Context.Session.SessionID,\r
-                                                  "Request Type", _Context.Request.RequestType));\r
-                  table.Rows.Add (InfoRow2 ("Time of Request:", _Context.Timestamp.ToString (),\r
-                                                  "State Code:", _Context.Response.StatusCode.ToString ()));\r
-                  table.Rows.Add (InfoRow2 ("Request Encoding:", _Context.Request.ContentEncoding.EncodingName,\r
-                                                  "Response Encoding:", _Context.Response.ContentEncoding.EncodingName));                                                   \r
-                  table.RenderControl (output);\r
+                   if (data_saved)\r
+                           SaveData ();\r
+                  data.Render (output);\r
           }\r
 \r
-          private void RenderTraceInfo (HtmlTextWriter output)\r
+          private void SetRequestDetails ()\r
           {\r
-                  Table table = CreateTable ();\r
-\r
-                  table.Rows.Add (AltRow ("Trace Information"));\r
-                  table.Rows.Add (SubHeadRow ("Category", "Message", "From First(s)", "From Lasts(s)"));\r
-\r
-                  int pos = 0;\r
-                  foreach (DataRow r in info.Rows)\r
-                          RenderTraceInfoRow (table, r, pos++);\r
-                  \r
-                  table.RenderControl (output);\r
+                  data.SessionID = _Context.Session.SessionID;\r
+                  data.RequestType = _Context.Request.RequestType;\r
+                  data.RequestTime = _Context.Timestamp;\r
+                  data.StatusCode = _Context.Response.StatusCode;\r
+                  data.RequestEncoding = _Context.Request.ContentEncoding;\r
+                  data.ResponseEncoding = _Context.Response.ContentEncoding;\r
           }\r
 \r
-          private void RenderControlTree (HtmlTextWriter output)\r
+          private void AddCookies ()\r
           {\r
-                  Table table = CreateTable ();\r
-\r
-                  table.Rows.Add (AltRow ("Control Tree"));\r
-                  table.Rows.Add (SubHeadRow ("Control Id", "Type",\r
-                                                  "Render Size Bytes (including children)",\r
-                                                  "Viewstate Size Bytes (excluding children)"));\r
-\r
-                  Page page = (Page) _Context.Handler;\r
-                  control_pos = 0;\r
-                  RenderControl (table, page, "__PAGE", "", control_pos);\r
-\r
-                  table.RenderControl (output);\r
-          }\r
-                  \r
-          private void RenderCookies (HtmlTextWriter output)\r
-          {\r
-                  Table table = CreateTable ();\r
-\r
-                  table.Rows.Add (AltRow ("Cookies Collection"));\r
-                  table.Rows.Add (SubHeadRow ("Name", "Value", "Size"));\r
-\r
-                  int pos = 0;\r
                   foreach (string key in _Context.Request.Cookies.Keys)\r
-                          RenderCookie (table, _Context.Request.Cookies [key], pos++);\r
-                  \r
-                  table.RenderControl (output);\r
+                          data.AddCookie (key, _Context.Request.Cookies [key].Value);\r
           }\r
           \r
-          private void RenderHeaders (HtmlTextWriter output)\r
+          private void AddHeaders ()\r
           {\r
-                  Table table = CreateTable ();\r
-\r
-                  table.Rows.Add (AltRow ("Headers Collection"));\r
-                  table.Rows.Add (SubHeadRow ("Name", "Value"));\r
-\r
-                  int pos = 0;\r
                   foreach (string key in _Context.Request.Headers.Keys)\r
-                          RenderHeader (table, key, _Context.Request.Headers [key], pos++);\r
-\r
-                  table.RenderControl (output);\r
+                          data.AddHeader (key, _Context.Request.Headers [key]);\r
           }\r
 \r
-          private void RenderServerVars (HtmlTextWriter output)\r
+          private void AddServerVars ()\r
           {\r
-                  Table table = CreateTable ();\r
-\r
-                  table.Rows.Add (AltRow ("Server Variables"));\r
-                  table.Rows.Add (SubHeadRow ("Name", "Value"));\r
-\r
-                  int pos = 0;\r
                   foreach (string key in _Context.Request.ServerVariables)\r
-                          RenderServerVar (table, key, _Context.Request.ServerVariables [key], pos++);\r
-\r
-                  table.RenderControl (output);\r
-          }\r
-\r
-          private void RenderServerVar (Table table, string name, string value, int pos)\r
-          {\r
-                  RenderAltRow (table, pos, name, value);\r
-          }\r
-          \r
-          private void RenderHeader (Table table, string name, string value, int pos)\r
-          {\r
-                  RenderAltRow (table, pos, name, value);\r
-          }\r
-          \r
-          private void RenderCookie (Table table, HttpCookie c, int pos)\r
-          {\r
-                  int length = c.Name.Length + (c.Value == null ? 0 : c.Value.Length);\r
-                  RenderAltRow (table, pos, c.Name, c.Value, length.ToString ());\r
-          }\r
-          \r
-          private void RenderControl (Table table, Control c, string id, string p, int pos)\r
-          {\r
-                  RenderAltRow (table, pos, p + id, c.GetType ().FullName, "&nbsp;", "&nbsp;");\r
-                  \r
-                  foreach (Control child in c.Controls)\r
-                          RenderControl (table, child, c.UniqueID, p + "&nbsp;&nbsp;&nbsp;&nbsp;", ++control_pos);\r
-          }\r
-          \r
-          private TableRow AltRow (string title)\r
-          {\r
-                  TableRow row = new TableRow ();\r
-                  TableHeaderCell header = new TableHeaderCell ();\r
-                  header.CssClass = "alt";\r
-                  header.HorizontalAlign = HorizontalAlign.Left;\r
-                  header.Attributes ["colspan"] = "10";\r
-                  header.Text = "<h3><b>" + title + "</b></h3>";\r
-\r
-                  row.Cells.Add (header);\r
-                  return row;\r
-          }\r
-\r
-          private TableRow RenderTraceInfoRow (Table table, DataRow r, int pos)\r
-          {\r
-                  string open, close;\r
-                  open = close = String.Empty;\r
-                  if ((bool) r ["IsWarning"]) {\r
-                          open = "<font color=\"Red\">";\r
-                          close = "</font>";\r
-                  }\r
-                  \r
-                  double t = (double) r ["TimeSinceFirst"];\r
-                  string t1, t2;\r
-                  if (t == 0) {\r
-                       t1 = t2 = String.Empty;\r
-                       prev_time = 0;\r
-                  } else {\r
-                       t1 = t.ToString ("0.000000");\r
-                       t2 = (t - prev_time).ToString ("0.000000");\r
-                       prev_time = t;\r
-                  }\r
\r
-                  return RenderAltRow (table, pos, open + (string) r ["Category"] + close,\r
-                                  open + (string) r ["Message"] + close, t1, t2);\r
-          }\r
-          \r
-          private TableRow SubHeadRow (params string[] cells)\r
-          {\r
-                  TableRow row = new TableRow ();\r
-                  foreach (string s in cells) {\r
-                          TableHeaderCell cell = new TableHeaderCell ();\r
-                          cell.Text = s;\r
-                          row.Cells.Add (cell);\r
-                  }\r
-\r
-                  row.CssClass = "subhead";\r
-                  row.HorizontalAlign = HorizontalAlign.Left;\r
-                  \r
-                  return row;\r
-          }\r
-          \r
-          private TableRow RenderAltRow (Table table, int pos, params string[] cells)\r
-          {\r
-                  TableRow row = new TableRow ();\r
-                  foreach (string s in cells) {\r
-                          TableCell cell = new TableCell ();\r
-                          cell.Text = s;\r
-                          row.Cells.Add (cell);\r
-                  }\r
-\r
-                  if ((pos % 2) != 0)\r
-                          row.CssClass = "alt";\r
-\r
-                  table.Rows.Add (row);\r
-                  return row;\r
-          }\r
-          \r
-          private TableRow InfoRow2 (string title1, string info1, string title2, string info2)\r
-          {\r
-                  TableRow row = new TableRow ();\r
-                  TableHeaderCell header1 = new TableHeaderCell ();\r
-                  TableHeaderCell header2 = new TableHeaderCell ();\r
-                  TableCell cell1 = new TableCell ();\r
-                  TableCell cell2 = new TableCell ();\r
-\r
-                  header1.Text = title1;\r
-                  header2.Text = title2;\r
-                  cell1.Text = info1;\r
-                  cell2.Text = info2;\r
-\r
-                  row.Cells.Add (header1);\r
-                  row.Cells.Add (cell1);\r
-                  row.Cells.Add (header2);\r
-                  row.Cells.Add (cell2);\r
-\r
-                  row.HorizontalAlign = HorizontalAlign.Left;\r
-                  \r
-                  return row;\r
-          }\r
-\r
-          private Table CreateTable ()\r
-          {\r
-                  Table table = new Table ();\r
-\r
-                  table.Width = Unit.Percentage (100);\r
-                  table.CellSpacing = 0;\r
-                  table.CellPadding = 0;\r
-\r
-                  return table;\r
-          }\r
-          \r
-          private void RenderStyleSheet (HtmlTextWriter o)\r
-          {\r
-                  o.WriteLine ("<style type=\"text/css\">");\r
-                  o.Write ("span.tracecontent { background-color:white; ");\r
-                  o.WriteLine ("color:black;font: 10pt verdana, arial; }");\r
-                  o.Write ("span.tracecontent table { font: 10pt verdana, ");\r
-                  o.WriteLine ("arial; cellspacing:0; cellpadding:0; margin-bottom:25}");\r
-                  o.WriteLine ("span.tracecontent tr.subhead { background-color:cccccc;}");\r
-                  o.WriteLine ("span.tracecontent th { padding:0,3,0,3 }");\r
-                  o.WriteLine ("span.tracecontent th.alt { background-color:black; color:white; padding:3,3,2,3; }");\r
-                  o.WriteLine ("span.tracecontent td { padding:0,3,0,3 }");\r
-                  o.WriteLine ("span.tracecontent tr.alt { background-color:eeeeee }");\r
-                  o.WriteLine ("span.tracecontent h1 { font: 24pt verdana, arial; margin:0,0,0,0}");\r
-                  o.WriteLine ("span.tracecontent h2 { font: 18pt verdana, arial; margin:0,0,0,0}");\r
-                  o.WriteLine ("span.tracecontent h3 { font: 12pt verdana, arial; margin:0,0,0,0}");\r
-                  o.WriteLine ("span.tracecontent th a { color:darkblue; font: 8pt verdana, arial; }");\r
-                  o.WriteLine ("span.tracecontent a { color:darkblue;text-decoration:none }");\r
-                  o.WriteLine ("span.tracecontent a:hover { color:darkblue;text-decoration:underline; }");\r
-                  o.WriteLine ("span.tracecontent div.outer { width:90%; margin:15,15,15,15}");\r
-                  o.Write ("span.tracecontent table.viewmenu td { background-color:006699; ");\r
-                  o.WriteLine ("color:white; padding:0,5,0,5; }");\r
-                  o.WriteLine ("span.tracecontent table.viewmenu td.end { padding:0,0,0,0; }");\r
-                  o.WriteLine ("span.tracecontent table.viewmenu a {color:white; font: 8pt verdana, arial; }");\r
-                  o.WriteLine ("span.tracecontent table.viewmenu a:hover {color:white; font: 8pt verdana, arial; }");\r
-                  o.WriteLine ("span.tracecontent a.tinylink {color:darkblue; font: 8pt verdana, ");\r
-                  o.WriteLine ("arial;text-decoration:underline;}");\r
-                  o.WriteLine ("span.tracecontent a.link {color:darkblue; text-decoration:underline;}");\r
-                  o.WriteLine ("span.tracecontent div.buffer {padding-top:7; padding-bottom:17;}");\r
-                  o.WriteLine ("span.tracecontent .small { font: 8pt verdana, arial }");\r
-                  o.WriteLine ("span.tracecontent table td { padding-right:20 }");\r
-                  o.WriteLine ("span.tracecontent table td.nopad { padding-right:5 }");\r
-                  o.WriteLine ("</style>");\r
+                          data.AddServerVar (key, _Context.Request.ServerVariables [key]);\r
           }\r
    }\r
 }\r
diff --git a/mcs/class/System.Web/System.Web/TraceData.cs b/mcs/class/System.Web/System.Web/TraceData.cs
new file mode 100644 (file)
index 0000000..d2f812f
--- /dev/null
@@ -0,0 +1,421 @@
+//
+// System.Web.TraceData
+//
+// Author(s):
+//  Jackson Harper (jackson@ximian.com)
+//
+// (C) 2004 Novell, Inc (http://www.novell.com)
+//
+
+
+using System;
+using System.Text;
+using System.Data;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace System.Web {
+
+       internal class TraceData {
+
+               private bool is_first_time;
+               private DateTime first_time;
+               private double prev_time;
+               
+               private DataTable info;
+               private DataTable control_data;
+               private DataTable cookie_data;
+               private DataTable header_data;
+               private DataTable servervar_data;
+
+               private string session_id;
+               private DateTime request_time;
+               private Encoding request_encoding;
+               private Encoding response_encoding;
+               private string request_type;
+               private int status_code;
+
+               public TraceData ()
+               {
+                       info = new DataTable ();
+                       info.Columns.Add (new DataColumn ("Category", typeof (string)));
+                       info.Columns.Add (new DataColumn ("Message", typeof (string)));
+                       info.Columns.Add (new DataColumn ("Exception", typeof (string)));
+                       info.Columns.Add (new DataColumn ("TimeSinceFirst", typeof (double)));
+                       info.Columns.Add (new DataColumn ("IsWarning", typeof (bool)));
+
+                       control_data = new DataTable ();
+                       control_data.Columns.Add (new DataColumn ("ControlId", typeof (string)));
+                       control_data.Columns.Add (new DataColumn ("Type", typeof (System.Type)));
+                       control_data.Columns.Add (new DataColumn ("RenderSize", typeof (int)));
+                       control_data.Columns.Add (new DataColumn ("ViewstateSize", typeof (int)));
+                       control_data.Columns.Add (new DataColumn ("Depth", typeof (int)));
+
+                       cookie_data = new DataTable ();
+                       cookie_data.Columns.Add (new DataColumn ("Name", typeof (string)));
+                       cookie_data.Columns.Add (new DataColumn ("Value", typeof (string)));
+
+                       header_data = new DataTable ();
+                       header_data.Columns.Add (new DataColumn ("Name", typeof (string)));
+                       header_data.Columns.Add (new DataColumn ("Value", typeof (string)));
+
+                       servervar_data = new DataTable ();
+                       servervar_data.Columns.Add (new DataColumn ("Name", typeof (string)));
+                       servervar_data.Columns.Add (new DataColumn ("Value", typeof (string)));
+
+                       is_first_time = true;
+               }
+
+               public string SessionID {
+                       get { return session_id; }
+                       set { session_id = value; }
+               }
+
+               public DateTime RequestTime {
+                       get { return request_time; }
+                       set { request_time = value; }
+               }
+
+               public Encoding RequestEncoding {
+                       get { return request_encoding; }
+                       set { request_encoding = value; }
+               }
+
+               public Encoding ResponseEncoding {
+                       get { return response_encoding; }
+                       set { response_encoding = value; }
+               }
+
+               public string RequestType {
+                       get { return request_type; }
+                       set { request_type = value; }
+               }
+
+               public int StatusCode {
+                       get { return status_code; }
+                       set { status_code = value; }
+               }
+
+               public void Write (string category, string msg, Exception error, bool Warning)
+               {
+                       double time;
+                       if (is_first_time) {
+                               time = 0;
+                               is_first_time = false;
+                               first_time = DateTime.Now;
+                       } else
+                               time = (DateTime.Now - first_time).TotalSeconds;
+
+                       DataRow r = info.NewRow ();
+                       r ["Category"] = category;
+                       r ["Message"] = msg;
+                       r ["Exception"] = (error != null ? error.ToString () : null);
+                       r ["TimeSinceFirst"] = time;
+                       r ["IsWarning"] = Warning;
+
+                       info.Rows.Add (r);
+               }
+
+               public void AddControlTree (Page page)
+               {
+                       AddControl (page, 0);
+               }
+
+               private void AddControl (Control c, int control_pos)
+               {
+                       DataRow r = control_data.NewRow ();
+                       r ["ControlId"] = c.UniqueID;
+                       r ["Type"] = c.GetType ();
+                       r ["Depth"] = control_pos;
+
+                       control_data.Rows.Add (r);
+                       
+                       foreach (Control child in c.Controls)
+                               AddControl (child, control_pos++);
+               }
+
+               public void AddCookie (string name, string value)
+               {
+                       DataRow r = cookie_data.NewRow ();
+
+                       r ["Name"] = name;
+                       r ["Value"] = value;
+
+                       cookie_data.Rows.Add (r);
+               }
+
+               public void AddHeader (string name, string value)
+               {
+                       DataRow r = header_data.NewRow ();
+
+                       r ["Name"] = name;
+                       r ["Value"] = value;
+
+                       header_data.Rows.Add (r);
+               }
+
+               public void AddServerVar (string name, string value)
+               {
+                       DataRow r = servervar_data.NewRow ();
+
+                       r ["Name"] = name;
+                       r ["Value"] = value;
+
+                       servervar_data.Rows.Add (r);
+               }
+               
+               public void Render (HtmlTextWriter output)
+               {
+                       output.AddAttribute ("id", "__asptrace");
+                       output.RenderBeginTag (HtmlTextWriterTag.Div);
+                       
+                       RenderStyleSheet (output);
+                       
+                       output.AddAttribute ("class", "tracecontent");
+                       output.RenderBeginTag (HtmlTextWriterTag.Span);
+                       
+                       RenderRequestDetails (output);
+                       RenderTraceInfo (output);
+                       RenderControlTree (output);
+                       RenderCookies (output);
+                       RenderHeaders (output);
+                       RenderServerVars (output);
+                       
+                       output.RenderEndTag ();
+                       output.RenderEndTag ();
+               }
+               
+               private void RenderRequestDetails (HtmlTextWriter output)
+               {
+                       Table table = CreateTable ();
+                       
+                       table.Rows.Add (AltRow ("Request Details:"));
+                       table.Rows.Add (InfoRow2 ("Session Id:", session_id,
+                                                       "Request Type", request_type));
+                       table.Rows.Add (InfoRow2 ("Time of Re        quest:", request_time.ToString (),
+                                                       "State Code:", status_code.ToString ()));
+                       table.Rows.Add (InfoRow2 ("Request Encoding:", request_encoding.EncodingName,
+                                                  "Response Encoding:", response_encoding.EncodingName));           
+                       table.RenderControl (output);
+               }
+               
+               private void RenderTraceInfo (HtmlTextWriter output)
+               {
+                       Table table = CreateTable ();
+                       
+                       table.Rows.Add (AltRow ("Trace Information"));
+                       table.Rows.Add (SubHeadRow ("Category", "Message", "From First(s)", "From Lasts(s)"));
+                       
+                       int pos = 0;
+                       foreach (DataRow r in info.Rows)
+                               RenderTraceInfoRow (table, r, pos++);
+                       
+                       table.RenderControl (output);
+               }
+               
+               private void RenderControlTree (HtmlTextWriter output)
+               {
+                       Table table = CreateTable ();
+                       
+                       table.Rows.Add (AltRow ("Control Tree"));
+                       table.Rows.Add (SubHeadRow ("Control Id", "Type",
+                                                       "Render Size Bytes (including children)",
+                                                       "View        state Size Bytes (excluding children)"));
+                       
+                       int pos = 0;
+                       foreach (DataRow r in control_data.Rows) {
+                               int depth = (int) r ["Depth"];
+                               string prefix = String.Empty;
+                               for (int i=0; i<depth; i++)
+                                       prefix += "&nb       sp;&nbsp;&nbsp;&nbsp;";
+                               RenderAltRow (table, pos++, prefix + r ["ControlId"],
+                                               r ["Type"].ToString (), "&nbsp;", "&nbsp;");
+                       }
+                       
+                       table.RenderControl (output);
+               }
+                  
+               private void RenderCookies (HtmlTextWriter output)
+               {
+                       Table table = CreateTable ();
+                       
+                       table.Rows.Add (AltRow ("Cookies Collection"));
+                       table.Rows.Add (SubHeadRow ("Name", "Value", "Size"));
+                       
+                       int pos = 0;
+                       foreach (DataRow r in cookie_data.Rows) {
+                               string name = (string) r ["Name"];
+                               string value = (string) r ["Value"];
+                               int length = name.Length + (value == null ? 0 : value.Length);
+                               RenderAltRow (table, pos++, name, value, length.ToString ());
+                       }
+                       
+                       table.RenderControl (output);
+               }
+               
+               private void RenderHeaders (HtmlTextWriter output)
+               {
+                       Table table = CreateTable ();
+                       
+                       table.Rows.Add (AltRow ("Headers Collection"));
+                       table.Rows.Add (SubHeadRow ("Name", "Value"));
+                       
+                       int pos = 0;
+                       foreach (DataRow r in header_data.Rows)
+                               RenderAltRow (table, pos++, (string) r ["Name"], (string) r ["Value"]);
+                       
+                       table.RenderControl (output);
+               }
+               
+               private void RenderServerVars (HtmlTextWriter output)
+               {
+                       Table table = CreateTable ();
+                       
+                       table.Rows.Add (AltRow ("Server Variables"));
+                       table.Rows.Add (SubHeadRow ("Name", "Value"));
+                       
+                       int pos = 0;
+                       foreach (DataRow r in servervar_data.Rows)
+                               RenderAltRow (table, pos++, (string) r ["Name"], (string) r ["Value"]);
+                       
+                       table.RenderControl (output);
+               }
+               
+               private TableRow AltRow (string title)
+               {
+                       TableRow row = new TableRow ();
+                       TableHeaderCell header = new TableHeaderCell ();
+                       header.CssClass = "alt";
+                       header.HorizontalAlign = HorizontalAlign.Left;
+                       header.Attributes [" colspan"] = "10";
+                       header.Text = "<h3><b>" + title + "</b></h3>";
+
+                       row.Cells.Add (header);
+                       return row;
+               }
+               
+               private TableRow RenderTraceInfoRow (Table table, DataRow r, int pos)
+               {
+                       string open, close;
+                       open = close = String.Empty;
+                       if ((bool) r ["IsWarning"]) {
+                               open = "<font color=\"Red\">";
+                               close = "</f ont>";
+                       }
+                       
+                       double t = (double) r ["TimeSinceFirst"];
+                       string t1, t2;
+                       if (t == 0) {
+                               t1 = t2 = String.Empty;
+                               prev_time = 0;
+                       } else {
+                               t1 = t.ToString ("0.000000");
+                               t2 = (t - prev_time).ToString ("0.000000");
+                               prev_time = t;
+                       }
+                       
+                       return RenderAltRow (table, pos, open + (string) r ["Category"] + close,
+                                       open + (string) r ["Message"] + close, t1, t2);
+               }
+          
+               private TableRow SubHeadRow (params string[] cells)
+               {
+                       TableRow row = new TableRow ();
+                       foreach (string s in cells) {
+                               TableHeaderCell cell = new TableHeaderCell ();
+                               cell.Text = s;
+                               row.Cells.Add (cell);
+                       }
+                       
+                       row.CssClass = "subhead";
+                       row.HorizontalAlign = HorizontalAlign.Left;
+                       
+                       return row;
+               }
+               
+               private TableRow RenderAltRow (Table table, int pos, params string[] cells)
+               {
+                       TableRow row = new TableRow ();
+                       foreach (string s in cells) {
+                               TableCell cell = new TableCell ();
+                               cell.Text = s;
+                               row.Cells.Add (cell);
+                  }
+                       
+                       if ((pos % 2) != 0)
+                               row.CssClass = "alt";
+                       
+                       table.Rows.Add (row);
+                       return row;
+               }
+          
+               private TableRow InfoRow2 (string title1, string info1, string title2, string info2)
+               {
+                       TableRow row = new TableRow ();
+                       TableHeaderCell header1 = new TableHeaderCell ();
+                       TableHeaderCell header2 = new TableHeaderCell ();
+                       TableCell cell1 = new TableCell ();
+                       TableCell cell2 = new TableCell ();
+                       
+                       header1.Text = title1;
+                       header2.Text = title2;
+                       cell1.Text = info1;
+                       cell2.Text = info2;
+                       
+                       row.Cells.Add (header1);
+                       row.Cells.Add (cell1);
+                       row.Cells.Add (header2);
+                       row.Cells.Add (cell2);
+
+                       row.HorizontalAlign = HorizontalAlign.Left;
+                       
+                       return row;
+               }
+               
+               private Table CreateTable ()
+               {
+                       Table table = new Table ();
+                       
+                       table.Width = Unit.Percentage (100);
+                       table.CellSpacing = 0;
+                       table.CellPadding = 0;
+                       
+                       return table;
+               }
+               
+               private void RenderStyleSheet (HtmlTextWriter o)
+               {
+                       o.WriteLine ("<style type=\"text/css\">");
+                       o.Write ("span.tracecontent { background-color:white; ");
+                       o.WriteLine ("color:black;font: 10pt verdana, arial; }");
+                       o.Write ("span.tracecontent table { font: 10pt verdana, ");
+                       o.WriteLine ("arial; cellspacing:0; cellpadding:0; margin-bottom:25}");
+                       o.WriteLine ("span.tracecontent tr.subhead { background-color:cccccc;}");
+                       o.WriteLine ("span.tracecontent th { padding:0,3,0,3 }");
+                       o.WriteLine ("span.tracecontent th.alt { background-color:black; color:white; padding:3,3,2,3; }");
+                       o.WriteLine ("span.tracecontent td { padding:0,3,0,3 }");
+                       o.WriteLine ("span.tracecontent tr.alt { background-color:eeeeee }");
+                       o.WriteLine ("span.tracecontent h1 { font: 24pt verdana, arial; margin:0,0,0,0}");
+                       o.WriteLine ("span.tracecontent h2 { font: 18pt verdana, arial; margin:0,0,0,0}");
+                       o.WriteLine ("span.tracecontent h3 { font: 12pt verdana, arial; margin:0,0,0,0}");
+                       o.WriteLine ("span.tracecontent th a { color:darkblue; font: 8pt verdana, arial; }");
+                       o.WriteLine ("span.tracecontent a { color:darkblue;text-decoration:none }");
+                       o.WriteLine ("span.tracecontent a:hover { color:darkblue;text-decoration:underline; }");
+                       o.WriteLine ("span.tracecontent div.outer { width:90%; margin:15,15,15,15}");
+                       o.Write ("span.tracecontent table.viewmenu td { background-color:006699; ");
+                       o.WriteLine ("color:white; padding:0,5,0,5; }");
+                       o.WriteLine ("span.tracecontent table.viewmenu td.end { padding:0,0,0,0; }");
+                       o.WriteLine ("span.tracecontent table.viewmenu a {color:white; font: 8pt verdana, arial; }");
+                       o.WriteLine ("span.tracecontent table.viewmenu a:hover {color:white; font: 8pt verdana, arial; }");
+                       o.WriteLine ("span.tracecontent a.tinylink {color:darkblue; font: 8pt verdana, ");
+                       o.WriteLine ("arial;text-decoration:underline;}");
+                       o.WriteLine ("span.tracecontent a.link {color:darkblue; text-decoration:underline;}");
+                       o.WriteLine ("span.tracecontent div.buffer {padding-top:7; padding-bottom:17;}");
+                       o.WriteLine ("span.tracecontent .small { font: 8pt verdana, arial }");
+                       o.WriteLine ("span.tracecontent table td { padding-right:20 }");
+                       o.WriteLine ("span.tracecontent table td.nopad { padding-right:5 }");
+                       o.WriteLine ("</style>");
+               }
+       }
+}
+