VFSExplorerImpl.cpp revision dc09cb937d0a66e030b4d7bef88dec429f41e060
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * IVFSExplorer COM class implementations.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2009 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * 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
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync */
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#include <iprt/dir.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/path.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/file.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/s3.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/com/array.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/param.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/version.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "VFSExplorerImpl.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "VirtualBoxImpl.h"
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#include "ProgressImpl.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "AutoCaller.h"
d31ded334a29f575e23dc889b603b1a586759348vboxsync#include "Logging.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d31ded334a29f575e23dc889b603b1a586759348vboxsync////////////////////////////////////////////////////////////////////////////////
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync//
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync// VFSExplorer definitions
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync//
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync////////////////////////////////////////////////////////////////////////////////
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* opaque private instance data of VFSExplorer class */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsyncstruct VFSExplorer::Data
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync struct DirEntry
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DirEntry(Utf8Str aName, VFSFileType_T aType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync : name(aName)
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync , type(aType) {}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync Utf8Str name;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync VFSFileType_T type;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync };
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VFSType_T storageType;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str strUsername;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str strPassword;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str strHostname;
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync Utf8Str strPath;
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsync Utf8Str strBucket;
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync std::list<DirEntry> entryList;
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync};
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsyncVFSExplorer::VFSExplorer()
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync : mVirtualBox(NULL)
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync{
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync}
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
c613f29bba8757289a5acf5a5dae7ee21b6b1ad5vboxsyncVFSExplorer::~VFSExplorer()
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync{
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VFSExplorer COM initializer.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT VFSExplorer::init(VFSType_T aType, Utf8Str aFilePath, Utf8Str aHostname, Utf8Str aUsername, Utf8Str aPassword, VirtualBox *aVirtualBox)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Enclose the state transition NotReady->InInit->Ready */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoInitSpan autoInitSpan(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(autoInitSpan.isOk(), E_FAIL);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Weak reference to a VirtualBox object */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unconst(mVirtualBox) = aVirtualBox;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* initialize data */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m = new Data;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m->storageType = aType;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m->strPath = aFilePath;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync m->strHostname = aHostname;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync m->strUsername = aUsername;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync m->strPassword = aPassword;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (m->storageType == VFSType_S3)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync size_t bpos = aFilePath.find("/", 1);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (bpos != Utf8Str::npos)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync m->strBucket = aFilePath.substr(1, bpos - 1); /* The bucket without any slashes */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync aFilePath = aFilePath.substr(bpos); /* The rest of the file path */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* Confirm a successful initialization */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync autoInitSpan.setSucceeded();
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return S_OK;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * VFSExplorer COM uninitializer.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @return
7b80828e5760a8814fe6cd494d2715a4544fbddcvboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncvoid VFSExplorer::uninit()
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync delete m;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync m = NULL;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Public method implementation.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @return
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncSTDMETHODIMP VFSExplorer::COMGETTER(Path)(BSTR *aPath)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (!aPath)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return E_POINTER;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync AutoCaller autoCaller(this);
d1cbbd799d8912978f5146960b6780f387bb414bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
c17f5c90f2cb60b38ecabebce128724c6ff2d036vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync Bstr bstrPath(m->strPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bstrPath.cloneTo(aPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP VFSExplorer::COMGETTER(Type)(VFSType_T *aType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!aType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return E_POINTER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aType = m->storageType;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstruct VFSExplorer::TaskVFSExplorer
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync enum TaskType
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Update,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Delete
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync };
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync TaskVFSExplorer(TaskType aTaskType, VFSExplorer *aThat, Progress *aProgress)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync : taskType(aTaskType),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVFSExplorer(aThat),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync progress(aProgress),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc(S_OK)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ~TaskVFSExplorer() {}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int startThread();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static int taskThread(RTTHREAD aThread, void *pvUser);
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync static int uploadProgress(unsigned uPercent, void *pvUser);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync TaskType taskType;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VFSExplorer *pVFSExplorer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<Progress> progress;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* task data */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::list<Utf8Str> filenames;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint VFSExplorer::TaskVFSExplorer::startThread()
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync{
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync int vrc = RTThreadCreate(NULL, VFSExplorer::TaskVFSExplorer::taskThread, this,
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync 0, RTTHREADTYPE_MAIN_HEAVY_WORKER, 0,
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync "Explorer::Task");
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync ComAssertMsgRCRet(vrc,
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync ("Could not create taskThreadVFS (%Rrc)\n", vrc), E_FAIL);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync/* static */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsyncDECLCALLBACK(int) VFSExplorer::TaskVFSExplorer::taskThread(RTTHREAD /* aThread */, void *pvUser)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::auto_ptr<TaskVFSExplorer> task(static_cast<TaskVFSExplorer*>(pvUser));
72ef2b9fc5ffc01d0dabd5052d6e8baa3a952773vboxsync AssertReturn(task.get(), VERR_GENERAL_FAILURE);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VFSExplorer *pVFSExplorer = task->pVFSExplorer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("VFSExplorer %p\n", pVFSExplorer));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT rc = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch(task->taskType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync case TaskVFSExplorer::Update:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVFSExplorer->m->storageType == VFSType_File)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pVFSExplorer->updateFS(task.get());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (pVFSExplorer->m->storageType == VFSType_S3)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pVFSExplorer->updateS3(task.get());
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync case TaskVFSExplorer::Delete:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
909f4391cc20b4a3a9a2d3f8718084b669663ab2vboxsync if (pVFSExplorer->m->storageType == VFSType_File)
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync rc = pVFSExplorer->deleteFS(task.get());
22e281e75ed636601178296c6daebda8f1d17c59vboxsync else if (pVFSExplorer->m->storageType == VFSType_S3)
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync rc = pVFSExplorer->deleteS3(task.get());
69deddbc68802f1cf1c3a404a9f816b8accb3385vboxsync break;
3ecd8008b81f02a04220705ae0033142af363280vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync LogFlowFunc(("rc=%Rhrc\n", rc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* static */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncint VFSExplorer::TaskVFSExplorer::uploadProgress(unsigned uPercent, void *pvUser)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VFSExplorer::TaskVFSExplorer* pTask = *(VFSExplorer::TaskVFSExplorer**)pvUser;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3ecd8008b81f02a04220705ae0033142af363280vboxsync if (pTask &&
3ecd8008b81f02a04220705ae0033142af363280vboxsync !pTask->progress.isNull())
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync BOOL fCanceled;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask->progress->COMGETTER(Canceled)(&fCanceled);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fCanceled)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return -1;
b978e5849454446957177fd47ee98609ab0457a6vboxsync pTask->progress->SetCurrentOperationProgress(uPercent);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVFSFileType_T VFSExplorer::RTToVFSFileType(int aType) const
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync{
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync VFSFileType_T t;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync switch(aType)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync {
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_UNKNOWN: t = VFSFileType_Unknown; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_FIFO: t = VFSFileType_Fifo; break;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync case RTDIRENTRYTYPE_DEV_CHAR: t = VFSFileType_DevChar; break;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync case RTDIRENTRYTYPE_DIRECTORY: t = VFSFileType_Directory; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_DEV_BLOCK: t = VFSFileType_DevBlock; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_FILE: t = VFSFileType_File; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_SYMLINK: t = VFSFileType_SymLink; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_SOCKET: t = VFSFileType_Socket; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTDIRENTRYTYPE_WHITEOUT: t = VFSFileType_WhiteOut; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync return t;
b978e5849454446957177fd47ee98609ab0457a6vboxsync}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT VFSExplorer::updateFS(TaskVFSExplorer *aTask)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncEnter();
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync AutoWriteLock appLock(this COMMA_LOCKVAL_SRC_POS);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync HRESULT rc = S_OK;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::list<VFSExplorer::Data::DirEntry> fileList;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync char *pszPath = NULL;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync PRTDIR pDir = NULL;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pszPath = RTStrDup(m->strPath.c_str());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTPathStripFilename(pszPath);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync int vrc = RTDirOpen(&pDir, pszPath);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync if (RT_FAILURE(vrc))
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync throw setError(VBOX_E_FILE_ERROR, tr ("Can't open directory '%s' (%Rrc)"), pszPath, vrc);
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync if (aTask->progress)
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync aTask->progress->SetCurrentOperationProgress(33);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync RTDIRENTRY entry;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync while (RT_SUCCESS(vrc))
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync vrc = RTDirRead(pDir, &entry, NULL);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (RT_SUCCESS(vrc))
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync {
e50404712a2b5234c42bdf9740bddab5729ba188vboxsync Utf8Str name(entry.szName);
b978e5849454446957177fd47ee98609ab0457a6vboxsync if (name != "." &&
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync name != "..")
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync fileList.push_back(VFSExplorer::Data::DirEntry(name, RTToVFSFileType(entry.enmType)));
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync }
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (aTask->progress)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync aTask->progress->SetCurrentOperationProgress(66);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync catch(HRESULT aRC)
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync {
1843553dbdf4e46417158b4c6348c503adf10740vboxsync rc = aRC;
806d0b554daa555364af5f87bc96eccbe760db7avboxsync }
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /* Clean up */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (pszPath)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync RTStrFree(pszPath);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (pDir)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync RTDirClose(pDir);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (aTask->progress)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync aTask->progress->SetCurrentOperationProgress(99);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync /* Assign the result on success (this clears the old list) */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (rc == S_OK)
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync m->entryList.assign(fileList.begin(), fileList.end());
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync aTask->rc = rc;
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync if (!aTask->progress.isNull())
1843553dbdf4e46417158b4c6348c503adf10740vboxsync aTask->progress->notifyComplete(rc);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync LogFlowFunc(("rc=%Rhrc\n", rc));
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync LogFlowFuncLeave();
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync return VINF_SUCCESS;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsyncHRESULT VFSExplorer::deleteFS(TaskVFSExplorer *aTask)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync{
1843553dbdf4e46417158b4c6348c503adf10740vboxsync LogFlowFuncEnter();
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync AutoCaller autoCaller(this);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync AutoWriteLock appLock(this COMMA_LOCKVAL_SRC_POS);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync HRESULT rc = S_OK;
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync float fPercentStep = 100.0f / aTask->filenames.size();
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync try
1843553dbdf4e46417158b4c6348c503adf10740vboxsync {
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync char szPath[RTPATH_MAX];
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync std::list<Utf8Str>::const_iterator it;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync size_t i = 0;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync for (it = aTask->filenames.begin();
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync it != aTask->filenames.end();
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync ++it, ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memcpy(szPath, m->strPath.c_str(), strlen(m->strPath.c_str()) + 1);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTPathStripFilename(szPath);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync RTPathAppend(szPath, sizeof(szPath), (*it).c_str());
e52f819639386db020b2a635b47a415248c7fbf9vboxsync int vrc = RTFileDelete(szPath);
b978e5849454446957177fd47ee98609ab0457a6vboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync throw setError(VBOX_E_FILE_ERROR, tr ("Can't delete file '%s' (%Rrc)"), szPath, vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aTask->progress)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync aTask->progress->SetCurrentOperationProgress((ULONG)(fPercentStep * i));
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync catch(HRESULT aRC)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = aRC;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync aTask->rc = rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
0e77737b0ba913683e614db11463b31ca67aacbevboxsync if (!aTask->progress.isNull())
0e77737b0ba913683e614db11463b31ca67aacbevboxsync aTask->progress->notifyComplete(rc);
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync LogFlowFunc(("rc=%Rhrc\n", rc));
0e77737b0ba913683e614db11463b31ca67aacbevboxsync LogFlowFuncLeave();
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return VINF_SUCCESS;
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync}
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsyncHRESULT VFSExplorer::updateS3(TaskVFSExplorer *aTask)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync{
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync LogFlowFuncEnter();
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync AutoCaller autoCaller(this);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync AutoWriteLock appLock(this COMMA_LOCKVAL_SRC_POS);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync HRESULT rc = S_OK;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync RTS3 hS3 = NULL;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync std::list<VFSExplorer::Data::DirEntry> fileList;
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync try
0e77737b0ba913683e614db11463b31ca67aacbevboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = RTS3Create(&hS3, m->strUsername.c_str(), m->strPassword.c_str(), m->strHostname.c_str(), "virtualbox-agent/"VBOX_VERSION_STRING);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync throw setError(E_FAIL, tr ("Can't open S3 storage service (%Rrc)"), vrc);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTS3SetProgressCallback(hS3, VFSExplorer::TaskVFSExplorer::uploadProgress, &aTask);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* Do we need the list of buckets or keys? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (m->strBucket.isEmpty())
8e972b677df5ee27b99211fc7e456a5aa50f3e68vboxsync {
8e972b677df5ee27b99211fc7e456a5aa50f3e68vboxsync PCRTS3BUCKETENTRY pBuckets = NULL;
b978e5849454446957177fd47ee98609ab0457a6vboxsync vrc = RTS3GetBuckets(hS3, &pBuckets);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync throw setError(E_FAIL, tr ("Can't get buckets (%Rrc)"), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync PCRTS3BUCKETENTRY pTmpBuckets = pBuckets;
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync while (pBuckets)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fileList.push_back(VFSExplorer::Data::DirEntry(pBuckets->pszName, VFSFileType_Directory));
806d0b554daa555364af5f87bc96eccbe760db7avboxsync pBuckets = pBuckets->pNext;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync RTS3BucketsDestroy(pTmpBuckets);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync }
806d0b554daa555364af5f87bc96eccbe760db7avboxsync else
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync {
806d0b554daa555364af5f87bc96eccbe760db7avboxsync PCRTS3KEYENTRY pKeys = NULL;
806d0b554daa555364af5f87bc96eccbe760db7avboxsync vrc = RTS3GetBucketKeys(hS3, m->strBucket.c_str(), &pKeys);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync if (RT_FAILURE(vrc))
806d0b554daa555364af5f87bc96eccbe760db7avboxsync throw setError(E_FAIL, tr ("Can't get keys for bucket (%Rrc)"), vrc);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync PCRTS3KEYENTRY pTmpKeys = pKeys;
806d0b554daa555364af5f87bc96eccbe760db7avboxsync while (pKeys)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync {
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync Utf8Str name(pKeys->pszName);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync fileList.push_back(VFSExplorer::Data::DirEntry(pKeys->pszName, VFSFileType_File));
806d0b554daa555364af5f87bc96eccbe760db7avboxsync pKeys = pKeys->pNext;
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync }
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync RTS3KeysDestroy(pTmpKeys);
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync catch(HRESULT aRC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
806d0b554daa555364af5f87bc96eccbe760db7avboxsync rc = aRC;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync if (hS3 != NULL)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync RTS3Destroy(hS3);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /* Assign the result on success (this clears the old list) */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync if (rc == S_OK)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync m->entryList.assign(fileList.begin(), fileList.end());
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync aTask->rc = rc;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (!aTask->progress.isNull())
806d0b554daa555364af5f87bc96eccbe760db7avboxsync aTask->progress->notifyComplete(rc);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync LogFlowFunc(("rc=%Rhrc\n", rc));
806d0b554daa555364af5f87bc96eccbe760db7avboxsync LogFlowFuncLeave();
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync return VINF_SUCCESS;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncHRESULT VFSExplorer::deleteS3(TaskVFSExplorer *aTask)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync{
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync LogFlowFuncEnter();
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock appLock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync HRESULT rc = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTS3 hS3 = NULL;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync float fPercentStep = 100.0f / aTask->filenames.size();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync int vrc = RTS3Create(&hS3, m->strUsername.c_str(), m->strPassword.c_str(), m->strHostname.c_str(), "virtualbox-agent/"VBOX_VERSION_STRING);
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync throw setError(E_FAIL, tr ("Can't open S3 storage service (%Rrc)"), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTS3SetProgressCallback(hS3, VFSExplorer::TaskVFSExplorer::uploadProgress, &aTask);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::list<Utf8Str>::const_iterator it;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync size_t i = 0;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync for (it = aTask->filenames.begin();
22e281e75ed636601178296c6daebda8f1d17c59vboxsync it != aTask->filenames.end();
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync ++it, ++i)
b978e5849454446957177fd47ee98609ab0457a6vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync vrc = RTS3DeleteKey(hS3, m->strBucket.c_str(), (*it).c_str());
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync if (RT_FAILURE(vrc))
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync throw setError(VBOX_E_FILE_ERROR, tr ("Can't delete file '%s' (%Rrc)"), (*it).c_str(), vrc);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (aTask->progress)
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync aTask->progress->SetCurrentOperationProgress((ULONG)(fPercentStep * i));
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync }
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync }
806d0b554daa555364af5f87bc96eccbe760db7avboxsync catch(HRESULT aRC)
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync rc = aRC;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync }
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync aTask->rc = rc;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync if (hS3 != NULL)
1157941288c9533575a655c660af55d13da31eefvboxsync RTS3Destroy(hS3);
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
1157941288c9533575a655c660af55d13da31eefvboxsync if (!aTask->progress.isNull())
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync aTask->progress->notifyComplete(rc);
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync LogFlowFunc(("rc=%Rhrc\n", rc));
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync LogFlowFuncLeave();
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
8e8844a522f5d335f177a0313b03067d79cce201vboxsync return VINF_SUCCESS;
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync}
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsyncSTDMETHODIMP VFSExplorer::Update(IProgress **aProgress)
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync{
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync CheckComArgOutPointerValid(aProgress);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync AutoCaller autoCaller(this);
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync HRESULT rc = S_OK;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync ComObjPtr<Progress> progress;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync try
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync Bstr progressDesc = BstrFmt(tr("Update directory info for '%s'"),
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync m->strPath.raw());
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /* Create the progress object */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync progress.createObject();
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync rc = progress->init(mVirtualBox, static_cast<IVFSExplorer*>(this),
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync progressDesc,
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync TRUE /* aCancelable */);
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync if (FAILED(rc)) throw rc;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /* Initialize our worker task */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync std::auto_ptr<TaskVFSExplorer> task(new TaskVFSExplorer(TaskVFSExplorer::Update, this, progress));
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync rc = task->startThread();
8e8844a522f5d335f177a0313b03067d79cce201vboxsync if (FAILED(rc)) throw rc;
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync /* Don't destruct on success */
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync task.release();
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync catch (HRESULT aRC)
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync {
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync rc = aRC;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync }
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync if (SUCCEEDED(rc))
b978e5849454446957177fd47ee98609ab0457a6vboxsync /* Return progress to the caller */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync progress.queryInterfaceTo(aProgress);
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync return rc;
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync}
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsyncSTDMETHODIMP VFSExplorer::Cd(IN_BSTR aDir, IProgress **aProgress)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync{
46b1ac1c3302722f93e787d0f0693965e88f5ceevboxsync CheckComArgStrNotEmptyOrNull(aDir);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync CheckComArgOutPointerValid(aProgress);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync return E_NOTIMPL;
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync}
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsyncSTDMETHODIMP VFSExplorer::CdUp(IProgress **aProgress)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync CheckComArgOutPointerValid(aProgress);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync return E_NOTIMPL;
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync}
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncSTDMETHODIMP VFSExplorer::EntryList(ComSafeArrayOut(BSTR, aNames), ComSafeArrayOut(VFSFileType_T, aTypes))
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync{
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (ComSafeArrayOutIsNull(aNames) ||
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync ComSafeArrayOutIsNull(aTypes))
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync return E_POINTER;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync AutoCaller autoCaller(this);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync com::SafeArray<BSTR> sfaNames((ULONG)m->entryList.size());
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync com::SafeArray<ULONG> sfaTypes((VFSFileType_T)m->entryList.size());
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync std::list<VFSExplorer::Data::DirEntry>::const_iterator it;
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync size_t i = 0;
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync for (it = m->entryList.begin();
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync it != m->entryList.end();
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync ++it, ++i)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync {
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync const VFSExplorer::Data::DirEntry &entry = (*it);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync Bstr bstr(entry.name);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync bstr.cloneTo(&sfaNames[i]);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync sfaTypes[i] = entry.type;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync }
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync sfaNames.detachTo(ComSafeArrayOutArg(aNames));
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync sfaTypes.detachTo(ComSafeArrayOutArg(aTypes));
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync return S_OK;
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync}
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsyncSTDMETHODIMP VFSExplorer::Exists(ComSafeArrayIn(IN_BSTR, aNames), ComSafeArrayOut(BSTR, aExists))
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync{
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync CheckComArgSafeArrayNotNull(aNames);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync AutoCaller autoCaller(this);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync com::SafeArray<IN_BSTR> sfaNames(ComSafeArrayInArg(aNames));
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync std::list<BSTR> listExists;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync std::list<VFSExplorer::Data::DirEntry>::const_iterator it;
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync for (it = m->entryList.begin();
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync it != m->entryList.end();
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync ++it)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync {
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync const VFSExplorer::Data::DirEntry &entry = (*it);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync for (size_t a=0; a < sfaNames.size(); ++a)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (entry.name == RTPathFilename(Utf8Str(sfaNames[a]).c_str()))
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
b978e5849454446957177fd47ee98609ab0457a6vboxsync BSTR name;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync Bstr tmp(sfaNames[a]); /* gcc-3.3 cruft */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync tmp.cloneTo(&name);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync listExists.push_back(name);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync com::SafeArray<BSTR> sfaExists(listExists);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync sfaExists.detachTo(ComSafeArrayOutArg(aExists));
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync return S_OK;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync}
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsyncSTDMETHODIMP VFSExplorer::Remove(ComSafeArrayIn(IN_BSTR, aNames), IProgress **aProgress)
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync{
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync CheckComArgSafeArrayNotNull(aNames);
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync CheckComArgOutPointerValid(aProgress);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync AutoCaller autoCaller(this);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync HRESULT rc = S_OK;
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
8e8844a522f5d335f177a0313b03067d79cce201vboxsync com::SafeArray<IN_BSTR> sfaNames(ComSafeArrayInArg(aNames));
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync ComObjPtr<Progress> progress;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync try
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /* Create the progress object */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync progress.createObject();
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync rc = progress->init(mVirtualBox, static_cast<IVFSExplorer*>(this),
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync Bstr(tr("Delete files")),
b978e5849454446957177fd47ee98609ab0457a6vboxsync TRUE /* aCancelable */);
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync if (FAILED(rc)) throw rc;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync /* Initialize our worker task */
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync std::auto_ptr<TaskVFSExplorer> task(new TaskVFSExplorer(TaskVFSExplorer::Delete, this, progress));
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync /* Add all filenames to delete as task data */
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync for (size_t a=0; a < sfaNames.size(); ++a)
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync task->filenames.push_back(Utf8Str(sfaNames[a]));
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync rc = task->startThread();
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync if (FAILED(rc)) throw rc;
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync /* Don't destruct on success */
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync task.release();
9e4166cf5ed4940f506bc718ea6c89bf7ed252c8vboxsync }
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync catch (HRESULT aRC)
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync {
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync rc = aRC;
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync if (SUCCEEDED(rc))
ce2d2eef2525963979102e63c2419d1c69d767ccvboxsync /* Return progress to the caller */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync progress.queryInterfaceTo(aProgress);
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync return rc;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync}
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync