Skip to content

Commit 7fbfcec

Browse files
feat: add async overloads of GetManagedObjects() (#480)
This implements three variants of `GetManagedObjectsAsync()` API into the standard `ObjectManager` client interface. --------- Signed-off-by: Joel Winarske <joel.winarske@gmail.com> Co-authored-by: Stanislav Angelovič <stanislav.angelovic@protonmail.com>
1 parent 0430ae0 commit 7fbfcec

3 files changed

Lines changed: 76 additions & 16 deletions

File tree

.github/workflows/ci.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,14 @@ jobs:
4343
# - name: install-googletest
4444
# run: |
4545
# sudo apt-get install -y libgmock-dev
46+
- name: configure-debug-gcc11 # For gcc 11, turn off the annoying deprecated-copy warning
47+
if: matrix.build == 'shared-libsystemd' && matrix.compiler == 'g++' && matrix.os == 'ubuntu-22.04'
48+
run: |
49+
mkdir build
50+
cd build
51+
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_CXX_FLAGS="-O0 -g -W -Wextra -Wall -Wnon-virtual-dtor -Wno-deprecated-copy -Werror $SDBUSCPP_EXTRA_CXX_FLAGS" -DCMAKE_VERBOSE_MAKEFILE=ON -DSDBUSCPP_INSTALL=ON -DSDBUSCPP_BUILD_TESTS=ON -DSDBUSCPP_BUILD_PERF_TESTS=ON -DSDBUSCPP_BUILD_STRESS_TESTS=ON -DSDBUSCPP_BUILD_CODEGEN=ON -DSDBUSCPP_GOOGLETEST_VERSION=1.14.0 ..
4652
- name: configure-debug
47-
if: matrix.build == 'shared-libsystemd'
53+
if: matrix.build == 'shared-libsystemd' && (matrix.compiler != 'g++' || matrix.os != 'ubuntu-22.04')
4854
run: |
4955
mkdir build
5056
cd build

include/sdbus-c++/StandardInterfaces.h

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ namespace sdbus {
168168
return m_proxy.getPropertyAsync(propertyName).onInterface(interfaceName).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
169169
}
170170

171+
std::future<sdbus::Variant> GetAsync(const InterfaceName& interfaceName, const PropertyName& propertyName, with_future_t)
172+
{
173+
return m_proxy.getPropertyAsync(propertyName).onInterface(interfaceName).getResultAsFuture();
174+
}
175+
171176
template <typename _Function>
172177
PendingAsyncCall GetAsync(std::string_view interfaceName, std::string_view propertyName, _Function&& callback)
173178
{
@@ -180,11 +185,6 @@ namespace sdbus {
180185
return m_proxy.getPropertyAsync(propertyName).onInterface(interfaceName).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
181186
}
182187

183-
std::future<sdbus::Variant> GetAsync(const InterfaceName& interfaceName, const PropertyName& propertyName, with_future_t)
184-
{
185-
return m_proxy.getPropertyAsync(propertyName).onInterface(interfaceName).getResultAsFuture();
186-
}
187-
188188
std::future<sdbus::Variant> GetAsync(std::string_view interfaceName, std::string_view propertyName, with_future_t)
189189
{
190190
return m_proxy.getPropertyAsync(propertyName).onInterface(interfaceName).getResultAsFuture();
@@ -222,6 +222,11 @@ namespace sdbus {
222222
return m_proxy.setPropertyAsync(propertyName).onInterface(interfaceName).toValue(value).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
223223
}
224224

225+
std::future<void> SetAsync(const InterfaceName& interfaceName, const PropertyName& propertyName, const sdbus::Variant& value, with_future_t)
226+
{
227+
return m_proxy.setPropertyAsync(propertyName).onInterface(interfaceName).toValue(value).getResultAsFuture();
228+
}
229+
225230
template <typename _Function>
226231
PendingAsyncCall SetAsync(std::string_view interfaceName, std::string_view propertyName, const sdbus::Variant& value, _Function&& callback)
227232
{
@@ -234,11 +239,6 @@ namespace sdbus {
234239
return m_proxy.setPropertyAsync(propertyName).onInterface(interfaceName).toValue(value).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
235240
}
236241

237-
std::future<void> SetAsync(const InterfaceName& interfaceName, const PropertyName& propertyName, const sdbus::Variant& value, with_future_t)
238-
{
239-
return m_proxy.setPropertyAsync(propertyName).onInterface(interfaceName).toValue(value).getResultAsFuture();
240-
}
241-
242242
std::future<void> SetAsync(std::string_view interfaceName, std::string_view propertyName, const sdbus::Variant& value, with_future_t)
243243
{
244244
return m_proxy.setPropertyAsync(propertyName).onInterface(interfaceName).toValue(value).getResultAsFuture();
@@ -266,6 +266,11 @@ namespace sdbus {
266266
return m_proxy.getAllPropertiesAsync().onInterface(interfaceName).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
267267
}
268268

269+
std::future<std::map<PropertyName, sdbus::Variant>> GetAllAsync(const InterfaceName& interfaceName, with_future_t)
270+
{
271+
return m_proxy.getAllPropertiesAsync().onInterface(interfaceName).getResultAsFuture();
272+
}
273+
269274
template <typename _Function>
270275
PendingAsyncCall GetAllAsync(std::string_view interfaceName, _Function&& callback)
271276
{
@@ -278,11 +283,6 @@ namespace sdbus {
278283
return m_proxy.getAllPropertiesAsync().onInterface(interfaceName).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
279284
}
280285

281-
std::future<std::map<PropertyName, sdbus::Variant>> GetAllAsync(const InterfaceName& interfaceName, with_future_t)
282-
{
283-
return m_proxy.getAllPropertiesAsync().onInterface(interfaceName).getResultAsFuture();
284-
}
285-
286286
std::future<std::map<PropertyName, sdbus::Variant>> GetAllAsync(std::string_view interfaceName, with_future_t)
287287
{
288288
return m_proxy.getAllPropertiesAsync().onInterface(interfaceName).getResultAsFuture();
@@ -344,6 +344,23 @@ namespace sdbus {
344344
return objectsInterfacesAndProperties;
345345
}
346346

347+
template <typename _Function>
348+
PendingAsyncCall GetManagedObjectsAsync(_Function&& callback)
349+
{
350+
return m_proxy.callMethodAsync("GetManagedObjects").onInterface(INTERFACE_NAME).uponReplyInvoke(std::forward<_Function>(callback));
351+
}
352+
353+
template <typename _Function>
354+
[[nodiscard]] Slot GetManagedObjectsAsync(_Function&& callback, return_slot_t)
355+
{
356+
return m_proxy.callMethodAsync("GetManagedObjects").onInterface(INTERFACE_NAME).uponReplyInvoke(std::forward<_Function>(callback), return_slot);
357+
}
358+
359+
std::future<std::map<sdbus::ObjectPath, std::map<sdbus::InterfaceName, std::map<PropertyName, sdbus::Variant>>>> GetManagedObjectsAsync(with_future_t)
360+
{
361+
return m_proxy.callMethodAsync("GetManagedObjects").onInterface(INTERFACE_NAME).getResultAsFuture<std::map<sdbus::ObjectPath, std::map<sdbus::InterfaceName, std::map<PropertyName, sdbus::Variant>>>>();
362+
}
363+
347364
private:
348365
sdbus::IProxy& m_proxy;
349366
};

tests/integrationtests/DBusStandardInterfacesTests.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,43 @@ TYPED_TEST(SdbusTestObject, GetsManagedObjectsSuccessfully)
264264
.at(ACTION_PROPERTY).template get<uint32_t>(), Eq(DEFAULT_ACTION_VALUE));
265265
}
266266

267+
TYPED_TEST(SdbusTestObject, GetsManagedObjectsAsynchronously)
268+
{
269+
std::promise<size_t> promise;
270+
auto future = promise.get_future();
271+
auto adaptor2 = std::make_unique<TestAdaptor>(*this->s_adaptorConnection, OBJECT_PATH_2);
272+
273+
this->m_objectManagerProxy->GetManagedObjectsAsync([&](std::optional<sdbus::Error> /*err*/, const std::map<sdbus::ObjectPath, std::map<sdbus::InterfaceName, std::map<sdbus::PropertyName, sdbus::Variant>>>& objectsInterfacesAndProperties)
274+
{
275+
promise.set_value(objectsInterfacesAndProperties.size());
276+
});
277+
278+
ASSERT_THAT(future.get(), Eq(2));
279+
}
280+
281+
TYPED_TEST(SdbusTestObject, GetsManagedObjectsAsynchronouslyViaSlotReturningOverload)
282+
{
283+
std::promise<size_t> promise;
284+
auto future = promise.get_future();
285+
auto adaptor2 = std::make_unique<TestAdaptor>(*this->s_adaptorConnection, OBJECT_PATH_2);
286+
287+
auto slot = this->m_objectManagerProxy->GetManagedObjectsAsync([&](std::optional<sdbus::Error> /*err*/, const std::map<sdbus::ObjectPath, std::map<sdbus::InterfaceName, std::map<sdbus::PropertyName, sdbus::Variant>>>& objectsInterfacesAndProperties)
288+
{
289+
promise.set_value(objectsInterfacesAndProperties.size());
290+
}, sdbus::return_slot);
291+
292+
ASSERT_THAT(future.get(), Eq(2));
293+
}
294+
295+
TYPED_TEST(SdbusTestObject, GetsManagedObjectsAsynchronouslyViaFutureOverload)
296+
{
297+
auto adaptor2 = std::make_unique<TestAdaptor>(*this->s_adaptorConnection, OBJECT_PATH_2);
298+
299+
auto future = this->m_objectManagerProxy->GetManagedObjectsAsync(sdbus::with_future);
300+
301+
ASSERT_THAT(future.get().size(), Eq(2));
302+
}
303+
267304
TYPED_TEST(SdbusTestObject, EmitsInterfacesAddedSignalForSelectedObjectInterfaces)
268305
{
269306
std::atomic<bool> signalReceived{false};

0 commit comments

Comments
 (0)