2008-01-23 Olivier Dufour <olivier.duff@gmail.com>
[mono.git] / mcs / class / System.Web / System.Web / TraceContext.cs
1 // 
2 // System.Web.TraceContext
3 //
4 // Author:
5 //   Patrik Torstensson (Patrik.Torstensson@labs2.com)
6 //   Jackson Harper (jackson@ximian.com)
7 //
8 // (C) 2002 2003, Patrik Torstensson
9 // Copyright (C) 2003,2005 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using System.Collections;
32 using System.Security.Permissions;
33 using System.Web.UI;
34
35 namespace System.Web {
36
37         // CAS - no InheritanceDemand here as the class is sealed
38         [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
39         public sealed class TraceContext {
40                 HttpContext _Context;
41                 TraceManager _traceManager;
42                 bool _Enabled;
43                 TraceMode _Mode = TraceMode.Default;
44                 TraceData data;
45                 bool data_saved;
46                 bool _haveTrace;
47                 Hashtable view_states;
48 #if NET_2_0
49                 Hashtable control_states;
50 #endif
51                 Hashtable sizes;
52
53                 public TraceContext (HttpContext Context)
54                 {
55                         _Context = Context;
56                 }
57
58                 internal bool HaveTrace {
59                         get {
60                                 return _haveTrace;
61                         }
62                 }
63
64                 public bool IsEnabled {
65                         get {
66                                 if (!_haveTrace)
67                                         return TraceManager.Enabled;
68                                 return _Enabled;
69                         }
70
71                         set {
72                                 if (value && data == null)
73                                         data = new TraceData ();
74                                 _haveTrace = true;
75                                 _Enabled = value;
76                         }
77                 }
78
79                 TraceManager TraceManager
80                 {
81                         get
82                         {
83                                 if (_traceManager == null)
84                                         _traceManager = HttpRuntime.TraceManager;
85
86                                 return _traceManager;
87                         }
88                 }
89
90                 public TraceMode TraceMode {
91                         get {
92                                 return (_Mode == TraceMode.Default) ? TraceManager.TraceMode : _Mode;
93                         }
94                         set {
95                                 _Mode = value;
96                         }
97                 }
98
99                 public void Warn(string msg)
100                 {
101                         Write (String.Empty, msg, null, true);
102                 }
103
104                 public void Warn(string category, string msg)
105                 {
106                         Write (category, msg, null, true);
107                 }
108
109                 public void Warn (string category, string msg, Exception error)
110                 {
111                         Write (category, msg, error, true);
112                 }
113
114                 public void Write (string msg)
115                 {
116                         Write (String.Empty, msg, null, false);
117                 }
118
119                 public void Write (string category, string msg)
120                 {
121                         Write (category, msg, null, false);
122                 }
123
124                 public void Write (string category, string msg, Exception error)
125                 {
126                         Write (category, msg, error, false);
127                 }
128
129                 void Write (string category, string msg, Exception error, bool Warning)
130                 {
131                         if (!IsEnabled)
132                                 return;
133                         if (data == null)
134                                 data = new TraceData ();
135                         data.Write (category, msg, error, Warning);
136                 }
137 #if NET_2_0
138                 public event TraceContextEventHandler TraceFinished;
139 #endif
140                 internal void SaveData ()
141                 {
142                         if (data == null)
143                                 data = new TraceData ();
144
145                         data.TraceMode = _Context.Trace.TraceMode;
146
147                         SetRequestDetails ();
148                         if (_Context.Handler is Page)
149 #if NET_2_0
150                                 data.AddControlTree ((Page) _Context.Handler, view_states, control_states, sizes);
151 #else
152                                 data.AddControlTree ((Page) _Context.Handler, view_states, sizes);
153 #endif
154
155                         AddCookies ();
156                         AddHeaders ();
157                         AddServerVars ();
158                         TraceManager.AddTraceData (data);
159                         data_saved = true;
160                 }
161
162                 internal void SaveViewState (Control ctrl, object vs)
163                 {
164                         if (view_states == null)
165                                 view_states = new Hashtable ();
166
167                         view_states [ctrl] = vs;
168                 }
169
170 #if NET_2_0
171                 internal void SaveControlState (Control ctrl, object vs) {
172                         if (control_states == null)
173                                 control_states = new Hashtable ();
174
175                         control_states [ctrl] = vs;
176                 }
177 #endif
178
179                 internal void SaveSize (Control ctrl, int size)
180                 {
181                         if (sizes == null)
182                                 sizes = new Hashtable ();
183
184                         sizes [ctrl] = size;
185                 }
186
187                 internal void Render (HtmlTextWriter output)
188                 {
189                         if (!data_saved)
190                                 SaveData ();
191                         data.Render (output);
192                 }
193
194                 void SetRequestDetails ()
195                 {
196                         data.RequestPath = _Context.Request.FilePath;
197                         data.SessionID = (_Context.Session != null ? _Context.Session.SessionID : String.Empty);
198                         data.RequestType = _Context.Request.RequestType;
199                         data.RequestTime = _Context.Timestamp;
200                         data.StatusCode = _Context.Response.StatusCode;
201                         data.RequestEncoding = _Context.Request.ContentEncoding;
202                         data.ResponseEncoding = _Context.Response.ContentEncoding;
203                 }
204
205                 void AddCookies ()
206                 {
207                         foreach (string key in _Context.Request.Cookies.Keys)
208                                 data.AddCookie (key, _Context.Request.Cookies [key].Value);
209                 }
210
211                 void AddHeaders ()
212                 {
213                         foreach (string key in _Context.Request.Headers.Keys)
214                                 data.AddHeader (key, _Context.Request.Headers [key]);
215                 }
216
217                 void AddServerVars ()
218                 {
219                         foreach (string key in _Context.Request.ServerVariables)
220                                 data.AddServerVar (key, _Context.Request.ServerVariables [key]);
221                 }
222         }
223 }
224