
Definition at line 208 of file q3dns.cpp.
Public Member Functions | |
| Q3DnsAnswer (Q3DnsQuery *) | |
| Q3DnsAnswer (const QByteArray &, Q3DnsQuery *) | |
| ~Q3DnsAnswer () | |
| void | parse () |
| void | notify () |
Public Attributes | |
| bool | ok |
Private Member Functions | |
| QString | readString (bool multipleLabels=true) |
| void | parseA () |
| void | parseAaaa () |
| void | parseMx () |
| void | parseSrv () |
| void | parseCname () |
| void | parsePtr () |
| void | parseTxt () |
| void | parseNs () |
Private Attributes | |
| Q3DnsQuery * | query |
| Q_UINT8 * | answer |
| int | size |
| int | pp |
| Q3PtrList< Q3DnsRR > * | rrs |
| int | next |
| int | ttl |
| QString | label |
| Q3DnsRR * | rr |
| Q3DnsAnswer::Q3DnsAnswer | ( | Q3DnsQuery * | ) |
Definition at line 264 of file q3dns.cpp.
References answer, Q3PtrList< type >::append(), QString::clear(), Q3DnsRR::current, Q3DnsRR::deleteTime, Q3DnsRR::expireTime, Q3DnsQuery::l, label, next, Q3DnsRR::nxdomain, ok, pp, query, rr, rrs, Q3PtrCollection::setAutoDelete(), size, Q3DnsQuery::started, Q3DnsQuery::t, Q3DnsRR::t, and ttl.
00265 { 00266 ok = true; 00267 00268 answer = 0; 00269 size = 0; 00270 query = query_; 00271 pp = 0; 00272 rrs = new Q3PtrList<Q3DnsRR>; 00273 rrs->setAutoDelete( false ); 00274 next = size; 00275 ttl = 0; 00276 label.clear(); 00277 rr = 0; 00278 00279 Q3DnsRR * newrr = new Q3DnsRR( query->l ); 00280 newrr->t = query->t; 00281 newrr->deleteTime = query->started + 10; 00282 newrr->expireTime = query->started + 10; 00283 newrr->nxdomain = true; 00284 newrr->current = true; 00285 rrs->append( newrr ); 00286 }
Here is the call graph for this function:

| Q3DnsAnswer::Q3DnsAnswer | ( | const QByteArray & | , | |
| Q3DnsQuery * | ||||
| ) |
Definition at line 289 of file q3dns.cpp.
References answer, QString::clear(), QByteArray::data(), int, label, next, ok, pp, query, rr, rrs, Q3PtrCollection::setAutoDelete(), QByteArray::size(), size, and ttl.
00291 { 00292 ok = true; 00293 00294 answer = (Q_UINT8 *)(answer_.data()); 00295 size = (int)answer_.size(); 00296 query = query_; 00297 pp = 0; 00298 rrs = new Q3PtrList<Q3DnsRR>; 00299 rrs->setAutoDelete( false ); 00300 next = size; 00301 ttl = 0; 00302 label.clear(); 00303 rr = 0; 00304 }
Here is the call graph for this function:

| Q3DnsAnswer::~Q3DnsAnswer | ( | ) |
Definition at line 307 of file q3dns.cpp.
References Q3PtrListIterator< type >::current(), Q3Dns::None, ok, rrs, and Q3DnsRR::t.
00308 { 00309 if ( !ok && rrs ) { 00310 Q3PtrListIterator<Q3DnsRR> it( *rrs ); 00311 Q3DnsRR * tmprr; 00312 while( (tmprr=it.current()) != 0 ) { 00313 ++it; 00314 tmprr->t = Q3Dns::None; // will be deleted soonish 00315 } 00316 } 00317 delete rrs; 00318 }
Here is the call graph for this function:

| void Q3DnsAnswer::parse | ( | ) |
Definition at line 560 of file q3dns.cpp.
References Q3Dns::A, Q3Dns::Aaaa, Q3DnsRR::address, answer, Q3PtrList< type >::append(), Q3PtrList< type >::current(), Q3DnsRR::current, Q3DnsRR::deleteTime, Q3DnsRR::domain, Q3DnsRR::expireTime, Q3PtrList< type >::first(), QString::isNull(), Q3DnsQuery::l, label, QString::length(), Q3DnsDomain::name(), next, Q3PtrList< type >::next(), Q3Dns::None, Q3DnsRR::nxdomain, ok, parseA(), parseAaaa(), parseCname(), parseMx(), parseNs(), parsePtr(), parseSrv(), parseTxt(), Q3DnsRR::port, pp, Q3DnsRR::priority, qDebug(), query, readString(), rr, rrs, Q3DnsDomain::rrs, size, Q3DnsQuery::started, Q3DnsQuery::t, Q3DnsRR::t, Q3DnsRR::target, Q3DnsRR::text, ttl, type, used, and Q3DnsRR::weight.
00561 { 00562 // okay, do the work... 00563 if ( (answer[2] & 0x78) != 0 ) { 00564 #if defined(Q3DNS_DEBUG) 00565 qDebug( "DNS Manager: answer to wrong query type (%d)", answer[1] ); 00566 #endif 00567 ok = false; 00568 return; 00569 } 00570 00571 // AA 00572 bool aa = (answer[2] & 4) != 0; 00573 00574 // TC 00575 if ( (answer[2] & 2) != 0 ) { 00576 #if defined(Q3DNS_DEBUG) 00577 qDebug( "DNS Manager: truncated answer; pressing on" ); 00578 #endif 00579 } 00580 00581 // RD 00582 bool rd = (answer[2] & 1) != 0; 00583 00584 // we don't test RA 00585 // we don't test the MBZ fields 00586 00587 if ( (answer[3] & 0x0f) == 3 ) { 00588 #if defined(Q3DNS_DEBUG) 00589 qDebug( "DNS Manager: saw NXDomain for %s", query->l.ascii() ); 00590 #endif 00591 // NXDomain. cache that for one minute. 00592 rr = new Q3DnsRR( query->l ); 00593 rr->t = query->t; 00594 rr->deleteTime = query->started + 60; 00595 rr->expireTime = query->started + 60; 00596 rr->nxdomain = true; 00597 rr->current = true; 00598 rrs->append( rr ); 00599 return; 00600 } 00601 00602 if ( (answer[3] & 0x0f) != 0 ) { 00603 #if defined(Q3DNS_DEBUG) 00604 qDebug( "DNS Manager: error code %d", answer[3] & 0x0f ); 00605 #endif 00606 ok = false; 00607 return; 00608 } 00609 00610 int qdcount = ( answer[4] << 8 ) + answer[5]; 00611 int ancount = ( answer[6] << 8 ) + answer[7]; 00612 int nscount = ( answer[8] << 8 ) + answer[9]; 00613 int adcount = (answer[10] << 8 ) +answer[11]; 00614 00615 pp = 12; 00616 00617 // read query 00618 while( qdcount > 0 && pp < size ) { 00619 // should I compare the string against query->l? 00620 (void)readString(); 00621 if ( !ok ) 00622 return; 00623 pp += 4; 00624 qdcount--; 00625 } 00626 00627 // answers and stuff 00628 int rrno = 0; 00629 // if we parse the answer completely, but there are no answers, 00630 // ignore the entire thing. 00631 int answers = 0; 00632 while( ( rrno < ancount || 00633 ( ok && answers >0 && rrno < ancount + nscount + adcount ) ) && 00634 pp < size ) { 00635 label = readString().lower(); 00636 if ( !ok ) 00637 return; 00638 int rdlength = 0; 00639 if ( pp + 10 <= size ) 00640 rdlength = ( answer[pp+8] << 8 ) + answer[pp+9]; 00641 if ( pp + 10 + rdlength > size ) { 00642 #if defined(Q3DNS_DEBUG) 00643 qDebug( "DNS Manager: ran out of stuff to parse (%d+%d>%d (%d)", 00644 pp, rdlength, size, rrno < ancount ); 00645 #endif 00646 // if we're still in the AN section, we should go back and 00647 // at least down the TTLs. probably best to invalidate 00648 // the results. 00649 // the rrs list is good for this 00650 ok = ( rrno < ancount ); 00651 return; 00652 } 00653 uint type, clas; 00654 type = ( answer[pp+0] << 8 ) + answer[pp+1]; 00655 clas = ( answer[pp+2] << 8 ) + answer[pp+3]; 00656 ttl = ( answer[pp+4] << 24 ) + ( answer[pp+5] << 16 ) + 00657 ( answer[pp+6] << 8 ) + answer[pp+7]; 00658 pp = pp + 10; 00659 if ( clas != 1 ) { 00660 #if defined(Q3DNS_DEBUG) 00661 qDebug( "DNS Manager: class %d (not internet) for %s", 00662 clas, label.isNull() ? "." : label.ascii() ); 00663 #endif 00664 } else { 00665 next = pp + rdlength; 00666 rr = 0; 00667 switch( type ) { 00668 case 1: 00669 parseA(); 00670 break; 00671 case 28: 00672 parseAaaa(); 00673 break; 00674 case 15: 00675 parseMx(); 00676 break; 00677 case 33: 00678 parseSrv(); 00679 break; 00680 case 5: 00681 parseCname(); 00682 break; 00683 case 12: 00684 parsePtr(); 00685 break; 00686 case 16: 00687 parseTxt(); 00688 break; 00689 case 2: 00690 parseNs(); 00691 break; 00692 default: 00693 // something we don't know 00694 #if defined(Q3DNS_DEBUG) 00695 qDebug( "DNS Manager: type %d for %s", type, 00696 label.isNull() ? "." : label.ascii() ); 00697 #endif 00698 break; 00699 } 00700 if ( rr ) { 00701 rr->deleteTime = 0; 00702 if ( ttl > 0 ) 00703 rr->expireTime = query->started + ttl; 00704 else 00705 rr->expireTime = query->started + 20; 00706 if ( rrno < ancount ) { 00707 answers++; 00708 rr->deleteTime = rr->expireTime; 00709 } 00710 rr->current = true; 00711 rrs->append( rr ); 00712 } 00713 } 00714 if ( !ok ) 00715 return; 00716 pp = next; 00717 next = size; 00718 rrno++; 00719 } 00720 if ( answers == 0 ) { 00721 #if defined(Q3DNS_DEBUG) 00722 qDebug( "DNS Manager: answer contained no answers" ); 00723 #endif 00724 ok = ( aa && rd ); 00725 } 00726 00727 // now go through the list and mark all the As that are referenced 00728 // by something we care about. we want to cache such As. 00729 rrs->first(); 00730 Q3Dict<void> used( 17 ); 00731 used.setAutoDelete( false ); 00732 while( (rr=rrs->current()) != 0 ) { 00733 rrs->next(); 00734 if ( rr->target.length() && rr->deleteTime > 0 && rr->current ) 00735 used.insert( rr->target, (void*)42 ); 00736 if ( ( rr->t == Q3Dns::A || rr->t == Q3Dns::Aaaa ) && 00737 used.find( rr->domain->name() ) != 0 ) 00738 rr->deleteTime = rr->expireTime; 00739 } 00740 00741 // next, for each RR, delete any older RRs that are equal to it 00742 rrs->first(); 00743 while( (rr=rrs->current()) != 0 ) { 00744 rrs->next(); 00745 if ( rr && rr->domain && rr->domain->rrs ) { 00746 Q3PtrList<Q3DnsRR> * drrs = rr->domain->rrs; 00747 drrs->first(); 00748 Q3DnsRR * older; 00749 while( (older=drrs->current()) != 0 ) { 00750 if ( older != rr && 00751 older->t == rr->t && 00752 older->nxdomain == rr->nxdomain && 00753 older->address == rr->address && 00754 older->target == rr->target && 00755 older->priority == rr->priority && 00756 older->weight == rr->weight && 00757 older->port == rr->port && 00758 older->text == rr->text ) { 00759 // well, it's equal, but it's not the same. so we kill it, 00760 // but use its expiry time. 00761 #if defined(Q3DNS_DEBUG) 00762 qDebug( "killing off old %d for %s, expire was %d", 00763 older->t, older->domain->name().latin1(), 00764 rr->expireTime ); 00765 #endif 00766 older->t = Q3Dns::None; 00767 rr->expireTime = QMAX( older->expireTime, rr->expireTime ); 00768 rr->deleteTime = QMAX( older->deleteTime, rr->deleteTime ); 00769 older->deleteTime = 0; 00770 #if defined(Q3DNS_DEBUG) 00771 qDebug( " adjusted expire is %d", rr->expireTime ); 00772 #endif 00773 } 00774 drrs->next(); 00775 } 00776 } 00777 } 00778 00779 #if defined(Q3DNS_DEBUG) 00780 //qDebug( "DNS Manager: ()" ); 00781 #endif 00782 }
Here is the call graph for this function:

| void Q3DnsAnswer::notify | ( | ) |
Definition at line 791 of file q3dns.cpp.
References Q3PtrList< type >::count(), Q3PtrDictIterator< type >::current(), Q3DnsQuery::dns, Q3PtrDict< type >::find(), Q3PtrDict< type >::insert(), Q3DnsQuery::l, Q3Dns::label(), n, ok, qDebug(), query, rrs, Q3PtrCollection::setAutoDelete(), and Q3PtrDictIterator< type >::toFirst().
00792 { 00793 if ( !rrs || !ok || !query || !query->dns ) 00794 return; 00795 00796 Q3PtrDict<void> notified; 00797 notified.setAutoDelete( false ); 00798 00799 Q3PtrDictIterator<void> it( *query->dns ); 00800 Q3Dns * dns; 00801 it.toFirst(); 00802 while( (dns=(Q3Dns*)(it.current())) != 0 ) { 00803 ++it; 00804 if ( notified.find( (void*)dns ) == 0 ) { 00805 notified.insert( (void*)dns, (void*)42 ); 00806 if ( rrs->count() == 0 ) { 00807 #if defined(Q3DNS_DEBUG) 00808 qDebug( "DNS Manager: found no answers!" ); 00809 #endif 00810 dns->d->noNames = true; 00811 ((Q3DnsUgleHack*)dns)->ugle( true ); 00812 } else { 00813 QStringList n = dns->qualifiedNames(); 00814 if ( n.contains(query->l) ) 00815 ((Q3DnsUgleHack*)dns)->ugle(); 00816 #if defined(Q3DNS_DEBUG) 00817 else 00818 qDebug( "DNS Manager: DNS thing %s not notified for %s", 00819 dns->label().ascii(), query->l.ascii() ); 00820 #endif 00821 } 00822 } 00823 } 00824 }
Here is the call graph for this function:

| QString Q3DnsAnswer::readString | ( | bool | multipleLabels = true |
) | [private] |
Definition at line 321 of file q3dns.cpp.
References answer, b, QString::isNull(), ok, p, pp, and size.
Referenced by parse(), parseCname(), parseMx(), parseNs(), parsePtr(), parseSrv(), and parseTxt().
00322 { 00323 int p = pp; 00324 QString r; 00325 Q_UINT8 b; 00326 for( ;; ) { 00327 b = 128; 00328 // Read one character 00329 if ( p >= 0 && p < size ) 00330 b = answer[p]; 00331 00332 switch( b >> 6 ) { 00333 case 0: 00334 // b is less than 64 00335 p++; 00336 00337 // Detect end of data 00338 if ( b == 0 ) { 00339 if ( p > pp ) 00340 pp = p; 00341 return r.isNull() ? QString( "." ) : r; 00342 } 00343 00344 // Read a label of size 'b' characters 00345 if ( !r.isNull() ) 00346 r += '.'; 00347 while( b-- > 0 ) 00348 r += QChar( answer[p++] ); 00349 00350 // Return immediately if we were only supposed to read one 00351 // label. 00352 if (!multipleLabels) 00353 return r; 00354 00355 break; 00356 default: 00357 // Ignore unrecognized control character, or p was out of 00358 // range. 00359 goto not_ok; 00360 case 3: 00361 // Use the next character to determine the relative offset 00362 // to jump to before continuing the packet parsing. 00363 int q = ( (answer[p] & 0x3f) << 8 ) + answer[p+1]; 00364 00365 if ( q >= pp || q >= p ) 00366 goto not_ok; 00367 if ( p >= pp ) 00368 pp = p + 2; 00369 p = q; 00370 } 00371 } 00372 not_ok: 00373 ok = false; 00374 return QString(); 00375 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseA | ( | ) | [private] |
Definition at line 379 of file q3dns.cpp.
References Q3Dns::A, Q3DnsRR::address, answer, label, next, pp, qDebug(), rr, Q3DnsRR::t, QHostAddress::toString(), and ttl.
Referenced by parse().
00380 { 00381 if ( next != pp + 4 ) { 00382 #if defined(Q3DNS_DEBUG) 00383 qDebug( "Q3Dns: saw %d bytes long IN A for %s", 00384 next - pp, label.ascii() ); 00385 #endif 00386 return; 00387 } 00388 00389 rr = new Q3DnsRR( label ); 00390 rr->t = Q3Dns::A; 00391 rr->address = QHostAddress( ( answer[pp+0] << 24 ) + 00392 ( answer[pp+1] << 16 ) + 00393 ( answer[pp+2] << 8 ) + 00394 ( answer[pp+3] ) ); 00395 #if defined(Q3DNS_DEBUG) 00396 qDebug( "Q3Dns: saw %s IN A %s (ttl %d)", label.ascii(), 00397 rr->address.toString().ascii(), ttl ); 00398 #endif 00399 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseAaaa | ( | ) | [private] |
Definition at line 402 of file q3dns.cpp.
References Q3Dns::Aaaa, Q3DnsRR::address, answer, label, next, pp, qDebug(), rr, Q3DnsRR::t, QHostAddress::toString(), and ttl.
Referenced by parse().
00403 { 00404 if ( next != pp + 16 ) { 00405 #if defined(Q3DNS_DEBUG) 00406 qDebug( "Q3Dns: saw %d bytes long IN Aaaa for %s", 00407 next - pp, label.ascii() ); 00408 #endif 00409 return; 00410 } 00411 00412 rr = new Q3DnsRR( label ); 00413 rr->t = Q3Dns::Aaaa; 00414 rr->address = QHostAddress( answer+pp ); 00415 #if defined(Q3DNS_DEBUG) 00416 qDebug( "Q3Dns: saw %s IN Aaaa %s (ttl %d)", label.ascii(), 00417 rr->address.toString().ascii(), ttl ); 00418 #endif 00419 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseMx | ( | ) | [private] |
Definition at line 423 of file q3dns.cpp.
References answer, label, Q3Dns::Mx, next, ok, pp, Q3DnsRR::priority, qDebug(), readString(), rr, Q3DnsRR::t, Q3DnsRR::target, and ttl.
Referenced by parse().
00424 { 00425 if ( next < pp + 2 ) { 00426 #if defined(Q3DNS_DEBUG) 00427 qDebug( "Q3Dns: saw %d bytes long IN MX for %s", 00428 next - pp, label.ascii() ); 00429 #endif 00430 return; 00431 } 00432 00433 rr = new Q3DnsRR( label ); 00434 rr->priority = (answer[pp] << 8) + answer[pp+1]; 00435 pp += 2; 00436 rr->target = readString().lower(); 00437 if ( !ok ) { 00438 #if defined(Q3DNS_DEBUG) 00439 qDebug( "Q3Dns: saw bad string in MX for %s", label.ascii() ); 00440 #endif 00441 return; 00442 } 00443 rr->t = Q3Dns::Mx; 00444 #if defined(Q3DNS_DEBUG) 00445 qDebug( "Q3Dns: saw %s IN MX %d %s (ttl %d)", label.ascii(), 00446 rr->priority, rr->target.ascii(), ttl ); 00447 #endif 00448 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseSrv | ( | ) | [private] |
Definition at line 451 of file q3dns.cpp.
References answer, label, next, ok, Q3DnsRR::port, pp, Q3DnsRR::priority, qDebug(), readString(), rr, Q3Dns::Srv, Q3DnsRR::t, Q3DnsRR::target, ttl, and Q3DnsRR::weight.
Referenced by parse().
00452 { 00453 if ( next < pp + 6 ) { 00454 #if defined(Q3DNS_DEBUG) 00455 qDebug( "Q3Dns: saw %d bytes long IN SRV for %s", 00456 next - pp, label.ascii() ); 00457 #endif 00458 return; 00459 } 00460 00461 rr = new Q3DnsRR( label ); 00462 rr->priority = (answer[pp] << 8) + answer[pp+1]; 00463 rr->weight = (answer[pp+2] << 8) + answer[pp+3]; 00464 rr->port = (answer[pp+4] << 8) + answer[pp+5]; 00465 pp += 6; 00466 rr->target = readString().lower(); 00467 if ( !ok ) { 00468 #if defined(Q3DNS_DEBUG) 00469 qDebug( "Q3Dns: saw bad string in SRV for %s", label.ascii() ); 00470 #endif 00471 return; 00472 } 00473 rr->t = Q3Dns::Srv; 00474 #if defined(Q3DNS_DEBUG) 00475 qDebug( "Q3Dns: saw %s IN SRV %d %d %d %s (ttl %d)", label.ascii(), 00476 rr->priority, rr->weight, rr->port, rr->target.ascii(), ttl ); 00477 #endif 00478 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseCname | ( | ) | [private] |
Definition at line 481 of file q3dns.cpp.
References Q3Dns::Cname, label, ok, qDebug(), readString(), rr, Q3DnsRR::t, Q3DnsRR::target, and ttl.
Referenced by parse().
00482 { 00483 QString target = readString().lower(); 00484 if ( !ok ) { 00485 #if defined(Q3DNS_DEBUG) 00486 qDebug( "Q3Dns: saw bad cname for for %s", label.ascii() ); 00487 #endif 00488 return; 00489 } 00490 00491 rr = new Q3DnsRR( label ); 00492 rr->t = Q3Dns::Cname; 00493 rr->target = target; 00494 #if defined(Q3DNS_DEBUG) 00495 qDebug( "Q3Dns: saw %s IN CNAME %s (ttl %d)", label.ascii(), 00496 rr->target.ascii(), ttl ); 00497 #endif 00498 }
Here is the call graph for this function:

| void Q3DnsAnswer::parsePtr | ( | ) | [private] |
Definition at line 520 of file q3dns.cpp.
References label, ok, Q3Dns::Ptr, qDebug(), readString(), rr, Q3DnsRR::t, Q3DnsRR::target, and ttl.
Referenced by parse().
00521 { 00522 QString target = readString().lower(); 00523 if ( !ok ) { 00524 #if defined(Q3DNS_DEBUG) 00525 qDebug( "Q3Dns: saw bad PTR for for %s", label.ascii() ); 00526 #endif 00527 return; 00528 } 00529 00530 rr = new Q3DnsRR( label ); 00531 rr->t = Q3Dns::Ptr; 00532 rr->target = target; 00533 #if defined(Q3DNS_DEBUG) 00534 qDebug( "Q3Dns: saw %s IN PTR %s (ttl %d)", label.ascii(), 00535 rr->target.ascii(), ttl ); 00536 #endif 00537 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseTxt | ( | ) | [private] |
Definition at line 540 of file q3dns.cpp.
References label, ok, qDebug(), readString(), rr, Q3DnsRR::t, Q3DnsRR::text, ttl, and Q3Dns::Txt.
Referenced by parse().
00541 { 00542 QString text = readString(false); 00543 if ( !ok ) { 00544 #if defined(Q3DNS_DEBUG) 00545 qDebug( "Q3Dns: saw bad TXT for for %s", label.ascii() ); 00546 #endif 00547 return; 00548 } 00549 00550 rr = new Q3DnsRR( label ); 00551 rr->t = Q3Dns::Txt; 00552 rr->text = text; 00553 #if defined(Q3DNS_DEBUG) 00554 qDebug( "Q3Dns: saw %s IN TXT \"%s\" (ttl %d)", label.ascii(), 00555 rr->text.ascii(), ttl ); 00556 #endif 00557 }
Here is the call graph for this function:

| void Q3DnsAnswer::parseNs | ( | ) | [private] |
Definition at line 501 of file q3dns.cpp.
References label, ok, qDebug(), readString(), and ttl.
Referenced by parse().
00502 { 00503 QString target = readString().lower(); 00504 if ( !ok ) { 00505 #if defined(Q3DNS_DEBUG) 00506 qDebug( "Q3Dns: saw bad cname for for %s", label.ascii() ); 00507 #endif 00508 return; 00509 } 00510 00511 // parse, but ignore 00512 00513 #if defined(Q3DNS_DEBUG) 00514 qDebug( "Q3Dns: saw %s IN NS %s (ttl %d)", label.ascii(), 00515 target.ascii(), ttl ); 00516 #endif 00517 }
Here is the call graph for this function:

| bool Q3DnsAnswer::ok |
Definition at line 217 of file q3dns.cpp.
Referenced by notify(), parse(), parseCname(), parseMx(), parseNs(), parsePtr(), parseSrv(), parseTxt(), Q3DnsAnswer(), readString(), and ~Q3DnsAnswer().
Q3DnsQuery* Q3DnsAnswer::query [private] |
Q_UINT8* Q3DnsAnswer::answer [private] |
Definition at line 222 of file q3dns.cpp.
Referenced by parse(), parseA(), parseAaaa(), parseMx(), parseSrv(), Q3DnsAnswer(), and readString().
int Q3DnsAnswer::size [private] |
int Q3DnsAnswer::pp [private] |
Definition at line 224 of file q3dns.cpp.
Referenced by parse(), parseA(), parseAaaa(), parseMx(), parseSrv(), Q3DnsAnswer(), and readString().
Q3PtrList<Q3DnsRR>* Q3DnsAnswer::rrs [private] |
Definition at line 226 of file q3dns.cpp.
Referenced by notify(), parse(), Q3DnsAnswer(), and ~Q3DnsAnswer().
int Q3DnsAnswer::next [private] |
Definition at line 229 of file q3dns.cpp.
Referenced by parse(), parseA(), parseAaaa(), parseMx(), parseSrv(), and Q3DnsAnswer().
int Q3DnsAnswer::ttl [private] |
Definition at line 230 of file q3dns.cpp.
Referenced by parse(), parseA(), parseAaaa(), parseCname(), parseMx(), parseNs(), parsePtr(), parseSrv(), parseTxt(), and Q3DnsAnswer().
QString Q3DnsAnswer::label [private] |
Definition at line 231 of file q3dns.cpp.
Referenced by parse(), parseA(), parseAaaa(), parseCname(), parseMx(), parseNs(), parsePtr(), parseSrv(), parseTxt(), and Q3DnsAnswer().
Q3DnsRR* Q3DnsAnswer::rr [private] |
Definition at line 232 of file q3dns.cpp.
Referenced by parse(), parseA(), parseAaaa(), parseCname(), parseMx(), parsePtr(), parseSrv(), parseTxt(), and Q3DnsAnswer().
1.5.1