2016-11-24 10:14:38 -06:00
|
|
|
/*
|
|
|
|
Copyright (C) 2016 Srivats P.
|
|
|
|
|
|
|
|
This file is part of "Ostinato"
|
|
|
|
|
|
|
|
This 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 3 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, see <http://www.gnu.org/licenses/>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "streamstatsmodel.h"
|
|
|
|
|
|
|
|
#include "protocol.pb.h"
|
|
|
|
|
2016-11-26 02:07:36 -06:00
|
|
|
// XXX: Keep the enum in sync with it's string
|
|
|
|
enum {
|
|
|
|
kTxPkts,
|
2016-12-09 06:42:06 -06:00
|
|
|
kRxPkts,
|
2016-11-26 02:07:36 -06:00
|
|
|
kTxBytes,
|
2016-12-09 06:42:06 -06:00
|
|
|
kRxBytes,
|
2016-11-26 02:07:36 -06:00
|
|
|
kMaxStreamStats
|
|
|
|
};
|
|
|
|
static QStringList statTitles = QStringList()
|
|
|
|
<< "Tx Pkts"
|
2016-12-09 06:42:06 -06:00
|
|
|
<< "Rx Pkts"
|
|
|
|
<< "Tx Bytes"
|
|
|
|
<< "Rx Bytes";
|
2016-11-26 02:07:36 -06:00
|
|
|
|
2016-11-24 10:14:38 -06:00
|
|
|
StreamStatsModel::StreamStatsModel(QObject *parent)
|
2016-11-26 02:07:36 -06:00
|
|
|
: QAbstractTableModel(parent)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int StreamStatsModel::rowCount(const QModelIndex &parent) const
|
|
|
|
{
|
|
|
|
return guidList_.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
int StreamStatsModel::columnCount(const QModelIndex &parent) const
|
|
|
|
{
|
|
|
|
return portList_.size() * kMaxStreamStats;
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariant StreamStatsModel::headerData(
|
|
|
|
int section, Qt::Orientation orientation, int role) const
|
|
|
|
{
|
|
|
|
if (role != Qt::DisplayRole)
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
switch (orientation) {
|
|
|
|
case Qt::Horizontal: // Column Header
|
|
|
|
return QString("Port %1-%2\n%3")
|
|
|
|
.arg(portList_.at(section/kMaxStreamStats).first)
|
|
|
|
.arg(portList_.at(section/kMaxStreamStats).second)
|
|
|
|
.arg(statTitles.at(section % kMaxStreamStats));
|
|
|
|
case Qt::Vertical: // Row Header
|
|
|
|
return QString("Stream GUID %1")
|
|
|
|
.arg(guidList_.at(section));
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariant StreamStatsModel::data(const QModelIndex &index, int role) const
|
2016-11-24 10:14:38 -06:00
|
|
|
{
|
2016-11-27 00:26:18 -06:00
|
|
|
if (role == Qt::TextAlignmentRole)
|
|
|
|
return Qt::AlignRight;
|
|
|
|
|
2016-11-26 02:07:36 -06:00
|
|
|
if (role != Qt::DisplayRole)
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
Guid guid = guidList_.at(index.row());
|
|
|
|
PortGroupPort pgp = portList_.at(index.column()/kMaxStreamStats);
|
|
|
|
int stat = index.column() % kMaxStreamStats;
|
|
|
|
|
|
|
|
switch (stat) {
|
|
|
|
case kRxPkts:
|
2016-11-27 00:26:18 -06:00
|
|
|
return QString("%L1").arg(streamStats_.value(guid).value(pgp).rxPkts);
|
2016-11-26 02:07:36 -06:00
|
|
|
case kTxPkts:
|
2016-11-27 00:26:18 -06:00
|
|
|
return QString("%L1").arg(streamStats_.value(guid).value(pgp).txPkts);
|
2016-11-26 02:07:36 -06:00
|
|
|
case kRxBytes:
|
2016-11-27 00:26:18 -06:00
|
|
|
return QString("%L1").arg(streamStats_.value(guid).value(pgp).rxBytes);
|
2016-11-26 02:07:36 -06:00
|
|
|
case kTxBytes:
|
2016-11-27 00:26:18 -06:00
|
|
|
return QString("%L1").arg(streamStats_.value(guid).value(pgp).txBytes);
|
2016-11-26 02:07:36 -06:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return QVariant();
|
2016-11-24 10:14:38 -06:00
|
|
|
}
|
|
|
|
|
2016-11-26 02:07:36 -06:00
|
|
|
// --------------------------------------------- //
|
|
|
|
// Slots
|
|
|
|
// --------------------------------------------- //
|
2016-11-24 10:14:38 -06:00
|
|
|
void StreamStatsModel::clearStats()
|
|
|
|
{
|
2016-11-26 02:07:36 -06:00
|
|
|
#if QT_VERSION >= 0x040600
|
|
|
|
beginResetModel();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
guidList_.clear();
|
|
|
|
portList_.clear();
|
|
|
|
streamStats_.clear();
|
|
|
|
|
|
|
|
#if QT_VERSION >= 0x040600
|
|
|
|
endResetModel();
|
|
|
|
#else
|
|
|
|
reset();
|
|
|
|
#endif
|
2016-11-24 10:14:38 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void StreamStatsModel::appendStreamStatsList(
|
2016-11-26 02:07:36 -06:00
|
|
|
quint32 portGroupId,
|
2016-11-24 10:14:38 -06:00
|
|
|
const OstProto::StreamStatsList *stats)
|
|
|
|
{
|
2016-11-26 02:07:36 -06:00
|
|
|
int n = stats->stream_stats_size();
|
|
|
|
|
|
|
|
#if QT_VERSION >= 0x040600
|
|
|
|
beginResetModel();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
const OstProto::StreamStats &s = stats->stream_stats(i);
|
|
|
|
PortGroupPort pgp = PortGroupPort(portGroupId, s.port_id().id());
|
|
|
|
Guid guid = s.stream_guid().id();
|
|
|
|
StreamStats &ss = streamStats_[guid][pgp];
|
|
|
|
|
|
|
|
ss.rxPkts = s.rx_pkts();
|
|
|
|
ss.txPkts = s.tx_pkts();
|
|
|
|
ss.rxBytes = s.rx_bytes();
|
|
|
|
ss.txBytes = s.tx_bytes();
|
|
|
|
|
|
|
|
if (!portList_.contains(pgp))
|
|
|
|
portList_.append(pgp);
|
|
|
|
if (!guidList_.contains(guid))
|
|
|
|
guidList_.append(guid);
|
|
|
|
}
|
|
|
|
|
|
|
|
#if QT_VERSION >= 0x040600
|
|
|
|
endResetModel();
|
|
|
|
#else
|
|
|
|
reset();
|
|
|
|
#endif
|
2016-11-24 10:14:38 -06:00
|
|
|
|
|
|
|
// Prevent receiving any future updates from this sender
|
|
|
|
disconnect(sender(), 0, this, 0);
|
|
|
|
}
|