realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrar.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrar.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,213 @@
+// Copyright (c) 2005-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          : CSIPRegistrar.cpp
+// Part of       : Registration
+// Version       : SIP/4.0 
+//
+
+
+
+#include "CSIPRegistrar.h"
+#include "CSIPRegistrarStore.h"
+#include "TSIPRegistrationUtility.h"
+#include "uricontainer.h"
+#include "siprequest.h"
+#include "sipcallidheader.h"
+#include "sipcseqheader.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPRegistrar* CSIPRegistrar::NewLC(const CURIContainer&  aRegistrar,
+									const TDesC8&         aCallId,
+									TUint                 aCSeqNumber, 
+									const TRegistrationId aRegistrationId,
+									CSIPRegistrarStore&   aRegistrarStore)
+	{
+    CSIPRegistrar* self = 
+		new (ELeave) CSIPRegistrar(aCSeqNumber, aRegistrarStore);
+	CleanupStack::PushL(self);
+	self->ConstructL(aRegistrar, aCallId, aRegistrationId);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::CSIPRegistrar
+// -----------------------------------------------------------------------------
+//
+CSIPRegistrar::CSIPRegistrar(TUint               aCSeqNumber, 
+							 CSIPRegistrarStore& aRegistrarStore) 
+ : iCSeqNumber     (aCSeqNumber),
+   iRegistrarStore (aRegistrarStore)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPRegistrar::ConstructL(const CURIContainer&  aRegistrar,
+		                       const TDesC8&         aCallId,
+							   const TRegistrationId aRegistrationId)
+	{
+	iRegistrar = CURIContainer::NewL(aRegistrar);
+	iCallId    = aCallId.AllocL();
+	User::LeaveIfError(iRegistrationIds.Append(aRegistrationId));
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::~CSIPRegistrar
+// -----------------------------------------------------------------------------
+//
+CSIPRegistrar::~CSIPRegistrar()
+	{
+	delete iCallId;
+	delete iRegistrar;
+	iRegistrationIds.Reset();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::Registrar
+// -----------------------------------------------------------------------------
+//
+const CURIContainer& CSIPRegistrar::Registrar() const
+	{
+	return *iRegistrar;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::IncreaseCSeqNumber
+// -----------------------------------------------------------------------------
+//
+void CSIPRegistrar::IncreaseCSeqNumber()
+	{
+	iCSeqNumber++;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::FillCallIdAndCSeqL
+// -----------------------------------------------------------------------------
+//
+void CSIPRegistrar::FillCallIdAndCSeqL(CSIPRequest& aSIPRequest)
+	{
+	CSIPCallIDHeader* callId = CSIPCallIDHeader::DecodeL(*iCallId);
+	CleanupStack::PushL(callId);
+	// fill in callid header, and add it to request
+	CSIPCallIDHeader* oldCallId = aSIPRequest.CallID();
+	if (oldCallId)
+		{
+		aSIPRequest.ReplaceHeaderL(oldCallId, callId);
+		}
+	else // there are callId header in request
+		{
+		aSIPRequest.AddHeaderL(callId);
+		}
+	CleanupStack::Pop(callId);
+
+	// increase the CSeqNumber by one
+	IncreaseCSeqNumber();
+
+    CSIPCSeqHeader* oldCSeqHeader = aSIPRequest.CSeq();
+	if (oldCSeqHeader)
+		{
+		oldCSeqHeader->SetSeq(iCSeqNumber);
+		}
+	else
+		{	
+		// create a CSIPCSeqHeader header, and add it to request
+		CSIPCSeqHeader* cseqHeader = CSIPCSeqHeader::NewLC(
+			iCSeqNumber, SIPStrings::StringF(SipStrConsts::ERegister));
+		aSIPRequest.AddHeaderL(cseqHeader);
+		CleanupStack::Pop(cseqHeader);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::AddRegistrationIdL
+// -----------------------------------------------------------------------------
+//
+void CSIPRegistrar::AddRegistrationIdL(const TRegistrationId aRegistrationId)
+	{
+	User::LeaveIfError(iRegistrationIds.Append(aRegistrationId));
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::BindingRemoved
+// -----------------------------------------------------------------------------
+//
+TBool CSIPRegistrar::BindingRemoved(const TRegistrationId aRegistrationId)  
+	{
+	TInt idFound = FindRegistrationId(aRegistrationId);
+
+	// there is no registration binding relate to this registrar,
+	// remove the registrar
+	if (idFound != KErrNotFound)
+		{
+		if (iRegistrationIds.Count() == 1)
+			{
+			// if registration is added to delete mgr succeed,
+			// remove registration id
+			TInt res = iRegistrarStore.RemoveRegistrar(this);
+			if (res == KErrNone)
+				{
+				iRegistrationIds.Remove(idFound);
+				return ETrue; 
+				}
+			else
+				{
+				return EFalse;
+				}
+			}
+		else
+			{
+			iRegistrationIds.Remove(idFound);
+			return ETrue;
+			}
+		}
+
+	return EFalse;
+	}  
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::FindRegistrationId
+// -----------------------------------------------------------------------------
+//
+TInt CSIPRegistrar::FindRegistrationId (const TRegistrationId aRegistrationId)
+	{
+	TInt idFound = KErrNotFound;
+
+	for (TInt i=iRegistrationIds.Count()-1; (i>=0 && idFound==KErrNotFound); i--)
+		{
+		if (iRegistrationIds[i] == aRegistrationId)
+			{
+			return i;
+			}
+		}
+	return idFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistrar::CSeqNumber
+// -----------------------------------------------------------------------------
+//
+TUint CSIPRegistrar::CSeqNumber() const
+	{
+	return iCSeqNumber;
+	}
+
+