GuestDirectoryImpl.cpp revision e86baafe99d1f1eb37adcca5fdecfd06e7f13bc5
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/* $Id$ */
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/** @file
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * VirtualBox Main - Guest directory handling.
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington */
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/*
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * Copyright (C) 2012-2013 Oracle Corporation
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington *
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * This file is part of VirtualBox Open Source Edition (OSE), as
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * available from http://www.virtualbox.org. This file is free software;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * you can redistribute it and/or modify it under the terms of the GNU
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * General Public License (GPL) as published by the Free Software
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * Foundation, in version 2 as it comes in the "COPYING" file of the
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington */
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/*******************************************************************************
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington* Header Files *
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington*******************************************************************************/
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#include "GuestDirectoryImpl.h"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#include "GuestSessionImpl.h"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#include "GuestCtrlImplPrivate.h"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#include "Global.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "AutoCaller.h"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include <VBox/com/array.h>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifdef LOG_GROUP
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster #undef LOG_GROUP
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#endif
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define LOG_GROUP LOG_GROUP_GUEST_CONTROL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include <VBox/log.h>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster// constructor / destructor
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/////////////////////////////////////////////////////////////////////////////
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterDEFINE_EMPTY_CTOR_DTOR(GuestDirectory)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterHRESULT GuestDirectory::FinalConstruct(void)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFunc(("\n"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return BaseFinalConstruct();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostervoid GuestDirectory::FinalRelease(void)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFuncEnter();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster uninit();
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington BaseFinalRelease();
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna LogFlowThisFuncLeave();
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster// public initializer/uninitializer for internal purposes only
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/////////////////////////////////////////////////////////////////////////////
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterint GuestDirectory::init(Console *pConsole, GuestSession *pSession,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ULONG uDirID, const GuestDirectoryOpenInfo &openInfo)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFunc(("pConsole=%p, pSession=%p, uDirID=%RU32, strPath=%s, strFilter=%s, uFlags=%x\n",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pConsole, pSession, uDirID, openInfo.mPath.c_str(), openInfo.mFilter.c_str(),
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major openInfo.mFlags));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertPtrReturn(pConsole, VERR_INVALID_POINTER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertPtrReturn(pSession, VERR_INVALID_POINTER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper /* Enclose the state transition NotReady->InInit->Ready. */
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper AutoInitSpan autoInitSpan(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertReturn(autoInitSpan.isOk(), E_FAIL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifndef VBOX_WITH_GUEST_CONTROL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster autoInitSpan.setSucceeded();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return VINF_SUCCESS;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#else
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int vrc = bindToSession(pConsole, pSession, uDirID /* Object ID */);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(vrc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mSession = pSession;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mID = uDirID;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo = openInfo;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(vrc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Start the directory process on the guest. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster GuestProcessStartupInfo procInfo;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mName = Utf8StrFmt(tr("Reading directory \"%s\"", openInfo.mPath.c_str()));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_LS);
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper procInfo.mTimeoutMS = 5 * 60 * 1000; /* 5 minutes timeout. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* We want the long output format which contains all the object details. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mArguments.push_back(Utf8Str("-l"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#if 0 /* Flags are not supported yet. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (uFlags & DirectoryOpenFlag_NoSymlinks)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mArguments.push_back(Utf8Str("--nosymlinks")); /** @todo What does GNU here? */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#endif
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** @todo Recursion support? */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster procInfo.mArguments.push_back(openInfo.mPath); /* The directory we want to open. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Start the process asynchronously and keep it around so that we can use
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * it later in subsequent read() calls.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Note: No guest rc available because operation is asynchronous.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster vrc = mData.mProcessTool.Init(mSession, procInfo,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster true /* Async */, NULL /* Guest rc */);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(vrc))
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper {
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper /* Confirm a successful initialization when it's the case. */
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper autoInitSpan.setSucceeded();
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper return vrc;
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper }
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major else
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major autoInitSpan.setFailed();
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper return vrc;
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major#endif /* VBOX_WITH_GUEST_CONTROL */
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major}
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper/**
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna * Uninitializes the instance.
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna * Called from FinalRelease().
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna */
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Lunavoid GuestDirectory::uninit(void)
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna{
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna LogFlowThisFuncEnter();
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna /* Enclose the state transition Ready->InUninit->NotReady. */
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna AutoUninitSpan autoUninitSpan(this);
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna if (autoUninitSpan.uninitDone())
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna return;
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna LogFlowThisFuncLeave();
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna}
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna// implementation of public getters/setters for attributes
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper/////////////////////////////////////////////////////////////////////////////
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David LunaSTDMETHODIMP GuestDirectory::COMGETTER(DirectoryName)(BSTR *aName)
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna{
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna LogFlowThisFuncEnter();
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper CheckComArgOutPointerValid(aName);
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna
57a1b25dcdf865eacb2fe2e17c5ca83e942da047David Luna AutoCaller autoCaller(this);
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper if (FAILED(autoCaller.rc())) return autoCaller.rc();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major mData.mOpenInfo.mPath.cloneTo(aName);
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return S_OK;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterSTDMETHODIMP GuestDirectory::COMGETTER(Filter)(BSTR *aFilter)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major LogFlowThisFuncEnter();
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CheckComArgOutPointerValid(aFilter);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AutoCaller autoCaller(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (FAILED(autoCaller.rc())) return autoCaller.rc();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mFilter.cloneTo(aFilter);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return S_OK;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster// private methods
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/////////////////////////////////////////////////////////////////////////////
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterint GuestDirectory::callbackDispatcher(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertPtrReturn(pCbCtx, VERR_INVALID_POINTER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFunc(("strPath=%s, uContextID=%RU32, uFunction=%RU32, pSvcCb=%p\n",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mPath.c_str(), pCbCtx->uContextID, pCbCtx->uFunction, pSvcCb));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major int vrc;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (pCbCtx->uFunction)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case GUEST_DIR_NOTIFY:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int idx = 1; /* Current parameter index. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CALLBACKDATA_DIR_NOTIFY dataCb;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* pSvcCb->mpaParms[0] always contains the context ID. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pSvcCb->mpaParms[idx++].getUInt32(&dataCb.uType);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pSvcCb->mpaParms[idx++].getUInt32(&dataCb.rc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major int guestRc = (int)dataCb.rc; /* uint32_t vs. int. */
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowFunc(("uType=%RU32, guestRc=%Rrc\n",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dataCb.uType, guestRc));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (dataCb.uType)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Nothing here yet, nothing to dispatch further. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major vrc = VERR_NOT_SUPPORTED;
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Silently ignore not implemented functions. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster vrc = VERR_NOT_SUPPORTED;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifdef DEBUG
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowFuncLeaveRC(vrc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#endif
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return vrc;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/* static */
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterUtf8Str GuestDirectory::guestErrorToString(int guestRc)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Utf8Str strError;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** @todo pData->u32Flags: int vs. uint32 -- IPRT errors are *negative* !!! */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (guestRc)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case VERR_DIR_NOT_EMPTY:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster strError += Utf8StrFmt("Directoy is not empty");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster strError += Utf8StrFmt("%Rrc", guestRc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return strError;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Called by IGuestSession right before this directory gets
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * removed from the public directory list.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterint GuestDirectory::onRemove(void)
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major{
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major LogFlowThisFuncEnter();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int vrc = VINF_SUCCESS;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowFuncLeaveRC(vrc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return vrc;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/* static */
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterHRESULT GuestDirectory::setErrorExternal(VirtualBoxBase *pInterface, int guestRc)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertPtr(pInterface);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertMsg(RT_FAILURE(guestRc), ("Guest rc does not indicate a failure when setting error\n"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pInterface->setError(VBOX_E_IPRT_ERROR, GuestDirectory::guestErrorToString(guestRc).c_str());
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major}
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster// implementation of public methods
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/////////////////////////////////////////////////////////////////////////////
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ecb73e63056eb80738d8460818f1a742f515de1cPeter MajorSTDMETHODIMP GuestDirectory::Close(void)
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifndef VBOX_WITH_GUEST_CONTROL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ReturnComNotImplemented();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#else
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFuncEnter();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AutoCaller autoCaller(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (FAILED(autoCaller.rc())) return autoCaller.rc();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major AssertPtr(mSession);
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major int rc = mSession->directoryRemoveFromList(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AssertRC(rc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HRESULT hr = S_OK;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int guestRc;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = mData.mProcessTool.Terminate(30 * 1000, &guestRc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_FAILURE(rc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (rc)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case VERR_GSTCTL_GUEST_ERROR:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr = GuestProcess::setErrorExternal(this, guestRc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington case VERR_NOT_SUPPORTED:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Silently skip old Guest Additions which do not support killing the
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major * the guest directory handling process. */
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr = setError(VBOX_E_IPRT_ERROR,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tr("Terminating open guest directory \"%s\" failed: %Rrc"),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mPath.c_str(), rc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Release autocaller before calling uninit.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster autoCaller.release();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster uninit();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major return hr;
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major#endif /* VBOX_WITH_GUEST_CONTROL */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterSTDMETHODIMP GuestDirectory::Read(IFsObjInfo **aInfo)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifndef VBOX_WITH_GUEST_CONTROL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ReturnComNotImplemented();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#else
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major LogFlowThisFuncEnter();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AutoCaller autoCaller(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (FAILED(autoCaller.rc())) return autoCaller.rc();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster GuestProcessStreamBlock curBlock;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int guestRc;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int rc = mData.mProcessTool.WaitEx(GUESTPROCESSTOOL_FLAG_STDOUT_BLOCK,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster &curBlock, &guestRc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Note: The guest process can still be around to serve the next
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * upcoming stream block next time.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( RT_SUCCESS(rc)
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper && !mData.mProcessTool.IsRunning())
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = mData.mProcessTool.TerminatedOk(NULL /* Exit code */);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (rc == VERR_NOT_EQUAL)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = VERR_ACCESS_DENIED;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(rc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (curBlock.GetCount()) /* Did we get content? */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster GuestFsObjData objData;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = objData.FromLs(curBlock);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_FAILURE(rc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = VERR_PATH_NOT_FOUND;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(rc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Create the object. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ComObjPtr<GuestFsObjInfo> pFsObjInfo;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HRESULT hr2 = pFsObjInfo.createObject();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (FAILED(hr2))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = VERR_COM_UNEXPECTED;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(rc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = pFsObjInfo->init(objData);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (RT_SUCCESS(rc))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Return info object to the caller. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr2 = pFsObjInfo.queryInterfaceTo(aInfo);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (FAILED(hr2))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = VERR_COM_UNEXPECTED;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster else
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* Nothing to read anymore. Tell the caller. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rc = VERR_NO_MORE_FILES;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HRESULT hr = S_OK;
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major if (RT_FAILURE(rc)) /** @todo Add more errors here. */
b174f2fef6b1d8ee82424e19de3ad21f872c1ed7Mark de Reeper {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (rc)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case VERR_GSTCTL_GUEST_ERROR:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr = GuestProcess::setErrorExternal(this, guestRc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major case VERR_ACCESS_DENIED:
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major hr = setError(VBOX_E_IPRT_ERROR, tr("Reading directory \"%s\" failed: Unable to read / access denied"),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mPath.c_str());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case VERR_PATH_NOT_FOUND:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr = setError(VBOX_E_IPRT_ERROR, tr("Reading directory \"%s\" failed: Path not found"),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mPath.c_str());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case VERR_NO_MORE_FILES:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /* See SDK reference. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr = setError(VBOX_E_OBJECT_NOT_FOUND, tr("No more entries for directory \"%s\""),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mPath.c_str());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hr = setError(VBOX_E_IPRT_ERROR, tr("Error while reading directory \"%s\": %Rrc\n"),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mData.mOpenInfo.mPath.c_str(), rc);
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major break;
ecb73e63056eb80738d8460818f1a742f515de1cPeter Major }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return hr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#endif /* VBOX_WITH_GUEST_CONTROL */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster