From 2ff58602feb65df68b1fb63ea7df0cc157a28692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 18 Aug 2016 08:12:43 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@228 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- utils/system_daemon/daemon.cpp | 76 ++++++++++++------ utils/system_daemon/daemon.h | 10 ++- utils/system_daemon/file_manager.cpp | 110 ++------------------------- utils/system_daemon/file_manager.h | 1 - utils/system_daemon/main.cpp | 4 + 5 files changed, 71 insertions(+), 130 deletions(-) diff --git a/utils/system_daemon/daemon.cpp b/utils/system_daemon/daemon.cpp index 420018b4..8e6ac701 100644 --- a/utils/system_daemon/daemon.cpp +++ b/utils/system_daemon/daemon.cpp @@ -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 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 fil = r->dir_my.entries(); - piForeach (PIFile::FileInfo & f, fil) - f.path = f.name(); + PIVector fil = r->my_filelist; PIByteArray ba; ba << int(ReplyChangeDir) << r->dir_my.absolutePath() << fil; send(r->name(), ba); diff --git a/utils/system_daemon/daemon.h b/utils/system_daemon/daemon.h index fca4c11a..6d234e1a 100644 --- a/utils/system_daemon/daemon.h +++ b/utils/system_daemon/daemon.h @@ -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 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(); diff --git a/utils/system_daemon/file_manager.cpp b/utils/system_daemon/file_manager.cpp index 46b194f1..cfbb8ef0 100644 --- a/utils/system_daemon/file_manager.cpp +++ b/utils/system_daemon/file_manager.cpp @@ -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 & l) { PIMutexLocker ml(e_mutex); - PIVector el = dir.entries(), fl, dl; + PIVector 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();*/ -} diff --git a/utils/system_daemon/file_manager.h b/utils/system_daemon/file_manager.h index cf0344bc..a1b7126e 100644 --- a/utils/system_daemon/file_manager.h +++ b/utils/system_daemon/file_manager.h @@ -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]; diff --git a/utils/system_daemon/main.cpp b/utils/system_daemon/main.cpp index a72d6396..278eea14 100755 --- a/utils/system_daemon/main.cpp +++ b/utils/system_daemon/main.cpp @@ -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();