玉兔远程控制 0.1.0-bate11
载入中...
搜索中...
未找到
插件接口

插件接口. 更多...

插件接口 的协作图:

专题

 桌面类
 服务类
 终端类

class  CBackend
 后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()slotTimeOut()OnProcess() 。 当然,它仍然支持 Qt 事件(QObject 的 信号 - 槽 机制)。 更多...
class  CManager
 管理插件 更多...
class  COperate
 操作接口。 更多...
class  CParameter
 参数接口 更多...

详细描述

插件接口.

  • 线程模型
  • 类关系:
  • 序列图:
  • 用脚本从模板生成插件: Script/create_plugin.sh
    ./Script/create_plugin.sh -h
    create_plugin.sh - Generate plugin from template
    Usage: ./Script/create_plugin.sh [OPTION] PluginName
    Options:
    -h, --help Show this help message
    -v, --verbose[=LEVEL] Set verbose mode. [LEVEL: ON, OFF]
    Directory options:
    --install=DIR Set installation directory
    Other options:
    --name=NAME Plugin name
    --template=NAME Template name. [NAME: Base(Default), Desktop, Server, QtEvent]
    Examples:
    ./Script/create_plugin.sh --name=Server
  • 写一个插件:
    • 生成插件目标名称格式为: PluginClient${PROJECT_NAME}
      # Author: Kang Lin <kl222@126.com>
      project(FreeRDP
      DESCRIPTION "FreeRDP client plugin"
      )
      SET(FreeRDP_LIBS freerdp-client freerdp winpr Plugin)
      SET(FreeRDP_SOURCE_FILES
      ParameterFreeRDP.cpp
      PluginFreeRDP.cpp
      BackendFreeRDP.cpp
      OperateFreeRDP.cpp
      DlgSetFreeRDP.cpp
      ConvertKeyCode.cpp
      CursorFreeRDP.cpp
      ClipboardFreeRDP.cpp
      ClipboardMimeData.cpp
      DlgGetUserPasswordFreeRDP.cpp
      DlgDesktopSize.cpp
      )
      SET(FreeRDP_HEADER_FILES
      ParameterFreeRDP.h
      PluginFreeRDP.h
      BackendFreeRDP.h
      OperateFreeRDP.h
      DlgSetFreeRDP.h
      ConvertKeyCode.h
      CursorFreeRDP.h
      ClipboardFreeRDP.h
      ClipboardMimeData.h
      DlgGetUserPasswordFreeRDP.h
      DlgDesktopSize.h
      )
      SET(FreeRDP_UI_FILES
      DlgSetFreeRDP.ui
      DlgGetUserPasswordFreeRDP.ui
      DlgDesktopSize.ui
      )
      find_package(FreeRDP)
      if(FreeRDP_VERSION_MAJOR VERSION_GREATER_EQUAL 3)
      list(APPEND FreeRDP_HEADER_FILES ConnectLayer.h ConnectLayerQTcpSocket.h)
      list(APPEND FreeRDP_SOURCE_FILES ConnectLayer.cpp ConnectLayerQTcpSocket.cpp)
      find_package(libssh)
      if(libssh_FOUND)
      list(APPEND FreeRDP_HEADER_FILES ConnectLayerSSHTunnel.h)
      list(APPEND FreeRDP_SOURCE_FILES ConnectLayerSSHTunnel.cpp)
      endif()
      endif()
      if(WIN32)
      list(APPEND FreeRDP_LIBS Credui.dll)
      endif()
      if(MINGW)
      set(FreeRDP_OPTIONS -fpermissive)
      endif()
      set(FreeRDP_QT_COMPONENTS Widgets Multimedia PrintSupport SerialPort)
      find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS ${FreeRDP_QT_COMPONENTS})
      if(Qt${QT_VERSION_MAJOR}_FOUND)
      FOREACH(_COMPONENT ${FreeRDP_QT_COMPONENTS})
      list(APPEND FreeRDP_LIBS Qt${QT_VERSION_MAJOR}::${_COMPONENT})
      ENDFOREACH()
      endif()
      ADD_PLUGIN_TARGET(NAME PluginClient${PROJECT_NAME}
      ISPLUGIN
      SOURCE_FILES ${FreeRDP_SOURCE_FILES} ${FreeRDP_HEADER_FILES} ${FreeRDP_UI_FILES}
      PRIVATE_LIBS ${FreeRDP_LIBS}
      PRIVATE_INCLUDE_DIRS ${FreeRDP-Client_INCLUDE_DIR} ${FreeRDP_INCLUDE_DIR} ${WinPR_INCLUDE_DIR}
      PRIVATE_DEFINITIONS ${FreeRDP_DEFINITIONS}
      PluginFreeDP_VERSION="${RabbitRemoteControl_VERSION}"
      PRIVATE_OPTIONS ${FreeRDP_OPTIONS}
      INSTALL_DIR ${PLUGIN_PATH}
      OUTPUT_DIR ${CMAKE_BINARY_DIR}/${PLUGIN_PATH}
      INSTALL_RPATH ${INSTALL_RPATH}
      VERSION ${RabbitRemoteControl_VERSION}
      )
    • 实现插件接口 CPlugin
      • 如果没有后台线程,或者是阻塞线程模型(一个后台线程处理一个连接。连接是阻塞的)。例如:FreeRDP
        • CPlugin 派生插件。例如: CPluginFreeRDP
          • 在类声明中实现Qt接口:
            Q_INTERFACES(CPlugin)
            #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
            Q_PLUGIN_METADATA(IID CPlugin_iid)
            #endif
          • 在构造函数中初始化操作。例如:初始化资源等
          • 在析构函数中释放资源。
          • 实现属性、函数
            • 插件名:必须与工程名(翻译资源文件名[.ts])相同。 例如: CPluginFreeRDP::Name()
              // Author: Kang Lin <kl222@126.com>
              #include "PluginFreeRDP.h"
              #include "winpr/wlog.h"
              #include "freerdp/version.h"
              #include <QLoggingCategory>
              #ifdef HAVE_LIBSSH
              #include "ChannelSSHTunnel.h"
              #endif
              #include "OperateFreeRDP.h"
              static Q_LOGGING_CATEGORY(log, "FreeRDP.Plugin")
              static Q_LOGGING_CATEGORY(LoggerFreeRDP, "FreeRDP.Log")
              static Q_LOGGING_CATEGORY(LoggerFreeRDPTrace, "FreeRDP.Log.Trace")
              static Q_LOGGING_CATEGORY(LoggerFreeRDPFatal, "FreeRDP.Log.Fatal")
              CPluginFreeRDP::CPluginFreeRDP(QObject *parent)
              : CPlugin(parent)
              {
              qDebug(log) << Q_FUNC_INFO;
              qInfo(log) << "FreeRDP version:" << freerdp_get_version_string()
              << "revision:" << freerdp_get_build_revision();
              static wLogCallbacks* pCbLog = new wLogCallbacks;
              BOOL bRet = WLog_SetLogAppenderType(WLog_GetRoot(), WLOG_APPENDER_CALLBACK);
              if(bRet && pCbLog)
              {
              memset(pCbLog, 0, sizeof(wLogCallbacks));
              pCbLog->message = [](const wLogMessage* msg)->BOOL{
              switch(msg->Level)
              {
              case WLOG_TRACE:
              qDebug(LoggerFreeRDPTrace) /*<< msg->PrefixString */ << msg->TextString;
              break;
              case WLOG_DEBUG:
              qDebug(LoggerFreeRDP) /*<< msg->PrefixString */ << msg->TextString;
              break;
              case WLOG_INFO:
              qInfo(LoggerFreeRDP) /*<< msg->PrefixString*/ << msg->TextString;
              break;
              case WLOG_WARN:
              qWarning(LoggerFreeRDP) /*<< msg->PrefixString */<< msg->TextString;
              case WLOG_ERROR:
              qCritical(LoggerFreeRDP) /*<< msg->PrefixString*/ << msg->TextString;
              break;
              case WLOG_FATAL:
              case WLOG_OFF:
              qCritical(LoggerFreeRDPFatal) /*<< msg->PrefixString*/ << msg->TextString;
              break;
              default:
              break;
              }
              return TRUE;
              };
              WLog_ConfigureAppender(WLog_GetLogAppender(WLog_GetRoot()), "callbacks", pCbLog);
              }
              WLog_SetLogLevel(WLog_GetRoot(), WLOG_TRACE);
              }
              {
              qDebug(log) << Q_FUNC_INFO;
              }
              const CPlugin::TYPE CPluginFreeRDP::Type() const
              {
              return TYPE::RemoteDesktop;
              }
              const QString CPluginFreeRDP::Name() const
              {
              return "FreeRDP";
              }
              const QString CPluginFreeRDP::DisplayName() const
              {
              return tr("Free remote desktop protocol");
              }
              const QString CPluginFreeRDP::Description() const
              {
              return tr("RDP(Remote desktop Protocol): Access remote desktops such as windows.") + "\n"
              + tr("It uses FreeRDP: https://github.com/FreeRDP/FreeRDP/");
              }
              const QString CPluginFreeRDP::Protocol() const
              {
              return "RDP";
              }
              const QIcon CPluginFreeRDP::Icon() const
              {
              return QIcon::fromTheme("windows");
              }
              const QString CPluginFreeRDP::Version() const
              {
              return PluginFreeDP_VERSION;
              }
              const QString CPluginFreeRDP::Details() const
              {
              QString szDetails;
              szDetails += "- " + tr("Dependency libraries") + "\n";
              szDetails += " - " + tr("FreeRDP") + "\n";
              szDetails += " - " + tr("version: ");
              szDetails += freerdp_get_version_string();
              szDetails += "\n";
              szDetails += " - " + tr("Build version: ");
              szDetails += freerdp_get_build_revision();
              szDetails += ":";
              szDetails += freerdp_get_build_revision();
              szDetails += "\n";
              #if FREERDP_VERSION_MAJOR < 3
              szDetails += " - " + tr("Build date: ");
              szDetails += freerdp_get_build_date();
              szDetails += "\n";
              #endif
              szDetails += " - ";
              szDetails += freerdp_get_build_config();
              szDetails += "\n";
              #ifdef HAVE_LIBSSH
              CChannelSSH channel(nullptr, nullptr);
              szDetails += channel.GetDetails();
              #endif
              return szDetails;
              }
              COperate *CPluginFreeRDP::OnCreateOperate(const QString &szId)
              {
              if(Id() == szId)
              return new COperateFreeRDP(this);
              return nullptr;
              }
              操作接口。
              virtual const QString DisplayName() const override
              在界面上显示的名称
              virtual const TYPE Type() const override
              [Clean resource]
              virtual const QString Version() const override
              Version
              virtual const QString Name() const override
              插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
              virtual const QString Description() const override
              描述
              virtual const QString Details() const override
              Show the plugin depends on the freerdp version
              virtual const QString Protocol() const override
              协议
              virtual ~CPluginFreeRDP() override
              [Initialize resource]
              插件接口
              virtual const QString Id() const
              标识。默认: Type() + ":" + Protocol() + ":" + Name()
      • 如果非阻塞线程模型。一个后台线程处理多个连接。连接是非阻塞的。(暂时未用)
    • 实现操作接口 COperate
      • 实现远程桌面
        • 如果是阻塞线程模型。实现一个后台线程处理一个远程连接,连接是阻塞的。 可以从 COperateThread 派生。例如:COperateFreeRDP
        • 如果没有后台线程,或者是非阻塞线程模型(实现一个后台线程处理多个远程连接,连接是非阻塞的)。 可以从 COperateDesktop 派生。
      • 实现远程控制台,可以从 COperateTerminal 派生
      • 实现服务,可以从 COperateServer 派生
      • 如果上面两个不能满足你的需要,你可以直接从 COperate 派生
    • 实现具体的连接,从 COperate 派生 。例如:COperateFreeRDP