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