PIString fix
git-svn-id: svn://db.shs.com.ru/pip@44 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user