00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #ifndef _DNSAnswers_H_
00037 #define _DNSAnswers_H_
00038 
00039 #include "ErrorHandler.h"
00040 
00041 #include "DNSAnswer.h"
00042 
00043 #include <vector>
00044 
00045 namespace KomodiaDNS
00046 {
00047 
00048 class CDNSQuery;
00049 
00050 
00051 typedef struct _DnsHeaderHeader 
00052 {
00053     unsigned short      usID;               
00054     unsigned short      usOptions;          
00055     unsigned short      usQDCount;
00056     unsigned short      usANCount;
00057     unsigned short      usNSCount;
00058     unsigned short      usARCount;
00059 
00060     
00061     _DnsHeaderHeader() : usID(0),
00062                          usOptions(0),
00063                          usQDCount(0),
00064                          usANCount(0),
00065                          usNSCount(0),
00066                          usARCount(0)
00067     {
00068     }
00069 } DnsHeaderHeader;
00070 
00071 typedef DnsHeaderHeader FAR * LPDnsHeaderHeader;
00072 
00073 #define DnsHeaderHeaderLength sizeof(DnsHeaderHeader)
00074 
00075 
00076 #define DNS_QR_REQUEST 0            //Request DNS entry
00077 #define DNS_QR_REPLY (1 << 7)       //DNS reply
00078 
00079 
00080 #define DNS_OPCODE_STANDARD 0       
00081 #define DNS_OPCODE_INVERSE (1 << 3)
00082 #define DNS_OPCODE_STATUS (2 << 3)
00083 
00084 
00085 
00086 
00087 #define DNS_AA (1 << 2)
00088 
00089 
00090 
00091 
00092 
00093 #define DNS_RECURSION 1
00094 
00095 
00096 
00097 
00098 #define DNS_RECURSION_AVAILABLE (1 << 8)
00099 
00100 
00101 
00102 
00103 #define DNS_RCODE_NOERROR 0
00104 #define DNS_RCODE_FORMAT (1 << 13)
00105 #define DNS_RCODE_SERVER (2 << 13)
00106 #define DNS_RCODE_NAME (3 << 13)
00107 #define DNS_RCODE_REFUSED (5 << 13)
00108 
00109 
00110 #define DNS_SERVER_FAILURE (3 << 8)
00111 
00112 class CDNSAnswers : public CErrorHandler
00113 {
00114 public:
00115     
00116     typedef std::vector<std::string> StringAnswersVector;
00117 
00118     
00119     typedef std::vector<unsigned long> IPAnswersVector;
00120 public:
00121     
00122     
00123     
00124     
00125     std::string GetAnswerParsed(BOOL bWindowsLines=TRUE,
00126                                 BOOL bBrief=TRUE,
00127                                 BOOL bExtraLine=FALSE)const;
00128 
00129     
00130     const CDNSQuery* GetQuery()const;
00131 
00132     
00133     BOOL IsResolved()const;
00134 
00135     
00136     BOOL IsReverseAnswer()const;
00137 
00138     
00139     
00140     std::string GetAnswer()const;
00141 
00142     
00143     StringAnswersVector GetAnswers()const;
00144 
00145     
00146     
00147     unsigned long GetAIPAnswer()const;
00148 
00149     
00150     IPAnswersVector GetAIPAnswers()const;
00151 
00152     
00153     unsigned short GetDNSID() const;
00154 
00155     
00156     unsigned long GetAddress(unsigned short usIndex=0)const;
00157 
00158     
00159     const CDNSAnswer& GetAnswer(unsigned short usIndex)const;
00160 
00161     
00162     int Parse(const char *pBuffer,
00163               int iLength);
00164 
00165     
00166     CDNSAnswers();
00167     CDNSAnswers(const CDNSAnswers& rAnswers);
00168     virtual ~CDNSAnswers();
00169 private:
00170     
00171     typedef std::vector<CDNSAnswer> AnswersVector;
00172 private:
00173     
00174     CDNSAnswers& operator=(const CDNSAnswers& rAnswers);
00175 
00176     
00177     unsigned short ParseAnswers(const char *pBuffer,
00178                                 const char* pOriginalBuffer);
00179 
00180     
00181     void ReverseHeader();
00182 
00183     
00184     void UnInitialize();
00185 
00186     
00187     DnsHeaderHeader m_aDNSHeader;
00188 
00189     
00190     CDNSQuery* m_pDNSQuery;
00191     
00192     
00193     AnswersVector m_aAnswers;
00194 };
00195 
00196 
00197 }
00198 
00199 #endif