StorageControllerImpl.h revision 7189dad3705d42e9874af1e1c8a8c7e5cceee9f7
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync/* $Id$ */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync/** @file
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync *
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * VBox StorageController COM Class declaration.
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync/*
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync *
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * available from http://www.virtualbox.org. This file is free software;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * General Public License (GPL) as published by the Free Software
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync *
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync * additional information or have any questions.
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync#ifndef ____H_STORAGECONTROLLERIMPL
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync#define ____H_STORAGECONTROLLERIMPL
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync#include "VirtualBoxBase.h"
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync#include <list>
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsyncclass Machine;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsyncclass ATL_NO_VTABLE StorageController :
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync public VirtualBoxBaseWithChildrenNEXT,
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync public VirtualBoxSupportErrorInfoImpl <StorageController, IStorageController>,
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync public VirtualBoxSupportTranslation <StorageController>,
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync public IStorageController
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync{
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsyncprivate:
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync struct Data
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync {
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /* Constructor. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync Data() : mStorageBus (StorageBus_IDE),
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync mStorageControllerType (StorageControllerType_PIIX4),
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync mPortCount (2),
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync mPortIde0Master (0),
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync mPortIde0Slave (1),
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync mPortIde1Master (2),
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync mPortIde1Slave (3) { }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync bool operator== (const Data &that) const
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync {
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync return this == &that || ((mStorageControllerType == that.mStorageControllerType) &&
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync (mName == that.mName) &&
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync (mPortCount == that.mPortCount) &&
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync (mPortIde0Master == that.mPortIde0Master) &&
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync (mPortIde0Slave == that.mPortIde0Slave) &&
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync (mPortIde1Master == that.mPortIde1Master) &&
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync (mPortIde1Slave == that.mPortIde1Slave));
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Uniuqe name of the storage controller. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync Bstr mName;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** The connection type of thestorage controller. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync StorageBus_T mStorageBus;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Type of the Storage controller. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync StorageControllerType_T mStorageControllerType;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Number of usable ports. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ULONG mPortCount;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** The following is only for the SATA controller atm. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Port which acts as primary master for ide emulation. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ULONG mPortIde0Master;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Port which acts as primary slave for ide emulation. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ULONG mPortIde0Slave;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Port which acts as secondary master for ide emulation. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ULONG mPortIde1Master;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Port which acts as secondary slave for ide emulation. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ULONG mPortIde1Slave;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync };
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsyncpublic:
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT (StorageController)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync DECLARE_NOT_AGGREGATABLE (StorageController)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync BEGIN_COM_MAP(StorageController)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync COM_INTERFACE_ENTRY (ISupportErrorInfo)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync COM_INTERFACE_ENTRY (IStorageController)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync END_COM_MAP()
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync NS_DECL_ISUPPORTS
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync DECLARE_EMPTY_CTOR_DTOR (StorageController)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync HRESULT FinalConstruct();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync void FinalRelease();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // public initializer/uninitializer for internal purposes only
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync HRESULT init (Machine *aParent, IN_BSTR aName,
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync StorageBus_T aBus);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync HRESULT init (Machine *aParent, StorageController *aThat, bool aReshare = false);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync HRESULT initCopy (Machine *aParent, StorageController *aThat);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync void uninit();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // IStorageController properties
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(Name)) (BSTR *aName);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(Bus)) (StorageBus_T *aBus);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(ControllerType)) (StorageControllerType_T *aControllerType);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMSETTER(ControllerType)) (StorageControllerType_T aControllerType);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(MaxDevicesPerPortCount)) (ULONG *aMaxDevices);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(MinPortCount)) (ULONG *aMinPortCount);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(MaxPortCount)) (ULONG *aMaxPortCount);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(PortCount)) (ULONG *aPortCount);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMSETTER(PortCount)) (ULONG aPortCount);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMGETTER(Instance)) (ULONG *aInstance);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(COMSETTER(Instance)) (ULONG aInstance);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // StorageController methods
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(GetIDEEmulationPort) (LONG DevicePosition, LONG *aPortNumber);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync STDMETHOD(SetIDEEmulationPort) (LONG DevicePosition, LONG aPortNumber);
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // public methods only for internal purposes
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync const Bstr &name() const { return mData->mName; }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync StorageControllerType_T controllerType() const { return mData->mStorageControllerType; }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync bool isModified() { AutoWriteLock alock (this); return mData.isBackedUp(); }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync bool isReallyModified() { AutoWriteLock alock (this); return mData.hasActualChanges(); }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync bool rollback();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync void commit();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // public methods for internal purposes only
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // (ensure there is a caller and a read lock before calling them!)
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync void unshare();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** @note this doesn't require a read lock since mParent is constant. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync const ComObjPtr <Machine, ComWeakRef> &parent() { return mParent; };
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync const Backupable<Data> &data() { return mData; }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ComObjPtr <StorageController> peer() { return mPeer; }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync // for VirtualBoxSupportErrorInfoImpl
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync static const wchar_t *getComponentName() { return L"StorageController"; }
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsyncprivate:
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync void printList();
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Parent object. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync const ComObjPtr<Machine, ComWeakRef> mParent;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Peer object. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync const ComObjPtr <StorageController> mPeer;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /** Data. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync Backupable <Data> mData;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync /* Instance number of the device in the running VM. */
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync ULONG mInstance;
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync};
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync#endif //!____H_STORAGECONTROLLERIMPL
7189dad3705d42e9874af1e1c8a8c7e5cceee9f7vboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */