vncServer.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:20k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. //  Copyright (C) 1997, 1998 Olivetti & Oracle Research Laboratory
  2. //
  3. //  This file is part of the VNC system.
  4. //
  5. //  The VNC system is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  18. //  USA.
  19. //
  20. // If the source code for the VNC system is not available from the place 
  21. // whence you received this file, check http://www.orl.co.uk/vnc or contact
  22. // the authors on vnc@orl.co.uk for information on obtaining it.
  23. // vncServer.cpp
  24. // vncServer class implementation
  25. // Includes
  26. #include "stdhdrs.h"
  27. #include <omnithread.h>
  28. #include <string.h>
  29. #include <lmcons.h>
  30. // Custom
  31. #include "WinVNC.h"
  32. #include "vncServer.h"
  33. #include "vncSockConnect.h"
  34. #include "vncCorbaConnect.h"
  35. #include "vncClient.h"
  36. #include "vncService.h"
  37. // Constructor/destructor
  38. vncServer::vncServer()
  39. {
  40. // Initialise some important stuffs...
  41. m_socketConn = NULL;
  42. m_corbaConn = NULL;
  43. m_httpConn = NULL;
  44. m_desktop = NULL;
  45. m_name = NULL;
  46. m_port = DISPLAY_TO_PORT(0);
  47. m_autoportselect = TRUE;
  48. m_passwd_required = TRUE;
  49. {
  50.     vncPasswd::FromClear clearPWD;
  51.     memcpy(m_password, clearPWD, MAXPWLEN);
  52. }
  53. // Autolock settings
  54. m_lock_on_exit = 0;
  55. // Set the polling mode options
  56. m_poll_fullscreen = FALSE;
  57. m_poll_foreground = FALSE;
  58. m_poll_undercursor = TRUE;
  59. m_poll_oneventonly = FALSE;
  60. m_poll_consoleonly = TRUE;
  61. // General options
  62. m_loopback_allowed = FALSE;
  63. m_lock_on_exit = 0;
  64. m_connect_pri = 0;
  65. // Set the remote input options
  66. m_enable_inputs = TRUE;
  67. // Clear the client mapping table
  68. for (int x=0; x<MAX_CLIENTS; x++)
  69. m_clientmap[x] = NULL;
  70. m_nextid = 0;
  71. // Signal set when a client quits
  72. m_clientquitsig = new omni_condition(&m_clientsLock);
  73. }
  74. vncServer::~vncServer()
  75. {
  76. log.Print(LL_STATE, VNCLOG("shutting down server objectn"));
  77. // If there is a socket_conn object then delete it
  78. if (m_socketConn != NULL)
  79. {
  80. delete m_socketConn;
  81. m_socketConn = NULL;
  82. }
  83. if (m_corbaConn != NULL)
  84. {
  85. delete m_corbaConn;
  86. m_corbaConn = NULL;
  87. }
  88. if (m_httpConn != NULL)
  89. {
  90. delete m_httpConn;
  91. m_httpConn = NULL;
  92. }
  93. // Remove any active clients!
  94. KillAll();
  95. // Wait for all the clients to die
  96. WaitUntilAuthEmpty();
  97. // Don't free the desktop until no KillClient is likely to free it
  98. { omni_mutex_lock l(m_desktopLock);
  99. if (m_desktop != NULL)
  100. {
  101. delete m_desktop;
  102. m_desktop = NULL;
  103. }
  104. }
  105. if (m_name != NULL)
  106. {
  107. free(m_name);
  108. m_name = NULL;
  109. }
  110. if (m_clientquitsig != NULL)
  111. {
  112. delete m_clientquitsig;
  113. m_clientquitsig = NULL;
  114. }
  115. }
  116. // Client handling functions
  117. vncClientId
  118. vncServer::AddClient(VSocket *socket, BOOL auth)
  119. {
  120. return AddClient(socket, auth, FALSE, 0, TRUE, TRUE); 
  121. }
  122. vncClientId
  123. vncServer::AddClient(VSocket *socket, BOOL auth,
  124.  BOOL teleport, int capability,
  125.  BOOL keysenabled, BOOL ptrenabled)
  126. {
  127. vncClient *client;
  128. omni_mutex_lock l(m_clientsLock);
  129. // Try to allocate a client id...
  130. vncClientId clientid = m_nextid;
  131. do
  132. {
  133. clientid = (clientid+1) % MAX_CLIENTS;
  134. if (clientid == m_nextid)
  135. {
  136. return -1;
  137. }
  138. }
  139. while (m_clientmap[clientid] != NULL);
  140. // Create a new client and add it to the relevant client list
  141. client = new vncClient();
  142. if (client == NULL)
  143. return -1;
  144. if (!client->Init(this, socket, auth, clientid))
  145. {
  146. // The client will delete the socket for us...
  147. log.Print(LL_CONNERR, VNCLOG("failed to initialise client objectn"));
  148. delete client;
  149. return -1;
  150. }
  151. // Set the client's settings
  152. client->SetTeleport(teleport);
  153. client->SetCapability(capability);
  154. client->EnableKeyboard(keysenabled && m_enable_inputs);
  155. client->EnablePointer(ptrenabled && m_enable_inputs);
  156. m_clientmap[clientid] = client;
  157. // Add the client to unauth the client list
  158. m_unauthClients.push_back(clientid);
  159. // Notify anyone interested about this event
  160. DoNotify(WM_SRV_CLIENT_CONNECT, 0, 0);
  161. log.Print(LL_INTINFO, VNCLOG("AddClient() donen"));
  162. return clientid;
  163. }
  164. BOOL
  165. vncServer::Authenticated(vncClientId clientid)
  166. {
  167. vncClientList::iterator i;
  168. BOOL authok = TRUE;
  169. omni_mutex_lock l1(m_desktopLock);
  170. omni_mutex_lock l2(m_clientsLock);
  171. // Search the unauthenticated client list
  172. for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
  173. {
  174. // Is this the right client?
  175. if ((*i) == clientid)
  176. {
  177. vncClient *client = GetClient(clientid);
  178. // Yes, so remove the client and add it to the auth list
  179. m_unauthClients.erase(i);
  180. // Create the screen handler if necessary
  181. if (m_desktop == NULL)
  182. {
  183. m_desktop = new vncDesktop();
  184. if (m_desktop == NULL)
  185. {
  186. client->Kill();
  187. authok = FALSE;
  188. break;
  189. }
  190. if (!m_desktop->Init(this))
  191. {
  192. client->Kill();
  193. authok = FALSE;
  194. delete m_desktop;
  195. m_desktop = NULL;
  196. break;
  197. }
  198. }
  199. // Create a buffer object for this client
  200. vncBuffer *buffer = new vncBuffer(m_desktop);
  201. if (buffer == NULL)
  202. {
  203. client->Kill();
  204. authok = FALSE;
  205. break;
  206. }
  207. // Tell the client about this new buffer
  208. client->SetBuffer(buffer);
  209. // Add the client to the auth list
  210. m_authClients.push_back(clientid);
  211. break;
  212. }
  213. }
  214. // Notify anyone interested of this event
  215. DoNotify(WM_SRV_CLIENT_AUTHENTICATED, 0, 0);
  216. log.Print(LL_INTINFO, VNCLOG("Authenticated() donen"));
  217. return authok;
  218. }
  219. void
  220. vncServer::KillClient(vncClientId clientid)
  221. {
  222. vncClientList::iterator i;
  223. BOOL done = FALSE;
  224. omni_mutex_lock l(m_clientsLock);
  225. // Find the client in one of the two lists
  226. for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
  227. {
  228. // Is this the right client?
  229. if ((*i) == clientid)
  230. {
  231. log.Print(LL_INTINFO, VNCLOG("killing unauth clientn"));
  232. // Ask the client to die
  233. vncClient *client = GetClient(clientid);
  234. client->Kill();
  235. done = TRUE;
  236. break;
  237. }
  238. }
  239. if (!done)
  240. {
  241. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  242. {
  243. // Is this the right client?
  244. if ((*i) == clientid)
  245. {
  246. log.Print(LL_INTINFO, VNCLOG("killing auth clientn"));
  247. // Yes, so kill it
  248. vncClient *client = GetClient(clientid);
  249. client->Kill();
  250. done = TRUE;
  251. break;
  252. }
  253. }
  254. }
  255. log.Print(LL_INTINFO, VNCLOG("KillClient() donen"));
  256. }
  257. void
  258. vncServer::KillAll()
  259. {
  260. vncClientList::iterator i;
  261. omni_mutex_lock l(m_clientsLock);
  262. // Tell all the authorised clients to die!
  263. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  264. {
  265. log.Print(LL_INTINFO, VNCLOG("killing auth clientn"));
  266. // Kill the client
  267. GetClient(*i)->Kill();
  268. }
  269. log.Print(LL_INTINFO, VNCLOG("KillAll() donen"));
  270. }
  271. UINT
  272. vncServer::AuthClientCount()
  273. {
  274. omni_mutex_lock l(m_clientsLock);
  275. return m_authClients.size();
  276. }
  277. UINT
  278. vncServer::UnauthClientCount()
  279. {
  280. omni_mutex_lock l(m_clientsLock);
  281. return m_unauthClients.size();
  282. }
  283. void
  284. vncServer::WaitUntilAuthEmpty()
  285. {
  286. omni_mutex_lock l(m_clientsLock);
  287. // Wait for all the clients to exit
  288. while (!m_authClients.empty())
  289. {
  290. // Wait for a client to quit
  291. m_clientquitsig->wait();
  292. }
  293. }
  294. // Client info retrieval/setup
  295. vncClient*
  296. vncServer::GetClient(vncClientId clientid)
  297. {
  298. if ((clientid >= 0) && (clientid < MAX_CLIENTS))
  299. return m_clientmap[clientid];
  300. return NULL;
  301. }
  302. vncClientList
  303. vncServer::ClientList()
  304. {
  305. vncClientList clients;
  306. omni_mutex_lock l(m_clientsLock);
  307. clients = m_authClients;
  308. return clients;
  309. }
  310. void
  311. vncServer::SetTeleport(vncClientId clientid, BOOL teleport)
  312. {
  313. omni_mutex_lock l(m_clientsLock);
  314. vncClient *client = GetClient(clientid);
  315. if (client != NULL)
  316. client->SetTeleport(teleport);
  317. }
  318. void
  319. vncServer::SetCapability(vncClientId clientid, int capability)
  320. {
  321. omni_mutex_lock l(m_clientsLock);
  322. vncClient *client = GetClient(clientid);
  323. if (client != NULL)
  324. client->SetCapability(capability);
  325. }
  326. void
  327. vncServer::SetKeyboardEnabled(vncClientId clientid, BOOL enabled)
  328. {
  329. omni_mutex_lock l(m_clientsLock);
  330. vncClient *client = GetClient(clientid);
  331. if (client != NULL)
  332. client->EnableKeyboard(enabled);
  333. }
  334. void
  335. vncServer::SetPointerEnabled(vncClientId clientid, BOOL enabled)
  336. {
  337. omni_mutex_lock l(m_clientsLock);
  338. vncClient *client = GetClient(clientid);
  339. if (client != NULL)
  340. client->EnablePointer(enabled);
  341. }
  342. BOOL
  343. vncServer::IsTeleport(vncClientId clientid)
  344. {
  345. omni_mutex_lock l(m_clientsLock);
  346. vncClient *client = GetClient(clientid);
  347. if (client != NULL)
  348. return client->IsTeleport();
  349. return FALSE;
  350. }
  351. int
  352. vncServer::GetCapability(vncClientId clientid)
  353. {
  354. omni_mutex_lock l(m_clientsLock);
  355. vncClient *client = GetClient(clientid);
  356. if (client != NULL)
  357. return client->GetCapability();
  358. return 0;
  359. }
  360. BOOL
  361. vncServer::GetKeyboardEnabled(vncClientId clientid)
  362. {
  363. omni_mutex_lock l(m_clientsLock);
  364. vncClient *client = GetClient(clientid);
  365. if (client != NULL)
  366. return client->IsKeyboardEnabled();
  367. return FALSE;
  368. }
  369. BOOL
  370. vncServer::GetPointerEnabled(vncClientId clientid)
  371. {
  372. omni_mutex_lock l(m_clientsLock);
  373. vncClient *client = GetClient(clientid);
  374. if (client != NULL)
  375. return client->IsPointerEnabled();
  376. return FALSE;
  377. }
  378. char*
  379. vncServer::GetClientName(vncClientId clientid)
  380. {
  381. omni_mutex_lock l(m_clientsLock);
  382. vncClient *client = GetClient(clientid);
  383. if (client != NULL)
  384. return client->GetClientName();
  385. return NULL;
  386. }
  387. // RemoveClient should ONLY EVER be used by the client to remove itself.
  388. void
  389. vncServer::RemoveClient(vncClientId clientid)
  390. {
  391. vncClientList::iterator i;
  392. BOOL done = FALSE;
  393. omni_mutex_lock l1(m_desktopLock);
  394. { omni_mutex_lock l2(m_clientsLock);
  395. // Find the client in one of the two lists
  396. for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
  397. {
  398. // Is this the right client?
  399. if ((*i) == clientid)
  400. {
  401. log.Print(LL_INTINFO, VNCLOG("removing unauthorised clientn"));
  402. // Yes, so remove the client and kill it
  403. m_unauthClients.erase(i);
  404. m_clientmap[clientid] = NULL;
  405. done = TRUE;
  406. break;
  407. }
  408. }
  409. if (!done)
  410. {
  411. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  412. {
  413. // Is this the right client?
  414. if ((*i) == clientid)
  415. {
  416. log.Print(LL_INTINFO, VNCLOG("removing authorised clientn"));
  417. // Yes, so remove the client and kill it
  418. m_authClients.erase(i);
  419. m_clientmap[clientid] = NULL;
  420. done = TRUE;
  421. break;
  422. }
  423. }
  424. }
  425. // Signal that a client has quit
  426. m_clientquitsig->signal();
  427. } // Unlock the clientLock
  428. // Are there any authorised clients connected?
  429. if (m_authClients.empty() && (m_desktop != NULL))
  430. {
  431. log.Print(LL_STATE, VNCLOG("deleting desktop servern"));
  432. // Are there locksettings set?
  433. if (LockSettings() == 1)
  434. {
  435.     // Yes - lock the machine on disconnect!
  436.     // *** This code actually just starts the screen-saver.
  437.     // So if you want to lock the machine on disconnect, choose
  438.     // a locked screen-saver.
  439.     MessageBeep(MB_OK);
  440.     DefWindowProc(0, WM_SYSCOMMAND, 0xfff0 & SC_SCREENSAVE, 0);
  441.     // *** LockWorkstation only exists in NT 5 and above, so this code doesn't actually
  442.     // work..  For this reason, no mention is made of the locking settings at present in the docs!
  443. /*
  444.     if (!LockWorkStation())
  445. log.Print(LL_CONNERR, VNCLOG("client disconnect - failed to lock workstation!n"));
  446. */
  447. } else if (LockSettings() > 1)
  448. {
  449.     char username[UNLEN+1];
  450.     vncService::CurrentUser((char *)&username, sizeof(username));
  451.     if (strcmp(username, "") != 0)
  452.     {
  453. // Yes - force a user logoff on disconnect!
  454. if (!ExitWindows(EWX_LOGOFF | EWX_FORCE, 0))
  455.     log.Print(LL_CONNERR, VNCLOG("client disconnect - failed to logoff user!n"));
  456.     }
  457. }
  458. // Delete the screen server
  459. delete m_desktop;
  460. m_desktop = NULL;
  461. }
  462. // Notify anyone interested of the change
  463. DoNotify(WM_SRV_CLIENT_DISCONNECT, 0, 0);
  464. log.Print(LL_INTINFO, VNCLOG("RemoveClient() donen"));
  465. }
  466. // NOTIFICATION HANDLING!
  467. // Connect/disconnect notification
  468. BOOL
  469. vncServer::AddNotify(HWND hwnd)
  470. {
  471. omni_mutex_lock l(m_clientsLock);
  472. // Add the window handle to the list
  473. m_notifyList.push_front(hwnd);
  474. return TRUE;
  475. }
  476. BOOL
  477. vncServer::RemNotify(HWND hwnd)
  478. {
  479. omni_mutex_lock l(m_clientsLock);
  480. // Remove the window handle from the list
  481. vncNotifyList::iterator i;
  482. for (i=m_notifyList.begin(); i!=m_notifyList.end(); i++)
  483. {
  484. if ((*i) == hwnd)
  485. {
  486. // Found the handle, so remove it
  487. m_notifyList.erase(i);
  488. return TRUE;
  489. }
  490. }
  491. return FALSE;
  492. }
  493. // Send a notification message
  494. void
  495. vncServer::DoNotify(UINT message, WPARAM wparam, LPARAM lparam)
  496. {
  497. omni_mutex_lock l(m_clientsLock);
  498. // Send the given message to all the notification windows
  499. vncNotifyList::iterator i;
  500. for (i=m_notifyList.begin(); i!=m_notifyList.end(); i++)
  501. {
  502. PostMessage((*i), message, wparam, lparam);
  503. }
  504. }
  505. // Client->Desktop update signalling
  506. void
  507. vncServer::RequestUpdate()
  508. {
  509. omni_mutex_lock l(m_desktopLock);
  510. if (m_desktop != NULL)
  511. {
  512. m_desktop->RequestUpdate();
  513. }
  514. }
  515. // Update handling
  516. void
  517. vncServer::TriggerUpdate()
  518. {
  519. vncClientList::iterator i;
  520. omni_mutex_lock l(m_clientsLock);
  521. // Post this update to all the connected clients
  522. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  523. {
  524. // Post the update
  525. GetClient(*i)->TriggerUpdate();
  526. }
  527. }
  528. void
  529. vncServer::UpdateRect(RECT &rect)
  530. {
  531. vncClientList::iterator i;
  532. omni_mutex_lock l(m_clientsLock);
  533. // Post this update to all the connected clients
  534. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  535. {
  536. // Post the update
  537. GetClient(*i)->UpdateRect(rect);
  538. }
  539. }
  540. void
  541. vncServer::UpdateRegion(vncRegion &region)
  542. {
  543. vncClientList::iterator i;
  544. omni_mutex_lock l(m_clientsLock);
  545. // Post this update to all the connected clients
  546. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  547. {
  548. // Post the update
  549. GetClient(*i)->UpdateRegion(region);
  550. }
  551. }
  552. void
  553. vncServer::CopyRect(RECT &dest, POINT &source)
  554. {
  555. vncClientList::iterator i;
  556. omni_mutex_lock l(m_clientsLock);
  557. // Post this update to all the connected clients
  558. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  559. {
  560. // Post the update
  561. GetClient(*i)->CopyRect(dest, source);
  562. }
  563. }
  564. void
  565. vncServer::UpdateMouse()
  566. {
  567. vncClientList::iterator i;
  568. omni_mutex_lock l(m_clientsLock);
  569. // Post this mouse update to all the connected clients
  570. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  571. {
  572. // Post the update
  573. GetClient(*i)->UpdateMouse();
  574. }
  575. }
  576. void
  577. vncServer::UpdateClipText(LPSTR text)
  578. {
  579. vncClientList::iterator i;
  580. omni_mutex_lock l(m_clientsLock);
  581. // Post this update to all the connected clients
  582. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  583. {
  584. // Post the update
  585. GetClient(*i)->UpdateClipText(text);
  586. }
  587. }
  588. void
  589. vncServer::UpdatePalette()
  590. {
  591. vncClientList::iterator i;
  592. omni_mutex_lock l(m_clientsLock);
  593. // Post this update to all the connected clients
  594. for (i = m_authClients.begin(); i != m_authClients.end(); i++)
  595. {
  596. // Post the update
  597. GetClient(*i)->UpdatePalette();
  598. }
  599. }
  600. void
  601. vncServer::UpdateLocalClipText(LPSTR text)
  602. {
  603. omni_mutex_lock l(m_desktopLock);
  604. if (m_desktop != NULL)
  605. m_desktop->SetClipText(text);
  606. }
  607. // Name and port number handling
  608. void
  609. vncServer::SetName(const char * name)
  610. {
  611. // Set the name of the desktop
  612. if (m_name != NULL)
  613. {
  614. free(m_name);
  615. m_name = NULL;
  616. }
  617. m_name = strdup(name);
  618. }
  619. void
  620. vncServer::SetPort(const UINT port)
  621. {
  622.     if (m_port != port)
  623.     {
  624. /////////////////////////////////
  625. // Adjust the listen socket
  626. // Set the port number to use
  627. m_port = port;
  628. // If there is already a listening socket then close and re-open it...
  629. BOOL socketon = SockConnected();
  630. SockConnect(FALSE);
  631. if (socketon)
  632.     SockConnect(TRUE);
  633.     }
  634. }
  635. UINT
  636. vncServer::GetPort()
  637. {
  638. return m_port;
  639. }
  640. void
  641. vncServer::SetPassword(const char *passwd)
  642. {
  643. memcpy(m_password, passwd, MAXPWLEN);
  644. }
  645. void
  646. vncServer::GetPassword(char *passwd)
  647. {
  648. memcpy(passwd, m_password, MAXPWLEN);
  649. }
  650. // Remote input handling
  651. void
  652. vncServer::EnableInputs(BOOL enable)
  653. {
  654. m_enable_inputs = enable;
  655. }
  656. BOOL vncServer::InputsEnabled()
  657. {
  658. return m_enable_inputs;
  659. }
  660. // Socket connection handling
  661. BOOL
  662. vncServer::SockConnect(BOOL On)
  663. {
  664. // Are we being asked to switch socket connects on or off?
  665. if (On)
  666. {
  667. // Is there a listening socket?
  668. if (m_socketConn == NULL)
  669. {
  670. m_socketConn = new vncSockConnect();
  671. if (m_socketConn == NULL)
  672. return FALSE;
  673. // Are we to use automatic port selection?
  674. if (m_autoportselect)
  675. {
  676. BOOL ok = FALSE;
  677. // Yes, so cycle through the ports, looking for a free one!
  678. for (int i=0; i < 99; i++)
  679. {
  680. m_port = DISPLAY_TO_PORT(i);
  681. log.Print(LL_CLIENTS, VNCLOG("trying port number %dn"), m_port);
  682. // Attempt to connect to the port
  683. VSocket tempsock;
  684. if (tempsock.Create())
  685. {
  686. if (!tempsock.Connect("localhost", m_port))
  687. {
  688. // Couldn't connect, so this port is probably usable!
  689. if (m_socketConn->Init(this, m_port))
  690. {
  691. ok = TRUE;
  692. break;
  693. }
  694. }
  695. }
  696. }
  697. if (!ok)
  698. {
  699. delete m_socketConn;
  700. m_socketConn = NULL;
  701. return FALSE;
  702. }
  703. } else
  704. {
  705. // No autoportselect
  706. if (!m_socketConn->Init(this, m_port))
  707. {
  708. delete m_socketConn;
  709. m_socketConn = NULL;
  710. return FALSE;
  711. }
  712. }
  713. // Now let's start the HTTP connection stuff
  714. if (m_httpConn == NULL)
  715. {
  716. m_httpConn = new vncHTTPConnect;
  717. if (m_httpConn != NULL)
  718. {
  719. // Start up the HTTP server
  720. if (!m_httpConn->Init(this,
  721.     PORT_TO_DISPLAY(m_port) + HTTP_PORT_OFFSET))
  722. {
  723. delete m_httpConn;
  724. m_httpConn = NULL;
  725. return FALSE;
  726. }
  727. }
  728. }
  729. }
  730. }
  731. else
  732. {
  733. // *** JNW - Trying to fix up a lock-up when the listening socket closes
  734. KillAll();
  735. WaitUntilAuthEmpty();
  736. // Is there a listening socket?
  737. if (m_socketConn != NULL)
  738. {
  739. // Close the socket
  740. delete m_socketConn;
  741. m_socketConn = NULL;
  742. }
  743. // Is there an HTTP socket active?
  744. if (m_httpConn != NULL)
  745. {
  746. // Close the socket
  747. delete m_httpConn;
  748. m_httpConn = NULL;
  749. }
  750. }
  751. return TRUE;
  752. }
  753. BOOL
  754. vncServer::SockConnected()
  755. {
  756. return m_socketConn != NULL;
  757. }
  758. // CORBA connection handling
  759. BOOL
  760. vncServer::CORBAConnect(BOOL On)
  761. {
  762. // Are we being asked to switch CORBA connects on or off?
  763. if (On)
  764. {
  765. // Is there a CORBA object?
  766. if (m_corbaConn == NULL)
  767. {
  768. m_corbaConn = new vncCorbaConnect();
  769. }
  770. if (m_corbaConn == NULL)
  771. return FALSE;
  772. if (!m_corbaConn->Init(this))
  773. {
  774. delete m_corbaConn;
  775. m_corbaConn = NULL;
  776. return FALSE;
  777. }
  778. }
  779. else
  780. {
  781. // Is there a listening socket?
  782. if (m_corbaConn != NULL)
  783. {
  784. // Close the socket
  785. delete m_corbaConn;
  786. m_corbaConn = NULL;
  787. }
  788. }
  789. return TRUE;
  790. }
  791. BOOL
  792. vncServer::CORBAConnected()
  793. {
  794. return m_corbaConn != NULL;
  795. }
  796. void
  797. vncServer::GetScreenInfo(int &width, int &height, int &depth)
  798. {
  799. rfbServerInitMsg scrinfo;
  800. omni_mutex_lock l(m_desktopLock);
  801. log.Print(LL_INTINFO, VNCLOG("GetScreenInfo calledn"));
  802. // Is a desktop object currently active?
  803. if (m_desktop == NULL)
  804. {
  805. vncDesktop desktop;
  806. // No, so create a dummy desktop and interrogate it
  807. if (!desktop.Init(this))
  808. {
  809. scrinfo.framebufferWidth = 0;
  810. scrinfo.framebufferHeight = 0;
  811. scrinfo.format.bitsPerPixel = 0;
  812. }
  813. else
  814. {
  815. desktop.FillDisplayInfo(&scrinfo);
  816. }
  817. }
  818. else
  819. {
  820. m_desktop->FillDisplayInfo(&scrinfo);
  821. }
  822. // Get the info from the scrinfo structure
  823. width = scrinfo.framebufferWidth;
  824. height = scrinfo.framebufferHeight;
  825. depth = scrinfo.format.bitsPerPixel;
  826. }