VBoxClipboard-win.cpp revision ad27e1d5e48ca41245120c331cc88b50464813ce
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * Shared Clipboard: Win32 host.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * Copyright (C) 2006-2007 Oracle Corporation
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * This file is part of VirtualBox Open Source Edition (OSE), as
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * available from http://www.virtualbox.org. This file is free software;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * you can redistribute it and/or modify it under the terms of the GNU
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * General Public License (GPL) as published by the Free Software
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * Foundation, in version 2 as it comes in the "COPYING" file of the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic char gachWindowClassName[] = "VBoxSharedClipboardClass";
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz bool volatile fTerminate;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/* Only one client is supported. There seems to be no need for more clients. */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzvoid vboxClipboardDump(const void *pv, size_t cb, uint32_t u32Format)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (u32Format & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Log(("DUMP: VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT:\n"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (u32Format & VBOX_SHARED_CLIPBOARD_FMT_BITMAP)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz dprintf(("DUMP: VBOX_SHARED_CLIPBOARD_FMT_BITMAP\n"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (u32Format & VBOX_SHARED_CLIPBOARD_FMT_HTML)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Log(("DUMP: VBOX_SHARED_CLIPBOARD_FMT_HTML:\n"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz dprintf(("DUMP: invalid format %02X\n", u32Format));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define vboxClipboardDump(__pv, __cb, __format) do { NOREF(__pv); NOREF(__cb); NOREF(__format); } while (0)
Assert(pCtx->pClient->data.pv == NULL && pCtx->pClient->data.cb == 0 && pCtx->pClient->data.u32Format == 0);
return VINF_SUCCESS;
switch (format)
case CF_UNICODETEXT:
case CF_TEXT:
case CF_DIB:
case CF_BITMAP:
if (cActual)
CloseClipboard ();
(void) hwnd;
(void) uMsg;
(void) lResult;
switch (msg)
case WM_CHANGECBCHAIN:
rc = SendMessageTimeout(pCtx->hwndNextInChain, WM_CHANGECBCHAIN, wParam, lParam, 0, CBCHAIN_TIMEOUT, &dwResult);
if (!rc)
case WM_DRAWCLIPBOARD:
if (!rc)
case WM_TIMER:
if (hViewer)
SendMessageCallback(hViewer, WM_CHANGECBCHAIN, (WPARAM)pCtx->hwndNextInChain, (LPARAM)pCtx->hwndNextInChain, CBChainPingProc, (ULONG_PTR) pCtx);
case WM_CLOSE:
case WM_RENDERFORMAT:
switch (format)
case CF_UNICODETEXT:
case CF_DIB:
if (cActual)
EmptyClipboard ();
if (hMem)
if (pMem)
if (hClip)
EmptyClipboard ();
case WM_RENDERALLFORMATS:
case WM_USER:
if (format != 0)
return rc;
if (atomWindowClass == 0)
if (atomWindowClass != 0)
atomWindowClass = 0;
int vboxClipboardInit (void)
return rc;
void vboxClipboardDestroy (void)
return VERR_NOT_SUPPORTED;
return VINF_SUCCESS;
return VINF_SUCCESS;
int vboxClipboardReadData (VBOXCLIPBOARDCLIENTDATA *pClient, uint32_t u32Format, void *pv, uint32_t cb, uint32_t *pcbActual)
vboxClipboardGetData (VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT, uniString, (lstrlenW (uniString) + 1) * 2,
if (format != 0)
CloseClipboard ();
return VINF_SUCCESS;
void vboxClipboardWriteData (VBOXCLIPBOARDCLIENTDATA *pClient, void *pv, uint32_t cb, uint32_t u32Format)
if (cb > 0)