VirtualBox

Changeset 76298 in vbox for trunk/src


Ignore:
Timestamp:
Dec 19, 2018 6:17:50 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
127586
Message:

Main: bugref:6913: Added generation of some medium events. Contains some fixes for VBoxSVC crash in the MacOS

Location:
trunk/src/VBox/Main
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r76240 r76298  
    2372523725      The given medium was registered or unregistered
    2372623726      within this VirtualBox installation.
    23727       <note>This event is not yet implemented.</note>
    2372823727    </desc>
    2372923728
     
    2375223751      The configuration of the given medium was changed (location, properties,
    2375323752      child/parent or anything else).
    23754       <note>This event is not yet implemented.</note>
    2375523753    </desc>
    2375623754
     
    2414424142      <link to="IMachine::mediumAttachments">medium attachment</link>
    2414524143      changes.
    24146       <note>This event is not yet implemented.</note>
    2414724144    </desc>
    2414824145    <attribute name="mediumAttachment" type="IMediumAttachment" readonly="yes">
  • trunk/src/VBox/Main/include/MediumImpl.h

    r76240 r76298  
    169169                                MediumLockList *pMediumLockList,
    170170                                ComObjPtr<Progress> *aProgress,
    171                                 bool aWait);
     171                                bool aWait,
     172                                bool aNotify);
    172173    Utf8Str i_getPreferredDiffFormat();
    173174    MediumVariant_T i_getPreferredDiffVariant();
     
    176177    HRESULT i_unlockRead(MediumState_T *aState);
    177178    HRESULT i_unlockWrite(MediumState_T *aState);
    178     HRESULT i_deleteStorage(ComObjPtr<Progress> *aProgress, bool aWait);
     179    HRESULT i_deleteStorage(ComObjPtr<Progress> *aProgress, bool aWait, bool aNotify);
    179180    HRESULT i_markForDeletion();
    180181    HRESULT i_unmarkForDeletion();
     
    199200                      MediumLockList *aMediumLockList,
    200201                      ComObjPtr<Progress> *aProgress,
    201                       bool aWait);
     202                      bool aWait,
     203                      bool aNotify);
    202204    void i_cancelMergeTo(MediumLockList *aChildrenToReparent,
    203205                       MediumLockList *aMediumLockList);
     
    206208                     MediumLockList *aMediumLockList,
    207209                     ComObjPtr<Progress> *aProgress,
    208                      bool aWait);
     210                     bool aWait,
     211                     bool aNotify);
    209212
    210213    HRESULT i_fixParentUuidOfChildren(MediumLockList *pChildrenToReparent);
     
    220223                         const ComObjPtr<Progress> &aProgress);
    221224    HRESULT i_importFile(const char *aFilename,
    222                         const ComObjPtr<MediumFormat> &aFormat,
    223                         MediumVariant_T aVariant,
    224                         RTVFSIOSTREAM hVfsIosSrc,
    225                         const ComObjPtr<Medium> &aParent,
    226                         const ComObjPtr<Progress> &aProgress);
     225                         const ComObjPtr<MediumFormat> &aFormat,
     226                         MediumVariant_T aVariant,
     227                         RTVFSIOSTREAM hVfsIosSrc,
     228                         const ComObjPtr<Medium> &aParent,
     229                         const ComObjPtr<Progress> &aProgress,
     230                         bool aNotify);
    227231
    228232    HRESULT i_cloneToEx(const ComObjPtr<Medium> &aTarget, MediumVariant_T aVariant,
    229233                        const ComObjPtr<Medium> &aParent, IProgress **aProgress,
    230                         uint32_t idxSrcImageSame, uint32_t idxDstImageSame);
     234                        uint32_t idxSrcImageSame, uint32_t idxDstImageSame, bool aNotify);
    231235
    232236    const Utf8Str& i_getKeyId();
  • trunk/src/VBox/Main/include/VirtualBoxImpl.h

    r76240 r76298  
    150150    int i_unloadVDPlugin(const char *pszPluginLibrary);
    151151
     152    void i_onMediumRegistered(const Guid &aMediumId, const DeviceType_T aDevType, const BOOL aRegistered);
     153    void i_onMediumConfigChanged(IMedium *aMedium);
     154    void i_onMediumChanged(IMediumAttachment* aMediumAttachment);
     155    void i_onStorageDeviceChanged(IMediumAttachment* aStorageDevice, const BOOL fRemoved, const BOOL fSilent);
    152156    void i_onMachineStateChange(const Guid &aId, MachineState_T aState);
    153157    void i_onMachineDataChange(const Guid &aId, BOOL aTemporary = FALSE);
  • trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp

    r76240 r76298  
    26412641                                                     hVfsIosReadAhead,
    26422642                                                     nullParent,
    2643                                                      pProgressImportTmp);
     2643                                                     pProgressImportTmp,
     2644                                                     true /* aNotify */);
    26442645                    RTVfsIoStrmRelease(hVfsIosReadAhead);
    26452646                    hVfsIosSrc = NIL_RTVFSIOSTREAM;
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r76240 r76298  
    40374037                                                 pMediumLockList,
    40384038                                                 NULL /* aProgress */,
    4039                                                  true /* aWait */);
     4039                                                 true /* aWait */,
     4040                                                 false /* aNotify */);
    40404041
    40414042                alock.acquire();
     
    41454146    mParent->i_saveModifiedRegistries();
    41464147
     4148    if (aM)
     4149        mParent->i_onMediumConfigChanged(aM);
    41474150    return rc;
    41484151}
     
    1081910822                                              pMediumLockList,
    1082010823                                              NULL /* aProgress */,
    10821                                               true /* aWait */);
     10824                                              true /* aWait */,
     10825                                              false /* aNotify */);
    1082210826            alock.acquire();
    1082310827            if (FAILED(rc)) throw rc;
     
    1105511059                Assert(pMedium);
    1105611060
    11057                 rc = pMedium->i_deleteStorage(NULL /*aProgress*/, true /*aWait*/);
     11061                rc = pMedium->i_deleteStorage(NULL /*aProgress*/, true /*aWait*/, false /*aNotify*/);
    1105811062                // continue on delete failure, just collect error messages
    1105911063                AssertMsg(SUCCEEDED(rc), ("rc=%Rhrc it=%s hd=%s\n", rc, pAtt->i_getLogName(),
     
    1122311227
    1122411228        HRESULT rc = oldmedium->i_deleteStorage(NULL /*aProgress*/,
    11225                                                 true /*aWait*/);
     11229                                                true /*aWait*/,
     11230                                                false /*aNotify*/);
    1122611231
    1122711232        writeLock.acquire();
     
    1402314028    }
    1402414029
     14030    mParent->i_onMediumChanged(aAttachment);
     14031
    1402514032    /* ignore notifications sent after #OnSessionEnd() is called */
    1402614033    if (!directControl)
     
    1425914266            directControl = mData->mSession.mDirectControl;
    1426014267    }
     14268
     14269    mParent->i_onStorageDeviceChanged(aAttachment, aRemove, aSilent);
    1426114270
    1426214271    /* ignore notifications sent after #OnSessionEnd() is called */
  • trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp

    r76240 r76298  
    1616 */
    1717
     18#include <set>
     19#include <map>
    1820#include "MachineImplCloneVM.h"
    1921
     
    730732                                          pMediumLockList,
    731733                                          NULL /* aProgress */,
    732                                           true /* aWait */);
     734                                          true /* aWait */,
     735                                          false /* aNotify */);
    733736        delete pMediumLockList;
    734737        if (FAILED(rc)) throw rc;
     
    10161019    RTCList<ComObjPtr<Medium> > newMedia;   /* All created images */
    10171020    RTCList<Utf8Str> newFiles;              /* All extra created files (save states, ...) */
     1021    std::set<ComObjPtr<Medium> > pMediumsForNotify;
     1022    std::map<Guid, DeviceType_T> uIdsForNotify;
    10181023    try
    10191024    {
     
    11531158                        /* diff image has to be used... */
    11541159                        pNewParent = pDiff;
     1160                        pMediumsForNotify.insert(pDiff->i_getParent());
     1161                        uIdsForNotify[pDiff->i_getId()] = pDiff->i_getDeviceType();
    11551162                    }
    11561163                    else
     
    12841291                                                   progress2.asOutParam(),
    12851292                                                   uSrcParentIdx,
    1286                                                    uTrgParentIdx);
     1293                                                   uTrgParentIdx,
     1294                                                   false /* aNotify */);
    12871295                        srcLock.acquire();
    12881296                        if (FAILED(rc)) throw rc;
     
    13181326                         * chain. */
    13191327                        pNewParent = pTarget;
     1328                        uIdsForNotify[pTarget->i_getId()] = pTarget->i_getDeviceType();
    13201329                    }
    13211330                }
     
    13561365                    /* diff image has to be used... */
    13571366                    pNewParent = pDiff;
     1367                    pMediumsForNotify.insert(pDiff->i_getParent());
     1368                    uIdsForNotify[pDiff->i_getId()] = pDiff->i_getDeviceType();
    13581369                }
    13591370                else
     
    15341545            const ComObjPtr<Medium> &pMedium = newMedia.at(i - 1);
    15351546            mrc = pMedium->i_deleteStorage(NULL /* aProgress */,
    1536                                            true /* aWait */);
     1547                                           true /* aWait */,
     1548                                           false /* aNotify */);
    15371549            pMedium->Close();
    15381550        }
     
    15461558        p->mParent->i_saveModifiedRegistries();
    15471559    }
     1560    else
     1561    {
     1562        for (std::map<Guid, DeviceType_T>::const_iterator it = uIdsForNotify.begin();
     1563             it != uIdsForNotify.end();
     1564             ++it)
     1565        {
     1566            p->mParent->i_onMediumRegistered(it->first, it->second, TRUE);
     1567        }
     1568        for (std::set<ComObjPtr<Medium> >::const_iterator it = pMediumsForNotify.begin();
     1569             it != pMediumsForNotify.end();
     1570             ++it)
     1571        {
     1572            if (it->isNotNull())
     1573                p->mParent->i_onMediumConfigChanged(*it);
     1574        }
     1575    }
    15481576
    15491577    return mrc;
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r76240 r76298  
    4646#include <algorithm>
    4747#include <list>
     48#include <set>
     49#include <map>
    4850
    4951
     
    222224{
    223225public:
    224     Task(Medium *aMedium, Progress *aProgress)
     226    Task(Medium *aMedium, Progress *aProgress, bool fNotifyAboutChanges = true)
    225227        : ThreadTask("Medium::Task"),
    226228          mVDOperationIfaces(NULL),
     
    228230          mMediumCaller(aMedium),
    229231          mProgress(aProgress),
    230           mVirtualBoxCaller(NULL)
     232          mVirtualBoxCaller(NULL),
     233          mNotifyAboutChanges(fNotifyAboutChanges)
    231234    {
    232235        AssertReturnVoidStmt(aMedium, mRC = E_FAIL);
     
    271274    HRESULT rc() const { return mRC; }
    272275    bool isOk() const { return SUCCEEDED(rc()); }
     276    bool NotifyAboutChanges() const { return mNotifyAboutChanges; }
    273277
    274278    const ComPtr<Progress>& GetProgressObject() const {return mProgress;}
     
    331335    ComObjPtr<VirtualBox> mVirtualBox;
    332336    AutoCaller mVirtualBoxCaller;
     337    bool mNotifyAboutChanges;
    333338};
    334339
     
    344349                   Progress *aProgress,
    345350                   uint64_t aSize,
    346                    MediumVariant_T aVariant)
    347         : Medium::Task(aMedium, aProgress),
     351                   MediumVariant_T aVariant,
     352                   bool fNotifyAboutChanges = true)
     353        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    348354          mSize(aSize),
    349355          mVariant(aVariant)
     
    367373                   MediumVariant_T aVariant,
    368374                   MediumLockList *aMediumLockList,
    369                    bool fKeepMediumLockList = false)
    370         : Medium::Task(aMedium, aProgress),
     375                   bool fKeepMediumLockList = false,
     376                   bool fNotifyAboutChanges = true)
     377        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    371378          mpMediumLockList(aMediumLockList),
    372379          mTarget(aTarget),
     
    412419              MediumLockList *aTargetMediumLockList,
    413420              bool fKeepSourceMediumLockList = false,
    414               bool fKeepTargetMediumLockList = false)
    415         : Medium::Task(aMedium, aProgress),
     421              bool fKeepTargetMediumLockList = false,
     422              bool fNotifyAboutChanges = true)
     423        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    416424          mTarget(aTarget),
    417425          mParent(aParent),
     
    470478              MediumVariant_T aVariant,
    471479              MediumLockList *aMediumLockList,
    472               bool fKeepMediumLockList = false)
    473         : Medium::Task(aMedium, aProgress),
     480              bool fKeepMediumLockList = false,
     481              bool fNotifyAboutChanges = true)
     482        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    474483          mpMediumLockList(aMediumLockList),
    475484          mVariant(aVariant),
     
    500509                Progress *aProgress,
    501510                MediumLockList *aMediumLockList,
    502                 bool fKeepMediumLockList = false)
    503         : Medium::Task(aMedium, aProgress),
     511                bool fKeepMediumLockList = false,
     512                bool fNotifyAboutChanges = true)
     513        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    504514          mpMediumLockList(aMediumLockList),
    505515          mfKeepMediumLockList(fKeepMediumLockList)
     
    529539               Progress *aProgress,
    530540               MediumLockList *aMediumLockList,
    531                bool fKeepMediumLockList = false)
    532         : Medium::Task(aMedium, aProgress),
     541               bool fKeepMediumLockList = false,
     542               bool fNotifyAboutChanges = true)
     543        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    533544          mSize(aSize),
    534545          mpMediumLockList(aMediumLockList),
     
    559570              Progress *aProgress,
    560571              MediumLockList *aMediumLockList,
    561               bool fKeepMediumLockList = false)
    562         : Medium::Task(aMedium, aProgress),
     572              bool fKeepMediumLockList = false,
     573              bool fNotifyAboutChanges = true)
     574        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    563575          mpMediumLockList(aMediumLockList),
    564576          mfKeepMediumLockList(fKeepMediumLockList)
     
    586598               Progress *aProgress,
    587599               MediumLockList *aMediumLockList,
    588                bool fKeepMediumLockList = false)
    589         : Medium::Task(aMedium, aProgress),
     600               bool fKeepMediumLockList = false,
     601               bool fNotifyAboutChanges = true)
     602        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    590603          mpMediumLockList(aMediumLockList),
    591604          mfKeepMediumLockList(fKeepMediumLockList)
     
    617630              Progress *aProgress,
    618631              MediumLockList *aMediumLockList,
    619               bool fKeepMediumLockList = false)
    620         : Medium::Task(aMedium, aProgress),
     632              bool fKeepMediumLockList = false,
     633              bool fNotifyAboutChanges = true)
     634        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    621635          mTarget(aTarget),
    622636          mfMergeForward(fMergeForward),
     
    666680               Medium *aParent,
    667681               MediumLockList *aTargetMediumLockList,
    668                bool fKeepTargetMediumLockList = false)
    669         : Medium::Task(aMedium, aProgress),
     682               bool fKeepTargetMediumLockList = false,
     683               bool fNotifyAboutChanges = true)
     684        : Medium::Task(aMedium, aProgress, fNotifyAboutChanges),
    670685          mFilename(aFilename),
    671686          mFormat(aFormat),
     
    730745                Progress *aProgress,
    731746                MediumLockList *aMediumLockList)
    732         : Medium::Task(aMedium, aProgress),
     747        : Medium::Task(aMedium, aProgress, false),
    733748          mstrNewPassword(strNewPassword),
    734749          mstrCurrentPassword(strCurrentPassword),
     
    16441659        i_markRegistriesModified();
    16451660        m->pVirtualBox->i_saveModifiedRegistries();
     1661        m->pVirtualBox->i_onMediumConfigChanged(this);
    16461662    }
    16471663    catch (HRESULT aRC) { rc = aRC; }
     
    18791895    i_markRegistriesModified();
    18801896    m->pVirtualBox->i_saveModifiedRegistries();
     1897    m->pVirtualBox->i_onMediumConfigChanged(this);
    18811898
    18821899    return S_OK;
     
    19902007        i_markRegistriesModified();
    19912008        m->pVirtualBox->i_saveModifiedRegistries();
     2009        m->pVirtualBox->i_onMediumConfigChanged(this);
    19922010    }
    19932011
     
    20562074    }
    20572075
     2076    const Guid uPrevImage = m->uuidImage;
    20582077    unconst(m->uuidImage) = imageId;
     2078    ComObjPtr<Medium> pPrevParent = i_getParent();
    20592079    unconst(m->uuidParentImage) = parentId;
    20602080
     
    20652085                             !!aSetParentId /* fSetParentId */,
    20662086                             autoCaller);
     2087
     2088    AutoReadLock arlock(this COMMA_LOCKVAL_SRC_POS);
     2089    const Guid uCurrImage = m->uuidImage;
     2090    ComObjPtr<Medium> pCurrParent = i_getParent();
     2091    arlock.release();
     2092
     2093    if (SUCCEEDED(rc))
     2094    {
     2095        if (uCurrImage != uPrevImage)
     2096            m->pVirtualBox->i_onMediumConfigChanged(this);
     2097        if (pPrevParent != pCurrParent)
     2098        {
     2099            if (pPrevParent)
     2100                m->pVirtualBox->i_onMediumConfigChanged(pPrevParent);
     2101            if (pCurrParent)
     2102                m->pVirtualBox->i_onMediumConfigChanged(pCurrParent);
     2103        }
     2104    }
    20672105
    20682106    return rc;
     
    23582396    ComObjPtr<VirtualBox> pVirtualBox(m->pVirtualBox);
    23592397
     2398    Guid uId = i_getId();
     2399    DeviceType_T devType = i_getDeviceType();
     2400    bool wasCreated = m->state != MediumState_NotCreated;
    23602401    MultiResult mrc = i_close(aAutoCaller);
    23612402
    23622403    pVirtualBox->i_saveModifiedRegistries();
     2404
     2405    if (SUCCEEDED(mrc) && wasCreated)
     2406        pVirtualBox->i_onMediumRegistered(uId, devType, FALSE);
    23632407
    23642408    return mrc;
     
    24302474    i_markRegistriesModified();
    24312475    m->pVirtualBox->i_saveModifiedRegistries();
     2476    m->pVirtualBox->i_onMediumConfigChanged(this);
    24322477
    24332478    return S_OK;
     
    25092554    i_markRegistriesModified();
    25102555    m->pVirtualBox->i_saveModifiedRegistries();
     2556    m->pVirtualBox->i_onMediumConfigChanged(this);
    25112557
    25122558    return S_OK;
    25132559}
     2560
    25142561HRESULT Medium::createBaseStorage(LONG64 aLogicalSize,
    25152562                                  const std::vector<MediumVariant_T> &aVariant,
     
    25972644
    25982645    MultiResult mrc = i_deleteStorage(&pProgress,
    2599                                       false /* aWait */);
     2646                                      false /* aWait */,
     2647                                      true /* aNotify */);
    26002648    /* Must save the registries in any case, since an entry was removed. */
    26012649    m->pVirtualBox->i_saveModifiedRegistries();
     
    27162764
    27172765    rc = i_createDiffStorage(diff, (MediumVariant_T)mediumVariantFlags, pMediumLockList,
    2718                              &pProgress, false /* aWait */);
     2766                             &pProgress, false /* aWait */, true /* aNotify */);
    27192767    if (FAILED(rc))
    27202768        delete pMediumLockList;
     
    27482796
    27492797    rc = i_mergeTo(pTarget, fMergeForward, pParentForTarget, pChildrenToReparent,
    2750                    pMediumLockList, &pProgress, false /* aWait */);
     2798                   pMediumLockList, &pProgress, false /* aWait */, true /* aNotify */);
    27512799    if (FAILED(rc))
    27522800        i_cancelMergeTo(pChildrenToReparent, pMediumLockList);
     
    32993347        MediumState_T mediumState;
    33003348        refreshState(autoCaller, &mediumState);
     3349        m->pVirtualBox->i_onMediumConfigChanged(this);
    33013350    }
    33023351    catch (HRESULT aRC) { rc = aRC; }
     
    34263475
    34273476    if (SUCCEEDED(rc))
    3428         rc = i_resize(aLogicalSize, pMediumLockList, &pProgress, false /* aWait */);
     3477        rc = i_resize(aLogicalSize, pMediumLockList, &pProgress, false /* aWait */, true /* aNotify */);
    34293478
    34303479    if (SUCCEEDED(rc))
     
    44794528        unconst(m->strLocationFull) = newPath;
    44804529
     4530        m->pVirtualBox->i_onMediumConfigChanged(this);
     4531
    44814532        LogFlowThisFunc(("locationFull.after='%s'\n", m->strLocationFull.c_str()));
    44824533        // we changed something
     
    46254676
    46264677/**
    4627  * Internal method to return the medium's size. Must have caller + locking!
     4678 * Internal method to update the medium's id. Must have caller + locking!
    46284679 * @return
    46294680 */
     
    48714922 * @param aWait             @c true if this method should block instead of
    48724923 *                          creating an asynchronous thread.
     4924 * @param aNotify           Notify about mediums which metadatа are changed
     4925 *                          during execution of the function.
    48734926 *
    48744927 * @note Locks this object and @a aTarget for writing.
     
    48784931                                    MediumLockList *aMediumLockList,
    48794932                                    ComObjPtr<Progress> *aProgress,
    4880                                     bool aWait)
     4933                                    bool aWait,
     4934                                    bool aNotify)
    48814935{
    48824936    AssertReturn(!aTarget.isNull(), E_FAIL);
     
    49535007        pTask = new Medium::CreateDiffTask(this, pProgress, aTarget, aVariant,
    49545008                                           aMediumLockList,
    4955                                            aWait /* fKeepMediumLockList */);
     5009                                           aWait /* fKeepMediumLockList */,
     5010                                           aNotify);
    49565011        rc = pTask->rc();
    49575012        AssertComRC(rc);
     
    51335188 * @param aWait         @c true if this method should block instead of creating
    51345189 *                      an asynchronous thread.
     5190 * @param aNotify       Notify about mediums which metadatа are changed
     5191 *                      during execution of the function.
    51355192 *
    51365193 * @note Locks mVirtualBox and this object for writing. Locks medium tree for
     
    51385195 */
    51395196HRESULT Medium::i_deleteStorage(ComObjPtr<Progress> *aProgress,
    5140                               bool aWait)
     5197                              bool aWait, bool aNotify)
    51415198{
    51425199    AssertReturn(aProgress != NULL || aWait == true, E_FAIL);
     
    53095366
    53105367        /* setup task object to carry out the operation sync/async */
    5311         pTask = new Medium::DeleteTask(this, pProgress, pMediumLockList);
     5368        pTask = new Medium::DeleteTask(this, pProgress, pMediumLockList, false, aNotify);
    53125369        rc = pTask->rc();
    53135370        AssertComRC(rc);
     
    59546011 * @param aWait         @c true if this method should block instead of creating
    59556012 *                      an asynchronous thread.
     6013 * @param aNotify       Notify about mediums which metadatа are changed
     6014 *                      during execution of the function.
    59566015 *
    59576016 * @note Locks the tree lock for writing. Locks the media from the chain
     
    59646023                          MediumLockList *aMediumLockList,
    59656024                          ComObjPtr<Progress> *aProgress,
    5966                           bool aWait)
     6025                          bool aWait, bool aNotify)
    59676026{
    59686027    AssertReturn(pTarget != NULL, E_FAIL);
     
    60196078                                      pParentForTarget, aChildrenToReparent,
    60206079                                      pProgress, aMediumLockList,
    6021                                       aWait /* fKeepMediumLockList */);
     6080                                      aWait /* fKeepMediumLockList */,
     6081                                      aNotify);
    60226082        rc = pTask->rc();
    60236083        AssertComRC(rc);
     
    61346194 * @param aWait         @c true if this method should block instead of creating
    61356195 *                      an asynchronous thread.
     6196 * @param aNotify       Notify about mediums which metadatа are changed
     6197 *                      during execution of the function.
    61366198 *
    61376199 * @note Locks the media from the chain for writing.
     
    61416203                         MediumLockList *aMediumLockList,
    61426204                         ComObjPtr<Progress> *aProgress,
    6143                          bool aWait)
     6205                         bool aWait,
     6206                         bool aNotify)
    61446207{
    61456208    AssertReturn(aMediumLockList != NULL, E_FAIL);
     
    61806243                                       pProgress,
    61816244                                       aMediumLockList,
    6182                                        aWait /* fKeepMediumLockList */);
     6245                                       aWait /* fKeepMediumLockList */,
     6246                                       aNotify);
    61836247        rc = pTask->rc();
    61846248        AssertComRC(rc);
     
    64836547 * @param aParent               Parent medium. May be NULL.
    64846548 * @param aProgress             Progress object to use.
     6549 * @param aNotify               Notify about mediums which metadatа are changed
     6550 *                              during execution of the function.
    64856551 * @return
    64866552 * @note The destination format is defined by the Medium instance.
     
    64966562                             RTVFSIOSTREAM aVfsIosSrc,
    64976563                             const ComObjPtr<Medium> &aParent,
    6498                              const ComObjPtr<Progress> &aProgress)
     6564                             const ComObjPtr<Progress> &aProgress,
     6565                             bool aNotify)
    64996566{
    65006567    /** @todo r=klaus The code below needs to be double checked with regard
     
    65576624        /* setup task object to carry out the operation asynchronously */
    65586625        pTask = new Medium::ImportTask(this, aProgress, aFilename, aFormat, aVariant,
    6559                                        aVfsIosSrc, aParent, pTargetMediumLockList);
     6626                                       aVfsIosSrc, aParent, pTargetMediumLockList, false, aNotify);
    65606627        rc = pTask->rc();
    65616628        AssertComRC(rc);
     
    65916658 *                           same content as the given image in the source chain.
    65926659 *                           Use UINT32_MAX to disable this optimization.
     6660 * @param aNotify            Notify about mediums which metadatа are changed
     6661 *                           during execution of the function.
    65936662 * @return
    65946663 */
    65956664HRESULT Medium::i_cloneToEx(const ComObjPtr<Medium> &aTarget, MediumVariant_T aVariant,
    65966665                            const ComObjPtr<Medium> &aParent, IProgress **aProgress,
    6597                             uint32_t idxSrcImageSame, uint32_t idxDstImageSame)
     6666                            uint32_t idxSrcImageSame, uint32_t idxDstImageSame, bool aNotify)
    65986667{
    65996668    /** @todo r=klaus The code below needs to be double checked with regard
     
    67006769                                      aParent, idxSrcImageSame,
    67016770                                      idxDstImageSame, pSourceMediumLockList,
    6702                                       pTargetMediumLockList);
     6771                                      pTargetMediumLockList, false, false, aNotify);
    67036772        rc = pTask->rc();
    67046773        AssertComRC(rc);
     
    73007369    pToken.setNull();
    73017370
    7302     if (FAILED(rc)) return rc;
     7371    if (FAILED(rc))
     7372        return rc;
    73037373
    73047374    /* If this is a base image which incorrectly has a parent UUID set,
     
    73087378     * with a diff image before the base is registered this would destroy
    73097379     * the diff. Not acceptable. */
    7310     if (fRepairImageZeroParentUuid)
    7311     {
    7312         rc = LockWrite(pToken.asOutParam());
    7313         if (FAILED(rc)) return rc;
    7314 
    7315         alock.release();
    7316 
    7317         try
    7318         {
    7319             PVDISK hdd;
    7320             vrc = VDCreate(m->vdDiskIfaces, i_convertDeviceType(), &hdd);
    7321             ComAssertRCThrow(vrc, E_FAIL);
     7380    do
     7381    {
     7382        if (fRepairImageZeroParentUuid)
     7383        {
     7384            rc = LockWrite(pToken.asOutParam());
     7385            if (FAILED(rc))
     7386                break;
     7387
     7388            alock.release();
    73227389
    73237390            try
    73247391            {
    7325                 vrc = VDOpen(hdd,
    7326                              format.c_str(),
    7327                              location.c_str(),
    7328                              (uOpenFlags & ~VD_OPEN_FLAGS_READONLY) | m->uOpenFlagsDef,
    7329                              m->vdImageIfaces);
    7330                 if (RT_FAILURE(vrc))
    7331                     throw S_OK;
    7332 
    7333                 RTUUID zeroParentUuid;
    7334                 RTUuidClear(&zeroParentUuid);
    7335                 vrc = VDSetParentUuid(hdd, 0, &zeroParentUuid);
     7392                PVDISK hdd;
     7393                vrc = VDCreate(m->vdDiskIfaces, i_convertDeviceType(), &hdd);
    73367394                ComAssertRCThrow(vrc, E_FAIL);
     7395
     7396                try
     7397                {
     7398                    vrc = VDOpen(hdd,
     7399                                 format.c_str(),
     7400                                 location.c_str(),
     7401                                 (uOpenFlags & ~VD_OPEN_FLAGS_READONLY) | m->uOpenFlagsDef,
     7402                                 m->vdImageIfaces);
     7403                    if (RT_FAILURE(vrc))
     7404                        throw S_OK;
     7405
     7406                    RTUUID zeroParentUuid;
     7407                    RTUuidClear(&zeroParentUuid);
     7408                    vrc = VDSetParentUuid(hdd, 0, &zeroParentUuid);
     7409                    ComAssertRCThrow(vrc, E_FAIL);
     7410                }
     7411                catch (HRESULT aRC)
     7412                {
     7413                    rc = aRC;
     7414                }
     7415
     7416                VDDestroy(hdd);
    73377417            }
    73387418            catch (HRESULT aRC)
     
    73417421            }
    73427422
    7343             VDDestroy(hdd);
    7344         }
    7345         catch (HRESULT aRC)
    7346         {
    7347             rc = aRC;
    7348         }
    7349 
    7350         pToken->Abandon();
    7351         pToken.setNull();
    7352         if (FAILED(rc)) return rc;
    7353     }
     7423            pToken->Abandon();
     7424            pToken.setNull();
     7425            if (FAILED(rc))
     7426                break;
     7427        }
     7428    } while(0);
    73547429
    73557430    return rc;
     
    84938568            m->pVirtualBox->i_saveModifiedRegistries();
    84948569        }
     8570        if (task.NotifyAboutChanges())
     8571            m->pVirtualBox->i_onMediumRegistered(m->id, m->devType, TRUE);
    84958572    }
    84968573    else
     
    87288805     * unlock the medium. */
    87298806
     8807    if (task.NotifyAboutChanges() && SUCCEEDED(mrc))
     8808    {
     8809        m->pVirtualBox->i_onMediumRegistered(pTarget->i_getId(), pTarget->i_getDeviceType(), TRUE);
     8810        m->pVirtualBox->i_onMediumConfigChanged(this);
     8811    }
     8812
    87308813    return mrc;
    87318814}
     
    88208903
    88218904                ComObjPtr<Progress> pProgress(task.GetProgressObject());
    8822                 rc = pTarget->i_resize(sourceSize, pMediumLockListForResize, &pProgress, true);
     8905                rc = pTarget->i_resize(sourceSize, pMediumLockListForResize, &pProgress, true, false);
    88238906                if (FAILED(rc))
    88248907                {
     
    89869069    HRESULT rc2;
    89879070
     9071    std::set<ComObjPtr<Medium> > pMediumsForNotify;
     9072    std::map<Guid, DeviceType_T> uIdsForNotify;
     9073
    89889074    if (SUCCEEDED(mrc))
    89899075    {
     
    90059091            pTarget->i_setParent(task.mParentForTarget);
    90069092            if (task.mParentForTarget)
     9093            {
    90079094                i_deparent();
     9095                if (task.NotifyAboutChanges())
     9096                    pMediumsForNotify.insert(task.mParentForTarget);
     9097            }
    90089098
    90099099            /* then, register again */
     
    90409130                    // no depth check, reduces depth
    90419131                    pMedium->i_setParent(pTarget);
     9132
     9133                    if (task.NotifyAboutChanges())
     9134                        pMediumsForNotify.insert(pMedium);
    90429135                }
    90439136            }
     9137            pMediumsForNotify.insert(pTarget);
    90449138        }
    90459139
     
    90669160            }
    90679161
     9162            uIdsForNotify[pMedium->i_getId()] = pMedium->i_getDeviceType();
    90689163            rc2 = pMedium->m->pVirtualBox->i_unregisterMedium(pMedium);
    90699164            AssertComRC(rc2);
     
    91269221        if (task.isAsync())
    91279222            i_cancelMergeTo(task.mpChildrenToReparent, task.mpMediumLockList);
     9223    }
     9224    else if (task.NotifyAboutChanges())
     9225    {
     9226        for (std::set<ComObjPtr<Medium> >::const_iterator it = pMediumsForNotify.begin();
     9227             it != pMediumsForNotify.end();
     9228             ++it)
     9229        {
     9230            if (it->isNotNull())
     9231                m->pVirtualBox->i_onMediumConfigChanged(*it);
     9232        }
     9233        for (std::map<Guid, DeviceType_T>::const_iterator it = uIdsForNotify.begin();
     9234             it != uIdsForNotify.end();
     9235             ++it)
     9236        {
     9237            m->pVirtualBox->i_onMediumRegistered(it->first, it->second, FALSE);
     9238        }
    91289239    }
    91299240
     
    94469557                m->pVirtualBox->i_saveModifiedRegistries();
    94479558                eik.fetch();
     9559
     9560                if (task.NotifyAboutChanges())
     9561                {
     9562                    if (!fCreatingTarget)
     9563                    {
     9564                        if (!aFilterPropNames.empty())
     9565                            m->pVirtualBox->i_onMediumConfigChanged(pTargetBase);
     9566                        if (pParent)
     9567                            m->pVirtualBox->i_onMediumConfigChanged(pParent);
     9568                    }
     9569                    else
     9570                    {
     9571                        m->pVirtualBox->i_onMediumRegistered(pTarget->i_getId(), pTarget->i_getDeviceType(), TRUE);
     9572                    }
     9573                }
    94489574            }
    94499575        }
     
    96219747    task.mpMediumLockList->Clear();
    96229748
     9749    if (task.NotifyAboutChanges() && SUCCEEDED(mrc))
     9750        m->pVirtualBox->i_onMediumConfigChanged(this);
    96239751    return mrc;
    96249752}
     
    96889816    /* Reset UUID to prevent Create* from reusing it again */
    96899817    unconst(m->id).clear();
     9818
     9819    if (task.NotifyAboutChanges() && SUCCEEDED(rc) && m->pParent.isNotNull())
     9820        m->pVirtualBox->i_onMediumConfigChanged(m->pParent);
    96909821
    96919822    return rc;
     
    98319962    m->logicalSize = logicalSize;
    98329963    m->variant = variant;
     9964
     9965    if (task.NotifyAboutChanges() && SUCCEEDED(rc))
     9966        m->pVirtualBox->i_onMediumConfigChanged(this);
    98339967
    98349968    /* Everything is explicitly unlocked when the task exits,
     
    992810062    }
    992910063    catch (HRESULT aRC) { rc = aRC; }
     10064
     10065    if (task.NotifyAboutChanges() && SUCCEEDED(rc))
     10066        m->pVirtualBox->i_onMediumConfigChanged(this);
    993010067
    993110068    /* Everything is explicitly unlocked when the task exits,
     
    1004410181        m->size = size;
    1004510182        m->logicalSize = logicalSize;
     10183
     10184        if (task.NotifyAboutChanges())
     10185            m->pVirtualBox->i_onMediumConfigChanged(this);
    1004610186    }
    1004710187
     
    1031210452    task.mpTargetMediumLockList->Clear();
    1031310453
     10454    if (task.NotifyAboutChanges() && SUCCEEDED(mrc))
     10455    {
     10456        if (pParent)
     10457            m->pVirtualBox->i_onMediumConfigChanged(pParent);
     10458        if (fCreatingTarget)
     10459            m->pVirtualBox->i_onMediumConfigChanged(this);
     10460        else
     10461            m->pVirtualBox->i_onMediumRegistered(m->id, m->devType, TRUE);
     10462    }
     10463
    1031410464    return mrc;
    1031510465}
  • trunk/src/VBox/Main/src-server/SnapshotImpl.cpp

    r76240 r76298  
    1515 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    1616 */
     17
     18#include <set>
     19#include <map>
    1720
    1821#include "Logging.h"
     
    16371640    BOOL fSuspendedBySave     = FALSE;
    16381641
     1642    std::set<ComObjPtr<Medium> > pMediumsForNotify;
     1643    std::map<Guid, DeviceType_T> uIdsForNotify;
     1644
    16391645    try
    16401646    {
     
    17731779            if (FAILED(rc))
    17741780                throw rc;
     1781        }
     1782
     1783        // store parent of newly created diffs before commit for notify
     1784        {
     1785            MediumAttachmentList &oldAtts = *mMediumAttachments.backedUpData();
     1786            for (MediumAttachmentList::const_iterator
     1787                 it = mMediumAttachments->begin();
     1788                 it != mMediumAttachments->end();
     1789                 ++it)
     1790            {
     1791                MediumAttachment *pAttach = *it;
     1792                Medium *pMedium = pAttach->i_getMedium();
     1793                if (!pMedium)
     1794                    continue;
     1795
     1796                bool fFound = false;
     1797                /* was this medium attached before? */
     1798                for (MediumAttachmentList::iterator
     1799                     oldIt = oldAtts.begin();
     1800                     oldIt != oldAtts.end();
     1801                     ++oldIt)
     1802                {
     1803                    MediumAttachment *pOldAttach = *oldIt;
     1804                    if (pOldAttach->i_getMedium() == pMedium)
     1805                    {
     1806                        fFound = true;
     1807                        break;
     1808                    }
     1809                }
     1810                if (!fFound)
     1811                {
     1812                    pMediumsForNotify.insert(pMedium->i_getParent());
     1813                    uIdsForNotify[pMedium->i_getId()] = pMedium->i_getDeviceType();
     1814                }
     1815            }
    17751816        }
    17761817
     
    18761917    if (SUCCEEDED(rc))
    18771918        mParent->i_onSnapshotTaken(mData->mUuid, task.m_uuidSnapshot);
     1919
     1920    if (SUCCEEDED(rc))
     1921    {
     1922        for (std::map<Guid, DeviceType_T>::const_iterator it = uIdsForNotify.begin();
     1923             it != uIdsForNotify.end();
     1924             ++it)
     1925        {
     1926            mParent->i_onMediumRegistered(it->first, it->second, TRUE);
     1927        }
     1928
     1929        for (std::set<ComObjPtr<Medium> >::const_iterator it = pMediumsForNotify.begin();
     1930             it != pMediumsForNotify.end();
     1931             ++it)
     1932        {
     1933            if (it->isNotNull())
     1934                mParent->i_onMediumConfigChanged(*it);
     1935        }
     1936    }
    18781937    LogFlowThisFuncLeave();
    18791938}
     
    21202179    HRESULT rc = S_OK;
    21212180    Guid snapshotId;
     2181    std::set<ComObjPtr<Medium> > pMediumsForNotify;
     2182    std::map<Guid, DeviceType_T> uIdsForNotify;
    21222183
    21232184    try
     
    22142275            /* make the snapshot we restored from the current snapshot */
    22152276            mData->mCurrentSnapshot = task.m_pSnapshot;
     2277        }
     2278
     2279        // store parent of newly created diffs for notify
     2280        {
     2281            MediumAttachmentList &oldAtts = *mMediumAttachments.backedUpData();
     2282            for (MediumAttachmentList::const_iterator
     2283                 it = mMediumAttachments->begin();
     2284                 it != mMediumAttachments->end();
     2285                 ++it)
     2286            {
     2287                MediumAttachment *pAttach = *it;
     2288                Medium *pMedium = pAttach->i_getMedium();
     2289                if (!pMedium)
     2290                    continue;
     2291
     2292                bool fFound = false;
     2293                /* was this medium attached before? */
     2294                for (MediumAttachmentList::iterator
     2295                     oldIt = oldAtts.begin();
     2296                     oldIt != oldAtts.end();
     2297                     ++oldIt)
     2298                {
     2299                    MediumAttachment *pOldAttach = *oldIt;
     2300                    if (pOldAttach->i_getMedium() == pMedium)
     2301                    {
     2302                        fFound = true;
     2303                        break;
     2304                    }
     2305                }
     2306                if (!fFound)
     2307                {
     2308                    pMediumsForNotify.insert(pMedium->i_getParent());
     2309                    uIdsForNotify[pMedium->i_getId()] = pMedium->i_getDeviceType();
     2310                }
     2311            }
    22162312        }
    22172313
     
    23142410            LogFlowThisFunc(("Deleting old current state in differencing image '%s'\n", pMedium->i_getName().c_str()));
    23152411
     2412            ComObjPtr<Medium> pParent = pMedium->i_getParent();
    23162413            HRESULT rc2 = pMedium->i_deleteStorage(NULL /* aProgress */,
    2317                                                    true /* aWait */);
     2414                                                   true /* aWait */,
     2415                                                   false /* aNotify */);
    23182416            // ignore errors here because we cannot roll back after i_saveSettings() above
    23192417            if (SUCCEEDED(rc2))
     2418            {
     2419                pMediumsForNotify.insert(pParent);
    23202420                pMedium->uninit();
     2421            }
    23212422        }
    23222423    }
     
    23452446
    23462447    if (SUCCEEDED(rc))
     2448    {
    23472449        mParent->i_onSnapshotRestored(mData->mUuid, snapshotId);
     2450        for (std::map<Guid, DeviceType_T>::const_iterator it = uIdsForNotify.begin();
     2451             it != uIdsForNotify.end();
     2452             ++it)
     2453        {
     2454            mParent->i_onMediumRegistered(it->first, it->second, TRUE);
     2455        }
     2456        for (std::set<ComObjPtr<Medium> >::const_iterator it = pMediumsForNotify.begin();
     2457             it != pMediumsForNotify.end();
     2458             ++it)
     2459        {
     2460            if (it->isNotNull())
     2461                mParent->i_onMediumConfigChanged(*it);
     2462        }
     2463    }
    23482464
    23492465    LogFlowThisFunc(("Done restoring snapshot (rc=%08X)\n", rc));
     
    26962812    MediumDeleteRecList toDelete;
    26972813    Guid snapshotId;
     2814    std::set<ComObjPtr<Medium> > pMediumsForNotify;
     2815    std::map<Guid,DeviceType_T> uIdsForNotify;
    26982816
    26992817    try
     
    30703188                    /* No need to hold the lock any longer. */
    30713189                    mLock.release();
     3190                    ComObjPtr<Medium> pParent = pMedium->i_getParent();
     3191                    Guid uMedium = pMedium->i_getId();
     3192                    DeviceType_T uMediumType = pMedium->i_getDeviceType();
    30723193                    rc = pMedium->i_deleteStorage(&task.m_pProgress,
    3073                                                   true /* aWait */);
     3194                                                  true /* aWait */,
     3195                                                  false /* aNotify */);
    30743196                    if (FAILED(rc))
    30753197                        throw rc;
     3198
     3199                    pMediumsForNotify.insert(pParent);
     3200                    uIdsForNotify[uMedium] = uMediumType;
    30763201
    30773202                    // need to uninit the deleted medium
     
    30813206            else
    30823207            {
     3208                {
     3209                    //store ids before merging for notify
     3210                    pMediumsForNotify.insert(it->mpTarget);
     3211                    if (it->mfMergeForward)
     3212                        pMediumsForNotify.insert(it->mpSource->i_getParent());
     3213                    else
     3214                    {
     3215                        //children which will be reparented to target
     3216                        for (MediaList::const_iterator iit = it->mpSource->i_getChildren().begin();
     3217                             iit != it->mpSource->i_getChildren().end();
     3218                             ++iit)
     3219                        {
     3220                            pMediumsForNotify.insert(*iit);
     3221                        }
     3222                    }
     3223                    if (it->mfMergeForward)
     3224                    {
     3225                        for (ComObjPtr<Medium> pTmpMedium = it->mpTarget->i_getParent();
     3226                             pTmpMedium && pTmpMedium != it->mpSource;
     3227                             pTmpMedium = pTmpMedium->i_getParent())
     3228                        {
     3229                            uIdsForNotify[pTmpMedium->i_getId()] = pTmpMedium->i_getDeviceType();
     3230                        }
     3231                        uIdsForNotify[it->mpSource->i_getId()] = it->mpSource->i_getDeviceType();
     3232                    }
     3233                    else
     3234                    {
     3235                        for (ComObjPtr<Medium> pTmpMedium = it->mpSource->i_getParent();
     3236                             pTmpMedium && pTmpMedium != it->mpTarget;
     3237                             pTmpMedium = pTmpMedium->i_getParent())
     3238                        {
     3239                            uIdsForNotify[pTmpMedium->i_getId()] = pTmpMedium->i_getDeviceType();
     3240                        }
     3241                    }
     3242                }
     3243
    30833244                bool fNeedsSave = false;
    30843245                if (it->mfNeedsOnlineMerge)
     
    31113272                                                 it->mpMediumLockList,
    31123273                                                 &task.m_pProgress,
    3113                                                  true /* aWait */);
     3274                                                 true /* aWait */,
     3275                                                 false /* aNotify */);
    31143276                }
    31153277
     
    32783440
    32793441    if (SUCCEEDED(mrc))
     3442    {
    32803443        mParent->i_onSnapshotDeleted(mData->mUuid, snapshotId);
     3444        for (std::map<Guid, DeviceType_T>::const_iterator it = uIdsForNotify.begin();
     3445             it != uIdsForNotify.end();
     3446             ++it)
     3447        {
     3448            mParent->i_onMediumRegistered(it->first, it->second, FALSE);
     3449        }
     3450        for (std::set<ComObjPtr<Medium> >::const_iterator it = pMediumsForNotify.begin();
     3451             it != pMediumsForNotify.end();
     3452             ++it)
     3453        {
     3454            if (it->isNotNull())
     3455                mParent->i_onMediumConfigChanged(*it);
     3456        }
     3457    }
    32813458
    32823459    LogFlowThisFunc(("Done deleting snapshot (rc=%08X)\n", (HRESULT)mrc));
     
    39724149    return S_OK;
    39734150}
    3974 
  • trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp

    r76240 r76298  
    19631963
    19641964    if (SUCCEEDED(rc))
     1965    {
    19651966        medium.queryInterfaceTo(aMedium.asOutParam());
     1967        i_onMediumRegistered(medium->i_getId(), medium->i_getDeviceType(), TRUE);
     1968    }
    19661969
    19671970    return rc;
     
    20142017    }
    20152018
     2019    bool fMediumRegistered = false;
    20162020    if (pMedium.isNull())
    20172021    {
     
    20402044                rc = VBOX_E_OBJECT_NOT_FOUND;
    20412045            }
     2046            else
     2047            {
     2048                fMediumRegistered = true;
     2049            }
    20422050        }
    20432051        else
     
    20492057
    20502058    if (SUCCEEDED(rc))
     2059    {
    20512060        pMedium.queryInterfaceTo(aMedium.asOutParam());
     2061        if (fMediumRegistered)
     2062            i_onMediumRegistered(pMedium->i_getId(), pMedium->i_getDeviceType() ,TRUE);
     2063    }
    20522064
    20532065    return rc;
     
    22522264        if (RT_FAILURE(vrc))
    22532265            fFailure = true;
     2266    }
     2267    if (!fFailure)
     2268    {
     2269        for (MediaList::const_iterator mt = m->allHardDisks.begin();
     2270             mt != m->allHardDisks.end();
     2271             ++mt)
     2272        {
     2273            i_onMediumConfigChanged(*mt);
     2274        }
    22542275    }
    22552276    return fFailure ? VERR_INVALID_PARAMETER : VINF_SUCCESS;
     
    29172938}
    29182939
     2940
     2941/** Event for onMediumRegistered() */
     2942struct MediumRegisteredEventStruct : public VirtualBox::CallbackEvent
     2943{
     2944    MediumRegisteredEventStruct(VirtualBox *aVB, const Guid &aMediumId,
     2945                          const DeviceType_T aDevType, const BOOL aRegistered)
     2946        : CallbackEvent(aVB, VBoxEventType_OnMediumRegistered)
     2947        , mMediumId(aMediumId.toUtf16()), mDevType(aDevType), mRegistered(aRegistered)
     2948    {}
     2949
     2950    virtual HRESULT prepareEventDesc(IEventSource *aSource, VBoxEventDesc &aEvDesc)
     2951    {
     2952        return aEvDesc.init(aSource, VBoxEventType_OnMediumRegistered, mMediumId.raw(), mDevType, mRegistered);
     2953    }
     2954
     2955    Bstr mMediumId;
     2956    DeviceType_T mDevType;
     2957    BOOL mRegistered;
     2958};
     2959
     2960/**
     2961 *  @note Doesn't lock any object.
     2962 */
     2963void VirtualBox::i_onMediumRegistered(const Guid &aMediumId, const DeviceType_T aDevType, const BOOL aRegistered)
     2964{
     2965    i_postEvent(new MediumRegisteredEventStruct(this, aMediumId, aDevType, aRegistered));
     2966}
     2967
     2968/** Event for onMediumConfigChanged() */
     2969struct MediumConfigChangedEventStruct : public VirtualBox::CallbackEvent
     2970{
     2971    MediumConfigChangedEventStruct(VirtualBox *aVB, IMedium *aMedium)
     2972        : CallbackEvent(aVB, VBoxEventType_OnMediumConfigChanged)
     2973        , mMedium(aMedium)
     2974    {}
     2975
     2976    virtual HRESULT prepareEventDesc(IEventSource *aSource, VBoxEventDesc &aEvDesc)
     2977    {
     2978        return aEvDesc.init(aSource, VBoxEventType_OnMediumConfigChanged, mMedium);
     2979    }
     2980
     2981    IMedium* mMedium;
     2982};
     2983
     2984void VirtualBox::i_onMediumConfigChanged(IMedium *aMedium)
     2985{
     2986    i_postEvent(new MediumConfigChangedEventStruct(this, aMedium));
     2987}
     2988
     2989/** Event for onMediumChanged() */
     2990struct MediumChangedEventStruct : public VirtualBox::CallbackEvent
     2991{
     2992    MediumChangedEventStruct(VirtualBox *aVB, IMediumAttachment *aMediumAttachment)
     2993        : CallbackEvent(aVB, VBoxEventType_OnMediumChanged)
     2994        , mMediumAttachment(aMediumAttachment)
     2995    {}
     2996
     2997    virtual HRESULT prepareEventDesc(IEventSource *aSource, VBoxEventDesc &aEvDesc)
     2998    {
     2999        return aEvDesc.init(aSource, VBoxEventType_OnMediumChanged, mMediumAttachment);
     3000    }
     3001
     3002    IMediumAttachment* mMediumAttachment;
     3003};
     3004
     3005void VirtualBox::i_onMediumChanged(IMediumAttachment *aMediumAttachment)
     3006{
     3007    i_postEvent(new MediumChangedEventStruct(this, aMediumAttachment));
     3008}
     3009
     3010/** Event for onStorageDeviceChanged() */
     3011struct StorageDeviceChangedEventStruct : public VirtualBox::CallbackEvent
     3012{
     3013    StorageDeviceChangedEventStruct(VirtualBox *aVB, IMediumAttachment *aStorageDevice, BOOL fRemoved, BOOL fSilent)
     3014        : CallbackEvent(aVB, VBoxEventType_OnStorageDeviceChanged)
     3015        , mStorageDevice(aStorageDevice)
     3016        , mRemoved(fRemoved)
     3017        , mSilent(fSilent)
     3018    {}
     3019
     3020    virtual HRESULT prepareEventDesc(IEventSource *aSource, VBoxEventDesc &aEvDesc)
     3021    {
     3022        return aEvDesc.init(aSource, VBoxEventType_OnStorageDeviceChanged, mStorageDevice, mRemoved, mSilent);
     3023    }
     3024
     3025    IMediumAttachment* mStorageDevice;
     3026    BOOL mRemoved;
     3027    BOOL mSilent;
     3028};
     3029
     3030void VirtualBox::i_onStorageDeviceChanged(IMediumAttachment *aStorageDevice, const BOOL fRemoved, const BOOL fSilent)
     3031{
     3032    i_postEvent(new StorageDeviceChangedEventStruct(this, aStorageDevice, fRemoved, fSilent));
     3033}
    29193034
    29203035/**
Note: See TracChangeset for help on using the changeset viewer.

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