3#include <QPluginLoader> 
    9#include <QLoggingCategory> 
   13#include "RabbitCommonDir.h" 
   14#include "RabbitCommonTools.h" 
   15#include "ParameterPluginUI.h" 
   16#include "ParameterRecordUI.h" 
   17#if defined(HAVE_QTERMWIDGET) 
   18    #include "ParameterTerminalUI.h" 
   19    #include "OperateTerminal.h" 
   22    #include "ChannelSSH.h" 
   32static Q_LOGGING_CATEGORY(log, 
"Manager")
 
   43    m_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
 
   44        "Plugin", RabbitCommon::CTools::TranslationType::Library);
 
   47    m_szSettingsFile = szFile;
 
   50        LoadSettings(m_szSettingsFile);
 
   51        check = connect(m_pParameter, SIGNAL(sigNativeWindowRecieveKeyboard()),
 
   52                        this, SLOT(slotNativeWindowRecieveKeyboard()));
 
   53        m_pHook = CHook::GetHook(m_pParameter, 
this);
 
   55            m_pHook->RegisterKeyboard();
 
   57        qCritical(log) << 
"new CParameterPlugin() fail";
 
   58        Q_ASSERT(m_pParameter);
 
   66    qDebug(log) << 
"CManager::~CManager()";
 
   68    qApp->removeEventFilter(
this);
 
   71        m_pHook->UnRegisterKeyboard();
 
   72        m_pHook->deleteLater();
 
   77        m_pParameter->deleteLater();
 
   78        m_pParameter = 
nullptr;
 
   82        RabbitCommon::CTools::Instance()->RemoveTranslator(m_Translator);
 
   91int CManager::LoadPlugins()
 
   94    foreach (QObject *plugin, QPluginLoader::staticInstances())
 
   96        CPlugin* p = qobject_cast<CPlugin*>(plugin);
 
   99            if(m_Plugins.find(p->
Id()) == m_Plugins.end())
 
  101                qInfo(log) << 
"Success: Load plugin" << p->
Name();
 
  105                qWarning(log) << 
"The plugin" << p->
Name() << 
" is exist.";
 
  109    QString szPath = RabbitCommon::CDir::Instance()->GetDirPlugins();
 
  112    if(filters.isEmpty())
 
  114#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN) 
  115        filters << 
"*Plugin*.dll";
 
  116#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC) 
  117        filters << 
"*Plugin*.dylib";
 
  119        filters << 
"*Plugin*.so";
 
  122    nRet = FindPlugins(szPath, filters);
 
  123    if(!m_szDetails.isEmpty())
 
  124        m_szDetails = 
"#### " + tr(
"Plugins") + 
"\n" + m_szDetails;
 
  126    qDebug(log) << (
"Client details:\n" + Details()).toStdString().c_str();
 
  130int CManager::FindPlugins(QDir dir, QStringList filters)
 
  134    QString szCurrentPath = QDir::currentPath();
 
  135    QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
 
  141        QDir::setCurrent(QDir::cleanPath(dir.absolutePath()));
 
  152    foreach (fileName, files) {
 
  153        QString szPlugins = dir.absoluteFilePath(fileName);
 
  154        QPluginLoader loader(szPlugins);
 
  155        QObject *plugin = loader.instance();
 
  157            CPlugin* p = qobject_cast<CPlugin*>(plugin);
 
  160                if(m_Plugins.find(p->
Id()) == m_Plugins.end())
 
  162                    qInfo(log) << 
"Success: Load plugin" 
  163                               << p->
Name() << 
"from" << szPlugins;
 
  167                    qWarning(log) << 
"The plugin [" << p->
Name() << 
"] is exist.";
 
  171            szMsg = 
"Error: Load plugin fail from " + szPlugins;
 
  172            if(!loader.errorString().isEmpty())
 
  173                szMsg += 
"; Error: " + loader.errorString();
 
  174            qCritical(log) << szMsg.toStdString().c_str();
 
  178    foreach (fileName, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
 
  179        QDir pluginDir = dir;
 
  180        if(pluginDir.cd(fileName))
 
  181            FindPlugins(pluginDir, filters);
 
  184    QDir::setCurrent(szCurrentPath);
 
  189int CManager::AppendPlugin(
CPlugin *p)
 
  192    m_Plugins.insert(p->
Id(), p);
 
  195    bool bRet = QMetaObject::invokeMethod(
 
  198        Qt::DirectConnection,
 
  199        Q_RETURN_ARG(
int, val));
 
  202        qCritical(log) << 
"The plugin" <<  p->
Name()
 
  203        << 
"initial translator fail" << bRet << val;
 
  207                   + tr(
"Version:") + 
" " + p->
Version() + 
"  \n" 
  210        m_szDetails += p->
Details() + 
"\n";
 
  219    auto it = m_Plugins.find(
id);
 
  220    if(m_Plugins.end() != it)
 
  223        qDebug(log) << 
"CreateOperate id:" << id;
 
  224        auto plugin = it.value();
 
  227            bRet = QMetaObject::invokeMethod(
 
  230                Qt::DirectConnection,
 
  235                qCritical(log) << 
"Create COperate fail.";
 
 
  246    qDebug(log) << Q_FUNC_INFO;
 
  251    bool bRet = QMetaObject::invokeMethod(
 
  254        Qt::DirectConnection,
 
  255        Q_RETURN_ARG(
CPlugin*, pPlugin));
 
  257    if(bRet && pPlugin) {
 
  260        bRet = QMetaObject::invokeMethod(
 
  263            Qt::DirectConnection,
 
  264            Q_RETURN_ARG(
int, nRet),
 
  268            qCritical(log) << 
"Call pPlugin->DeleteOperate(p) fail";
 
  273    qCritical(log) << 
"Get CManager fail.";
 
 
  280    if(szFile.isEmpty()) 
return nullptr;
 
  281    qDebug(log) << 
"LoadOperate:"<< szFile;
 
  282    QSettings set(szFile, QSettings::IniFormat);
 
  283    m_FileVersion = set.value(
"Manage/FileVersion", m_FileVersion).toInt();
 
  284    QString 
id = set.value(
"Plugin/ID").toString();
 
  285    QString protocol = set.value(
"Plugin/Protocol").toString();
 
  286    QString name = set.value(
"Plugin/Name").toString();
 
  287    qDebug(log) << 
"LoadOperate protocol:" << protocol
 
  288                << 
"name:" << name << 
"id:" << id;
 
  293        bool bRet = QMetaObject::invokeMethod(
 
  296            Qt::DirectConnection,
 
  297            Q_RETURN_ARG(
int, nRet),
 
  298            Q_ARG(QString, szFile));
 
  300            qCritical(log) << 
"Call pOperate->Load(szFile) fail.";
 
  304            qCritical(log) << 
"Load parameter fail" << nRet;
 
  308        pOperate->SetSettingsFile(szFile);
 
  311        qCritical(log) << 
"Don't create Operate:" << name << protocol << 
id << szFile;
 
 
  318    if(!pOperate) 
return -1;
 
  320    QString szFile = pOperate->GetSettingsFile();
 
  322        szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
 
  327    QSettings set(szFile, QSettings::IniFormat);
 
  330    bool bRet = QMetaObject::invokeMethod(
 
  333        Qt::DirectConnection,
 
  334        Q_RETURN_ARG(
CPlugin*, pPlugin));
 
  335    if(!bRet || !pPlugin)
 
  337        qCritical(log) << 
"Get plugin client fail";
 
  341    set.setValue(
"Manage/FileVersion", m_FileVersion);
 
  342    set.setValue(
"Plugin/ID", pPlugin->
Id());
 
  343    set.setValue(
"Plugin/Protocol", pPlugin->
Protocol());
 
  344    set.setValue(
"Plugin/Name", pPlugin->
Name());
 
  347    bRet = QMetaObject::invokeMethod(
 
  350        Qt::DirectConnection,
 
  351        Q_RETURN_ARG(
int, nRet),
 
  352        Q_ARG(QString, szFile));
 
  354        qCritical(log) << 
"Call pOperate->Save(szFile) fail.";
 
  358        qCritical(log) << 
"Save parameter fail" << nRet;
 
 
  367        qCritical(log) << 
"The m_pParameter is nullptr";
 
  368        Q_ASSERT_X(m_pParameter, 
"CManager", 
"The m_pParameter is nullptr");
 
  374        s = m_szSettingsFile;
 
  375    return m_pParameter->
Load(s);
 
 
  381        qCritical(log) << 
"The m_pParameter is nullptr";
 
  382        Q_ASSERT_X(m_pParameter, 
"CManager", 
"The m_pParameter is nullptr");
 
  388        s = m_szSettingsFile;
 
  389    return m_pParameter->
Save(s);
 
 
  394    QList<QWidget*> lstWidget;
 
  399        lstWidget.push_back(pClient);
 
  401#if defined(HAVE_QTERMWIDGET) 
  405        pTermina->setWindowTitle(tr(
"Terminal"));
 
  406        lstWidget.push_back(pTermina);
 
  411        pRecord->SetParameter(&m_pParameter->m_Record);
 
  412        lstWidget.push_back(pRecord);
 
 
  421    QMap<QString, CPlugin*>::iterator it;
 
  422    for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
 
  424        nRet = handle->
onProcess(it.key(), it.value());
 
 
  435    QMap<QString, CPlugin*>::iterator it;
 
  436    for(it = m_Plugins.begin(); it != m_Plugins.end(); it++)
 
  438        nRet = cb(it.key(), it.value());
 
  446const QString CManager::Details()
 const 
  450    szDetail += COperateTerminal::Details();
 
  454    szDetail += channel.GetDetails();
 
  457    szDetail += 
"- QtKeyChain\n" +
 
  458        QString(
"  - ") + tr(
"Version:")
 
  459                + 
" 0x" + QString::number(QTKEYCHAIN_VERSION, 16) + 
"\n";
 
  462    if(!szDetail.isEmpty()) {
 
  463        szDetail = 
"#### " + tr(
"Dependency libraries:") + 
"\n" + szDetail;
 
  465    szDetail += m_szDetails;
 
  469void CManager::slotNativeWindowRecieveKeyboard()
 
  471    Q_ASSERT(m_pParameter);
 
  472    if(m_pParameter->GetNativeWindowReceiveKeyboard()) {
 
  474            m_pHook->UnRegisterKeyboard();
 
  475            m_pHook->deleteLater();
 
  480        m_pHook = CHook::GetHook(m_pParameter, 
this);
 
  482            m_pHook->RegisterKeyboard();
 
static int RemoveTranslation()
Remove translation.
 
static int InitTranslation()
Initial translation.
 
The Handle COperate class.
 
virtual int onProcess(const QString &id, CPlugin *pPlugin)=0
Process plugins.
 
virtual QList< QWidget * > GetSettingsWidgets(QWidget *parent)
Get parameter settings widget.
 
virtual int EnumPlugins(Handle *handle)
Enum plugins.
 
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
 
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
 
virtual int DeleteOperate(COperate *p)
Delete COperate.
 
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
 
virtual int SaveSettings(const QString szFile=QString())
Save Client parameters to file.
 
virtual int LoadSettings(const QString szFile=QString())
Load Client parameters from file.
 
virtual const QString Id()
Identity.
 
virtual int SetParameter(CParameter *pParameter) override
[override functions]
 
Global parameters of plugins.
 
virtual int SetParameter(CParameter *pParameter) override
[override functions]
 
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.
 
virtual int Load(QString szFile=QString())
Load from file.
 
virtual const QString Version() const =0
Version.
 
virtual const QString Details() const
Display more information in About dialog or log.
 
virtual const QString Id()
ID. Default: Type() + ":" + Protocol() + ":" + Name()
 
virtual const QString Name() const =0
This name must be the same as the project name (${PROJECT_NAME}). The translation file (${PROJECT_NAM...
 
virtual const QString DisplayName() const
The plugin display name.
 
virtual const QString Protocol() const =0
Plugin Protocol.
 
virtual const QString Description() const =0
Plugin description.