GuestSessionImpl.cpp revision 4171ffb38eb8720b2ae9a8d13e95103ab26cfd12
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VirtualBox Main - Guest session handling.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2012-2013 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
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "GuestImpl.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "GuestSessionImpl.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "GuestCtrlImplPrivate.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "VirtualBoxErrorInfoImpl.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "Global.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "AutoCaller.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "ProgressImpl.h"
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#include "VBoxEvents.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "VMMDev.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <memory> /* For auto_ptr. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/cpp/utils.h> /* For unconst(). */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#include <iprt/env.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/file.h> /* For CopyTo/From. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/com/array.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/com/listeners.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/version.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef LOG_GROUP
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync #undef LOG_GROUP
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define LOG_GROUP LOG_GROUP_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/log.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Base class representing an internal
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * asynchronous session task.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncclass GuestSessionTaskInternal
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncpublic:
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionTaskInternal(GuestSession *pSession)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync : mSession(pSession),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mRC(VINF_SUCCESS) { }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync virtual ~GuestSessionTaskInternal(void) { }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc(void) const { return mRC; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool isOk(void) const { return RT_SUCCESS(mRC); }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const ComObjPtr<GuestSession> &Session(void) const { return mSession; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncprotected:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const ComObjPtr<GuestSession> mSession;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int mRC;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Class for asynchronously opening a guest session.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncclass GuestSessionTaskInternalOpen : public GuestSessionTaskInternal
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncpublic:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionTaskInternalOpen(GuestSession *pSession)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync : GuestSessionTaskInternal(pSession) { }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Internal listener class to serve events in an
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * active manner, e.g. without polling delays.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncclass GuestSessionListener
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncpublic:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync GuestSessionListener(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT init(GuestSession *pSession)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync {
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync mSession = pSession;
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void uninit(void)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mSession.setNull();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync {
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync switch (aType)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync {
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync case VBoxEventType_OnGuestSessionStateChanged:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync Assert(!mSession.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc2 = mSession->signalWaitEvent(aType, aEvent);
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync#ifdef DEBUG_andy
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync LogFlowFunc(("Signalling events of type=%ld, session=%p resulted in rc=%Rrc\n",
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync aType, mSession, rc2));
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#endif
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync break;
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync }
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync default:
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync AssertMsgFailed(("Unhandled event %ld\n", aType));
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync break;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncprivate:
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync ComObjPtr<GuestSession> mSession;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync};
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsynctypedef ListenerImpl<GuestSessionListener, GuestSession*> GuestSessionListenerImpl;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncVBOX_LISTENER_DECLARE(GuestSessionListenerImpl)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync// constructor / destructor
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync/////////////////////////////////////////////////////////////////////////////
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncDEFINE_EMPTY_CTOR_DTOR(GuestSession)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncHRESULT GuestSession::FinalConstruct(void)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlowThisFunc(("\n"));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync return BaseFinalConstruct();
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync}
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncvoid GuestSession::FinalRelease(void)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync{
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync LogFlowThisFuncEnter();
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync uninit();
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync BaseFinalRelease();
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync LogFlowThisFuncLeave();
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync}
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync// public initializer/uninitializer for internal purposes only
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/////////////////////////////////////////////////////////////////////////////
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/**
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync * Initializes a guest session but does *not* open in on the guest side
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync * yet. This needs to be done via the openSession() / openSessionAsync calls.
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync *
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync * @return IPRT status code.
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync ** @todo Docs!
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync */
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsyncint GuestSession::init(Guest *pGuest, const GuestSessionStartupInfo &ssInfo,
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync const GuestCredentials &guestCreds)
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlowThisFunc(("pGuest=%p, ssInfo=%p, guestCreds=%p\n",
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync pGuest, &ssInfo, &guestCreds));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync /* Enclose the state transition NotReady->InInit->Ready. */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync AutoInitSpan autoInitSpan(this);
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync AssertReturn(autoInitSpan.isOk(), VERR_OBJECT_DESTROYED);
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
b8aaccdbdd143967110d499670605dd7ff6ecc72vboxsync autoInitSpan.setSucceeded();
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync return VINF_SUCCESS;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pGuest, VERR_INVALID_POINTER);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mParent = pGuest;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Copy over startup info. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Use an overloaded copy operator. Later. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mID = ssInfo.mID;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mIsInternal = ssInfo.mIsInternal;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mName = ssInfo.mName;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mOpenFlags = ssInfo.mOpenFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mOpenTimeoutMS = ssInfo.mOpenTimeoutMS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Use an overloaded copy operator. Later. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mCredentials.mUser = guestCreds.mUser;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mCredentials.mPassword = guestCreds.mPassword;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mCredentials.mDomain = guestCreds.mDomain;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mRC = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mStatus = GuestSessionStatus_Undefined;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mNumObjects = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = queryInfo();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = unconst(mEventSource).createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync {
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync hr = mEventSource->init(static_cast<IGuestSession*>(this));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_COM_UNEXPECTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionListener *pListener = new GuestSessionListener();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestSessionListenerImpl> thisListener;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = thisListener.createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = thisListener->init(pListener, this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray <VBoxEventType_T> eventTypes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync eventTypes.push_back(VBoxEventType_OnGuestSessionStateChanged);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = mEventSource->RegisterListener(thisListener,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComSafeArrayAsInParam(eventTypes),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync TRUE /* Active listener */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mLocalListener = thisListener;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = RTCritSectInit(&mWaitEventCritSect);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_COM_UNEXPECTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_COM_UNEXPECTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch(std::bad_alloc &)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NO_MEMORY;
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync }
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Confirm a successful initialization when it's the case. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync autoInitSpan.setSucceeded();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync autoInitSpan.setFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync LogFlowThisFunc(("mName=%s, mID=%RU32, mIsInternal=%RTbool, rc=%Rrc\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mName.c_str(), mData.mSession.mID, mData.mSession.mIsInternal, rc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/**
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync * Uninitializes the instance.
6b022885f2cb6a55167609edecd89570cd80001dvboxsync * Called from FinalRelease().
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncvoid GuestSession::uninit(void)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync /* Enclose the state transition Ready->InUninit->NotReady. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoUninitSpan autoUninitSpan(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (autoUninitSpan.uninitDone())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("Closing directories (%RU64 total)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mDirectories.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (SessionDirectories::iterator itDirs = mData.mDirectories.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itDirs != mData.mDirectories.end(); ++itDirs)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itDirs->second->Release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mDirectories.clear();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("Closing files (%RU64 total)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mFiles.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (SessionFiles::iterator itFiles = mData.mFiles.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itFiles != mData.mFiles.end(); ++itFiles)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itFiles->second->Release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mFiles.clear();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("Closing processes (%RU64 total)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mProcesses.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (SessionProcesses::iterator itProcs = mData.mProcesses.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itProcs != mData.mProcesses.end(); ++itProcs)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itProcs->second->Release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync mData.mProcesses.clear();
9782b553bdb12385214a3ac596aff1476bcb7cbdvboxsync
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync LogFlowThisFunc(("mNumObjects=%RU32\n", mData.mNumObjects));
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync baseUninit();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mEventSource->UnregisterListener(mLocalListener);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unconst(mEventSource).setNull();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync// implementation of public getters/setters for attributes
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/////////////////////////////////////////////////////////////////////////////
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::COMGETTER(User)(BSTR *aUser)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aUser);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mCredentials.mUser.cloneTo(aUser);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::COMGETTER(Domain)(BSTR *aDomain)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aDomain);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mCredentials.mDomain.cloneTo(aDomain);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::COMGETTER(Name)(BSTR *aName)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
e52f819639386db020b2a635b47a415248c7fbf9vboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e02db9e0d46f862430895b82b10e8ecde075cf11vboxsync CheckComArgOutPointerValid(aName);
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mName.cloneTo(aName);
0e77737b0ba913683e614db11463b31ca67aacbevboxsync
0e77737b0ba913683e614db11463b31ca67aacbevboxsync LogFlowThisFuncLeave();
0e77737b0ba913683e614db11463b31ca67aacbevboxsync return S_OK;
0e77737b0ba913683e614db11463b31ca67aacbevboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync}
0e77737b0ba913683e614db11463b31ca67aacbevboxsync
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsyncSTDMETHODIMP GuestSession::COMGETTER(Id)(ULONG *aId)
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync{
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync#ifndef VBOX_WITH_GUEST_CONTROL
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync ReturnComNotImplemented();
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync#else
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync LogFlowThisFuncEnter();
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync CheckComArgOutPointerValid(aId);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync AutoCaller autoCaller(this);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync
0e77737b0ba913683e614db11463b31ca67aacbevboxsync *aId = mData.mSession.mID;
0e77737b0ba913683e614db11463b31ca67aacbevboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync}
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncSTDMETHODIMP GuestSession::COMGETTER(Status)(GuestSessionStatus_T *aStatus)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aStatus);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync AutoCaller autoCaller(this);
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aStatus = mData.mStatus;
e98b0df488a9ec7732b1d5c2e735ce707842e975vboxsync
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::COMGETTER(Timeout)(ULONG *aTimeout)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
6b022885f2cb6a55167609edecd89570cd80001dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync ReturnComNotImplemented();
6b022885f2cb6a55167609edecd89570cd80001dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aTimeout);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aTimeout = mData.mTimeout;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::COMSETTER(Timeout)(ULONG aTimeout)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync LogFlowThisFuncEnter();
65eb75d34c65a45c0945358715253950d63e440cvboxsync
65eb75d34c65a45c0945358715253950d63e440cvboxsync AutoCaller autoCaller(this);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync mData.mTimeout = aTimeout;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
6b022885f2cb6a55167609edecd89570cd80001dvboxsync}
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsyncSTDMETHODIMP GuestSession::COMGETTER(ProtocolVersion)(ULONG *aVersion)
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync{
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
a6936eab59adc5624216e6e5e5e455fc6a40df7fvboxsync ReturnComNotImplemented();
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync#else
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync LogFlowThisFuncEnter();
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync CheckComArgOutPointerValid(aVersion);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync AutoCaller autoCaller(this);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aVersion = mData.mProtocolVersion;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync LogFlowThisFuncLeave();
6b022885f2cb6a55167609edecd89570cd80001dvboxsync return S_OK;
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync}
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsyncSTDMETHODIMP GuestSession::COMGETTER(Environment)(ComSafeArrayOut(BSTR, aEnvironment))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync ReturnComNotImplemented();
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync#else
440444d68cda7866c59e2e3d3f236608ef1c316fvboxsync LogFlowThisFuncEnter();
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutSafeArrayPointerValid(aEnvironment);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync size_t cEnvVars = mData.mEnvironment.Size();
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync LogFlowThisFunc(("[%s]: cEnvVars=%RU32\n",
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync mData.mSession.mName.c_str(), cEnvVars));
6b022885f2cb6a55167609edecd89570cd80001dvboxsync com::SafeArray<BSTR> environment(cEnvVars);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync for (size_t i = 0; i < cEnvVars; i++)
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync {
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync Bstr strEnv(mData.mEnvironment.Get(i));
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync strEnv.cloneTo(&environment[i]);
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync }
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync environment.detachTo(ComSafeArrayOutArg(aEnvironment));
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync LogFlowThisFuncLeave();
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync return S_OK;
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync}
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsyncSTDMETHODIMP GuestSession::COMSETTER(Environment)(ComSafeArrayIn(IN_BSTR, aValues))
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync{
6b022885f2cb6a55167609edecd89570cd80001dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
8e8844a522f5d335f177a0313b03067d79cce201vboxsync ReturnComNotImplemented();
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync#else
8e8844a522f5d335f177a0313b03067d79cce201vboxsync LogFlowThisFuncEnter();
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync AutoCaller autoCaller(this);
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync com::SafeArray<IN_BSTR> environment(ComSafeArrayInArg(aValues));
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync int rc = VINF_SUCCESS;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync for (size_t i = 0; i < environment.size() && RT_SUCCESS(rc); i++)
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync {
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync Utf8Str strEnv(environment[i]);
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync if (!strEnv.isEmpty()) /* Silently skip empty entries. */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync rc = mData.mEnvironment.Set(strEnv);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync }
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync HRESULT hr = RT_SUCCESS(rc) ? S_OK : VBOX_E_IPRT_ERROR;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync LogFlowFuncLeaveRC(hr);
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync return hr;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync}
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncSTDMETHODIMP GuestSession::COMGETTER(Processes)(ComSafeArrayOut(IGuestProcess *, aProcesses))
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync{
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
6b022885f2cb6a55167609edecd89570cd80001dvboxsync ReturnComNotImplemented();
8e8844a522f5d335f177a0313b03067d79cce201vboxsync#else
9a12d720d4db6c26d09600ddab781ad8df5e1826vboxsync LogFlowThisFuncEnter();
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
9a12d720d4db6c26d09600ddab781ad8df5e1826vboxsync CheckComArgOutSafeArrayPointerValid(aProcesses);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync AutoCaller autoCaller(this);
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync SafeIfaceArray<IGuestProcess> collection(mData.mProcesses);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync collection.detachTo(ComSafeArrayOutArg(aProcesses));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlowFunc(("mProcesses=%zu\n", collection.size()));
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync return S_OK;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync}
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncSTDMETHODIMP GuestSession::COMGETTER(Directories)(ComSafeArrayOut(IGuestDirectory *, aDirectories))
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync{
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync ReturnComNotImplemented();
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync#else
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync LogFlowThisFuncEnter();
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync CheckComArgOutSafeArrayPointerValid(aDirectories);
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync AutoCaller autoCaller(this);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync SafeIfaceArray<IGuestDirectory> collection(mData.mDirectories);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync collection.detachTo(ComSafeArrayOutArg(aDirectories));
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync LogFlowFunc(("mDirectories=%zu\n", collection.size()));
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync return S_OK;
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync}
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncSTDMETHODIMP GuestSession::COMGETTER(Files)(ComSafeArrayOut(IGuestFile *, aFiles))
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync{
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
6b022885f2cb6a55167609edecd89570cd80001dvboxsync ReturnComNotImplemented();
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync#else
6b022885f2cb6a55167609edecd89570cd80001dvboxsync LogFlowThisFuncEnter();
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync CheckComArgOutSafeArrayPointerValid(aFiles);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync AutoCaller autoCaller(this);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync SafeIfaceArray<IGuestFile> collection(mData.mFiles);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync collection.detachTo(ComSafeArrayOutArg(aFiles));
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync LogFlowFunc(("mFiles=%zu\n", collection.size()));
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync return S_OK;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync}
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncSTDMETHODIMP GuestSession::COMGETTER(EventSource)(IEventSource ** aEventSource)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync ReturnComNotImplemented();
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync#else
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync LogFlowThisFuncEnter();
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync CheckComArgOutPointerValid(aEventSource);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync AutoCaller autoCaller(this);
8e8844a522f5d335f177a0313b03067d79cce201vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync // no need to lock - lifetime constant
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync mEventSource.queryInterfaceTo(aEventSource);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync LogFlowThisFuncLeave();
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync return S_OK;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync}
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync// private methods
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync///////////////////////////////////////////////////////////////////////////////
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsyncint GuestSession::closeSession(uint32_t uFlags, uint32_t uTimeoutMS, int *pGuestRc)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync{
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync LogFlowThisFunc(("uFlags=%x, uTimeoutMS=%RU32\n", uFlags, uTimeoutMS));
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /* Guest Additions < 4.3 don't support closing dedicated
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync guest sessions, skip. */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (mData.mProtocolVersion < 2)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync LogFlowThisFunc(("Installed Guest Additions don't support closing dedicated sessions, skipping\n"));
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync return VINF_SUCCESS;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync }
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
8e8844a522f5d335f177a0313b03067d79cce201vboxsync /** @todo uFlags validation. */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (mData.mStatus != GuestSessionStatus_Started)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync LogFlowThisFunc(("Session ID=%RU32 not started (anymore), status now is: %ld\n",
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync mData.mSession.mID, mData.mStatus));
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync return VINF_SUCCESS;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync int vrc;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync GuestWaitEvent *pEvent = NULL;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync GuestEventTypes eventTypes;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync try
6b022885f2cb6a55167609edecd89570cd80001dvboxsync {
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync eventTypes.push_back(VBoxEventType_OnGuestSessionStateChanged);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync vrc = registerWaitEvent(mData.mSession.mID, 0 /* Object ID */,
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync eventTypes, &pEvent);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync catch (std::bad_alloc)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync {
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync vrc = VERR_NO_MEMORY;
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync if (RT_FAILURE(vrc))
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync return vrc;
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync LogFlowThisFunc(("Sending closing request to guest session ID=%RU32, uFlags=%x\n",
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync mData.mSession.mID, uFlags));
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync VBOXHGCMSVCPARM paParms[4];
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync int i = 0;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync paParms[i++].setUInt32(pEvent->ContextID());
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync paParms[i++].setUInt32(uFlags);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync alock.release(); /* Drop the write lock before waiting. */
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync vrc = sendCommand(HOST_SESSION_CLOSE, i, paParms);
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync if (RT_SUCCESS(vrc))
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync vrc = waitForStatusChange(pEvent, GuestSessionWaitForFlag_Terminate, uTimeoutMS,
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync NULL /* Session status */, pGuestRc);
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync unregisterWaitEvent(pEvent);
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync LogFlowFuncLeaveRC(vrc);
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync return vrc;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync}
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsyncint GuestSession::directoryCreateInternal(const Utf8Str &strPath, uint32_t uMode,
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync uint32_t uFlags, int *pGuestRc)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync{
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync LogFlowThisFunc(("strPath=%s, uMode=%x, uFlags=%x\n",
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync strPath.c_str(), uMode, uFlags));
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync int vrc = VINF_SUCCESS;
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync GuestProcessStartupInfo procInfo;
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_MKDIR);
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync procInfo.mFlags = ProcessCreateFlag_Hidden;
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync try
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync {
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync /* Construct arguments. */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync if (uFlags & DirectoryCreateFlag_Parents)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync procInfo.mArguments.push_back(Utf8Str("--parents")); /* We also want to create the parent directories. */
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (uMode)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync {
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync procInfo.mArguments.push_back(Utf8Str("--mode")); /* Set the creation mode. */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync char szMode[16];
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync if (RTStrPrintf(szMode, sizeof(szMode), "%o", uMode))
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync procInfo.mArguments.push_back(Utf8Str(szMode));
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_BUFFER_OVERFLOW;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(strPath); /* The directory we want to create. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = GuestProcessTool::Run(this, procInfo, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncinline bool GuestSession::directoryExists(uint32_t uDirID, ComObjPtr<GuestDirectory> *pDir)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionDirectories::const_iterator it = mData.mDirectories.find(uDirID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (it != mData.mDirectories.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pDir)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pDir = it->second;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::directoryQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = fsQueryInfoInternal(strPath, objData, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = objData.mType == FsObjType_Directory
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ? VINF_SUCCESS : VERR_NOT_A_DIRECTORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::directoryRemoveFromList(GuestDirectory *pDirectory)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (SessionDirectories::iterator itDirs = mData.mDirectories.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itDirs != mData.mDirectories.end(); ++itDirs)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pDirectory == itDirs->second)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Bstr strName;
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync HRESULT hr = itDirs->second->COMGETTER(DirectoryName)(strName.asOutParam());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(mData.mDirectories.size());
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync LogFlowFunc(("Removing directory \"%s\" (Session: %RU32) (now total %ld directories)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(strName).c_str(), mData.mSession.mID, mData.mDirectories.size() - 1));
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync mData.mDirectories.erase(itDirs);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync return VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncint GuestSession::directoryRemoveInternal(const Utf8Str &strPath, uint32_t uFlags,
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync int *pGuestRc)
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync{
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync AssertReturn(!(uFlags & ~DIRREMOVE_FLAG_VALID_MASK), VERR_INVALID_PARAMETER);
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync
08bc90fc2848c80bf8270bedc883745b8398e186vboxsync LogFlowThisFunc(("strPath=%s, uFlags=0x%x\n", strPath.c_str(), uFlags));
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync GuestWaitEvent *pEvent = NULL;
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync int vrc = registerWaitEvent(mData.mSession.mID, 0 /* Object ID */,
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync &pEvent);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync /* Prepare HGCM call. */
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync VBOXHGCMSVCPARM paParms[8];
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync int i = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paParms[i++].setUInt32(pEvent->ContextID());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paParms[i++].setPointer((void*)strPath.c_str(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync (ULONG)strPath.length() + 1);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paParms[i++].setUInt32(uFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Drop write lock before sending. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = sendCommand(HOST_DIR_REMOVE, i, paParms);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = pEvent->Wait(30 * 1000);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( vrc == VERR_GSTCTL_GUEST_ERROR
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync && pGuestRc)
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync *pGuestRc = pEvent->GuestResult();
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync }
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync unregisterWaitEvent(pEvent);
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync
7c3417bbf525c03163d54d151a277a981d5d61b6vboxsync LogFlowFuncLeaveRC(vrc);
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync return vrc;
8b984478b755f4d3091b977d9beac9fb7434279fvboxsync}
8b984478b755f4d3091b977d9beac9fb7434279fvboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsyncint GuestSession::objectCreateTempInternal(const Utf8Str &strTemplate, const Utf8Str &strPath,
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync bool fDirectory, const Utf8Str &strName, int *pGuestRc)
51d4024e2984de499ecd878341898f71f55cf9e0vboxsync{
51d4024e2984de499ecd878341898f71f55cf9e0vboxsync LogFlowThisFunc(("strTemplate=%s, strPath=%s, fDirectory=%RTbool, strName=%s\n",
8b984478b755f4d3091b977d9beac9fb7434279fvboxsync strTemplate.c_str(), strPath.c_str(), fDirectory, strName.c_str()));
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync int vrc = VINF_SUCCESS;
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestProcessStartupInfo procInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_MKTEMP);
14e483cf65160fb363043534151245ae4c215766vboxsync procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fDirectory)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(Utf8Str("-d"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (strPath.length()) /* Otherwise use /tmp or equivalent. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(Utf8Str("-t"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(strPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(strTemplate);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = GuestProcessTool::Run(this, procInfo, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::directoryOpenInternal(const GuestDirectoryOpenInfo &openInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestDirectory> &pDirectory, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("strPath=%s, strPath=%s, uFlags=%x\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mPath.c_str(), openInfo.mFilter.c_str(), openInfo.mFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VERR_MAX_PROCS_REACHED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mNumObjects >= VBOX_GUESTCTRL_MAX_OBJECTS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync
47b5427d1a541bcd269bc625c35b19d849071edfvboxsync /* Create a new (host-based) directory ID and assign it. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uNewDirID = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG uTries = 0;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
3964eef78ab9593263a3a982e26216d4d166869cvboxsync for (;;)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
f02b41a7e54fc4e6b714f4e60260d94614d6e2e7vboxsync /* Is the directory ID already used? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!directoryExists(uNewDirID, NULL /* pDirectory */))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync /* Callback with context ID was not found. This means
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * we can use this context ID for our new callback we want
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * to add below. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync uNewDirID++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (uNewDirID == VBOX_GUESTCTRL_MAX_OBJECTS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewDirID = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (++uTries == UINT32_MAX)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break; /* Don't try too hard. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Create the directory object. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pDirectory.createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_COM_UNEXPECTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Console *pConsole = mParent->getConsole();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtr(pConsole);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = pDirectory->init(pConsole, this /* Parent */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewDirID, openInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Since this is a synchronous guest call we have to
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * register the file object first, releasing the session's
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * lock and then proceed with the actual opening command
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * -- otherwise the file's opening callback would hang
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * because the session's lock still is in place.
e7081fdf0305eaa621e0dd6decf8b28c33febc58vboxsync */
3123bb2477edc752585e4bbd8e4cfedaf87997d1vboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Add the created directory to our map. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mDirectories[uNewDirID] = pDirectory;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mNumObjects++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(mData.mNumObjects <= VBOX_GUESTCTRL_MAX_OBJECTS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("Added new guest directory \"%s\" (Session: %RU32) (now total %ld dirs, %ld objects)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mPath.c_str(), mData.mSession.mID, mData.mFiles.size(), mData.mNumObjects));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Release lock before firing off event. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Fire off a VBoxEventType_OnGuestDirectoryRegistered event? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync catch (std::bad_alloc &)
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync {
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync rc = VERR_NO_MEMORY;
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync {
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync /* Nothing further to do here yet. */
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync if (pGuestRc)
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync *pGuestRc = VINF_SUCCESS;
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync }
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync LogFlowFuncLeaveRC(vrc);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync return vrc;
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
eb90d5a431eee79842fb6c676c05aa9ca51ca6a9vboxsyncint GuestSession::dispatchToDirectory(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync LogFlowFunc(("pCtxCb=%p, pSvcCb=%p\n", pCtxCb, pSvcCb));
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pCtxCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
47b5427d1a541bcd269bc625c35b19d849071edfvboxsync if (pSvcCb->mParms < 3)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_INVALID_PARAMETER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uDirID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("uDirID=%RU32 (%RU32 total)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uDirID, mData.mFiles.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionDirectories::const_iterator itDir
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync = mData.mDirectories.find(uDirID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (itDir != mData.mDirectories.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestDirectory> pDirectory(itDir->second);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!pDirectory.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pDirectory->callbackDispatcher(pCtxCb, pSvcCb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::dispatchToFile(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("pCtxCb=%p, pSvcCb=%p\n", pCtxCb, pSvcCb));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pCtxCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uFileID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync#ifdef DEBUG
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync LogFlowFunc(("uFileID=%RU32 (%RU32 total)\n",
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync uFileID, mData.mFiles.size()));
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionFiles::const_iterator itFile
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync = mData.mFiles.find(uFileID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (itFile != mData.mFiles.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestFile> pFile(itFile->second);
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync Assert(!pFile.isNull());
47b5427d1a541bcd269bc625c35b19d849071edfvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3e6d3b0af632bdcd931b5149915c7b8be1a732cdvboxsync rc = pFile->callbackDispatcher(pCtxCb, pSvcCb);
47b5427d1a541bcd269bc625c35b19d849071edfvboxsync }
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync else
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync rc = VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::dispatchToObject(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("pCtxCb=%p, pSvcCb=%p\n", pCtxCb, pSvcCb));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pCtxCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uObjectID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Since we don't know which type the object is, we need to through all
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * all objects. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Speed this up by adding an object type to the callback context! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionProcesses::const_iterator itProc = mData.mProcesses.find(uObjectID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (itProc == mData.mProcesses.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionFiles::const_iterator itFile = mData.mFiles.find(uObjectID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (itFile != mData.mFiles.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = dispatchToFile(pCtxCb, pSvcCb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionDirectories::const_iterator itDir = mData.mDirectories.find(uObjectID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (itDir != mData.mDirectories.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync alock.release();
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = dispatchToDirectory(pCtxCb, pSvcCb);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = dispatchToProcess(pCtxCb, pSvcCb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::dispatchToProcess(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync LogFlowFunc(("pCtxCb=%p, pSvcCb=%p\n", pCtxCb, pSvcCb));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pCtxCb, VERR_INVALID_POINTER);
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uProcessID = VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCtxCb->uContextID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("uProcessID=%RU32 (%RU32 total)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uProcessID, mData.mProcesses.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionProcesses::const_iterator itProc
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync = mData.mProcesses.find(uProcessID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (itProc != mData.mProcesses.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestProcess> pProcess(itProc->second);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!pProcess.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Set protocol version so that pSvcCb can
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * be interpreted right. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pCtxCb->uProtocol = mData.mProtocolVersion;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pProcess->callbackDispatcher(pCtxCb, pSvcCb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
5b6e2c9a765c3c72295acc15791af8a700746956vboxsyncint GuestSession::dispatchToThis(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pCbCtx, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pSvcCb, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
08bc90fc2848c80bf8270bedc883745b8398e186vboxsync
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("sessionID=%RU32, CID=%RU32, uFunction=%RU32, pSvcCb=%p\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mID, pCbCtx->uContextID, pCbCtx->uFunction, pSvcCb));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync int rc;
c20b837b2c912dd4dcaaa676e15acd2b230108f0vboxsync switch (pCbCtx->uFunction)
c20b837b2c912dd4dcaaa676e15acd2b230108f0vboxsync {
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync case GUEST_DISCONNECTED:
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync /** @todo Handle closing all guest objects. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync case GUEST_SESSION_NOTIFY: /* Guest Additions >= 4.3.0. */
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync {
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync rc = onSessionStatusChange(pCbCtx, pSvcCb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Silently skip unknown callbacks. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NOT_SUPPORTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncinline bool GuestSession::fileExists(uint32_t uFileID, ComObjPtr<GuestFile> *pFile)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionFiles::const_iterator it = mData.mFiles.find(uFileID);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync if (it != mData.mFiles.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pFile)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pFile = it->second;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::fileRemoveFromList(GuestFile *pFile)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (SessionFiles::iterator itFiles = mData.mFiles.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itFiles != mData.mFiles.end(); ++itFiles)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync if (pFile == itFiles->second)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Make sure to consume the pointer before the one of thfe
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * iterator gets released. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestFile> pCurFile = pFile;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Bstr strName;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pCurFile->COMGETTER(FileName)(strName.asOutParam());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(mData.mNumObjects);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("Removing guest file \"%s\" (Session: %RU32) (now total %ld files, %ld objects)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(strName).c_str(), mData.mSession.mID, mData.mFiles.size() - 1, mData.mNumObjects - 1));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pFile->cancelWaitEvents();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pFile->Release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync mData.mFiles.erase(itFiles);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mNumObjects--;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Release lock before firing off event. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fireGuestFileRegisteredEvent(mEventSource, this, pCurFile,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync false /* Unregistered */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestProcessStartupInfo procInfo;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync GuestProcessStream streamOut;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
b45d66c0e496e2fd861479202f3d43aad592bd14vboxsync procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_RM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(strPath); /* The file we want to remove. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = GuestProcessTool::Run(this, procInfo, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::fileOpenInternal(const GuestFileOpenInfo &openInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestFile> &pFile, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync LogFlowThisFunc(("strPath=%s, strOpenMode=%s, strDisposition=%s, uCreationMode=%x, uOffset=%RU64\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mFileName.c_str(), openInfo.mOpenMode.c_str(), openInfo.mDisposition.c_str(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mCreationMode, openInfo.mInitialOffset));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync /* Guest Additions < 4.3 don't support handling
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync guest files, skip. */
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync if (mData.mProtocolVersion < 2)
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync {
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync LogFlowThisFunc(("Installed Guest Additions don't support handling guest files, skipping\n"));
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync return VERR_NOT_SUPPORTED;
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync }
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync int rc = VERR_MAX_PROCS_REACHED;
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync if (mData.mNumObjects >= VBOX_GUESTCTRL_MAX_OBJECTS)
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Create a new (host-based) file ID and assign it. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uNewFileID = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG uTries = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (;;)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Is the file ID already used? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!fileExists(uNewFileID, NULL /* pFile */))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Callback with context ID was not found. This means
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * we can use this context ID for our new callback we want
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * to add below. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewFileID++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (uNewFileID == VBOX_GUESTCTRL_MAX_OBJECTS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewFileID = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (++uTries == UINT32_MAX)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break; /* Don't try too hard. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync if (RT_FAILURE(rc))
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync return rc;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync /* Create the directory object. */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync HRESULT hr = pFile.createObject();
75fca099c974cbbd48f132af1378c60232614760vboxsync if (FAILED(hr))
75fca099c974cbbd48f132af1378c60232614760vboxsync return VERR_COM_UNEXPECTED;
75fca099c974cbbd48f132af1378c60232614760vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Console *pConsole = mParent->getConsole();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtr(pConsole);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pFile->init(pConsole, this /* GuestSession */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewFileID, openInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Since this is a synchronous guest call we have to
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * register the file object first, releasing the session's
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * lock and then proceed with the actual opening command
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * -- otherwise the file's opening callback would hang
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * because the session's lock still is in place.
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync */
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync try
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Add the created file to our vector. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mFiles[uNewFileID] = pFile;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mNumObjects++;
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync Assert(mData.mNumObjects <= VBOX_GUESTCTRL_MAX_OBJECTS);
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync LogFlowFunc(("Added new guest file \"%s\" (Session: %RU32) (now total %ld files, %ld objects)\n",
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync openInfo.mFileName.c_str(), mData.mSession.mID, mData.mFiles.size(), mData.mNumObjects));
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Release lock before firing off event. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fireGuestFileRegisteredEvent(mEventSource, this, pFile,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync true /* Registered */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc &)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync if (RT_SUCCESS(rc))
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync {
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pFile->openFile(30 * 1000 /* 30s timeout */, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( rc == VERR_GSTCTL_GUEST_ERROR
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pGuestRc = guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync}
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsyncint GuestSession::fileQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync{
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = fsQueryInfoInternal(strPath, objData, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = objData.mType == FsObjType_File
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ? VINF_SUCCESS : VERR_NOT_A_FILE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncint GuestSession::fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc)
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pllSize, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestFsObjData objData;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = fileQueryInfoInternal(strPath, objData, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pllSize = objData.mObjectSize;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Merge this with IGuestFile::queryInfo(). */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestProcessStartupInfo procInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_STAT);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync /* Construct arguments. */
6b022885f2cb6a55167609edecd89570cd80001dvboxsync procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
b45d66c0e496e2fd861479202f3d43aad592bd14vboxsync procInfo.mArguments.push_back(strPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int guestRc; GuestCtrlStreamObjects stdOut;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = GuestProcessTool::RunEx(this, procInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &stdOut, 1 /* cStrmOutObjects */,
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( RT_SUCCESS(vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && RT_SUCCESS(guestRc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!stdOut.empty())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = objData.FromStat(stdOut.at(0));
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_DATA;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncconst GuestCredentials& GuestSession::getCredentials(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return mData.mCredentials;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncconst GuestEnvironment& GuestSession::getEnvironment(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync return mData.mEnvironment;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncUtf8Str GuestSession::getName(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return mData.mSession.mName;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* static */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncUtf8Str GuestSession::guestErrorToString(int guestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str strError;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo pData->u32Flags: int vs. uint32 -- IPRT errors are *negative* !!! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (guestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_INVALID_VM_HANDLE:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("VMM device is not available (is the VM running?)"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_HGCM_SERVICE_NOT_FOUND:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("The guest execution service is not available"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_AUTHENTICATION_FAILURE:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("The specified user was not able to logon on guest"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_TIMEOUT:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("The guest did not respond within time"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_CANCELLED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("The session operation was canceled"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_PERMISSION_DENIED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("Invalid user/password credentials"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_MAX_PROCS_REACHED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("Maximum number of concurrent guest processes has been reached"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_EQUAL: /** @todo Imprecise to the user; can mean anything and all. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("Unable to retrieve requested information"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_FOUND:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt(tr("The guest execution service is not ready (yet)"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strError += Utf8StrFmt("%Rrc", guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return strError;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Checks if this session is ready state where it can handle
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * all session-bound actions (like guest processes, guest files).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Only used by official API methods. Will set an external
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * error when not ready.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT GuestSession::isReadyExternal(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync
c33db29e7b41467a35675031f5f5233839909083vboxsync /** @todo Be a bit more informative. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mStatus != GuestSessionStatus_Started)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_UNEXPECTED, tr("Session is not in started state"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** No locking! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::onSessionStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pCbCtx, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* pCallback is optional. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pSvcCbData, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pSvcCbData->mParms < 3)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_INVALID_PARAMETER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CALLBACKDATA_SESSION_NOTIFY dataCb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* pSvcCb->mpaParms[0] always contains the context ID. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = pSvcCbData->mpaParms[1].getUInt32(&dataCb.uType);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertRCReturn(vrc, vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = pSvcCbData->mpaParms[2].getUInt32(&dataCb.uResult);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertRCReturn(vrc, vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("ID=%RU32, uType=%RU32, guestRc=%Rrc\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mID, dataCb.uType, dataCb.uResult));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync GuestSessionStatus_T sessionStatus = GuestSessionStatus_Undefined;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync int guestRc = dataCb.uResult; /** @todo uint32_t vs. int. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (dataCb.uType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sessionStatus = GuestSessionStatus_Error;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_STARTED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sessionStatus = GuestSessionStatus_Started;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_TEN:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_TES:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_TEA:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sessionStatus = GuestSessionStatus_Terminated;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_TOK:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sessionStatus = GuestSessionStatus_TimedOutKilled;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_TOA:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sessionStatus = GuestSessionStatus_TimedOutAbnormally;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_DWN:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync sessionStatus = GuestSessionStatus_Down;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GUEST_SESSION_NOTIFYTYPE_UNDEFINED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NOT_SUPPORTED;
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync break;
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync }
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync if (RT_SUCCESS(vrc))
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync {
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync if (RT_FAILURE(guestRc))
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync sessionStatus = GuestSessionStatus_Error;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync /* Set the session status. */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = setSessionStatus(sessionStatus, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("ID=%RU32, guestRc=%Rrc\n", mData.mSession.mID, guestRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::startSessionInternal(int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("mID=%RU32, mName=%s, uProtocolVersion=%RU32, openFlags=%x, openTimeoutMS=%RU32\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mID, mData.mSession.mName.c_str(), mData.mProtocolVersion,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mOpenFlags, mData.mSession.mOpenTimeoutMS));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync /* Guest Additions < 4.3 don't support opening dedicated
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync guest sessions. Simply return success here. */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (mData.mProtocolVersion < 2)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync {
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync mData.mStatus = GuestSessionStatus_Started;
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync LogFlowThisFunc(("Installed Guest Additions don't support opening dedicated sessions, skipping\n"));
75fca099c974cbbd48f132af1378c60232614760vboxsync return VINF_SUCCESS;
75fca099c974cbbd48f132af1378c60232614760vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mStatus != GuestSessionStatus_Undefined)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo mData.mSession.uFlags validation. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Set current session status. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mStatus = GuestSessionStatus_Starting;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mRC = VINF_SUCCESS; /* Clear previous error, if any. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestWaitEvent *pEvent = NULL;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync GuestEventTypes eventTypes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync eventTypes.push_back(VBoxEventType_OnGuestSessionStateChanged);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = registerWaitEvent(mData.mSession.mID, 0 /* Object ID */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync eventTypes, &pEvent);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync
c33db29e7b41467a35675031f5f5233839909083vboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBOXHGCMSVCPARM paParms[8];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int i = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paParms[i++].setUInt32(pEvent->ContextID());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paParms[i++].setUInt32(mData.mProtocolVersion);
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync paParms[i++].setPointer((void*)mData.mCredentials.mUser.c_str(),
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync (ULONG)mData.mCredentials.mUser.length() + 1);
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync paParms[i++].setPointer((void*)mData.mCredentials.mPassword.c_str(),
315f443a509c31db47b8f5cb94d26e54c3d5c497vboxsync (ULONG)mData.mCredentials.mPassword.length() + 1);
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync paParms[i++].setPointer((void*)mData.mCredentials.mDomain.c_str(),
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync (ULONG)mData.mCredentials.mDomain.length() + 1);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync paParms[i++].setUInt32(mData.mSession.mOpenFlags);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync alock.release(); /* Drop write lock before sending. */
7cced997f7e362bb903898de921271b5e1011e3dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync vrc = sendCommand(HOST_SESSION_CREATE, i, paParms);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = waitForStatusChange(pEvent, GuestSessionWaitForFlag_Start,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync 30 * 1000 /* 30s timeout */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NULL /* Session status */, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync {
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync /*
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * Unable to start guest session - update its current state.
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * Since there is no (official API) way to recover a failed guest session
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * this also marks the end state. Internally just calling this
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync * same function again will work though.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mStatus = GuestSessionStatus_Error;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mRC = vrc;
a3db4ff1e0aa7f94c9176ef16264df572eec0aebvboxsync }
75fca099c974cbbd48f132af1378c60232614760vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync unregisterWaitEvent(pEvent);
75fca099c974cbbd48f132af1378c60232614760vboxsync
a3db4ff1e0aa7f94c9176ef16264df572eec0aebvboxsync LogFlowFuncLeaveRC(vrc);
a3db4ff1e0aa7f94c9176ef16264df572eec0aebvboxsync return vrc;
a3db4ff1e0aa7f94c9176ef16264df572eec0aebvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::startSessionAsync(void)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Asynchronously open the session on the guest by kicking off a
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * worker thread. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::auto_ptr<GuestSessionTaskInternalOpen> pTask(new GuestSessionTaskInternalOpen(this));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(pTask->isOk(), pTask->rc());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = RTThreadCreate(NULL, GuestSession::startSessionThread,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync (void *)pTask.get(), 0,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTHREADTYPE_MAIN_WORKER, 0,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync "gctlSesStart");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* pTask is now owned by openSessionThread(), so release it. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch(std::bad_alloc &)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* static */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncDECLCALLBACK(int) GuestSession::startSessionThread(RTTHREAD Thread, void *pvUser)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
09d4e754a010196fe0d9d972b6ccc005ecb8b116vboxsync LogFlowFunc(("pvUser=%p\n", pvUser));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::auto_ptr<GuestSessionTaskInternalOpen> pTask(static_cast<GuestSessionTaskInternalOpen*>(pvUser));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtr(pTask.get());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const ComObjPtr<GuestSession> pSession(pTask->Session());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!pSession.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(pSession);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = pSession->startSessionInternal(NULL /* Guest rc, ignored */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Nothing to do here anymore. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::pathRenameInternal(const Utf8Str &strSource, const Utf8Str &strDest,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uFlags, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(!(uFlags & ~PATHRENAME_FLAG_VALID_MASK), VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("strSource=%s, strDest=%s, uFlags=0x%x\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strSource.c_str(), strDest.c_str(), uFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestWaitEvent *pEvent = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = registerWaitEvent(mData.mSession.mID, 0 /* Object ID */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &pEvent);
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync if (RT_FAILURE(vrc))
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync return vrc;
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync
315f443a509c31db47b8f5cb94d26e54c3d5c497vboxsync /* Prepare HGCM call. */
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync VBOXHGCMSVCPARM paParms[8];
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync int i = 0;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync paParms[i++].setUInt32(pEvent->ContextID());
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync paParms[i++].setPointer((void*)strSource.c_str(),
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync (ULONG)strSource.length() + 1);
7cced997f7e362bb903898de921271b5e1011e3dvboxsync paParms[i++].setPointer((void*)strDest.c_str(),
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync (ULONG)strDest.length() + 1);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync paParms[i++].setUInt32(uFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Drop write lock before sending. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = sendCommand(HOST_PATH_RENAME, i, paParms);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync vrc = pEvent->Wait(30 * 1000);
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync if ( vrc == VERR_GSTCTL_GUEST_ERROR
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync && pGuestRc)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync *pGuestRc = pEvent->GuestResult();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync }
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync unregisterWaitEvent(pEvent);
75fca099c974cbbd48f132af1378c60232614760vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncint GuestSession::processRemoveFromList(GuestProcess *pProcess)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("pProcess=%p\n", pProcess));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG uPID;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pProcess->COMGETTER(PID)(&uPID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("Closing process (PID=%RU32) ...\n", uPID));
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionProcesses::iterator itProcs = mData.mProcesses.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (itProcs != mData.mProcesses.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pProcess == itProcs->second)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Make sure to consume the pointer before the one of thfe
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * iterator gets released. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestProcess> pCurProcess = pProcess;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pCurProcess->COMGETTER(PID)(&uPID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
09d4e754a010196fe0d9d972b6ccc005ecb8b116vboxsync Assert(mData.mNumObjects);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("Removing process ID=%RU32 (Session: %RU32), guest PID=%RU32 (now total %ld processes, %ld objects)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pProcess->getObjectID(), mData.mSession.mID, uPID, mData.mProcesses.size() - 1, mData.mNumObjects - 1));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pProcess->cancelWaitEvents();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pProcess->Release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mProcesses.erase(itProcs);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mNumObjects--;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Release lock before firing off event. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fireGuestProcessRegisteredEvent(mEventSource, this /* Session */, pCurProcess,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uPID, false /* Process unregistered */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync itProcs++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Creates but does *not* start the process yet. See GuestProcess::startProcess() or
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * GuestProcess::startProcessAsync() for that.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return IPRT status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param procInfo
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pProcess
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::processCreateExInteral(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProcess)
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("mCmd=%s, mFlags=%x, mTimeoutMS=%RU32\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mCommand.c_str(), procInfo.mFlags, procInfo.mTimeoutMS));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (procInfo.mArguments.size())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("Arguments:"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ProcessArguments::const_iterator it = procInfo.mArguments.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (it != procInfo.mArguments.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow((" %s", (*it).c_str()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync it++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Validate flags. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (procInfo.mFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( !(procInfo.mFlags & ProcessCreateFlag_IgnoreOrphanedProcesses)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && !(procInfo.mFlags & ProcessCreateFlag_WaitForProcessStartOnly)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && !(procInfo.mFlags & ProcessCreateFlag_Hidden)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && !(procInfo.mFlags & ProcessCreateFlag_NoProfile)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && !(procInfo.mFlags & ProcessCreateFlag_WaitForStdOut)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && !(procInfo.mFlags & ProcessCreateFlag_WaitForStdErr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_INVALID_PARAMETER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( (procInfo.mFlags & ProcessCreateFlag_WaitForProcessStartOnly)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && ( (procInfo.mFlags & ProcessCreateFlag_WaitForStdOut)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || (procInfo.mFlags & ProcessCreateFlag_WaitForStdErr)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_INVALID_PARAMETER;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Adjust timeout. If set to 0, we define
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * an infinite timeout. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (procInfo.mTimeoutMS == 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mTimeoutMS = UINT32_MAX;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @tood Implement process priority + affinity. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VERR_MAX_PROCS_REACHED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mNumObjects >= VBOX_GUESTCTRL_MAX_OBJECTS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Create a new (host-based) process ID and assign it. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uNewProcessID = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG uTries = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (;;)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Is the context ID already used? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!processExists(uNewProcessID, NULL /* pProcess */))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Callback with context ID was not found. This means
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * we can use this context ID for our new callback we want
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * to add below. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewProcessID++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (uNewProcessID == VBOX_GUESTCTRL_MAX_OBJECTS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewProcessID = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (++uTries == VBOX_GUESTCTRL_MAX_OBJECTS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break; /* Don't try too hard. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Create the process object. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pProcess.createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_COM_UNEXPECTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pProcess->init(mParent->getConsole() /* Console */, this /* Session */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uNewProcessID, procInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Add the created process to our map. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mProcesses[uNewProcessID] = pProcess;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mNumObjects++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(mData.mNumObjects <= VBOX_GUESTCTRL_MAX_OBJECTS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFunc(("Added new process (Session: %RU32) with process ID=%RU32 (now total %ld processes, %ld objects)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mID, uNewProcessID, mData.mProcesses.size(), mData.mNumObjects));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fireGuestProcessRegisteredEvent(mEventSource, this /* Session */, pProcess,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync 0 /* PID */, true /* Process registered */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch (std::bad_alloc &)
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_NO_MEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncinline bool GuestSession::processExists(uint32_t uProcessID, ComObjPtr<GuestProcess> *pProcess)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionProcesses::const_iterator it = mData.mProcesses.find(uProcessID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (it != mData.mProcesses.end())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pProcess)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pProcess = it->second;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncinline int GuestSession::processGetByPID(ULONG uPID, ComObjPtr<GuestProcess> *pProcess)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(uPID, false);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* pProcess is optional. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionProcesses::iterator itProcs = mData.mProcesses.begin();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (; itProcs != mData.mProcesses.end(); itProcs++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestProcess> pCurProc = itProcs->second;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller procCaller(pCurProc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (procCaller.rc())
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_COM_INVALID_OBJECT_STATE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG uCurPID;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pCurProc->COMGETTER(PID)(&uCurPID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (uCurPID == uPID)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pProcess)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pProcess = pCurProc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::sendCommand(uint32_t uFunction,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uParms, PVBOXHGCMSVCPARM paParms)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_GUESTCTRL_TEST_CASE
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<Console> pConsole = mParent->getConsole();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!pConsole.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Forward the information to the VMM device. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VMMDev *pVMMDev = pConsole->getVMMDev();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtr(pVMMDev);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("uFunction=%RU32, uParms=%RU32\n", uFunction, uParms));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = pVMMDev->hgcmHostCall(HGCMSERVICE_NAME, uFunction, uParms, paParms);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo What to do here? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Not needed within testcases. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* static */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT GuestSession::setErrorExternal(VirtualBoxBase *pInterface, int guestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtr(pInterface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsg(RT_FAILURE(guestRc), ("Guest rc does not indicate a failure when setting error\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return pInterface->setError(VBOX_E_IPRT_ERROR, GuestSession::guestErrorToString(guestRc).c_str());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* Does not do locking; caller is responsible for that! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::setSessionStatus(GuestSessionStatus_T sessionStatus, int sessionRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("oldStatus=%ld, newStatus=%ld, sessionRc=%Rrc\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mStatus, sessionStatus, sessionRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (sessionStatus == GuestSessionStatus_Error)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsg(RT_FAILURE(sessionRc), ("Guest rc must be an error (%Rrc)\n", sessionRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Do not allow overwriting an already set error. If this happens
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync * this means we forgot some error checking/locking somewhere. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsg(RT_SUCCESS(mData.mRC), ("Guest rc already set (to %Rrc)\n", mData.mRC));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsg(RT_SUCCESS(sessionRc), ("Guest rc must not be an error (%Rrc)\n", sessionRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mStatus != sessionStatus)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mStatus = sessionStatus;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mRC = sessionRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<VirtualBoxErrorInfo> errorInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = errorInfo.createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc2 = errorInfo->initEx(VBOX_E_IPRT_ERROR, sessionRc,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync COM_IIDOF(IGuestSession), getComponentName(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync guestErrorToString(sessionRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertRC(rc2);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fireGuestSessionStateChangedEvent(mEventSource, this,
06de36c1229f14000638fa27993b13c9133e85f5vboxsync mData.mSession.mID, sessionStatus, errorInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::signalWaiters(GuestSessionWaitResult_T enmWaitResult, int rc /*= VINF_SUCCESS */)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*LogFlowThisFunc(("enmWaitResult=%d, rc=%Rrc, mWaitCount=%RU32, mWaitEvent=%p\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync enmWaitResult, rc, mData.mWaitCount, mData.mWaitEvent));*/
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Note: No write locking here -- already done in the caller. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*if (mData.mWaitEvent)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = mData.mWaitEvent->Signal(enmWaitResult, rc);*/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::startTaskAsync(const Utf8Str &strTaskDesc,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionTask *pTask, ComObjPtr<Progress> &pProgress)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("strTaskDesc=%s, pTask=%p\n", strTaskDesc.c_str(), pTask));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pTask, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Create the progress object. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pProgress.createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_COM_UNEXPECTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pProgress->init(static_cast<IGuestSession*>(this),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Bstr(strTaskDesc).raw(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync TRUE /* aCancelable */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_COM_UNEXPECTED;
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync /* Initialize our worker task. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync std::auto_ptr<GuestSessionTask> task(pTask);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = task->RunAsync(strTaskDesc, pProgress);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Don't destruct on success. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync task.release();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Queries/collects information prior to establishing a guest session.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This is necessary to know which guest control protocol version to use,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * among other things (later).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return IPRT status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::queryInfo(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Try querying the guest control protocol version running on the guest.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This is done using the Guest Additions version
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<Guest> pGuest = mParent;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!pGuest.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uVerAdditions = pGuest->getAdditionsVersion();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uVBoxMajor = VBOX_FULL_VERSION_GET_MAJOR(uVerAdditions);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uVBoxMinor = VBOX_FULL_VERSION_GET_MINOR(uVerAdditions);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG_andy
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Hardcode the to-used protocol version; nice for testing side effects. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mProtocolVersion = 2;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mProtocolVersion = (
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* VBox 5.0 and up. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uVBoxMajor >= 5
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* VBox 4.3 and up. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || (uVBoxMajor == 4 && uVBoxMinor >= 3))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ? 2 /* Guest control 2.0. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync : 1; /* Legacy guest control (VBox < 4.3). */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Build revision is ignored. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
18db01bbe01d709ed64ef78717e98b94b7fee056vboxsync LogFlowThisFunc(("uVerAdditions=%RU32 (%RU32.%RU32), mProtocolVersion=%RU32\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uVerAdditions, uVBoxMajor, uVBoxMinor, mData.mProtocolVersion));
18db01bbe01d709ed64ef78717e98b94b7fee056vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Tell the user but don't bitch too often. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static short s_gctrlLegacyWarning = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( mData.mProtocolVersion < 2
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && s_gctrlLegacyWarning++ < 3) /** @todo Find a bit nicer text. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogRel((tr("Warning: Guest Additions are older (%ld.%ld) than host capabilities for guest control, please upgrade them. Using protocol version %ld now\n"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uVBoxMajor, uVBoxMinor, mData.mProtocolVersion));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
6f516ad9911d9037a18778742caa955fe362f8ffvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS, GuestSessionWaitResult_T &waitResult, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(fWaitFlags, VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*LogFlowThisFunc(("fWaitFlags=0x%x, uTimeoutMS=%RU32, mStatus=%RU32, mWaitCount=%RU32, mWaitEvent=%p, pGuestRc=%p\n",
6b022885f2cb6a55167609edecd89570cd80001dvboxsync fWaitFlags, uTimeoutMS, mData.mStatus, mData.mWaitCount, mData.mWaitEvent, pGuestRc));*/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Did some error occur before? Then skip waiting and return. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mStatus == GuestSessionStatus_Error)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Error;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsg(RT_FAILURE(mData.mRC), ("No error rc (%Rrc) set when guest session indicated an error\n", mData.mRC));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pGuestRc = mData.mRC; /* Return last set error. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_GSTCTL_GUEST_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Guest Additions < 4.3 don't support session handling, skip. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (mData.mProtocolVersion < 2)
06de36c1229f14000638fa27993b13c9133e85f5vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_WaitFlagNotSupported;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync LogFlowThisFunc(("Installed Guest Additions don't support waiting for dedicated sessions, skipping\n"));
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync return VINF_SUCCESS;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync }
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync waitResult = GuestSessionWaitResult_None;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync if (fWaitFlags & GuestSessionWaitForFlag_Terminate)
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync {
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync switch (mData.mStatus)
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync {
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_Terminated:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_Down:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync waitResult = GuestSessionWaitResult_Terminate;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync break;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_TimedOutKilled:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_TimedOutAbnormally:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync waitResult = GuestSessionWaitResult_Timeout;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync break;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_Error:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync /* Handled above. */
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync break;
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_Started:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync waitResult = GuestSessionWaitResult_Start;
06de36c1229f14000638fa27993b13c9133e85f5vboxsync break;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync
69a0f42fa2c531eb2cffb6d6f482d828d9adab34vboxsync case GuestSessionStatus_Undefined:
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync case GuestSessionStatus_Starting:
06de36c1229f14000638fa27993b13c9133e85f5vboxsync /* Do the waiting below. */
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync break;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Unhandled session status %ld\n", mData.mStatus));
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync return VERR_NOT_IMPLEMENTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (fWaitFlags & GuestSessionWaitForFlag_Start)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (mData.mStatus)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Started:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Terminating:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Terminated:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Down:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Start;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Error:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Error;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_TimedOutKilled:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_TimedOutAbnormally:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Timeout;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Undefined:
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync case GuestSessionStatus_Starting:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Do the waiting below. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Unhandled session status %ld\n", mData.mStatus));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_NOT_IMPLEMENTED;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
c657bea826c7455c93bd45eaebab63a4c7742c42vboxsync }
c657bea826c7455c93bd45eaebab63a4c7742c42vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("sessionStatus=%ld, sessionRc=%Rrc, waitResult=%ld\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mStatus, mData.mRC, waitResult));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* No waiting needed? Return immediately using the last set error. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (waitResult != GuestSessionWaitResult_None)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pGuestRc = mData.mRC; /* Return last set error (if any). */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return RT_SUCCESS(mData.mRC) ? VINF_SUCCESS : VERR_GSTCTL_GUEST_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestWaitEvent *pEvent = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestEventTypes eventTypes;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync eventTypes.push_back(VBoxEventType_OnGuestSessionStateChanged);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = registerWaitEvent(mData.mSession.mID, 0 /* Object ID */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync eventTypes, &pEvent);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync catch (std::bad_alloc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_NO_MEMORY;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync if (RT_FAILURE(vrc))
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync alock.release(); /* Release lock before waiting. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionStatus_T sessionStatus;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = waitForStatusChange(pEvent, fWaitFlags,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uTimeoutMS, &sessionStatus, pGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (sessionStatus)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Started:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Start;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Terminated:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Terminate;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_TimedOutKilled:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_TimedOutAbnormally:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Timeout;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Down:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Terminate;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case GuestSessionStatus_Error:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Error;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync waitResult = GuestSessionWaitResult_Status;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unregisterWaitEvent(pEvent);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncint GuestSession::waitForStatusChange(GuestWaitEvent *pEvent, uint32_t fWaitFlags, uint32_t uTimeoutMS,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionStatus_T *pSessionStatus, int *pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxEventType_T evtType;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComPtr<IEvent> pIEvent;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = waitForEvent(pEvent, uTimeoutMS,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &evtType, pIEvent.asOutParam());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(evtType == VBoxEventType_OnGuestSessionStateChanged);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComPtr<IGuestSessionStateChangedEvent> pChangedEvent = pIEvent;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(!pChangedEvent.isNull());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestSessionStatus_T sessionStatus;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pChangedEvent->COMGETTER(Status)(&sessionStatus);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pSessionStatus)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pSessionStatus = sessionStatus;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComPtr<IVirtualBoxErrorInfo> errorInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = pChangedEvent->COMGETTER(Error)(errorInfo.asOutParam());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LONG lGuestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = errorInfo->COMGETTER(ResultDetail)(&lGuestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComAssertComRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE((int)lGuestRc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = VERR_GSTCTL_GUEST_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pGuestRc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pGuestRc = (int)lGuestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("Status changed event for session ID=%RU32, new status is: %ld (%Rrc)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mSession.mID, sessionStatus,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RT_SUCCESS((int)lGuestRc) ? VINF_SUCCESS : (int)lGuestRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return vrc;
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync// implementation of public methods
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/////////////////////////////////////////////////////////////////////////////
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::Close(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync /* Close session on guest. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int guestRc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = closeSession(0 /* Flags */, 30 * 1000 /* Timeout */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* On failure don't return here, instead do all the cleanup
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * work first and then return an error. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Remove ourselves from the session list. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc2 = mParent->sessionRemove(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (rc2 == VERR_NOT_FOUND) /* Not finding the session anymore isn't critical. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc2 = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync rc = rc2;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFunc(("Returning rc=%Rrc, guestRc=%Rrc\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc, guestRc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (rc == VERR_GSTCTL_GUEST_ERROR)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return GuestSession::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Closing guest session failed with %Rrc"), rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::CopyFrom(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(CopyFileFlag_T, aFlags), IProgress **aProgress)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgStrNotEmptyOrNull(aSource);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgStrNotEmptyOrNull(aDest);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aProgress);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aSource) == NULL || *(aSource) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No source specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aDest) == NULL || *(aDest) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No destination specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync uint32_t fFlags = CopyFileFlag_None;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<CopyFileFlag_T> flags(ComSafeArrayInArg(aFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < flags.size(); i++)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync fFlags |= flags[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
ab1239d8445aa1fd4afddb7d0c8b90bbdc742010vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<Progress> pProgress;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionTaskCopyFrom *pTask = new SessionTaskCopyFrom(this /* GuestSession */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aSource), Utf8Str(aDest), fFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = startTaskAsync(Utf8StrFmt(tr("Copying \"%ls\" from guest to \"%ls\" on the host"), aSource, aDest),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask, pProgress);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Return progress to the caller. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pProgress.queryInterfaceTo(aProgress);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Starting task for copying file \"%ls\" from guest to \"%ls\" on the host failed: %Rrc"), rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync catch(std::bad_alloc &)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = E_OUTOFMEMORY;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::CopyTo(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(CopyFileFlag_T, aFlags), IProgress **aProgress)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgStrNotEmptyOrNull(aSource);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync CheckComArgStrNotEmptyOrNull(aDest);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aProgress);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aSource) == NULL || *(aSource) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No source specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aDest) == NULL || *(aDest) == '\0'))
19b725c530eb49600728765de7ed451cbe290740vboxsync return setError(E_INVALIDARG, tr("No destination specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fFlags = CopyFileFlag_None;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync if (aFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<CopyFileFlag_T> flags(ComSafeArrayInArg(aFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < flags.size(); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fFlags |= flags[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync HRESULT hr = S_OK;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync try
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<Progress> pProgress;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync SessionTaskCopyTo *pTask = new SessionTaskCopyTo(this /* GuestSession */,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aSource), Utf8Str(aDest), fFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pTask, E_OUTOFMEMORY);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = startTaskAsync(Utf8StrFmt(tr("Copying \"%ls\" from host to \"%ls\" on the guest"), aSource, aDest),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask, pProgress);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Return progress to the caller. */
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync hr = pProgress.queryInterfaceTo(aProgress);
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync }
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync else
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Starting task for copying file \"%ls\" from host to \"%ls\" on the guest failed: %Rrc"), rc);
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync }
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync catch(std::bad_alloc &)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync {
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync hr = E_OUTOFMEMORY;
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync }
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync return hr;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync}
75fca099c974cbbd48f132af1378c60232614760vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsyncSTDMETHODIMP GuestSession::DirectoryCreate(IN_BSTR aPath, ULONG aMode,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComSafeArrayIn(DirectoryCreateFlag_T, aFlags))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No directory to create specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
19b725c530eb49600728765de7ed451cbe290740vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fFlags = DirectoryCreateFlag_None;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<DirectoryCreateFlag_T> flags(ComSafeArrayInArg(aFlags));
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync for (size_t i = 0; i < flags.size(); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fFlags |= flags[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!(fFlags & DirectoryCreateFlag_Parents))
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync return setError(E_INVALIDARG, tr("Unknown flags (%#x)"), fFlags);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync }
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr <GuestDirectory> pDirectory; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = directoryCreateInternal(Utf8Str(aPath), (uint32_t)aMode, fFlags, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (rc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync break;
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync case VERR_INVALID_PARAMETER:
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: Invalid parameters given"));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync case VERR_BROKEN_PIPE:
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: Unexpectedly aborted"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_CANT_CREATE:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: Could not create directory"));
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync break;
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync default:
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Directory creation failed: %Rrc"), rc);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync break;
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync }
75fca099c974cbbd48f132af1378c60232614760vboxsync }
75fca099c974cbbd48f132af1378c60232614760vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::DirectoryCreateTemp(IN_BSTR aTemplate, ULONG aMode, IN_BSTR aPath, BOOL aSecure, BSTR *aDirectory)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync if (RT_UNLIKELY((aTemplate) == NULL || *(aTemplate) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No template specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No directory name specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aDirectory);
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync Utf8Str strName; int guestRc;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync int rc = objectCreateTempInternal(Utf8Str(aTemplate),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aPath),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync true /* Directory */, strName, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync strName.cloneTo(aDirectory);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (rc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Temporary directory creation \"%s\" with template \"%s\" failed: %Rrc"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aPath).c_str(), Utf8Str(aTemplate).c_str(), rc);
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::DirectoryExists(IN_BSTR aPath, BOOL *aExists)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
467e62e1aa999ec951e820d74498ef79dd1bedbdvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No directory to check existence for specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aExists);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestFsObjData objData; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = directoryQueryInfoInternal(Utf8Str(aPath), objData, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync *aExists = objData.mType == FsObjType_Directory;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync switch (rc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Querying directory existence \"%s\" failed: %Rrc"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aPath).c_str(), rc);
467e62e1aa999ec951e820d74498ef79dd1bedbdvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync}
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsyncSTDMETHODIMP GuestSession::DirectoryOpen(IN_BSTR aPath, IN_BSTR aFilter, ComSafeArrayIn(DirectoryOpenFlag_T, aFlags), IGuestDirectory **aDirectory)
467e62e1aa999ec951e820d74498ef79dd1bedbdvboxsync{
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync ReturnComNotImplemented();
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync#else
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync LogFlowThisFuncEnter();
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync return setError(E_INVALIDARG, tr("No directory to open specified"));
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync if (RT_UNLIKELY((aFilter) != NULL && *(aFilter) != '\0'))
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync return setError(E_INVALIDARG, tr("Directory filters are not implemented yet"));
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync CheckComArgOutPointerValid(aDirectory);
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync AutoCaller autoCaller(this);
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync uint32_t fFlags = DirectoryOpenFlag_None;
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync if (aFlags)
467e62e1aa999ec951e820d74498ef79dd1bedbdvboxsync {
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync com::SafeArray<DirectoryOpenFlag_T> flags(ComSafeArrayInArg(aFlags));
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync for (size_t i = 0; i < flags.size(); i++)
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync fFlags |= flags[i];
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync
8c9d2065ca6efecd5661174e382314868c0d4b94vboxsync if (fFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("Open flags (%#x) not implemented yet"), fFlags);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestDirectoryOpenInfo openInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mPath = Utf8Str(aPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mFilter = Utf8Str(aFilter);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mFlags = fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr <GuestDirectory> pDirectory; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = directoryOpenInternal(openInfo, pDirectory, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Return directory object to the caller. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pDirectory.queryInterfaceTo(aDirectory);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (rc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync case VERR_INVALID_PARAMETER:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Opening directory \"%s\" failed; invalid parameters given",
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync Utf8Str(aPath).c_str()));
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync case VERR_GSTCTL_GUEST_ERROR:
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync hr = GuestDirectory::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Opening directory \"%s\" failed: %Rrc"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aPath).c_str(),rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncSTDMETHODIMP GuestSession::DirectoryQueryInfo(IN_BSTR aPath, IGuestFsObjInfo **aInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No directory to query information for specified"));
6b022885f2cb6a55167609edecd89570cd80001dvboxsync CheckComArgOutPointerValid(aInfo);
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestFsObjData objData; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = directoryQueryInfoInternal(Utf8Str(aPath), objData, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (objData.mType == FsObjType_Directory)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestFsObjInfo> pFsObjInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pFsObjInfo.createObject();
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync if (FAILED(hr)) return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = pFsObjInfo->init(objData);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync hr = pFsObjInfo.queryInterfaceTo(aInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr)) return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync case VERR_NOT_A_DIRECTORY:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Element \"%s\" exists but is not a directory",
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync Utf8Str(aPath).c_str()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Querying directory information for \"%s\" failed: %Rrc"),
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync Utf8Str(aPath).c_str(), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::DirectoryRemove(IN_BSTR aPath)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No directory to remove specified"));
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = isReadyExternal();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* No flags; only remove the directory when empty. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uFlags = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = directoryRemoveInternal(Utf8Str(aPath), uFlags, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_SUPPORTED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Handling removing guest directories not supported by installed Guest Additions"));
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestDirectory::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Removing guest directory \"%s\" failed: %Rrc"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aPath).c_str(), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::DirectoryRemoveRecursive(IN_BSTR aPath, ComSafeArrayIn(DirectoryRemoveRecFlag_T, aFlags), IProgress **aProgress)
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No directory to remove recursively specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = isReadyExternal();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<Progress> pProgress;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pProgress.createObject();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pProgress->init(static_cast<IGuestSession *>(this),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Bstr(tr("Removing guest directory")).raw(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync TRUE /*aCancelable*/);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Note: At the moment we don't supply progress information while
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * deleting a guest directory recursively. So just complete
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * the progress object right now. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Implement progress reporting on guest directory deletion! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pProgress->notifyComplete(S_OK);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Remove the directory + all its contents. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uFlags = DIRREMOVE_FLAG_RECURSIVE
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync | DIRREMOVE_FLAG_CONTENT_AND_DIR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = directoryRemoveInternal(Utf8Str(aPath), uFlags, &guestRc);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_SUPPORTED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync tr("Handling removing guest directories recursively not supported by installed Guest Additions"));
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync break;
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync case VERR_GSTCTL_GUEST_ERROR:
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync hr = GuestFile::setErrorExternal(this, guestRc);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync break;
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync default:
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Recursively removing guest directory \"%s\" failed: %Rrc"),
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync Utf8Str(aPath).c_str(), vrc);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pProgress.queryInterfaceTo(aProgress);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
1b7f3a92e42fb9cabf96cf31c20481da466edf76vboxsync return hr;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
1b7f3a92e42fb9cabf96cf31c20481da466edf76vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::DirectoryRename(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(PathRenameFlag_T, aFlags))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlowThisFuncEnter();
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync if (RT_UNLIKELY((aSource) == NULL || *(aSource) == '\0'))
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync return setError(E_INVALIDARG, tr("No source directory to rename specified"));
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync if (RT_UNLIKELY((aDest) == NULL || *(aDest) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No destination directory to rename the source to specified"));
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync HRESULT hr = isReadyExternal();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync return hr;
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* No flags; only remove the directory when empty. */
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync uint32_t uFlags = 0;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync int guestRc;
75fca099c974cbbd48f132af1378c60232614760vboxsync int vrc = pathRenameInternal(Utf8Str(aSource), Utf8Str(aDest), uFlags, &guestRc);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync if (RT_FAILURE(vrc))
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync {
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync switch (vrc)
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync {
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync case VERR_NOT_SUPPORTED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Handling renaming guest directories not supported by installed Guest Additions"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
75fca099c974cbbd48f132af1378c60232614760vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
4cad44a5f7cfa7db8d5fb255a1df3b3cd1687853vboxsync tr("Renaming guest directory failed: %Rrc"), guestRc);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync break;
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
4cad44a5f7cfa7db8d5fb255a1df3b3cd1687853vboxsync default:
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest directory \"%s\" failed: %Rrc"),
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync Utf8Str(aSource).c_str(), vrc);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync break;
4cad44a5f7cfa7db8d5fb255a1df3b3cd1687853vboxsync }
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync }
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
54fe68d807196dc565de24055996e634ee40ee92vboxsync}
54fe68d807196dc565de24055996e634ee40ee92vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsyncSTDMETHODIMP GuestSession::DirectorySetACL(IN_BSTR aPath, IN_BSTR aACL)
54fe68d807196dc565de24055996e634ee40ee92vboxsync{
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync ReturnComNotImplemented();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#else
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync LogFlowThisFuncEnter();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync AutoCaller autoCaller(this);
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync ReturnComNotImplemented();
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::EnvironmentClear(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync mData.mEnvironment.Clear();
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncLeave();
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync return S_OK;
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::EnvironmentGet(IN_BSTR aName, BSTR *aValue)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
75fca099c974cbbd48f132af1378c60232614760vboxsync ReturnComNotImplemented();
75fca099c974cbbd48f132af1378c60232614760vboxsync#else
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync LogFlowThisFuncEnter();
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync if (RT_UNLIKELY((aName) == NULL || *(aName) == '\0'))
54fe68d807196dc565de24055996e634ee40ee92vboxsync return setError(E_INVALIDARG, tr("No value name specified"));
54fe68d807196dc565de24055996e634ee40ee92vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync CheckComArgOutPointerValid(aValue);
54fe68d807196dc565de24055996e634ee40ee92vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync AutoCaller autoCaller(this);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
54fe68d807196dc565de24055996e634ee40ee92vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync Bstr strValue(mData.mEnvironment.Get(Utf8Str(aName)));
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync strValue.cloneTo(aValue);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync LogFlowThisFuncLeave();
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync return S_OK;
5be6801527b2bb09f4b481e28d771f366961cdacvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
5be6801527b2bb09f4b481e28d771f366961cdacvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::EnvironmentSet(IN_BSTR aName, IN_BSTR aValue)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aName) == NULL || *(aName) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No value name specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = mData.mEnvironment.Set(Utf8Str(aName), Utf8Str(aValue));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = RT_SUCCESS(rc) ? S_OK : VBOX_E_IPRT_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowFuncLeaveRC(hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::EnvironmentUnset(IN_BSTR aName)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mData.mEnvironment.Unset(Utf8Str(aName));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncLeave();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileCreateTemp(IN_BSTR aTemplate, ULONG aMode, IN_BSTR aPath, BOOL aSecure, IGuestFile **aFile)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileExists(IN_BSTR aPath, BOOL *aExists)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No file to check existence for specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aExists);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestFsObjData objData; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = fileQueryInfoInternal(Utf8Str(aPath), objData, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aExists = TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_A_FILE:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aExists = FALSE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
6b022885f2cb6a55167609edecd89570cd80001dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file information for \"%s\" failed: %Rrc"),
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync Utf8Str(aPath).c_str(), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileRemove(IN_BSTR aPath)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No file to remove specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int guestRc;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync int vrc = fileRemoveInternal(Utf8Str(aPath), &guestRc);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Removing file \"%s\" failed: %Rrc"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aPath).c_str(), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileOpen(IN_BSTR aPath, IN_BSTR aOpenMode, IN_BSTR aDisposition, ULONG aCreationMode, IGuestFile **aFile)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Bstr strSharingMode = ""; /* Sharing mode is ignored. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return FileOpenEx(aPath, aOpenMode, aDisposition, strSharingMode.raw(), aCreationMode,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync 0 /* aOffset */, aFile);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileOpenEx(IN_BSTR aPath, IN_BSTR aOpenMode, IN_BSTR aDisposition, IN_BSTR aSharingMode,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG aCreationMode, LONG64 aOffset, IGuestFile **aFile)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No file to open specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aOpenMode) == NULL || *(aOpenMode) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No open mode specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aDisposition) == NULL || *(aDisposition) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No disposition mode specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* aSharingMode is optional. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aFile);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = isReadyExternal();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Validate creation mode. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uCreationMode = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestFileOpenInfo openInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mFileName = Utf8Str(aPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mOpenMode = Utf8Str(aOpenMode);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mDisposition = Utf8Str(aDisposition);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mSharingMode = Utf8Str(aSharingMode);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mCreationMode = aCreationMode;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mInitialOffset = aOffset;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t uFlagsIgnored;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = RTFileModeToFlagsEx(openInfo.mOpenMode.c_str(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mDisposition.c_str(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync openInfo.mSharingMode.c_str(),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &uFlagsIgnored);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("Invalid open mode / disposition / sharing mode specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr <GuestFile> pFile; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = fileOpenInternal(openInfo, pFile, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Return directory object to the caller. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pFile.queryInterfaceTo(aFile);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_SUPPORTED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Handling guest files not supported by installed Guest Additions"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestFile::setErrorExternal(this, guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Opening guest file \"%s\" failed: %Rrc"),
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync Utf8Str(aPath).c_str(), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync }
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncSTDMETHODIMP GuestSession::FileQueryInfo(IN_BSTR aPath, IGuestFsObjInfo **aInfo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync return setError(E_INVALIDARG, tr("No file to query information for specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestFsObjData objData; int guestRc;
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync int vrc = fileQueryInfoInternal(Utf8Str(aPath), objData, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestFsObjInfo> pFsObjInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pFsObjInfo.createObject();
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (FAILED(hr)) return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync vrc = pFsObjInfo->init(objData);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = pFsObjInfo.queryInterfaceTo(aInfo);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr)) return hr;
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync }
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync {
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync case VERR_GSTCTL_GUEST_ERROR:
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_A_FILE:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Element exists but is not a file"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file information failed: %Rrc"), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileQuerySize(IN_BSTR aPath, LONG64 *aSize)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync if (RT_UNLIKELY((aPath) == NULL || *(aPath) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No file to query size for specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aSize);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int64_t llSize; int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = fileQuerySizeInternal(Utf8Str(aPath), &llSize, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *aSize = llSize;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = GuestProcess::setErrorExternal(this, guestRc);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file size failed: %Rrc"), vrc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync return hr;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
fe49486f3c0fc3c327138e9a8f9ea9911d7c0d64vboxsync}
8da94e4d6813b682cdb38eb9b151ada72d91b40evboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncSTDMETHODIMP GuestSession::FileRename(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(PathRenameFlag_T, aFlags))
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aSource) == NULL || *(aSource) == '\0'))
6f516ad9911d9037a18778742caa955fe362f8ffvboxsync return setError(E_INVALIDARG, tr("No source file to rename specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync if (RT_UNLIKELY((aDest) == NULL || *(aDest) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No destination file to rename the source to specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = isReadyExternal();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* No flags; only remove the directory when empty. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t uFlags = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int guestRc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vrc = pathRenameInternal(Utf8Str(aSource), Utf8Str(aDest), uFlags, &guestRc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(vrc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
6b022885f2cb6a55167609edecd89570cd80001dvboxsync switch (vrc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_NOT_SUPPORTED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Handling renaming guest files not supported by installed Guest Additions"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_GSTCTL_GUEST_ERROR:
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync /** @todo Proper guestRc to text translation needed. */
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync hr = setError(VBOX_E_IPRT_ERROR,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync tr("Renaming guest file failed: %Rrc"), guestRc);
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest file \"%s\" failed: %Rrc"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Utf8Str(aSource).c_str(), vrc);
6f516ad9911d9037a18778742caa955fe362f8ffvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::FileSetACL(IN_BSTR aPath, IN_BSTR aACL)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
6f516ad9911d9037a18778742caa955fe362f8ffvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::ProcessCreate(IN_BSTR aCommand, ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComSafeArrayIn(ProcessCreateFlag_T, aFlags), ULONG aTimeoutMS, IGuestProcess **aProcess)
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<LONG> affinityIgnored;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return ProcessCreateEx(aCommand, ComSafeArrayInArg(aArguments), ComSafeArrayInArg(aEnvironment),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComSafeArrayInArg(aFlags), aTimeoutMS, ProcessPriority_Default, ComSafeArrayAsInParam(affinityIgnored), aProcess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::ProcessCreateEx(IN_BSTR aCommand, ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync ComSafeArrayIn(ProcessCreateFlag_T, aFlags), ULONG aTimeoutMS,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ProcessPriority_T aPriority, ComSafeArrayIn(LONG, aAffinity),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync IGuestProcess **aProcess)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_UNLIKELY((aCommand) == NULL || *(aCommand) == '\0'))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return setError(E_INVALIDARG, tr("No command to execute specified"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aProcess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = isReadyExternal();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GuestProcessStartupInfo procInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mCommand = Utf8Str(aCommand);
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aArguments)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<IN_BSTR> arguments(ComSafeArrayInArg(aArguments));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < arguments.size(); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mArguments.push_back(Utf8Str(arguments[i]));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Create the process environment:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * - Apply the session environment in a first step, and
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * - Apply environment variables specified by this call to
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * have the chance of overwriting/deleting session entries.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mEnvironment = mData.mEnvironment; /* Apply original session environment. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aEnvironment)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync com::SafeArray<IN_BSTR> environment(ComSafeArrayInArg(aEnvironment));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < environment.size() && RT_SUCCESS(rc); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = procInfo.mEnvironment.Set(Utf8Str(environment[i]));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<ProcessCreateFlag_T> flags(ComSafeArrayInArg(aFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < flags.size(); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mFlags |= flags[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mTimeoutMS = aTimeoutMS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (aAffinity)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<LONG> affinity(ComSafeArrayInArg(aAffinity));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < affinity.size(); i++)
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (affinity[i])
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mAffinity |= (uint64_t)1 << i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync procInfo.mPriority = aPriority;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestProcess> pProcess;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = processCreateExInteral(procInfo, pProcess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Return guest session to the caller. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr2 = pProcess.queryInterfaceTo(aProcess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(hr2))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_COM_OBJECT_NOT_FOUND;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = pProcess->startProcessAsync();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (rc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case VERR_MAX_PROCS_REACHED:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Maximum number of concurrent guest processes per session (%ld) reached"),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBOX_GUESTCTRL_MAX_OBJECTS);
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync /** @todo Add more errors here. */
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync default:
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync hr = setError(VBOX_E_IPRT_ERROR, tr("Could not create guest process, rc=%Rrc"), rc);
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync break;
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync }
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync }
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync LogFlowFuncLeaveRC(rc);
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync return hr;
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync}
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsyncSTDMETHODIMP GuestSession::ProcessGet(ULONG aPID, IGuestProcess **aProcess)
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync{
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync#ifndef VBOX_WITH_GUEST_CONTROL
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync ReturnComNotImplemented();
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync#else
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync LogFlowThisFunc(("aPID=%RU32\n", aPID));
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync CheckComArgOutPointerValid(aProcess);
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync if (aPID == 0)
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync return setError(E_INVALIDARG, tr("No valid process ID (PID) specified"));
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync AutoCaller autoCaller(this);
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ComObjPtr<GuestProcess> pProcess;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = processGetByPID(aPID, &pProcess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = setError(E_INVALIDARG, tr("No process with PID %RU32 found"), aPID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* This will set (*aProcess) to NULL if pProgress is NULL. */
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync HRESULT hr2 = pProcess.queryInterfaceTo(aProcess);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync hr = hr2;
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync LogFlowThisFunc(("aProcess=%p, hr=%Rhrc\n", *aProcess, hr));
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync return hr;
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::SymlinkCreate(IN_BSTR aSource, IN_BSTR aTarget, SymlinkType_T aType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::SymlinkExists(IN_BSTR aSymlink, BOOL *aExists)
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync AutoCaller autoCaller(this);
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync ReturnComNotImplemented();
9f1e0743f565b1975bb4efd7311b30cfa0d3e384vboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncSTDMETHODIMP GuestSession::SymlinkRead(IN_BSTR aSymlink, ComSafeArrayIn(SymlinkReadFlag_T, aFlags), BSTR *aTarget)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync ReturnComNotImplemented();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlowThisFuncEnter();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync ReturnComNotImplemented();
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync}
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsyncSTDMETHODIMP GuestSession::SymlinkRemoveDirectory(IN_BSTR aPath)
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync{
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync#ifndef VBOX_WITH_GUEST_CONTROL
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync ReturnComNotImplemented();
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync#else
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync LogFlowThisFuncEnter();
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync AutoCaller autoCaller(this);
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync ReturnComNotImplemented();
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync}
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsyncSTDMETHODIMP GuestSession::SymlinkRemoveFile(IN_BSTR aFile)
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync{
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync#ifndef VBOX_WITH_GUEST_CONTROL
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync ReturnComNotImplemented();
40f47bc231ff6c86a7ddc3295eed7010e889e78avboxsync#else
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync LogFlowThisFuncEnter();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync AutoCaller autoCaller(this);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync ReturnComNotImplemented();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync}
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsyncSTDMETHODIMP GuestSession::WaitFor(ULONG aWaitFlags, ULONG aTimeoutMS, GuestSessionWaitResult_T *aReason)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync{
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync ReturnComNotImplemented();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#else
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync LogFlowThisFuncEnter();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync CheckComArgOutPointerValid(aReason);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync AutoCaller autoCaller(this);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync /*
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * Note: Do not hold any locks here while waiting!
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync HRESULT hr = S_OK;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync int guestRc; GuestSessionWaitResult_T waitResult;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync int vrc = waitFor(aWaitFlags, aTimeoutMS, waitResult, &guestRc);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (RT_SUCCESS(vrc))
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync {
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync *aReason = waitResult;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync }
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync else
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync {
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync switch (vrc)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync {
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync case VERR_GSTCTL_GUEST_ERROR:
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync hr = GuestSession::setErrorExternal(this, guestRc);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync break;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync case VERR_TIMEOUT:
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync *aReason = GuestSessionWaitResult_Timeout;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync break;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync default:
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync {
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync const char *pszSessionName = mData.mSession.mName.c_str();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync hr = setError(VBOX_E_IPRT_ERROR,
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync tr("Waiting for guest session \"%s\" failed: %Rrc"),
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync pszSessionName ? pszSessionName : tr("Unnamed"), vrc);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync break;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync }
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync }
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync }
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync LogFlowFuncLeaveRC(vrc);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync return hr;
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync}
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsyncSTDMETHODIMP GuestSession::WaitForArray(ComSafeArrayIn(GuestSessionWaitForFlag_T, aFlags), ULONG aTimeoutMS, GuestSessionWaitResult_T *aReason)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync{
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#ifndef VBOX_WITH_GUEST_CONTROL
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync ReturnComNotImplemented();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#else
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync LogFlowThisFuncEnter();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CheckComArgOutPointerValid(aReason);
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AutoCaller autoCaller(this);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Note: Do not hold any locks here while waiting!
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fWaitFor = GuestSessionWaitForFlag_None;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray<GuestSessionWaitForFlag_T> flags(ComSafeArrayInArg(aFlags));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < flags.size(); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fWaitFor |= flags[i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return WaitFor(fWaitFor, aTimeoutMS, aReason);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* VBOX_WITH_GUEST_CONTROL */
6b022885f2cb6a55167609edecd89570cd80001dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync