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

远程控制编程

开发平台:

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. // VNCOptions.cpp: implementation of the VNCOptions class.
  24. #include "stdhdrs.h"
  25. #include "vncviewer.h"
  26. #include "VNCOptions.h"
  27. #include "Exception.h"
  28. VNCOptions::VNCOptions()
  29. {
  30. for (int i = rfbEncodingRaw; i<= LASTENCODING; i++)
  31. m_UseEnc[i] = true;
  32. m_ViewOnly = false;
  33. m_FullScreen = false;
  34. m_Use8Bit = false;
  35. m_PreferredEncoding = rfbEncodingHextile;
  36. m_SwapMouse = false;
  37. m_Emul3Buttons = false;
  38. m_Emul3Timeout = 100; // milliseconds
  39. m_Emul3Fuzz = 4;      // pixels away before emulation is cancelled
  40. m_Shared = false;
  41. m_DeiconifyOnBell = false;
  42. m_DisableClipboard = false;
  43. m_host[0] = '';
  44. m_port = -1;
  45. m_kbdname[0] = '';
  46. m_kbdSpecified = false;
  47. m_logLevel = 0;
  48. m_logToConsole = false;
  49. m_logToFile = false;
  50. m_delay=0;
  51. m_connectionSpecified = false;
  52. m_listening = false;
  53. m_restricted = false;
  54. }
  55. VNCOptions::~VNCOptions()
  56. {
  57. }
  58. inline bool SwitchMatch(LPCTSTR arg, LPCTSTR swtch) {
  59. return (arg[0] == '-' || arg[0] == '/') &&
  60. (_tcsicmp(&arg[1], swtch) == 0);
  61. }
  62. static void ArgError(LPTSTR msg) {
  63.     MessageBox(NULL,  msg, _T("Argument error"),MB_OK | MB_TOPMOST | MB_ICONSTOP);
  64. }
  65. void VNCOptions::SetFromCommandLine(LPTSTR szCmdLine) {
  66. // We assume no quoting here.
  67. // Copy the command line - we don't know what might happen to the original
  68. int cmdlinelen = _tcslen(szCmdLine);
  69. if (cmdlinelen == 0) return;
  70. TCHAR *cmd = new TCHAR[cmdlinelen + 1];
  71. _tcscpy(cmd, szCmdLine);
  72. // count the number of spaces
  73. int nspaces = 0;
  74. TCHAR *p = cmd;
  75. TCHAR *pos = cmd;
  76. while ( ( pos = _tcschr(p, ' ') ) != NULL ) {
  77. nspaces ++;
  78. p = pos + 1;
  79. }
  80. // Create the array to hold pointers to each bit of string
  81. TCHAR **args = new LPTSTR[nspaces + 1];
  82. // replace spaces with nulls and
  83. // create an array of TCHAR*'s which points to start of each bit.
  84. p = cmd; 
  85. pos = cmd;
  86. int i = 0;
  87. args[i++] = cmd;
  88. while ( ( pos = _tcschr(p, ' ') ) != NULL ) {
  89. *pos = '';
  90. p = pos + 1;
  91. args[i++] = p;
  92. }
  93. bool hostGiven = false, portGiven = false;
  94. // take in order.
  95. for (int j = 0; j < i; j++) {
  96. if ( SwitchMatch(args[j], _T("help")) ||
  97. SwitchMatch(args[j], _T("?")) ||
  98. SwitchMatch(args[j], _T("h"))) {
  99. ShowUsage();
  100. PostQuitMessage(1);
  101. } else if ( SwitchMatch(args[j], _T("listen"))) {
  102. m_listening = true;
  103. } else if ( SwitchMatch(args[j], _T("restricted"))) {
  104. m_restricted = true;
  105. } else if ( SwitchMatch(args[j], _T("viewonly"))) {
  106. m_ViewOnly = true;
  107. } else if ( SwitchMatch(args[j], _T("fullscreen"))) {
  108. m_FullScreen = true;
  109. } else if ( SwitchMatch(args[j], _T("8bit"))) {
  110. m_Use8Bit = true;
  111. } else if ( SwitchMatch(args[j], _T("shared"))) {
  112. m_Shared = true;
  113. } else if ( SwitchMatch(args[j], _T("swapmouse"))) {
  114. m_SwapMouse = true;
  115. } else if ( SwitchMatch(args[j], _T("belldeiconify") )) {
  116. m_DeiconifyOnBell = true;
  117. } else if ( SwitchMatch(args[j], _T("emulate3") )) {
  118. m_Emul3Buttons = true;
  119. } else if ( SwitchMatch(args[j], _T("emulate3timeout") )) {
  120. if (++j == i) {
  121. ArgError(_T("No timeout specified"));
  122. continue;
  123. }
  124. if (_stscanf(args[j], _T("%d"), &m_Emul3Timeout) != 1) {
  125. ArgError(_T("Invalid timeout specified"));
  126. continue;
  127. }
  128. } else if ( SwitchMatch(args[j], _T("emulate3fuzz") )) {
  129. if (++j == i) {
  130. ArgError(_T("No fuzz specified"));
  131. continue;
  132. }
  133. if (_stscanf(args[j], _T("%d"), &m_Emul3Fuzz) != 1) {
  134. ArgError(_T("Invalid fuzz specified"));
  135. continue;
  136. }
  137. } else if ( SwitchMatch(args[j], _T("disableclipboard") )) {
  138. m_DisableClipboard = true;
  139. } else if ( SwitchMatch(args[j], _T("delay") )) {
  140. if (++j == i) {
  141. ArgError(_T("No delay specified"));
  142. continue;
  143. }
  144. if (_stscanf(args[j], _T("%d"), &m_delay) != 1) {
  145. ArgError(_T("Invalid delay specified"));
  146. continue;
  147. }
  148. } else if ( SwitchMatch(args[j], _T("loglevel") )) {
  149. if (++j == i) {
  150. ArgError(_T("No loglevel specified"));
  151. continue;
  152. }
  153. if (_stscanf(args[j], _T("%d"), &m_logLevel) != 1) {
  154. ArgError(_T("Invalid loglevel specified"));
  155. continue;
  156. }
  157. } else if ( SwitchMatch(args[j], _T("console") )) {
  158. m_logToConsole = true;
  159. } else if ( SwitchMatch(args[j], _T("logfile") )) {
  160. if (++j == i) {
  161. ArgError(_T("No logfile specified"));
  162. continue;
  163. }
  164. if (_stscanf(args[j], _T("%s"), &m_logFilename) != 1) {
  165. ArgError(_T("Invalid logfile specified"));
  166. continue;
  167. } else {
  168. m_logToFile = true;
  169. }
  170. } else {
  171. TCHAR phost[256];
  172. if (!ParseDisplay(args[j], phost, 255, &m_port)) {
  173. ShowUsage(_T("Invalid VNC server specified."));
  174. PostQuitMessage(1);
  175. } else {
  176. _tcscpy(m_host, phost);
  177. m_connectionSpecified = true;
  178. }
  179. }
  180. }       
  181. // tidy up
  182. delete [] cmd;
  183. delete [] args;
  184. }
  185. void VNCOptions::ShowUsage(LPTSTR info) {
  186.     TCHAR msg[1024];
  187.     TCHAR *tmpinf = _T("");
  188.     if (info != NULL) 
  189.         tmpinf = info;
  190.     _stprintf(msg, 
  191. #ifdef UNDER_CE
  192. _T("%snrUsage includes:nr"
  193. "vncviewer [/8bit] [/swapmouse] [/shared] [/belldeiconify] [server:display]"
  194. "For full details see documentation."), 
  195. #else
  196. _T("%snrUsage includes:nr"
  197. "  vncviewer [/8bit] [/swapmouse] [/shared] [/belldeiconify] nr"
  198. "      [/listen] [/fullscreen] [/viewonly] [/emulate3] [server:display]nr"
  199. "For full details see documentation."), 
  200. #endif
  201.         tmpinf);
  202.     MessageBox(NULL,  msg, _T("VNC error"), MB_OK | MB_ICONSTOP | MB_TOPMOST);
  203. }
  204. // The dialog box allows you to change the session-specific parameters
  205. int VNCOptions::DoDialog(bool running)
  206. {
  207. m_running = running;
  208. return DialogBoxParam(pApp->m_instance, MAKEINTRESOURCE(IDD_OPTIONDIALOG), 
  209. NULL, (DLGPROC) OptDlgProc, (LONG) this);
  210. }
  211. BOOL CALLBACK VNCOptions::OptDlgProc(  HWND hwnd,  UINT uMsg,  
  212.  WPARAM wParam, LPARAM lParam ) {
  213. // This is a static method, so we don't know which instantiation we're 
  214. // dealing with. But we can get a pseudo-this from the parameter to 
  215. // WM_INITDIALOG, which we therafter store with the window and retrieve
  216. // as follows:
  217. VNCOptions *_this = (VNCOptions *) GetWindowLong(hwnd, GWL_USERDATA);
  218. switch (uMsg) {
  219. case WM_INITDIALOG:
  220. {
  221. SetWindowLong(hwnd, GWL_USERDATA, lParam);
  222. _this = (VNCOptions *) lParam;
  223. // Initialise the controls
  224. for (int i = rfbEncodingRaw; i <= LASTENCODING; i++) {
  225. HWND hPref = GetDlgItem(hwnd, IDC_RAWRADIO + (i-rfbEncodingRaw));
  226. SendMessage(hPref, BM_SETCHECK, 
  227. (i== _this->m_PreferredEncoding), 0);
  228. EnableWindow(hPref, _this->m_UseEnc[i]);
  229. }
  230. HWND hCopyRect = GetDlgItem(hwnd, ID_SESSION_SET_CRECT);
  231. SendMessage(hCopyRect, BM_SETCHECK, _this->m_UseEnc[rfbEncodingCopyRect], 0);
  232. HWND hSwap = GetDlgItem(hwnd, ID_SESSION_SWAPMOUSE);
  233. SendMessage(hSwap, BM_SETCHECK, _this->m_SwapMouse, 0);
  234. HWND hDeiconify = GetDlgItem(hwnd, IDC_BELLDEICONIFY);
  235. SendMessage(hDeiconify, BM_SETCHECK, _this->m_DeiconifyOnBell, 0);
  236. HWND hDisableClip = GetDlgItem(hwnd, IDC_DISABLECLIPBOARD);
  237. SendMessage(hDisableClip, BM_SETCHECK, _this->m_DisableClipboard, 0);
  238. HWND h8bit = GetDlgItem(hwnd, IDC_8BITCHECK);
  239. SendMessage(h8bit, BM_SETCHECK, _this->m_Use8Bit, 0);
  240. HWND hShared = GetDlgItem(hwnd, IDC_SHARED);
  241. SendMessage(hShared, BM_SETCHECK, _this->m_Shared, 0);
  242. EnableWindow(hShared, !_this->m_running);
  243.  
  244. HWND hViewOnly = GetDlgItem(hwnd, IDC_VIEWONLY);
  245. SendMessage(hViewOnly, BM_SETCHECK, _this->m_ViewOnly, 0);
  246. HWND hFullScreen = GetDlgItem(hwnd, IDC_FULLSCREEN);
  247. SendMessage(hFullScreen, BM_SETCHECK, _this->m_FullScreen, 0);
  248.   HWND hEmulate = GetDlgItem(hwnd, IDC_EMULATECHECK);
  249.   SendMessage(hEmulate, BM_SETCHECK, _this->m_Emul3Buttons, 0);
  250. CentreWindow(hwnd);
  251. return TRUE;
  252. }
  253. case WM_COMMAND:
  254. switch (LOWORD(wParam)) {
  255. case IDOK:
  256. {
  257. for (int i = rfbEncodingRaw; i <= LASTENCODING; i++) {
  258. HWND hPref = GetDlgItem(hwnd, IDC_RAWRADIO+i-rfbEncodingRaw);
  259. if (SendMessage(hPref, BM_GETCHECK, 0, 0) == BST_CHECKED)
  260. _this->m_PreferredEncoding = i;
  261. }
  262. HWND hCopyRect = GetDlgItem(hwnd, ID_SESSION_SET_CRECT);
  263. _this->m_UseEnc[rfbEncodingCopyRect] =
  264. (SendMessage(hCopyRect, BM_GETCHECK, 0, 0) == BST_CHECKED);
  265. HWND hSwap = GetDlgItem(hwnd, ID_SESSION_SWAPMOUSE);
  266. _this->m_SwapMouse =
  267. (SendMessage(hSwap, BM_GETCHECK, 0, 0) == BST_CHECKED);
  268. HWND hDeiconify = GetDlgItem(hwnd, IDC_BELLDEICONIFY);
  269. _this->m_DeiconifyOnBell =
  270. (SendMessage(hDeiconify, BM_GETCHECK, 0, 0) == BST_CHECKED);
  271. HWND hDisableClip = GetDlgItem(hwnd, IDC_DISABLECLIPBOARD);
  272. _this->m_DisableClipboard =
  273. (SendMessage(hDisableClip, BM_GETCHECK, 0, 0) == BST_CHECKED);
  274. HWND h8bit = GetDlgItem(hwnd, IDC_8BITCHECK);
  275. _this->m_Use8Bit =
  276. (SendMessage(h8bit, BM_GETCHECK, 0, 0) == BST_CHECKED);
  277. HWND hShared = GetDlgItem(hwnd, IDC_SHARED);
  278. _this->m_Shared =
  279. (SendMessage(hShared, BM_GETCHECK, 0, 0) == BST_CHECKED);
  280. HWND hViewOnly = GetDlgItem(hwnd, IDC_VIEWONLY);
  281. _this->m_ViewOnly = 
  282. (SendMessage(hViewOnly, BM_GETCHECK, 0, 0) == BST_CHECKED);
  283. HWND hFullScreen = GetDlgItem(hwnd, IDC_FULLSCREEN);
  284. _this->m_FullScreen = 
  285. (SendMessage(hFullScreen, BM_GETCHECK, 0, 0) == BST_CHECKED);
  286.   HWND hEmulate = GetDlgItem(hwnd, IDC_EMULATECHECK);
  287.   _this->m_Emul3Buttons =
  288.   (SendMessage(hEmulate, BM_GETCHECK, 0, 0) == BST_CHECKED);
  289.  
  290. EndDialog(hwnd, TRUE);
  291. return TRUE;
  292. }
  293. case IDCANCEL:
  294. EndDialog(hwnd, FALSE);
  295. return TRUE;
  296. }
  297. break;
  298.         case WM_DESTROY:
  299. EndDialog(hwnd, FALSE);
  300. return TRUE;
  301. }
  302. return 0;
  303. }