diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btexample/testui/BTTextNotifiers/src/pannapuplinkauthorisationnotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btexample/testui/BTTextNotifiers/src/pannapuplinkauthorisationnotifier.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,264 @@ +// 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: +// + +#include "pannapuplinkauthorisationnotifier.h" + +#include +#include +#include // For PAN UUIDs + +_LIT(KNapUplinkAuthorisationNotifierConsoleName, "PAN NAP Uplink Authorisation Notifier"); +_LIT(KYes,"Yes"); +_LIT(KNo,"No"); + +/*static*/ CPanNapUplinkAuthorisationNotifier* CPanNapUplinkAuthorisationNotifier::NewLC() + { + CPanNapUplinkAuthorisationNotifier* self = new (ELeave)CPanNapUplinkAuthorisationNotifier(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CPanNapUplinkAuthorisationNotifier::~CPanNapUplinkAuthorisationNotifier() + { + delete iSelectorEngine; + } + +CPanNapUplinkAuthorisationNotifier::CPanNapUplinkAuthorisationNotifier() + { + iNotifierInfo.iUid = KBTPanNapUplinkAuthorisationNotifierUid; + iNotifierInfo.iChannel = TUid::Uid(KScreenOutputChannelNumber); + iNotifierInfo.iPriority = ENotifierPriorityVLow; + } + +void CPanNapUplinkAuthorisationNotifier::ConstructL() + { + iSelectorEngine = CPanNapUplinkAuthorisationNotifierEngine::NewL(*this); + } + + + // From MNotifierBase2 + +void CPanNapUplinkAuthorisationNotifier::Release() + { + Cancel(); + delete this; + } + +CPanNapUplinkAuthorisationNotifier::TNotifierInfo CPanNapUplinkAuthorisationNotifier::RegisterL() + { + return iNotifierInfo; + } + +CPanNapUplinkAuthorisationNotifier::TNotifierInfo CPanNapUplinkAuthorisationNotifier::Info() const + { + return iNotifierInfo; + } + +TPtrC8 CPanNapUplinkAuthorisationNotifier::StartL(const TDesC8& /*aBuffer*/) + { + // Sync calls not supported. + User::Leave(KErrNotSupported); + return KNullDesC8(); + } + +void CPanNapUplinkAuthorisationNotifier::StartL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage) + { + iReplySlot = aReplySlot; + iMessage = RMessage2(aMessage); + iMessageOutstanding = ETrue; + + iSelectorEngine->GetLocalServiceL(aBuffer); + } + +void CPanNapUplinkAuthorisationNotifier::Cancel() + { + iSelectorEngine->Cancel(); + CompleteNotifier(KErrCancel, EDisallowNewNapConnection); + } + +TPtrC8 CPanNapUplinkAuthorisationNotifier::UpdateL(const TDesC8& /*aBuffer*/) + { + User::Leave(KErrNotSupported); + return KNullDesC8(); + } + + + // From MPanNapUplinkAuthorisationNotifierNotifier +void CPanNapUplinkAuthorisationNotifier::CompleteNotifier(TInt aError, TNapConnectionResult aResult) + { + if(aError == KErrNone) + { + iResultPckg = aResult; + aError = iMessage.Write(iReplySlot, iResultPckg); + } + + if(iMessageOutstanding) + { + iMessage.Complete(aError); + iMessageOutstanding = EFalse; + } + } + + + +/*static*/ CPanNapUplinkAuthorisationNotifierEngine* CPanNapUplinkAuthorisationNotifierEngine::NewL(MPanNapUplinkAuthorisationNotifierNotifier& aNotifier) + { + CPanNapUplinkAuthorisationNotifierEngine* self = new (ELeave)CPanNapUplinkAuthorisationNotifierEngine(aNotifier); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CPanNapUplinkAuthorisationNotifierEngine::~CPanNapUplinkAuthorisationNotifierEngine() + { + delete iConsole; + } + +CPanNapUplinkAuthorisationNotifierEngine::CPanNapUplinkAuthorisationNotifierEngine(MPanNapUplinkAuthorisationNotifierNotifier& aNotifier) + : CActive(CActive::EPriorityStandard), + iNotifier(aNotifier) + { + CActiveScheduler::Add(this); + } + +void CPanNapUplinkAuthorisationNotifierEngine::ConstructL() + { + } + +void CPanNapUplinkAuthorisationNotifierEngine::GetLocalServiceL(const TDesC8& aBuffer) + { + iConsole = Console::NewL(KNapUplinkAuthorisationNotifierConsoleName, TSize(KConsFullScreen, KConsFullScreen)); + iConnectionListPckg.Copy(aBuffer); + + DrawExistingConnections(); + DrawInstructionsAndWaitForInput(); + } + +void CPanNapUplinkAuthorisationNotifierEngine::DrawExistingConnections() + { + TBuf<20> bdAddrBuf; + const TBTDevAddr* panConnAddr = NULL; + const TPanConnection* existingPanConnection = NULL; + + iConsole->ClearScreen(); + + // Get the requested connection address + panConnAddr = iConnectionListPckg().RequestedConnectionAddr(); + + if(panConnAddr) + { + panConnAddr->GetReadable(bdAddrBuf); + iConsole->Printf(_L("New connection requested from device [%S]\n"), &bdAddrBuf); + } + else + { + iConsole->Printf(_L("New connection requested from device [**Unknown**]\n")); + } + + // Draw existing connections + existingPanConnection = iConnectionListPckg().GetFirstRemoteConnection(); + if(existingPanConnection) + { + // Print the current local role. + if(iConnectionListPckg().CurrentLocalRole() == TUUID(KPanUUUID)) + { + iConsole->Printf(_L("Current local role [PAN-U]\n")); + } + else if(iConnectionListPckg().CurrentLocalRole() == TUUID(KPanGnUUID)) + { + iConsole->Printf(_L("Current local role [PAN-GN]\n")); + } + else if(iConnectionListPckg().CurrentLocalRole() == TUUID(KPanNapUUID)) + { + iConsole->Printf(_L("Current local role [PAN-NAP]\n")); + } + else + { + iConsole->Printf(_L("Current local role [**Unknown**]\n")); + } + + iConsole->Printf(_L("\n\nExisting connections\n")); + iConsole->Printf(_L("\nAddress Has Uplink Access\n")); + + while(existingPanConnection) + { + existingPanConnection->RemoteDeviceAddress().GetReadable(bdAddrBuf); + iConsole->Printf(_L(" [%S] %S\n"), &bdAddrBuf, existingPanConnection->UplinkAccessAllowed() ? &KYes : &KNo); + + existingPanConnection = iConnectionListPckg().GetNextRemoteConnection(); + } + } + else + { + iConsole->Printf(_L("\n -- No existing connections --\n")); + } + } + +void CPanNapUplinkAuthorisationNotifierEngine::DrawInstructionsAndWaitForInput() + { + iConsole->Printf(_L("\n\nPress 'd' to disallow new connection\n")); + iConsole->Printf(_L("Press 'n' to give the remote device network access\n")); + iConsole->Printf(_L("Press 'l' to give the remote device access to the local network\n")); + iConsole->Printf(_L("-> ")); + + iConsole->Read(iStatus); + SetActive(); + } + +void CPanNapUplinkAuthorisationNotifierEngine::RunL() + { + TChar key = iConsole->KeyCode(); + switch(key) + { + case 'd': + iNotifier.CompleteNotifier(KErrNone, EDisallowNewNapConnection); + CloseConsoleWindow(); + break; + + case 'l': + iNotifier.CompleteNotifier(KErrNone, EAcceptNapConnectionDisallowUplinkAccess); + CloseConsoleWindow(); + break; + + case 'n': + iNotifier.CompleteNotifier(KErrNone, EAcceptNapConnectionAllowUplinkAccess); + CloseConsoleWindow(); + break; + + default: + // Invalid character - request input again. + DrawExistingConnections(); + iConsole->Printf(_L("\n *** Invalid option [%c] Please try again ***\n"), TUint(key)); + DrawInstructionsAndWaitForInput(); + break; + }; + } + +void CPanNapUplinkAuthorisationNotifierEngine::DoCancel() + { + iConsole->ReadCancel(); + + CloseConsoleWindow(); + } + +void CPanNapUplinkAuthorisationNotifierEngine::CloseConsoleWindow() + { + // Delete the console window + delete iConsole; + iConsole = NULL; + } +