// Constructor/destructor vncServer::vncServer() { // Initialise some important stuffs... m_socketConn = NULL; m_corbaConn = NULL; m_desktop = NULL; m_name = NULL; m_port = DISPLAY_TO_PORT(0); m_autoportselect = TRUE; m_passwd_required = TRUE; m_auth_hosts = 0; m_blacklist = 0; { vncPasswd::FromClear clearPWD; memcpy(m_password, clearPWD, MAXPWLEN); } m_querysetting = 2; m_querytimeout = 10; // Autolock settings m_lock_on_exit = 0; // Set the polling mode options m_poll_fullscreen = FALSE; m_poll_foreground = FALSE; m_poll_undercursor = TRUE; m_poll_oneventonly = FALSE; m_poll_consoleonly = TRUE; // General options m_loopbackOnly = FALSE; m_loopback_allowed = FALSE; m_lock_on_exit = 0; m_connect_pri = 0; // Set the input options m_enable_remote_inputs = TRUE; m_disable_local_inputs = FALSE; // Clear the client mapping table for (int x=0; x<MAX_CLIENTS; x++) m_clientmap[x] = NULL; m_nextid = 0; // Initialise the update tracker m_update_tracker.init(this); // Signal set when a client quits m_clientquitsig = new omni_condition(&m_clientsLock); }
// Socket connection handling BOOL vncServer::SockConnect(BOOL On) { // Are we being asked to switch socket connects on or off? if (On) { // Is there a listening socket? if (m_socketConn == NULL) { m_socketConn = new vncSockConnect(); if (m_socketConn == NULL) return FALSE; // Are we to use automatic port selection? if (m_autoportselect) { BOOL ok = FALSE; // Yes, so cycle through the ports, looking for a free one! for (int i=0; i < 99; i++) { m_port = DISPLAY_TO_PORT(i); vnclog.Print(LL_CLIENTS, VNCLOG("trying port number %d\n"), m_port); // Attempt to connect to the port VSocket tempsock; if (tempsock.Create()) { if (!tempsock.Connect("localhost", m_port)) { // Couldn't connect, so this port is probably usable! if (m_socketConn->Init(this, m_port)) { ok = TRUE; break; } } } } if (!ok) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } else { // No autoportselect if (!m_socketConn->Init(this, m_port)) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } } } else { // *** JNW - Trying to fix up a lock-up when the listening socket closes KillAuthClients(); KillUnauthClients(); WaitUntilAuthEmpty(); WaitUntilUnauthEmpty(); // Is there a listening socket? if (m_socketConn != NULL) { // Close the socket delete m_socketConn; m_socketConn = NULL; } } return TRUE; }
// Constructor/destructor vncServer::vncServer() { // Initialise some important stuffs... g_Server_running=true; m_socketConn = NULL; m_desktop = NULL; m_name = NULL; m_port = DISPLAY_TO_PORT(0); m_port_http = DISPLAY_TO_HPORT(0); // TightVNC 1.2.7 m_autoportselect = TRUE; m_passwd_required = TRUE; m_auth_hosts = 0; m_blacklist = 0; m_querysetting = 2; m_queryaccept = 0; m_querytimeout = 10; // Autolock settings m_lock_on_exit = 0; // Set the polling mode options m_poll_fullscreen = FALSE; m_poll_foreground = FALSE; m_poll_undercursor = TRUE; m_poll_oneventonly = FALSE; m_poll_consoleonly = TRUE; m_driver = FALSE; m_hook = FALSE; m_virtual = FALSE; sethook=false; // General options m_loopbackOnly = FALSE; m_loopback_allowed = FALSE; m_lock_on_exit = 0; m_connect_pri = 0; m_disableTrayIcon = FALSE; m_AllowEditClients = FALSE; // Set the input options m_enable_remote_inputs = TRUE; m_disable_local_inputs = FALSE; // Clear the client mapping table for (int x=0; x<MAX_CLIENTS; x++) m_clientmap[x] = NULL; m_nextid = 0; // Initialise the update tracker m_update_tracker.init(this); // Signal set when a client quits m_clientquitsig = new omni_condition(&m_clientsLock); // Modif sf@2002 m_SingleWindow = FALSE; strcpy(m_szWindowName, ""); // Modif sf@2002 m_TurboMode = false; // m_fCursorMoved = false; // sf@2002 - v1.1.2 // m_fQueuingEnabled = false; m_fFileTransferEnabled = true; m_nDefaultScale = 1; // sf@2002 - Data Stream Modification Plugin handling m_pDSMPlugin = new CDSMPlugin(); m_fDSMPluginEnabled = false; strcpy(m_szDSMPlugin, ""); m_fMSLogonRequired = false; m_fXRichCursor = false; // sf@2003 - Autoreconnect m_fAutoReconnect = false; m_AutoReconnectPort = 0; strcpy(m_szAutoReconnectAdr, ""); // sf@2005 - No FT User Impersonnation m_fFTUserImpersonation = true; m_fCaptureAlphaBlending = false; m_fBlackAlphaBlending = false; m_impersonationtoken=NULL; // Modif Jeremy C. }
// Constructor/destructor vncServer::vncServer() { ResetPasswordsValidityInfo(); // Initialise some important stuff... m_socketConn = NULL; m_jingleConn = NULL; m_desktop = NULL; m_name = NULL; m_port = DISPLAY_TO_PORT(0); m_port_http = DISPLAY_TO_HPORT(0); m_autoportselect = TRUE; m_passwd_required = TRUE; m_beepConnect = FALSE; m_beepDisconnect = FALSE; m_auth_hosts = 0; m_blacklist = 0; { vncPasswd::FromClear clearPWD; memcpy(m_password, clearPWD, MAXPWLEN); m_password_set = FALSE; memcpy(m_password_viewonly, clearPWD, MAXPWLEN); m_password_viewonly_set = FALSE; } m_querysetting = 2; m_querytimeout = 10; m_queryaccept = FALSE; m_queryallownopass = FALSE; // Autolock settings m_lock_on_exit = 0; // Set the polling mode options m_poll_fullscreen = FALSE; m_poll_foreground = FALSE; m_poll_undercursor = TRUE; m_poll_oneventonly = FALSE; m_poll_consoleonly = TRUE; m_dont_set_hooks = FALSE; m_dont_use_driver = FALSE; m_driver_direct_access_en = TRUE; // General options m_loopbackOnly = FALSE; m_disableTrayIcon = FALSE; m_loopback_allowed = FALSE; m_httpd_enabled = TRUE; m_httpd_params_enabled = FALSE; m_lock_on_exit = 0; m_connect_pri = 0; // Set the input options m_enable_remote_inputs = TRUE; m_disable_local_inputs = FALSE; // Clear the client mapping table for (int x=0; x<MAX_CLIENTS; x++) m_clientmap[x] = NULL; m_nextid = 0; // Signal set when a client quits m_clientquitsig = new omni_condition(&m_clientsLock); m_clients_disabled = FALSE; m_local_input_priority = FALSE; m_full_screen = TRUE; m_WindowShared= FALSE; m_hwndShared = NULL; m_screen_area = FALSE; m_primary_display_only_shared = FALSE; m_disable_time = 3; SetSharedRect(GetScreenRect()); SetPollingCycle(300); PollingCycleChanged(false); m_cursor_pos.x = 0; m_cursor_pos.y = 0; // initialize m_enable_file_transfers = FALSE; m_remove_wallpaper = FALSE; m_blank_screen = FALSE; #ifdef HORIZONLIVE m_full_screen = FALSE; m_WindowShared= TRUE; m_local_input_priority = TRUE; m_remote_mouse = 1; m_remote_keyboard = 1; #endif m_wallpaper_wait = FALSE; }
BOOL CALLBACK vncProperties::DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { // We use the dialog-box's USERDATA to store a _this pointer // This is set only once WM_INITDIALOG has been recieved, though! vncProperties *_this = (vncProperties *) GetWindowLong(hwnd, GWL_USERDATA); switch (uMsg) { case WM_INITDIALOG: { // Retrieve the Dialog box parameter and use it as a pointer // to the calling vncProperties object SetWindowLong(hwnd, GWL_USERDATA, lParam); _this = (vncProperties *) lParam; _this->m_dlgvisible = TRUE; // Set the dialog box's title to indicate which Properties we're editting if (_this->m_usersettings) { SetWindowText(hwnd, "WinVNC: Current User Properties"); } else { SetWindowText(hwnd, "WinVNC: Default Local System Properties"); } // Initialise the properties controls HWND hConnectSock = GetDlgItem(hwnd, IDC_CONNECT_SOCK); SendMessage(hConnectSock, BM_SETCHECK, _this->m_server->SockConnected(), 0); HWND hConnectHTTP = GetDlgItem(hwnd, IDC_CONNECT_HTTP); SendMessage(hConnectHTTP, BM_SETCHECK, _this->m_server->HTTPConnectEnabled(), 0); HWND hConnectCorba = GetDlgItem(hwnd, IDC_CONNECT_CORBA); SendMessage(hConnectCorba, BM_SETCHECK, _this->m_server->CORBAConnected(), 0); #if(defined(_CORBA)) ShowWindow(hConnectCorba, SW_SHOW); #else ShowWindow(hConnectCorba, SW_HIDE); #endif HWND hAutoPortNo = GetDlgItem(hwnd, IDC_AUTO_DISPLAY_NO); SendMessage(hAutoPortNo, BM_SETCHECK, _this->m_server->AutoPortSelect(), 0); EnableWindow(hAutoPortNo, _this->m_server->SockConnected()); HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO); SetDlgItemInt(hwnd, IDC_PORTNO, PORT_TO_DISPLAY(_this->m_server->GetPort()), FALSE); EnableWindow(hPortNo, _this->m_server->SockConnected() && !_this->m_server->AutoPortSelect()); HWND hPassword = GetDlgItem(hwnd, IDC_PASSWORD); EnableWindow(hPassword, _this->m_server->SockConnected()); // Get the password { char plain[MAXPWLEN+1]; _this->m_server->GetPassword(plain); { vncPasswd::ToText plainpwd(plain); int length = strlen(plainpwd); for (int i=0; i<length; i++) { plain[i] = i+1; } plain[length]=0; } SetDlgItemText(hwnd, IDC_PASSWORD, (const char *) plain); } // Remote input settings HWND hEnableRemoteInputs = GetDlgItem(hwnd, IDC_DISABLE_INPUTS); SendMessage(hEnableRemoteInputs, BM_SETCHECK, !(_this->m_server->RemoteInputsEnabled()), 0); // Local input settings HWND hDisableLocalInputs = GetDlgItem(hwnd, IDC_DISABLE_LOCAL_INPUTS); SendMessage(hDisableLocalInputs, BM_SETCHECK, _this->m_server->LocalInputsDisabled(), 0); // Remove the wallpaper HWND hRemoveWallpaper = GetDlgItem(hwnd, IDC_REMOVE_WALLPAPER); SendMessage(hRemoveWallpaper, BM_SETCHECK, _this->m_server->RemoveWallpaperEnabled(), 0); // Lock settings HWND hLockSetting; switch (_this->m_server->LockSettings()) { case 1: hLockSetting = GetDlgItem(hwnd, IDC_LOCKSETTING_LOCK); break; case 2: hLockSetting = GetDlgItem(hwnd, IDC_LOCKSETTING_LOGOFF); break; default: hLockSetting = GetDlgItem(hwnd, IDC_LOCKSETTING_NOTHING); }; SendMessage(hLockSetting, BM_SETCHECK, TRUE, 0); // Set the polling options HWND hPollFullScreen = GetDlgItem(hwnd, IDC_POLL_FULLSCREEN); SendMessage(hPollFullScreen, BM_SETCHECK, _this->m_server->PollFullScreen(), 0); HWND hPollForeground = GetDlgItem(hwnd, IDC_POLL_FOREGROUND); SendMessage(hPollForeground, BM_SETCHECK, _this->m_server->PollForeground(), 0); HWND hPollUnderCursor = GetDlgItem(hwnd, IDC_POLL_UNDER_CURSOR); SendMessage(hPollUnderCursor, BM_SETCHECK, _this->m_server->PollUnderCursor(), 0); HWND hPollConsoleOnly = GetDlgItem(hwnd, IDC_CONSOLE_ONLY); SendMessage(hPollConsoleOnly, BM_SETCHECK, _this->m_server->PollConsoleOnly(), 0); EnableWindow(hPollConsoleOnly, _this->m_server->PollUnderCursor() || _this->m_server->PollForeground() ); HWND hPollOnEventOnly = GetDlgItem(hwnd, IDC_ONEVENT_ONLY); SendMessage(hPollOnEventOnly, BM_SETCHECK, _this->m_server->PollOnEventOnly(), 0); EnableWindow(hPollOnEventOnly, _this->m_server->PollUnderCursor() || _this->m_server->PollForeground() ); SetForegroundWindow(hwnd); return TRUE; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDC_APPLY: { // Save the password char passwd[MAXPWLEN+1]; if (GetDlgItemText(hwnd, IDC_PASSWORD, (LPSTR) &passwd, MAXPWLEN+1) == 0) { vncPasswd::FromClear crypt; _this->m_server->SetPassword(crypt); } else { char current_pwd[MAXPWLEN+1]; _this->m_server->GetPassword(current_pwd); vncPasswd::ToText current(current_pwd); BOOL password_changed = FALSE; for (int i=0; i<MAXPWLEN; i++) { if (passwd[i] != i+1) password_changed = TRUE; if ((passwd[i] >= 1) && (passwd[i] <= MAXPWLEN)) passwd[i] = current[passwd[i]-1]; } if (password_changed) { vnclog.Print(LL_INTINFO, VNCLOG("password changed\n")); vncPasswd::FromText crypt(passwd); _this->m_server->SetPassword(crypt); } } // Save the new settings to the server HWND hAutoDisplayNo = GetDlgItem(hwnd, IDC_AUTO_DISPLAY_NO); _this->m_server->SetAutoPortSelect( SendMessage(hAutoDisplayNo, BM_GETCHECK, 0, 0) == BST_CHECKED ); // only save the port number if we're not auto selecting! if (!_this->m_server->AutoPortSelect()) { BOOL success; UINT portno = GetDlgItemInt(hwnd, IDC_PORTNO, &success, TRUE); if (success) _this->m_server->SetPort(DISPLAY_TO_PORT(portno)); } HWND hConnectSock = GetDlgItem(hwnd, IDC_CONNECT_SOCK); _this->m_server->SockConnect( SendMessage(hConnectSock, BM_GETCHECK, 0, 0) == BST_CHECKED ); HWND hConnectHTTP = GetDlgItem(hwnd, IDC_CONNECT_HTTP); _this->m_server->EnableHTTPConnect( SendMessage(hConnectHTTP, BM_GETCHECK, 0, 0) == BST_CHECKED ); HWND hConnectCorba = GetDlgItem(hwnd, IDC_CONNECT_CORBA); _this->m_server->CORBAConnect( SendMessage(hConnectCorba, BM_GETCHECK, 0, 0) == BST_CHECKED ); // Remote input stuff HWND hEnableRemoteInputs = GetDlgItem(hwnd, IDC_DISABLE_INPUTS); _this->m_server->EnableRemoteInputs( SendMessage(hEnableRemoteInputs, BM_GETCHECK, 0, 0) != BST_CHECKED ); // Local input stuff HWND hDisableLocalInputs = GetDlgItem(hwnd, IDC_DISABLE_LOCAL_INPUTS); _this->m_server->DisableLocalInputs( SendMessage(hDisableLocalInputs, BM_GETCHECK, 0, 0) == BST_CHECKED ); // Wallpaper handling HWND hRemoveWallpaper = GetDlgItem(hwnd, IDC_REMOVE_WALLPAPER); _this->m_server->EnableRemoveWallpaper( SendMessage(hRemoveWallpaper, BM_GETCHECK, 0, 0) == BST_CHECKED ); // Lock settings handling if (SendMessage(GetDlgItem(hwnd, IDC_LOCKSETTING_LOCK), BM_GETCHECK, 0, 0) == BST_CHECKED) { _this->m_server->SetLockSettings(1); } else if (SendMessage(GetDlgItem(hwnd, IDC_LOCKSETTING_LOGOFF), BM_GETCHECK, 0, 0) == BST_CHECKED) { _this->m_server->SetLockSettings(2); } else { _this->m_server->SetLockSettings(0); } // Handle the polling stuff HWND hPollFullScreen = GetDlgItem(hwnd, IDC_POLL_FULLSCREEN); _this->m_server->PollFullScreen( SendMessage(hPollFullScreen, BM_GETCHECK, 0, 0) == BST_CHECKED ); HWND hPollForeground = GetDlgItem(hwnd, IDC_POLL_FOREGROUND); _this->m_server->PollForeground( SendMessage(hPollForeground, BM_GETCHECK, 0, 0) == BST_CHECKED ); HWND hPollUnderCursor = GetDlgItem(hwnd, IDC_POLL_UNDER_CURSOR); _this->m_server->PollUnderCursor( SendMessage(hPollUnderCursor, BM_GETCHECK, 0, 0) == BST_CHECKED ); HWND hPollConsoleOnly = GetDlgItem(hwnd, IDC_CONSOLE_ONLY); _this->m_server->PollConsoleOnly( SendMessage(hPollConsoleOnly, BM_GETCHECK, 0, 0) == BST_CHECKED ); HWND hPollOnEventOnly = GetDlgItem(hwnd, IDC_ONEVENT_ONLY); _this->m_server->PollOnEventOnly( SendMessage(hPollOnEventOnly, BM_GETCHECK, 0, 0) == BST_CHECKED ); // And to the registry _this->Save(); // Was ok pressed? if (LOWORD(wParam) == IDOK) { // Yes, so close the dialog vnclog.Print(LL_INTINFO, VNCLOG("enddialog (OK)\n")); _this->m_returncode_valid = TRUE; EndDialog(hwnd, IDOK); _this->m_dlgvisible = FALSE; } return TRUE; } case IDCANCEL: vnclog.Print(LL_INTINFO, VNCLOG("enddialog (CANCEL)\n")); _this->m_returncode_valid = TRUE; EndDialog(hwnd, IDCANCEL); _this->m_dlgvisible = FALSE; return TRUE; case IDC_CONNECT_SOCK: // The user has clicked on the socket connect tickbox { HWND hConnectSock = GetDlgItem(hwnd, IDC_CONNECT_SOCK); BOOL connectsockon = (SendMessage(hConnectSock, BM_GETCHECK, 0, 0) == BST_CHECKED); HWND hAutoDisplayNo = GetDlgItem(hwnd, IDC_AUTO_DISPLAY_NO); EnableWindow(hAutoDisplayNo, connectsockon); HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO); EnableWindow(hPortNo, connectsockon && (SendMessage(hAutoDisplayNo, BM_GETCHECK, 0, 0) != BST_CHECKED)); HWND hPassword = GetDlgItem(hwnd, IDC_PASSWORD); EnableWindow(hPassword, connectsockon); } return TRUE; case IDC_POLL_FOREGROUND: case IDC_POLL_UNDER_CURSOR: // User has clicked on one of the polling mode buttons // affected by the pollconsole and pollonevent options { // Get the poll-mode buttons HWND hPollForeground = GetDlgItem(hwnd, IDC_POLL_FOREGROUND); HWND hPollUnderCursor = GetDlgItem(hwnd, IDC_POLL_UNDER_CURSOR); // Determine whether to enable the modifier options BOOL enabled = (SendMessage(hPollForeground, BM_GETCHECK, 0, 0) == BST_CHECKED) || (SendMessage(hPollUnderCursor, BM_GETCHECK, 0, 0) == BST_CHECKED); HWND hPollConsoleOnly = GetDlgItem(hwnd, IDC_CONSOLE_ONLY); EnableWindow(hPollConsoleOnly, enabled); HWND hPollOnEventOnly = GetDlgItem(hwnd, IDC_ONEVENT_ONLY); EnableWindow(hPollOnEventOnly, enabled); } return TRUE; case IDC_AUTO_DISPLAY_NO: // User has toggled the Auto Port Select feature. // If this is in use, then we don't allow the Display number field // to be modified! { // Get the auto select button HWND hPortNoAuto = GetDlgItem(hwnd, IDC_AUTO_DISPLAY_NO); // Should the portno field be modifiable? BOOL enable = SendMessage(hPortNoAuto, BM_GETCHECK, 0, 0) != BST_CHECKED; // Set the state HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO); EnableWindow(hPortNo, enable); } return TRUE; } break; } return 0; }
void IncomingConnectionsControls::Apply() { // Save the password if one was entered BOOL isShort = SetPasswordSettings(IDC_PASSWORD); // Save the password (view only) if one was entered BOOL isShortViewOnly = SetPasswordSettings(IDC_PASSWORD_VIEWONLY); // Warn about passwords longer than eight characters if (!isShort || !isShortViewOnly) { MessageBox(NULL, "WARNING: You have entered passwords of length exceeding\n" "eight characters, but the standard VNC authentication scheme\n" "does not support such long passwords.\n\n" "Your passwords will be truncated to just eight characters.", szAppName, MB_ICONEXCLAMATION | MB_OK); } // Save the new settings to the server m_server->SetAutoPortSelect(IsChecked(IDC_PORTNO_AUTO)); // Save port numbers if we're not auto selecting if (!m_server->AutoPortSelect()) { if (IsChecked(IDC_SPECDISPLAY)) { // Display number was specified BOOL ok; UINT display = GetDlgItemInt(m_hwnd, IDC_DISPLAYNO, &ok, TRUE); if (ok) m_server->SetPorts(DISPLAY_TO_PORT(display), DISPLAY_TO_HPORT(display)); } else { // Assuming that port numbers were specified BOOL ok1, ok2; UINT port_rfb = GetDlgItemInt(m_hwnd, IDC_PORTRFB, &ok1, TRUE); UINT port_http = GetDlgItemInt(m_hwnd, IDC_PORTHTTP, &ok2, TRUE); if (port_rfb != port_http) { if (ok1 && ok2) m_server->SetPorts(port_rfb, port_http); } else { MessageBox(NULL, "WARNING: You have entered equal RFB and HTTP port numbers.\n\n" "Your changes to port numbers will not be saved.", szAppName, MB_ICONEXCLAMATION | MB_OK); } } } m_server->SockConnect(IsChecked(IDC_CONNECT_SOCK)); // Wallpaper handling m_server->EnableRemoveWallpaper(IsChecked(IDC_REMOVE_WALLPAPER)); m_server->SetBlankScreen(IsChecked(IDC_BLANK_SCREEN)); // Enabling/disabling file transfers m_server->EnableFileTransfers(IsChecked(IDC_ENABLE_FILE_TRANSFERS)); // Enabling/disabling Meta Window Manager m_server->EnableMetaWindowManager(IsChecked(IDC_ENABLE_METAWM)); Validate(TRUE); }
// Socket connection handling BOOL vncServer::SockConnect(BOOL On) { // Are we being asked to switch socket connects on or off? if (On) { // Is there a listening socket? if (m_socketConn == NULL) { m_socketConn = new vncSockConnect(); if (m_socketConn == NULL) return FALSE; // Are we to use automatic port selection? if (m_autoportselect) { BOOL ok = FALSE; // Yes, so cycle through the ports, looking for a free one! for (int i = 0; i < 99; i++) { m_port = DISPLAY_TO_PORT(i); m_port_http = DISPLAY_TO_HPORT(i); vnclog.Print(LL_CLIENTS, VNCLOG("trying port number %d\n"), m_port); // Attempt to connect to the port VSocket tempsock; if (tempsock.Create()) { if (!tempsock.Connect("localhost", m_port)) { // Couldn't connect, so this port is probably usable! if (m_socketConn->Init(this, m_port)) { ok = TRUE; break; } } } } if (!ok) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } else { // No autoportselect if (!m_socketConn->Init(this, m_port)) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } // Now let's start the HTTP connection stuff if (m_port_http == m_port) { vnclog.Print(LL_INTERR, VNCLOG("cannot start both RFB and HTTP servers " "on the same port\n")); } if (m_httpConn == NULL && m_httpd_enabled && m_port_http != m_port) { m_httpConn = new vncHTTPConnect; if (m_httpConn != NULL) { // Start up the HTTP server if (!m_httpConn->Init(this, m_port_http, m_httpd_params_enabled)) { delete m_httpConn; m_httpConn = NULL; return FALSE; } } } } } else { // *** JNW - Trying to fix up a lock-up when the listening socket closes #ifndef HORIZONLIVE KillAuthClients(); KillUnauthClients(); WaitUntilAuthEmpty(); WaitUntilUnauthEmpty(); #endif // Is there a listening socket? if (m_socketConn != NULL) { // Close the socket delete m_socketConn; m_socketConn = NULL; } // Is there an HTTP socket active? if (m_httpConn != NULL) { // Close the socket delete m_httpConn; m_httpConn = NULL; } } return TRUE; }