ClientConnectionClipboard.cpp
资源名称:vnc3326s.zip [点击查看]
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:4k
源码类别:
远程控制编程
开发平台:
Visual C++
- // The VNC system is free software; you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation; either version 2 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with this program; if not, write to the Free Software
- // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- // USA.
- //
- // If the source code for the VNC system is not available from the place
- // whence you received this file, check http://www.orl.co.uk/vnc or contact
- // the authors on vnc@orl.co.uk for information on obtaining it.
- #include "stdhdrs.h"
- #include "vncviewer.h"
- #include "ClientConnection.h"
- #include "Exception.h"
- // This file contains the code for getting text from, and putting text into
- // the Windows clipboard.
- //
- // ProcessClipboardChange
- // Called by ClientConnection::WndProc.
- // We've been informed that the local clipboard has been updated.
- // If it's text we want to send it to the server.
- //
- void ClientConnection::ProcessLocalClipboardChange()
- {
- log.Print(2, _T("Clipboard changedn"));
- HWND hOwner = GetClipboardOwner();
- if (hOwner == m_hwnd) {
- log.Print(2, _T("We changed it - ignore!n"));
- } else if (!m_initialClipboardSeen) {
- log.Print(2, _T("Don't send initial clipboard!n"));
- m_initialClipboardSeen = true;
- } else if (!m_opts.m_DisableClipboard) {
- // The clipboard should not be modified by more than one thread at once
- omni_mutex_lock l(m_clipMutex);
- if (OpenClipboard(m_hwnd)) {
- HGLOBAL hglb = GetClipboardData(CF_TEXT);
- if (hglb == NULL) {
- CloseClipboard();
- } else {
- LPSTR lpstr = (LPSTR) GlobalLock(hglb);
- char *contents = new char[strlen(lpstr) + 1];
- char *unixcontents = new char[strlen(lpstr) + 1];
- strcpy(contents,lpstr);
- GlobalUnlock(hglb);
- CloseClipboard();
- // Translate to Unix-format lines before sending
- for (int i = 0, j = 0; contents[i] != ' '; i++) {
- if (contents[i] != 'x0d') {
- unixcontents[j++] = contents[i];
- }
- }
- unixcontents[j] = ' ';
- try {
- SendClientCutText(unixcontents, strlen(unixcontents));
- } catch (WarningException &e) {
- log.Print(0, _T("Exception while sending clipboard text : %sn"), e.m_info);
- DestroyWindow(m_hwnd);
- }
- delete [] contents;
- delete [] unixcontents;
- }
- }
- }
- // Pass the message to the next window in clipboard viewer chain
- ::SendMessage(m_hwndNextViewer, WM_DRAWCLIPBOARD , 0,0);
- }
- // We've read some text from the remote server, and
- // we need to copy it into the local clipboard.
- // Called by ClientConnection::ReadServerCutText()
- void ClientConnection::UpdateLocalClipboard(char *buf, int len) {
- if (m_opts.m_DisableClipboard)
- return;
- // Copy to wincontents replacing LF with CR-LF
- char *wincontents = new char[len * 2 + 1];
- for (int i = 0, j = 0; m_netbuf[i] != 0; i++, j++) {
- if (buf[i] == 'x0a') {
- wincontents[j++] = 'x0d';
- len++;
- }
- wincontents[j] = buf[i];
- }
- wincontents[j] = ' ';
- // The clipboard should not be modified by more than one thread at once
- {
- omni_mutex_lock l(m_clipMutex);
- if (!OpenClipboard(m_hwnd)) {
- throw WarningException("Failed to open clipboardn");
- }
- if (! ::EmptyClipboard()) {
- throw WarningException("Failed to empty clipboardn");
- }
- // Allocate a global memory object for the text.
- HGLOBAL hglbCopy = GlobalAlloc(GMEM_DDESHARE, (len +1) * sizeof(TCHAR));
- if (hglbCopy != NULL) {
- // Lock the handle and copy the text to the buffer.
- LPTSTR lptstrCopy = (LPTSTR) GlobalLock(hglbCopy);
- memcpy(lptstrCopy, wincontents, len * sizeof(TCHAR));
- lptstrCopy[len] = (TCHAR) 0; // null character
- GlobalUnlock(hglbCopy); // Place the handle on the clipboard.
- SetClipboardData(CF_TEXT, hglbCopy);
- }
- delete [] wincontents;
- if (! ::CloseClipboard()) {
- throw WarningException("Failed to close clipboardn");
- }
- }
- }