// 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; } }