zeroconf/cachemanager/src/cserviceinfo.cpp
changeset 14 da856f45b798
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zeroconf/cachemanager/src/cserviceinfo.cpp	Thu Jun 24 19:09:47 2010 +0530
@@ -0,0 +1,397 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+
+#include "cserviceinfo.h"
+
+const TUint KCacheRecords = 4;
+const TUint KGranularity = 2;
+const TUint KDefaultTtl = 4500;
+const TUint KQueryFactor = 0.2;
+
+
+
+CServiceInfo* CServiceInfo::NewL()
+	{
+	CServiceInfo* self = CServiceInfo::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CServiceInfo* CServiceInfo::NewLC()
+	{
+	CServiceInfo* self = new (ELeave)CServiceInfo();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CServiceInfo::CServiceInfo():iEntryTime(KCacheRecords),iExpiryTime(KCacheRecords),iAddressRecord(NULL),iServiceRecord(NULL),iPtrRecord(NULL),iTxtRecord(NULL)
+	{
+	iEntryExpired = EFalse;
+	}
+
+CServiceInfo::~CServiceInfo()
+	{
+	delete iAddressRecord;
+	delete iServiceRecord;
+	delete iPtrRecord;
+	delete iTxtRecord;
+	iEntryTime.Close();
+	iExpiryTime.Close();
+	iKey.Close();
+	
+	}
+
+void CServiceInfo::ConstructL()
+	{
+	TTime currentTime;
+	currentTime.UniversalTime();
+	TTimeIntervalSeconds ttl = KDefaultTtl;
+	
+	//Set default Entry time
+	for(TInt count=0;count<KCacheRecords;count++ )
+		{
+		iEntryTime.AppendL(currentTime);
+		}
+		
+	
+	//Set default Expiry time	
+	for(TInt count=0;count<KCacheRecords;count++ )
+		{
+		iExpiryTime.AppendL(currentTime + ttl);
+		}		
+	
+	}
+
+TBool CServiceInfo::IsAuthoritative()const
+	{
+	return iAuthoritative;
+	}
+
+void CServiceInfo::SetAuthoritative(TBool aAuthoritative)
+	{
+	iAuthoritative = aAuthoritative;
+	}
+
+const TTime& CServiceInfo::LastAccessTime()const
+	{
+	return iLastAccessTime;
+	}
+
+void CServiceInfo::SetAccessTime(TTime aTime)
+	{
+	iLastAccessTime = aTime;
+	}
+
+TUint32 CServiceInfo::SessionId()const
+	{
+	return iSessionId;
+	}
+	
+void CServiceInfo::SetSessionId(TUint32 aSessionId)
+	{
+	iSessionId = aSessionId;
+	}
+
+void CServiceInfo::SetAddressRecord(CRdTypeA* aAddressRecord)
+	{
+
+	SetEntryTime(ECacheEntryAddr);
+	iAddressRecord = aAddressRecord;
+	SetExpiryTime(ECacheEntryAddr);	
+
+	}
+	
+void CServiceInfo::SetServiceRecord(CRdTypeSrv* aServiceRecord)
+	{
+
+	SetEntryTime(ECacheEntrySrv);
+	iServiceRecord = aServiceRecord;
+	SetExpiryTime(ECacheEntrySrv);	
+
+	}
+	
+void CServiceInfo::SetPtrRecord(CRdTypePtr* aPtrRecord)
+	{
+
+	SetEntryTime(ECacheEntryPtr);
+	iPtrRecord = aPtrRecord;
+	SetExpiryTime(ECacheEntryPtr);	
+	
+	}
+
+void CServiceInfo::SetTxtRecord(CRdTypeTxt* aTxtRecord)
+	{
+
+	SetEntryTime(ECacheEntryTxt);
+	iTxtRecord = aTxtRecord;
+	SetExpiryTime(ECacheEntryTxt);		
+
+	}
+	
+
+CRdTypeA* CServiceInfo::AddressRecord()const
+	{
+	return iAddressRecord;
+	}
+
+CRdTypeSrv* CServiceInfo::ServiceRecord()const
+	{
+	return iServiceRecord;
+	}
+
+CRdTypePtr* CServiceInfo::PtrRecord()const
+	{
+	return iPtrRecord;
+	}
+
+CRdTypeTxt* CServiceInfo::TxtRecord()const
+	{
+	return iTxtRecord;
+	}
+	
+void CServiceInfo::SetKeyL(const TDesC8& aKey)
+	{
+	iKey.Close();
+	iKey.CreateL(aKey);
+	iKey.LowerCase();
+	}
+	
+const TDesC8& CServiceInfo::Key()const
+	{	
+	return iKey;
+	}
+
+void CServiceInfo::SetEntryTime(TCacheEntryType aType)
+	{
+	TTime currentTime;
+	currentTime.UniversalTime();
+
+	//Set the Entry Time when the record data is obtained for 
+	//the first time
+	
+	switch(aType)
+		{
+		case ECacheEntryAddr:
+		//if(!AddressRecord())
+			{			
+			iEntryTime.Insert(currentTime,ECacheEntryAddr);
+			}
+		break;
+		
+		
+		case ECacheEntryPtr:
+		//if(!PtrRecord())
+			{
+			iEntryTime.Insert(currentTime,ECacheEntryPtr);
+			}		
+		break;
+		
+		
+		case ECacheEntrySrv:
+		//if(!ServiceRecord())
+			{
+			iEntryTime.Insert(currentTime,ECacheEntrySrv);
+			}
+		break;
+		
+		case ECacheEntryTxt:
+		//if(!TxtRecord())
+			{
+			iEntryTime.Insert(currentTime,ECacheEntryTxt);
+			}
+		break;
+		}
+	
+	}
+	
+
+void CServiceInfo::SetExpiryTime(TCacheEntryType aType)
+	{
+	TTimeIntervalSeconds ttl;
+	
+	//Set/Update  the Expiry time
+	switch(aType)
+		{
+		case ECacheEntryAddr:
+		ttl = AddressRecord()->Ttl();
+		break;
+		
+		
+		case ECacheEntryPtr:
+		ttl = PtrRecord()->Ttl();		
+		break;
+		
+		
+		case ECacheEntrySrv:
+		ttl = ServiceRecord()->Ttl();
+		break;
+		
+		case ECacheEntryTxt:
+		ttl = TxtRecord()->Ttl();
+		break;
+		}
+	
+	//Set the Expiry Time	
+	TTime expiryTime = iEntryTime[aType] + ttl;
+	iExpiryTime.Insert(expiryTime,aType);
+	}
+	
+	
+TBool CServiceInfo::EntryExpired()
+	{
+	TTime currentTime;
+	currentTime.UniversalTime();
+	
+	if(AddressRecord())
+		{
+		if(iExpiryTime[ECacheEntryAddr] <= currentTime)
+			{
+			iEntryExpired = ETrue;
+			return iEntryExpired;
+			}
+		}
+		
+	if(PtrRecord())
+		{
+		if(iExpiryTime[ECacheEntryPtr] <= currentTime)
+			{
+			iEntryExpired = ETrue;
+			return iEntryExpired;
+			}
+		}
+		
+		
+	if(ServiceRecord())
+		{
+		if(iExpiryTime[ECacheEntrySrv] <= currentTime)
+			{
+			iEntryExpired = ETrue;
+			return iEntryExpired;
+			}
+		}
+		
+		
+	if(TxtRecord())
+		{
+		if(iExpiryTime[ECacheEntryTxt] <= currentTime)
+			{
+			iEntryExpired = ETrue;
+			return iEntryExpired;
+			}
+		}
+	
+	return EFalse;
+	}
+
+
+// This Clone funtion returns back what is necessary. 
+
+CServiceInfo* CServiceInfo::CloneL()const
+    {
+    CServiceInfo* serviceInfo = CServiceInfo::NewL();
+
+    if(iAddressRecord)
+        {
+        serviceInfo->SetAddressRecord(static_cast<CRdTypeA*>(iAddressRecord->CloneL()));
+        }
+    if(iServiceRecord)
+        {
+        serviceInfo->SetServiceRecord(static_cast<CRdTypeSrv*>(iServiceRecord->CloneL()));
+        }
+    if(iPtrRecord)
+        {
+        serviceInfo->SetPtrRecord(static_cast<CRdTypePtr*>(iPtrRecord->CloneL()));
+        }
+    if(iTxtRecord)
+        {
+        serviceInfo->SetTxtRecord(static_cast<CRdTypeTxt*>(iTxtRecord->CloneL()));
+        }
+
+    serviceInfo->SetKeyL(iKey);
+    serviceInfo->SetSessionId(iSessionId);
+    
+    return serviceInfo;
+    }
+
+TBool CServiceInfo::EntryToBeQueried()
+	{
+	//Check if any record in the entry has exceeded 80% ttl, if yes, Query!
+	
+	TTime currentTime;
+	currentTime.UniversalTime();
+	
+	
+	if(AddressRecord())
+		{
+		TInt64 addExpiryTime = iExpiryTime[ECacheEntryAddr].Int64();		
+		TInt64 current = currentTime.Int64();
+		//Converted to seconds
+		TUint64 addExpiryFactor = (addExpiryTime - current) / 1000000;
+		if( addExpiryFactor < (0.2)*(AddressRecord()->Ttl()))
+			{
+			return ETrue;
+			}
+		}
+		
+	if(PtrRecord())
+		{				
+		TInt64 ptrExpiryTime = iExpiryTime[ECacheEntryPtr].Int64();
+		TInt64 current = currentTime.Int64();
+		//Converted to seconds
+		TUint64 ptrExpiryFactor = (ptrExpiryTime - current) / 1000000;
+		if( ptrExpiryFactor < (0.2)*(PtrRecord()->Ttl()))
+			{
+			return ETrue;
+			}
+		}
+		
+		
+	if(ServiceRecord())
+		{
+		TInt64 srvExpiryTime = iExpiryTime[ECacheEntrySrv].Int64();		
+		TInt64 current = currentTime.Int64();
+		//Converted to seconds
+		TUint64 srvExpiryFactor = (srvExpiryTime - current) / 1000000;
+		if( srvExpiryFactor < (0.2)*(ServiceRecord()->Ttl()))
+			{
+			return ETrue;
+			}
+		}
+		
+		
+	if(TxtRecord())
+		{
+		TInt64 txtExpiryTime = iExpiryTime[ECacheEntryTxt].Int64();		
+		TInt64 current = currentTime.Int64();
+		//Converted to seconds
+		TUint64 txtExpiryFactor = (txtExpiryTime - current) / 1000000;
+		if( txtExpiryFactor < (0.2)*(TxtRecord()->Ttl()))
+			{
+			return ETrue;
+			}
+		}
+	
+	return EFalse;
+	}
+
+
+TBool CServiceInfo::StaleEntry()
+	{
+	return iEntryExpired;
+	}