#include #include #include #include #include #include "TurtleRouterDialog.h" #include #include #include "gui/settings/rsharesettings.h" static const uint MAX_TUNNEL_REQUESTS_DISPLAY = 10 ; TurtleRouterDialog::TurtleRouterDialog(QWidget *parent) : RsAutoUpdatePage(2000,parent) { setupUi(this) ; m_bProcessSettings = false; // Init the basic setup. // QStringList stl ; int n=0 ; stl.clear() ; stl.push_back(tr("Search requests")) ; top_level_s_requests = new QTreeWidgetItem(_f2f_TW,stl) ; _f2f_TW->insertTopLevelItem(n++,top_level_s_requests) ; stl.clear() ; stl.push_back(tr("Tunnel requests")) ; top_level_t_requests = new QTreeWidgetItem(_f2f_TW,stl) ; _f2f_TW->insertTopLevelItem(n++,top_level_t_requests) ; top_level_hashes.clear() ; // load settings processSettings(true); } TurtleRouterDialog::~TurtleRouterDialog() { // save settings processSettings(false); } void TurtleRouterDialog::processSettings(bool bLoad) { m_bProcessSettings = true; Settings->beginGroup(QString("TurtleRouterDialog")); 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 TurtleRouterDialog::updateDisplay() { std::vector > hashes_info ; std::vector > tunnels_info ; std::vector search_reqs_info ; std::vector 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) ; } QString TurtleRouterDialog::getPeerName(const std::string& peer_id) { static std::map names ; std::map::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::fromUtf8(detail.name.c_str())) ; } } void TurtleRouterDialog::updateTunnelRequests( const std::vector >& hashes_info, const std::vector >& tunnels_info, const std::vector& search_reqs_info, const std::vector& tunnel_reqs_info) { // now display this in the QTableWidgets QStringList stl ; // remove all children of top level objects for(int i=0;i<_f2f_TW->topLevelItemCount();++i) { QTreeWidgetItem *taken ; while( (taken = _f2f_TW->topLevelItem(i)->takeChild(0)) != NULL) delete taken ; } for(uint i=0;itext(0).left(14) == QString("Unknown hashes")) unknown_hash_found = true ; QString str = "Tunnel id: " + QString::fromUtf8(tunnels_info[i][0].c_str()) + "\t [" + QString::fromUtf8(tunnels_info[i][2].c_str()) + "] --> [" + QString::fromUtf8(tunnels_info[i][1].c_str()) + "]\t\t last transfer: " + QString::fromStdString(tunnels_info[i][4]) + "\t Speed: " + QString::fromStdString(tunnels_info[i][5]) ; stl.clear() ; stl.push_back(str) ; parent->addChild(new QTreeWidgetItem(stl)) ; } for(uint i=0;iaddChild(new QTreeWidgetItem(stl)) ; } top_level_s_requests->setText(0, tr("Search requests") + "(" + QString::number(search_reqs_info.size()) + ")" ) ; for(uint i=0;i= tunnel_reqs_info.size() || i < MAX_TUNNEL_REQUESTS_DISPLAY) { QString str = "Request id: " + QString::number(tunnel_reqs_info[i].request_id,16) + "\t from [" + getPeerName(tunnel_reqs_info[i].source_peer_id) + "]\t " + QString::number(tunnel_reqs_info[i].age)+" secs ago" ; stl.clear() ; stl.push_back(str) ; top_level_t_requests->addChild(new QTreeWidgetItem(stl)) ; } else if(i == MAX_TUNNEL_REQUESTS_DISPLAY) { stl.clear() ; stl.push_back(QString("...")) ; top_level_t_requests->addChild(new QTreeWidgetItem(stl)) ; } top_level_t_requests->setText(0, tr("Tunnel requests") + "("+QString::number(tunnel_reqs_info.size()) + ")") ; QTreeWidgetItem *unknown_hashs_item = findParentHashItem("") ; unknown_hashs_item->setText(0,QString("Unknown hashes (") + QString::number(unknown_hashs_item->childCount())+QString(")")) ; // Ok, this is a N2 search, but there are very few elements in the list. for(int i=2;i<_f2f_TW->topLevelItemCount();) { bool found = false ; if(_f2f_TW->topLevelItem(i)->text(0).left(14) == "Unknown hashes" && unknown_hash_found) found = true ; if(_f2f_TW->topLevelItem(i)->childCount() > 0) // this saves uploading hashes found = true ; for(uint j=0;jtopLevelItem(i)->text(0).toStdString() == hashes_info[j][0]) found=true ; if(!found) delete _f2f_TW->takeTopLevelItem(i) ; else ++i ; } } QTreeWidgetItem *TurtleRouterDialog::findParentHashItem(const std::string& hash) { // look for the hash, and insert a new element if necessary. // QList items = _f2f_TW->findItems((hash=="")?QString("Unknown hashes"):QString::fromStdString(hash),Qt::MatchStartsWith) ; if(items.empty()) { QStringList stl ; stl.push_back((hash=="")?QString("Unknown hashes"):QString::fromStdString(hash)) ; QTreeWidgetItem *item = new QTreeWidgetItem(_f2f_TW,stl) ; _f2f_TW->insertTopLevelItem(0,item) ; return item ; } else return items.front() ; }