PIString fix

git-svn-id: svn://db.shs.com.ru/pip@44 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
2015-03-30 08:49:19 +00:00
parent 8c051235aa
commit 595543bea9
8 changed files with 301 additions and 69 deletions

View File

@@ -10,6 +10,7 @@ Daemon::Daemon(): PIPeer("_pisd_" + PISystemInfo::instance()->hostname + "_" + P
mode = offset = cur = height = 0;
CONNECTU(&screen, keyPressed, this, keyEvent)
CONNECTU(&timer, tickEvent, this, timerEvent)
CONNECTU(&fm, tileKey, this, fmKeyEvent)
timer.addDelimiter(5);
timer.start(200);
@@ -35,6 +36,7 @@ Daemon::Daemon(): PIPeer("_pisd_" + PISystemInfo::instance()->hostname + "_" + P
tile_info = new TileSimple("daemon info");
tile_info->hide();
fm.setRemote(true);
tile_fm = fm.tile();
tile_fm->hide();
@@ -49,6 +51,14 @@ Daemon::Daemon(): PIPeer("_pisd_" + PISystemInfo::instance()->hostname + "_" + P
}
Daemon::~Daemon() {
PIVector<Remote*> rl = remotes.values();
piForeach (Remote * r, rl)
delete r;
remotes.clear();
}
PIScreenTile * Daemon::tile() const {
return tile_root;
}
@@ -110,7 +120,11 @@ void Daemon::tileEvent(PIScreenTile * t, TileEvent e) {
if (e.type == TileList::RowPressed) {
switch (e.data.toInt()) {
case 0: mode = 2; showTile(tile_info, "Information"); break;
case 1: mode = 3; showTile(tile_fm, "File manager"); break;
case 1:
mode = 3;
showTile(tile_fm, "File manager");
requestChDir(".");
break;
default: break;
}
}
@@ -141,6 +155,26 @@ void Daemon::keyEvent(PIKbdListener::KeyEvent key) {
}
void Daemon::fmKeyEvent(PIKbdListener::KeyEvent key) {
PIByteArray ba;
//Remote * r = remotes.value(conn_name);
//piCout << key.key << key.modifiers;
switch (key.key) {
case PIKbdListener::Return:
{
PIFile::FileInfo fi = fm.currentRemoteEntry();
if (!fi.isDir()) break;
requestChDir(fi.name());
}
break;
case 'R':
requestChDir(".");
break;
default: break;
}
}
void Daemon::timerEvent(void * _d, int delim) {
screen.lock();
list_daemons->content.clear();
@@ -192,6 +226,10 @@ void Daemon::peerConnected(const PIString & name) {
/*piCout << "connected" << name;
mode = 2;
conn_name = name;*/
Remote * r = new Remote(name);
CONNECTU(&(r->dt), sendRequest, this, dtSendRequest)
CONNECTU(&(r->dt), receiveFinished, this, dtReceived)
remotes.insert(name, r);
}
@@ -199,6 +237,26 @@ void Daemon::peerDisconnected(const PIString & name) {
if (name == conn_name) {
disconnect();
}
Remote * dt = remotes.value(name);
if (dt) delete dt;
remotes.remove(name);
}
void Daemon::dtSendRequest(PIByteArray & data) {
PIDataTransfer * dt = (PIDataTransfer*)emitter();
if (!dt) return;
PIByteArray hdr; hdr << int(DataTransfer);
data.insert(0, hdr);
send(dt->name(), data);
}
void Daemon::dtReceived(bool ok) {
if (!ok) return;
PIDataTransfer * dt = (PIDataTransfer*)emitter();
if (!dt) return;
dataReceived(emitter()->name(), dt->data());
}
@@ -206,6 +264,8 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
//if (conn_name != from) return;
if (data.size() < 4) return;
PIByteArray ba(data), rba;
Remote * r(0);
PIString dir;
int type; ba >> type;
//std::cout << "rec from " << from << type;
switch (type) {
@@ -213,11 +273,40 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
makeMyHostInfo();
rba << int(ReplyHostInfo) << info_my;
break;
case RequestChangeDir:
r = remotes.value(from);
if (!r) break;
ba >> dir;
r->dir.cd(dir);
{
PIVector<PIFile::FileInfo> fil = r->dir.entries();
piForeach (PIFile::FileInfo & f, fil)
f.path = f.name();
rba << int(ReplyChangeDir) << r->dir.absolutePath() << fil;
}
break;
case ReplyHostInfo:
ba >> info_other;
makeOtherHostInfo();
fillInfoTile(info_other);
break;
case ReplyChangeDir:
r = remotes.value(from);
if (!r) break;
{
PIVector<PIFile::FileInfo> fil;
ba >> dir >> fil;
r->dir.setDir(dir);
fm.setRemoteDir(dir);
fm.setRemoteContent(fil);
fm.remoteRestoreDir();
}
break;
case DataTransfer:
r = remotes.value(from);
if (r)
r->dt.received(ba);
break;
};
if (!rba.isEmpty()) send(from, rba);
}
@@ -310,3 +399,14 @@ void Daemon::tabInfo() {
console.addVariable("of this process", &sys_mon_other, 2);
finishTab();*/
}
void Daemon::requestChDir(const PIString & d) {
if (d.isEmpty()) return;
fm.remoteSaveDir();
fm.readingRemote();
PIByteArray ba;
ba << int(RequestChangeDir) << d;
send(conn_name, ba);
//piCout << "request chdir" << d;
}