bluetoothengine/btnotif/src/btnssppasskeyentrynotifier.cpp
branchRCL_3
changeset 56 9386f31cc85b
child 61 269724087bed
--- /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 <StringLoader.h>    // Localisation stringloader
+#include <utf.h>             // Unicode character conversion utilities
+#include <avkon.mbg>
+#include <btengdevman.h>
+#include <btengconnman.h>
+#include <btotgpairpub.inl>
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <btextnotifiers.h>
+#else
+#include <btextnotifiers.h>
+#include <btextnotifierspartner.h>
+#endif
+#include <BTNotif.rsg>       // Own resources
+#include <SecondaryDisplay/BTnotifSecondaryDisplayAPI.h>
+#include <bluetoothuiutil.h>
+#include "btnotif.hrh"       // Own resource header
+#include "btnssppasskeyentrynotifier.h"  // Own class definition
+#include "btNotifDebug.h"    // Debugging macros
+#include "btnotifnameutils.h"
+
+#ifdef __SERIES60_HELP
+#include <hlplch.h>
+#include <csxhelp/bt.hlp.hrh> // 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