From fb25f8dbfeb9f026e62c0a33d9fb1414afb1cb6b 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: Tue, 23 Aug 2016 13:24:12 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@236 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src/io/pibinarylog.h | 2 +- src/io/piethernet.cpp | 6 ++- src/io/pifile.cpp | 31 +++++++------- src/io/piiodevice.cpp | 2 +- src/io/piiodevice.h | 9 +---- src/io/pipacketextractor.cpp | 4 +- src/io/pipacketextractor.h | 2 +- src/io/piserial.cpp | 10 ++--- src/io/piserial.h | 2 +- src/io/piusb.cpp | 8 ++-- utils/system_daemon/daemon.cpp | 60 ++++++++++++++++++++++------ utils/system_daemon/daemon.h | 4 +- utils/system_daemon/file_manager.cpp | 7 +++- utils/system_daemon/file_manager.h | 2 +- utils/system_daemon/shared.cpp | 42 ++++++++++++++++++- utils/system_daemon/shared.h | 2 + 16 files changed, 136 insertions(+), 57 deletions(-) diff --git a/src/io/pibinarylog.h b/src/io/pibinarylog.h index 41acc086..85a694f9 100644 --- a/src/io/pibinarylog.h +++ b/src/io/pibinarylog.h @@ -188,7 +188,7 @@ public: llong logSize() const {return file.size();} //! Return true, if position at the end of BinLog file - bool isEnd() const {if (!opened_) return true; return file.isEnd();} + bool isEnd() const {if (isClosed()) return true; return file.isEnd();} //! Returns if BinLog file is empty bool isEmpty() const {return (file.size() <= PIBINARYLOG_SIGNATURE_SIZE + 1);} diff --git a/src/io/piethernet.cpp b/src/io/piethernet.cpp index fa867de3..b1518c42 100755 --- a/src/io/piethernet.cpp +++ b/src/io/piethernet.cpp @@ -123,7 +123,8 @@ PIEthernet::PIEthernet(int sock_, PIString ip_port): PIIODevice("", ReadWrite) { construct(); parseAddress(ip_port, &ip_s, &port_s); sock = sock_; - init_ = opened_ = connected_ = true; + opened_ = connected_ = true; + init(); setParameters(PIEthernet::ReuseAddress | PIEthernet::MulticastLoop); setType(TCP_Client, false); setPath(ip_port); @@ -157,6 +158,7 @@ void PIEthernet::construct() { bool PIEthernet::init() { + if (isOpened()) return true; //cout << "init " << type_ << endl; if (sock_s == sock) sock_s = -1; @@ -348,7 +350,7 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) { piCoutObj << "Only UDP sockets can join multicast groups"; return false; } - if (!opened_) { + if (isClosed()) { if (mcast_queue.contains(group)) return false; mcast_queue.enqueue(group); diff --git a/src/io/pifile.cpp b/src/io/pifile.cpp index 50db3410..8d02201c 100755 --- a/src/io/pifile.cpp +++ b/src/io/pifile.cpp @@ -155,22 +155,23 @@ bool PIFile::openDevice() { } } fd = _fopen_call_(p.data(), strType(mode_).data()); - opened_ = (fd != 0); - if (opened_) { + bool opened = (fd != 0); + if (opened) { fdi = fileno(fd); #ifndef WINDOWS fcntl(fdi, F_SETFL, O_NONBLOCK); #endif - seekToBegin(); + _fseek_call_(fd, 0, SEEK_SET); + clearerr(fd); } //piCout << "open file" << fd << opened_; - return opened_; + return opened; } bool PIFile::closeDevice() { //piCout << "close file" << fd << opened_; - if (!opened_ || fd == 0) return true; + if (isClosed() || fd == 0) return true; bool cs = (fclose(fd) == 0); if (cs) fd = 0; fdi = -1; @@ -181,7 +182,7 @@ bool PIFile::closeDevice() { PIString PIFile::readLine() { PIByteArray str; - if (!opened_) return str; + if (isClosed()) return str; int cc; while (!isEnd()) { cc = fgetc(fd); @@ -231,7 +232,7 @@ PIByteArray PIFile::readAll(bool forceRead) { llong PIFile::size() const { - if (!opened_) return -1; + if (isClosed()) return -1; llong s, cp = pos(); _fseek_call_(fd, 0, SEEK_END); clearerr(fd); s = pos(); @@ -298,33 +299,33 @@ PIString PIFile::strType(const PIIODevice::DeviceMode type) { void PIFile::flush() { - if (opened_) fflush(fd); + if (isOpened()) fflush(fd); } void PIFile::seek(llong position) { - if (!opened_) return; + if (isClosed()) return; _fseek_call_(fd, position, SEEK_SET); clearerr(fd); } void PIFile::seekToBegin() { - if (!opened_) return; + if (isClosed()) return; _fseek_call_(fd, 0, SEEK_SET); clearerr(fd); } void PIFile::seekToEnd() { - if (!opened_) return; + if (isClosed()) return; _fseek_call_(fd, 0, SEEK_END); clearerr(fd); } void PIFile::seekToLine(llong line) { - if (!opened_) return; + if (isClosed()) return; seekToBegin(); piForTimes(line) readLine(); clearerr(fd); @@ -338,18 +339,18 @@ char PIFile::readChar() { void PIFile::setPath(const PIString & path) { PIIODevice::setPath(path); - if (opened_) openDevice(); + if (isOpened()) openDevice(); } llong PIFile::pos() const { - if (!opened_) return -1; + if (isClosed()) return -1; return _ftell_call_(fd); } bool PIFile::isEnd() const { - if (!opened_) return true; + if (isClosed()) return true; return (feof(fd) || ferror(fd)); } diff --git a/src/io/piiodevice.cpp b/src/io/piiodevice.cpp index 33886112..419a3eee 100755 --- a/src/io/piiodevice.cpp +++ b/src/io/piiodevice.cpp @@ -183,7 +183,7 @@ void PIIODevice::write_func() { void PIIODevice::terminate() { timer.stop(); thread_started_ = false; - if (!isInitialized()) return; + if (!init_) return; if (isRunning()) { stop(); PIThread::terminate(); diff --git a/src/io/piiodevice.h b/src/io/piiodevice.h index 958a417f..16390f55 100755 --- a/src/io/piiodevice.h +++ b/src/io/piiodevice.h @@ -82,8 +82,6 @@ public: //! Return \b true if mode is WriteOnly or ReadWrite bool isWriteable() const {return (mode_ & WriteOnly);} - bool isInitialized() const {return init_;} - //! Return \b true if device is successfully opened bool isOpened() const {return opened_;} @@ -215,7 +213,6 @@ public: EVENT_HANDLER1(bool, open, const DeviceMode &, _mode) {mode_ = _mode; if (!init_) init(); opened_ = openDevice(); if (opened_) opened(); return opened_;} EVENT_HANDLER2(bool, open, const PIString &, _path, const DeviceMode &, _mode) {setPath(_path); mode_ = _mode; if (!init_) init(); opened_ = openDevice(); if (opened_) opened(); return opened_;} EVENT_HANDLER(bool, close) {opened_ = !closeDevice(); if (!opened_) closed(); return !opened_;} - EVENT_HANDLER(bool, initialize) {init_ = init(); return init_;} EVENT_VHANDLER(void, flush) {;} @@ -242,9 +239,6 @@ public: //! \fn bool close() //! \brief Close device - //! \fn bool initialize() - //! \brief Initialize device - //! \} //! \vhandlers //! \{ @@ -310,7 +304,7 @@ protected: DeviceMode mode_; ReadRetFunc ret_func_; - bool init_, opened_, thread_started_, raise_threaded_read_; + bool opened_; void * ret_data_; private: @@ -330,6 +324,7 @@ private: PIQueue > write_queue; ullong tri; int readed_; + bool init_, thread_started_, raise_threaded_read_; }; diff --git a/src/io/pipacketextractor.cpp b/src/io/pipacketextractor.cpp index e681604f..2078044e 100755 --- a/src/io/pipacketextractor.cpp +++ b/src/io/pipacketextractor.cpp @@ -84,13 +84,13 @@ REGISTER_DEVICE(PIPacketExtractor); PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, PIPacketExtractor::SplitMode mode) { - init_(); + construct(); setDevice(device_); setSplitMode(mode); } -void PIPacketExtractor::init_() { +void PIPacketExtractor::construct() { ret_func_header = ret_func_footer = 0; setPayloadSize(0); setTimeout(100); diff --git a/src/io/pipacketextractor.h b/src/io/pipacketextractor.h index ea8fb0e1..52fb0d47 100755 --- a/src/io/pipacketextractor.h +++ b/src/io/pipacketextractor.h @@ -165,7 +165,7 @@ protected: virtual bool validatePayload(uchar * rec, int size) {if (ret_func_ != 0) return ret_func_(ret_data_, rec, size); return true;} private: - void init_(); + void construct(); void propertyChanged(const PIString & ); bool threadedRead(uchar * readed, int size); PIString fullPathPrefix() const {return "pckext";} diff --git a/src/io/piserial.cpp b/src/io/piserial.cpp index f904cd80..a5504c7f 100755 --- a/src/io/piserial.cpp +++ b/src/io/piserial.cpp @@ -140,12 +140,12 @@ PRIVATE_DEFINITION_END(PISerial) PISerial::PISerial(): PIIODevice("", ReadWrite) { - _init(); + construct(); } PISerial::PISerial(const PIString & device_, PISerial::Speed speed_, PIFlags params_): PIIODevice(device_, ReadWrite) { - _init(); + construct(); setPath(device_); setSpeed(speed_); setParameters(params_); @@ -157,7 +157,7 @@ PISerial::~PISerial() { } -void PISerial::_init() { +void PISerial::construct() { #ifdef WINDOWS PRIVATE->hCom = 0; #endif @@ -169,7 +169,6 @@ void PISerial::_init() { setParameters(0); setSpeed(S115200); setDataBitsCount(8); - //init(); } @@ -289,7 +288,6 @@ void PISerial::flush() { bool PISerial::closeDevice() { - if (!isInitialized()) return true; if (isRunning()) { stop(); PIThread::terminate(); @@ -298,7 +296,7 @@ bool PISerial::closeDevice() { #ifdef WINDOWS SetCommState(PRIVATE->hCom, &PRIVATE->sdesc); SetCommMask(PRIVATE->hCom, PRIVATE->mask); - CloseHandle(PRIVATE->hCom); +// piCoutObj << "close" << CloseHandle(PRIVATE->hCom); PRIVATE->hCom = 0; #else tcsetattr(fd, TCSANOW, &PRIVATE->sdesc); diff --git a/src/io/piserial.h b/src/io/piserial.h index c2f59e36..c1252559 100755 --- a/src/io/piserial.h +++ b/src/io/piserial.h @@ -223,7 +223,7 @@ protected: //! Executes when any read function was successful. Default implementation does nothing virtual void received(const void * data, int size) {;} - void _init(); + void construct(); void applySettings(); int convertSpeed(PISerial::Speed speed); bool setBit(int bit, bool on, const PIString & bname); diff --git a/src/io/piusb.cpp b/src/io/piusb.cpp index 0d27928b..f80d4987 100755 --- a/src/io/piusb.cpp +++ b/src/io/piusb.cpp @@ -298,7 +298,7 @@ bool PIUSB::closeDevice() { int PIUSB::read(void * read_to, int max_size) { #ifdef PIP_USB - if (!opened_ || ep_read.isNull()) return -1; + if (isClosed() || ep_read.isNull()) return -1; switch (ep_read.transfer_type) { case Endpoint::Bulk: /*piCoutObj << "bulk read" << max_size;*/ return usb_bulk_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r); break; case Endpoint::Interrupt: return usb_interrupt_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r); break; @@ -313,7 +313,7 @@ int PIUSB::read(void * read_to, int max_size) { int PIUSB::write(const void * data, int max_size) { #ifdef PIP_USB - if (!opened_ || ep_write.isNull()) return -1; + if (isClosed() || ep_write.isNull()) return -1; switch (ep_read.transfer_type) { case Endpoint::Bulk: /*piCoutObj << "bulk write" << max_size;*/ return usb_bulk_write(hdev, ep_write.address, (char * )const_cast(data), max_size, timeout_w); break; case Endpoint::Interrupt: return usb_interrupt_write(hdev, ep_read.address, (char * )data, max_size, timeout_w); break; @@ -328,7 +328,7 @@ int PIUSB::write(const void * data, int max_size) { int PIUSB::controlWrite(const void * data, int max_size) { #ifdef PIP_USB - if (!opened_) return -1; + if (isClosed()) return -1; //return usb_control_msg(hdev, ); return -1; #else @@ -339,7 +339,7 @@ int PIUSB::controlWrite(const void * data, int max_size) { void PIUSB::flush() { #ifdef PIP_USB - if (!opened_) return; + if (isClosed()) return; if (!ep_read.isNull()) usb_resetep(hdev, ep_read.address); if (!ep_write.isNull()) usb_resetep(hdev, ep_write.address); #endif diff --git a/utils/system_daemon/daemon.cpp b/utils/system_daemon/daemon.cpp index bbeb8afc..729d9d69 100644 --- a/utils/system_daemon/daemon.cpp +++ b/utils/system_daemon/daemon.cpp @@ -1,6 +1,7 @@ #include "daemon.h" #include "shared.h" #include "pisysteminfo.h" +#include "picrypt.h" const char self_name[] = "__self__"; extern PIScreen screen; @@ -43,7 +44,7 @@ void Daemon::Remote::run() { case RemoveFiles: ::removeFiles(d, _fl); updateDirEntries(); - removeFinished(name(), d.absolutePath()); + changeDirFinished(name(), d.absolutePath()); break; case RequestChangeDir: updateDirEntries(); @@ -54,6 +55,15 @@ void Daemon::Remote::run() { updateDirEntries(); changeDirFinished(name(), d.absolutePath()); break; + case CryptFiles: + piCoutObj << "CryptFiles"; + if (!_fl.isEmpty()) { + PIString p = askUserInput("Password:"); + ::cryptFiles(d, _fl, PICrypt::hash(p)); + } + updateDirEntries(); + changeDirFinished(name(), d.absolutePath()); + break; default: break; }; } @@ -208,6 +218,7 @@ Daemon::Daemon(): inited__(false), PIPeer(pisd_prefix + PISystemInfo::instance() CONNECTU(_self, sendRequest, this, localSend) CONNECTU(_self, receiveFinished, this, closeFileDialog) CONNECTU(_self, sendFinished, this, closeFileDialog) + CONNECTU(_self, changeDirFinished, this, dirChanged) localft.setName(self_name); CONNECTU(&localft, sendRequest, _self, received) dtimer.addDelimiter(5); @@ -393,7 +404,7 @@ void Daemon::fmKeyEvent(PIKbdListener::KeyEvent key) { void Daemon::fmActionRequest(bool remote_tile, FileManager::Action type, PIVariant data) { Remote * r = 0; r = remotes.value(conn_name, 0); - if (!r && type != FileManager::LocalCopy) return; + if (!r && type != FileManager::LocalCopy && type != FileManager::LocalCrypt) return; switch (type) { case FileManager::Copy: if (remote_tile) { @@ -435,6 +446,25 @@ void Daemon::fmActionRequest(bool remote_tile, FileManager::Action type, PIVaria } tile_file_progress->rec = false; tile_file_progress->show(&(_self->ft)); + case FileManager::Crypt: + if (remote_tile) { + PIByteArray ba; + ba << int(CryptFiles) << fm.selectedRemote(); + send(conn_name, ba); + } else { + _self->dir_my.setDir(fm.localDir()); + _self->cryptFiles(data.toStringList()); + } + break; + case FileManager::LocalCrypt: + piCoutObj << "LocalCrypt"; + if (remote_tile) { + _self->dir_my.setDir(fm.remoteDir()); + } else { + _self->dir_my.setDir(fm.localDir()); + } + _self->cryptFiles(data.toStringList()); + break; default: break; }; //piCout << remote_tile << type << data; @@ -502,7 +532,6 @@ void Daemon::peerConnected(const PIString & p_name) { CONNECTU(r, receiveFinished, this, filesReceived) CONNECTU(r, receiveFinished, this, closeFileDialog) CONNECTU(r, sendFinished, this, closeFileDialog) - CONNECTU(r, removeFinished, this, filesRemoved) CONNECTU(r, changeDirFinished, this, dirChanged) PIMutexLocker ml2(remote_mutex); remotes.insert(p_name, r); @@ -535,15 +564,13 @@ void Daemon::filesReceived(const PIString & p_name, bool ok) { void Daemon::dirChanged(const PIString & p_name, const PIString & dir) { - PIMutexLocker ml(remote_mutex); - Remote * r = remotes.value(p_name, 0); - if (!r) return; - if (r->dir_my.absolutePath() != dir) return; - sendDirToRemote(r); -} - - -void Daemon::filesRemoved(const PIString & p_name, const PIString & dir) { + if (p_name == self_name) { + fm.clearSelectionLocal(); + fm.clearSelectionRemote(); + fm.updateLocalDir(); + fm.updateRemoteDir(); + return; + } PIMutexLocker ml(remote_mutex); Remote * r = remotes.value(p_name, 0); if (!r) return; @@ -652,6 +679,15 @@ void Daemon::dataReceived(const PIString & from, const PIByteArray & data) { case FileTransfer: if (r) r->received(ba); break; + case CryptFiles: + if (!r) return; + if (r->isRunning()) return; + { + PIStringList files; + ba >> files; + r->cryptFiles(files); + } + break; }; if (!rba.isEmpty()) send(from, rba); } diff --git a/utils/system_daemon/daemon.h b/utils/system_daemon/daemon.h index 5699ede3..a31f94d5 100644 --- a/utils/system_daemon/daemon.h +++ b/utils/system_daemon/daemon.h @@ -71,6 +71,7 @@ private: CopyFiles, RemoveFiles, MkDir, + CryptFiles, FileTransfer = 30 @@ -85,6 +86,7 @@ private: 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() << "");} + void cryptFiles(const PIStringList & fl) {startAction(Daemon::CryptFiles, PIString(), fl);} 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);} @@ -92,7 +94,6 @@ private: EVENT2(sendRequest, const PIString &, p_name, const PIByteArray &, data) EVENT2(receiveFinished, const PIString & , p_name, bool, ok) EVENT2(sendFinished, const PIString & , p_name, bool, ok) - EVENT2(removeFinished, const PIString & , p_name, const PIString & , dir) EVENT2(changeDirFinished, const PIString & , p_name, const PIString & , dir) EVENT_HANDLER1(void, received, PIByteArray & , data) {ft.received(data);} @@ -135,7 +136,6 @@ private: EVENT_HANDLER3(void, fmActionRequest, bool, remote_tile, FileManager::Action, type, PIVariant, data); EVENT_HANDLER2(void, timerEvent, void * , _d, int, delim); EVENT_HANDLER2(void, filesReceived, const PIString & , p_name, bool, ok); - EVENT_HANDLER2(void, filesRemoved, const PIString & , p_name, const PIString & , dir); EVENT_HANDLER2(void, dirChanged, const PIString & , p_name, const PIString & , dir); EVENT_HANDLER2(void, closeFileDialog, const PIString & , p_name, bool, ok); EVENT_HANDLER2(void, localSend, const PIString & , p_name, const PIByteArray &, data); diff --git a/utils/system_daemon/file_manager.cpp b/utils/system_daemon/file_manager.cpp index ee423a4e..66934ed4 100644 --- a/utils/system_daemon/file_manager.cpp +++ b/utils/system_daemon/file_manager.cpp @@ -40,7 +40,12 @@ bool FileManager::TileDir::keyEvent(PIKbdListener::KeyEvent key) { break; case PIKbdListener::F6: if (key.modifiers[PIKbdListener::Shift]) { - askQuestion("Crypt selected files?"); + if (selected.isEmpty()) + selected << cur; + if (!askQuestion("Crypt selected files?")) return true; + setFocus(); + if (remote_mode) actionRequest(is_right, Crypt, selectedNames()); + else actionRequest(is_right, LocalCrypt, selectedNames()); } break; case PIKbdListener::F7: diff --git a/utils/system_daemon/file_manager.h b/utils/system_daemon/file_manager.h index 765a7113..c4b197ea 100644 --- a/utils/system_daemon/file_manager.h +++ b/utils/system_daemon/file_manager.h @@ -15,7 +15,7 @@ public: PIScreenTile * localTile() const {return panels[0];} PIScreenTile * remoteTile() const {return panels[1];} - enum Action {MkDir, Remove, Copy, Move, LocalCopy}; + enum Action {MkDir, Remove, Copy, Move, LocalCopy, Crypt, LocalCrypt}; void setLocal(); void setRemote(); diff --git a/utils/system_daemon/shared.cpp b/utils/system_daemon/shared.cpp index 4c4b9585..28cd99ac 100644 --- a/utils/system_daemon/shared.cpp +++ b/utils/system_daemon/shared.cpp @@ -1,4 +1,5 @@ #include "shared.h" +#include "picrypt.h" extern PIScreen screen; @@ -118,7 +119,7 @@ void showInfo(const PIString & t) { void removeFiles(const PIDir & dir, PIStringList l) { - l.removeOne(".."); + l.removeAll(".."); PIString ap = dir.absolutePath(); //piCout << "remove from" << ap; piForeachC (PIString & s, l) { @@ -134,3 +135,42 @@ void removeFiles(const PIDir & dir, PIStringList l) { PIFile::remove(fi.path); } } + + +bool cryptFiles(const PIDir & dir, PIStringList l, const PIByteArray & secret) { + if (secret.size() != PICrypt::sizeKey() || secret.isEmpty()) return false; + l.removeAll(".."); + PIString ap = dir.absolutePath(); + piForeachC (PIString & s, l) { + PIFile::FileInfo fi = PIFile::fileInfo(ap + PIDir::separator + s); + if (fi.isDir()) { + PIVector el = PIDir::allEntries(fi.path); + piForeachCR (PIFile::FileInfo & e, el) { + if (e.size != 0) + cryptFile(e.path, secret); + } + } + if (fi.size != 0) + cryptFile(fi.path, secret); + } + return false; +} + + +bool cryptFile(const PIString & path, const PIByteArray & secret){ + PIFile inf; + PIByteArray ba; + PICrypt crypt; + if (!crypt.setKey(secret)) return false; + if (!inf.open(path, PIIODevice::ReadOnly)) return false; + ba = inf.readAll(); + ba = crypt.crypt(ba); + if (ba.isEmpty()) return false; + PIFile outf; + if (!outf.open(path + ".crypt", PIIODevice::ReadWrite)) return false; + outf.resize(0); + outf.write(ba); + outf.close(); + return true; +} + diff --git a/utils/system_daemon/shared.h b/utils/system_daemon/shared.h index 71e71ab5..f1d05cde 100644 --- a/utils/system_daemon/shared.h +++ b/utils/system_daemon/shared.h @@ -15,5 +15,7 @@ PIString askUserInput(const PIString &desc); bool askQuestion(const PIString & t); void showInfo(const PIString & t); void removeFiles(const PIDir & dir, PIStringList l); +bool cryptFiles(const PIDir & dir, PIStringList l, const PIByteArray & secret); +bool cryptFile(const PIString & path, const PIByteArray & secret); #endif // SHARED_H