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