diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btnotif/src/btnssppasskeyentrynotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/src/btnssppasskeyentrynotifier.cpp Wed Sep 01 12:20:04 2010 +0100 @@ -0,0 +1,282 @@ +/* +* Copyright (c) 2002 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: Declares authentication (PIN query) notifier class. +* +*/ + + +// INCLUDE FILES +#include // Localisation stringloader +#include // Unicode character conversion utilities +#include +#include +#include +#include +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#else +#include +#include +#endif +#include // Own resources +#include +#include +#include "btnotif.hrh" // Own resource header +#include "btnssppasskeyentrynotifier.h" // Own class definition +#include "btNotifDebug.h" // Debugging macros +#include "btnotifnameutils.h" + +#ifdef __SERIES60_HELP +#include +#include // The bt hrh info is needed, for help launching +#endif + + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::NewL +// Two-phased constructor. +// ---------------------------------------------------------- +// +CBTSSPPasskeyEntryNotifier* CBTSSPPasskeyEntryNotifier::NewL() + { + CBTSSPPasskeyEntryNotifier* self=new (ELeave) CBTSSPPasskeyEntryNotifier(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::CBTSSPPasskeyEntryNotifier +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------- +// +CBTSSPPasskeyEntryNotifier::CBTSSPPasskeyEntryNotifier() + { + iPasskey.Zero(); + } + +// ---------------------------------------------------------- +// Destructor +// ---------------------------------------------------------- +// +CBTSSPPasskeyEntryNotifier::~CBTSSPPasskeyEntryNotifier() + { + } + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::RegisterL +// Register notifier. +// ---------------------------------------------------------- +// +CBTSSPPasskeyEntryNotifier::TNotifierInfo CBTSSPPasskeyEntryNotifier::RegisterL() + { + iInfo.iUid = KBTPasskeyDisplayNotifierUid; + iInfo.iChannel = KBTPasskeyDisplayNotifierUid; + iInfo.iPriority = ENotifierPriorityVHigh; + return iInfo; + } + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::GetParamsL +// Initialize parameters and check if device is already +// in registry. Jump to RunL as soon as possible. +// ---------------------------------------------------------- +// +void CBTSSPPasskeyEntryNotifier::GetParamsL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage) + { + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GetParamsL()")); + + CBTNPairNotifierBase::GetParamsL( aBuffer, aReplySlot, aMessage ); + + TBTPasskeyDisplayParamsPckg pckg; + pckg.Copy(aBuffer); + iBTAddr = pckg().DeviceAddress(); + if ( OtherOutgoPairing(iBTAddr) ) + { + // We won't allow incoming pairing during outgoing pairing: + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier: outgoing pair in progress, reject incoming pair")); + CompleteMessage(KErrCancel); + return; + } + + iLocallyInitiated = pckg().LocallyInitiated(); + iPasskey.AppendNumFixedWidth(pckg().NumericalValue(), EDecimal, KPassKeylength); + iPasskey.Insert(3,_L(" ")); + + ProcessParamsGetDeviceL( iBTAddr, pckg().DeviceName() ); + + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GetParamsL() completed")); + } + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::UpdateL +// Notifier update. Stores the received bluetooth +// device name into registry and show it on screen. +// ---------------------------------------------------------- +// +TPtrC8 CBTSSPPasskeyEntryNotifier::UpdateL(const TDesC8& aBuffer) + { + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::UpdateL()")); + + TBTPasskeyDisplayUpdateParamsPckg pckg; + pckg.Copy(aBuffer); + + if(pckg().Type() != TBTNotifierUpdateParams2::EPasskeyDisplay) + { + TPtrC8 ret(KNullDesC8); + return (ret); + } + + switch (pckg().KeypressNotification()) + { + case EPasskeyEntryStarted: + { + iBuf.Zero(); + iBuf.Append(iPasskey); + iBuf.Append(_L(" ")); + break; + } + case EPasskeyDigitEntered: + { + // show an '*' + iBuf.Append(_L("*")); + break; + } + case EPasskeyDigitDeleted: + { + // remove an '*' from the tail of iBuf + iBuf.Delete(iBuf.Length()-1, 1); + break; + } + case EPasskeyCleared: + { + // remove all '*' + iBuf.Zero(); + iBuf.Append(iPasskey); + iBuf.Append(_L(" ")); + break; + } + case EPasskeyEntryCompleted: + { + // complete passkey entry + // Set iAnswer to 1 , + // Continue pairing in Run() + iAnswer = 1; + //iPasskeyDlg->DismissQueryL(); + iNotifUiUtil->DismissDialog(); + break; + } + } + if ( !iNotifUiUtil->IsQueryReleased() ) + { + RBuf prompt; + prompt.CleanupClosePushL(); + GenerateQueryPromptL( prompt ); + iNotifUiUtil->UpdateQueryDlgL( prompt ); + CleanupStack::PopAndDestroy( &prompt ); + } + + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::UpdateL() completed")); + TPtrC8 ret(KNullDesC8); + return (ret); + } + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::HandleGetDeviceCompletedL +// Ask user response and return it to caller. +// Store device into registry if user rejects the incoming pairing. +// ---------------------------------------------------------- +// +void CBTSSPPasskeyEntryNotifier::HandleGetDeviceCompletedL(const CBTDevice* /*aDev*/) + { + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::HandleGetDeviceCompletedL()")); + iAnswer = 0; + + // Check if blocked device. + if( CheckBlockedDeviceL() ) + return; + + // For pairing request from remote device + if ( !iLocallyInitiated ) + { + TBool keypress = AuthoriseIncomingPairingL(); + if( !keypress ) + { + //User rejects the incoming pairing, complete message in QueryBlockDevice. + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::HandleGetDeviceCompletedL() <<")); + return; + } + } + + TBTDeviceName nameCoverUi( KNullDesC ); + + iBuf.Zero(); + iBuf.Append(iPasskey); + iBuf.Append(_L(" ")); + + RBuf prompt; + prompt.CleanupClosePushL(); + GenerateQueryPromptL( prompt ); + + TInt answer = iNotifUiUtil->ShowQueryL( prompt, R_BT_PASSKEY_QUERY, + ECmdBTnotifUnavailable, nameCoverUi ); + CleanupStack::PopAndDestroy( &prompt ); + + if( iAnswer ) // user pressed entry key from remote keyboard. + { + CompleteMessage(KErrNone); + } + else + { + // If the outgoing pairing mode is set, then this is bonding initiated by the user. + TBool incomingConn = ( OutgoPairingMode( iBTAddr ) == EBTOutgoingPairNone ); + if( !iMessage.IsNull() ) + { + // No need to inform the user of the pairing result if the user cancelled it. + // If user doesn't answer anything but stack cancels, pairing result is needed + // to show for outgoing pairing. In this case, don't stop pairng observer. + (void) CBTEngConnMan::StopPairingObserver( iBTAddr ); + } + // We may be asking for pairing (locally initiated), because a remote device is requesting + // accesss to a service for which we require authentication. + if( iLocallyInitiated && incomingConn ) + { + CheckAndHandleQueryIntervalL(); + } + CompleteMessage(KErrCancel); + } + + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::HandleGetDeviceCompletedL() completed")); + } + +// ---------------------------------------------------------- +// CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL +// ---------------------------------------------------------- +// +void CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL( RBuf& aRBuf ) + { + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL()")); + TBTDeviceName devName; + BtNotifNameUtils::GetDeviceDisplayName(devName, iDevice); + BluetoothUiUtil::LoadResourceAndSubstringL( + aRBuf, R_BT_SSP_PASSKEY_ENTRY, devName, 0 ); + BluetoothUiUtil::AddSubstringL( aRBuf, iBuf, 1 ); + FLOG(_L("[BTNOTIF]\t CBTSSPPasskeyEntryNotifier::GenerateQueryPromptL() << ")); + + } +// End of File