VirtualBox

Changeset 24250 in vbox


Ignore:
Timestamp:
Nov 2, 2009 1:00:58 PM (15 years ago)
Author:
vboxsync
Message:

StorageController: added support for Instance number

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/settings.h

    r24136 r24250  
    477477          controllerType(StorageControllerType_PIIX3),
    478478          ulPortCount(2),
     479          ulInstance(0),
    479480          lIDE0MasterEmulationPort(0),
    480481          lIDE0SlaveEmulationPort(0),
     
    487488    StorageControllerType_T controllerType;
    488489    uint32_t            ulPortCount;
     490    uint32_t            ulInstance;
    489491
    490492    // only for when controllerType == StorageControllerType_IntelAhci:
  • trunk/src/VBox/Main/ConsoleImpl.cpp

    r24191 r24250  
    26552655        default:
    26562656            return NULL;
     2657    }
     2658}
     2659
     2660void Console::controllerDevToBool(const char *pszCtrlDev, bool *afBool)
     2661{
     2662    if (!strcmp("lsilogicscsi", pszCtrlDev))
     2663    {
     2664        afBool[StorageControllerType_LsiLogic] = true;
     2665    }
     2666    else if (!strcmp("buslogic", pszCtrlDev))
     2667    {
     2668        afBool[StorageControllerType_BusLogic] = true;
     2669    }
     2670    else if (!strcmp("ahci", pszCtrlDev))
     2671    {
     2672        afBool[StorageControllerType_IntelAhci] = true;
     2673    }
     2674    else if (!strcmp("piix3ide", pszCtrlDev))
     2675    {
     2676        afBool[StorageControllerType_PIIX3] = true;
     2677        afBool[StorageControllerType_PIIX4] = true;
     2678        afBool[StorageControllerType_ICH6]  = true;
     2679    }
     2680    else if (!strcmp("i82078", pszCtrlDev))
     2681    {
     2682        afBool[StorageControllerType_I82078] = true;
    26572683    }
    26582684}
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r24159 r24250  
    766766     */
    767767    com::SafeIfaceArray<IStorageController> ctrls;
     768    bool afNodePresent[StorageControllerType_I82078 + 1] = {};
    768769    hrc = pMachine->COMGETTER(StorageControllers)(ComSafeArrayAsOutParam(ctrls));   H();
    769770
     
    775776        bool                    fSCSI = false;
    776777        Bstr                    controllerName;
     778        ULONG                   ulInstance;
    777779
    778780        rc = ctrls[i]->COMGETTER(ControllerType)(&enmCtrlType);                     H();
    779781        rc = ctrls[i]->COMGETTER(Bus)(&enmBus);                                     H();
    780782        rc = ctrls[i]->COMGETTER(Name)(controllerName.asOutParam());                H();
     783        rc = ctrls[i]->COMGETTER(Instance)(&ulInstance);                            H();
    781784
    782785        const char *pszCtrlDev = pConsole->controllerTypeToDev(enmCtrlType);
    783786
    784         rc = CFGMR3InsertNode(pDevices, pszCtrlDev, &pDev);                         RC_CHECK();
    785         /** @todo support multiple instances of a controller */
    786         rc = CFGMR3InsertNode(pDev,     "0", &pCtlInst);                            RC_CHECK();
     787        if (!afNodePresent[enmCtrlType])
     788        {
     789            rc = CFGMR3InsertNode(pDevices, pszCtrlDev, &pDev);                     RC_CHECK();
     790            pConsole->controllerDevToBool(pszCtrlDev, afNodePresent);
     791        }
     792        else
     793        {
     794            pDev = CFGMR3GetChildF(pDevices, pszCtrlDev);
     795            if (!pDev)
     796                rc = VERR_CFGM_CHILD_NOT_FOUND;                                     RC_CHECK();
     797        }
     798        rc = CFGMR3InsertNodeF(pDev, &pCtlInst, "%u", ulInstance);                  RC_CHECK();
    787799
    788800        switch (enmCtrlType)
     
    924936                AssertMsgFailedReturn(("invalid storage controller type: %d\n", enmCtrlType), VERR_GENERAL_FAILURE);
    925937        }
    926 
    927         /* At the moment we only support one controller per type. So the instance id is always 0. */
    928         rc = ctrls[i]->COMSETTER(Instance)(0);                                  H();
    929938
    930939        /* Attach the hard disks. */
  • trunk/src/VBox/Main/MachineImpl.cpp

    r24214 r24250  
    35933593
    35943594    ctrl.createObject();
    3595     rc = ctrl->init (this, aName, aConnectionType);
     3595
     3596    /* get a new instance number for the storage controller */
     3597    ULONG ulInstance = 0;
     3598    for (StorageControllerList::const_iterator it = mStorageControllers->begin();
     3599         it != mStorageControllers->end();
     3600         ++it)
     3601    {
     3602        if ((*it)->storageBus() == aConnectionType)
     3603        {
     3604            ULONG ulCurInst = (*it)->instance();
     3605
     3606            if (ulCurInst > ulInstance)
     3607                ulInstance = ulCurInst;
     3608        }
     3609    }
     3610    ulInstance++;
     3611
     3612    rc = ctrl->init(this, aName, aConnectionType, ulInstance);
    35963613    CheckComRCReturnRC(rc);
    35973614
     
    36253642
    36263643    return rc;
     3644}
     3645
     3646STDMETHODIMP Machine::GetStorageControllerByInstance(ULONG aInstance,
     3647                                                     IStorageController **aStorageController)
     3648{
     3649    AutoCaller autoCaller(this);
     3650    CheckComRCReturnRC(autoCaller.rc());
     3651
     3652    AutoReadLock alock(this);
     3653
     3654    for (StorageControllerList::const_iterator it = mStorageControllers->begin();
     3655         it != mStorageControllers->end();
     3656         ++it)
     3657    {
     3658        if ((*it)->instance() == aInstance)
     3659        {
     3660            (*it).queryInterfaceTo(aStorageController);
     3661            return S_OK;
     3662        }
     3663    }
     3664
     3665    return setError(VBOX_E_OBJECT_NOT_FOUND,
     3666                    tr("Could not find a storage controller with instance number '%lu'"),
     3667                    aInstance);
    36273668}
    36283669
     
    55065547        rc = pCtl->init(this,
    55075548                        ctlData.strName,
    5508                         ctlData.storageBus);
     5549                        ctlData.storageBus,
     5550                        ctlData.ulInstance);
    55095551        CheckComRCReturnRC (rc);
    55105552
     
    64556497        ctl.controllerType = pCtl->controllerType();
    64566498        ctl.storageBus = pCtl->storageBus();
     6499        ctl.ulInstance = pCtl->instance();
    64576500
    64586501        /* Save the port count. */
  • trunk/src/VBox/Main/StorageControllerImpl.cpp

    r23223 r24250  
    6262 * @param aParent       Pointer to our parent object.
    6363 * @param aName         Name of the storage controller.
     64 * @param aInstance     Instance number of the storage controller.
    6465 */
    6566HRESULT StorageController::init(Machine *aParent,
    6667                                const Utf8Str &aName,
    67                                 StorageBus_T aStorageBus)
    68 {
    69     LogFlowThisFunc(("aParent=%p aName=\"%s\"\n", aParent, aName.raw()));
     68                                StorageBus_T aStorageBus,
     69                                ULONG aInstance)
     70{
     71    LogFlowThisFunc(("aParent=%p aName=\"%s\" aInstance=%u\n",
     72                     aParent, aName.raw(), aInstance));
    7073
    7174    ComAssertRet(aParent && !aName.isEmpty(), E_INVALIDARG);
     
    8992
    9093    mData->strName = aName;
     94    mData->mInstance = aInstance;
    9195    mData->mStorageBus = aStorageBus;
    9296
     
    501505    AutoReadLock alock(this);
    502506
    503     *aInstance = mInstance;
     507    *aInstance = mData->mInstance;
    504508
    505509    return S_OK;
     
    515519    AutoWriteLock alock(this);
    516520
    517     mInstance = aInstance;
     521    mData->mInstance = aInstance;
    518522
    519523    return S_OK;
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r24136 r24250  
    40594059  <interface
    40604060     name="IMachine" extends="$unknown"
    4061      uuid="37642E74-969A-4590-BD52-390E541F904D"
     4061     uuid="59080235-41e1-41ca-aa28-33f6992d1646"
    40624062     wsmap="managed"
    40634063     >
     
    49314931        @a name identifies the controller for subsequent calls such as
    49324932        <link to="#getStorageControllerByName" />,
     4933        <link to="#getStorageControllerByInstance" />,
    49334934        <link to="#removeStorageController" />,
    49344935        <link to="#attachDevice" /> or <link to="#mountMedium" />.
     
    49614962    </method>
    49624963
    4963     <method name="removeStorageController">
     4964    <method name="getStorageControllerByInstance" const="yes">
     4965      <desc>
     4966        Returns a storage controller with the given instance number.
     4967
     4968        <result name="VBOX_E_OBJECT_NOT_FOUND">
     4969          A storage controller with given instance number doesn't exist.
     4970        </result>
     4971      </desc>
     4972      <param name="instance" type="unsigned long" dir="in"/>
     4973      <param name="storageController" type="IStorageController" dir="return"/>
     4974    </method>
     4975
     4976   <method name="removeStorageController">
    49644977      <desc>
    49654978        Removes a storage controller from the machine.
  • trunk/src/VBox/Main/include/ConsoleImpl.h

    r23879 r24250  
    443443                                          const char *pszFormat, bool fPassthrough);
    444444    const char *controllerTypeToDev(StorageControllerType_T enmCtrlType);
     445    void controllerDevToBool(const char *pszCtrlDev, bool *afBool);
    445446    HRESULT convertBusPortDeviceToLun(StorageBus_T enmBus, LONG port, LONG device, unsigned &uLun);
    446447    HRESULT doMediumChange(IMediumAttachment *aMediumAttachment);
  • trunk/src/VBox/Main/include/MachineImpl.h

    r24196 r24250  
    617617    STDMETHOD(RemoveStorageController(IN_BSTR aName));
    618618    STDMETHOD(GetStorageControllerByName(IN_BSTR aName, IStorageController **storageController));
     619    STDMETHOD(GetStorageControllerByInstance(ULONG aInstance, IStorageController **storageController));
    619620    STDMETHOD(COMGETTER(FirmwareType)) (FirmwareType_T *aFirmware);
    620621    STDMETHOD(COMSETTER(FirmwareType)) (FirmwareType_T  aFirmware);
  • trunk/src/VBox/Main/include/StorageControllerImpl.h

    r23223 r24250  
    4444        Data() : mStorageBus (StorageBus_IDE),
    4545                 mStorageControllerType (StorageControllerType_PIIX4),
     46                 mInstance (0),
    4647                 mPortCount (2),
    4748                 mPortIde0Master (0),
     
    6869        /** Type of the Storage controller. */
    6970        StorageControllerType_T mStorageControllerType;
     71        /** Instance number of the storage controller. */
     72        ULONG mInstance;
    7073        /** Number of usable ports. */
    7174        ULONG mPortCount;
     
    104107    HRESULT init(Machine *aParent,
    105108                 const Utf8Str &aName,
    106                  StorageBus_T aBus);
     109                 StorageBus_T aBus,
     110                 ULONG aInstance);
    107111    HRESULT init(Machine *aParent,
    108112                 StorageController *aThat,
     
    134138    StorageControllerType_T controllerType() const { return mData->mStorageControllerType; }
    135139    StorageBus_T storageBus() const { return mData->mStorageBus; }
     140    ULONG instance() const { return mData->mInstance; }
    136141
    137142    bool isModified() { AutoWriteLock alock (this); return mData.isBackedUp(); }
     
    164169    /** Data. */
    165170    Backupable<Data> mData;
    166 
    167     /* Instance number of the device in the running VM. */
    168     ULONG mInstance;
    169171};
    170172
  • trunk/src/VBox/Main/xml/Settings.cpp

    r24136 r24250  
    18621862                sctl.strName = "SATA Controller";
    18631863        }
     1864
     1865        if (!pelmController->getAttributeValue("Instance", sctl.ulInstance))
     1866            sctl.ulInstance = 0;
     1867
    18641868        Utf8Str strType;
    18651869        if (!pelmController->getAttributeValue("type", strType))
     
    27352739        pelmController->setAttribute("PortCount", sc.ulPortCount);
    27362740
     2741        pelmController->setAttribute("Instance", sc.ulInstance);
     2742
    27372743        if (sc.controllerType == StorageControllerType_IntelAhci)
    27382744        {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette