File: data_peer_id.cpp

package info (click to toggle)
telegram-desktop 4.6.5%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 53,300 kB
  • sloc: cpp: 605,857; python: 3,978; ansic: 1,636; sh: 965; makefile: 841; objc: 652; javascript: 187; xml: 165
file content (58 lines) | stat: -rw-r--r-- 2,024 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
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);
}