vncProperties.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. // vncProperties.cpp
  24. // Implementation of the Properties dialog!
  25. #include "stdhdrs.h"
  26. #include "lmcons.h"
  27. #include "vncService.h"
  28. #include "WinVNC.h"
  29. #include "vncProperties.h"
  30. #include "vncServer.h"
  31. #include "vncPasswd.h"
  32. const char WINVNC_REGISTRY_KEY [] = "Software\ORL\WinVNC3";
  33. const char NO_PASSWORD_WARN [] = "WARNING : Running WinVNC without setting a password is "
  34. "a dangerous security risk!n"
  35. "Until you set a password, WinVNC will not accept incoming connections.";
  36. const char NO_OVERRIDE_ERR [] = "This machine has been preconfigured with WinVNC settings, "
  37. "which cannot be overridden by individual users.  "
  38. "The preconfigured settings may be modified only by a System Administrator.";
  39. // Constructor & Destructor
  40. vncProperties::vncProperties()
  41. {
  42. m_allowproperties = TRUE;
  43. m_allowshutdown = TRUE;
  44. m_dlgvisible = FALSE;
  45. }
  46. vncProperties::~vncProperties()
  47. {
  48. }
  49. // Initialisation
  50. BOOL
  51. vncProperties::Init(vncServer *server)
  52. {
  53. // Save the server pointer
  54. m_server = server;
  55. // Load the settings from the registry
  56. Load();
  57. // If the password is empty then always show a dialog
  58. char passwd[MAXPWLEN];
  59. m_server->GetPassword(passwd);
  60. {
  61.     vncPasswd::ToText plain(passwd);
  62.     if (strlen(plain) == 0)
  63. Show(m_server->AuthRequired());
  64. }
  65. return TRUE;
  66. }
  67. // Dialog box handling functions
  68. void
  69. vncProperties::Show(BOOL show)
  70. {
  71. if (show)
  72. {
  73. if (!m_allowproperties)
  74. {
  75. // If the user isn't allowed to override the settings then tell them
  76. MessageBox(NULL, NO_OVERRIDE_ERR, "WinVNC Error", MB_OK | MB_ICONEXCLAMATION);
  77. return;
  78. }
  79. if (!m_dlgvisible)
  80. {
  81. log.Print(LL_INTINFO, VNCLOG("show Propertiesn"));
  82. for (;;)
  83. {
  84. m_returncode_valid = FALSE;
  85. // Do the dialog box
  86. int result = DialogBoxParam(hAppInstance,
  87.     MAKEINTRESOURCE(IDD_PROPERTIES), 
  88.     NULL,
  89.     (DLGPROC) DialogProc,
  90.     (LONG) this);
  91. if (!m_returncode_valid)
  92.     result = IDCANCEL;
  93. log.Print(LL_INTINFO, VNCLOG("dialog result = %dn"), result);
  94. if (result == -1)
  95. {
  96. // Dialog box failed, so quit
  97. PostQuitMessage(0);
  98. return;
  99. }
  100. // We're allowed to exit if the password is not empty
  101. char passwd[MAXPWLEN];
  102. m_server->GetPassword(passwd);
  103. {
  104.     vncPasswd::ToText plain(passwd);
  105.     if ((strlen(plain) != 0) || !m_server->AuthRequired())
  106. return;
  107. }
  108. log.Print(LL_INTERR, VNCLOG("warning - empty passwordn"));
  109. // The password is empty, so if OK was used then redisplay the box,
  110. // otherwise, if CANCEL was used, close down WinVNC
  111. if (result == IDCANCEL)
  112. {
  113.     log.Print(LL_INTERR, VNCLOG("no password - QUITTINGn"));
  114.     PostQuitMessage(0);
  115.     return;
  116. }
  117. // If we reached here then OK was used & there is no password!
  118. int result2 = MessageBox(NULL, NO_PASSWORD_WARN,
  119.     "WinVNC Warning", MB_OK | MB_ICONEXCLAMATION);
  120. omni_thread::sleep(4);
  121. }
  122. }
  123. }
  124. }
  125. BOOL CALLBACK
  126. vncProperties::DialogProc(HWND hwnd,
  127.   UINT uMsg,
  128.   WPARAM wParam,
  129.   LPARAM lParam )
  130. {
  131. // We use the dialog-box's USERDATA to store a _this pointer
  132. // This is set only once WM_INITDIALOG has been recieved, though!
  133. vncProperties *_this = (vncProperties *) GetWindowLong(hwnd, GWL_USERDATA);
  134. switch (uMsg)
  135. {
  136. case WM_INITDIALOG:
  137. {
  138. // Retrieve the Dialog box parameter and use it as a pointer
  139. // to the calling vncProperties object
  140. SetWindowLong(hwnd, GWL_USERDATA, lParam);
  141. _this = (vncProperties *) lParam;
  142. // Initialise the properties controls
  143. HWND hConnectSock = GetDlgItem(hwnd, IDC_CONNECT_SOCK);
  144. SendMessage(hConnectSock,
  145. BM_SETCHECK,
  146. _this->m_server->SockConnected(),
  147. 0);
  148. HWND hConnectCorba = GetDlgItem(hwnd, IDC_CONNECT_CORBA);
  149. SendMessage(hConnectCorba,
  150. BM_SETCHECK,
  151. _this->m_server->CORBAConnected(),
  152. 0);
  153. #if(defined(_CORBA))
  154. EnableWindow(hConnectCorba, TRUE);
  155. #else
  156. EnableWindow(hConnectCorba, FALSE);
  157. #endif
  158. HWND hPortNoAuto = GetDlgItem(hwnd, IDC_PORTNO_AUTO);
  159. SendMessage(hPortNoAuto,
  160. BM_SETCHECK,
  161. _this->m_server->AutoPortSelect(),
  162. 0);
  163. EnableWindow(hPortNoAuto, _this->m_server->SockConnected());
  164. HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO);
  165. SetDlgItemInt(hwnd, IDC_PORTNO, PORT_TO_DISPLAY(_this->m_server->GetPort()), FALSE);
  166. EnableWindow(hPortNo, _this->m_server->SockConnected()
  167. && !_this->m_server->AutoPortSelect());
  168. HWND hPassword = GetDlgItem(hwnd, IDC_PASSWORD);
  169. EnableWindow(hPassword, _this->m_server->SockConnected());
  170. // Get the password
  171. char passwd[MAXPWLEN];
  172. _this->m_server->GetPassword(passwd);
  173. {
  174.     vncPasswd::ToText plain(passwd);
  175.     SetDlgItemText(hwnd, IDC_PASSWORD, (const char *) plain);
  176. }
  177. // Remote input settings
  178. HWND hEnableInputs = GetDlgItem(hwnd, IDC_DISABLE_INPUTS);
  179. SendMessage(hEnableInputs,
  180. BM_SETCHECK,
  181. !(_this->m_server->InputsEnabled()),
  182. 0);
  183. // Set the polling options
  184. HWND hPollFullScreen = GetDlgItem(hwnd, IDC_POLL_FULLSCREEN);
  185. SendMessage(hPollFullScreen,
  186. BM_SETCHECK,
  187. _this->m_server->PollFullScreen(),
  188. 0);
  189. HWND hPollForeground = GetDlgItem(hwnd, IDC_POLL_FOREGROUND);
  190. SendMessage(hPollForeground,
  191. BM_SETCHECK,
  192. _this->m_server->PollForeground(),
  193. 0);
  194. HWND hPollUnderCursor = GetDlgItem(hwnd, IDC_POLL_UNDER_CURSOR);
  195. SendMessage(hPollUnderCursor,
  196. BM_SETCHECK,
  197. _this->m_server->PollUnderCursor(),
  198. 0);
  199. HWND hPollConsoleOnly = GetDlgItem(hwnd, IDC_CONSOLE_ONLY);
  200. SendMessage(hPollConsoleOnly,
  201. BM_SETCHECK,
  202. _this->m_server->PollConsoleOnly(),
  203. 0);
  204. EnableWindow(hPollConsoleOnly,
  205. _this->m_server->PollUnderCursor() || _this->m_server->PollForeground()
  206. );
  207. HWND hPollOnEventOnly = GetDlgItem(hwnd, IDC_ONEVENT_ONLY);
  208. SendMessage(hPollOnEventOnly,
  209. BM_SETCHECK,
  210. _this->m_server->PollOnEventOnly(),
  211. 0);
  212. EnableWindow(hPollOnEventOnly,
  213. _this->m_server->PollUnderCursor() || _this->m_server->PollForeground()
  214. );
  215. SetForegroundWindow(hwnd);
  216. _this->m_dlgvisible = TRUE;
  217. return TRUE;
  218. }
  219. case WM_COMMAND:
  220. switch (LOWORD(wParam))
  221. {
  222. case IDOK:
  223. case IDC_APPLY:
  224. {
  225. // Save the password
  226. char passwd[MAXPWLEN+1];
  227. if (GetDlgItemText(hwnd, IDC_PASSWORD, (LPSTR) &passwd, MAXPWLEN+1) == 0)
  228. {
  229.     vncPasswd::FromClear crypt;
  230.     _this->m_server->SetPassword(crypt);
  231. }
  232. else
  233. {
  234.     vncPasswd::FromText crypt(passwd);
  235.     _this->m_server->SetPassword(crypt);
  236. }
  237. // Save the new settings to the server
  238. HWND hPortNoAuto = GetDlgItem(hwnd, IDC_PORTNO_AUTO);
  239. _this->m_server->SetAutoPortSelect(
  240. SendMessage(hPortNoAuto, BM_GETCHECK, 0, 0) == BST_CHECKED
  241. );
  242. // only save the port number if we're not auto selecting!
  243. if (!_this->m_server->AutoPortSelect())
  244. {
  245. BOOL success;
  246. UINT portno = GetDlgItemInt(hwnd, IDC_PORTNO, &success, TRUE);
  247. if (success)
  248. _this->m_server->SetPort(DISPLAY_TO_PORT(portno));
  249. }
  250. HWND hConnectSock = GetDlgItem(hwnd, IDC_CONNECT_SOCK);
  251. _this->m_server->SockConnect(
  252. SendMessage(hConnectSock, BM_GETCHECK, 0, 0) == BST_CHECKED
  253. );
  254. HWND hConnectCorba = GetDlgItem(hwnd, IDC_CONNECT_CORBA);
  255. _this->m_server->CORBAConnect(
  256. SendMessage(hConnectCorba, BM_GETCHECK, 0, 0) == BST_CHECKED
  257. );
  258. // Remote input stuff
  259. HWND hEnableInputs = GetDlgItem(hwnd, IDC_DISABLE_INPUTS);
  260. _this->m_server->EnableInputs(
  261. SendMessage(hEnableInputs, BM_GETCHECK, 0, 0) != BST_CHECKED
  262. );
  263. // Handle the polling stuff
  264. HWND hPollFullScreen = GetDlgItem(hwnd, IDC_POLL_FULLSCREEN);
  265. _this->m_server->PollFullScreen(
  266. SendMessage(hPollFullScreen, BM_GETCHECK, 0, 0) == BST_CHECKED
  267. );
  268. HWND hPollForeground = GetDlgItem(hwnd, IDC_POLL_FOREGROUND);
  269. _this->m_server->PollForeground(
  270. SendMessage(hPollForeground, BM_GETCHECK, 0, 0) == BST_CHECKED
  271. );
  272. HWND hPollUnderCursor = GetDlgItem(hwnd, IDC_POLL_UNDER_CURSOR);
  273. _this->m_server->PollUnderCursor(
  274. SendMessage(hPollUnderCursor, BM_GETCHECK, 0, 0) == BST_CHECKED
  275. );
  276. HWND hPollConsoleOnly = GetDlgItem(hwnd, IDC_CONSOLE_ONLY);
  277. _this->m_server->PollConsoleOnly(
  278. SendMessage(hPollConsoleOnly, BM_GETCHECK, 0, 0) == BST_CHECKED
  279. );
  280. HWND hPollOnEventOnly = GetDlgItem(hwnd, IDC_ONEVENT_ONLY);
  281. _this->m_server->PollOnEventOnly(
  282. SendMessage(hPollOnEventOnly, BM_GETCHECK, 0, 0) == BST_CHECKED
  283. );
  284. // And to the registry
  285. _this->Save();
  286. // Was ok pressed?
  287. if (LOWORD(wParam) == IDOK)
  288. {
  289. // Yes, so close the dialog
  290. log.Print(LL_INTINFO, VNCLOG("enddialog (OK)n"));
  291. _this->m_returncode_valid = TRUE;
  292. EndDialog(hwnd, IDOK);
  293. _this->m_dlgvisible = FALSE;
  294. }
  295. return TRUE;
  296. }
  297. case IDCANCEL:
  298. log.Print(LL_INTINFO, VNCLOG("enddialog (CANCEL)n"));
  299. _this->m_returncode_valid = TRUE;
  300. EndDialog(hwnd, IDCANCEL);
  301. _this->m_dlgvisible = FALSE;
  302. return TRUE;
  303. case IDC_CONNECT_SOCK:
  304. // The user has clicked on the socket connect tickbox
  305. {
  306. HWND hConnectSock = GetDlgItem(hwnd, IDC_CONNECT_SOCK);
  307. BOOL connectsockon =
  308. (SendMessage(hConnectSock, BM_GETCHECK, 0, 0) == BST_CHECKED);
  309. HWND hPortNoAuto = GetDlgItem(hwnd, IDC_PORTNO_AUTO);
  310. EnableWindow(hPortNoAuto, connectsockon);
  311. HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO);
  312. EnableWindow(hPortNo, connectsockon
  313. && (SendMessage(hPortNoAuto, BM_GETCHECK, 0, 0) != BST_CHECKED));
  314. HWND hPassword = GetDlgItem(hwnd, IDC_PASSWORD);
  315. EnableWindow(hPassword, connectsockon);
  316. }
  317. return TRUE;
  318. case IDC_POLL_FOREGROUND:
  319. case IDC_POLL_UNDER_CURSOR:
  320. // User has clicked on one of the polling mode buttons
  321. // affected by the pollconsole and pollonevent options
  322. {
  323. // Get the poll-mode buttons
  324. HWND hPollForeground = GetDlgItem(hwnd, IDC_POLL_FOREGROUND);
  325. HWND hPollUnderCursor = GetDlgItem(hwnd, IDC_POLL_UNDER_CURSOR);
  326. // Determine whether to enable the modifier options
  327. BOOL enabled = (SendMessage(hPollForeground, BM_GETCHECK, 0, 0) == BST_CHECKED) ||
  328. (SendMessage(hPollUnderCursor, BM_GETCHECK, 0, 0) == BST_CHECKED);
  329. HWND hPollConsoleOnly = GetDlgItem(hwnd, IDC_CONSOLE_ONLY);
  330. EnableWindow(hPollConsoleOnly, enabled);
  331. HWND hPollOnEventOnly = GetDlgItem(hwnd, IDC_ONEVENT_ONLY);
  332. EnableWindow(hPollOnEventOnly, enabled);
  333. }
  334. return TRUE;
  335. case IDC_PORTNO_AUTO:
  336. // User has toggled the Auto Port Select feature.
  337. // If this is in use, then we don't allow the Display number field
  338. // to be modified!
  339. {
  340. // Get the auto select button
  341. HWND hPortNoAuto = GetDlgItem(hwnd, IDC_PORTNO_AUTO);
  342. // Should the portno field be modifiable?
  343. BOOL enable = SendMessage(hPortNoAuto, BM_GETCHECK, 0, 0) != BST_CHECKED;
  344. // Set the state
  345. HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO);
  346. EnableWindow(hPortNo, enable);
  347. }
  348. return TRUE;
  349. }
  350. break;
  351. }
  352. return 0;
  353. }
  354. // Functions to load & save the settings
  355. LONG
  356. vncProperties::LoadInt(HKEY key, LPCSTR valname, LONG defval)
  357. {
  358. LONG pref;
  359. ULONG type = REG_DWORD;
  360. ULONG prefsize = sizeof(pref);
  361. if (RegQueryValueEx(key,
  362. valname,
  363. NULL,
  364. &type,
  365. (LPBYTE) &pref,
  366. &prefsize) != ERROR_SUCCESS)
  367. return defval;
  368. if (type != REG_DWORD)
  369. return defval;
  370. if (prefsize != sizeof(pref))
  371. return defval;
  372. return pref;
  373. }
  374. void
  375. vncProperties::LoadPassword(HKEY key, char *buffer)
  376. {
  377. DWORD type;
  378. int slen=MAXPWLEN;
  379. char inouttext[MAXPWLEN];
  380. // Retrieve the encrypted password
  381. if (RegQueryValueEx(key,
  382. "Password",
  383. NULL,
  384. &type,
  385. (LPBYTE) &inouttext,
  386. (LPDWORD) &slen) != ERROR_SUCCESS)
  387. return;
  388. if (slen > MAXPWLEN)
  389. return;
  390. memcpy(buffer, inouttext, MAXPWLEN);
  391. }
  392. void
  393. vncProperties::Load()
  394. {
  395. char username[UNLEN+1];
  396. HKEY hkLocal, hkLocalUser, hkDefault;
  397. DWORD dw;
  398. // NEW (R3) PREFERENCES ALGORITHM
  399. // 1. Look in HKEY_LOCAL_MACHINE/Software/ORL/WinVNC3/%username%
  400. // for sysadmin-defined, user-specific settings.
  401. // 2. If not found, fall back to %username%=Default
  402. // 3. If AllowOverrides is set then load settings from
  403. // HKEY_CURRENT_USER/Software/ORL/WinVNC3
  404. // GET THE CORRECT KEY TO READ FROM
  405. // Get the user name / service name
  406. if (!vncService::CurrentUser((char *)&username, sizeof(username)))
  407. return;
  408. // If there is no user logged on them default to SYSTEM
  409. if (strcmp(username, "") == 0)
  410. strcpy((char *)&username, "SYSTEM");
  411. // Try to get the machine registry key for WinVNC
  412. if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
  413. WINVNC_REGISTRY_KEY,
  414. 0, REG_NONE, REG_OPTION_NON_VOLATILE,
  415. KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS)
  416. return;
  417. // Now try to get the per-user key
  418. if (RegOpenKeyEx(hkLocal,
  419. username,
  420. 0, KEY_READ,
  421. &hkLocalUser) != ERROR_SUCCESS)
  422. hkLocalUser = NULL;
  423. // Get the default key
  424. if (RegCreateKeyEx(hkLocal,
  425. "Default",
  426. 0, REG_NONE, REG_OPTION_NON_VOLATILE,
  427. KEY_READ,
  428. NULL,
  429. &hkDefault,
  430. &dw) != ERROR_SUCCESS)
  431. hkDefault = NULL;
  432. // LOAD THE MACHINE-LEVEL PREFS
  433. // Logging/debugging prefs
  434. log.SetMode(LoadInt(hkLocal, "DebugMode", 0));
  435. log.SetLevel(LoadInt(hkLocal, "DebugLevel", 0));
  436. // Authentication required, loopback allowed
  437. m_server->SetLoopbackOk(LoadInt(hkLocal, "AllowLoopback", false));
  438. m_server->SetAuthRequired(LoadInt(hkLocal, "AuthRequired", true));
  439. m_server->SetConnectPriority(LoadInt(hkLocal, "ConnectPriority", 0));
  440. // LOAD THE USER PREFERENCES
  441. // Set the default user prefs
  442. log.Print(LL_INTINFO, VNCLOG("clearing settingsn"));
  443. m_server->SetAutoPortSelect(TRUE);
  444. m_server->SockConnect(TRUE);
  445. m_server->CORBAConnect(FALSE);
  446. {
  447.     vncPasswd::FromClear crypt;
  448.     m_server->SetPassword(crypt);
  449. }
  450. m_server->EnableInputs(TRUE);
  451. m_server->SetLockSettings(-1);
  452. m_server->PollUnderCursor(FALSE);
  453. m_server->PollForeground(TRUE);
  454. m_server->PollFullScreen(FALSE);
  455. m_server->PollConsoleOnly(TRUE);
  456. m_server->PollOnEventOnly(FALSE);
  457. m_allowshutdown = TRUE;
  458. m_allowproperties = TRUE;
  459. // Load the user prefs
  460. if (hkDefault != NULL)
  461. {
  462. log.Print(LL_INTINFO, VNCLOG("loading DEFAULT settingsn"));
  463. LoadUserPrefs(hkDefault);
  464. m_allowshutdown = LoadInt(hkDefault, "AllowShutdown", m_allowshutdown);
  465. m_allowproperties = LoadInt(hkDefault, "AllowProperties", m_allowproperties);
  466. }
  467. if (hkLocalUser != NULL)
  468. {
  469. log.Print(LL_INTINFO, VNCLOG("loading "%s" local settingsn"), username);
  470. LoadUserPrefs(hkLocalUser);
  471. m_allowshutdown = LoadInt(hkLocalUser, "AllowShutdown", m_allowshutdown);
  472. m_allowproperties = LoadInt(hkLocalUser, "AllowProperties", m_allowproperties);
  473. }
  474. if (m_allowproperties)
  475. {
  476. // Now override the system settings with the user's settings
  477. HKEY hkGlobalUser;
  478. if (RegCreateKeyEx(HKEY_CURRENT_USER,
  479. WINVNC_REGISTRY_KEY,
  480. 0, REG_NONE, REG_OPTION_NON_VOLATILE,
  481. KEY_READ, NULL, &hkGlobalUser, &dw) == ERROR_SUCCESS)
  482. {
  483. log.Print(LL_INTINFO, VNCLOG("loading "%s" global settingsn"), username);
  484. LoadUserPrefs(hkGlobalUser);
  485. RegCloseKey(hkGlobalUser);
  486. }
  487. }
  488. if (hkDefault != NULL) RegCloseKey(hkLocalUser);
  489. if (hkDefault != NULL) RegCloseKey(hkDefault);
  490. RegCloseKey(hkLocal);
  491. }
  492. void
  493. vncProperties::LoadUserPrefs(HKEY appkey)
  494. {
  495. // LOAD USER PREFS FROM THE SELECTED KEY
  496. // Connection prefs
  497. m_server->SockConnect(
  498. LoadInt(appkey, "SocketConnect", m_server->SockConnected())
  499. );
  500. m_server->SetAutoPortSelect(
  501. LoadInt(appkey, "AutoPortSelect", m_server->AutoPortSelect())
  502. );
  503. if (!m_server->AutoPortSelect())
  504. {
  505. m_server->SetPort(
  506. LoadInt(appkey, "PortNumber", m_server->GetPort())
  507. );
  508. }
  509. // Load the password
  510. char passwd[MAXPWLEN];
  511. m_server->GetPassword(passwd);
  512. LoadPassword(appkey, passwd);
  513. m_server->SetPassword(passwd);
  514. // Clear out the existing CORBA object & generate a new one if required
  515. m_server->CORBAConnect(
  516. LoadInt(appkey, "CORBAConnect", m_server->CORBAConnected())
  517. );
  518. // Remote access prefs
  519. m_server->EnableInputs(
  520. LoadInt(appkey, "InputsEnabled", m_server->InputsEnabled())
  521. );
  522. m_server->SetLockSettings(
  523. LoadInt(appkey, "LockSetting", -1)
  524. );
  525. // Polling prefs
  526. m_server->PollUnderCursor(
  527. LoadInt(appkey, "PollUnderCursor", m_server->PollUnderCursor())
  528. );
  529. m_server->PollForeground(
  530. LoadInt(appkey, "PollForeground", m_server->PollForeground())
  531. );
  532. m_server->PollFullScreen(
  533. LoadInt(appkey, "PollFullScreen", m_server->PollFullScreen())
  534. );
  535. m_server->PollConsoleOnly(
  536. LoadInt(appkey, "OnlyPollConsole", m_server->PollConsoleOnly())
  537. );
  538. m_server->PollOnEventOnly(
  539. LoadInt(appkey, "OnlyPollOnEvent", m_server->PollOnEventOnly())
  540. );
  541. }
  542. void
  543. vncProperties::SaveInt(HKEY key, LPSTR valname, LONG val)
  544. {
  545. RegSetValueEx(key, valname, 0, REG_DWORD, (LPBYTE) &val, sizeof(val));
  546. }
  547. void
  548. vncProperties::SavePassword(HKEY key, char *buffer)
  549. {
  550. RegSetValueEx(key, "Password", 0, REG_BINARY, (LPBYTE) buffer, MAXPWLEN);
  551. }
  552. void
  553. vncProperties::Save()
  554. {
  555. HKEY appkey;
  556. DWORD dw;
  557. // NEW (R3) PREFERENCES ALGORITHM
  558. // The user's prefs are only saved if the user is allowed to override
  559. // the machine-local settings specified for them.  Otherwise, the
  560. // properties entry on the tray icon menu will be greyed out.
  561. // GET THE CORRECT KEY TO READ FROM
  562. // Try to get the machine registry key for WinVNC
  563. if (RegCreateKeyEx(HKEY_CURRENT_USER,
  564. WINVNC_REGISTRY_KEY,
  565. 0, REG_NONE, REG_OPTION_NON_VOLATILE,
  566. KEY_WRITE | KEY_READ, NULL, &appkey, &dw) != ERROR_SUCCESS)
  567. return;
  568. // SAVE PER-USER PREFS IF ALLOWED
  569. if (m_allowproperties)
  570. SaveUserPrefs(appkey);
  571. RegCloseKey(appkey);
  572. }
  573. void
  574. vncProperties::SaveUserPrefs(HKEY appkey)
  575. {
  576. // SAVE THE PER USER PREFS
  577. // Connection prefs
  578. SaveInt(appkey, "SocketConnect", m_server->SockConnected());
  579. SaveInt(appkey, "AutoPortSelect", m_server->AutoPortSelect());
  580. if (!m_server->AutoPortSelect())
  581. SaveInt(appkey, "PortNumber", m_server->GetPort());
  582. SaveInt(appkey, "InputsEnabled", m_server->InputsEnabled());
  583. // Save the password
  584. char passwd[MAXPWLEN];
  585. m_server->GetPassword(passwd);
  586. SavePassword(appkey, passwd);
  587. #if(defined(_CORBA))
  588. // Don't save the CORBA enabled flag if CORBA is not compiled in!
  589. SaveInt(appkey, "CORBAConnect", m_server->CORBAConnected());
  590. #endif
  591. // Polling prefs
  592. SaveInt(appkey, "PollUnderCursor", m_server->PollUnderCursor());
  593. SaveInt(appkey, "PollForeground", m_server->PollForeground());
  594. SaveInt(appkey, "PollFullScreen", m_server->PollFullScreen());
  595. SaveInt(appkey, "OnlyPollConsole", m_server->PollConsoleOnly());
  596. SaveInt(appkey, "OnlyPollOnEvent", m_server->PollOnEventOnly());
  597. }