58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2 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
 | |
| */
 | |
| #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));
 | |
| 	}
 | |
| 	return MTP_peerUser(MTP_long(0));
 | |
| }
 | |
| 
 | |
| 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);
 | |
| }
 | 
