aboutsummaryrefslogtreecommitdiffstats
path: root/win/vncviewer/CConnThread.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win/vncviewer/CConnThread.cxx')
-rw-r--r--win/vncviewer/CConnThread.cxx197
1 files changed, 0 insertions, 197 deletions
diff --git a/win/vncviewer/CConnThread.cxx b/win/vncviewer/CConnThread.cxx
deleted file mode 100644
index ea3a20a4..00000000
--- a/win/vncviewer/CConnThread.cxx
+++ /dev/null
@@ -1,197 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- * USA.
- */
-
-// -=- CConnThread.cxx
-
-// A CConnThread instance is created for each new connection.
-// The CConnThread creates the corresponding CConn instance
-// and manages it.
-
-#include <stdlib.h>
-#include <rfb/LogWriter.h>
-#include <rfb_win32/MsgBox.h>
-#include <network/TcpSocket.h>
-#include <vncviewer/CConnThread.h>
-#include <vncviewer/CConn.h>
-#include <vncviewer/ConnectionDialog.h>
-#include <vncviewer/ConnectingDialog.h>
-#include <vncviewer/UserPasswdDialog.h>
-#include <set>
-
-using namespace rfb;
-using namespace win32;
-
-static LogWriter vlog("CConnThread");
-
-static std::set<CConnThread*> threads;
-static Mutex threadsLock;
-static Handle noMoreThreads(CreateEvent(0, TRUE, FALSE, 0));
-
-
-CConnThread::CConnThread() : Thread("CConnThread"), isConfig(false),
- sock(0), reverse(false) {
- vlog.info("CConnThread (dialog)");
- setDeleteAfterRun();
- Lock l(threadsLock);
- threads.insert(this);
- start();
-}
-
-CConnThread::CConnThread(const char* hostOrConfig_, bool isConfig_)
- : Thread("CConnThread"), hostOrConfig(strDup(hostOrConfig_)),
- isConfig(isConfig_), sock(0), reverse(false) {
- vlog.info("CConnThread (host/port)");
- setDeleteAfterRun();
- Lock l(threadsLock);
- threads.insert(this);
- start();
-}
-
-CConnThread::CConnThread(network::Socket* sock_, bool reverse_)
- : Thread("CConnThread"), isConfig(false), sock(sock_), reverse(reverse_) {
- vlog.info("CConnThread (reverse connection)");
- setDeleteAfterRun();
- Lock l(threadsLock);
- threads.insert(this);
- start();
-}
-
-CConnThread::~CConnThread() {
- Lock l(threadsLock);
- threads.erase(this);
- if (threads.empty())
- SetEvent(noMoreThreads);
- delete sock;
-}
-
-
-void CConnThread::run() {
- CConnOptions options;
- bool reconnect;
-
- do {
- {
- CConn conn;
- reconnect = false;
-
- // If there is no socket object then set the host & port info
- if (!sock && !options.host.buf) {
- try {
- if (isConfig) {
- // A configuration file name was specified - load it
- CharArray filename(hostOrConfig.takeBuf());
- options.readFromFile(filename.buf);
- } else {
- // An actual hostname (and possibly port) was specified
- options.host.replaceBuf(hostOrConfig.takeBuf());
- }
-
- if (!options.host.buf) {
- // No host was specified - prompt for one
- ConnectionDialog connDlg(&conn);
- if (!connDlg.showDialog())
- return;
- options = conn.getOptions();
- options.setHost(CStr(connDlg.hostname.buf));
- }
- } catch (rdr::Exception& e) {
- MsgBox(0, TStr(e.str()), MB_ICONERROR | MB_OK);
- return;
- }
- }
-
- // Apply the connection options to the CConn
- conn.applyOptions(options);
-
- if (!sock) {
- // There is no existing connection - better make one
- const char* hostAndPort = conn.getOptions().host.buf;
-
- try {
- ConnectingDialog dlg;
- sock = dlg.connect(hostAndPort);
-
- // If the connection was cancelled by the user, just quit
- if (!sock)
- return;
- } catch(rdr::Exception& e) {
- MsgBox(NULL, TStr(e.str()), MB_ICONERROR | MB_OK);
- return;
- }
-
- // Try to add the caller to the MRU
- MRU::addToMRU(hostAndPort);
- }
-
- // Run the RFB protocol over the connected socket
- conn.initialise(sock, reverse);
- while (!conn.isClosed()) {
- try {
- conn.getInStream()->check(1,1);
- conn.processMsg();
- } catch (rdr::EndOfStream) {
- if (conn.state() == CConnection::RFBSTATE_NORMAL)
- conn.close();
- else
- conn.close("The connection closed unexpectedly");
- } catch (rfb::AuthCancelledException) {
- conn.close();
- } catch (rfb::AuthFailureException& e) {
- // Clear the password, in case we auto-reconnect
- options = conn.getOptions();
- options.password.replaceBuf(0);
- conn.applyOptions(options);
- conn.close(e.str());
- } catch (rdr::Exception& e) {
- conn.close(e.str());
- }
- }
-
- // If there is a cause for closing the connection logged then display it
- if (conn.closeReason()) {
- reconnect = !reverse && conn.getOptions().autoReconnect;
- if (!reconnect) {
- MsgBox(0, TStr(conn.closeReason()), MB_ICONINFORMATION | MB_OK);
- } else {
- options = conn.getOptions();
- const char* format = "%s\nDo you wish to attempt to reconnect to %s?";
- CharArray message(strlen(conn.closeReason()) + strlen(format) +
- strlen(conn.getOptions().host.buf));
- sprintf(message.buf, format, conn.closeReason(), conn.getOptions().host.buf);
- if (MsgBox(0, TStr(message.buf), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) != IDYES)
- reconnect = false;
- }
- }
- } // Exit the CConn's scope, implicitly destroying it & making it safe to delete the TcpSocket
-
- // Clean up the old socket, if any
- delete sock; sock = 0;
- } while (reconnect);
-}
-
-
-BOOL CConnThread::getMessage(MSG* msg, HWND hwnd, UINT minMsg, UINT maxMsg) {
- while (!PeekMessage(msg, hwnd, minMsg, maxMsg, PM_REMOVE)) {
- DWORD result = MsgWaitForMultipleObjects(1, &noMoreThreads.h, FALSE, INFINITE, QS_ALLINPUT);
- if (result == WAIT_OBJECT_0)
- return FALSE;
- else if (result == WAIT_FAILED)
- throw rdr::SystemException("CConnThread::getMessage wait failed", GetLastError());
- }
- return msg->message != WM_QUIT;
-}