VirtualBox

Ignore:
Timestamp:
May 16, 2007 2:15:41 PM (18 years ago)
Author:
vboxsync
Message:

FE/Qt: Added support for displaying more than one COM error if several errors are returned after a method invocation.

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/include/COMDefs.h

    r933 r2671  
    3232#include <quuid.h>
    3333
     34#include <iprt/memory> // for auto_copy_ptr
     35
    3436/*
    3537 * common COM / XPCOM includes and defines
     
    171173    QString text() const { return mText; }
    172174
     175    const COMErrorInfo *next() const { return mNext.get(); }
     176
    173177    QString interfaceName() const { return mInterfaceName; }
    174178    QUuid calleeIID() const { return mCalleeIID; }
     
    190194    QString mComponent;
    191195    QString mText;
     196
     197    cppx::auto_copy_ptr <COMErrorInfo> mNext;
    192198
    193199    QString mInterfaceName;
  • trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h

    r2044 r2671  
    216216                           const QString &errorMsg);
    217217
    218     static QString formatErrorInfo (const COMErrorInfo &info,
    219                                     HRESULT wrapperRC = S_OK);
    220     static QString formatErrorInfo (const CVirtualBoxErrorInfo &info) {
    221         return formatErrorInfo (COMErrorInfo (info));
    222     }
    223     static QString formatErrorInfo (const COMBase &wrapper) {
    224         Assert (FAILED (wrapper.lastRC()));
    225         return formatErrorInfo (wrapper.errorInfo(), wrapper.lastRC());
    226     }
    227     static QString formatErrorInfo (const COMResult &rc) {
    228         Assert (FAILED (rc.rc()));
    229         return formatErrorInfo (rc.errorInfo(), rc.rc());
     218    static QString formatErrorInfo (const COMErrorInfo &aInfo,
     219                                    HRESULT aWrapperRC = S_OK);
     220
     221    static QString formatErrorInfo (const CVirtualBoxErrorInfo &aInfo)
     222    {
     223        return formatErrorInfo (COMErrorInfo (aInfo));
     224    }
     225
     226    static QString formatErrorInfo (const COMBase &aWrapper)
     227    {
     228        Assert (FAILED (aWrapper.lastRC()));
     229        return formatErrorInfo (aWrapper.errorInfo(), aWrapper.lastRC());
     230    }
     231
     232    static QString formatErrorInfo (const COMResult &aRC)
     233    {
     234        Assert (FAILED (aRC.rc()));
     235        return formatErrorInfo (aRC.errorInfo(), aRC.rc());
    230236    }
    231237
     
    239245
    240246    friend VBoxProblemReporter &vboxProblem();
     247
     248    static QString doFormatErrorInfo (const COMErrorInfo &aInfo,
     249                                      HRESULT aWrapperRC = S_OK);
    241250};
    242251
  • trunk/src/VBox/Frontends/VirtualBox/src/COMDefs.cpp

    r1959 r2671  
    320320    gotAll &= info.isOk();
    321321
     322    CVirtualBoxErrorInfo next = info.GetNext();
     323    if (info.isOk() && !next.isNull())
     324    {
     325        mNext.reset (new COMErrorInfo (next));
     326        Assert (mNext.get());
     327    }
     328    else
     329        mNext.reset();
     330    gotSomething |= info.isOk();
     331    gotAll &= info.isOk();
     332
    322333    mIsBasicAvailable = gotSomething;
    323334    mIsFullAvailable = gotAll;
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp

    r2425 r2671  
    15031503
    15041504/* static */
    1505 QString VBoxProblemReporter::formatErrorInfo (const COMErrorInfo &info,
    1506                                               HRESULT wrapperRC)
    1507 {
    1508     QString formatted = "<qt>";
    1509 
    1510     if (info.text())
     1505QString VBoxProblemReporter::formatErrorInfo (const COMErrorInfo &aInfo,
     1506                                              HRESULT aWrapperRC /* = S_OK */)
     1507{
     1508    QString formatted = doFormatErrorInfo (aInfo, aWrapperRC);
     1509    return QString ("<qt>%1</qt>").arg (formatted);
     1510}
     1511
     1512/* static */
     1513QString VBoxProblemReporter::doFormatErrorInfo (const COMErrorInfo &aInfo,
     1514                                                HRESULT aWrapperRC /* = S_OK */)
     1515{
     1516    QString formatted;
     1517
     1518    if (aInfo.text())
    15111519        formatted += QString ("<table bgcolor=#FFFFFF border=0 cellspacing=0 "
    15121520                              "cellpadding=0 width=100%>"
    15131521                              "<tr><td><p>%1.</p></td></tr>"
    15141522                              "</table><p></p>")
    1515                               .arg (VBoxGlobal::highlight (info.text()));
     1523                              .arg (VBoxGlobal::highlight (aInfo.text()));
    15161524
    15171525    formatted += "<table bgcolor=#EEEEEE border=0 cellspacing=0 "
     
    15201528    bool haveResultCode = false;
    15211529
    1522     if (info.isBasicAvailable())
     1530    if (aInfo.isBasicAvailable())
    15231531    {
    15241532#if defined (Q_WS_WIN)
    1525         haveResultCode = info.isFullAvailable();
     1533        haveResultCode = aInfo.isFullAvailable();
    15261534        bool haveComponent = true;
    15271535        bool haveInterfaceID = true;
    15281536#else // !Q_WS_WIN
    15291537        haveResultCode = true;
    1530         bool haveComponent = info.isFullAvailable();
    1531         bool haveInterfaceID = info.isFullAvailable();
     1538        bool haveComponent = aInfo.isFullAvailable();
     1539        bool haveInterfaceID = aInfo.isFullAvailable();
    15321540#endif
    15331541
     
    15371545            /* format the error code, masking off the top 16 bits */
    15381546            PCRTWINERRMSG msg;
    1539             msg = RTErrWinGet(info.resultCode());
     1547            msg = RTErrWinGet(aInfo.resultCode());
    15401548            /* try again with masked off top 16bit if not found */
    15411549            if (!msg->iCode)
    1542                 msg = RTErrWinGet(info.resultCode() & 0xFFFF);
     1550                msg = RTErrWinGet(aInfo.resultCode() & 0xFFFF);
    15431551            formatted += QString ("<tr><td>%1</td><td><tt>%2 (0x%3)</tt></td></tr>")
    15441552                .arg (tr ("Result&nbsp;Code: ", "error info"))
    15451553                .arg (msg->pszDefine)
    1546                 .arg (uint (info.resultCode()), 8, 16);
     1554                .arg (uint (aInfo.resultCode()), 8, 16);
    15471555#else
    15481556            formatted += QString ("<tr><td>%1</td><td><tt>0x%2</tt></td></tr>")
    15491557                .arg (tr ("Result&nbsp;Code: ", "error info"))
    1550                 .arg (uint (info.resultCode()), 8, 16);
     1558                .arg (uint (aInfo.resultCode()), 8, 16);
    15511559#endif
    15521560        }
     
    15541562        if (haveComponent)
    15551563            formatted += QString ("<tr><td>%1</td><td>%2</td></tr>")
    1556                 .arg (tr ("Component: ", "error info"), info.component());
     1564                .arg (tr ("Component: ", "error info"), aInfo.component());
    15571565
    15581566        if (haveInterfaceID)
    15591567        {
    1560             QString s = info.interfaceID();
    1561             if (info.interfaceName())
    1562                 s = info.interfaceName() + ' ' + s;
     1568            QString s = aInfo.interfaceID();
     1569            if (aInfo.interfaceName())
     1570                s = aInfo.interfaceName() + ' ' + s;
    15631571            formatted += QString ("<tr><td>%1</td><td>%2</td></tr>")
    15641572                .arg (tr ("Interface: ", "error info"), s);
    15651573        }
    15661574
    1567         if (!info.calleeIID().isNull() && info.calleeIID() != info.interfaceID())
     1575        if (!aInfo.calleeIID().isNull() && aInfo.calleeIID() != aInfo.interfaceID())
    15681576        {
    1569             QString s = info.calleeIID();
    1570             if (info.calleeName())
    1571                 s = info.calleeName() + ' ' + s;
     1577            QString s = aInfo.calleeIID();
     1578            if (aInfo.calleeName())
     1579                s = aInfo.calleeName() + ' ' + s;
    15721580            formatted += QString ("<tr><td>%1</td><td>%2</td></tr>")
    15731581                .arg (tr ("Callee: ", "error info"), s);
     
    15751583    }
    15761584
    1577     if (FAILED (wrapperRC) &&
    1578         (!haveResultCode || wrapperRC != info.resultCode()))
     1585    if (FAILED (aWrapperRC) &&
     1586        (!haveResultCode || aWrapperRC != aInfo.resultCode()))
    15791587    {
    15801588#if defined (Q_WS_WIN)
    15811589        /* format the error code */
    15821590        PCRTWINERRMSG msg;
    1583         msg = RTErrWinGet(wrapperRC);
     1591        msg = RTErrWinGet(aWrapperRC);
    15841592        /* try again with masked off top 16bit if not found */
    15851593        if (!msg->iCode)
    1586             msg = RTErrWinGet(wrapperRC & 0xFFFF);
     1594            msg = RTErrWinGet(aWrapperRC & 0xFFFF);
    15871595        formatted += QString ("<tr><td>%1</td><td><tt>%2 (0x%3)</tt></td></tr>")
    15881596            .arg (tr ("Callee&nbsp;RC: ", "error info"))
    15891597            .arg (msg->pszDefine)
    1590             .arg (uint (wrapperRC), 8, 16);
     1598            .arg (uint (aWrapperRC), 8, 16);
    15911599#else
    15921600        formatted += QString ("<tr><td>%1</td><td><tt>0x%2</tt></td></tr>")
    15931601            .arg (tr ("Callee&nbsp;RC: ", "error info"))
    1594             .arg (uint (wrapperRC), 8, 16);
     1602            .arg (uint (aWrapperRC), 8, 16);
    15951603#endif
    15961604    }
    1597     formatted += "</table></qt>";
     1605    formatted += "</table>";
     1606
     1607    if (aInfo.next())
     1608        formatted = doFormatErrorInfo (*aInfo.next()) +  "<p></p>" +
     1609                    formatted;
    15981610
    15991611    return formatted;
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