Based on some initial feedback I received regarding DNS SRV support in Qt, I 
have refactored my proposed code and introduced a "QDnsResolver" class which I 
would like to submit for API review. The point of this class is to provide a 
QNAM-style asynchronous API to perform DNS lookups.

The resolver object itself looks like:

class Q_NETWORK_EXPORT QDnsResolver : public QObject
{
    Q_OBJECT

public:
    QDnsResolver(QObject *parent = 0);
    ~QDnsResolver();

    QDnsReply *lookupService(const QString &serviceName, const QString 
&domainName);

private:
    Q_DECLARE_PRIVATE(QDnsResolver)
};

Currently, there is only lookupService() to perform DNS SRV record types, but 
it would be easy to add lookupText() for TXT records, etc. 

An open question: should we have multiple lookupXXX() methods, or a single 
lookup() which takes a QDnsRequest?

The reply object looks like:

class Q_NETWORK_EXPORT QDnsReply : public QObject
{
    Q_OBJECT
    Q_ENUMS(Error Type)

public:
    enum Error
    {
        NoError = 0,
        NotFoundError = 1,
        UnknownError = 2
    };

    enum Type
    {
        SrvType = 0,
    };

    ~QDnsReply();

    Error error() const;
    QString errorString() const;
    Type type() const;

    QList<QDnsServiceRecord> serviceRecords() const;

Q_SIGNALS:
    void finished();

private:
    QDnsReply(QObject *parent);
    Q_DECLARE_PRIVATE(QDnsReply)
    friend class QDnsResolver;
    friend class QDnsResolverRunnable;
};

A point worth mentioning: have multiple accessors for the different record 
types gives us some nice flexibility, as for a given request type (SRV, TXT) we 
might want to return the additional information we received (such as A or AAAA 
records).

What is currently missing in this class is a getter to retrieve the query 
content. It's not yet clear to me how this should be stored:

- a simple option would be simply store a QString of the queried records, but 
this does not capture the need for more structured input (e.g serviceName / 
domainName for DNS SRV)
- another option would be to have a QDnsRequest object in the spirit of QNAM. 
For DNS SRV lookups, this would allow us to keep the split between the 
"serviceName" (_service._proto) and the "domainName" which is currently used by 
lookupService()

QDnsServiceRecord is a read-only QSharedData-based class which holds the 
target, port, priority, weight of a single SRV resource record. Additional 
record types can be supported by adding QDnsXXXRecord classes.

I have pushed my local branch of qtbase to gitorious, it comes complete with 
autotests:

https://qt.gitorious.org/~sharky/qt/sharkys-qtbase/commits/dns-srv-support

Note: I can't guarantee the win32 code still compiles, there might be some 
minor tweaks due to code refactoring.

Comments are most welcome!

Jeremy

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to