KNemo – network interfaces monitor for systray
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

384 lines
11 KiB

/* This file is part of KNemo
Copyright (C) 2005, 2006 Percy Leonhardt <percy@eris23.de>
KNemo is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
KNemo 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 Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include <tqdom.h>
#include <tqfile.h>
#include <tqtimer.h>
#include <tqstring.h>
#include <tqdatetime.h>
#include <kdebug.h>
#include "interface.h"
#include "interfacestatistics.h"
InterfaceStatistics::InterfaceStatistics( Interface* interface )
: TQObject(),
mInterface( interface )
{
mDayStatistics.setAutoDelete( true );
mMonthStatistics.setAutoDelete( true );
mYearStatistics.setAutoDelete( true );
initStatistics();
mSaveTimer = new TQTimer();
connect( mSaveTimer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( saveStatistics() ) );
mSaveTimer->start( mInterface->getGeneralData().saveInterval * 1000 );
}
InterfaceStatistics::~InterfaceStatistics()
{
mSaveTimer->stop();
delete mSaveTimer;
mDayStatistics.clear();
mMonthStatistics.clear();
mYearStatistics.clear();
}
void InterfaceStatistics::loadStatistics()
{
TQDomDocument doc( "statistics" );
TQString dir = mInterface->getGeneralData().statisticsDir;
TQFile file( dir + "/statistics_" + mInterface->getName() );
if ( !file.open( IO_ReadOnly ) )
return;
if ( !doc.setContent( &file ) )
{
file.close();
return;
}
file.close();
mDayStatistics.clear();
mMonthStatistics.clear();
mYearStatistics.clear();
TQDomElement root = doc.documentElement();
TQDomNode n = root.namedItem( "days" );
if ( !n.isNull() )
{
TQDomNode dayNode = n.firstChild();
while ( !dayNode.isNull() )
{
TQDomElement day = dayNode.toElement();
if ( !day.isNull() )
{
StatisticEntry* entry = new StatisticEntry();
entry->day = day.attribute( "day" ).toInt();
entry->month = day.attribute( "month" ).toInt();
entry->year = day.attribute( "year" ).toInt();
entry->rxBytes = (TQ_UINT64) day.attribute( "rxBytes" ).toDouble();
entry->txBytes = (TQ_UINT64) day.attribute( "txBytes" ).toDouble();
mDayStatistics.append( entry );
}
dayNode = dayNode.nextSibling();
}
mDayStatistics.sort();
}
n = root.namedItem( "months" );
if ( !n.isNull() )
{
TQDomNode monthNode = n.firstChild();
while ( !monthNode.isNull() )
{
TQDomElement month = monthNode.toElement();
if ( !month.isNull() )
{
StatisticEntry* entry = new StatisticEntry();
entry->day = 0;
entry->month = month.attribute( "month" ).toInt();
entry->year = month.attribute( "year" ).toInt();
entry->rxBytes = (TQ_UINT64) month.attribute( "rxBytes" ).toDouble();
entry->txBytes = (TQ_UINT64) month.attribute( "txBytes" ).toDouble();
mMonthStatistics.append( entry );
}
monthNode = monthNode.nextSibling();
}
mMonthStatistics.sort();
}
n = root.namedItem( "years" );
if ( !n.isNull() )
{
TQDomNode yearNode = n.firstChild();
while ( !yearNode.isNull() )
{
TQDomElement year = yearNode.toElement();
if ( !year.isNull() )
{
StatisticEntry* entry = new StatisticEntry();
entry->day = 0;
entry->month = 0;
entry->year = year.attribute( "year" ).toInt();
entry->rxBytes = (TQ_UINT64) year.attribute( "rxBytes" ).toDouble();
entry->txBytes = (TQ_UINT64) year.attribute( "txBytes" ).toDouble();
mYearStatistics.append( entry );
}
yearNode = yearNode.nextSibling();
}
mYearStatistics.sort();
}
initStatistics();
}
void InterfaceStatistics::saveStatistics()
{
TQDomDocument doc( "statistics" );
TQDomElement root = doc.createElement( "statistics" );
doc.appendChild( root );
TQDomElement days = doc.createElement( "days" );
StatisticEntry* iterator = mDayStatistics.first();
while ( iterator )
{
TQDomElement day = doc.createElement( "day" );
day.setAttribute( "day", iterator->day );
day.setAttribute( "month", iterator->month );
day.setAttribute( "year", iterator->year );
day.setAttribute( "rxBytes", (double) iterator->rxBytes );
day.setAttribute( "txBytes", (double) iterator->txBytes );
days.appendChild( day );
iterator = mDayStatistics.next();
}
root.appendChild( days );
TQDomElement months = doc.createElement( "months" );
iterator = mMonthStatistics.first();
while ( iterator )
{
TQDomElement month = doc.createElement( "month" );
month.setAttribute( "month", iterator->month );
month.setAttribute( "year", iterator->year );
month.setAttribute( "rxBytes", (double) iterator->rxBytes );
month.setAttribute( "txBytes", (double) iterator->txBytes );
months.appendChild( month );
iterator = mMonthStatistics.next();
}
root.appendChild( months );
TQDomElement years = doc.createElement( "years" );
iterator = mYearStatistics.first();
while ( iterator )
{
TQDomElement year = doc.createElement( "year" );
year.setAttribute( "year", iterator->year );
year.setAttribute( "rxBytes", (double) iterator->rxBytes );
year.setAttribute( "txBytes", (double) iterator->txBytes );
years.appendChild( year );
iterator = mYearStatistics.next();
}
root.appendChild( years );
TQString dir = mInterface->getGeneralData().statisticsDir;
TQFile file( dir + "/statistics_" + mInterface->getName() );
if ( !file.open( IO_WriteOnly ) )
return;
TQTextStream stream( &file );
stream << doc.toString();
file.close();
}
void InterfaceStatistics::configChanged()
{
// restart the timer with the new value
mSaveTimer->changeInterval( mInterface->getGeneralData().saveInterval * 1000 );
}
const StatisticEntry* InterfaceStatistics::getCurrentDay() const
{
return mCurrentDay;
}
const StatisticEntry* InterfaceStatistics::getCurrentMonth() const
{
return mCurrentMonth;
}
const StatisticEntry* InterfaceStatistics::getCurrentYear() const
{
return mCurrentYear;
}
const StatisticsPtrList<StatisticEntry>& InterfaceStatistics::getDayStatistics() const
{
return mDayStatistics;
}
const StatisticsPtrList<StatisticEntry>& InterfaceStatistics::getMonthStatistics() const
{
return mMonthStatistics;
}
const StatisticsPtrList<StatisticEntry>& InterfaceStatistics::getYearStatistics() const
{
return mYearStatistics;
}
void InterfaceStatistics::addIncomingData( unsigned long data )
{
checkCurrentEntry();
mCurrentDay->rxBytes += data;
mCurrentMonth->rxBytes += data;
mCurrentYear->rxBytes += data;
emit currentEntryChanged();
}
void InterfaceStatistics::addOutgoingData( unsigned long data )
{
checkCurrentEntry();
mCurrentDay->txBytes += data;
mCurrentMonth->txBytes += data;
mCurrentYear->txBytes += data;
emit currentEntryChanged();
}
void InterfaceStatistics::clearDayStatistics()
{
mDayStatistics.clear();
updateCurrentDay();
}
void InterfaceStatistics::clearMonthStatistics()
{
mMonthStatistics.clear();
updateCurrentMonth();
}
void InterfaceStatistics::clearYearStatistics()
{
mYearStatistics.clear();
updateCurrentYear();
}
void InterfaceStatistics::checkCurrentEntry()
{
if ( mCurrentDay->day != TQDate::currentDate().day() ||
mCurrentDay->month != TQDate::currentDate().month() ||
mCurrentDay->year != TQDate::currentDate().year() )
{
// current day has changed
updateCurrentDay();
if ( mCurrentMonth->month != TQDate::currentDate().month() ||
mCurrentMonth->year != TQDate::currentDate().year() )
{
// current month has also changed
updateCurrentMonth();
}
if ( mCurrentYear->year != TQDate::currentDate().year() )
{
// current year has also changed
updateCurrentYear();
}
}
}
void InterfaceStatistics::initStatistics()
{
updateCurrentDay();
updateCurrentMonth();
updateCurrentYear();
emit currentEntryChanged();
}
void InterfaceStatistics::updateCurrentDay()
{
mCurrentDay = mDayStatistics.first();
while ( mCurrentDay )
{
if ( mCurrentDay->day == TQDate::currentDate().day() &&
mCurrentDay->month == TQDate::currentDate().month() &&
mCurrentDay->year == TQDate::currentDate().year() )
{
// found current day in list
return;
}
mCurrentDay = mDayStatistics.next();
}
// the current day is not in the list
mCurrentDay = new StatisticEntry();
mCurrentDay->day = TQDate::currentDate().day();
mCurrentDay->month = TQDate::currentDate().month();
mCurrentDay->year = TQDate::currentDate().year();
mCurrentDay->rxBytes = 0;
mCurrentDay->txBytes = 0;
mDayStatistics.append( mCurrentDay ); // TODO: insert at correct position
emit dayStatisticsChanged();
}
void InterfaceStatistics::updateCurrentMonth()
{
mCurrentMonth = mMonthStatistics.first();
while ( mCurrentMonth )
{
if ( mCurrentMonth->month == TQDate::currentDate().month() &&
mCurrentMonth->year == TQDate::currentDate().year() )
{
// found current month in list
return;
}
mCurrentMonth = mMonthStatistics.next();
}
// the current month is not in the list
mCurrentMonth = new StatisticEntry();
mCurrentMonth->day = 0;
mCurrentMonth->month = TQDate::currentDate().month();
mCurrentMonth->year = TQDate::currentDate().year();
mCurrentMonth->rxBytes = 0;
mCurrentMonth->txBytes = 0;
mMonthStatistics.append( mCurrentMonth ); // TODO: insert at correct position
emit monthStatisticsChanged();
}
void InterfaceStatistics::updateCurrentYear()
{
mCurrentYear = mYearStatistics.first();
while ( mCurrentYear )
{
if ( mCurrentYear->year == TQDate::currentDate().year() )
{
// found current year in list
return;
}
mCurrentYear = mYearStatistics.next();
}
// the current year is not in the list
mCurrentYear = new StatisticEntry();
mCurrentYear->day = 0;
mCurrentYear->month = 0;
mCurrentYear->year = TQDate::currentDate().year();
mCurrentYear->rxBytes = 0;
mCurrentYear->txBytes = 0;
mYearStatistics.append( mCurrentYear ); // TODO: insert at correct position
emit yearStatisticsChanged();
}
#include "interfacestatistics.moc"