Skip to content

Commit

Permalink
Add record script feature
Browse files Browse the repository at this point in the history
Signed-off-by: xiaoming <2014500726@smail.xtu.edu.cn>
  • Loading branch information
QQxiaoming committed Sep 3, 2024
1 parent 42a6bab commit 2ca7449
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@ en-US:
- Automatically use the default configuration if the Profile does not exist on Windows
- Add ToolTip to the connection bar
- Add system beep support
- Add record script feature
- Fix the small probability memory leak problem

zh-CN:

- Windows下Profile如果不存在则自动使用默认配置
- 增加连接条ToolTip显示
- 增加系统响铃支持
- 增加记录脚本功能
- 修复可能存在的小概率内存泄漏问题

## [[V0.5.0](https://github.com/QQxiaoming/quardCRT/releases/tag/V0.5.0)] - 2024-08-26

Expand Down
2 changes: 2 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
- Automatically use the default configuration if the Profile does not exist on Windows
- Add ToolTip to the connection bar
- Add system beep support
- Add record script feature
- Fix the small probability memory leak problem

## [[V0.5.0](https://github.com/QQxiaoming/quardCRT/releases/tag/V0.5.0)] - 2024-08-26

Expand Down
54 changes: 51 additions & 3 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,10 @@ CentralWidget::CentralWidget(QString dir, StartupUIMode mode, QLocale lang, bool
if(sessionsWindow->getMainWidget() == widget) {
logSessionAction->setChecked(sessionsWindow->isLog());
rawLogSessionAction->setChecked(sessionsWindow->isRawLog());
bool isRS = sessionsWindow->isRecordingScript();
startRecordingScriptAction->setEnabled(!isRS);
stopRecordingScriptAction->setEnabled(isRS);
canlcelRecordingScriptAction->setEnabled(isRS);
if(hexViewAction->isChecked()) {
connect(sessionsWindow,&SessionsWindow::hexDataDup,
hexViewWindow,&HexViewWindow::recvData);
Expand Down Expand Up @@ -938,6 +942,9 @@ CentralWidget::CentralWidget(QString dir, StartupUIMode mode, QLocale lang, bool
#else
runAction->setEnabled(false);
cancelAction->setEnabled(false);
startRecordingScriptAction->setEnabled(false);
stopRecordingScriptAction->setEnabled(false);
canlcelRecordingScriptAction->setEnabled(false);
#endif
#if defined(Q_OS_MACOS)
if(mainWindow) {
Expand Down Expand Up @@ -1126,9 +1133,6 @@ CentralWidget::CentralWidget(QString dir, StartupUIMode mode, QLocale lang, bool
});

// TODO:Unimplemented functions are temporarily closed
startRecordingScriptAction->setEnabled(false);
stopRecordingScriptAction->setEnabled(false);
canlcelRecordingScriptAction->setEnabled(false);
createPublicKeyAction->setEnabled(false);
publickeyManagerAction->setEnabled(false);
tileAction->setEnabled(false);
Expand Down Expand Up @@ -2195,8 +2199,10 @@ void CentralWidget::menuAndToolBarInit(void) {
startRecordingScriptAction = new QAction(this);
scriptMenu->addAction(startRecordingScriptAction);
stopRecordingScriptAction = new QAction(this);
stopRecordingScriptAction->setEnabled(false);
scriptMenu->addAction(stopRecordingScriptAction);
canlcelRecordingScriptAction = new QAction(this);
canlcelRecordingScriptAction->setEnabled(false);
scriptMenu->addAction(canlcelRecordingScriptAction);

addBookmarkAction = new QAction(this);
Expand Down Expand Up @@ -3369,6 +3375,48 @@ void CentralWidget::menuAndToolBarConnectSignals(void) {
connect(cancelAction,&QAction::triggered,this,[=](){
pyRun->cancelScript();
});
connect(startRecordingScriptAction,&QAction::triggered,this,[=](){
QWidget *widget = findCurrentFocusWidget();
if(widget == nullptr) {
return;
}
SessionsWindow *sessionsWindow = widget->property("session").value<SessionsWindow *>();
if(!sessionsWindow->isRecordingScript()) {
sessionsWindow->startRecordingScript();
}
bool isRS = sessionsWindow->isRecordingScript();
startRecordingScriptAction->setEnabled(!isRS);
stopRecordingScriptAction->setEnabled(isRS);
canlcelRecordingScriptAction->setEnabled(isRS);
});
connect(stopRecordingScriptAction,&QAction::triggered,this,[=](){
QWidget *widget = findCurrentFocusWidget();
if(widget == nullptr) {
return;
}
SessionsWindow *sessionsWindow = widget->property("session").value<SessionsWindow *>();
if(sessionsWindow->isRecordingScript()) {
sessionsWindow->stopRecordingScript();
}
bool isRS = sessionsWindow->isRecordingScript();
startRecordingScriptAction->setEnabled(!isRS);
stopRecordingScriptAction->setEnabled(isRS);
canlcelRecordingScriptAction->setEnabled(isRS);
});
connect(canlcelRecordingScriptAction,&QAction::triggered,this,[=](){
QWidget *widget = findCurrentFocusWidget();
if(widget == nullptr) {
return;
}
SessionsWindow *sessionsWindow = widget->property("session").value<SessionsWindow *>();
if(sessionsWindow->isRecordingScript()) {
sessionsWindow->canlcelRecordingScript();
}
bool isRS = sessionsWindow->isRecordingScript();
startRecordingScriptAction->setEnabled(!isRS);
stopRecordingScriptAction->setEnabled(isRS);
canlcelRecordingScriptAction->setEnabled(isRS);
});
#endif
connect(addBookmarkAction, &QAction::triggered, this, [&]() {
QString path = FileDialog::getExistingDirectory(this,tr("Select a directory"),QDir::homePath());
Expand Down
62 changes: 62 additions & 0 deletions src/sessionswindow/sessionswindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ SessionsWindow::SessionsWindow(SessionType tp, QWidget *parent)
, vncClient(nullptr)
, enableLog(false)
, enableRawLog(false)
, enableRecordingScript(false)
, enableBroadCast(false) {
zmodemUploadPath = QDir::homePath();
zmodemDownloadPath = QDir::homePath();
Expand Down Expand Up @@ -1147,6 +1148,67 @@ QString SessionsWindow::getRawLogFileName(void) {
return ret;
}

int SessionsWindow::startRecordingScript(void) {
int ret = 0;
enableRecordingScript = true;
recordingScript.clear();
return ret;
}

int SessionsWindow::stopRecordingScript(void) {
int ret = 0;
QString savefile_name = FileDialog::getSaveFileName(term, tr("Save script..."),
QDir::homePath() + QDate::currentDate().toString("/script-yyyy-MM-dd-") + QTime::currentTime().toString("hh-mm-ss") + ".py", tr("Python files (*.py)"));
if (!savefile_name.isEmpty()) {
QFile scriptFile(savefile_name);
if (!scriptFile.open(QIODevice::WriteOnly|QIODevice::Text)) {
QMessageBox::warning(messageParentWidget, tr("Save script"), tr("Cannot write file %1:\n%2.").arg(savefile_name).arg(scriptFile.errorString()));
ret = -1;
} else {
QTextStream out(&scriptFile);

out << "#!/usr/bin/env python3\n";
out << "# -*- coding: utf-8 -*-\n";
out << "#\n";
out << "# $interface = \"1.0\"\n";
out << "# Script generated by QuardCRT\n";
out << "# Date: " << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << "\n";
out << "#\n";
out << "# This automatically generated script may need to be\n";
out << "# edited in order to work correctly.\n";
out << "\n";
out << "import sys\n";
out << "from quardCRT import crt\n";
out << "\n";
out << "def main():\n";
out << " crt.Screen.Synchronous = True\n";
out << "\n";
foreach(auto cmd, recordingScript) {
if(cmd.first == 0) {
out << " crt.Screen.Send(\"" << cmd.second.replace("\"", "\\\"") << "\")\n";
} else {
out << " crt.Screen.WaitForString(\"" << cmd.second.replace("\"", "\\\"") << "\")\n";
}
}
out << "\n";
out << "if __name__ == \'__main__\':\n";
out << " main()\n";
out << "\n";

scriptFile.close();
}
}
enableRecordingScript = false;
return ret;
}

int SessionsWindow::canlcelRecordingScript(void) {
int ret = 0;
enableRecordingScript = false;
recordingScript.clear();
return ret;
}

int SessionsWindow::saveLog(const char *data, int size) {
int ret = 0;
if(enableLog) {
Expand Down
8 changes: 8 additions & 0 deletions src/sessionswindow/sessionswindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ class SessionsWindow : public QObject
QString getLogFileName(void);
int setRawLog(bool enable);
bool isRawLog(void) { return enableRawLog; }
int startRecordingScript(void);
int stopRecordingScript(void);
int canlcelRecordingScript(void);
bool isRecordingScript(void) { return enableRecordingScript; }
QString getRawLogFileName(void);
void setInBroadCastList(bool enable);
bool isInBroadCastList() { return enableBroadCast; }
Expand Down Expand Up @@ -471,11 +475,15 @@ class SessionsWindow : public QObject
QVNCClientWidget *vncClient;
bool enableLog;
bool enableRawLog;
bool enableRecordingScript;
QList<QPair<int, QByteArray>> recordingScript;
bool enableBroadCast;
QMutex log_file_mutex;
QMutex raw_log_file_mutex;
QMutex recording_script_file_mutex;
QFile *log_file = nullptr;
QFile *raw_log_file = nullptr;
QFile *recording_script_file = nullptr;
bool fflush_file = true;
QByteArray password_hash;
bool locked = false;
Expand Down

0 comments on commit 2ca7449

Please sign in to comment.