diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Server/src/CSipCSSessionReceiver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Server/src/CSipCSSessionReceiver.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,248 @@ +// 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 : CSipCSSessionReceiver.cpp +// Part of : SIPServerCore +// Version : SIP/6.0 +// + + + +#include "CSipCSSessionReceiver.h" +#include "CSipCSSession.h" +#include "TSipCSReceiveItem.h" +#include "sipinternalerr.h" +#include "siperr.h" +#include "CSipCSServerITC.h" +#include "CSIPCSSerializer.h" +#include "sipresponse.h" + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::NewL +// ----------------------------------------------------------------------------- +// +CSipCSSessionReceiver* CSipCSSessionReceiver::NewL(CSipCSServerITC& aITC, + MSipCSSession& aSession) + { + CSipCSSessionReceiver* self = CSipCSSessionReceiver::NewLC(aITC,aSession); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::NewLC +// ----------------------------------------------------------------------------- +// +CSipCSSessionReceiver* CSipCSSessionReceiver::NewLC(CSipCSServerITC& aITC, + MSipCSSession& aSession) + { + CSipCSSessionReceiver* self = + new(ELeave)CSipCSSessionReceiver(aITC,aSession); + CleanupStack::PushL (self); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::CSipCSSessionReceiver +// ----------------------------------------------------------------------------- +// +CSipCSSessionReceiver::CSipCSSessionReceiver(CSipCSServerITC& aITC, + MSipCSSession& aSession) +: CSipCSReceiverBase(aITC,*this), + iHttpDigestObserverType(ESipNoHttpDigestObserver), + iSession(aSession) + { + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::~CSipCSSessionReceiver +// ----------------------------------------------------------------------------- +// +CSipCSSessionReceiver::~CSipCSSessionReceiver() + { + iPendingErrorItems.Close(); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::SetHttpDigestObserver +// ----------------------------------------------------------------------------- +// +void CSipCSSessionReceiver::SetHttpDigestObserver( + TSipHttpDigestObserverType aType) + { + iHttpDigestObserverType = aType; + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::MovePendingErrorsL +// ----------------------------------------------------------------------------- +// +void CSipCSSessionReceiver::MovePendingErrorsL(TUint32 aIapId, + CSipCSReceiverBase& aReceiver) + { + for (TInt i=iPendingErrorItems.Count()-1; i >= 0; i--) + { + const TSipCSReceiveItem& item = iPendingErrorItems[i]; + if (item.Ids().iIapId == aIapId) + { + aReceiver.AddItemL(item); + iPendingErrorItems.Remove(i); + } + } + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::ReceiveL +// From MTransactionOwner: +// ----------------------------------------------------------------------------- +// +void CSipCSSessionReceiver::ReceiveL(TUint32 aIapId, + TTransactionId aTransactionId, + CSIPRequest* aRequest) + { + MTransactionOwner& owner = iSession.FindOwner(aIapId); + if (&owner == this) + { + SipRequestReceivedL(aIapId,aTransactionId,aRequest); + } + else + { + // Subsession with matching IAP ID exists. Route request to it. + owner.ReceiveL(aIapId,aTransactionId,aRequest); + } + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::TransactionEnded +// From MTransactionOwner: +// ----------------------------------------------------------------------------- +// +TInt CSipCSSessionReceiver::TransactionEnded(TUint32 aIapId, + TTransactionId aTransactionId, + TInt aReason) + { + MTransactionOwner& owner = iSession.FindOwner(aIapId); + if (&owner != this) + { + // Subsession with matching IAP ID exists. Route callback to it. + return owner.TransactionEnded(aIapId,aTransactionId,aReason); + } + if (aReason != KErrTimedOut && aReason != KErrNone) + { + // For other errors than KErrTimedOut there is no callback + // in SIP Client API. Put these errors waiting until the + // user has created CSIPConnection (C/S subsession). + TSIPIds ids; + ids.iIapId = aIapId; + ids.iRequestId = aTransactionId; + TSipCSReceiveItem item(ids,aReason); + return iPendingErrorItems.Append(item); + } + return CSipCSReceiverBase::TransactionEnded(aIapId,aTransactionId,aReason); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::ReceiveL +// From MTransactionOwner: +// ----------------------------------------------------------------------------- +// +void CSipCSSessionReceiver::ReceiveL(TTransactionId /*aTransactionId*/, + CSIPResponse* /*aResponse*/) + { + User::Leave(KErrNotSupported); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::PassOnlyRealmsToUser +// From MSIPSecUser: +// ----------------------------------------------------------------------------- +// +TBool CSipCSSessionReceiver::PassOnlyRealmsToUser() const + { + return (iHttpDigestObserverType == ESipRealmHttpDigestObserver); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::RequestCredentialsL +// From MSIPSecUser: +// ----------------------------------------------------------------------------- +// +void CSipCSSessionReceiver::RequestCredentialsL(const TDesC8& aRealm) + { + __ASSERT_ALWAYS(iHttpDigestObserverType == ESipRealmHttpDigestObserver, + User::Leave(KErrSIPForbidden)); + + HBufC8* dummyContent = KNullDesC8().AllocLC(); + + const TInt KRealmBufExpandSize = 50; + CBufFlat* realmBuf = CBufFlat::NewL(KRealmBufExpandSize); + CleanupStack::PushL(realmBuf); + realmBuf->InsertL(0,aRealm); + + TSIPIds dummyIds; + TSipCSReceiveItem item(dummyIds,realmBuf,dummyContent, + EFalse,KChallengeReceived); + + HandleNewReceiveItemL(item); + + CleanupStack::Pop(realmBuf); + CleanupStack::Pop(dummyContent); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::RequestCredentialsL +// From MSIPSecUser: +// ----------------------------------------------------------------------------- +// +void CSipCSSessionReceiver::RequestCredentialsL(CSIPResponse& aResponse, + TTransactionId aTransactionId, + TRefreshId aRefreshId) + { + __ASSERT_ALWAYS(iHttpDigestObserverType == ESipResponseHttpDigestObserver, + User::Leave(KErrSIPForbidden)); + + TSIPIds ids; + ids.iRequestId = aTransactionId; + ids.iRefreshId = aRefreshId; + + CBufFlat* headers = iITC.Serializer().ExternalizeLC(aResponse); + HBufC8* content = aResponse.Content().AllocLC(); + TSipCSReceiveItem item(ids,headers,content,EFalse,KChallengeReceived); + + HandleNewReceiveItemL(item); + + CleanupStack::Pop(content); + CleanupStack::Pop(headers); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::TrustedUser +// From MSIPSecUser: +// ----------------------------------------------------------------------------- +// +const MSIPSecUser* CSipCSSessionReceiver::TrustedUser( + TRegistrationId aRegistrationId) + { + return iSession.SIPSecUser(aRegistrationId); + } + +// ----------------------------------------------------------------------------- +// CSipCSSessionReceiver::ByPassSIPSec +// From MSIPSecUser: +// ----------------------------------------------------------------------------- +// +TBool CSipCSSessionReceiver::ByPassSIPSec() const + { + return iSession.ByPassSIPSec(); + }