32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync/* $Id$ */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/** @file
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync * Shared Clipboard: Mac OS X host.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2008-2011 Oracle Corporation
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * available from http://www.virtualbox.org. This file is free software;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * you can redistribute it and/or modify it under the terms of the GNU
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * General Public License (GPL) as published by the Free Software
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync#include <VBox/HostServices/VBoxClipboardSvc.h>
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync#include <iprt/assert.h>
cd2835b091297e68000f0c74fd26f4c2ca532e13vboxsync#include <iprt/asm.h>
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync#include <iprt/thread.h>
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync#include "VBoxClipboard.h"
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync#include "darwin-pasteboard.h"
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/** Global clipboard context information */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncstruct _VBOXCLIPBOARDCONTEXT
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync /** We have a separate thread to poll for new clipboard content */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync RTTHREAD thread;
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync bool volatile fTerminate;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync /** The reference to the current pasteboard */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync PasteboardRef pasteboard;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync VBOXCLIPBOARDCLIENTDATA *pClient;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync};
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync/** Only one client is supported. There seems to be no need for more clients. */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncstatic VBOXCLIPBOARDCONTEXT g_ctx;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync/**
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * Checks if something is present on the clipboard and calls vboxSvcClipboardReportMsg.
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync *
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @returns IPRT status code (ignored).
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @param pCtx The context.
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync */
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsyncstatic int vboxClipboardChanged (VBOXCLIPBOARDCONTEXT *pCtx)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync if (pCtx->pClient == NULL)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return VINF_SUCCESS;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync uint32_t fFormats = 0;
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync bool fChanged = false;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync /* Retrieve the formats currently in the clipboard and supported by vbox */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync int rc = queryNewPasteboardFormats (pCtx->pasteboard, &fFormats, &fChanged);
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync if (RT_SUCCESS (rc) && fChanged)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync {
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync vboxSvcClipboardReportMsg (pCtx->pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS, fFormats);
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync Log (("vboxClipboardChanged fFormats %02X\n", fFormats));
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return rc;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync/**
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * The poller thread.
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync *
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * This thread will check for the arrival of new data on the clipboard.
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync *
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @returns VINF_SUCCESS (not used).
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @param Thread Our thread handle.
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @param pvUser Pointer to the VBOXCLIPBOARDCONTEXT structure.
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync *
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync */
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsyncstatic int vboxClipboardThread (RTTHREAD ThreadSelf, void *pvUser)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Log (("vboxClipboardThread: starting clipboard thread\n"));
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync AssertPtrReturn (pvUser, VERR_INVALID_PARAMETER);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync VBOXCLIPBOARDCONTEXT *pCtx = (VBOXCLIPBOARDCONTEXT *) pvUser;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync while (!pCtx->fTerminate)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync {
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync /* call this behind the lock because we don't know if the api is
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync thread safe and in any case we're calling several methods. */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardLock();
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync vboxClipboardChanged (pCtx);
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardUnlock();
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync /* Sleep for 200 msecs before next poll */
cd2835b091297e68000f0c74fd26f4c2ca532e13vboxsync RTThreadUserWait (ThreadSelf, 200);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync Log (("vboxClipboardThread: clipboard thread terminated successfully with return code %Rrc\n", VINF_SUCCESS));
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return VINF_SUCCESS;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/*
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Public platform dependent functions.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/** Initialise the host side of the shared clipboard - called by the hgcm layer. */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncint vboxClipboardInit (void)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Log (("vboxClipboardInit\n"));
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync g_ctx.fTerminate = false;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync int rc = initPasteboard (&g_ctx.pasteboard);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync AssertRCReturn (rc, rc);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync rc = RTThreadCreate (&g_ctx.thread, vboxClipboardThread, &g_ctx, 0,
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SHCLIP");
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync if (RT_FAILURE (rc))
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync {
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync g_ctx.thread = NIL_RTTHREAD;
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync destroyPasteboard (&g_ctx.pasteboard);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return rc;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/** Terminate the host side of the shared clipboard - called by the hgcm layer. */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncvoid vboxClipboardDestroy (void)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Log (("vboxClipboardDestroy\n"));
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync /*
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * Signal the termination of the polling thread and wait for it to respond.
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync */
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync ASMAtomicWriteBool (&g_ctx.fTerminate, true);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync int rc = RTThreadUserSignal (g_ctx.thread);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync AssertRC (rc);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync rc = RTThreadWait (g_ctx.thread, RT_INDEFINITE_WAIT, NULL);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync AssertRC (rc);
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync /*
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * Destroy the pasteboard and uninitialize the global context record.
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync */
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync destroyPasteboard (&g_ctx.pasteboard);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync g_ctx.thread = NIL_RTTHREAD;
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync g_ctx.pClient = NULL;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * Enable the shared clipboard - called by the hgcm clipboard subsystem.
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync *
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @param pClient Structure containing context information about the guest system
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync * @returns RT status code
50c2debb9220483350368d645fc8a33b86ff5e0bvboxsync */
2ef891867e61b1018318ef3a47baac5dc9c71504vboxsyncint vboxClipboardConnect (VBOXCLIPBOARDCLIENTDATA *pClient, bool)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync if (g_ctx.pClient != NULL)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync {
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync /* One client only. */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return VERR_NOT_SUPPORTED;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardLock();
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync pClient->pCtx = &g_ctx;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync pClient->pCtx->pClient = pClient;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync /* Initially sync the host clipboard content with the client. */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync int rc = vboxClipboardSync (pClient);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardUnlock();
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return rc;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Synchronise the contents of the host clipboard with the guest, called by the HGCM layer
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * after a save and restore of the guest.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncint vboxClipboardSync (VBOXCLIPBOARDCLIENTDATA *pClient)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync /* Sync the host clipboard content with the client. */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardLock();
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync int rc = vboxClipboardChanged (pClient->pCtx);
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardUnlock();
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return rc;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Shut down the shared clipboard subsystem and "disconnect" the guest.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsyncvoid vboxClipboardDisconnect (VBOXCLIPBOARDCLIENTDATA *pClient)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Log (("vboxClipboardDisconnect\n"));
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardLock();
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync pClient->pCtx->pClient = NULL;
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardUnlock();
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * The guest is taking possession of the shared clipboard. Called by the HGCM clipboard
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * subsystem.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pClient Context data for the guest system
46fd1b35e55cbd736b7abe0d856a940f0336eb81vboxsync * @param u32Formats Clipboard formats the guest is offering
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsyncvoid vboxClipboardFormatAnnounce (VBOXCLIPBOARDCLIENTDATA *pClient, uint32_t u32Formats)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Log (("vboxClipboardFormatAnnounce u32Formats %02X\n", u32Formats));
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync if (u32Formats == 0)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync {
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* This is just an automatism, not a genuine announcement */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardReportMsg (pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA,
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync u32Formats);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Called by the HGCM clipboard subsystem when the guest wants to read the host clipboard.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pClient Context information about the guest VM
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param u32Format The format that the guest would like to receive the data in
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pv Where to write the data to
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param cb The size of the buffer to write the data to
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pcbActual Where to write the actual size of the written data
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsyncint vboxClipboardReadData (VBOXCLIPBOARDCLIENTDATA *pClient, uint32_t u32Format,
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync void *pv, uint32_t cb, uint32_t * pcbActual)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardLock();
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync /* Default to no data available. */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *pcbActual = 0;
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync int rc = readFromPasteboard (pClient->pCtx->pasteboard, u32Format, pv, cb, pcbActual);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardUnlock();
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return rc;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Called by the HGCM clipboard subsystem when we have requested data and that data arrives.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pClient Context information about the guest VM
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pv Buffer to which the data was written
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param cb The size of the data written
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param u32Format The format of the data written
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsyncvoid vboxClipboardWriteData (VBOXCLIPBOARDCLIENTDATA *pClient, void *pv,
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync uint32_t cb, uint32_t u32Format)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardLock();
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync writeToPasteboard (pClient->pCtx->pasteboard, pv, cb, u32Format);
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync
295a2ae5a4db2c930f7096c6cf55b5fa4ee5b018vboxsync vboxSvcClipboardUnlock();
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}