You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			269 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // <copyright file="SimpleMailWebEventProvider.cs" company="Microsoft">
 | |
| //     Copyright (c) Microsoft Corporation.  All rights reserved.
 | |
| // </copyright>                                                                
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| namespace System.Web.Management {
 | |
|     using System.Configuration;
 | |
|     using System.Configuration.Provider;
 | |
|     using System.Collections.Specialized;
 | |
|     using System.Web.Util;
 | |
|     using System.Net.Mail;
 | |
|     using System.Globalization;
 | |
|     using System.Web.Configuration;
 | |
|     using System.Text;
 | |
|     using System.IO;
 | |
|     using System.Runtime.Remoting.Messaging;
 | |
|     using System.Security.Permissions;
 | |
|     using System.Threading;
 | |
| 
 | |
|     public sealed class SimpleMailWebEventProvider : MailWebEventProvider, IInternalWebEventProvider {
 | |
|         const int   DefaultMaxEventLength = 8 * 1024;    
 | |
|         
 | |
|         const int   MessageIdDiscard = 100;
 | |
|         const int   MessageIdEventsToDrop = 101;
 | |
| 
 | |
|         static string  s_header_warnings = SR.GetString(SR.MailWebEventProvider_Warnings);
 | |
|         static string  s_header_summary = SR.GetString(SR.MailWebEventProvider_Summary);
 | |
|         static string  s_header_app_info = SR.GetString(SR.MailWebEventProvider_Application_Info);
 | |
|         static string  s_header_events = SR.GetString(SR.MailWebEventProvider_Events);
 | |
|         
 | |
|         string  _separator = "---------------\n";
 | |
|         string  _bodyHeader;
 | |
|         string  _bodyFooter;
 | |
| 
 | |
|         int     _maxEventLength = DefaultMaxEventLength;            // in no of chars
 | |
|         int     _nonBufferNotificationSequence = 0;
 | |
| 
 | |
|         internal SimpleMailWebEventProvider() { }
 | |
| 
 | |
|         public override void Initialize(string name, NameValueCollection config)
 | |
|         {
 | |
|             string  temp = null;
 | |
|             
 | |
|             Debug.Trace("SimpleMailWebEventProvider", "Initializing: name=" + name);
 | |
| 
 | |
|             ProviderUtil.GetAndRemoveStringAttribute(config, "bodyHeader", name, ref _bodyHeader);
 | |
|             if (_bodyHeader != null) {
 | |
|                 _bodyHeader += "\n";
 | |
|             }
 | |
|             
 | |
|             ProviderUtil.GetAndRemoveStringAttribute(config, "bodyFooter", name, ref _bodyFooter);
 | |
|             if (_bodyFooter != null) {
 | |
|                 _bodyFooter += "\n";
 | |
|             }
 | |
| 
 | |
|             ProviderUtil.GetAndRemoveStringAttribute(config, "separator", name, ref temp);
 | |
|             if (temp != null) {
 | |
|                 _separator = temp + "\n";
 | |
|             }
 | |
|             
 | |
|             ProviderUtil.GetAndRemovePositiveOrInfiniteAttribute(config, "maxEventLength", name, ref _maxEventLength);
 | |
| 
 | |
|             base.Initialize(name, config);
 | |
|         }
 | |
| 
 | |
|         void GenerateWarnings(StringBuilder sb, DateTime lastFlush, int discardedSinceLastFlush, 
 | |
|                                 int seq, int eventsToDrop) {
 | |
|             if (!UseBuffering) {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             bool    headerAdded = false;
 | |
|             bool    hasWarnings = false;
 | |
| 
 | |
|             // This warning is issued only in the 1st message (vswhidbey 217578)
 | |
|             if (discardedSinceLastFlush != 0 && seq == MessageSequenceBase) {
 | |
|                 sb.Append(s_header_warnings);
 | |
|                 sb.Append("\n");
 | |
|                 sb.Append(_separator);
 | |
|                 headerAdded = true;
 | |
|                 
 | |
|                 sb.Append(SR.GetString(SR.MailWebEventProvider_discard_warning,
 | |
|                             MessageIdDiscard.ToString(CultureInfo.InstalledUICulture),
 | |
|                             discardedSinceLastFlush.ToString(CultureInfo.InstalledUICulture),
 | |
|                             lastFlush.ToString("r", CultureInfo.InstalledUICulture)));
 | |
|                 sb.Append("\n\n");
 | |
|                 hasWarnings = true;
 | |
|             }
 | |
| 
 | |
|             if (eventsToDrop > 0) {
 | |
|                 if (!headerAdded) {
 | |
|                     sb.Append(s_header_warnings);
 | |
|                     sb.Append("\n");
 | |
|                     sb.Append(_separator);
 | |
|                     headerAdded = true;
 | |
|                 }
 | |
|                 
 | |
|                 sb.Append(SR.GetString(SR.MailWebEventProvider_events_drop_warning,
 | |
|                     MessageIdEventsToDrop.ToString(CultureInfo.InstalledUICulture),
 | |
|                     eventsToDrop.ToString(CultureInfo.InstalledUICulture)));
 | |
|                 sb.Append("\n\n");
 | |
|                 hasWarnings = true;
 | |
|             }
 | |
| 
 | |
|             if (hasWarnings) {
 | |
|                 sb.Append("\n");
 | |
|             }                
 | |
|         }
 | |
| 
 | |
|         void GenerateApplicationInformation(StringBuilder sb) {
 | |
|             sb.Append(s_header_app_info);
 | |
|             sb.Append("\n");
 | |
|             sb.Append(_separator);
 | |
|             sb.Append(WebBaseEvent.ApplicationInformation.ToString());
 | |
|             sb.Append("\n\n");
 | |
|         }
 | |
| 
 | |
|         void GenerateSummary(StringBuilder sb, int firstEvent, int lastEvent, int eventsInNotif, int eventsInBuffer) {
 | |
|             if (!UseBuffering) {
 | |
|                 return;
 | |
|             }
 | |
|             
 | |
|             sb.Append(s_header_summary);
 | |
|             sb.Append("\n");
 | |
|             sb.Append(_separator);
 | |
| 
 | |
|             // The sequence numbers will be displayed as one-baesd.
 | |
|             firstEvent++;
 | |
|             lastEvent++;
 | |
| 
 | |
|             sb.Append(SR.GetString(SR.MailWebEventProvider_summary_body, 
 | |
|                             firstEvent.ToString(CultureInfo.InstalledUICulture),
 | |
|                             lastEvent.ToString(CultureInfo.InstalledUICulture),
 | |
|                             eventsInNotif.ToString(CultureInfo.InstalledUICulture),
 | |
|                             eventsInBuffer.ToString(CultureInfo.InstalledUICulture)));
 | |
|             sb.Append("\n\n");
 | |
|             sb.Append("\n");
 | |
|         }
 | |
|         
 | |
|         string GenerateBody(WebBaseEventCollection events, 
 | |
|                             int begin,
 | |
|                             DateTime lastFlush,
 | |
|                             int discardedSinceLastFlush, 
 | |
|                             int eventsInBuffer,
 | |
|                             int messageSequence, 
 | |
|                             int eventsInNotification, 
 | |
|                             int eventsLostDueToMessageLimit) {
 | |
|             StringBuilder   sb = new StringBuilder();
 | |
|             int             totalEvents = events.Count;
 | |
| 
 | |
|             if (_bodyHeader != null) {
 | |
|                 sb.Append(_bodyHeader);
 | |
|             }
 | |
| 
 | |
|             // Warnings
 | |
|             GenerateWarnings(sb, lastFlush, discardedSinceLastFlush, messageSequence, eventsLostDueToMessageLimit);
 | |
| 
 | |
|             // Event Summary
 | |
|             GenerateSummary(sb, begin, begin + totalEvents - 1, eventsInNotification, eventsInBuffer);
 | |
| 
 | |
|             // Application Info
 | |
|             Debug.Assert(events.Count > 0, "events.Count > 0");
 | |
|             GenerateApplicationInformation(sb);
 | |
| 
 | |
|             // Please note that it's a text message, and thus we shouldn't need to HtmlEncode it.
 | |
|             for (int i = 0; i < totalEvents; i++) {
 | |
|                 WebBaseEvent    eventRaised = events[i];
 | |
|                 string          details = eventRaised.ToString(false, true);
 | |
|                 
 | |
|                 if (_maxEventLength != ProviderUtil.Infinite &&
 | |
|                     details.Length > _maxEventLength) {
 | |
|                     details = details.Substring(0, _maxEventLength);
 | |
|                 }
 | |
| 
 | |
|                 if (i == 0) {
 | |
|                     sb.Append(s_header_events);
 | |
|                     sb.Append("\n");
 | |
|                     sb.Append(_separator);
 | |
|                 }
 | |
| 
 | |
|                 sb.Append(details);
 | |
|                 sb.Append("\n");
 | |
|                 sb.Append(_separator);
 | |
|             }
 | |
| 
 | |
|             if (_bodyFooter != null) {
 | |
|                 sb.Append(_bodyFooter);
 | |
|             }
 | |
| 
 | |
|             return sb.ToString();
 | |
|         }
 | |
| 
 | |
|         internal override void SendMessage(WebBaseEvent eventRaised) { 
 | |
|             WebBaseEventCollection events = new WebBaseEventCollection(eventRaised);
 | |
|             
 | |
|             SendMessageInternal(
 | |
|                 events,             // events
 | |
|                 Interlocked.Increment(ref _nonBufferNotificationSequence), // notificationSequence
 | |
|                 0,                  // begin
 | |
|                 DateTime.MinValue,  // lastFlush
 | |
|                 0,                  // discardedSinceLastFlush
 | |
|                 0,                  // eventsInBuffer
 | |
|                 MessageSequenceBase,// messageSequence
 | |
|                 1,                  // messagesInNotification
 | |
|                 1,                  // eventsInNotification
 | |
|                 0);                 // eventsLostDueToMessageLimit
 | |
|         }
 | |
| 
 | |
|         internal override void SendMessage(WebBaseEventCollection events,
 | |
|                             WebEventBufferFlushInfo flushInfo,
 | |
|                             int eventsInNotification, 
 | |
|                             int eventsRemaining,
 | |
|                             int messagesInNotification,
 | |
|                             int eventsLostDueToMessageLimit,
 | |
|                             int messageSequence,
 | |
|                             int eventsSent,
 | |
|                             out bool fatalError) {
 | |
|                             
 | |
|             SendMessageInternal(events, 
 | |
|                 flushInfo.NotificationSequence, 
 | |
|                 eventsSent, 
 | |
|                 flushInfo.LastNotificationUtc,
 | |
|                 flushInfo.EventsDiscardedSinceLastNotification, 
 | |
|                 flushInfo.EventsInBuffer, 
 | |
|                 messageSequence,
 | |
|                 messagesInNotification,
 | |
|                 eventsInNotification,
 | |
|                 eventsLostDueToMessageLimit);
 | |
| 
 | |
|             fatalError = false;
 | |
|         }
 | |
|                             
 | |
| 
 | |
|         void SendMessageInternal(WebBaseEventCollection events,
 | |
|                             int notificationSequence,
 | |
|                             int begin, 
 | |
|                             DateTime lastFlush,
 | |
|                             int discardedSinceLastFlush,
 | |
|                             int eventsInBuffer,
 | |
|                             int messageSequence, 
 | |
|                             int messagesInNotification,
 | |
|                             int eventsInNotification,
 | |
|                             int eventsLostDueToMessageLimit) {
 | |
|             using (MailMessage msg = GetMessage()) {
 | |
|                 // Don't report eventsLostDueToMessageLimit unless it's the last message in this notification
 | |
|                 if (messageSequence != messagesInNotification) {
 | |
|                     eventsLostDueToMessageLimit = 0;
 | |
|                 }
 | |
| 
 | |
|                 msg.Body = GenerateBody(events,
 | |
|                                 begin,
 | |
|                                 lastFlush,
 | |
|                                 discardedSinceLastFlush,
 | |
|                                 eventsInBuffer,
 | |
|                                 messageSequence,
 | |
|                                 eventsInNotification,
 | |
|                                 eventsLostDueToMessageLimit);
 | |
| 
 | |
|                 msg.Subject = GenerateSubject(notificationSequence, messageSequence, events, events.Count);
 | |
| 
 | |
|                 SendMail(msg);
 | |
|             }
 | |
|         }
 | |
|         
 | |
|     }
 | |
| }
 | |
| 
 |