VirtualBox

Ignore:
Timestamp:
Apr 11, 2014 4:30:13 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93275
Message:

FE/Qt: 6660: Advanced extra-data management framework: Hot-loading of machine extra-data maps; Cache-access API.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/extradata
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp

    r51048 r51053  
    215215    /* Prepare extra-data event-handler: */
    216216    prepareExtraDataEventHandler();
    217     /* Prepare extra-data map: */
    218     prepareExtraDataMap();
     217    /* Prepare global extra-data map: */
     218    prepareGlobalExtraDataMap();
    219219}
    220220
     
    277277}
    278278
    279 void UIExtraDataManager::prepareExtraDataMap()
     279void UIExtraDataManager::prepareGlobalExtraDataMap()
    280280{
    281281    /* Get CVirtualBox: */
    282282    CVirtualBox vbox = vboxGlobal().virtualBox();
    283     /* Load extra-data map: */
    284     if (!vboxGlobal().isVMConsoleProcess())
    285     {
    286         /* From CVirtualBox for Selector UI: */
    287         foreach (const QString &strKey, vbox.GetExtraDataKeys())
    288             m_data[strKey] = vbox.GetExtraData(strKey);
    289     }
    290     else
    291     {
    292         /* From CMachine for Runtime UI: */
    293         const QString strMachineID = vboxGlobal().managedVMUuid();
    294         CMachine machine = vbox.FindMachine(strMachineID);
    295         AssertMsgReturnVoid(vbox.isOk() && !machine.isNull(),
    296                             ("Machine with ID={%s} was not found!\n",
    297                              strMachineID.toAscii().constData()));
    298         foreach (const QString &strKey, machine.GetExtraDataKeys())
    299             m_data[strKey] = machine.GetExtraData(strKey);
    300     }
     283
     284    /* Load global extra-data map: */
     285    foreach (const QString &strKey, vbox.GetExtraDataKeys())
     286        m_data[QString()][strKey] = vbox.GetExtraData(strKey);
    301287}
    302288
     
    314300}
    315301
     302void UIExtraDataManager::hotloadMachineExtraDataMap(const QString &strID) const
     303{
     304    /* Make sure it is not yet loaded: */
     305    AssertReturnVoid(!strID.isNull() && !m_data.contains(strID));
     306
     307    /* Search for corresponding machine: */
     308    CVirtualBox vbox = vboxGlobal().virtualBox();
     309    CMachine machine = vbox.FindMachine(strID);
     310    AssertReturnVoid(vbox.isOk() && !machine.isNull());
     311
     312    /* Make sure at least empty map is created: */
     313    m_data[strID] = ExtraDataMap();
     314
     315    /* Do not handle inaccessible machine: */
     316    if (!machine.GetAccessible())
     317        return;
     318
     319    /* Load machine extra-data map: */
     320    foreach (const QString &strKey, machine.GetExtraDataKeys())
     321        m_data[strID][strKey] = machine.GetExtraData(strKey);
     322}
     323
     324bool UIExtraDataManager::isFeatureAllowed(const QString &strKey, const QString &strID /* = QString() */) const
     325{
     326    /* Hot-load machine extra-data map if necessary: */
     327    if (!strID.isNull() && !m_data.contains(strID))
     328        hotloadMachineExtraDataMap(strID);
     329
     330    /* Access corresponding map: */
     331    ExtraDataMap &data = m_data[strID];
     332
     333    /* 'false' if value was not set: */
     334    if (!data.contains(strKey))
     335        return false;
     336
     337    /* Check corresponding value: */
     338    const QString &strValue = data[strKey];
     339    return    strValue.compare("true", Qt::CaseInsensitive) == 0
     340           || strValue.compare("yes", Qt::CaseInsensitive) == 0
     341           || strValue.compare("on", Qt::CaseInsensitive) == 0
     342           || strValue == "1";
     343}
     344
     345QString UIExtraDataManager::extraDataString(const QString &strKey, const QString &strID /* = QString() */) const
     346{
     347    /* Hot-load machine extra-data map if necessary: */
     348    if (!strID.isNull() && !m_data.contains(strID))
     349        hotloadMachineExtraDataMap(strID);
     350
     351    /* Access corresponding map: */
     352    ExtraDataMap &data = m_data[strID];
     353
     354    /* QString() if value was not set: */
     355    if (!data.contains(strKey))
     356        return QString();
     357
     358    /* Returns corresponding value: */
     359    return data[strKey];
     360}
     361
     362QStringList UIExtraDataManager::extraDataStringList(const QString &strKey, const QString &strID /* = QString() */) const
     363{
     364    /* Hot-load machine extra-data map if necessary: */
     365    if (!strID.isNull() && !m_data.contains(strID))
     366        hotloadMachineExtraDataMap(strID);
     367
     368    /* Access corresponding map: */
     369    ExtraDataMap &data = m_data[strID];
     370
     371    /* QStringList() if machine value was not set: */
     372    if (!data.contains(strKey))
     373        return QStringList();
     374
     375    /* Returns corresponding value: */
     376    return data[strKey].split(',', QString::SkipEmptyParts);
     377}
     378
    316379#include "UIExtraDataManager.moc"
    317380
  • trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h

    r51048 r51053  
    2727/* Forward declarations: */
    2828class UIExtraDataEventHandler;
     29
     30/* Type definitions: */
     31typedef QMap<QString, QString> ExtraDataMap;
    2932
    3033/** Singleton QObject extension
     
    7578    /** Prepare extra-data event-handler. */
    7679    void prepareExtraDataEventHandler();
    77     /** Prepare extra-data map. */
    78     void prepareExtraDataMap();
     80    /** Prepare global extra-data map. */
     81    void prepareGlobalExtraDataMap();
    7982
    8083    /** Cleanup Extra-data Manager. */
     
    8790    // void cleanupExtraDataMap();
    8891
     92    /** Hot-load machine extra-data map. */
     93    void hotloadMachineExtraDataMap(const QString &strID) const;
     94
     95    /** Determines whether feature corresponding to passed @a strKey is allowed.
     96      * If valid @a strID is set => applies to machine extra-data, otherwise => to global one. */
     97    bool isFeatureAllowed(const QString &strKey, const QString &strID = QString()) const;
     98
     99    /** Returns extra-data value corresponding to passed @a strKey as QString.
     100      * If valid @a strID is set => applies to machine extra-data, otherwise => to global one. */
     101    QString extraDataString(const QString &strKey, const QString &strID = QString()) const;
     102
     103    /** Returns extra-data value corresponding to passed @a strKey as QStringList.
     104      * If valid @a strID is set => applies to machine extra-data, otherwise => to global one. */
     105    QStringList extraDataStringList(const QString &strKey, const QString &strID = QString()) const;
     106
    89107    /** Singleton Extra-data Manager instance. */
    90108    static UIExtraDataManager *m_pInstance;
     
    96114
    97115    /** Extra-data map. */
    98     QMap<QString, QString> m_data;
     116    mutable QMap<QString, ExtraDataMap> m_data;
    99117};
    100118
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