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);
 | 
						|
}
 |