diff --git a/Telegram/SourceFiles/data/data_histories.cpp b/Telegram/SourceFiles/data/data_histories.cpp index 3a5df64112..169615fdcd 100644 --- a/Telegram/SourceFiles/data/data_histories.cpp +++ b/Telegram/SourceFiles/data/data_histories.cpp @@ -549,7 +549,8 @@ int Histories::sendRequest( Expects(type != RequestType::None); auto &state = _states[history]; - const auto id = ++state.autoincrement; + const auto id = ++_requestAutoincrement; + _historyByRequest.emplace(id, history); if (type == RequestType::History && postponeHistoryRequest(state)) { state.postponed.emplace( id, @@ -593,19 +594,24 @@ void Histories::checkPostponed(not_null history, int id) { finishSentRequest(history, state, id); } -void Histories::cancelRequest(not_null history, int id) { - const auto state = lookup(history); +void Histories::cancelRequest(int id) { + const auto history = _historyByRequest.take(id); + if (!history) { + return; + } + const auto state = lookup(*history); if (!state) { return; } state->postponed.remove(id); - finishSentRequest(history, state, id); + finishSentRequest(*history, state, id); } void Histories::finishSentRequest( not_null history, not_null state, int id) { + _historyByRequest.remove(id); state->sent.remove(id); if (!state->postponed.empty() && !postponeHistoryRequest(*state)) { for (auto &[id, postponed] : base::take(state->postponed)) { @@ -626,6 +632,7 @@ void Histories::finishSentRequest( history, std::move(i->second)); Assert(ok); + _dialogRequests.erase(i); state->postponedRequestEntry = false; } checkEmptyState(history); diff --git a/Telegram/SourceFiles/data/data_histories.h b/Telegram/SourceFiles/data/data_histories.h index bcc068229c..21e4efa5e8 100644 --- a/Telegram/SourceFiles/data/data_histories.h +++ b/Telegram/SourceFiles/data/data_histories.h @@ -72,7 +72,7 @@ public: not_null history, RequestType type, Fn finish)> generator); - void cancelRequest(not_null history, int id); + void cancelRequest(int id); private: struct PostponedHistoryRequest { @@ -88,7 +88,6 @@ private: base::flat_map sent; crl::time readWhen = 0; MsgId readTill = 0; - int autoincrement = 0; bool postponedRequestEntry = false; }; @@ -112,6 +111,8 @@ private: std::unordered_map> _map; base::flat_map, State> _states; + base::flat_map> _historyByRequest; + int _requestAutoincrement = 0; base::Timer _readRequestsTimer; base::flat_set> _dialogFolderRequests; diff --git a/Telegram/SourceFiles/data/data_search_controller.cpp b/Telegram/SourceFiles/data/data_search_controller.cpp index 6ae67371f2..08541b13da 100644 --- a/Telegram/SourceFiles/data/data_search_controller.cpp +++ b/Telegram/SourceFiles/data/data_search_controller.cpp @@ -369,7 +369,7 @@ void SearchController::requestMore( return; } auto &histories = _session->data().histories(); - const auto type = Histories::RequestType::History; + const auto type = ::Data::Histories::RequestType::History; const auto history = _session->data().history(listData->peer); auto requestId = histories.sendRequest(history, type, [=](Fn finish) { return _api.request( @@ -392,8 +392,7 @@ void SearchController::requestMore( }).send(); }); listData->requests.emplace(key, [=] { - auto &histories = _session->data().histories(); - histories.cancelRequest(history, requestId); + _session->data().histories().cancelRequest(requestId); }); } diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index ab1c85d3ee..211f01b0dd 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -38,6 +38,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_chat.h" #include "data/data_user.h" #include "data/data_folder.h" +#include "data/data_histories.h" #include "facades.h" #include "app.h" #include "styles/style_dialogs.h" @@ -392,6 +393,7 @@ void Widget::fullSearchRefreshOn(rpl::producer<> events) { _searchQueries.clear(); _searchQuery = QString(); _scroll->scrollToY(0); + cancelSearchRequest(); onSearchMessages(); }, lifetime()); } @@ -736,7 +738,7 @@ bool Widget::onSearchMessages(bool searchCache) { auto result = false; auto q = _filter->getLastText().trimmed(); if (q.isEmpty() && !_searchFromUser) { - MTP::cancel(base::take(_searchRequest)); + cancelSearchRequest(); MTP::cancel(base::take(_peerSearchRequest)); return true; } @@ -753,7 +755,7 @@ bool Widget::onSearchMessages(bool searchCache) { _searchQueryFrom = _searchFromUser; _searchNextRate = 0; _searchFull = _searchFullMigrated = false; - MTP::cancel(base::take(_searchRequest)); + cancelSearchRequest(); searchReceived( _searchInChat ? SearchRequestType::PeerFromStart @@ -767,19 +769,23 @@ bool Widget::onSearchMessages(bool searchCache) { _searchQueryFrom = _searchFromUser; _searchNextRate = 0; _searchFull = _searchFullMigrated = false; - MTP::cancel(base::take(_searchRequest)); + cancelSearchRequest(); if (const auto peer = _searchInChat.peer()) { - const auto flags = _searchQueryFrom - ? MTP_flags(MTPmessages_Search::Flag::f_from_id) - : MTP_flags(0); - _searchRequest = MTP::send( - MTPmessages_Search( + auto &histories = session().data().histories(); + const auto type = Data::Histories::RequestType::History; + const auto history = session().data().history(peer); + _searchInHistoryRequest = histories.sendRequest(history, type, [=](Fn finish) { + const auto type = SearchRequestType::PeerFromStart; + const auto flags = _searchQueryFrom + ? MTP_flags(MTPmessages_Search::Flag::f_from_id) + : MTP_flags(0); + _searchRequest = session().api().request(MTPmessages_Search( flags, peer->input, MTP_string(_searchQuery), - _searchQueryFrom + (_searchQueryFrom ? _searchQueryFrom->inputUser - : MTP_inputUserEmpty(), + : MTP_inputUserEmpty()), MTP_inputMessagesFilterEmpty(), MTP_int(0), MTP_int(0), @@ -788,9 +794,17 @@ bool Widget::onSearchMessages(bool searchCache) { MTP_int(SearchPerPage), MTP_int(0), MTP_int(0), - MTP_int(0)), - rpcDone(&Widget::searchReceived, SearchRequestType::PeerFromStart), - rpcFail(&Widget::searchFailed, SearchRequestType::PeerFromStart)); + MTP_int(0) + )).done([=](const MTPmessages_Messages &result) { + searchReceived(type, result, _searchRequest); + finish(); + }).fail([=](const RPCError &error) { + searchFailed(type, error, _searchRequest); + finish(); + }).send(); + _searchQueries.insert(_searchRequest, _searchQuery); + return _searchRequest; + }); //} else if (const auto feed = _searchInChat.feed()) { // #feed // _searchRequest = MTP::send( // MTPchannels_SearchFeed( @@ -802,6 +816,7 @@ bool Widget::onSearchMessages(bool searchCache) { // MTP_int(SearchPerPage)), // rpcDone(&Widget::searchReceived, SearchRequestType::FromStart), // rpcFail(&Widget::searchFailed, SearchRequestType::FromStart)); + // _searchQueries.insert(_searchRequest, _searchQuery); } else { const auto flags = session().settings().skipArchiveInSearch() ? MTPmessages_SearchGlobal::Flag::f_folder_id @@ -818,8 +833,8 @@ bool Widget::onSearchMessages(bool searchCache) { MTP_int(SearchPerPage)), rpcDone(&Widget::searchReceived, SearchRequestType::FromStart), rpcFail(&Widget::searchFailed, SearchRequestType::FromStart)); + _searchQueries.insert(_searchRequest, _searchQuery); } - _searchQueries.insert(_searchRequest, _searchQuery); } const auto query = Api::ConvertPeerSearchQuery(q); if (searchForPeersRequired(query)) { @@ -906,93 +921,122 @@ void Widget::searchMessages( } void Widget::onSearchMore() { - if (!_searchRequest) { - if (!_searchFull) { - auto offsetPeer = _inner->lastSearchPeer(); - auto offsetId = _inner->lastSearchId(); - if (const auto peer = _searchInChat.peer()) { + if (_searchRequest || _searchInHistoryRequest) { + return; + } + if (!_searchFull) { + auto offsetPeer = _inner->lastSearchPeer(); + auto offsetId = _inner->lastSearchId(); + if (const auto peer = _searchInChat.peer()) { + auto &histories = session().data().histories(); + const auto type = Data::Histories::RequestType::History; + const auto history = session().data().history(peer); + _searchInHistoryRequest = histories.sendRequest(history, type, [=](Fn finish) { + const auto type = offsetId + ? SearchRequestType::PeerFromOffset + : SearchRequestType::PeerFromStart; auto flags = _searchQueryFrom ? MTP_flags(MTPmessages_Search::Flag::f_from_id) : MTP_flags(0); - _searchRequest = MTP::send( - MTPmessages_Search( - flags, - peer->input, - MTP_string(_searchQuery), - _searchQueryFrom - ? _searchQueryFrom->inputUser - : MTP_inputUserEmpty(), - MTP_inputMessagesFilterEmpty(), - MTP_int(0), - MTP_int(0), - MTP_int(offsetId), - MTP_int(0), - MTP_int(SearchPerPage), - MTP_int(0), - MTP_int(0), - MTP_int(0)), - rpcDone(&Widget::searchReceived, offsetId ? SearchRequestType::PeerFromOffset : SearchRequestType::PeerFromStart), - rpcFail(&Widget::searchFailed, offsetId ? SearchRequestType::PeerFromOffset : SearchRequestType::PeerFromStart)); - //} else if (const auto feed = _searchInChat.feed()) { // #feed - // _searchRequest = MTP::send( - // MTPchannels_SearchFeed( - // MTP_int(feed->id()), - // MTP_string(_searchQuery), - // MTP_int(offsetDate), - // offsetPeer - // ? offsetPeer->input - // : MTP_inputPeerEmpty(), - // MTP_int(offsetId), - // MTP_int(SearchPerPage)), - // rpcDone(&Widget::searchReceived, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart), - // rpcFail(&Widget::searchFailed, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart)); - } else { - const auto flags = session().settings().skipArchiveInSearch() - ? MTPmessages_SearchGlobal::Flag::f_folder_id - : MTPmessages_SearchGlobal::Flag(0); - const auto folderId = 0; - _searchRequest = MTP::send( - MTPmessages_SearchGlobal( - MTP_flags(flags), - MTP_int(folderId), - MTP_string(_searchQuery), - MTP_int(_searchNextRate), - offsetPeer - ? offsetPeer->input - : MTP_inputPeerEmpty(), - MTP_int(offsetId), - MTP_int(SearchPerPage)), - rpcDone(&Widget::searchReceived, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart), - rpcFail(&Widget::searchFailed, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart)); - } - if (!offsetId) { - _searchQueries.insert(_searchRequest, _searchQuery); - } - } else if (_searchInMigrated && !_searchFullMigrated) { - auto offsetMigratedId = _inner->lastSearchMigratedId(); - auto flags = _searchQueryFrom - ? MTP_flags(MTPmessages_Search::Flag::f_from_id) - : MTP_flags(0); - _searchRequest = MTP::send( - MTPmessages_Search( + _searchRequest = session().api().request(MTPmessages_Search( flags, - _searchInMigrated->peer->input, + peer->input, MTP_string(_searchQuery), - _searchQueryFrom + (_searchQueryFrom ? _searchQueryFrom->inputUser - : MTP_inputUserEmpty(), + : MTP_inputUserEmpty()), MTP_inputMessagesFilterEmpty(), MTP_int(0), MTP_int(0), - MTP_int(offsetMigratedId), + MTP_int(offsetId), MTP_int(0), MTP_int(SearchPerPage), MTP_int(0), MTP_int(0), - MTP_int(0)), - rpcDone(&Widget::searchReceived, offsetMigratedId ? SearchRequestType::MigratedFromOffset : SearchRequestType::MigratedFromStart), - rpcFail(&Widget::searchFailed, offsetMigratedId ? SearchRequestType::MigratedFromOffset : SearchRequestType::MigratedFromStart)); + MTP_int(0) + )).done([=](const MTPmessages_Messages &result) { + searchReceived(type, result, _searchRequest); + }).fail([=](const RPCError &error) { + searchFailed(type, error, _searchRequest); + }).send(); + if (!offsetId) { + _searchQueries.insert(_searchRequest, _searchQuery); + } + return _searchRequest; + }); + //} else if (const auto feed = _searchInChat.feed()) { // #feed + // _searchRequest = MTP::send( + // MTPchannels_SearchFeed( + // MTP_int(feed->id()), + // MTP_string(_searchQuery), + // MTP_int(offsetDate), + // offsetPeer + // ? offsetPeer->input + // : MTP_inputPeerEmpty(), + // MTP_int(offsetId), + // MTP_int(SearchPerPage)), + // rpcDone(&Widget::searchReceived, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart), + // rpcFail(&Widget::searchFailed, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart)); + // if (!offsetId) { + // _searchQueries.insert(_searchRequest, _searchQuery); + // } + } else { + const auto flags = session().settings().skipArchiveInSearch() + ? MTPmessages_SearchGlobal::Flag::f_folder_id + : MTPmessages_SearchGlobal::Flag(0); + const auto folderId = 0; + _searchRequest = MTP::send( + MTPmessages_SearchGlobal( + MTP_flags(flags), + MTP_int(folderId), + MTP_string(_searchQuery), + MTP_int(_searchNextRate), + offsetPeer + ? offsetPeer->input + : MTP_inputPeerEmpty(), + MTP_int(offsetId), + MTP_int(SearchPerPage)), + rpcDone(&Widget::searchReceived, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart), + rpcFail(&Widget::searchFailed, offsetId ? SearchRequestType::FromOffset : SearchRequestType::FromStart)); + if (!offsetId) { + _searchQueries.insert(_searchRequest, _searchQuery); + } } + } else if (_searchInMigrated && !_searchFullMigrated) { + auto offsetMigratedId = _inner->lastSearchMigratedId(); + auto &histories = session().data().histories(); + const auto type = Data::Histories::RequestType::History; + const auto history = _searchInMigrated; + _searchInHistoryRequest = histories.sendRequest(history, type, [=](Fn finish) { + const auto type = offsetMigratedId + ? SearchRequestType::MigratedFromOffset + : SearchRequestType::MigratedFromStart; + const auto flags = _searchQueryFrom + ? MTP_flags(MTPmessages_Search::Flag::f_from_id) + : MTP_flags(0); + _searchRequest = session().api().request(MTPmessages_Search( + flags, + _searchInMigrated->peer->input, + MTP_string(_searchQuery), + (_searchQueryFrom + ? _searchQueryFrom->inputUser + : MTP_inputUserEmpty()), + MTP_inputMessagesFilterEmpty(), + MTP_int(0), + MTP_int(0), + MTP_int(offsetMigratedId), + MTP_int(0), + MTP_int(SearchPerPage), + MTP_int(0), + MTP_int(0), + MTP_int(0) + )).done([=](const MTPmessages_Messages &result) { + searchReceived(type, result, _searchRequest); + }).fail([=](const RPCError &error) { + searchFailed(type, error, _searchRequest); + }).send(); + return _searchRequest; + }); } } @@ -1319,7 +1363,7 @@ void Widget::clearSearchCache() { _searchQueries.clear(); _searchQuery = QString(); _searchQueryFrom = nullptr; - MTP::cancel(base::take(_searchRequest)); + cancelSearchRequest(); } void Widget::showJumpToDate() { @@ -1615,12 +1659,20 @@ void Widget::removeDialog(Key key) { _inner->removeDialog(key); } -bool Widget::onCancelSearch() { - bool clearing = !_filter->getLastText().isEmpty(); +void Widget::cancelSearchRequest() { if (_searchRequest) { MTP::cancel(_searchRequest); _searchRequest = 0; } + if (_searchInHistoryRequest) { + session().data().histories().cancelRequest(_searchInHistoryRequest); + _searchInHistoryRequest = 0; + } +} + +bool Widget::onCancelSearch() { + bool clearing = !_filter->getLastText().isEmpty(); + cancelSearchRequest(); if (_searchInChat && !clearing) { if (Adaptive::OneColumn()) { if (const auto peer = _searchInChat.peer()) { @@ -1642,10 +1694,7 @@ bool Widget::onCancelSearch() { } void Widget::onCancelSearchInChat() { - if (_searchRequest) { - MTP::cancel(_searchRequest); - _searchRequest = 0; - } + cancelSearchRequest(); if (_searchInChat) { if (Adaptive::OneColumn() && !App::main()->selectingPeer()) { if (const auto peer = _searchInChat.peer()) { diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 42799d2dde..710f32c66f 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -136,6 +136,7 @@ private: const MTPcontacts_Found &result, mtpRequestId requestId); void escape(); + void cancelSearchRequest(); void setupSupportMode(); void setupConnectingWidget(); @@ -219,6 +220,7 @@ private: int32 _searchNextRate = 0; bool _searchFull = false; bool _searchFullMigrated = false; + int _searchInHistoryRequest = 0; // Not real mtpRequestId. mtpRequestId _searchRequest = 0; QMap _searchCache; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 78c3646366..0434765763 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -1920,9 +1920,7 @@ void HistoryWidget::clearDelayedShowAt() { _delayedShowAtMsgId = -1; if (_delayedShowAtRequest) { - _history->owner().histories().cancelRequest( - _history, - _delayedShowAtRequest); + _history->owner().histories().cancelRequest(_delayedShowAtRequest); _delayedShowAtRequest = 0; } } @@ -1933,15 +1931,15 @@ void HistoryWidget::clearAllLoadRequests() { auto &histories = _history->owner().histories(); clearDelayedShowAt(); if (_firstLoadRequest) { - histories.cancelRequest(_history, _firstLoadRequest); + histories.cancelRequest(_firstLoadRequest); _firstLoadRequest = 0; } if (_preloadRequest) { - histories.cancelRequest(_history, _preloadRequest); + histories.cancelRequest(_preloadRequest); _preloadRequest = 0; } if (_preloadDownRequest) { - histories.cancelRequest(_history, _preloadDownRequest); + histories.cancelRequest(_preloadDownRequest); _preloadDownRequest = 0; } } @@ -7032,6 +7030,8 @@ void HistoryWidget::synteticScrollToY(int y) { } HistoryWidget::~HistoryWidget() { - clearAllLoadRequests(); + if (_history) { + clearAllLoadRequests(); + } setTabbedPanel(nullptr); }