HostImpl.h revision 8fe0432027bd1524f94759c99ab3ce761cb5c5c0
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync/* $Id$ */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync/** @file
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync * Implemenation of IHost.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync/*
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync *
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * available from http://www.virtualbox.org. This file is free software;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * you can redistribute it and/or modify it under the terms of the GNU
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * General Public License (GPL) as published by the Free Software
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync *
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * additional information or have any questions.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifndef ____H_HOSTIMPL
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#define ____H_HOSTIMPL
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include "VirtualBoxBase.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef VBOX_WITH_USB
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync# include "HostUSBDeviceImpl.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync# include "USBDeviceFilterImpl.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync# include "USBProxyService.h"
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync#else
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncclass USBProxyService;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef RT_OS_WINDOWS
93615dfa4b8a1f188dd33cc6650bad1b96a3dab6vboxsync# include "win32/svchlp.h"
a462e9c5508784b4b91ff00f156011614ae806bavboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsyncclass VirtualBox;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncclass SessionMachine;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsyncclass HostDVDDrive;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncclass HostFloppyDrive;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsyncclass Progress;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include <list>
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncclass ATL_NO_VTABLE Host :
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync public VirtualBoxBaseWithChildren,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync public VirtualBoxSupportErrorInfoImpl <Host, IHost>,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync public VirtualBoxSupportTranslation <Host>,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync public IHost
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync{
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncpublic:
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync DECLARE_NOT_AGGREGATABLE(Host)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync BEGIN_COM_MAP(Host)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync COM_INTERFACE_ENTRY(ISupportErrorInfo)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync COM_INTERFACE_ENTRY(IHost)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync END_COM_MAP()
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync NS_DECL_ISUPPORTS
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT FinalConstruct();
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void FinalRelease();
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync // public initializer/uninitializer for internal purposes only
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT init (VirtualBox *parent);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void uninit();
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync // IHost properties
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(DVDDrives))(IHostDVDDriveCollection **drives);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(FloppyDrives))(IHostFloppyDriveCollection **drives);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(USBDevices))(IHostUSBDeviceCollection **aUSBDevices);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(USBDeviceFilters))(IHostUSBDeviceFilterCollection ** aUSBDeviceFilters);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef RT_OS_WINDOWS
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(NetworkInterfaces))(IHostNetworkInterfaceCollection **networkInterfaces);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(ProcessorCount))(ULONG *count);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(ProcessorSpeed))(ULONG *speed);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(ProcessorDescription))(BSTR *description);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(MemorySize))(ULONG *size);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(MemoryAvailable))(ULONG *available);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(OperatingSystem))(BSTR *os);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(OSVersion))(BSTR *version);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(COMGETTER(UTCTime))(LONG64 *aUTCTime);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync // IHost methods
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef RT_OS_WINDOWS
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(CreateHostNetworkInterface) (INPTR BSTR aName,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync IHostNetworkInterface **aHostNetworkInterface,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync IProgress **aProgress);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(RemoveHostNetworkInterface) (INPTR GUIDPARAM aId,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync IHostNetworkInterface **aHostNetworkInterface,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync IProgress **aProgress);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(CreateUSBDeviceFilter) (INPTR BSTR aName, IHostUSBDeviceFilter **aFilter);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(InsertUSBDeviceFilter) (ULONG aPosition, IHostUSBDeviceFilter *aFilter);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync STDMETHOD(RemoveUSBDeviceFilter) (ULONG aPosition, IHostUSBDeviceFilter **aFilter);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync // public methods only for internal purposes
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT loadSettings (const settings::Key &aGlobal);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT saveSettings (settings::Key &aGlobal);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef VBOX_WITH_USB
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync /** @todo We could benefit from moving all this USB management into USBProxyService
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * instead of spreading out like this. Host only needs to keep the host filter list and make
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * it available to the proxy service. Then only the proxy needs to be intimate friends
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * with HostUSBDevice, which would simplify the overall picture a bit.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * But, I don't dare move anything about this right now though, as I have no time nor any
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * wishes to provoke the deadlock troll so close to a release... */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT onUSBDeviceFilterChange (HostUSBDeviceFilter *aFilter,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync BOOL aActiveChanged = FALSE);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT captureUSBDevice (SessionMachine *aMachine, INPTR GUIDPARAM aId);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT detachUSBDevice (SessionMachine *aMachine, INPTR GUIDPARAM aId, BOOL aDone);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT autoCaptureUSBDevices (SessionMachine *aMachine);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT detachAllUSBDevices (SessionMachine *aMachine, BOOL aDone);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceAttached (HostUSBDevice *aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceDetached (HostUSBDevice *aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef NEW_HOSTUSBDEVICE_STATE
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceStateChanged(HostUSBDevice *aDevice, bool aRunFilters, SessionMachine *aIgnoreMachine);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#else
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceStateChanged(HostUSBDevice *aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync /* must be called from under this object's lock */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync USBProxyService *usbProxyService() { return mUSBProxyService; }
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#else /* !VBOX_WITH_USB */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync USBProxyService *usbProxyService() { return NULL; }
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif /* !VBOX_WITH_USB */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT checkUSBProxyService();
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef RT_OS_WINDOWS
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync static int networkInterfaceHelperServer (SVCHlpClient *aClient,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync SVCHlpMsg::Code aMsgCode);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync // for VirtualBoxSupportErrorInfoImpl
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync static const wchar_t *getComponentName() { return L"Host"; }
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncprivate:
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS)
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync# ifdef VBOX_USE_LIBHAL
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync bool getDVDInfoFromHal(std::list <ComObjPtr <HostDVDDrive> > &list);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync bool getFloppyInfoFromHal(std::list <ComObjPtr <HostFloppyDrive> > &list);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync# endif
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync void parseMountTable(char *mountTable, std::list <ComObjPtr <HostDVDDrive> > &list);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync bool validateDevice(const char *deviceNode, bool isCDROM);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync#endif
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync#ifdef VBOX_WITH_USB
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync /** specialization for IHostUSBDeviceFilter */
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync ComObjPtr <HostUSBDeviceFilter> getDependentChild (IHostUSBDeviceFilter *aFilter)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync {
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync VirtualBoxBase *child = VirtualBoxBaseWithChildren::
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync getDependentChild (ComPtr <IUnknown> (aFilter));
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync return child ? dynamic_cast <HostUSBDeviceFilter *> (child)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync : NULL;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync }
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT applyAllUSBFilters (ComObjPtr <HostUSBDevice> &aDevice,
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync SessionMachine *aMachine = NULL);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
a462e9c5508784b4b91ff00f156011614ae806bavboxsync bool applyMachineUSBFilters (SessionMachine *aMachine,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync ComObjPtr <HostUSBDevice> &aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif /* VBOX_WITH_USB */
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef RT_OS_WINDOWS
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync static int createNetworkInterface (SVCHlpClient *aClient,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync const Utf8Str &aName,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync Guid &aGUID, Utf8Str &aErrMsg);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync static int removeNetworkInterface (SVCHlpClient *aClient,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync const Guid &aGUID,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync Utf8Str &aErrMsg);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync static HRESULT networkInterfaceHelperClient (SVCHlpClient *aClient,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync Progress *aProgress,
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync void *aUser, int *aVrc);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync ComObjPtr <VirtualBox, ComWeakRef> mParent;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync#ifdef VBOX_WITH_USB
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync typedef std::list <ComObjPtr <HostUSBDevice> > USBDeviceList;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync USBDeviceList mUSBDevices; /**< @todo remove this, use the one maintained by USBProxyService. */
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync typedef std::list <ComObjPtr <HostUSBDeviceFilter> > USBDeviceFilterList;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync USBDeviceFilterList mUSBDeviceFilters;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync /** Pointer to the USBProxyService object. */
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync USBProxyService *mUSBProxyService;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif /* VBOX_WITH_USB */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync};
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync#endif // ____H_HOSTIMPL
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync