VirtualBox

Changeset 72883 in vbox for trunk/src/VBox/Main/src-server


Ignore:
Timestamp:
Jul 4, 2018 3:22:02 PM (7 years ago)
Author:
vboxsync
Message:

Main/Medium: add API flag for creating formatted floppy images
Frontends/VBoxManage: matching CLI code

Location:
trunk/src/VBox/Main/src-server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp

    r72509 r72883  
    12501250                        srcLock.release();
    12511251                        rc = pLMedium->i_cloneToEx(pTarget,
    1252                                                    srcVar,
     1252                                                   (MediumVariant_T)srcVar,
    12531253                                                   pNewParent,
    12541254                                                   progress2.asOutParam(),
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r72703 r72883  
    3838#include <iprt/memsafer.h>
    3939#include <iprt/base64.h>
     40#include <iprt/vfs.h>
     41#include <iprt/fsvfs.h>
    4042
    4143#include <VBox/vd.h>
     
    25942596                           m->strFormat.c_str());
    25952597
     2598        if (    (mediumVariantFlags & MediumVariant_Formatted)
     2599            &&  i_getDeviceType() != DeviceType_Floppy)
     2600            throw setError(VBOX_E_NOT_SUPPORTED,
     2601                           tr("Medium variant 'formatted' applies to floppy images only"));
     2602
    25962603        if (m->state != MediumState_NotCreated)
    25972604            throw i_setStateError();
     
    26102617        pTask = new Medium::CreateBaseTask(this, pProgress, aLogicalSize,
    26112618                                           (MediumVariant_T)mediumVariantFlags);
    2612                                            //(MediumVariant_T)aVariant);
    26132619        rc = pTask->rc();
    26142620        AssertComRC(rc);
     
    27492755    }
    27502756
     2757    if (mediumVariantFlags & MediumVariant_Formatted)
     2758    {
     2759        delete pMediumLockList;
     2760        return setError(VBOX_E_NOT_SUPPORTED,
     2761                        tr("Medium variant 'formatted' applies to floppy images only"));
     2762    }
     2763
    27512764    rc = i_createDiffStorage(diff, (MediumVariant_T)mediumVariantFlags, pMediumLockList,
    27522765                             &pProgress, false /* aWait */);
     
    29152928            for (size_t i = 0; i < aVariant.size(); i++)
    29162929                mediumVariantFlags |= (ULONG)aVariant[i];
     2930        }
     2931
     2932        if (mediumVariantFlags & MediumVariant_Formatted)
     2933        {
     2934            delete pSourceMediumLockList;
     2935            delete pTargetMediumLockList;
     2936            throw setError(VBOX_E_NOT_SUPPORTED,
     2937                           tr("Medium variant 'formatted' applies to floppy images only"));
    29172938        }
    29182939
     
    62276248                                         false /* fMoveByRename */,
    62286249                                         0 /* cbSize */,
    6229                                          aVariant & ~MediumVariant_NoCreateDir,
     6250                                         aVariant & ~(MediumVariant_NoCreateDir | MediumVariant_Formatted),
    62306251                                         NULL /* pDstUuid */,
    62316252                                         VD_OPEN_FLAGS_NORMAL | VD_OPEN_FLAGS_SEQUENTIAL,
     
    63766397 * @return
    63776398 */
    6378 HRESULT Medium::i_cloneToEx(const ComObjPtr<Medium> &aTarget, ULONG aVariant,
     6399HRESULT Medium::i_cloneToEx(const ComObjPtr<Medium> &aTarget, MediumVariant_T aVariant,
    63796400                            const ComObjPtr<Medium> &aParent, IProgress **aProgress,
    63806401                            uint32_t idxSrcImageSame, uint32_t idxDstImageSame)
     
    64806501
    64816502        /* setup task object to carry out the operation asynchronously */
    6482         pTask = new Medium::CloneTask(this, pProgress, aTarget,
    6483                                       (MediumVariant_T)aVariant,
     6503        pTask = new Medium::CloneTask(this, pProgress, aTarget, aVariant,
    64846504                                      aParent, idxSrcImageSame,
    64856505                                      idxDstImageSame, pSourceMediumLockList,
     
    81878207                               location.c_str(),
    81888208                               task.mSize,
    8189                                task.mVariant & ~MediumVariant_NoCreateDir,
     8209                               task.mVariant & ~(MediumVariant_NoCreateDir | MediumVariant_Formatted),
    81908210                               NULL,
    81918211                               &geo,
     
    82048224                    throw setError(VBOX_E_FILE_ERROR,
    82058225                                   tr("Could not create the medium storage unit '%s'%s"),
     8226                                   location.c_str(), i_vdError(vrc).c_str());
     8227            }
     8228
     8229            if (task.mVariant & MediumVariant_Formatted)
     8230            {
     8231                RTVFSFILE hVfsFile;
     8232                vrc = RTVfsFileOpenNormal(location.c_str(), RTFILE_O_READWRITE | RTFILE_O_OPEN | RTFILE_O_DENY_ALL, &hVfsFile);
     8233                if (RT_FAILURE(vrc))
     8234                    throw setError(VBOX_E_FILE_ERROR,
     8235                                   tr("Opening medium storage unit '%s' failed%s"),
     8236                                   location.c_str(), i_vdError(vrc).c_str());
     8237                vrc = RTFsFatVolFormat(hVfsFile, 0 /* offVol */, 0 /* cbVol */, RTFSFATVOL_FMT_F_QUICK,
     8238                                       0 /* cbSector */, 0 /* cbSectorPerCluster */, RTFSFATTYPE_INVALID,
     8239                                       0 /* cHeads */, 0 /* cSectorsPerTrack*/, 0 /* bMedia */,
     8240                                       0 /* cRootDirEntries */, 0 /* cHiddenSectors */,
     8241                                       NULL /* pErrInfo */);
     8242                RTVfsFileRelease(hVfsFile);
     8243                if (RT_FAILURE(vrc))
     8244                    throw setError(VBOX_E_FILE_ERROR,
     8245                                   tr("Formatting medium storage unit '%s' failed%s"),
    82068246                                   location.c_str(), i_vdError(vrc).c_str());
    82078247            }
     
    83798419                               targetFormat.c_str(),
    83808420                               targetLocation.c_str(),
    8381                                (task.mVariant & ~(MediumVariant_NoCreateDir | MediumVariant_VmdkESX)) | VD_IMAGE_FLAGS_DIFF,
     8421                                 (task.mVariant & ~(MediumVariant_NoCreateDir | MediumVariant_Formatted | MediumVariant_VmdkESX))
     8422                               | VD_IMAGE_FLAGS_DIFF,
    83828423                               NULL,
    83838424                               targetId.raw(),
     
    89759016                                 false /* fMoveByRename */,
    89769017                                 0 /* cbSize */,
    8977                                  task.mVariant & ~MediumVariant_NoCreateDir,
     9018                                 task.mVariant & ~(MediumVariant_NoCreateDir | MediumVariant_Formatted),
    89789019                                 targetId.raw(),
    89799020                                 VD_OPEN_FLAGS_NORMAL | m->uOpenFlagsDef,
     
    89939034                                   task.midxSrcImageSame,
    89949035                                   task.midxDstImageSame,
    8995                                    task.mVariant & ~MediumVariant_NoCreateDir,
     9036                                   task.mVariant & ~(MediumVariant_NoCreateDir | MediumVariant_Formatted),
    89969037                                   targetId.raw(),
    89979038                                   VD_OPEN_FLAGS_NORMAL | m->uOpenFlagsDef,
     
    98649905                             false /* fMoveByRename */,
    98659906                             0 /* cbSize */,
    9866                              task.mVariant & ~MediumVariant_NoCreateDir,
     9907                             task.mVariant & ~(MediumVariant_NoCreateDir | MediumVariant_Formatted),
    98679908                             targetId.raw(),
    98689909                             VD_OPEN_FLAGS_NORMAL,
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