diff -r 000000000000 -r af10295192d8 tcpiputils/dnd/inc/dns.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpiputils/dnd/inc/dns.h Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,164 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// dns.h - name resolver DNS client module header
+//
+
+#ifndef __DNS_H__
+#define __DNS_H__
+
+/**
+@file dns.h
+DNS protocol proviver
+@internalComponent Domain Name Resolver
+*/
+
+#include "listener.h"
+#include "message.h"
+#include "dns_sock.h"
+#include "hostname.h"
+
+#ifdef EXCLUDE_SYMBIAN_DNS_PUNYCODE
+#undef SYMBIAN_DNS_PUNYCODE
+#endif //EXCLUDE_SYMBIAN_DNS_PUNYCODE
+
+const TUint KDndNumRequests = KDndNumResolver * 2;
+
+class CDndRecord;
+class CDndDnsclient;
+class CDndCache;
+/**
+// @brief The request data
+//
+// TDndReqData is the DNS protocol side of the query session used by a
+// resolver. The resolvers side is only visible via the MDnsResolver
+// callback class. On the other hand, the visible services of this class
+// for the resolver (CDndResolver) are defined by the MDnsSession.
+*/
+class TDndReqData : public TDnsRequest, public MDnsSession, public MDnsServerListNotify
+ {
+public:
+ //
+ // MDnsSession API (methods callable by resolver)
+ // (documented in the mixin class)
+ virtual TInt NewQuery(const TDnsMessage &aQuery, TDnsServerScope aServerScope, TUint32 aFlags);
+ virtual void CancelQuery();
+ virtual TInt DoQueryL(const TTime &aRequestTime, const EDnsQType aQType);
+ virtual TInt DoNext(TDnsMessageBuf &aReply, TInt aNext) const;
+ void DoError(TInt aError, TUint aTTL);
+ virtual TBool PickNewServer();
+ virtual TBool PickDefaultServer();
+ void Close();
+
+
+ //
+ // MDnsServerListNotify callback
+ //
+ // The notify callback from the server manager
+ virtual void ServerListComplete(const TDnsServerFilter &aFilter, TInt aResult);
+ //
+ // Upcalls from DNS Socket
+ //
+ // Build a complete DNS message from request data
+ virtual TBool Build(CDnsSocket &aSource, TMsgBuf &aBuf, TInetAddr &aServer, TInt aMaxMessage);
+ // Handle a reply message for the request (request remains queued)
+ virtual TBool Reply(CDnsSocket &aSource, const TMsgBuf &aBuf, const TInetAddr &aServer);
+ // The message has been sent (request remains queued)
+ virtual void Sent(CDnsSocket &aSource);
+ // The request has been aborted (not queued anymore)
+ virtual void Abort(CDnsSocket &aSource, const TInt aReason);
+
+ // Generate the callback event for the resolver owning this request
+ void SendResponse(TInt aErr);
+protected:
+ //
+ // Internal utilities
+ //
+ // Check the message question against request data
+ TInt CheckQuestion(const TMsgBuf &aMsg, TInt &aRCode) const;
+ // Check request against responce and translate RCODE value.
+ TInt TranslateRCODE(const TDndHeader &aHdr, TInt aRCode) const;
+ // Build a TNameRecord record from a RR
+ TInt GetResponse(const TDndRR &aRR, TNameRecord &aReply) const;
+ // Update DNS reply into cache
+ TBool UpdateCacheData(const TMsgBuf &aMsg, const TInt aAnswerOffset, const TInt aErr);
+ // Return instance ptr of the actual class instance
+ virtual const void *const Instance() const {return this; }
+
+public:
+ TUint iIsReqPending:1; //< Resolver is waiting for a reply
+ TUint iIsUsingTCP:1; //< Set when TCP is in use, only a safeguard against bad DNS servers.
+ TUint iIsNewQuery:1; //< Set in NewQuery, cleared in DoQuery (used in deciding whether a new ID is needed)
+ TUint iIsFromCache:1; //< Set if iRecord was from cached
+ TUint iOpcode:4; //< OPCODE field of the header
+#ifdef SYMBIAN_DNS_PUNYCODE
+ TUint iIdnEnabled:1; //< =1, support for IDN is enabled for this request.
+#endif //SYMBIAN_DNS_PUNYCODE
+
+ TUint16 iQdCount;
+ TUint32 iFlags; //< Mofidier flags for the query (RD, PQ etc).
+ TDndQuestion iQuestion; //< Query Information
+ TDnsServerFilter iFilter;
+ TUint32 iCurrentServer;
+
+ CDndRecord *iRecord; //< Pointer to the record in the cache is stored here when a DNS query
+ //< is sent - for quick update of cache.
+ // Callback section
+ MDnsResolver *iCallback;
+ // "Owner" source
+ CDndDnsclient *iOwner; //< Actual owner of the request data
+
+ TUint iNetworkId; //< NetworkId from the request message.
+ };
+
+class TInetAddressInfo;
+class CDndDnsclient : public CDnsSocket, public MDnsSource
+ {
+ friend class CDndMonitor;
+ friend class TDndReqData;
+protected:
+ CDndDnsclient(CDndEngine &aControl, MDnsServerManager &aServerManager);
+ void ConstructL();
+public:
+ static CDndDnsclient *NewL(CDndEngine &aControl, MDnsServerManager &aServerManager);
+
+ void HandleCommandL(TInt aCommand);
+ virtual ~CDndDnsclient();
+ // Configuration has changed
+ virtual void ConfigurationChanged() = 0;
+
+ // Assign a session slot
+ MDnsSession *OpenSession(MDnsResolver *const aCallback);
+ // Check if there is a route and valid source address for the aDestination
+ TInt CheckAddress(const TInetAddr &aDestination);
+ // Resolver has received a query from application
+ void QueryBegin();
+ // Resolver has completed the query from application
+ void QueryEnd();
+
+protected:
+ // Received a Query Message from some server -- ignore by default
+ void Query(const TMsgBuf &/*aBuf*/, const TInetAddr &/*aServer*/, const RSocket &/*aSocket*/) {}
+ // Received an error indication for a server
+ void Error(const TInetAddr &aServer, TInt aError);
+ inline void ActivateSocketL(TUint aNetworkId = 0) { CDnsSocket::ActivateSocketL(aNetworkId); } // lint placebo
+
+ CDndEngine &iControl; //< The DND Engine
+ MDnsServerManager &iServerManager; //< The server manager
+ TDndReqData iDndReqData[KDndNumRequests]; //< Requests being served
+ TUint iActivityCount; //< Count of activity, shut DNS sockets when ZERO.
+ CDndCache *iCache; //< The Cache
+ THostNames iHostNames; //< The current hostnames
+ };
+
+#endif