4#include "OperateDesktop.h" 
    8#include "network/UnixSocket.h" 
   11#include <rfb/CMsgWriter.h> 
   12#include <rfb/Hostname.h> 
   13#include "rfb/LogWriter.h" 
   15#include <rfb/clipboardTypes.h> 
   16#include <rfb/LogWriter.h> 
   17#include <rfb/Logger_stdio.h> 
   18#include <rfb/fenceTypes.h> 
   25#include <rfb/keysymdef.h> 
   28#include "FramePixelBuffer.h" 
   33#include <QApplication> 
   34#include <QLoggingCategory> 
   38#include <QNetworkProxy> 
   40#include <QInputDialog> 
   42#include "rfb/Security.h" 
   43#include "rfb/Exception.h" 
   45#include "rfb/CSecurityTLS.h" 
   50    #include "ChannelIce.h" 
   54    #include "ChannelSSHTunnel.h" 
   57static Q_LOGGING_CATEGORY(log, 
"VNC.Connect")
 
   58static Q_LOGGING_CATEGORY(logVNC, "VNC.Log")
 
   59static Q_LOGGING_CATEGORY(logKey, "VNC.Connect.Key")
 
   60static Q_LOGGING_CATEGORY(logMouse, "VNC.Connect.Mouse")
 
   65    VncLogger(
const char *name) : rfb::Logger(name)
 
   67    void write(
int level, 
const char *logname, 
const char *text)
 override 
   69        if (level >= rfb::LogWriter::LEVEL_DEBUG) {
 
   70            qDebug(logVNC) << logname << text;
 
   71        } 
else if (level >= rfb::LogWriter::LEVEL_INFO) {
 
   72            qInfo(logVNC) << logname << text;
 
   73        } 
else if (level >= rfb::LogWriter::LEVEL_STATUS) {
 
   74            qWarning(logVNC) << logname << text;
 
   76            qCritical(logVNC) << logname << text;
 
 
   84static const rfb::PixelFormat verylowColourPF(8, 3,
false, 
true, 1, 1, 1, 2, 1, 0);
 
   86static const rfb::PixelFormat lowColourPF(8, 6, 
false, 
true, 3, 3, 3, 4, 2, 0);
 
   88static const rfb::PixelFormat mediumColourPF(8, 8, 
false, 
true, 7, 7, 3, 5, 2, 0);
 
   91static const rfb::PixelFormat fullColourPF(32, 24, 
false, 
true, 255, 255, 255, 16, 8, 0);
 
   94static const unsigned bpsEstimateWindow = 1000;
 
  100    static bool initlog = 
false;
 
  103        g_logger.registerLogger();
 
  104        rfb::LogWriter::setLogParams(
"*:Rabbit:100");
 
  118    if(!m_pPara->GetLocalCursor())
 
  120        emit sigUpdateCursor(QCursor(Qt::BlankCursor));
 
  124CBackendVnc::~CBackendVnc()
 
  126    qDebug(log) << 
"CConnectVnc::~CConnectVnc()";
 
  129int CBackendVnc::SetPara()
 
  131    QDir d(os::getvncconfigdir());
 
  133        d.mkpath(os::getvncconfigdir());
 
  134    QDir dstat(os::getvncstatedir());
 
  136        dstat.mkpath(os::getvncstatedir());
 
  137    QDir dvnc(os::getvncdatadir());
 
  139        dvnc.mkpath(os::getvncdatadir());
 
  141    setServerName(m_pPara->m_Net.GetHost().toStdString().c_str());
 
  142    setShared(m_pPara->GetShared());
 
  143    supportsLocalCursor = m_pPara->GetLocalCursor();
 
  144    supportsCursorPosition = m_pPara->GetCursorPosition();
 
  145    supportsDesktopResize = m_pPara->GetSupportsDesktopResize();
 
  146    supportsLEDState = m_pPara->GetLedState();
 
  148    std::list<uint32_t> sec;
 
  149    switch(m_pPara->m_Net.
m_User.GetUsedType()) {
 
  150    case CParameterUser::TYPE::None:
 
  151        sec.push_back(rfb::secTypeNone);
 
  153    case CParameterUser::TYPE::OnlyPassword:
 
  154        sec.push_back(rfb::secTypeVncAuth);
 
  156    case CParameterUser::TYPE::UserPassword:
 
  157        sec.push_back(rfb::secTypePlain);
 
  160        sec.push_back(rfb::secTypeTLSVnc);
 
  162    case CParameterUser::TYPE::OnlyPasswordX509:
 
  163        sec.push_back(rfb::secTypeX509Vnc);
 
  165    case CParameterUser::TYPE::UserPasswordX509None:
 
  166        sec.push_back(rfb::secTypeTLSPlain);
 
  168    case CParameterUser::TYPE::UserPasswordX509:
 
  169        sec.push_back(rfb::secTypeX509Plain);
 
  174    qDebug(log) << 
"secTypes:" << security.GetEnabledSecTypes() << security.ToString()
 
  176    security.SetSecTypes(sec);
 
  179    setPreferredEncoding(m_pPara->GetPreferredEncoding());
 
  180    setCompressLevel(m_pPara->GetCompressLevel());
 
  181    setQualityLevel(m_pPara->GetQualityLevel());
 
  196    qDebug(log) << 
"CConnectVnc::OnInit()";
 
  199    if(m_pPara->GetIce())
 
  203        if(m_pPara->m_Proxy.GetUsedType() == CParameterProxy::TYPE::SSHTunnel) {
 
  205            if(nRet) 
return OnInitReturnValue::Fail; 
 
  206            return OnInitReturnValue::UseOnProcess;
 
  211    if(nRet) 
return OnInitReturnValue::Fail; 
 
  213    return OnInitReturnValue::NotUseOnProcess;
 
 
  216int CBackendVnc::IceInit()
 
  220    if(!pSignal || !pSignal->IsConnected())
 
  222        qCritical(log) << 
"The g_pSignal is null. or signal don't connect server";
 
  226    qInfo(log, 
"Connected to signal server:%s:%d; user:%s",
 
  227                   CICE::Instance()->GetParameter()->getSignalServer().toStdString().c_str(),
 
  229                   CICE::Instance()->GetParameter()->getSignalUser().toStdString().c_str());
 
  230    auto channel = QSharedPointer<CChannelIce>(
new CChannelIce(pSignal));
 
  233        qCritical(log) << 
"new CDataChannelIce fail";
 
  236    m_DataChannel = channel;
 
  237    SetChannelConnect(channel);
 
  239    rtc::Configuration config;
 
  240    rtc::IceServer stun(
CICE::Instance()->GetParameter()->getStunServer().toStdString().c_str(),
 
  242    rtc::IceServer turn(
CICE::Instance()->GetParameter()->getTurnServer().toStdString().c_str(),
 
  244                        CICE::Instance()->GetParameter()->getTurnUser().toStdString().c_str(),
 
  245                        CICE::Instance()->GetParameter()->getTurnPassword().toStdString().c_str());
 
  246    config.iceServers.push_back(stun);
 
  247    config.iceServers.push_back(turn);
 
  248    channel->SetConfigure(config);
 
  250    bool bRet = channel->open(
CICE::Instance()->GetParameter()->getSignalUser(),
 
  251                              m_pPara->GetPeerUser(), 
true);
 
  254        emit 
sigError(-1, 
"Open channel fail");
 
  261int CBackendVnc::SocketInit()
 
  265        QTcpSocket* pSock = 
new QTcpSocket(
this);
 
  268        m_DataChannel = QSharedPointer<CChannel>(
new CChannel(pSock));
 
  270            qCritical(log) << 
"New CChannel fail";
 
  274        SetChannelConnect(m_DataChannel);
 
  276        if(!m_DataChannel->open(QIODevice::ReadWrite))
 
  278            qCritical(log) << 
"Open channel fail";
 
  282        QNetworkProxy::ProxyType type = QNetworkProxy::NoProxy;
 
  284        switch(m_pPara->m_Proxy.GetUsedType())
 
  286        case CParameterProxy::TYPE::SockesV5:
 
  287            type = QNetworkProxy::Socks5Proxy;
 
  289        case CParameterProxy::TYPE::System:
 
  290            type = QNetworkProxy::DefaultProxy;
 
  292        case CParameterProxy::TYPE::Http:
 
  293            type = QNetworkProxy::HttpProxy;
 
  295        case CParameterProxy::TYPE::None:
 
  301        case QNetworkProxy::DefaultProxy:
 
  303            pSock->setProxy(QNetworkProxy::applicationProxy());
 
  306        case QNetworkProxy::HttpProxy:
 
  307        case QNetworkProxy::Socks5Proxy:
 
  310            auto net = &m_pPara->m_Proxy.m_SockesV5;
 
  311            if(QNetworkProxy::HttpProxy == type) {
 
  312                net = &m_pPara->m_Proxy.m_Http;
 
  314            if(net->GetHost().isEmpty())
 
  317                szErr = tr(
"The proxy server is empty, please input it");
 
  318                qCritical(log) << szErr;
 
  322            proxy.setHostName(net->GetHost());
 
  323            proxy.setPort(net->GetPort());
 
  324            auto &user = net->m_User;
 
  325            if(((user.GetUsedType() == CParameterUser::TYPE::UserPassword)
 
  326                 && (user.GetPassword().isEmpty() || user.GetUser().isEmpty()))
 
  327                || ((user.GetUsedType() == CParameterUser::TYPE::PublicKey)
 
  328                    && user.GetPassphrase().isEmpty())) {
 
  329                int nRet = QDialog::Rejected;
 
  331                if(QDialog::Accepted != nRet)
 
  336            proxy.setUser(user.GetUser());
 
  337            proxy.setPassword(user.GetPassword());
 
  339            pSock->setProxy(proxy);
 
  346        if(m_pPara->m_Net.GetHost().isEmpty())
 
  349            szErr = tr(
"The server is empty, please input it");
 
  350            qCritical(log) << szErr;
 
  354        pSock->connectToHost(m_pPara->m_Net.GetHost(), m_pPara->m_Net.GetPort());
 
  357        serverHost = pSock->peerName();
 
  358        qDebug(log) << 
"Server Host:" << serverHost;
 
  359        setServerName(serverHost.toStdString().c_str());
 
  362    } 
catch (rdr::Exception& e) {
 
  363        qCritical(log) << 
"SocketInit exception:" << e.str();
 
  370int CBackendVnc::SSHInit()
 
  373    auto channel = QSharedPointer<CChannelSSHTunnel>(
 
  376        qCritical(log) << 
"New CChannelSSHTunnel fail";
 
  379    m_DataChannel = channel;
 
  380    SetChannelConnect(m_DataChannel);
 
  381    if(!channel->open(QIODevice::ReadWrite))
 
  384        szErr = tr(
"Failed to open SSH tunnel:");
 
  385        szErr += 
"(" + m_pPara->m_Proxy.m_SSH.m_Net.GetHost();
 
  387        szErr += QString::number(m_pPara->m_Proxy.m_SSH.m_Net.GetPort());
 
  389        szErr += m_pPara->m_Net.GetHost();
 
  391        szErr += QString::number(m_pPara->m_Net.GetPort()) + 
")";
 
  392        QString szMsg = szErr + 
"\n" + channel->errorString();
 
  400int CBackendVnc::SetChannelConnect(QSharedPointer<CChannel> channel)
 
  403    check = connect(channel.data(), SIGNAL(sigConnected()),
 
  404                    this, SLOT(slotConnected()));
 
  406    check = connect(channel.data(), SIGNAL(sigDisconnected()),
 
  407                    this, SLOT(slotDisConnected()));
 
  409    check = connect(channel.data(), SIGNAL(readyRead()),
 
  410                    this, SLOT(slotReadyRead()));
 
  412    check = connect(channel.data(), SIGNAL(
sigError(
int, 
const QString&)),
 
  413                    this, SLOT(slotChannelError(
int, 
const QString&)));
 
  420    qDebug(log) << 
"CConnectVnc::OnClean()";
 
  422    setStreams(
nullptr, 
nullptr);
 
  424        m_DataChannel->close();
 
 
  446    if(m_pPara->m_Proxy.GetUsedType() == CParameterProxy::TYPE::SSHTunnel) {
 
 
  459    if(m_pPara->m_Proxy.GetUsedType() == CParameterProxy::TYPE::SSHTunnel) {
 
 
  468void CBackendVnc::slotConnected()
 
  470    qDebug(log) << Q_FUNC_INFO;
 
  471    if(m_pPara->GetIce())
 
  472        qInfo(log) << 
"Connected to peer " + m_pPara->GetPeerUser();
 
  474        auto &net = m_pPara->m_Net;
 
  475        QString szInfo = 
"Connected to " 
  476                         + net.GetHost() + 
":" + QString::number(net.GetPort());
 
  478        if(CParameterProxy::TYPE::SSHTunnel == m_pPara->m_Proxy.GetUsedType())
 
  480            auto &sshNet = m_pPara->m_Proxy.m_SSH.m_Net;
 
  481            szInfo += 
" with ssh turnnel: " + sshNet.GetHost()
 
  482                      + 
":" + QString::number(sshNet.GetPort());
 
  485        qInfo(log) << szInfo;
 
  487    int nRet = SetPara();
 
  493    m_InStream = QSharedPointer<rdr::InStream>(
new CInStreamChannel(m_DataChannel.data()));
 
  494    m_OutStream = QSharedPointer<rdr::OutStream>(
new COutStreamChannel(m_DataChannel.data()));
 
  495    if(!(m_InStream && m_OutStream))
 
  497        qCritical(log) << 
"m_InStream or m_OutStream is null";
 
  501    setStreams(m_InStream.data(), m_OutStream.data());
 
  502    initialiseProtocol();
 
  505void CBackendVnc::slotDisConnected()
 
  508    szInfo = 
"CConnectVnc::slotDisConnected() from " 
  509             + m_pPara->m_Net.GetHost() + 
":" 
  510             + QString::number(m_pPara->m_Net.GetPort());
 
  512    if(CParameterProxy::TYPE::SSHTunnel == m_pPara->m_Proxy.GetUsedType())
 
  514        auto &net = m_pPara->m_Proxy.m_SSH.m_Net;
 
  515        szInfo += 
" with ssh turnnel: " + net.GetHost()
 
  516                  + 
":" + QString::number(net.GetPort());
 
  519    qInfo(log) << szInfo;
 
  522void CBackendVnc::slotReadyRead()
 
  525    QString szErr(
"processMsg exception: ");
 
  528        getOutStream()->flush();
 
  530        getOutStream()->cork(
true);
 
  533        getOutStream()->cork(
false);
 
  535    } 
catch (rfb::AuthFailureException& e) {
 
  536        szErr = tr(
"Logon to ");
 
  537        szErr += m_pPara->m_Net.GetHost();
 
  539        szErr += QString::number(m_pPara->m_Net.GetPort());
 
  540        szErr += tr(
" fail.");
 
  541        QString szMsg = szErr + 
"\n" + tr(
"Please check that the username and password are correct.") + 
"\n";
 
  547    } 
catch (rfb::ConnFailedException& e) {
 
  549        szErr = tr(
"Connect to ");
 
  550        szErr += m_pPara->m_Net.GetHost();
 
  552        szErr += QString::number(m_pPara->m_Net.GetPort());
 
  553        szErr += tr(
" fail.");
 
  558    } 
catch (rdr::EndOfStream& e) {
 
  560    } 
catch(rdr::GAIException &e) {
 
  562        szErr += 
"[" + QString::number(e.err) + 
"] " + e.str();
 
  563    } 
catch(rdr::SystemException &e) {
 
  565        szErr += 
"[" + QString::number(e.err) + 
"] " + e.str();
 
  566    } 
catch (rdr::Exception& e) {
 
  568    } 
catch (std::exception &e) {
 
  571        szErr += 
"unknown exception";
 
  573    qCritical(log) << szErr;
 
  578void CBackendVnc::slotChannelError(
int nErr, 
const QString& szErr)
 
  580    qDebug(log) << 
"Channel error:" << nErr << 
"-" << szErr;
 
  588void CBackendVnc::initDone()
 
  591    qDebug(log, 
"initDone:\n%s", ConnectInformation().toStdString().c_str());
 
  593    emit sigSetDesktopSize(server.width(), server.height());
 
  594    QString szName = QString::fromUtf8(server.name());
 
  595    emit sigServerName(szName);
 
  602    setPreferredEncoding(m_pPara->GetPreferredEncoding());
 
  608void CBackendVnc::resizeFramebuffer()
 
  610    rfb::ModifiablePixelBuffer* buffer = getFramebuffer();
 
  612    qDebug(log) << 
"CConnectVnc::resizeFramebuffer: new:" 
  613                << server.width() << server.height()
 
  614                << 
"old:" << buffer->width() << buffer->height();
 
  616    if(server.width() == buffer->width() && server.height() == buffer->height())
 
  621    emit sigSetDesktopSize(server.width(), server.height());
 
  624void CBackendVnc::setColourMapEntries(
int firstColour, 
int nColours, uint16_t *rgbs)
 
  626    qCritical(log) << 
"Invalid SetColourMapEntries from server!";
 
  629void CBackendVnc::bell()
 
  634void CBackendVnc::setLEDState(
unsigned int state)
 
  636    qDebug(log) << 
"CConnectVnc::setLEDState" << state;
 
  637    CConnection::setLEDState(state);
 
  638    emit sigUpdateLedState(state);
 
  641void CBackendVnc::setCursor(
int width, 
int height, 
const rfb::Point &hotspot, 
const uint8_t *data)
 
  644    if ((width == 0) || (height == 0)) {
 
  645        QImage cursor(1, 1, QImage::Format_ARGB32);
 
  646        uint8_t *buffer = cursor.bits();
 
  647        memset(buffer, 0, 4);
 
  648        emit sigUpdateCursor(QCursor(QPixmap::fromImage(cursor), hotspot.x, hotspot.y));
 
  650        QImage cursor(width, height, QImage::Format_ARGB32);
 
  651        uint8_t *buffer = cursor.bits();
 
  652        memcpy(buffer, data, width * height * 4);
 
  653        emit sigUpdateCursor(QCursor(QPixmap::fromImage(cursor), hotspot.x, hotspot.y));
 
  657void CBackendVnc::setCursorPos(
const rfb::Point &pos)
 
  660    emit sigUpdateCursorPosition(QPoint(pos.x, pos.y));
 
  663void CBackendVnc::fence(uint32_t flags, 
unsigned int len, 
const uint8_t data[])
 
  666    CMsgHandler::fence(flags, len, data);
 
  667    if (!(flags & rfb::fenceFlagRequest))
 
  671    flags = flags & (rfb::fenceFlagBlockBefore | rfb::fenceFlagBlockAfter);
 
  672    writer()->writeFence(flags, len, data);
 
  676void CBackendVnc::getUserPasswd(
bool secure, std::string *user, std::string *password)
 
  680        auto &user = m_pPara->m_Net.
m_User;
 
  681        *password = user.GetPassword().toStdString();
 
  682        if(user.GetPassword().isEmpty())
 
  684            int nRet = QDialog::Rejected;
 
  685            auto *net = &m_pPara->m_Net;
 
  687            if(QDialog::Accepted == nRet)
 
  689                *password = user.GetPassword().toStdString();
 
  695int CBackendVnc::getX509File(std::string *ca, std::string *crl)
 
  697    auto &user = m_pPara->m_Net.
m_User;
 
  699        *ca = user.GetCAFile().toStdString().c_str();
 
  701        *crl = user.GetCRLFile().toStdString().c_str();
 
  705bool CBackendVnc::showMsgBox(rfb::MsgBoxFlags flags, 
const char *title, 
const char *text)
 
  707    qDebug(log) << title << text;
 
  708    QMessageBox::StandardButton nRet = QMessageBox::No;
 
  709    QMessageBox::StandardButtons fgBtn = QMessageBox::No;
 
  711    if((
int)flags & (
int)rfb::MsgBoxFlags::M_OK)
 
  712        fgBtn |= QMessageBox::Ok;
 
  714    if((
int)flags & (
int)rfb::MsgBoxFlags::M_OKCANCEL)
 
  715        fgBtn |= QMessageBox::Ok | QMessageBox::Cancel;
 
  716    if((
int)flags & (
int)rfb::MsgBoxFlags::M_YESNO)
 
  717        fgBtn |= QMessageBox::Yes | QMessageBox::No;
 
  720                             fgBtn, nRet, bCheckBox);
 
  721    if(QMessageBox::Ok == nRet
 
  722        || QMessageBox::Yes == nRet)
 
  728void CBackendVnc::setName(
const char *name)
 
  730    qDebug(log) << 
"CConnectVnc::setName:" << name;
 
  731    CConnection::setName(name);
 
  732    QString szName = QString::fromUtf8(server.name());
 
  733    emit sigServerName(szName);
 
  740void CBackendVnc::framebufferUpdateStart()
 
  743    CConnection::framebufferUpdateStart();
 
  750void CBackendVnc::framebufferUpdateEnd()
 
  753    rfb::CConnection::framebufferUpdateEnd();
 
  757        const QImage& img = 
dynamic_cast<CFramePixelBuffer*
>(getFramebuffer())->getImage();
 
  764void CBackendVnc::updatePixelFormat()
 
  771    switch (m_pPara->GetColorLevel()) {
 
  772    case CParameterVnc::Full:
 
  775    case CParameterVnc::Medium:
 
  778    case CParameterVnc::Low:
 
  781    case CParameterVnc::VeryLow:
 
  782        pf = verylowColourPF;
 
  788    qInfo(log) << 
"Update pixel format:" << str;
 
  792void CBackendVnc::mousePressEvent(QMouseEvent *event)
 
  794    if(!writer()) 
return;
 
  795    if(m_pPara && m_pPara->GetOnlyView()) 
return;
 
  798    if(event->button() & Qt::MouseButton::LeftButton)
 
  800    if(event->button() & Qt::MouseButton::MiddleButton)
 
  802    if(event->button() & Qt::MouseButton::RightButton)
 
  804    if(event->button() & Qt::MouseButton::BackButton)
 
  807    QPoint pos = 
event->pos();
 
  808    rfb::Point p(pos.x(), pos.y());
 
  810    qDebug(logMouse) << Q_FUNC_INFO << 
event->buttons() << 
event->button() << pos << mask;
 
  813        writer()->writePointerEvent(p, mask);
 
  814    } 
catch (rdr::Exception& e) {
 
  819void CBackendVnc::mouseReleaseEvent(QMouseEvent *event)
 
  821    if(!writer()) 
return;
 
  822    if(m_pPara && m_pPara->GetOnlyView()) 
return;
 
  824    QPoint pos = 
event->pos();
 
  825    rfb::Point p(pos.x(), pos.y());
 
  826    qDebug(logMouse) << Q_FUNC_INFO << 
event->buttons() << 
event->button() << pos << mask;
 
  828        writer()->writePointerEvent(p, mask);
 
  829    } 
catch (rdr::Exception& e) {
 
  834void CBackendVnc::mouseMoveEvent(QMouseEvent *event)
 
  836    if(!writer()) 
return;
 
  837    if(m_pPara && m_pPara->GetOnlyView()) 
return;
 
  839    QPoint pos = 
event->pos();
 
  840    rfb::Point p(pos.x(), pos.y());
 
  842    if(event->buttons() & Qt::MouseButton::LeftButton)
 
  844    if(event->buttons() & Qt::MouseButton::MiddleButton)
 
  846    if(event->buttons() & Qt::MouseButton::RightButton)
 
  848    if(event->buttons() & Qt::MouseButton::BackButton)
 
  851    qDebug(logMouse) << Q_FUNC_INFO << 
event->buttons() << 
event->button() << pos << mask;
 
  854        writer()->writePointerEvent(p, mask);
 
  855    } 
catch (rdr::Exception& e) {
 
  861void CBackendVnc::wheelEvent(QWheelEvent *event)
 
  863    if(!writer()) 
return;
 
  864    if(m_pPara && m_pPara->GetOnlyView()) 
return;
 
  866    if(event->buttons() & Qt::MouseButton::LeftButton)
 
  868    if(event->buttons() & Qt::MouseButton::MiddleButton)
 
  870    if(event->buttons() & Qt::MouseButton::RightButton)
 
  872    if(event->buttons() & Qt::MouseButton::BackButton)
 
  875    QPoint d = 
event->angleDelta();
 
  886#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 
  887    pos = 
event->position();
 
  892    rfb::Point p(pos.x(), pos.y());
 
  894    qDebug(logMouse) << Q_FUNC_INFO << 
event->buttons()
 
  895#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) 
  901        writer()->writePointerEvent(p, mask);
 
  902    } 
catch (rdr::Exception& e) {
 
  907void CBackendVnc::keyPressEvent(QKeyEvent *event)
 
  909    if(!writer()) 
return;
 
  910    if(m_pPara && m_pPara->GetOnlyView()) 
return;
 
  911    bool modifier = 
false;
 
  912    if (event->modifiers() & Qt::ShiftModifier)
 
  916    qDebug(logKey) << Q_FUNC_INFO << 
event << k << modifier;
 
  919        writer()->writeKeyEvent(k, 0, 
true);
 
  920    } 
catch (rdr::Exception& e) {
 
  925void CBackendVnc::keyReleaseEvent(QKeyEvent *event)
 
  927    if(m_pPara && m_pPara->GetOnlyView()) 
return;
 
  928    if(!writer()) 
return;
 
  929    bool modifier = 
false;
 
  930    if (event->modifiers() & Qt::ShiftModifier)
 
  934    qDebug(logKey) << Q_FUNC_INFO << 
event << k << modifier;
 
  937        writer()->writeKeyEvent(k, 0, 
false);
 
  938    } 
catch (rdr::Exception& e) {
 
  943QString CBackendVnc::ConnectInformation()
 
  948    szInfo = QString(
"Desktop name: ") + server.name() + 
"\n";
 
  949    szInfo += QString(
"Size: %1 x %2").arg(server.width()).arg(server.height()) + 
"\n";
 
  953    server.pf().print(buf, len);
 
  954    szInfo += QString(
"Pixel format: ") + buf + 
"\n";
 
  955    szInfo += QString(
"Requested encoding: ") + rfb::encodingName(getPreferredEncoding()) + 
"\n";
 
  956    szInfo += QString(
"Protocol version: %1.%2").arg(server.majorVersion).arg(server.minorVersion) + 
"\n";
 
  957    szInfo += QString(
"Security method: ") + rfb::secTypeName(csecurity->getType()) + 
"\n";
 
  958    szInfo += QString(
"Support local cursor: %1").arg(supportsLocalCursor) + 
"\n";
 
  959    szInfo += QString(
"Support cursor position: %1").arg(supportsCursorPosition) + 
"\n";
 
  960    szInfo += QString(
"Support desktop resize: %1").arg(supportsDesktopResize) + 
"\n";
 
  961    szInfo += QString(
"Support LED state: %1").arg(supportsLEDState) + 
"\n";
 
  962    szInfo += QString(
"Led state: %1").arg(server.ledState()) + 
"\n";
 
  963    szInfo += QString(
"Supports QEMU KeyEvent: %1").arg(server.supportsQEMUKeyEvent) + 
"\n";
 
  964    szInfo += QString(
"Supports Set Desktop Size: %1").arg(server.supportsSetDesktopSize) + 
"\n";
 
  965    szInfo += QString(
"Support fance: %1").arg(server.supportsFence) + 
"\n";
 
  966    szInfo += QString(
"Support continue updates: %1").arg(server.supportsContinuousUpdates) + 
"\n";
 
  984    case Qt::Key_Backspace: k = XK_BackSpace; 
break;
 
  985    case Qt::Key_Tab: k = XK_Tab; 
break;
 
  986    case Qt::Key_Clear: k = XK_Clear; 
break;
 
  987    case Qt::Key_Return: k = XK_Return; 
break;
 
  988    case Qt::Key_Pause: k = XK_Pause; 
break;
 
  989    case Qt::Key_Escape: k = XK_Escape; 
break;
 
  990    case Qt::Key_Space: k = XK_space; 
break;
 
  991    case Qt::Key_Delete: k = XK_Delete; 
break;
 
  992    case Qt::Key_Period: k = XK_period; 
break;
 
  995    case Qt::Key_Multi_key: k = XK_Multi_key; 
break;
 
  996    case Qt::Key_Codeinput: k = XK_Codeinput; 
break;
 
  997    case Qt::Key_SingleCandidate: k = XK_SingleCandidate; 
break;
 
  998    case Qt::Key_MultipleCandidate: k = XK_MultipleCandidate; 
break;     
 
  999    case Qt::Key_PreviousCandidate: k = XK_PreviousCandidate; 
break;
 
 1002    case Qt::Key_Kanji: k = XK_Kanji; 
break;
 
 1003    case Qt::Key_Muhenkan: k = XK_Muhenkan; 
break;
 
 1004    case Qt::Key_Henkan: k = XK_Henkan; 
break;
 
 1005    case Qt::Key_Romaji: k = XK_Romaji; 
break;   
 
 1006    case Qt::Key_Hiragana: k = XK_Hiragana; 
break;
 
 1007    case Qt::Key_Katakana: k = XK_Katakana; 
break;   
 
 1008    case Qt::Key_Hiragana_Katakana: k = XK_Hiragana_Katakana;
break;
 
 1009    case Qt::Key_Zenkaku: k = XK_Zenkaku; 
break;
 
 1010    case Qt::Key_Hankaku: k = XK_Hankaku; 
break;
 
 1011    case Qt::Key_Zenkaku_Hankaku: k = XK_Zenkaku_Hankaku; 
break;
 
 1012    case Qt::Key_Touroku: k = XK_Touroku; 
break;
 
 1013    case Qt::Key_Massyo: k = XK_Massyo; 
break;
 
 1014    case Qt::Key_Kana_Lock: k = XK_Kana_Lock; 
break;
 
 1015    case Qt::Key_Kana_Shift: k = XK_Kana_Shift; 
break;
 
 1016    case Qt::Key_Eisu_Shift: k = XK_Eisu_Shift; 
break;
 
 1017    case Qt::Key_Eisu_toggle: k = XK_Eisu_toggle; 
break;
 
 1020    case Qt::Key_Exclam: k = XK_exclam; 
break; 
 
 1021    case Qt::Key_QuoteDbl: k = XK_quotedbl; 
break; 
 
 1022    case Qt::Key_NumberSign: k = XK_numbersign; 
break; 
 
 1023    case Qt::Key_Percent: k = XK_percent; 
break; 
 
 1024    case Qt::Key_Dollar: k = XK_dollar; 
break;   
 
 1025    case Qt::Key_Ampersand: k = XK_ampersand; 
break; 
 
 1026    case Qt::Key_Apostrophe: k = XK_apostrophe; 
break;
 
 1027    case Qt::Key_ParenLeft: k = XK_parenleft; 
break; 
 
 1028    case Qt::Key_ParenRight: k = XK_parenright; 
break; 
 
 1030    case Qt::Key_Slash: k = XK_slash; 
break;    
 
 1031    case Qt::Key_Asterisk: k = XK_asterisk; 
break;  
 
 1032    case Qt::Key_Minus: k = XK_minus; 
break;    
 
 1033    case Qt::Key_Plus: k = XK_plus; 
break;  
 
 1034    case Qt::Key_Enter: k = XK_Return; 
break;   
 
 1035    case Qt::Key_Equal: k = XK_equal; 
break;    
 
 1036    case Qt::Key_Comma: 
return XK_comma; 
 
 1038    case Qt::Key_Colon: k = XK_colon;
break; 
 
 1039    case Qt::Key_Semicolon: k = XK_semicolon; 
break; 
 
 1040    case Qt::Key_Less: k = XK_less; 
break; 
 
 1041    case Qt::Key_Greater: k = XK_greater; 
break; 
 
 1042    case Qt::Key_Question: k = XK_question; 
break; 
 
 1043    case Qt::Key_At: k = XK_at; 
break; 
 
 1045    case Qt::Key_BracketLeft: k = XK_bracketleft; 
break;
 
 1046    case Qt::Key_Backslash: k = XK_backslash;
break;
 
 1047    case Qt::Key_BracketRight: k = XK_bracketright;
break;
 
 1048    case Qt::Key_AsciiCircum: k = XK_asciicircum;
break;
 
 1049    case Qt::Key_Underscore: k = XK_underscore;
break;
 
 1050    case Qt::Key_QuoteLeft: k = XK_quoteleft;
break;
 
 1051    case Qt::Key_BraceLeft: k = XK_braceleft;
break;
 
 1052    case Qt::Key_Bar: k = XK_bar; 
break;
 
 1053    case Qt::Key_BraceRight: k = XK_braceright;
break;
 
 1054    case Qt::Key_AsciiTilde: k = XK_asciitilde;
break;
 
 1055    case Qt::Key_nobreakspace: k = XK_nobreakspace;
break;
 
 1056    case Qt::Key_exclamdown: k = XK_exclamdown;
break;
 
 1057    case Qt::Key_cent: k = XK_cent;
break;
 
 1058    case Qt::Key_sterling: k = XK_sterling;
break;
 
 1059    case Qt::Key_currency: k = XK_currency;
break;
 
 1060    case Qt::Key_yen: k = XK_yen;
break;
 
 1061    case Qt::Key_brokenbar: k = XK_brokenbar;
break;
 
 1062    case Qt::Key_section: k = XK_section;
break;
 
 1063    case Qt::Key_diaeresis: k = XK_diaeresis;
break;
 
 1064    case Qt::Key_copyright: k = XK_copyright; 
break;
 
 1065    case Qt::Key_ordfeminine: k = XK_ordfeminine; 
break;
 
 1066    case Qt::Key_guillemotleft: k = XK_guillemotleft; 
break;
 
 1067    case Qt::Key_guillemotright: k = XK_guillemotright; 
break;
 
 1068    case Qt::Key_notsign: k = XK_notsign; 
break;
 
 1069    case Qt::Key_hyphen: k = XK_hyphen; 
break;
 
 1070    case Qt::Key_registered: k = XK_registered; 
break;
 
 1072    case Qt::Key_Up: k = XK_Up; 
break;
 
 1073    case Qt::Key_Down: k = XK_Down; 
break;
 
 1074    case Qt::Key_Right: k = XK_Right; 
break;
 
 1075    case Qt::Key_Left: k = XK_Left; 
break;
 
 1076    case Qt::Key_Insert: k = XK_Insert; 
break;
 
 1077    case Qt::Key_Home: k = XK_Home; 
break;
 
 1078    case Qt::Key_End: k = XK_End; 
break;
 
 1079    case Qt::Key_PageUp: k = XK_Page_Up; 
break;
 
 1080    case Qt::Key_PageDown: k = XK_Page_Down; 
break;
 
 1081    case Qt::Key_MediaPrevious: k = XK_Prior; 
break;
 
 1082    case Qt::Key_MediaNext: k = XK_Next; 
break;
 
 1083    case Qt::Key_MediaPlay: k = XK_Begin; 
break;
 
 1086    case Qt::Key_Select: k = XK_Select; 
break;
 
 1087    case Qt::Key_Printer: k = XK_Print; 
break;
 
 1088    case Qt::Key_Execute: k = XK_Execute; 
break;
 
 1089    case Qt::Key_Undo: k = XK_Undo; 
break;
 
 1090    case Qt::Key_Redo: k = XK_Redo; 
break;
 
 1091    case Qt::Key_Menu: k = XK_Menu; 
break;
 
 1092    case Qt::Key_Find: k = XK_Find; 
break;
 
 1094    case Qt::Key_Cancel:
 
 1098    case Qt::Key_Mode_switch: k = XK_Mode_switch; 
break;
 
 1100    case Qt::Key_F1: k = XK_F1; 
break;
 
 1101    case Qt::Key_F2: k = XK_F2; 
break;
 
 1102    case Qt::Key_F3: k = XK_F3; 
break;
 
 1103    case Qt::Key_F4: k = XK_F4; 
break;
 
 1104    case Qt::Key_F5: k = XK_F5; 
break;
 
 1105    case Qt::Key_F6: k = XK_F6; 
break;
 
 1106    case Qt::Key_F7: k = XK_F7; 
break;
 
 1107    case Qt::Key_F8: k = XK_F8; 
break;
 
 1108    case Qt::Key_F9: k = XK_F9; 
break;
 
 1109    case Qt::Key_F10: k = XK_F10; 
break;
 
 1110    case Qt::Key_F11: k = XK_F11; 
break;
 
 1111    case Qt::Key_F12: k = XK_F12; 
break;
 
 1112    case Qt::Key_F13: k = XK_F13; 
break;
 
 1113    case Qt::Key_F14: k = XK_F14; 
break;
 
 1114    case Qt::Key_F15: k = XK_F15; 
break;
 
 1115    case Qt::Key_F16: k = XK_F16; 
break;
 
 1116    case Qt::Key_F17: k = XK_F17; 
break;
 
 1117    case Qt::Key_F18: k = XK_F18; 
break;
 
 1118    case Qt::Key_F19: k = XK_F19; 
break;
 
 1119    case Qt::Key_F20: k = XK_F20; 
break;
 
 1120    case Qt::Key_F21: k = XK_F21; 
break;
 
 1121    case Qt::Key_F22: k = XK_F22; 
break;
 
 1122    case Qt::Key_F23: k = XK_F23; 
break;
 
 1123    case Qt::Key_F24: k = XK_F24; 
break;
 
 1124    case Qt::Key_F25: k = XK_F25; 
break;
 
 1125    case Qt::Key_F26: k = XK_F26; 
break;
 
 1126    case Qt::Key_F27: k = XK_F27; 
break;
 
 1127    case Qt::Key_F28: k = XK_F28; 
break;
 
 1128    case Qt::Key_F29: k = XK_F29; 
break;
 
 1129    case Qt::Key_F30: k = XK_F30; 
break;
 
 1130    case Qt::Key_F31: k = XK_F31; 
break;
 
 1131    case Qt::Key_F32: k = XK_F32; 
break;
 
 1132    case Qt::Key_F33: k = XK_F33; 
break;
 
 1133    case Qt::Key_F34: k = XK_F34; 
break;
 
 1134    case Qt::Key_F35: k = XK_F35; 
break;
 
 1136    case Qt::Key_NumLock: k = XK_Num_Lock; 
break;
 
 1137    case Qt::Key_CapsLock: k = XK_Caps_Lock; 
break;
 
 1138    case Qt::Key_ScrollLock: k = XK_Scroll_Lock; 
break;
 
 1140    case Qt::Key_Shift: k = XK_Shift_R; 
break; 
 
 1141    case Qt::Key_Control: k = XK_Control_R; 
break;
 
 1142    case Qt::Key_Alt: k = XK_Alt_R; 
break;
 
 1143    case Qt::Key_Meta: k = XK_Meta_R; 
break;
 
 1145    case Qt::Key_Super_L: k = XK_Super_L; 
break;        
 
 1146    case Qt::Key_Super_R: k = XK_Super_R; 
break;        
 
 1148    case Qt::Key_Hyper_L: k = XK_Hyper_L; 
break;
 
 1149    case Qt::Key_Hyper_R: k = XK_Hyper_R; 
break;
 
 1151    case Qt::Key_Help: k = XK_Help; 
break;
 
 1152    case Qt::Key_Print: k = XK_Print; 
break;
 
 1153    case Qt::Key_SysReq: k = XK_Sys_Req; 
break;
 
 1154    case Qt::Key_0: k = XK_0;
break;
 
 1155    case Qt::Key_1: k = XK_1;
break;
 
 1156    case Qt::Key_2: k = XK_2;
break;
 
 1157    case Qt::Key_3: k = XK_3;
break;
 
 1158    case Qt::Key_4: k = XK_4;
break;
 
 1159    case Qt::Key_5: k = XK_5;
break;
 
 1160    case Qt::Key_6: k = XK_6;
break;
 
 1161    case Qt::Key_7: k = XK_7;
break;
 
 1162    case Qt::Key_8: k = XK_8;
break;
 
 1163    case Qt::Key_9: k = XK_9;
break;
 
 1173            case Qt::Key_A: k = XK_a;
break;
 
 1174            case Qt::Key_B: k = XK_b;
break;
 
 1175            case Qt::Key_C: k = XK_c;
break;
 
 1176            case Qt::Key_D: k = XK_d;
break;
 
 1177            case Qt::Key_E: k = XK_e;
break;
 
 1178            case Qt::Key_F: k = XK_f;
break;
 
 1179            case Qt::Key_G: k = XK_g;
break;
 
 1180            case Qt::Key_H: k = XK_h;
break;
 
 1181            case Qt::Key_I: k = XK_i;
break;
 
 1182            case Qt::Key_J: k = XK_j;
break;
 
 1183            case Qt::Key_K: k = XK_k;
break;
 
 1184            case Qt::Key_L: k = XK_l;
break;
 
 1185            case Qt::Key_M: k = XK_m;
break;
 
 1186            case Qt::Key_N: k = XK_n;
break;
 
 1187            case Qt::Key_O: k = XK_o;
break;
 
 1188            case Qt::Key_P: k = XK_p;
break;
 
 1189            case Qt::Key_Q: k = XK_q;
break;
 
 1190            case Qt::Key_R: k = XK_r;
break;
 
 1191            case Qt::Key_S: k = XK_s;
break;
 
 1192            case Qt::Key_T: k = XK_t;
break;
 
 1193            case Qt::Key_U: k = XK_u;
break;
 
 1194            case Qt::Key_V: k = XK_v;
break;
 
 1195            case Qt::Key_W: k = XK_w;
break;
 
 1196            case Qt::Key_X: k = XK_x;
break;
 
 1197            case Qt::Key_Y: k = XK_y;
break;
 
 1198            case Qt::Key_Z: k = XK_z;
break;
 
 1205            case Qt::Key_A: k = XK_A;
break;
 
 1206            case Qt::Key_B: k = XK_B;
break;
 
 1207            case Qt::Key_C: k = XK_C;
break;
 
 1208            case Qt::Key_D: k = XK_D;
break;
 
 1209            case Qt::Key_E: k = XK_E;
break;
 
 1210            case Qt::Key_F: k = XK_F;
break;
 
 1211            case Qt::Key_G: k = XK_G;
break;
 
 1212            case Qt::Key_H: k = XK_H;
break;
 
 1213            case Qt::Key_I: k = XK_I;
break;
 
 1214            case Qt::Key_J: k = XK_J;
break;
 
 1215            case Qt::Key_K: k = XK_K;
break;
 
 1216            case Qt::Key_L: k = XK_L;
break;
 
 1217            case Qt::Key_M: k = XK_M;
break;
 
 1218            case Qt::Key_N: k = XK_N;
break;
 
 1219            case Qt::Key_O: k = XK_O;
break;
 
 1220            case Qt::Key_P: k = XK_P;
break;
 
 1221            case Qt::Key_Q: k = XK_Q;
break;
 
 1222            case Qt::Key_R: k = XK_R;
break;
 
 1223            case Qt::Key_S: k = XK_S;
break;
 
 1224            case Qt::Key_T: k = XK_T;
break;
 
 1225            case Qt::Key_U: k = XK_U;
break;
 
 1226            case Qt::Key_V: k = XK_V;
break;
 
 1227            case Qt::Key_W: k = XK_W;
break;
 
 1228            case Qt::Key_X: k = XK_X;
break;
 
 1229            case Qt::Key_Y: k = XK_Y;
break;
 
 1230            case Qt::Key_Z: k = XK_Z;
break;
 
 
 1239void CBackendVnc::slotClipBoardChanged()
 
 1242    if(!m_pPara->GetClipboard() || !getOutStream() || !writer()) 
return;
 
 1243    QClipboard* pClip = QApplication::clipboard();
 
 1244    if(pClip->ownsClipboard()) 
return;
 
 1245    announceClipboard(
true);
 
 1248void CBackendVnc::handleClipboardRequest()
 
 1251    if(!m_pPara->GetClipboard() || !getOutStream() || !writer()) 
return;
 
 1252    const QClipboard *clipboard = QApplication::clipboard();
 
 1253    const QMimeData *mimeData = clipboard->mimeData();
 
 1257if (mimeData->hasText()) {
 
 1258        QString szText = mimeData->text();
 
 1260                << 
"CConnectVnc::handleClipboardRequest:szText:" << szText;
 
 1262            sendClipboardData(szText.toStdString().c_str());
 
 1263        } 
catch (rdr::Exception& e) {
 
 1264            qCritical(log) << 
"sendClipboardData exception" << e.str();
 
 1276        qCritical(log) << 
"Cannot display data";
 
 1280void CBackendVnc::handleClipboardAnnounce(
bool available)
 
 1283    if(!m_pPara->GetClipboard() || !getOutStream() || !writer()) 
return;
 
 1285        this->requestClipboard();
 
 1288void CBackendVnc::handleClipboardData(
const char *data)
 
 1291    if(!m_pPara->GetClipboard() || !getOutStream() || !writer()) 
return;
 
 1293    QMimeData* pData = 
new QMimeData();
 
 1294    pData->setText(QString::fromUtf8(data));
 
 1295    emit sigSetClipboard(pData);
 
 1298void CBackendVnc::authSuccess()
 
 1300    qDebug(log) << 
"CConnectVnc::authSuccess";
 
Remote desktop interface.
 
void sigUpdateRect(const QRect &r, const QImage &image)
Notify the CFrmView update image.
 
quint32 TranslateRfbKey(quint32 inkey, bool modifier)
CBackendVnc::TranslateRfbKey.
 
virtual int OnClean() override
Clean.
 
virtual int WakeUp() override
Wake up Backend thread(background thread)
 
virtual OnInitReturnValue OnInit() override
Initialization.
 
virtual int OnProcess() override
Specific operation processing of plug-in connection.
 
void sigStop()
Notify the user to stop.
 
void sigShowMessageBox(const QString &szTitle, const QString &szMessage, const QMessageBox::Icon &icon=QMessageBox::Information)
Trigger the display of a message dialog (QMessageBox) in the main thread from a background thread wit...
 
void sigError(const int nError, const QString &szError=QString())
Triggered when an error is generated.
 
void sigBlockShowMessageBox(const QString &szTitle, const QString &szMessage, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton &nRet, bool &checkBox, QString checkBoxContext=QString())
Block background threads and display message dialogs in foreground threads (QMessageBox)
 
void sigRunning()
Emitted when the plugin is successfully started.
 
void sigBlockShowWidget(const QString &className, int &nRet, void *pContext)
Blocks the background thread and displays the window in the foreground thread.
 
The ICE channel interface class.
 
The channel interface class.
 
static CICE * Instance()
Single instance.
 
The ICE signal interface class.
 
Remote desktop operate interface.
 
virtual CParameterBase * GetParameter()
Get parameter.
 
CParameterUser m_User
[Instance user]
 
@ OnlyPasswordX509None
Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile.