2008-11-18 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Compilation / AspParser.cs
index 0f11db41db8c3ee67e70b2065f89bea6cec1e596..6e53749095d4f7cd824a7f90b21423cbcfad8598 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 using System;
+using System.ComponentModel;
 using System.Collections;
 using System.Globalization;
 using System.IO;
 using System.Text;
 using System.Web.Util;
+using System.Security.Cryptography;
 
 namespace System.Web.Compilation
 {
@@ -42,6 +44,13 @@ namespace System.Web.Compilation
 
        class AspParser : ILocation
        {
+               static readonly object errorEvent = new object ();
+               static readonly object tagParsedEvent = new object ();
+               static readonly object textParsedEvent = new object ();
+
+#if NET_2_0
+               byte[] md5checksum;
+#endif
                AspTokenizer tokenizer;
                int beginLine, endLine;
                int beginColumn, endColumn;
@@ -50,14 +59,41 @@ namespace System.Web.Compilation
                string fileText;
                string verbatimID;
 
+               EventHandlerList events = new EventHandlerList ();
+               
+               public event ParseErrorHandler Error {
+                       add { events.AddHandler (errorEvent, value); }
+                       remove { events.RemoveHandler (errorEvent, value); }
+               }
+               
+               public event TagParsedHandler TagParsed {
+                       add { events.AddHandler (tagParsedEvent, value); }
+                       remove { events.RemoveHandler (tagParsedEvent, value); }
+               }
+               
+               public event TextParsedHandler TextParsed {
+                       add { events.AddHandler (textParsedEvent, value); }
+                       remove { events.RemoveHandler (textParsedEvent, value); }
+               }
+
                public AspParser (string filename, TextReader input)
                {
                        this.filename = filename;
                        fileText = input.ReadToEnd ();
+#if NET_2_0
+                       MD5 md5 = MD5.Create ();
+                       md5checksum = md5.ComputeHash (Encoding.UTF8.GetBytes (fileText));
+#endif
                        StringReader reader = new StringReader (fileText);
                        tokenizer = new AspTokenizer (reader);
                }
 
+#if NET_2_0
+               public byte[] MD5Checksum {
+                       get { return md5checksum; }
+               }
+#endif
+               
                public int BeginLine {
                        get { return beginLine; }
                }
@@ -368,6 +404,7 @@ namespace System.Web.Compilation
                string GetVerbatim (int token, string end)
                {
                        StringBuilder vb_text = new StringBuilder ();
+                       StringBuilder tmp = new StringBuilder ();
                        int i = 0;
 
                        if (tokenizer.Value.Length > 1){
@@ -377,15 +414,17 @@ namespace System.Web.Compilation
                        }
 
                        end = end.ToLower (CultureInfo.InvariantCulture);
+                       
                        while (token != Token.EOF){
                                if (Char.ToLower ((char) token, CultureInfo.InvariantCulture) == end [i]){
                                        if (++i >= end.Length)
                                                break;
+                                       tmp.Append ((char) token);
                                        token = tokenizer.get_token ();
                                        continue;
                                } else if (i > 0) {
-                                       for (int j = 0; j < i; j++)
-                                               vb_text.Append (end [j]);
+                                       vb_text.Append (tmp.ToString ());
+                                       tmp.Remove (0, tmp.Length);
                                        i = 0;
                                }
 
@@ -462,26 +501,25 @@ namespace System.Web.Compilation
                                  (varname ? TagType.CodeRenderExpression : TagType.CodeRender));
                }
 
-               public event ParseErrorHandler Error;
-               public event TagParsedHandler TagParsed;
-               public event TextParsedHandler TextParsed;
-
                void OnError (string msg)
                {
-                       if (Error != null)
-                               Error (this, msg);
+                       ParseErrorHandler eh = events [errorEvent] as ParseErrorHandler;
+                       if (eh != null)
+                               eh (this, msg);
                }
 
                void OnTagParsed (TagType tagtype, string id, TagAttributes attributes)
                {
-                       if (TagParsed != null)
-                               TagParsed (this, tagtype, id, attributes);
+                       TagParsedHandler eh = events [tagParsedEvent] as TagParsedHandler;
+                       if (eh != null)
+                               eh (this, tagtype, id, attributes);
                }
 
                void OnTextParsed (string text)
                {
-                       if (TextParsed != null)
-                               TextParsed (this, text);
+                       TextParsedHandler eh = events [textParsedEvent] as TextParsedHandler;
+                       if (eh != null)
+                               eh (this, text);
                }
        }