VirtualBox

Changeset 49557 in vbox for trunk


Ignore:
Timestamp:
Nov 19, 2013 5:41:16 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
90750
Message:

FE/Qt: Medium enumeration mechanism: Support to async CMedium close/delete logic.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/medium
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp

    r48608 r49557  
    8080    m_result = other.result();
    8181
     82    m_strKey = other.key();
    8283    m_strId = other.id();
    8384    m_strName = other.name();
     
    168169
    169170    m_strId = m_medium.isNull() ? nullID() : m_medium.GetId();
     171
     172    if (m_strKey.isNull() && !m_strId.isNull())
     173        m_strKey = m_strId;
    170174
    171175    m_fHostDrive = m_medium.isNull() ? false : m_medium.GetHostDrive();
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h

    r48301 r49557  
    138138    }
    139139
     140    QString key() const { return m_strKey; }
     141    void setKey(const QString &strKey) { m_strKey = strKey; }
     142
    140143    QString id() const { return m_strId; }
    141144    QString name(bool fNoDiffs = false) const { return fNoDiffs ? root().m_strName : m_strName; }
     
    233236    COMResult m_result;
    234237
     238    QString m_strKey;
    235239    QString m_strId;
    236240    QString m_strName;
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp

    r49553 r49557  
    107107{
    108108    /* Get medium ID: */
    109     QString strMediumID = medium.id();
    110     LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} created.\n", strMediumID.toAscii().constData()));
    111 
     109    const QString strMediumID = medium.id();
     110
     111    /* Do not create UIMedium(s) with incorrect ID: */
     112    AssertReturnVoid(!strMediumID.isNull());
     113    AssertReturnVoid(strMediumID != UIMedium::nullID());
    112114    /* Make sure medium doesn't exists already: */
    113115    AssertReturnVoid(!m_mediums.contains(strMediumID));
     
    115117    /* Insert medium: */
    116118    m_mediums[strMediumID] = medium;
     119    LogRel(("UIMediumEnumerator: Medium with key={%s} created.\n", strMediumID.toAscii().constData()));
    117120
    118121    /* Notify listener: */
     
    122125void UIMediumEnumerator::deleteMedium(const QString &strMediumID)
    123126{
    124     LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} removed.\n", strMediumID.toAscii().constData()));
    125 
     127    /* Do not delete UIMedium(s) with incorrect ID: */
     128    AssertReturnVoid(!strMediumID.isNull());
     129    AssertReturnVoid(strMediumID != UIMedium::nullID());
    126130    /* Make sure medium still exists: */
    127131    AssertReturnVoid(m_mediums.contains(strMediumID));
     
    129133    /* Remove medium: */
    130134    m_mediums.remove(strMediumID);
     135    LogRel(("UIMediumEnumerator: Medium with key={%s} deleted.\n", strMediumID.toAscii().constData()));
    131136
    132137    /* Notify listener: */
     
    153158
    154159    /* Notify listener: */
    155     LogRelFlow(("UIMediumEnumerator: Medium-enumeration started...\n"));
     160    LogRel(("UIMediumEnumerator: Medium-enumeration started...\n"));
    156161    m_fMediumEnumerationInProgress = true;
    157162    emit sigMediumEnumerationStarted();
    158163
    159     /* Start enumeration for all the new mediums: */
     164    /* Start enumeration for UIMedium(s) with correct ID: */
    160165    foreach (const QString &strMediumID, m_mediums.keys())
    161         createMediumEnumerationTask(m_mediums[strMediumID]);
     166        if (!strMediumID.isNull() && strMediumID != UIMedium::nullID())
     167            createMediumEnumerationTask(m_mediums[strMediumID]);
    162168}
    163169
    164170void UIMediumEnumerator::sltHandleMachineUpdate(QString strMachineID)
    165171{
    166     LogRelFlow(("UIMediumEnumerator: Machine event received, ID = %s\n", strMachineID.toAscii().constData()));
     172    LogRel(("UIMediumEnumerator: Machine event received, ID = %s\n", strMachineID.toAscii().constData()));
    167173
    168174    /* Compose a map of previous usage: */
     
    175181            oldUsage << strMediumID;
    176182    }
    177     LogRelFlow(("UIMediumEnumerator:  Old usage: %s\n", oldUsage.isEmpty() ? "<empty>" : oldUsage.join(", ").toAscii().constData()));
     183    LogRel(("UIMediumEnumerator:  Old usage: %s\n", oldUsage.isEmpty() ? "<empty>" : oldUsage.join(", ").toAscii().constData()));
    178184
    179185    /* Compose a map of current usage: */
     
    193199        }
    194200    }
    195     LogRelFlow(("UIMediumEnumerator:  New usage: %s\n", newUsage.isEmpty() ? "<empty>" : newUsage.join(", ").toAscii().constData()));
     201    LogRel(("UIMediumEnumerator:  New usage: %s\n", newUsage.isEmpty() ? "<empty>" : newUsage.join(", ").toAscii().constData()));
    196202
    197203    /* Manipulations over the sets: */
     
    203209    QStringList includedList = includedSet.toList();
    204210    if (!excludedList.isEmpty())
    205         LogRelFlow(("UIMediumEnumerator:  Items excluded from machine usage: %s\n", excludedList.join(", ").toAscii().constData()));
     211        LogRel(("UIMediumEnumerator:  Items excluded from machine usage: %s\n", excludedList.join(", ").toAscii().constData()));
    206212    if (!includedList.isEmpty())
    207         LogRelFlow(("UIMediumEnumerator:  Items included into machine usage: %s\n", includedList.join(", ").toAscii().constData()));
     213        LogRel(("UIMediumEnumerator:  Items included into machine usage: %s\n", includedList.join(", ").toAscii().constData()));
    208214
    209215    /* For each of excluded items: */
    210     foreach (const QString &strExcludedMediumID, excludedList)
     216    foreach (const QString &strExcludedMediumKey, excludedList)
    211217    {
    212218        /* Make sure this medium still in our map: */
    213         if (!m_mediums.contains(strExcludedMediumID))
     219        if (!m_mediums.contains(strExcludedMediumKey))
    214220            continue;
    215         /* Remove UIMedium if it was closed already: */
    216         const UIMedium &uimedium = m_mediums[strExcludedMediumID];
    217         if (uimedium.medium().GetId() != strExcludedMediumID)
     221
     222        /* Get excluded UIMedium: */
     223        const UIMedium &uimedium = m_mediums[strExcludedMediumKey];
     224
     225        /* Delete UIMedium if CMedium was closed already: */
     226        CMedium cmedium = uimedium.medium();
     227        if (cmedium.GetId().isNull() || !cmedium.isOk())
    218228        {
    219             deleteMedium(strExcludedMediumID);
     229            /* Delete this medium: */
     230            m_mediums.remove(strExcludedMediumKey);
     231            LogRel(("UIMediumEnumerator:  Medium with key={%s} closed and deleted (before enumeration).\n", strExcludedMediumKey.toAscii().constData()));
     232            /* And notify listener about delete: */
     233            emit sigMediumDeleted(strExcludedMediumKey);
    220234            continue;
    221235        }
     236
    222237        /* Enumerate UIMedium if CMedium still exists: */
    223238        createMediumEnumerationTask(uimedium);
     
    234249            createMedium(uimedium);
    235250        }
     251
    236252        /* Enumerate UIMedium in any case: */
    237253        createMediumEnumerationTask(m_mediums[strIncludedMediumID]);
    238254    }
    239255
    240     LogRelFlow(("UIMediumEnumerator: Machine event processed, ID = %s\n", strMachineID.toAscii().constData()));
     256    LogRel(("UIMediumEnumerator: Machine event processed, ID = %s\n", strMachineID.toAscii().constData()));
    241257}
    242258
     
    247263    AssertReturnVoid(iIndexOfTask != -1);
    248264
    249     /* Get medium: */
    250     UIMedium medium = pTask->data().value<UIMedium>();
    251     QString strMediumID = medium.id();
    252     LogRelFlow(("UIMediumEnumerator: Medium with ID={%s} enumerated.\n", strMediumID.toAscii().constData()));
     265    /* Get enumerated UIMedium: */
     266    const UIMedium uimedium = pTask->data().value<UIMedium>();
     267    const QString strUIMediumKey = uimedium.key();
     268    LogRel2(("UIMediumEnumerator: Medium with key={%s} enumerated.\n", strUIMediumKey.toAscii().constData()));
    253269
    254270    /* Delete task: */
    255271    delete m_tasks.takeAt(iIndexOfTask);
    256272
    257     /* Make sure such medium still exists: */
    258     if (!m_mediums.contains(strMediumID))
    259         return;
    260 
    261     /* Update enumerated medium: */
    262     m_mediums[strMediumID] = medium;
    263 
    264     /* Notify listener: */
    265     emit sigMediumEnumerated(strMediumID);
     273    /* Make sure such UIMedium still exists: */
     274    AssertReturnVoid(m_mediums.contains(strUIMediumKey));
     275
     276    /* Check if UIMedium ID was changed: */
     277    const QString strUIMediumID = uimedium.id();
     278    /* UIMedium ID was changed to null string: */
     279    if (strUIMediumID.isNull())
     280    {
     281        /* Delete this medium: */
     282        m_mediums.remove(strUIMediumKey);
     283        LogRel(("UIMediumEnumerator: Medium with key={%s} closed and deleted (after enumeration).\n", strUIMediumKey.toAscii().constData()));
     284        /* And notify listener about delete: */
     285        emit sigMediumDeleted(strUIMediumKey);
     286    }
     287    /* UIMedium ID was changed to something proper: */
     288    else if (strUIMediumID != strUIMediumKey)
     289    {
     290        /* We have to reinject enumerated medium: */
     291        m_mediums.remove(strUIMediumKey);
     292        m_mediums[strUIMediumID] = uimedium;
     293        m_mediums[strUIMediumID].setKey(strUIMediumID);
     294        LogRel(("UIMediumEnumerator: Medium with key={%s} has it changed to {%s}.\n", strUIMediumKey.toAscii().constData(),
     295                                                                                      strUIMediumID.toAscii().constData()));
     296
     297        /* And notify listener about delete/create: */
     298        emit sigMediumDeleted(strUIMediumKey);
     299        emit sigMediumCreated(strUIMediumID);
     300    }
     301    /* UIMedium ID was not changed: */
     302    else
     303    {
     304        /* Just update enumerated medium: */
     305        m_mediums[strUIMediumID] = uimedium;
     306        LogRel2(("UIMediumEnumerator: Medium with key={%s} updated.\n", strUIMediumID.toAscii().constData()));
     307
     308        /* And notify listener about update: */
     309        emit sigMediumEnumerated(strUIMediumID);
     310    }
    266311
    267312    /* If there are no more tasks we know about: */
     
    269314    {
    270315        /* Notify listener: */
    271         LogRelFlow(("UIMediumEnumerator: Medium-enumeration finished!\n"));
     316        LogRel(("UIMediumEnumerator: Medium-enumeration finished!\n"));
    272317        m_fMediumEnumerationInProgress = false;
    273318        emit sigMediumEnumerationFinished();
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