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 #include "stdafx.h"
00037 #include "DNSQuery.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040
00041 #include "DNSManager.h"
00042 #include "DNSParser.h"
00043
00044 #ifdef _MEMORY_DEBUG
00045 #define new DEBUG_NEW
00046 #define malloc DEBUG_MALLOC
00047 static char THIS_FILE[] = __FILE__;
00048 #endif
00049
00050 namespace KomodiaDNS
00051 {
00052
00053 #define CDNSQuery_Class "CDNSQuery"
00054
00055 CDNSQuery::CDNSQuery() : CErrorHandler()
00056 {
00057 try
00058 {
00059
00060 SetName(CDNSQuery_Class);
00061 }
00062 ERROR_HANDLER("CDNSQuery")
00063 }
00064
00065 CDNSQuery::CDNSQuery(const CDNSQuery& rQuery) : CErrorHandler(rQuery),
00066 m_aQueries(rQuery.m_aQueries)
00067 {
00068 try
00069 {
00070
00071 SetName(CDNSQuery_Class);
00072 }
00073 ERROR_HANDLER("CDNSQuery")
00074 }
00075
00076 CDNSQuery::~CDNSQuery()
00077 {
00078 }
00079
00080 CDNSQuery& CDNSQuery::operator=(const CDNSQuery& rQuery)
00081 {
00082
00083 QueryVector aTmp(rQuery.m_aQueries);
00084 m_aQueries.swap(aTmp);
00085
00086
00087 return *this;
00088 }
00089
00090 void CDNSQuery::AddQuery(const std::string& rDomain,
00091 DNSQueryTypes aType)
00092 {
00093 try
00094 {
00095
00096 DnsQuestionHeader aData;
00097
00098
00099 aData.sName=CDNSManager::ParseAddress(rDomain);
00100 aData.usType=htons(aType);
00101 aData.usClass=htons(DNS_CLASS_INTERNET);
00102
00103
00104 m_aQueries.push_back(aData);
00105 }
00106 ERROR_HANDLER("AddQuery")
00107 }
00108
00109 unsigned short CDNSQuery::GetQuestionCount() const
00110 {
00111 return m_aQueries.size();
00112 }
00113
00114 int CDNSQuery::Parse(const char* pBuffer,
00115 int iNumber)
00116 {
00117 try
00118 {
00119
00120 const char* pBackupBuffer;
00121 pBackupBuffer=pBuffer;
00122
00123
00124 for (int iCount=0;iCount<iNumber;++iCount)
00125 {
00126
00127 std::string sParsedName;
00128
00129
00130 unsigned short usLength;
00131
00132
00133 sParsedName=CDNSParser::ParseName(pBuffer,
00134 pBuffer,
00135 usLength);
00136
00137
00138 if (!usLength)
00139 {
00140
00141 ReportError("Parse","Received zero length!");
00142
00143
00144 return NULL;
00145 }
00146
00147
00148 DnsQuestionHeader aData;
00149
00150
00151 aData.sName=sParsedName;
00152
00153
00154 pBackupBuffer+=usLength;
00155
00156
00157 memcpy(&aData.usType,
00158 pBackupBuffer,
00159 DnsQuestionCopyHeader);
00160
00161
00162 aData.usClass=htons(aData.usClass);
00163 aData.usType=htons(aData.usType);
00164
00165
00166 m_aQueries.push_back(aData);
00167
00168
00169 pBackupBuffer+=DnsQuestionCopyHeader;
00170 }
00171
00172
00173 return pBackupBuffer-pBuffer;
00174 }
00175 ERROR_HANDLER_RETURN("Parse",0)
00176 }
00177
00178 unsigned short CDNSQuery::GetSerializationSize()const
00179 {
00180 try
00181 {
00182
00183 unsigned short usSize;
00184 usSize=0;
00185
00186
00187 QueryVector::const_iterator aIterator;
00188 aIterator=m_aQueries.begin();
00189
00190
00191 while (aIterator!=m_aQueries.end())
00192 {
00193
00194 usSize+=aIterator->sName.length()+1;
00195 usSize+=sizeof(unsigned short)*2;
00196
00197
00198 ++aIterator;
00199 }
00200
00201
00202 return usSize;
00203 }
00204 ERROR_HANDLER_RETURN("GetSerializationSize",0)
00205 }
00206
00207 unsigned short CDNSQuery::SerializeQuery(char* pBuffer)const
00208 {
00209 try
00210 {
00211
00212 unsigned short usSize;
00213 usSize=0;
00214
00215
00216 QueryVector::const_iterator aIterator;
00217 aIterator=m_aQueries.begin();
00218
00219
00220 while (aIterator!=m_aQueries.end())
00221 {
00222
00223 usSize+=aIterator->sName.length()+1;
00224 usSize+=sizeof(unsigned short)*2;
00225
00226
00227 memcpy(pBuffer,
00228 aIterator->sName.c_str(),
00229 aIterator->sName.length());
00230 pBuffer+=aIterator->sName.length();
00231
00232
00233 *pBuffer=0;
00234 pBuffer++;
00235
00236
00237
00238 memcpy(pBuffer,
00239 &aIterator->usType,
00240 sizeof(aIterator->usType));
00241 pBuffer+=sizeof(unsigned short);
00242
00243
00244 memcpy(pBuffer,
00245 &aIterator->usClass,
00246 sizeof(aIterator->usClass));
00247 pBuffer+=sizeof(unsigned short);
00248
00249
00250 ++aIterator;
00251 }
00252
00253
00254 return usSize;
00255 }
00256 ERROR_HANDLER_RETURN("SerializeQuery",0)
00257 }
00258
00259 CDNSQuery::DNSQueryTypes CDNSQuery::GetFirstQueryType()const
00260 {
00261 try
00262 {
00263
00264 if (m_aQueries.empty())
00265 return ERR;
00266 else
00267 return (DNSQueryTypes)m_aQueries.front().usType;
00268 }
00269 ERROR_HANDLER_RETURN("GetFirstQueryType",ERR)
00270 }
00271
00272 int CDNSQuery::GetQueryCount()const
00273 {
00274 return m_aQueries.size();
00275 }
00276
00277 const DnsQuestionHeader& CDNSQuery::GetQuery(int iIndex)const
00278 {
00279 return m_aQueries[iIndex];
00280 }
00281
00282 std::string CDNSQuery::GetQueryString(int iIndex)const
00283 {
00284 try
00285 {
00286
00287 std::string sName;
00288 sName=m_aQueries[iIndex].sName;
00289
00290
00291 return CDNSParser::ConvertName(sName);
00292 }
00293 ERROR_HANDLER_RETURN("GetQueryString","")
00294 }
00295
00296
00297 }