From 3ddf947c8da82a6d2e40688583143005b632942e Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 10 Sep 2015 22:30:28 +0800 Subject: new feature: raw packet capture. --- res/pic/log_raw.png | Bin 0 -> 931 bytes src/common/fqterm_shortcuthelper.cpp | 9 +++++-- src/common/fqterm_shortcuthelper.h | 1 + src/fqterm/fqterm_frame.cpp | 19 +++++++++++++++ src/fqterm/fqterm_frame.h | 1 + src/terminal/fqterm_session.cpp | 46 +++++++++++++++++++++++++++++++++++ src/terminal/fqterm_session.h | 10 +++++++- 7 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 res/pic/log_raw.png diff --git a/res/pic/log_raw.png b/res/pic/log_raw.png new file mode 100644 index 0000000..63b67b2 Binary files /dev/null and b/res/pic/log_raw.png differ diff --git a/src/common/fqterm_shortcuthelper.cpp b/src/common/fqterm_shortcuthelper.cpp index 8c18643..f4395c4 100644 --- a/src/common/fqterm_shortcuthelper.cpp +++ b/src/common/fqterm_shortcuthelper.cpp @@ -92,8 +92,12 @@ void FQTermShortcutHelper::initShortcutDescriptionTable() initShortcutDescriptionTableEntry(EDITSCHEMA, "schema", tr(""), tr("Edit Schema")); initShortcutDescriptionTableEntry(SHORTCUTSETTING, "shortcut", tr(""), tr("Shorcut Setting")); initShortcutDescriptionTableEntry(COPYARTICLE, "copyarticle", tr("F9"), tr("Copy Article"), "get_article_fulltext"); - initShortcutDescriptionTableEntry(ANTIIDLE, "antiidle", tr(""), tr("Toggle Anti Idle"), "anti_idle"); + initShortcutDescriptionTableEntry(LOGRAW, "lograw", tr(""), tr("Toggle Raw Data Logging"), "log_raw"); + getAction(LOGRAW)->setCheckable(true); + + initShortcutDescriptionTableEntry(ANTIIDLE, "antiidle", tr(""), tr("Toggle Anti Idle"), "anti_idle"); getAction(ANTIIDLE)->setCheckable(true); + initShortcutDescriptionTableEntry(AUTOREPLY, "autoreply", tr(""), tr("Toggle Auto Reply"), "auto_reply"); getAction(AUTOREPLY)->setCheckable(true); initShortcutDescriptionTableEntry(VIEWMESSAGE, "viewmessage", tr("F10"), tr("View Messages"), "view_messages"); @@ -194,6 +198,7 @@ void FQTermShortcutHelper::retranslateActions() { retranslateAction(SHORTCUTSETTING, tr("Short&cut Setting")); retranslateAction(EDITSCHEMA, tr("&Edit Schema")); retranslateAction(COPYARTICLE, tr("&Copy article")); + retranslateAction(LOGRAW, tr("Log Raw")); retranslateAction(ANTIIDLE, tr("Anti &idle")); retranslateAction(AUTOREPLY, tr("Auto &reply")); retranslateAction(VIEWMESSAGE, tr("&View messages")); @@ -295,4 +300,4 @@ FQTermShortcutHelper::ShortcutDescriptionEntry::~ShortcutDescriptionEntry() { } }//namespace FQTerm -#include "fqterm_shortcuthelper.moc" \ No newline at end of file +#include "fqterm_shortcuthelper.moc" diff --git a/src/common/fqterm_shortcuthelper.h b/src/common/fqterm_shortcuthelper.h index 7e77df7..91904ac 100644 --- a/src/common/fqterm_shortcuthelper.h +++ b/src/common/fqterm_shortcuthelper.h @@ -80,6 +80,7 @@ public: SHORTCUTSETTING, EDITSCHEMA, COPYARTICLE, //F9 + LOGRAW, ANTIIDLE, AUTOREPLY, VIEWMESSAGE, //F10 diff --git a/src/fqterm/fqterm_frame.cpp b/src/fqterm/fqterm_frame.cpp index 8bca0e4..5143a56 100644 --- a/src/fqterm/fqterm_frame.cpp +++ b/src/fqterm/fqterm_frame.cpp @@ -1170,6 +1170,21 @@ void FQTermFrame::ipLookup() { ipLookupDialog_.exec(); } + void FQTermFrame::logRaw() + { + FQTermSession *s = windowManager_->activeWindow()->getSession(); + + if (!s->isLogging()) { + s->startLogging(); + } + else { + s->stopLogging(true); + } + + getAction(FQTermShortcutHelper::LOGRAW)->setChecked( + s->isLogging()); + } + void FQTermFrame::antiIdle() { windowManager_->activeWindow()->toggleAntiIdle(); getAction(FQTermShortcutHelper::ANTIIDLE)->setChecked( @@ -1404,6 +1419,7 @@ void FQTermFrame::addMainTool() { // Spec (5) toolBarMdiConnectTools_->addAction(getAction(FQTermShortcutHelper::COPYARTICLE)); + toolBarMdiConnectTools_->addAction(getAction(FQTermShortcutHelper::LOGRAW)); toolBarMdiConnectTools_->addAction(getAction(FQTermShortcutHelper::ANTIIDLE)); toolBarMdiConnectTools_->addAction(getAction(FQTermShortcutHelper::AUTOREPLY)); toolBarMdiConnectTools_->addAction(getAction(FQTermShortcutHelper::VIEWMESSAGE)); @@ -1563,6 +1579,7 @@ void FQTermFrame::addMainMenu() { // Special QMenu *spec = menuMain_->addMenu(tr("&Special")); FQTERM_ADDACTION(spec, COPYARTICLE, this, copyArticle); + FQTERM_ADDACTION(spec, LOGRAW, this, logRaw); FQTERM_ADDACTION(spec, ANTIIDLE, this, antiIdle); FQTERM_ADDACTION(spec, AUTOREPLY, this, autoReply); FQTERM_ADDACTION(spec, VIEWMESSAGE, this, viewMessages); @@ -1607,6 +1624,7 @@ void FQTermFrame::updateMenuToolBar() { getAction(FQTermShortcutHelper::PASTEWORDWRAP)->setChecked(window->getSession()->param().isAutoWrap_); getAction(FQTermShortcutHelper::FULLSCREEN)->setChecked(windowState() & Qt::WindowFullScreen); getAction(FQTermShortcutHelper::ANSICOLOR)->setChecked(window->getSession()->param().isAnsiColor_); + getAction(FQTermShortcutHelper::LOGRAW)->setChecked(window->getSession()->isLogging()); getAction(FQTermShortcutHelper::ANTIIDLE)->setChecked(window->getSession()->isAntiIdle()); getAction(FQTermShortcutHelper::AUTOREPLY)->setChecked(window->getSession()->isAutoReply()); getAction(FQTermShortcutHelper::BEEP)->setChecked(window->getSession()->param().isBeep_); @@ -1684,6 +1702,7 @@ void FQTermFrame::enableMenuToolBar(bool enable) { getAction(FQTermShortcutHelper::CURRENTSETTING)->setEnabled(enable); getAction(FQTermShortcutHelper::SAVESETTING)->setEnabled(enable); getAction(FQTermShortcutHelper::COPYARTICLE)->setEnabled(enable); + getAction(FQTermShortcutHelper::LOGRAW)->setEnabled(enable); getAction(FQTermShortcutHelper::ANTIIDLE)->setEnabled(enable); getAction(FQTermShortcutHelper::AUTOREPLY)->setEnabled(enable); getAction(FQTermShortcutHelper::VIEWMESSAGE)->setEnabled(enable); diff --git a/src/fqterm/fqterm_frame.h b/src/fqterm/fqterm_frame.h index c7c3d26..fbe0be0 100644 --- a/src/fqterm/fqterm_frame.h +++ b/src/fqterm/fqterm_frame.h @@ -151,6 +151,7 @@ class FQTermFrame: public QMainWindow { void bosscolor(); void toggleServer(bool on); void uiFont(); + void logRaw(); void antiIdle(); void autoReply(); void setting(); diff --git a/src/terminal/fqterm_session.cpp b/src/terminal/fqterm_session.cpp index 6b03bf5..9e8fab8 100644 --- a/src/terminal/fqterm_session.cpp +++ b/src/terminal/fqterm_session.cpp @@ -49,6 +49,8 @@ #include #include #include +#include +#include namespace FQTerm { @@ -126,6 +128,9 @@ FQTermSession::FQTermSession(FQTermConfig *config, FQTermParam param) { idleTimer_ = new QTimer; autoReplyTimer_ = new QTimer; + isLogging_ = false; + logData = NULL; + acThread_ = new ArticleCopyThread(*this, waitCondition_, bufferWriteLock_); FQ_VERIFY(connect(decoder_, SIGNAL(mouseMode(bool)), @@ -974,6 +979,10 @@ void FQTermSession::readReady(int size, int raw_size) { raw_data_.resize(raw_size); telnet_->read_raw(&raw_data_[0], raw_size); + if (isLogging_) { + logData->append(&raw_data_[0], raw_size); + } + // read raw buffer int zmodem_consumed; if (param_.enableZmodem_) @@ -1149,6 +1158,10 @@ void FQTermSession::finalizeConnection() { idleTimer_->stop(); } + if (isLogging_) { + stopLogging(false); + } + emit connectionClosed(); } @@ -1491,6 +1504,39 @@ void FQTermSession::updateSetting( const FQTermParam& p ) { setAutoReconnect(param_.isAutoReconnect_); } + void FQTermSession::startLogging() + { + logData = new QByteArray(); + if (logData!=NULL) { + isLogging_ = true; + } + else { + return; + } + } + + void FQTermSession::stopLogging(bool savedata) + { + if (savedata) { + QString fileName = QFileDialog::getSaveFileName(NULL, + tr("Save logged data to file")); + if (!fileName.isNull()) { + QFile f(fileName); + if (f.open(QIODevice::WriteOnly)) { + f.write(*logData); + f.close(); + } + } + } + delete logData; + isLogging_ = false; + } + + bool FQTermSession::isLogging() + { + return isLogging_; + } + ArticleCopyThread::ArticleCopyThread( FQTermSession &bbs, QWaitCondition &waitCondition, QReadWriteLock &bufferLock) : session_(bbs), diff --git a/src/terminal/fqterm_session.h b/src/terminal/fqterm_session.h index 78aaa31..e1f1df3 100644 --- a/src/terminal/fqterm_session.h +++ b/src/terminal/fqterm_session.h @@ -215,6 +215,11 @@ class FQTermSession: public QObject { void updateSetting(const FQTermParam& p); QReadWriteLock& getBufferLock() {return bufferWriteLock_;} + // raw data logging + void startLogging(); + void stopLogging(bool); + bool isLogging(); + public: @@ -310,7 +315,10 @@ private: std::vector telnet_data_; std::vector raw_data_; - + // raw data logging + bool isLogging_; + QByteArray *logData; + int reconnectRetry_; public: void setScriptListener(FQTermScriptEventListener* pythonListener) { -- cgit v1.2.3