add peer info in pisd

git-svn-id: svn://db.shs.com.ru/pip@19 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
2015-03-12 11:22:27 +00:00
parent 7832d82f93
commit 3ed292a602
2 changed files with 80 additions and 5 deletions

View File

@@ -114,7 +114,8 @@ public:
bool isPeerExists(const PIString & name) const {return getPeerByName(name) != 0;}
const PeerInfo * getPeerByName(const PIString & name) const {piForeachC (PeerInfo & i, peers) if (i.name == name) return &i; return 0;}
const PeerInfo & selfInfo() {return self_info;}
const PeerInfo & selfInfo() const {return self_info;}
const PIMap<PIString, PIVector<PeerInfo * > > & _peerMap() const {return addresses_map;}
void lock() {mc_mutex.lock();}
void unlock() {mc_mutex.unlock();}

View File

@@ -36,10 +36,11 @@ FileManager file_manager;
Daemon daemon_;
class MainMenu: public PIObject {
PIOBJECT(MainMenu)
class MainMenu: public PITimer {
PIOBJECT_SUBCLASS(MainMenu, PITimer)
public:
MainMenu() {
cur_peer = -1;
TileSimple * tile = new TileSimple("title");
tile->content << TileSimple::Row("pisd (PI System Daemon, PIP version " + PIPVersion() + ")", CellFormat(Black, Transparent));
tile->back_format.color_back = Yellow;
@@ -67,17 +68,23 @@ public:
mt = tdaemon = daemon_.tile();
mt->hide(); mt->name = "daemon";
center->addTile(mt); mtiles << mt;
mt = tpeer = peerTile();
mt->hide(); mt->name = "peer info";
center->addTile(mt); mtiles << mt;
CONNECTU(&screen, tileEvent, this, tileEvent)
CONNECTU(&screen, keyPressed, this, keyEvent)
CONNECTU(&file_manager, menuRequest, this, menuRequest)
CONNECTU(&daemon_, menuRequest, this, menuRequest)
start(100);
}
PIScreenTile * menuTile() {
TileList * ret = new TileList();
ret->content << TileList::Row("Show local info", CellFormat());
ret->content << TileList::Row("Local file manager", CellFormat());
ret->content << TileList::Row("Connect to another daemon", CellFormat());
ret->content << TileList::Row("Peer info", CellFormat());
ret->content << TileList::Row("Exit", CellFormat());
ret->selection_mode = TileList::NoSelection;
return ret;
@@ -94,6 +101,62 @@ public:
ret->content << TileSimple::Row(" CPU count: " + PIString::fromNumber(PISystemInfo::instance()->processorsCount), CellFormat());
return ret;
}
PIScreenTile * peerTile() {
PIScreenTile* ret = new PIScreenTile();
TileSimple * htl = new TileSimple();
htl->size_policy = PIScreenTypes::Fixed;
ret->direction = PIScreenTypes::Vertical;
htl->content << TileSimple::Row("Peer: " + daemon_.name() + " | " + daemon_.selfInfo().name, CellFormat(PIScreenTypes::Default, PIScreenTypes::Default, PIScreenTypes::Bold));
addrs_tl = new TileList();
peers_tl = new TileList();
peerinfo_tl = new TileSimple();
peermap_tl = new TileList();
peerinfo_tl->size_policy = PIScreenTypes::Fixed;
ret->addTile(htl);
ret->addTile(peers_tl);
ret->addTile(peerinfo_tl);
ret->addTile(addrs_tl);
ret->addTile(peermap_tl);
updatePeerInfo();
return ret;
}
void updatePeerInfo() {
screen.lock();
peers_tl->content.clear();
addrs_tl->content.clear();
peerinfo_tl->content.clear();
peermap_tl->content.clear();
peers_tl->content << TileList::Row("this | 0 | 0 |" + PIString::fromNumber(daemon_.allPeers().size_s()) +
"," + PIString::fromNumber(cur_peer)
, CellFormat());
piForeachC(PIPeer::PeerInfo &p , daemon_.allPeers())
peers_tl->content << TileList::Row(p.name + " | " + PIString::fromNumber(p.dist) +
" | " + PIString::fromNumber(p.ping()) +
" | " + PIString::fromNumber(p.addresses.size_s()) +
" | " + PIString::fromBool(p.isNeighbour())
, CellFormat());
PIPeer::PeerInfo pi = daemon_.selfInfo();
if (cur_peer >= 0 && cur_peer < daemon_.allPeers().size_s()) pi = daemon_.allPeers()[cur_peer];
peerinfo_tl->content << TileSimple::Row("Name: " + pi.name, CellFormat());
peerinfo_tl->content << TileSimple::Row("Addreses: " + PIString::fromNumber(pi.addresses.size()), CellFormat());
piForeachC(PIPeer::PeerInfo::Address &a , pi.addresses)
addrs_tl->content << TileList::Row(a.address + " | " + a.netmask +
" | " + PIString::fromNumber(a.ping) +
" | " + PIString::fromNumber(a.last_ping.toSeconds()) +
" | " + PIString::fromBool(a.isAvailable()), CellFormat());
typedef PIPair<PIString, PIVector <PIPeer::PeerInfo* > > PeerPair;
PIStringList peermap;
piForeachC(PeerPair &p , daemon_._peerMap()) {
PIString s = p.first + " | ";
piForeachC(PIPeer::PeerInfo * pp, p.second) s += "->" + pp->name;
}
piForeachC(PIString &s , peermap)
peers_tl->content << TileList::Row(s, CellFormat());
screen.unlock();
}
void tick(void* data_, int delimiter) {
updatePeerInfo();
}
EVENT_HANDLER(void, menuRequest) {
piForeach (PIScreenTile * t, mtiles)
t->hide();
@@ -109,18 +172,29 @@ public:
case 0: tinfo->show(); break;
case 1: tfm->show(); break;
case 2: tdaemon->show(); break;
case 3: PIKbdListener::exiting = true; break;
case 3: tpeer->show(); break;
case 4: PIKbdListener::exiting = true; break;
}
}
return;
}
if (t == peers_tl) {
if (e.type == TileList::RowPressed) {
cur_peer = e.data.toInt() - 1;
updatePeerInfo();
}
return;
}
}
EVENT_HANDLER1(void, keyEvent, PIKbdListener::KeyEvent, e) {
if (e.key == PIKbdListener::Esc) menuRequest();
//piCout << "key" << e.key;
}
PIScreenTile * tmenu, * tinfo, * tfm, * tdaemon;
PIScreenTile * tmenu, * tinfo, * tfm, * tdaemon, * tpeer;
TileList * peers_tl, * addrs_tl, * peermap_tl;
TileSimple * peerinfo_tl;
PIVector<PIScreenTile * > mtiles;
int cur_peer;
};