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)10PeerId 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)20MTPpeer 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)31PeerId 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)54quint64 SerializePeerId(PeerId id) { 55 Expects(!(id.value & (UserId::kReservedBit << 48))); 56 57 return id.value | (UserId::kReservedBit << 48); 58 } 59