// SNMP engine class.
// Copyright (C) 2009-2010 Lex Li
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
/*
* Created by SharpDevelop.
* User: lextm
* Date: 11/28/2009
* Time: 12:40 PM
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using GSF.Net.Snmp.Messaging;
namespace GSF.Net.Snmp.Pipeline
{
///
/// SNMP engine, who is the core of an SNMP entity (manager or agent).
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")]
public sealed class SnmpEngine : IDisposable
{
private readonly SnmpApplicationFactory _factory;
private readonly EngineGroup _group;
private bool _disposed;
///
/// Initializes a new instance of the class.
///
/// The factory.
/// The listener.
/// Engine core group.
public SnmpEngine(SnmpApplicationFactory factory, Listener listener, EngineGroup group)
{
_factory = factory;
Listener = listener;
_group = group;
}
///
/// Disposes resources in use.
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
///
/// Releases unmanaged resources and performs other cleanup operations before the
/// is reclaimed by garbage collection.
///
~SnmpEngine()
{
Dispose(false);
}
///
/// Releases the unmanaged resources used by the and optionally releases the managed resources.
///
/// true to release both managed and unmanaged resources; false to release only unmanaged resources.
private void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
if (Listener != null)
{
Listener.Dispose();
Listener = null;
}
}
_disposed = true;
}
///
/// Gets or sets the listener.
///
/// The listener.
public Listener Listener { get; private set; }
private void ListenerMessageReceived(object sender, MessageReceivedEventArgs e)
{
ISnmpMessage request = e.Message;
ISnmpContext context = SnmpContextFactory.Create(request, e.Sender, Listener.Users, _group, e.Binding);
SnmpApplication application = _factory.Create(context);
application.Process();
}
///
/// Starts the engine.
///
public void Start()
{
if (_disposed)
{
throw new ObjectDisposedException(GetType().FullName);
}
Listener.ExceptionRaised += ListenerExceptionRaised;
Listener.MessageReceived += ListenerMessageReceived;
Listener.Start();
}
///
/// Stops this instance.
///
public void Stop()
{
if (_disposed)
{
throw new ObjectDisposedException(GetType().FullName);
}
Listener.Stop();
Listener.ExceptionRaised -= ListenerExceptionRaised;
Listener.MessageReceived -= ListenerMessageReceived;
}
///
/// Gets a value indicating whether this is active.
///
/// true if active; otherwise, false.
public bool Active
{
get
{
if (_disposed)
{
throw new ObjectDisposedException(GetType().FullName);
}
return Listener.Active;
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")]
private void ListenerExceptionRaised(object sender, ExceptionRaisedEventArgs e)
{
EventHandler handler = ExceptionRaised;
if (handler != null)
{
handler(sender, e);
}
}
///
/// Occurs when an exception is raised.
///
public event EventHandler ExceptionRaised;
}
}