diff --git a/client/streamstatsmodel.cpp b/client/streamstatsmodel.cpp index a427bf6..d8097b7 100644 --- a/client/streamstatsmodel.cpp +++ b/client/streamstatsmodel.cpp @@ -35,9 +35,23 @@ static QStringList statTitles = QStringList() << "Tx Bytes" << "Rx Bytes"; +// XXX: Keep the enum in sync with it's string +enum { + kAggrTxPkts, + kAggrRxPkts, + kAggrPktLoss, + kMaxAggrStreamStats +}; +static QStringList aggrStatTitles = QStringList() + << "Aggregate\nTx Pkts" + << "Aggregate\nRx Pkts" + << "Aggregate\nPkt Loss"; + + StreamStatsModel::StreamStatsModel(QObject *parent) : QAbstractTableModel(parent) { + clearStats(); } int StreamStatsModel::rowCount(const QModelIndex &parent) const @@ -47,7 +61,10 @@ int StreamStatsModel::rowCount(const QModelIndex &parent) const int StreamStatsModel::columnCount(const QModelIndex &parent) const { - return portList_.size() * kMaxStreamStats; + if (!portList_.size()) + return 0; + + return kMaxAggrStreamStats + portList_.size() * kMaxStreamStats; } QVariant StreamStatsModel::headerData( @@ -58,6 +75,10 @@ QVariant StreamStatsModel::headerData( switch (orientation) { case Qt::Horizontal: // Column Header + if (section < kMaxAggrStreamStats) + return aggrStatTitles.at(section % kMaxAggrStreamStats); + + section -= kMaxAggrStreamStats; return QString("Port %1-%2\n%3") .arg(portList_.at(section/kMaxStreamStats).first) .arg(portList_.at(section/kMaxStreamStats).second) @@ -80,8 +101,24 @@ QVariant StreamStatsModel::data(const QModelIndex &index, int role) const return QVariant(); Guid guid = guidList_.at(index.row()); - PortGroupPort pgp = portList_.at(index.column()/kMaxStreamStats); - int stat = index.column() % kMaxStreamStats; + if (index.column() < kMaxAggrStreamStats) { + int stat = index.column() % kMaxAggrStreamStats; + switch (stat) { + case kAggrRxPkts: + return QString("%L1").arg(aggrStreamStats_.value(guid).rxPkts); + case kAggrTxPkts: + return QString("%L1").arg(aggrStreamStats_.value(guid).txPkts); + case kAggrPktLoss: + return QString("%L1").arg(aggrStreamStats_.value(guid).pktLoss); + default: + break; + }; + return QVariant(); + } + + int portColumn = index.column() - kMaxAggrStreamStats; + PortGroupPort pgp = portList_.at(portColumn/kMaxStreamStats); + int stat = portColumn % kMaxStreamStats; switch (stat) { case kRxPkts: @@ -111,6 +148,7 @@ void StreamStatsModel::clearStats() guidList_.clear(); portList_.clear(); streamStats_.clear(); + aggrStreamStats_.clear(); #if QT_VERSION >= 0x040600 endResetModel(); @@ -134,12 +172,17 @@ void StreamStatsModel::appendStreamStatsList( PortGroupPort pgp = PortGroupPort(portGroupId, s.port_id().id()); Guid guid = s.stream_guid().id(); StreamStats &ss = streamStats_[guid][pgp]; + AggrStreamStats &aggrStats = aggrStreamStats_[guid]; ss.rxPkts = s.rx_pkts(); ss.txPkts = s.tx_pkts(); ss.rxBytes = s.rx_bytes(); ss.txBytes = s.tx_bytes(); + aggrStats.rxPkts += ss.rxPkts; + aggrStats.txPkts += ss.txPkts; + aggrStats.pktLoss += ss.txPkts - ss.rxPkts; + if (!portList_.contains(pgp)) portList_.append(pgp); if (!guidList_.contains(guid)) diff --git a/client/streamstatsmodel.h b/client/streamstatsmodel.h index 0e884ef..c38d9ad 100644 --- a/client/streamstatsmodel.h +++ b/client/streamstatsmodel.h @@ -56,9 +56,15 @@ private: quint64 rxBytes; quint64 txBytes; }; + struct AggrStreamStats { + quint64 rxPkts; + quint64 txPkts; + qint64 pktLoss; + }; QList guidList_; QList portList_; QHash > streamStats_; + QHash aggrStreamStats_; }; #endif