VBoxClipboard.cpp revision 240f7d7012a5f64bcde850bcf048531a710d81cf
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * VBoxClipboard - Shared clipboard
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * Copyright (C) 2006-2007 Sun Microsystems, Inc.
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * This file is part of VirtualBox Open Source Edition (OSE), as
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * available from http://www.virtualbox.org. This file is free software;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * you can redistribute it and/or modify it under the terms of the GNU
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * General Public License (GPL) as published by the Free Software
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * Foundation, in version 2 as it comes in the "COPYING" file of the
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * Clara, CA 95054 USA or visit http://www.sun.com if you need
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * additional information or have any questions.
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// bool fOperational;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// uint32_t u32LastSentFormat;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// uint64_t u64LastSentCRC64;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic char gachWindowClassName[] = "VBoxSharedClipboardClass";
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues (__a)->hdr.cParms = (sizeof (*(__a)) - sizeof ((__a)->hdr)) / sizeof (HGCMFunctionParameter); \
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues//static bool vboxClipboardIsSameAsLastSent (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Format,
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// void *pv, uint32_t cb)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// uint64_t u64CRC = RTCrc64 (pv, cb);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// if ( pCtx->u32LastSentFormat == u32Format
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// && pCtx->u64LastSentCRC64 == u64CRC)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// return true;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// pCtx->u64LastSentCRC64 = u64CRC;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// pCtx->u32LastSentFormat = u32Format;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// return false;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic int vboxClipboardConnect (VBOXCLIPBOARDCONTEXT *pCtx)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues memcpy (info.Loc.u.host.achName, "VBoxSharedClipboard", sizeof ("VBoxSharedClipboard"));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic void vboxClipboardDisconnect (VBOXCLIPBOARDCONTEXT *pCtx)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic void VBoxHGCMParmUInt32Set (HGCMFunctionParameter *pParm, uint32_t u32)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic int VBoxHGCMParmUInt32Get (HGCMFunctionParameter *pParm, uint32_t *pu32)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic void VBoxHGCMParmPtrSet (HGCMFunctionParameter *pParm, void *pv, uint32_t cb)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic int vboxCall (HANDLE hDriver, void *pvData, unsigned cbData)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic int vboxClipboardReportFormats (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Formats)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_FORMATS, pCtx);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues VBoxHGCMParmUInt32Set (&parms.formats, u32Formats);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues int rc = vboxCall (pCtx->pEnv->hDriver, &parms, sizeof (parms));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic int vboxClipboardReadData (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Format, void *pv, uint32_t cb, uint32_t *pcbActual)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_READ_DATA, pCtx);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues int rc = vboxCall (pCtx->pEnv->hDriver, &parms, sizeof (parms));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues rc = VBoxHGCMParmUInt32Get (&parms.size, &u32Size);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues Log (("vboxClipboardReadData: actual size = %d, rc = %d\n", u32Size, rc));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic int vboxClipboardWriteData (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Format,
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// if (vboxClipboardIsSameAsLastSent (pCtx, u32Format, pv, cb))
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// Log (("vboxClipboardWriteData: The data to be sent are the same as the last sent.\n"));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues// return VINF_SUCCESS;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA, pCtx);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues int rc = vboxCall (pCtx->pEnv->hDriver, &parms, sizeof (parms));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic void vboxClipboardChanged (VBOXCLIPBOARDCONTEXT *pCtx)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues /* Query list of available formats and report to host. */
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues while ((format = EnumClipboardFormats (format)) != 0)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues Log (("vboxClipboardChanged: format 0x%08X\n", format));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues u32Formats |= VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT;
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues int cActual = GetClipboardFormatName(format, szFormatName, sizeof(szFormatName)/sizeof (TCHAR));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguiguesstatic LRESULT vboxClipboardProcessMsg(VBOXCLIPBOARDCONTEXT *pCtx, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues Log (("vboxClipboardProcessMsg: WM_CHANGECBCHAIN: hwndRemoved %p, hwndNext %p, hwnd %p\n", hwndRemoved, hwndNext, pCtx->hwnd));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues /* The window that was next to our in the chain is being removed.
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues * Relink to the new next window.
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues /* Pass the message further. */
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues rc = SendMessage (pCtx->hwndNextInChain, WM_CHANGECBCHAIN, wParam, lParam);
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues Log (("vboxClipboardProcessMsg: WM_DRAWCLIPBOARD, hwnd %p\n", pCtx->hwnd));
a383231a2cdc259f8a5b566247aca72a91dbb2a3fguigues /* Clipboard was updated by another application. */
case WM_CLOSE:
case WM_RENDERFORMAT:
switch (format)
case CF_UNICODETEXT:
case CF_DIB:
if (cActual)
if (u32Format == 0)
EmptyClipboard ();
if (hMem)
if (pMem)
if (cb == 0)
if (hMem)
if (pMem)
if (hMem)
if (hMem)
if (hMem)
if (hClip)
if (hMem)
if (hMem)
EmptyClipboard ();
case WM_RENDERALLFORMATS:
case WM_USER:
if (format != 0)
if (format != 0)
CloseClipboard ();
return rc;
return rc;
return VERR_NOT_SUPPORTED;
*pfStartThread = true;
return rc;
NULL,
NULL);
NULL))
switch (u32Msg)