diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Codec/src/CSIPResponse.cpp --- /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 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; + }