realtimenetprots/sipfw/SIP/TransactionUser/src/TimerValueRetriever.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/TransactionUser/src/TimerValueRetriever.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,187 @@
+// Copyright (c) 2006-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:
+// Name          : TimerValueRetriever.cpp
+// Part of       : TransactionUser
+// Version       : SIP/5.0
+//
+
+
+
+#include <centralrepository.h>
+#include "SIPSDKCRKeys.h"
+#include "SipAssert.h"
+#include "TimerValueRetriever.h"
+
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::NewL
+// -----------------------------------------------------------------------------
+//
+CTimerValueRetriever* CTimerValueRetriever::NewL()
+	{
+    CTimerValueRetriever* self = new (ELeave) CTimerValueRetriever();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::CTimerValueRetriever
+// -----------------------------------------------------------------------------
+//
+CTimerValueRetriever::CTimerValueRetriever() :
+	CActive(EPriorityStandard)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CTimerValueRetriever::ConstructL()
+	{
+	iRepository = CRepository::NewL(KCRUidSIP);
+	ReadValuesL();
+	for(TUint i = 0; i < EMaxSupportedBearer;i++)
+		__ASSERT_ALWAYS(iTimerValues[i].CheckValues(), User::Leave(KErrCorrupt));
+	ListenForChangesL();
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::~CTimerValueRetriever
+// -----------------------------------------------------------------------------
+//
+CTimerValueRetriever::~CTimerValueRetriever()
+	{
+	Cancel();
+	delete iRepository;
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CTimerValueRetriever::DoCancel()
+	{
+	if (iRepository)
+		{
+		iRepository->NotifyCancelAll();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::RunL
+// -----------------------------------------------------------------------------
+//
+void CTimerValueRetriever::RunL()
+	{
+	__SIP_ASSERT_LEAVE(iRepository, KErrNotFound);
+
+	// In S60, repository completes the notification request with value 1, even
+	// though there is no error.
+	if (iStatus.Int() >= KErrNone)
+		{
+		ReadValuesL();
+		}
+
+	ListenForChangesL();
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CTimerValueRetriever::RunError(TInt aError)
+	{
+	return (aError == KErrNoMemory) ? aError : KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::TimerValues
+// -----------------------------------------------------------------------------
+//
+TTimerValues& CTimerValueRetriever::TimerValues(BearerType aType)
+	{
+	if(EMaxSupportedBearer > aType)
+		return iTimerValues[aType];
+	else
+		return iTimerValues[EModemBearer];
+	}
+	
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::ReadValuesL
+// If the values read from repository are invalid, use the previous values.
+// -----------------------------------------------------------------------------
+//
+void CTimerValueRetriever::ReadValuesL()
+	{
+	__SIP_ASSERT_LEAVE(iRepository, KErrNotFound);
+
+    TInt t1 = 0;
+    TInt t2 = 0;
+    TInt t4 = 0;
+
+    User::LeaveIfError(iRepository->Get(KSIPTransactionTimerT1, t1));
+    User::LeaveIfError(iRepository->Get(KSIPTransactionTimerT2, t2));
+    User::LeaveIfError(iRepository->Get(KSIPTransactionTimerT4, t4));
+
+	TTimerValues newMBValues(t1, t2, t4);
+	if (newMBValues.CheckValues())
+		{
+		iTimerValues[EModemBearer] = newMBValues;
+		}
+	
+	User::LeaveIfError(iRepository->Get(KSIPTransactionTimerLANT1, t1));
+	User::LeaveIfError(iRepository->Get(KSIPTransactionTimerLANT2, t2));
+	User::LeaveIfError(iRepository->Get(KSIPTransactionTimerLANT4, t4));
+
+	TTimerValues newLBValues(t1, t2, t4);
+	if (newLBValues.CheckValues())
+		{
+		iTimerValues[ELanBearer] = newLBValues;
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::ListenForChangesL
+// -----------------------------------------------------------------------------
+//
+void CTimerValueRetriever::ListenForChangesL()
+	{
+	__SIP_ASSERT_LEAVE(iRepository, KErrNotFound);
+
+	const TUint32 KDummyPartialKey = 0x0;
+	//This mask means listening for all keys 
+	const TUint32 KMaskIncludingAllKeys = 0x0;
+
+	User::LeaveIfError(iRepository->NotifyRequest(KDummyPartialKey,
+												  KMaskIncludingAllKeys,
+												  iStatus));
+	SetActive();
+	}
+
+// -----------------------------------------------------------------------------
+// CTimerValueRetriever::HighestT1Value
+// -----------------------------------------------------------------------------
+//
+TUint CTimerValueRetriever::HighestT1()
+	{
+	TUint t1 = 0;
+	for(TUint i = 0; i < EMaxSupportedBearer;i++)
+		if(iTimerValues[i].T1() > t1)
+			t1 = iTimerValues[i].T1();
+	return t1;
+	}