realtimenetprots/sipfw/SIP/Dialogs/src/DialogsStore.cpp
changeset 0 307788aac0a8
--- /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);
+			}
+		}
+	}