VirtualBox

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

Last change on this file since 94490 was 93919, checked in by vboxsync, 3 years ago

Shared Clipboard: Resolved a @todo (renamed ShClBackendFormatAnnounce -> ShClBackendReportFormats).

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