--- /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 <btextnotifiers.h>
+#else
+#include <btextnotifiers.h>
+#include <btextnotifierspartner.h> // new file introduced by xSymbian
+#endif
+
+#include <utf.h> // Unicode character conversion utilities
+#include <btengconnman.h>
+#include <BTNotif.rsg> // Own resources
+#include <bluetoothuiutil.h>
+#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;
+ }