tcpiputils/dnd/inc/cache.h
changeset 0 af10295192d8
--- /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=\\<global\\>, domain-name="www.nokia.com", query=A, class=IN)
+// is removed, then also the nodes for "www" and "nokia" are pruned away.
+@verbatim
+
+                      cache
+                  .............
+              <global>          <local>
+                / |              /  \
+              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 <b>least recently used</b>
+// 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