From 78515e37b1ec8af19129dc13378855451366adc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Sun, 14 Apr 2019 01:09:24 -0400 Subject: [PATCH] jamiaccount: simplify forEachDevice Change-Id: I97e818f48ccc0441826e4df152f95dbe17fb7ed6 --- src/jamidht/jamiaccount.cpp | 141 +++++++++++++++++------------------- src/jamidht/jamiaccount.h | 4 +- src/jamidht/p2p.cpp | 25 +++---- 3 files changed, 78 insertions(+), 92 deletions(-) diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index 0a51631597..a90db4cfc6 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -412,21 +412,21 @@ JamiAccount::startOutgoingCall(const std::shared_ptr<SIPCall>& call, const std:: // Find listening devices for this account dht::InfoHash peer_account(toUri); - forEachDevice(peer_account, [wCall, toUri, peer_account](const std::shared_ptr<JamiAccount>& sthis, const dht::InfoHash& dev) + forEachDevice(peer_account, [this, wCall, toUri, peer_account](const dht::InfoHash& dev) { auto call = wCall.lock(); if (not call) return; JAMI_DBG("[call %s] calling device %s", call->getCallId().c_str(), dev.toString().c_str()); auto& manager = Manager::instance(); - auto dev_call = manager.callFactory.newCall<SIPCall, JamiAccount>(*sthis, manager.getNewCallID(), + auto dev_call = manager.callFactory.newCall<SIPCall, JamiAccount>(*this, manager.getNewCallID(), Call::CallType::OUTGOING, call->getDetails()); std::weak_ptr<SIPCall> weak_dev_call = dev_call; dev_call->setIPToIP(true); - dev_call->setSecure(sthis->isTlsEnabled()); - auto ice = sthis->createIceTransport(("sip:" + dev_call->getCallId()).c_str(), - ICE_COMPONENTS, true, sthis->getIceOptions()); + dev_call->setSecure(isTlsEnabled()); + auto ice = createIceTransport(("sip:" + dev_call->getCallId()).c_str(), + ICE_COMPONENTS, true, getIceOptions()); if (not ice) { JAMI_WARN("Can't create ICE"); dev_call->removeCall(); @@ -435,7 +435,7 @@ JamiAccount::startOutgoingCall(const std::shared_ptr<SIPCall>& call, const std:: call->addSubCall(*dev_call); - manager.addTask([sthis, weak_dev_call, ice, dev, toUri, peer_account] { + manager.addTask([sthis=shared(), weak_dev_call, ice, dev, toUri, peer_account] { auto call = weak_dev_call.lock(); // call aborted? @@ -509,7 +509,7 @@ JamiAccount::startOutgoingCall(const std::shared_ptr<SIPCall>& call, const std:: sthis->checkPendingCallsTask(); return false; }); - }, [wCall](const std::shared_ptr<JamiAccount>&, bool ok){ + }, [wCall](bool ok){ if (not ok) { if (auto call = wCall.lock()) { JAMI_WARN("[call:%s] no devices found", call->getCallId().c_str()); @@ -1044,8 +1044,7 @@ generatePIN(size_t length = 8) void JamiAccount::addDevice(const std::string& password) { - auto this_ = std::static_pointer_cast<JamiAccount>(shared_from_this()); - ThreadPool::instance().run([this_,password]() { + ThreadPool::instance().run([this_=shared(), password]() { std::vector<uint8_t> key; dht::InfoHash loc; std::string pin_str; @@ -1293,8 +1292,7 @@ JamiAccount::createAccount(const std::string& archive_password, dht::crypto::Ide { JAMI_WARN("[Account %s] creating new account", getAccountID().c_str()); setRegistrationState(RegistrationState::INITIALIZING); - auto sthis = std::static_pointer_cast<JamiAccount>(shared_from_this()); - ThreadPool::instance().run([sthis,archive_password,migrate]() mutable { + ThreadPool::instance().run([sthis=shared(), archive_password, migrate]() mutable { AccountArchive a; auto& this_ = *sthis; @@ -2517,7 +2515,6 @@ JamiAccount::replyToIncomingIceMsg(const std::shared_ptr<SIPCall>& call, registerDhtAddress(*ice); // Asynchronous DHT put of our local ICE data - auto shared_this = std::static_pointer_cast<JamiAccount>(shared_from_this()); dht_.putEncrypted( callKey_, peer_ice_msg.from, @@ -2602,7 +2599,6 @@ JamiAccount::connectivityChanged() return; } - auto shared = std::static_pointer_cast<JamiAccount>(shared_from_this()); dht_.connectivityChanged(); } @@ -3191,10 +3187,10 @@ JamiAccount::sendTrustRequest(const std::string& to, const std::vector<uint8_t>& return; } addContact(toH); - forEachDevice(toH, [toH,payload](const std::shared_ptr<JamiAccount>& shared, const dht::InfoHash& dev) + forEachDevice(toH, [this,toH,payload](const dht::InfoHash& dev) { - JAMI_WARN("[Account %s] sending trust request to: %s / %s", shared->getAccountID().c_str(), toH.toString().c_str(), dev.toString().c_str()); - shared->dht_.putEncrypted(dht::InfoHash::get("inbox:"+dev.toString()), + JAMI_WARN("[Account %s] sending trust request to: %s / %s", getAccountID().c_str(), toH.toString().c_str(), dev.toString().c_str()); + dht_.putEncrypted(dht::InfoHash::get("inbox:"+dev.toString()), dev, dht::TrustRequest(DHT_TYPE_NS, payload)); }); @@ -3205,10 +3201,10 @@ JamiAccount::sendTrustRequestConfirm(const dht::InfoHash& to) { dht::TrustRequest answer {DHT_TYPE_NS}; answer.confirm = true; - forEachDevice(to, [to,answer](const std::shared_ptr<JamiAccount>& shared, const dht::InfoHash& dev) + forEachDevice(to, [this,to,answer](const dht::InfoHash& dev) { - JAMI_WARN("[Account %s] sending trust request reply: %s / %s", shared->getAccountID().c_str(), to.toString().c_str(), dev.toString().c_str()); - shared->dht_.putEncrypted(dht::InfoHash::get("inbox:"+dev.toString()), dev, answer); + JAMI_WARN("[Account %s] sending trust request reply: %s / %s", getAccountID().c_str(), to.toString().c_str(), dev.toString().c_str()); + dht_.putEncrypted(dht::InfoHash::get("inbox:"+dev.toString()), dev, answer); }); } @@ -3323,10 +3319,8 @@ JamiAccount::igdChanged() if (not dht_.isRunning()) return; if (upnp_) { - auto shared = std::static_pointer_cast<JamiAccount>(shared_from_this()); - std::thread{[shared] { - auto& this_ = *shared.get(); - auto oldPort = static_cast<in_port_t>(this_.dhtPortUsed_); + std::thread{[s = shared(), oldPort = static_cast<in_port_t>(dhtPortUsed_)] { + auto& this_ = *s; if (not this_.mapPortUPnP()) JAMI_WARN("UPnP: Could not map DHT port"); auto newPort = static_cast<in_port_t>(this_.dhtPortUsed_); @@ -3342,25 +3336,26 @@ JamiAccount::igdChanged() void JamiAccount::forEachDevice(const dht::InfoHash& to, - std::function<void(const std::shared_ptr<JamiAccount>&, const dht::InfoHash&)>&& op, - std::function<void(const std::shared_ptr<JamiAccount>&, bool)>&& end) + std::function<void(const dht::InfoHash&)>&& op, + std::function<void(bool)>&& end) { - auto shared = std::static_pointer_cast<JamiAccount>(shared_from_this()); auto treatedDevices = std::make_shared<std::set<dht::InfoHash>>(); dht_.get<dht::crypto::RevocationList>(to, [to](dht::crypto::RevocationList&& crl){ tls::CertificateStore::instance().pinRevocationList(to.toString(), std::move(crl)); return true; }); - dht_.get<DeviceAnnouncement>(to, [shared,to,treatedDevices,op=std::move(op)](DeviceAnnouncement&& dev) { + dht_.get<DeviceAnnouncement>(to, [this,to,treatedDevices,op=std::move(op)](DeviceAnnouncement&& dev) { if (dev.from != to) return true; - if (treatedDevices->emplace(dev.dev).second) - op(shared, dev.dev); + if (treatedDevices->emplace(dev.dev).second) { + op(dev.dev); + } return true; }, [=, end=std::move(end)](bool /*ok*/){ JAMI_DBG("[Account %s] found %lu devices for %s", getAccountID().c_str(), treatedDevices->size(), to.to_c_str()); - if (end) end(shared, not treatedDevices->empty()); + if (end) + end(not treatedDevices->empty()); }); } @@ -3410,71 +3405,65 @@ JamiAccount::sendTextMessage(const std::string& to, const std::map<std::string, auto confirm = std::make_shared<PendingConfirmation>(); // Find listening devices for this account - forEachDevice(toH, [confirm,to,token,payloads,now](const std::shared_ptr<JamiAccount>& this_, const dht::InfoHash& dev) + forEachDevice(toH, [this,confirm,to,token,payloads,now](const dht::InfoHash& dev) { { - std::lock_guard<std::mutex> lock(this_->messageMutex_); - auto e = this_->sentMessages_.emplace(token, PendingMessage {}); + std::lock_guard<std::mutex> lock(messageMutex_); + auto e = sentMessages_.emplace(token, PendingMessage {}); e.first->second.to = dev; } auto h = dht::InfoHash::get("inbox:"+dev.toString()); - std::weak_ptr<JamiAccount> w = this_; - auto list_token = this_->dht_.listen<dht::ImMessage>(h, [to, w, token, confirm](dht::ImMessage&& msg) { - if (auto sthis = w.lock()) { - auto& this_ = *sthis; - // check expected message confirmation - if (msg.id != token) - return true; - - { - std::lock_guard<std::mutex> lock(this_.messageMutex_); - auto e = this_.sentMessages_.find(msg.id); - if (e == this_.sentMessages_.end() or e->second.to != msg.from) { - JAMI_DBG() << "[Account " << this_.getAccountID() << "] [message " << token << "] Message not found"; - return true; - } - this_.sentMessages_.erase(e); - JAMI_DBG() << "[Account " << this_.getAccountID() << "] [message " << token << "] Received text message reply"; + auto list_token = dht_.listen<dht::ImMessage>(h, [this, to, token, confirm](dht::ImMessage&& msg) { + // check expected message confirmation + if (msg.id != token) + return true; - // add treated message - auto res = this_.treatedMessages_.insert(msg.id); - if (!res.second) - return true; + { + std::lock_guard<std::mutex> lock(messageMutex_); + auto e = sentMessages_.find(msg.id); + if (e == sentMessages_.end() or e->second.to != msg.from) { + JAMI_DBG() << "[Account " << getAccountID() << "] [message " << token << "] Message not found"; + return true; } - this_.saveTreatedMessages(); + sentMessages_.erase(e); + JAMI_DBG() << "[Account " << getAccountID() << "] [message " << token << "] Received text message reply"; - // report message as confirmed received - for (auto& t : confirm->listenTokens) - this_.dht_.cancelListen(t.first, t.second.get()); - confirm->listenTokens.clear(); - confirm->replied = true; - this_.messageEngine_.onMessageSent(to, token, true); + // add treated message + auto res = treatedMessages_.insert(msg.id); + if (!res.second) + return true; } + saveTreatedMessages(); + + // report message as confirmed received + for (auto& t : confirm->listenTokens) + dht_.cancelListen(t.first, t.second.get()); + confirm->listenTokens.clear(); + confirm->replied = true; + messageEngine_.onMessageSent(to, token, true); return false; }); confirm->listenTokens.emplace(h, std::move(list_token)); - this_->dht_.putEncrypted(h, dev, + dht_.putEncrypted(h, dev, dht::ImMessage(token, std::string(payloads.begin()->first), std::string(payloads.begin()->second), now), - [w,to,token,confirm,h](bool ok) { - if (auto this_ = w.lock()) { - JAMI_DBG() << "[Account " << this_->getAccountID() << "] [message " << token << "] Put encrypted " << (ok ? "ok" : "failed"); - if (not ok) { - auto lt = confirm->listenTokens.find(h); - if (lt != confirm->listenTokens.end()) { - this_->dht_.cancelListen(h, lt->second.get()); - confirm->listenTokens.erase(lt); - } - if (confirm->listenTokens.empty() and not confirm->replied) - this_->messageEngine_.onMessageSent(to, token, false); + [this,to,token,confirm,h](bool ok) { + JAMI_DBG() << "[Account " << getAccountID() << "] [message " << token << "] Put encrypted " << (ok ? "ok" : "failed"); + if (not ok) { + auto lt = confirm->listenTokens.find(h); + if (lt != confirm->listenTokens.end()) { + dht_.cancelListen(h, lt->second.get()); + confirm->listenTokens.erase(lt); } + if (confirm->listenTokens.empty() and not confirm->replied) + messageEngine_.onMessageSent(to, token, false); } }); - JAMI_DBG() << "[Account " << this_->getAccountID() << "] [message " << token << "] Sending message for device " << dev.toString(); - }, [to, token](const std::shared_ptr<JamiAccount>& shared, bool ok) { + JAMI_DBG() << "[Account " << getAccountID() << "] [message " << token << "] Sending message for device " << dev.toString(); + }, [this, to, token](bool ok) { if (not ok) { - shared->messageEngine_.onMessageSent(to, token, false); + messageEngine_.onMessageSent(to, token, false); } }); diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h index d2b29a2878..47efc8a8fe 100644 --- a/src/jamidht/jamiaccount.h +++ b/src/jamidht/jamiaccount.h @@ -365,8 +365,8 @@ class JamiAccount : public SIPAccountBase { const std::shared_future<tls::DhParams> dhParams() const { return dhParams_; } void forEachDevice(const dht::InfoHash& to, - std::function<void(const std::shared_ptr<JamiAccount>&, const dht::InfoHash&)>&& op, - std::function<void(const std::shared_ptr<JamiAccount>&, bool)>&& end = {}); + std::function<void(const dht::InfoHash&)>&& op, + std::function<void(bool)>&& end = {}); /** * Inform that a potential peer device have been found. diff --git a/src/jamidht/p2p.cpp b/src/jamidht/p2p.cpp index cf458a92e5..e6f4b8a1ce 100644 --- a/src/jamidht/p2p.cpp +++ b/src/jamidht/p2p.cpp @@ -765,23 +765,22 @@ DhtPeerConnector::requestConnection(const std::string& peer_id, pimpl_->account.forEachDevice( peer_h, - [this, addresses, connect_cb, tid](const std::shared_ptr<JamiAccount>& account, - const dht::InfoHash& dev_h) { - if (dev_h == account->dht().getId()) { - JAMI_ERR() << account << "[CNX] no connection to yourself, bad person!"; + [this, addresses, connect_cb, tid](const dht::InfoHash& dev_h) { + if (dev_h == pimpl_->account.dht().getId()) { + JAMI_ERR() << pimpl_->account.getAccountID() << "[CNX] no connection to yourself, bad person!"; return; } - account->findCertificate( + pimpl_->account.findCertificate( dev_h, [this, dev_h, addresses, connect_cb, tid] (const std::shared_ptr<dht::crypto::Certificate>& cert) { pimpl_->ctrl << makeMsg<CtrlMsgType::ADD_DEVICE>(dev_h, tid, cert, addresses, connect_cb); }); }, - [peer_h, connect_cb](const std::shared_ptr<JamiAccount>& account, bool found) { + [this, peer_h, connect_cb](bool found) { if (!found) { - JAMI_WARN() << account << "[CNX] aborted, no devices for " << peer_h; + JAMI_WARN() << pimpl_->account.getAccountID() << "[CNX] aborted, no devices for " << peer_h; connect_cb(nullptr); } }); @@ -802,18 +801,16 @@ DhtPeerConnector::closeConnection(const std::string& peer_id, const DRing::DataT pimpl_->ctrl << makeMsg<CtrlMsgType::CANCEL>(peer_h, tid); pimpl_->account.forEachDevice( peer_h, - [this, tid](const std::shared_ptr<JamiAccount>& account, - const dht::InfoHash& dev_h) { - if (dev_h == account->dht().getId()) { - JAMI_ERR() << account << "[CNX] no connection to yourself, bad person!"; + [this, tid](const dht::InfoHash& dev_h) { + if (dev_h == pimpl_->account.dht().getId()) { + JAMI_ERR() << pimpl_->account.getAccountID() << "[CNX] no connection to yourself, bad person!"; return; } pimpl_->ctrl << makeMsg<CtrlMsgType::CANCEL>(dev_h, tid); }, - - [peer_h](const std::shared_ptr<JamiAccount>& account, bool found) { + [this, peer_h](bool found) { if (!found) { - JAMI_WARN() << account << "[CNX] aborted, no devices for " << peer_h; + JAMI_WARN() << pimpl_->account.getAccountID() << "[CNX] aborted, no devices for " << peer_h; } }); } -- GitLab