mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
Added a second tab for Router Statistics
renamed Tunneling to Router Requests git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4228 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
0baaa271e9
commit
b139ce2d88
@ -199,6 +199,7 @@ HEADERS += rshare.h \
|
|||||||
gui/MainWindow.h \
|
gui/MainWindow.h \
|
||||||
gui/RSHumanReadableDelegate.h \
|
gui/RSHumanReadableDelegate.h \
|
||||||
gui/TurtleRouterDialog.h \
|
gui/TurtleRouterDialog.h \
|
||||||
|
gui/TurtleRouterStatistics.h \
|
||||||
gui/AboutDialog.h \
|
gui/AboutDialog.h \
|
||||||
gui/ForumsDialog.h \
|
gui/ForumsDialog.h \
|
||||||
gui/forums/ForumDetails.h \
|
gui/forums/ForumDetails.h \
|
||||||
@ -351,6 +352,7 @@ FORMS += gui/StartDialog.ui \
|
|||||||
gui/ForumsDialog.ui \
|
gui/ForumsDialog.ui \
|
||||||
gui/MainWindow.ui \
|
gui/MainWindow.ui \
|
||||||
gui/TurtleRouterDialog.ui \
|
gui/TurtleRouterDialog.ui \
|
||||||
|
gui/TurtleRouterStatistics.ui \
|
||||||
gui/forums/CreateForum.ui \
|
gui/forums/CreateForum.ui \
|
||||||
gui/forums/CreateForumMsg.ui \
|
gui/forums/CreateForumMsg.ui \
|
||||||
gui/forums/ForumDetails.ui \
|
gui/forums/ForumDetails.ui \
|
||||||
@ -433,6 +435,7 @@ SOURCES += main.cpp \
|
|||||||
gui/graphframe.cpp \
|
gui/graphframe.cpp \
|
||||||
gui/mainpagestack.cpp \
|
gui/mainpagestack.cpp \
|
||||||
gui/TurtleRouterDialog.cpp \
|
gui/TurtleRouterDialog.cpp \
|
||||||
|
gui/TurtleRouterStatistics.cpp \
|
||||||
gui/MainWindow.cpp \
|
gui/MainWindow.cpp \
|
||||||
gui/ForumsDialog.cpp \
|
gui/ForumsDialog.cpp \
|
||||||
gui/forums/ForumDetails.cpp \
|
gui/forums/ForumDetails.cpp \
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "ULListDelegate.h"
|
#include "ULListDelegate.h"
|
||||||
#include "FileTransferInfoWidget.h"
|
#include "FileTransferInfoWidget.h"
|
||||||
#include "TurtleRouterDialog.h"
|
#include "TurtleRouterDialog.h"
|
||||||
|
#include "TurtleRouterStatistics.h"
|
||||||
#include "xprogressbar.h"
|
#include "xprogressbar.h"
|
||||||
#include "settings/rsharesettings.h"
|
#include "settings/rsharesettings.h"
|
||||||
|
|
||||||
@ -262,7 +263,10 @@ TransfersDialog::TransfersDialog(QWidget *parent)
|
|||||||
|
|
||||||
QObject::connect(ui.downloadList->selectionModel(),SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),this,SLOT(showFileDetails())) ;
|
QObject::connect(ui.downloadList->selectionModel(),SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),this,SLOT(showFileDetails())) ;
|
||||||
|
|
||||||
ui.tabWidget->addTab( new TurtleRouterDialog(), tr("Tunneling")) ;
|
ui.tabWidget->addTab( new TurtleRouterStatistics(), tr("Router Statistics")) ;
|
||||||
|
|
||||||
|
ui.tabWidget->addTab( new TurtleRouterDialog(), tr("Router Requests")) ;
|
||||||
|
|
||||||
|
|
||||||
// TurtleRouterDialog *trdl = new TurtleRouterDialog();
|
// TurtleRouterDialog *trdl = new TurtleRouterDialog();
|
||||||
// ui.tunnelInfoWidget->setWidget(trdl);
|
// ui.tunnelInfoWidget->setWidget(trdl);
|
||||||
|
@ -11,127 +11,6 @@
|
|||||||
|
|
||||||
static const int MAX_TUNNEL_REQUESTS_DISPLAY = 10 ;
|
static const int MAX_TUNNEL_REQUESTS_DISPLAY = 10 ;
|
||||||
|
|
||||||
class TRHistogram
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TRHistogram(const std::vector<TurtleRequestDisplayInfo >& info) :_infos(info) {}
|
|
||||||
|
|
||||||
QColor colorScale(float f)
|
|
||||||
{
|
|
||||||
if(f == 0)
|
|
||||||
return QColor::fromHsv(0,0,192) ;
|
|
||||||
else
|
|
||||||
return QColor::fromHsv((int)((1.0-f)*280),200,255) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void draw(QPainter *painter,int& ox,int& oy,const QString& title)
|
|
||||||
{
|
|
||||||
static const int MaxTime = 61 ;
|
|
||||||
static const int MaxDepth = 8 ;
|
|
||||||
static const int cellx = 7 ;
|
|
||||||
static const int celly = 12 ;
|
|
||||||
|
|
||||||
int save_ox = ox ;
|
|
||||||
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
|
||||||
painter->drawText(2+ox,celly+oy,title) ;
|
|
||||||
oy+=2+2*celly ;
|
|
||||||
|
|
||||||
if(_infos.empty())
|
|
||||||
return ;
|
|
||||||
|
|
||||||
ox += 10 ;
|
|
||||||
std::map<std::string,std::vector<int> > hits ;
|
|
||||||
std::map<std::string,std::vector<int> > depths ;
|
|
||||||
std::map<std::string,std::vector<int> >::iterator it ;
|
|
||||||
|
|
||||||
int max_hits = 1;
|
|
||||||
int max_depth = 1;
|
|
||||||
|
|
||||||
for(uint32_t i=0;i<_infos.size();++i)
|
|
||||||
{
|
|
||||||
std::vector<int>& h(hits[_infos[i].source_peer_id]) ;
|
|
||||||
std::vector<int>& g(depths[_infos[i].source_peer_id]) ;
|
|
||||||
|
|
||||||
if(h.size() <= _infos[i].age)
|
|
||||||
h.resize(MaxTime,0) ;
|
|
||||||
|
|
||||||
if(g.empty())
|
|
||||||
g.resize(MaxDepth,0) ;
|
|
||||||
|
|
||||||
if(_infos[i].age < h.size())
|
|
||||||
{
|
|
||||||
h[_infos[i].age]++ ;
|
|
||||||
if(h[_infos[i].age] > max_hits)
|
|
||||||
max_hits = h[_infos[i].age] ;
|
|
||||||
}
|
|
||||||
if(_infos[i].depth < g.size())
|
|
||||||
{
|
|
||||||
g[_infos[i].depth]++ ;
|
|
||||||
|
|
||||||
if(g[_infos[i].depth] > max_depth)
|
|
||||||
max_depth = g[_infos[i].depth] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int p=0 ;
|
|
||||||
|
|
||||||
for(it=depths.begin();it!=depths.end();++it,++p)
|
|
||||||
for(int i=0;i<MaxDepth;++i)
|
|
||||||
painter->fillRect(ox+MaxTime*cellx+20+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_depth)) ;
|
|
||||||
|
|
||||||
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
|
||||||
painter->drawRect(ox+MaxTime*cellx+20,oy,MaxDepth*cellx,p*celly) ;
|
|
||||||
|
|
||||||
for(int i=0;i<MaxTime;i+=5)
|
|
||||||
painter->drawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ;
|
|
||||||
|
|
||||||
p=0 ;
|
|
||||||
for(it=hits.begin();it!=hits.end();++it,++p)
|
|
||||||
{
|
|
||||||
int total = 0 ;
|
|
||||||
|
|
||||||
for(int i=0;i<MaxTime;++i)
|
|
||||||
{
|
|
||||||
painter->fillRect(ox+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_hits)) ;
|
|
||||||
total += it->second[i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
|
||||||
painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx,oy+(p+1)*celly,TurtleRouterDialog::getPeerName(it->first)) ;
|
|
||||||
painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx+120,oy+(p+1)*celly,"("+QString::number(total)+")") ;
|
|
||||||
}
|
|
||||||
|
|
||||||
painter->drawRect(ox,oy,MaxTime*cellx,p*celly) ;
|
|
||||||
|
|
||||||
for(int i=0;i<MaxTime;i+=5)
|
|
||||||
painter->drawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ;
|
|
||||||
for(int i=0;i<MaxDepth;i++)
|
|
||||||
painter->drawText(ox+MaxTime*cellx+20+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ;
|
|
||||||
|
|
||||||
oy += (p+1)*celly+4 ;
|
|
||||||
|
|
||||||
painter->drawText(ox,oy+celly,QObject::tr("(Age in seconds)"));
|
|
||||||
painter->drawText(ox+MaxTime*cellx+20,oy+celly,QObject::tr("(Depth)"));
|
|
||||||
oy += 3*celly ;
|
|
||||||
|
|
||||||
// now, draw a scale
|
|
||||||
|
|
||||||
for(int i=0;i<=10;++i)
|
|
||||||
{
|
|
||||||
painter->fillRect(ox+i*(cellx+20),oy,cellx,celly,colorScale(i/10.0f)) ;
|
|
||||||
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
|
||||||
painter->drawRect(ox+i*(cellx+20),oy,cellx,celly) ;
|
|
||||||
painter->drawText(ox+i*(cellx+20)+cellx+4,oy+celly,QString::number((int)(max_hits*i/10.0))) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
oy += celly*2 ;
|
|
||||||
|
|
||||||
ox = save_ox ;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const std::vector<TurtleRequestDisplayInfo>& _infos ;
|
|
||||||
};
|
|
||||||
|
|
||||||
TurtleRouterDialog::TurtleRouterDialog(QWidget *parent)
|
TurtleRouterDialog::TurtleRouterDialog(QWidget *parent)
|
||||||
: RsAutoUpdatePage(2000,parent)
|
: RsAutoUpdatePage(2000,parent)
|
||||||
@ -157,14 +36,6 @@ TurtleRouterDialog::TurtleRouterDialog(QWidget *parent)
|
|||||||
|
|
||||||
top_level_hashes.clear() ;
|
top_level_hashes.clear() ;
|
||||||
|
|
||||||
_tunnel_statistics_F->setWidget( _tst_CW = new TurtleRouterStatisticsWidget() ) ;
|
|
||||||
_tunnel_statistics_F->setWidgetResizable(true);
|
|
||||||
_tunnel_statistics_F->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
_tunnel_statistics_F->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
|
|
||||||
_tunnel_statistics_F->viewport()->setBackgroundRole(QPalette::NoRole);
|
|
||||||
_tunnel_statistics_F->setFrameStyle(QFrame::NoFrame);
|
|
||||||
_tunnel_statistics_F->setFocusPolicy(Qt::NoFocus);
|
|
||||||
|
|
||||||
// load settings
|
// load settings
|
||||||
processSettings(true);
|
processSettings(true);
|
||||||
}
|
}
|
||||||
@ -186,12 +57,12 @@ void TurtleRouterDialog::processSettings(bool bLoad)
|
|||||||
// load settings
|
// load settings
|
||||||
|
|
||||||
// state of splitter
|
// state of splitter
|
||||||
splitter->restoreState(Settings->value("Splitter").toByteArray());
|
//splitter->restoreState(Settings->value("Splitter").toByteArray());
|
||||||
} else {
|
} else {
|
||||||
// save settings
|
// save settings
|
||||||
|
|
||||||
// state of splitter
|
// state of splitter
|
||||||
Settings->setValue("Splitter", splitter->saveState());
|
//Settings->setValue("Splitter", splitter->saveState());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,8 +83,8 @@ void TurtleRouterDialog::updateDisplay()
|
|||||||
rsTurtle->getInfo(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
rsTurtle->getInfo(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
||||||
|
|
||||||
updateTunnelRequests(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
updateTunnelRequests(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
||||||
_tst_CW->updateTunnelStatistics(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
//_tst_CW->updateTunnelStatistics(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
||||||
_tst_CW->update();
|
//_tst_CW->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString TurtleRouterDialog::getPeerName(const std::string& peer_id)
|
QString TurtleRouterDialog::getPeerName(const std::string& peer_id)
|
||||||
@ -348,88 +219,4 @@ QTreeWidgetItem *TurtleRouterDialog::findParentHashItem(const std::string& hash)
|
|||||||
return items.front() ;
|
return items.front() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
TurtleRouterStatisticsWidget::TurtleRouterStatisticsWidget(QWidget *parent)
|
|
||||||
: QWidget(parent)
|
|
||||||
{
|
|
||||||
maxWidth = 200 ;
|
|
||||||
maxHeight = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TurtleRouterStatisticsWidget::updateTunnelStatistics(const std::vector<std::vector<std::string> >& hashes_info,
|
|
||||||
const std::vector<std::vector<std::string> >& tunnels_info,
|
|
||||||
const std::vector<TurtleRequestDisplayInfo >& search_reqs_info,
|
|
||||||
const std::vector<TurtleRequestDisplayInfo >& tunnel_reqs_info)
|
|
||||||
|
|
||||||
{
|
|
||||||
static const int cellx = 6 ;
|
|
||||||
static const int celly = 10+4 ;
|
|
||||||
|
|
||||||
QPixmap tmppixmap(maxWidth, maxHeight);
|
|
||||||
tmppixmap.fill(this, 0, 0);
|
|
||||||
setFixedHeight(maxHeight);
|
|
||||||
|
|
||||||
QPainter painter(&tmppixmap);
|
|
||||||
painter.initFrom(this);
|
|
||||||
|
|
||||||
maxHeight = 500 ;
|
|
||||||
|
|
||||||
// std::cerr << "Drawing into pixmap of size " << maxWidth << "x" << maxHeight << std::endl;
|
|
||||||
// draw...
|
|
||||||
int ox=5,oy=5 ;
|
|
||||||
|
|
||||||
TRHistogram(search_reqs_info).draw(&painter,ox,oy,QObject::tr("Search requests repartition:")) ;
|
|
||||||
|
|
||||||
painter.setPen(QColor::fromRgb(70,70,70)) ;
|
|
||||||
painter.drawLine(0,oy,maxWidth,oy) ;
|
|
||||||
oy += celly ;
|
|
||||||
|
|
||||||
TRHistogram(tunnel_reqs_info).draw(&painter,ox,oy,QObject::tr("Tunnel requests repartition:")) ;
|
|
||||||
|
|
||||||
// now give information about turtle traffic.
|
|
||||||
//
|
|
||||||
TurtleTrafficStatisticsInfo info ;
|
|
||||||
rsTurtle->getTrafficStatistics(info) ;
|
|
||||||
|
|
||||||
painter.setPen(QColor::fromRgb(70,70,70)) ;
|
|
||||||
painter.drawLine(0,oy,maxWidth,oy) ;
|
|
||||||
oy += celly ;
|
|
||||||
|
|
||||||
painter.drawText(ox,oy+celly,tr("Turtle router traffic:")) ; oy += celly*2 ;
|
|
||||||
painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Up")+"\t: " + speedString(info.tr_up_Bps) ) ; oy += celly ;
|
|
||||||
painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Dn")+"\t: " + speedString(info.tr_dn_Bps) ) ; oy += celly ;
|
|
||||||
painter.drawText(ox+2*cellx,oy+celly,tr("Incoming file data")+"\t: " + speedString(info.data_dn_Bps) ) ; oy += celly ;
|
|
||||||
painter.drawText(ox+2*cellx,oy+celly,tr("Outgoing file data")+"\t: " + speedString(info.data_up_Bps) ) ; oy += celly ;
|
|
||||||
painter.drawText(ox+2*cellx,oy+celly,tr("Forwarded data ")+"\t: " + speedString(info.unknown_updn_Bps) ) ; oy += celly ;
|
|
||||||
|
|
||||||
// update the pixmap
|
|
||||||
//
|
|
||||||
pixmap = tmppixmap;
|
|
||||||
maxHeight = oy ;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString TurtleRouterStatisticsWidget::speedString(float f)
|
|
||||||
{
|
|
||||||
if(f < 1.0f)
|
|
||||||
return QString("0 B/s") ;
|
|
||||||
if(f < 1024.0f)
|
|
||||||
return QString::number((int)f)+" B/s" ;
|
|
||||||
|
|
||||||
return QString::number(f/1024.0,'f',2) + " KB/s";
|
|
||||||
}
|
|
||||||
|
|
||||||
void TurtleRouterStatisticsWidget::paintEvent(QPaintEvent *event)
|
|
||||||
{
|
|
||||||
QStylePainter(this).drawPixmap(0, 0, pixmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TurtleRouterStatisticsWidget::resizeEvent(QResizeEvent *event)
|
|
||||||
{
|
|
||||||
QRect TaskGraphRect = geometry();
|
|
||||||
maxWidth = TaskGraphRect.width();
|
|
||||||
maxHeight = TaskGraphRect.height() ;
|
|
||||||
|
|
||||||
QWidget::resizeEvent(event);
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#include "ui_TurtleRouterDialog.h"
|
#include "ui_TurtleRouterDialog.h"
|
||||||
#include "RsAutoUpdatePage.h"
|
#include "RsAutoUpdatePage.h"
|
||||||
|
|
||||||
class TurtleRouterStatisticsWidget ;
|
|
||||||
|
|
||||||
class TurtleRouterDialog: public RsAutoUpdatePage, public Ui::TurtleRouterDialogForm
|
class TurtleRouterDialog: public RsAutoUpdatePage, public Ui::TurtleRouterDialogForm
|
||||||
{
|
{
|
||||||
@ -33,26 +32,8 @@ class TurtleRouterDialog: public RsAutoUpdatePage, public Ui::TurtleRouterDialog
|
|||||||
QTreeWidgetItem *top_level_s_requests ;
|
QTreeWidgetItem *top_level_s_requests ;
|
||||||
QTreeWidgetItem *top_level_t_requests ;
|
QTreeWidgetItem *top_level_t_requests ;
|
||||||
|
|
||||||
TurtleRouterStatisticsWidget *_tst_CW ;
|
//TurtleRouterStatisticsWidget *_tst_CW ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
class TurtleRouterStatisticsWidget: public QWidget
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TurtleRouterStatisticsWidget(QWidget *parent = NULL) ;
|
|
||||||
|
|
||||||
virtual void paintEvent(QPaintEvent *event) ;
|
|
||||||
virtual void resizeEvent(QResizeEvent *event);
|
|
||||||
|
|
||||||
void updateTunnelStatistics( const std::vector<std::vector<std::basic_string<char> > >&,
|
|
||||||
const std::vector<std::vector<std::basic_string<char> > >&,
|
|
||||||
const std::vector<TurtleRequestDisplayInfo >&,
|
|
||||||
const std::vector<TurtleRequestDisplayInfo >&) ;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static QString speedString(float f) ;
|
|
||||||
|
|
||||||
QPixmap pixmap ;
|
|
||||||
int maxWidth,maxHeight ;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>865</width>
|
<width>572</width>
|
||||||
<height>525</height>
|
<height>350</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -17,12 +17,8 @@
|
|||||||
<iconset resource="images.qrc">
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/rstray3.png</normaloff>:/images/rstray3.png</iconset>
|
<normaloff>:/images/rstray3.png</normaloff>:/images/rstray3.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item>
|
<item row="0" column="0">
|
||||||
<widget class="QSplitter" name="splitter">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="QTreeWidget" name="_f2f_TW">
|
<widget class="QTreeWidget" name="_f2f_TW">
|
||||||
<property name="headerHidden">
|
<property name="headerHidden">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -33,28 +29,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</column>
|
</column>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QScrollArea" name="_tunnel_statistics_F">
|
|
||||||
<property name="frameShape">
|
|
||||||
<enum>QFrame::NoFrame</enum>
|
|
||||||
</property>
|
|
||||||
<property name="horizontalScrollBarPolicy">
|
|
||||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
|
||||||
</property>
|
|
||||||
<property name="widgetResizable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>847</width>
|
|
||||||
<height>283</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
327
retroshare-gui/src/gui/TurtleRouterStatistics.cpp
Normal file
327
retroshare-gui/src/gui/TurtleRouterStatistics.cpp
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
/****************************************************************
|
||||||
|
* RetroShare is distributed under the following license:
|
||||||
|
*
|
||||||
|
* Copyright (C) 20011, RetroShare Team
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QStylePainter>
|
||||||
|
|
||||||
|
#include <retroshare/rsturtle.h>
|
||||||
|
#include <retroshare/rspeers.h>
|
||||||
|
#include "TurtleRouterStatistics.h"
|
||||||
|
|
||||||
|
#include "gui/settings/rsharesettings.h"
|
||||||
|
|
||||||
|
static const int MAX_TUNNEL_REQUESTS_DISPLAY = 10 ;
|
||||||
|
|
||||||
|
class TRHistogram
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TRHistogram(const std::vector<TurtleRequestDisplayInfo >& info) :_infos(info) {}
|
||||||
|
|
||||||
|
QColor colorScale(float f)
|
||||||
|
{
|
||||||
|
if(f == 0)
|
||||||
|
return QColor::fromHsv(0,0,192) ;
|
||||||
|
else
|
||||||
|
return QColor::fromHsv((int)((1.0-f)*280),200,255) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void draw(QPainter *painter,int& ox,int& oy,const QString& title)
|
||||||
|
{
|
||||||
|
static const int MaxTime = 61 ;
|
||||||
|
static const int MaxDepth = 8 ;
|
||||||
|
static const int cellx = 7 ;
|
||||||
|
static const int celly = 12 ;
|
||||||
|
|
||||||
|
int save_ox = ox ;
|
||||||
|
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
||||||
|
painter->drawText(2+ox,celly+oy,title) ;
|
||||||
|
oy+=2+2*celly ;
|
||||||
|
|
||||||
|
if(_infos.empty())
|
||||||
|
return ;
|
||||||
|
|
||||||
|
ox += 10 ;
|
||||||
|
std::map<std::string,std::vector<int> > hits ;
|
||||||
|
std::map<std::string,std::vector<int> > depths ;
|
||||||
|
std::map<std::string,std::vector<int> >::iterator it ;
|
||||||
|
|
||||||
|
int max_hits = 1;
|
||||||
|
int max_depth = 1;
|
||||||
|
|
||||||
|
for(uint32_t i=0;i<_infos.size();++i)
|
||||||
|
{
|
||||||
|
std::vector<int>& h(hits[_infos[i].source_peer_id]) ;
|
||||||
|
std::vector<int>& g(depths[_infos[i].source_peer_id]) ;
|
||||||
|
|
||||||
|
if(h.size() <= _infos[i].age)
|
||||||
|
h.resize(MaxTime,0) ;
|
||||||
|
|
||||||
|
if(g.empty())
|
||||||
|
g.resize(MaxDepth,0) ;
|
||||||
|
|
||||||
|
if(_infos[i].age < h.size())
|
||||||
|
{
|
||||||
|
h[_infos[i].age]++ ;
|
||||||
|
if(h[_infos[i].age] > max_hits)
|
||||||
|
max_hits = h[_infos[i].age] ;
|
||||||
|
}
|
||||||
|
if(_infos[i].depth < g.size())
|
||||||
|
{
|
||||||
|
g[_infos[i].depth]++ ;
|
||||||
|
|
||||||
|
if(g[_infos[i].depth] > max_depth)
|
||||||
|
max_depth = g[_infos[i].depth] ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int p=0 ;
|
||||||
|
|
||||||
|
for(it=depths.begin();it!=depths.end();++it,++p)
|
||||||
|
for(int i=0;i<MaxDepth;++i)
|
||||||
|
painter->fillRect(ox+MaxTime*cellx+20+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_depth)) ;
|
||||||
|
|
||||||
|
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
||||||
|
painter->drawRect(ox+MaxTime*cellx+20,oy,MaxDepth*cellx,p*celly) ;
|
||||||
|
|
||||||
|
for(int i=0;i<MaxTime;i+=5)
|
||||||
|
painter->drawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ;
|
||||||
|
|
||||||
|
p=0 ;
|
||||||
|
for(it=hits.begin();it!=hits.end();++it,++p)
|
||||||
|
{
|
||||||
|
int total = 0 ;
|
||||||
|
|
||||||
|
for(int i=0;i<MaxTime;++i)
|
||||||
|
{
|
||||||
|
painter->fillRect(ox+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_hits)) ;
|
||||||
|
total += it->second[i] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
||||||
|
painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx,oy+(p+1)*celly,TurtleRouterStatistics::getPeerName(it->first)) ;
|
||||||
|
painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx+120,oy+(p+1)*celly,"("+QString::number(total)+")") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
painter->drawRect(ox,oy,MaxTime*cellx,p*celly) ;
|
||||||
|
|
||||||
|
for(int i=0;i<MaxTime;i+=5)
|
||||||
|
painter->drawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ;
|
||||||
|
for(int i=0;i<MaxDepth;i++)
|
||||||
|
painter->drawText(ox+MaxTime*cellx+20+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ;
|
||||||
|
|
||||||
|
oy += (p+1)*celly+4 ;
|
||||||
|
|
||||||
|
painter->drawText(ox,oy+celly,QObject::tr("(Age in seconds)"));
|
||||||
|
painter->drawText(ox+MaxTime*cellx+20,oy+celly,QObject::tr("(Depth)"));
|
||||||
|
oy += 3*celly ;
|
||||||
|
|
||||||
|
// now, draw a scale
|
||||||
|
|
||||||
|
for(int i=0;i<=10;++i)
|
||||||
|
{
|
||||||
|
painter->fillRect(ox+i*(cellx+20),oy,cellx,celly,colorScale(i/10.0f)) ;
|
||||||
|
painter->setPen(QColor::fromRgb(0,0,0)) ;
|
||||||
|
painter->drawRect(ox+i*(cellx+20),oy,cellx,celly) ;
|
||||||
|
painter->drawText(ox+i*(cellx+20)+cellx+4,oy+celly,QString::number((int)(max_hits*i/10.0))) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
oy += celly*2 ;
|
||||||
|
|
||||||
|
ox = save_ox ;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const std::vector<TurtleRequestDisplayInfo>& _infos ;
|
||||||
|
};
|
||||||
|
|
||||||
|
TurtleRouterStatistics::TurtleRouterStatistics(QWidget *parent)
|
||||||
|
: RsAutoUpdatePage(2000,parent)
|
||||||
|
{
|
||||||
|
setupUi(this) ;
|
||||||
|
|
||||||
|
m_bProcessSettings = false;
|
||||||
|
|
||||||
|
_tunnel_statistics_F->setWidget( _tst_CW = new TurtleRouterStatisticsWidget() ) ;
|
||||||
|
_tunnel_statistics_F->setWidgetResizable(true);
|
||||||
|
_tunnel_statistics_F->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
_tunnel_statistics_F->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
|
||||||
|
_tunnel_statistics_F->viewport()->setBackgroundRole(QPalette::NoRole);
|
||||||
|
_tunnel_statistics_F->setFrameStyle(QFrame::NoFrame);
|
||||||
|
_tunnel_statistics_F->setFocusPolicy(Qt::NoFocus);
|
||||||
|
|
||||||
|
// load settings
|
||||||
|
processSettings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TurtleRouterStatistics::~TurtleRouterStatistics()
|
||||||
|
{
|
||||||
|
|
||||||
|
// save settings
|
||||||
|
processSettings(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TurtleRouterStatistics::processSettings(bool bLoad)
|
||||||
|
{
|
||||||
|
m_bProcessSettings = true;
|
||||||
|
|
||||||
|
Settings->beginGroup(QString("TurtleRouterStatistics"));
|
||||||
|
|
||||||
|
if (bLoad) {
|
||||||
|
// load settings
|
||||||
|
|
||||||
|
// state of splitter
|
||||||
|
//splitter->restoreState(Settings->value("Splitter").toByteArray());
|
||||||
|
} else {
|
||||||
|
// save settings
|
||||||
|
|
||||||
|
// state of splitter
|
||||||
|
//Settings->setValue("Splitter", splitter->saveState());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings->endGroup();
|
||||||
|
|
||||||
|
m_bProcessSettings = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TurtleRouterStatistics::updateDisplay()
|
||||||
|
{
|
||||||
|
std::vector<std::vector<std::string> > hashes_info ;
|
||||||
|
std::vector<std::vector<std::string> > tunnels_info ;
|
||||||
|
std::vector<TurtleRequestDisplayInfo > search_reqs_info ;
|
||||||
|
std::vector<TurtleRequestDisplayInfo > tunnel_reqs_info ;
|
||||||
|
|
||||||
|
rsTurtle->getInfo(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
||||||
|
|
||||||
|
//updateTunnelRequests(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
||||||
|
_tst_CW->updateTunnelStatistics(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ;
|
||||||
|
_tst_CW->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TurtleRouterStatistics::getPeerName(const std::string& peer_id)
|
||||||
|
{
|
||||||
|
static std::map<std::string, QString> names ;
|
||||||
|
|
||||||
|
std::map<std::string,QString>::const_iterator it = names.find(peer_id) ;
|
||||||
|
|
||||||
|
if( it != names.end())
|
||||||
|
return it->second ;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RsPeerDetails detail ;
|
||||||
|
if(!rsPeers->getPeerDetails(peer_id,detail))
|
||||||
|
return "unknown peer";
|
||||||
|
|
||||||
|
return (names[peer_id] = QString::fromStdString(detail.name)) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TurtleRouterStatisticsWidget::TurtleRouterStatisticsWidget(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
maxWidth = 200 ;
|
||||||
|
maxHeight = 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TurtleRouterStatisticsWidget::updateTunnelStatistics(const std::vector<std::vector<std::string> >& hashes_info,
|
||||||
|
const std::vector<std::vector<std::string> >& tunnels_info,
|
||||||
|
const std::vector<TurtleRequestDisplayInfo >& search_reqs_info,
|
||||||
|
const std::vector<TurtleRequestDisplayInfo >& tunnel_reqs_info)
|
||||||
|
|
||||||
|
{
|
||||||
|
static const int cellx = 6 ;
|
||||||
|
static const int celly = 10+4 ;
|
||||||
|
|
||||||
|
QPixmap tmppixmap(maxWidth, maxHeight);
|
||||||
|
tmppixmap.fill(this, 0, 0);
|
||||||
|
setFixedHeight(maxHeight);
|
||||||
|
|
||||||
|
QPainter painter(&tmppixmap);
|
||||||
|
painter.initFrom(this);
|
||||||
|
|
||||||
|
maxHeight = 500 ;
|
||||||
|
|
||||||
|
// std::cerr << "Drawing into pixmap of size " << maxWidth << "x" << maxHeight << std::endl;
|
||||||
|
// draw...
|
||||||
|
int ox=5,oy=5 ;
|
||||||
|
|
||||||
|
TRHistogram(search_reqs_info).draw(&painter,ox,oy,QObject::tr("Search requests repartition:")) ;
|
||||||
|
|
||||||
|
painter.setPen(QColor::fromRgb(70,70,70)) ;
|
||||||
|
painter.drawLine(0,oy,maxWidth,oy) ;
|
||||||
|
oy += celly ;
|
||||||
|
|
||||||
|
TRHistogram(tunnel_reqs_info).draw(&painter,ox,oy,QObject::tr("Tunnel requests repartition:")) ;
|
||||||
|
|
||||||
|
// now give information about turtle traffic.
|
||||||
|
//
|
||||||
|
TurtleTrafficStatisticsInfo info ;
|
||||||
|
rsTurtle->getTrafficStatistics(info) ;
|
||||||
|
|
||||||
|
painter.setPen(QColor::fromRgb(70,70,70)) ;
|
||||||
|
painter.drawLine(0,oy,maxWidth,oy) ;
|
||||||
|
oy += celly ;
|
||||||
|
|
||||||
|
painter.drawText(ox,oy+celly,tr("Turtle router traffic:")) ; oy += celly*2 ;
|
||||||
|
painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Up")+"\t: " + speedString(info.tr_up_Bps) ) ; oy += celly ;
|
||||||
|
painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Dn")+"\t: " + speedString(info.tr_dn_Bps) ) ; oy += celly ;
|
||||||
|
painter.drawText(ox+2*cellx,oy+celly,tr("Incoming file data")+"\t: " + speedString(info.data_dn_Bps) ) ; oy += celly ;
|
||||||
|
painter.drawText(ox+2*cellx,oy+celly,tr("Outgoing file data")+"\t: " + speedString(info.data_up_Bps) ) ; oy += celly ;
|
||||||
|
painter.drawText(ox+2*cellx,oy+celly,tr("Forwarded data ")+"\t: " + speedString(info.unknown_updn_Bps) ) ; oy += celly ;
|
||||||
|
|
||||||
|
// update the pixmap
|
||||||
|
//
|
||||||
|
pixmap = tmppixmap;
|
||||||
|
maxHeight = oy ;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TurtleRouterStatisticsWidget::speedString(float f)
|
||||||
|
{
|
||||||
|
if(f < 1.0f)
|
||||||
|
return QString("0 B/s") ;
|
||||||
|
if(f < 1024.0f)
|
||||||
|
return QString::number((int)f)+" B/s" ;
|
||||||
|
|
||||||
|
return QString::number(f/1024.0,'f',2) + " KB/s";
|
||||||
|
}
|
||||||
|
|
||||||
|
void TurtleRouterStatisticsWidget::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QStylePainter(this).drawPixmap(0, 0, pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TurtleRouterStatisticsWidget::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
QRect TaskGraphRect = geometry();
|
||||||
|
maxWidth = TaskGraphRect.width();
|
||||||
|
maxHeight = TaskGraphRect.height() ;
|
||||||
|
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
69
retroshare-gui/src/gui/TurtleRouterStatistics.h
Normal file
69
retroshare-gui/src/gui/TurtleRouterStatistics.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/****************************************************************
|
||||||
|
* RetroShare is distributed under the following license:
|
||||||
|
*
|
||||||
|
* Copyright (C) 20011, RetroShare Team
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QPoint>
|
||||||
|
#include <retroshare/rsturtle.h>
|
||||||
|
#include "ui_TurtleRouterStatistics.h"
|
||||||
|
#include "RsAutoUpdatePage.h"
|
||||||
|
|
||||||
|
class TurtleRouterStatisticsWidget ;
|
||||||
|
|
||||||
|
class TurtleRouterStatistics: public RsAutoUpdatePage, public Ui::TurtleRouterStatistics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TurtleRouterStatistics(QWidget *parent = NULL) ;
|
||||||
|
~TurtleRouterStatistics();
|
||||||
|
|
||||||
|
// Cache for peer names.
|
||||||
|
static QString getPeerName(const std::string& peer_id) ;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void processSettings(bool bLoad);
|
||||||
|
bool m_bProcessSettings;
|
||||||
|
|
||||||
|
virtual void updateDisplay() ;
|
||||||
|
|
||||||
|
TurtleRouterStatisticsWidget *_tst_CW ;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
class TurtleRouterStatisticsWidget: public QWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TurtleRouterStatisticsWidget(QWidget *parent = NULL) ;
|
||||||
|
|
||||||
|
virtual void paintEvent(QPaintEvent *event) ;
|
||||||
|
virtual void resizeEvent(QResizeEvent *event);
|
||||||
|
|
||||||
|
void updateTunnelStatistics( const std::vector<std::vector<std::basic_string<char> > >&,
|
||||||
|
const std::vector<std::vector<std::basic_string<char> > >&,
|
||||||
|
const std::vector<TurtleRequestDisplayInfo >&,
|
||||||
|
const std::vector<TurtleRequestDisplayInfo >&) ;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static QString speedString(float f) ;
|
||||||
|
|
||||||
|
QPixmap pixmap ;
|
||||||
|
int maxWidth,maxHeight ;
|
||||||
|
};
|
||||||
|
|
55
retroshare-gui/src/gui/TurtleRouterStatistics.ui
Normal file
55
retroshare-gui/src/gui/TurtleRouterStatistics.ui
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>TurtleRouterStatistics</class>
|
||||||
|
<widget class="QWidget" name="TurtleRouterStatistics">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>611</width>
|
||||||
|
<height>408</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Router Statistics</string>
|
||||||
|
</property>
|
||||||
|
<property name="windowIcon">
|
||||||
|
<iconset resource="images.qrc">
|
||||||
|
<normaloff>:/images/rstray3.png</normaloff>:/images/rstray3.png</iconset>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QSplitter" name="splitter">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<widget class="QScrollArea" name="_tunnel_statistics_F">
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::NoFrame</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>593</width>
|
||||||
|
<height>390</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="images.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue
Block a user