VirtualBox

source: vbox/trunk/include/VBox/GuestHost/DragAndDrop.h@ 104338

Last change on this file since 104338 was 98103, checked in by vboxsync, 22 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.0 KB
Line 
1/* $Id: DragAndDrop.h 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * DnD - Shared functions between host and guest.
4 */
5
6/*
7 * Copyright (C) 2014-2023 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 * The contents of this file may alternatively be used under the terms
26 * of the Common Development and Distribution License Version 1.0
27 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28 * in the VirtualBox distribution, in which case the provisions of the
29 * CDDL are applicable instead of those of the GPL.
30 *
31 * You may elect to license modified versions of this file under the
32 * terms and conditions of either the GPL or the CDDL or both.
33 *
34 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35 */
36
37#ifndef VBOX_INCLUDED_GuestHost_DragAndDrop_h
38#define VBOX_INCLUDED_GuestHost_DragAndDrop_h
39#ifndef RT_WITHOUT_PRAGMA_ONCE
40# pragma once
41#endif
42
43#include <iprt/assert.h>
44#include <iprt/fs.h>
45#include <iprt/list.h>
46
47#include <VBox/GuestHost/DragAndDropDefs.h>
48
49/** DnDURIDroppedFiles flags. */
50typedef uint32_t DNDURIDROPPEDFILEFLAGS;
51
52/** No flags specified. */
53#define DNDURIDROPPEDFILE_FLAGS_NONE 0
54
55/**
56 * Structure for keeping a DnD dropped files entry.
57 */
58typedef struct DNDDROPPEDFILESENTRY
59{
60 RTLISTNODE Node;
61 char *pszPath;
62} DNDDROPPEDFILESENTRY;
63/** Pointer to a DnD dropped files entry. */
64typedef DNDDROPPEDFILESENTRY *PDNDDROPPEDFILESENTRY;
65
66/**
67 * Structure for maintaining a "dropped files" directory
68 * on the host or guest. This will contain all received files & directories
69 * for a single drag and drop operation.
70 *
71 * In case of a failed drag and drop operation this can also
72 * perform a gentle rollback if required.
73 */
74typedef struct DNDDROPPEDFILES
75{
76 /** Open flags. */
77 uint32_t m_fOpen;
78 /** Directory handle for drop directory. */
79 RTDIR m_hDir;
80 /** Absolute path to drop directory. */
81 char *pszPathAbs;
82 /** List for holding created directories in the case of a rollback. */
83 RTLISTANCHOR m_lstDirs;
84 /** List for holding created files in the case of a rollback. */
85 RTLISTANCHOR m_lstFiles;
86} DNDDROPPEDFILES;
87/** Pointer to a DnD dropped files directory. */
88typedef DNDDROPPEDFILES *PDNDDROPPEDFILES;
89
90int DnDDroppedFilesInit(PDNDDROPPEDFILES pDF);
91int DnDDroppedFilesInitEx(PDNDDROPPEDFILES pDF, const char *pszPath, DNDURIDROPPEDFILEFLAGS fFlags);
92void DnDDroppedFilesDestroy(PDNDDROPPEDFILES pDF);
93int DnDDroppedFilesAddFile(PDNDDROPPEDFILES pDF, const char *pszFile);
94int DnDDroppedFilesAddDir(PDNDDROPPEDFILES pDF, const char *pszDir);
95int DnDDroppedFilesClose(PDNDDROPPEDFILES pDF);
96bool DnDDroppedFilesIsOpen(PDNDDROPPEDFILES pDF);
97int DnDDroppedFilesOpenEx(PDNDDROPPEDFILES pDF, const char *pszPath, DNDURIDROPPEDFILEFLAGS fFlags);
98int DnDDroppedFilesOpenTemp(PDNDDROPPEDFILES pDF, DNDURIDROPPEDFILEFLAGS fFlags);
99const char *DnDDroppedFilesGetDirAbs(PDNDDROPPEDFILES pDF);
100int DnDDroppedFilesReopen(PDNDDROPPEDFILES pDF);
101int DnDDroppedFilesReset(PDNDDROPPEDFILES pDF, bool fDelete);
102int DnDDroppedFilesRollback(PDNDDROPPEDFILES pDF);
103
104const char *DnDHostMsgToStr(uint32_t uMsg);
105const char *DnDGuestMsgToStr(uint32_t uMsg);
106const char *DnDActionToStr(VBOXDNDACTION uAction);
107 char *DnDActionListToStrA(VBOXDNDACTIONLIST fActionList);
108const char *DnDStateToStr(VBOXDNDSTATE enmState);
109
110bool DnDMIMEHasFileURLs(const char *pcszFormat, size_t cchFormatMax);
111bool DnDMIMENeedsDropDir(const char *pcszFormat, size_t cchFormatMax);
112
113int DnDPathValidate(const char *pcszPath, bool fMustExist);
114
115/** DnD path conversion flags. */
116typedef uint32_t DNDPATHCONVERTFLAGS;
117
118/** No flags specified.
119 * This will convert the path to the universal tansport style. */
120#define DNDPATHCONVERT_FLAGS_TRANSPORT 0
121/** Converts the path to a OS-dependent path. */
122#define DNDPATHCONVERT_FLAGS_TO_DOS RT_BIT(0)
123
124/** Mask of all valid DnD path conversion flags. */
125#define DNDPATHCONVERT_FLAGS_VALID_MASK UINT32_C(0x1)
126
127int DnDPathConvert(char *pszPath, size_t cbPath, DNDPATHCONVERTFLAGS fFlags);
128int DnDPathSanitizeFileName(char *pszPath, size_t cbPath);
129int DnDPathRebase(const char *pcszPathAbs, const char *pcszBaseOld, const char *pcszBaseNew, char **ppszPath);
130
131/** DnDTransferObject flags. */
132typedef uint32_t DNDTRANSFEROBJECTFLAGS;
133
134/** No flags specified. */
135#define DNDTRANSFEROBJECT_FLAGS_NONE 0
136
137/** Mask of all valid DnD transfer object flags. */
138#define DNDTRANSFEROBJECT_FLAGS_VALID_MASK UINT32_C(0x0)
139
140/**
141 * Enumeration for specifying a transfer object type.
142 */
143typedef enum DNDTRANSFEROBJTYPE
144{
145 /** Unknown type, do not use. */
146 DNDTRANSFEROBJTYPE_UNKNOWN = 0,
147 /** Object is a file. */
148 DNDTRANSFEROBJTYPE_FILE,
149 /** Object is a directory. */
150 DNDTRANSFEROBJTYPE_DIRECTORY,
151 /** The usual 32-bit hack. */
152 DNDTRANSFEROBJTYPE_32BIT_HACK = 0x7fffffff
153} DNDTRANSFEROBJTYPE;
154
155/**
156 * Enumeration for specifying a path style.
157 */
158typedef enum DNDTRANSFEROBJPATHSTYLE
159{
160 /** Transport style (UNIX-y), the default. */
161 DNDTRANSFEROBJPATHSTYLE_TRANSPORT = 0,
162 /** DOS style, containing back slashes. */
163 DNDTRANSFEROBJPATHSTYLE_DOS,
164 /** The usual 32-bit hack. */
165 DNDTRANSFEROBJPATHSTYLE_32BIT_HACK = 0x7fffffff
166} DNDTRANSFEROBJPATHSTYLE;
167
168/**
169 * Structure for keeping a DnD transfer object.
170 */
171typedef struct DNDTRANSFEROBJECT
172{
173 RTLISTNODE Node;
174 /** The object's type. */
175 DNDTRANSFEROBJTYPE enmType;
176 /** Index (in characters, UTF-8) at which the first destination segment starts. */
177 uint16_t idxDst;
178 /** Allocated path. Includdes the absolute source path (if any) + destination segments.
179 * Transport (IPRT) style. */
180 char *pszPath;
181
182 /** Union containing data depending on the object's type. */
183 union
184 {
185 /** Structure containing members for objects that
186 * are files. */
187 struct
188 {
189 /** File handle. */
190 RTFILE hFile;
191 /** File system object information of this file. */
192 RTFSOBJINFO objInfo;
193 /** Bytes to proces for reading/writing. */
194 uint64_t cbToProcess;
195 /** Bytes processed reading/writing. */
196 uint64_t cbProcessed;
197 } File;
198 struct
199 {
200 /** Directory handle. */
201 RTDIR hDir;
202 /** File system object information of this directory. */
203 RTFSOBJINFO objInfo;
204 } Dir;
205 } u;
206} DNDTRANSFEROBJECT;
207/** Pointer to a DnD transfer object. */
208typedef DNDTRANSFEROBJECT *PDNDTRANSFEROBJECT;
209
210int DnDTransferObjectInit(PDNDTRANSFEROBJECT pObj);
211int DnDTransferObjectInitEx(PDNDTRANSFEROBJECT pObj, DNDTRANSFEROBJTYPE enmType, const char *pcszPathSrcAbs, const char *pcszPathDst);
212void DnDTransferObjectDestroy(PDNDTRANSFEROBJECT pObj);
213int DnDTransferObjectClose(PDNDTRANSFEROBJECT pObj);
214void DnDTransferObjectReset(PDNDTRANSFEROBJECT pObj);
215const char *DnDTransferObjectGetSourcePath(PDNDTRANSFEROBJECT pObj);
216const char *DnDTransferObjectGetDestPath(PDNDTRANSFEROBJECT pObj);
217int DnDTransferObjectGetDestPathEx(PDNDTRANSFEROBJECT pObj, DNDTRANSFEROBJPATHSTYLE enmStyle, char *pszBuf, size_t cbBuf);
218RTFMODE DnDTransferObjectGetMode(PDNDTRANSFEROBJECT pObj);
219uint64_t DnDTransferObjectGetProcessed(PDNDTRANSFEROBJECT pObj);
220uint64_t DnDTransferObjectGetSize(PDNDTRANSFEROBJECT pObj);
221DNDTRANSFEROBJTYPE DnDTransferObjectGetType(PDNDTRANSFEROBJECT pObj);
222int DnDTransferObjectSetSize(PDNDTRANSFEROBJECT pObj, uint64_t cbSize);
223bool DnDTransferObjectIsComplete(PDNDTRANSFEROBJECT pObj);
224bool DnDTransferObjectIsOpen(PDNDTRANSFEROBJECT pObj);
225int DnDTransferObjectOpen(PDNDTRANSFEROBJECT pObj, uint64_t fOpen, RTFMODE fMode, DNDTRANSFEROBJECTFLAGS fFlags);
226int DnDTransferObjectQueryInfo(PDNDTRANSFEROBJECT pObj);
227int DnDTransferObjectRead(PDNDTRANSFEROBJECT pObj, void *pvBuf, size_t cbBuf, uint32_t *pcbRead);
228int DnDTransferObjectWrite(PDNDTRANSFEROBJECT pObj, const void *pvBuf, size_t cbBuf, uint32_t *pcbWritten);
229
230/** Defines the default chunk size of DnD data transfers.
231 * Supported on all (older) Guest Additions which also support DnD. */
232#define DND_DEFAULT_CHUNK_SIZE _64K
233
234/** Separator for a formats list. */
235#define DND_FORMATS_SEPARATOR_STR "\r\n"
236
237/** Default URI list path separator, if not specified otherwise.
238 *
239 * This is there for hysterical raisins, to not break older Guest Additions.
240 ** @todo Get rid of this. */
241#define DND_PATH_SEPARATOR_STR "\r\n"
242
243/** DnDTransferList flags. */
244typedef uint32_t DNDTRANSFERLISTFLAGS;
245
246/** No flags specified. */
247#define DNDTRANSFERLIST_FLAGS_NONE 0
248/** Enables recurisve directory handling. */
249#define DNDTRANSFERLIST_FLAGS_RECURSIVE RT_BIT(0)
250/** Resolve all symlinks. Currently not supported and will be ignored. */
251#define DNDTRANSFERLIST_FLAGS_RESOLVE_SYMLINKS RT_BIT(1)
252/** Keep the files + directory entries open while
253 * being in this list. */
254#define DNDTRANSFERLIST_FLAGS_KEEP_OPEN RT_BIT(2)
255/** Lazy loading: Only enumerate sub directories when needed. Not implemented yet.
256 ** @todo Implement lazy loading. */
257#define DNDTRANSFERLIST_FLAGS_LAZY RT_BIT(3)
258
259/** Mask of all valid DnD transfer list flags. */
260#define DNDTRANSFERLIST_FLAGS_VALID_MASK UINT32_C(0xF)
261
262/**
263 * Enumeration for specifying a transfer list format.
264 */
265typedef enum DNDTRANSFERLISTFMT
266{
267 /** Unknown format, do not use. */
268 DNDTRANSFERLISTFMT_UNKNOWN = 0,
269 /** Native format. */
270 DNDTRANSFERLISTFMT_NATIVE,
271 /** URI format. */
272 DNDTRANSFERLISTFMT_URI,
273 /** The usual 32-bit hack. */
274 DNDTRANSFERLISTFMT_32BIT_HACK = 0x7fffffff
275} DNDTRANSFERLISTFMT;
276
277/**
278 * Structure for keeping a DnD transfer list root entry.
279 *
280 * A root entry always is relative to the parent list maintaining it.
281 */
282typedef struct DNDTRANSFERLISTROOT
283{
284 /** List node. */
285 RTLISTNODE Node;
286 /** Pointer to the allocated root path.
287 * - Relative to the list's root path
288 * - Always ends with a trailing slash
289 * - Always stored in transport style (UNIX-y). */
290 char *pszPathRoot;
291} DNDTRANSFERLISTROOT;
292/** Pointer to a DnD list root entry. */
293typedef DNDTRANSFERLISTROOT *PDNDTRANSFERLISTROOT;
294
295/**
296 * Struct for keeping a DnD transfer list.
297 *
298 * All entries must share a common (absolute) root path. For different root paths another transfer list is needed.
299 */
300typedef struct DNDTRANSFERLIST
301{
302 /** Absolute root path of this transfer list, in native path style.
303 * Always ends with a separator. */
304 char *pszPathRootAbs;
305 /** List of all relative (to \a pszPathRootAbs) top-level file/directory entries, of type DNDTRANSFERLISTROOT.
306 * Note: All paths are stored internally in transport style (UNIX paths) for
307 * easier conversion/handling! */
308 RTLISTANCHOR lstRoot;
309 /** Total number of all transfer root entries. */
310 uint64_t cRoots;
311 /** List of all transfer objects added, of type DNDTRANSFEROBJECT.
312 *
313 * The order of objects being added is crucial for traversing the tree.
314 * In other words, sub directories must come first before its contents. */
315 RTLISTANCHOR lstObj;
316 /** Total number of all transfer objects. */
317 uint64_t cObj;
318 /** Total size of all transfer objects, that is, the file
319 * size of all objects (in bytes).
320 * Note: Do *not* size_t here, as we also want to support large files
321 * on 32-bit guests. */
322 uint64_t cbObjTotal;
323} DNDTRANSFERLIST;
324/** Pointer to a DNDTRANSFERLIST struct. */
325typedef DNDTRANSFERLIST *PDNDTRANSFERLIST;
326
327int DnDTransferListInit(PDNDTRANSFERLIST pList);
328int DnDTransferListInitEx(PDNDTRANSFERLIST pList, const char *pcszRootPathAbs, DNDTRANSFERLISTFMT enmFmt);
329void DnDTransferListDestroy(PDNDTRANSFERLIST pList);
330void DnDTransferListReset(PDNDTRANSFERLIST pList);
331
332int DnDTransferListAppendPath(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, const char *pszPath, DNDTRANSFERLISTFLAGS fFlags);
333int DnDTransferListAppendPathsFromBuffer(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, const char *pszPaths, size_t cbPaths, const char *pcszSeparator, DNDTRANSFERLISTFLAGS fFlags);
334int DnDTransferListAppendPathsFromArray(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, const char * const *papcszPaths, size_t cPaths, DNDTRANSFERLISTFLAGS fFlags);
335int DnDTransferListAppendRootsFromBuffer(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, const char *pszPaths, size_t cbPaths, const char *pcszSeparator, DNDTRANSFERLISTFLAGS fFlags);
336int DnDTransferListAppendRootsFromArray(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, const char * const *papcszPaths, size_t cPaths, DNDTRANSFERLISTFLAGS fFlags);
337
338int DnDTransferListGetRootsEx(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, const char *pcszPathBase, const char *pcszSeparator, char **ppszBuffer, size_t *pcbBuffer);
339int DnDTransferListGetRoots(PDNDTRANSFERLIST pList, DNDTRANSFERLISTFMT enmFmt, char **ppszBuffer, size_t *pcbBuffer);
340uint64_t DnDTransferListGetRootCount(PDNDTRANSFERLIST pList);
341const char *DnDTransferListGetRootPathAbs(PDNDTRANSFERLIST pList);
342
343PDNDTRANSFEROBJECT DnDTransferListObjGetFirst(PDNDTRANSFERLIST pList);
344void DnDTransferListObjRemove(PDNDTRANSFERLIST pList, PDNDTRANSFEROBJECT pObj);
345void DnDTransferListObjRemoveFirst(PDNDTRANSFERLIST pList);
346uint64_t DnDTransferListObjCount(PDNDTRANSFERLIST pList);
347uint64_t DnDTransferListObjTotalBytes(PDNDTRANSFERLIST pList);
348
349#endif /* !VBOX_INCLUDED_GuestHost_DragAndDrop_h */
350
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