4#include <QNetworkProxy>
6#include <QLoggingCategory>
8#include "BackendLibVNCServer.h"
11static Q_LOGGING_CATEGORY(log,
"LibVNCServer.Connect")
12static Q_LOGGING_CATEGORY(logger, "LibVNCServer.Connect.log")
13static Q_LOGGING_CATEGORY(logKey, "LibVNCServer.Connect.Key")
14static Q_LOGGING_CATEGORY(logMouse, "LibVNCServer.Connect.Mouse")
16const
char* gThis = "This pointer";
17#define LOG_BUFFER_LENGTH 1024
18static void rfbQtClientLog(
const char *format, ...)
22 char buf[LOG_BUFFER_LENGTH];
24 if(!rfbEnableClientLogging)
27 va_start(args, format);
28 nRet = vsnprintf(buf, LOG_BUFFER_LENGTH, format, args);
32 qCritical(log) <<
"vsnprintf fail";
35 if(nRet >= LOG_BUFFER_LENGTH)
37 qCritical(log) <<
"vsprintf buf is short,"
38 << nRet <<
">" << LOG_BUFFER_LENGTH
39 <<
". Truncated it:" << nRet - LOG_BUFFER_LENGTH;
40 buf[LOG_BUFFER_LENGTH - 1] = 0;
42 qDebug(logger) << buf;
54 rfbClientLog = rfbQtClientLog;
56 if(!m_pParameter->GetLocalCursor())
58 emit sigUpdateCursor(QCursor(Qt::BlankCursor));
62CBackendLibVNCServer::~CBackendLibVNCServer()
64 qDebug(log) <<
"CConnectLibVNCServer::~CConnectLibVNCServer()";
75 qDebug(log) <<
"CConnectLibVNCServer::OnInit()";
76 if(m_pClient) Q_ASSERT(
false);
78 m_pClient = rfbGetClient(8, 3, 4);
82 szErr = tr(
"Protocol version error");
84 qCritical(log) <<
"rfbGetClient fail";
85 return OnInitReturnValue::Fail;
89 m_pClient->programName = strdup(qApp->applicationName().toStdString().c_str());
90 m_pClient->appData.shareDesktop = m_pParameter->GetShared();
91 m_pClient->appData.viewOnly = m_pParameter->GetOnlyView();
92 m_pClient->appData.useRemoteCursor = m_pParameter->GetLocalCursor();
131 m_pClient->appData.enableJPEG = m_pParameter->GetJpeg();
132 if(m_pClient->appData.enableJPEG)
133 m_pClient->appData.qualityLevel = m_pParameter->GetQualityLevel();
134 if(m_pParameter->GetEnableCompressLevel())
135 m_pClient->appData.compressLevel = m_pParameter->GetCompressLevel();
138 m_pClient->MallocFrameBuffer = cb_resize;
139 m_pClient->GotFrameBufferUpdate = cb_update;
140 m_pClient->HandleKeyboardLedState = cb_kbd_leds;
141 m_pClient->Bell = cb_bell;
142 m_pClient->HandleTextChat = cb_text_chat;
143 m_pClient->GotXCutText = cb_got_selection;
144 m_pClient->GetCredential = cb_get_credential;
145 m_pClient->GetPassword = cb_get_password;
146 m_pClient->HandleCursorPos = cb_cursor_pos;
147 m_pClient->GotCursorShape = cb_got_cursor_shape;
149 m_pClient->canHandleNewFBSize = TRUE;
150 rfbClientSetClientData(m_pClient, (
void*)gThis,
this);
153 switch(m_pParameter->m_Proxy.GetUsedType())
155 case CParameterProxy::TYPE::None:
158 if(m_pParameter->m_Net.GetHost().isEmpty())
161 szErr = tr(
"The server is empty, please input it");
162 qCritical(log) << szErr;
164 return OnInitReturnValue::Fail;
166 auto &net = m_pParameter->m_Net;
167 m_pClient->serverHost = strdup(net.GetHost().toStdString().c_str());
168 m_pClient->serverPort = net.GetPort();
170 if(!rfbInitClient(m_pClient,
nullptr,
nullptr))
175 szErr = tr(
"Fail: Connect to %1:%2").arg(m_pParameter->m_Net.GetHost(),
176 QString::number(m_pParameter->m_Net.GetPort()));
177 qCritical(log) << szErr;
179 return OnInitReturnValue::Fail;
182 QString szInfo = QString(
"Connected to ") + m_pClient->desktopName;
183 qInfo(log) << szInfo;
185 emit sigSetDesktopSize(m_pClient->width, m_pClient->height);
186 emit sigServerName(m_pClient->desktopName);
190 return OnInitReturnValue::UseOnProcess;
236 case CParameterProxy::TYPE::SSHTunnel:
242 &m_pParameter->m_Proxy.m_SSH, &m_pParameter->m_Net,
this);
245 return OnInitReturnValue::Fail;
246 bool check = connect(m_pThread, SIGNAL(sigServer(QString, quint16)),
249#if defined(HAVE_UNIX_DOMAIN_SOCKET)
250 check = connect(m_pThread, SIGNAL(sigServer(QString)),
254 check = connect(m_pThread, SIGNAL(
sigError(
int,QString)),
255 this, SIGNAL(
sigError(
int,QString)));
257 check = connect(m_pThread, SIGNAL(
sigStop()),
262 return OnInitReturnValue::NotUseOnProcess;
270 return OnInitReturnValue::UseOnProcess;
275 qDebug(log) <<
"CConnectLibVNCServer::OnClean()";
279 disconnect(m_pThread);
287 rfbClientCleanup(m_pClient);
316 struct timeval timeout = {0, DEFAULT_TIMEOUT};
319 if(RFB_INVALID_SOCKET != m_pClient->sock)
321 FD_SET(m_pClient->sock, &set);
323 rfbSocket eventFd = m_Event.GetFd();
324 if(RFB_INVALID_SOCKET != eventFd)
326 FD_SET(eventFd, &set);
328 rfbSocket fd = RFB_INVALID_SOCKET;
329 fd = std::max(eventFd, m_pClient->sock);
331 nRet = select(fd + 1, &set, NULL, NULL, &timeout);
334 qCritical(log) <<
"select fail:" << nRet <<
"errno" << errno << strerror(errno);
344 if(RFB_INVALID_SOCKET != eventFd && FD_ISSET(eventFd, &set))
350 if(RFB_INVALID_SOCKET != m_pClient->sock
351 && FD_ISSET(m_pClient->sock, &set)) {
353 if(!HandleRFBServerMessage(m_pClient))
355 qCritical(log) <<
"HandleRFBServerMessage fail";
365 return m_Event.WakeUp();
368void CBackendLibVNCServer::slotClipBoardChanged()
370 if(!m_pParameter || !m_pParameter->GetClipboard() || !m_pClient)
return;
371 QClipboard* pClipboard = QApplication::clipboard();
374 QString szText = pClipboard->text();
375 if(!szText.isEmpty() && m_pClient)
376 SendClientCutText(m_pClient,
377 (
char*)szText.toStdString().c_str(),
378 szText.toStdString().length());
382rfbBool CBackendLibVNCServer::cb_resize(rfbClient* client)
386 if(pThis->OnSize())
return FALSE;
390void CBackendLibVNCServer::cb_update(rfbClient *client,
int x,
int y,
int w,
int h)
396 QRect rect(x, y, w, h);
397 QImage img = pThis->m_Image.copy(rect);
401void CBackendLibVNCServer::cb_got_selection(rfbClient *client,
const char *text,
int len)
405 if(!pThis->m_pParameter->GetClipboard())
return;
406 QClipboard* pClipboard = QApplication::clipboard();
408 pClipboard->setText(text);
411void CBackendLibVNCServer::cb_kbd_leds(rfbClient *client,
int value,
int pad)
413 qDebug(log) <<
"CConnectLibVnc::cb_kbd_leds";
416void CBackendLibVNCServer::cb_bell(
struct _rfbClient *client)
421void CBackendLibVNCServer::cb_text_chat(rfbClient *client,
int value,
char *text)
423 qDebug(log) <<
"CConnectLibVnc::cb_text_chat";
426rfbCredential* CBackendLibVNCServer::cb_get_credential(rfbClient *cl,
int credentialType)
428 qDebug(log) <<
"CConnectLibVnc::cb_get_credential";
430 rfbCredential *c = (rfbCredential*)malloc(
sizeof(rfbCredential));
431 c->userCredential.username = (
char*)malloc(RFB_BUF_SIZE);
432 memset(c->userCredential.username, 0, RFB_BUF_SIZE);
433 c->userCredential.password = (
char*)malloc(RFB_BUF_SIZE);
434 memset(c->userCredential.password, 0, RFB_BUF_SIZE);
436 if(credentialType != rfbCredentialTypeUser) {
437 qCritical(log) <<
"something else than username and password required for authentication";
441 qDebug(log) <<
"Username and password required for authentication!";
443 memcpy(c->userCredential.username,
444 pThis->m_pParameter->m_Net.
m_User.GetUser().toStdString().c_str(),
445 pThis->m_pParameter->m_Net.
m_User.GetUser().toStdString().length());
446 memcpy(c->userCredential.password,
447 pThis->m_pParameter->m_Net.
m_User.GetPassword().toStdString().c_str(),
448 pThis->m_pParameter->m_Net.
m_User.GetPassword().toStdString().length());
453char* CBackendLibVNCServer::cb_get_password(rfbClient *client)
456 QString szPassword = pThis->m_pParameter->m_Net.
m_User.GetPassword();
457 if(szPassword.isEmpty())
459 int nRet = QDialog::Rejected;
460 auto *net = &pThis->m_pParameter->m_Net;
462 if(QDialog::Accepted == nRet)
464 szPassword = net->m_User.GetPassword();
467 if(!szPassword.isEmpty())
468 pThis->m_SecurityLevel |= CSecurityLevel::Level::Authentication;
469 return strdup(szPassword.toStdString().c_str());
472int CBackendLibVNCServer::OnSize()
475 int nWidth = m_pClient->width;
476 int nHeight = m_pClient->height;
478 m_Image = QImage(nWidth, nHeight, QImage::Format_RGB32);
480 m_pClient->frameBuffer = m_Image.bits();
482 m_pClient->format.bitsPerPixel = 32;
483 m_pClient->format.depth = m_Image.depth();
484 m_pClient->format.redShift = 16;
485 m_pClient->format.greenShift = 8;
486 m_pClient->format.blueShift = 0;
487 m_pClient->format.redMax = 255;
488 m_pClient->format.greenMax = 255;
489 m_pClient->format.blueMax = 255;
490 SetFormatAndEncodings(m_pClient);
492 emit sigSetDesktopSize(m_pClient->width, m_pClient->height);
496rfbBool CBackendLibVNCServer::cb_cursor_pos(rfbClient *client,
int x,
int y)
504void CBackendLibVNCServer::cb_got_cursor_shape(rfbClient *client,
506 int width,
int height,
512 if(!client->rcSource)
514 qCritical(log) <<
"client->rcSource is null";
518 if ((width == 0) || (height == 0)) {
519 QImage cursor(1, 1, QImage::Format_ARGB32);
520 uchar* buffer = cursor.bits();
521 memset(buffer, 0, 4);
522 emit pThis->sigUpdateCursor(QCursor(QPixmap::fromImage(cursor), xhot, yhot));
524 switch (bytesPerPixel) {
527 QImage cursor(width, height, QImage::Format_ARGB32);
528 uchar *buffer = cursor.bits();
529 memcpy(buffer, client->rcSource, width * height * 4);
530 uchar* pMask = client->rcMask;
533 uchar* pDest = buffer;
534 for(
int y = 0; y < height; y++)
536 for(
int w = 0; w < width; w++)
542 QColor c = cursor.pixel(w, y);
544 cursor.setPixelColor(w,y,c);
547 *((uint32_t*)pDest) = 0;
553 emit pThis->sigUpdateCursor(QCursor(QPixmap::fromImage(cursor), xhot, yhot));
562void CBackendLibVNCServer::mousePressEvent(QMouseEvent *event)
564 if(!m_pClient)
return;
565 if(m_pParameter && m_pParameter->GetOnlyView())
return;
567 unsigned char mask = 0;
568 if(event->button() & Qt::MouseButton::LeftButton)
570 if(event->button() & Qt::MouseButton::MiddleButton)
572 if(event->button() & Qt::MouseButton::RightButton)
574 if(event->button() & Qt::MouseButton::BackButton)
576 QPoint pos =
event->pos();
578 qDebug(logMouse) << Q_FUNC_INFO <<
event->buttons() <<
event->button() << pos << mask;
580 SendPointerEvent(m_pClient, pos.x(), pos.y(), mask);
583void CBackendLibVNCServer::mouseReleaseEvent(QMouseEvent *event)
585 if(!m_pClient)
return;
586 if(m_pParameter && m_pParameter->GetOnlyView())
return;
588 QPoint pos =
event->pos();
589 qDebug(logMouse) << Q_FUNC_INFO <<
event->buttons() <<
event->button() << pos << mask;
590 SendPointerEvent(m_pClient, pos.x(), pos.y(), mask);
593void CBackendLibVNCServer::mouseMoveEvent(QMouseEvent *event)
595 if(!m_pClient)
return;
596 if(m_pParameter && m_pParameter->GetOnlyView())
return;
598 if(event->buttons() & Qt::MouseButton::LeftButton)
600 if(event->buttons() & Qt::MouseButton::MiddleButton)
602 if(event->buttons() & Qt::MouseButton::RightButton)
604 if(event->buttons() & Qt::MouseButton::BackButton)
606 QPoint pos =
event->pos();
607 qDebug(logMouse) << Q_FUNC_INFO <<
event->buttons() <<
event->button() << pos << mask;
608 SendPointerEvent(m_pClient, pos.x(), pos.y(), mask);
612void CBackendLibVNCServer::wheelEvent(QWheelEvent *event)
614 if(!m_pClient)
return;
615 if(m_pParameter && m_pParameter->GetOnlyView())
return;
617 if(event->buttons() & Qt::MouseButton::LeftButton)
619 if(event->buttons() & Qt::MouseButton::MiddleButton)
621 if(event->buttons() & Qt::MouseButton::RightButton)
623 if(event->buttons() & Qt::MouseButton::BackButton)
626 QPoint d =
event->angleDelta();
637#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
638 pos =
event->position();
643 qDebug(logMouse) << Q_FUNC_INFO <<
event->buttons() <<
event->angleDelta() << pos;
645 SendPointerEvent(m_pClient, pos.x(), pos.y(), mask);
655uint32_t TranslateRfbKey(quint32 inkey,
bool modifier)
661 case Qt::Key_Backspace: k = XK_BackSpace;
break;
662 case Qt::Key_Tab: k = XK_Tab;
break;
663 case Qt::Key_Clear: k = XK_Clear;
break;
664 case Qt::Key_Return: k = XK_Return;
break;
665 case Qt::Key_Pause: k = XK_Pause;
break;
666 case Qt::Key_Escape: k = XK_Escape;
break;
667 case Qt::Key_Space: k = XK_space;
break;
668 case Qt::Key_Delete: k = XK_Delete;
break;
669 case Qt::Key_Period: k = XK_period;
break;
672 case Qt::Key_Multi_key: k = XK_Multi_key;
break;
673 case Qt::Key_SingleCandidate: k = XK_SingleCandidate;
break;
674 case Qt::Key_MultipleCandidate: k = XK_MultipleCandidate;
break;
675 case Qt::Key_PreviousCandidate: k = XK_PreviousCandidate;
break;
678 case Qt::Key_Kanji: k = XK_Kanji;
break;
679 case Qt::Key_Muhenkan: k = XK_Muhenkan;
break;
680 case Qt::Key_Henkan: k = XK_Henkan;
break;
681 case Qt::Key_Romaji: k = XK_Romaji;
break;
682 case Qt::Key_Hiragana: k = XK_Hiragana;
break;
683 case Qt::Key_Katakana: k = XK_Katakana;
break;
684 case Qt::Key_Hiragana_Katakana: k = XK_Hiragana_Katakana;
break;
685 case Qt::Key_Zenkaku: k = XK_Zenkaku;
break;
686 case Qt::Key_Hankaku: k = XK_Hankaku;
break;
687 case Qt::Key_Zenkaku_Hankaku: k = XK_Zenkaku_Hankaku;
break;
688 case Qt::Key_Touroku: k = XK_Touroku;
break;
689 case Qt::Key_Massyo: k = XK_Massyo;
break;
690 case Qt::Key_Kana_Lock: k = XK_Kana_Lock;
break;
691 case Qt::Key_Kana_Shift: k = XK_Kana_Shift;
break;
692 case Qt::Key_Eisu_Shift: k = XK_Eisu_Shift;
break;
693 case Qt::Key_Eisu_toggle: k = XK_Eisu_toggle;
break;
696 case Qt::Key_Exclam: k = XK_exclam;
break;
697 case Qt::Key_QuoteDbl: k = XK_quotedbl;
break;
698 case Qt::Key_NumberSign: k = XK_numbersign;
break;
699 case Qt::Key_Percent: k = XK_percent;
break;
700 case Qt::Key_Dollar: k = XK_dollar;
break;
701 case Qt::Key_Ampersand: k = XK_ampersand;
break;
702 case Qt::Key_Apostrophe: k = XK_apostrophe;
break;
703 case Qt::Key_ParenLeft: k = XK_parenleft;
break;
704 case Qt::Key_ParenRight: k = XK_parenright;
break;
706 case Qt::Key_Slash: k = XK_slash;
break;
707 case Qt::Key_Asterisk: k = XK_asterisk;
break;
708 case Qt::Key_Minus: k = XK_minus;
break;
709 case Qt::Key_Plus: k = XK_plus;
break;
710 case Qt::Key_Enter: k = XK_Return;
break;
711 case Qt::Key_Equal: k = XK_equal;
break;
712 case Qt::Key_Comma:
return XK_comma;
714 case Qt::Key_Colon: k = XK_colon;
break;
715 case Qt::Key_Semicolon: k = XK_semicolon;
break;
716 case Qt::Key_Less: k = XK_less;
break;
717 case Qt::Key_Greater: k = XK_greater;
break;
718 case Qt::Key_Question: k = XK_question;
break;
719 case Qt::Key_At: k = XK_at;
break;
721 case Qt::Key_BracketLeft: k = XK_bracketleft;
break;
722 case Qt::Key_Backslash: k = XK_backslash;
break;
723 case Qt::Key_BracketRight: k = XK_bracketright;
break;
724 case Qt::Key_AsciiCircum: k = XK_asciicircum;
break;
725 case Qt::Key_Underscore: k = XK_underscore;
break;
726 case Qt::Key_QuoteLeft: k = XK_quoteleft;
break;
727 case Qt::Key_BraceLeft: k = XK_braceleft;
break;
728 case Qt::Key_Bar: k = XK_bar;
break;
729 case Qt::Key_BraceRight: k = XK_braceright;
break;
730 case Qt::Key_AsciiTilde: k = XK_asciitilde;
break;
731 case Qt::Key_nobreakspace: k = XK_nobreakspace;
break;
732 case Qt::Key_exclamdown: k = XK_exclamdown;
break;
733 case Qt::Key_cent: k = XK_cent;
break;
734 case Qt::Key_sterling: k = XK_sterling;
break;
735 case Qt::Key_currency: k = XK_currency;
break;
736 case Qt::Key_yen: k = XK_yen;
break;
737 case Qt::Key_brokenbar: k = XK_brokenbar;
break;
738 case Qt::Key_section: k = XK_section;
break;
739 case Qt::Key_diaeresis: k = XK_diaeresis;
break;
740 case Qt::Key_copyright: k = XK_copyright;
break;
741 case Qt::Key_ordfeminine: k = XK_ordfeminine;
break;
742 case Qt::Key_guillemotleft: k = XK_guillemotleft;
break;
743 case Qt::Key_guillemotright: k = XK_guillemotright;
break;
744 case Qt::Key_notsign: k = XK_notsign;
break;
745 case Qt::Key_hyphen: k = XK_hyphen;
break;
746 case Qt::Key_registered: k = XK_registered;
break;
748 case Qt::Key_Up: k = XK_Up;
break;
749 case Qt::Key_Down: k = XK_Down;
break;
750 case Qt::Key_Right: k = XK_Right;
break;
751 case Qt::Key_Left: k = XK_Left;
break;
752 case Qt::Key_Insert: k = XK_Insert;
break;
753 case Qt::Key_Home: k = XK_Home;
break;
754 case Qt::Key_End: k = XK_End;
break;
755 case Qt::Key_PageUp: k = XK_Page_Up;
break;
756 case Qt::Key_PageDown: k = XK_Page_Down;
break;
757 case Qt::Key_MediaPrevious: k = XK_Prior;
break;
758 case Qt::Key_MediaNext: k = XK_Next;
break;
759 case Qt::Key_MediaPlay: k = XK_Begin;
break;
762 case Qt::Key_Select: k = XK_Select;
break;
763 case Qt::Key_Printer: k = XK_Print;
break;
764 case Qt::Key_Execute: k = XK_Execute;
break;
765 case Qt::Key_Undo: k = XK_Undo;
break;
766 case Qt::Key_Redo: k = XK_Redo;
break;
767 case Qt::Key_Menu: k = XK_Menu;
break;
768 case Qt::Key_Find: k = XK_Find;
break;
774 case Qt::Key_Mode_switch: k = XK_Mode_switch;
break;
776 case Qt::Key_F1: k = XK_F1;
break;
777 case Qt::Key_F2: k = XK_F2;
break;
778 case Qt::Key_F3: k = XK_F3;
break;
779 case Qt::Key_F4: k = XK_F4;
break;
780 case Qt::Key_F5: k = XK_F5;
break;
781 case Qt::Key_F6: k = XK_F6;
break;
782 case Qt::Key_F7: k = XK_F7;
break;
783 case Qt::Key_F8: k = XK_F8;
break;
784 case Qt::Key_F9: k = XK_F9;
break;
785 case Qt::Key_F10: k = XK_F10;
break;
786 case Qt::Key_F11: k = XK_F11;
break;
787 case Qt::Key_F12: k = XK_F12;
break;
788 case Qt::Key_F13: k = XK_F13;
break;
789 case Qt::Key_F14: k = XK_F14;
break;
790 case Qt::Key_F15: k = XK_F15;
break;
791 case Qt::Key_F16: k = XK_F16;
break;
792 case Qt::Key_F17: k = XK_F17;
break;
793 case Qt::Key_F18: k = XK_F18;
break;
794 case Qt::Key_F19: k = XK_F19;
break;
795 case Qt::Key_F20: k = XK_F20;
break;
796 case Qt::Key_F21: k = XK_F21;
break;
797 case Qt::Key_F22: k = XK_F22;
break;
798 case Qt::Key_F23: k = XK_F23;
break;
799 case Qt::Key_F24: k = XK_F24;
break;
800 case Qt::Key_F25: k = XK_F25;
break;
801 case Qt::Key_F26: k = XK_F26;
break;
802 case Qt::Key_F27: k = XK_F27;
break;
803 case Qt::Key_F28: k = XK_F28;
break;
804 case Qt::Key_F29: k = XK_F29;
break;
805 case Qt::Key_F30: k = XK_F30;
break;
806 case Qt::Key_F31: k = XK_F31;
break;
807 case Qt::Key_F32: k = XK_F32;
break;
808 case Qt::Key_F33: k = XK_F33;
break;
809 case Qt::Key_F34: k = XK_F34;
break;
810 case Qt::Key_F35: k = XK_F35;
break;
812 case Qt::Key_NumLock: k = XK_Num_Lock;
break;
813 case Qt::Key_CapsLock: k = XK_Caps_Lock;
break;
814 case Qt::Key_ScrollLock: k = XK_Scroll_Lock;
break;
816 case Qt::Key_Shift: k = XK_Shift_R;
break;
817 case Qt::Key_Control: k = XK_Control_R;
break;
818 case Qt::Key_Alt: k = XK_Alt_R;
break;
819 case Qt::Key_Meta: k = XK_Meta_R;
break;
821 case Qt::Key_Super_L: k = XK_Super_L;
break;
822 case Qt::Key_Super_R: k = XK_Super_R;
break;
824 case Qt::Key_Help: k = XK_Help;
break;
825 case Qt::Key_Print: k = XK_Print;
break;
826 case Qt::Key_SysReq: k = XK_Sys_Req;
break;
827 case Qt::Key_0: k = XK_0;
break;
828 case Qt::Key_1: k = XK_1;
break;
829 case Qt::Key_2: k = XK_2;
break;
830 case Qt::Key_3: k = XK_3;
break;
831 case Qt::Key_4: k = XK_4;
break;
832 case Qt::Key_5: k = XK_5;
break;
833 case Qt::Key_6: k = XK_6;
break;
834 case Qt::Key_7: k = XK_7;
break;
835 case Qt::Key_8: k = XK_8;
break;
836 case Qt::Key_9: k = XK_9;
break;
846 case Qt::Key_A: k = XK_a;
break;
847 case Qt::Key_B: k = XK_b;
break;
848 case Qt::Key_C: k = XK_c;
break;
849 case Qt::Key_D: k = XK_d;
break;
850 case Qt::Key_E: k = XK_e;
break;
851 case Qt::Key_F: k = XK_f;
break;
852 case Qt::Key_G: k = XK_g;
break;
853 case Qt::Key_H: k = XK_h;
break;
854 case Qt::Key_I: k = XK_i;
break;
855 case Qt::Key_J: k = XK_j;
break;
856 case Qt::Key_K: k = XK_k;
break;
857 case Qt::Key_L: k = XK_l;
break;
858 case Qt::Key_M: k = XK_m;
break;
859 case Qt::Key_N: k = XK_n;
break;
860 case Qt::Key_O: k = XK_o;
break;
861 case Qt::Key_P: k = XK_p;
break;
862 case Qt::Key_Q: k = XK_q;
break;
863 case Qt::Key_R: k = XK_r;
break;
864 case Qt::Key_S: k = XK_s;
break;
865 case Qt::Key_T: k = XK_t;
break;
866 case Qt::Key_U: k = XK_u;
break;
867 case Qt::Key_V: k = XK_v;
break;
868 case Qt::Key_W: k = XK_w;
break;
869 case Qt::Key_X: k = XK_x;
break;
870 case Qt::Key_Y: k = XK_y;
break;
871 case Qt::Key_Z: k = XK_z;
break;
878 case Qt::Key_A: k = XK_A;
break;
879 case Qt::Key_B: k = XK_B;
break;
880 case Qt::Key_C: k = XK_C;
break;
881 case Qt::Key_D: k = XK_D;
break;
882 case Qt::Key_E: k = XK_E;
break;
883 case Qt::Key_F: k = XK_F;
break;
884 case Qt::Key_G: k = XK_G;
break;
885 case Qt::Key_H: k = XK_H;
break;
886 case Qt::Key_I: k = XK_I;
break;
887 case Qt::Key_J: k = XK_J;
break;
888 case Qt::Key_K: k = XK_K;
break;
889 case Qt::Key_L: k = XK_L;
break;
890 case Qt::Key_M: k = XK_M;
break;
891 case Qt::Key_N: k = XK_N;
break;
892 case Qt::Key_O: k = XK_O;
break;
893 case Qt::Key_P: k = XK_P;
break;
894 case Qt::Key_Q: k = XK_Q;
break;
895 case Qt::Key_R: k = XK_R;
break;
896 case Qt::Key_S: k = XK_S;
break;
897 case Qt::Key_T: k = XK_T;
break;
898 case Qt::Key_U: k = XK_U;
break;
899 case Qt::Key_V: k = XK_V;
break;
900 case Qt::Key_W: k = XK_W;
break;
901 case Qt::Key_X: k = XK_X;
break;
902 case Qt::Key_Y: k = XK_Y;
break;
903 case Qt::Key_Z: k = XK_Z;
break;
911void CBackendLibVNCServer::keyPressEvent(QKeyEvent *event)
913 if(!m_pClient)
return;
914 if(m_pParameter && m_pParameter->GetOnlyView())
return;
915 bool modifier =
false;
916 if (event->modifiers() & Qt::ShiftModifier)
918 uint32_t k = TranslateRfbKey(event->key(), modifier);
919 qDebug(logKey) << Q_FUNC_INFO <<
event << k << modifier;
920 SendKeyEvent(m_pClient, k, TRUE);
923void CBackendLibVNCServer::keyReleaseEvent(QKeyEvent *event)
925 if(!m_pClient)
return;
926 if(m_pParameter && m_pParameter->GetOnlyView())
return;
927 bool modifier =
false;
928 if (event->modifiers() & Qt::ShiftModifier)
930 uint32_t k = TranslateRfbKey(event->key(), modifier);
931 qDebug(logKey) << Q_FUNC_INFO <<
event << k << modifier;
932 SendKeyEvent(m_pClient, k, FALSE);
939 auto &net = m_pParameter->m_Proxy.m_SSH.m_Net;
942 m_pClient->serverHost = strdup(szHost.toStdString().c_str());
943 m_pClient->serverPort = nPort;
944 szErr = tr(
"Will connect to local socket server: %1:%2")
945 .arg(m_pClient->serverHost,
946 QString::number(m_pClient->serverPort));
947 qDebug(log) << szErr;
948 if(!rfbInitClient(m_pClient,
nullptr,
nullptr))
953 szErr = tr(
"Fail: Connect to %1:%2 <- %3:%4 <- %5:%6")
954 .arg(m_pParameter->m_Net.GetHost(),
955 QString::number(m_pParameter->m_Net.GetPort()),
956 net.GetHost(), QString::number(net.GetPort()),
957 szHost, QString::number(nPort)
959 qCritical(log) << szErr;
964 QString szInfo = QString(
"Connected to %1 <- %2:%3 <- %4:%5")
965 .arg(m_pClient->desktopName,
966 net.GetHost(), QString::number(net.GetPort()),
967 szHost, QString::number(nPort));
968 qInfo(log) << szInfo;
970 emit sigSetDesktopSize(m_pClient->width, m_pClient->height);
971 emit sigServerName(m_pClient->desktopName);
977#if defined(HAVE_UNIX_DOMAIN_SOCKET)
983 m_pClient->serverHost = strdup(szFile.toStdString().c_str());
984 szErr = tr(
"Will connect to local socket server: ") + szFile;
985 qDebug(log) << szErr;
986 if(!rfbInitClient(m_pClient,
nullptr,
nullptr))
991 szErr = tr(
"Fail: Connect to %1:%2 with %3")
992 .arg(m_pParameter->m_Net.GetHost(),
993 QString::number(m_pParameter->m_Net.GetPort()),
995 qCritical(log) << szErr;
1000 QString szInfo = QString(
"Connected to ") + m_pClient->desktopName +
" with " + szFile;
1001 qInfo(log) << szInfo;
1004 emit sigSetDesktopSize(m_pClient->width, m_pClient->height);
1005 emit sigServerName(m_pClient->desktopName);
void sigUpdateRect(const QRect &r, const QImage &image)
通知视图,图像更新
virtual int OnClean() override
清理
void slotConnectProxyServer(QString szHost, quint16 nPort)
[connect local socket server]
virtual int WakeUp() override
唤醒后台线程
virtual OnInitReturnValue OnInit() override
virtual int OnProcess() override
插件连接的具体操作处理。因为此插件是非Qt事件,所以在此函数中等待。
void sigInformation(const QString &szInfo)
从后台线程中触发在主线程中显示信息,不阻塞后台线程
void sigStop()
需要通知用户停止时触发。仅由插件触发。 当从插件中需要停止时触发。例如:对端断开连接、重置连接或者连接出错。
void sigShowMessageBox(const QString &szTitle, const QString &szMessage, const QMessageBox::Icon &icon=QMessageBox::Information)
从后台线程中触发在主线程中显示消息对话框(QMessageBox),不阻塞后台线程
void sigError(const int nError, const QString &szError=QString())
当有错误产生时触发
void sigRunning()
当插件开始成功后触发。仅由插件触发
virtual void slotTimeOut()
一个非 Qt 事件处理,它调用 OnProcess(),并根据其返回值开始新的定时器。 如果是不是一个非 Qt 事件循环(就是普通的循环处理), 可以重载它,或者 OnInit() 返回值大于 0
void sigSecurityLevel(CSecurityLevel::Levels level)
当安全级别改变时触发
void sigBlockShowWidget(const QString &className, int &nRet, void *pContext)
阻塞后台线程,并在前台线程中显示窗口。
CParameterUser m_User
[Instance user]
实现通过本地 SOCKET 与 SSH 隧道转发数据。适用于库没有实现传输层接口,只有 socket 的情况。