diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Server/src/CSIPRoutingRequestStore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Server/src/CSIPRoutingRequestStore.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,195 @@ +// 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 : CSIPRoutingRequestStore.cpp +// Part of : SIP Server Core +// Version : SIP/4.0 +// + + + +#include "CSIPRoutingRequestStore.h" +#include "CSIPRoutingRequest.h" +#include "MSIPRequestRouterObserver.h" +#include "CSipServerCore.h" +#include "sipresponse.h" + + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::NewL +// ---------------------------------------------------------------------------- +// +CSIPRoutingRequestStore* CSIPRoutingRequestStore::NewL( + CSipServerCore& aServerCore) + { + CSIPRoutingRequestStore* self = + CSIPRoutingRequestStore::NewLC(aServerCore); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::NewLC +// ---------------------------------------------------------------------------- +// +CSIPRoutingRequestStore* CSIPRoutingRequestStore::NewLC( + CSipServerCore& aServerCore) + { + CSIPRoutingRequestStore* self = + new(ELeave)CSIPRoutingRequestStore(aServerCore); + CleanupStack::PushL(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::CSIPRoutingRequestStore +// ---------------------------------------------------------------------------- +// +CSIPRoutingRequestStore::CSIPRoutingRequestStore (CSipServerCore& aServerCore) +: iServerCore(aServerCore), + iList(CSIPRoutingRequest::LinkOffset()) + { + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::~CSIPRoutingRequestStore +// ---------------------------------------------------------------------------- +// +CSIPRoutingRequestStore::~CSIPRoutingRequestStore () + { + TSglQueIter iter(iList); + for (CSIPRoutingRequest* request = iter++; request; request = iter++) + { + iList.Remove(*request); + delete request; + } + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::TransactionOwnerL +// From MSIPRequestRouter +// ---------------------------------------------------------------------------- +// +TUint32 CSIPRoutingRequestStore::TransactionOwnerL( + CSIPRequest& aRequest, + TUint32 aIapId, + MSIPRequestRouterObserver& aObs) + { + CSIPRoutingRequest* request = CSIPRoutingRequest::NewLC(aIapId,aObs); + TUint32 requestId = iServerCore.RequestHandler().ChannelL(aRequest); + CleanupStack::Pop(request); + request->SetRequestId(requestId); + iList.AddLast(*request); + return requestId; + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::Cancel +// From MSIPRequestRouter +// ---------------------------------------------------------------------------- +// +void CSIPRoutingRequestStore::Cancel(TUint32 aRequestId) + { + iServerCore.RequestHandler().Cancel(aRequestId); + RemoveAndDelete(aRequestId); + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::ClientFoundL +// From MSIPRequestHandlerObserver +// ---------------------------------------------------------------------------- +// +void CSIPRoutingRequestStore::ClientFoundL(TUint32 aRequestId, TUid aUid) + { + CSIPRoutingRequest* request = Find(aRequestId); + if (request) + { + TUint32 iapId = request->IapId(); + MTransactionOwner* owner = iServerCore.FindOwner(iapId,aUid); + if (owner) + { + request->Observer().OwnerFoundL(aRequestId,owner); + } + else + { + request->Observer().ErrorOccurred(aRequestId,KErrNotFound); + } + RemoveAndDelete(aRequestId); + } + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::ClientNotFoundL +// From MSIPRequestHandlerObserver +// ---------------------------------------------------------------------------- +// +void CSIPRoutingRequestStore::ClientNotFoundL(TUint32 aRequestId, + CSIPResponse* aSIPResponse) + { + CSIPRoutingRequest* request = Find(aRequestId); + if (request) + { + request->Observer().OwnerNotFoundL(aRequestId,aSIPResponse); + RemoveAndDelete(aRequestId); + } + else + { + delete aSIPResponse; + } + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::ClientFoundL +// From MSIPRequestHandlerObserver +// ---------------------------------------------------------------------------- +// +void CSIPRoutingRequestStore::ErrorOccurred(TUint32 aRequestId, TInt aError) + { + CSIPRoutingRequest* request = Find(aRequestId); + if (request) + { + request->Observer().ErrorOccurred(aRequestId,aError); + RemoveAndDelete(aRequestId); + } + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::Find +// ---------------------------------------------------------------------------- +// +CSIPRoutingRequest* CSIPRoutingRequestStore::Find(TUint32 aRequestId) + { + TSglQueIter iter(iList); + for (CSIPRoutingRequest* request = iter++; request; request = iter++) + { + if (request->RequestId() == aRequestId) + { + return request; + } + } + return NULL; + } + +// ---------------------------------------------------------------------------- +// CSIPRoutingRequestStore::RemoveAndDelete +// ---------------------------------------------------------------------------- +// +void CSIPRoutingRequestStore::RemoveAndDelete(TUint32 aRequestId) + { + CSIPRoutingRequest* request = Find(aRequestId); + if (request) + { + iList.Remove(*request); + delete request; + } + }