VirtualBox

source: vbox/trunk/src/VBox/Main/src-server/CloudProviderManagerImpl.cpp@ 74206

Last change on this file since 74206 was 74206, checked in by vboxsync, 7 years ago

CloudProviderManagerImpl.cpp: Build fix for !defined(VBOX_WITH_EXTPACK) case. bugref:9152

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.4 KB
Line 
1/* $Id: CloudProviderManagerImpl.cpp 74206 2018-09-12 09:32:18Z vboxsync $ */
2/** @file
3 * ICloudProviderManager COM class implementations.
4 */
5
6/*
7 * Copyright (C) 2008-2018 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.215389.xyz. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19#include <VBox/com/array.h>
20
21#include "VirtualBoxImpl.h"
22#include "CloudProviderManagerImpl.h"
23#include "ExtPackManagerImpl.h"
24#include "AutoCaller.h"
25#include "Logging.h"
26
27using namespace std;
28
29////////////////////////////////////////////////////////////////////////////////
30//
31// CloudProviderManager constructor / destructor
32//
33// ////////////////////////////////////////////////////////////////////////////////
34CloudProviderManager::CloudProviderManager()
35{
36}
37
38CloudProviderManager::~CloudProviderManager()
39{
40}
41
42
43HRESULT CloudProviderManager::FinalConstruct()
44{
45 return BaseFinalConstruct();
46}
47
48void CloudProviderManager::FinalRelease()
49{
50 uninit();
51
52 BaseFinalRelease();
53}
54
55HRESULT CloudProviderManager::init(VirtualBox *aParent)
56{
57 // Enclose the state transition NotReady->InInit->Ready.
58 AutoInitSpan autoInitSpan(this);
59 AssertReturn(autoInitSpan.isOk(), E_FAIL);
60
61 m_apCloudProviders.clear();
62
63#ifdef VBOX_WITH_CLOUD_PROVIDERS_IN_EXTPACK
64# ifdef VBOX_WITH_EXTPACK
65 // Engage the extension pack manager and get all the implementations of
66 // this class and all implemented cloud providers.
67 ExtPackManager *pExtPackMgr = aParent->i_getExtPackManager();
68 mpExtPackMgr = pExtPackMgr;
69 if (pExtPackMgr)
70 {
71 mcExtPackMgrUpdate = pExtPackMgr->i_getUpdateCounter();
72 // Make sure that the current value doesn't match, forcing a refresh.
73 mcExtPackMgrUpdate--;
74 i_refreshProviders();
75 }
76# endif
77#else
78 RT_NOREF(aParent);
79#endif
80
81 autoInitSpan.setSucceeded();
82 return S_OK;
83}
84
85void CloudProviderManager::uninit()
86{
87 // Enclose the state transition Ready->InUninit->NotReady.
88 AutoUninitSpan autoUninitSpan(this);
89 if (autoUninitSpan.uninitDone())
90 return;
91}
92
93#ifdef VBOX_WITH_CLOUD_PROVIDERS_IN_EXTPACK
94void CloudProviderManager::i_refreshProviders()
95{
96 uint64_t cExtPackMgrUpdate;
97 {
98 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
99 if (mpExtPackMgr.isNull())
100 return;
101 cExtPackMgrUpdate = mpExtPackMgr->i_getUpdateCounter();
102 if (cExtPackMgrUpdate == mcExtPackMgrUpdate)
103 return;
104 }
105
106 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
107 // Reread the current value to figure out if some other thead did the work
108 // already before this thread got hold of the write lock.
109 cExtPackMgrUpdate = mpExtPackMgr->i_getUpdateCounter();
110 if (cExtPackMgrUpdate == mcExtPackMgrUpdate)
111 return;
112 mcExtPackMgrUpdate = cExtPackMgrUpdate;
113
114 if (!m_mapCloudProviderManagers.empty())
115 {
116 /// @todo The code below will need to be extended to handle extpack
117 // install and uninstall safely (and the latter needs non-trivial
118 // checks if any extpack related cloud activity is pending.
119 return;
120 }
121
122 std::vector<ComPtr<IUnknown> > apObjects;
123 std::vector<com::Utf8Str> astrExtPackNames;
124 com::Guid idObj(COM_IIDOF(ICloudProviderManager));
125 mpExtPackMgr->i_queryObjects(idObj.toString(), apObjects, &astrExtPackNames);
126 for (unsigned i = 0; i < apObjects.size(); i++)
127 {
128 ComPtr<ICloudProviderManager> pTmp;
129 HRESULT hrc = apObjects[i].queryInterfaceTo(pTmp.asOutParam());
130 if (SUCCEEDED(hrc))
131 m_mapCloudProviderManagers[astrExtPackNames[i]] = pTmp;
132 SafeIfaceArray<ICloudProvider> apProvidersFromCurrExtPack;
133 hrc = pTmp->COMGETTER(Providers)(ComSafeArrayAsOutParam(apProvidersFromCurrExtPack));
134 if (SUCCEEDED(hrc))
135 {
136 for (unsigned j = 0; j < apProvidersFromCurrExtPack.size(); j++)
137 m_apCloudProviders.push_back(apProvidersFromCurrExtPack[i]);
138 }
139 }
140}
141#endif
142
143HRESULT CloudProviderManager::getProviders(std::vector<ComPtr<ICloudProvider> > &aProviders)
144{
145 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
146 aProviders = m_apCloudProviders;
147 return S_OK;
148}
149
150HRESULT CloudProviderManager::getProviderById(const com::Guid &aProviderId,
151 ComPtr<ICloudProvider> &aProvider)
152{
153 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
154 for (size_t i = 0; i < m_apCloudProviders.size(); i++)
155 {
156 Bstr bstrId;
157 HRESULT hrc = m_apCloudProviders[i]->COMGETTER(Id)(bstrId.asOutParam());
158 if (SUCCEEDED(hrc) && aProviderId == bstrId)
159 {
160 aProvider = m_apCloudProviders[i];
161 return S_OK;
162 }
163 }
164 return setError(VBOX_E_OBJECT_NOT_FOUND, tr("Could not find a cloud provider with UUID {%RTuuid}"),
165 aProviderId.raw());
166}
167
168HRESULT CloudProviderManager::getProviderByShortName(const com::Utf8Str &aProviderName,
169 ComPtr<ICloudProvider> &aProvider)
170{
171 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
172 for (size_t i = 0; i < m_apCloudProviders.size(); i++)
173 {
174 Bstr bstrName;
175 HRESULT hrc = m_apCloudProviders[i]->COMGETTER(ShortName)(bstrName.asOutParam());
176 if (SUCCEEDED(hrc) && bstrName.equals(aProviderName))
177 {
178 aProvider = m_apCloudProviders[i];
179 return S_OK;
180 }
181 }
182 return setError(VBOX_E_OBJECT_NOT_FOUND, tr("Could not find a cloud provider with short name '%s'"),
183 aProviderName.c_str());
184}
185
186HRESULT CloudProviderManager::getProviderByName(const com::Utf8Str &aProviderName,
187 ComPtr<ICloudProvider> &aProvider)
188{
189 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
190 for (size_t i = 0; i < m_apCloudProviders.size(); i++)
191 {
192 Bstr bstrName;
193 HRESULT hrc = m_apCloudProviders[i]->COMGETTER(Name)(bstrName.asOutParam());
194 if (SUCCEEDED(hrc) && bstrName.equals(aProviderName))
195 {
196 aProvider = m_apCloudProviders[i];
197 return S_OK;
198 }
199 }
200 return setError(VBOX_E_OBJECT_NOT_FOUND, tr("Could not find a cloud provider with name '%s'"),
201 aProviderName.c_str());
202}
203
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette