seamless-host.h revision bd8e360cd1db83dcb2694ea9122ce3bc5bae678a
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync/** @file
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync *
cbaf00194b28ee57e4aeee473f66f91f1be4e022vboxsync * Guest client: seamless mode.
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync */
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync/*
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Copyright (C) 2006-2007 innotek GmbH
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync *
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * available from http://www.virtualbox.org. This file is free software;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * you can redistribute it and/or modify it under the terms of the GNU
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * General Public License (GPL) as published by the Free Software
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync#ifndef __Additions_client_seamless_host_h
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync# define __Additions_client_seamless_host_h
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync#include <memory> /* for auto_ptr */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include <vector> /* for vector */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include <VBox/VBoxGuest.h> /* for the R3 guest library functions */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "seamless-glue.h" /* for VBoxGuestSeamlessObserver */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "thread.h" /* for VBoxGuestThread */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsyncclass VBoxGuestSeamlessHost;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/**
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Host event (i.e. enter or leave seamless mode) thread function for the main
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * seamless class
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncclass VBoxGuestSeamlessHostThread : public VBoxGuestThreadFunction
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync{
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncprivate:
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync // Copying or assigning a thread object is not sensible
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync VBoxGuestSeamlessHostThread(const VBoxGuestSeamlessHostThread&);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync VBoxGuestSeamlessHostThread& operator=(const VBoxGuestSeamlessHostThread&);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync // Private member variables
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync /** The host proxy object */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync VBoxGuestSeamlessHost *mHost;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** The thread object running us. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestThread *mThread;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncpublic:
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHostThread(VBoxGuestSeamlessHost *pHost)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync {
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync mHost = pHost;
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync }
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync virtual ~VBoxGuestSeamlessHostThread(void) {}
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /**
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * The actual thread function.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync *
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @returns iprt status code as thread return value
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param pParent the VBoxGuestThread running this thread function
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync virtual int threadFunction(VBoxGuestThread *pThread);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /**
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Send a signal to the thread function that it should exit
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync virtual void stop(void);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync};
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync/**
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * Interface to the host
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncclass VBoxGuestSeamlessHost
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync{
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync friend class VBoxGuestSeamlessHostThread;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsyncpublic:
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /** Events which can be reported by this class */
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync enum meEvent
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync {
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync /** Empty event */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync NONE,
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync /** Request to enable seamless mode */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync ENABLE,
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Request to disable seamless mode */
fa033b734cf3b131680f290326ccbbd23c42946bvboxsync DISABLE
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync };
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncprivate:
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync // We don't want a copy constructor or assignment operator
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHost(const VBoxGuestSeamlessHost&);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHost& operator=(const VBoxGuestSeamlessHost&);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Observer to connect guest and host and ferry events back and forth. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessObserver *mObserver;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Host seamless event (i.e. enter and leave) thread function. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHostThread mThreadFunction;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Host seamless event thread. */
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync VBoxGuestThread mThread;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Is the service running? */
a39ea3668b7019c23a68936259545f9b71bce1aavboxsync bool mRunning;
a39ea3668b7019c23a68936259545f9b71bce1aavboxsync /** Last request issued by the host. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync meEvent mState;
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /**
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Waits for a seamless state change events from the host and dispatch it. This is
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync * meant to be called by the host event monitor thread exclusively.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync *
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync * @returns IRPT return code.
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync int nextEvent(void);
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync /**
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Interrupt an event wait and cause nextEvent() to return immediately.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void cancelEvent(void) { VbglR3InterruptEventWaits(); }
f379f813372b948dc6603b556f0ade7f838a5a65vboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncpublic:
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /**
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Initialise the guest and ensure that it is capable of handling seamless mode
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @param pObserver Observer class to connect host and guest interfaces
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync *
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * @returns iprt status code
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync int init(VBoxGuestSeamlessObserver *pObserver)
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync {
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync if (mObserver != 0) /* Assertion */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync {
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync LogRelThisFunc(("ERROR: attempt to initialise service twice!\n"));
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync return VERR_INTERNAL_ERROR;
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync }
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync mObserver = pObserver;
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync return VINF_SUCCESS;
e3f5c51715cbf77ae2d2e9d05bafd00d69b1bec9vboxsync }
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync /**
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync * Start the service.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @returns iprt status value
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync int start(void);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync /** Stops the service. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync void stop(void);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** Returns the current state of the host - i.e. requesting seamless or not. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync meEvent getState(void) { return mState; }
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /**
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * Update the set of visible rectangles in the host.
548ca31b6b47c36bacce49bed3339cb8075b9681vboxsync */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync void updateRects(std::auto_ptr<std::vector<RTRECT> > pRects);
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync VBoxGuestSeamlessHost(void) : mThreadFunction(this),
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync mThread(&mThreadFunction, 0, RTTHREADTYPE_MAIN_WORKER,
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync RTTHREADFLAGS_WAITABLE, "Seamless host event thead")
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync {
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync mObserver = 0;
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync mRunning = false;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync mState = NONE;
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync }
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync ~VBoxGuestSeamlessHost()
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync {
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync if (mRunning) /* Assertion */
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync {
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync LogRelThisFunc(("Service still running! Stopping...\n"));
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync stop();
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync }
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync }
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync};
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif /* __Additions_xclient_seamless_h not defined */
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync