data_peer_id.cpp 2.0 KB

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