GuestSessionImpl.h revision 3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/* $Id$ */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/** @file
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * VirtualBox Main - Guest session handling.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/*
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Copyright (C) 2012-2013 Oracle Corporation
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync *
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * available from http://www.virtualbox.org. This file is free software;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * General Public License (GPL) as published by the Free Software
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#ifndef ____H_GUESTSESSIONIMPL
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#define ____H_GUESTSESSIONIMPL
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "VirtualBoxBase.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
5f2b03bf7695dabd71222dba123532a3f76828c1vboxsync#include "GuestCtrlImplPrivate.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "GuestProcessImpl.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "GuestDirectoryImpl.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#include "GuestFileImpl.h"
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync#include "GuestFsObjInfoImpl.h"
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync#include <iprt/isofs.h> /* For UpdateAdditions. */
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsyncclass Guest;
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync/**
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Abstract base class for a lenghtly per-session operation which
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * runs in a Main worker thread.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync */
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncclass GuestSessionTask
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync{
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncpublic:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync GuestSessionTask(GuestSession *pSession);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync virtual ~GuestSessionTask(void);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncpublic:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync virtual int Run(void) = 0;
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync virtual int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress) = 0;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsyncprotected:
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync int getGuestProperty(const ComObjPtr<Guest> &pGuest,
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync const Utf8Str &strPath, Utf8Str &strValue);
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync int setProgress(ULONG uPercent);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync int setProgressSuccess(void);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync HRESULT setProgressErrorMsg(HRESULT hr, const Utf8Str &strMsg);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncprotected:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync Utf8Str mDesc;
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync GuestSession *mSession;
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync /** Progress object for getting updated when running
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync * asynchronously. Optional. */
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync ComObjPtr<Progress> mProgress;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync};
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync/**
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * Task for opening a guest session.
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncclass SessionTaskOpen : public GuestSessionTask
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync{
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncpublic:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync SessionTaskOpen(GuestSession *pSession,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync uint32_t uFlags,
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync uint32_t uTimeoutMS);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync virtual ~SessionTaskOpen(void);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncpublic:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync int Run(int *pGuestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsyncprotected:
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** Session creation flags. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync uint32_t mFlags;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** Session creation timeout (in ms). */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync uint32_t mTimeoutMS;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync};
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync/**
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Task for copying files from host to the guest.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync */
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncclass SessionTaskCopyTo : public GuestSessionTask
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync{
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncpublic:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync SessionTaskCopyTo(GuestSession *pSession,
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync const Utf8Str &strSource, const Utf8Str &strDest, uint32_t uFlags);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync SessionTaskCopyTo(GuestSession *pSession,
c740281e4f5e61397e892447aeef2a7bdbbaaf8dvboxsync PRTFILE pSourceFile, size_t cbSourceOffset, uint64_t cbSourceSize,
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync const Utf8Str &strDest, uint32_t uFlags);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync virtual ~SessionTaskCopyTo(void);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncpublic:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync int Run(void);
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncprotected:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync Utf8Str mSource;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync PRTFILE mSourceFile;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync size_t mSourceOffset;
3d33b6a3faf40871bae75119c2569cdc4acb2d46vboxsync uint64_t mSourceSize;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync Utf8Str mDest;
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync uint32_t mCopyFileFlags;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync};
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync/**
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Task for copying files from guest to the host.
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync */
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncclass SessionTaskCopyFrom : public GuestSessionTask
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync{
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncpublic:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync SessionTaskCopyFrom(GuestSession *pSession,
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync const Utf8Str &strSource, const Utf8Str &strDest, uint32_t uFlags);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync virtual ~SessionTaskCopyFrom(void);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncpublic:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync int Run(void);
6b9d50a0f466bd5a61458ed53925480ab28a3c17vboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsyncprotected:
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync Utf8Str mSource;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync Utf8Str mDest;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync uint32_t mFlags;
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync};
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync/**
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * Task for automatically updating the Guest Additions on the guest.
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync */
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsyncclass SessionTaskUpdateAdditions : public GuestSessionTask
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync{
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsyncpublic:
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync SessionTaskUpdateAdditions(GuestSession *pSession,
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync const Utf8Str &strSource, uint32_t uFlags);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync virtual ~SessionTaskUpdateAdditions(void);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsyncpublic:
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync int Run(void);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync int RunAsync(const Utf8Str &strDesc, ComObjPtr<Progress> &pProgress);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync static int taskThread(RTTHREAD Thread, void *pvUser);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsyncprotected:
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /**
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * Suported OS types for automatic updating.
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync enum eOSType
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync {
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync eOSType_Unknown = 0,
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync eOSType_Windows = 1,
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync eOSType_Linux = 2,
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync eOSType_Solaris = 3
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync };
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /**
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * Structure representing a file to
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * get off the .ISO, copied to the guest.
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync struct InstallerFile
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync {
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync InstallerFile(const Utf8Str &aSource,
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync const Utf8Str &aDest,
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync uint32_t aFlags = 0)
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync : strSource(aSource),
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync strDest(aDest),
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync fFlags(aFlags) { }
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync InstallerFile(const Utf8Str &aSource,
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync const Utf8Str &aDest,
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync uint32_t aFlags,
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync GuestProcessStartupInfo startupInfo)
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync : strSource(aSource),
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync strDest(aDest),
7c3bf57b1f6df237b1075e7cae6b188db6fc636avboxsync fFlags(aFlags),
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync mProcInfo(startupInfo)
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync {
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync mProcInfo.mCommand = strDest;
3c6306a66deef467e3c13483dd6529e1e1c6b822vboxsync if (mProcInfo.mName.isEmpty())
3c6306a66deef467e3c13483dd6529e1e1c6b822vboxsync mProcInfo.mName = strDest;
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync }
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Source file on .ISO. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync Utf8Str strSource;
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Destination file on the guest. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync Utf8Str strDest;
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** File flags. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync uint32_t fFlags;
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Optional arguments if this file needs to be
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync * executed. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync GuestProcessStartupInfo mProcInfo;
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync };
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync int copyFileToGuest(GuestSession *pSession, PRTISOFSFILE pISO,
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync Utf8Str const &strFileSource, const Utf8Str &strFileDest,
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync bool fOptional, uint32_t *pcbSize);
3c6306a66deef467e3c13483dd6529e1e1c6b822vboxsync int runFileOnGuest(GuestSession *pSession, GuestProcessStartupInfo &procInfo);
c4b821bf03ae7641a0791e3fd161247e66433b68vboxsync
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync /** Files to handle. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync std::vector<InstallerFile> mFiles;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** The (optionally) specified Guest Additions .ISO on the host
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync * which will be used for the updating process. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync Utf8Str mSource;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync /** Update flags. */
cd059a6642b11828bd0ad8b3108f5f7f611d144fvboxsync uint32_t mFlags;
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync};
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync/**
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync * Guest session implementation.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncclass ATL_NO_VTABLE GuestSession :
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync public VirtualBoxBase,
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync VBOX_SCRIPTABLE_IMPL(IGuestSession)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync{
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncpublic:
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name COM and internal init/term/mapping cruft.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * @{ */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(GuestSession, IGuestSession)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync DECLARE_NOT_AGGREGATABLE(GuestSession)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync BEGIN_COM_MAP(GuestSession)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync VBOX_DEFAULT_INTERFACE_ENTRIES(IGuestSession)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync END_COM_MAP()
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync DECLARE_EMPTY_CTOR_DTOR(GuestSession)
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync int init(Guest *pGuest, const GuestSessionStartupInfo &ssInfo, const GuestCredentials &guestCreds);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync void uninit(void);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync HRESULT FinalConstruct(void);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync void FinalRelease(void);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @} */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name IGuestSession properties.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * @{ */
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(COMGETTER(User))(BSTR *aName);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(COMGETTER(Domain))(BSTR *aDomain);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(COMGETTER(Name))(BSTR *aName);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Id))(ULONG *aId);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync STDMETHOD(COMGETTER(Status))(GuestSessionStatus_T *aStatus);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Timeout))(ULONG *aTimeout);
7e8ef90d3160234df0f254131b87af4243d79476vboxsync STDMETHOD(COMSETTER(Timeout))(ULONG aTimeout);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(COMGETTER(Environment))(ComSafeArrayOut(BSTR, aEnvironment));
1cd59fdf671ca60c64d77e3f7046aaecf7003824vboxsync STDMETHOD(COMSETTER(Environment))(ComSafeArrayIn(IN_BSTR, aEnvironment));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Processes))(ComSafeArrayOut(IGuestProcess *, aProcesses));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Directories))(ComSafeArrayOut(IGuestDirectory *, aDirectories));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(COMGETTER(Files))(ComSafeArrayOut(IGuestFile *, aFiles));
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @} */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name IGuestSession methods.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * @{ */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(Close)(void);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync STDMETHOD(CopyFrom)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(CopyFileFlag_T, aFlags), IProgress **aProgress);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync STDMETHOD(CopyTo)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(CopyFileFlag_T, aFlags), IProgress **aProgress);
4121d226ac899f17e13aff3aff42b603c8b5c1fevboxsync STDMETHOD(DirectoryCreate)(IN_BSTR aPath, ULONG aMode, ComSafeArrayIn(DirectoryCreateFlag_T, aFlags));
ca3db470494a8b6eaec69ea37468a5cda65e2da8vboxsync STDMETHOD(DirectoryCreateTemp)(IN_BSTR aTemplate, ULONG aMode, IN_BSTR aPath, BOOL aSecure, BSTR *aDirectory);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectoryExists)(IN_BSTR aPath, BOOL *aExists);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync STDMETHOD(DirectoryOpen)(IN_BSTR aPath, IN_BSTR aFilter, ComSafeArrayIn(DirectoryOpenFlag_T, aFlags), IGuestDirectory **aDirectory);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectoryQueryInfo)(IN_BSTR aPath, IGuestFsObjInfo **aInfo);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectoryRemove)(IN_BSTR aPath);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(DirectoryRemoveRecursive)(IN_BSTR aPath, ComSafeArrayIn(DirectoryRemoveRecFlag_T, aFlags), IProgress **aProgress);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(DirectoryRename)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(PathRenameFlag_T, aFlags));
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(DirectorySetACL)(IN_BSTR aPath, IN_BSTR aACL);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync STDMETHOD(EnvironmentClear)(void);
702a8ee2dc1de96f2f77e97135015d3e243186fdvboxsync STDMETHOD(EnvironmentGet)(IN_BSTR aName, BSTR *aValue);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(EnvironmentSet)(IN_BSTR aName, IN_BSTR aValue);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(EnvironmentUnset)(IN_BSTR aName);
92e624e40b06b4dc6d0a8222e1de33bd3e879a63vboxsync STDMETHOD(FileCreateTemp)(IN_BSTR aTemplate, ULONG aMode, IN_BSTR aPath, BOOL aSecure, IGuestFile **aFile);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileExists)(IN_BSTR aPath, BOOL *aExists);
36f3c24e4ad9c6b813767db1faeabbe7e2ecc057vboxsync STDMETHOD(FileRemove)(IN_BSTR aPath);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileOpen)(IN_BSTR aPath, IN_BSTR aOpenMode, IN_BSTR aDisposition, ULONG aCreationMode, LONG64 aOffset, IGuestFile **aFile);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileQueryInfo)(IN_BSTR aPath, IGuestFsObjInfo **aInfo);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileQuerySize)(IN_BSTR aPath, LONG64 *aSize);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(FileRename)(IN_BSTR aSource, IN_BSTR aDest, ComSafeArrayIn(PathRenameFlag_T, aFlags));
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(FileSetACL)(IN_BSTR aPath, IN_BSTR aACL);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(ProcessCreate)(IN_BSTR aCommand, ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync ComSafeArrayIn(ProcessCreateFlag_T, aFlags), ULONG aTimeoutMS, IGuestProcess **aProcess);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(ProcessCreateEx)(IN_BSTR aCommand, ComSafeArrayIn(IN_BSTR, aArguments), ComSafeArrayIn(IN_BSTR, aEnvironment),
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync ComSafeArrayIn(ProcessCreateFlag_T, aFlags), ULONG aTimeoutMS,
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync ProcessPriority_T aPriority, ComSafeArrayIn(LONG, aAffinity),
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync IGuestProcess **aProcess);
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync STDMETHOD(ProcessGet)(ULONG aPID, IGuestProcess **aProcess);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(SymlinkCreate)(IN_BSTR aSource, IN_BSTR aTarget, SymlinkType_T aType);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(SymlinkExists)(IN_BSTR aSymlink, BOOL *aExists);
06ea6bcf23874b662d499b3f130024c98b2dd7a6vboxsync STDMETHOD(SymlinkRead)(IN_BSTR aSymlink, ComSafeArrayIn(SymlinkReadFlag_T, aFlags), BSTR *aTarget);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(SymlinkRemoveDirectory)(IN_BSTR aPath);
9523921c89c66f4bececdbd5ac95aed0039eda1bvboxsync STDMETHOD(SymlinkRemoveFile)(IN_BSTR aFile);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @} */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
7862f4bd000f1eb6c86289f5ac2849e9cf943ca9vboxsyncprivate:
7862f4bd000f1eb6c86289f5ac2849e9cf943ca9vboxsync
7862f4bd000f1eb6c86289f5ac2849e9cf943ca9vboxsync typedef std::vector <ComObjPtr<GuestDirectory> > SessionDirectories;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** Map of guest files. The key specifies the internal file ID. */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync typedef std::map <uint32_t, ComObjPtr<GuestFile> > SessionFiles;
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync /** Map of guest processes. The key specifies the internal process number.
cc1ef2ef9bbc6a0ff964928d61b7298e5bfcce5fvboxsync * To retrieve the process' guest PID use the Id() method of the IProcess interface. */
cc1ef2ef9bbc6a0ff964928d61b7298e5bfcce5fvboxsync typedef std::map <uint32_t, ComObjPtr<GuestProcess> > SessionProcesses;
7862f4bd000f1eb6c86289f5ac2849e9cf943ca9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncpublic:
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @name Public internal methods.
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync * @{ */
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int closeSession(uint32_t uFlags, uint32_t uTimeoutMS, int *pGuestRc);
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync int directoryRemoveFromList(GuestDirectory *pDirectory);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int directoryCreateInternal(const Utf8Str &strPath, uint32_t uMode, uint32_t uFlags, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int objectCreateTempInternal(const Utf8Str &strTemplate, const Utf8Str &strPath, bool fDirectory, const Utf8Str &strName, int *pGuestRc);
8bc8d66f188d5357155b8340e2d489573be2b607vboxsync int directoryOpenInternal(const Utf8Str &strPath, const Utf8Str &strFilter, uint32_t uFlags, ComObjPtr<GuestDirectory> &pDirectory);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int directoryQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int dispatchToFile(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int dispatchToProcess(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int dispatchToThis(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync inline bool fileExists(uint32_t uFileID, ComObjPtr<GuestFile> *pFile);
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync int fileRemoveFromList(GuestFile *pFile);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int fileOpenInternal(const GuestFileOpenInfo &openInfo, ComObjPtr<GuestFile> &pFile, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fileQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc);
5050fc8de0b121eab1b738d7c1007cde4903284dvboxsync int fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
5f2b03bf7695dabd71222dba123532a3f76828c1vboxsync const GuestCredentials &getCredentials(void);
7862f4bd000f1eb6c86289f5ac2849e9cf943ca9vboxsync const GuestEnvironment &getEnvironment(void);
40c1a23e86c79b24a917a43c186b2e54504d12c1vboxsync Utf8Str getName(void);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync ULONG getId(void) { return mData.mSession.mID; }
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync static Utf8Str guestErrorToString(int guestRc);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int onSessionStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, GuestCtrlCallback *pCallback, PVBOXGUESTCTRLHOSTCALLBACK pSvcCbData);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync int openSession(int *pGuestRc);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync int openSessionAsync(void);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync static DECLCALLBACK(int)
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync openSessionThread(RTTHREAD Thread, void *pvUser);
88cc9bf61296bc5526344415167bb2625ae1dd99vboxsync Guest *getParent(void) { return mData.mParent; }
f9ce005e61f0fbb51a2cabc53d58c3485151faa9vboxsync uint32_t getProtocolVersion(void) { return mData.mProtocolVersion; }
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync int processRemoveFromList(GuestProcess *pProcess);
5366e994777f9d9391cf809dc77610f57270d75dvboxsync int processCreateExInteral(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProgress);
24ef2ade0f53030e73f5b4e43f52892b03f7915dvboxsync inline bool processExists(uint32_t uProcessID, ComObjPtr<GuestProcess> *pProcess);
687794577e2e35c3cae67e692a7f2130d1262a82vboxsync inline int processGetByPID(ULONG uPID, ComObjPtr<GuestProcess> *pProcess);
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync int sendCommand(uint32_t uFunction, uint32_t uParms, PVBOXHGCMSVCPARM paParms);
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync static HRESULT setErrorExternal(VirtualBoxBase *pInterface, int guestRc);
0fd108a555ae02f2fb557d5f2c40281999b60d15vboxsync int startTaskAsync(const Utf8Str &strTaskDesc, GuestSessionTask *pTask, ComObjPtr<Progress> &pProgress);
f9ce005e61f0fbb51a2cabc53d58c3485151faa9vboxsync int queryInfo(void);
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync /** @} */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsyncprivate:
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync struct Data
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync {
5f2b03bf7695dabd71222dba123532a3f76828c1vboxsync /** Pointer to the parent (Guest). */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync Guest *mParent;
d4a9d525e6f2111d462d2d96462dced6b9ec00efvboxsync /** The session credentials. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync GuestCredentials mCredentials;
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** The session's startup info. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync GuestSessionStartupInfo mSession;
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** The session's current status. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync GuestSessionStatus_T mStatus;
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** The session's environment block. Can be
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync * overwritten/extended by ProcessCreate(Ex). */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync GuestEnvironment mEnvironment;
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync /** The session callback, needed for communicating
462e60a19d02a99b2b1a5c08dff74bb0808d707cvboxsync * with the guest. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync GuestCtrlCallback mCallback;
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** Directory objects bound to this session. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync SessionDirectories mDirectories;
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** File objects bound to this session. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync SessionFiles mFiles;
02f7c106d33c45f99ec412a5fe0adde868f700fcvboxsync /** Process objects bound to this session. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync SessionProcesses mProcesses;
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** Guest control protocol version to be used.
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync * Guest Additions < VBox 4.3 have version 1,
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync * any newer version will have version 2. */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync uint32_t mProtocolVersion;
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync /** Session timeout (in ms). */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync uint32_t mTimeout;
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync /** Total number of session objects (processes,
04f6f18325971f796623469adcf39ba2b2939ed3vboxsync * files, ...). */
3fb3de312d1ff675e0f7cc62a7d46cbb1d5d9353vboxsync uint32_t mNumObjects;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync } mData;
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync};
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync#endif /* !____H_GUESTSESSIONIMPL */
2f3883b126a405f92b19e829472f614c7352b4f9vboxsync