diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Dialogs/src/DialogsStore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Dialogs/src/DialogsStore.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,327 @@ +// 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 : DialogsStore.cpp +// Part of : SIPDialogs +// Version : SIP/4.0 +// + + + + +#include "DialogsStore.h" +#include "TransactionItemStore.h" +#include "DeleteMgr.h" +#include "sipmessage.h" +#include "SipStackServerDefs.h" +#include "sipfromheader.h" +#include "siptoheader.h" +#include "sipcallidheader.h" +#include "sipcseqheader.h" +#include "sipaddress.h" +#include "sipuri.h" +#include "sipresponse.h" +#include "siprequest.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "TSIPTransportParams.h" + + +// ----------------------------------------------------------------------------- +// CDialogsStore::NewL +// ----------------------------------------------------------------------------- +// +CDialogsStore* CDialogsStore::NewL() + { + CDialogsStore* self = new (ELeave) CDialogsStore; + return self; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::CDialogsStore +// ----------------------------------------------------------------------------- +// +CDialogsStore::CDialogsStore() + : iList(CSipDialogItem::Offset()) + { + iTagParamName = SIPStrings::StringF(SipStrConsts::ETag); + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::~CDialogsStore +// ----------------------------------------------------------------------------- +// +CDialogsStore::~CDialogsStore() + { + CSipDialogItem* listItem = iList.First(); + + while (iList.IsFirst(listItem) && !iList.IsEmpty()) + { + iList.Remove(*listItem); + delete listItem; + listItem = iList.First(); + } + + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::AddDialogItem +// ----------------------------------------------------------------------------- +// +void CDialogsStore::AddDialogItem(CSipDialogItem* aDialogItem) + { + iList.AddLast(*aDialogItem); + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::DialogItemsCount +// ----------------------------------------------------------------------------- +// +TInt CDialogsStore::DialogItemsCount() + { + TSglQueIter listIter(iList); + TInt counter = 0; + for (CSipDialogItem* listItem = listIter++; listItem; listItem = listIter++) + { + counter++; + } + return counter; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::Remove +// ----------------------------------------------------------------------------- +// +TInt CDialogsStore::Remove (CSipDialogItem* aDialogItem) + { + TInt err = aDialogItem->DeleteMgr().AddDeleteRequest(aDialogItem); + if (!err) + { + iList.Remove(*aDialogItem); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::RemoveAllWith +// ----------------------------------------------------------------------------- +// +TInt CDialogsStore::RemoveAllWith (const MDialogOwner* aDialogOwner) + { + TInt err = KErrNotFound; + TSglQueIter listIter(iList); + for (CSipDialogItem* listItem = listIter++; listItem; listItem = listIter++) + { + if (listItem->DialogOwner() == aDialogOwner) + { + iList.Remove(*listItem); + delete listItem; + err = KErrNone; + } + } + return err; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::RemoveAllEarlyDialogsWith +// ----------------------------------------------------------------------------- +// +TInt CDialogsStore::RemoveAllEarlyDialogsWith (TTransactionId aTransactionId) + { + TInt err = KErrNotFound; + TSglQueIter listIter(iList); + for (CSipDialogItem* item = listIter++; item; item = listIter++) + { + if (item->HasTransactionItem(aTransactionId) && item->IsEarly()) + { + err = Remove(item); + } + } + return err; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::DeleteItemsWithThisIapId +// ----------------------------------------------------------------------------- +// +void CDialogsStore::DeleteItemsWithThisIapId(TUint32 aIapId) + { + TSglQueIter listIter(iList); + for (CSipDialogItem* listItem = listIter++; listItem; listItem = listIter++) + { + if (listItem->IapId() == aIapId) + { + iList.Remove(*listItem); + delete listItem; + } + } + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::FindDialogItem +// ----------------------------------------------------------------------------- +// +CSipDialogItem* CDialogsStore::FindDialogItem(const TDialogId& aDialogId) + { + TSglQueIter iter(iList); + for (CSipDialogItem* item = iter++; item; item = iter++) + { + if (item->DialogId() == aDialogId) + { + return item; + } + } + return NULL; + } + + +// ----------------------------------------------------------------------------- +// CDialogsStore::FindDialogItem +// ----------------------------------------------------------------------------- +// +CSipDialogItem* CDialogsStore::FindDialogItem(const TDialogId& aDialogId, + const MDialogOwner* aDialogOwner) + { + TSglQueIter iter(iList); + for (CSipDialogItem* item = iter++; item; item = iter++) + { + if (item->DialogId() == aDialogId && + item->DialogOwner() == aDialogOwner) + { + return item; + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::FindDialogItemByTransaction +// ----------------------------------------------------------------------------- +// +CSipDialogItem* CDialogsStore::FindDialogItemByTransaction( + const TTransactionId& aTransactionId) + { + TSglQueIter iter(iList); + for (CSipDialogItem* item = iter++; item; item = iter++) + { + if (item->HasTransactionItem(aTransactionId)) + { + return item; + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::FindDialogItemForPass +// ----------------------------------------------------------------------------- +// +CSipDialogItem* +CDialogsStore::FindDialogItemForPass (TTransactionId aTransactionId, + CSIPResponse* aResponse) + { + CSIPToHeader* to = aResponse->To(); + if (to) + { + TSglQueIter listIter(iList); + for (CSipDialogItem* item = listIter++; item; item = listIter++) + { + if (item->RemoteTagSet() && + item->RemoteTag() == to->ParamValue(iTagParamName) && + item->HasTransactionItem(aTransactionId)) + { + return item; + } + } + } + return 0; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::DialogItemForRequest +// ----------------------------------------------------------------------------- +// +CSipDialogItem* CDialogsStore::DialogItemForRequest(CSIPRequest* aRequest) + { + if (!aRequest) + { + return NULL; + } + + TSglQueIter listIter(iList); + for (CSipDialogItem* item = listIter++; item; item = listIter++) + { + if (item->Match(*aRequest)) + { + return item; + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::FindDialogItemByCallId +// ----------------------------------------------------------------------------- +// +CSipDialogItem* CDialogsStore::FindDialogItemByCallId(CSIPMessage* aMessage) + { + if (aMessage) + { + TSglQueIter listIter(iList); + CSIPCallIDHeader* callId = aMessage->CallID(); + + for (CSipDialogItem* item = listIter++; item; item = listIter++) + { + if (*callId == *item->CallId()) + { + return item; + } + } + } + return 0; + } + +// ----------------------------------------------------------------------------- +// CDialogsStore::NewDialogId +// ----------------------------------------------------------------------------- +// +TDialogId CDialogsStore::NewDialogId() + { + if (iDialogIdCounter < KMaxDialogId) + { + iDialogIdCounter++; + } + else + { + iDialogIdCounter = KMinDialogId; + } + return iDialogIdCounter; + } + + +// ----------------------------------------------------------------------------- +// CDialogsStore::TransactionEnded +// ----------------------------------------------------------------------------- +// +void CDialogsStore::TransactionEnded (TTransactionId aTransactionId, + TInt aReason) + { + TSglQueIter iter(iList); + for (CSipDialogItem* dialog = iter; dialog; dialog = iter++) + { + if (dialog->TransactionItems().HasItem(aTransactionId)) + { + dialog->EndTransaction(aTransactionId,aReason); + } + } + }