Move SendPreloadRequest out of HistoryWidget.
This commit is contained in:
		
							parent
							
								
									7228752a01
								
							
						
					
					
						commit
						4f4ef941c6
					
				
					 4 changed files with 103 additions and 53 deletions
				
			
		|  | @ -1097,6 +1097,8 @@ PRIVATE | ||||||
|     support/support_common.h |     support/support_common.h | ||||||
|     support/support_helper.cpp |     support/support_helper.cpp | ||||||
|     support/support_helper.h |     support/support_helper.h | ||||||
|  |     support/support_preload.cpp | ||||||
|  |     support/support_preload.h | ||||||
|     support/support_templates.cpp |     support/support_templates.cpp | ||||||
|     support/support_templates.h |     support/support_templates.h | ||||||
|     ui/chat/attach/attach_item_single_file_preview.cpp |     ui/chat/attach/attach_item_single_file_preview.cpp | ||||||
|  |  | ||||||
|  | @ -143,6 +143,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL | ||||||
| #include "core/shortcuts.h" | #include "core/shortcuts.h" | ||||||
| #include "support/support_common.h" | #include "support/support_common.h" | ||||||
| #include "support/support_autocomplete.h" | #include "support/support_autocomplete.h" | ||||||
|  | #include "support/support_preload.h" | ||||||
| #include "dialogs/dialogs_key.h" | #include "dialogs/dialogs_key.h" | ||||||
| #include "calls/calls_instance.h" | #include "calls/calls_instance.h" | ||||||
| #include "facades.h" | #include "facades.h" | ||||||
|  | @ -3387,59 +3388,10 @@ void HistoryWidget::checkSupportPreload(bool force) { | ||||||
| 	} | 	} | ||||||
| 	clearSupportPreloadRequest(); | 	clearSupportPreloadRequest(); | ||||||
| 	_supportPreloadHistory = history; | 	_supportPreloadHistory = history; | ||||||
| 	auto offsetId = MsgId(); | 	_supportPreloadRequest = Support::SendPreloadRequest(history, [=] { | ||||||
| 	auto offset = 0; | 		_supportPreloadRequest = 0; | ||||||
| 	auto loadCount = kMessagesPerPage; | 		_supportPreloadHistory = nullptr; | ||||||
| 	if (const auto around = history->loadAroundId()) { | 		crl::on_main(this, [=] { checkSupportPreload(); }); | ||||||
| 		history->getReadyFor(ShowAtUnreadMsgId); |  | ||||||
| 		offset = -loadCount / 2; |  | ||||||
| 		offsetId = around; |  | ||||||
| 	} |  | ||||||
| 	const auto offsetDate = 0; |  | ||||||
| 	const auto maxId = 0; |  | ||||||
| 	const auto minId = 0; |  | ||||||
| 	const auto historyHash = uint64(0); |  | ||||||
| 	const auto type = Data::Histories::RequestType::History; |  | ||||||
| 	auto &histories = history->owner().histories(); |  | ||||||
| 	_supportPreloadRequest = histories.sendRequest(history, type, [=](Fn<void()> finish) { |  | ||||||
| 		return history->session().api().request(MTPmessages_GetHistory( |  | ||||||
| 			history->peer->input, |  | ||||||
| 			MTP_int(offsetId), |  | ||||||
| 			MTP_int(offsetDate), |  | ||||||
| 			MTP_int(offset), |  | ||||||
| 			MTP_int(loadCount), |  | ||||||
| 			MTP_int(maxId), |  | ||||||
| 			MTP_int(minId), |  | ||||||
| 			MTP_long(historyHash) |  | ||||||
| 		)).done([=](const MTPmessages_Messages &result) { |  | ||||||
| 			if (const auto around = history->loadAroundId()) { |  | ||||||
| 				if (around != offsetId) { |  | ||||||
| 					_supportPreloadRequest = 0; |  | ||||||
| 					_supportPreloadHistory = nullptr; |  | ||||||
| 					crl::on_main(this, [=] { checkSupportPreload(); }); |  | ||||||
| 					return; |  | ||||||
| 				} |  | ||||||
| 				history->clear(History::ClearType::Unload); |  | ||||||
| 				history->getReadyFor(ShowAtUnreadMsgId); |  | ||||||
| 			} else if (offsetId) { |  | ||||||
| 				_supportPreloadRequest = 0; |  | ||||||
| 				_supportPreloadHistory = nullptr; |  | ||||||
| 				crl::on_main(this, [=] { checkSupportPreload(); }); |  | ||||||
| 				return; |  | ||||||
| 			} else { |  | ||||||
| 				history->clear(History::ClearType::Unload); |  | ||||||
| 				history->getReadyFor(ShowAtTheEndMsgId); |  | ||||||
| 			} |  | ||||||
| 			result.match([](const MTPDmessages_messagesNotModified&) { |  | ||||||
| 			}, [&](const auto &data) { |  | ||||||
| 				history->owner().processUsers(data.vusers()); |  | ||||||
| 				history->owner().processChats(data.vchats()); |  | ||||||
| 				history->addOlderSlice(data.vmessages().v); |  | ||||||
| 			}); |  | ||||||
| 			finish(); |  | ||||||
| 		}).fail([=](const MTP::Error &error) { |  | ||||||
| 			finish(); |  | ||||||
| 		}).send(); |  | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										77
									
								
								Telegram/SourceFiles/support/support_preload.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								Telegram/SourceFiles/support/support_preload.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,77 @@ | ||||||
|  | /*
 | ||||||
|  | This file is part of Telegram Desktop, | ||||||
|  | the official desktop application for the Telegram messaging service. | ||||||
|  | 
 | ||||||
|  | For license and copyright information please follow this link: | ||||||
|  | https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | ||||||
|  | */ | ||||||
|  | #include "support/support_preload.h" | ||||||
|  | 
 | ||||||
|  | #include "history/history.h" | ||||||
|  | #include "data/data_peer.h" | ||||||
|  | #include "data/data_session.h" | ||||||
|  | #include "data/data_histories.h" | ||||||
|  | #include "main/main_session.h" | ||||||
|  | #include "apiwrap.h" | ||||||
|  | 
 | ||||||
|  | namespace Support { | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  | constexpr auto kPreloadMessagesCount = 50; | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
|  | 
 | ||||||
|  | int SendPreloadRequest(not_null<History*> history, Fn<void()> retry) { | ||||||
|  | 	auto offsetId = MsgId(); | ||||||
|  | 	auto offset = 0; | ||||||
|  | 	auto loadCount = kPreloadMessagesCount; | ||||||
|  | 	if (const auto around = history->loadAroundId()) { | ||||||
|  | 		history->getReadyFor(ShowAtUnreadMsgId); | ||||||
|  | 		offset = -loadCount / 2; | ||||||
|  | 		offsetId = around; | ||||||
|  | 	} | ||||||
|  | 	const auto offsetDate = 0; | ||||||
|  | 	const auto maxId = 0; | ||||||
|  | 	const auto minId = 0; | ||||||
|  | 	const auto historyHash = uint64(0); | ||||||
|  | 	const auto type = Data::Histories::RequestType::History; | ||||||
|  | 	auto &histories = history->owner().histories(); | ||||||
|  | 	return histories.sendRequest(history, type, [=](Fn<void()> finish) { | ||||||
|  | 		return history->session().api().request(MTPmessages_GetHistory( | ||||||
|  | 			history->peer->input, | ||||||
|  | 			MTP_int(offsetId), | ||||||
|  | 			MTP_int(offsetDate), | ||||||
|  | 			MTP_int(offset), | ||||||
|  | 			MTP_int(loadCount), | ||||||
|  | 			MTP_int(maxId), | ||||||
|  | 			MTP_int(minId), | ||||||
|  | 			MTP_long(historyHash) | ||||||
|  | 		)).done([=](const MTPmessages_Messages &result) { | ||||||
|  | 			if (const auto around = history->loadAroundId()) { | ||||||
|  | 				if (around != offsetId) { | ||||||
|  | 					retry(); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				history->clear(History::ClearType::Unload); | ||||||
|  | 				history->getReadyFor(ShowAtUnreadMsgId); | ||||||
|  | 			} else if (offsetId) { | ||||||
|  | 				retry(); | ||||||
|  | 				return; | ||||||
|  | 			} else { | ||||||
|  | 				history->clear(History::ClearType::Unload); | ||||||
|  | 				history->getReadyFor(ShowAtTheEndMsgId); | ||||||
|  | 			} | ||||||
|  | 			result.match([](const MTPDmessages_messagesNotModified&) { | ||||||
|  | 			}, [&](const auto &data) { | ||||||
|  | 				history->owner().processUsers(data.vusers()); | ||||||
|  | 				history->owner().processChats(data.vchats()); | ||||||
|  | 				history->addOlderSlice(data.vmessages().v); | ||||||
|  | 			}); | ||||||
|  | 			finish(); | ||||||
|  | 		}).fail([=](const MTP::Error &error) { | ||||||
|  | 			finish(); | ||||||
|  | 		}).send(); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace Support
 | ||||||
							
								
								
									
										19
									
								
								Telegram/SourceFiles/support/support_preload.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Telegram/SourceFiles/support/support_preload.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | /*
 | ||||||
|  | This file is part of Telegram Desktop, | ||||||
|  | the official desktop application for the Telegram messaging service. | ||||||
|  | 
 | ||||||
|  | For license and copyright information please follow this link: | ||||||
|  | https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | ||||||
|  | */ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | class History; | ||||||
|  | 
 | ||||||
|  | namespace Support { | ||||||
|  | 
 | ||||||
|  | // Returns histories().request, not api().request.
 | ||||||
|  | [[nodiscard]] int SendPreloadRequest( | ||||||
|  | 	not_null<History*> history, | ||||||
|  | 	Fn<void()> retry); | ||||||
|  | 
 | ||||||
|  | } // namespace Support
 | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 John Preston
						John Preston