VBoxGuestR3LibDragAndDrop.cpp revision ebcdaa5077bc9189c419330b1c84880018e3db99
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/* $Id$ */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @file
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions, Drag & Drop.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*
be41e59f051a3abb5cd05e7fe270ab2fea791f5avboxsync * Copyright (C) 2011-2013 Oracle Corporation
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * The contents of this file may alternatively be used under the terms
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * of the Common Development and Distribution License Version 1.0
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * VirtualBox OSE distribution, in which case the provisions of the
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * CDDL are applicable instead of those of the GPL.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
cd6f71bc352f550074f1ba2c830a2cf2f0b3dd46vboxsync * You may elect to license modified versions of this file under the
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync * terms and conditions of either the GPL or the CDDL or both.
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync */
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync* Header Files *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync*******************************************************************************/
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/path.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/dir.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/file.h>
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#include <iprt/uri.h>
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync#include <iprt/thread.h>
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync#include <iprt/cpp/list.h>
b0b15690f00527424b2d5fb88456d747252322f7vboxsync#include <iprt/cpp/ministring.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
efff36b306e370346025647a158689021df2e1d1vboxsync#ifdef LOG_GROUP
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync #undef LOG_GROUP
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#endif
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync#define LOG_GROUP LOG_GROUP_GUEST_DND
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <VBox/log.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <VBox/GuestHost/DragAndDrop.h>
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync#include <VBox/HostServices/DragAndDropSvc.h>
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync#include "VBGLR3Internal.h"
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync
efff36b306e370346025647a158689021df2e1d1vboxsync/* Here all the communication with the host over HGCM is handled platform
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * neutral. Also the receiving of URIs content (directory trees and files) is
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync * done here. So the platform code of the guests, should not take care of that.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
efff36b306e370346025647a158689021df2e1d1vboxsync * Todo:
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync * - Sending dirs/files in the G->H case
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync * - Maybe the EOL converting of text MIME types (not fully sure, eventually
efff36b306e370346025647a158689021df2e1d1vboxsync * better done on the host side)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Private internal functions *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync ******************************************************************************/
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsyncstatic int vbglR3DnDQueryNextHostMessageType(uint32_t uClientId, uint32_t *puMsg, uint32_t *pcParms, bool fWait)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync AssertPtrReturn(puMsg, VERR_INVALID_POINTER);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync AssertPtrReturn(pcParms, VERR_INVALID_POINTER);
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync DragAndDropSvc::VBOXDNDNEXTMSGMSG Msg;
9496f2d398b49813176939d7a339ae513d5175efvboxsync RT_ZERO(Msg);
9496f2d398b49813176939d7a339ae513d5175efvboxsync Msg.hdr.result = VERR_WRONG_ORDER;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.hdr.u32ClientID = uClientId;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.hdr.cParms = 3;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.msg.SetUInt32(0);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.num_parms.SetUInt32(0);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.block.SetUInt32(fWait);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (RT_SUCCESS(rc))
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.hdr.result;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RT_SUCCESS(rc))
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.msg.GetUInt32(puMsg); AssertRC(rc);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.num_parms.GetUInt32(pcParms); AssertRC(rc);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return rc;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncstatic int vbglR3DnDHGProcessActionMessage(uint32_t uClientId,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t uMsg,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *puScreenId,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *puX,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *puY,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *puDefAction,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *puAllActions,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync char *pszFormats,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t cbFormats,
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync uint32_t *pcbFormatsRecv)
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync{
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(puX, VERR_INVALID_POINTER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(puY, VERR_INVALID_POINTER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(puDefAction, VERR_INVALID_POINTER);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync AssertPtrReturn(puAllActions, VERR_INVALID_POINTER);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync AssertPtrReturn(pszFormats, VERR_INVALID_POINTER);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync AssertReturn(cbFormats, VERR_INVALID_PARAMETER);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync AssertPtrReturn(pcbFormatsRecv, VERR_INVALID_POINTER);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync DragAndDropSvc::VBOXDNDHGACTIONMSG Msg;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync RT_ZERO(Msg);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync Msg.hdr.u32ClientID = uClientId;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync Msg.hdr.u32Function = uMsg;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync Msg.hdr.cParms = 7;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync Msg.uScreenId.SetUInt32(0);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync Msg.uX.SetUInt32(0);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync Msg.uY.SetUInt32(0);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync Msg.uDefAction.SetUInt32(0);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync Msg.uAllActions.SetUInt32(0);
cab115cfa31c584def7069312a1e23c3fc88533bvboxsync Msg.pvFormats.SetPtr(pszFormats, cbFormats);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync Msg.cFormats.SetUInt32(0);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync if (RT_SUCCESS(rc))
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
21029597fc4b76d0db0c9542daee201447281781vboxsync rc = Msg.hdr.result;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RT_SUCCESS(rc))
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.uScreenId.GetUInt32(puScreenId); AssertRC(rc);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.uX.GetUInt32(puX); AssertRC(rc);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.uY.GetUInt32(puY); AssertRC(rc);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.uDefAction.GetUInt32(puDefAction); AssertRC(rc);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync rc = Msg.uAllActions.GetUInt32(puAllActions); AssertRC(rc);
c0a370e600bb60153a269fb32b5f709347c35768vboxsync rc = Msg.cFormats.GetUInt32(pcbFormatsRecv); AssertRC(rc);
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync AssertReturn(cbFormats >= *pcbFormatsRecv, VERR_TOO_MUCH_DATA);
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync return rc;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync}
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
61d064a54f03596920c3918f58ecc7764074a5d8vboxsyncstatic int vbglR3DnDHGProcessLeaveMessage(uint32_t uClientId)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync{
16a9adc14900ca18e6909679a579f6833425e030vboxsync DragAndDropSvc::VBOXDNDHGLEAVEMSG Msg;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RT_ZERO(Msg);
16a9adc14900ca18e6909679a579f6833425e030vboxsync Msg.hdr.u32ClientID = uClientId;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_EVT_LEAVE;
16a9adc14900ca18e6909679a579f6833425e030vboxsync Msg.hdr.cParms = 0;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RT_SUCCESS(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = Msg.hdr.result;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync return rc;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync}
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsyncstatic int vbglR3DnDHGProcessCancelMessage(uint32_t uClientId)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync{
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync DragAndDropSvc::VBOXDNDHGCANCELMSG Msg;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync RT_ZERO(Msg);
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync Msg.hdr.u32ClientID = uClientId;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_EVT_CANCEL;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync Msg.hdr.cParms = 0;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (RT_SUCCESS(rc))
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync rc = Msg.hdr.result;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync return rc;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync}
61b5982fad4660d0fe3dd6ceba9eda85eb32f7e8vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsyncstatic int vbglR3DnDHGProcessSendDirMessage(uint32_t uClientId,
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync char *pszDirname,
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync uint32_t cbDirname,
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync uint32_t *pcbDirnameRecv,
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync uint32_t *pfMode)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync{
009d45aa55691312278d41edb20154dc208d9cd8vboxsync AssertPtrReturn(pszDirname, VERR_INVALID_POINTER);
009d45aa55691312278d41edb20154dc208d9cd8vboxsync AssertReturn(cbDirname, VERR_INVALID_PARAMETER);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync AssertPtrReturn(pcbDirnameRecv, VERR_INVALID_POINTER);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync AssertPtrReturn(pfMode, VERR_INVALID_POINTER);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync DragAndDropSvc::VBOXDNDHGSENDDIRMSG Msg;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync RT_ZERO(Msg);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.hdr.u32ClientID = uClientId;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_DIR;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.hdr.cParms = 3;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.pvName.SetPtr(pszDirname, cbDirname);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.cbName.SetUInt32(0);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.fMode.SetUInt32(0);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync if (RT_SUCCESS(rc))
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync rc = Msg.hdr.result;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (RT_SUCCESS(Msg.hdr.result))
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync rc = Msg.cbName.GetUInt32(pcbDirnameRecv); AssertRC(rc);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync rc = Msg.fMode.GetUInt32(pfMode); AssertRC(rc);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertReturn(cbDirname >= *pcbDirnameRecv, VERR_TOO_MUCH_DATA);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return rc;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync}
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncstatic int vbglR3DnDHGProcessSendFileMessage(uint32_t uClientId,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync char *pszFilename,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t cbFilename,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t *pcbFilenameRecv,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync void *pvData,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t cbData,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t *pcbDataRecv,
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t *pfMode)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync{
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertReturn(cbFilename, VERR_INVALID_PARAMETER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertPtrReturn(pcbFilenameRecv, VERR_INVALID_POINTER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertPtrReturn(pcbDataRecv, VERR_INVALID_POINTER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertPtrReturn(pfMode, VERR_INVALID_POINTER);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync DragAndDropSvc::VBOXDNDHGSENDFILEMSG Msg;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync RT_ZERO(Msg);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.hdr.u32ClientID = uClientId;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_FILE;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.hdr.cParms = 5;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.pvName.SetPtr(pszFilename, cbFilename);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.cbName.SetUInt32(0);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync Msg.pvData.SetPtr(pvData, cbData);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Msg.cbData.SetUInt32(0);
16a9adc14900ca18e6909679a579f6833425e030vboxsync Msg.fMode.SetUInt32(0);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (RT_SUCCESS(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = Msg.hdr.result;
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (RT_SUCCESS(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = Msg.cbName.GetUInt32(pcbFilenameRecv); AssertRC(rc);
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = Msg.cbData.GetUInt32(pcbDataRecv); AssertRC(rc);
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = Msg.fMode.GetUInt32(pfMode); AssertRC(rc);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync AssertReturn(cbFilename >= *pcbFilenameRecv, VERR_TOO_MUCH_DATA);
16a9adc14900ca18e6909679a579f6833425e030vboxsync AssertReturn(cbData >= *pcbDataRecv, VERR_TOO_MUCH_DATA);
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync return rc;
16a9adc14900ca18e6909679a579f6833425e030vboxsync}
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsyncstatic int vbglR3DnDHGProcessURIMessages(uint32_t uClientId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t *puScreenId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync char *pszFormat,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync uint32_t cbFormat,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync uint32_t *pcbFormatRecv,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync void **ppvData,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync uint32_t cbData,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync size_t *pcbDataRecv)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync{
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync AssertPtrReturn(ppvData, VERR_INVALID_POINTER);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync AssertPtrReturn(cbData, VERR_INVALID_PARAMETER);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync AssertPtrReturn(pcbDataRecv, VERR_INVALID_POINTER);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (!*pcbDataRecv)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync return VERR_INVALID_PARAMETER;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* Allocate temp buffer. */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync uint32_t cbTmpData = _64K; /** @todo Make this configurable? */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync void *pvTmpData = RTMemAlloc(cbTmpData);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (!pvTmpData)
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync return VERR_NO_MEMORY;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* Create and query the (unique) drop target directory. */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync char pszDropDir[RTPATH_MAX];
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync int rc = DnDDirCreateDroppedFiles(pszDropDir, sizeof(pszDropDir));
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (RT_FAILURE(rc))
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync RTMemFree(pvTmpData);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync return rc;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync }
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* Patch the old drop data with the new drop directory, so the drop target
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * can find the files. */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync DnDURIList lstURI;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync rc = lstURI.RootFromURIData(*ppvData, *pcbDataRecv,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync 0 /* fFlags */);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync if (RT_SUCCESS(rc))
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* Cleanup the old data and write the new data back to the event. */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync RTMemFree(*ppvData);
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync RTCString strData = lstURI.RootToString(pszDropDir);
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync *ppvData = RTStrDupN(strData.c_str(), strData.length());
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync *pcbDataRecv = strData.length() + 1;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync }
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* Lists for holding created files & directories
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * in the case of a rollback. */
9496f2d398b49813176939d7a339ae513d5175efvboxsync RTCList<RTCString> guestDirList;
9496f2d398b49813176939d7a339ae513d5175efvboxsync RTCList<RTCString> guestFileList;
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsync char szPathName[RTPATH_MAX];
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync uint32_t cbPathName = 0;
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync
22ec733a5e041fcdfe02fce2eafc9faf8b0077ddvboxsync bool fLoop = RT_SUCCESS(rc); /* No error occurred yet? */
9496f2d398b49813176939d7a339ae513d5175efvboxsync while (fLoop)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t uNextMsg;
9496f2d398b49813176939d7a339ae513d5175efvboxsync uint32_t cNextParms;
aa834e89e076db44fa8fe82d177748f0a45d14c2vboxsync rc = vbglR3DnDQueryNextHostMessageType(uClientId, &uNextMsg, &cNextParms, false /* fWait */);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync switch (uNextMsg)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DragAndDropSvc::HOST_DND_HG_SND_DIR:
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync {
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync uint32_t fMode = 0;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = vbglR3DnDHGProcessSendDirMessage(uClientId,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync szPathName,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync sizeof(szPathName),
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync &cbPathName,
d5ea45cc92d7f1d3ade8189944531f665bfe8ed5vboxsync &fMode);
5d0d754550d06b7d59a935e59caaf814462d53ccvboxsync#ifdef DEBUG_andy
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync LogFlowFunc(("HOST_DND_HG_SND_DIR pszPathName=%s, cbPathName=%RU32, fMode=0x%x, rc=%Rrc\n",
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync szPathName, cbPathName, fMode, rc));
d5ea45cc92d7f1d3ade8189944531f665bfe8ed5vboxsync#endif
f687f34bd232be13744edbc0cc5155fa5d4540edvboxsync if (RT_SUCCESS(rc))
d5ea45cc92d7f1d3ade8189944531f665bfe8ed5vboxsync rc = DnDPathSanitize(szPathName, sizeof(szPathName));
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (RT_SUCCESS(rc))
9496f2d398b49813176939d7a339ae513d5175efvboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync char *pszNewDir = RTPathJoinA(pszDropDir, szPathName);
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync if (pszNewDir)
1189c7dde5d7f6c26f338ced3d40fc830b822e68vboxsync {
468c2bcb36eb9a032f5dd0fcb34db10bd58e9996vboxsync rc = RTDirCreate(pszNewDir, (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRWXU, 0);
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync if (!guestDirList.contains(pszNewDir))
9496f2d398b49813176939d7a339ae513d5175efvboxsync guestDirList.append(pszNewDir);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTStrFree(pszNewDir);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync else
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = VERR_NO_MEMORY;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync break;
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync case DragAndDropSvc::HOST_DND_HG_SND_FILE:
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync {
ffbe6daf773e38167f3cabaf1f063d84ecd063e9vboxsync uint32_t cbDataRecv;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t fMode = 0;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = vbglR3DnDHGProcessSendFileMessage(uClientId,
fbf08fabb4c4b383d6aa2830c2bd5b943a26f10cvboxsync szPathName,
fbf08fabb4c4b383d6aa2830c2bd5b943a26f10cvboxsync sizeof(szPathName),
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync &cbPathName,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync pvTmpData,
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync cbTmpData,
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync &cbDataRecv,
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync &fMode);
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync#ifdef DEBUG_andy
ba74637cb4d2e749337d51ccbfb1038bdd3e2092vboxsync LogFlowFunc(("HOST_DND_HG_SND_FILE pszPathName=%s, cbPathName=%RU32, pvData=0x%p, cbDataRecv=%RU32, fMode=0x%x, rc=%Rrc\n",
1189c7dde5d7f6c26f338ced3d40fc830b822e68vboxsync szPathName, cbPathName, pvTmpData, cbDataRecv, fMode, rc));
ba74637cb4d2e749337d51ccbfb1038bdd3e2092vboxsync#endif
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync if (RT_SUCCESS(rc))
ba74637cb4d2e749337d51ccbfb1038bdd3e2092vboxsync rc = DnDPathSanitize(szPathName, sizeof(szPathName));
61b5982fad4660d0fe3dd6ceba9eda85eb32f7e8vboxsync if (RT_SUCCESS(rc))
61b5982fad4660d0fe3dd6ceba9eda85eb32f7e8vboxsync {
adefd5e9babba486cba0cfae52f5a0f6c8c4ef24vboxsync char *pszPathAbs = RTPathJoinA(pszDropDir, szPathName);
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync if (pszPathAbs)
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTFILE hFile;
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync /** @todo r=andy Keep the file open and locked during the actual file transfer. Otherwise this will
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * create all sorts of funny races because we don't know if the guest has
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * modified the file in between the file data send calls. */
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync rc = RTFileOpen(&hFile, pszPathAbs,
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync RTFILE_O_WRITE | RTFILE_O_APPEND | RTFILE_O_DENY_ALL | RTFILE_O_OPEN_CREATE);
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync if (RT_SUCCESS(rc))
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync {
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync /** @todo r=andy Not very safe to assume that we were last appending to the current file. */
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync rc = RTFileSeek(hFile, 0, RTFILE_SEEK_END, NULL);
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync if (RT_SUCCESS(rc))
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync {
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync rc = RTFileWrite(hFile, pvTmpData, cbDataRecv, 0);
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync /* Valid UNIX mode? */
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync if ( RT_SUCCESS(rc)
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync && (fMode & RTFS_UNIX_MASK))
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = RTFileSetMode(hFile, (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTFileClose(hFile);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (!guestFileList.contains(pszPathAbs))
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync guestFileList.append(pszPathAbs);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#ifdef DEBUG
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync else
9496f2d398b49813176939d7a339ae513d5175efvboxsync LogFlowFunc(("Opening file failed with rc=%Rrc\n", rc));
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#endif
9496f2d398b49813176939d7a339ae513d5175efvboxsync RTStrFree(pszPathAbs);
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync else
9496f2d398b49813176939d7a339ae513d5175efvboxsync rc = VERR_NO_MEMORY;
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync break;
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = vbglR3DnDHGProcessCancelMessage(uClientId);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (RT_SUCCESS(rc))
9496f2d398b49813176939d7a339ae513d5175efvboxsync rc = VERR_CANCELLED;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync /* Break out of the loop. */
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync default:
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync fLoop = false;
1189c7dde5d7f6c26f338ced3d40fc830b822e68vboxsync break;
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync else
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (rc == VERR_NO_DATA)
9496f2d398b49813176939d7a339ae513d5175efvboxsync rc = VINF_SUCCESS;
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync break;
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (RT_FAILURE(rc))
9496f2d398b49813176939d7a339ae513d5175efvboxsync break;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync } /* while */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (pvTmpData)
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync RTMemFree(pvTmpData);
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync /* Cleanup on failure or if the user has canceled. */
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync if (RT_FAILURE(rc))
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync {
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync /* Remove any stuff created. */
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync for (size_t i = 0; i < guestFileList.size(); ++i)
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync RTFileDelete(guestFileList.at(i).c_str());
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync for (size_t i = 0; i < guestDirList.size(); ++i)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTDirRemove(guestDirList.at(i).c_str());
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync RTDirRemove(pszDropDir);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync LogFlowFunc(("Failed with rc=%Rrc\n", rc));
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return rc;
1189c7dde5d7f6c26f338ced3d40fc830b822e68vboxsync}
9496f2d398b49813176939d7a339ae513d5175efvboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsyncstatic int vbglR3DnDHGProcessDataMessageInternal(uint32_t uClientId,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *puScreenId,
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync char *pszFormat,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t cbFormat,
9496f2d398b49813176939d7a339ae513d5175efvboxsync uint32_t *pcbFormatRecv,
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync void *pvData,
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync uint32_t cbData,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t *pcbDataTotal)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync{
9496f2d398b49813176939d7a339ae513d5175efvboxsync AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertReturn(cbFormat, VERR_INVALID_PARAMETER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(pcbFormatRecv, VERR_INVALID_POINTER);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync AssertPtrReturn(pcbDataTotal, VERR_INVALID_POINTER);
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync DragAndDropSvc::VBOXDNDHGSENDDATAMSG Msg;
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync RT_ZERO(Msg);
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync Msg.hdr.u32ClientID = uClientId;
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_DATA;
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync Msg.hdr.cParms = 5;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync Msg.uScreenId.SetUInt32(0);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync Msg.pvFormat.SetPtr(pszFormat, cbFormat);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync Msg.cFormat.SetUInt32(0);
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync Msg.pvData.SetPtr(pvData, cbData);
9496f2d398b49813176939d7a339ae513d5175efvboxsync Msg.cbData.SetUInt32(0);
9496f2d398b49813176939d7a339ae513d5175efvboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
9496f2d398b49813176939d7a339ae513d5175efvboxsync if (RT_SUCCESS(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = Msg.hdr.result;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if ( RT_SUCCESS(rc)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync || rc == VERR_BUFFER_OVERFLOW)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = Msg.uScreenId.GetUInt32(puScreenId); AssertRC(rc);
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync rc = Msg.cFormat.GetUInt32(pcbFormatRecv); AssertRC(rc);
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync rc = Msg.cbData.GetUInt32(pcbDataTotal); AssertRC(rc);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertReturn(cbFormat >= *pcbFormatRecv, VERR_TOO_MUCH_DATA);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync AssertReturn(cbData >= *pcbDataTotal, VERR_TOO_MUCH_DATA);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
9496f2d398b49813176939d7a339ae513d5175efvboxsync }
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync return rc;
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsyncstatic int vbglR3DnDHGProcessMoreDataMessageInternal(uint32_t uClientId,
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync void *pvData,
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync uint32_t cbData,
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync uint32_t *pcbDataRecv)
ce03ea57fdcf3d48523b1de5b894feb75e1b34davboxsync{
9496f2d398b49813176939d7a339ae513d5175efvboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
9496f2d398b49813176939d7a339ae513d5175efvboxsync AssertPtrReturn(pcbDataRecv, VERR_INVALID_POINTER);
9496f2d398b49813176939d7a339ae513d5175efvboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync DragAndDropSvc::VBOXDNDHGSENDMOREDATAMSG Msg;
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync RT_ZERO(Msg);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync Msg.hdr.u32ClientID = uClientId;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA;
9496f2d398b49813176939d7a339ae513d5175efvboxsync Msg.hdr.cParms = 2;
16a9adc14900ca18e6909679a579f6833425e030vboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync Msg.pvData.SetPtr(pvData, cbData);
9496f2d398b49813176939d7a339ae513d5175efvboxsync Msg.cbData.SetUInt32(0);
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync if (RT_SUCCESS(rc))
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync {
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync rc = Msg.hdr.result;
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync if ( RT_SUCCESS(rc)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync || rc == VERR_BUFFER_OVERFLOW)
9496f2d398b49813176939d7a339ae513d5175efvboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync rc = Msg.cbData.GetUInt32(pcbDataRecv); AssertRC(rc);
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync AssertReturn(cbData >= *pcbDataRecv, VERR_TOO_MUCH_DATA);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return rc;
16a9adc14900ca18e6909679a579f6833425e030vboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsyncstatic int vbglR3DnDHGProcessSendDataMessageLoop(uint32_t uClientId,
a0a5ab4e085a7ee5b95bdfae04cec7de95792c3cvboxsync uint32_t *puScreenId,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync char *pszFormat,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync uint32_t cbFormat,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync uint32_t *pcbFormatRecv,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync void **ppvData,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync uint32_t cbData,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync size_t *pcbDataRecv)
9496f2d398b49813176939d7a339ae513d5175efvboxsync{
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t cbDataRecv = 0;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync int rc = vbglR3DnDHGProcessDataMessageInternal(uClientId,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync puScreenId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync pszFormat,
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync cbFormat,
9496f2d398b49813176939d7a339ae513d5175efvboxsync pcbFormatRecv,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync *ppvData,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync cbData,
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync &cbDataRecv);
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync uint32_t cbAllDataRecv = cbDataRecv;
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync while (rc == VERR_BUFFER_OVERFLOW)
c7551981eb6d97331da479f68f14a9c56247e4f7vboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync uint32_t uNextMsg;
9496f2d398b49813176939d7a339ae513d5175efvboxsync uint32_t cNextParms;
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync rc = vbglR3DnDQueryNextHostMessageType(uClientId, &uNextMsg, &cNextParms, false);
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync if (RT_SUCCESS(rc))
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync {
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync switch(uNextMsg)
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync {
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync case DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA:
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync {
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync *ppvData = RTMemRealloc(*ppvData, cbAllDataRecv + cbData);
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync if (!*ppvData)
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync {
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync rc = VERR_NO_MEMORY;
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync break;
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync }
f4aad55f8addd816ef005845842a2418bbdc3ea2vboxsync rc = vbglR3DnDHGProcessMoreDataMessageInternal(uClientId,
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync &((char*)*ppvData)[cbAllDataRecv],
369a8817da53dbd5ea6ac360ca0376dba003cde4vboxsync cbData,
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync &cbDataRecv);
59d7f5939d42ad9d344fbad8401e00a900db92c5vboxsync cbAllDataRecv += cbDataRecv;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync break;
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
16a9adc14900ca18e6909679a579f6833425e030vboxsync default:
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = vbglR3DnDHGProcessCancelMessage(uClientId);
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (RT_SUCCESS(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = VERR_CANCELLED;
16a9adc14900ca18e6909679a579f6833425e030vboxsync break;
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (RT_SUCCESS(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync *pcbDataRecv = cbAllDataRecv;
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync return rc;
16a9adc14900ca18e6909679a579f6833425e030vboxsync}
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsyncstatic int vbglR3DnDHGProcessSendDataMessage(uint32_t uClientId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t *puScreenId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync char *pszFormat,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t cbFormat,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t *pcbFormatRecv,
16a9adc14900ca18e6909679a579f6833425e030vboxsync void **ppvData,
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t cbData,
16a9adc14900ca18e6909679a579f6833425e030vboxsync size_t *pcbDataRecv)
16a9adc14900ca18e6909679a579f6833425e030vboxsync{
16a9adc14900ca18e6909679a579f6833425e030vboxsync int rc = vbglR3DnDHGProcessSendDataMessageLoop(uClientId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync puScreenId,
16a9adc14900ca18e6909679a579f6833425e030vboxsync pszFormat,
16a9adc14900ca18e6909679a579f6833425e030vboxsync cbFormat,
16a9adc14900ca18e6909679a579f6833425e030vboxsync pcbFormatRecv,
16a9adc14900ca18e6909679a579f6833425e030vboxsync ppvData,
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync cbData,
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync pcbDataRecv);
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync if (RT_SUCCESS(rc))
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync {
975ad9d9bc9c4dc96b41d9f67a65228b1b338e2avboxsync /* Check if this is an URI event. If so, let VbglR3 do all the actual
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync * data transfer + file/directory creation internally without letting
975ad9d9bc9c4dc96b41d9f67a65228b1b338e2avboxsync * the caller know.
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync *
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync * This keeps the actual (guest OS-)dependent client (like VBoxClient /
975ad9d9bc9c4dc96b41d9f67a65228b1b338e2avboxsync * VBoxTray) small by not having too much redundant code. */
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync AssertPtr(pcbFormatRecv);
975ad9d9bc9c4dc96b41d9f67a65228b1b338e2avboxsync if (DnDMIMEHasFileURLs(pszFormat, *pcbFormatRecv))
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync rc = vbglR3DnDHGProcessURIMessages(uClientId,
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync puScreenId,
975ad9d9bc9c4dc96b41d9f67a65228b1b338e2avboxsync pszFormat,
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync cbFormat,
975ad9d9bc9c4dc96b41d9f67a65228b1b338e2avboxsync pcbFormatRecv,
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync ppvData,
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync cbData,
baacecc94a2d23b6f5086739c08cf06d6b357d0avboxsync pcbDataRecv);
baacecc94a2d23b6f5086739c08cf06d6b357d0avboxsync }
baacecc94a2d23b6f5086739c08cf06d6b357d0avboxsync
baacecc94a2d23b6f5086739c08cf06d6b357d0avboxsync return rc;
baacecc94a2d23b6f5086739c08cf06d6b357d0avboxsync}
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsyncstatic int vbglR3DnDGHProcessRequestPendingMessage(uint32_t uClientId,
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync uint32_t *puScreenId)
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync{
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync DragAndDropSvc::VBOXDNDGHREQPENDINGMSG Msg;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync RT_ZERO(Msg);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.hdr.u32ClientID = uClientId;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_GH_REQ_PENDING;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.hdr.cParms = 1;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.uScreenId.SetUInt32(0);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync if (RT_SUCCESS(rc))
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync {
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync rc = Msg.hdr.result;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync if (RT_SUCCESS(rc))
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync rc = Msg.uScreenId.GetUInt32(puScreenId); AssertRC(rc);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync }
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync return rc;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync}
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsyncstatic int vbglR3DnDGHProcessDroppedMessage(uint32_t uClientId,
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync char *pszFormat,
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync uint32_t cbFormat,
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync uint32_t *pcbFormatRecv,
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync uint32_t *puAction)
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync{
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync AssertReturn(cbFormat, VERR_INVALID_PARAMETER);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync AssertPtrReturn(pcbFormatRecv, VERR_INVALID_POINTER);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync AssertPtrReturn(puAction, VERR_INVALID_POINTER);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync DragAndDropSvc::VBOXDNDGHDROPPEDMSG Msg;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync RT_ZERO(Msg);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.hdr.u32ClientID = uClientId;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_GH_EVT_DROPPED;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.hdr.cParms = 3;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.pvFormat.SetPtr(pszFormat, cbFormat);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.cFormat.SetUInt32(0);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync Msg.uAction.SetUInt32(0);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync if (RT_SUCCESS(rc))
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync {
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync rc = Msg.hdr.result;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync if (RT_SUCCESS(rc))
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync {
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync rc = Msg.cFormat.GetUInt32(pcbFormatRecv); AssertRC(rc);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync rc = Msg.uAction.GetUInt32(puAction); AssertRC(rc);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync AssertReturn(cbFormat >= *pcbFormatRecv, VERR_TOO_MUCH_DATA);
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync }
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync }
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync return rc;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync}
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync/******************************************************************************
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync * Public functions *
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync ******************************************************************************/
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsyncVBGLR3DECL(int) VbglR3DnDConnect(uint32_t *pu32ClientId)
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync{
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync AssertPtrReturn(pu32ClientId, VERR_INVALID_POINTER);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync /* Initialize header */
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync VBoxGuestHGCMConnectInfo Info;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync RT_ZERO(Info.Loc.u);
efff36b306e370346025647a158689021df2e1d1vboxsync Info.result = VERR_WRONG_ORDER;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Info.u32ClientID = UINT32_MAX; /* try make valgrind shut up. */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync /* Initialize parameter */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Info.Loc.type = VMMDevHGCMLoc_LocalHost_Existing;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync int rc = RTStrCopy(Info.Loc.u.host.achName, sizeof(Info.Loc.u.host.achName), "VBoxDragAndDropSvc");
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync if (RT_FAILURE(rc)) return rc;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync /* Do request */
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CONNECT, &Info, sizeof(Info));
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync if (RT_SUCCESS(rc))
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync {
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync rc = Info.result;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync if (RT_SUCCESS(rc))
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync *pu32ClientId = Info.u32ClientID;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync }
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync return rc;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync}
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsyncVBGLR3DECL(int) VbglR3DnDDisconnect(uint32_t u32ClientId)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync{
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync VBoxGuestHGCMDisconnectInfo Info;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Info.result = VERR_WRONG_ORDER;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Info.u32ClientID = u32ClientId;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync /* Do request */
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_DISCONNECT, &Info, sizeof(Info));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = Info.result;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsyncVBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGCMEVENT pEvent)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync{
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync uint32_t uMsg = 0;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync uint32_t uNumParms = 0;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync const uint32_t ccbFormats = _64K;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync const uint32_t ccbData = _64K;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync int rc = vbglR3DnDQueryNextHostMessageType(u32ClientId, &uMsg, &uNumParms,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync true /* fWait */);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync switch(uMsg)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_ENTER:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync pEvent->uType = uMsg;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync pEvent->pszFormats = static_cast<char*>(RTMemAlloc(ccbFormats));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (!pEvent->pszFormats)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = VERR_NO_MEMORY;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDHGProcessActionMessage(u32ClientId,
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync uMsg,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync &pEvent->uScreenId,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync &pEvent->u.a.uXpos,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync &pEvent->u.a.uYpos,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync &pEvent->u.a.uDefAction,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync &pEvent->u.a.uAllActions,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync pEvent->pszFormats,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync ccbFormats,
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync &pEvent->cbFormats);
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync break;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync }
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync case DragAndDropSvc::HOST_DND_HG_EVT_LEAVE:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync pEvent->uType = uMsg;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = vbglR3DnDHGProcessLeaveMessage(u32ClientId);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync break;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync case DragAndDropSvc::HOST_DND_HG_SND_DATA:
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync pEvent->uType = uMsg;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync pEvent->pszFormats = static_cast<char*>(RTMemAlloc(ccbFormats));
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync if (!pEvent->pszFormats)
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync rc = VERR_NO_MEMORY;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync if (RT_SUCCESS(rc))
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync pEvent->u.b.pvData = RTMemAlloc(ccbData);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync if (!pEvent->u.b.pvData)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync RTMemFree(pEvent->pszFormats);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync pEvent->pszFormats = NULL;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync rc = VERR_NO_MEMORY;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync if (RT_SUCCESS(rc))
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync rc = vbglR3DnDHGProcessSendDataMessage(u32ClientId,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync &pEvent->uScreenId,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync pEvent->pszFormats,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync ccbFormats,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync &pEvent->cbFormats,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync &pEvent->u.b.pvData,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync ccbData,
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync &pEvent->u.b.cbData);
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync break;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync }
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync case DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA:
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync case DragAndDropSvc::HOST_DND_HG_SND_DIR:
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync case DragAndDropSvc::HOST_DND_HG_SND_FILE:
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync {
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync pEvent->uType = uMsg;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync /* All messages in this case are handled internally
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync * by vbglR3DnDHGProcessSendDataMessage() and must
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync * be specified by a preceding HOST_DND_HG_SND_DATA call. */
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync rc = VERR_WRONG_ORDER;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync break;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync pEvent->uType = uMsg;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = vbglR3DnDHGProcessCancelMessage(u32ClientId);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync break;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync case DragAndDropSvc::HOST_DND_GH_REQ_PENDING:
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync {
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync pEvent->uType = uMsg;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = vbglR3DnDGHProcessRequestPendingMessage(u32ClientId,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync &pEvent->uScreenId);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync break;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DragAndDropSvc::HOST_DND_GH_EVT_DROPPED:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync pEvent->uType = uMsg;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync pEvent->pszFormats = static_cast<char*>(RTMemAlloc(ccbFormats));
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync if (!pEvent->pszFormats)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = VERR_NO_MEMORY;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDGHProcessDroppedMessage(u32ClientId,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync pEvent->pszFormats,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync ccbFormats,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync &pEvent->cbFormats,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync &pEvent->u.a.uDefAction);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync break;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#endif
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync default:
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync pEvent->uType = uMsg;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = VERR_NOT_SUPPORTED;
251b3801f86afc901bee955a7e5a8d14b5836e74vboxsync break;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync}
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncVBGLR3DECL(int) VbglR3DnDHGAcknowledgeOperation(uint32_t u32ClientId, uint32_t uAction)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync DragAndDropSvc::VBOXDNDHGACKOPMSG Msg;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RT_ZERO(Msg);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.result = VERR_WRONG_ORDER;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32ClientID = u32ClientId;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_HG_ACK_OP;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.cParms = 1;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.uAction.SetUInt32(uAction);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = Msg.hdr.result;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncVBGLR3DECL(int) VbglR3DnDHGRequestData(uint32_t u32ClientId, const char* pcszFormat)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync AssertPtrReturn(pcszFormat, VERR_INVALID_PARAMETER);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync DragAndDropSvc::VBOXDNDHGREQDATAMSG Msg;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync RT_ZERO(Msg);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.result = VERR_WRONG_ORDER;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32ClientID = u32ClientId;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_HG_REQ_DATA;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.cParms = 1;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.pFormat.SetPtr((void*)pcszFormat, (uint32_t)strlen(pcszFormat) + 1);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync if (RT_SUCCESS(rc))
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = Msg.hdr.result;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync}
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
59a2c1c0a4a0762b46bc5ff056f5705ec9c0a660vboxsyncVBGLR3DECL(int) VbglR3DnDGHAcknowledgePending(uint32_t u32ClientId,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync uint32_t uDefAction, uint32_t uAllActions,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync const char* pcszFormats)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync AssertPtrReturn(pcszFormats, VERR_INVALID_POINTER);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync DragAndDropSvc::VBOXDNDGHACKPENDINGMSG Msg;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync RT_ZERO(Msg);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.result = VERR_WRONG_ORDER;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32ClientID = u32ClientId;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_ACK_PENDING;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.cParms = 3;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.uDefAction.SetUInt32(uDefAction);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.uAllActions.SetUInt32(uAllActions);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.pFormat.SetPtr((void*)pcszFormats, (uint32_t)strlen(pcszFormats) + 1);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync if (RT_SUCCESS(rc))
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc = Msg.hdr.result;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsyncstatic int vbglR3DnDGHSendDataInternal(uint32_t u32ClientId,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync void *pvData, uint32_t cbData,
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync uint32_t cbAdditionalData)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync DragAndDropSvc::VBOXDNDGHSENDDATAMSG Msg;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RT_ZERO(Msg);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.result = VERR_WRONG_ORDER;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32ClientID = u32ClientId;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_DATA;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.hdr.cParms = 2;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync /* Total amount of bytes to send (including this data block). */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.cbTotalBytes.SetUInt32(cbData + cbAdditionalData);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync int rc;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync uint32_t cbMaxChunk = _64K; /** @todo Transfer max. 64K chunks per message. Configurable? */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync uint32_t cbSent = 0;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync while (cbSent < cbData)
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync {
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync uint32_t cbCurChunk = RT_MIN(cbData - cbSent, cbMaxChunk);
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.pvData.SetPtr(static_cast<uint8_t*>(pvData) + cbSent, cbCurChunk);
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
4bd3e7685494afe7c303fc131c66e685023b6b4avboxsync if (RT_SUCCESS(rc))
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync rc = Msg.hdr.result;
4bd3e7685494afe7c303fc131c66e685023b6b4avboxsync
4bd3e7685494afe7c303fc131c66e685023b6b4avboxsync if (RT_FAILURE(rc))
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync break;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync cbSent += cbCurChunk;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync }
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync if (RT_SUCCESS(rc))
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Assert(cbSent == cbData);
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync LogFlowFunc(("Returning rc=%Rrc, cbData=%RU32, cbAddtionalData=%RU32, cbSent=%RU32\n",
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync rc, cbData, cbAdditionalData, cbSent));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsyncstatic int vbglR3DnDGHSendDir(uint32_t u32ClientId, DnDURIObject &obj)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertReturn(obj.GetType() == DnDURIObject::Directory, VERR_INVALID_PARAMETER);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync DragAndDropSvc::VBOXDNDGHSENDDIRMSG Msg;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RT_ZERO(Msg);
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.hdr.result = VERR_WRONG_ORDER;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.hdr.u32ClientID = u32ClientId;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_DIR;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.hdr.cParms = 3;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RTCString strPath = obj.GetDestPath();
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync LogFlowFunc(("strDir=%s (%zu), fMode=0x%x\n",
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync strPath.c_str(), strPath.length(), obj.GetMode()));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.pvName.SetPtr((void *)strPath.c_str(), (uint32_t)(strPath.length() + 1));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Msg.cbName.SetUInt32((uint32_t)(strPath.length() + 1));
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Msg.fMode.SetUInt32(obj.GetMode());
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync if (RT_SUCCESS(rc))
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync rc = Msg.hdr.result;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync LogFlowFuncLeaveRC(rc);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync}
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsyncstatic int vbglR3DnDGHSendFile(uint32_t u32ClientId, DnDURIObject &obj)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync{
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync AssertReturn(obj.GetType() == DnDURIObject::File, VERR_INVALID_PARAMETER);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync uint32_t cbBuf = _64K; /** @todo Make this configurable? */
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync void *pvBuf = RTMemAlloc(cbBuf);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync if (!pvBuf)
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync return VERR_NO_MEMORY;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync DragAndDropSvc::VBOXDNDGHSENDFILEMSG Msg;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync RT_ZERO(Msg);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync Msg.hdr.result = VERR_WRONG_ORDER;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync Msg.hdr.u32ClientID = u32ClientId;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_FILE;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync Msg.hdr.cParms = 5;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync RTCString strPath = obj.GetDestPath();
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync LogFlowFunc(("strFile=%s (%zu), fMode=0x%x\n",
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync strPath.c_str(), strPath.length(), obj.GetMode()));
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync Msg.pvName.SetPtr((void *)strPath.c_str(), (uint32_t)(strPath.length() + 1));
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync Msg.cbName.SetUInt32((uint32_t)(strPath.length() + 1));
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync Msg.fMode.SetUInt32(obj.GetMode());
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync int rc = VINF_SUCCESS;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync uint32_t cbData = obj.GetSize();
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync do
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync {
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync uint32_t cbToRead = RT_MIN(cbData, cbBuf);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync uint32_t cbRead = 0;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync if (cbToRead)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = obj.Read(pvBuf, cbToRead, &cbRead);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.cbData.SetUInt32(cbRead);
8dbf70ba2345e69b0b6d45c38cf1add0ef10591cvboxsync Msg.pvData.SetPtr(pvBuf, cbRead);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync if (RT_SUCCESS(rc))
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync rc = Msg.hdr.result;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync }
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync if (RT_FAILURE(rc))
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync break;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync Assert(cbRead <= cbData);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync cbData -= cbRead;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync } while (cbData);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync RTMemFree(pvBuf);
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync LogFlowFuncLeaveRC(rc);
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync return rc;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync}
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
30c39307775310ba50de9d9b74f1ea9e12524102vboxsyncstatic int vbglR3DnDGHSendURIObject(uint32_t u32ClientId, DnDURIObject &obj)
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync{
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync int rc;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync switch (obj.GetType())
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync {
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync case DnDURIObject::Directory:
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync rc = vbglR3DnDGHSendDir(u32ClientId, obj);
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync break;
d571b6e3237f0ce89ea27f6fa4635d41c5ee3d88vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync case DnDURIObject::File:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDGHSendFile(u32ClientId, obj);
51a01524909c95ee04b636218b6a89b29fb81825vboxsync break;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync default:
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertMsgFailed(("Type %ld not implemented\n",
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync obj.GetType()));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = VERR_NOT_IMPLEMENTED;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync break;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsyncstatic int vbglR3DnDGHProcessURIMessages(uint32_t u32ClientId,
efff36b306e370346025647a158689021df2e1d1vboxsync void *pvData, uint32_t cbData)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync{
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RTCList<RTCString> lstPaths =
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RTCString((const char *)pvData, cbData).split("\r\n");
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync DnDURIList lstURI;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync int rc = lstURI.AppendNativePathsFromList(lstPaths, 0 /* fFlags */);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync /* Send metadata; in this case it's the (non-recursive) file/directory
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync * URI list the host needs to know to initialize the drag'n drop operation. */
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RTCString strRootDest = lstURI.RootToString();
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Assert(strRootDest.isNotEmpty());
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync void *pvToSend = (void *)strRootDest.c_str();
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync uint32_t cbToSend = (uint32_t)strRootDest.length() + 1;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDGHSendDataInternal(u32ClientId, pvToSend, cbToSend,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync /* Include total bytes of all file paths,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync * file sizes etc. */
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync lstURI.TotalBytes());
51a01524909c95ee04b636218b6a89b29fb81825vboxsync }
51a01524909c95ee04b636218b6a89b29fb81825vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_SUCCESS(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync while (!lstURI.IsEmpty())
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync DnDURIObject &nextObj = lstURI.First();
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDGHSendURIObject(u32ClientId, nextObj);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_FAILURE(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync break;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync lstURI.RemoveFirst();
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsyncVBGLR3DECL(int) VbglR3DnDGHSendData(uint32_t u32ClientId,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync const char *pszFormat,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync void *pvData, uint32_t cbData)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync{
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync int rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (DnDMIMEHasFileURLs(pszFormat, strlen(pszFormat)))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDGHProcessURIMessages(u32ClientId, pvData, cbData);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync else
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync rc = vbglR3DnDGHSendDataInternal(u32ClientId, pvData, cbData,
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync 0 /* cbAdditionalData */);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync if (RT_FAILURE(rc))
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync {
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync int rc2 = VbglR3DnDGHSendError(u32ClientId, rc);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync AssertRC(rc2);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync }
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsyncVBGLR3DECL(int) VbglR3DnDGHSendError(uint32_t u32ClientId, int rcErr)
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync{
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync DragAndDropSvc::VBOXDNDGHEVTERRORMSG Msg;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync RT_ZERO(Msg);
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Msg.hdr.result = VERR_WRONG_ORDER;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Msg.hdr.u32ClientID = u32ClientId;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_EVT_ERROR;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Msg.hdr.cParms = 1;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync Msg.uRC.SetUInt32((uint32_t)rcErr); /* uint32_t vs. int. */
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync
b0b15690f00527424b2d5fb88456d747252322f7vboxsync int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
b0b15690f00527424b2d5fb88456d747252322f7vboxsync if (RT_SUCCESS(rc))
b0b15690f00527424b2d5fb88456d747252322f7vboxsync rc = Msg.hdr.result;
b0b15690f00527424b2d5fb88456d747252322f7vboxsync
b0b15690f00527424b2d5fb88456d747252322f7vboxsync LogFlowFunc(("Sending error %Rrc returned with rc=%Rrc\n", rcErr, rc));
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync return rc;
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync}
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync