vpnengine/ikev2lib/src/ikev2keepalive.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikev2lib/src/ikev2keepalive.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2003-2007 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:  Common keep alive object
+*
+*/
+
+
+#include "ikev2keepalive.h"
+#include "ikemsgheader.h"
+#include "ikev2pluginsession.h"
+
+CIkeV2KeepAlive* CIkeV2KeepAlive::NewL(TInt DpdKeepAlive, MIkeV2DpdHeartBeatEventHandler& aHandler)
+{
+    CIkeV2KeepAlive* self = new (ELeave) CIkeV2KeepAlive(DpdKeepAlive, aHandler);
+    CleanupStack::PushL(self);                        
+    self->ConstructL();
+    CleanupStack::Pop(self);                          
+    return self;
+}
+
+
+//Constructor
+CIkeV2KeepAlive::CIkeV2KeepAlive(TInt aDpdKeepAlive, 
+                                 MIkeV2DpdHeartBeatEventHandler& aHandler) 
+: CTimer(EPriorityStandard), iCallback(aHandler), iDpdKeepAlive(aDpdKeepAlive)
+{	
+    __ASSERT_DEBUG(iDpdKeepAlive > 0, User::Invariant());
+    CActiveScheduler::Add(this);
+}
+
+//Destructor
+CIkeV2KeepAlive::~CIkeV2KeepAlive()
+{
+    if (IsActive())
+        Cancel();
+}
+
+
+void CIkeV2KeepAlive::ConstructL()
+{
+   //
+   // If NAT keepalive timoeut allocate (and initialize) a TIkeXmitBfr data buffer for
+   // NAT keepalive. Allocate a data buffer for special "Echo request"
+   // keepalive message, if proprietary "Nokia NAT Traversal is used".
+   // Start keep alive timer
+   //
+   CTimer::ConstructL();
+   
+   iRemainingTime = iDpdKeepAlive;
+   StartTimer();			
+}
+
+
+void CIkeV2KeepAlive::DoCancel()
+{
+    CTimer::DoCancel();
+}
+
+void CIkeV2KeepAlive::RunL()
+{
+	if ( iRemainingTime == 0 && iDpdKeepAlive) 
+	{	
+        iCallback.EventHandlerL();
+        iRemainingTime = iDpdKeepAlive;				 			  		 	   
+	}	
+    StartTimer();	
+}
+
+void CIkeV2KeepAlive::StartTimer()
+{
+	
+	if ( iRemainingTime > KMaxTInt/1000000 )   //To avoid overflowing the Timer
+	{
+		iRemainingTime -= KMaxTInt/1000000;
+		After(KMaxTInt);
+	}
+	else    //No overflow
+	{
+		if ( iRemainingTime )
+		   After(iRemainingTime*1000000);
+		iRemainingTime = 0;
+	}
+}
+