HostImpl.h revision 7258e84ec2fa7ecaf94e1a244bd6d2cf6b3a40a4
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync/** @file
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync *
64fee3f73de7a63db0b27a93be05cd635a149d14vboxsync * VirtualBox COM class implementation
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync/*
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * Copyright (C) 2006 InnoTek Systemberatung GmbH
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 as published by the Free Software Foundation,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync *
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * If you received this file as part of a commercial VirtualBox
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * distribution, then only the terms of your commercial VirtualBox
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync * license agreement apply instead of the previous paragraph.
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifndef ____H_HOSTIMPL
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#define ____H_HOSTIMPL
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include "VirtualBoxBase.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include "HostUSBDeviceImpl.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include "USBDeviceFilterImpl.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef __WIN__
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync#include "win32/svchlp.h"
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include <VBox/cfgldr.h>
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
93615dfa4b8a1f188dd33cc6650bad1b96a3dab6vboxsyncclass VirtualBox;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncclass SessionMachine;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsyncclass HostDVDDrive;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsyncclass Progress;
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#include <list>
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsyncclass 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 __WIN__
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 __WIN__
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 onUSBDeviceFilterChange (HostUSBDeviceFilter *aFilter,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync BOOL aActiveChanged = FALSE);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT loadSettings (CFGNODE aGlobal);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT saveSettings (CFGNODE aGlobal);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT captureUSBDevice (SessionMachine *aMachine, INPTR GUIDPARAM aId,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync IUSBDevice **aHostDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT releaseUSBDevice (SessionMachine *aMachine, INPTR GUIDPARAM aId);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT autoCaptureUSBDevices (SessionMachine *aMachine,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync IUSBDeviceCollection **aHostDevices);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT releaseAllUSBDevices (SessionMachine *aMachine);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceAttached (HostUSBDevice *aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceDetached (HostUSBDevice *aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void onUSBDeviceStateChanged (HostUSBDevice *aDevice);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync HRESULT checkUSBProxyService();
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync /* must be called from under this object's lock */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync USBProxyService *usbProxyService() { return mUSBProxyService; }
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef __WIN__
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
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#ifdef __LINUX__
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void parseMountTable(char *mountTable, std::list <ComObjPtr <HostDVDDrive> > &list);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync bool validateDevice(const char *deviceNode, bool isCDROM);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync /** specialization for IHostUSBDeviceFilter */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync ComObjPtr <HostUSBDeviceFilter> getDependentChild (IHostUSBDeviceFilter *aFilter)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync {
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync VirtualBoxBase *child = VirtualBoxBaseWithChildren::
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync getDependentChild (ComPtr <IUnknown> (aFilter));
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync return child ? dynamic_cast <HostUSBDeviceFilter *> (child)
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync : NULL;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync }
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync HRESULT applyAllUSBFilters (ComObjPtr <HostUSBDevice> &aDevice,
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync SessionMachine *aMachine = NULL);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync void applyMachineUSBFilters (SessionMachine *aMachine,
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync ComObjPtr <HostUSBDevice> &aDevice);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync#ifdef __WIN__
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync static int createNetworkInterface (SVCHlpClient *aClient,
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync const Utf8Str &aName,
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync Guid &aGUID, Utf8Str &aErrMsg);
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync static int removeNetworkInterface (SVCHlpClient *aClient,
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync const Guid &aGUID,
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync Utf8Str &aErrMsg);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync static HRESULT networkInterfaceHelperClient (SVCHlpClient *aClient,
a3bbbe5c597341d9b6041560b790596ee41c2cfavboxsync Progress *aProgress,
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync void *aUser, int *aVrc);
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync ComObjPtr <VirtualBox, ComWeakRef> mParent;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync typedef std::list <ComObjPtr <HostUSBDevice> > USBDeviceList;
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync USBDeviceList mUSBDevices;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync typedef std::list <ComObjPtr <HostUSBDeviceFilter> > USBDeviceFilterList;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync USBDeviceFilterList mUSBDeviceFilters;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
61d4c60e55bc9d7545fc89bd9a32bafe38cea555vboxsync /** Pointer to the USBProxyService object. */
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync USBProxyService *mUSBProxyService;
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync};
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync#endif // ____H_HOSTIMPL
67259dc535458471f701aa4a4f3ff00d5736c0dfvboxsync