- Timestamp:
- Sep 3, 2020 12:08:56 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 140208
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/log.h
r85929 r86012 379 379 /** Main group, ICloudProviderManager. */ 380 380 LOG_GROUP_MAIN_CLOUDPROVIDERMANAGER, 381 /** Main group, ICloudProviderRegisteredEvent. */ 382 LOG_GROUP_MAIN_CLOUDPROVIDERREGISTEREDEVENT, 381 383 /** Main group, IConsole. */ 382 384 LOG_GROUP_MAIN_CONSOLE, … … 938 940 "MAIN_CLOUDPROVIDER", \ 939 941 "MAIN_CLOUDPROVIDERMANAGER", \ 942 "MAIN_CLOUDPROVIDERREGISTEREDEVENT", \ 940 943 "MAIN_CONSOLE", \ 941 944 "MAIN_CPUPROFILE", \ -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r85929 r86012 24896 24896 </desc> 24897 24897 </const> 24898 <const name="OnCloudProviderRegistered" value="105"> 24899 <desc> 24900 See <link to="ICloudProviderRegisteredEvent">ICloudProviderRegisteredEvent</link>. 24901 </desc> 24902 </const> 24898 24903 <!-- End event marker --> 24899 24904 <!-- @todo rename to 'End' as it is exclusive (we use 'last' to be inclusive). --> 24900 <const name="Last" value="10 5">24905 <const name="Last" value="106"> 24901 24906 <desc> 24902 24907 Must be last event, used for iterations and structures relying on numerical event values. … … 28236 28241 </method> 28237 28242 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"/> 28238 28254 </interface> 28239 28255 -
trunk/src/VBox/Main/include/CloudProviderManagerImpl.h
r82968 r86012 24 24 #include "CloudProviderManagerWrap.h" 25 25 26 27 26 class ATL_NO_VTABLE CloudProviderManager 28 27 : public CloudProviderManagerWrap 29 28 { 30 29 public: 31 DECLARE_EMPTY_CTOR_DTOR(CloudProviderManager) 30 CloudProviderManager(); 31 virtual ~CloudProviderManager(); 32 32 33 33 HRESULT FinalConstruct(); 34 34 void FinalRelease(); 35 35 36 HRESULT init( );36 HRESULT init(VirtualBox *aVirtualBox); 37 37 void uninit(); 38 38 … … 57 57 typedef std::map<com::Utf8Str, ComPtr<ICloudProviderManager> > ExtPackNameCloudProviderManagerMap; 58 58 ExtPackNameCloudProviderManagerMap m_mapCloudProviderManagers; 59 59 60 typedef std::vector<com::Utf8Str> ExtPackNameVec; 60 61 ExtPackNameVec m_astrExtPackNames; … … 63 64 typedef std::vector<ComPtr<ICloudProvider> > CloudProviderVec; 64 65 CloudProviderVec m_apCloudProviders; 66 67 VirtualBox * const m_pVirtualBox; 65 68 }; 66 69 -
trunk/src/VBox/Main/include/VirtualBoxImpl.h
r85309 r86012 208 208 int i_natNetworkRefInc(const Utf8Str &aNetworkName); 209 209 int i_natNetworkRefDec(const Utf8Str &aNetworkName); 210 211 void i_onCloudProviderRegistered(const Utf8Str &aId, BOOL aRegistered); 210 212 211 213 #ifdef VBOX_WITH_CLOUD_NET -
trunk/src/VBox/Main/src-server/CloudProviderManagerImpl.cpp
r85247 r86012 18 18 19 19 #define LOG_GROUP LOG_GROUP_MAIN_CLOUDPROVIDERMANAGER 20 #include <iprt/cpp/utils.h> 20 21 #include <VBox/com/array.h> 21 22 … … 33 34 // //////////////////////////////////////////////////////////////////////////////// 34 35 CloudProviderManager::CloudProviderManager() 36 : m_pVirtualBox(NULL) 35 37 { 36 38 } … … 53 55 } 54 56 55 HRESULT CloudProviderManager::init( )57 HRESULT CloudProviderManager::init(VirtualBox *aVirtualBox) 56 58 { 57 59 // Enclose the state transition NotReady->InInit->Ready. … … 60 62 61 63 m_apCloudProviders.clear(); 64 unconst(m_pVirtualBox) = aVirtualBox; 62 65 63 66 autoInitSpan.setSucceeded(); … … 71 74 if (autoUninitSpan.uninitDone()) 72 75 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 74 83 75 84 #ifdef VBOX_WITH_EXTPACK … … 88 97 89 98 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); 94 107 if (it != m_mapCloudProviderManagers.end()) 95 108 { 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 */ 98 112 Assert(m_astrExtPackNames.size() == m_apCloudProviders.size()); 99 113 for (size_t i = 0; i < m_astrExtPackNames.size(); ) 100 114 { 101 if (m_astrExtPackNames[i] != strName) 115 /* the horse it rode in on? */ 116 if (m_astrExtPackNames[i] != strExtPackName) 102 117 { 103 118 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 */ 109 130 HRESULT hrc = S_OK; 110 131 ULONG uRefCnt = 1; … … 112 133 if (pTmpProvider) 113 134 { 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 114 149 hrc = pTmpProvider->PrepareUninstall(); 115 // Sanity check the refcount, it should be 1 at this point.116 150 pTmpProvider->AddRef(); 117 151 uRefCnt = pTmpProvider->Release(); 118 Assert(uRefCnt == 1); 119 } 152 } 153 154 /* has PrepareUninstall uninited the provider? */ 120 155 if (SUCCEEDED(hrc) && uRefCnt == 1) 121 156 { 122 157 m_astrExtPackNames.erase(m_astrExtPackNames.begin() + (ssize_t)i); 123 158 m_apCloudProviders.erase(m_apCloudProviders.begin() + (ssize_t)i); 159 /* NB: not advancing loop index */ 124 160 } 125 161 else 126 162 { 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)); 128 165 fRes = false; 129 166 i++; … … 140 177 void CloudProviderManager::i_addExtPack(IExtPack *aExtPack) 141 178 { 179 HRESULT hrc; 180 142 181 AssertReturnVoid(aExtPack); 143 144 182 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 145 183 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 */ 149 189 ComPtr<IUnknown> pObj; 150 std::vector<com::Utf8Str> astrExtPackNames;151 190 com::Guid idObj(COM_IIDOF(ICloudProviderManager)); 152 HRESULThrc = aExtPack->QueryObject(Bstr(idObj.toString()).raw(), pObj.asOutParam());191 hrc = aExtPack->QueryObject(Bstr(idObj.toString()).raw(), pObj.asOutParam()); 153 192 if (FAILED(hrc)) 154 193 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 */ 160 199 SafeIfaceArray<ICloudProvider> apProvidersFromCurrExtPack; 161 hrc = p Tmp->COMGETTER(Providers)(ComSafeArrayAsOutParam(apProvidersFromCurrExtPack));200 hrc = pManager->COMGETTER(Providers)(ComSafeArrayAsOutParam(apProvidersFromCurrExtPack)); 162 201 if (FAILED(hrc)) 163 202 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 166 212 for (unsigned i = 0; i < apProvidersFromCurrExtPack.size(); i++) 167 213 { 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 */ 177 224 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); 182 240 } 183 241 } -
trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp
r85309 r86012 762 762 rc = unconst(m->pCloudProviderManager).createObject(); 763 763 if (SUCCEEDED(rc)) 764 rc = m->pCloudProviderManager->init( );764 rc = m->pCloudProviderManager->init(this); 765 765 ComAssertComRCThrowRC(rc); 766 766 if (FAILED(rc)) throw rc; … … 3819 3819 3820 3820 3821 void 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 3821 3838 /** 3822 3839 * @note Locks the list of other objects for reading.
Note:
See TracChangeset
for help on using the changeset viewer.