/* This file is part of KNemo Copyright (C) 2005, 2006 Percy Leonhardt 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 #include #include #include #include #include #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& InterfaceStatistics::getDayStatistics() const { return mDayStatistics; } const StatisticsPtrList& InterfaceStatistics::getMonthStatistics() const { return mMonthStatistics; } const StatisticsPtrList& 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::tqcurrentDate().day() || mCurrentDay->month != TQDate::tqcurrentDate().month() || mCurrentDay->year != TQDate::tqcurrentDate().year() ) { // current day has changed updateCurrentDay(); if ( mCurrentMonth->month != TQDate::tqcurrentDate().month() || mCurrentMonth->year != TQDate::tqcurrentDate().year() ) { // current month has also changed updateCurrentMonth(); } if ( mCurrentYear->year != TQDate::tqcurrentDate().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::tqcurrentDate().day() && mCurrentDay->month == TQDate::tqcurrentDate().month() && mCurrentDay->year == TQDate::tqcurrentDate().year() ) { // found current day in list return; } mCurrentDay = mDayStatistics.next(); } // the current day is not in the list mCurrentDay = new StatisticEntry(); mCurrentDay->day = TQDate::tqcurrentDate().day(); mCurrentDay->month = TQDate::tqcurrentDate().month(); mCurrentDay->year = TQDate::tqcurrentDate().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::tqcurrentDate().month() && mCurrentMonth->year == TQDate::tqcurrentDate().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::tqcurrentDate().month(); mCurrentMonth->year = TQDate::tqcurrentDate().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::tqcurrentDate().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::tqcurrentDate().year(); mCurrentYear->rxBytes = 0; mCurrentYear->txBytes = 0; mYearStatistics.append( mCurrentYear ); // TODO: insert at correct position emit yearStatisticsChanged(); }