git-svn-id: svn://db.shs.com.ru/pip@228 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2016-08-18 08:12:43 +00:00
parent 9480d209b4
commit 2ff58602fe
5 changed files with 71 additions and 130 deletions

View File

@@ -35,20 +35,36 @@ void Daemon::Remote::startAction(Daemon::PacketType a, const PIString & dir, con
void Daemon::Remote::run() {
PIDir d(dir_my);
switch (action) {
case CopyFiles: ft.send(_fl); break;
case RemoveFiles:
{
PIDir d(dir_my);
::removeFiles(d, _fl);
removeFinished(name(), d.absolutePath());
}
case CopyFiles:
ft.send(_fl);
break;
default: break;
case RemoveFiles:
::removeFiles(d, _fl);
updateDirEntries();
removeFinished(name(), d.absolutePath());
break;
case RequestChangeDir:
updateDirEntries();
changeDirFinished(name(), d.absolutePath());
break;
case MkDir:
if (!_fl.isEmpty()) PIDir::make(d.absolutePath() + PIDir::separator + _fl.at(0));
updateDirEntries();
changeDirFinished(name(), d.absolutePath());
break;
default: break;
};
}
void Daemon::Remote::updateDirEntries() {
my_filelist = dir_my.entries();
piForeach (PIFile::FileInfo & f, my_filelist) f.path = f.name();
}
Daemon::TileFileProgress::TileFileProgress(): PIScreenTile() {
size_policy = PIScreenTypes::Fixed;
@@ -147,11 +163,13 @@ void Daemon::TileFileProgress::show(PIFileTransfer * f) {
void Daemon::TileFileProgress::close(bool ok) {
buttons->content[0].first = "Pause";
ft = 0;
if (!ok)
showInfo("Achtung! Alarm!! Error!!!");
else
::screen.setDialogTile(0);
::screen.setDialogTile(0);
if (!ok) {
piCout << "Achtung! Alarm!! Error!!!";
showInfo("Error while files transfer...");
}
}
@@ -335,7 +353,6 @@ void Daemon::keyEvent(PIKbdListener::KeyEvent key) {
void Daemon::fmKeyEvent(PIKbdListener::KeyEvent key) {
PIByteArray ba;
PIMutexLocker ml(remote_mutex);
//Remote * r = remotes.value(conn_name);
//piCout << key.key << key.modifiers;
@@ -449,10 +466,11 @@ void Daemon::peerConnected(const PIString & name) {
if (!name.startsWith(pisd_prefix)) return;
Remote * r = new Remote(name);
CONNECTU(r, sendRequest, this, sendRequest)
CONNECTU(r, receiveFinished, this, filesReceived)
CONNECTU(r, receiveFinished, this, filesRreceived)
CONNECTU(r, receiveFinished, this, closeFileDialog)
CONNECTU(r, sendFinished, this, closeFileDialog)
CONNECTU(r, removeFinished, this, filesRemoved)
CONNECTU(r, changeDirFinished, this, dirChanged)
PIMutexLocker ml(remote_mutex);
remotes.insert(name, r);
}
@@ -474,7 +492,19 @@ void Daemon::peerDisconnected(const PIString & name) {
void Daemon::filesReceived(const PIString & name, bool ok) {
PIMutexLocker ml(remote_mutex);
Remote * r = remotes.value(name, 0);
if (!r) return;
r->updateDir();
}
void Daemon::dirChanged(const PIString & name, const PIString & dir) {
PIMutexLocker ml(remote_mutex);
Remote * r = remotes.value(name, 0);
if (!r) return;
if (r->dir_my.absolutePath() != dir) return;
sendDirToRemote(r);
}
@@ -491,7 +521,7 @@ void Daemon::closeFileDialog(const PIString & name, bool ok) {
//piCout << "CLOSE" << tile_file_progress->conn_name << name << ok;
if (tile_file_progress->conn_name != name) return;
tile_file_progress->close(ok);
if (ok) {
// if (ok) {
if (tile_file_progress->rec) {
fm.remoteTile()->setFocus();
fm.clearSelectionRemote();
@@ -501,7 +531,7 @@ void Daemon::closeFileDialog(const PIString & name, bool ok) {
fm.clearSelectionLocal();
requestChDir(".");
}
}
// }
}
@@ -526,7 +556,8 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
r->ft.setDirectory(r->dir_my);
//piCout << "store to" << r->dir_my.absolutePath();
//piCout << "cd to" << dir << ", abs =" << r->dir_my.absolutePath();
sendDirToRemote(r);
r->updateDir();
// sendDirToRemote(r);
break;
case ReplyHostInfo:
ba >> info_other;
@@ -538,7 +569,7 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
{
PIVector<PIFile::FileInfo> fil;
ba >> dir >> fil;
r->dir_remote.setDir(dir);
// r->dir_remote.setDir(dir);
fm.setRemoteDir(dir);
fm.setRemoteContent(fil);
fm.remoteRestoreDir();
@@ -571,8 +602,7 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
PIString dn;
ba >> dn;
//piCout << "send" << files << "from" << r->dir_my.absolutePath();
PIDir::make(r->dir_my.absolutePath() + PIDir::separator + dn);
sendDirToRemote(r);
r->makeDir(dn);
}
break;
case FileTransfer:
@@ -585,9 +615,7 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) {
void Daemon::sendDirToRemote(Remote * r) {
if (!r) return;
PIVector<PIFile::FileInfo> fil = r->dir_my.entries();
piForeach (PIFile::FileInfo & f, fil)
f.path = f.name();
PIVector<PIFile::FileInfo> fil = r->my_filelist;
PIByteArray ba;
ba << int(ReplyChangeDir) << r->dir_my.absolutePath() << fil;
send(r->name(), ba);

View File

@@ -80,6 +80,8 @@ private:
~Remote();
void sendFiles(const PIString & dir, const PIStringList & fl) {startAction(Daemon::CopyFiles, dir, fl);}
void removeFiles(const PIStringList & fl) {startAction(Daemon::RemoveFiles, PIString(), fl);}
void updateDir() {startAction(Daemon::RequestChangeDir, PIString(), PIStringList());}
void makeDir(const PIString & dir) {startAction(Daemon::MkDir, dir, PIStringList() << "");}
EVENT_HANDLER1(void, ftSendRequest, PIByteArray &, data) {PIByteArray h; h << int(FileTransfer); data.insert(0, h); sendRequest(name(), data);}
EVENT_HANDLER1(void, ftReceived, bool, ok) {receiveFinished(name(), ok);}
EVENT_HANDLER1(void, ftSended, bool, ok) {sendFinished(name(), ok);}
@@ -88,15 +90,20 @@ private:
EVENT2(receiveFinished, const PIString & , name, bool, ok)
EVENT2(sendFinished, const PIString & , name, bool, ok)
EVENT2(removeFinished, const PIString & , name, const PIString & , dir)
EVENT2(changeDirFinished, const PIString & , name, const PIString & , dir)
EVENT_HANDLER1(void, received, const PIByteArray & , data) {ft.received(data);}
void startAction(PacketType a, const PIString & dir, const PIStringList & fl);
void run();
PIDir dir_my, dir_remote;
PIDir dir_my;
PIVector<PIFile::FileInfo> my_filelist;
PIFileTransfer ft;
PIStringList _fl;
PacketType action;
private:
void updateDirEntries();
};
class TileFileProgress: public PIScreenTile {
@@ -126,6 +133,7 @@ private:
EVENT_HANDLER2(void, timerEvent, void * , _d, int, delim);
EVENT_HANDLER2(void, filesReceived, const PIString & , name, bool, ok);
EVENT_HANDLER2(void, filesRemoved, const PIString & , name, const PIString & , dir);
EVENT_HANDLER2(void, dirChanged, const PIString & , name, const PIString & , dir);
EVENT_HANDLER2(void, closeFileDialog, const PIString & , name, bool, ok);
EVENT(menuRequest)
void hideAll();

View File

@@ -38,6 +38,11 @@ bool FileManager::TileDir::keyEvent(PIKbdListener::KeyEvent key) {
actionRequest(remote, Copy, selectedNames());
}
break;
case PIKbdListener::F6:
if (key.modifiers[PIKbdListener::Shift]) {
askQuestion("Crypt selected files?");
}
break;
case PIKbdListener::F7:
nd = askNewDir();
setFocus();
@@ -121,7 +126,7 @@ void FileManager::TileDir::showReading() {
void FileManager::TileDir::setContent(const PIVector<PIFile::FileInfo> & l) {
PIMutexLocker ml(e_mutex);
PIVector<PIFile::FileInfo> el = dir.entries(), fl, dl;
PIVector<PIFile::FileInfo> fl, dl;
entries.clear();
if (l.isEmpty()) {
PIFile::FileInfo fi;
@@ -326,108 +331,5 @@ void FileManager::keyEvent(PIKbdListener::KeyEvent key) {
break;
default: break;
}
/*if (!enabled) return;
if (key.key == 'D') {
if (cur >= files.size_s() || cur < 0) return;
if (del_commit) {
piForeachC (PIString & f, selected) {
PIFile::remove(dir.absolutePath() + PIDir::separator + f);
//piCout << "remove" << (dir.absolutePath() + PIDir::separator + f);
}
selected.clear();
updateDir();
console.clearCustomStatus();
del_commit = false;
} else {
if (selected.isEmpty()) selected << files[cur].path;
console.addCustomStatus("Delete " + PIString(selected.size_s()) + " file, are you sure? D as yes");
del_commit = true;
}
updateConsole();
return;
}
console.clearCustomStatus();
del_commit = false;
PIStringList nsel;
switch (key.key) {
case PIKbdListener::UpArrow:
cur--;
if (cur < 0) cur = 0;
if (cur - offset < 3) offset--;
if (offset < 0) offset = 0;
updateConsole();
break;
case PIKbdListener::Space:
if (cur < 0 || cur >= files.size_s()) return;
if (selected.contains(files[cur].path)) selected.removeOne(files[cur].path);
else selected << files[cur].path;
case PIKbdListener::DownArrow:
cur++;
if (cur >= files.size_s()) cur = files.size_s() - 1;
if (cur - offset >= height - 3) offset++;
if (offset >= files.size_s() - height) offset = files.size_s() - height;
updateConsole();
//piCout << offset << files.size_s() << height;
break;
case PIKbdListener::Home:
cur = offset = 0;
updateConsole();
break;
case PIKbdListener::End:
cur = files.size_s() - 1;
offset = files.size_s() - height;
updateConsole();
//piCout << offset << files.size_s() << height;
break;
case PIKbdListener::Return:
if (cur < files.size_s() && cur >= 0) {
piCout << files[cur];
if (files[cur].isDir()) {
prev_pos[dir.path()] = cur;
prev_off[dir.path()] = offset;
dir.cd(files[cur].name());
cur = prev_pos.value(dir.path(), 0);
offset = prev_off.value(dir.path(), 0);
selected.clear();
updateDir();
updateConsole();
}
}
break;
case 'A':
selected.clear();
piForeach (PIFile::FileInfo & e, files)
selected << e.path;
updateConsole();
break;
case 'R':
updateDir();
piForeach (PIFile::FileInfo & e, files)
if (selected.contains(e.path))
nsel << e.path;
selected = nsel;
updateConsole();
break;
case PIKbdListener::Esc:
//selected.clear();
//updateConsole();
menuRequest();
break;
default: break;
}*/
}
void FileManager::updateConsole() {
/*if (!enabled) return;
startTab(2);
console.addString("File manager", 1, Yellow | Inverse);
console.addString("Path: " + dir.absolutePath(), 1, Green | Inverse | Bold);
console.addString("Name", 1, Green | Inverse | Bold);
console.addString(" ", 2, Yellow | Inverse);
console.addString(" ", 2, Green | Inverse);
console.addString(" ", 2, Green | Inverse);
buildNames();
console.addString("A - select all, D - remove, R - refresh, Esc - exit", 1, Green | Inverse | Bold);
finishTab();*/
}

View File

@@ -63,7 +63,6 @@ private:
EVENT_HANDLER1(void, keyEvent, PIKbdListener::KeyEvent, key);
EVENT1(tileKey, PIKbdListener::KeyEvent, key)
static void tileKey_s(void * fm, PIKbdListener::KeyEvent key) {((FileManager*)fm)->tileKey(key);}
void updateConsole();
bool del_commit;
TileDir * panels[2];

View File

@@ -237,6 +237,10 @@ public:
}
}
EVENT_HANDLER1(void, keyEvent, PIKbdListener::KeyEvent, e) {
if (e.key == PIKbdListener::Esc && e.modifiers[PIKbdListener::Shift]) {
PIKbdListener::exiting = true;
return;
}
if (screen.dialogTile()) return;
if (tpeer->visible || tinfo->visible || tpeerdiag->visible)
if (e.key == PIKbdListener::Esc) menuRequest();