bluetooth/btstack/secman/simplepairingresult.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/secman/simplepairingresult.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,199 @@
+// Copyright (c) 2008-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:
+//
+
+#include "simplepairingresult.h"
+
+#include <bluetooth/logger.h>
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_PAIRING_SERVER);
+#endif
+
+
+
+CSimplePairingResultList* CSimplePairingResultList::NewL()
+	{
+	LOG_STATIC_FUNC
+	CSimplePairingResultList* self = new(ELeave) CSimplePairingResultList();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CSimplePairingResultList::CSimplePairingResultList()
+	: CBluetoothSecurityResultList(KSimplePairingResultListMaxSize)
+	{
+	LOG_FUNC
+	}
+
+CAuthenticationResultList* CAuthenticationResultList::NewL()
+	{
+	LOG_STATIC_FUNC
+	CAuthenticationResultList* self = new(ELeave) CAuthenticationResultList();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CAuthenticationResultList::CAuthenticationResultList()
+	: CBluetoothSecurityResultList(KAuthenticationResultListMaxSize)
+	{
+	LOG_FUNC
+	}
+
+CBluetoothSecurityResultList::CBluetoothSecurityResultList(TInt aMaxListCount)
+	: iResultList(_FOFF(TBluetoothSecurityResult, iLink))
+	, iListCount(0)
+	, iMaxListCount(aMaxListCount)
+	{
+	LOG_FUNC
+	}
+
+void CBluetoothSecurityResultList::ConstructL()
+	{
+	LOG_FUNC
+	}
+
+CBluetoothSecurityResultList::~CBluetoothSecurityResultList()
+	{
+	LOG_FUNC
+	while(!iResultList.IsEmpty())
+		{
+		TBluetoothSecurityResult* entry = iResultList.First();
+		entry->iLink.Deque();
+		delete entry;
+		}
+	}
+
+void CBluetoothSecurityResultList::NewResult(const TBTDevAddr& aDevAddr, TInt aResult)
+	{
+	LOG_FUNC
+	if(iObserver)
+		{
+		// Add the new entry.
+		TBluetoothSecurityResult* entry = new TBluetoothSecurityResult(aDevAddr, aResult);
+		if(!entry)
+			{
+			// OOM so we've lost a result - oh well we did our best.
+			return;
+			}
+		iResultList.AddLast(*entry);
+		++iListCount;
+
+		// Trim the list if needed
+		while(iListCount > iMaxListCount)
+			{
+			entry = iResultList.First();
+			entry->iLink.Deque();
+			--iListCount;
+			delete entry;
+			}
+
+		// Complete any outstanding notifications.
+		if(iOutstandingNotification)
+			{
+			iOutstandingNotification = EFalse;
+			ReturnResult();
+			}
+		}
+
+	}
+
+void CBluetoothSecurityResultList::RegisterObserverL(MBluetoothSecurityResultObserver& aObserver)
+	{
+	LOG_FUNC
+	if(iObserver)
+		{
+		LEAVEL(KErrAlreadyExists);
+		}
+	iObserver = &aObserver;
+	}
+
+void CBluetoothSecurityResultList::ReleaseObserver(MBluetoothSecurityResultObserver& aObserver)
+	{
+	LOG_FUNC
+	if(iObserver == &aObserver)
+		{
+		iObserver = NULL;
+		//Clear the list so that any queued results are not returned to the observer during the next session
+		//(not doing this can cause results for a previous pairing request to be returned to a client-side app during the next pairing request).
+		while (!iResultList.IsEmpty())
+			{
+			TBluetoothSecurityResult* entry = iResultList.First();
+			entry->iLink.Deque();
+			delete entry;
+			}
+
+		//Set iListCount to zero.
+		iListCount=0;
+		}
+	}
+
+void CBluetoothSecurityResultList::ReturnResult()
+	{
+	LOG_FUNC
+	if(iListCount > 0)
+		{
+		__ASSERT_DEBUG(!iResultList.IsEmpty(), PANIC(KBluetoothSecListFaultCat, EResultListCountMismatch));
+		__ASSERT_DEBUG(iObserver, PANIC(KBluetoothSecListFaultCat, ENoBoundObserver));
+		TBluetoothSecurityResult* entry = iResultList.First();
+		__ASSERT_DEBUG(entry, PANIC(KBluetoothSecListFaultCat, ENullResultListEntry));
+		TInt err = iObserver->MbsroResult(entry->DeviceAddress(), entry->Result());
+		if(err == KErrNone)
+			{
+			entry->iLink.Deque();
+			--iListCount;
+			delete entry;
+			}
+		}
+	else
+		{
+		__ASSERT_DEBUG(!iOutstandingNotification, PANIC(KBluetoothSecListFaultCat, ENotificationAlreadyOutstanding));
+		iOutstandingNotification = ETrue;
+		}
+	}
+
+void CBluetoothSecurityResultList::CancelReturn()
+	{
+	LOG_FUNC
+	iOutstandingNotification = EFalse;
+	}
+
+
+//
+// TBluetoothSecurityResult
+//
+
+
+TBluetoothSecurityResult::TBluetoothSecurityResult(const TBTDevAddr& aDevAddr, TInt aResult)
+	: iDeviceAddress(aDevAddr)
+	, iResult(aResult)
+	{
+	LOG_FUNC
+	}
+
+const TBTDevAddr& TBluetoothSecurityResult::DeviceAddress() const
+	{
+	LOG_FUNC
+	return iDeviceAddress;
+	}
+
+TInt TBluetoothSecurityResult::Result() const
+	{
+	LOG_FUNC
+	return iResult;
+	}
+