[Nmailserver-commits] SF.net SVN: nmailserver: [113] NMail/trunk/NMail
Brought to you by:
dframpton-oss,
tmyroadctfig
|
From: <tmy...@us...> - 2007-01-10 09:43:08
|
Revision: 113
http://svn.sourceforge.net/nmailserver/?rev=113&view=rev
Author: tmyroadctfig
Date: 2007-01-10 01:43:06 -0800 (Wed, 10 Jan 2007)
Log Message:
-----------
Added a base class for services and sessions.
Modified Paths:
--------------
NMail/trunk/NMail/Configuration/IServiceCollection.cs
NMail/trunk/NMail/Configuration/NamedServiceCollection.cs
NMail/trunk/NMail/DataTypes/ServiceStartInfo.cs
NMail/trunk/NMail/DataTypes/Spool/ISpoolFilterService.cs
NMail/trunk/NMail/DataTypes/Spool/ISpoolService.cs
NMail/trunk/NMail/NMail.csproj
NMail/trunk/NMail.ImapService/ImapService.cs
NMail/trunk/NMail.SmtpService/SmtpService.cs
NMail/trunk/NMail.SmtpService/SmtpSession.cs
NMail/trunk/NMail.SpoolFilter/SpoolFilter.cs
NMail/trunk/NMail.SpoolService/SpoolService.cs
Added Paths:
-----------
NMail/trunk/NMail/DataTypes/Service/IService.cs
Removed Paths:
-------------
NMail/trunk/NMail/DataTypes/IService.cs
Modified: NMail/trunk/NMail/Configuration/IServiceCollection.cs
===================================================================
--- NMail/trunk/NMail/Configuration/IServiceCollection.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/Configuration/IServiceCollection.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -23,6 +23,7 @@
using System.Text;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
namespace NMail.Configuration {
/// <summary>
Modified: NMail/trunk/NMail/Configuration/NamedServiceCollection.cs
===================================================================
--- NMail/trunk/NMail/Configuration/NamedServiceCollection.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/Configuration/NamedServiceCollection.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -61,7 +61,7 @@
/// </summary>
/// <param name="name">The name of the named service element to get or set.</param>
/// <returns>The named service element.</returns>
- public NamedServiceElement this[string name] {
+ public new NamedServiceElement this[string name] {
get {
return (NamedServiceElement) BaseGet(name);
}
Deleted: NMail/trunk/NMail/DataTypes/IService.cs
===================================================================
--- NMail/trunk/NMail/DataTypes/IService.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/DataTypes/IService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -1,121 +0,0 @@
-/*
- * Copyright 2004-2006 Luke Quinane and Daniel Frampton
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-using System;
-
-namespace NMail.DataTypes {
- /// <summary>
- /// A service to be hosted by NMail. This includes but it not
- /// limited to SpoolService, POP3, SMTP and IMAP services.
- /// </summary>
- public interface IService {
- /// <summary>
- /// Initialise the service. All services are <b>Init</b>ialised before any services are <b>Start</b>ed.
- /// </summary>
- void Init();
-
- /// <summary>
- /// Start the service.
- /// </summary>
- /// <exception cref="System.InvalidOperationException">
- /// If Start() is called before Init().
- /// </exception>
- void Start();
-
- /// <summary>
- /// Stop the service. It should be possible to resume the service with a subsequent call to Init and Start.
- /// If you take too long (arbitrary) to Stop gracefully, then you may get an additional call to Stop
- /// immediately on another thread, you must be able to handle this.
- /// </summary>
- void Stop(bool runCurrentToCompletion);
-
- /// <summary>
- /// Returns true if this service supports pausing processing without performing a complete shutdown.
- /// </summary>
- bool SupportsPause {get;}
-
- /// <summary>
- /// Pauses the service from processing but doesn't require a complete shutdown. E.g. a service may stop
- /// accepting new connections or stop processing its work queue.
- /// </summary>
- /// <exception cref="System.InvalidOperationException">
- /// If this service doesn't support pausing.
- /// </exception>
- void Pause();
-
- /// <summary>
- /// Continues processing following a pause command.
- /// </summary>
- /// <exception cref="System.InvalidOperationException">
- /// If this service doesn't support pausing.
- /// </exception>
- void Continue();
-
- /// <summary>
- /// Reload the service configuration. This may recycle the service instance by stopping and discarding
- /// the current IService and returning a new one.
- /// </summary>
- /// <remarks>
- /// The service is <b>running</b> when this is called.
- /// </remarks>
- /// <exception cref="System.InvalidOperationException">
- /// If this service is not running when this is called.
- /// </exception>
- IService ReloadConfiguration();
-
- /// <summary>
- /// Does this service support reloading configuration parameters on the fly?
- /// </summary>
- bool AllowsReloadConfiguration {get;}
-
- /// <summary>
- /// Is the service currently running?
- /// </summary>
- bool Running {get;}
-
- /// <summary>
- /// The name of this service.
- /// </summary>
- string Name {get;}
-
- /// <summary>
- /// The description of this service.
- /// </summary>
- string Description {get;}
-
- /// <summary>
- /// A URL for details on this service.
- /// </summary>
- Uri SupportUrl {get;}
-
- /// <summary>
- /// The event triggered when the service has been started.
- /// </summary>
- /// <remarks>
- /// Running should return true when this event is recieved.
- /// </remarks>
- event EventHandler Started;
-
- /// <summary>
- /// The event triggered when the sevice has been stopped.
- /// </summary>
- /// <remarks>
- /// Running should return false when this event is recieved.
- /// </remarks>
- event EventHandler Stopped;
- }
-}
Copied: NMail/trunk/NMail/DataTypes/Service/IService.cs (from rev 110, NMail/trunk/NMail/DataTypes/IService.cs)
===================================================================
--- NMail/trunk/NMail/DataTypes/Service/IService.cs (rev 0)
+++ NMail/trunk/NMail/DataTypes/Service/IService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2004-2006 Luke Quinane and Daniel Frampton
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+
+namespace NMail.DataTypes.Service {
+ /// <summary>
+ /// A service to be hosted by NMail. This includes but it not
+ /// limited to SpoolService, POP3, SMTP and IMAP services.
+ /// </summary>
+ public interface IService {
+ /// <summary>
+ /// Initialise the service. All services are <b>Init</b>ialised before any services are <b>Start</b>ed.
+ /// </summary>
+ void Init();
+
+ /// <summary>
+ /// Start the service.
+ /// </summary>
+ /// <exception cref="System.InvalidOperationException">
+ /// If Start() is called before Init().
+ /// </exception>
+ void Start();
+
+ /// <summary>
+ /// Stop the service. It should be possible to resume the service with a subsequent call to Init and Start.
+ /// If you take too long (arbitrary) to Stop gracefully, then you may get an additional call to Stop
+ /// immediately on another thread, you must be able to handle this.
+ /// </summary>
+ void Stop(bool runCurrentToCompletion);
+
+ /// <summary>
+ /// Returns true if this service supports pausing processing without performing a complete shutdown.
+ /// </summary>
+ bool SupportsPause {get;}
+
+ /// <summary>
+ /// Pauses the service from processing but doesn't require a complete shutdown. E.g. a service may stop
+ /// accepting new connections or stop processing its work queue.
+ /// </summary>
+ /// <exception cref="System.InvalidOperationException">
+ /// If this service doesn't support pausing.
+ /// </exception>
+ void Pause();
+
+ /// <summary>
+ /// Continues processing following a pause command.
+ /// </summary>
+ /// <exception cref="System.InvalidOperationException">
+ /// If this service doesn't support pausing.
+ /// </exception>
+ void Continue();
+
+ /// <summary>
+ /// Reload the service configuration. This may recycle the service instance by stopping and discarding
+ /// the current IService and returning a new one.
+ /// </summary>
+ /// <remarks>
+ /// The service is <b>running</b> when this is called.
+ /// </remarks>
+ /// <exception cref="System.InvalidOperationException">
+ /// If this service is not running when this is called.
+ /// </exception>
+ IService ReloadConfiguration();
+
+ /// <summary>
+ /// Does this service support reloading configuration parameters on the fly?
+ /// </summary>
+ bool AllowsReloadConfiguration {get;}
+
+ /// <summary>
+ /// Is the service currently running?
+ /// </summary>
+ bool Running {get;}
+
+ /// <summary>
+ /// The name of this service.
+ /// </summary>
+ string Name {get;}
+
+ /// <summary>
+ /// The description of this service.
+ /// </summary>
+ string Description {get;}
+
+ /// <summary>
+ /// A URL for details on this service.
+ /// </summary>
+ Uri SupportUrl {get;}
+
+ /// <summary>
+ /// The event triggered when the service has been started.
+ /// </summary>
+ /// <remarks>
+ /// Running should return true when this event is recieved.
+ /// </remarks>
+ event EventHandler Started;
+
+ /// <summary>
+ /// The event triggered when the sevice has been stopped.
+ /// </summary>
+ /// <remarks>
+ /// Running should return false when this event is recieved.
+ /// </remarks>
+ event EventHandler Stopped;
+ }
+}
Modified: NMail/trunk/NMail/DataTypes/ServiceStartInfo.cs
===================================================================
--- NMail/trunk/NMail/DataTypes/ServiceStartInfo.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/DataTypes/ServiceStartInfo.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -18,6 +18,8 @@
using System;
using System.Diagnostics;
+using NMail.DataTypes.Service;
+
namespace NMail.DataTypes {
/// <summary>
/// Specifies the details of a service to start.
Modified: NMail/trunk/NMail/DataTypes/Spool/ISpoolFilterService.cs
===================================================================
--- NMail/trunk/NMail/DataTypes/Spool/ISpoolFilterService.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/DataTypes/Spool/ISpoolFilterService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -17,6 +17,8 @@
using System;
+using NMail.DataTypes.Service;
+
namespace NMail.DataTypes.Spool {
/// <summary>
/// The interface for a spool filter service.
Modified: NMail/trunk/NMail/DataTypes/Spool/ISpoolService.cs
===================================================================
--- NMail/trunk/NMail/DataTypes/Spool/ISpoolService.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/DataTypes/Spool/ISpoolService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -19,6 +19,7 @@
using System.Collections.Generic;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
namespace NMail.DataTypes.Spool {
/// <summary>
Modified: NMail/trunk/NMail/NMail.csproj
===================================================================
--- NMail/trunk/NMail/NMail.csproj 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail/NMail.csproj 2007-01-10 09:43:06 UTC (rev 113)
@@ -130,6 +130,8 @@
<Compile Include="DataTypes\ACLs\StoreFolderAcl.cs" />
<Compile Include="DataTypes\ACLs\StoreFolderPrivilege.cs" />
<Compile Include="DataTypes\ACLs\UserGroupAdminPrivilege.cs" />
+ <Compile Include="DataTypes\Service\BaseService.cs" />
+ <Compile Include="DataTypes\Service\BaseSession.cs" />
<Compile Include="DataTypes\Envelope.cs" />
<Compile Include="DataTypes\IDnsClient.cs" />
<Compile Include="DataTypes\Imap\BodyStructure.cs" />
@@ -138,7 +140,6 @@
<Compile Include="DataTypes\Imap\FetchDataItem.cs" />
<Compile Include="DataTypes\Imap\FetchDataItemType.cs" />
<Compile Include="DataTypes\Imap\FetchDataList.cs" />
- <Compile Include="DataTypes\IService.cs" />
<Compile Include="DataTypes\ISmtpClient.cs" />
<Compile Include="DataTypes\ByteString.cs">
<SubType>Code</SubType>
@@ -208,6 +209,7 @@
<Compile Include="DataTypes\ServiceStartInfo.cs">
<SubType>Code</SubType>
</Compile>
+ <Compile Include="DataTypes\Service\IService.cs" />
<Compile Include="DataTypes\SimpleBodyPart.cs">
<SubType>Code</SubType>
</Compile>
Modified: NMail/trunk/NMail.ImapService/ImapService.cs
===================================================================
--- NMail/trunk/NMail.ImapService/ImapService.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail.ImapService/ImapService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -26,6 +26,7 @@
using NMail;
using NMail.Configuration;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
using NMail.Helper;
using NMail.ImapService.Configuration;
Modified: NMail/trunk/NMail.SmtpService/SmtpService.cs
===================================================================
--- NMail/trunk/NMail.SmtpService/SmtpService.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail.SmtpService/SmtpService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -26,6 +26,7 @@
using log4net;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
using NMail.Configuration;
using NMail.Helper;
using NMail.SmtpService.Configuration;
@@ -34,268 +35,69 @@
/// <summary>
/// Provides a SMTP server service for NMail.
/// </summary>
- public class SmtpService : MarshalByRefObject, IService {
+ public class SmtpService : BaseService<SmtpSession> {
/// <summary>
/// Logging support for this class.
/// </summary>
protected static readonly ILog log = LogManager.GetLogger(typeof(SmtpService));
/// <summary>
- /// A list of sockets listening for new connections.
- /// </summary>
- private ArrayList listenSockets;
-
- /// <summary>
- /// A list of threads processing current sessions.
- /// </summary>
- private ArrayList sessionThreads;
-
- /// <summary>
/// The configuration for this service.
/// </summary>
- private SmtpServiceConfiguration config;
-
- /// <summary>
- /// A flag indicating the server is shutting down or shutdown.
- /// </summary>
- private bool shutdown;
-
- /// <summary>
- /// The performance counter for tracking the number of received connections.
- /// </summary>
- private PerformanceCounter connectionsReceived;
-
- /// <summary>
- /// Creates a new instance of the SMTP service.
- /// </summary>
- public SmtpService() {
- this.config = SmtpServiceConfiguration.Current;
- this.listenSockets = new ArrayList();
- this.sessionThreads = new ArrayList();
- this.shutdown = true;
-
- this.connectionsReceived = new PerformanceCounter(
- PerfCounterCategory,
- TotalConnectionsReceived,
- false);
- }
-
- #region IService Members
- public void Start() {
- this.shutdown = false;
-
- // Create a new thread to listen on each listen end point
- foreach (IPEndPointElement endPointElement in this.config.ListenEndPoints) {
- ThreadHelper th = new ThreadHelper(new WaitCallback(handleConnections),
- endPointElement.ToEndPoint());
-
- Thread listenThread = new Thread(new ThreadStart(th.CallDelegate));
- listenThread.Start();
- }
-
- // Notify any listeners that the service has started
- if (this.startedEvent != null) {
- this.startedEvent(this, new EventArgs());
- }
- }
-
- public void Init() { }
-
- public string Name {
+ private SmtpServiceConfiguration config = SmtpServiceConfiguration.Current;
+
+ public override string Name {
get {
return "SMTP Server Service";
}
}
- public string Description {
+ public override string Description {
get {
return "Provides an SMTP server for remote clients to connect to.";
}
}
- public IService ReloadConfiguration() {
- return this;
- }
-
- public bool AllowsReloadConfiguration {
+ public override Uri SupportUrl {
get {
- return false;
- }
- }
-
- public void Stop(bool runCurrentToCompletion) {
- this.shutdown = true;
-
- lock (this) {
- // Kill each of the listening sockets
- foreach (object o in this.listenSockets) {
- ((TcpListener) o).Stop();
- }
- this.listenSockets = new ArrayList();
- }
-
- if (runCurrentToCompletion) {
- // wait for sessions threads to finish up
- while (this.sessionThreads.Count > 0) {
- Thread.Sleep(500);
- }
- } else {
- lock (this) {
- // non-graceful shutdown of smtp sessions
- foreach (object o in this.sessionThreads) {
- ((Thread) o).Abort();
- }
- }
- }
-
- // Notify any listeners that the service has stopped
- if (this.stoppedEvent != null) {
- this.stoppedEvent(this, new EventArgs());
- }
- }
-
- public bool SupportsPause {
- get {
- return false;
- }
- }
-
- public void Pause() {
- throw new InvalidOperationException("Pause not supported.");
- }
-
- public void Continue() {
- throw new InvalidOperationException("Pause not supported.");
- }
-
- public Uri SupportUrl {
- get {
return new Uri("http://nmailserver.sf.net/support/services/smtp");
}
}
-
- public bool Running {
- get {
- return ((this.listenSockets.Count > 0) || (this.sessionThreads.Count > 0));
- }
+
+ protected override SmtpSession CreateSession(Socket client) {
+ return new SmtpSession(this, client);
}
- private event EventHandler startedEvent;
-
- public event EventHandler Started {
- add {
- this.startedEvent += value;
- }
- remove {
- this.startedEvent -= value;
- }
+ protected override ILog Log {
+ get { return log; }
}
- private event EventHandler stoppedEvent;
-
- public event EventHandler Stopped {
- add {
- this.stoppedEvent += value;
- }
- remove {
- this.stoppedEvent -= value;
- }
+ protected override int MaximumConnections {
+ get { return config.MaximumConnections; }
}
- #endregion
- public int ConnectionCount {
- get {
- return this.sessionThreads.Count;
- }
+ protected override IPEndPointsCollection ListenEndpoints {
+ get { return config.ListenEndPoints; }
}
/// <summary>
- /// Handles incomming connections for an interface (IP address).
+ /// The reply to send when the server is busy.
/// </summary>
- /// <param name="o">The interface to listen for connections on.</param>
- protected void handleConnections(object o) {
- Thread.CurrentThread.Name = "HandleSmtp:" + o.ToString();
- TcpListener socket = null;
-
- try {
- IPEndPoint ep = (IPEndPoint) o;
- if (log.IsDebugEnabled) {
- log.Debug("Binding to IP endpoint: [" + ep + "]");
- }
- socket = new TcpListener(ep);
- socket.Start();
- lock (this) {
- // Register this socket
- this.listenSockets.Add(socket);
- }
-
- while (true) {
- Socket client = socket.AcceptSocket();
- this.connectionsReceived.Increment();
-
- lock (this) {
- if (this.ConnectionCount < this.config.MaximumConnections) {
- // Create a new session and thread to handle this connection
- SmtpSession session = new SmtpSession(this, client);
- Thread sessionThread = new Thread(new ThreadStart(session.Process));
- this.RegisterSession(sessionThread);
- sessionThread.Start();
- } else {
- log.Warn("Server too busy to accept SMTP connection.");
- client.Send(Encoding.ASCII.GetBytes(BusyReply));
- client.Close();
- }
- }
- }
- } catch (SocketException e) {
- // Ignore interrupted exception during shutdown
- if (!this.shutdown) {
- log.Warn(e.Message, e);
- }
-
- lock (this) {
- // De-register this socket
- this.listenSockets.Remove(socket);
- }
+ protected override string BusyReply {
+ get {
+ return "421 Error - Server busy, try again later.\r\n";
}
}
/// <summary>
- /// Registers the session thread with the service so that it can be kill if
- /// required.
+ /// The category the SMTP service uses for its performance counters.
/// </summary>
- /// <param name="sessionThread">The session thread to register.</param>
- internal void RegisterSession(Thread sessionThread) {
- lock (this) {
- this.sessionThreads.Add(sessionThread);
+ public override string PerfCounterCategory {
+ get {
+ return SmtpPerfCounterCategory;
}
}
- /// <summary>
- /// Deregisters the session thread with the service. The session thread will not
- /// attempt to kill this thread in a shutdown.
- /// </summary>
- /// <param name="sessionThread">The session thread to deregister.</param>
- internal void DeregisterSession(Thread sessionThread) {
- lock (this) {
- this.sessionThreads.Remove(sessionThread);
- }
- }
-
- /// <summary>
- /// The reply to send when the server is busy.
- /// </summary>
- const string BusyReply = "421 Error - Server busy, try again later.\r\n";
-
- /// <summary>
- /// The category the SMTP service uses for its performance counters.
- /// </summary>
- public const string PerfCounterCategory = "NMail.SmtpService";
-
- /// <summary>
- /// The name of the performance counter that tracks the total number of
- /// received connections.
- /// </summary>
- public const string TotalConnectionsReceived = "TotalConnectionsReceived";
+ public const string SmtpPerfCounterCategory = "NMail.SmtpService";
}
}
\ No newline at end of file
Modified: NMail/trunk/NMail.SmtpService/SmtpSession.cs
===================================================================
--- NMail/trunk/NMail.SmtpService/SmtpSession.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail.SmtpService/SmtpSession.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -24,6 +24,7 @@
using log4net;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
using NMail.IO;
using NMail.SmtpService.Configuration;
using NMail.SmtpService.State;
@@ -32,7 +33,7 @@
/// <summary>
/// Handles SMTP sessions for connecting clients.
/// </summary>
- public class SmtpSession {
+ public class SmtpSession : BaseSession {
#region Attributes
/// <summary>
/// Logging support for this class.
@@ -90,14 +91,8 @@
private AbstractSmtpState currentState;
/// <summary>
- /// The socket to the client.
+ /// The service that owns this session.
/// </summary>
- private Socket socket;
-
- /// <summary>
- /// A reference back to the service for registering/deregistering this
- /// session.
- /// </summary>
private SmtpService smtpService;
#endregion
@@ -106,10 +101,9 @@
/// </summary>
/// <param name="smtpService">The service that the session belongs to.</param>
/// <param name="socket">The socket to the client.</param>
- public SmtpSession(SmtpService smtpService, Socket socket) {
+ public SmtpSession(SmtpService smtpService, Socket socket) : base(socket) {
this.config = SmtpServiceConfiguration.Current;
this.smtpService = smtpService;
- this.socket = socket;
this.badCommandCount = 0;
this.badRecipientCount = 0;
}
@@ -117,7 +111,7 @@
/// <summary>
/// Processes the current session.
/// </summary>
- public void Process() {
+ public override void Process() {
// create the connection
this.connection = new SmtpServiceConnection(SmtpSession.log);
Modified: NMail/trunk/NMail.SpoolFilter/SpoolFilter.cs
===================================================================
--- NMail/trunk/NMail.SpoolFilter/SpoolFilter.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail.SpoolFilter/SpoolFilter.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -23,6 +23,7 @@
using NMail.Configuration;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
using NMail.DataTypes.Spool;
using NMail.Threading;
using NMail.SpoolFilter.Configuration;
Modified: NMail/trunk/NMail.SpoolService/SpoolService.cs
===================================================================
--- NMail/trunk/NMail.SpoolService/SpoolService.cs 2007-01-10 09:10:39 UTC (rev 112)
+++ NMail/trunk/NMail.SpoolService/SpoolService.cs 2007-01-10 09:43:06 UTC (rev 113)
@@ -22,6 +22,7 @@
using log4net;
using NMail.DataTypes;
+using NMail.DataTypes.Service;
using NMail.DataTypes.Spool;
using NMail.Threading;
using NMail.Configuration;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|