Added small Qt GUI program to test out network connectivity.

This is just the initial check-in much to still do.



git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-peernet@4252 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2011-06-11 12:45:20 +00:00
parent 590ef5bd09
commit e2a18750c1
9 changed files with 1681 additions and 0 deletions

9
PeerNetQt/src/Notes.txt Normal file
View File

@ -0,0 +1,9 @@
PeerNetQt.
requires:
1) libbitdht.
2) tou.
3) udp stack.
4) forwarding.

View File

@ -0,0 +1,72 @@
#-------------------------------------------------
#
# Project created by QtCreator 2011-06-06T19:21:58
#
#-------------------------------------------------
TARGET = PeerNetQt
TEMPLATE = app
RCC_DIR = temp/qrc
UI_DIR = temp/ui
MOC_DIR = temp/moc
CONFIG += bitdht librs
#CONFIG += qt gui uic qrc resources uitools idle bitdht # framecatcher# blogs
#QT += network xml script
SOURCES += main.cpp\
mainwindow.cpp \
peernet.cc
HEADERS += mainwindow.h \
peernet.h
FORMS += mainwindow.ui
librs {
LIBRS_DIR = ../../libretroshare/src/
INCLUDEPATH += $${LIBRS_DIR}
}
bitdht {
BITDHT_DIR = ../../libbitdht/src
INCLUDEPATH += . $${BITDHT_DIR}
# The next line if for compliance with debian packages. Keep it!
INCLUDEPATH += ../libbitdht
DEFINES *= RS_USE_BITDHT
LIBS += ../../libbitdht/src/lib/libbitdht.a
PRE_TARGETDEPS *= ../../libbitdht/src/lib/libbitdht.a
}
macx {
# ENABLE THIS OPTION FOR Univeral Binary BUILD.
# CONFIG += ppc x86
#CONFIG += version_detail_bash_script
LIBS += ../../libretroshare/src/lib/libretroshare.a
LIBS += -lssl -lcrypto -lz -lgpgme -lgpg-error -lassuan
LIBS += ../../../miniupnpc-1.0/libminiupnpc.a
LIBS += -framework CoreFoundation
LIBS += -framework Security
INCLUDEPATH += .
#DEFINES* = MAC_IDLE # for idle feature
CONFIG -= uitools
}
############################## Common stuff ######################################
# On Linux systems that alredy have libssl and libcrypto it is advisable
# to rename the patched version of SSL to something like libsslxpgp.a and libcryptoxpg.a
# ###########################################

500
PeerNetQt/src/bdboot.txt Normal file
View File

@ -0,0 +1,500 @@
212.139.213.150 11032
212.139.213.150 10990
85.152.219.110 16300
151.64.206.15 26860
84.121.123.155 18218
193.109.161.129 6881
64.121.111.102 29081
95.178.41.37 46715
99.70.101.170 50784
119.203.237.201 46148
114.172.79.251 7922
24.35.134.70 49031
110.201.109.110 16001
188.115.181.175 63651
85.152.219.110 16466
86.101.126.209 45168
87.246.21.240 10255
79.163.101.143 36097
194.247.17.241 22817
123.113.36.18 16001
188.55.82.33 63068
85.152.219.110 16471
212.139.213.150 11167
84.41.37.179 55364
178.72.75.183 53646
212.139.213.150 10920
195.93.138.193 35691
184.57.201.40 49252
217.175.171.48 51413
85.152.219.110 16277
212.139.213.150 10925
85.152.219.110 16317
121.93.98.221 23082
212.139.213.150 10899
212.139.213.150 11065
81.183.201.252 25094
85.152.219.110 16327
85.152.219.110 16478
85.210.60.130 48512
212.139.213.150 10945
85.152.219.110 16386
212.139.213.150 10869
178.149.19.10 55995
87.19.184.107 37322
85.152.219.110 16382
119.152.12.221 53113
85.152.219.110 16394
2.49.78.158 60971
77.243.112.131 33702
212.139.213.150 10885
212.139.213.150 10905
95.30.54.87 36323
93.79.180.105 29600
212.139.213.150 11128
94.228.121.123 59898
212.139.213.150 11078
88.204.117.27 35691
78.176.90.204 34412
195.66.100.3 39983
81.231.142.85 51709
85.172.249.94 26350
212.139.213.150 10999
212.139.213.150 10857
212.139.213.150 11008
212.139.213.150 10929
89.221.115.221 42474
212.139.213.150 10898
212.139.213.150 11211
92.84.140.193 25245
69.245.13.37 52765
98.193.26.149 58998
76.14.166.121 10553
121.215.135.167 11589
117.206.235.234 25206
87.235.214.29 42817
109.173.5.179 16516
178.140.91.128 56909
72.175.61.150 40290
111.241.48.84 54660
95.182.88.133 42313
93.183.149.239 39456
79.173.248.84 1043
212.139.213.150 11202
212.139.213.150 10937
212.139.213.150 11035
212.139.213.150 11212
119.105.202.44 11184
94.178.16.95 16741
79.178.121.200 62324
78.120.178.227 20444
118.36.226.47 45090
212.139.213.150 10856
85.152.219.110 16504
85.152.219.110 16503
212.139.213.150 10852
85.152.219.110 16402
212.139.213.150 11105
85.152.219.110 16506
85.152.219.110 16509
85.232.219.81 18084
88.164.58.144 55857
82.73.234.131 37018
89.38.11.135 51816
178.67.37.134 42202
85.152.219.110 16511
212.139.213.150 11054
2.60.177.71 51413
94.209.60.137 37161
212.139.213.150 11069
122.163.55.49 33709
110.35.14.46 16394
41.240.141.226 58157
218.102.151.97 22792
112.120.35.208 14845
112.134.123.210 46374
212.67.133.227 22110
85.152.219.110 16408
58.0.103.222 13868
1.36.170.135 49888
118.160.44.124 15529
61.219.11.135 12967
219.77.101.32 10168
123.231.18.70 11935
94.23.1.199 45846
62.248.204.118 51000
99.28.131.130 46291
76.121.8.79 16599
94.193.177.45 13254
91.95.224.125 33937
122.161.167.221 22840
68.149.78.143 18261
94.174.132.84 10493
182.89.64.219 4041
95.55.22.43 15346
84.55.96.240 37839
67.82.53.124 5931
84.0.215.220 37787
81.225.143.195 1256
190.189.39.56 27211
175.142.195.240 18988
59.177.2.234 57683
188.220.197.130 51413
123.236.87.167 21823
118.5.196.178 14373
203.253.73.158 29843
115.59.105.0 1041
66.191.26.174 49995
89.147.94.239 38144
24.201.212.220 40489
184.59.221.228 22428
114.46.102.183 16881
88.134.99.73 27052
94.250.26.27 22979
122.178.113.80 58012
88.178.72.2 7812
98.215.148.74 60357
110.164.35.39 44112
178.152.0.100 10888
212.139.213.150 10972
72.200.149.14 15712
82.244.138.223 14284
82.244.203.153 21428
82.232.0.124 9156
178.178.240.33 24988
212.139.213.150 10943
212.139.213.150 11087
212.139.213.150 11086
92.134.151.100 23522
160.114.58.149 37689
80.232.240.131 51413
91.144.87.105 57933
75.119.230.89 1723
95.135.73.84 41175
118.0.112.234 26755
187.15.6.101 58525
175.145.223.193 36964
94.194.224.35 40927
195.138.72.56 35691
216.106.197.206 10476
188.16.99.201 48712
61.196.49.130 53264
123.155.206.188 11935
122.120.37.152 43097
212.139.213.150 11004
173.63.78.77 17310
89.165.209.72 27145
2.60.88.158 61218
212.139.213.150 10913
71.225.229.119 16709
213.37.47.70 20727
98.244.167.120 23246
173.34.90.46 8222
2.104.156.207 26387
98.110.89.33 55302
80.80.153.149 17610
72.213.204.222 33471
189.101.32.212 51413
118.9.53.170 21739
85.227.192.135 40053
186.23.58.157 21301
212.139.213.150 10930
173.56.22.140 51413
67.41.137.173 48302
212.139.213.150 10895
114.38.21.70 11904
70.81.118.246 33106
72.38.3.58 28012
78.29.157.202 52896
118.165.101.114 61471
84.73.253.37 43354
99.99.184.86 55431
89.214.191.127 10467
122.106.10.173 59931
72.27.71.232 11746
82.137.212.38 20621
60.0.124.214 11935
95.171.26.4 52382
78.20.54.114 63681
80.92.105.91 11255
212.139.213.150 11146
212.139.213.150 11113
212.139.213.150 11124
212.139.213.150 10963
46.109.115.238 47440
2.4.167.74 61574
71.58.129.230 41859
84.244.4.8 37691
213.110.132.160 13564
92.244.116.227 34939
212.200.207.47 27440
24.13.126.175 44715
76.89.148.206 28183
78.237.125.203 10595
62.255.191.244 60457
97.118.93.163 16283
94.69.47.150 17350
99.22.214.100 36244
213.107.94.57 55377
212.139.213.150 11143
78.31.227.221 53171
98.113.12.175 41060
109.132.186.182 37836
2.95.54.76 26871
70.120.233.87 60139
119.194.58.175 6881
202.64.42.71 56584
212.139.213.150 11084
78.190.140.113 23526
194.144.16.142 26935
212.139.213.150 10896
212.139.213.150 11085
92.158.0.211 44981
212.139.213.150 11068
212.139.213.150 10843
212.139.213.150 10900
145.236.20.190 52156
212.139.213.150 11028
112.201.75.180 41616
212.139.213.150 10894
212.139.213.150 10846
212.139.213.150 11197
212.139.213.150 10868
212.139.213.150 11081
88.187.80.252 49180
212.139.213.150 11175
212.139.213.150 11226
81.13.186.186 27652
212.139.213.150 11110
212.139.213.150 11201
212.139.213.150 11213
212.139.213.150 11101
212.139.213.150 11017
212.139.213.150 10936
212.139.213.150 10891
89.252.227.41 1751
212.139.213.150 10870
212.139.213.150 11064
212.139.213.150 10837
212.139.213.150 10941
212.139.213.150 10841
77.40.134.117 37692
213.245.18.98 54416
212.139.213.150 11122
212.139.213.150 11132
212.139.213.150 11127
212.139.213.150 10838
212.139.213.150 11005
212.139.213.150 11092
212.139.213.150 11013
87.58.253.222 6881
212.139.213.150 11219
212.139.213.150 11224
93.183.159.227 15234
109.8.252.86 26646
24.118.215.76 7000
192.117.97.129 21181
119.240.201.43 33331
203.142.185.144 27235
119.109.89.98 16001
212.139.213.150 10983
81.82.209.160 45974
75.84.23.196 48501
76.19.133.240 60301
212.139.213.150 11152
69.47.128.239 60159
109.86.99.249 11362
77.38.174.41 58764
109.195.211.3 40416
95.57.36.113 27439
114.164.15.235 6882
109.203.147.188 31679
212.139.213.150 10956
85.152.219.110 16373
85.152.219.110 16375
85.152.219.110 16374
212.139.213.150 10923
212.139.213.150 10909
212.139.213.150 11002
85.152.219.110 16378
212.139.213.150 11188
212.139.213.150 10848
85.152.219.110 16383
151.66.162.65 23067
85.152.219.110 16387
212.139.213.150 11193
85.152.219.110 16389
212.139.213.150 10977
85.152.219.110 16392
212.139.213.150 11038
212.139.213.150 11147
189.60.244.233 15861
85.152.219.110 16397
212.139.213.150 10971
212.139.213.150 10893
85.152.219.110 16404
85.152.219.110 16418
212.139.213.150 10984
212.139.213.150 10962
212.139.213.150 10839
85.152.219.110 16429
212.139.213.150 10874
85.152.219.110 16437
212.139.213.150 10955
89.169.104.162 51800
212.139.213.150 11136
94.113.169.223 20959
85.152.219.110 16444
212.139.213.150 10917
212.139.213.150 11063
85.152.219.110 16449
212.139.213.150 11050
123.228.132.214 59802
212.139.213.150 10912
212.139.213.150 10966
85.152.219.110 16452
212.139.213.150 10987
212.139.213.150 10924
212.139.213.150 10847
85.152.219.110 16459
89.178.249.16 46584
46.32.50.107 6881
95.168.230.154 1210
113.146.92.42 51413
212.139.213.150 10866
77.123.47.213 35741
111.233.229.16 14221
89.201.255.71 21940
99.238.211.18 58061
112.201.14.0 10301
85.152.219.110 16461
212.139.213.150 11042
94.21.183.178 29943
212.139.213.150 10978
212.139.213.150 11102
84.60.60.147 49860
79.136.239.71 16688
212.139.213.150 11121
88.77.94.222 49860
24.1.118.110 27704
93.145.89.34 53568
85.152.219.110 16464
178.73.200.28 45416
112.221.10.75 11811
212.139.213.150 11010
142.161.67.218 50221
98.250.169.93 30165
88.170.61.126 7465
76.28.161.135 64289
113.11.4.87 39907
27.186.73.219 9371
212.139.213.150 10994
85.152.219.110 16297
212.139.213.150 11022
93.116.164.129 32793
212.139.213.150 10833
95.102.83.196 22931
85.152.219.110 16465
212.139.213.150 11060
82.224.136.52 7812
212.139.213.150 11107
61.18.118.141 20822
85.152.219.110 16299
69.76.140.34 16157
212.139.213.150 10985
212.139.213.150 11046
86.58.76.161 44032
87.151.74.145 53760
80.94.245.157 43332
117.196.105.164 15076
212.139.213.150 10948
173.74.237.177 59850
95.25.98.209 40615
87.110.2.78 38633
79.119.105.174 58851
85.152.219.110 16302
89.73.211.60 60335
212.139.213.150 10836
177.16.80.162 40000
74.232.225.202 50908
212.139.213.150 11067
94.137.247.253 52053
95.73.252.250 13214
85.152.219.110 16467
212.139.213.150 11062
212.139.213.150 11214
196.205.236.76 23958
212.139.213.150 11048
85.152.219.110 16291
212.139.213.150 10961
212.139.213.150 10897
85.152.219.110 16309
212.139.213.150 11218
212.139.213.150 10944
85.152.219.110 16311
212.139.213.150 11015
212.139.213.150 11000
178.162.242.146 37592
212.139.213.150 11161
85.152.219.110 16319
212.139.213.150 11189
212.139.213.150 11033
94.190.83.102 33102
212.139.213.150 11044
212.139.213.150 11144
85.152.219.110 16322
212.139.213.150 10991
212.139.213.150 10975
85.152.219.110 16324
212.139.213.150 11049
85.152.219.110 16295
212.139.213.150 11134
212.139.213.150 11183
85.152.219.110 16284
212.139.213.150 11135
85.152.219.110 16339
212.139.213.150 11168
85.152.219.110 16343
212.139.213.150 11115
212.139.213.150 11047
212.139.213.150 10884
212.139.213.150 11210
85.152.219.110 16469
212.139.213.150 11108
213.119.89.134 37949
212.139.213.150 10919
212.139.213.150 11198
212.139.213.150 11220
88.168.14.141 46232
212.139.213.150 11205
212.139.213.150 11114
212.139.213.150 10952
212.139.213.150 11095
212.139.213.150 11207
212.139.213.150 11082
212.139.213.150 10851
212.139.213.150 11160
212.139.213.150 11109
212.139.213.150 11184
212.139.213.150 10926
212.139.213.150 10844
212.139.213.150 10916
118.11.81.144 55695
212.139.213.150 11153
212.139.213.150 10875
212.139.213.150 10871
212.139.213.150 11204
212.139.213.150 10865
212.139.213.150 11014
212.139.213.150 11229
212.139.213.150 11179
212.139.213.150 11001
212.139.213.150 11029
212.139.213.150 10853
212.139.213.150 10927
212.139.213.150 11140
212.139.213.150 11129
212.139.213.150 11099
212.139.213.150 10969
212.139.213.150 10921
212.139.213.150 11185

24
PeerNetQt/src/main.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "peernet.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef __APPLE__
PeerNet pnet("", "../..", 0); // This is because of the apple APP structure.
#else
PeerNet pnet("", ".", 0);
#endif
MainWindow w;
w.show();
w.setPeerNet(&pnet);
return a.exec();
}

View File

@ -0,0 +1,263 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <sstream>
#include <iostream>
#include <iomanip>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// tick for gui update.
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
// connect add Peer button.
connect(ui->addButton, SIGNAL(clicked()), this, SLOT(addPeer()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::setPeerNet(PeerNet *pnet)
{
mPeerNet = pnet;
}
void MainWindow::update()
{
//std::cerr << "MainWindow::update()" << std::endl;
updateNetStatus();
updateDhtPeers();
updateNetPeers();
updateChat();
}
void MainWindow::updateNetStatus()
{
}
#define DTW_COL_BUCKET 0
#define DTW_COL_IPADDR 1
#define DTW_COL_PEERID 2
#define DTW_COL_FLAGS 3
#define DTW_COL_FOUND 4
#define DTW_COL_SEND 5
#define DTW_COL_RECV 6
void MainWindow::updateDhtPeers()
{
/* Hackish display of all Dht peers, should be split into buckets (as children) */
bdNodeId ownId;
mPeerNet->getOwnId(&ownId);
QString status = QString::fromStdString(mPeerNet->getDhtStatusString());
ui->dhtLabel->setText(status);
std::list<bdPeer> allpeers;
std::list<bdPeer>::iterator it;
int i;
for(i = 0; i < 160; i++)
{
bdBucket peers;
mPeerNet->get_dht_peers(i, peers);
for(it = peers.entries.begin(); it != peers.entries.end(); it++)
{
allpeers.push_back(*it);
}
}
QTreeWidget *dhtTreeWidget = ui->dhtTreeWidget;
dhtTreeWidget->clear();
#if 0
/* clear old entries */
int itemCount = dhtTreeWidget->topLevelItemCount();
for (int nIndex = 0; nIndex < itemCount;)
{
QTreeWidgetItem *tmp_item = dhtTreeWidget->topLevelItem(nIndex);
std::string tmpid = tmp_item->data(DTW_COL_PEERID, Qt::DisplayRole).toString().toStdString();
if (peerIds.end() == std::find(peerIds.begin(), peerIds.end(), tmpid))
{
peerTreeWidget->removeItemWidget(tmp_item, 0);
/* remove it! */
itemCount--;
}
else
{
nIndex++;
}
}
#endif
time_t now = time(NULL);
for(it = allpeers.begin(); it != allpeers.end(); it++)
{
/* find the entry */
QTreeWidgetItem *dht_item = NULL;
/* insert */
dht_item = new QTreeWidgetItem();
int dist = bdStdBucketDistance(&ownId, &(it->mPeerId.id));
std::ostringstream buckstr;
buckstr << dist;
std::ostringstream ipstr;
ipstr << inet_ntoa(it->mPeerId.addr.sin_addr);
ipstr << ":" << ntohs(it->mPeerId.addr.sin_port);
std::ostringstream idstr;
bdStdPrintNodeId(idstr, &(it->mPeerId.id));
std::ostringstream flagsstr;
flagsstr << "0x" << std::hex << std::setfill('0') << it->mPeerFlags;
std::ostringstream foundstr;
foundstr << now - it->mFoundTime << " secs ago";
std::ostringstream lastsendstr;
lastsendstr << now - it->mLastSendTime << " secs ago";
std::ostringstream lastrecvstr;
lastrecvstr << now - it->mLastRecvTime << " secs ago";
dht_item -> setData(DTW_COL_BUCKET, Qt::DisplayRole, QString::fromStdString(buckstr.str()));
dht_item -> setData(DTW_COL_IPADDR, Qt::DisplayRole, QString::fromStdString(ipstr.str()));
dht_item -> setData(DTW_COL_PEERID, Qt::DisplayRole, QString::fromStdString(idstr.str()));
dht_item -> setData(DTW_COL_FLAGS, Qt::DisplayRole, QString::fromStdString(flagsstr.str()));
dht_item -> setData(DTW_COL_FOUND, Qt::DisplayRole, QString::fromStdString(foundstr.str()));
dht_item -> setData(DTW_COL_SEND, Qt::DisplayRole, QString::fromStdString(lastsendstr.str()));
dht_item -> setData(DTW_COL_RECV, Qt::DisplayRole, QString::fromStdString(lastrecvstr.str()));
dhtTreeWidget->addTopLevelItem(dht_item);
}
}
void MainWindow::updateNetPeers()
{
QString status = QString::fromStdString(mPeerNet->getPeerStatusString());
QString oldstatus = ui->peerLine->text();
if (oldstatus != status)
{
ui->peerLine->setText(status);
}
QTreeWidget *peerTreeWidget = ui->peerTreeWidget;
std::list<std::string> peerIds;
std::list<std::string>::iterator it;
mPeerNet->get_net_peers(peerIds);
#define PTW_COL_PEERID 0
#define PTW_COL_STATUS 1
#define PTW_COL_UPDATETS 2
/* clear old entries */
int itemCount = peerTreeWidget->topLevelItemCount();
for (int nIndex = 0; nIndex < itemCount;)
{
QTreeWidgetItem *tmp_item = peerTreeWidget->topLevelItem(nIndex);
std::string tmpid = tmp_item->data(PTW_COL_PEERID, Qt::DisplayRole).toString().toStdString();
if (peerIds.end() == std::find(peerIds.begin(), peerIds.end(), tmpid))
{
peerTreeWidget->removeItemWidget(tmp_item, 0);
/* remove it! */
itemCount--;
}
else
{
nIndex++;
}
}
for(it = peerIds.begin(); it != peerIds.end(); it++)
{
/* find the entry */
QTreeWidgetItem *peer_item = NULL;
QString qpeerid = QString::fromStdString(*it);
int itemCount = peerTreeWidget->topLevelItemCount();
for (int nIndex = 0; nIndex < itemCount; nIndex++)
{
QTreeWidgetItem *tmp_item = peerTreeWidget->topLevelItem(nIndex);
if (tmp_item->data(PTW_COL_PEERID, Qt::DisplayRole).toString() == qpeerid)
{
peer_item = tmp_item;
break;
}
}
if (!peer_item)
{
/* insert */
peer_item = new QTreeWidgetItem();
peerTreeWidget->addTopLevelItem(peer_item);
}
/* update the data */
PeerStatus status;
mPeerNet->get_peer_status(*it, status);
std::ostringstream updatestr;
time_t now = time(NULL);
updatestr << now - status.mUpdateTS << " secs ago";
peer_item -> setData(PTW_COL_PEERID, Qt::DisplayRole, QString::fromStdString(*it));
peer_item -> setData(PTW_COL_STATUS, Qt::DisplayRole, QString::fromStdString(status.mStatusMsg));
peer_item -> setData(PTW_COL_UPDATETS, Qt::DisplayRole, QString::fromStdString(updatestr.str()));
}
}
void MainWindow::addPeer()
{
std::string id = ui->peerLineEdit->text().toStdString();
mPeerNet->add_peer(id);
}
void MainWindow::sendChat()
{
}
void MainWindow::updateChat()
{
}

View File

@ -0,0 +1,37 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "peernet.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void setPeerNet(PeerNet *pnet);
void updateNetStatus();
void updateDhtPeers();
void updateNetPeers();
void sendChat();
void updateChat();
public slots:
void update();
void addPeer();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
PeerNet *mPeerNet;
};
#endif // MAINWINDOW_H

174
PeerNetQt/src/mainwindow.ui Normal file
View File

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>644</width>
<height>590</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="addButton">
<property name="text">
<string>Add Peer</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="peerLineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLineEdit" name="peerLine">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Peer Details</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QTreeWidget" name="peerTreeWidget">
<column>
<property name="text">
<string>PeerId</string>
</property>
</column>
<column>
<property name="text">
<string>Status</string>
</property>
</column>
<column>
<property name="text">
<string>Last Update</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Enter to send Chat:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="chatLineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QTextBrowser" name="chatBrowser"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="dhtLabel">
<property name="text">
<string>DHT Details:</string>
</property>
</widget>
</item>
<item>
<widget class="QTreeWidget" name="dhtTreeWidget">
<column>
<property name="text">
<string>Bucket</string>
</property>
</column>
<column>
<property name="text">
<string>Ip:Port</string>
</property>
</column>
<column>
<property name="text">
<string>Key</string>
</property>
</column>
<column>
<property name="text">
<string>StatusFlags</string>
</property>
</column>
<column>
<property name="text">
<string>Found</string>
</property>
</column>
<column>
<property name="text">
<string>Last Send</string>
</property>
</column>
<column>
<property name="text">
<string>Last Recv</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>644</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

512
PeerNetQt/src/peernet.cc Normal file
View File

@ -0,0 +1,512 @@
#include "peernet.h"
#include <iostream>
#include <sstream>
#include "bitdht/bdstddht.h"
#include "tcponudp/tou.h"
#include "util/rsnet.h"
PeerNet::PeerNet(std::string id, std::string configpath, uint16_t port)
{
std::string dhtVersion = "RS52"; // should come from elsewhere!
std::cerr << "PeerNet::PeerNet()" << std::endl;
std::cerr << "Using Id: " << id;
std::cerr << std::endl;
std::cerr << "Using Config Path: " << configpath;
std::cerr << std::endl;
std::cerr << "Converting OwnId to bdNodeId....";
std::cerr << std::endl;
std::cerr << "Loading Configuration";
std::cerr << std::endl;
mConfigFile = configpath + "/peerconfig.txt";
mPeersFile = configpath + "/peerlist.txt";
std::string bootstrapfile = configpath + "/bdboot.txt";
srand(time(NULL));
mPort = 10240 + (rand() % 10240);
if (!loadConfig(mConfigFile))
{
std::cerr << "Failed to loadConfig, Creating random Id/Port";
std::cerr << std::endl;
/* */
bdStdRandomNodeId(&mOwnId);
}
if (!bdStdLoadNodeId(&mOwnId, id))
{
std::cerr << "Failed to load Id from FnParameters";
std::cerr << std::endl;
}
if (port > 1024)
{
mPort = port;
}
std::cerr << "Input Id: " << id;
std::cerr << std::endl;
std::cerr << "Own NodeId: ";
bdStdPrintNodeId(std::cerr, &mOwnId);
std::cerr << std::endl;
/* standard dht behaviour */
bdDhtFunctions *stdfns = new bdStdDht();
std::cerr << "PeerNet() startup ... creating UdpStack";
std::cerr << std::endl;
struct sockaddr_in tmpladdr;
sockaddr_clear(&tmpladdr);
tmpladdr.sin_port = htons(mPort);
mUdpStack = new UdpStack(tmpladdr);
std::cerr << "PeerNet() startup ... creating UdpBitDht";
std::cerr << std::endl;
/* create dht */
mUdpBitDht = new UdpBitDht(mUdpStack, &mOwnId, dhtVersion, bootstrapfile, stdfns);
mUdpStack->addReceiver(mUdpBitDht);
/* setup callback to here */
mUdpBitDht->addCallback(this);
/* setup TOU part */
tou_init(mUdpStack);
/* startup the Udp stuff! */
mUdpBitDht->start();
mUdpBitDht->startDht();
// handle configuration.
loadPeers(mPeersFile);
storeConfig(mConfigFile);
}
int PeerNet::getOwnId(bdNodeId *id)
{
*id = mOwnId;
return 1;
}
#define PN_PEER_STATE_UNKNOWN 0
#define PN_PEER_STATE_SEARCHING 1
#define PN_PEER_STATE_FAILURE 2
#define PN_PEER_STATE_OFFLINE 3
#define PN_PEER_STATE_UNREACHABLE 4
#define PN_PEER_STATE_ONLINE 5
int PeerNet::add_peer(std::string id)
{
bdNodeId tmpId;
if (!bdStdLoadNodeId(&tmpId, id))
{
std::cerr << "PeerNet::add_peer() Failed to load own Id";
std::cerr << std::endl;
return 0;
}
std::ostringstream str;
bdStdPrintNodeId(str, &tmpId);
std::string filteredId = str.str();
std::cerr << "PeerNet::add_peer()";
std::cerr << std::endl;
std::cerr << "Input Id: " << id;
std::cerr << std::endl;
std::cerr << "Filtered Id: " << id;
std::cerr << std::endl;
std::cerr << "Final NodeId: ";
bdStdPrintNodeId(std::cerr, &tmpId);
std::cerr << std::endl;
if (mPeers.end() == mPeers.find(filteredId))
{
std::cerr << "Adding New Peer: " << filteredId << std::endl;
mPeers[filteredId] = PeerStatus();
std::map<std::string, PeerStatus>::iterator it = mPeers.find(filteredId);
mUdpBitDht->addFindNode(&tmpId, BITDHT_QFLAGS_DO_IDLE);
it->second.mId = filteredId;
it->second.mStatusMsg = "Just Added";
it->second.mState = PN_PEER_STATE_SEARCHING;
it->second.mUpdateTS = time(NULL);
storePeers(mPeersFile);
return 1;
}
std::cerr << "Peer Already Exists, ignoring: " << filteredId << std::endl;
return 0;
}
int PeerNet::remove_peer(std::string id)
{
bdNodeId tmpId;
if (!bdStdLoadNodeId(&tmpId, id))
{
std::cerr << "PeerNet::remove_peer() Failed to load own Id";
std::cerr << std::endl;
return 0;
}
std::ostringstream str;
bdStdPrintNodeId(str, &tmpId);
std::string filteredId = str.str();
std::map<std::string, PeerStatus>::iterator it = mPeers.find(filteredId);
if (mPeers.end() != it)
{
mUdpBitDht->removeFindNode(&tmpId);
mPeers.erase(it);
return 1;
}
return 0;
}
int PeerNet::get_dht_peers(int lvl, bdBucket &peers)
{
/* must be able to access deep into bitdht, which isn't possible
* at the moment! ... add this functionality now!
*/
return mUdpBitDht->getDhtBucket(lvl, peers);
}
std::string PeerNet::getDhtStatusString()
{
std::ostringstream out;
int state = mUdpBitDht->stateDht();
switch(state)
{
default:
out << "Unknown State: " << state << " ";
break;
case BITDHT_MGR_STATE_OFF:
out << "BitDHT OFF ";
break;
case BITDHT_MGR_STATE_STARTUP:
out << "BitDHT Startup ";
break;
case BITDHT_MGR_STATE_FINDSELF:
out << "BitDHT FindSelf ";
break;
case BITDHT_MGR_STATE_ACTIVE:
out << "BitDHT Active ";
break;
case BITDHT_MGR_STATE_REFRESH:
out << "BitDHT Refresh ";
break;
case BITDHT_MGR_STATE_QUIET:
out << "BitDHT Quiet ";
break;
case BITDHT_MGR_STATE_FAILED:
out << "BitDHT Failed ";
break;
}
out << " BitNetSize: " << mUdpBitDht->statsNetworkSize();
out << " LocalNetSize: " << mUdpBitDht->statsBDVersionSize();
return out.str();
}
std::string PeerNet::getPeerStatusString()
{
std::ostringstream out;
out << "OwnId: ";
bdStdPrintNodeId(out, &mOwnId);
out << " LocalPort: " << mPort;
return out.str();
}
int PeerNet::get_net_peers(std::list<std::string> &peerIds)
{
std::map<std::string, PeerStatus>::iterator it;
for(it = mPeers.begin(); it != mPeers.end(); it++)
{
peerIds.push_back(it->first);
}
return 1;
}
int PeerNet::get_peer_status(std::string id, PeerStatus &status)
{
std::map<std::string, PeerStatus>::iterator it = mPeers.find(id);
if (it != mPeers.end())
{
status = it->second;
return 1;
}
return 0;
}
/* remember peers */
int PeerNet::storePeers(std::string filepath)
{
std::cerr << "PeerNet::storePeers(" << filepath << ")";
std::cerr << std::endl;
FILE *fd = fopen(filepath.c_str(), "w");
if (!fd)
{
std::cerr << "Failed to StorePeers, Issue Opening file: " << filepath;
std::cerr << std::endl;
return 0;
}
std::map<std::string, PeerStatus>::iterator it;
for(it = mPeers.begin(); it != mPeers.end(); it++)
{
fprintf(fd, "%s\n", (it->first).c_str());
}
fclose(fd);
return 1;
}
int PeerNet::loadPeers(std::string filepath)
{
FILE *fd = fopen(filepath.c_str(), "r");
if (!fd)
{
std::cerr << "Failed to loadPeers, Issue Opening file: " << filepath;
std::cerr << std::endl;
return 0;
}
char line[1024];
bool firstline = true;
std::list<std::string> peerIds;
while(1 == fscanf(fd, "%[^\n]\n", line))
{
std::cerr << "Read Peer: " << line;
std::cerr << std::endl;
std::string id(line);
peerIds.push_back(id);
}
fclose(fd);
std::list<std::string>::iterator it;
for(it = peerIds.begin(); it != peerIds.end(); it++)
{
add_peer(*it);
}
return 1;
}
/* remember peers */
int PeerNet::storeConfig(std::string filepath)
{
FILE *fd = fopen(filepath.c_str(), "w");
if (!fd)
{
std::cerr << "Failed to StorePeers, Issue Opening file: " << filepath;
std::cerr << std::endl;
return 0;
}
/* store own hash */
std::ostringstream ownidstr;
bdStdPrintNodeId(ownidstr, &(mOwnId));
fprintf(fd, "%s\n", ownidstr.str().c_str());
fclose(fd);
return 1;
}
int PeerNet::loadConfig(std::string filepath)
{
FILE *fd = fopen(filepath.c_str(), "r");
if (!fd)
{
std::cerr << "Failed to loadConfig, Issue Opening file: " << filepath;
std::cerr << std::endl;
return 0;
}
char line[1024];
bool firstline = true;
if (1 == fscanf(fd, "%[^\n]\n", line))
{
std::string id(line);
std::cerr << "Read OwnId: " << line;
std::cerr << std::endl;
if (!bdStdLoadNodeId(&mOwnId, id))
{
std::cerr << "Failed to load own Id";
std::cerr << std::endl;
}
}
fclose(fd);
return 1;
}
/**** dht Callback ****/
int PeerNet::dhtNodeCallback(const bdId *id, uint32_t peerflags)
{
std::ostringstream str;
bdStdPrintNodeId(str, &(id->id));
std::string strId = str.str();
std::map<std::string, PeerStatus>::iterator it = mPeers.find(strId);
if (it != mPeers.end())
{
std::cerr << "PeerNet::dhtNodeCallback() From KNOWN PEER: ";
bdStdPrintId(std::cerr, id);
std::cerr << " Flags: " << peerflags;
std::cerr << std::endl;
}
return 1;
}
int PeerNet::dhtPeerCallback(const bdId *id, uint32_t status)
{
std::ostringstream str;
bdStdPrintNodeId(str, &(id->id));
std::string strId = str.str();
//std::cerr << "PeerNet::dhtPeerCallback()";
//std::cerr << std::endl;
std::map<std::string, PeerStatus>::iterator it = mPeers.find(strId);
if (it != mPeers.end())
{
switch(status)
{
default:
{
it->second.mStatusMsg = "Unknown Peer State";
it->second.mState = PN_PEER_STATE_UNKNOWN;
}
break;
case BITDHT_MGR_QUERY_FAILURE:
{
it->second.mStatusMsg = "Search Failed (is DHT working?)";
it->second.mState = PN_PEER_STATE_FAILURE;
}
break;
case BITDHT_MGR_QUERY_PEER_OFFLINE:
{
it->second.mStatusMsg = "Peer Offline";
it->second.mState = PN_PEER_STATE_OFFLINE;
}
break;
case BITDHT_MGR_QUERY_PEER_UNREACHABLE:
{
it->second.mStatusMsg = "Peer Unreachable";
it->second.mState = PN_PEER_STATE_UNREACHABLE;
}
break;
case BITDHT_MGR_QUERY_PEER_ONLINE:
{
it->second.mStatusMsg = "Peer Online";
it->second.mState = PN_PEER_STATE_ONLINE;
}
break;
}
time_t now = time(NULL);
it->second.mUpdateTS = now;
return 1;
}
else
{
std::cerr << "PeerNet::dhtPeerCallback() Unknown Peer: ";
bdStdPrintId(std::cerr, id);
std::cerr << " status: " << status;
std::cerr << std::endl;
}
return 1;
}
int PeerNet::dhtValueCallback(const bdNodeId *id, std::string key, uint32_t status)
{
std::cerr << "PeerNet::dhtValueCallback()";
std::cerr << std::endl;
return 1;
}
int PeerNet::dhtConnectCallback(const bdId *srcId, const bdId *proxyId, const bdId *destId,
uint32_t mode, uint32_t point, uint32_t cbtype)
{
std::cerr << "PeerNet::dhtConnectCallback()";
std::cerr << std::endl;
switch(cbtype)
{
case BITDHT_CONNECT_CB_AUTH:
{
}
break;
case BITDHT_CONNECT_CB_PENDING:
{
}
break;
case BITDHT_CONNECT_CB_START:
{
}
break;
case BITDHT_CONNECT_CB_PROXY:
{
}
break;
default:
case BITDHT_CONNECT_CB_FAILED:
{
}
break;
}
return 1;
}

90
PeerNetQt/src/peernet.h Normal file
View File

@ -0,0 +1,90 @@
#ifndef PEER_NET_INTERFACE_H
#define PEER_NET_INTERFACE_H
/* top-level p2p overlay network interface */
#include <string>
#include <list>
#include "bitdht/bdiface.h"
#include "udp/udpstack.h"
#include "udp/udpbitdht.h"
#include "bitdht/bdstddht.h"
class DhtPeer
{
public:
std::string id;
};
class PeerStatus
{
public:
std::string mId;
std::string mStatusMsg;
uint32_t mState;
time_t mUpdateTS;
};
class PeerNet: public BitDhtCallback
{
public:
PeerNet(std::string id, std::string bootstrapfile, uint16_t port);
/* GUI interface */
int getOwnId(bdNodeId *id);
int add_peer(std::string id);
int remove_peer(std::string id);
std::string getPeerStatusString();
std::string getDhtStatusString();
int get_dht_peers(int lvl, bdBucket &peers);
//int get_dht_peers(int lvl, std::list<DhtPeer> &peers);
int get_net_peers(std::list<std::string> &peerIds);
int get_peer_status(std::string peerId, PeerStatus &status);
/* remember peers */
int storePeers(std::string filepath);
int loadPeers(std::string filepath);
int storeConfig(std::string filepath);
int loadConfig(std::string filepath);
/* under the hood */
/**** dht Callback ****/
// dummy cos not needed for standard dht behaviour;
virtual int dhtNodeCallback(const bdId *id, uint32_t peerflags);
// must be implemented.
virtual int dhtPeerCallback(const bdId *id, uint32_t status);
virtual int dhtValueCallback(const bdNodeId *id, std::string key, uint32_t status);
// connection callback. Not required for basic behaviour, but forced for initial development.
virtual int dhtConnectCallback(const bdId *srcId, const bdId *proxyId, const bdId *destId,
uint32_t mode, uint32_t point, uint32_t cbtype);
private:
UdpStack *mUdpStack;
UdpBitDht *mUdpBitDht;
std::map<std::string, PeerStatus> mPeers;
bdNodeId mOwnId;
std::string mPeersFile;
std::string mConfigFile;
uint16_t mPort;
};
#endif