VirtualBox

Changeset 72476 in vbox for trunk


Ignore:
Timestamp:
Jun 7, 2018 1:49:48 PM (7 years ago)
Author:
vboxsync
Message:

Main/Appliance: Teach importing new tricks: importing to specific location (by settings file name or base folder) and also importing straight into a group. Lots of cleanup and minor fixing (bad code quality due to lots of copy/paste, and what's worse is that the original code was broken already, using the variables inconsistently), plus some smallish coding style cleaup. Much more needed. Also fixed the incomplete use of the VM name on expert (the one in the VBox XML was not changed, and it's the preferred name on import).
VBoxManage: small updates to reflect the new features (and actually offer setting the VM name on export, which is something the GUI could do for a long time).

Location:
trunk/src/VBox
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp

    r69500 r72476  
    121121    { "--vmname",               'V', RTGETOPT_REQ_STRING },
    122122    { "-vmname",                'V', RTGETOPT_REQ_STRING },     // deprecated
     123    { "--settingsfile",         'S', RTGETOPT_REQ_STRING },
     124    { "--basefolder",           'p', RTGETOPT_REQ_STRING },
     125    { "--group",                'g', RTGETOPT_REQ_STRING },
    123126    { "--memory",               'm', RTGETOPT_REQ_STRING },
    124127    { "-memory",                'm', RTGETOPT_REQ_STRING },     // deprecated
     
    193196                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    194197                mapArgsMapsPerVsys[ulCurVsys]["vmname"] = ValueUnion.psz;
     198                break;
     199
     200            case 'S':   // --settingsfile
     201                if (ulCurVsys == (uint32_t)-1)
     202                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     203                mapArgsMapsPerVsys[ulCurVsys]["settingsfile"] = ValueUnion.psz;
     204                break;
     205
     206            case 'p':   // --basefolder
     207                if (ulCurVsys == (uint32_t)-1)
     208                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     209                mapArgsMapsPerVsys[ulCurVsys]["basefolder"] = ValueUnion.psz;
     210                break;
     211
     212            case 'g':   // --group
     213                if (ulCurVsys == (uint32_t)-1)
     214                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     215                mapArgsMapsPerVsys[ulCurVsys]["group"] = ValueUnion.psz;
    195216                break;
    196217
     
    851872
    852873                        case VirtualSystemDescriptionType_SettingsFile:
    853                             /** @todo  VirtualSystemDescriptionType_SettingsFile? */
    854                             break;
     874                            if (findArgValue(strOverride, pmapArgs, "settingsfile"))
     875                            {
     876                                bstrFinalValue = strOverride;
     877                                RTPrintf("%2u: VM settings file name specified with --settingsfile: \"%ls\"\n",
     878                                        a, bstrFinalValue.raw());
     879                            }
     880                            else
     881                                RTPrintf("%2u: Suggested VM settings file name \"%ls\""
     882                                        "\n    (change with \"--vsys %u --settingsfile <filename>\")\n",
     883                                        a, bstrFinalValue.raw(), i);
     884                            break;
     885
     886                        case VirtualSystemDescriptionType_BaseFolder:
     887                            if (findArgValue(strOverride, pmapArgs, "basefolder"))
     888                            {
     889                                bstrFinalValue = strOverride;
     890                                RTPrintf("%2u: VM base folder specified with --basefolder: \"%ls\"\n",
     891                                        a, bstrFinalValue.raw());
     892                            }
     893                            else
     894                                RTPrintf("%2u: Suggested VM base folder \"%ls\""
     895                                        "\n    (change with \"--vsys %u --basefolder <path>\")\n",
     896                                        a, bstrFinalValue.raw(), i);
     897                            break;
     898
     899                        case VirtualSystemDescriptionType_PrimaryGroup:
     900                            if (findArgValue(strOverride, pmapArgs, "group"))
     901                            {
     902                                bstrFinalValue = strOverride;
     903                                RTPrintf("%2u: VM group specified with --group: \"%ls\"\n",
     904                                        a, bstrFinalValue.raw());
     905                            }
     906                            else
     907                                RTPrintf("%2u: Suggested VM group \"%ls\""
     908                                        "\n    (change with \"--vsys %u --group <group>\")\n",
     909                                        a, bstrFinalValue.raw(), i);
     910                            break;
     911
    855912                        case VirtualSystemDescriptionType_Miscellaneous:
    856913                            /** @todo  VirtualSystemDescriptionType_Miscellaneous? */
     
    9471004    { "--iso",                  'I', RTGETOPT_REQ_NOTHING },    // obsoleted by --options
    9481005    { "--vsys",                 's', RTGETOPT_REQ_UINT32 },
     1006    { "--vmname",               'V', RTGETOPT_REQ_STRING },
    9491007    { "--product",              'p', RTGETOPT_REQ_STRING },
    9501008    { "--producturl",           'P', RTGETOPT_REQ_STRING },
     
    10201078                case 's':   // --vsys
    10211079                    ulCurVsys = ValueUnion.u32;
     1080                    break;
     1081
     1082                case 'V':   // --vmname
     1083                    if (ulCurVsys == (uint32_t)-1)
     1084                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     1085                    mapArgsMapsPerVsys[ulCurVsys]["vmname"] = ValueUnion.psz;
    10221086                    break;
    10231087
     
    11611225                     ++itD)
    11621226                {
    1163                     if (itD->first == "product")
     1227                    if (itD->first == "vmname")
     1228                        pVSD->AddDescription(VirtualSystemDescriptionType_Name,
     1229                                             Bstr(itD->second).raw(),
     1230                                             Bstr(itD->second).raw());
     1231                    else if (itD->first == "product")
    11641232                        pVSD->AddDescription(VirtualSystemDescriptionType_Product,
    11651233                                             Bstr(itD->second).raw(),
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r72352 r72476  
    762762                     "                            [--options manifest|iso|nomacs|nomacsbutnat]\n"
    763763                     "                            [--vsys <number of virtual system>]\n"
     764                     "                                    [--vmname <name>]\n"
    764765                     "                                    [--product <product name>]\n"
    765766                     "                                    [--producturl <product url>]\n"
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r72356 r72476  
    35193519  <enum
    35203520    name="VirtualSystemDescriptionType"
    3521     uuid="303c0900-a746-4612-8c67-79003e91f459"
     3521    uuid="e43225cb-09fc-4e70-a56c-6dad3bcb48a6"
    35223522    >
    35233523    <desc>Used with <link to="IVirtualSystemDescription" /> to describe the type of
     
    35483548    <const name="SoundCard" value="23" />
    35493549    <const name="SettingsFile" value="24">
    3550       <desc>Not used/implemented right now, will be added later in 4.1.x.</desc>
     3550      <desc>Optional, may be unset by the API caller. If this is changed by the
     3551        API caller it defines the absolute path of the VM settings file and
     3552        therefore also the VM folder with highest priority.</desc>
     3553    </const>
     3554    <const name="BaseFolder" value="25">
     3555      <desc>Optional, may be unset by the API caller. If set (and
     3556        <link to="#SettingsFile"/> is not changed), defines the VM base folder
     3557        (taking the primary group into account if also set).</desc>
     3558    </const>
     3559    <const name="PrimaryGroup" value="26">
     3560      <desc>Optional, empty by default and may be unset by the API caller.
     3561        Defines the primary group of the VM after import. May influence the
     3562        selection of the VM folder. Additional groups may be configured later
     3563        using <link to="IMachine::groups"/>, after importing.</desc>
    35513564    </const>
    35523565  </enum>
  • trunk/src/VBox/Main/include/ApplianceImpl.h

    r69500 r72476  
    126126    bool i_isApplianceIdle();
    127127    HRESULT i_searchUniqueVMName(Utf8Str& aName) const;
    128     HRESULT i_searchUniqueDiskImageFilePath(Utf8Str& aName) const;
     128    HRESULT i_searchUniqueDiskImageFilePath(const Utf8Str &aMachineFolder, Utf8Str &aName) const;
    129129    HRESULT i_setUpProgress(ComObjPtr<Progress> &pProgress,
    130130                            const Utf8Str &strDescription,
     
    186186
    187187    void i_importOneDiskImage(const ovf::DiskImage &di,
    188                               Utf8Str *strTargetPath,
     188                              const Utf8Str &strTargetPath,
    189189                              ComObjPtr<Medium> &pTargetHD,
    190190                              ImportStack &stack);
  • trunk/src/VBox/Main/include/ApplianceImplPrivate.h

    r69500 r72476  
    310310    // input parameters from VirtualSystemDescriptions
    311311    Utf8Str                         strNameVBox;        // VM name
    312     Utf8Str                         strMachineFolder;   // FQ host folder where the VirtualBox machine would be created
     312    Utf8Str                         strSettingsFilename; // Absolute path to VM config file
     313    Utf8Str                         strMachineFolder;   // Absolute path to VM folder (derived from strSettingsFilename)
    313314    Utf8Str                         strOsTypeVBox;      // VirtualBox guest OS type as string
     315    Utf8Str                         strPrimaryGroup;    // VM primary group as string
    314316    Utf8Str                         strDescription;
    315317    uint32_t                        cCPUs;              // CPU count
  • trunk/src/VBox/Main/include/MachineImpl.h

    r72332 r72476  
    364364    HRESULT init(VirtualBox *aParent,
    365365                 const Utf8Str &strName,
     366                 const Utf8Str &strSettingsFilename,
    366367                 const settings::MachineConfigFile &config);
    367368
  • trunk/src/VBox/Main/src-server/ApplianceImpl.cpp

    r70217 r72476  
    954954}
    955955
    956 HRESULT Appliance::i_searchUniqueDiskImageFilePath(Utf8Str& aName) const
     956HRESULT Appliance::i_searchUniqueDiskImageFilePath(const Utf8Str &aMachineFolder, Utf8Str &aName) const
    957957{
    958958    IMedium *harddisk = NULL;
    959959    char *tmpName = RTStrDup(aName.c_str());
     960    char *tmpAbsName = RTPathAbsExDup(aMachineFolder.c_str(), tmpName);
    960961    int i = 1;
    961962    /* Check if the file exists or if a file with this path is registered
    962963     * already */
    963964    /** @todo Maybe too cost-intensive; try to find a lighter way */
    964     while (    RTPathExists(tmpName)
    965             || mVirtualBox->OpenMedium(Bstr(tmpName).raw(), DeviceType_HardDisk, AccessMode_ReadWrite,
     965    while (    RTPathExists(tmpAbsName)
     966            || mVirtualBox->OpenMedium(Bstr(tmpAbsName).raw(), DeviceType_HardDisk, AccessMode_ReadWrite,
    966967                                       FALSE /* fForceNewUuid */,  &harddisk) != VBOX_E_OBJECT_NOT_FOUND)
    967968    {
    968         RTStrFree(tmpName);
     969        RTStrFree(tmpAbsName);
    969970        char *tmpDir = RTStrDup(aName.c_str());
    970         RTPathStripFilename(tmpDir);;
     971        RTPathStripFilename(tmpDir);
    971972        char *tmpFile = RTStrDup(RTPathFilename(aName.c_str()));
    972973        RTPathStripSuffix(tmpFile);
    973974        const char *pszTmpSuff = RTPathSuffix(aName.c_str());
    974975        RTStrAPrintf(&tmpName, "%s%c%s_%d%s", tmpDir, RTPATH_DELIMITER, tmpFile, i, pszTmpSuff);
     976        tmpAbsName = RTPathAbsExDup(aMachineFolder.c_str(), tmpName);
    975977        RTStrFree(tmpFile);
    976978        RTStrFree(tmpDir);
  • trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp

    r67273 r72476  
    19181918        // fill the machine config
    19191919        vsdescThis->m->pMachine->i_copyMachineDataToSettings(*pConfig);
     1920        pConfig->machineUserData.strName = strVMName;
    19201921
    19211922        // Apply export tweaks to machine settings
  • trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp

    r72201 r72476  
    200200
    201201            /* Based on the VM name, create a target machine path. */
    202             Bstr bstrMachineFilename;
     202            Bstr bstrSettingsFilename;
    203203            rc = mVirtualBox->ComposeMachineFilename(Bstr(nameVBox).raw(),
    204204                                                     NULL /* aGroup */,
    205205                                                     NULL /* aCreateFlags */,
    206206                                                     NULL /* aBaseFolder */,
    207                                                      bstrMachineFilename.asOutParam());
     207                                                     bstrSettingsFilename.asOutParam());
    208208            if (FAILED(rc)) throw rc;
    209             /* Determine the machine folder from that */
    210             Utf8Str strMachineFolder = Utf8Str(bstrMachineFilename).stripFilename();
     209            Utf8Str strMachineFolder(bstrSettingsFilename);
     210            strMachineFolder.stripFilename();
     211
     212#if 1
     213            /* The import logic should work exactly the same whether the
     214             * following 3 items are present or not, but of course it may have
     215             * an influence on the exact presentation of the import settings
     216             * of an API client. */
     217            Utf8Str strSettingsFilename(bstrSettingsFilename);
     218            pNewDesc->i_addEntry(VirtualSystemDescriptionType_SettingsFile,
     219                                 "",
     220                                 "" /* no direct OVF correspondence */,
     221                                 strSettingsFilename);
     222            Utf8Str strBaseFolder;
     223            mVirtualBox->i_getDefaultMachineFolder(strBaseFolder);
     224            pNewDesc->i_addEntry(VirtualSystemDescriptionType_BaseFolder,
     225                                 "",
     226                                 "" /* no direct OVF correspondence */,
     227                                 strBaseFolder);
     228            pNewDesc->i_addEntry(VirtualSystemDescriptionType_PrimaryGroup,
     229                                 "",
     230                                 "" /* no direct OVF correspondence */,
     231                                 "");
     232#endif
    211233
    212234            /* VM Product */
     
    643665                    //  - we need a url specifier for the vdi format
    644666
     667                    Utf8Str strFilename = di.strHref;
    645668                    if (vdf.compare("VMDK", Utf8Str::CaseInsensitive) == 0)
    646669                    {
    647670                        /* If the href is empty use the VM name as filename */
    648                         Utf8Str strFilename = di.strHref;
    649671                        if (!strFilename.length())
    650672                            strFilename = Utf8StrFmt("%s.vmdk", hd.strDiskId.c_str());
    651 
    652                         Utf8Str strTargetPath = Utf8Str(strMachineFolder);
    653                         strTargetPath.append(RTPATH_DELIMITER).append(di.strHref);
    654                         /*
    655                          * Remove last extension from the file name if the file is compressed
    656                         */
    657                         if (di.strCompression.compare("gzip", Utf8Str::CaseInsensitive)==0)
    658                         {
    659                             strTargetPath.stripSuffix();
    660                         }
    661 
    662                         i_searchUniqueDiskImageFilePath(strTargetPath);
    663 
    664                         /* find the description for the hard disk controller
    665                          * that has the same ID as hd.idController */
    666                         const VirtualSystemDescriptionEntry *pController;
    667                         if (!(pController = pNewDesc->i_findControllerFromID(hd.idController)))
    668                             throw setError(E_FAIL,
    669                                            tr("Cannot find hard disk controller with OVF instance ID %RI32 "
    670                                               "to which disk \"%s\" should be attached"),
    671                                            hd.idController,
    672                                            di.strHref.c_str());
    673 
    674                         /* controller to attach to, and the bus within that controller */
    675                         Utf8StrFmt strExtraConfig("controller=%RI16;channel=%RI16",
    676                                                   pController->ulIndex,
    677                                                   hd.ulAddressOnParent);
    678                         pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskImage,
    679                                              hd.strDiskId,
    680                                              di.strHref,
    681                                              strTargetPath,
    682                                              di.ulSuggestedSizeMB,
    683                                              strExtraConfig);
    684673                    }
    685674                    else if (vdf.compare("RAW", Utf8Str::CaseInsensitive) == 0)
    686675                    {
    687676                        /* If the href is empty use the VM name as filename */
    688                         Utf8Str strFilename = di.strHref;
    689677                        if (!strFilename.length())
    690678                            strFilename = Utf8StrFmt("%s.iso", hd.strDiskId.c_str());
    691 
    692                         Utf8Str strTargetPath = Utf8Str(strMachineFolder)
    693                             .append(RTPATH_DELIMITER)
    694                             .append(di.strHref);
    695                         /*
    696                          * Remove last extension from the file name if the file is compressed
    697                         */
    698                         if (di.strCompression.compare("gzip", Utf8Str::CaseInsensitive)==0)
    699                         {
    700                             strTargetPath.stripSuffix();
    701                         }
    702 
    703                         i_searchUniqueDiskImageFilePath(strTargetPath);
    704 
    705                         /* find the description for the hard disk controller
    706                          * that has the same ID as hd.idController */
    707                         const VirtualSystemDescriptionEntry *pController;
    708                         if (!(pController = pNewDesc->i_findControllerFromID(hd.idController)))
    709                             throw setError(E_FAIL,
    710                                            tr("Cannot find disk controller with OVF instance ID %RI32 "
    711                                               "to which disk \"%s\" should be attached"),
    712                                            hd.idController,
    713                                            di.strHref.c_str());
    714 
    715                         /* controller to attach to, and the bus within that controller */
    716                         Utf8StrFmt strExtraConfig("controller=%RI16;channel=%RI16",
    717                                                   pController->ulIndex,
    718                                                   hd.ulAddressOnParent);
    719                         pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskImage,
    720                                              hd.strDiskId,
    721                                              di.strHref,
    722                                              strTargetPath,
    723                                              di.ulSuggestedSizeMB,
    724                                              strExtraConfig);
    725679                    }
    726680                    else
     
    729683                                          di.strHref.c_str(),
    730684                                          di.strFormat.c_str());
     685
     686                    /*
     687                     * Remove last extension from the file name if the file is compressed
     688                     */
     689                    if (di.strCompression.compare("gzip", Utf8Str::CaseInsensitive)==0)
     690                        strFilename.stripSuffix();
     691
     692                    i_searchUniqueDiskImageFilePath(strMachineFolder, strFilename);
     693
     694                    /* find the description for the hard disk controller
     695                     * that has the same ID as hd.idController */
     696                    const VirtualSystemDescriptionEntry *pController;
     697                    if (!(pController = pNewDesc->i_findControllerFromID(hd.idController)))
     698                        throw setError(E_FAIL,
     699                                       tr("Cannot find hard disk controller with OVF instance ID %RI32 "
     700                                          "to which disk \"%s\" should be attached"),
     701                                       hd.idController,
     702                                       di.strHref.c_str());
     703
     704                    /* controller to attach to, and the bus within that controller */
     705                    Utf8StrFmt strExtraConfig("controller=%RI16;channel=%RI16",
     706                                              pController->ulIndex,
     707                                              hd.ulAddressOnParent);
     708                    pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskImage,
     709                                         hd.strDiskId,
     710                                         di.strHref,
     711                                         strFilename,
     712                                         di.ulSuggestedSizeMB,
     713                                         strExtraConfig);
    731714                }
    732715            }
     
    23832366 *
    23842367 * @param di ovfreader.cpp structure describing the disk image from the OVF that is to be imported
    2385  * @param strTargetPath Where to create the target image.
     2368 * @param strDstPath Where to create the target image.
    23862369 * @param pTargetHD out: The newly created target disk. This also gets pushed on stack.llHardDisksCreated for cleanup.
    23872370 * @param stack
    23882371 */
    23892372void Appliance::i_importOneDiskImage(const ovf::DiskImage &di,
    2390                                      Utf8Str *pStrDstPath,
     2373                                     const Utf8Str &strDstPath,
    23912374                                     ComObjPtr<Medium> &pTargetHD,
    23922375                                     ImportStack &stack)
    23932376{
     2377    char *pszAbsDstPath = RTPathAbsExDup(stack.strMachineFolder.c_str(),
     2378                                         strDstPath.c_str());
     2379    Utf8Str strAbsDstPath(pszAbsDstPath);
     2380    RTStrFree(pszAbsDstPath);
     2381    pszAbsDstPath = NULL;
     2382
    23942383    ComObjPtr<Progress> pProgress;
    23952384    pProgress.createObject();
     
    23972386                                 static_cast<IAppliance*>(this),
    23982387                                 BstrFmt(tr("Creating medium '%s'"),
    2399                                  pStrDstPath->c_str()).raw(),
     2388                                         strAbsDstPath.c_str()).raw(),
    24002389                                 TRUE);
    24012390    if (FAILED(rc)) throw rc;
     
    24182407    }
    24192408
    2420     /* First of all check if the path is an UUID. If so, the user like to
    2421      * import the disk into an existing path. This is useful for iSCSI for
    2422      * example. */
     2409    /* First of all check if the original (non-absolute) destination path is
     2410     * a valid hard disk UUID. If so, the user wants to import the disk into
     2411     * an existing path. This is useful for iSCSI for example. */
    24232412    RTUUID uuid;
    2424     int vrc = RTUuidFromStr(&uuid, pStrDstPath->c_str());
     2413    int vrc = RTUuidFromStr(&uuid, strDstPath.c_str());
    24252414    if (vrc == VINF_SUCCESS)
    24262415    {
     
    24422431            ULONG lCabs = 0;
    24432432
    2444             char *pszSuff = RTPathSuffix(pStrDstPath->c_str());
     2433            char *pszSuff = RTPathSuffix(strAbsDstPath.c_str());
    24452434            if (pszSuff != NULL)
    24462435            {
     
    24722461                    strTrgFormat = "vdi";
    24732462                    trgFormat = pSysProps->i_mediumFormatFromExtension(strTrgFormat);
    2474                     *pStrDstPath = pStrDstPath->stripSuffix();
    2475                     *pStrDstPath = pStrDstPath->append(".");
    2476                     *pStrDstPath = pStrDstPath->append(strTrgFormat.c_str());
     2463                    strAbsDstPath.stripSuffix();
     2464                    strAbsDstPath.append(".");
     2465                    strAbsDstPath.append(strTrgFormat.c_str());
    24772466                }
    24782467
     
    24922481                    throw setError(VBOX_E_NOT_SUPPORTED,
    24932482                                   tr("Could not find a valid medium format for the target disk '%s'"),
    2494                                    pStrDstPath->c_str());
     2483                                   strAbsDstPath.c_str());
    24952484            }
    24962485            else
     
    24982487                throw setError(VBOX_E_FILE_ERROR,
    24992488                               tr("The target disk '%s' has no extension "),
    2500                                pStrDstPath->c_str(), VERR_INVALID_NAME);
     2489                               strAbsDstPath.c_str(), VERR_INVALID_NAME);
    25012490            }
    25022491
     
    25102499                {
    25112500                    if (fGzipped)
    2512                         i_importDecompressFile(stack, strSrcFilePath, *pStrDstPath, strSourceOVF.c_str());
     2501                        i_importDecompressFile(stack, strSrcFilePath, strAbsDstPath, strSourceOVF.c_str());
    25132502                    else
    2514                         i_importCopyFile(stack, strSrcFilePath, *pStrDstPath, strSourceOVF.c_str());
     2503                        i_importCopyFile(stack, strSrcFilePath, strAbsDstPath, strSourceOVF.c_str());
    25152504                }
    25162505                catch (HRESULT /*arc*/)
     
    25292518                rc = pTargetHD->init(mVirtualBox,
    25302519                                     strTrgFormat,
    2531                                      *pStrDstPath,
     2520                                     strAbsDstPath,
    25322521                                     Guid::Empty /* media registry: none yet */,
    25332522                                     DeviceType_HardDisk);
     
    25362525                /* Now create an empty hard disk. */
    25372526                rc = mVirtualBox->CreateMedium(Bstr(strTrgFormat).raw(),
    2538                                                Bstr(*pStrDstPath).raw(),
     2527                                               Bstr(strAbsDstPath).raw(),
    25392528                                               AccessMode_ReadWrite, DeviceType_HardDisk,
    25402529                                               ComPtr<IMedium>(pTargetHD).asOutParam());
     
    25562545                    /* operation's weight, as set up with the IProgress originally */
    25572546                    stack.pProgress->SetNextOperation(BstrFmt(tr("Creating disk image '%s'"),
    2558                                                       pStrDstPath->c_str()).raw(),
     2547                                                      strAbsDstPath.c_str()).raw(),
    25592548                                                      di.ulSuggestedSizeMB);
    25602549                }
     
    25752564                    if (fGzipped)
    25762565                    {
    2577                         Utf8Str strTargetFilePath(*pStrDstPath);
     2566                        Utf8Str strTargetFilePath(strAbsDstPath);
    25782567                        strTargetFilePath.stripFilename();
    25792568                        strTargetFilePath.append(RTPATH_SLASH_STR);
     
    26852674
    26862675    /* Create the machine */
    2687     SafeArray<BSTR> groups; /* no groups */
    2688     rc = mVirtualBox->CreateMachine(NULL, /* machine name: use default */
     2676    SafeArray<BSTR> groups; /* no groups, or maybe one group... */
     2677    if (!stack.strPrimaryGroup.isEmpty())
     2678        Bstr(stack.strPrimaryGroup).detachTo(groups.appendedRaw());
     2679    rc = mVirtualBox->CreateMachine(Bstr(stack.strSettingsFilename).raw(),
    26892680                                    Bstr(stack.strNameVBox).raw(),
    26902681                                    ComSafeArrayAsInParam(groups),
     
    32903281
    32913282                i_importOneDiskImage(diCurrent,
    3292                                      &vsdeTargetHD->strVBoxCurrent,
     3283                                     vsdeTargetHD->strVBoxCurrent,
    32933284                                     pTargetHD,
    32943285                                     stack);
     
    34513442    /* OS Type */
    34523443    config.machineUserData.strOsType = stack.strOsTypeVBox;
     3444    /* Groups */
     3445    if (!stack.strPrimaryGroup.isEmpty())
     3446    {
     3447        config.machineUserData.llGroups.clear();
     3448        config.machineUserData.llGroups.push_back(stack.strPrimaryGroup);
     3449    }
    34533450    /* Description */
    34543451    config.machineUserData.strDescription = stack.strDescription;
     
    38493846
    38503847                i_importOneDiskImage(diCurrent,
    3851                                      &vsdeTargetHD->strVBoxCurrent,
     3848                                     vsdeTargetHD->strVBoxCurrent,
    38523849                                     pTargetHD,
    38533850                                     stack);
     
    39423939    rc = pNewMachine->init(mVirtualBox,
    39433940                           stack.strNameVBox,// name from OVF preparations; can be suffixed to avoid duplicates
     3941                           stack.strSettingsFilename,
    39443942                           config);          // the whole machine config
    39453943    if (FAILED(rc)) throw rc;
     
    40024000        stack.strNameVBox = vsdeName.front()->strVBoxCurrent;
    40034001
    4004         // have VirtualBox suggest where the filename would be placed so we can
    4005         // put the disk images in the same directory
    4006         Bstr bstrMachineFilename;
    4007         rc = mVirtualBox->ComposeMachineFilename(Bstr(stack.strNameVBox).raw(),
    4008                                                  NULL /* aGroup */,
    4009                                                  NULL /* aCreateFlags */,
    4010                                                  NULL /* aBaseFolder */,
    4011                                                  bstrMachineFilename.asOutParam());
    4012         if (FAILED(rc)) throw rc;
    4013         // and determine the machine folder from that
    4014         stack.strMachineFolder = bstrMachineFilename;
     4002        // Primary group, which is entirely optional.
     4003        std::list<VirtualSystemDescriptionEntry*> vsdePrimaryGroup = vsdescThis->i_findByType(VirtualSystemDescriptionType_PrimaryGroup);
     4004        if (vsdePrimaryGroup.size() >= 1)
     4005            stack.strPrimaryGroup = vsdePrimaryGroup.front()->strVBoxCurrent;
     4006
     4007        // Draw the right conclusions from the (possibly modified) VM settings
     4008        // file name and base folder. If the VM settings file name is modified,
     4009        // it takes precedence, otherwise it is recreated from the base folder
     4010        // and the primary group.
     4011        std::list<VirtualSystemDescriptionEntry*> vsdeSettingsFile = vsdescThis->i_findByType(VirtualSystemDescriptionType_SettingsFile);
     4012        if (vsdeSettingsFile.size() >= 1)
     4013        {
     4014            VirtualSystemDescriptionEntry *vsdeSF1 = vsdeSettingsFile.front();
     4015            if (vsdeSF1->strVBoxCurrent != vsdeSF1->strVBoxSuggested)
     4016            stack.strSettingsFilename = vsdeSF1->strVBoxCurrent;
     4017        }
     4018        if (stack.strSettingsFilename.isEmpty())
     4019        {
     4020            Utf8Str strBaseFolder;
     4021            std::list<VirtualSystemDescriptionEntry*> vsdeBaseFolder = vsdescThis->i_findByType(VirtualSystemDescriptionType_BaseFolder);
     4022            if (vsdeBaseFolder.size() >= 1)
     4023                strBaseFolder = vsdeBaseFolder.front()->strVBoxCurrent;
     4024            Bstr bstrSettingsFilename;
     4025            rc = mVirtualBox->ComposeMachineFilename(Bstr(stack.strNameVBox).raw(),
     4026                                                     Bstr(stack.strPrimaryGroup).raw(),
     4027                                                     NULL /* aCreateFlags */,
     4028                                                     Bstr(strBaseFolder).raw(),
     4029                                                     bstrSettingsFilename.asOutParam());
     4030            if (FAILED(rc)) throw rc;
     4031            stack.strSettingsFilename = bstrSettingsFilename;
     4032        }
     4033
     4034        // Determine the machine folder from the settings file.
     4035        LogFunc(("i=%zu strName=%s strSettingsFilename=%s\n", i, stack.strNameVBox.c_str(), stack.strSettingsFilename.c_str()));
     4036        stack.strMachineFolder = stack.strSettingsFilename;
    40154037        stack.strMachineFolder.stripFilename();
    4016         LogFunc(("i=%zu strName=%s bstrMachineFilename=%ls\n", i, stack.strNameVBox.c_str(), bstrMachineFilename.raw()));
    40174038
    40184039        // guest OS type
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r72332 r72476  
    516516 *
    517517 *  @param aParent  Associated parent object.
    518  *  @param strName  Name for the new machine; this overrides what is specified in config and is used
    519  *                  for the settings file as well.
     518 *  @param strName  Name for the new machine; this overrides what is specified in config.
     519 *  @param strSettingsFilename File name of .vbox file.
    520520 *  @param config   Machine configuration loaded and parsed from XML.
    521521 *
     
    524524HRESULT Machine::init(VirtualBox *aParent,
    525525                      const Utf8Str &strName,
     526                      const Utf8Str &strSettingsFilename,
    526527                      const settings::MachineConfigFile &config)
    527528{
     
    532533    AssertReturn(autoInitSpan.isOk(), E_FAIL);
    533534
    534     Utf8Str strConfigFile;
    535     aParent->i_getDefaultMachineFolder(strConfigFile);
    536     strConfigFile.append(RTPATH_DELIMITER);
    537     strConfigFile.append(strName);
    538     strConfigFile.append(RTPATH_DELIMITER);
    539     strConfigFile.append(strName);
    540     strConfigFile.append(".vbox");
    541 
    542     HRESULT rc = initImpl(aParent, strConfigFile);
     535    HRESULT rc = initImpl(aParent, strSettingsFilename);
    543536    if (FAILED(rc)) return rc;
    544537
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