bluetoothengine/btnotif/btnotifsrv/src/btnotifpairnotifier.cpp
changeset 40 997690c3397a
parent 33 837dcc42fd6a
child 47 9e2a905b887f
--- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifpairnotifier.cpp	Fri Jun 11 13:48:51 2010 +0300
+++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifpairnotifier.cpp	Wed Jun 23 18:23:52 2010 +0300
@@ -22,7 +22,7 @@
 #include <btextnotifierspartner.h>
 #endif
 #include "btnotifconnectiontracker.h"
-#include "btnotifpairingmanager.h"
+#include "btnotifsecuritymanager.h"
 #include "btnotificationmanager.h"
 #include "bluetoothnotification.h"
 #include "btnotifserver.h"
@@ -42,7 +42,7 @@
 // ---------------------------------------------------------------------------
 //
 CBTNotifPairNotifier::CBTNotifPairNotifier(
-        CBTNotifPairingManager& aParent )
+        CBTNotifSecurityManager& aParent )
 :   iParent( aParent )
     {
     }
@@ -60,7 +60,7 @@
 // ---------------------------------------------------------------------------
 //
 CBTNotifPairNotifier* CBTNotifPairNotifier::NewL(
-        CBTNotifPairingManager& aParent )
+        CBTNotifSecurityManager& aParent )
     {
     BOstraceFunctionEntry0( DUMMY_DEVLIST );
     CBTNotifPairNotifier* self = new( ELeave ) CBTNotifPairNotifier( aParent );
@@ -102,23 +102,23 @@
     {
     BOstraceFunctionEntry0( DUMMY_DEVLIST );
     
-    // todo: move Authorize notifier to a separate class
     TInt uid = aMessage.Int0();
-    if ( KBTManAuthNotifierUid.iUid == uid )
+    TInt opCode = aMessage.Function();
+    BOstrace1(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]:Opcode: %d",opCode);
+    
+    if ( (!iNotifierMessage.IsNull()) && 
+         (opCode != EBTNotifCancelNotifier )&&(opCode != EBTNotifUpdateNotifier))
         {
-        TPckgBuf<TBool> answer;
-        answer() = ETrue;
-        TInt err = aMessage.Write( EBTNotifSrvReplySlot, answer);
-        aMessage.Complete( KErrNone );
-        return;
+        // todo: do we allow concurrent pairing?
+        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]:We are busy");
+        User::Leave(KErrServerBusy );
         }
     
-    //BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aUid );
-    if ( !iNotifierMessage.IsNull() )
-        {
-        // todo: do we allow concurrent pairing?
-        User::Leave(KErrServerBusy );
-        }
+    if(opCode == EBTNotifCancelNotifier){
+        CancelPairingNotifierL(uid);
+        aMessage.Complete(KErrNone);
+        return;
+    }
     
     // Store the parameters locally, we need them later again.
     iParams.CreateL( aMessage.GetDesLengthL( EBTNotifSrvParamSlot ) );
@@ -127,6 +127,12 @@
     
     // Read the notifier parameters
     ParseNotifierReqParamsL();
+
+    if(opCode ==EBTNotifUpdateNotifier ){
+        UpdatePairingNotifierL(uid,iParams);
+        aMessage.Complete(KErrNone);
+        return;
+    }
     
     const CBtDevExtension* dev = iParent.BTDevRepository().Device(iRemote);
     if(dev)
@@ -134,13 +140,16 @@
         if (!iLocallyInitiated && dev->Device().GlobalSecurity().Banned() )
             {
             // If the device is banned and pairing is not locally initiated
-            // then we ignore.
-            aMessage.Complete( KErrNone );
+            // then we reject.
+            BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]:Device is banned");
+            iNotifierMessage.Complete( KErrCancel );
+            return;
             }
         if (iLocallyInitiated && dev->Device().GlobalSecurity().Banned())
             {
             // Remove the banned device from the blocking history
             iParent.ConnectionTracker().UpdateBlockingHistoryL(&dev->Device(),ETrue);
+            iParent.BlockDevice(dev->Addr(),EFalse);
             }
         if(0 != dev->Device().FriendlyName().Length()&& dev->Device().IsValidFriendlyName())
             {
@@ -168,6 +177,7 @@
     // If this is an incoming pairing, we first ask the user to accept it.
     if( !iLocallyInitiated  )
         {
+        User::LeaveIfError(iParent.SetPairObserver(iRemote,ETrue));
         StartAcceptPairingQueryL();
         }
     else
@@ -304,8 +314,22 @@
 void CBTNotifPairNotifier::MBRDataReceived( CHbSymbianVariantMap& aData )
     {
     BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    (void) aData;
-    NOTIF_NOTIMPL
+    if(aData.Keys().MdcaPoint(0).Compare(_L("actionResult")) == 0)
+        {
+        TInt val = *(static_cast<TInt*>(aData.Get(_L("actionResult"))->Data()));
+        if(val)
+            {
+                iAcceptPairingResult = ETrue;
+            }
+        else
+            {
+                iAcceptPairingResult = EFalse;
+            }
+        }
+    else if(aData.Keys().MdcaPoint(0).Compare(_L("checkBoxState")) == 0)
+        {
+        iCheckBoxState = *(static_cast<TInt*>(aData.Get(_L("checkBoxState"))->Data()));
+        }
     BOstraceFunctionExit0( DUMMY_DEVLIST );
     }
 
@@ -318,10 +342,9 @@
     {
     BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aError );
     // First unregister from the notification, so we can already get the next one.
-    //iNotification->RemoveObserver();
-    //iNotification = NULL;
+    iNotification->RemoveObserver();
+    iNotification = NULL;
     TRAP_IGNORE( NotificationClosedL( aError, aData ) );
-    iNotification = NULL;
     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
     }
 
@@ -354,13 +377,17 @@
     TPtrC8 resultData(KNullDesC8);
     TBTPinCode pinCode;
     TPckgBuf<TBool> userAcceptance;
+    TInt uid = iNotifierMessage.Int0();
+ 
     if( !err )
         {
-        TInt uid = iNotifierMessage.Int0();
         // The returned data is the entered passkey.
-        // const CBtDevExtension* dev = iParent.BTDevRepository().Device(iRemote);
-        // TBool proceed = iParent.ConnectionTracker().UpdateBlockingHistoryL(&dev->Device(),aResult);
-        if( uid == KBTNumericComparisonNotifierUid.iUid )
+        const CBtDevExtension* dev = iParent.BTDevRepository().Device(iRemote);
+        if(dev)
+            {
+            iParent.ConnectionTracker().UpdateBlockingHistoryL(&dev->Device(),aResult);
+            }
+         if( uid == KBTNumericComparisonNotifierUid.iUid )
             {
             // Numeric comparison needs the boolean result passed back.
             userAcceptance() = aResult;
@@ -374,12 +401,18 @@
                 // Check the passkey entered by the user.
                 // The length of the returned data equals the number of characters
                 // entered by the user.
-                pinCode().iLength = aData.Length();
+                // Check that the passkey length do not exceed the maximum allowed size
+                TInt pinCodeLength = aData.Length();
+                if(pinCodeLength > KHCIPINCodeSize)
+                    {
+                        pinCodeLength = KHCIPINCodeSize;
+                    }
+                pinCode().iLength = pinCodeLength;
                 // Check that the length of the passkey meets the minimum 
                 // required pin code length
-                if( aData.Length() >= iMinPinLength )
+                if( pinCodeLength >= iMinPinLength )
                     {
-                    for( TInt i = 0; i < aData.Length(); i++ )
+                    for( TInt i = 0; i < pinCodeLength; i++ )
                         {
                         pinCode().iPIN[i] = aData[i];
                         }
@@ -387,7 +420,7 @@
                     }
                 else
                     {
-                    // todo: PIN wasn't long enough. This should be handled by the dialog though.
+                    // shouldn't happen since the length is checked in the dialog
                     err = KErrCompletion;
                     }
                 }
@@ -395,21 +428,6 @@
         else
             {
             err = KErrCancel;
-            if( iLocallyInitiated )
-                {
-                // The user denied the connection, ask to block the device.
-                // This is only for pairing (and not bonding) initiated by us,
-                // as the user already gets the opportunity to block when
-                // rejecting an incoming pairing request.
-                // This case may be for someone requesting to access a service
-                // which requires authentication by us, but not by the remote device.
-                // if(proceed)
-                //    {
-                //    LaunchBlockingQueryL();
-                //    }
-                // For incoming pairing, blocking is asked after rejecting the 
-                // pairing request. This is done in CompleteAcceptPairingQueryL
-                }
             }
         }
     // Complete the message with the result, and result data if any.
@@ -417,6 +435,14 @@
         {
         err = iNotifierMessage.Write( EBTNotifSrvReplySlot, resultData );
         }
+    if(err && (uid == KBTNumericComparisonNotifierUid.iUid))
+        {
+        // We need to reject the numeric comparaison otherwise
+        // the link will remain active
+        userAcceptance() = aResult;
+        resultData.Set( userAcceptance );
+        err = iNotifierMessage.Write( EBTNotifSrvReplySlot, resultData );
+        }
     iNotifierMessage.Complete( err );
     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
     }
@@ -428,7 +454,7 @@
 void CBTNotifPairNotifier::StartAcceptPairingQueryL()
     {
     BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    PrepareNotificationL( TBluetoothDialogParams::EQuery, EIncomingPairing );
+    PrepareNotificationL( TBluetoothDialogParams::EUserAuthorization, EAuthorization );
     iState = EIncomingPairingAcceptconfirm;
     // if rejected, the client message is completed in CompleteAcceptPairingQueryL
     BOstraceFunctionExit0( DUMMY_DEVLIST );
@@ -438,32 +464,37 @@
 // The user was asked to accept an incoming pairing. Process and proceed. 
 // ---------------------------------------------------------------------------
 //
-void CBTNotifPairNotifier::CompleteAcceptPairingQueryL( TInt aError, TBool aResult )
+void CBTNotifPairNotifier::CompleteAcceptPairingQueryL( TInt aError)
     {
     BOstraceFunctionEntry0( DUMMY_DEVLIST );
     TInt err = aError;
+    TBool proceed = EFalse;
+    
     if( !err )
         {
-        // const CBtDevExtension* dev = iParent.BTDevRepository().Device(iRemote);
-        // TBool proceed = iParent.ConnectionTracker().UpdateBlockingHistoryL(&dev->Device(),aResult);
-        if( aResult )
+        const CBtDevExtension* dev = iParent.BTDevRepository().Device(iRemote);
+        if(dev)
+            {
+            proceed = iParent.ConnectionTracker().UpdateBlockingHistoryL(&dev->Device(),iAcceptPairingResult);
+            }
+        if( iAcceptPairingResult )
             {
             // User accepted, continue to show pairing query.
+            // Trust the device
+            if(iCheckBoxState){
+            iParent.TrustDevice(iRemote);
+            }
             StartPairingUserInputL();
-            if( iDialogNumeric.Length() )
-                {
-                err = iNotification->SetData( 
-                TBluetoothDeviceDialog::EAdditionalDesc, iDialogNumeric );
-                }            
-             }
+            }
         else
             {
-            err = KErrCancel;
-            // if( proceed )
-            //    {
-            //    //ask to block the device.
-            //    LaunchBlockingQueryL();
-            //    }
+            if( proceed && iCheckBoxState )
+                {
+                //ask to block the device.
+                iParent.BlockDevice(iRemote,proceed);
+                }
+            err = iParent.SetPairObserver(iRemote,EFalse);
+            err = KErrCancel; // We need to complete the pairing request here
             }
         }
     if( err )
@@ -571,6 +602,7 @@
     TBTNumericComparisonParams::TComparisonScenario scenario =
                 paramsPckg().ComparisonScenario();
     aNumVal.Format( KNumCompFormat, paramsPckg().NumericalValue() );
+    aNumVal.Insert(3,_L(" "));
     aAddr = paramsPckg().DeviceAddress();
     iCurrentDeviceName = paramsPckg().DeviceName();
     BOstraceFunctionExit0( DUMMY_DEVLIST );
@@ -624,6 +656,14 @@
         }
     err = iNotification->SetData( (TInt) TBluetoothDeviceDialog::EDeviceClass, 
                 classofdevice );
+    if( iDialogNumeric.Length() )
+        {
+        err = iNotification->SetData( 
+        TBluetoothDeviceDialog::EAdditionalDesc, iDialogNumeric );
+        }
+    err = iNotification->SetData( TBluetoothDialogParams::EDialogTitle, TBluetoothDialogParams::EPairingRequest);
+    iCheckBoxState = ETrue;
+    iAcceptPairingResult = EFalse;
     iParent.ConnectionTracker().NotificationManager()->QueueNotificationL( iNotification);
     NOTIF_NOTHANDLED( !err )
     BOstraceFunctionExit0( DUMMY_DEVLIST );
@@ -641,9 +681,10 @@
     result.Set( aData.Ptr(), result.Length() ); // Read the part containing the result
     // Set a pointer descriptor to capture the remaining data, if any.
     TPtrC8 dataPtr( aData.Mid( result.Length() ) );
+
     if ( iState == EIncomingPairingAcceptconfirm )
         {
-        CompleteAcceptPairingQueryL(aError, result());
+        CompleteAcceptPairingQueryL(aError);
         }
     else
         {
@@ -652,25 +693,6 @@
     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
     }
 
-// ---------------------------------------------------------------------------
-// Ask the user if he/she wants to block future connection requests. 
-// ---------------------------------------------------------------------------
-//
-void CBTNotifPairNotifier::LaunchBlockingQueryL()
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    TBTDialogResourceId resourceId = EBlockUnpairedDevice;
-    const CBtDevExtension* dev = iParent.BTDevRepository().Device(iRemote);
-    if(dev->Device().IsValidPaired() && dev->Device().IsPaired() &&
-            dev->Device().LinkKeyType() != ELinkKeyUnauthenticatedUpgradable )
-        {
-        resourceId = EBlockPairedDevice;
-        }
-    PrepareNotificationL( TBluetoothDialogParams::EQuery, resourceId );
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
 
 
 
-
-