/*************************************************************************** * (c) 2015 Timothy Pearson * * Copyright (C) 2004-2005 by Hugo Parente Lima * * hugo_pl@users.sourceforge.net * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef KNETSTATSVIEW_H #define KNETSTATSVIEW_H #include #include #include #include #include #include class TQTimer; class TQMouseEvent; class TQPainter; class TQPaintEvent; class Statistics; class KNetStats; /** * Main class */ class KNetStatsView : public KSystemTray { Q_OBJECT enum { HISTORY_SIZE = 50, // Speed history buffer size SPEED_BUFFER_SIZE = 10 // Speed normalization buffer size }; public: /** * KNetstats view mode on system tray. */ enum Mode { Icon, Text, Graphic }; /** * Visualization options. */ struct Options { // general int mUpdateInterval; Mode mViewMode; bool mMonitoring; // txt view TQFont mTxtFont; TQColor mTxtUplColor; TQColor mTxtDldColor; // icon view int mTheme; // chart view TQColor mChartUplColor; TQColor mChartDldColor; TQColor mChartBgColor; bool mChartTransparentBackground; }; KNetStatsView(KNetStats* parent, const TQString& interface); ~KNetStatsView(); void say(const TQString& message); void updateViewOptions(); // read a value from /sys/class/net/interface/name unsigned long readInterfaceNumValue(const char* name); // read a value from /sys/class/net/interface/name TQString readInterfaceStringValue(const char* name, int maxlength); TQString getIp(); TQString getNetmask(); const double* speedHistoryRx() const { return mSpeedHistoryRx; } const double* speedHistoryTx() const { return mSpeedHistoryTx; } const int historyBufferSize() const { return HISTORY_SIZE; } const int* historyPointer() const { return &mSpeedHistoryPtr; } const double* maxSpeed() const { return &mMaxSpeed; } /// Return a copy of the current view options. Options options() const { return mOptions; } /// read the interface view options static void readOptions( const TQString& name, Options* opts, bool defaultVisibility = false ); /// The current monitored network interface inline const TQString& interface() const; /// The current Update Interval in miliseconds inline int updateInterval() const; /// We are in textmode? inline Mode viewMode() const; /// Total of bytes receiveds inline unsigned long totalBytesRx() const; /// Total of bytes transmitted inline unsigned long totalBytesTx() const; /// Total of packets receiveds inline unsigned long totalPktRx() const; /// Total of packets transmitted inline unsigned long totalPktTx() const; /// RX Speed in bytes per second inline double byteSpeedRx() const; /// TX Speed in bytes per second inline double byteSpeedTx() const; /// RX Speed in packets per second inline double pktSpeedRx() const; /// TX Speed in packets per second inline double pktSpeedTx() const; protected: void mousePressEvent( TQMouseEvent* ev ); void paintEvent( TQPaintEvent* ev ); private: int mFdSock; // Kernel-knetstats socket struct ifreq mDevInfo; // info struct about our interface TQString mSysDevPath; // Path to the device. bool mCarrier; // Interface carrier is on? bool mConnected; // Interface exists? TDEPopupMenu* mContextMenu; // Global ContextMenu Statistics* mStatistics; // Statistics window TQString mInterface; // Current interface Options mOptions; // View options // Icons TQPixmap mIconError, mIconNone, mIconTx, mIconRx, mIconBoth; TQPixmap* mCurrentIcon; // Current state TQTimer* mTimer; // Timer // Rx e Tx to bytes and packets unsigned long mBRx, mBTx, mPRx, mPTx; // Statistics unsigned long mTotalBytesRx, mTotalBytesTx, mTotalPktRx, mTotalPktTx; // Speed buffers double mSpeedBufferRx[SPEED_BUFFER_SIZE], mSpeedBufferTx[SPEED_BUFFER_SIZE]; double mSpeedBufferPRx[SPEED_BUFFER_SIZE], mSpeedBufferPTx[SPEED_BUFFER_SIZE]; // pointer to current speed buffer position int mSpeedBufferPtr; bool mFirstUpdate; // History buffer TODO: Make it configurable! double mSpeedHistoryRx[HISTORY_SIZE]; double mSpeedHistoryTx[HISTORY_SIZE]; int mSpeedHistoryPtr; double mMaxSpeed; int mMaxSpeedAge; // setup the view. void setup(); void drawText(TQPainter& paint); void drawGraphic(TQPainter& paint); // Reset speed and history buffers void resetBuffers(); // calc tha max. speed stored in the history buffer inline void calcMaxSpeed(); // calc the speed using a speed buffer inline double calcSpeed(const double* buffer) const; bool openFdSocket(); private slots: // Called by the timer to update statistics void updateStats(); }; void KNetStatsView::calcMaxSpeed() { double max = 0.0; int ptr = mSpeedHistoryPtr; for (int i = 0; i < HISTORY_SIZE; ++i) { if (mSpeedHistoryRx[i] > max) { max = mSpeedHistoryRx[i]; ptr = i; } if (mSpeedHistoryTx[i] > max) { max = mSpeedHistoryTx[i]; ptr = i; } } mMaxSpeed = max; mMaxSpeedAge = (mSpeedHistoryPtr > ptr) ? (mSpeedHistoryPtr - ptr) : (mSpeedHistoryPtr + HISTORY_SIZE - ptr); } double KNetStatsView::calcSpeed(const double* buffer) const { double total = 0.0; for (int i = 0; i < SPEED_BUFFER_SIZE; ++i) total += buffer[i]; return total/SPEED_BUFFER_SIZE; } const TQString& KNetStatsView::interface() const { return mInterface; } int KNetStatsView::updateInterval() const { return mOptions.mUpdateInterval; } KNetStatsView::Mode KNetStatsView::viewMode() const { return mOptions.mViewMode; } unsigned long KNetStatsView::totalBytesRx() const { return mTotalBytesRx; } unsigned long KNetStatsView::totalBytesTx() const { return mTotalBytesTx; } unsigned long KNetStatsView::totalPktRx() const { return mTotalPktRx; } unsigned long KNetStatsView::totalPktTx() const { return mTotalPktTx; } double KNetStatsView::byteSpeedRx() const { return mSpeedHistoryRx[mSpeedHistoryPtr]; } double KNetStatsView::byteSpeedTx() const { return mSpeedHistoryTx[mSpeedHistoryPtr]; } double KNetStatsView::pktSpeedRx() const { return calcSpeed(mSpeedBufferPRx); } double KNetStatsView::pktSpeedTx() const { return calcSpeed(mSpeedBufferPTx); } #endif