1 /*
2 This file is part of Telegram Desktop,
3 the official desktop application for the Telegram messaging service.
4 
5 For license and copyright information please follow this link:
6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
7 */
8 #include "data/data_peer_id.h"
9 
peerFromMTP(const MTPPeer & peer)10 PeerId peerFromMTP(const MTPPeer &peer) {
11 	return peer.match([](const MTPDpeerUser &data) {
12 		return peerFromUser(data.vuser_id());
13 	}, [](const MTPDpeerChat &data) {
14 		return peerFromChat(data.vchat_id());
15 	}, [](const MTPDpeerChannel &data) {
16 		return peerFromChannel(data.vchannel_id());
17 	});
18 }
19 
peerToMTP(PeerId id)20 MTPpeer peerToMTP(PeerId id) {
21 	if (peerIsUser(id)) {
22 		return MTP_peerUser(peerToBareMTPInt(id));
23 	} else if (peerIsChat(id)) {
24 		return MTP_peerChat(peerToBareMTPInt(id));
25 	} else if (peerIsChannel(id)) {
26 		return MTP_peerChannel(peerToBareMTPInt(id));
27 	}
28 	return MTP_peerUser(MTP_long(0));
29 }
30 
DeserializePeerId(quint64 serialized)31 PeerId DeserializePeerId(quint64 serialized) {
32 	const auto flag = (UserId::kReservedBit << 48);
33 	const auto legacy = !(serialized & (UserId::kReservedBit << 48));
34 	if (!legacy) {
35 		return PeerId(serialized & (~flag));
36 	}
37 	constexpr auto PeerIdMask = uint64(0xFFFFFFFFULL);
38 	constexpr auto PeerIdTypeMask = uint64(0xF00000000ULL);
39 	constexpr auto PeerIdUserShift = uint64(0x000000000ULL);
40 	constexpr auto PeerIdChatShift = uint64(0x100000000ULL);
41 	constexpr auto PeerIdChannelShift = uint64(0x200000000ULL);
42 	constexpr auto PeerIdFakeShift = uint64(0xF00000000ULL);
43 	return ((serialized & PeerIdTypeMask) == PeerIdUserShift)
44 		? peerFromUser(UserId(serialized & PeerIdMask))
45 		: ((serialized & PeerIdTypeMask) == PeerIdChatShift)
46 		? peerFromChat(ChatId(serialized & PeerIdMask))
47 		: ((serialized & PeerIdTypeMask) == PeerIdChannelShift)
48 		? peerFromChannel(ChannelId(serialized & PeerIdMask))
49 		: ((serialized & PeerIdTypeMask) == PeerIdFakeShift)
50 		? PeerId(FakeChatId(serialized & PeerIdMask))
51 		: PeerId(0);
52 }
53 
SerializePeerId(PeerId id)54 quint64 SerializePeerId(PeerId id) {
55 	Expects(!(id.value & (UserId::kReservedBit << 48)));
56 
57 	return id.value | (UserId::kReservedBit << 48);
58 }
59