--- /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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> 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<CSipDialogItem> iter(iList);
+ for (CSipDialogItem* dialog = iter; dialog; dialog = iter++)
+ {
+ if (dialog->TransactionItems().HasItem(aTransactionId))
+ {
+ dialog->EndTransaction(aTransactionId,aReason);
+ }
+ }
+ }