Merge pull request #2454 from tastywheattasteslikechicken/FixVtableAbort
[mono.git] / mcs / class / System.Web / System.Web.Profile / ProfileModule.cs
index 101f6d3a2ec35e0dfd179207c82dd0a1fb9dba83..69374357fc2542d859b2fd239cb7bb06e3c99ff3 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
 using System;
+using System.ComponentModel;
 using System.Web;
+using System.Web.Configuration;
+using System.Text;
 
 namespace System.Web.Profile
 {
        public sealed class ProfileModule : IHttpModule
        {
+               static readonly object migrateAnonymousEvent = new object ();
+               static readonly object personalizeEvent = new object ();
+               static readonly object profileAutoSavingEvent = new object ();
+               
                HttpApplication app;
                ProfileBase profile;
+               string anonymousCookieName = null;
+
+               EventHandlerList events = new EventHandlerList ();
+               
+               public event ProfileMigrateEventHandler MigrateAnonymous {
+                       add { events.AddHandler (migrateAnonymousEvent, value); }
+                       remove { events.RemoveHandler (migrateAnonymousEvent, value); }
+               }
+               
+               [MonoTODO ("implement event rising")]
+               public event ProfileEventHandler Personalize {
+                       add { events.AddHandler (personalizeEvent, value); }
+                       remove { events.RemoveHandler (personalizeEvent, value); }
+               }
+               
+               public event ProfileAutoSaveEventHandler ProfileAutoSaving {
+                       add { events.AddHandler (profileAutoSavingEvent, value); }
+                       remove { events.RemoveHandler (profileAutoSavingEvent, value); }
+               }
 
-               [MonoTODO]
                public ProfileModule ()
                {
                }
 
-               [MonoTODO]
                public void Dispose ()
                {
                        app.EndRequest -= OnLeave;
+                       app.PostMapRequestHandler -= OnEnter;
                }
 
-               [MonoTODO]
                public void Init (HttpApplication app)
                {
                        this.app = app;
+                       app.PostMapRequestHandler += OnEnter;
                        app.EndRequest += OnLeave;
+                       
+                       AnonymousIdentificationSection anonymousConfig =
+                               (AnonymousIdentificationSection) WebConfigurationManager.GetSection ("system.web/anonymousIdentification");
+                       
+                       if (anonymousConfig == null)
+                               return;
+                       
+                       anonymousCookieName = anonymousConfig.CookieName;
+               }
+               
+               void OnEnter (object o, EventArgs eventArgs)
+               {
+                       if (!ProfileManager.Enabled)
+                               return;
+                       
+                       if (HttpContext.Current.Request.IsAuthenticated) {
+                               HttpCookie cookie = app.Request.Cookies [anonymousCookieName];
+                               if (cookie != null && (cookie.Expires != DateTime.MinValue && cookie.Expires > DateTime.Now)) {
+                                       ProfileMigrateEventHandler eh = events [migrateAnonymousEvent] as ProfileMigrateEventHandler;
+                                       if (eh != null) {
+                                               ProfileMigrateEventArgs e = new ProfileMigrateEventArgs (HttpContext.Current,
+                                                       Encoding.Unicode.GetString (Convert.FromBase64String (cookie.Value)));
+                                               eh (this, e);
+                                       }
+                                       
+                                       HttpCookie newCookie = new HttpCookie (anonymousCookieName);
+                                       newCookie.Path = app.Request.ApplicationPath;
+                                       newCookie.Expires = new DateTime (1970, 1, 1);
+                                       newCookie.Value = "";
+                                       app.Response.AppendCookie (newCookie);
+                               }
+                       }
                }
 
                void OnLeave (object o, EventArgs eventArgs)
                {
-                       if (profile == null)
+                       if (!ProfileManager.Enabled)
+                               return;
+                       
+                       if (!app.Context.ProfileInitialized)
                                return;
 
-                       if (ProfileAutoSaving != null) {
-                               ProfileAutoSaveEventArgs args = new ProfileAutoSaveEventArgs (app.Context);
-                               ProfileAutoSaving (this, args);
-                               if (!args.ContinueWithProfileAutoSave)
+                       if (ProfileManager.AutomaticSaveEnabled) {
+                               profile = app.Context.Profile;
+                               
+                               if (profile == null)
                                        return;
-                       }
 
-                       profile.Save();
+                               ProfileAutoSaveEventHandler eh = events [profileAutoSavingEvent] as ProfileAutoSaveEventHandler;
+                               if (eh != null) {
+                                       ProfileAutoSaveEventArgs args = new ProfileAutoSaveEventArgs (app.Context);
+                                       eh (this, args);
+                                       if (!args.ContinueWithProfileAutoSave)
+                                               return;
+                               }
+                               profile.Save ();
+                       }
                }
-
-               public event ProfileMigrateEventHandler MigrateAnonymous;
-               public event ProfileEventHandler Personalize;
-               public event ProfileAutoSaveEventHandler ProfileAutoSaving;
        }
 }
-
-#endif