SOL9 2.0 Class: DnsAnyRecordQuery

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * DnsAnyRecordQuery.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL9 2.0

// 2011/1/1  DNS Any Type(DNS_TYPE_ANY) Resource Record Query

// 2011/1/18 Modified class name to be DnsAnyRecordQuery from DnsRecordList

#pragma once
#include <sol/dns/DnsObject.h>
#include <sol/dns/IPv4AddressArray.h>
#include <sol/net/IPv4AddressInfoList.h>
#include <sol/dns/DnsData.h>
#include <sol/dns/DnsRecord.h>

namespace SOL {

class DnsAnyRecordQuery :public DnsRecord {

private:
    WORD        type;

private:
    IPv4AddressArray ipv4Array;

public:
    /**
     * Constructor
     */
    DnsAnyRecordQuery(__in const TCHAR* primaryDNSServer=NULL, 
            __in const TCHAR* secondaryDNSServer=NULL)
        :type(DNS_TYPE_ANY)
    {
        int count = 0;
        if (primaryDNSServer) {
            count++;
        }
        if (secondaryDNSServer) {
            count++;
        }

        if (count > 0) {
            ipv4Array.allocArray(count);
            int n = 0;
            if (primaryDNSServer) {
                try {
                    IPv4AddressInfoList infoList;
                    infoList.getAddrInfo(primaryDNSServer);
                    in_addr addr;
                    infoList.getFirst(addr);
                    ipv4Array.setNth(n++, addr);
                } catch (...) {
                    ;//Ignore error
                }
            }

            if (secondaryDNSServer) {
                try {
                    IPv4AddressInfoList infoList;
                    infoList.getAddrInfo(secondaryDNSServer);
                    in_addr addr;
                    infoList.getFirst(addr);
                    ipv4Array.setNth(n++, addr);
                } catch (...) {
                    ;//Ignore error
                }
            }
        }//count?0
    }

public:
    /**
     * Destructor
     */
    ~DnsAnyRecordQuery()
    {
        clear();
    }

public:
    void clear()
    {
        DNS_RECORD* pRecord = getRecord();

        if (pRecord) {
            DnsRecordListFree(pRecord, DnsFreeRecordList);
        }
    }

public:
    /**
     * Call DnsQuery API and store the result to dataArray 
     */
    int query(__in const TCHAR* hostDomain, __in DWORD options=DNS_QUERY_STANDARD)
    {
        clear();

        DNS_RECORD* pRecord = NULL; 
        DWORD rc =     DnsQuery(hostDomain, this->type, 
                        options,
                        NULL, &pRecord, NULL);

        if (rc != ERROR_SUCCESS) {
            throw Exception("DnsRecordListT::query failed", rc);
        }

        setRecord(pRecord);

        return rc;
    }

};

}

Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.