VirtualBox

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

最後變更 在這個檔案從79563是 79503,由 vboxsync 提交於 6 年 前

Shared Clipboard/URI: Mac build fix.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 11.3 KB
 
1/* $Id: VBoxSharedClipboardSvc-internal.h 79503 2019-07-03 14:05:53Z vboxsync $ */
2/** @file
3 * Shared Clipboard Service - Internal header.
4 */
5
6/*
7 * Copyright (C) 2006-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.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/list.h>
29#include <iprt/cpp/list.h> /* For RTCList. */
30
31#include <VBox/hgcmsvc.h>
32#include <VBox/log.h>
33
34#include <VBox/HostServices/Service.h>
35#include <VBox/GuestHost/SharedClipboard.h>
36#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
37# include <iprt/semaphore.h>
38# include <VBox/GuestHost/SharedClipboard-uri.h>
39#endif
40
41using namespace HGCM;
42
43#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
44/**
45 * Structure for handling a single URI object context.
46 */
47typedef struct _VBOXCLIPBOARDCLIENTURIOBJCTX
48{
49 /** Pointer to current object being processed. */
50 SharedClipboardURIObject *pObj;
51} VBOXCLIPBOARDCLIENTURIOBJCTX, *PVBOXCLIPBOARDCLIENTURIOBJCTX;
52
53struct VBOXCLIPBOARDCLIENTSTATE;
54#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
55
56typedef struct _VBOXCLIPBOARDCLIENTMSG
57{
58 /** Stored message type. */
59 uint32_t m_uMsg;
60 /** Number of stored HGCM parameters. */
61 uint32_t m_cParms;
62 /** Stored HGCM parameters. */
63 PVBOXHGCMSVCPARM m_paParms;
64} VBOXCLIPBOARDCLIENTMSG, *PVBOXCLIPBOARDCLIENTMSG;
65
66#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
67typedef struct VBOXCLIPBOARDCLIENTURISTATE
68{
69 /** Whether to start a new transfer. */
70 bool fTransferStart;
71 /** Directory of the transfer to start. */
72 SHAREDCLIPBOARDURITRANSFERDIR enmTransferDir;
73} VBOXCLIPBOARDCLIENTURISTATE, *PVBOXCLIPBOARDCLIENTURISTATE;
74#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
75
76/**
77 * Structure for keeping generic client state data within the Shared Clipboard host service.
78 * This structure needs to be serializable by SSM (must be a POD type).
79 */
80typedef struct VBOXCLIPBOARDCLIENTSTATE
81{
82 struct VBOXCLIPBOARDCLIENTSTATE *pNext;
83 struct VBOXCLIPBOARDCLIENTSTATE *pPrev;
84
85 VBOXCLIPBOARDCONTEXT *pCtx;
86
87 uint32_t u32ClientID;
88
89 SHAREDCLIPBOARDSOURCE enmSource;
90
91 /** The guest is waiting for a message. */
92 bool fAsync;
93 /** The guest is waiting for data from the host */
94 bool fReadPending;
95 /** Whether the host host has sent a quit message. */
96 bool fHostMsgQuit;
97 /** Whether the host host has requested reading clipboard data from the guest. */
98 bool fHostMsgReadData;
99 /** Whether the host host has reported its available formats. */
100 bool fHostMsgFormats;
101
102#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
103 /** The client's URI state. */
104 VBOXCLIPBOARDCLIENTURISTATE URI;
105#endif
106
107 struct {
108 VBOXHGCMCALLHANDLE callHandle;
109 uint32_t cParms;
110 VBOXHGCMSVCPARM *paParms;
111 } async;
112
113 struct {
114 VBOXHGCMCALLHANDLE callHandle;
115 uint32_t cParms;
116 VBOXHGCMSVCPARM *paParms;
117 } asyncRead;
118
119 struct {
120 void *pv;
121 uint32_t cb;
122 uint32_t u32Format;
123 } data;
124
125 uint32_t u32AvailableFormats;
126 uint32_t u32RequestedFormat;
127} VBOXCLIPBOARDCLIENTSTATE, *PVBOXCLIPBOARDCLIENTSTATE;
128
129/**
130 * Structure for keeping a HGCM client state within the Shared Clipboard host service.
131 */
132typedef struct _VBOXCLIPBOARDCLIENTDATA
133{
134 /** General client state data. */
135 VBOXCLIPBOARDCLIENTSTATE State;
136 /** The client's message queue (FIFO). */
137 RTCList<VBOXCLIPBOARDCLIENTMSG *> queueMsg;
138#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
139 /** URI context data. */
140 SHAREDCLIPBOARDURICTX URI;
141#endif
142} VBOXCLIPBOARDCLIENTDATA, *PVBOXCLIPBOARDCLIENTDATA;
143
144typedef struct _VBOXCLIPBOARDCLIENT
145{
146 /** The client's HGCM client ID. */
147 uint32_t uClientID;
148 /** Pointer to the client'data, owned by HGCM. */
149 PVBOXCLIPBOARDCLIENTDATA pData;
150 /** Optional protocol version the client uses. Set to 0 by default. */
151 uint32_t uProtocolVer;
152 /** Flag indicating whether this client currently is deferred mode,
153 * meaning that it did not return to the caller yet. */
154 bool fDeferred;
155 /** Structure for keeping the client's deferred state.
156 * A client is in a deferred state when it asks for the next HGCM message,
157 * but the service can't provide it yet. That way a client will block (on the guest side, does not return)
158 * until the service can complete the call. */
159 struct
160 {
161 /** The client's HGCM call handle. Needed for completing a deferred call. */
162 VBOXHGCMCALLHANDLE hHandle;
163 /** Message type (function number) to use when completing the deferred call. */
164 uint32_t uType;
165 /** Parameter count to use when completing the deferred call. */
166 uint32_t cParms;
167 /** Parameters to use when completing the deferred call. */
168 PVBOXHGCMSVCPARM paParms;
169 } Deferred;
170} VBOXCLIPBOARDCLIENT, *PVBOXCLIPBOARDCLIENT;
171
172/** Map holding pointers to drag and drop clients. Key is the (unique) HGCM client ID. */
173typedef std::map<uint32_t, VBOXCLIPBOARDCLIENT *> ClipboardClientMap;
174
175/** Simple queue (list) which holds deferred (waiting) clients. */
176typedef std::list<uint32_t> ClipboardClientQueue;
177
178/*
179 * The service functions. Locking is between the service thread and the platform-dependent (window) thread.
180 */
181int vboxSvcClipboardCompleteReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, int rc, uint32_t cbActual);
182uint32_t vboxSvcClipboardGetMode(void);
183int vboxSvcClipboardReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uFormats);
184int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENTDATA pClientData, SHAREDCLIPBOARDSOURCE enmSource);
185
186int vboxSvcClipboardClientDefer(PVBOXCLIPBOARDCLIENT pClient,
187 VBOXHGCMCALLHANDLE hHandle, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
188int vboxSvcClipboardClientComplete(PVBOXCLIPBOARDCLIENT pClient, VBOXHGCMCALLHANDLE hHandle, int rc);
189int vboxSvcClipboardClientDeferredComplete(PVBOXCLIPBOARDCLIENT pClient, int rc);
190int vboxSvcClipboardClientDeferredSetMsgInfo(PVBOXCLIPBOARDCLIENT pClient, uint32_t uMsg, uint32_t cParms);
191
192void vboxSvcClipboardMsgQueueReset(PVBOXCLIPBOARDCLIENTDATA pClientData);
193PVBOXCLIPBOARDCLIENTMSG vboxSvcClipboardMsgAlloc(uint32_t uMsg, uint32_t cParms);
194void vboxSvcClipboardMsgFree(PVBOXCLIPBOARDCLIENTMSG pMsg);
195int vboxSvcClipboardMsgAdd(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDCLIENTMSG pMsg, bool fAppend);
196int vboxSvcClipboardMsgGetNextInfo(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t *puType, uint32_t *pcParms);
197int vboxSvcClipboardMsgGetNext(PVBOXCLIPBOARDCLIENTDATA pClientData,
198 uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
199
200# ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
201bool vboxSvcClipboardURIMsgIsAllowed(uint32_t uMode, uint32_t uMsg);
202int vboxSvcClipboardURIReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Msg, uint32_t u32Formats);
203bool vboxSvcClipboardURIReturnMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
204# endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
205
206/*
207 * Platform-dependent implementations.
208 */
209int VBoxClipboardSvcImplInit(void);
210void VBoxClipboardSvcImplDestroy(void);
211
212int VBoxClipboardSvcImplConnect(PVBOXCLIPBOARDCLIENTDATA pClientData, bool fHeadless);
213int VBoxClipboardSvcImplDisconnect(PVBOXCLIPBOARDCLIENTDATA pClientData);
214int VBoxClipboardSvcImplFormatAnnounce(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Formats);
215int VBoxClipboardSvcImplReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t u32Format, void *pv, uint32_t cb, uint32_t *pcbActual);
216int VBoxClipboardSvcImplWriteData(PVBOXCLIPBOARDCLIENTDATA pClientData, void *pv, uint32_t cb, uint32_t u32Format);
217/**
218 * Synchronise the contents of the host clipboard with the guest, called by the HGCM layer
219 * after a save and restore of the guest.
220 */
221int VBoxClipboardSvcImplSync(PVBOXCLIPBOARDCLIENTDATA pClientData);
222
223#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
224int vboxSvcClipboardURITransferOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx);
225int vboxSvcClipboardURITransferClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx);
226
227int vboxSvcClipboardURIListOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
228 PVBOXCLIPBOARDLISTHDR pListHdr, PVBOXCLIPBOARDLISTHANDLE phList);
229int vboxSvcClipboardURIListClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList);
230int vboxSvcClipboardURIListHdrRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList,
231 PVBOXCLIPBOARDLISTHDR pListHdr);
232int vboxSvcClipboardURIListHdrWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList,
233 PVBOXCLIPBOARDLISTHDR pListHdr);
234int vboxSvcClipboardURIListEntryRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList,
235 PVBOXCLIPBOARDLISTENTRY pListEntry);
236int vboxSvcClipboardURIListEntryWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList,
237 PVBOXCLIPBOARDLISTENTRY pListEntry);
238
239int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const char *pszPath,
240 PVBOXCLIPBOARDCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj);
241int vboxSvcClipboardURIObjClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj);
242int vboxSvcClipboardURIObjRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj,
243 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbRead);
244int vboxSvcClipboardURIObjWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj,
245 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbWritten);
246
247DECLCALLBACK(void) VBoxSvcClipboardURITransferPrepareCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData);
248DECLCALLBACK(void) VBoxSvcClipboardURIDataHeaderCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData);
249DECLCALLBACK(void) VBoxSvcClipboardURIDataCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData);
250DECLCALLBACK(void) VBoxSvcClipboardURITransferCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData, int rc);
251DECLCALLBACK(void) VBoxSvcClipboardURITransferCanceledCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData);
252DECLCALLBACK(void) VBoxSvcClipboardURITransferErrorCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData, int rc);
253
254int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENTDATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer);
255int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENTDATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer);
256#endif
257
258/* Host unit testing interface */
259#ifdef UNIT_TEST
260uint32_t TestClipSvcGetMode(void);
261#endif
262
263#endif /* !VBOX_INCLUDED_SRC_SharedClipboard_VBoxSharedClipboardSvc_internal_h */
264
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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