diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btnotif/src/btnpairnotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/src/btnpairnotifier.cpp Wed Sep 01 12:20:04 2010 +0100 @@ -0,0 +1,253 @@ +/* +* Copyright (c) 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: Base class for all notifiers for pairing purpose. +* +*/ + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#else +#include +#include // new file introduced by xSymbian +#endif + +#include // Unicode character conversion utilities +#include +#include // Own resources +#include +#include "btnpairnotifier.h" +#include "btNotifDebug.h" +#include "btnotifnameutils.h" + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::NewL +// ---------------------------------------------------------- +// +CBTNPairNotifierBase* CBTNPairNotifierBase::NewL() + { + CBTNPairNotifierBase* self = new (ELeave) CBTNPairNotifierBase(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase Destructor +// ---------------------------------------------------------- +// +CBTNPairNotifierBase::~CBTNPairNotifierBase() + { + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase default construct +// ---------------------------------------------------------- +// +CBTNPairNotifierBase::CBTNPairNotifierBase() + :iLocallyInitiated(EFalse) + { + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::RegisterL +// ---------------------------------------------------------- +// +CBTNPairNotifierBase::TNotifierInfo CBTNPairNotifierBase::RegisterL() + { + return iInfo; + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::GetParamsL +// ---------------------------------------------------------- +// +void CBTNPairNotifierBase::GetParamsL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage) + { + (void)aBuffer; + if( !iMessage.IsNull() ) + { + User::Leave(KErrInUse); + } + + iMessage = (RMessage2)aMessage; + iReplySlot = aReplySlot; + + if ( AutoLockOnL() ) + { + // The phone is locked, access denied. + // + CompleteMessage(KErrCancel); + } + + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::UpdateL +// ---------------------------------------------------------- +// +void CBTNPairNotifierBase::UpdateL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage) + { + (void) aReplySlot; + UpdateL(aBuffer); + aMessage.Complete(KErrNone); + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::UpdateL +// ---------------------------------------------------------- +// +TPtrC8 CBTNPairNotifierBase::UpdateL( const TDesC8& aBuffer ) + { + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::UpdateL()")); + + TBTDeviceNameUpdateParamsPckg pckg; + pckg.Copy( aBuffer ); + if (pckg().Type() != TBTNotifierUpdateParams2::EDeviceName) + { + TPtrC8 ret(KNullDesC8); + return (ret); + } + + if (pckg().Result() == KErrNone) + { + BtNotifNameUtils::SetDeviceNameL(pckg().DeviceName(), *iDevice); + + // Finally show new prompt for dialog if it is still on the screen + // and user has not given a alias for device. + if( !iNotifUiUtil->IsQueryReleased() && !iDevice->IsValidFriendlyName() ) + { + RBuf prompt; + prompt.CleanupClosePushL(); + GenerateQueryPromptL( prompt ); + iNotifUiUtil->UpdateQueryDlgL( prompt ); + CleanupStack::PopAndDestroy( &prompt ); + } + } + + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::UpdateL() completed")); + TPtrC8 ret(KNullDesC8); + return (ret); + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::ProcessParamsGetDeviceL +// Get device from registry based on notifier's param +// ---------------------------------------------------------- +// +void CBTNPairNotifierBase::ProcessParamsGetDeviceL( const TBTDevAddr& aAddr, const TBTDeviceName& aName ) + { + iDevice = CBTDevice::NewL(aAddr); + BtNotifNameUtils::SetDeviceNameL(aName, *iDevice); + + // Get all properties of device from registry. + GetDeviceFromRegL( aAddr ); + +#ifdef _DEBUG + FTRACE(FPrint(_L("[BTNOTIF]\t Executing authentication... Parameters:"))); + TBuf<12> deviceAddressString; + aAddr.GetReadable(deviceAddressString); + FTRACE(FPrint(_L("[BTNOTIF]\t BT Address: %S"), &deviceAddressString)); +#endif + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::CheckBlockedDeviceL +// Forbid pairing from remote banned devices +// ---------------------------------------------------------- +// +TBool CBTNPairNotifierBase::CheckBlockedDeviceL() + { + if ( !iDevice ) + { + User::Leave( KErrGeneral ); + } + + // Do not allow pairing attempt from banned devices + if( iDevice->GlobalSecurity().Banned() && !iLocallyInitiated ) + { + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::CheckBlockedDeviceL() Pairing attempt from banned device is denied.")); + CompleteMessage(KErrCancel); + return ETrue; + } + return EFalse; + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::AuthoriseIncomingPairingL +// Query user to authorise imcoming pair request or not. +// If reject, query whether to block the remot device. +// ---------------------------------------------------------- +// +TBool CBTNPairNotifierBase::AuthoriseIncomingPairingL() + { + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::AuthoriseIncomingPairingL() >>")); + + // Start pairing observer so that user will be informed about the result: + TInt err = CBTEngConnMan::StartPairingObserver( iBTAddr ); + if ( err ) + { + // Failed to start observer because of other ongoing pairing, + // reject this request: + CompleteMessage( err ); + return EFalse; + } + + TBTDeviceName devName; + BtNotifNameUtils::GetDeviceDisplayName( devName, iDevice ); + RBuf prompt; + prompt.CleanupClosePushL(); + BluetoothUiUtil::LoadResourceAndSubstringL( + prompt, R_BT_ACCEPT_PAIRING_REQUEST, devName, 0 ); + + devName.Zero(); + // Show query for use to accept/reject incoming pairing request + TInt keypress = iNotifUiUtil->ShowQueryL( prompt, R_BT_GENERIC_QUERY, + ECmdBTnotifUnavailable, devName, CAknQueryDialog::EConfirmationTone ); + CleanupStack::PopAndDestroy( &prompt ); + + if( iMessage.IsNull() ) // cancelled by the stack + { + return EFalse; + } + else if( !keypress ) // User rejected pairing + { + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase: user rejected incoming pairing")); + // stop observer to omit pairing failure note. + CBTEngConnMan::StopPairingObserver( iDevice->BDAddr() ); + iDevice->SetPaired(EFalse); + CheckAndHandleQueryIntervalL(); + if( !iMessage.IsNull() ) + { + // Ask user does he/she wishes to block this device (if not canceled because the + // frequency is too high). + QueryBlockDeviceL(); + } + return EFalse; + } + + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::AuthoriseIncomingPairingL() << ")); + return ETrue; + } + +// ---------------------------------------------------------- +// CBTNPairNotifierBase::GenerateQueryPromptL +// To be implemented in derived classes. +// ---------------------------------------------------------- +// +void CBTNPairNotifierBase::GenerateQueryPromptL( RBuf& aRBuf ) + { + FLOG(_L("[BTNOTIF]\t CBTNPairNotifierBase::GenerateQueryPromptL WARNING ")); + (void) aRBuf; + }