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
[email protected]
http://lists.qt-project.org/mailman/listinfo/development