VirtualBox

儲存庫 vbox 的更動 16515


忽略:
時間撮記:
2009-2-4 下午03:01:28 (16 年 以前)
作者:
vboxsync
訊息:

OVF: bring back string references; look up controllers by array item index, not internal refid; fix image config

位置:
trunk/src/VBox
檔案:
修改 4 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageImport.cpp

    r16495 r16515  
    9797            {
    9898                com::SafeArray<VirtualSystemDescriptionType_T> retTypes;
    99                 com::SafeArray<ULONG> aRefs;
     99                com::SafeArray<BSTR> aRefs;
    100100                com::SafeArray<BSTR> aOrigValues;
    101101                com::SafeArray<BSTR> aConfigValues;
     
    147147
    148148                        case VirtualSystemDescriptionType_HardDiskControllerIDE:
    149                             RTPrintf("%2d: IDE controller: reference ID %d"
    150                                      "\n    (disable with \"-vsys %d -ignore %d\")\n",
    151                                      a,
    152                                      aRefs[a],
     149                            RTPrintf("%2d: IDE controller, type %ls"
     150                                     "\n    (disable with \"-vsys %d -ignore %d\")\n",
     151                                     a,
     152                                     aConfigValues[a],
    153153                                     i, a);
    154154                        break;
    155155
    156156                        case VirtualSystemDescriptionType_HardDiskControllerSATA:
    157                             RTPrintf("%2d: SATA controller: reference ID %d"
    158                                      "\n    (disable with \"-vsys %d -ignore %d\")\n",
    159                                      a,
    160                                      aRefs[a],
     157                            RTPrintf("%2d: SATA controller, type %ls"
     158                                     "\n    (disable with \"-vsys %d -ignore %d\")\n",
     159                                     a,
     160                                     aConfigValues[a],
    161161                                     i, a);
    162162                        break;
    163163
    164164                        case VirtualSystemDescriptionType_HardDiskControllerSCSI:
    165                             RTPrintf("%2d: SCSI controller: reference ID %d, type %ls"
    166                                      "\n    (change with \"-vsys %d -scsitype%d={BusLogic|LsiLogic}\";"
     165                            RTPrintf("%2d: SCSI controller, type %ls"
     166                                     "\n    (change with \"-vsys %d -type%d={BusLogic|LsiLogic}\";"
    167167                                     "\n    disable with \"-vsys %d -ignore %d\")\n",
    168168                                     a,
    169                                      aRefs[a],
    170169                                     aConfigValues[a],
    171170                                     i, a, i, a);
     
    173172
    174173                        case VirtualSystemDescriptionType_HardDiskImage:
    175                             RTPrintf("%2d: Hard disk image: controller %d, source image \"%ls\", target image \"%ls\""
     174                            RTPrintf("%2d: Hard disk image: source image=%ls, target path=%ls, %ls"
    176175                                     "\n    (change controller with \"-vsys %d -controller%d=<id>\";"
    177176                                     "\n    disable with \"-vsys %d -ignore %d\")\n",
    178177                                     a,
    179                                      aRefs[a],
    180178                                     aOrigValues[a],
    181179                                     aConfigValues[a],
     180                                     aExtraConfigValues[a],
    182181                                     i, a, i, a);
    183182                        break;
     
    196195
    197196                        case VirtualSystemDescriptionType_NetworkAdapter:
    198                             RTPrintf("%2d: Network adapter: orig %ls, auto %ls, conf %ls\n",
     197                            RTPrintf("%2d: Network adapter: orig %ls, config %ls, extra %ls\n",
    199198                                     a,
    200199                                     aOrigValues[a],
  • trunk/src/VBox/Main/ApplianceImpl.cpp

    r16512 r16515  
    109109};
    110110
    111 typedef map<uint32_t, DiskImage> DiskImagesMap;
     111typedef map<Utf8Str, DiskImage> DiskImagesMap;
    112112typedef map<Utf8Str, Network> NetworksMap;
    113113
     
    135135    enum ControllerSystemType { IDE, SATA, SCSI };
    136136    ControllerSystemType system;                 // one of IDE, SATA, SCSI
    137     Utf8Str              strControllerType;      // controllertype (Item/ResourceSubType); e.g. "LsiLogic"; can be empty (esp. for IDE)
     137    Utf8Str              strControllerType;      // controller subtype (Item/ResourceSubType); e.g. "LsiLogic"; can be empty (esp. for IDE)
    138138    Utf8Str              strAddress;             // for IDE
    139139    uint32_t             ulBusNumber;            // for IDE
     
    12371237            convertCIMOSType2VBoxOSType(strOsTypeVBox, vsysThis.cimos);
    12381238            pNewDesc->addEntry(VirtualSystemDescriptionType_OS,
    1239                                0,
     1239                               "",
    12401240                               strCIMOSType,
    12411241                               strOsTypeVBox);
     
    12491249            searchUniqueVMName(nameVBox);
    12501250            pNewDesc->addEntry(VirtualSystemDescriptionType_Name,
    1251                                0,
     1251                               "",
    12521252                               vsysThis.strName,
    12531253                               nameVBox);
     
    12641264                cpuCountVBox = 1;
    12651265            pNewDesc->addEntry(VirtualSystemDescriptionType_CPU,
    1266                                0,
     1266                               "",
    12671267                               toString<ULONG>(vsysThis.cCPUs),
    12681268                               toString<ULONG>(cpuCountVBox));
     
    12811281            }
    12821282            pNewDesc->addEntry(VirtualSystemDescriptionType_Memory,
    1283                                0,
     1283                               "",
    12841284                               toString<uint64_t>(vsysThis.ullMemorySize),
    12851285                               toString<uint64_t>(ullMemSizeVBox));
     
    12901290                   @todo: figure out the hardware which could be possible */
    12911291                pNewDesc->addEntry(VirtualSystemDescriptionType_SoundCard,
    1292                                    0,
     1292                                   "",
    12931293                                   vsysThis.strSoundCardType,
    12941294                                   "");
     
    12961296            /* USB Controller */
    12971297            if (vsysThis.fHasUsbController)
    1298                 pNewDesc->addEntry(VirtualSystemDescriptionType_USBController, 0, "", "");
     1298                pNewDesc->addEntry(VirtualSystemDescriptionType_USBController, "", "", "");
    12991299
    13001300            /* Network Controller */
     
    13161316                {
    13171317                    Utf8Str nwController = *nwIt; // @todo: not used yet
    1318                     pNewDesc->addEntry(VirtualSystemDescriptionType_NetworkAdapter, 0, "", toString<ULONG>(nwAdapterVBox));
     1318                    pNewDesc->addEntry(VirtualSystemDescriptionType_NetworkAdapter, "", "", toString<ULONG>(nwAdapterVBox));
    13191319                }
    13201320            }
     
    13221322            /* Floppy Drive */
    13231323            if (vsysThis.fHasFloppyDrive)
    1324                 pNewDesc->addEntry(VirtualSystemDescriptionType_Floppy, 0, "", "");
     1324                pNewDesc->addEntry(VirtualSystemDescriptionType_Floppy, "", "", "");
    13251325
    13261326            /* CD Drive */
    13271327            if (vsysThis.fHasCdromDrive)
    1328                 pNewDesc->addEntry(VirtualSystemDescriptionType_CDROM, 0, "", "");
     1328                pNewDesc->addEntry(VirtualSystemDescriptionType_CDROM, "", "", "");
    13291329
    13301330            /* Hard disk Controller */
     
    13361336            {
    13371337                const HardDiskController &hdc = hdcIt->second;
     1338                Utf8Str strControllerID = toString<uint32_t>(hdc.idController);
     1339
    13381340                switch (hdc.system)
    13391341                {
     
    13421344                            // @todo: figure out the IDE types
    13431345                            /* Use PIIX4 as default */
    1344                             IDEControllerType_T hdcController = IDEControllerType_PIIX4;
     1346//                             IDEControllerType_T hdcController = IDEControllerType_PIIX4;
     1347                            Utf8Str strType = "PIIX4";
    13451348                            if (!RTStrICmp(hdc.strControllerType.c_str(), "PIIX3"))
    1346                                 hdcController = IDEControllerType_PIIX3;
    1347                             else if (!RTStrICmp(hdc.strControllerType.c_str(), "PIIX4"))
    1348                                 hdcController = IDEControllerType_PIIX4;
     1349                                strType = "PIIX3";
     1350//                             else // if (!RTStrICmp(hdc.strControllerType.c_str(), "PIIX4"))
     1351//                                 hdcController = IDEControllerType_PIIX4;
    13491352                            pNewDesc->addEntry(VirtualSystemDescriptionType_HardDiskControllerIDE,
    1350                                                hdc.idController,
     1353                                               strControllerID,
    13511354                                               hdc.strControllerType,
    1352                                                toString<ULONG>(hdcController));
     1355                                               strType);
    13531356                            break;
    13541357                        }
     
    13591362                            /* We only support a plain AHCI controller, so use them always */
    13601363                            pNewDesc->addEntry(VirtualSystemDescriptionType_HardDiskControllerSATA,
    1361                                                hdc.idController,
     1364                                               strControllerID,
    13621365                                               hdc.strControllerType,
    13631366                                               "AHCI");
     
    13691372                            // @todo: figure out the SCSI types
    13701373                            Utf8Str hdcController = "LsiLogic";
    1371                             if (!RTStrICmp(hdc.strControllerType.c_str(), "LsiLogic"))
     1374                            /* if (!RTStrICmp(hdc.strControllerType.c_str(), "LsiLogic"))
    13721375                                hdcController = "LsiLogic";
    1373                             else if (!RTStrICmp(hdc.strControllerType.c_str(), "BusLogic"))
     1376                            else*/
     1377                            if (!RTStrICmp(hdc.strControllerType.c_str(), "BusLogic"))
    13741378                                hdcController = "BusLogic";
    13751379                            pNewDesc->addEntry(VirtualSystemDescriptionType_HardDiskControllerSCSI,
    1376                                                hdc.idController,
     1380                                               strControllerID,
    13771381                                               hdc.strControllerType,
    13781382                                               hdcController);
     
    13881392                //  - strHref could be empty (construct a new default file name)
    13891393                //  - check that the filename is unique to vbox in any case
    1390                 VirtualDisksMap::const_iterator hdIt;
     1394                VirtualDisksMap::const_iterator itVD;
    13911395                /* Iterate through all hard disks ()*/
    1392                 for (hdIt = vsysThis.mapVirtualDisks.begin();
    1393                      hdIt != vsysThis.mapVirtualDisks.end();
    1394                      ++hdIt)
     1396                for (itVD = vsysThis.mapVirtualDisks.begin();
     1397                     itVD != vsysThis.mapVirtualDisks.end();
     1398                     ++itVD)
    13951399                {
    1396                     const VirtualDisk &hd = hdIt->second;
     1400                    const VirtualDisk &hd = itVD->second;
    13971401                    /* Get the associated disk image */
    13981402                    const DiskImage &di = m->mapDisks[hd.strDiskId];
     
    14031407                    //  - we need a url specifier for the vdi format
    14041408                    if (    (!RTStrICmp(di.strFormat.c_str(), "http://www.vmware.com/specifications/vmdk.html#sparse"))
    1405                             || (!RTStrICmp(di.strFormat.c_str(), "http://www.vmware.com/specifications/vmdk.html#compressed"))
     1409                         || (!RTStrICmp(di.strFormat.c_str(), "http://www.vmware.com/specifications/vmdk.html#compressed"))
    14061410                       )
    14071411                    {
    1408                         /* Construct the path */
    1409                         Utf8StrFmt path("%ls%c%s", bstrDefaultHardDiskLocation.raw(), RTPATH_DELIMITER, di.strHref.c_str());
    1410                         /* Make the path unique to the VBox installation */
    1411                         searchUniqueDiskImageFilePath(path);
     1412                        // construct a unique target path
     1413                        Utf8StrFmt strPath("%ls%c%s",
     1414                                           bstrDefaultHardDiskLocation.raw(),
     1415                                           RTPATH_DELIMITER,
     1416                                           di.strHref.c_str());
     1417                        searchUniqueDiskImageFilePath(strPath);
     1418
     1419                        // find the description for the hard disk controller that has the
     1420                        // same ID as hd.idController
     1421                        const VirtualSystemDescriptionEntry *pController;
     1422                        if (!(pController = pNewDesc->findControllerFromID(hd.idController)))
     1423                            throw setError(E_FAIL,
     1424                                           tr("Internal inconsistency looking up hard disk controller."));
     1425
     1426                        // controller to attach to @todo bus?
     1427                        Utf8StrFmt strExtraConfig("controller=%RI16",
     1428                                                  pController->ulIndex);
    14121429                        pNewDesc->addEntry(VirtualSystemDescriptionType_HardDiskImage,
    1413                                            hd.idController,
     1430                                           "",
    14141431                                           di.strHref,
    1415                                            path);
     1432                                           strPath,
     1433                                           strExtraConfig);
    14161434                    }
    14171435                }
     
    18031821
    18041822                    /* Iterate over all given disk images */
    1805                     list<VirtualSystemDescriptionEntry*>::const_iterator hdIt;
    1806                     for (hdIt = avsdeHDs.begin();
    1807                          hdIt != avsdeHDs.end();
    1808                          ++hdIt)
     1823                    list<VirtualSystemDescriptionEntry*>::const_iterator itHD;
     1824                    for (itHD = avsdeHDs.begin();
     1825                         itHD != avsdeHDs.end();
     1826                         ++itHD)
    18091827                    {
    1810                         const char *pcszDstFilePath = (*hdIt)->strConfig.c_str();
     1828                        VirtualSystemDescriptionEntry *vsdeHD = *itHD;
     1829
     1830                        const char *pcszDstFilePath = vsdeHD->strConfig.c_str();
    18111831                        /* Check if the destination file exists already or the
    18121832                         * destination path is empty. */
     
    18191839                                              pcszDstFilePath));
    18201840                        }
    1821                         ULONG ulRef = (*hdIt)->ulRef;
    1822                         /* Get the associated disk image */
    1823                         if (app->m->mapDisks.find(ulRef) == app->m->mapDisks.end() ||
    1824                             vsysThis.mapVirtualDisks.find(ulRef) == vsysThis.mapVirtualDisks.end())
    1825                         {
    1826                             /* This isn't allowed */
     1841
     1842                        // find the disk from the OVF's disk list
     1843                        DiskImagesMap::const_iterator itDiskImage = app->m->mapDisks.find(vsdeHD->strRef);
     1844                        VirtualDisksMap::const_iterator itVirtualDisk = vsysThis.mapVirtualDisks.find(vsdeHD->strRef);
     1845
     1846                        if (    itDiskImage == app->m->mapDisks.end()
     1847                             || itVirtualDisk == vsysThis.mapVirtualDisks.end()
     1848                           )
    18271849                            throw setError(E_FAIL,
    1828                                            tr("Some internal error occured"));
    1829                         }
    1830                         DiskImage di = app->m->mapDisks[ulRef];
    1831                         VirtualDisk vd = (*vsysThis.mapVirtualDisks.find(ulRef)).second;
     1850                                           tr("Internal inconsistency looking up disk images."));
     1851
     1852                        const DiskImage &di = itDiskImage->second;
     1853                        const VirtualDisk &vd = itVirtualDisk->second;
     1854
    18321855                        /* Construct the source file path */
    18331856                        Utf8StrFmt strSrcFilePath("%s/%s", strSrcDir.c_str(), di.strHref.c_str());
     
    19691992
    19701993STDMETHODIMP VirtualSystemDescription::GetDescription(ComSafeArrayOut(VirtualSystemDescriptionType_T, aTypes),
    1971                                                       ComSafeArrayOut(ULONG, aRefs),
     1994                                                      ComSafeArrayOut(BSTR, aRefs),
    19721995                                                      ComSafeArrayOut(BSTR, aOrigValues),
    19731996                                                      ComSafeArrayOut(BSTR, aConfigValues),
     
    19882011    ULONG c = (ULONG)m->descriptions.size();
    19892012    com::SafeArray<VirtualSystemDescriptionType_T> sfaTypes(c);
    1990     com::SafeArray<ULONG> sfaRefs(c);
     2013    com::SafeArray<BSTR> sfaRefs(c);
    19912014    com::SafeArray<BSTR> sfaOrigValues(c);
    19922015    com::SafeArray<BSTR> sfaConfigValues(c);
     
    20032026        sfaTypes[i] = vsde.type;
    20042027
    2005         sfaRefs[i] = vsde.ulRef;
    2006 
    2007         Bstr bstr = vsde.strOrig;
     2028        Bstr bstr = vsde.strRef;
     2029        bstr.cloneTo(&sfaRefs[i]);
     2030
     2031        bstr = vsde.strOrig;
    20082032        bstr.cloneTo(&sfaOrigValues[i]);
    20092033
     
    20512075
    20522076void VirtualSystemDescription::addEntry(VirtualSystemDescriptionType_T aType,
    2053                                         uint32_t ulRef,
     2077                                        const Utf8Str &strRef,
    20542078                                        const Utf8Str &aOrigValue,
    2055                                         const Utf8Str &aAutoValue)
     2079                                        const Utf8Str &aAutoValue,
     2080                                        const Utf8Str &strExtraConfig /*= ""*/)
    20562081{
    20572082    VirtualSystemDescriptionEntry vsde;
     2083    vsde.ulIndex = m->descriptions.size();      // each entry gets an index so the client side can reference them
    20582084    vsde.type = aType;
    2059     vsde.ulRef = ulRef;
     2085    vsde.strRef = strRef;
    20602086    vsde.strOrig = aOrigValue;
    20612087    vsde.strConfig = aAutoValue;
     2088    vsde.strExtraConfig = strExtraConfig;
    20622089
    20632090    m->descriptions.push_back(vsde);
     
    20772104}
    20782105
     2106const VirtualSystemDescriptionEntry* VirtualSystemDescription::findControllerFromID(uint32_t id)
     2107{
     2108    Utf8Str strRef = toString<uint32_t>(id);
     2109    list<VirtualSystemDescriptionEntry>::const_iterator it;
     2110    for (it = m->descriptions.begin();
     2111         it != m->descriptions.end();
     2112         ++it)
     2113    {
     2114        switch (it->type)
     2115        {
     2116            case VirtualSystemDescriptionType_HardDiskControllerIDE:
     2117            case VirtualSystemDescriptionType_HardDiskControllerSATA:
     2118            case VirtualSystemDescriptionType_HardDiskControllerSCSI:
     2119                if (it->strRef == strRef)
     2120                    return &(*it);
     2121            break;
     2122        }
     2123    }
     2124
     2125    return NULL;
     2126}
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r16510 r16515  
    31003100      </param>
    31013101
    3102       <param name="aRefs" type="unsigned long" dir="out" safearray="yes">
     3102      <param name="aRefs" type="wstring" dir="out" safearray="yes">
    31033103        <desc></desc>
    31043104      </param>
  • trunk/src/VBox/Main/include/ApplianceImpl.h

    r16503 r16515  
    100100struct VirtualSystemDescriptionEntry
    101101{
    102     VirtualSystemDescriptionType_T type; /* Of which type is this value */
    103     uint32_t ulRef;     // reference number
    104     Utf8Str strOrig; /* The original OVF value */
    105     Utf8Str strConfig; /* The value which VBox suggest */
    106     Utf8Str strExtraConfig; /* Additional configuration data for this type */
     102    uint32_t ulIndex;                       // zero-based index of this entry within array
     103    VirtualSystemDescriptionType_T type;    // type of this entry
     104    Utf8Str strRef;                         // reference number (hard disk controllers only)
     105    Utf8Str strOrig;                        // original OVF value (type-dependent)
     106    Utf8Str strConfig;                      // configuration value (type-dependent)
     107    Utf8Str strExtraConfig;                 // extra configuration key=value strings (type-dependent)
    107108};
    108109
     
    144145    /* IVirtualSystemDescription methods */
    145146    STDMETHOD(GetDescription)(ComSafeArrayOut(VirtualSystemDescriptionType_T, aTypes),
    146                               ComSafeArrayOut(ULONG, aRefs),
     147                              ComSafeArrayOut(BSTR, aRefs),
    147148                              ComSafeArrayOut(BSTR, aOrigValues),
    148149                              ComSafeArrayOut(BSTR, aConfigValues),
     
    155156private:
    156157    void addEntry(VirtualSystemDescriptionType_T aType,
    157                   uint32_t ulRef,
     158                  const Utf8Str &strRef,
    158159                  const Utf8Str &aOrigValue,
    159                   const Utf8Str &aAutoValue);
     160                  const Utf8Str &aAutoValue,
     161                  const Utf8Str &strExtraConfig = "");
    160162
    161163    std::list<VirtualSystemDescriptionEntry*> findByType(VirtualSystemDescriptionType_T aType);
     164    const VirtualSystemDescriptionEntry* findControllerFromID(uint32_t id);
    162165
    163166    struct Data;
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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