PIPeer important fix!
git-svn-id: svn://db.shs.com.ru/pip@110 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -507,6 +507,9 @@ void PIScreen::run() {
|
||||
tile_dialog->width = sw;
|
||||
tile_dialog->height = sh;
|
||||
tile_dialog->layout();
|
||||
int dx = tile_dialog->x - 1, dy = tile_dialog->y - 1, dw = tile_dialog->width, dh = tile_dialog->height;
|
||||
drawer_.drawFrame(dx, dy, dx + dw + 1, dy + dh + 1, (Color)tile_dialog->back_format.color_char,
|
||||
(Color)tile_dialog->back_format.color_back, (CharFlags)tile_dialog->back_format.flags);
|
||||
tile_dialog->drawEventInternal(&drawer_);
|
||||
}
|
||||
console.print();
|
||||
|
||||
@@ -46,6 +46,58 @@
|
||||
using namespace PIScreenTypes;
|
||||
|
||||
|
||||
PIScreenDrawer::PIScreenDrawer(PIVector<PIVector<Cell> > & c): cells(c) {
|
||||
arts_[LineVertical] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("│");
|
||||
#else
|
||||
PIChar('|');
|
||||
#endif
|
||||
|
||||
arts_[LineHorizontal] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("─");
|
||||
#else
|
||||
PIChar('-');
|
||||
#endif
|
||||
|
||||
arts_[Cross] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("┼");
|
||||
#else
|
||||
PIChar('+');
|
||||
#endif
|
||||
|
||||
arts_[CornerTopLeft] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("┌");
|
||||
#else
|
||||
PIChar('+');
|
||||
#endif
|
||||
|
||||
arts_[CornerTopRight] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("┐");
|
||||
#else
|
||||
PIChar('+');
|
||||
#endif
|
||||
|
||||
arts_[CornerBottomLeft] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("└");
|
||||
#else
|
||||
PIChar('+');
|
||||
#endif
|
||||
|
||||
arts_[CornerBottomRight] =
|
||||
#ifdef PIP_ICU
|
||||
PIChar::fromUTF8("┘");
|
||||
#else
|
||||
PIChar('+');
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void PIScreenDrawer::clear() {
|
||||
for (int i = 0; i < cells.size_s(); ++i)
|
||||
cells[i].fill(Cell());
|
||||
@@ -129,6 +181,44 @@ void PIScreenDrawer::drawRect(int x0, int y0, int x1, int y1, const PIChar & c,
|
||||
}
|
||||
|
||||
|
||||
void PIScreenDrawer::drawFrame(int x0, int y0, int x1, int y1, Color col_char, Color col_back, CharFlags flags_char) {
|
||||
if (x0 == x1 && y0 == y1) return;
|
||||
Cell cc;
|
||||
cc.format.color_char = col_char;
|
||||
cc.format.color_back = col_back;
|
||||
cc.format.flags = flags_char;
|
||||
int dx = x0 < x1 ? 1 : -1;
|
||||
int dy = y0 < y1 ? 1 : -1;
|
||||
int xs[2] = {x0, x1};
|
||||
int ys[2] = {y0, y1};
|
||||
for (int k = 0; k < 2; ++k) {
|
||||
int j = ys[k];
|
||||
if (j >= 0 && j < height) {
|
||||
PIVector<Cell> & cv(cells[j]);
|
||||
cc.symbol = artChar(LineHorizontal);
|
||||
for (int i = x0 + 1; i != x1; i += dx)
|
||||
if (i >= 0 && i < width)
|
||||
cv[i] = cc;
|
||||
}
|
||||
j = xs[k];
|
||||
if (j >= 0 && j < width) {
|
||||
cc.symbol = artChar(LineVertical);
|
||||
for (int i = y0 + 1; i != y1; i += dy)
|
||||
if (i >= 0 && i < height)
|
||||
cells[i][j] = cc;
|
||||
}
|
||||
}
|
||||
int i = x0, j = y0; cc.symbol = artChar(CornerTopLeft);
|
||||
if (i >= 0 && i < width && j >= 0 && j < height) cells[j][i] = cc;
|
||||
i = x1, j = y0; cc.symbol = artChar(CornerTopRight);
|
||||
if (i >= 0 && i < width && j >= 0 && j < height) cells[j][i] = cc;
|
||||
i = x0, j = y1; cc.symbol = artChar(CornerBottomLeft);
|
||||
if (i >= 0 && i < width && j >= 0 && j < height) cells[j][i] = cc;
|
||||
i = x1, j = y1; cc.symbol = artChar(CornerBottomRight);
|
||||
if (i >= 0 && i < width && j >= 0 && j < height) cells[j][i] = cc;
|
||||
}
|
||||
|
||||
|
||||
void PIScreenDrawer::fillRect(int x0, int y0, int x1, int y1, const PIChar & c, Color col_char, Color col_back, CharFlags flags_char) {
|
||||
if (x0 == x1 && y0 == y1) drawPixel(x0, y0, c, col_char, col_back, flags_char);
|
||||
Cell cc;
|
||||
|
||||
@@ -29,19 +29,25 @@
|
||||
class PIP_EXPORT PIScreenDrawer
|
||||
{
|
||||
friend class PIScreen;
|
||||
PIScreenDrawer(PIVector<PIVector<PIScreenTypes::Cell> > & c): cells(c) {}
|
||||
PIScreenDrawer(PIVector<PIVector<PIScreenTypes::Cell> > & c);
|
||||
public:
|
||||
enum ArtChar {LineVertical = 1, LineHorizontal, Cross, CornerTopLeft, CornerTopRight, CornerBottomLeft, CornerBottomRight};
|
||||
|
||||
void clear();
|
||||
void clearRect(int x0, int y0, int x1, int y1) {fillRect(x0, y0, x1, y1, ' ');}
|
||||
void drawPixel(int x, int y, const PIChar & c, PIScreenTypes::Color col_char = PIScreenTypes::Default, PIScreenTypes::Color col_back = PIScreenTypes::Default, PIScreenTypes::CharFlags flags_char = 0);
|
||||
void drawLine(int x0, int y0, int x1, int y1, const PIChar & c, PIScreenTypes::Color col_char = PIScreenTypes::Default, PIScreenTypes::Color col_back = PIScreenTypes::Default, PIScreenTypes::CharFlags flags_char = 0);
|
||||
void drawRect(int x0, int y0, int x1, int y1, const PIChar & c, PIScreenTypes::Color col_char = PIScreenTypes::Default, PIScreenTypes::Color col_back = PIScreenTypes::Default, PIScreenTypes::CharFlags flags_char = 0);
|
||||
void drawFrame(int x0, int y0, int x1, int y1, PIScreenTypes::Color col_char = PIScreenTypes::Default, PIScreenTypes::Color col_back = PIScreenTypes::Default, PIScreenTypes::CharFlags flags_char = 0);
|
||||
void drawText(int x, int y, const PIString & s, PIScreenTypes::Color col_char = PIScreenTypes::Default, PIScreenTypes::Color col_back = PIScreenTypes::Transparent, PIScreenTypes::CharFlags flags_char = 0);
|
||||
void fillRect(int x0, int y0, int x1, int y1, const PIChar & c, PIScreenTypes::Color col_char = PIScreenTypes::Default, PIScreenTypes::Color col_back = PIScreenTypes::Default, PIScreenTypes::CharFlags flags_char = 0);
|
||||
|
||||
PIChar artChar(const ArtChar type) const {return arts_.value(type, PIChar(' '));}
|
||||
|
||||
private:
|
||||
PIVector<PIVector<PIScreenTypes::Cell> > & cells;
|
||||
int width, height;
|
||||
PIMap<ArtChar, PIChar> arts_;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -88,7 +88,6 @@ TileList::TileList(const PIString & n): PIScreenTile(n) {
|
||||
focus_flags = CanHasFocus | NextByArrowsHorizontal | NextByTab;
|
||||
lhei = offset = cur = 0;
|
||||
selection_mode = NoSelection;
|
||||
vert_line = PIChar::fromUTF8("│");
|
||||
}
|
||||
|
||||
|
||||
@@ -101,6 +100,7 @@ void TileList::sizeHint(int & w, int & h) const {
|
||||
|
||||
|
||||
void TileList::drawEvent(PIScreenDrawer * d) {
|
||||
vert_line = d->artChar(PIScreenDrawer::LineVertical);
|
||||
lhei = height - 2;
|
||||
//int osp = piMini(3, lhei / 4);
|
||||
int is = piClampi(offset, 0, piMaxi(0, content.size_s() - 1)), ie = piClampi(offset + lhei, 0, content.size_s());
|
||||
|
||||
@@ -98,7 +98,10 @@ void PIBaseTransfer::received(PIByteArray data) {
|
||||
}
|
||||
if (is_receiving && h.id == 0) {
|
||||
// if (checkSession() == 0 && pt == pt_ReplySuccess) finish_receive(true);
|
||||
if (checkSession() == 0 && pt == pt_ReplySuccess) { piCoutObj << "Success receive"; finish_receive(true);}
|
||||
if (checkSession() == 0 && pt == pt_ReplySuccess) {
|
||||
//piCoutObj << "Success receive";
|
||||
finish_receive(true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case pt_Break:
|
||||
|
||||
@@ -50,7 +50,7 @@ PIPeer::PeerData::~PeerData() {
|
||||
|
||||
|
||||
void PIPeer::PeerData::dtThread() {
|
||||
//piCoutObj << "send DT ...";
|
||||
// << "send DT ...";
|
||||
dt_out.send(data);
|
||||
//piCoutObj << "send DT done";
|
||||
}
|
||||
@@ -71,8 +71,9 @@ void PIPeer::PeerData::receivedPacket(uchar type, const PIByteArray & d) {
|
||||
dt = &dt_in;
|
||||
if (type == 2)
|
||||
dt = &dt_out;
|
||||
//piCoutObj << "DT received" << int(type) << d.size_s();
|
||||
//piCoutObj << "DT received" << int(type) << d.size_s() << "...";
|
||||
if (dt) dt->received(d);
|
||||
//piCoutObj << "DT received" << int(type) << d.size_s() << "done";
|
||||
}
|
||||
|
||||
|
||||
@@ -184,7 +185,6 @@ void PIPeer::initEths(PIStringList al) {
|
||||
ce->setDebug(false);
|
||||
ce->setName("__S__PIPeer_traffic_eth_rec_" + a);
|
||||
ce->setParameters(0);
|
||||
ce->setThreadSafe(true);
|
||||
bool ok = false;
|
||||
for (int p = _PIPEER_TRAFFIC_PORT_S; p < _PIPEER_TRAFFIC_PORT_E; ++p) {
|
||||
ce->setReadAddress(a, p);
|
||||
@@ -370,7 +370,7 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
||||
if (pi) {
|
||||
if (pi->isNeighbour()) {
|
||||
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();
|
||||
piForeachC (PeerInfo::Address & a, pi->addresses) {
|
||||
if (eth_send.send(a.address, sba))
|
||||
@@ -400,7 +400,7 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
||||
a.wait_ping = false;
|
||||
if (a.ping < 0) a.ping = 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;
|
||||
}
|
||||
}
|
||||
@@ -445,7 +445,7 @@ bool PIPeer::dataRead(uchar * readed, int size) {
|
||||
cnt++;
|
||||
if (cnt > _PIPEER_MSG_TTL || from == dp->name) return true;
|
||||
sba << type << from << to << cnt << pba;
|
||||
//piCout << "translate packet" << from << "->" << to << ", ttl =" << cnt;
|
||||
piCout << "translate packet" << from << "->" << to << ", ttl =" << cnt;
|
||||
sendToNeighbour(dp, sba);
|
||||
}
|
||||
return true;
|
||||
@@ -526,6 +526,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
|
||||
//piCoutObj << "rec sync " << rpeers.size_s() << " peers";
|
||||
peers_mutex.lock();
|
||||
if (!self_info.neighbours.contains(pi.name)) {
|
||||
//piCoutObj << "add new nei to me" << pi.name;
|
||||
self_info.addNeighbour(pi.name);
|
||||
PeerInfo * np = peers_map.value(pi.name);
|
||||
if (np) {
|
||||
@@ -569,6 +570,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
|
||||
}
|
||||
if (exist || isRemoved(rpeer)) continue;
|
||||
rpeer.dist++;
|
||||
if (rpeer.name == pi.name) rpeer.dist = 0;
|
||||
rpeer.resetPing();
|
||||
addPeer(rpeer);
|
||||
ch = true;
|
||||
@@ -679,10 +681,10 @@ void PIPeer::sendPeerRemove(const PIString & peer) {
|
||||
void PIPeer::pingNeighbours() {
|
||||
PIByteArray ba, sba;
|
||||
ba << int(5) << self_info.name;
|
||||
//piCout << "pingNeighbours" << peers.size();
|
||||
//piCout << "*** pingNeighbours" << peers.size() << "...";
|
||||
piForeach (PeerInfo & p, peers) {
|
||||
//piCout << " ping neighbour" << p.name << p.ping();
|
||||
if (!p.isNeighbour()) continue;
|
||||
//piCout << " ping neighbour" << p.name << p.ping();
|
||||
send_mutex.lock();
|
||||
piForeach (PeerInfo::Address & a, p.addresses) {
|
||||
//piCout << " address" << a.address << a.wait_ping;
|
||||
@@ -700,6 +702,7 @@ void PIPeer::pingNeighbours() {
|
||||
}
|
||||
send_mutex.unlock();
|
||||
}
|
||||
//piCout << "*** pingNeighbours" << peers.size() << "done";
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -179,6 +179,8 @@ private:
|
||||
// 1 - new peer, 2 - remove peer, 3 - sync peers, 4 - data, 5 - ping request, 6 - ping reply
|
||||
// Data packet: 4, from, to, ticks, data_size, data
|
||||
|
||||
protected:
|
||||
|
||||
typedef PIPair<PIString, PIVector<PeerInfo * > > napair;
|
||||
|
||||
PIVector<PIEthernet * > eths_traffic, eths_mcast, eths_bcast;
|
||||
|
||||
@@ -47,6 +47,7 @@ PIMutex::PIMutex() {
|
||||
pthread_mutex_init(&mutex, &attr);
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
#endif
|
||||
locked = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -56,6 +57,7 @@ PIMutex::~PIMutex() {
|
||||
#else
|
||||
pthread_mutex_destroy(&mutex);
|
||||
#endif
|
||||
locked = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +67,7 @@ void PIMutex::lock() {
|
||||
#else
|
||||
pthread_mutex_lock(&mutex);
|
||||
#endif
|
||||
locked = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,13 +77,22 @@ void PIMutex::unlock() {
|
||||
#else
|
||||
pthread_mutex_unlock(&mutex);
|
||||
#endif
|
||||
locked = false;
|
||||
}
|
||||
|
||||
|
||||
bool PIMutex::tryLock() {
|
||||
bool ret =
|
||||
#ifdef WINDOWS
|
||||
return (WaitForSingleObject(mutex, 0) == WAIT_OBJECT_0);
|
||||
(WaitForSingleObject(mutex, 0) == WAIT_OBJECT_0);
|
||||
#else
|
||||
return (pthread_mutex_trylock(&mutex) == 0);
|
||||
(pthread_mutex_trylock(&mutex) == 0);
|
||||
#endif
|
||||
locked = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
bool PIMutex::isLocked() const {
|
||||
return locked;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,9 @@ public:
|
||||
//! If mutex is already locked function returns immediate an returns "false"
|
||||
bool tryLock();
|
||||
|
||||
//! Returns if mutex is locked
|
||||
bool isLocked() const;
|
||||
|
||||
private:
|
||||
#ifdef WINDOWS
|
||||
void *
|
||||
@@ -56,6 +59,7 @@ private:
|
||||
pthread_mutex_t
|
||||
#endif
|
||||
mutex;
|
||||
bool locked;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -136,6 +136,8 @@ void Daemon::TileFileProgress::show(PIFileTransfer * f) {
|
||||
if (ft) {
|
||||
conn_name = ft->name();
|
||||
::screen.setDialogTile(this);
|
||||
label_file->content[0].first = "Preparing ...";
|
||||
prog_file->value = prog_all->value = 0;
|
||||
buttons->cur = 0;
|
||||
buttons->setFocus();
|
||||
tm.reset();
|
||||
@@ -522,7 +524,7 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
|
||||
r->dir_my.cd(dir);
|
||||
r->ft.setDirectory(r->dir_my);
|
||||
//piCout << "store to" << r->dir_my.absolutePath();
|
||||
piCout << "cd to" << dir << ", abs =" << r->dir_my.absolutePath();
|
||||
//piCout << "cd to" << dir << ", abs =" << r->dir_my.absolutePath();
|
||||
sendDirToRemote(r);
|
||||
break;
|
||||
case ReplyHostInfo:
|
||||
|
||||
@@ -52,6 +52,9 @@ public:
|
||||
|
||||
PIScreenTile * tile() const;
|
||||
|
||||
bool lockedEth() const {return eth_mutex.isLocked();}
|
||||
bool lockedPeers() const {return peers_mutex.isLocked();}
|
||||
|
||||
private:
|
||||
enum PacketType {
|
||||
RequestHostInfo = 10,
|
||||
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
CONNECTU(&screen, keyPressed, this, keyEvent)
|
||||
CONNECTU(&file_manager, menuRequest, this, menuRequest)
|
||||
CONNECTU(&daemon_, menuRequest, this, menuRequest)
|
||||
start(100);
|
||||
start(10);
|
||||
}
|
||||
PIScreenTile * menuTile() {
|
||||
TileList * ret = new TileList();
|
||||
@@ -127,6 +127,7 @@ public:
|
||||
return ret;
|
||||
}
|
||||
void updatePeerInfo() {
|
||||
bool pm = daemon_.lockedPeers();
|
||||
screen.lock();
|
||||
daemon_.lock();
|
||||
peers_tl->content.clear();
|
||||
@@ -134,8 +135,8 @@ public:
|
||||
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());
|
||||
" [em = " + PIString::fromBool(daemon_.lockedEth()) + ", "
|
||||
"pm = " + PIString::fromBool(pm) + "]", CellFormat());
|
||||
piForeachC(PIPeer::PeerInfo &p , daemon_.allPeers())
|
||||
peers_tl->content << TileList::Row(p.name + " | d = " + PIString::fromNumber(p.dist) +
|
||||
" | p = " + PIString::fromNumber(p.ping()) +
|
||||
|
||||
Reference in New Issue
Block a user