diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/secman/simplepairingresult.cpp --- /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 +#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; + } +