seamless-host.h revision bd8e360cd1db83dcb2694ea9122ce3bc5bae678a
cbaf00194b28ee57e4aeee473f66f91f1be4e022vboxsync * Guest client: seamless mode.
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync * Copyright (C) 2006-2007 innotek GmbH
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#include <VBox/VBoxGuest.h> /* for the R3 guest library functions */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#include "seamless-glue.h" /* for VBoxGuestSeamlessObserver */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Host event (i.e. enter or leave seamless mode) thread function for the main
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * seamless class
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsyncclass VBoxGuestSeamlessHostThread : public VBoxGuestThreadFunction
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync // Copying or assigning a thread object is not sensible
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync VBoxGuestSeamlessHostThread(const VBoxGuestSeamlessHostThread&);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync VBoxGuestSeamlessHostThread& operator=(const VBoxGuestSeamlessHostThread&);
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync // Private member variables
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync /** The host proxy object */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** The thread object running us. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHostThread(VBoxGuestSeamlessHost *pHost)
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * The actual thread function.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @returns iprt status code as thread return value
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * @param pParent the VBoxGuestThread running this thread function
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync virtual int threadFunction(VBoxGuestThread *pThread);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Send a signal to the thread function that it should exit
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * Interface to the host
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync /** Events which can be reported by this class */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync /** Empty event */
fe96bc0e43d9c137304462ef8c2d79cbff22446fvboxsync /** Request to enable seamless mode */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Request to disable seamless mode */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync // We don't want a copy constructor or assignment operator
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHost(const VBoxGuestSeamlessHost&);
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync VBoxGuestSeamlessHost& operator=(const VBoxGuestSeamlessHost&);
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Observer to connect guest and host and ferry events back and forth. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Host seamless event (i.e. enter and leave) thread function. */
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync /** Host seamless event thread. */
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync /** Is the service running? */
a39ea3668b7019c23a68936259545f9b71bce1aavboxsync /** Last request issued by the host. */
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.
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync * @returns IRPT return code.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync * Interrupt an event wait and cause nextEvent() to return immediately.
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync void cancelEvent(void) { VbglR3InterruptEventWaits(); }
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 * @returns iprt status code
0f1e77149ab5ab40fa2bd74a5330e087416b3c7bvboxsync LogRelThisFunc(("ERROR: attempt to initialise service twice!\n"));
aa32d4906f2f685992091893d5abdf27a2352a85vboxsync * Start the service.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * @returns iprt status value
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync /** Stops the service. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync void stop(void);
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync /** Returns the current state of the host - i.e. requesting seamless or not. */
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync * Update the set of visible rectangles in the host.
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync void updateRects(std::auto_ptr<std::vector<RTRECT> > pRects);
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync VBoxGuestSeamlessHost(void) : mThreadFunction(this),
914d33aebb63d8c288dfd1b7e74f8e2acf3eaa66vboxsync mThread(&mThreadFunction, 0, RTTHREADTYPE_MAIN_WORKER,
8137be2315957032783c582a2e5c2523ea96f9bcvboxsync RTTHREADFLAGS_WAITABLE, "Seamless host event thead")
dd97657cc7e8460edff31ebcff4c9d19bf8ad694vboxsync LogRelThisFunc(("Service still running! Stopping...\n"));
5b1d6bab9f4cf5dacf1883e7c4a40c84349f597fvboxsync#endif /* __Additions_xclient_seamless_h not defined */