VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
bool reverse)
- : sock(s), reverseConnection(reverse), server(server_),
- image_getter(server->useEconomicTranslate),
+ : SConnection(server_->securityFactory, reverse), sock(s), server(server_),
+ updates(false), image_getter(server->useEconomicTranslate),
drawRenderedCursor(false), removeRenderedCursor(false),
pointerEventTime(0), accessRights(AccessDefault),
- startTime(time(0))
+ startTime(time(0)), m_pFileTransfer(0)
{
setStreams(&sock->inStream(), &sock->outStream());
peerEndpoint.buf = sock->getPeerEndpoint();
setSocketTimeouts();
lastEventTime = time(0);
- // Initialise security
- CharArray sec_types_str;
- if (reverseConnection)
- sec_types_str.buf = rfb::Server::rev_sec_types.getData();
- else
- sec_types_str.buf = rfb::Server::sec_types.getData();
- std::list<int> sec_types = parseSecTypes(sec_types_str.buf);
- std::list<int>::iterator i;
- for (i=sec_types.begin(); i!=sec_types.end(); i++) {
- addSecType(*i);
- }
-
+ // Add this client to the VNCServerST
+ if (server->m_pFTManager != NULL) {
+ SFileTransfer *pFT = server->m_pFTManager->createObject(sock);
+ if (pFT != NULL) {
+ m_pFileTransfer = pFT;
+ }
+ }
+
server->clients.push_front(this);
}
const TCHAR* winvnc::VNCServerWin32::RegConfigPath = _T("Software\\TightVNC\\WinVNC4");
- const UINT VNCM_REG_CHANGED = WM_USER;
- const UINT VNCM_COMMAND = WM_USER + 1;
-
++// FIXME: Move into an .h file?
+extern const UINT VNCM_FT_DOWNLOAD;
+
static IntParameter http_port("HTTPPortNumber",
"TCP/IP port on which the server will serve the Java applet VNC Viewer ", 5800);
// Register the desktop's event to be handled
sockMgr.addEvent(desktop.getUpdateEvent(), &desktop);
+ // Register the queued command event to be handled
+ sockMgr.addEvent(commandEvent, this);
++
+ vncServer.setFTManager((rfb::SFileTransferManager *)&m_FTManager);
}
VNCServerWin32::~VNCServerWin32() {
DWORD result = 0;
try {
- // - Create some managed listening sockets
- ManagedListener rfb(&sockMgr, &vncServer);
- ManagedListener http(&sockMgr, httpServer);
+ vlog.debug("Entering message loop");
- // - Continue to operate until WM_QUIT is processed
+ // - Run the server until we're told to quit
MSG msg;
- do {
- // -=- Make sure we're listening on the right ports.
- rfb.setPort(port_number, localHost);
- http.setPort(http_port, localHost);
-
- // -=- Update the Java viewer's web page port number.
- httpServer->setRFBport(rfb.sock ? port_number : 0);
-
- // -=- Update the TCP address filter for both ports, if open.
- CharArray pattern;
- pattern.buf = hosts.getData();
- if (!localHost) {
- rfb.setFilter(pattern.buf);
- http.setFilter(pattern.buf);
- }
-
- // - If there is a listening port then add the address to the
- // tray icon's tool-tip text.
- {
- const TCHAR* prefix = isServiceProcess() ?
- _T("VNC Server (Service):") : _T("VNC Server (User):");
-
- std::list<char*> addrs;
- if (rfb.sock)
- rfb.sock->getMyAddresses(&addrs);
- else
- addrs.push_front(strDup("Not accepting connections"));
-
- std::list<char*>::iterator i, next_i;
- int length = _tcslen(prefix)+1;
- for (i=addrs.begin(); i!= addrs.end(); i++)
- length += strlen(*i) + 1;
-
- TCharArray toolTip(length);
- _tcscpy(toolTip.buf, prefix);
- for (i=addrs.begin(); i!= addrs.end(); i=next_i) {
- next_i = i; next_i ++;
- TCharArray addr = *i; // Assumes ownership of string
- _tcscat(toolTip.buf, addr.buf);
- if (next_i != addrs.end())
- _tcscat(toolTip.buf, _T(","));
- }
- trayIcon.setToolTip(toolTip.buf);
- }
-
- vlog.debug("Entering message loop");
-
- // - Run the server until the registry changes, or we're told to quit
- while (sockMgr.getMessage(&msg, NULL, 0, 0)) {
- if (msg.hwnd == 0) {
- if (msg.message == VNCM_REG_CHANGED)
- break;
- if (msg.message == VNCM_COMMAND)
- doCommand();
- if (msg.message == VNCM_FT_DOWNLOAD)
- m_FTManager.processDownloadMsg(msg);
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-
- } while ((msg.message != WM_QUIT) || runServer);
+ int result = 0;
+ while (runServer) {
+ result = sockMgr.getMessage(&msg, NULL, 0, 0);
+ if (result < 0)
+ throw rdr::SystemException("getMessage", GetLastError());
+ if (!isServiceProcess() && (result == 0))
+ break;
++ if (msg.message == VNCM_FT_DOWNLOAD)
++ m_FTManager.processDownloadMsg(msg);
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
vlog.debug("Server exited cleanly");
} catch (rdr::SystemException &s) {
#include <rfb_win32/SDisplay.h>
#include <rfb_win32/SocketManager.h>
#include <rfb_win32/TCharArray.h>
+#include <rfb_win32/SFileTransferManagerWin32.h>
#include <winvnc/QueryConnectDialog.h>
#include <winvnc/JavaViewer.h>
- //#include <rfb/ListConnInfo.h>
+ #include <winvnc/ManagedListener.h>
namespace winvnc {
rfb::Thread* hostThread;
bool runServer;
bool isDesktopStarted;
- JavaViewerServer* httpServer;
- rfb::win32::RegistryReader config;
+ JavaViewerServer httpServer;
rfb::win32::SocketManager sockMgr;
+ rfb::win32::RegConfig config;
+
+ ManagedListener rfbSock;
+ ManagedListener httpSock;
+ STrayIconThread* trayIcon;
+
+ //rfb::SSecurityFactoryStandard securityFactory;
+
QueryConnectDialog* queryConnectDialog;
+ rfb::win32::SFileTransferManagerWin32 m_FTManager;
};
};