mtproto_response.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. #pragma once
  8. #include "base/flat_set.h"
  9. namespace MTP {
  10. class Error {
  11. public:
  12. explicit Error(const MTPrpcError &error);
  13. explicit Error(const mtpBuffer &reply);
  14. enum {
  15. NoError,
  16. TimeoutError
  17. };
  18. [[nodiscard]] int32 code() const;
  19. [[nodiscard]] const QString &type() const;
  20. [[nodiscard]] const QString &description() const;
  21. [[nodiscard]] static Error Local(
  22. const QString &type,
  23. const QString &description);
  24. [[nodiscard]] static MTPrpcError MTPLocal(
  25. const QString &type,
  26. const QString &description);
  27. private:
  28. int32 _code = 0;
  29. QString _type, _description;
  30. };
  31. inline bool IsFloodError(const QString &type) {
  32. return type.startsWith(u"FLOOD_WAIT_"_q)
  33. || type.startsWith(u"FLOOD_PREMIUM_WAIT_"_q);
  34. }
  35. inline bool IsFloodError(const Error &error) {
  36. return IsFloodError(error.type());
  37. }
  38. inline bool IsTemporaryError(const Error &error) {
  39. return error.code() < 0 || error.code() >= 500 || IsFloodError(error);
  40. }
  41. inline bool IsDefaultHandledError(const Error &error) {
  42. return IsTemporaryError(error);
  43. }
  44. struct Response {
  45. mtpBuffer reply;
  46. mtpMsgId outerMsgId = 0;
  47. mtpRequestId requestId = 0;
  48. };
  49. using DoneHandler = FnMut<bool(const Response&)>;
  50. using FailHandler = Fn<bool(const Error&, const Response&)>;
  51. struct ResponseHandler {
  52. DoneHandler done;
  53. FailHandler fail;
  54. };
  55. } // namespace MTP