From 3ed292a6023c458dab2aa7d78af9905a23ff66e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 12 Mar 2015 11:22:27 +0000 Subject: [PATCH] add peer info in pisd git-svn-id: svn://db.shs.com.ru/pip@19 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src/io/pipeer.h | 3 +- utils/system_daemon/main.cpp | 82 ++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 5 deletions(-) diff --git a/src/io/pipeer.h b/src/io/pipeer.h index 3b0580e6..5cdaf045 100755 --- a/src/io/pipeer.h +++ b/src/io/pipeer.h @@ -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 > & _peerMap() const {return addresses_map;} void lock() {mc_mutex.lock();} void unlock() {mc_mutex.unlock();} diff --git a/utils/system_daemon/main.cpp b/utils/system_daemon/main.cpp index 4f90f852..66fbb1a6 100755 --- a/utils/system_daemon/main.cpp +++ b/utils/system_daemon/main.cpp @@ -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 > 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 mtiles; + int cur_peer; };