networkcontrol/commsuserpromptmgr/database/src/netupsthreadentry.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/commsuserpromptmgr/database/src/netupsthreadentry.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,283 @@
+// 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:
+// This file provides the implementation for the thread entry.
+// @internalComponent
+// @prototype
+// 
+//
+
+#include "e32base.h"				// defines CleanupStack
+
+#include "netupsthreadentry.h"
+#include "netupsdatabaseentry.h"
+#include "netupsprocessentry.h"
+#include "netupssubsession.h"
+#include "netupsthreadmonitor.h"
+#include "netupspolicycheckrequestqueue.h"
+#include "netupsassert.h"
+
+#include <ups/upsclient.h>
+
+#include <comms-infras/commsdebugutility.h> 		// defines the comms debug logging utility
+
+namespace NetUps
+{
+__FLOG_STMT(_LIT8(KNetUpsSubsys, 	"esock");)   
+__FLOG_STMT(_LIT8(KNetUpsComponent, "NetUps");) /*esockloader*/
+
+CThreadEntry* CThreadEntry::NewL(CDatabaseEntry& aDatabaseEntry, CProcessEntry& aProcessEntry, const TThreadId& aThreadId, UserPromptService::RUpsSession& aUpsSession)
+	{
+	CThreadEntry* self = new (ELeave) CThreadEntry(aThreadId);
+
+	CleanupStack::PushL(self);
+	self->ConstructL(aDatabaseEntry, aProcessEntry, aUpsSession);
+	CleanupStack::Pop(self);
+
+	return self;
+	}
+
+CThreadEntry::CThreadEntry(const TThreadId& aThreadId) :  iIsDead(EFalse), iThreadId(aThreadId), iThreadMonitor(NULL)
+	{
+	}
+	
+void CThreadEntry::ConstructL(CDatabaseEntry& aDatabaseEntry, CProcessEntry& aProcessEntry, UserPromptService::RUpsSession& aUpsSession)
+	{
+	__FLOG_OPEN(KNetUpsSubsys, KNetUpsComponent);
+
+	iSubSession 	= CSubSession::NewL(aUpsSession, aDatabaseEntry, aProcessEntry, *this);
+	iQueue 			= CPolicyCheckRequestQueue::NewL(*iSubSession); 
+	iThreadMonitor 	= CThreadMonitor::NewL(aDatabaseEntry, aProcessEntry, *this);
+
+	__FLOG_6(_L("CThreadEntry %08x:\tConstructL(), iIsDead = %d, thread id = %d, iThreadMonitor = %08x, iSubSession = %08x, iQueue = %08x"), this, iIsDead, iThreadId.Id(), iThreadMonitor, iSubSession, iQueue);	
+	}
+
+CThreadEntry::~CThreadEntry() 
+	{
+	__FLOG_1(_L("CThreadEntry %08x:\t~CThreadEntry()"), this);
+
+	for (TInt i = iConnectionEntry.Count() - 1; i >=0; --i )
+		{
+		delete iConnectionEntry[i];
+		}	
+	iConnectionEntry.Reset();
+	iConnectionEntry.Close();
+
+	delete	iThreadMonitor;
+	delete	iSubSession;
+	delete  iQueue;
+
+	__FLOG_CLOSE;	
+	}
+
+TBool CThreadEntry::FindConnectionEntry(const Messages::TNodeId& aCommsId, TInt32& aIndex)
+	{
+	TBool found = EFalse;
+	for (TInt i = iConnectionEntry.Count() - 1; i >=0; --i)
+		{
+		if (iConnectionEntry[i]->CommsId() == aCommsId)
+			{
+			aIndex = i;
+			found = ETrue;
+			break;
+			}
+		}
+		
+	return found;	
+	}
+
+void CThreadEntry::AddCommsIdL(const Messages::TNodeId& aCommsId)
+	{
+	//__FLOG_2(_L("CThreadEntry %08x:\t AddCommsIdL(), aCommsId = %d"), this, aCommsId.Printable());
+	__FLOG_1(_L("CThreadEntry %08x:\tAddCommsIdL()"), this);
+
+	TInt32 index = 0;
+	TBool found = FindConnectionEntry(aCommsId, index);
+		
+	if (found == EFalse)
+		{
+		CConnectionEntry* connectionEntry = CConnectionEntry::NewL(aCommsId, (TInt) 0);
+		CleanupStack::PushL(connectionEntry);
+		iConnectionEntry.AppendL(connectionEntry);
+		CleanupStack::Pop(connectionEntry);
+		}		
+	}
+
+TBool CThreadEntry::RemoveCommsId(const Messages::TNodeId& aCommsId)
+	{
+	//__FLOG_2(_L("CThreadEntry %08x:\tRemoveCommsId(), aCommsId %08x"), this, aCommsId);
+	__FLOG_1(_L("CThreadEntry %08x:\tRemoveCommsId()"), this);
+
+	TInt32 index = 0;
+	TBool found = FindConnectionEntry(aCommsId, index);
+
+	TBool commsIdRemoved = EFalse;
+	if (found && (iConnectionEntry[index]->Count() == 0))
+		{
+		delete iConnectionEntry[index];
+		iConnectionEntry[index] = 0;
+		iConnectionEntry.Remove(index);			
+		commsIdRemoved = ETrue;
+		}
+
+	return commsIdRemoved;
+	}
+
+void CThreadEntry::IncrementConnectionCount(const Messages::TNodeId& aCommsId)
+	{
+	//__FLOG_2(_L("CThreadEntry %08x:\t IncrementConnectionCount(), aCommsId = %d"), this, aCommsId.Printable());
+	__FLOG_1(_L("CThreadEntry %08x:\t IncrementConnectionCount()"), this);
+
+	TInt32 index = 0;
+	TBool found = FindConnectionEntry(aCommsId, index);
+		
+	if (found == EFalse)
+		{
+		User::Panic(KNetUpsPanic, KPanicInvalidLogic);					
+		}	
+	else
+		{
+		iConnectionEntry[index]->IncrementCount();	
+		}
+	}
+
+void CThreadEntry::IncrementConnectionCountL(const Messages::TNodeId& aCommsId)
+	{
+	//__FLOG_2(_L("CThreadEntry %08x:\t IncrementConnectionCount(), aCommsId = %d"), this, aCommsId.Printable());
+	__FLOG_1(_L("CThreadEntry %08x:\tIncrementConnectionCountL()"), this);
+
+	TInt32 index = 0;
+	TBool found = FindConnectionEntry(aCommsId, index);
+		
+	if (found == EFalse)
+		{
+		CConnectionEntry* connectionEntry = CConnectionEntry::NewL(aCommsId, (TInt) 1);
+		CleanupStack::PushL(connectionEntry);
+		iConnectionEntry.AppendL(connectionEntry);
+		CleanupStack::Pop(connectionEntry);
+		}
+	else
+		{
+		iConnectionEntry[index]->IncrementCount();
+		}		
+	}
+
+void CThreadEntry::DecrementConnectionCount(const Messages::TNodeId& aCommsId)
+	{
+	//__FLOG_2(_L("CThreadEntry %08x:\t DecrementConnectionCount(), aCommsId = %d"), this, aCommsId.Printable());
+	__FLOG_1(_L("CThreadEntry %08x:\tDecrementConnectionCount()"), this);
+
+	TInt32 index = 0;
+	TBool found = FindConnectionEntry(aCommsId, index);
+
+	if (found == EFalse)
+		{
+		User::Panic(KNetUpsPanic, KPanicInvalidLogic);
+		}
+	else
+		{
+		iConnectionEntry[index]->DecrementCount();
+		if (iConnectionEntry[index]->Count() == 0)
+			{
+			delete iConnectionEntry[index];
+			iConnectionEntry[index] = 0;
+			iConnectionEntry.Remove(index);
+			}
+		}		
+	}
+
+TInt32 CThreadEntry::ConnectionCount()
+	{
+	__FLOG_1(_L("CThreadEntry %08x:\tConnectionCount()"), this);
+
+	TInt32 count = 0;
+	
+	for (TInt i = iConnectionEntry.Count() - 1; i >=0; --i )
+		{
+		count+= iConnectionEntry[i]->Count();
+		}	
+
+	__FLOG_2(_L("\tcount = %d"), this, count);
+	
+	return count;
+	}
+
+TInt32	CThreadEntry::ConnectionCount(const Messages::TNodeId& aCommsId)
+	{
+	//__FLOG_2(_L("CThreadEntry %08x:\t ConnectionCount(), aCommsId = %d"), this, aCommsId.Printable());
+	__FLOG_1(_L("CThreadEntry %08x:\t ConnectionCount()"), this);
+
+	TInt32 index = 0;
+	TInt32 count = 0;
+	TBool found = FindConnectionEntry(aCommsId, index);
+
+	if (found == EFalse)
+		{
+		User::Panic(KNetUpsPanic, KPanicInvalidLogic);
+		}
+	else
+		{
+		count = iConnectionEntry[index]->Count();			
+		}	
+
+	return count;
+	}
+
+RPointerArray<CConnectionEntry>& CThreadEntry::ConnectionEntry()
+	{
+	return iConnectionEntry;	
+	}
+
+const TThreadId& CThreadEntry::ThreadId() const
+	{
+	return iThreadId;
+	}
+
+void CThreadEntry::SetIsDead(TBool aDead)
+	{
+	iIsDead = aDead;
+	}
+
+TBool CThreadEntry::IsDead() const
+	{
+	return iIsDead;
+	}
+
+void CThreadEntry::SetThreadMonitor(CThreadMonitor* aThreadMonitor)
+	{
+	iThreadMonitor = aThreadMonitor;	
+	__FLOG_6(_L("CThreadEntry %08x:\t SetThreadMonitor(), iIsDead = %d, thread id = %d, iThreadMonitor = %08x, iSubSession = %08x, iQueue = %08x"), this, iIsDead, iThreadId.Id(), iThreadMonitor, iSubSession, iQueue);	
+	}
+
+CThreadMonitor* CThreadEntry::ThreadMonitor() const
+	{
+	return iThreadMonitor;
+	}
+
+void CThreadEntry::SetSubSession(CSubSession* aSubSession)
+	{
+	iSubSession = aSubSession;	
+	__FLOG_6(_L("CThreadEntry %08x:\t SetSubSession(), iIsDead = %d, iThreadId.Id() = %d, iThreadMonitor = %08x, iSubSession = %08x, iQueue = %08x"), this, iIsDead, iThreadId.Id(), iThreadMonitor, iSubSession, iQueue);
+	}
+
+CSubSession* CThreadEntry::SubSession() const
+	{
+	return iSubSession;
+	}
+
+CPolicyCheckRequestQueue& CThreadEntry::RequestQueue() const
+	{
+	return *iQueue;
+	}
+
+} // end of namespace