VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp@ 79563

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

Shared Clipboard/URI: Update.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id Revision
檔案大小: 7.6 KB
 
1/* $Id: VBoxSharedClipboardSvc-utils.cpp 79497 2019-07-03 13:28:33Z vboxsync $ */
2/** @file
3 * Shared Clipboard Service - Host service utility functions.
4 */
5
6/*
7 * Copyright (C) 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
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_SHARED_CLIPBOARD
23#include <VBox/log.h>
24
25#include <VBox/HostServices/VBoxClipboardSvc.h>
26#include <VBox/HostServices/VBoxClipboardExt.h>
27
28#include <iprt/errcore.h>
29#include <iprt/path.h>
30
31#include "VBoxSharedClipboardSvc-internal.h"
32
33
34#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
35/**
36 * Returns whether a HGCM message is allowed in a certain service mode or not.
37 *
38 * @returns \c true if message is allowed, \c false if not.
39 * @param uMode Service mode to check allowance for.
40 * @param uMsg HGCM message to check allowance for.
41 */
42bool vboxSvcClipboardURIMsgIsAllowed(uint32_t uMode, uint32_t uMsg)
43{
44 const bool fHostToGuest = uMode == VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST
45 || uMode == VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL;
46
47 const bool fGuestToHost = uMode == VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST
48 || uMode == VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL;
49
50 bool fAllowed = false; /* If in doubt, don't allow. */
51
52 switch (uMsg)
53 {
54 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN:
55 RT_FALL_THROUGH();
56 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE:
57 RT_FALL_THROUGH();
58 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ:
59 RT_FALL_THROUGH();
60 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ:
61 RT_FALL_THROUGH();
62 case VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_OPEN:
63 RT_FALL_THROUGH();
64 case VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_CLOSE:
65 RT_FALL_THROUGH();
66 case VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_READ:
67 fAllowed = fHostToGuest;
68 break;
69
70 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE:
71 RT_FALL_THROUGH();
72 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE:
73 RT_FALL_THROUGH();
74 case VBOX_SHARED_CLIPBOARD_GUEST_FN_OBJ_WRITE:
75 fAllowed = fGuestToHost;
76 break;
77
78 case VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT:
79 RT_FALL_THROUGH();
80 case VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG:
81 RT_FALL_THROUGH();
82 case VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL:
83 RT_FALL_THROUGH();
84 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR:
85 fAllowed = fHostToGuest || fGuestToHost;
86 break;
87
88 default:
89 break;
90 }
91
92 LogFlowFunc(("uMsg=%RU32, uMode=%RU32 -> fAllowed=%RTbool\n", uMsg, uMode, fAllowed));
93 return fAllowed;
94}
95
96int vboxSvcClipboardURIReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uParm)
97{
98 AssertPtrReturn(pClientData, VERR_INVALID_POINTER);
99
100 int rc = VINF_SUCCESS;
101
102 switch (uMsg)
103 {
104 case VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START:
105 {
106 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START\n"));
107
108 if ( vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST
109 && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL)
110 {
111 LogFlowFunc(("Wrong clipboard mode, skipping\n"));
112 break;
113 }
114
115 pClientData->State.URI.fTransferStart = true;
116 pClientData->State.URI.enmTransferDir = (SHAREDCLIPBOARDURITRANSFERDIR)uParm;
117 break;
118
119 }
120
121 default:
122 AssertMsgFailed(("Invalid message %RU32\n", uMsg));
123 rc = VERR_INVALID_PARAMETER;
124 break;
125 }
126
127 LogFlowFuncLeaveRC(rc);
128 return rc;
129}
130
131bool vboxSvcClipboardURIReturnMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
132{
133 RT_NOREF(pClientData, cParms, paParms);
134
135 bool fHandled = false;
136
137 if ( pClientData->State.URI.fTransferStart
138 && cParms >= 2)
139 {
140 HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START);
141 HGCMSvcSetU32(&paParms[1], pClientData->State.URI.enmTransferDir);
142 pClientData->State.URI.fTransferStart = false;
143
144 fHandled = true;
145 }
146
147#if 1
148 int rc = 0;
149#else
150 /* Sanity. */
151 Assert(pTransfer->State.enmDir == SHAREDCLIPBOARDURITRANSFERDIR_READ);
152
153 int rc;
154
155 /* Note: Message priority / order is taken into account here. */
156 if (pTransfer->State.pHeader)
157 {
158 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR\n"));
159 rc = VBoxSvcClipboardURIWriteListHdr(cParms, paParms, pTransfer->State.pHeader);
160 if (RT_SUCCESS(rc))
161 {
162 /* We're done witht the data header, destroy it. */
163 SharedClipboardURIListHdrFree(pTransfer->State.pHeader);
164 pTransfer->State.pHeader = NULL;
165
166 fHandled = true;
167 }
168 }
169 else if (pTransfer->State.pMeta)
170 {
171 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK\n"));
172
173 uint32_t cbBuf = _64K;
174 uint8_t pvBuf[_64K]; /** @todo Improve */
175
176 uint32_t cbRead;
177 rc = SharedClipboardMetaDataRead(pTransfer->State.pMeta, pvBuf, cbBuf, &cbRead);
178 if (RT_SUCCESS(rc))
179 {
180 Assert(cbRead <= cbBuf);
181
182 VBOXCLIPBOARDListEntry ListEntry;
183 RT_ZERO(ListEntry);
184 ListEntry.pvData = pvBuf;
185 ListEntry.cbData = cbRead;
186
187 rc = VBoxSvcClipboardURIWriteListEntry(cParms, paParms, &ListEntry);
188 }
189
190 /* Has all meta data been read? */
191 if (RT_SUCCESS(rc))
192 {
193 if (SharedClipboardMetaDataGetUsed(pTransfer->State.pMeta) == 0)
194 {
195 SharedClipboardMetaDataFree(pTransfer->State.pMeta);
196 pTransfer->State.pMeta = NULL;
197 }
198
199 fHandled = true;
200 }
201 }
202 else if (pTransfer->pURIList)
203 {
204 PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx = SharedClipboardURITransferGetCurrentObjCtx(pTransfer);
205 if (!SharedClipboardURIObjCtxIsValid(pObjCtx))
206 {
207 if (!pTransfer->pURIList->IsEmpty())
208 pObjCtx->pObj = pTransfer->pURIList->First();
209 }
210
211 if ( pObjCtx
212 && pObjCtx->pObj)
213 {
214 switch (pObjCtx->pObj->GetType())
215 {
216 case SharedClipboardURIObject::Type_Directory:
217 {
218 rc = VBoxSvcClipboardURIWriteDir(cParms, paParms, &ListEntry);
219 break;
220 }
221 }
222 }
223
224 if (0)
225 {
226 delete pTransfer->pURIList;
227 pTransfer->pURIList = NULL;
228 }
229
230 fHandled = true;
231 }
232 else
233 rc = VERR_WRONG_ORDER;
234#endif
235
236 LogFlowFunc(("rc=%Rrc, fHandled=%RTbool\n", rc, fHandled));
237 return fHandled;
238}
239#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
240
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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