增加插件系统安全性

This commit is contained in:
寂静的羽夏 2022-06-27 10:12:38 +08:00
parent 6f164b0253
commit d52013ed64
18 changed files with 779 additions and 319 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
*.json
!settings.json
!TestPlugin.json
!BadTestPlugin.json
**/*.pro.user
push.sh

View File

@ -0,0 +1,3 @@
{
"Keys" : [ ]
}

View File

@ -0,0 +1,39 @@
#-------------------------------------------------
#
# Project created by QtCreator 2022-06-27T09:21:45
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = BadTestPlugin
TEMPLATE = lib
CONFIG += plugin
DESTDIR = $$[QT_INSTALL_PLUGINS]/generic
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
badplugin.cpp
HEADERS += \
badplugin.h \
../WingHexExplorer/plugin/iwingplugin.h
DISTFILES += BadTestPlugin.json
unix {
target.path = /usr/lib
INSTALLS += target
}

View File

@ -0,0 +1,7 @@
#include "badplugin.h"
BadPlugin::BadPlugin(QObject *parent) {}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(BadTestPlugin, BadPlugin)
#endif // QT_VERSION < 0x050000

20
BadTestPlugin/badplugin.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef BADPLUGIN_H
#define BADPLUGIN_H
#include "iwingplugin.h"
#include <QList>
#include <QObject>
class BadPlugin : public IWingPlugin {
Q_OBJECT
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID IWINGPLUGIN_INTERFACE_IID FILE "BadTestPlugin.json")
#endif // QT_VERSION >= 0x050000
Q_INTERFACES(IWingPlugin)
public:
BadPlugin(QObject *parent = nullptr);
};
#endif // BADPLUGIN_H

391
BadTestPlugin/iwingplugin.h Normal file
View File

@ -0,0 +1,391 @@
#ifndef IWINGPLUGIN_H
#define IWINGPLUGIN_H
#include <QCryptographicHash>
#include <QDockWidget>
#include <QList>
#include <QMenu>
#include <QObject>
#include <QWidget>
#include <QtCore>
enum ErrFile {
Success,
Error,
UnSaved,
Permission,
NotExist,
AlreadyOpened,
IsNewFile,
IsDirver,
WorkSpaceUnSaved
};
struct FindResult {
int fid;
QList<int> indices;
};
struct BookMark {
qlonglong pos;
QString comment;
};
class IWingPlugin;
struct HexPosition {
quint64 line;
int column;
quint8 lineWidth;
int nibbleindex;
HexPosition() = default;
inline qint64 offset() const {
return static_cast<qint64>(line * lineWidth) + column;
}
inline int operator-(const HexPosition &rhs) const {
return int(this->offset() - rhs.offset());
}
inline bool operator==(const HexPosition &rhs) const {
return (line == rhs.line) && (column == rhs.column) &&
(nibbleindex == rhs.nibbleindex);
}
inline bool operator!=(const HexPosition &rhs) const {
return (line != rhs.line) || (column != rhs.column) ||
(nibbleindex != rhs.nibbleindex);
}
};
struct HexMetadataAbsoluteItem {
qint64 begin;
qint64 end;
QColor foreground, background;
QString comment;
// added by wingsummer
bool operator==(const HexMetadataAbsoluteItem &item) {
return begin == item.begin && end == item.end &&
foreground == item.foreground && background == item.background &&
comment == item.comment;
}
HexMetadataAbsoluteItem(qint64 begin, qint64 end, QColor foreground,
QColor background, QString comment) {
this->begin = begin;
this->end = end;
this->foreground = foreground;
this->background = background;
this->comment = comment;
}
};
struct HexMetadataItem {
quint64 line;
int start, length;
QColor foreground, background;
QString comment;
// added by wingsummer
bool operator==(const HexMetadataItem &item) {
return line == item.line && start == item.start &&
foreground == item.foreground && background == item.background &&
comment == item.comment;
}
HexMetadataItem(quint64 line, int start, int length, QColor foreground,
QColor background, QString comment) {
this->line = line;
this->start = start;
this->length = length;
this->foreground = foreground;
this->background = background;
this->comment = comment;
}
};
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
typedef QLinkedList<HexMetadataItem> HexLineMetadata;
#else
typedef QList<HexMetadataItem> HexLineMetadata;
#endif
enum class WingPluginMessage {
PluginLoading,
PluginLoaded,
PluginUnLoading,
PluginUnLoaded,
ErrorMessage,
ConnectTimeout,
MessageResponse,
HookMessage
};
enum class ResponseMsg { UnImplement, Success, ErrorParams, Permission };
enum HookIndex {
None = 0,
OpenFileBegin = 1,
OpenFileEnd = 2,
OpenDriverBegin = 4,
OpenDriverEnd = 8,
CloseFileBegin = 16,
CloseFileEnd = 32,
NewFileBegin = 64,
NewFileEnd = 128
};
Q_DECLARE_METATYPE(WingPluginMessage)
Q_DECLARE_METATYPE(ResponseMsg)
Q_DECLARE_METATYPE(HookIndex)
namespace WingPlugin {
class Reader : public QObject {
Q_OBJECT
signals:
int currentDoc();
// document
bool isReadOnly();
bool isKeepSize();
bool isLocked();
quint64 documentLines();
quint64 documentBytes();
HexPosition currentPos();
HexPosition selectionPos();
quint64 currentRow();
quint64 currentColumn();
quint64 currentOffset();
quint64 selectlength();
bool stringVisible();
bool addressVisible();
bool headerVisible();
quint64 addressBase();
bool isModified();
bool isEmpty();
bool atEnd();
bool canUndo();
bool canRedo();
int areaIndent();
int hexLineWidth();
void copy(bool hex = false);
QByteArray read(qint64 offset, int len);
qint64 searchForward(const QByteArray &ba);
qint64 searchBackward(const QByteArray &ba);
void findAllBytes(qlonglong begin, qlonglong end, QByteArray b,
QList<quint64> &results, int maxCount = -1);
// render
bool editableArea(int area);
quint64 documentLastLine();
int documentLastColumn();
int documentWidth();
int lineHeight();
QRect getLineRect(quint64 line, quint64 firstline);
int headerLineCount();
int borderSize();
// metadata
bool lineHasMetadata(quint64 line) const;
QList<HexMetadataAbsoluteItem> getMetadatas(qint64 offset);
HexLineMetadata getMetaLine(quint64 line) const;
// bookmark
bool lineHasBookMark(quint64 line);
QList<qint64> getsBookmarkPos(quint64 line);
BookMark bookMark(qint64 pos);
QString bookMarkComment(qint64 pos);
void getBookMarks(QList<BookMark> &bookmarks);
bool existBookMark(qint64 pos);
// extension
QList<QString> getOpenFiles();
QStringList getSupportedEncodings();
QString currentEncoding();
};
class Controller : public QObject {
Q_OBJECT
signals:
// document
void switchDocument(int index, bool gui = false);
bool setLockedFile(bool b);
bool setKeepSize(bool b);
void setAsciiVisible(bool b);
void setAddressVisible(bool b);
void setHeaderVisible(bool b);
void setAddressBase(quint64 base);
void setAreaIndent(quint8 value);
void setHexLineWidth(quint8 value);
void undo();
void redo();
bool cut(bool hex = false);
void paste(bool hex = false);
bool insert(qint64 offset, uchar b);
bool replace(qint64 offset, uchar b);
bool insert(qint64 offset, const QByteArray &data);
bool replace(qint64 offset, const QByteArray &data);
bool remove(qint64 offset, int len);
// cursor
void moveTo(const HexPosition &pos);
void moveTo(quint64 line, int column, int nibbleindex = 1);
void moveTo(qint64 offset);
void select(const HexPosition &pos);
void select(quint64 line, int column, int nibbleindex = 1);
void select(int length);
void selectOffset(qint64 offset, int length);
void setInsertionMode(bool isinsert);
void setLineWidth(quint8 width);
// metadata
bool metadata(qint64 begin, qint64 end, const QColor &fgcolor,
const QColor &bgcolor, const QString &comment);
bool metadata(quint64 line, int start, int length, const QColor &fgcolor,
const QColor &bgcolor, const QString &comment);
bool removeMetadata(qint64 offset);
bool clearMeta();
bool color(quint64 line, int start, int length, const QColor &fgcolor,
const QColor &bgcolor);
bool foreground(quint64 line, int start, int length, const QColor &fgcolor);
bool background(quint64 line, int start, int length, const QColor &bgcolor);
bool comment(quint64 line, int start, int length, const QString &comment);
void applyMetas(QList<HexMetadataAbsoluteItem> metas);
// mainwindow
void newFile(bool bigfile = false);
ErrFile openFile(QString filename, bool readonly = false);
ErrFile openDriver(QString driver);
ErrFile closeFile(int index, bool force = false);
ErrFile saveFile(int index);
ErrFile exportFile(QString filename, int index);
void exportFileGUI();
ErrFile saveasFile(QString filename, int index);
void saveasFileGUI();
ErrFile closeCurrentFile(bool force = false);
ErrFile saveCurrentFile();
void openFileGUI();
void openDriverGUI();
void findGUI();
void gotoGUI();
void fillGUI();
void fillzeroGUI();
void fillnopGUI();
// bookmark
void setMetafgVisible(bool b);
void setMetabgVisible(bool b);
void setMetaCommentVisible(bool b);
bool addBookMark(qint64 pos, QString comment);
bool modBookMark(qint64 pos, QString comment);
void applyBookMarks(QList<BookMark> books);
bool removeBookMark(qint64 pos);
bool clearBookMark();
// workspace
bool openWorkSpace(QString filename, bool readonly = false);
bool setCurrentEncoding(QString encoding);
};
} // namespace WingPlugin
class IWingPlugin : public QObject {
Q_OBJECT
public:
virtual bool init(QList<IWingPlugin *> loadedplugins) = 0;
virtual ~IWingPlugin() {}
virtual void unload() = 0;
virtual QMenu *registerMenu() = 0;
virtual QDockWidget *registerDockWidget() = 0;
virtual Qt::DockWidgetArea registerDockWidgetDockArea() = 0;
virtual QString pluginName() = 0;
virtual QString pluginAuthor() = 0;
virtual uint pluginVersion() = 0;
virtual QString puid() = 0;
virtual QString signature() = 0;
virtual QString pluginComment() = 0;
virtual QList<QVariant> optionalInfos() = 0;
virtual HookIndex getHookSubscribe() = 0;
public slots:
virtual void plugin2MessagePipe(WingPluginMessage type,
QList<QVariant> msg) = 0;
signals:
bool requestControl(int timeout = 1500);
bool requestRelease();
public:
WingPlugin::Reader reader;
WingPlugin::Controller controller;
};
#define WINGSUMMER "wingsummer"
#define PluginDockWidgetInit(dw, widget, title, objname) \
dw = new QDockWidget; \
dw->setWidget(widget); \
dw->setWindowTitle(title); \
dw->setObjectName(objname);
#define PluginWidgetFree(w) w->deleteLater();
#define PluginMenuInitBegin(menu, title) \
menu = new QMenu; \
menu->setTitle(title); \
{ \
QAction *a;
#define PluginMenuAddItemAction(menu, title, slot) \
a = new QAction(title, this); \
connect(a, &QAction::triggered, this, &slot); \
menu->addAction(a);
#define PluginMenuAddItemLamba(menu, title, lamba) \
a = new QAction(title, this); \
connect(a, &QAction::triggered, this, lamba); \
menu->addAction(a);
#define PluginMenuAddItemIconAction(menu, title, icon, slot) \
a = new QAction(icon, title, this); \
connect(a, &QAction::triggered, this, &slot); \
menu->addAction(a);
#define PluginMenuAddItemIconLamba(menu, title, icon, lamba) \
a = new QAction(icon, title, this); \
connect(a, &QAction::triggered, this, lamba); \
menu->addAction(a);
#define PluginMenuInitEnd() }
class PluginUtils {
public:
static QString GetPUID(IWingPlugin *plugin) {
auto str = QString("%1%2%3%4%5")
.arg(WINGSUMMER)
.arg(plugin->pluginName())
.arg(plugin->pluginAuthor())
.arg(plugin->pluginComment())
.arg(plugin->pluginVersion());
return QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5)
.toHex();
}
static QString GetPuid(QString pluginName, QString author, QString comment,
uint version) {
auto str = QString("%1%2%3%4%5")
.arg(WINGSUMMER)
.arg(pluginName)
.arg(author)
.arg(comment)
.arg(version);
return QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5)
.toHex();
}
};
#define IWINGPLUGIN_INTERFACE_IID "com.wingsummer.iwingplugin"
Q_DECLARE_INTERFACE(IWingPlugin, IWINGPLUGIN_INTERFACE_IID)
#endif // IWINGPLUGIN_H

View File

@ -142,7 +142,7 @@ QHexEdit is released under MIT license
&emsp;&emsp;起初我打算使用`QHexEdit2`作为十六进制编辑器为基础进行开发,该组件虽然轻松打开超大文件,但是它的编辑功能能用是能用,但有很多大大小小的 Bug ,我还逐一修了修,但发现仅仅我的力量和时间是杯水车薪。然后我找到了`QHexView`,也就是上面所属的组件,但它有一个致命的缺陷,无法打开超大文件,被我 Pass 掉了,后来我尝试用了它,发现开发者在开发改组件是下了足够大的功夫的,编辑十分流畅。最近看到`QHexView`贡献者们想搞一个`QHexView 5.0`,对代码进行了重构,但并没有实现任何功能,差不多是个空空的框架,不过从接口看出更强大的易用性,这个是原组件所不具有的,这花费我比较多的时间来阅读源代码,并向外扩展接口以适应我的开发需求。
&emsp;&emsp;然后我想,既然`QHexEdit2`具有强大的打开文件的能力,而`QHexView`不具备,但它具有强大的编辑界面,于是乎,我移植`QHexEdit2`的打开超大文件的代码到`QHexView`当中,并做好了适配和功能增强。仓库的链接: https://github.com/Simsys/qhexedit2 ,它的协议如下:
&emsp;&emsp;然后我想,既然`QHexEdit2`具有强大的打开文件的能力,而`QHexView`不具备,但它具有强大的编辑界面,于是乎,我移植`QHexEdit2`的打开超大文件的代码到`QHexView`当中,并做好了适配和功能增强。仓库的链接: https://github.com/Simsys/qhexedit2 ,它的协议如下:
Copyright (C) 2015-2016 Winfried Simon

View File

@ -1,94 +0,0 @@
#ifndef IWINGPLUGIN_H
#define IWINGPLUGIN_H
#include <QCryptographicHash>
#include <QDockWidget>
#include <QList>
#include <QMenu>
#include <QObject>
#include <QWidget>
enum WingPluginMessage {
PluginLoading,
PluginLoaded,
PluginUnLoading,
PluginUnLoaded,
ErrorMessage,
PluginCall
};
enum CallTableIndex {
NewFile,
OpenFile,
OpenFileGUI,
CloseFile,
SaveFile,
SaveAsFile,
ExportFile,
Undo,
Redo,
WriteFileBytes,
ReadFileBytes,
DeleteFileBytes,
FindFileBytes,
GotFileOffset,
GotoFileLine,
};
class IWingPlugin {
public:
virtual bool init(QList<IWingPlugin *> loadedplugins) = 0;
virtual ~IWingPlugin() {}
virtual void unload() = 0;
virtual QMenu *registerMenu() = 0;
virtual QDockWidget *registerDockWidget() = 0;
virtual QString pluginName() = 0;
virtual QString pluginAuthor() = 0;
virtual uint pluginVersion() = 0;
virtual QString puid() = 0;
virtual QString signature() = 0;
virtual QString comment() = 0;
virtual QList<QVariant> optionalInfos() = 0;
IWingPlugin *self;
signals:
void host2MessagePipe(IWingPlugin *sender, WingPluginMessage type,
QList<QVariant> msg);
public slots:
virtual void plugin2MessagePipe(WingPluginMessage type,
QList<QVariant> msg) = 0;
};
const QString sign = "wingsummer";
class PluginUtils {
public:
static QString GetPUID(IWingPlugin *plugin) {
auto str = QString("%1%2%3%4%5")
.arg(sign)
.arg(plugin->pluginName())
.arg(plugin->pluginAuthor())
.arg(plugin->comment())
.arg(plugin->pluginVersion());
return QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5)
.toHex();
}
static QString GetPuid(QString pluginName, QString author, QString comment,
uint version) {
auto str = QString("%1%2%3%4%5")
.arg(sign)
.arg(pluginName)
.arg(author)
.arg(comment)
.arg(version);
return QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5)
.toHex();
}
};
#define IWINGPLUGIN_INTERFACE_IID "com.wingsummer.iwingplugin"
Q_DECLARE_INTERFACE(IWingPlugin, IWINGPLUGIN_INTERFACE_IID)
#endif // IWINGPLUGIN_H

View File

@ -7,11 +7,11 @@ TestPlugin::TestPlugin(QObject *parent){Q_UNUSED(parent)}
TestPlugin::~TestPlugin() {}
bool TestPlugin::init(QList<IWingPlugin *> loadedplugins) {
if (loadedplugins.length() > 0) {
bool TestPlugin::init(QList<WingPluginInfo> loadedplugin) {
if (loadedplugin.length() > 0) {
QString ps;
for (auto item : loadedplugins) {
ps.append(item->pluginName());
for (auto item : loadedplugin) {
ps.append(item.pluginName);
ps.append('\n');
}
QMessageBox::information(nullptr, "Test", ps);
@ -63,7 +63,7 @@ void TestPlugin::plugin2MessagePipe(WingPluginMessage type,
controller.setKeepSize(true);
controller.metadata(0, 2, Qt::red, Qt::transparent, QString());
requestRelease();
controller.newFile();
controller.newFile(); //此语句在 requestRelease 释放成功无效
}
}
}

View File

@ -16,7 +16,7 @@ class TestPlugin : public IWingPlugin {
public:
TestPlugin(QObject *parent = nullptr);
bool init(QList<IWingPlugin *> loadedplugins) override;
bool init(QList<WingPluginInfo> loadedplugin) override;
~TestPlugin() override;
void unload() override;
QMenu *registerMenu() override;

View File

@ -161,8 +161,9 @@ MainWindow::MainWindow(DMainWindow *parent) {
auto keyGeneral =
QKeySequence(Qt::KeyboardModifier::ControlModifier |
Qt::KeyboardModifier::ShiftModifier | Qt::Key_G);
auto keyplugin = QKeySequence(Qt::KeyboardModifier::ControlModifier |
Qt::KeyboardModifier::AltModifier | Qt::Key_P);
auto keyplugin =
QKeySequence(Qt::KeyboardModifier::ControlModifier |
Qt::KeyboardModifier::ShiftModifier | Qt::Key_P);
auto keymetadata =
QKeySequence(Qt::KeyboardModifier::ControlModifier | Qt::Key_M);
auto keymetaedit =

View File

@ -2,27 +2,54 @@
#include "utilities.h"
#include <DLabel>
#include <QListWidgetItem>
#include <QPushButton>
#define Bool2String(b) (b ? "true" : "false")
PluginWindow::PluginWindow(DMainWindow *parent) : DDialog(parent) {
this->setFixedSize(500, 600);
this->setFixedSize(500, 750);
this->setWindowTitle(tr("plugin"));
txtc = new DTextBrowser(this);
addContent(txtc);
addSpacing(5);
plglist = new DListWidget(this);
plglist->setFixedHeight(200);
this->addContent(plglist);
addContent(plglist);
addSpacing(5);
txtb = new DTextBrowser(this);
this->addContent(txtb);
txtb->setMinimumHeight(300);
addContent(txtb);
addSpacing(10);
connect(plglist, &QListWidget::itemSelectionChanged, this,
&PluginWindow::on_list_selchanged);
auto btn = new QPushButton(tr("Refresh"), this);
connect(btn, &QPushButton::clicked, this,
[=] { this->setPluginSystem(m_pluginsys); });
addContent(btn);
}
PluginWindow::~PluginWindow() {}
void PluginWindow::setPluginSystem(PluginSystem *pluginsys) {
m_pluginsys = pluginsys;
plglist->clear();
auto pico = ICONRES("plugin");
for (auto item : pluginsys->plugins()) {
plglist->addItem(new QListWidgetItem(pico, item->pluginName()));
}
#define CInfo(mem, info) txtc->append(mem + " : " + info)
txtc->clear();
if (pluginsys->hasControl()) {
auto p = pluginsys->currentControlPlugin();
CInfo(tr("CtlPlg"), p->pluginName());
CInfo(tr("CtlPlgPuid"), p->puid());
CInfo(tr("CtlPlgAuthor"), p->pluginAuthor());
CInfo(tr("ControlTimeout"),
Bool2String(pluginsys->currentControlTimeout()));
} else {
txtc->append(tr("NoPlgControl"));
}
}
void PluginWindow::on_list_selchanged() {
@ -40,4 +67,9 @@ void PluginWindow::on_list_selchanged() {
for (auto item : plg->optionalInfos()) {
Info(QString::number(i), item.toString());
}
txtb->append(QString(10, '-'));
bool hc = plg == m_pluginsys->currentControlPlugin();
Info(tr("HasControl"), Bool2String(hc));
Info(tr("ControlTimeout"),
(hc ? Bool2String(m_pluginsys->currentControlTimeout()) : QString("-")));
}

View File

@ -22,6 +22,7 @@ private:
PluginSystem *m_pluginsys;
DListWidget *plglist;
DTextBrowser *txtb;
DTextBrowser *txtc;
void on_list_selchanged();
};

Binary file not shown.

View File

@ -133,48 +133,48 @@
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="142"/>
<location filename="../dialog/mainwindow.cpp" line="485"/>
<location filename="../dialog/mainwindow.cpp" line="486"/>
<source>New</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="150"/>
<location filename="../dialog/mainwindow.cpp" line="490"/>
<location filename="../dialog/mainwindow.cpp" line="491"/>
<source>OpenF</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="232"/>
<location filename="../dialog/mainwindow.cpp" line="493"/>
<location filename="../dialog/mainwindow.cpp" line="233"/>
<location filename="../dialog/mainwindow.cpp" line="494"/>
<source>OpenD</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="235"/>
<location filename="../dialog/mainwindow.cpp" line="495"/>
<location filename="../dialog/mainwindow.cpp" line="236"/>
<location filename="../dialog/mainwindow.cpp" line="496"/>
<source>Save</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="238"/>
<location filename="../dialog/mainwindow.cpp" line="497"/>
<location filename="../dialog/mainwindow.cpp" line="239"/>
<location filename="../dialog/mainwindow.cpp" line="498"/>
<source>SaveAs</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="241"/>
<location filename="../dialog/mainwindow.cpp" line="499"/>
<location filename="../dialog/mainwindow.cpp" line="242"/>
<location filename="../dialog/mainwindow.cpp" line="500"/>
<source>Export</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="244"/>
<location filename="../dialog/mainwindow.cpp" line="245"/>
<source>SaveSel</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="230"/>
<location filename="../dialog/mainwindow.cpp" line="492"/>
<location filename="../dialog/mainwindow.cpp" line="231"/>
<location filename="../dialog/mainwindow.cpp" line="493"/>
<source>OpenWorkSpace</source>
<translation></translation>
</message>
@ -187,483 +187,480 @@
<translation type="vanished"></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="254"/>
<location filename="../dialog/mainwindow.cpp" line="255"/>
<source>Exit</source>
<translation>退</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="259"/>
<location filename="../dialog/mainwindow.cpp" line="260"/>
<source>Edit</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="261"/>
<location filename="../dialog/mainwindow.cpp" line="502"/>
<location filename="../dialog/mainwindow.cpp" line="262"/>
<location filename="../dialog/mainwindow.cpp" line="503"/>
<source>Undo</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="264"/>
<location filename="../dialog/mainwindow.cpp" line="504"/>
<location filename="../dialog/mainwindow.cpp" line="265"/>
<location filename="../dialog/mainwindow.cpp" line="505"/>
<source>Redo</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="268"/>
<location filename="../dialog/mainwindow.cpp" line="413"/>
<location filename="../dialog/mainwindow.cpp" line="508"/>
<location filename="../dialog/mainwindow.cpp" line="269"/>
<location filename="../dialog/mainwindow.cpp" line="414"/>
<location filename="../dialog/mainwindow.cpp" line="509"/>
<source>Cut</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="271"/>
<location filename="../dialog/mainwindow.cpp" line="415"/>
<location filename="../dialog/mainwindow.cpp" line="509"/>
<location filename="../dialog/mainwindow.cpp" line="272"/>
<location filename="../dialog/mainwindow.cpp" line="416"/>
<location filename="../dialog/mainwindow.cpp" line="510"/>
<source>CutHex</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="274"/>
<location filename="../dialog/mainwindow.cpp" line="417"/>
<location filename="../dialog/mainwindow.cpp" line="514"/>
<location filename="../dialog/mainwindow.cpp" line="275"/>
<location filename="../dialog/mainwindow.cpp" line="418"/>
<location filename="../dialog/mainwindow.cpp" line="515"/>
<source>Copy</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="277"/>
<location filename="../dialog/mainwindow.cpp" line="419"/>
<location filename="../dialog/mainwindow.cpp" line="515"/>
<location filename="../dialog/mainwindow.cpp" line="278"/>
<location filename="../dialog/mainwindow.cpp" line="420"/>
<location filename="../dialog/mainwindow.cpp" line="516"/>
<source>CopyHex</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="280"/>
<location filename="../dialog/mainwindow.cpp" line="421"/>
<location filename="../dialog/mainwindow.cpp" line="520"/>
<location filename="../dialog/mainwindow.cpp" line="281"/>
<location filename="../dialog/mainwindow.cpp" line="422"/>
<location filename="../dialog/mainwindow.cpp" line="521"/>
<source>Paste</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="283"/>
<location filename="../dialog/mainwindow.cpp" line="423"/>
<location filename="../dialog/mainwindow.cpp" line="521"/>
<location filename="../dialog/mainwindow.cpp" line="284"/>
<location filename="../dialog/mainwindow.cpp" line="424"/>
<location filename="../dialog/mainwindow.cpp" line="522"/>
<source>PasteHex</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="286"/>
<location filename="../dialog/mainwindow.cpp" line="425"/>
<location filename="../dialog/mainwindow.cpp" line="525"/>
<location filename="../dialog/mainwindow.cpp" line="287"/>
<location filename="../dialog/mainwindow.cpp" line="426"/>
<location filename="../dialog/mainwindow.cpp" line="526"/>
<source>Delete</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="290"/>
<location filename="../dialog/mainwindow.cpp" line="428"/>
<location filename="../dialog/mainwindow.cpp" line="528"/>
<location filename="../dialog/mainwindow.cpp" line="291"/>
<location filename="../dialog/mainwindow.cpp" line="429"/>
<location filename="../dialog/mainwindow.cpp" line="529"/>
<source>Find</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="293"/>
<location filename="../dialog/mainwindow.cpp" line="430"/>
<location filename="../dialog/mainwindow.cpp" line="530"/>
<location filename="../dialog/mainwindow.cpp" line="294"/>
<location filename="../dialog/mainwindow.cpp" line="431"/>
<location filename="../dialog/mainwindow.cpp" line="531"/>
<source>Goto</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="297"/>
<location filename="../dialog/mainwindow.cpp" line="431"/>
<location filename="../dialog/mainwindow.cpp" line="535"/>
<location filename="../dialog/mainwindow.cpp" line="2682"/>
<location filename="../dialog/mainwindow.cpp" line="298"/>
<location filename="../dialog/mainwindow.cpp" line="432"/>
<location filename="../dialog/mainwindow.cpp" line="536"/>
<location filename="../dialog/mainwindow.cpp" line="2883"/>
<source>Fill</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="300"/>
<location filename="../dialog/mainwindow.cpp" line="536"/>
<location filename="../dialog/mainwindow.cpp" line="301"/>
<location filename="../dialog/mainwindow.cpp" line="537"/>
<source>FillNop</source>
<translation> nop</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="303"/>
<location filename="../dialog/mainwindow.cpp" line="537"/>
<location filename="../dialog/mainwindow.cpp" line="304"/>
<location filename="../dialog/mainwindow.cpp" line="538"/>
<source>FillZero</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="325"/>
<location filename="../dialog/mainwindow.cpp" line="432"/>
<location filename="../dialog/mainwindow.cpp" line="550"/>
<location filename="../dialog/mainwindow.cpp" line="326"/>
<location filename="../dialog/mainwindow.cpp" line="433"/>
<location filename="../dialog/mainwindow.cpp" line="551"/>
<source>MetaData</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="331"/>
<location filename="../dialog/mainwindow.cpp" line="553"/>
<location filename="../dialog/mainwindow.cpp" line="332"/>
<location filename="../dialog/mainwindow.cpp" line="554"/>
<source>DeleteMetaData</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="334"/>
<location filename="../dialog/mainwindow.cpp" line="555"/>
<location filename="../dialog/mainwindow.cpp" line="335"/>
<location filename="../dialog/mainwindow.cpp" line="556"/>
<source>ClearMetaData</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="315"/>
<location filename="../dialog/mainwindow.cpp" line="434"/>
<location filename="../dialog/mainwindow.cpp" line="578"/>
<location filename="../dialog/mainwindow.cpp" line="831"/>
<location filename="../dialog/mainwindow.cpp" line="840"/>
<location filename="../dialog/mainwindow.cpp" line="2557"/>
<location filename="../dialog/mainwindow.cpp" line="2565"/>
<location filename="../dialog/mainwindow.cpp" line="316"/>
<location filename="../dialog/mainwindow.cpp" line="435"/>
<location filename="../dialog/mainwindow.cpp" line="579"/>
<location filename="../dialog/mainwindow.cpp" line="834"/>
<location filename="../dialog/mainwindow.cpp" line="863"/>
<location filename="../dialog/mainwindow.cpp" line="2767"/>
<location filename="../dialog/mainwindow.cpp" line="2775"/>
<source>BookMark</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="318"/>
<location filename="../dialog/mainwindow.cpp" line="579"/>
<location filename="../dialog/mainwindow.cpp" line="319"/>
<location filename="../dialog/mainwindow.cpp" line="580"/>
<location filename="../dialog/mainwindow.cpp" line="838"/>
<source>DeleteBookMark</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="321"/>
<location filename="../dialog/mainwindow.cpp" line="581"/>
<location filename="../dialog/mainwindow.cpp" line="322"/>
<location filename="../dialog/mainwindow.cpp" line="582"/>
<location filename="../dialog/mainwindow.cpp" line="848"/>
<source>ClearBookMark</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="307"/>
<location filename="../dialog/mainwindow.cpp" line="436"/>
<location filename="../dialog/mainwindow.cpp" line="586"/>
<location filename="../dialog/mainwindow.cpp" line="308"/>
<location filename="../dialog/mainwindow.cpp" line="437"/>
<location filename="../dialog/mainwindow.cpp" line="587"/>
<source>Encoding</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="366"/>
<location filename="../dialog/mainwindow.cpp" line="367"/>
<source>Setting</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="368"/>
<location filename="../dialog/mainwindow.cpp" line="589"/>
<location filename="../dialog/mainwindow.cpp" line="369"/>
<location filename="../dialog/mainwindow.cpp" line="590"/>
<source>General</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="370"/>
<location filename="../dialog/mainwindow.cpp" line="378"/>
<location filename="../dialog/mainwindow.cpp" line="371"/>
<location filename="../dialog/mainwindow.cpp" line="379"/>
<source>Plugin</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="373"/>
<location filename="../dialog/mainwindow.cpp" line="374"/>
<source>RestoreLayout</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="380"/>
<location filename="../dialog/mainwindow.cpp" line="381"/>
<source>LoadPlugin</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="393"/>
<location filename="../dialog/mainwindow.cpp" line="394"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="395"/>
<location filename="../dialog/mainwindow.cpp" line="590"/>
<location filename="../dialog/mainwindow.cpp" line="396"/>
<location filename="../dialog/mainwindow.cpp" line="591"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="396"/>
<location filename="../dialog/mainwindow.cpp" line="397"/>
<source>Sponsor</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="328"/>
<location filename="../dialog/mainwindow.cpp" line="551"/>
<location filename="../dialog/mainwindow.cpp" line="329"/>
<location filename="../dialog/mainwindow.cpp" line="552"/>
<source>MetaDataEdit</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="148"/>
<location filename="../dialog/mainwindow.cpp" line="486"/>
<location filename="../dialog/mainwindow.cpp" line="487"/>
<source>NewBigFile</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="249"/>
<location filename="../dialog/mainwindow.cpp" line="250"/>
<source>RecentFile</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="313"/>
<location filename="../dialog/mainwindow.cpp" line="314"/>
<source>Mark</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="388"/>
<location filename="../dialog/mainwindow.cpp" line="389"/>
<source>Window</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="397"/>
<location filename="../dialog/mainwindow.cpp" line="398"/>
<source>Wiki</source>
<translation> Wiki</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="348"/>
<location filename="../dialog/mainwindow.cpp" line="559"/>
<location filename="../dialog/mainwindow.cpp" line="349"/>
<location filename="../dialog/mainwindow.cpp" line="560"/>
<source>ShowMetafg</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="351"/>
<location filename="../dialog/mainwindow.cpp" line="562"/>
<location filename="../dialog/mainwindow.cpp" line="352"/>
<location filename="../dialog/mainwindow.cpp" line="563"/>
<source>ShowMetabg</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="354"/>
<location filename="../dialog/mainwindow.cpp" line="564"/>
<location filename="../dialog/mainwindow.cpp" line="355"/>
<location filename="../dialog/mainwindow.cpp" line="565"/>
<source>ShowMetaComment</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="359"/>
<location filename="../dialog/mainwindow.cpp" line="569"/>
<location filename="../dialog/mainwindow.cpp" line="360"/>
<location filename="../dialog/mainwindow.cpp" line="570"/>
<source>MetaShowAll</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="361"/>
<location filename="../dialog/mainwindow.cpp" line="570"/>
<location filename="../dialog/mainwindow.cpp" line="362"/>
<location filename="../dialog/mainwindow.cpp" line="571"/>
<source>MetaHideAll</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="618"/>
<location filename="../dialog/mainwindow.cpp" line="619"/>
<source>SetaddressBase</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="622"/>
<location filename="../dialog/mainwindow.cpp" line="623"/>
<source>addressBase</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="622"/>
<location filename="../dialog/mainwindow.cpp" line="623"/>
<source>inputAddressBase</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="630"/>
<location filename="../dialog/mainwindow.cpp" line="631"/>
<source>WarnBigBaseAddress</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="635"/>
<location filename="../dialog/mainwindow.cpp" line="636"/>
<source>ErrBaseAddress</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="641"/>
<location filename="../dialog/mainwindow.cpp" line="642"/>
<source>SetColInfo</source>
<translation>/</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="645"/>
<location filename="../dialog/mainwindow.cpp" line="646"/>
<source>SetHeaderInfo</source>
<translation>/</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="649"/>
<location filename="../dialog/mainwindow.cpp" line="650"/>
<source>SetAsciiString</source>
<translation>/</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="654"/>
<location filename="../dialog/mainwindow.cpp" line="655"/>
<source>loc:</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="661"/>
<location filename="../dialog/mainwindow.cpp" line="662"/>
<source>sel:</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="683"/>
<location filename="../dialog/mainwindow.cpp" line="684"/>
<source>InfoSave</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="686"/>
<location filename="../dialog/mainwindow.cpp" line="687"/>
<source>InfoReadWrite</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="688"/>
<location filename="../dialog/mainwindow.cpp" line="689"/>
<source>InfoWorks</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="699"/>
<location filename="../dialog/mainwindow.cpp" line="700"/>
<source>SetLocked</source>
<translation>/</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="703"/>
<location filename="../dialog/mainwindow.cpp" line="704"/>
<source>SetOver</source>
<translation>/</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="708"/>
<location filename="../dialog/mainwindow.cpp" line="709"/>
<source>ErrUnLock</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="715"/>
<location filename="../dialog/mainwindow.cpp" line="716"/>
<source>ErrUnOver</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="719"/>
<location filename="../dialog/mainwindow.cpp" line="720"/>
<source>InfoCanOverLimit</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="730"/>
<location filename="../dialog/mainwindow.cpp" line="731"/>
<source>ExportFindResult</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="732"/>
<location filename="../dialog/mainwindow.cpp" line="733"/>
<source>ClearFindResult</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="760"/>
<location filename="../dialog/mainwindow.cpp" line="761"/>
<source>file</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="760"/>
<location filename="../dialog/mainwindow.cpp" line="761"/>
<source>addr</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="760"/>
<location filename="../dialog/mainwindow.cpp" line="761"/>
<source>value</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="783"/>
<location filename="../dialog/mainwindow.cpp" line="786"/>
<location filename="../dialog/mainwindow.cpp" line="784"/>
<location filename="../dialog/mainwindow.cpp" line="787"/>
<source>FindResult</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="790"/>
<location filename="../dialog/mainwindow.cpp" line="792"/>
<location filename="../dialog/mainwindow.cpp" line="791"/>
<location filename="../dialog/mainwindow.cpp" line="793"/>
<source>Log</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="802"/>
<location filename="../dialog/mainwindow.cpp" line="804"/>
<source>LoggerInitFinish</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1025"/>
<location filename="../dialog/mainwindow.cpp" line="1050"/>
<source>ErrDockWidgetAddNoName</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1930"/>
<location filename="../dialog/mainwindow.cpp" line="1941"/>
<location filename="../dialog/mainwindow.cpp" line="2150"/>
<location filename="../dialog/mainwindow.cpp" line="2161"/>
<source>CutToClipBoard</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1933"/>
<location filename="../dialog/mainwindow.cpp" line="1944"/>
<location filename="../dialog/mainwindow.cpp" line="2153"/>
<location filename="../dialog/mainwindow.cpp" line="2164"/>
<source>UnCutToClipBoard</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1952"/>
<location filename="../dialog/mainwindow.cpp" line="1959"/>
<location filename="../dialog/mainwindow.cpp" line="2172"/>
<location filename="../dialog/mainwindow.cpp" line="2179"/>
<source>CopyToClipBoard</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2026"/>
<location filename="../dialog/mainwindow.cpp" line="2051"/>
<location filename="../dialog/mainwindow.cpp" line="2246"/>
<location filename="../dialog/mainwindow.cpp" line="2271"/>
<source>SaveWSError</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2123"/>
<location filename="../dialog/mainwindow.cpp" line="2343"/>
<source>TooMuchFindResult</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2129"/>
<location filename="../dialog/mainwindow.cpp" line="2349"/>
<source>FindFininishError</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2415"/>
<location filename="../dialog/mainwindow.cpp" line="2457"/>
<location filename="../dialog/mainwindow.cpp" line="2484"/>
<location filename="../dialog/mainwindow.cpp" line="2497"/>
<location filename="../dialog/mainwindow.cpp" line="2508"/>
<location filename="../dialog/mainwindow.cpp" line="2529"/>
<location filename="../dialog/mainwindow.cpp" line="2548"/>
<location filename="../dialog/mainwindow.cpp" line="2579"/>
<location filename="../dialog/mainwindow.cpp" line="2593"/>
<location filename="../dialog/mainwindow.cpp" line="2651"/>
<location filename="../dialog/mainwindow.cpp" line="2658"/>
<location filename="../dialog/mainwindow.cpp" line="2665"/>
<location filename="../dialog/mainwindow.cpp" line="2637"/>
<location filename="../dialog/mainwindow.cpp" line="2679"/>
<location filename="../dialog/mainwindow.cpp" line="2706"/>
<location filename="../dialog/mainwindow.cpp" line="2719"/>
<location filename="../dialog/mainwindow.cpp" line="2758"/>
<location filename="../dialog/mainwindow.cpp" line="2789"/>
<location filename="../dialog/mainwindow.cpp" line="2803"/>
<source>CheckKeepSize</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2443"/>
<location filename="../dialog/mainwindow.cpp" line="2665"/>
<source>NoMetaData</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2739"/>
<location filename="../dialog/mainwindow.cpp" line="2940"/>
<source>EmptyFindResult</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2761"/>
<location filename="../dialog/mainwindow.cpp" line="2962"/>
<source>SaveFindResult</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2765"/>
<location filename="../dialog/mainwindow.cpp" line="2966"/>
<source>SaveFindResultError</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2828"/>
<location filename="../dialog/mainwindow.cpp" line="3029"/>
<source>ProjectFile (*.wingpro)</source>
<translation> (*.wingpro)</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2837"/>
<location filename="../dialog/mainwindow.cpp" line="3038"/>
<source>WSOpenedUnSuccessfully</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2840"/>
<location filename="../dialog/mainwindow.cpp" line="3041"/>
<source>WorkSpaceOpenUnSuccessfully</source>
<translation></translation>
</message>
@ -680,53 +677,53 @@
<translation type="vanished"></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="810"/>
<location filename="../dialog/mainwindow.cpp" line="812"/>
<source>Value</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="805"/>
<location filename="../dialog/mainwindow.cpp" line="824"/>
<location filename="../dialog/mainwindow.cpp" line="807"/>
<location filename="../dialog/mainwindow.cpp" line="826"/>
<source>Number</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="920"/>
<location filename="../dialog/mainwindow.cpp" line="945"/>
<source>SettingLoading</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="980"/>
<location filename="../dialog/mainwindow.cpp" line="1005"/>
<source>PluginLoading</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="994"/>
<location filename="../dialog/mainwindow.cpp" line="1019"/>
<source>UnLoadPluginSetting</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1015"/>
<location filename="../dialog/mainwindow.cpp" line="1040"/>
<source>MenuName :</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1028"/>
<location filename="../dialog/mainwindow.cpp" line="1053"/>
<source>DockWidgetName :</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1556"/>
<location filename="../dialog/mainwindow.cpp" line="1776"/>
<source>Untitled</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2721"/>
<location filename="../dialog/mainwindow.cpp" line="2922"/>
<source>ChoosePlugin</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2721"/>
<location filename="../dialog/mainwindow.cpp" line="2922"/>
<source>PluginFile (*.wingplg)</source>
<translation> (*.wingplg)</translation>
</message>
@ -735,109 +732,109 @@
<translation type="vanished"> ROOT </translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1977"/>
<location filename="../dialog/mainwindow.cpp" line="2197"/>
<source>DriverOpenErrorTip</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1797"/>
<location filename="../dialog/mainwindow.cpp" line="1885"/>
<location filename="../dialog/mainwindow.cpp" line="1894"/>
<location filename="../dialog/mainwindow.cpp" line="2017"/>
<location filename="../dialog/mainwindow.cpp" line="2105"/>
<location filename="../dialog/mainwindow.cpp" line="2114"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1797"/>
<location filename="../dialog/mainwindow.cpp" line="2017"/>
<source>NoRoot</source>
<translation> root </translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1879"/>
<location filename="../dialog/mainwindow.cpp" line="2828"/>
<location filename="../dialog/mainwindow.cpp" line="2099"/>
<location filename="../dialog/mainwindow.cpp" line="3029"/>
<source>ChooseFile</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1885"/>
<location filename="../dialog/mainwindow.cpp" line="2105"/>
<source>FileNotExist</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1894"/>
<location filename="../dialog/mainwindow.cpp" line="2114"/>
<source>FilePermission</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1906"/>
<location filename="../dialog/mainwindow.cpp" line="2001"/>
<location filename="../dialog/mainwindow.cpp" line="2126"/>
<location filename="../dialog/mainwindow.cpp" line="2221"/>
<source>Close</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1907"/>
<location filename="../dialog/mainwindow.cpp" line="2002"/>
<location filename="../dialog/mainwindow.cpp" line="2127"/>
<location filename="../dialog/mainwindow.cpp" line="2222"/>
<source>ConfirmSave</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="1984"/>
<location filename="../dialog/mainwindow.cpp" line="2204"/>
<source>ChooseExportFile</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2023"/>
<location filename="../dialog/mainwindow.cpp" line="2048"/>
<location filename="../dialog/mainwindow.cpp" line="2243"/>
<location filename="../dialog/mainwindow.cpp" line="2268"/>
<source>SaveSuccessfully</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2029"/>
<location filename="../dialog/mainwindow.cpp" line="2054"/>
<location filename="../dialog/mainwindow.cpp" line="2249"/>
<location filename="../dialog/mainwindow.cpp" line="2274"/>
<source>SaveUnSuccessfully</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2041"/>
<location filename="../dialog/mainwindow.cpp" line="2232"/>
<location filename="../dialog/mainwindow.cpp" line="2743"/>
<location filename="../dialog/mainwindow.cpp" line="2261"/>
<location filename="../dialog/mainwindow.cpp" line="2452"/>
<location filename="../dialog/mainwindow.cpp" line="2944"/>
<source>ChooseSaveFile</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2126"/>
<location filename="../dialog/mainwindow.cpp" line="2346"/>
<source>FindFininish</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2243"/>
<location filename="../dialog/mainwindow.cpp" line="2463"/>
<source>SaveSelError</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2255"/>
<location filename="../dialog/mainwindow.cpp" line="2274"/>
<location filename="../dialog/mainwindow.cpp" line="2476"/>
<location filename="../dialog/mainwindow.cpp" line="2496"/>
<source>Addr : 0x%1</source>
<translation>0x%1</translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2447"/>
<location filename="../dialog/mainwindow.cpp" line="2474"/>
<location filename="../dialog/mainwindow.cpp" line="2669"/>
<location filename="../dialog/mainwindow.cpp" line="2696"/>
<source>NoSelection</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2557"/>
<location filename="../dialog/mainwindow.cpp" line="2565"/>
<location filename="../dialog/mainwindow.cpp" line="2767"/>
<location filename="../dialog/mainwindow.cpp" line="2775"/>
<source>InputComment</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2682"/>
<location filename="../dialog/mainwindow.cpp" line="2883"/>
<source>PleaseInputFill</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/mainwindow.cpp" line="2694"/>
<location filename="../dialog/mainwindow.cpp" line="2895"/>
<source>FillInputError</source>
<translation></translation>
</message>
@ -913,40 +910,76 @@
<context>
<name>PluginWindow</name>
<message>
<location filename="../dialog/pluginwindow.cpp" line="8"/>
<location filename="../dialog/pluginwindow.cpp" line="11"/>
<source>plugin</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="33"/>
<location filename="../dialog/pluginwindow.cpp" line="25"/>
<source>Refresh</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="45"/>
<source>CtlPlg</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="46"/>
<source>CtlPlgPuid</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="47"/>
<source>CtlPlgAuthor</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="48"/>
<location filename="../dialog/pluginwindow.cpp" line="73"/>
<source>ControlTimeout</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="51"/>
<source>NoPlgControl</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="60"/>
<source>pluginName</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="34"/>
<location filename="../dialog/pluginwindow.cpp" line="61"/>
<source>pluginAuthor</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="35"/>
<location filename="../dialog/pluginwindow.cpp" line="62"/>
<source>pluginVersion</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="36"/>
<location filename="../dialog/pluginwindow.cpp" line="63"/>
<source>pluginComment</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="37"/>
<location filename="../dialog/pluginwindow.cpp" line="64"/>
<source>PUID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="39"/>
<location filename="../dialog/pluginwindow.cpp" line="66"/>
<source>optionalInfos</source>
<translation></translation>
</message>
<message>
<location filename="../dialog/pluginwindow.cpp" line="72"/>
<source>HasControl</source>
<translation></translation>
</message>
</context>
<context>
<name>QObject</name>

View File

@ -291,10 +291,18 @@ signals:
};
} // namespace WingPlugin
struct WingPluginInfo {
QString pluginName;
QString pluginAuthor;
uint pluginVersion;
QString puid;
QString pluginComment;
};
class IWingPlugin : public QObject {
Q_OBJECT
public:
virtual bool init(QList<IWingPlugin *> loadedplugins) = 0;
virtual bool init(QList<WingPluginInfo> loadedplugin) = 0;
virtual ~IWingPlugin() {}
virtual void unload() = 0;
virtual QMenu *registerMenu() = 0;

View File

@ -44,6 +44,7 @@ void PluginSystem::loadPlugin(QFileInfo fileinfo) {
QPluginLoader loader(fileinfo.absoluteFilePath());
logger->logMessage(
INFOLOG(QString(">> ") + tr("LoadingPlugin") + fileinfo.fileName()));
QList<WingPluginInfo> loadedplginfos;
auto p = qobject_cast<IWingPlugin *>(loader.instance());
if (p) {
if (p->signature() != WINGSUMMER) {
@ -70,8 +71,16 @@ void PluginSystem::loadPlugin(QFileInfo fileinfo) {
emit p->plugin2MessagePipe(WingPluginMessage::PluginLoading, emptyparam);
p->init(loadedplgs);
p->init(loadedplginfos);
WingPluginInfo info;
info.puid = p->puid();
info.pluginName = p->pluginName();
info.pluginAuthor = p->pluginAuthor();
info.pluginComment = p->pluginComment();
info.pluginVersion = p->pluginVersion();
loadedplginfos.push_back(info);
loadedplgs.push_back(p);
loadedpuid << puid;
@ -177,3 +186,11 @@ void PluginSystem::initControl(IWingPlugin *plugin) {
}
bool PluginSystem::hasControl() { return curpluginctl != nullptr; }
IWingPlugin *PluginSystem::currentControlPlugin() { return curpluginctl; }
bool PluginSystem::currentControlTimeout() {
if (hasControl())
return plugintimeout[curpluginctl];
return true;
}

View File

@ -27,9 +27,10 @@ public:
bool requestRelease(IWingPlugin *plugin);
bool hasControl();
void resetTimeout(IWingPlugin *plugin);
void initControl(IWingPlugin *plugin);
void loadPlugin(QFileInfo filename);
IWingPlugin *currentControlPlugin();
bool currentControlTimeout();
private:
const QList<QVariant> emptyparam;