VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h@ 97215

Last change on this file since 97215 was 96407, checked in by vboxsync, 2 years ago

scm copyright and license note update

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.4 KB
Line 
1/* $Id: VBoxSharedClipboardSvc-internal.h 96407 2022-08-22 17:43:14Z vboxsync $ */
2/** @file
3 * Shared Clipboard Service - Internal header.
4 */
5
6/*
7 * Copyright (C) 2006-2022 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28#ifndef VBOX_INCLUDED_SRC_SharedClipboard_VBoxSharedClipboardSvc_internal_h
29#define VBOX_INCLUDED_SRC_SharedClipboard_VBoxSharedClipboardSvc_internal_h
30#ifndef RT_WITHOUT_PRAGMA_ONCE
31# pragma once
32#endif
33
34#include <algorithm>
35#include <list>
36#include <map>
37
38#include <iprt/cpp/list.h> /* For RTCList. */
39#include <iprt/list.h>
40#include <iprt/semaphore.h>
41
42#include <VBox/hgcmsvc.h>
43#include <VBox/log.h>
44
45#include <VBox/HostServices/Service.h>
46#include <VBox/GuestHost/SharedClipboard.h>
47#include <VBox/GuestHost/SharedClipboard-transfers.h>
48
49using namespace HGCM;
50
51#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
52struct SHCLCLIENTSTATE;
53#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
54
55/**
56 * A queued message for the guest.
57 */
58typedef struct _SHCLCLIENTMSG
59{
60 /** The queue list entry. */
61 RTLISTNODE ListEntry;
62 /** Stored message ID (VBOX_SHCL_HOST_MSG_XXX). */
63 uint32_t idMsg;
64 /** Context ID. */
65 uint64_t idCtx;
66 /** Number of stored parameters in aParms. */
67 uint32_t cParms;
68 /** HGCM parameters. */
69 RT_FLEXIBLE_ARRAY_EXTENSION
70 VBOXHGCMSVCPARM aParms[RT_FLEXIBLE_ARRAY];
71} SHCLCLIENTMSG;
72/** Pointer to a queue message for the guest. */
73typedef SHCLCLIENTMSG *PSHCLCLIENTMSG;
74
75typedef struct SHCLCLIENTTRANSFERSTATE
76{
77 /** Directory of the transfer to start. */
78 SHCLTRANSFERDIR enmTransferDir;
79} SHCLCLIENTTRANSFERSTATE, *PSHCLCLIENTTRANSFERSTATE;
80
81/**
82 * Structure for holding a single POD (plain old data) transfer.
83 *
84 * This mostly is plain text, but also can be stuff like bitmap (BMP) or other binary data.
85 */
86typedef struct SHCLCLIENTPODSTATE
87{
88 /** POD transfer direction. */
89 SHCLTRANSFERDIR enmDir;
90 /** Format of the data to be read / written. */
91 SHCLFORMAT uFormat;
92 /** How much data (in bytes) to read/write for the current operation. */
93 uint64_t cbToReadWriteTotal;
94 /** How much data (in bytes) already has been read/written for the current operation. */
95 uint64_t cbReadWritten;
96 /** Timestamp (in ms) of Last read/write operation. */
97 uint64_t tsLastReadWrittenMs;
98} SHCLCLIENTPODSTATE, *PSHCLCLIENTPODSTATE;
99
100/** @name SHCLCLIENTSTATE_FLAGS_XXX
101 * @note Part of saved state!
102 * @{ */
103/** No Shared Clipboard client flags defined. */
104#define SHCLCLIENTSTATE_FLAGS_NONE 0
105/** Client has a guest read operation active. Currently unused. */
106#define SHCLCLIENTSTATE_FLAGS_READ_ACTIVE RT_BIT(0)
107/** Client has a guest write operation active. Currently unused. */
108#define SHCLCLIENTSTATE_FLAGS_WRITE_ACTIVE RT_BIT(1)
109/** @} */
110
111/**
112 * Structure needed to support backwards compatbility for old(er) Guest Additions (< 6.1),
113 * which did not know the context ID concept then.
114 */
115typedef struct SHCLCLIENTLEGACYCID
116{
117 /** List node. */
118 RTLISTNODE Node;
119 /** The actual context ID. */
120 uint64_t uCID;
121 /** Not used yet; useful to have it in the saved state though. */
122 uint32_t enmType;
123 /** @todo Add an union here as soon as we utilize \a enmType. */
124 SHCLFORMAT uFormat;
125} SHCLCLIENTLEGACYCID;
126/** Pointer to a SHCLCLIENTLEGACYCID struct. */
127typedef SHCLCLIENTLEGACYCID *PSHCLCLIENTLEGACYCID;
128
129/**
130 * Structure for keeping legacy state, required for keeping backwards compatibility
131 * to old(er) Guest Additions.
132 */
133typedef struct SHCLCLIENTLEGACYSTATE
134{
135 /** List of context IDs (of type SHCLCLIENTLEGACYCID) for older Guest Additions which (< 6.1)
136 * which did not know the concept of context IDs. */
137 RTLISTANCHOR lstCID;
138 /** Number of context IDs currently in \a lstCID. */
139 uint16_t cCID;
140} SHCLCLIENTLEGACYSTATE;
141
142/**
143 * Structure for keeping generic client state data within the Shared Clipboard host service.
144 * This structure needs to be serializable by SSM (must be a POD type).
145 */
146typedef struct SHCLCLIENTSTATE
147{
148 struct SHCLCLIENTSTATE *pNext;
149 struct SHCLCLIENTSTATE *pPrev;
150
151 /** Backend-dependent opaque context structure.
152 * This contains data only known to a certain backend implementation.
153 * Optional and can be NULL. */
154 SHCLCONTEXT *pCtx;
155 /** The client's HGCM ID. Not related to the session ID below! */
156 uint32_t uClientID;
157 /** The client's session ID. */
158 SHCLSESSIONID uSessionID;
159 /** Guest feature flags, VBOX_SHCL_GF_0_XXX. */
160 uint64_t fGuestFeatures0;
161 /** Guest feature flags, VBOX_SHCL_GF_1_XXX. */
162 uint64_t fGuestFeatures1;
163 /** Chunk size to use for data transfers. */
164 uint32_t cbChunkSize;
165 /** Where the transfer sources its data from. */
166 SHCLSOURCE enmSource;
167 /** Client state flags of type SHCLCLIENTSTATE_FLAGS_. */
168 uint32_t fFlags;
169 /** POD (plain old data) state. */
170 SHCLCLIENTPODSTATE POD;
171 /** The client's transfers state. */
172 SHCLCLIENTTRANSFERSTATE Transfers;
173} SHCLCLIENTSTATE, *PSHCLCLIENTSTATE;
174
175typedef struct _SHCLCLIENTCMDCTX
176{
177 uint64_t uContextID;
178} SHCLCLIENTCMDCTX, *PSHCLCLIENTCMDCTX;
179
180#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
181/**
182 * Structure for keeping transfer-related data per HGCM client.
183 */
184typedef struct _SHCLIENTTRANSFERS
185{
186 /** Transfer context. */
187 SHCLTRANSFERCTX Ctx;
188} SHCLIENTTRANSFERS, *PSHCLIENTTRANSFERS;
189#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
190
191/** Prototypes for the Shared Clipboard backend. */
192struct SHCLBACKEND;
193typedef SHCLBACKEND *PSHCLBACKEND;
194
195/**
196 * Structure for keeping data per (connected) HGCM client.
197 */
198typedef struct _SHCLCLIENT
199{
200 /** Pointer to associated backend, if any.
201 * Might be NULL if not being used. */
202 PSHCLBACKEND pBackend;
203 /** General client state data. */
204 SHCLCLIENTSTATE State;
205 /** The critical section protecting the queue, event source and whatnot. */
206 RTCRITSECT CritSect;
207 /** The client's message queue (SHCLCLIENTMSG). */
208 RTLISTANCHOR MsgQueue;
209 /** Number of allocated messages (updated atomically, not under critsect). */
210 uint32_t volatile cMsgAllocated;
211 /** Legacy cruft we have to keep to support old(er) Guest Additions. */
212 SHCLCLIENTLEGACYSTATE Legacy;
213 /** The client's own event source.
214 * Needed for events which are not bound to a specific transfer. */
215 SHCLEVENTSOURCE EventSrc;
216#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
217 SHCLIENTTRANSFERS Transfers;
218#endif
219 /** Structure for keeping the client's pending (deferred return) state.
220 * A client is in a deferred state when it asks for the next HGCM message,
221 * but the service can't provide it yet. That way a client will block (on the guest side, does not return)
222 * until the service can complete the call. */
223 struct
224 {
225 /** The client's HGCM call handle. Needed for completing a deferred call. */
226 VBOXHGCMCALLHANDLE hHandle;
227 /** Message type (function number) to use when completing the deferred call.
228 * A non-0 value means the client is in pending mode. */
229 uint32_t uType;
230 /** Parameter count to use when completing the deferred call. */
231 uint32_t cParms;
232 /** Parameters to use when completing the deferred call. */
233 PVBOXHGCMSVCPARM paParms;
234 } Pending;
235} SHCLCLIENT, *PSHCLCLIENT;
236
237/**
238 * Structure for keeping a single event source map entry.
239 * Currently empty.
240 */
241typedef struct _SHCLEVENTSOURCEMAPENTRY
242{
243} SHCLEVENTSOURCEMAPENTRY;
244
245/** Map holding information about connected HGCM clients. Key is the (unique) HGCM client ID.
246 * The value is a weak pointer to PSHCLCLIENT, which is owned by HGCM. */
247typedef std::map<uint32_t, PSHCLCLIENT> ClipboardClientMap;
248
249/** Map holding information about event sources. Key is the (unique) event source ID. */
250typedef std::map<SHCLEVENTSOURCEID, SHCLEVENTSOURCEMAPENTRY> ClipboardEventSourceMap;
251
252/** Simple queue (list) which holds deferred (waiting) clients. */
253typedef std::list<uint32_t> ClipboardClientQueue;
254
255/**
256 * Structure for keeping the Shared Clipboard service extension state.
257 *
258 * A service extension is optional, and can be installed by a host component
259 * to communicate with the Shared Clipboard host service.
260 */
261typedef struct _SHCLEXTSTATE
262{
263 /** Pointer to the actual service extension handle. */
264 PFNHGCMSVCEXT pfnExtension;
265 /** Opaque pointer to extension-provided data. Don't touch. */
266 void *pvExtension;
267 /** The HGCM client ID currently assigned to this service extension.
268 * At the moment only one HGCM client can be assigned per extension. */
269 uint32_t uClientID;
270 /** Whether the host service is reading clipboard data currently. */
271 bool fReadingData;
272 /** Whether the service extension has sent the clipboard formats while
273 * the the host service is reading clipboard data from it. */
274 bool fDelayedAnnouncement;
275 /** The actual clipboard formats announced while the host service
276 * is reading clipboard data from the extension. */
277 uint32_t fDelayedFormats;
278} SHCLEXTSTATE, *PSHCLEXTSTATE;
279
280extern SHCLEXTSTATE g_ExtState;
281
282int shClSvcSetSource(PSHCLCLIENT pClient, SHCLSOURCE enmSource);
283
284void shClSvcMsgQueueReset(PSHCLCLIENT pClient);
285PSHCLCLIENTMSG shClSvcMsgAlloc(PSHCLCLIENT pClient, uint32_t uMsg, uint32_t cParms);
286void shClSvcMsgFree(PSHCLCLIENT pClient, PSHCLCLIENTMSG pMsg);
287void shClSvcMsgAdd(PSHCLCLIENT pClient, PSHCLCLIENTMSG pMsg, bool fAppend);
288int shClSvcMsgAddAndWakeupClient(PSHCLCLIENT pClient, PSHCLCLIENTMSG pMsg);
289
290int shClSvcClientInit(PSHCLCLIENT pClient, uint32_t uClientID);
291void shClSvcClientDestroy(PSHCLCLIENT pClient);
292void shClSvcClientLock(PSHCLCLIENT pClient);
293void shClSvcClientUnlock(PSHCLCLIENT pClient);
294void shClSvcClientReset(PSHCLCLIENT pClient);
295
296int shClSvcClientStateInit(PSHCLCLIENTSTATE pClientState, uint32_t uClientID);
297int shClSvcClientStateDestroy(PSHCLCLIENTSTATE pClientState);
298void shclSvcClientStateReset(PSHCLCLIENTSTATE pClientState);
299
300int shClSvcClientWakeup(PSHCLCLIENT pClient);
301
302# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
303int shClSvcTransferModeSet(uint32_t fMode);
304int shClSvcTransferStart(PSHCLCLIENT pClient, SHCLTRANSFERDIR enmDir, SHCLSOURCE enmSource, PSHCLTRANSFER *ppTransfer);
305int shClSvcTransferStop(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer);
306bool shClSvcTransferMsgIsAllowed(uint32_t uMode, uint32_t uMsg);
307void shClSvcClientTransfersReset(PSHCLCLIENT pClient);
308#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
309
310/** @name Service functions, accessible by the backends.
311 * Locking is between the (host) service thread and the platform-dependent (window) thread.
312 * @{
313 */
314int ShClSvcGuestDataRequest(PSHCLCLIENT pClient, SHCLFORMATS fFormats, PSHCLEVENT *ppEvent);
315int ShClSvcGuestDataSignal(PSHCLCLIENT pClient, PSHCLCLIENTCMDCTX pCmdCtx, SHCLFORMAT uFormat, void *pvData, uint32_t cbData);
316int ShClSvcHostReportFormats(PSHCLCLIENT pClient, SHCLFORMATS fFormats);
317PSHCLBACKEND ShClSvcGetBackend(void);
318uint32_t ShClSvcGetMode(void);
319bool ShClSvcGetHeadless(void);
320bool ShClSvcLock(void);
321void ShClSvcUnlock(void);
322
323/**
324 * Checks if the backend is active (@c true), or if VRDE is in control of
325 * the host side.
326 */
327DECLINLINE(bool) ShClSvcIsBackendActive(void)
328{
329 return g_ExtState.pfnExtension == NULL;
330}
331/** @} */
332
333/** @name Platform-dependent implementations for the Shared Clipboard host service ("backends"),
334 * called *only* by the host service.
335 * @{
336 */
337/**
338 * Structure for keeping Shared Clipboard backend instance data.
339 */
340typedef struct SHCLBACKEND
341{
342 /** Callback table to use.
343 * Some callbacks might be optional and therefore NULL -- see the table for more details. */
344 SHCLCALLBACKS Callbacks;
345} SHCLBACKEND;
346/** Pointer to a Shared Clipboard backend. */
347typedef SHCLBACKEND *PSHCLBACKEND;
348
349/**
350 * Called on initialization.
351 *
352 * @param pBackend Shared Clipboard backend to initialize.
353 * @param pTable The HGCM service call and parameter table. Mainly for
354 * adjusting the limits.
355 */
356int ShClBackendInit(PSHCLBACKEND pBackend, VBOXHGCMSVCFNTABLE *pTable);
357
358/**
359 * Called on destruction.
360 *
361 * @param pBackend Shared Clipboard backend to destroy.
362 */
363void ShClBackendDestroy(PSHCLBACKEND pBackend);
364
365/**
366 * Called when a new HGCM client connects.
367 *
368 * @returns VBox status code.
369 * @param pBackend Shared Clipboard backend to set callbacks for.
370 * @param pCallbacks Backend callbacks to use.
371 * When NULL is specified, the backend's default callbacks are being used.
372 */
373void ShClBackendSetCallbacks(PSHCLBACKEND pBackend, PSHCLCALLBACKS pCallbacks);
374
375/**
376 * Called when a new HGCM client connects.
377 *
378 * @returns VBox status code.
379 * @param pBackend Shared Clipboard backend to connect to.
380 * @param pClient Shared Clipboard client context.
381 * @param fHeadless Whether this is a headless connection or not.
382 */
383int ShClBackendConnect(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, bool fHeadless);
384
385/**
386 * Called when a HGCM client disconnects.
387 *
388 * @returns VBox status code.
389 * @param pBackend Shared Clipboard backend to disconnect from.
390 * @param pClient Shared Clipboard client context.
391 */
392int ShClBackendDisconnect(PSHCLBACKEND pBackend, PSHCLCLIENT pClient);
393
394/**
395 * Called when the guest reports available clipboard formats to the host OS.
396 *
397 * @returns VBox status code.
398 * @param pBackend Shared Clipboard backend to announce formats to.
399 * @param pClient Shared Clipboard client context.
400 * @param fFormats The announced formats from the guest,
401 * VBOX_SHCL_FMT_XXX.
402 */
403int ShClBackendReportFormats(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, SHCLFORMATS fFormats);
404
405/**
406 * Called when the guest wants to read host clipboard data.
407 *
408 * @returns VBox status code.
409 * @param pBackend Shared Clipboard backend to read data from.
410 * @param pClient Shared Clipboard client context.
411 * @param pCmdCtx Shared Clipboard command context.
412 * @param uFormat Clipboard format to read.
413 * @param pvData Where to return the read clipboard data.
414 * @param cbData Size (in bytes) of buffer where to return the clipboard data.
415 * @param pcbActual Where to return the amount of bytes read.
416 *
417 * @todo Document: Can return VINF_HGCM_ASYNC_EXECUTE to defer returning read
418 * data
419 */
420int ShClBackendReadData(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, PSHCLCLIENTCMDCTX pCmdCtx, SHCLFORMAT uFormat,
421 void *pvData, uint32_t cbData, uint32_t *pcbActual);
422
423/**
424 * Called when the guest writes clipboard data to the host.
425 *
426 * @returns VBox status code.
427 * @param pBackend Shared Clipboard backend to write data to.
428 * @param pClient Shared Clipboard client context.
429 * @param pCmdCtx Shared Clipboard command context.
430 * @param uFormat Clipboard format to write.
431 * @param pvData Clipboard data to write.
432 * @param cbData Size (in bytes) of buffer clipboard data to write.
433 */
434int ShClBackendWriteData(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, PSHCLCLIENTCMDCTX pCmdCtx, SHCLFORMAT uFormat, void *pvData, uint32_t cbData);
435
436/**
437 * Called when synchronization of the clipboard contents of the host clipboard with the guest is needed.
438 *
439 * @returns VBox status code.
440 * @param pBackend Shared Clipboard backend to synchronize.
441 * @param pClient Shared Clipboard client context.
442 */
443int ShClBackendSync(PSHCLBACKEND pBackend, PSHCLCLIENT pClient);
444/** @} */
445
446#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
447/** @name Host implementations for Shared Clipboard transfers.
448 * @{
449 */
450/**
451 * Called after a transfer got created.
452 *
453 * @returns VBox status code.
454 * @param pBackend Shared Clipboard backend to use.
455 * @param pClient Shared Clipboard client context.
456 * @param pTransfer Shared Clipboard transfer created.
457 */
458int ShClBackendTransferCreate(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer);
459/**
460 * Called before a transfer gets destroyed.
461 *
462 * @returns VBox status code.
463 * @param pBackend Shared Clipboard backend to use.
464 * @param pClient Shared Clipboard client context.
465 * @param pTransfer Shared Clipboard transfer to destroy.
466 */
467int ShClBackendTransferDestroy(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer);
468/**
469 * Called when getting (determining) the transfer roots on the host side.
470 *
471 * @returns VBox status code.
472 * @param pBackend Shared Clipboard backend to use.
473 * @param pClient Shared Clipboard client context.
474 * @param pTransfer Shared Clipboard transfer to get roots for.
475 */
476int ShClBackendTransferGetRoots(PSHCLBACKEND pBackend, PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer);
477/** @} */
478#endif
479
480#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
481/** @name Internal Shared Clipboard transfer host service functions.
482 * @{
483 */
484int shClSvcTransferHandler(PSHCLCLIENT pClient, VBOXHGCMCALLHANDLE callHandle, uint32_t u32Function,
485 uint32_t cParms, VBOXHGCMSVCPARM paParms[], uint64_t tsArrival);
486int shClSvcTransferHostHandler(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
487/** @} */
488
489/** @name Shared Clipboard transfer interface implementations for the host service.
490 * @{
491 */
492#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP
493
494#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP */
495
496int shClSvcTransferIfaceGetRoots(PSHCLTXPROVIDERCTX pCtx, PSHCLROOTLIST *ppRootList);
497
498int shClSvcTransferIfaceListOpen(PSHCLTXPROVIDERCTX pCtx, PSHCLLISTOPENPARMS pOpenParms, PSHCLLISTHANDLE phList);
499int shClSvcTransferIfaceListClose(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList);
500int shClSvcTransferIfaceListHdrRead(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr);
501int shClSvcTransferIfaceListHdrWrite(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr);
502int shClSvcTransferIfaceListEntryRead(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry);
503int shClSvcTransferIfaceListEntryWrite(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry);
504
505int shClSvcTransferIfaceObjOpen(PSHCLTXPROVIDERCTX pCtx, PSHCLOBJOPENCREATEPARMS pCreateParms,
506 PSHCLOBJHANDLE phObj);
507int shClSvcTransferIfaceObjClose(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj);
508int shClSvcTransferIfaceObjRead(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj,
509 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbRead);
510int shClSvcTransferIfaceObjWrite(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj,
511 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbWritten);
512/** @} */
513
514/** @name Shared Clipboard transfer callbacks for the host service.
515 * @{
516 */
517DECLCALLBACK(void) VBoxSvcClipboardTransferPrepareCallback(PSHCLTXPROVIDERCTX pCtx);
518DECLCALLBACK(void) VBoxSvcClipboardDataHeaderCompleteCallback(PSHCLTXPROVIDERCTX pCtx);
519DECLCALLBACK(void) VBoxSvcClipboardDataCompleteCallback(PSHCLTXPROVIDERCTX pCtx);
520DECLCALLBACK(void) VBoxSvcClipboardTransferCompleteCallback(PSHCLTXPROVIDERCTX pCtx, int rc);
521DECLCALLBACK(void) VBoxSvcClipboardTransferCanceledCallback(PSHCLTXPROVIDERCTX pCtx);
522DECLCALLBACK(void) VBoxSvcClipboardTransferErrorCallback(PSHCLTXPROVIDERCTX pCtx, int rc);
523/** @} */
524#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
525
526/* Host unit testing interface */
527#ifdef UNIT_TEST
528uint32_t TestClipSvcGetMode(void);
529#endif
530
531#endif /* !VBOX_INCLUDED_SRC_SharedClipboard_VBoxSharedClipboardSvc_internal_h */
532
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette