Revert r106068 and reopen bug #400807. The revision broke more than it fixed and...
[mono.git] / mcs / class / System.Web / System.Web.Compilation / AspParser.cs
index 6936da975565971945d172791abe6a08a50daa0e..004d9732ee3ba569e17e665958846f3e634a51ea 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,22 +44,54 @@ 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 ();
+               
                AspTokenizer tokenizer;
                int beginLine, endLine;
                int beginColumn, endColumn;
                int beginPosition, endPosition;
+               byte[] md5checksum;
                string filename;
                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; }
                }
@@ -74,6 +108,10 @@ namespace System.Web.Compilation
                        get { return endColumn; }
                }
 
+               public string FileText {
+                       get { return fileText; }
+               }
+               
                public string PlainText {
                        get {
                                if (beginPosition >= endPosition)
@@ -208,7 +246,7 @@ namespace System.Web.Compilation
                        int index = 1;
                        for (; index < str.Length; index++) {
                                if (Char.IsWhiteSpace (str [index]))
-                                       index++;
+                                       continue;
                                else if (str [index] == '"')
                                        break;
                        }
@@ -458,26 +496,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);
                }
        }