diff -r 000000000000 -r af10295192d8 tcpiputils/dnd/inc/cache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/dnd/inc/cache.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,108 @@ +// 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: +// cache.h - the record cache +// + +#ifndef __CACHE_H__ +#define __CACHE_H__ +/** +@file cache.h +DNS cache +@internalComponent Domain Name Resolver +*/ + +#include "record.h" // ...for TDndRecordLRU (and indirectly class, type symbols and TInetAddr) + +const TInt KDndMaxRecords = 100; //< Maximum mumber of records allowed in the cache. + +class CDndNameSpace; +class CDndEngine; + +/** +// The cache maintains a collection of (question, answer) pairs. +// +// The question (= the search key for the cache) has the +// following components: +// +// @li namespace id +// @li domain-name (dotted notation) +// @li DNS query type (EDnsQType) +// @li DNS query class (EDnsQClass) +// +// The answer is contained within CDndRecord class. Among other +// things, it contains the full original reply from some DNS server +// for the question. +// +// The cache is implemented as a forest of trees, one tree +// for each name space. Each component of the domain-name +// becomes a node in the tree. A node at any non-leaf level can have +// zero or more answers attached (for. example, the domain name "nokia.fi" +// can have both "A" (address) and "NS" (name server) answers +// associated it. +// +// The leaf nodes must have at least one answer. When +// the last answer is expired or otherwise removed from a leaf node, +// the node itself is also removed. A tree containing no answers +// consists just of the root node (name space node). +// +// For example, if in the below example, the "A" answer associated with +// query (namespace=\\, domain-name="www.nokia.com", query=A, class=IN) +// is removed, then also the nodes for "www" and "nokia" are pruned away. +@verbatim + + cache + ............. + + / | / \ + fi com | | + / | \ muu foo + / | \ | / \ + nokia symbian nokia ..A.A....AAAA... (lru) + / | \ | | . + ..A..NS www www www . + . | | | . + .A....A......A +@endverbatim +// The tree implementation is not directly visible outside the cache +// implementation. The CDndCache::FindL returns only a pointer to the +// answer (CDndRecord). +// +// There is a limit to the number of answers (KDndMaxRecords) that +// can be stored. If this limit is reached, the least recently used +// answers are deleted, if possible. An answer cannot be deleted +// is it is currently being used (locked) by some resolver. +*/ +class CDndCache : public CBase + { + // See implementation for methods comments! +public: + CDndCache(); + void ConstructL(); + ~CDndCache(); + + TInt GetServerAddress(const TUint32 aNameSpace, TInetAddr &aAddr); + void SetServerAddress(const TUint32 aNameSpace, const TInetAddr &aAddr, const TInt aState); + CDndRecord *FindL(const TUint32 aNameSpace, const TDesC8 &aName, const EDnsQType aType, const EDnsQClass aClass, + const TTime &aReqTime); + void Dump(CDndEngine &aControl); + void Flush(); +private: + CDndNameSpace *GetNameSpace(const TUint32 aNameSpace); + // The roots of the name-spaces + CDndNameSpace *iRootList; + // The LRU list of cache records + TDndRecordLRU iRecordList; + }; + +#endif