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

远程控制编程

开发平台:

Visual C++

  1. //  The VNC system is free software; you can redistribute it and/or modify
  2. //  it under the terms of the GNU General Public License as published by
  3. //  the Free Software Foundation; either version 2 of the License, or
  4. //  (at your option) any later version.
  5. //
  6. //  This program is distributed in the hope that it will be useful,
  7. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9. //  GNU General Public License for more details.
  10. //
  11. //  You should have received a copy of the GNU General Public License
  12. //  along with this program; if not, write to the Free Software
  13. //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  14. //  USA.
  15. //
  16. // If the source code for the VNC system is not available from the place 
  17. // whence you received this file, check http://www.orl.co.uk/vnc or contact
  18. // the authors on vnc@orl.co.uk for information on obtaining it.
  19. #include "stdhdrs.h"
  20. #include "vncviewer.h"
  21. #include "ClientConnection.h"
  22. #include "Exception.h"
  23. // This file contains the code for getting text from, and putting text into
  24. // the Windows clipboard.
  25. //
  26. // ProcessClipboardChange
  27. // Called by ClientConnection::WndProc.
  28. // We've been informed that the local clipboard has been updated.
  29. // If it's text we want to send it to the server.
  30. //
  31. void ClientConnection::ProcessLocalClipboardChange()
  32. {
  33. log.Print(2, _T("Clipboard changedn"));
  34. HWND hOwner = GetClipboardOwner();
  35. if (hOwner == m_hwnd) {
  36. log.Print(2, _T("We changed it - ignore!n"));
  37. } else if (!m_initialClipboardSeen) {
  38. log.Print(2, _T("Don't send initial clipboard!n"));
  39. m_initialClipboardSeen = true;
  40. } else if (!m_opts.m_DisableClipboard) {
  41. // The clipboard should not be modified by more than one thread at once
  42. omni_mutex_lock l(m_clipMutex);
  43. if (OpenClipboard(m_hwnd)) { 
  44. HGLOBAL hglb = GetClipboardData(CF_TEXT); 
  45. if (hglb == NULL) {
  46. CloseClipboard();
  47. } else {
  48. LPSTR lpstr = (LPSTR) GlobalLock(hglb);  
  49. char *contents = new char[strlen(lpstr) + 1];
  50. char *unixcontents = new char[strlen(lpstr) + 1];
  51. strcpy(contents,lpstr);
  52. GlobalUnlock(hglb); 
  53. CloseClipboard();       
  54. // Translate to Unix-format lines before sending
  55. for (int i = 0, j = 0; contents[i] != ''; i++) {
  56. if (contents[i] != 'x0d') {
  57. unixcontents[j++] = contents[i];
  58. }
  59. }
  60. unixcontents[j] = '';
  61. try {
  62. SendClientCutText(unixcontents, strlen(unixcontents));
  63. } catch (WarningException &e) {
  64. log.Print(0, _T("Exception while sending clipboard text : %sn"), e.m_info);
  65. DestroyWindow(m_hwnd);
  66. }
  67. delete [] contents; 
  68. delete [] unixcontents;
  69. }
  70. }
  71. }
  72. // Pass the message to the next window in clipboard viewer chain
  73. ::SendMessage(m_hwndNextViewer, WM_DRAWCLIPBOARD , 0,0); 
  74. }
  75. // We've read some text from the remote server, and
  76. // we need to copy it into the local clipboard.
  77. // Called by ClientConnection::ReadServerCutText()
  78. void ClientConnection::UpdateLocalClipboard(char *buf, int len) {
  79. if (m_opts.m_DisableClipboard)
  80. return;
  81. // Copy to wincontents replacing LF with CR-LF
  82. char *wincontents = new char[len * 2 + 1];
  83. for (int i = 0, j = 0; m_netbuf[i] != 0; i++, j++) {
  84.         if (buf[i] == 'x0a') {
  85. wincontents[j++] = 'x0d';
  86.             len++;
  87.         }
  88. wincontents[j] = buf[i];
  89. }
  90. wincontents[j] = '';
  91.     // The clipboard should not be modified by more than one thread at once
  92.     {
  93.         omni_mutex_lock l(m_clipMutex);
  94.         if (!OpenClipboard(m_hwnd)) {
  95.         throw WarningException("Failed to open clipboardn");
  96.         }
  97.         if (! ::EmptyClipboard()) {
  98.         throw WarningException("Failed to empty clipboardn");
  99.         }
  100.         // Allocate a global memory object for the text. 
  101.         HGLOBAL hglbCopy = GlobalAlloc(GMEM_DDESHARE, (len +1) * sizeof(TCHAR));
  102.         if (hglbCopy != NULL) { 
  103.         // Lock the handle and copy the text to the buffer.  
  104.         LPTSTR lptstrCopy = (LPTSTR) GlobalLock(hglbCopy); 
  105.         memcpy(lptstrCopy, wincontents, len * sizeof(TCHAR)); 
  106.         lptstrCopy[len] = (TCHAR) 0;    // null character 
  107.         GlobalUnlock(hglbCopy);          // Place the handle on the clipboard.  
  108.         SetClipboardData(CF_TEXT, hglbCopy); 
  109.         }
  110.         delete [] wincontents;
  111.         if (! ::CloseClipboard()) {
  112.         throw WarningException("Failed to close clipboardn");
  113.         }
  114.     }
  115. }