realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipmessagebuilder.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipmessagebuilder.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,286 @@
+// Copyright (c) 2003-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        : sipmessagebuilder.cpp
+// Part of     : sip profile fsm
+// implementation
+// Version     : 1.0
+//
+
+
+
+
+// INCLUDE FILES
+#include 	<uri8.h>
+#include	"sipmessagebuilder.h"
+#include	"sipcontactheader.h"
+#include	"sipaddress.h"
+#include	"siptoheader.h"
+#include	"siprouteheader.h"
+#include	"sipextensionheader.h"
+#include	"sipgendefs.h"
+#include    "sipstrings.h"
+#include    "sipstrconsts.h"
+#include    "sipcodecerr.h"
+
+_LIT8(KUriParamTemplate, ";%S=%S");
+_LIT8(KCompSigCompParam, "comp=sigcomp");
+
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::CreateToLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPToHeader* SIPMessageBuilder::CreateToLC(const TDesC8& aUri)
+	{
+	TUriParser8 parser;
+	User::LeaveIfError( parser.Parse( aUri ) );
+	
+	CUri8* tmpUri = CUri8::NewLC( parser );
+	
+	CSIPAddress* tmpAddr = CSIPAddress::NewL( tmpUri );
+
+	CleanupStack::Pop( tmpUri );
+	CleanupStack::PushL( tmpAddr );
+	
+	CSIPToHeader* to = CSIPToHeader::NewL( tmpAddr );
+	CleanupStack::Pop( tmpAddr );
+	
+	CleanupStack::PushL( to );
+	return to;
+	}
+
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::CreateContactLC
+// adds contact header
+// REGISTER request
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPContactHeader* SIPMessageBuilder::CreateContactLC(
+	const TDesC8& aUser,
+	TInt aExpiresValue,
+	const MDesC8Array& aParams,
+	RStringF aTransport,
+	TBool aSigComp)
+	{
+    RStringF comp = SIPStrings::StringF(SipStrConsts::EComp);
+    RStringF sigcomp = SIPStrings::StringF(SipStrConsts::ESigComp);
+    RStringF transport = SIPStrings::StringF(SipStrConsts::ETransport);
+
+    TUriParser8 uriParser;
+    User::LeaveIfError(uriParser.Parse(KSIPlocalhost));
+    CUri8* uri = CUri8::NewLC(uriParser);
+
+	if (aUser.Length() > 0)
+	    {
+	    uri->SetComponentL(aUser, EUriUserinfo);
+	    }
+	
+	if (aSigComp)
+		{
+		AddUriParamL(*uri,comp.DesC(),sigcomp.DesC());
+		}
+	
+	if (aTransport.DesC().Length() > 0)
+		{
+		AddUriParamL(*uri,transport.DesC(),aTransport.DesC());
+		}
+	
+	CSIPAddress* sipAddress = CSIPAddress::NewL(uri);
+	CleanupStack::Pop(uri);
+	CleanupStack::PushL(sipAddress);
+	CSIPContactHeader* contact = CSIPContactHeader::NewL(sipAddress);
+	CleanupStack::Pop(sipAddress);
+	CleanupStack::PushL(contact);
+    contact->SetExpiresParameterL(aExpiresValue);
+	
+	for (TInt i=0; i<aParams.MdcaCount(); i++)
+		{
+		TChar equal = '=';
+		TPtrC8 param(aParams.MdcaPoint(i));
+		TInt index = param.Locate(equal);
+		TInt locationAfterEquals(index+1);
+		if (index != KErrNotFound && param.Length() > locationAfterEquals)
+			{
+			RStringF key = SIPStrings::Pool().OpenFStringL(param.Left(index));
+			CleanupClosePushL(key);
+			RStringF value = 
+			    SIPStrings::Pool().OpenFStringL(param.Mid(locationAfterEquals));
+			CleanupClosePushL(value);
+			contact->SetParamL(key, value);
+			CleanupStack::PopAndDestroy(2); //key, value
+			}
+		else
+			{
+			RStringF key = SIPStrings::Pool().OpenFStringL(param);
+			CleanupClosePushL(key);
+			contact->SetParamL(key);
+			CleanupStack::PopAndDestroy(); //key	
+			}
+		}
+
+	return contact;
+	}
+
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::CreateAuthorizationLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C CSIPExtensionHeader* SIPMessageBuilder::CreateAuthorizationLC(
+	const TDesC8& aUri,
+	const TDesC8& aRealm, 
+	const TDesC8& aPrivateId)
+	{
+	HBufC8* authorizationValue = HBufC8::NewLC(aPrivateId.Length()
+		+ aUri.Length() + aRealm.Length() + (5*KSIPequals().Length())
+		+ (KSIPquotneeded) + (4*KSIPcomma().Length()) + KSIPUsername().Length() 
+		+ KSIPauthForHeader().Length() + KSIPrealm().Length() + KSIPuri().Length() 
+		+ KSIPnonce().Length() + KSIPresponse().Length());
+
+	TPtr8 ptr = authorizationValue->Des();
+	ptr.Append(KSIPauthForHeader());
+	ptr.Append(KSIPUsername());
+	ptr.Append(KSIPequals());
+	ptr.Append(KSIPquot);
+	ptr.Append(aPrivateId);
+	ptr.Append(KSIPquot);
+	ptr.Append(KSIPcomma());
+	ptr.Append(KSIPrealm());
+	ptr.Append(KSIPequals());
+	ptr.Append(KSIPquot);
+	ptr.Append(aRealm);
+	ptr.Append(KSIPquot);
+	ptr.Append(KSIPcomma());
+	ptr.Append(KSIPnonce());
+	ptr.Append(KSIPequals());
+	ptr.Append(KSIPquot);
+	ptr.Append(KSIPquot);
+	ptr.Append(KSIPcomma());
+	ptr.Append(KSIPuri());
+	ptr.Append(KSIPequals());
+	ptr.Append(KSIPquot);
+	ptr.Append(aUri);
+	ptr.Append(KSIPquot);
+	ptr.Append(KSIPcomma());
+	ptr.Append(KSIPresponse());
+	ptr.Append(KSIPequals());
+	ptr.Append(KSIPquot);
+	ptr.Append(KSIPquot);
+
+	CSIPExtensionHeader* authorizationHeader = CSIPExtensionHeader::NewL(
+		KSIPauthheader(), *authorizationValue);
+	CleanupStack::PopAndDestroy(authorizationValue);
+	CleanupStack::PushL(authorizationHeader);
+	return authorizationHeader;
+	}
+
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::CreateRouteLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPRouteHeader* SIPMessageBuilder::CreateRouteLC(
+    const TDesC8& aRoute,
+    TBool aSigComp)
+	{
+    RStringF comp = SIPStrings::StringF(SipStrConsts::EComp);
+    RStringF sigcomp = SIPStrings::StringF(SipStrConsts::ESigComp);
+    
+    TUriParser8 uriParser;
+    User::LeaveIfError(uriParser.Parse(aRoute));
+    CUri8* uri = CUri8::NewLC(uriParser);
+	if (aSigComp && uri->Uri().Extract(EUriPath).FindF(KCompSigCompParam) < 0)
+		{    
+        AddUriParamL(*uri, comp.DesC(), sigcomp.DesC());
+		}
+    CSIPAddress* sipAddress = CSIPAddress::NewL(uri);
+    CleanupStack::Pop(uri);
+    CleanupStack::PushL(sipAddress);
+	CSIPRouteHeader* route = CSIPRouteHeader::NewL(sipAddress);
+	CleanupStack::Pop(sipAddress);
+	CleanupStack::PushL(route);
+	return route;
+	}
+	
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::CreateHeaderLC
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPHeaderBase* SIPMessageBuilder::CreateHeaderLC(
+    const TDesC8& aHeaderDes)
+    {
+	TInt colonPos = aHeaderDes.Locate(':');
+	__ASSERT_ALWAYS(colonPos > 0, User::Leave(KErrSipCodecHeaderName));
+	TPtrC8 name(aHeaderDes.Left(colonPos));
+	TPtrC8 value(aHeaderDes.Mid(colonPos+1));
+	TLex8 lex(value);
+	lex.SkipSpace();
+	TPtrC8 trimmedValue(lex.Remainder());
+	CSIPExtensionHeader* header = CSIPExtensionHeader::NewLC(name,trimmedValue);
+	return header;
+    }
+    
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::ParseParamL
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TBool SIPMessageBuilder::ParseParamL(
+    const TDesC8& aParam,
+    TPtrC8& aName,
+    TPtrC8& aValue)
+    {
+	__ASSERT_ALWAYS (aParam.Length() > 0, User::Leave(KErrSipCodecAnyParam));
+	TInt equalsPos = aParam.Locate('=');
+	if (equalsPos == 0 || equalsPos == aParam.Length()-1) 
+		{
+		User::Leave (KErrSipCodecAnyParam);
+		}
+	TBool hasValue = EFalse;	
+	if (equalsPos > 0)
+		{
+		aName.Set(aParam.Left(equalsPos));
+		aValue.Set(aParam.Mid(equalsPos+1));
+		hasValue = ETrue;
+		}
+	else
+        {
+	    aName.Set(aParam);
+	    aValue.Set(KNullDesC8);   
+        }
+	return hasValue;    
+    }	
+
+// -----------------------------------------------------------------------------
+// SIPMessageBuilder::AddUriParamL
+// -----------------------------------------------------------------------------
+//
+void SIPMessageBuilder::AddUriParamL(
+    CUri8& aUri, 
+    const TDesC8& aName,
+    const TDesC8& aValue)
+    {
+    TPtrC8 currentParamsPtr(aUri.Uri().Extract(EUriPath));
+    TInt newParamsLength = currentParamsPtr.Length() + 
+                           KUriParamTemplate().Length() + 
+                           aName.Length() + 
+                           aValue.Length();
+    HBufC8* newParams = HBufC8::NewLC(newParamsLength);
+    TPtr8 newParamsDes(newParams->Des());
+    newParamsDes.Copy(currentParamsPtr);
+    newParamsDes.AppendFormat(KUriParamTemplate,&aName,&aValue);
+    aUri.SetComponentL(newParamsDes,EUriPath);
+    CleanupStack::PopAndDestroy(newParams);
+    }