VirtualBox

Changeset 86012 in vbox for trunk


Ignore:
Timestamp:
Sep 3, 2020 12:08:56 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
140208
Message:

OCI: Send events when a cloud provider is registered or is about to be
unregistered.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/log.h

    r85929 r86012  
    379379    /** Main group, ICloudProviderManager. */
    380380    LOG_GROUP_MAIN_CLOUDPROVIDERMANAGER,
     381    /** Main group, ICloudProviderRegisteredEvent. */
     382    LOG_GROUP_MAIN_CLOUDPROVIDERREGISTEREDEVENT,
    381383    /** Main group, IConsole. */
    382384    LOG_GROUP_MAIN_CONSOLE,
     
    938940    "MAIN_CLOUDPROVIDER", \
    939941    "MAIN_CLOUDPROVIDERMANAGER", \
     942    "MAIN_CLOUDPROVIDERREGISTEREDEVENT", \
    940943    "MAIN_CONSOLE", \
    941944    "MAIN_CPUPROFILE", \
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r85929 r86012  
    2489624896      </desc>
    2489724897    </const>
     24898    <const name="OnCloudProviderRegistered" value="105">
     24899      <desc>
     24900        See <link to="ICloudProviderRegisteredEvent">ICloudProviderRegisteredEvent</link>.
     24901      </desc>
     24902    </const>
    2489824903    <!-- End event marker -->
    2489924904    <!-- @todo rename to 'End' as it is exclusive (we use 'last' to be inclusive). -->
    24900     <const name="Last" value="105">
     24905    <const name="Last" value="106">
    2490124906      <desc>
    2490224907        Must be last event, used for iterations and structures relying on numerical event values.
     
    2823628241    </method>
    2823728242
     28243  </interface>
     28244
     28245  <interface name="ICloudProviderRegisteredEvent" extends="IEvent"
     28246    uuid="3d515696-eb98-11ea-96ac-8b4794b20214"
     28247    wsmap="managed" autogen="VBoxEvent"
     28248    id="OnCloudProviderRegistered" waitable="yes"
     28249    >
     28250    <!-- should be in ICloudProviderEvent if we ever have one -->
     28251    <attribute name="id" type="uuid" mod="string" readonly="yes"/>
     28252
     28253    <attribute name="registered" type="boolean" readonly="yes"/>
    2823828254  </interface>
    2823928255
  • trunk/src/VBox/Main/include/CloudProviderManagerImpl.h

    r82968 r86012  
    2424#include "CloudProviderManagerWrap.h"
    2525
    26 
    2726class ATL_NO_VTABLE CloudProviderManager
    2827    : public CloudProviderManagerWrap
    2928{
    3029public:
    31     DECLARE_EMPTY_CTOR_DTOR(CloudProviderManager)
     30    CloudProviderManager();
     31    virtual ~CloudProviderManager();
    3232
    3333    HRESULT FinalConstruct();
    3434    void FinalRelease();
    3535
    36     HRESULT init();
     36    HRESULT init(VirtualBox *aVirtualBox);
    3737    void uninit();
    3838
     
    5757    typedef std::map<com::Utf8Str, ComPtr<ICloudProviderManager> > ExtPackNameCloudProviderManagerMap;
    5858    ExtPackNameCloudProviderManagerMap m_mapCloudProviderManagers;
     59
    5960    typedef std::vector<com::Utf8Str> ExtPackNameVec;
    6061    ExtPackNameVec m_astrExtPackNames;
     
    6364    typedef std::vector<ComPtr<ICloudProvider> > CloudProviderVec;
    6465    CloudProviderVec m_apCloudProviders;
     66
     67    VirtualBox * const m_pVirtualBox;
    6568};
    6669
  • trunk/src/VBox/Main/include/VirtualBoxImpl.h

    r85309 r86012  
    208208    int i_natNetworkRefInc(const Utf8Str &aNetworkName);
    209209    int i_natNetworkRefDec(const Utf8Str &aNetworkName);
     210
     211    void i_onCloudProviderRegistered(const Utf8Str &aId, BOOL aRegistered);
    210212
    211213#ifdef VBOX_WITH_CLOUD_NET
  • trunk/src/VBox/Main/src-server/CloudProviderManagerImpl.cpp

    r85247 r86012  
    1818
    1919#define LOG_GROUP LOG_GROUP_MAIN_CLOUDPROVIDERMANAGER
     20#include <iprt/cpp/utils.h>
    2021#include <VBox/com/array.h>
    2122
     
    3334// ////////////////////////////////////////////////////////////////////////////////
    3435CloudProviderManager::CloudProviderManager()
     36  : m_pVirtualBox(NULL)
    3537{
    3638}
     
    5355}
    5456
    55 HRESULT CloudProviderManager::init()
     57HRESULT CloudProviderManager::init(VirtualBox *aVirtualBox)
    5658{
    5759    // Enclose the state transition NotReady->InInit->Ready.
     
    6062
    6163    m_apCloudProviders.clear();
     64    unconst(m_pVirtualBox) = aVirtualBox;
    6265
    6366    autoInitSpan.setSucceeded();
     
    7174    if (autoUninitSpan.uninitDone())
    7275        return;
    73 }
     76
     77    m_mapCloudProviderManagers.clear();
     78    m_apCloudProviders.clear();
     79
     80    unconst(m_pVirtualBox) = NULL; // not a ComPtr, but be pedantic
     81}
     82
    7483
    7584#ifdef VBOX_WITH_EXTPACK
     
    8897
    8998    bool fRes = true;
    90     Bstr bstrName;
    91     aExtPack->COMGETTER(Name)(bstrName.asOutParam());
    92     Utf8Str strName(bstrName);
    93     ExtPackNameCloudProviderManagerMap::iterator it = m_mapCloudProviderManagers.find(strName);
     99
     100    Bstr bstrExtPackName;
     101    aExtPack->COMGETTER(Name)(bstrExtPackName.asOutParam());
     102    Utf8Str strExtPackName(bstrExtPackName);
     103
     104    /* is there a cloud provider in this extpack? */
     105    ExtPackNameCloudProviderManagerMap::iterator it
     106        = m_mapCloudProviderManagers.find(strExtPackName);
    94107    if (it != m_mapCloudProviderManagers.end())
    95108    {
    96         ComPtr<ICloudProviderManager> pTmp(it->second);
    97 
     109        // const ComPtr<ICloudProviderManager> pManager(it->second); /* unused */
     110
     111        /* loop over all providers checking for those from the aExtPack */
    98112        Assert(m_astrExtPackNames.size() == m_apCloudProviders.size());
    99113        for (size_t i = 0; i < m_astrExtPackNames.size(); )
    100114        {
    101             if (m_astrExtPackNames[i] != strName)
     115            /* the horse it rode in on? */
     116            if (m_astrExtPackNames[i] != strExtPackName)
    102117            {
    103118                i++;
    104                 continue;
    105             }
    106 
    107             // pTmpProvider will point to an object with refcount > 0 until
    108             // the ComPtr is removed from m_apCloudProviders.
     119                continue;     /* not the extpack we are looking for */
     120            }
     121
     122            /* note the id of this provider to send an event later */
     123            Bstr bstrProviderId;
     124
     125            /*
     126             * pTmpProvider will point to an object with refcount > 0
     127             * until the ComPtr is removed from m_apCloudProviders.
     128             * PrepareUninstall checks that that is the only reference
     129             */
    109130            HRESULT hrc = S_OK;
    110131            ULONG uRefCnt = 1;
     
    112133            if (pTmpProvider)
    113134            {
     135                /* do this before the provider goes over the rainbow bridge */
     136                pTmpProvider->COMGETTER(Id)(bstrProviderId.asOutParam());
     137
     138                /**
     139                 * @todo r=uwe We send the event @em before we even
     140                 * try to uninstall the provider.  The GUI can get the
     141                 * event and get rid of any references to the objects
     142                 * related to this provider that it still has.  The
     143                 * current uninstall attempt might fail, but the GUI
     144                 * can then retry once and likely succeed.  Needs more
     145                 * thought and feeback from dsen.
     146                 */
     147                m_pVirtualBox->i_onCloudProviderRegistered(bstrProviderId, FALSE);
     148
    114149                hrc = pTmpProvider->PrepareUninstall();
    115                 // Sanity check the refcount, it should be 1 at this point.
    116150                pTmpProvider->AddRef();
    117151                uRefCnt = pTmpProvider->Release();
    118                 Assert(uRefCnt == 1);
    119             }
     152            }
     153
     154            /* has PrepareUninstall uninited the provider? */
    120155            if (SUCCEEDED(hrc) && uRefCnt == 1)
    121156            {
    122157                m_astrExtPackNames.erase(m_astrExtPackNames.begin() + (ssize_t)i);
    123158                m_apCloudProviders.erase(m_apCloudProviders.begin() + (ssize_t)i);
     159                /* NB: not advancing loop index */
    124160            }
    125161            else
    126162            {
    127                 LogRel(("CloudProviderManager: provider '%s' blocks extpack uninstall, result=%Rhrc, refcount=%u\n", strName.c_str(), hrc, uRefCnt));
     163                LogRel(("CloudProviderManager: provider '%s' blocks extpack uninstall, result=%Rhrc, refcount=%u\n",
     164                        strExtPackName.c_str(), hrc, uRefCnt));
    128165                fRes = false;
    129166                i++;
     
    140177void CloudProviderManager::i_addExtPack(IExtPack *aExtPack)
    141178{
     179    HRESULT hrc;
     180
    142181    AssertReturnVoid(aExtPack);
    143 
    144182    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    145183
    146     Bstr bstrName;
    147     aExtPack->COMGETTER(Name)(bstrName.asOutParam());
    148     Utf8Str strName(bstrName);
     184    Bstr bstrExtPackName;
     185    aExtPack->COMGETTER(Name)(bstrExtPackName.asOutParam());
     186    Utf8Str strExtPackName(bstrExtPackName);
     187
     188    /* get the extpack's cloud provider manager object if present */
    149189    ComPtr<IUnknown> pObj;
    150     std::vector<com::Utf8Str> astrExtPackNames;
    151190    com::Guid idObj(COM_IIDOF(ICloudProviderManager));
    152     HRESULT hrc = aExtPack->QueryObject(Bstr(idObj.toString()).raw(), pObj.asOutParam());
     191    hrc = aExtPack->QueryObject(Bstr(idObj.toString()).raw(), pObj.asOutParam());
    153192    if (FAILED(hrc))
    154193        return;
    155 
    156     ComPtr<ICloudProviderManager> pTmp(pObj);
    157     if (pTmp.isNull())
    158         return;
    159 
     194    const ComPtr<ICloudProviderManager> pManager(pObj);
     195    if (pManager.isNull())
     196        return;
     197
     198    /* get the list of cloud providers */
    160199    SafeIfaceArray<ICloudProvider> apProvidersFromCurrExtPack;
    161     hrc = pTmp->COMGETTER(Providers)(ComSafeArrayAsOutParam(apProvidersFromCurrExtPack));
     200    hrc = pManager->COMGETTER(Providers)(ComSafeArrayAsOutParam(apProvidersFromCurrExtPack));
    162201    if (FAILED(hrc))
    163202        return;
    164 
    165     m_mapCloudProviderManagers[strName] = pTmp;
     203    if (apProvidersFromCurrExtPack.size() == 0)
     204        return;
     205
     206    m_mapCloudProviderManagers[strExtPackName] = pManager;
     207
     208    /* collect provider ids for bulk-sending the events */
     209    std::vector<Utf8Str> aProviderIds;
     210    aProviderIds.reserve(apProvidersFromCurrExtPack.size());
     211
    166212    for (unsigned i = 0; i < apProvidersFromCurrExtPack.size(); i++)
    167213    {
    168         // Sanity check each cloud provider by forcing a QueryInterface call,
    169         // making sure that it implements the right interface.
    170         ComPtr<ICloudProvider> pTmpCP1(apProvidersFromCurrExtPack[i]);
    171         if (!pTmpCP1.isNull())
    172         {
    173             ComPtr<ICloudProvider> pTmpCP2;
    174             pTmpCP1.queryInterfaceTo(pTmpCP2.asOutParam());
    175             if (!pTmpCP2.isNull())
    176             {
     214        const ComPtr<ICloudProvider> pProvider(apProvidersFromCurrExtPack[i]);
     215        if (!pProvider.isNull())
     216        {
     217            // Sanity check each cloud provider by forcing a QueryInterface call,
     218            // making sure that it implements the right interface.
     219            ComPtr<ICloudProvider> pProviderCheck;
     220            pProvider.queryInterfaceTo(pProviderCheck.asOutParam());
     221            if (!pProviderCheck.isNull()) /* ok, seems legit */
     222            {
     223                /* save the provider and the name of the extpack it came from */
    177224                Assert(m_astrExtPackNames.size() == m_apCloudProviders.size());
    178                 m_astrExtPackNames.push_back(strName);
    179                 m_apCloudProviders.push_back(apProvidersFromCurrExtPack[i]);
    180             }
    181         }
     225                m_astrExtPackNames.push_back(strExtPackName);
     226                m_apCloudProviders.push_back(pProvider);
     227
     228                /* note the id of this provider to send an event later */
     229                Bstr bstrProviderId;
     230                pProvider->COMGETTER(Id)(bstrProviderId.asOutParam());
     231                aProviderIds.push_back(bstrProviderId);
     232            }
     233        }
     234    }
     235
     236    /* bulk-send ICloudProviderRegisteredEvent's */
     237    for (size_t i = 0; i < aProviderIds.size(); ++i)
     238    {
     239        m_pVirtualBox->i_onCloudProviderRegistered(aProviderIds[i], TRUE);
    182240    }
    183241}
  • trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp

    r85309 r86012  
    762762        rc = unconst(m->pCloudProviderManager).createObject();
    763763        if (SUCCEEDED(rc))
    764             rc = m->pCloudProviderManager->init();
     764            rc = m->pCloudProviderManager->init(this);
    765765        ComAssertComRCThrowRC(rc);
    766766        if (FAILED(rc)) throw rc;
     
    38193819
    38203820
     3821void VirtualBox::i_onCloudProviderRegistered(const Utf8Str &aId, BOOL aRegistered)
     3822{
     3823    HRESULT hrc;
     3824
     3825    ComPtr<IEvent> pEvent;
     3826    hrc = CreateCloudProviderRegisteredEvent(pEvent.asOutParam(), m->pEventSource,
     3827                                             aId, aRegistered);
     3828    if (FAILED(hrc))
     3829        return;
     3830
     3831    BOOL fDelivered = FALSE;
     3832    hrc = m->pEventSource->FireEvent(pEvent, 10000, &fDelivered); // XXX: timeout
     3833    if (FAILED(hrc))
     3834        return;
     3835}
     3836
     3837
    38213838/**
    38223839 *  @note Locks the list of other objects for reading.
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