* ToolTask.cs (LogEventsFromTextOutput): Log message even if its not
[mono.git] / mcs / class / System.Web / System.Web.Profile / ProfileModule.cs
1 //
2 // System.Web.UI.WebControls.ProfileModule.cs
3 //
4 // Authors:
5 //      Chris Toshok (toshok@ximian.com)
6 //
7 // (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if NET_2_0
30 using System;
31 using System.ComponentModel;
32 using System.Web;
33 using System.Web.Configuration;
34 using System.Text;
35
36 namespace System.Web.Profile
37 {
38         public sealed class ProfileModule : IHttpModule
39         {
40                 static readonly object migrateAnonymousEvent = new object ();
41                 static readonly object personalizeEvent = new object ();
42                 static readonly object profileAutoSavingEvent = new object ();
43                 
44                 HttpApplication app;
45                 ProfileBase profile;
46                 string anonymousCookieName = null;
47
48                 EventHandlerList events = new EventHandlerList ();
49                 
50                 public event ProfileMigrateEventHandler MigrateAnonymous {
51                         add { events.AddHandler (migrateAnonymousEvent, value); }
52                         remove { events.RemoveHandler (migrateAnonymousEvent, value); }
53                 }
54                 
55                 [MonoTODO ("implement event rising")]
56                 public event ProfileEventHandler Personalize {
57                         add { events.AddHandler (personalizeEvent, value); }
58                         remove { events.RemoveHandler (personalizeEvent, value); }
59                 }
60                 
61                 public event ProfileAutoSaveEventHandler ProfileAutoSaving {
62                         add { events.AddHandler (profileAutoSavingEvent, value); }
63                         remove { events.RemoveHandler (profileAutoSavingEvent, value); }
64                 }
65
66                 public ProfileModule ()
67                 {
68                 }
69
70                 public void Dispose ()
71                 {
72                         app.EndRequest -= OnLeave;
73                         app.PostMapRequestHandler -= OnEnter;
74                 }
75
76                 public void Init (HttpApplication app)
77                 {
78                         this.app = app;
79                         app.PostMapRequestHandler += OnEnter;
80                         app.EndRequest += OnLeave;
81                         
82                         AnonymousIdentificationSection anonymousConfig =
83                                 (AnonymousIdentificationSection) WebConfigurationManager.GetSection ("system.web/anonymousIdentification");
84                         
85                         if (anonymousConfig == null)
86                                 return;
87                         
88                         anonymousCookieName = anonymousConfig.CookieName;
89                 }
90                 
91                 void OnEnter (object o, EventArgs eventArgs)
92                 {
93                         if (!ProfileManager.Enabled)
94                                 return;
95                         
96                         if (HttpContext.Current.Request.IsAuthenticated) {
97                                 HttpCookie cookie = app.Request.Cookies [anonymousCookieName];
98                                 if (cookie != null && (cookie.Expires != DateTime.MinValue && cookie.Expires > DateTime.Now)) {
99                                         ProfileMigrateEventHandler eh = events [migrateAnonymousEvent] as ProfileMigrateEventHandler;
100                                         if (eh != null) {
101                                                 ProfileMigrateEventArgs e = new ProfileMigrateEventArgs (HttpContext.Current,
102                                                         Encoding.Unicode.GetString (Convert.FromBase64String (cookie.Value)));
103                                                 eh (this, e);
104                                         }
105                                         
106                                         HttpCookie newCookie = new HttpCookie (anonymousCookieName);
107                                         newCookie.Path = app.Request.ApplicationPath;
108                                         newCookie.Expires = new DateTime (1970, 1, 1);
109                                         newCookie.Value = "";
110                                         app.Response.AppendCookie (newCookie);
111                                 }
112                         }
113                 }
114
115                 void OnLeave (object o, EventArgs eventArgs)
116                 {
117                         if (!ProfileManager.Enabled)
118                                 return;
119                         
120                         if (!app.Context.ProfileInitialized)
121                                 return;
122
123                         if (ProfileManager.AutomaticSaveEnabled) {
124                                 profile = app.Context.Profile;
125                                 
126                                 if (profile == null)
127                                         return;
128
129                                 ProfileAutoSaveEventHandler eh = events [profileAutoSavingEvent] as ProfileAutoSaveEventHandler;
130                                 if (eh != null) {
131                                         ProfileAutoSaveEventArgs args = new ProfileAutoSaveEventArgs (app.Context);
132                                         eh (this, args);
133                                         if (!args.ContinueWithProfileAutoSave)
134                                                 return;
135                                 }
136                                 profile.Save ();
137                         }
138                 }
139         }
140 }
141 #endif