mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-12-15 00:28:58 -05:00
Merge pull request #861 from RetroShare/v0.6-GxsTransport
V0.6 gxs transport
This commit is contained in:
commit
1ebcc6006b
58 changed files with 4372 additions and 1167 deletions
|
|
@ -418,9 +418,11 @@ ChatWidget::ChatType ChatWidget::chatType()
|
|||
|
||||
void ChatWidget::blockSending(QString msg)
|
||||
{
|
||||
sendingBlocked = true;
|
||||
ui->sendButton->setEnabled(false);
|
||||
ui->sendButton->setToolTip(msg);
|
||||
#ifndef RS_ASYNC_CHAT
|
||||
sendingBlocked = true;
|
||||
ui->sendButton->setEnabled(false);
|
||||
#endif
|
||||
ui->sendButton->setToolTip(msg);
|
||||
}
|
||||
|
||||
void ChatWidget::unblockSending()
|
||||
|
|
|
|||
|
|
@ -107,41 +107,52 @@ void PopupDistantChatDialog::updateDisplay()
|
|||
|
||||
QString msg;
|
||||
|
||||
switch(tinfo.status)
|
||||
{
|
||||
case RS_DISTANT_CHAT_STATUS_UNKNOWN: //std::cerr << "Unknown hash. Error!" << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_GRY_LED)) ;
|
||||
msg = tr("Chat remotely closed. Please close this window.");
|
||||
_status_label->setToolTip(msg) ;
|
||||
getChatWidget()->updateStatusString("%1", msg, true);
|
||||
getChatWidget()->blockSending(tr("Can't send message, because there is no tunnel."));
|
||||
setPeerStatus(RS_STATUS_OFFLINE) ;
|
||||
break ;
|
||||
case RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED: std::cerr << "Chat remotely closed. " << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_RED_LED)) ;
|
||||
_status_label->setToolTip(QObject::tr("Distant peer has closed the chat")) ;
|
||||
|
||||
getChatWidget()->updateStatusString("%1", tr("The person you're talking to has deleted the secured chat tunnel. You may remove the chat window now."), true);
|
||||
getChatWidget()->blockSending(tr("Can't send message, because the chat partner deleted the secure tunnel."));
|
||||
setPeerStatus(RS_STATUS_OFFLINE) ;
|
||||
|
||||
break ;
|
||||
case RS_DISTANT_CHAT_STATUS_TUNNEL_DN: //std::cerr << "Tunnel asked. Waiting for reponse. " << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_RED_LED)) ;
|
||||
msg = QObject::tr("Tunnel is pending...");
|
||||
_status_label->setToolTip(msg) ;
|
||||
getChatWidget()->updateStatusString("%1", msg, true);
|
||||
getChatWidget()->blockSending(msg);
|
||||
setPeerStatus(RS_STATUS_OFFLINE) ;
|
||||
break ;
|
||||
case RS_DISTANT_CHAT_STATUS_CAN_TALK: //std::cerr << "Tunnel is ok and data is transmitted." << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_GRN_LED)) ;
|
||||
msg = QObject::tr("Secured tunnel is working. You can talk!");
|
||||
_status_label->setToolTip(msg) ;
|
||||
getChatWidget()->unblockSending();
|
||||
setPeerStatus(RS_STATUS_ONLINE) ;
|
||||
break ;
|
||||
}
|
||||
switch(tinfo.status)
|
||||
{
|
||||
case RS_DISTANT_CHAT_STATUS_UNKNOWN:
|
||||
//std::cerr << "Unknown hash. Error!" << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_GRY_LED));
|
||||
msg = tr("Remote status unknown.");
|
||||
_status_label->setToolTip(msg);
|
||||
getChatWidget()->updateStatusString("%1", msg, true);
|
||||
getChatWidget()->blockSending(tr( "Can't send message immediately, "
|
||||
"because there is no tunnel "
|
||||
"available." ));
|
||||
setPeerStatus(RS_STATUS_OFFLINE);
|
||||
break ;
|
||||
case RS_DISTANT_CHAT_STATUS_REMOTELY_CLOSED:
|
||||
std::cerr << "Chat remotely closed. " << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_RED_LED));
|
||||
_status_label->setToolTip(
|
||||
QObject::tr("Distant peer has closed the chat") );
|
||||
getChatWidget()->updateStatusString(
|
||||
"%1", tr( "The person you are talking to has deleted the"
|
||||
" secured chat tunnel." ), true );
|
||||
getChatWidget()->blockSending(tr( "The chat partner deleted the secure"
|
||||
" tunnel, messages will be delivered"
|
||||
" as soon as possible"));
|
||||
setPeerStatus(RS_STATUS_OFFLINE) ;
|
||||
break ;
|
||||
case RS_DISTANT_CHAT_STATUS_TUNNEL_DN:
|
||||
//std::cerr << "Tunnel asked. Waiting for reponse. " << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_RED_LED));
|
||||
msg = QObject::tr( "Tunnel is pending... Messages will be delivered as"
|
||||
" soon as possible" );
|
||||
_status_label->setToolTip(msg);
|
||||
getChatWidget()->updateStatusString("%1", msg, true);
|
||||
getChatWidget()->blockSending(msg);
|
||||
setPeerStatus(RS_STATUS_OFFLINE);
|
||||
break;
|
||||
case RS_DISTANT_CHAT_STATUS_CAN_TALK:
|
||||
//std::cerr << "Tunnel is ok and data is transmitted." << std::endl;
|
||||
_status_label->setIcon(QIcon(IMAGE_GRN_LED));
|
||||
msg = QObject::tr( "Secured tunnel is working. "
|
||||
"Messages are delivered immediately!" );
|
||||
_status_label->setToolTip(msg);
|
||||
getChatWidget()->unblockSending();
|
||||
setPeerStatus(RS_STATUS_ONLINE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PopupDistantChatDialog::closeEvent(QCloseEvent *e)
|
||||
|
|
|
|||
|
|
@ -13,6 +13,12 @@
|
|||
<file>icons/anonymous_blue_128.png</file>
|
||||
<file>icons/anonymous_green_128.png</file>
|
||||
<file>icons/aol.png</file>
|
||||
<file>icons/transport128.png</file>
|
||||
<file>icons/bandwidth128.png</file>
|
||||
<file>icons/RTT128.png</file>
|
||||
<file>icons/DHT128.png</file>
|
||||
<file>icons/turtle128.png</file>
|
||||
<file>icons/GRouter128.png</file>
|
||||
<file>icons/avatar_128.png</file>
|
||||
<file>icons/avatar_grey_128.png</file>
|
||||
<file>icons/biohazard_red.png</file>
|
||||
|
|
|
|||
BIN
retroshare-gui/src/gui/icons/DHT128.png
Normal file
BIN
retroshare-gui/src/gui/icons/DHT128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.4 KiB |
BIN
retroshare-gui/src/gui/icons/GRouter128.png
Normal file
BIN
retroshare-gui/src/gui/icons/GRouter128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.3 KiB |
BIN
retroshare-gui/src/gui/icons/RTT128.png
Normal file
BIN
retroshare-gui/src/gui/icons/RTT128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.6 KiB |
BIN
retroshare-gui/src/gui/icons/bandwidth128.png
Normal file
BIN
retroshare-gui/src/gui/icons/bandwidth128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.7 KiB |
BIN
retroshare-gui/src/gui/icons/transport128.png
Normal file
BIN
retroshare-gui/src/gui/icons/transport128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
BIN
retroshare-gui/src/gui/icons/turtle128.png
Normal file
BIN
retroshare-gui/src/gui/icons/turtle128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.5 KiB |
443
retroshare-gui/src/gui/statistics/GxsTransportStatistics.cpp
Normal file
443
retroshare-gui/src/gui/statistics/GxsTransportStatistics.cpp
Normal file
|
|
@ -0,0 +1,443 @@
|
|||
/****************************************************************
|
||||
* 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 <QFontMetrics>
|
||||
#include <QWheelEvent>
|
||||
#include <QDateTime>
|
||||
#include <time.h>
|
||||
|
||||
#include <QMenu>
|
||||
#include <QPainter>
|
||||
#include <QStylePainter>
|
||||
#include <QLayout>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include <retroshare/rsgxstrans.h>
|
||||
#include <retroshare/rspeers.h>
|
||||
#include <retroshare/rsidentity.h>
|
||||
#include <retroshare/rsgxstrans.h>
|
||||
|
||||
#include "GxsTransportStatistics.h"
|
||||
|
||||
#include "gui/Identity/IdDetailsDialog.h"
|
||||
#include "gui/settings/rsharesettings.h"
|
||||
#include "util/QtVersion.h"
|
||||
#include "gui/common/UIStateHelper.h"
|
||||
#include "util/misc.h"
|
||||
#include "gui/gxs/GxsIdLabel.h"
|
||||
|
||||
#define COL_PENDING_ID 0
|
||||
#define COL_PENDING_DESTINATION 1
|
||||
#define COL_PENDING_DATASTATUS 2
|
||||
#define COL_PENDING_DATASIZE 3
|
||||
#define COL_PENDING_DATAHASH 4
|
||||
#define COL_PENDING_SEND 5
|
||||
#define COL_PENDING_GROUP_ID 6
|
||||
|
||||
#define COL_GROUP_GRP_ID 0
|
||||
#define COL_GROUP_NUM_MSGS 1
|
||||
#define COL_GROUP_SIZE_MSGS 2
|
||||
#define COL_GROUP_SUBSCRIBED 3
|
||||
#define COL_GROUP_POPULARITY 4
|
||||
|
||||
static const int PARTIAL_VIEW_SIZE = 9 ;
|
||||
static const int MAX_TUNNEL_REQUESTS_DISPLAY = 10 ;
|
||||
static const int GXSTRANS_STATISTICS_DELAY_BETWEEN_GROUP_REQ = 30 ; // never request more than every 30 secs.
|
||||
|
||||
#define GXSTRANS_GROUP_META 0x01
|
||||
#define GXSTRANS_GROUP_DATA 0x02
|
||||
#define GXSTRANS_GROUP_STAT 0x03
|
||||
#define GXSTRANS_MSG_META 0x04
|
||||
|
||||
#define DEBUG_GXSTRANS_STATS 1
|
||||
|
||||
GxsTransportStatistics::GxsTransportStatistics(QWidget *parent)
|
||||
: RsAutoUpdatePage(2000,parent)
|
||||
{
|
||||
setupUi(this) ;
|
||||
|
||||
mStateHelper = new UIStateHelper(this);
|
||||
mStateHelper->addWidget(GXSTRANS_GROUP_META, treeWidget);
|
||||
|
||||
mTransQueue = new TokenQueue(rsGxsTrans->getTokenService(), this);
|
||||
|
||||
m_bProcessSettings = false;
|
||||
mLastGroupReqTS = 0 ;
|
||||
|
||||
/* Set header resize modes and initial section sizes Uploads TreeView*/
|
||||
QHeaderView_setSectionResizeMode(treeWidget->header(), QHeaderView::ResizeToContents);
|
||||
|
||||
connect(treeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(CustomPopupMenu(QPoint)));
|
||||
|
||||
|
||||
// load settings
|
||||
processSettings(true);
|
||||
}
|
||||
|
||||
GxsTransportStatistics::~GxsTransportStatistics()
|
||||
{
|
||||
|
||||
// save settings
|
||||
processSettings(false);
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::processSettings(bool bLoad)
|
||||
{
|
||||
m_bProcessSettings = true;
|
||||
|
||||
Settings->beginGroup(QString("GxsTransportStatistics"));
|
||||
|
||||
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 GxsTransportStatistics::CustomPopupMenu( QPoint )
|
||||
{
|
||||
QMenu contextMnu( this );
|
||||
|
||||
QTreeWidgetItem *item = treeWidget->currentItem();
|
||||
if (item) {
|
||||
contextMnu.addAction(QIcon(":/images/info16.png"), tr("Details"), this, SLOT(personDetails()));
|
||||
|
||||
}
|
||||
|
||||
contextMnu.exec(QCursor::pos());
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::updateDisplay()
|
||||
{
|
||||
time_t now = time(NULL) ;
|
||||
|
||||
if(mLastGroupReqTS + GXSTRANS_STATISTICS_DELAY_BETWEEN_GROUP_REQ < now)
|
||||
{
|
||||
requestGroupMeta();
|
||||
mLastGroupReqTS = now ;
|
||||
}
|
||||
|
||||
//_tst_CW->updateContent() ;
|
||||
|
||||
updateContent();
|
||||
}
|
||||
|
||||
QString GxsTransportStatistics::getPeerName(const RsPeerId &peer_id)
|
||||
{
|
||||
static std::map<RsPeerId, QString> names ;
|
||||
|
||||
std::map<RsPeerId,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 tr("Unknown Peer");
|
||||
|
||||
return (names[peer_id] = QString::fromUtf8(detail.name.c_str())) ;
|
||||
}
|
||||
}
|
||||
|
||||
static QString getStatusString(GxsTransSendStatus status)
|
||||
{
|
||||
switch(status)
|
||||
{
|
||||
case GxsTransSendStatus::PENDING_PROCESSING : return QObject::tr("Processing") ;
|
||||
case GxsTransSendStatus::PENDING_PREFERRED_GROUP : return QObject::tr("Choosing group") ;
|
||||
case GxsTransSendStatus::PENDING_RECEIPT_CREATE : return QObject::tr("Creating receipt") ;
|
||||
case GxsTransSendStatus::PENDING_RECEIPT_SIGNATURE : return QObject::tr("Signing receipt") ;
|
||||
case GxsTransSendStatus::PENDING_SERIALIZATION : return QObject::tr("Serializing") ;
|
||||
case GxsTransSendStatus::PENDING_PAYLOAD_CREATE : return QObject::tr("Creating payload") ;
|
||||
case GxsTransSendStatus::PENDING_PAYLOAD_ENCRYPT : return QObject::tr("Encrypting payload") ;
|
||||
case GxsTransSendStatus::PENDING_PUBLISH : return QObject::tr("Publishing") ;
|
||||
case GxsTransSendStatus::PENDING_RECEIPT_RECEIVE : return QObject::tr("Waiting for receipt") ;
|
||||
case GxsTransSendStatus::RECEIPT_RECEIVED : return QObject::tr("Receipt received") ;
|
||||
case GxsTransSendStatus::FAILED_RECEIPT_SIGNATURE : return QObject::tr("Receipt signature failed") ;
|
||||
case GxsTransSendStatus::FAILED_ENCRYPTION : return QObject::tr("Encryption failed") ;
|
||||
case GxsTransSendStatus::UNKNOWN :
|
||||
default : return QObject::tr("Unknown") ;
|
||||
}
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::updateContent()
|
||||
{
|
||||
RsGxsTrans::GxsTransStatistics transinfo ;
|
||||
|
||||
rsGxsTrans->getStatistics(transinfo) ;
|
||||
|
||||
|
||||
// clear
|
||||
|
||||
treeWidget->clear();
|
||||
time_t now = time(NULL) ;
|
||||
|
||||
// 1 - fill the table for pending packets
|
||||
|
||||
groupBox->setTitle(tr("Pending data items")+": " + QString::number(transinfo.outgoing_records.size()) );
|
||||
|
||||
for(uint32_t i=0;i<transinfo.outgoing_records.size();++i)
|
||||
{
|
||||
const RsGxsTransOutgoingRecord& rec(transinfo.outgoing_records[i]) ;
|
||||
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
||||
treeWidget->addTopLevelItem(item);
|
||||
|
||||
RsIdentityDetails details ;
|
||||
rsIdentity->getIdDetails(rec.recipient,details);
|
||||
QString nickname = QString::fromUtf8(details.mNickname.c_str());
|
||||
|
||||
if(nickname.isEmpty())
|
||||
nickname = tr("Unknown");
|
||||
|
||||
item -> setData(COL_PENDING_ID, Qt::DisplayRole, QString::number(rec.trans_id,16).rightJustified(8,'0'));
|
||||
item -> setData(COL_PENDING_DATASTATUS, Qt::DisplayRole, getStatusString(rec.status));
|
||||
item -> setData(COL_PENDING_DATASIZE, Qt::DisplayRole, misc::friendlyUnit(rec.data_size));
|
||||
item -> setData(COL_PENDING_DATAHASH, Qt::DisplayRole, QString::fromStdString(rec.data_hash.toStdString()));
|
||||
item -> setData(COL_PENDING_SEND, Qt::DisplayRole, QDateTime::fromTime_t(rec.send_TS).toString());
|
||||
item -> setData(COL_PENDING_GROUP_ID, Qt::DisplayRole, QString::fromStdString(rec.group_id.toStdString()));
|
||||
|
||||
GxsIdLabel *label = new GxsIdLabel() ;
|
||||
label->setId(rec.recipient) ;
|
||||
|
||||
treeWidget -> setItemWidget(item,COL_PENDING_DESTINATION, label) ;
|
||||
}
|
||||
|
||||
// 2 - fill the table for pending group data
|
||||
|
||||
// record openned groups
|
||||
|
||||
std::set<RsGxsGroupId> openned_groups ;
|
||||
|
||||
for(uint32_t i=0;i<groupTreeWidget->topLevelItemCount();++i)
|
||||
if(groupTreeWidget->isItemExpanded(groupTreeWidget->topLevelItem(i)))
|
||||
openned_groups.insert(RsGxsGroupId(groupTreeWidget->topLevelItem(i)->data(COL_GROUP_GRP_ID,Qt::DisplayRole).toString().toStdString())) ;
|
||||
|
||||
groupTreeWidget->clear();
|
||||
|
||||
for(std::map<RsGxsGroupId,RsGxsTransGroupStatistics>::const_iterator it(mGroupStats.begin());it!=mGroupStats.end();++it)
|
||||
{
|
||||
const RsGxsTransGroupStatistics& stat(it->second) ;
|
||||
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
||||
groupTreeWidget->addTopLevelItem(item);
|
||||
groupTreeWidget->setItemExpanded(item,openned_groups.find(it->first) != openned_groups.end());
|
||||
|
||||
item->setData(COL_GROUP_GRP_ID, Qt::DisplayRole, QString::fromStdString(stat.mGrpId.toStdString())) ;
|
||||
item->setData(COL_GROUP_NUM_MSGS, Qt::DisplayRole, QString::number(stat.mNumMsgs)) ;
|
||||
item->setData(COL_GROUP_SIZE_MSGS, Qt::DisplayRole, QString::number(stat.mTotalSizeOfMsgs)) ;
|
||||
item->setData(COL_GROUP_SUBSCRIBED,Qt::DisplayRole, stat.subscribed?tr("Yes"):tr("No")) ;
|
||||
item->setData(COL_GROUP_POPULARITY,Qt::DisplayRole, QString::number(stat.popularity)) ;
|
||||
|
||||
for(uint32_t i=0;i<it->second.messages_metas.size();++i)
|
||||
{
|
||||
QTreeWidgetItem *sitem = new QTreeWidgetItem(item) ;
|
||||
|
||||
const RsMsgMetaData& meta(it->second.messages_metas[i]) ;
|
||||
|
||||
GxsIdLabel *label = new GxsIdLabel();
|
||||
label->setId(meta.mAuthorId) ;
|
||||
groupTreeWidget->setItemWidget(sitem,COL_GROUP_GRP_ID,label) ;
|
||||
|
||||
sitem->setData(COL_GROUP_NUM_MSGS,Qt::DisplayRole, QDateTime::fromTime_t(meta.mPublishTs).toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::personDetails()
|
||||
{
|
||||
QTreeWidgetItem *item = treeWidget->currentItem();
|
||||
std::string id = item->text(COL_PENDING_DESTINATION).toStdString();
|
||||
|
||||
if (id.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
IdDetailsDialog *dialog = new IdDetailsDialog(RsGxsGroupId(id));
|
||||
dialog->show();
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::loadRequest(const TokenQueue *queue, const TokenRequest &req)
|
||||
{
|
||||
#ifdef DEBUG_GXSTRANS_STATS
|
||||
std::cerr << "GxsTransportStatistics::loadRequest() UserType: " << req.mUserType << std::endl;
|
||||
#endif
|
||||
|
||||
if (queue != mTransQueue)
|
||||
{
|
||||
std::cerr << "Wrong queue!" << std::endl;
|
||||
return ;
|
||||
}
|
||||
|
||||
/* now switch on req */
|
||||
switch(req.mUserType)
|
||||
{
|
||||
case GXSTRANS_GROUP_META: loadGroupMeta(req.mToken);
|
||||
break;
|
||||
|
||||
case GXSTRANS_GROUP_STAT: loadGroupStat(req.mToken);
|
||||
break;
|
||||
|
||||
case GXSTRANS_MSG_META: loadMsgMeta(req.mToken);
|
||||
break;
|
||||
|
||||
default:
|
||||
std::cerr << "GxsTransportStatistics::loadRequest() ERROR: INVALID TYPE";
|
||||
std::cerr << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::requestGroupMeta()
|
||||
{
|
||||
mStateHelper->setLoading(GXSTRANS_GROUP_META, true);
|
||||
|
||||
#ifdef DEBUG_GXSTRANS_STATS
|
||||
std::cerr << "GxsTransportStatisticsWidget::requestGroupMeta()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mTransQueue->cancelActiveRequestTokens(GXSTRANS_GROUP_META);
|
||||
|
||||
RsTokReqOptions opts;
|
||||
opts.mReqType = GXS_REQUEST_TYPE_GROUP_META;
|
||||
|
||||
uint32_t token;
|
||||
mTransQueue->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_SUMMARY, opts, GXSTRANS_GROUP_META);
|
||||
}
|
||||
void GxsTransportStatistics::requestGroupStat(const RsGxsGroupId &groupId)
|
||||
{
|
||||
mTransQueue->cancelActiveRequestTokens(GXSTRANS_GROUP_STAT);
|
||||
uint32_t token;
|
||||
rsGxsTrans->getTokenService()->requestGroupStatistic(token, groupId);
|
||||
mTransQueue->queueRequest(token, 0, RS_TOKREQ_ANSTYPE_ACK, GXSTRANS_GROUP_STAT);
|
||||
}
|
||||
void GxsTransportStatistics::requestMsgMeta(const RsGxsGroupId& grpId)
|
||||
{
|
||||
mStateHelper->setLoading(GXSTRANS_MSG_META, true);
|
||||
|
||||
#ifdef DEBUG_GXSTRANS_STATS
|
||||
std::cerr << "GxsTransportStatisticsWidget::requestGroupMeta()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
mTransQueue->cancelActiveRequestTokens(GXSTRANS_MSG_META);
|
||||
|
||||
RsTokReqOptions opts;
|
||||
opts.mReqType = GXS_REQUEST_TYPE_MSG_META;
|
||||
|
||||
std::list<RsGxsGroupId> grouplist ;
|
||||
grouplist.push_back(grpId) ;
|
||||
|
||||
uint32_t token;
|
||||
rsGxsTrans->getTokenService()->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_SUMMARY, opts, grouplist);
|
||||
mTransQueue->queueRequest(token, 0, RS_TOKREQ_ANSTYPE_ACK, GXSTRANS_MSG_META);
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::loadGroupStat(const uint32_t &token)
|
||||
{
|
||||
#ifdef DEBUG_GXSTRANS_STATS
|
||||
std::cerr << "GxsTransportStatistics::loadGroupStat." << std::endl;
|
||||
#endif
|
||||
GxsGroupStatistic stats;
|
||||
rsGxsTrans->getGroupStatistic(token, stats);
|
||||
|
||||
dynamic_cast<GxsGroupStatistic&>(mGroupStats[stats.mGrpId]) = stats ;
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::loadGroupMeta(const uint32_t& token)
|
||||
{
|
||||
mStateHelper->setLoading(GXSTRANS_GROUP_META, false);
|
||||
|
||||
#ifdef DEBUG_GXSTRANS_STATS
|
||||
std::cerr << "GxsTransportStatisticsWidget::loadGroupMeta()";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
std::list<RsGroupMetaData> groupInfo;
|
||||
std::list<RsGroupMetaData>::iterator vit;
|
||||
|
||||
if (!rsGxsTrans->getGroupSummary(token,groupInfo))
|
||||
{
|
||||
std::cerr << "GxsTransportStatistics::loadGroupMeta() Error getting GroupMeta";
|
||||
std::cerr << std::endl;
|
||||
mStateHelper->setActive(GXSTRANS_GROUP_META, false);
|
||||
return;
|
||||
}
|
||||
|
||||
mStateHelper->setActive(GXSTRANS_GROUP_META, true);
|
||||
|
||||
std::set<RsGxsGroupId> existing_groups ;
|
||||
|
||||
for(vit = groupInfo.begin(); vit != groupInfo.end(); ++vit)
|
||||
{
|
||||
existing_groups.insert(vit->mGroupId) ;
|
||||
|
||||
/* Add Widget, and request Pages */
|
||||
#ifdef DEBUG_GXSTRANS_STATS
|
||||
std::cerr << "GxsTransportStatisticsWidget::loadGroupMeta() GroupId: " << vit->mGroupId << " Group: " << vit->mGroupName << std::endl;
|
||||
#endif
|
||||
|
||||
requestGroupStat(vit->mGroupId) ;
|
||||
requestMsgMeta(vit->mGroupId) ;
|
||||
|
||||
RsGxsTransGroupStatistics& s(mGroupStats[vit->mGroupId]);
|
||||
s.popularity = vit->mPop ;
|
||||
s.subscribed = IS_GROUP_SUBSCRIBED(vit->mSubscribeFlags) ;
|
||||
}
|
||||
|
||||
// remove group stats for group that do not exist anymore
|
||||
|
||||
for(std::map<RsGxsGroupId,RsGxsTransGroupStatistics>::iterator it(mGroupStats.begin());it!=mGroupStats.end();)
|
||||
if(existing_groups.find(it->first) == existing_groups.end())
|
||||
it = mGroupStats.erase(it);
|
||||
else
|
||||
++it;
|
||||
}
|
||||
|
||||
void GxsTransportStatistics::loadMsgMeta(const uint32_t& token)
|
||||
{
|
||||
mStateHelper->setLoading(GXSTRANS_MSG_META, false);
|
||||
|
||||
GxsMsgMetaMap m ;
|
||||
|
||||
if (!rsGxsTrans->getMsgSummary(token,m))
|
||||
return ;
|
||||
|
||||
for(GxsMsgMetaMap::const_iterator it(m.begin());it!=m.end();++it)
|
||||
mGroupStats[it->first].messages_metas = it->second ;
|
||||
}
|
||||
|
||||
90
retroshare-gui/src/gui/statistics/GxsTransportStatistics.h
Normal file
90
retroshare-gui/src/gui/statistics/GxsTransportStatistics.h
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
/****************************************************************
|
||||
* 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 <map>
|
||||
|
||||
#include <QPoint>
|
||||
#include <retroshare/rsgrouter.h>
|
||||
#include <retroshare/rstypes.h>
|
||||
|
||||
#include "util/TokenQueue.h"
|
||||
#include "RsAutoUpdatePage.h"
|
||||
#include "ui_GxsTransportStatistics.h"
|
||||
|
||||
class GxsTransportStatisticsWidget ;
|
||||
class UIStateHelper;
|
||||
|
||||
class RsGxsTransGroupStatistics: public GxsGroupStatistic
|
||||
{
|
||||
public:
|
||||
RsGxsTransGroupStatistics() {}
|
||||
|
||||
bool subscribed ;
|
||||
int popularity ;
|
||||
|
||||
std::vector<RsMsgMetaData> messages_metas ;
|
||||
};
|
||||
|
||||
class GxsTransportStatistics: public RsAutoUpdatePage, public TokenResponse, public Ui::GxsTransportStatistics
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
GxsTransportStatistics(QWidget *parent = NULL) ;
|
||||
~GxsTransportStatistics();
|
||||
|
||||
// Cache for peer names.
|
||||
static QString getPeerName(const RsPeerId& peer_id) ;
|
||||
|
||||
virtual void loadRequest(const TokenQueue *queue, const TokenRequest &req) ;
|
||||
|
||||
void updateContent() ;
|
||||
|
||||
private slots:
|
||||
/** Create the context popup menu and it's submenus */
|
||||
void CustomPopupMenu( QPoint point );
|
||||
void personDetails();
|
||||
|
||||
private:
|
||||
void loadGroupMeta(const uint32_t& token);
|
||||
void loadGroupStat(const uint32_t& token);
|
||||
void loadMsgMeta(const uint32_t& token);
|
||||
|
||||
void requestGroupMeta();
|
||||
void requestMsgMeta(const RsGxsGroupId& groupId);
|
||||
void requestGroupStat(const RsGxsGroupId &groupId);
|
||||
|
||||
void processSettings(bool bLoad);
|
||||
bool m_bProcessSettings;
|
||||
|
||||
virtual void updateDisplay() ;
|
||||
|
||||
GxsTransportStatisticsWidget *_tst_CW ;
|
||||
TokenQueue *mTransQueue ;
|
||||
UIStateHelper *mStateHelper;
|
||||
uint32_t mLastGroupReqTS ;
|
||||
|
||||
// temporary storage of retrieved data, for display (useful because this is obtained from the async token system)
|
||||
|
||||
std::map<RsGxsGroupId,RsGxsTransGroupStatistics> mGroupStats ; // stores the list of active groups and statistics about each of them.
|
||||
} ;
|
||||
121
retroshare-gui/src/gui/statistics/GxsTransportStatistics.ui
Normal file
121
retroshare-gui/src/gui/statistics/GxsTransportStatistics.ui
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>GxsTransportStatistics</class>
|
||||
<widget class="QWidget" name="GxsTransportStatistics">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1468</width>
|
||||
<height>659</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Router Statistics</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Gxs Transport Groups:</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<widget class="QTreeWidget" name="groupTreeWidget">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Group ID / Author</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Number of messages / Publish TS</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Total size of messages</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Subscribed</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Popularity</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>GroupBox</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QTreeWidget" name="treeWidget">
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::CustomContextMenu</enum>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="headerShowSortIndicator" stdset="0">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>ID</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Destination</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Data status</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Data size</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Data hash</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Sending time (secs ago)</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Group ID</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
@ -34,8 +34,11 @@
|
|||
#include "retroshare/rspeers.h"
|
||||
#include <retroshare/rsplugin.h>
|
||||
|
||||
#include <gui/settings/rsharesettings.h>
|
||||
|
||||
#include <gui/statistics/TurtleRouterStatistics.h>
|
||||
#include <gui/statistics/GlobalRouterStatistics.h>
|
||||
#include <gui/statistics/GxsTransportStatistics.h>
|
||||
#include <gui/statistics/BwCtrlWindow.h>
|
||||
#include <gui/statistics/DhtWindow.h>
|
||||
|
||||
|
|
@ -48,12 +51,14 @@
|
|||
#include "gui/statistics/RttStatistics.h"
|
||||
#endif
|
||||
|
||||
#define IMAGE_DHT ":/images/dht32.png"
|
||||
#define IMAGE_TURTLE ":images/turtle.png"
|
||||
#define IMAGE_BWGRAPH ":/images/ksysguard.png"
|
||||
#define IMAGE_GLOBALROUTER ":/images/network32.png"
|
||||
#define IMAGE_BANDWIDTH ":images/office-chart-area-stacked.png"
|
||||
#define IMAGE_RTT ":images/office-chart-line.png"
|
||||
#define IMAGE_DHT ":/icons/DHT128.png"
|
||||
#define IMAGE_TURTLE ":/icons/turtle128.png"
|
||||
#define IMAGE_BWGRAPH ":/icons/bandwidth128.png"
|
||||
#define IMAGE_GLOBALROUTER ":/icons/GRouter128.png"
|
||||
#define IMAGE_GXSTRANSPORT ":/icons/transport128.png"
|
||||
#define IMAGE_RTT ":/icons/RTT128.png"
|
||||
|
||||
//#define IMAGE_BANDWIDTH ":images/office-chart-area-stacked.png"
|
||||
|
||||
/********************************************** STATIC WINDOW *************************************/
|
||||
StatisticsWindow * StatisticsWindow::mInstance = NULL;
|
||||
|
|
@ -94,6 +99,9 @@ StatisticsWindow::StatisticsWindow(QWidget *parent) :
|
|||
connect(ui->stackPages, SIGNAL(currentChanged(int)), this, SLOT(setNewPage(int)));
|
||||
ui->stackPages->setCurrentIndex(0);
|
||||
|
||||
int toolSize = Settings->getToolButtonSize();
|
||||
ui->toolBar->setToolButtonStyle(Settings->getToolButtonStyle());
|
||||
ui->toolBar->setIconSize(QSize(toolSize,toolSize));
|
||||
}
|
||||
|
||||
StatisticsWindow::~StatisticsWindow()
|
||||
|
|
@ -125,7 +133,7 @@ void StatisticsWindow::initStackedPage()
|
|||
QAction *action;
|
||||
|
||||
ui->stackPages->add(bwdlg = new BwCtrlWindow(ui->stackPages),
|
||||
action = createPageAction(QIcon(IMAGE_BANDWIDTH), tr("Bandwidth"), grp));
|
||||
action = createPageAction(QIcon(IMAGE_BWGRAPH), tr("Bandwidth"), grp));
|
||||
|
||||
ui->stackPages->add(trsdlg = new TurtleRouterStatistics(ui->stackPages),
|
||||
action = createPageAction(QIcon(IMAGE_TURTLE), tr("Turtle Router"), grp));
|
||||
|
|
@ -133,6 +141,9 @@ void StatisticsWindow::initStackedPage()
|
|||
ui->stackPages->add(grsdlg = new GlobalRouterStatistics(ui->stackPages),
|
||||
action = createPageAction(QIcon(IMAGE_GLOBALROUTER), tr("Global Router"), grp));
|
||||
|
||||
ui->stackPages->add(gxsdlg = new GxsTransportStatistics(ui->stackPages),
|
||||
action = createPageAction(QIcon(IMAGE_GXSTRANSPORT), tr("Gxs Transport"), grp));
|
||||
|
||||
ui->stackPages->add(rttdlg = new RttStatistics(ui->stackPages),
|
||||
action = createPageAction(QIcon(IMAGE_RTT), tr("RTT Statistics"), grp));
|
||||
|
||||
|
|
@ -179,7 +190,7 @@ QAction *StatisticsWindow::createPageAction(const QIcon &icon, const QString &te
|
|||
font = action->font();
|
||||
font.setPointSize(9);
|
||||
action->setCheckable(true);
|
||||
action->setFont(font);
|
||||
// action->setFont(font);
|
||||
return action;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ class DhtWindow;
|
|||
class BwCtrlWindow;
|
||||
class TurtleRouterStatistics;
|
||||
class GlobalRouterStatistics;
|
||||
class GxsTransportStatistics;
|
||||
class RttStatistics;
|
||||
|
||||
class StatisticsWindow : public QMainWindow {
|
||||
|
|
@ -53,6 +54,7 @@ public:
|
|||
|
||||
DhtWindow *dhtw;
|
||||
GlobalRouterStatistics *grsdlg;
|
||||
GxsTransportStatistics *gxsdlg;
|
||||
BwCtrlWindow *bwdlg;
|
||||
TurtleRouterStatistics *trsdlg;
|
||||
RttStatistics *rttdlg;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue