From 0e88e97654d46aa709378d67334119f43eeda611 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Thu, 22 Dec 2022 16:07:15 +0100 Subject: OmemoManagerPrivate: Simplify setUpDeviceId() --- src/omemo/QXmppOmemoManager_p.cpp | 66 ++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 28 deletions(-) (limited to 'src/omemo/QXmppOmemoManager_p.cpp') diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp index 18e0d34d..237c0a24 100644 --- a/src/omemo/QXmppOmemoManager_p.cpp +++ b/src/omemo/QXmppOmemoManager_p.cpp @@ -629,43 +629,53 @@ QFuture ManagerPrivate::setUpDeviceId() warning("Existing / Published device IDs could not be retrieved: " % errorToString(*error)); reportFinishedResult(interface, false); } else { - auto generateDeviceId = [this, interface](uint32_t &deviceId) mutable -> bool { - if (signal_protocol_key_helper_generate_registration_id(&deviceId, 0, globalContext.get()) < 0) { - warning("Device ID could not be generated"); - reportFinishedResult(interface, false); - return false; - } - - return true; - }; - // The first generated device ID can be used if no device bundle node exists. // Otherwise, duplicates must be avoided. - if (error) { - uint32_t deviceId = 0; - if (generateDeviceId(deviceId)) { - ownDevice.id = deviceId; - reportFinishedResult(interface, true); - } - } else { - const auto &deviceIds = std::get>(result); - - while (true) { - uint32_t deviceId = 0; - - if (generateDeviceId(deviceId) && !deviceIds.contains(QString::number(deviceId))) { - ownDevice.id = deviceId; - reportFinishedResult(interface, true); - break; - } - } + auto deviceId = error ? generateDeviceId() : generateDeviceId(std::get>(result)); + if (deviceId) { + ownDevice.id = *deviceId; } + reportFinishedResult(interface, deviceId.has_value()); } }); return interface.future(); } +// +// Generates a new device ID. +// +// Returns the device ID or an empty optional on errors. +// +std::optional QXmppOmemoManagerPrivate::generateDeviceId() +{ + uint32_t deviceId = 0; + if (signal_protocol_key_helper_generate_registration_id(&deviceId, 0, globalContext.get()) < 0) { + warning("Device ID could not be generated"); + return {}; + } + return deviceId; +} + +// +// Generates a new device ID that does not exist yet. +// +// Returns the device ID or an empty optional on errors. +// +std::optional QXmppOmemoManagerPrivate::generateDeviceId(const QVector &existingIds) +{ + uint32_t deviceId = 0; + + do { + if (signal_protocol_key_helper_generate_registration_id(&deviceId, 0, globalContext.get()) < 0) { + warning("Device ID could not be generated"); + return {}; + } + } while (existingIds.contains(QString::number(deviceId))); + + return deviceId; +} + // // Sets up an identity key pair. // -- cgit v1.2.3