realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflderegisterrequestedstate.cpp
changeset 0 307788aac0a8
child 23 8798b8c7bbfb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflderegisterrequestedstate.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,160 @@
+// Copyright (c) 2007-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        : sipprflderegisterrequestedstate.cpp
+// Part of     : sip profile fsm
+// implementation
+// Version     : %version: 2.1.1 %
+//
+
+
+
+// INCLUDE FILES
+#include	"sipprflderegisterrequestedstate.h"
+#include	"sipregistrationbinding.h"
+#include	"sipclienttransaction.h"
+#include	"sipprofileagentobserver.h"
+#include    "sipprofilefsmuser.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::NewL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPPrflDeregisterRequestedState* 
+CSIPPrflDeregisterRequestedState::NewL(MSIPProfileFSMUser& aUser)
+	{
+	return new (ELeave) CSIPPrflDeregisterRequestedState(aUser);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::CSIPPrflDeregisterRequestedState()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPPrflDeregisterRequestedState::CSIPPrflDeregisterRequestedState(
+    MSIPProfileFSMUser& aUser)
+    : CSIPPrflStateBase(aUser,MSIPProfileContext::EDeregisterRequested)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::~CSIPPrflDeregisterRequestedState()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPPrflDeregisterRequestedState::~CSIPPrflDeregisterRequestedState()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::LinkStates()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPPrflDeregisterRequestedState::LinkStates(
+	CSIPPrflStateBase& aInitState,
+	CSIPPrflStateBase& aRegisteredState,
+	CSIPPrflStateBase& aDeregistrationInProgressState)
+	{
+	iInitState = &aInitState;
+	iRegisteredState = &aRegisteredState;
+	iDeregistrationInProgressState = &aDeregistrationInProgressState;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::ConcreteProfileState()
+// -----------------------------------------------------------------------------
+//
+CSIPConcreteProfile::TStatus 
+CSIPPrflDeregisterRequestedState::ConcreteProfileState() const
+    {
+    return CSIPConcreteProfile::EUnregistrationInProgress;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::Deregister()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPrflDeregisterRequestedState::RegisterL(
+	MSIPProfileContext& aContext)
+	{
+	__ASSERT_DEBUG(aContext.Profile()!=0, User::Invariant());
+	aContext.SetNextState(*iRegisteredState);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::ErrorOccured()
+// This can happen if the de-register was reguested while the connection is
+// suspended (registered->de-register requested). SIP stack has removed
+// the registration binding, so NOP and transition to Init state.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPrflDeregisterRequestedState::ErrorOccured(
+	MSIPProfileContext& aContext,
+	TInt aError)
+	{
+	//registration was dropped due to the expired refresh while connection is suspended
+	HandleError(aContext, aError, iInitState);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPrflDeregisterRequestedState::ConnectionStateChanged()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPrflDeregisterRequestedState::ConnectionStateChanged(
+	MSIPProfileContext& aContext,
+	CSIPConnection::TState aState)
+	{
+	__ASSERT_DEBUG(aContext.Registration()!=0, User::Invariant());
+	__ASSERT_DEBUG(aContext.Profile()!=0, User::Invariant());
+	switch(aState)
+		{
+		case CSIPConnection::EActive:
+			{
+			aContext.SetNextState(*iRegisteredState);
+			TRAPD(err, iUser.DeregisterProfileL(*aContext.Profile()));
+			if (err)
+				{
+				HandleError(aContext, err, iInitState);
+				}
+			break;
+			}
+		case CSIPConnection::EInactive:
+			{
+			TUint32 contextId(0);
+			CSIPConcreteProfile& profile = DoCleanup(aContext,contextId);
+			aContext.SetNextState(*iInitState);
+			aContext.AgentObserver().SIPProfileStatusEvent(profile,contextId);
+			break;
+			}
+		/* When State EUnavailable is received, the registration Binding in the SIPStack 
+		 * is no longer present. Hence we have to do the cleanup here and propagate the 
+		 * error back to clients of profiles.
+		 */
+		case CSIPConnection::EUnavailable:
+			{
+			HandleError(aContext, KErrCouldNotConnect, iInitState);
+			break;
+			}
+		default:
+			break;
+		}
+
+	}