bluetoothengine/btnotif/btnotifsrv/src/btnotifsession.cpp
changeset 33 837dcc42fd6a
parent 19 43824b19ee35
child 40 997690c3397a
--- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifsession.cpp	Fri May 14 16:01:46 2010 +0300
+++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifsession.cpp	Thu May 27 13:01:44 2010 +0300
@@ -1,27 +1,25 @@
 /*
-* ============================================================================
-*  Name        : btnotifsession.cpp
-*  Part of     : bluetoothengine / btnotif
-*  Description : Session class for handling commands from clients.
+* Copyright (c) 2010 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".
 *
-*  Copyright © 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.
 *
-*  Initial Contributors:
-*  Nokia Corporation - initial contribution.
+* Contributors:
 *
-*  Contributors:
-*  Nokia Corporation
-* ============================================================================
-* Template version: 4.1
+* Description: Session class for handling commands from clients.
+*
 */
 
 #include "btnotifsession.h"
 #include <btextnotifiers.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <btextnotifierspartner.h>
+#endif
 #include "btnotifclientserver.h"
 #include "btnotifsettingstracker.h"
 #include "btnotifconnectiontracker.h"
@@ -81,12 +79,8 @@
 //
 CBTNotifSession::~CBTNotifSession()
     {
-    for( TInt i = 0; i < iMessageQ.Count(); i++ )
-        {
-        // Complete all outstanding messages with error code
-        iMessageQ[i].Complete( KErrSessionClosed );
-        }
-    iMessageQ.Close();  // Cleans up all message objects.
+    // clients must complete the message they are responsible for
+    // we do not complete any message here
     Server()->RemoveSession();
     }
 
@@ -97,59 +91,71 @@
 //
 void CBTNotifSession::ServiceL( const RMessage2& aMessage )
     {
+    CBTNotifConnectionTracker* connTracker = Server()->ConnectionTracker();
     TInt opCode = aMessage.Function();
-    if ( opCode == EBTNotifCancelNotifier || 
-         opCode == EBTNotifStartSyncNotifier ||
-         opCode == EBTNotifStartAsyncNotifier ||
-         opCode == EBTNotifUpdateNotifier )
-        {
-        TInt uid = aMessage.Int0();
-        if( uid == KDeviceSelectionNotifierUid.iUid )
-            {
-            // Note for implementers:
-            // message queue is not used in this notifier handling (due
-            // to its drawbacks for exception handlings in various situations). 
-            // implementations using message queue will be migrated step
-            // by step.
-        
-            TRAPD( err, {
-                CBTNotifDeviceSelector& selector = Server()->DeviceSelectorL();
-                selector.DispatchNotifierMessageL( aMessage ); }
-                );
+    TInt uid = aMessage.Int0();
+    TInt err( KErrNotReady );
+    switch(opCode){
+        case EBTNotifCancelNotifier:
+        case EBTNotifStartSyncNotifier:
+        case EBTNotifStartAsyncNotifier:
+        case EBTNotifUpdateNotifier:
+            if( uid == KDeviceSelectionNotifierUid.iUid )
+                {
+                TRAP( err, {
+                        CBTNotifDeviceSelector& selector = Server()->DeviceSelectorL();
+                        selector.DispatchNotifierMessageL( aMessage ); }
+                        );
+                if ( err )
+                    {
+                    aMessage.Complete( err );
+                    }
+                    // deviceselector takes the ownership of aMessage.
+                }
+            else
+                {
+                // PIN/ SSP pairing notifiers from BT stack:
+                // ***** Note for implementers:
+                // message queue is not used for this notifier handling.
+                if ( uid == KBTManAuthNotifierUid.iUid ||
+                     uid == KBTManPinNotifierUid.iUid ||
+                     uid == KBTPinCodeEntryNotifierUid.iUid ||
+                     uid == KBTNumericComparisonNotifierUid.iUid ||
+                     uid == KBTPasskeyDisplayNotifierUid.iUid ||
+                     uid == KBTUserConfirmationNotifierUid.iUid )
+                    {
+                    if( connTracker )
+                        {
+                         // Pass it to the connection tracker.
+                         TRAP( err, 
+                                 connTracker->HandlePairingNotifierRequestL( aMessage ) );
+                        }
+                    if ( err )
+                        {
+                        // tracker not available, can't do this now.
+                        aMessage.Complete( err );
+                        }
+                    }
+                }
+            break;
+        case EBTNotifPairDevice:
+        case EBTNotifCancelPairDevice:
+            // Pairing requests from clients:
+            if ( connTracker )
+                {
+                TRAP( err, connTracker->HandleBondingRequestL( aMessage ) );
+                }
             if ( err )
                 {
-                aMessage.Complete( err );
+                // tracker not available, can't do this now.
+                aMessage.Complete( err );            
                 }
-            // deviceselector takes the ownership of aMessage.
-            return;
-            }
-        }
-
-    // Messages are completed by message handlers, not here.
-    // Queue the message already so that handlers can find it from the queue.
-    iMessageQ.AppendL( aMessage );
-    // The position is assumed to not change during the execution of this function.
-    TInt handle = aMessage.Handle();    // Store the handle for de-queueing
-    TRAPD( err, DispatchMessageL( aMessage ) );
-    if( err || ( aMessage.IsNull() && FindMessageFromHandle( handle ) ) )
-        {
-        // If the message has been completed by now (handle is null and the message 
-        // still in the queue), we remove it again from the queue. Otherwise it 
-        // will be completed by the handling handler when it has handled the handling.
-        for( TInt i = 0; i < iMessageQ.Count(); i++ )
-            {
-            // This may be replaced by RArray::Find with appropriate key
-            if( iMessageQ[i].Handle() == handle )
-                {
-                iMessageQ.Remove( i );
-                }
-            }
-        }
-    if( err && !aMessage.IsNull() )
-        {
-        aMessage.Complete( err );
-        }
+            break;
+        default:
+            aMessage.Complete( KErrNotSupported );
+            break;
     }
+}
 
 
 // ---------------------------------------------------------------------------
@@ -162,143 +168,3 @@
     Server()->AddSession();
     }
 
-// ---------------------------------------------------------------------------
-// Complete a client message from a message handle with given data.
-// If a zero-length descriptor is passed, no data will be written back.
-// ---------------------------------------------------------------------------
-//
-TInt CBTNotifSession::CompleteMessage( TInt aHandle, TInt aReason, const TDesC8& aReply )
-    {
-    TInt err = KErrNotFound;
-    // This may be replaced by RArray::Find with appropriate key
-    for( TInt i = 0; i < iMessageQ.Count(); i++ )
-        {
-        if( iMessageQ[i].Handle() == aHandle )
-            {
-            err = KErrNone;
-            if( aReply.Length() )
-                {
-                // For now, assume a fixed index for the result.
-                // Change this if a the client can pass more arguments!
-                // ToDo: replace with constant!
-                err = iMessageQ[i].Write( EBTNotifSrvReplySlot, aReply );
-                // Should the result be passed back to the calller,
-                // or used to complete the message?
-                }
-            iMessageQ[i].Complete( aReason );
-            iMessageQ.Remove( i );
-            break;
-            }
-        }
-    return err;
-    }
-
-
-// ---------------------------------------------------------------------------
-// Find a client message from an RMessage2 handle.
-// ---------------------------------------------------------------------------
-//
-const RMessage2* CBTNotifSession::FindMessageFromHandle( TInt aHandle ) const
-    {
-    // This may be replaced by RArray::Find with appropriate key
-    for( TInt i = 0; i < iMessageQ.Count(); i++ )
-        {
-        if( iMessageQ[i].Handle() == aHandle )
-            {
-            return &iMessageQ[i];
-            }
-        }
-    return NULL;
-    }
-
-
-// ---------------------------------------------------------------------------
-// Process a client message.
-// The processing here relies on RNotifier backend server for queueing 
-// notifiers on the same channel. Therefore pairing (SSP and legacy) and 
-// authorization notifiers arrive in order, not simultaneously, even if 
-// they use arrive on different session instances.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifSession::DispatchMessageL( const RMessage2& aMessage )
-    {
-    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aMessage.Function() );
-    CBTNotifSettingsTracker* settTracker = Server()->SettingsTracker();
-    CBTNotifConnectionTracker* connTracker = Server()->ConnectionTracker();
-    LeaveIfNullL( settTracker, KErrNotReady );
-    TInt opcode = aMessage.Function();
-    if( opcode < EBTNotifMinValue )
-        {
-        User::Leave( KErrArgument );
-        }
-    switch( opcode )
-        {
-        case EBTNotifCancelNotifier:
-        case EBTNotifStartSyncNotifier:
-        case EBTNotifStartAsyncNotifier:
-        case EBTNotifUpdateNotifier:
-            {
-            // All these messages get the same treatment: forward 
-            // to settings and connection tracker, who will deal with it appropriately.
-            // First the settings tracker handles the message.
-            settTracker->DispatchNotifierMessageL( aMessage );
-            if( connTracker && !aMessage.IsNull() )
-                {
-                // Pass it on to the connection tracker, if it hasn't been completed yet.
-                connTracker->DispatchNotifierMessageL( aMessage );
-                }
-            else
-                {
-                // Power is off, can't do this now.
-                LeaveIfNullL( connTracker, KErrNotReady );
-                }
-            if( opcode != EBTNotifStartAsyncNotifier && !aMessage.IsNull() )
-                {
-                // Nobody has yet completed the message, and it is a synchronous
-                // one so we'll do it here to allow the notifier to keep on going.
-                aMessage.Complete( KErrNone );
-                }
-            }
-            break;
-        case EBTEngPrepareDiscovery:
-            {
-            // This is functionality only related to existing connections.
-            // Can't do when power is off though.
-            LeaveIfNullL( connTracker, KErrNotReady );
-            //connTracker->HandlePairingRequestL( aMessage );
-            }
-            break;
-        case EBTEngPairDevice:
-        case EBTEngCancelPairDevice:
-            {
-            // This is functionality only related to connections.
-            // Can't do when power is off though.
-            LeaveIfNullL( connTracker, KErrNotReady );
-            connTracker->HandleBondingRequestL( aMessage );
-            }
-            break;
-        default:
-            // Communicate result back.
-            User::Leave( KErrNotSupported );
-            break;
-        }
-    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
-    }
-
-
-// ---------------------------------------------------------------------------
-// Find a client message from an RNotifier UID.
-// ---------------------------------------------------------------------------
-//
-const RMessage2* CBTNotifSession::FindMessageFromUid( TInt aUid ) const
-    {
-    // This may be replaced by RArray::Find with appropriate key
-    for( TInt i = 0; i < iMessageQ.Count(); i++ )
-        {
-        if( iMessageQ[i].Int0() == aUid )
-            {
-            return &iMessageQ[i];
-            }
-        }
-    return NULL;
-    }