/* 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 */ #pragma once #include "mtproto/details/mtproto_domain_resolver.h" #include "base/bytes.h" #include "base/weak_ptr.h" #include #include #include namespace MTP::details { class SpecialConfigRequest : public QObject { public: SpecialConfigRequest( Fn callback, const QString &domainString, const QString &phone); SpecialConfigRequest( Fn timeDoneCallback, const QString &domainString); private: enum class Type { Mozilla, Google, RemoteConfig, Realtime, FireStore, }; struct Attempt { Type type; QString data; QString host; }; SpecialConfigRequest( Fn callback, Fn timeDoneCallback, const QString &domainString, const QString &phone); void sendNextRequest(); void performRequest(const Attempt &attempt); void requestFinished(Type type, not_null reply); void handleHeaderUnixtime(not_null reply); QByteArray finalizeRequest(not_null reply); void handleResponse(const QByteArray &bytes); bool decryptSimpleConfig(const QByteArray &bytes); Fn _callback; Fn _timeDoneCallback; QString _domainString; QString _phone; MTPhelp_ConfigSimple _simpleConfig; QNetworkAccessManager _manager; std::vector _attempts; std::vector _requests; }; } // namespace MTP::details