tdesktop/Telegram/SourceFiles/data/data_peer_id.cpp

59 lines
2.0 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);
}