save regex

This commit is contained in:
Akash Mozumdar 2020-02-28 02:33:51 -07:00
parent 16540bfe69
commit f6cf3c9c62
2 changed files with 43 additions and 5 deletions

View File

@ -1,13 +1,19 @@
#include "qtcommon.h" #include "qtcommon.h"
#include "extension.h" #include "extension.h"
#include "ui_regexfilter.h" #include "ui_regexfilter.h"
#include "module.h"
#include "blockmarkup.h"
#include <fstream>
extern const char* REGEX_FILTER; extern const char* REGEX_FILTER;
extern const char* INVALID_REGEX; extern const char* INVALID_REGEX;
extern const char* CURRENT_FILTER; extern const char* CURRENT_FILTER;
std::wregex regex; const char* REGEX_SAVE_FILE = "SavedRegexFilters.txt";
std::optional<std::wregex> regex;
std::shared_mutex m; std::shared_mutex m;
std::atomic<DWORD> selectedProcessId;
class Window : public QMainWindow class Window : public QMainWindow
{ {
@ -17,27 +23,52 @@ public:
ui.setupUi(this); ui.setupUi(this);
connect(ui.input, &QLineEdit::textEdited, this, &Window::setRegex); connect(ui.input, &QLineEdit::textEdited, this, &Window::setRegex);
connect(ui.save, &QPushButton::clicked, this, &Window::saveRegex);
setWindowTitle(REGEX_FILTER); setWindowTitle(REGEX_FILTER);
QMetaObject::invokeMethod(this, &QWidget::show, Qt::QueuedConnection); QMetaObject::invokeMethod(this, &QWidget::show, Qt::QueuedConnection);
} }
private:
void setRegex(QString regex) void setRegex(QString regex)
{ {
ui.input->setText(regex);
std::lock_guard l(m); std::lock_guard l(m);
try { ::regex = S(regex); } if (!regex.isEmpty()) try { ::regex = S(regex); }
catch (std::regex_error) { return ui.output->setText(INVALID_REGEX); } catch (std::regex_error) { return ui.output->setText(INVALID_REGEX); }
else ::regex = std::nullopt;
ui.output->setText(QString(CURRENT_FILTER).arg(regex)); ui.output->setText(QString(CURRENT_FILTER).arg(regex));
} }
private:
void saveRegex()
{
auto formatted = FormatString(
L"\xfeff|PROCESS|%s|FILTER|%s|END|\r\n",
GetModuleFilename(selectedProcessId.load()).value_or(FormatString(L"Error getting name of process 0x%X", selectedProcessId.load())),
S(ui.input->text())
);
std::ofstream(REGEX_SAVE_FILE, std::ios::binary | std::ios::app).write((const char*)formatted.c_str(), formatted.size() * sizeof(wchar_t));
}
Ui::FilterWindow ui; Ui::FilterWindow ui;
} window; } window;
bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo) bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo)
{ {
if (sentenceInfo["text number"] == 0) return false; if (sentenceInfo["text number"] == 0) return false;
if (sentenceInfo["current select"])
{
selectedProcessId = sentenceInfo["process id"];
if (!regex) if (auto processName = GetModuleFilename(sentenceInfo["process id"]))
{
std::ifstream stream(REGEX_SAVE_FILE, std::ios::binary);
BlockMarkupIterator savedFilters(stream, Array<std::wstring_view>{ L"|PROCESS|", L"|FILTER|" });
std::vector<std::wstring> regexes;
while (auto read = savedFilters.Next()) if (read->at(0) == processName) regexes.push_back(std::move(read->at(1)));
if (!regexes.empty()) QMetaObject::invokeMethod(&window, [regex = S(regexes.back())]{ window.setRegex(regex); }, Qt::BlockingQueuedConnection);
}
}
std::shared_lock l(m); std::shared_lock l(m);
sentence = std::regex_replace(sentence, regex, L""); if (regex) sentence = std::regex_replace(sentence, regex.value(), L"");
return true; return true;
} }

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>350</width> <width>350</width>
<height>76</height> <height>105</height>
</rect> </rect>
</property> </property>
<widget class="QWidget"> <widget class="QWidget">
@ -25,6 +25,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="save">
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel"> <widget class="QLabel">
<property name="text"> <property name="text">