git-svn-id: svn://db.shs.com.ru/pip@240 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
#define _PIPEER_BROADCAST_PORT 13361
|
#define _PIPEER_BROADCAST_PORT 13361
|
||||||
#define _PIPEER_TRAFFIC_PORT_S 13400
|
#define _PIPEER_TRAFFIC_PORT_S 13400
|
||||||
#define _PIPEER_TRAFFIC_PORT_E 14000
|
#define _PIPEER_TRAFFIC_PORT_E 14000
|
||||||
|
#define _PIPEER_PING_TIMEOUT 5.0
|
||||||
|
|
||||||
|
|
||||||
PIPeer::PeerData::PeerData(const PIString & n): PIObject(n) {
|
PIPeer::PeerData::PeerData(const PIString & n): PIObject(n) {
|
||||||
@@ -184,6 +185,8 @@ void PIPeer::timerEvent(void * data, int delim) {
|
|||||||
switch (delim) {
|
switch (delim) {
|
||||||
case 1: // every 1 s
|
case 1: // every 1 s
|
||||||
syncPeers();
|
syncPeers();
|
||||||
|
piMSleep(100);
|
||||||
|
pingNeighbours();
|
||||||
break;
|
break;
|
||||||
case 5: // every 5 s
|
case 5: // every 5 s
|
||||||
checkNetwork();
|
checkNetwork();
|
||||||
@@ -354,6 +357,7 @@ PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
|
|||||||
|
|
||||||
bool PIPeer::send(const PIString & to, const void * data, int size) {
|
bool PIPeer::send(const PIString & to, const void * data, int size) {
|
||||||
PIByteArray ba(data, size);
|
PIByteArray ba(data, size);
|
||||||
|
// piCoutObj << "send" << ba.size_s() << "bytes" << _PIPEER_MSG_SIZE;
|
||||||
if (ba.size_s() <= _PIPEER_MSG_SIZE) {
|
if (ba.size_s() <= _PIPEER_MSG_SIZE) {
|
||||||
ba.insert(0, uchar(1));
|
ba.insert(0, uchar(1));
|
||||||
return sendInternal(to, ba);
|
return sendInternal(to, ba);
|
||||||
@@ -364,7 +368,6 @@ bool PIPeer::send(const PIString & to, const void * data, int size) {
|
|||||||
if (!dp) return false;
|
if (!dp) return false;
|
||||||
return dp->_data->send(ba);
|
return dp->_data->send(ba);
|
||||||
}
|
}
|
||||||
//piCout << "[PIPeer] send" << size << "bytes ok";
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,8 +381,11 @@ bool PIPeer::sendInternal(const PIString & to, const PIByteArray & data) {
|
|||||||
}
|
}
|
||||||
PIByteArray ba;
|
PIByteArray ba;
|
||||||
ba << int(4) << self_info.name << to << int(0) << data;
|
ba << int(4) << self_info.name << to << int(0) << data;
|
||||||
//piCoutObj << "sendInternal to" << to << data.size_s() << int(data.front());
|
// piCoutObj << "sendInternal to" << to << data.size_s() << int(data.front());
|
||||||
if (!sendToNeighbour(dp, ba)) return false;
|
if (!sendToNeighbour(dp, ba)) {
|
||||||
|
//piCoutObj << "send error";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,19 +412,18 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
|||||||
PIString from, to;
|
PIString from, to;
|
||||||
ba >> type;
|
ba >> type;
|
||||||
PIMutexLocker locker(eth_mutex);
|
PIMutexLocker locker(eth_mutex);
|
||||||
//piCoutObj << "received data from" << from << "packet" << type;
|
|
||||||
if (type == 5) { // ping request
|
if (type == 5) { // ping request
|
||||||
PIString addr;
|
PIString addr;
|
||||||
PISystemTime time;
|
PISystemTime time;
|
||||||
ba >> to >> from >> addr >> time;
|
ba >> to >> from >> addr >> time;
|
||||||
//piCout << "ping request" << to << from << addr;
|
// piCout << "ping request" << to << from << addr;
|
||||||
PIMutexLocker plocker(peers_mutex);
|
PIMutexLocker plocker(peers_mutex);
|
||||||
if (from == self_info.name) { // send ping back
|
if (from == self_info.name) { // send ping back
|
||||||
const PeerInfo * pi = getPeerByName(to);
|
const PeerInfo * pi = getPeerByName(to);
|
||||||
if (pi) {
|
if (pi) {
|
||||||
if (pi->isNeighbour()) {
|
if (pi->isNeighbour()) {
|
||||||
sba << int(6) << to << from << addr << time;
|
sba << int(6) << to << from << addr << time;
|
||||||
//piCout << " ping from" << from << addr << ", send back to" << pi->name;
|
// piCout << " ping from" << from << addr << ", send back to" << pi->name;
|
||||||
send_mutex.lock();
|
send_mutex.lock();
|
||||||
piForeachC (PeerInfo::Address & a, pi->addresses) {
|
piForeachC (PeerInfo::Address & a, pi->addresses) {
|
||||||
if (eth_send.send(a.address, sba))
|
if (eth_send.send(a.address, sba))
|
||||||
@@ -434,7 +439,7 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
|||||||
PIString addr;
|
PIString addr;
|
||||||
PISystemTime time, ptime, ctime = PISystemTime::current(true);
|
PISystemTime time, ptime, ctime = PISystemTime::current(true);
|
||||||
ba >> to >> from >> addr >> time;
|
ba >> to >> from >> addr >> time;
|
||||||
//piCout << "ping reply" << to << from << addr;
|
// piCout << "ping reply" << to << from << addr;
|
||||||
PIMutexLocker plocker(peers_mutex);
|
PIMutexLocker plocker(peers_mutex);
|
||||||
if (to == self_info.name) { // ping echo
|
if (to == self_info.name) { // ping echo
|
||||||
piForeach (PeerInfo & p, peers) {
|
piForeach (PeerInfo & p, peers) {
|
||||||
@@ -448,13 +453,14 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
|||||||
a.wait_ping = false;
|
a.wait_ping = false;
|
||||||
if (a.ping < 0) a.ping = ptime.toMilliseconds();
|
if (a.ping < 0) a.ping = ptime.toMilliseconds();
|
||||||
else a.ping = 0.6 * a.ping + 0.4 * ptime.toMilliseconds();
|
else a.ping = 0.6 * a.ping + 0.4 * ptime.toMilliseconds();
|
||||||
//piCout << " ping echo" << p.name << a.address << a.ping;
|
// piCout << " ping echo" << p.name << a.address << a.ping;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// piCoutObj << "received data from" << from << "packet" << type;
|
||||||
if (type != 4) return true;
|
if (type != 4) return true;
|
||||||
diag_d.received(size);
|
diag_d.received(size);
|
||||||
ba >> from >> to >> cnt >> pba;
|
ba >> from >> to >> cnt >> pba;
|
||||||
@@ -731,24 +737,25 @@ void PIPeer::sendPeerRemove(const PIString & peer) {
|
|||||||
|
|
||||||
|
|
||||||
void PIPeer::pingNeighbours() {
|
void PIPeer::pingNeighbours() {
|
||||||
|
PIMutexLocker ml(peers_mutex);
|
||||||
PIByteArray ba, sba;
|
PIByteArray ba, sba;
|
||||||
ba << int(5) << self_info.name;
|
ba << int(5) << self_info.name;
|
||||||
//piCout << "*** pingNeighbours" << peers.size() << "...";
|
// piCoutObj << "*** pingNeighbours" << peers.size() << "...";
|
||||||
piForeach (PeerInfo & p, peers) {
|
piForeach (PeerInfo & p, peers) {
|
||||||
if (!p.isNeighbour()) continue;
|
if (!p.isNeighbour()) continue;
|
||||||
//piCout << " ping neighbour" << p.name << p.ping();
|
//piCout << " ping neighbour" << p.name << p.ping();
|
||||||
send_mutex.lock();
|
send_mutex.lock();
|
||||||
piForeach (PeerInfo::Address & a, p.addresses) {
|
piForeach (PeerInfo::Address & a, p.addresses) {
|
||||||
//piCout << " address" << a.address << a.wait_ping;
|
// piCout << " address" << a.address << a.wait_ping;
|
||||||
if (a.wait_ping) {
|
if (a.wait_ping) {
|
||||||
if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= 5.)
|
if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= _PIPEER_PING_TIMEOUT)
|
||||||
continue;
|
continue;
|
||||||
a.ping = -1.;
|
a.ping = -1.;
|
||||||
}
|
}
|
||||||
a.wait_ping = true;
|
a.wait_ping = true;
|
||||||
sba = ba;
|
sba = ba;
|
||||||
sba << p.name << a.address << PISystemTime::current(true);
|
sba << p.name << a.address << PISystemTime::current(true);
|
||||||
//piCout << "ping" << p.name << a.address << a.last_ping;
|
// piCout << "ping" << p.name << a.address << a.last_ping;
|
||||||
if (eth_send.send(a.address, sba))
|
if (eth_send.send(a.address, sba))
|
||||||
diag_s.sended(sba.size_s());
|
diag_s.sended(sba.size_s());
|
||||||
}
|
}
|
||||||
@@ -797,7 +804,6 @@ void PIPeer::syncPeers() {
|
|||||||
cp._data->setDist(cp.dist + 1);
|
cp._data->setDist(cp.dist + 1);
|
||||||
cp.was_update = false;
|
cp.was_update = false;
|
||||||
}
|
}
|
||||||
pingNeighbours();
|
|
||||||
if (change) buildMap();
|
if (change) buildMap();
|
||||||
self_info.cnt++;
|
self_info.cnt++;
|
||||||
self_info.time = PISystemTime::current();
|
self_info.time = PISystemTime::current();
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ void Daemon::TileFileProgress::tileEvent(PIScreenTile * t, TileEvent e) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Daemon::Daemon(): inited__(false), PIPeer(pisd_prefix + PISystemInfo::instance()->hostname + "_" + PIString(rand() % 100)), fm(this) {
|
Daemon::Daemon(): inited__(false), PIPeer(pisd_prefix + PISystemInfo::instance()->hostname + "_" + PIString(rand() % 100)) {
|
||||||
// setName("Daemon");
|
// setName("Daemon");
|
||||||
dtimer.setName("__S__Daemon_timer");
|
dtimer.setName("__S__Daemon_timer");
|
||||||
mode = offset = cur = height = 0;
|
mode = offset = cur = height = 0;
|
||||||
@@ -608,13 +608,14 @@ void Daemon::closeFileDialog(const PIString & p_name, bool ok) {
|
|||||||
|
|
||||||
void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
|
void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
|
||||||
//if (conn_name != from) return;
|
//if (conn_name != from) return;
|
||||||
|
// piCout << "rec" << data.size();
|
||||||
if (data.size() < 4) return;
|
if (data.size() < 4) return;
|
||||||
PIMutexLocker ml(remote_mutex);
|
PIMutexLocker ml(remote_mutex);
|
||||||
PIByteArray ba(data), rba;
|
PIByteArray ba(data), rba;
|
||||||
Remote * r = remotes.value(from);
|
Remote * r = remotes.value(from);
|
||||||
PIString dir;
|
PIString dir;
|
||||||
int type; ba >> type;
|
int type; ba >> type;
|
||||||
//piCout << "rec from " << from << type << r;
|
// piCout << "rec from " << from << type << r;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case RequestHostInfo:
|
case RequestHostInfo:
|
||||||
makeMyHostInfo();
|
makeMyHostInfo();
|
||||||
@@ -626,7 +627,7 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
|
|||||||
r->dir_my.cd(dir);
|
r->dir_my.cd(dir);
|
||||||
r->ft.setDirectory(r->dir_my);
|
r->ft.setDirectory(r->dir_my);
|
||||||
//piCout << "store to" << r->dir_my.absolutePath();
|
//piCout << "store to" << r->dir_my.absolutePath();
|
||||||
piCout << "cd to" << r->dir_my.absolutePath();
|
piCoutObj << "cd to" << r->dir_my.absolutePath();
|
||||||
r->updateDir();
|
r->updateDir();
|
||||||
// sendDirToRemote(r);
|
// sendDirToRemote(r);
|
||||||
break;
|
break;
|
||||||
@@ -737,7 +738,6 @@ void Daemon::makeOtherHostInfo() {
|
|||||||
void Daemon::requestChDir(const PIString & d) {
|
void Daemon::requestChDir(const PIString & d) {
|
||||||
if (d.isEmpty()) return;
|
if (d.isEmpty()) return;
|
||||||
Remote * r = remotes.value(conn_name, 0);
|
Remote * r = remotes.value(conn_name, 0);
|
||||||
//piCout << "request chdir" << d << conn_name << r;
|
|
||||||
if (d.isEmpty()) return;
|
if (d.isEmpty()) return;
|
||||||
if (!r) return;
|
if (!r) return;
|
||||||
fm.remoteSaveDir();
|
fm.remoteSaveDir();
|
||||||
@@ -745,4 +745,6 @@ void Daemon::requestChDir(const PIString & d) {
|
|||||||
PIByteArray ba;
|
PIByteArray ba;
|
||||||
ba << int(RequestChangeDir) << d;
|
ba << int(RequestChangeDir) << d;
|
||||||
send(conn_name, ba);
|
send(conn_name, ba);
|
||||||
|
// bool ok = send(conn_name, ba);
|
||||||
|
// piCout << "request chdir" << d << conn_name << r << ok;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "file_manager.h"
|
#include "file_manager.h"
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
#include "daemon.h"
|
|
||||||
|
|
||||||
extern PIScreen screen;
|
extern PIScreen screen;
|
||||||
|
|
||||||
@@ -225,10 +224,8 @@ void FileManager::TileDir::resizeEvent(int w, int h) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
FileManager::FileManager(Daemon * d) {
|
FileManager::FileManager() {
|
||||||
setName("FileManager");
|
setName("FileManager");
|
||||||
del_commit = false;
|
|
||||||
daemon = d;
|
|
||||||
CONNECTU(&screen, keyPressed, this, keyEvent)
|
CONNECTU(&screen, keyPressed, this, keyEvent)
|
||||||
//dir.setDir("/home/peri4/Documents");
|
//dir.setDir("/home/peri4/Documents");
|
||||||
TileSimple * tl;
|
TileSimple * tl;
|
||||||
|
|||||||
@@ -4,12 +4,11 @@
|
|||||||
#include "piscreentiles.h"
|
#include "piscreentiles.h"
|
||||||
#include "pidir.h"
|
#include "pidir.h"
|
||||||
|
|
||||||
class Daemon;
|
|
||||||
|
|
||||||
class FileManager: public PIObject {
|
class FileManager: public PIObject {
|
||||||
PIOBJECT(FileManager)
|
PIOBJECT(FileManager)
|
||||||
public:
|
public:
|
||||||
FileManager(Daemon * d = 0);
|
FileManager();
|
||||||
|
|
||||||
PIScreenTile * tile() const;
|
PIScreenTile * tile() const;
|
||||||
PIScreenTile * localTile() const {return panels[0];}
|
PIScreenTile * localTile() const {return panels[0];}
|
||||||
@@ -67,11 +66,8 @@ private:
|
|||||||
EVENT1(tileKey, PIKbdListener::KeyEvent, key)
|
EVENT1(tileKey, PIKbdListener::KeyEvent, key)
|
||||||
static void tileKey_s(void * fm, PIKbdListener::KeyEvent key) {((FileManager*)fm)->tileKey(key);}
|
static void tileKey_s(void * fm, PIKbdListener::KeyEvent key) {((FileManager*)fm)->tileKey(key);}
|
||||||
|
|
||||||
bool del_commit;
|
|
||||||
TileDir * panels[2];
|
TileDir * panels[2];
|
||||||
Daemon * daemon;
|
|
||||||
PIScreenTile * tile_root;
|
PIScreenTile * tile_root;
|
||||||
PIStringList selected;
|
|
||||||
typedef PIPair<PIString, PIString> SSPair;
|
typedef PIPair<PIString, PIString> SSPair;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user