realtimenetprots/sipfw/SIP/Codec/src/CSIPResponse.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Codec/src/CSIPResponse.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,256 @@
+// Copyright (c) 2004-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          : CSIPResponse.cpp
+// Part of       : SIP Codec
+// Version       : SIP/4.0 
+//
+
+
+
+#include "sipresponse.h"
+#include "sipcodecerr.h"
+#include "SIPSyntaxCheck.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "_sipcodecdefs.h"
+
+_LIT8 (KSpace, " ");
+_LIT8 (KTUintFormat, "%u");
+const TUint KMinimumResponseCode = 100;
+const TUint K200ResponseCode = 200;
+const TUint K300ResponseCode = 300;
+const TUint K400ResponseCode = 400;
+const TUint K500ResponseCode = 500;
+const TUint K600ResponseCode = 600;
+const TUint KMaximumResponseCode = 699;
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPResponse* CSIPResponse::NewL(TUint aResponseCode,
+										  RStringF aReasonPhrase)
+	{
+	CSIPResponse* self = CSIPResponse::NewLC (aResponseCode, aReasonPhrase);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPResponse* CSIPResponse::NewLC(TUint aResponseCode,
+										   RStringF aReasonPhrase)
+	{
+	CSIPResponse* self = new(ELeave)CSIPResponse;
+	CleanupStack::PushL(self);
+	self->ConstructL(aResponseCode, aReasonPhrase);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPResponse* CSIPResponse::NewL()
+	{
+	CSIPResponse* self = CSIPResponse::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPResponse* CSIPResponse::NewLC()
+	{
+	CSIPResponse* self = new(ELeave)CSIPResponse;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::CSIPResponse
+// -----------------------------------------------------------------------------
+//
+CSIPResponse::CSIPResponse()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPResponse::ConstructL(TUint aResponseCode, RStringF aReasonPhrase)
+	{
+	CSIPMessage::ConstructL();
+	SetResponseCodeL(aResponseCode);
+	SetReasonPhraseL(aReasonPhrase);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPResponse::ConstructL()
+	{
+	CSIPMessage::ConstructL ();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::~CSIPResponse
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPResponse::~CSIPResponse()
+	{
+	iReasonPhrase.Close();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::IsRequest
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPResponse::IsRequest() const
+	{
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::SetReasonPhraseL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPResponse::SetReasonPhraseL (RStringF aReasonPhrase)
+	{
+	SetReasonPhraseL(aReasonPhrase.DesC());
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::ReasonPhrase
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RStringF CSIPResponse::ReasonPhrase() const
+	{
+	return iReasonPhrase;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::SetResponseCodeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPResponse::SetResponseCodeL (TUint aResponseCode)
+	{
+	__ASSERT_ALWAYS (aResponseCode >= KMinimumResponseCode && 
+	                 aResponseCode <= KMaximumResponseCode,
+					 User::Leave(KErrSipCodecResponseCode));
+
+	iResponseCode = aResponseCode;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::ResponseCode
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint CSIPResponse::ResponseCode() const
+	{
+	return iResponseCode;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::Type
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C CSIPResponse::TType CSIPResponse::Type () const
+    {
+    TType type;
+    if (iResponseCode < K200ResponseCode)
+        {
+        type = E1XX;
+        }
+    else if (iResponseCode < K300ResponseCode)
+        {
+        type = E2XX;
+        }
+    else if (iResponseCode < K400ResponseCode)
+        {
+        type = E3XX;
+        }
+    else if (iResponseCode < K500ResponseCode)
+        {
+        type = E4XX;
+        }
+    else if (iResponseCode < K600ResponseCode)
+        {
+        type = E5XX;
+        }
+    else
+        {
+        type = E6XX;
+        }
+    return type;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::IsErrorResponse
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C TBool CSIPResponse::IsErrorResponse () const
+    {
+    return (iResponseCode >= K300ResponseCode);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPResponse::ToTextFirstLineLC
+// From CSIPMessage:
+// -----------------------------------------------------------------------------
+//
+HBufC8* CSIPResponse::ToTextFirstLineLC () const
+	{
+	TPtrC8 sipVersion(SIPVersion().DesC());
+	TPtrC8 reasonPhrase(ReasonPhrase().DesC());
+	const TInt KMaxResponseAsTextLength = 3;
+	TBuf8<KMaxResponseAsTextLength> responseCodeAsText;
+	responseCodeAsText.Format(KTUintFormat, iResponseCode);
+
+	TUint statusLineLength = sipVersion.Length() + KSpace().Length() +
+							 responseCodeAsText.Length() + KSpace().Length() +
+							 reasonPhrase.Length();
+
+	HBufC8* statusLine = HBufC8::NewLC(statusLineLength);
+	TPtr8 statusLinePtr(statusLine->Des());
+	statusLinePtr.Append(sipVersion);
+	statusLinePtr.Append(KSpace);
+	statusLinePtr.Append(responseCodeAsText);
+	statusLinePtr.Append(KSpace);
+	statusLinePtr.Append(reasonPhrase);
+
+	return statusLine;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPResponse::SetReasonPhraseL
+// -----------------------------------------------------------------------------
+//
+void CSIPResponse::SetReasonPhraseL (const TDesC8& aReasonPhrase)
+	{
+	if (!SIPSyntaxCheck::ReasonPhrase(aReasonPhrase))
+		{
+		User::Leave(KErrSipCodecReasonPhrase);
+		}
+	RStringF tmpString = SIPStrings::Pool().OpenFStringL(aReasonPhrase);
+	iReasonPhrase.Close();
+	iReasonPhrase = tmpString;
+	}