mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-19 03:16:10 +00:00
Use r2 tasks for fetching strings
This commit is contained in:
parent
cc3ad67096
commit
e3bd0612d9
122
src/Cutter.cpp
122
src/Cutter.cpp
@ -159,7 +159,9 @@ QString CutterCore::cmd(const QString &str)
|
||||
|
||||
RVA offset = core_->offset;
|
||||
QByteArray cmd = str.toUtf8();
|
||||
r_core_task_sync_begin(core_);
|
||||
char *res = r_core_cmd_str(this->core_, cmd.constData());
|
||||
r_core_task_sync_end(core_);
|
||||
QString o = QString(res ? res : "");
|
||||
r_mem_free(res);
|
||||
if (offset != core_->offset) {
|
||||
@ -185,12 +187,38 @@ QJsonDocument CutterCore::cmdj(const QString &str)
|
||||
CORE_LOCK();
|
||||
QByteArray cmd = str.toUtf8();
|
||||
|
||||
r_core_task_sync_begin(core_);
|
||||
char *res = r_core_cmd_str(this->core_, cmd.constData());
|
||||
r_core_task_sync_end(core_);
|
||||
QJsonDocument doc = parseJson(res, str);
|
||||
r_mem_free(res);
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
QString CutterCore::cmdTask(const QString &str)
|
||||
{
|
||||
RCoreTask *task = startTask(str);
|
||||
joinTask(task);
|
||||
QString ret = QString::fromUtf8(task->res);
|
||||
deleteTask(task);
|
||||
return ret;
|
||||
}
|
||||
|
||||
QJsonDocument CutterCore::cmdjTask(const QString &str)
|
||||
{
|
||||
RCoreTask *task = startTask(str);
|
||||
joinTask(task);
|
||||
QJsonDocument ret = parseJson(task->res, str);
|
||||
deleteTask(task);
|
||||
return ret;
|
||||
}
|
||||
|
||||
QJsonDocument CutterCore::parseJson(const char *res, const QString &cmd)
|
||||
{
|
||||
QString resString = QString(res);
|
||||
|
||||
if (resString.isEmpty()) {
|
||||
r_mem_free(res);
|
||||
return QJsonDocument();
|
||||
}
|
||||
|
||||
@ -198,12 +226,15 @@ QJsonDocument CutterCore::cmdj(const QString &str)
|
||||
QJsonDocument doc = res ? QJsonDocument::fromJson(resString.toUtf8(), &jsonError) : QJsonDocument();
|
||||
|
||||
if (jsonError.error != QJsonParseError::NoError) {
|
||||
eprintf("Failed to parse JSON for command \"%s\": %s\n", str.toLocal8Bit().constData(),
|
||||
jsonError.errorString().toLocal8Bit().constData());
|
||||
if (!cmd.isNull()) {
|
||||
eprintf("Failed to parse JSON for command \"%s\": %s\n", cmd.toLocal8Bit().constData(),
|
||||
jsonError.errorString().toLocal8Bit().constData());
|
||||
} else {
|
||||
eprintf("Failed to parse JSON: %s\n", jsonError.errorString().toLocal8Bit().constData());
|
||||
}
|
||||
eprintf("%s\n", resString.toLocal8Bit().constData());
|
||||
}
|
||||
|
||||
r_mem_free(res);
|
||||
return doc;
|
||||
}
|
||||
|
||||
@ -1177,11 +1208,14 @@ QList<RelocDescription> CutterCore::getAllRelocs()
|
||||
|
||||
QList<StringDescription> CutterCore::getAllStrings()
|
||||
{
|
||||
//CORE_LOCK();
|
||||
QList<StringDescription> ret;
|
||||
//QJsonDocument stringsDoc = cmdj("izzj");
|
||||
return parseStringsJson(cmdjTask("izzj"));
|
||||
}
|
||||
|
||||
/*QJsonObject stringsObj = stringsDoc.object();
|
||||
QList<StringDescription> CutterCore::parseStringsJson(const QJsonDocument &doc)
|
||||
{
|
||||
QList<StringDescription> ret;
|
||||
|
||||
QJsonObject stringsObj = doc.object();
|
||||
QJsonArray stringsArray = stringsObj["strings"].toArray();
|
||||
for (QJsonValue value : stringsArray) {
|
||||
QJsonObject stringObject = value.toObject();
|
||||
@ -1196,56 +1230,6 @@ QList<StringDescription> CutterCore::getAllStrings()
|
||||
ret << string;
|
||||
}
|
||||
|
||||
return ret;*/
|
||||
|
||||
|
||||
RBinFile *bf = r_core_bin_cur(core_);
|
||||
if (!bf) {
|
||||
return {};
|
||||
}
|
||||
|
||||
int min = getConfigi("bin.minstr");
|
||||
int rawstrTmp = bf->rawstr;
|
||||
bf->rawstr = 2;
|
||||
RList *list = r_bin_file_get_strings(bf, min, 0);
|
||||
bf->rawstr = rawstrTmp;
|
||||
|
||||
if (!list) {
|
||||
return {};
|
||||
}
|
||||
|
||||
RListIter *iter;
|
||||
void *s;
|
||||
r_list_foreach (list, iter, s) {
|
||||
RBinString *str = reinterpret_cast<RBinString *>(s);
|
||||
StringDescription string;
|
||||
|
||||
switch (str->type) {
|
||||
case R_STRING_TYPE_ASCII:
|
||||
string.string = QString::fromUtf8(str->string);
|
||||
string.type = "ASCII";
|
||||
break;
|
||||
case R_STRING_TYPE_UTF8:
|
||||
string.string = QString::fromUtf8(str->string);
|
||||
string.type = "UTF-8";
|
||||
break;
|
||||
default:
|
||||
// TODO: utf-16, utf-32, etc.
|
||||
string.string = QString::fromUtf8(str->string);
|
||||
string.type = "TODO";
|
||||
break;
|
||||
}
|
||||
string.string = QString::fromUtf8(str->string);
|
||||
|
||||
string.vaddr = str->vaddr;
|
||||
string.size = str->size;
|
||||
string.length = str->length;
|
||||
|
||||
ret << string;
|
||||
}
|
||||
|
||||
r_list_free(list);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1709,12 +1693,15 @@ QString CutterCore::getVersionInformation()
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
QJsonArray CutterCore::getOpenedFiles()
|
||||
{
|
||||
QJsonDocument files = cmdj("oj");
|
||||
return files.array();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
QList<QString> CutterCore::getColorThemes()
|
||||
{
|
||||
QList<QString> r;
|
||||
@ -1723,3 +1710,20 @@ QList<QString> CutterCore::getColorThemes()
|
||||
r << s.toString();
|
||||
return r;
|
||||
}
|
||||
|
||||
RCoreTask *CutterCore::startTask(const QString &cmd)
|
||||
{
|
||||
RCoreTask *task = r_core_task_new (core_, cmd.toLocal8Bit().constData(), nullptr, nullptr);
|
||||
r_core_task_enqueue(core_, task);
|
||||
return task;
|
||||
}
|
||||
|
||||
void CutterCore::joinTask(RCoreTask *task)
|
||||
{
|
||||
r_core_task_join(core_, nullptr, task);
|
||||
}
|
||||
|
||||
void CutterCore::deleteTask(RCoreTask *task)
|
||||
{
|
||||
r_core_task_del(core_, task->id);
|
||||
}
|
||||
|
10
src/Cutter.h
10
src/Cutter.h
@ -327,8 +327,12 @@ public:
|
||||
l.removeAll("");
|
||||
return l;
|
||||
}
|
||||
QString cmdTask(const QString &str);
|
||||
QJsonDocument cmdjTask(const QString &str);
|
||||
QString getVersionInformation();
|
||||
|
||||
QJsonDocument parseJson(const char *res, const QString &cmd = QString());
|
||||
|
||||
/* Functions methods */
|
||||
void renameFunction(const QString &oldName, const QString &newName);
|
||||
void delFunction(RVA addr);
|
||||
@ -488,6 +492,8 @@ public:
|
||||
QList<XrefDescription> getXRefs(RVA addr, bool to, bool whole_function,
|
||||
const QString &filterType = QString::null);
|
||||
|
||||
QList<StringDescription> parseStringsJson(const QJsonDocument &doc);
|
||||
|
||||
/* Signals related */
|
||||
void triggerVarsChanged();
|
||||
void triggerFunctionRenamed(const QString &prevName, const QString &newName);
|
||||
@ -495,6 +501,10 @@ public:
|
||||
void triggerAsmOptionsChanged();
|
||||
void triggerGraphOptionsChanged();
|
||||
|
||||
RCoreTask *startTask(const QString &cmd);
|
||||
void joinTask(RCoreTask *task);
|
||||
void deleteTask(RCoreTask *task);
|
||||
|
||||
RCoreLocked core() const;
|
||||
|
||||
signals:
|
||||
|
@ -323,8 +323,13 @@ void MainWindow::openProject(const QString &project_name)
|
||||
finalizeOpen();
|
||||
}
|
||||
|
||||
#include <valgrind/callgrind.h>
|
||||
|
||||
void MainWindow::finalizeOpen()
|
||||
{
|
||||
CALLGRIND_ZERO_STATS;
|
||||
CALLGRIND_START_INSTRUMENTATION;
|
||||
|
||||
core->getOpcodes();
|
||||
|
||||
// Set settings to override any incorrect saved in the project
|
||||
@ -341,6 +346,9 @@ void MainWindow::finalizeOpen()
|
||||
// Add fortune message
|
||||
addOutput("\n" + core->cmd("fo"));
|
||||
showMaximized();
|
||||
|
||||
CALLGRIND_DUMP_STATS;
|
||||
CALLGRIND_STOP_INSTRUMENTATION;
|
||||
}
|
||||
|
||||
bool MainWindow::saveProject(bool quit)
|
||||
|
@ -4,5 +4,11 @@
|
||||
void StringsTask::runTask()
|
||||
{
|
||||
auto strings = Core()->getAllStrings();
|
||||
|
||||
/*RCoreTask *task = Core()->startTask("izzj");
|
||||
Core()->joinTask(task);
|
||||
|
||||
QList<StringDescription> strings = Core()->parseStringsJson(task->msg->res);*/
|
||||
|
||||
emit stringSearchFinished(strings);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user