// // Created by robin on 2/12/18. // #ifndef QDNSAGG_QDNSAXFRCLIENT_H #define QDNSAGG_QDNSAXFRCLIENT_H #include #include #include "QDnsUdpClient.h" #include "QDnsTcpClient.h" namespace QDns { namespace Client { class QDnsAxfrClient : public QObject { Q_OBJECT public: enum ErrorCode { Unknown = 0, ClientError = 1, NoFirstSOA = 2, NoLastSOA = 3, ExtraRecords = 4 }; Q_ENUM(ErrorCode) struct OnAnswerParams { quint64 reserved; QList records; }; struct OnErrorParams { quint64 reserved; ErrorCode error; QDnsClient::OnErrorParams clientError; }; explicit QDnsAxfrClient(const QString& zone, const QHostAddress& host, quint16 port = 53, QObject* parent = nullptr); signals: void onAnswer(OnAnswerParams); void onError(OnErrorParams); public slots: void transfer(); private slots: void onClientStateChanged(const QDnsClient::OnStateChangedParams& params); void onClientAnswer(const QDnsClient::OnAnswerParams& params); void onClientError(const QDnsClient::OnErrorParams& params); private: enum AxfrStatus { FirstSOA, Records, LastSOA }; void processPacket(const QDns::Base::QDnsPacket& packet); QString m_zone; AxfrStatus m_status; QDns::Client::QDnsUdpClient* m_udpClient; QDns::Client::QDnsTcpClient* m_tcpClient; QList m_records; }; } } #endif //QDNSAGG_QDNSAXFRCLIENT_H