82391de567696f10b21a762fde6a06fe3c266d28vboxsync/* $Id$ */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/** @file
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * DnD: URI list class.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/*
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Copyright (C) 2014 Oracle Corporation
82391de567696f10b21a762fde6a06fe3c266d28vboxsync *
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * available from http://www.virtualbox.org. This file is free software;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * you can redistribute it and/or modify it under the terms of the GNU
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * General Public License (GPL) as published by the Free Software
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/******************************************************************************
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Header Files *
82391de567696f10b21a762fde6a06fe3c266d28vboxsync ******************************************************************************/
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/dir.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/file.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/fs.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/path.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/uri.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#ifdef LOG_GROUP
82391de567696f10b21a762fde6a06fe3c266d28vboxsync #undef LOG_GROUP
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#define LOG_GROUP LOG_GROUP_GUEST_DND
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <VBox/log.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <VBox/GuestHost/DragAndDrop.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncDnDURIObject::DnDURIObject(Type type,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const RTCString &strSrcPath,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const RTCString &strDstPath,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fMode, uint64_t cbSize)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync : m_Type(type)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync , m_strSrcPath(strSrcPath)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync , m_strDstPath(strDstPath)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync , m_fMode(fMode)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync , m_cbSize(cbSize)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync , m_cbProcessed(0)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(u);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncDnDURIObject::~DnDURIObject(void)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync closeInternal();
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid DnDURIObject::closeInternal(void)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (m_Type == File)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (u.m_hFile)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTFileClose(u.m_hFile);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync u.m_hFile = NULL;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncbool DnDURIObject::IsComplete(void) const
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync bool fComplete = false;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync Assert(m_cbProcessed <= m_cbSize);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (m_cbProcessed == m_cbSize)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fComplete = true;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync switch (m_Type)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync case File:
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (!fComplete)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fComplete = !u.m_hFile;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync case Directory:
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fComplete = true;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync default:
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return fComplete;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* static */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/** @todo Put this into an own class like DnDURIPath : public RTCString? */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIObject::RebaseURIPath(RTCString &strPath,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const RTCString &strBaseOld,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const RTCString &strBaseNew)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const char *pszPath = RTUriPath(strPath.c_str());
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszPath)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const char *pszPathStart = pszPath;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const char *pszBaseOld = strBaseOld.c_str();
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if ( pszBaseOld
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync && RTPathStartsWith(pszPath, pszBaseOld))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pszPathStart += strlen(pszBaseOld);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (RT_SUCCESS(rc))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszPathNew = RTPathJoinA(strBaseNew.c_str(), pszPathStart);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszPathNew)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszPathURI = RTUriCreate("file" /* pszScheme */, "/" /* pszAuthority */,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pszPathNew /* pszPath */,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync NULL /* pszQuery */, NULL /* pszFragment */);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszPathURI)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#ifdef DEBUG_andy
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFunc(("Rebasing \"%s\" to \"%s\"", strPath.c_str(), pszPathURI));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#endif
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync strPath = RTCString(pszPathURI) + "\r\n";
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTStrFree(pszPathURI);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VERR_INVALID_PARAMETER;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTStrFree(pszPathNew);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VERR_NO_MEMORY;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VERR_INVALID_PARAMETER;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#ifdef DEBUG_andy
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFuncLeaveRC(rc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#endif
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIObject::Read(void *pvBuf, uint32_t cbToRead, uint32_t *pcbRead)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReturn(cbToRead, VERR_INVALID_PARAMETER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* pcbRead is optional. */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync switch (m_Type)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync case File:
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (!u.m_hFile)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* Open files on the source with RTFILE_O_DENY_WRITE to prevent races
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * where the OS writes to the file while the destination side transfers
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * it over. */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = RTFileOpen(&u.m_hFile, m_strSrcPath.c_str(),
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync bool fDone = false;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (RT_SUCCESS(rc))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync size_t cbRead;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = RTFileRead(u.m_hFile, pvBuf, cbToRead, &cbRead);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (RT_SUCCESS(rc))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pcbRead)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *pcbRead = (uint32_t)cbRead;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync m_cbProcessed += cbRead;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync Assert(m_cbProcessed <= m_cbSize);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* End of file reached or error occurred? */
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync if ( m_cbProcessed == m_cbSize
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync || RT_FAILURE(rc))
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync closeInternal();
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync case Directory:
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync default:
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VERR_NOT_IMPLEMENTED;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFunc(("Returning strSourcePath=%s, rc=%Rrc\n",
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync m_strSrcPath.c_str(), rc));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/*** */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncDnDURIList::DnDURIList(void)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync : m_cbTotal(0)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncDnDURIList::~DnDURIList(void)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncint DnDURIList::appendPathRecursive(const char *pcszPath, size_t cbBaseLen,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync uint32_t fFlags)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync AssertPtrReturn(pcszPath, VERR_INVALID_POINTER);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTFSOBJINFO objInfo;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync int rc = RTPathQueryInfo(pcszPath, &objInfo, RTFSOBJATTRADD_NOTHING);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /*
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * These are the types we currently support. Symlinks are not directly
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * supported. First the guest could be an OS which doesn't support it and
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * second the symlink could point to a file which is out of the base tree.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Both things are hard to support. For now we just copy the target file in
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * this case.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (!( RTFS_IS_DIRECTORY(objInfo.Attr.fMode)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync || RTFS_IS_FILE(objInfo.Attr.fMode)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync || RTFS_IS_SYMLINK(objInfo.Attr.fMode)))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync uint64_t cbSize = 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = RTFileQuerySize(pcszPath, &cbSize);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (rc == VERR_IS_A_DIRECTORY)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync m_lstTree.append(DnDURIObject( RTFS_IS_DIRECTORY(objInfo.Attr.fMode)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync ? DnDURIObject::Directory
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync : DnDURIObject::File,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pcszPath, &pcszPath[cbBaseLen],
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync objInfo.Attr.fMode, cbSize));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync m_cbTotal += cbSize;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#ifdef DEBUG_andy
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFunc(("strSrcPath=%s, strDstPath=%s, fMode=0x%x, cbSize=%RU64, cbTotal=%zu\n",
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pcszPath, &pcszPath[cbBaseLen], objInfo.Attr.fMode, cbSize, m_cbTotal));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync PRTDIR hDir;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* We have to try to open even symlinks, cause they could
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * be symlinks to directories. */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = RTDirOpen(&hDir, pcszPath);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* The following error happens when this was a symlink
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * to an file or a regular file. */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if ( rc == VERR_PATH_NOT_FOUND
82391de567696f10b21a762fde6a06fe3c266d28vboxsync || rc == VERR_NOT_A_DIRECTORY)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync while (RT_SUCCESS(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTDIRENTRY DirEntry;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = RTDirRead(hDir, &DirEntry, NULL);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (rc == VERR_NO_MORE_FILES)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync switch (DirEntry.enmType)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync case RTDIRENTRYTYPE_DIRECTORY:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* Skip "." and ".." entries. */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if ( RTStrCmp(DirEntry.szName, ".") == 0
82391de567696f10b21a762fde6a06fe3c266d28vboxsync || RTStrCmp(DirEntry.szName, "..") == 0)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
401ce2099f0ede0091ea3f661331c6f1dd117d28vboxsync char *pszRecDir = RTPathJoinA(pcszPath, DirEntry.szName);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (pszRecDir)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = appendPathRecursive(pszRecDir, cbBaseLen, fFlags);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTStrFree(pszRecDir);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync else
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = VERR_NO_MEMORY;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync case RTDIRENTRYTYPE_SYMLINK:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync case RTDIRENTRYTYPE_FILE:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
401ce2099f0ede0091ea3f661331c6f1dd117d28vboxsync char *pszNewFile = RTPathJoinA(pcszPath, DirEntry.szName);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (pszNewFile)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* We need the size and the mode of the file. */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTFSOBJINFO objInfo1;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = RTPathQueryInfo(pszNewFile, &objInfo1, RTFSOBJATTRADD_NOTHING);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = RTFileQuerySize(pszNewFile, &cbSize);
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync if (rc == VERR_IS_A_DIRECTORY) /* Happens for symlinks. */
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync rc = VINF_SUCCESS;
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync if (RTFS_IS_FILE(objInfo.Attr.fMode))
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync {
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync m_lstTree.append(DnDURIObject(DnDURIObject::File,
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync pszNewFile, &pszNewFile[cbBaseLen],
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync objInfo1.Attr.fMode, cbSize));
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync m_cbTotal += cbSize;
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync }
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync else /* Handle symlink directories. */
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync rc = appendPathRecursive(pszNewFile, cbBaseLen, fFlags);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#ifdef DEBUG_andy
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFunc(("strSrcPath=%s, strDstPath=%s, fMode=0x%x, cbSize=%RU64, cbTotal=%zu\n",
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pszNewFile, &pszNewFile[cbBaseLen], objInfo1.Attr.fMode, cbSize, m_cbTotal));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTStrFree(pszNewFile);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync else
82391de567696f10b21a762fde6a06fe3c266d28vboxsync rc = VERR_NO_MEMORY;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync default:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTDirClose(hDir);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::AppendNativePath(const char *pszPath, uint32_t fFlags)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int rc;
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync char *pszPathNative = RTStrDup(pszPath);
5bc51087a0577d3f18701d7ff0fdc253cbd6bbf6vboxsync if (pszPathNative)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync RTPathChangeToUnixSlashes(pszPathNative, true /* fForce */);
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync char *pszPathURI = RTUriCreate("file" /* pszScheme */, "/" /* pszAuthority */,
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync pszPathNative, NULL /* pszQuery */, NULL /* pszFragment */);
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync if (pszPathURI)
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync {
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync rc = AppendURIPath(pszPathURI, fFlags);
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync RTStrFree(pszPathURI);
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync }
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync else
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync rc = VERR_INVALID_PARAMETER;
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync RTStrFree(pszPathNative);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync rc = VERR_NO_MEMORY;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::AppendNativePathsFromList(const char *pszNativePaths, size_t cbNativePaths,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertPtrReturn(pszNativePaths, VERR_INVALID_POINTER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReturn(cbNativePaths, VERR_INVALID_PARAMETER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTCList<RTCString> lstPaths
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync = RTCString(pszNativePaths, cbNativePaths - 1).split("\r\n");
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return AppendNativePathsFromList(lstPaths, fFlags);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::AppendNativePathsFromList(const RTCList<RTCString> &lstNativePaths,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int rc = VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync for (size_t i = 0; i < lstNativePaths.size(); i++)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const RTCString &strPath = lstNativePaths.at(i);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = AppendNativePath(strPath.c_str(), fFlags);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (RT_FAILURE(rc))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFuncLeaveRC(rc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::AppendURIPath(const char *pszURI, uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertPtrReturn(pszURI, VERR_INVALID_POINTER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
924c248d11ce3849739cc64791d34564d68869cevboxsync /** @todo Check for string termination? */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#ifdef DEBUG_andy
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFunc(("pszPath=%s, fFlags=0x%x\n", pszURI, fFlags));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
82391de567696f10b21a762fde6a06fe3c266d28vboxsync int rc = VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* Query the path component of a file URI. If this hasn't a
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * file scheme NULL is returned. */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszFilePath = RTUriFilePath(pszURI, URI_FILE_FORMAT_AUTO);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (pszFilePath)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* Add the path to our internal file list (recursive in
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * the case of a directory). */
924c248d11ce3849739cc64791d34564d68869cevboxsync size_t cbPathLen = RTPathStripTrailingSlash(pszFilePath);
924c248d11ce3849739cc64791d34564d68869cevboxsync if (cbPathLen)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
924c248d11ce3849739cc64791d34564d68869cevboxsync char *pszFileName = RTPathFilename(pszFilePath);
924c248d11ce3849739cc64791d34564d68869cevboxsync if (pszFileName)
924c248d11ce3849739cc64791d34564d68869cevboxsync {
924c248d11ce3849739cc64791d34564d68869cevboxsync Assert(pszFileName >= pszFilePath);
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync size_t cbBase = (fFlags & DNDURILIST_FLAGS_ABSOLUTE_PATHS)
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync ? 0 /* Use start of path as root. */
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync : pszFileName - pszFilePath;
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync char *pszRoot = &pszFilePath[cbBase];
924c248d11ce3849739cc64791d34564d68869cevboxsync m_lstRoot.append(pszRoot);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#ifdef DEBUG_andy
924c248d11ce3849739cc64791d34564d68869cevboxsync LogFlowFunc(("pszFilePath=%s, pszFileName=%s, pszRoot=%s\n",
924c248d11ce3849739cc64791d34564d68869cevboxsync pszFilePath, pszFileName, pszRoot));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#endif
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync rc = appendPathRecursive(pszFilePath, cbBase,
924c248d11ce3849739cc64791d34564d68869cevboxsync fFlags);
924c248d11ce3849739cc64791d34564d68869cevboxsync }
924c248d11ce3849739cc64791d34564d68869cevboxsync else
924c248d11ce3849739cc64791d34564d68869cevboxsync rc = VERR_NOT_FOUND;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
924c248d11ce3849739cc64791d34564d68869cevboxsync rc = VERR_INVALID_PARAMETER;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RTStrFree(pszFilePath);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VERR_INVALID_PARAMETER;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync LogFlowFuncLeaveRC(rc);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::AppendURIPathsFromList(const char *pszURIPaths, size_t cbURIPaths,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertPtrReturn(pszURIPaths, VERR_INVALID_POINTER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReturn(cbURIPaths, VERR_INVALID_PARAMETER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTCList<RTCString> lstPaths
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync = RTCString(pszURIPaths, cbURIPaths - 1).split("\r\n");
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return AppendURIPathsFromList(lstPaths, fFlags);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::AppendURIPathsFromList(const RTCList<RTCString> &lstURI,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync int rc = VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync for (size_t i = 0; i < lstURI.size(); i++)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTCString strURI = lstURI.at(i);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = AppendURIPath(strURI.c_str(), fFlags);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (RT_FAILURE(rc))
82391de567696f10b21a762fde6a06fe3c266d28vboxsync break;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync LogFlowFuncLeaveRC(rc);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return rc;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid DnDURIList::Clear(void)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync m_lstRoot.clear();
82391de567696f10b21a762fde6a06fe3c266d28vboxsync m_lstTree.clear();
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync m_cbTotal = 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid DnDURIList::RemoveFirst(void)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync DnDURIObject &curPath = m_lstTree.first();
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint64_t cbSize = curPath.GetSize();
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync Assert(m_cbTotal >= cbSize);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync m_cbTotal -= cbSize; /* Adjust total size. */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync m_lstTree.removeFirst();
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncint DnDURIList::RootFromURIData(const void *pvData, size_t cbData,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertPtrReturn(pvData, VERR_INVALID_POINTER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReturn(cbData, VERR_INVALID_PARAMETER);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTCList<RTCString> lstURI =
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTCString(static_cast<const char*>(pvData), cbData - 1).split("\r\n");
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (lstURI.isEmpty())
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int rc = VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync for (size_t i = 0; i < lstURI.size(); ++i)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* Query the path component of a file URI. If this hasn't a
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * file scheme, NULL is returned. */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const char *pszURI = lstURI.at(i).c_str();
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszFilePath = RTUriFilePath(pszURI,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync URI_FILE_FORMAT_AUTO);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#ifdef DEBUG_andy
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LogFlowFunc(("pszURI=%s, pszFilePath=%s\n", pszURI, pszFilePath));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#endif
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszFilePath)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = DnDPathSanitize(pszFilePath, strlen(pszFilePath));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (RT_SUCCESS(rc))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync m_lstRoot.append(pszFilePath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTStrFree(pszFilePath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = VERR_INVALID_PARAMETER;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (RT_FAILURE(rc))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsyncRTCString DnDURIList::RootToString(const RTCString &strBasePath /* = "" */,
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync const RTCString &strSeparator /* = "\r\n" */)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTCString strRet;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync for (size_t i = 0; i < m_lstRoot.size(); i++)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync const char *pszCurRoot = m_lstRoot.at(i).c_str();
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync#ifdef DEBUG_andy
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync LogFlowFunc(("pszCurRoot=%s\n", pszCurRoot));
8c71acd3714d92a0602a95d19fbb2aef0cf5fd5dvboxsync#endif
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (strBasePath.isNotEmpty())
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszPath = RTPathJoinA(strBasePath.c_str(), pszCurRoot);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszPath)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszPathURI = RTUriFileCreate(pszPath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszPathURI)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync strRet += RTCString(pszPathURI) + strSeparator;
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync#ifdef DEBUG_andy
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync LogFlowFunc(("URI: %s\n", strRet.c_str()));
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync#endif
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTStrFree(pszPathURI);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync else
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTStrFree(pszPath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pszPathURI = RTUriFileCreate(pszCurRoot);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pszPathURI)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync {
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync strRet += RTCString(pszPathURI) + strSeparator;
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync#ifdef DEBUG_andy
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync LogFlowFunc(("URI: %s\n", strRet.c_str()));
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync#endif
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTStrFree(pszPathURI);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync break;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return strRet;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync