#ifndef WWWI_MIND_DNSPACKET_H
#define WWWI_MIND_DNSPACKET_H
#include "mind.h"
#include "buffer.h"
#include "request.h"
#include "rrlist.h"
#include "response.h"
using WWWI::SockAddrIn;
class DNSPacket : public Buffer {
public:
DNSPacket(void);
DNSPacket(SockAddrIn* &i_siprRemote, unsigned short i_usID, QuestionConstPtr ci_qnp);
DNSPacket(SockAddrIn* &i_siprRemote, unsigned short i_usID, RequestConstPtr ci_rqp, ResponseConstPtr i_rsp = NULL);
void Format(unsigned short i_usID, RequestConstPtr ci_rqp, ResponseConstPtr ci_rsp = NULL);
void Parse(unsigned short &io_usrID, RequestPtr &o_rqpr, ResponsePtr &o_rspr) const;
void ReadQuestion(QuestionPtr &o_qnpr) const;
void ReadRR(RRPtr &o_rrpr) const;
void ReadRRList(RRListPtr &o_rlpr, unsigned short i_usCount) const;
inline SockAddrIn *RemoveAddr(void);
inline bool TestID(unsigned short i_usID) const;
void WriteQuestion(QuestionConstPtr ci_qnp);
void WriteRR(RRConstPtr ci_rrp);
unsigned short WriteRRList(RRListConstPtr ci_rlp);
~DNSPacket(void);
protected:
SockAddrIn *m_sipRemote;
static const size_t scm_szPacketMax = 512;
off_t m_ofRollBack;
friend class DNSSocket;
};
DECL_POINTER_TYPES(DNSPacket)
ostream& operator<<(ostream& io_smr, const DNSPacket &ci_dpr);
ostream& operator<<(ostream& io_smr, DNSPacketConstPtr ci_dpp);
#include "dnspacket.i"
#endif