From 2bda8f7717adf28da4af0d34fb82f63d2868c31d Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeutils@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- ksim/monitors/snmp/walker.cpp | 121 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 ksim/monitors/snmp/walker.cpp (limited to 'ksim/monitors/snmp/walker.cpp') diff --git a/ksim/monitors/snmp/walker.cpp b/ksim/monitors/snmp/walker.cpp new file mode 100644 index 0000000..593cd04 --- /dev/null +++ b/ksim/monitors/snmp/walker.cpp @@ -0,0 +1,121 @@ +/* This file is part of the KDE project + Copyright (C) 2003 Simon Hausmann + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "walker.h" + +#include + +#include +#include + +using namespace KSim::Snmp; + +namespace +{ + template + struct Deleter : public std::unary_function + { + void operator()( T arg ) + { delete arg; } + }; +} + +static const uint walkerRefresh = 0; + +Walker::Walker( const HostConfig &host, const Identifier &startOid, QObject *parent, const char *name ) + : QObject( parent, name ), m_stop( false ), m_oid( startOid ), m_session( host ) +{ + m_timerId = startTimer( walkerRefresh ); + start(); +} + +Walker::~Walker() +{ + m_stopGuard.lock(); + m_stop = true; + m_stopGuard.unlock(); + + if ( QThread::running() ) + QThread::wait(); + + std::for_each( m_results.begin(), m_results.end(), Deleter() ); +} + +void Walker::run() +{ + while ( !m_stop ) { + Result *result = new Result; + + result->success = m_session.snmpGetNext( m_oid, result->data, &result->error ); + result->oid = m_oid; + + // do it here, because it sometimes is slow and can block for a bit + if ( result->success ) { + result->identifierString = result->oid.toString(); + result->dataString = result->data.toString(); + } + + m_stopGuard.lock(); + if ( !m_stop ) + m_stop = !result->success; + m_stopGuard.unlock(); + + m_resultGuard.lock(); + m_results << result; + m_resultGuard.unlock(); + } + + // cause finished signal to be emitted + QApplication::postEvent( this, new QCustomEvent( QEvent::User ) ); +} + +void Walker::timerEvent( QTimerEvent *ev ) +{ + if ( ev->timerId() != m_timerId ) + return; + + Result *result = 0; + + m_resultGuard.lock(); + if ( !m_results.isEmpty() ) { + result = m_results.first(); + m_results.remove( m_results.begin() ); + } + m_resultGuard.unlock(); + + if ( result ) { + emit resultReady( *result ); + + delete result; + } + + if ( !QThread::running() && !result ) { + killTimer( m_timerId ); + m_timerId = 0; + } +} + +void Walker::customEvent( QCustomEvent * ) +{ + emit finished(); +} + +#include "walker.moc" +/* vim: et sw=4 ts=4 + */ -- cgit v1.2.1