zeroconf/server/src/cmdnscacheconsistencymgr.cpp
changeset 14 da856f45b798
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zeroconf/server/src/cmdnscacheconsistencymgr.cpp	Thu Jun 24 19:09:47 2010 +0530
@@ -0,0 +1,360 @@
+// Copyright (c) 2008-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:
+// cmdnsconsistencymgr.cpp
+// 
+//
+/**
+@file
+@internalTechnology
+*/
+
+//User include
+#include "cmdnscacheconsistencymgr.h"
+#include "cmdnscachemanager.h"
+#include "cmessagehandler.h"
+
+__FLOG_STMT(_LIT8(KComponent,"MDNSServer");)
+
+
+const TUint32 KMinActivityCount = 5;//TODO: to Define correct Min Work Count
+
+
+/*
+ * Two phase constructor
+ * @param aActiveCacheMgmtEnabled
+ * @param aMessageHandler reference to message handler.
+ */
+ CMDNSCacheConsistencyMgr* CMDNSCacheConsistencyMgr::NewL(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler)
+	{
+	CMDNSCacheConsistencyMgr* self = CMDNSCacheConsistencyMgr::NewLC(aActiveCacheMgmtEnabled,aMessageHandler);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/*
+ * Two phase constructor
+ * @param aActiveCacheMgmtEnabled
+ * @param aMessageHandler reference to message handler.
+ */
+CMDNSCacheConsistencyMgr* CMDNSCacheConsistencyMgr::NewLC(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler)
+	{
+	CMDNSCacheConsistencyMgr* self = new (ELeave)CMDNSCacheConsistencyMgr(aActiveCacheMgmtEnabled,aMessageHandler);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/*
+ * Constructor.
+ */
+CMDNSCacheConsistencyMgr::CMDNSCacheConsistencyMgr(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler)
+:CActive(EPriorityStandard),iMessageHandler(aMessageHandler)
+	{
+	iActiveCacheMgmtEnabled=aActiveCacheMgmtEnabled;
+	iWalkInterval= KDefaultCheckInterval;
+	CActiveScheduler::Add(this);	
+	}
+
+
+//Destructor
+CMDNSCacheConsistencyMgr::~CMDNSCacheConsistencyMgr()
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::~CMDNSCacheConsistencyMgr - Entry"));
+	iTimer.Close();
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::~CMDNSCacheConsistencyMgr - Exit"));
+	__FLOG_CLOSE;
+	}
+/*
+ * Two phase constructor
+ */
+void CMDNSCacheConsistencyMgr::ConstructL()
+	{
+	__FLOG_OPEN(KMDNSSubsystem, KComponent);
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::ConstructL - Entry"));
+	User::LeaveIfError(iTimer.CreateLocal());	
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::ConstructL - Exit"));
+	}
+
+/*
+ * Function to stop running the consistemcy manager .
+ * Cancels all the asynchronous request.
+ */
+void CMDNSCacheConsistencyMgr::Stop()
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Stop - Entry"));
+	Cancel();
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Stop - Exit"));
+	}
+	
+/*
+ * Starts the consistency Manager
+ * @param aWalkInterval specifies the walk interval in seconds.
+ */	
+void CMDNSCacheConsistencyMgr::Start(TUint aWalkInterval)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Start - Entry"));
+	iWalkInterval = aWalkInterval;
+	TUint Interval= iWalkInterval*1000000;
+	//Converted to Microseconds		
+	iTimer.After(iStatus,Interval);
+	SetActive();
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Start - Exit"));
+	}
+/*
+ * Delay between two Walk thourgh .
+ * Starts a time to complete the request after an interval mentioned in the iWalkinterval.
+ * @param aStatus reference to status variable.
+ */
+ void CMDNSCacheConsistencyMgr::Delay(TRequestStatus& aStatus)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Delay - Entry"));
+	TUint Interval= iWalkInterval*1000000;
+	//Converted to Microseconds		
+	iTimer.After(aStatus,Interval);
+	SetActive();
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Delay - Exit"));
+	}
+
+
+ /*
+  * Iterates the cache on each hit
+  * and sets a delay for the nexthit.
+  */
+void CMDNSCacheConsistencyMgr::RunL()
+	{	
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::RunL - Entry"));
+	IterateCacheL();
+	Delay(iStatus);
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::RunL - Exit"));
+	}
+
+/*
+ * Handles any leave at RunL
+ * 
+ */
+TInt CMDNSCacheConsistencyMgr::RunError(TInt aError)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::RunError - Entry"));
+	User::LeaveIfError(aError);
+	return aError;
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::RunError - Exit"));
+	}
+
+/*
+ * Cancels any asynchoronous request.
+ */
+void CMDNSCacheConsistencyMgr::DoCancel()
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::DoCancel - Entry"));
+	iTimer.Cancel();
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::DoCancel - Exit"));
+	}
+	
+/*
+ * Walk through the cache .Does two function
+ * 1. Publish any authoritative entries.
+ * 2. Query for the enteries if not authoritative.
+ */
+void CMDNSCacheConsistencyMgr::IterateCacheL()	
+	{	
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - Entry"));
+	TBool iterateReset(ETrue);
+	TBool cacheUpToDate(ETrue);
+	TInt count = iMessageHandler.DnsCache().NumberOfEntries();
+	TInt index(0);
+	
+	
+		
+	for(index=0; index<count;index++)
+		{
+		//Fetch the next entry whose ttl has completely expired or 80% 
+		//of ttl has expired 
+		CCacheEntry* entry = iMessageHandler.DnsCache().NextStaleEntry(iActiveCacheMgmtEnabled,iterateReset);
+
+		//Reset the iterate flag
+		iterateReset = EFalse;
+	    __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 1"));
+		if(entry)
+			{
+			if(entry->EntryExpired())
+				{
+				
+				if(entry->IsAuthoritative())
+					{
+					//Republish the record
+					//Goodbye packet is sent while the session for publish is closed
+					CDnsMessage * announcement = CDnsMessage::NewL(0,EFalse);
+					CleanupStack::PushL(announcement);
+					if(entry->PtrRecord())
+					    {
+                        entry->PtrRecord()->SetTtl(120);
+					    announcement->AppendAnswerL(entry->PtrRecord()->CloneL());
+					    iMessageHandler.DnsCache().UpdateCacheL(*(entry->PtrRecord()),ETrue,entry->SessionId());
+                        __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 2"));
+					    }
+					if(entry->ServiceRecord())
+					    {
+                        entry->ServiceRecord()->SetTtl(120);
+					    announcement->AppendAnswerL(entry->ServiceRecord()->CloneL());
+					    iMessageHandler.DnsCache().UpdateCacheL(*(entry->ServiceRecord()),ETrue,entry->SessionId());
+					    __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 3"));
+					    }
+					if(entry->TxtRecord())
+					    {
+                        entry->TxtRecord()->SetTtl(120);
+					    announcement->AppendAnswerL(entry->TxtRecord()->CloneL());
+					    iMessageHandler.DnsCache().UpdateCacheL(*(entry->TxtRecord()),ETrue,entry->SessionId());
+					    __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 4"));
+					    }
+					if(entry->AddressRecord())
+                        {
+                        entry->AddressRecord()->SetTtl(120);
+                        announcement->AppendAnswerL(entry->AddressRecord()->CloneL());
+                        iMessageHandler.DnsCache().UpdateCacheL(*(entry->AddressRecord()),ETrue,0);
+                        __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 5"));
+                        }
+					__FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 6"));
+					iMessageHandler.SendQueryL(announcement,*this);
+					__FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 7"));
+					CleanupStack::Pop();//announcement
+					}
+				else
+				    {
+	                if(!entry->IsAuthoritative())
+	                    {
+	                    DeleteEntry(entry);
+	                    //Query(entry);
+	                    }				    
+				    }
+				}
+			cacheUpToDate = EFalse;
+			}
+		delete entry;
+		}		
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - Exit"));	 
+	}
+	
+/*
+ * Delete the particular entry from the cache.
+ * @param aEntry cacheentry to be delete.
+ */	
+void CMDNSCacheConsistencyMgr::DeleteEntry(CCacheEntry* aEntry)
+	{	
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::DeleteEntry - Entry"));
+	RBuf8 key;
+	//Extract the key & delete
+	
+	if(aEntry->AddressRecord())
+		{
+		key.CreateL(GetHostName(aEntry));
+		TInt delError = iMessageHandler.DnsCache().DeleteEntryL(key);//TODO: handle error
+		}
+
+	key.Close();
+	key.CreateL(GetServiceName(aEntry));
+	
+	TInt error = iMessageHandler.DnsCache().DeleteEntryL(key);
+	//Handle error
+	key.Close();
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::DeleteEntry - Exit"));
+	}
+	
+/*
+ * Create a CDnsMessage object to be sent to the network using aEntry.
+ *  
+ */	
+void CMDNSCacheConsistencyMgr::Query(CCacheEntry* aEntry)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Query - Entry"));
+		//Construct DNS Message
+	CDnsMessage* message = CDnsMessage::NewL(0,ETrue);
+	CleanupStack::PushL(message);
+
+	//Form the Query/Question part of the message
+	CDnsQuestion* question = CDnsQuestion::NewL();
+	CleanupStack::PushL(question);
+	
+	question->SetNameL(GetServiceName(aEntry));
+	question->SetClass(EDnsClass_IN);
+	question->SetType(EDnsQType_Any);
+
+	//Append the Query to the Message
+	message->AppendQueryL(question);
+	if(aEntry->AddressRecord())
+	message->AppendAnswerL(aEntry->AddressRecord()->CloneL());
+	
+	if(aEntry->ServiceRecord())
+	message->AppendAnswerL(aEntry->ServiceRecord()->CloneL());
+	
+	if(aEntry->TxtRecord())
+	message->AppendAnswerL(aEntry->TxtRecord()->CloneL());	
+	
+	if(aEntry->PtrRecord())
+	message->AppendAnswerL(aEntry->PtrRecord()->CloneL());
+	
+	
+		
+	//Send the query
+	iMessageHandler.SendQueryL(message,*this);		
+
+	CleanupStack::Pop();//question
+	CleanupStack::Pop();//message
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::Query - Exit"));
+	}
+
+/*
+ * @return the hostname for the particular record.
+ */	
+const TDesC8& CMDNSCacheConsistencyMgr::GetHostName(CCacheEntry* aEntry)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::GetHostName - Entry Exit"));
+	return aEntry->AddressRecord()->Name();
+	}
+
+
+/*
+ * @param aEntry for which service name is required.
+ * @return Domain name for the particular service.
+ */
+const TDesC8& CMDNSCacheConsistencyMgr::GetServiceName(CCacheEntry* aEntry)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::GetServiceName - Entry"));
+	if(aEntry->ServiceRecord())
+		{
+		return aEntry->ServiceRecord()->Name();
+		}
+	else if (aEntry->TxtRecord())
+		{
+		return aEntry->TxtRecord()->Name();
+		}
+	else if(aEntry->PtrRecord())
+		{
+		return aEntry->PtrRecord()->DomainName();
+		}
+	else if(aEntry->AddressRecord())
+	        {
+	        return aEntry->AddressRecord()->Name();
+	        }
+	
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::GetServiceName - Exit"));
+	}
+	
+/*
+ * Notified for any queries sent .
+ */	
+void CMDNSCacheConsistencyMgr::OnPacketSendL(TInt /*aError*/)
+	{
+	__FLOG(_L8("CMDNSCacheConsistencyMgr::OnPacketSendL - Entry"));
+	//Do nothing
+	}