| 
									
										
										
										
											2021-04-02 01:04:10 +04:00
										 |  |  | /*
 | 
					
						
							|  |  |  | 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 "data/data_peer_id.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PeerId peerFromMTP(const MTPPeer &peer) { | 
					
						
							|  |  |  | 	return peer.match([](const MTPDpeerUser &data) { | 
					
						
							|  |  |  | 		return peerFromUser(data.vuser_id()); | 
					
						
							|  |  |  | 	}, [](const MTPDpeerChat &data) { | 
					
						
							|  |  |  | 		return peerFromChat(data.vchat_id()); | 
					
						
							|  |  |  | 	}, [](const MTPDpeerChannel &data) { | 
					
						
							|  |  |  | 		return peerFromChannel(data.vchannel_id()); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MTPpeer peerToMTP(PeerId id) { | 
					
						
							|  |  |  | 	if (peerIsUser(id)) { | 
					
						
							|  |  |  | 		return MTP_peerUser(peerToBareMTPInt(id)); | 
					
						
							|  |  |  | 	} else if (peerIsChat(id)) { | 
					
						
							|  |  |  | 		return MTP_peerChat(peerToBareMTPInt(id)); | 
					
						
							|  |  |  | 	} else if (peerIsChannel(id)) { | 
					
						
							|  |  |  | 		return MTP_peerChannel(peerToBareMTPInt(id)); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-08-25 11:15:05 +03:00
										 |  |  | 	return MTP_peerUser(MTP_long(0)); | 
					
						
							| 
									
										
										
										
											2021-04-02 01:04:10 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PeerId DeserializePeerId(quint64 serialized) { | 
					
						
							|  |  |  | 	const auto flag = (UserId::kReservedBit << 48); | 
					
						
							|  |  |  | 	const auto legacy = !(serialized & (UserId::kReservedBit << 48)); | 
					
						
							|  |  |  | 	if (!legacy) { | 
					
						
							|  |  |  | 		return PeerId(serialized & (~flag)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	constexpr auto PeerIdMask = uint64(0xFFFFFFFFULL); | 
					
						
							|  |  |  | 	constexpr auto PeerIdTypeMask = uint64(0xF00000000ULL); | 
					
						
							|  |  |  | 	constexpr auto PeerIdUserShift = uint64(0x000000000ULL); | 
					
						
							|  |  |  | 	constexpr auto PeerIdChatShift = uint64(0x100000000ULL); | 
					
						
							|  |  |  | 	constexpr auto PeerIdChannelShift = uint64(0x200000000ULL); | 
					
						
							|  |  |  | 	constexpr auto PeerIdFakeShift = uint64(0xF00000000ULL); | 
					
						
							|  |  |  | 	return ((serialized & PeerIdTypeMask) == PeerIdUserShift) | 
					
						
							|  |  |  | 		? peerFromUser(UserId(serialized & PeerIdMask)) | 
					
						
							|  |  |  | 		: ((serialized & PeerIdTypeMask) == PeerIdChatShift) | 
					
						
							|  |  |  | 		? peerFromChat(ChatId(serialized & PeerIdMask)) | 
					
						
							|  |  |  | 		: ((serialized & PeerIdTypeMask) == PeerIdChannelShift) | 
					
						
							|  |  |  | 		? peerFromChannel(ChannelId(serialized & PeerIdMask)) | 
					
						
							|  |  |  | 		: ((serialized & PeerIdTypeMask) == PeerIdFakeShift) | 
					
						
							|  |  |  | 		? PeerId(FakeChatId(serialized & PeerIdMask)) | 
					
						
							|  |  |  | 		: PeerId(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | quint64 SerializePeerId(PeerId id) { | 
					
						
							|  |  |  | 	Expects(!(id.value & (UserId::kReservedBit << 48))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return id.value | (UserId::kReservedBit << 48); | 
					
						
							|  |  |  | } |