MCPcopy Create free account
hub / github.com/TDesktop-x64/tdesktop / resolve

Method resolve

Telegram/SourceFiles/data/data_download_manager.cpp:644–717  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

642}
643
644void DownloadManager::resolve(
645 not_null<Main::Session*> session,
646 SessionData &data) {
647 const auto guard = gsl::finally([&] {
648 checkFullResolveDone();
649 });
650 if (data.resolveSentTotal >= data.resolveNeeded
651 || data.resolveSentTotal >= kMaxResolvePerAttempt) {
652 return;
653 }
654 struct Prepared {
655 uint64 peerAccessHash = 0;
656 QVector<MTPInputMessage> ids;
657 };
658 auto &owner = session->data();
659 auto prepared = base::flat_map<PeerId, Prepared>();
660 auto last = begin(data.downloaded);
661 auto from = last + (data.resolveNeeded - data.resolveSentTotal);
662 for (auto i = from; i != last;) {
663 auto &id = *--i;
664 const auto msgId = id.itemId.msg;
665 const auto info = QFileInfo(id.path);
666 if (!info.exists() || info.size() != id.size) {
667 // Mark as deleted.
668 id.path = QString();
669 } else if (!owner.message(id.itemId) && IsServerMsgId(msgId)) {
670 const auto groupByPeer = peerIsChannel(id.itemId.peer)
671 ? id.itemId.peer
672 : session->userPeerId();
673 auto &perPeer = prepared[groupByPeer];
674 if (peerIsChannel(id.itemId.peer) && !perPeer.peerAccessHash) {
675 perPeer.peerAccessHash = id.peerAccessHash;
676 }
677 perPeer.ids.push_back(MTP_inputMessageID(MTP_int(msgId.bare)));
678 }
679 if (++data.resolveSentTotal >= kMaxResolvePerAttempt) {
680 break;
681 }
682 }
683 const auto check = [=] {
684 auto &data = sessionData(session);
685 if (!data.resolveSentRequests) {
686 resolveRequestsFinished(session, data);
687 }
688 };
689 const auto requestFinished = [=] {
690 --sessionData(session).resolveSentRequests;
691 check();
692 };
693 for (auto &[peer, perPeer] : prepared) {
694 if (const auto channelId = peerToChannel(peer)) {
695 session->api().request(MTPchannels_GetMessages(
696 MTP_inputChannel(
697 MTP_long(channelId.bare),
698 MTP_long(perPeer.peerAccessHash)),
699 MTP_vector<MTPInputMessage>(perPeer.ids)
700 )).done([=](const MTPmessages_Messages &result) {
701 session->data().processExistingMessages(

Callers

nothing calls this directly

Calls 15

QFileInfoClass · 0.85
IsServerMsgIdFunction · 0.85
peerIsChannelFunction · 0.85
peerToChannelFunction · 0.85
MTP_longFunction · 0.85
userPeerIdMethod · 0.80
apiMethod · 0.80
MTP_intFunction · 0.70
QStringClass · 0.50
dataMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected