172 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| 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
 | |
| 
 | |
| #include <rpl/event_stream.h>
 | |
| #include "storage/storage_facade.h"
 | |
| #include "data/data_feed_messages.h"
 | |
| 
 | |
| namespace Storage {
 | |
| 
 | |
| struct FeedMessagesAddNew {
 | |
| 	FeedMessagesAddNew(FeedId feedId, Data::MessagePosition messageId)
 | |
| 	: feedId(feedId)
 | |
| 	, messageId(messageId) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 	Data::MessagePosition messageId;
 | |
| 
 | |
| };
 | |
| 
 | |
| struct FeedMessagesAddSlice {
 | |
| 	FeedMessagesAddSlice(
 | |
| 		FeedId feedId,
 | |
| 		std::vector<Data::MessagePosition> &&messageIds,
 | |
| 		Data::MessagesRange noSkipRange)
 | |
| 	: feedId(feedId)
 | |
| 	, messageIds(std::move(messageIds))
 | |
| 	, noSkipRange(noSkipRange) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 	std::vector<Data::MessagePosition> messageIds;
 | |
| 	Data::MessagesRange noSkipRange;
 | |
| 
 | |
| };
 | |
| 
 | |
| struct FeedMessagesRemoveOne {
 | |
| 	FeedMessagesRemoveOne(
 | |
| 		FeedId feedId,
 | |
| 		Data::MessagePosition messageId)
 | |
| 	: feedId(feedId)
 | |
| 	, messageId(messageId) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 	Data::MessagePosition messageId;
 | |
| 
 | |
| };
 | |
| 
 | |
| struct FeedMessagesRemoveAll {
 | |
| 	FeedMessagesRemoveAll(FeedId feedId, ChannelId channelId)
 | |
| 	: feedId(feedId)
 | |
| 	, channelId(channelId) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 	ChannelId channelId = 0;
 | |
| 
 | |
| };
 | |
| 
 | |
| struct FeedMessagesInvalidate {
 | |
| 	explicit FeedMessagesInvalidate(FeedId feedId)
 | |
| 	: feedId(feedId) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 
 | |
| };
 | |
| 
 | |
| struct FeedMessagesInvalidateBottom {
 | |
| 	explicit FeedMessagesInvalidateBottom(FeedId feedId)
 | |
| 	: feedId(feedId) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| struct FeedMessagesKey {
 | |
| 	FeedMessagesKey(
 | |
| 		FeedId feedId,
 | |
| 		Data::MessagePosition position)
 | |
| 	: feedId(feedId)
 | |
| 	, position(position) {
 | |
| 	}
 | |
| 
 | |
| 	bool operator==(const FeedMessagesKey &other) const {
 | |
| 		return (feedId == other.feedId)
 | |
| 			&& (position == other.position);
 | |
| 	}
 | |
| 	bool operator!=(const FeedMessagesKey &other) const {
 | |
| 		return !(*this == other);
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 	Data::MessagePosition position;
 | |
| 
 | |
| };
 | |
| 
 | |
| struct FeedMessagesQuery {
 | |
| 	FeedMessagesQuery(
 | |
| 		FeedMessagesKey key,
 | |
| 		int limitBefore,
 | |
| 		int limitAfter)
 | |
| 	: key(key)
 | |
| 	, limitBefore(limitBefore)
 | |
| 	, limitAfter(limitAfter) {
 | |
| 	}
 | |
| 
 | |
| 	FeedMessagesKey key;
 | |
| 	int limitBefore = 0;
 | |
| 	int limitAfter = 0;
 | |
| 
 | |
| };
 | |
| 
 | |
| using FeedMessagesResult = Data::MessagesResult;
 | |
| 
 | |
| struct FeedMessagesSliceUpdate {
 | |
| 	FeedMessagesSliceUpdate(
 | |
| 		FeedId feedId,
 | |
| 		Data::MessagesSliceUpdate &&data)
 | |
| 	: feedId(feedId)
 | |
| 	, data(std::move(data)) {
 | |
| 	}
 | |
| 
 | |
| 	FeedId feedId = 0;
 | |
| 	Data::MessagesSliceUpdate data;
 | |
| 
 | |
| };
 | |
| 
 | |
| class FeedMessages {
 | |
| public:
 | |
| 	void add(FeedMessagesAddNew &&query);
 | |
| 	void add(FeedMessagesAddSlice &&query);
 | |
| 	void remove(FeedMessagesRemoveOne &&query);
 | |
| 	void remove(FeedMessagesRemoveAll &&query);
 | |
| 	void invalidate(FeedMessagesInvalidate &&query);
 | |
| 	void invalidate(FeedMessagesInvalidateBottom &&query);
 | |
| 
 | |
| 	rpl::producer<FeedMessagesResult> query(
 | |
| 		FeedMessagesQuery &&query) const;
 | |
| 	rpl::producer<FeedMessagesSliceUpdate> sliceUpdated() const;
 | |
| 	rpl::producer<FeedMessagesRemoveOne> oneRemoved() const;
 | |
| 	rpl::producer<FeedMessagesRemoveAll> allRemoved() const;
 | |
| 	rpl::producer<FeedMessagesInvalidate> invalidated() const;
 | |
| 	rpl::producer<FeedMessagesInvalidateBottom> bottomInvalidated() const;
 | |
| 
 | |
| private:
 | |
| 	using List = Data::MessagesList;
 | |
| 
 | |
| 	std::map<FeedId, List>::iterator enforceLists(FeedId feedId);
 | |
| 
 | |
| 	std::map<FeedId, List> _lists;
 | |
| 
 | |
| 	rpl::event_stream<FeedMessagesSliceUpdate> _sliceUpdated;
 | |
| 	rpl::event_stream<FeedMessagesRemoveOne> _oneRemoved;
 | |
| 	rpl::event_stream<FeedMessagesRemoveAll> _allRemoved;
 | |
| 	rpl::event_stream<FeedMessagesInvalidate> _invalidated;
 | |
| 	rpl::event_stream<FeedMessagesInvalidateBottom> _bottomInvalidated;
 | |
| 
 | |
| 	rpl::lifetime _lifetime;
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace Storage
 | 
