--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btnotif/btnotifsrv/inc/btnotifpairinghelper.h Fri May 14 16:01:46 2010 +0300
@@ -0,0 +1,471 @@
+/*
+* ============================================================================
+* Name : btnotifpairinghelper.h
+* Part of : bluetoothengine / btnotif
+* Description : Helper class for processing pairing requests and results, as extended functionality for CBTNotifConnection.
+*
+* 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.
+*
+* Contributors:
+* Nokia Corporation
+* ============================================================================
+* Template version: 4.2
+*/
+
+#ifndef BTNOTIFPAIRINGHELPER_H
+#define BTNOTIFPAIRINGHELPER_H
+
+#include <e32base.h>
+#include <btmanclient.h>
+#include <bluetooth/pairing.h>
+#include <btservices/btsimpleactive.h>
+
+#include "bluetoothnotification.h"
+#include "bluetoothtrace.h"
+
+class CBTNotifConnection;
+class CBTNotifConnectionTracker;
+class CBTDevice;
+
+
+/**
+ * Helper class for performing pairing-related operations.
+ *
+ * This class is constructed only when there is a pairing-related event,
+ * and destructed after completion. Pairing-related events are bonding
+ * (outgoing bonding request from an application), pairing notifiers
+ * (PIN input i.e. legacy pairing, numeric comparison and passkey display),
+ * and Just Works pairing completion.
+ *
+ * The structure of operations is as follows: each event is initiated through
+ * StartXxL() operation, and finished with CompleteXxL(), there is also a
+ * CancelXxL() operation where needed. In addition there are the base class virtual
+ * functions, a few helper functions and HandleAuthenticationCompleteL, which
+ * processes a baseband authentication result. The same structure applies to
+ * suboperations, such as StartTrustedQueryL and CompleteTrustedQueryL.
+ *
+ * For bonding, there is StartBondingL, CompleteBondingL() CancelBondingL();
+ * for pairing notifiers there is StartPairingNotifierL(),
+ * CancelPairingNotifierL(), CompletePairingNotifierL() and also
+ * UpdatePairingNotifierL(). For Just Works processing, there is
+ * StartJustWorksProcessingL(), CancelJustWorksProcessingL() and
+ * CompleteJustWorksProcessingL().
+ *
+ * The design of this class is focussed on structure and maintainability first.
+ * Duplicate (state) information is kept to a minimum. And memory usage comes
+ * before processing. Pairing is an infrequent operation, and this class is
+ * only instantiated when there is pairing-related processing, so extreme
+ * focus on memory or processing efficiency would have relatively little effect.
+ *
+ * @since Symbian^4
+ */
+NONSHARABLE_CLASS( CBTNotifPairingHelper ) : public CBase,
+ public MBTNotificationResult,
+ public MBtSimpleActiveObserver
+ {
+
+public:
+
+ /** Enumeration identifying the stage of the pairing operation. */
+ enum TPairingOp
+ {
+ EIdle,
+ EAcceptPairing,
+ ELegacyPairing,
+ ESspPairing,
+ EJustWorksPairing,
+ EAutoPairing,
+ EPostPairingOperations, // Marks the queries and notes which follow
+ // the real pairing input from the user.
+ EDedicatedBonding,
+ EUnpairing,
+ EAwaitingPairingResult,
+ EShowPairingSuccess,
+ EShowPairingFailure,
+ EQueryTrust,
+ EBlocking,
+ EPairingCancelled
+ };
+
+ /**
+ * Two-phased constructor.
+ * @param aConnection Pointer to the parent.
+ * @param aDevice Pointer to information of the remote device.
+ * aParam aTracker Pointer to the connection tracker.
+ */
+ static CBTNotifPairingHelper* NewL( CBTNotifConnection* aConnection,
+ CBTNotifConnectionTracker* aTracker );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CBTNotifPairingHelper();
+
+ /**
+ * Get the address of the remote device for this connection.
+ *
+ * @since Symbian^4
+ * @param aProfile The profile identifying the service.
+ */
+ inline CBTNotifPairingHelper::TPairingOp CurrentOperation() const
+ { return iOperation; }
+
+ /**
+ * The baseband authentication has completed, handle the result.
+ *
+ * @since Symbian^4
+ * @param aError The result of the authentication procedure.
+ */
+ void HandleAuthenticationCompleteL( TInt aError );
+
+ /**
+ * Start a bonding operation with the remote device.
+ *
+ * @since Symbian^4
+ * @param aMessage The handle of the message from the client.
+ */
+ void StartBondingL( TInt aHandle );
+
+ /**
+ * Cancel an ongoing bonding operation with the remote device.
+ *
+ * @since Symbian^4
+ */
+ void CancelBondingL();
+
+ /**
+ * Handle a notifier request for pairing with the remote device
+ * of this connection.
+ *
+ * @since Symbian^4
+ * @param aUid The UID of the notifier for this pairing request.
+ * @param aParams The parameters for this request from the client.
+ */
+ void StartPairingNotifierL( TInt aUid, const TDesC8& aParams );
+
+ /**
+ * Update an outstanding request for this connection.
+ *
+ * @since Symbian^4
+ * @param aUid The UID of the notifier for this update.
+ * @param aParams The updated parameters for this request from the client.
+ */
+ void UpdatePairingNotifierL( TInt aUid, const TDesC8& aParams );
+
+ /**
+ * Cancel an outstanding request for this connection.
+ *
+ * @since Symbian^4
+ * @param aUid The UID of the notifier for this pairing request.
+ */
+ void CancelPairingNotifierL( TInt aUid );
+
+ /**
+ * Start the processing of a completed Just Works pairing.
+ * This needs special attention, as this class is not notified
+ * other than by observing the registry, and the user is not
+ * notified otherwise either (which is the point of this association
+ * model). It needs to be verified that the pairing is related to
+ * a service access, as dedicated bonding should not be possible
+ * (for devices that do not have any IO capabilities).
+ *
+ * @since Symbian^4
+ * @param aMessage The handle of the message from the client.
+ */
+ void StartJustWorksProcessingL();
+
+ /**
+ * Cancel the processing of a completed Just Works pairing.
+ *
+ * @since Symbian^4
+ */
+ void CancelJustWorksProcessingL();
+
+// from base class MBTNotificationResult
+
+ /**
+ * From MBTNotificationResult.
+ * Handle an intermediate result from a user query.
+ * This function is called if the user query passes information
+ * back before it has finished i.e. is dismissed. The final acceptance/
+ * denial of a query is passed back in MBRNotificationClosed.
+ *
+ * @since Symbian^4
+ * @param aData the returned data. The actual format
+ * is dependent on the actual notifier.
+ */
+ virtual void MBRDataReceived( CHbSymbianVariantMap& aData );
+
+ /**
+ * From MBTNotificationResult.
+ * The notification is finished. The resulting data (e.g. user input or
+ * acceptance/denial of the query) is passed back here.
+ *
+ * @since Symbian^4
+ * @param aErr KErrNone or one of the system-wide error codes.
+ * @param aData the returned data. The actual format
+ * is dependent on the actual notifier.
+ */
+ virtual void MBRNotificationClosed( TInt aError, const TDesC8& aData );
+
+// from base class MBtSimpleActiveObserver
+
+ /**
+ * From MBtSimpleActiveObserver.
+ * Callback to notify that an outstanding request has completed.
+ *
+ * @since Symbian^4
+ * @param aActive The active object helper that completed this request.
+ * @param aStatus The status of the completed request.
+ */
+ virtual void RequestCompletedL( CBtSimpleActive* aActive, TInt aStatus );
+
+ /**
+ * From MBtSimpleActiveObserver.
+ * Callback for handling cancelation of an outstanding request.
+ *
+ * @since Symbian^4
+ * @param aId The ID that identifies the outstanding request.
+ */
+ virtual void CancelRequest( TInt aRequestId );
+
+ /**
+ * Callback to notify that an error has occurred in RunL.
+ *
+ * @param aActive Pointer to the active object that completed.
+ * @param aError The error occurred in RunL.
+ */
+ virtual void HandleError( CBtSimpleActive* aActive, TInt aError );
+
+private:
+
+ /**
+ * C++ default constructor.
+ */
+ CBTNotifPairingHelper( CBTNotifConnection* aConnection,
+ CBTNotifConnectionTracker* aTracker );
+
+ /**
+ * Symbian 2nd-phase constructor.
+ */
+ void ConstructL();
+
+ /**
+ * Process the user input and complete the outstanding pairing request.
+ *
+ * @since Symbian^4
+ * @param aError The result off the notification.
+ * @param aResult The user response; ETrue if the user accepted the query,
+ * otherwise EFalse.
+ * @param aData The data returned from the notification dialog.
+ */
+ void CompletePairingNotifierL( TInt aError, TBool aResult, const TDesC8& aData );
+
+ /**
+ * Completes a bonding operation.
+ *
+ * @since Symbian^4
+ * @param aError The result of the bonding attempt.
+ */
+ void CompleteBondingL( TInt aError );
+
+ /**
+ * Completes a bonding operation.
+ *
+ * @since Symbian^4
+ * @param aError The result of the bonding attempt.
+ */
+ void CompleteJustWorksProcessingL( TInt aError );
+
+ /**
+ * Ask the user to allow incoming pairing.
+ *
+ * @since Symbian^4
+ */
+ void StartAcceptPairingQueryL();
+
+ /**
+ * Process the user input and for accepting an incoming pairing and
+ * continue with the outstanding pairing request.
+ *
+ * @since Symbian^4
+ * @param aError The result of the notification.
+ * @param aResult The user response; ETrue if the user accepted the query,
+ * otherwise EFalse.
+ */
+ void CompleteAcceptPairingQueryL( TInt aError, TBool aResult );
+
+ /**
+ * Ask the user to set the device as trusted.
+ *
+ * @since Symbian^4
+ * @param aData The data returned from the notification dialog.
+ */
+ void StartTrustedQueryL();
+
+ /**
+ * Process the user input for setting the device as trusted.
+ *
+ * @since Symbian^4
+ * @param aError The result of the notification.
+ * @param aResult The user response; ETrue if the user accepted the query,
+ * otherwise EFalse.
+ */
+ void CompleteTrustedQueryL( TInt aError, TBool aResult );
+
+ /**
+ * Parse the parameters of a request for pairing.
+ * This function also returns values to use for dialog config, and sets
+ * the operation state member variable (iOperation).
+ *
+ * @since Symbian^4
+ * @param aLocallyInitiated On return, will be set to ETrue if the pairing
+ * was initiated by us.
+ * @param aNumVal On return, this descriptor will contain a number to use in
+ * the pairing dialog. The meaning depends on the type of pairing.
+ * @param aDialogType On return, will contain the dialog type.
+ * @param aResourceId On return, will contain the resource id.
+ */
+ void ParseNotifierReqParamsL( TBool& aLocallyInitiated, TDes& aNumVal,
+ TBluetoothDialogParams::TBTDialogType& aDialogType,
+ TBTDialogResourceId& aResourceId );
+
+ /**
+ * Parse the parameters of a request for pairing using pin query.
+ *
+ * @since Symbian^4
+ * @param aLocallyInitiated On return, will be set to ETrue if the pairing
+ * was initiated by us.
+ * @param aNumVal On return, this will contain the minimum passcode length.
+ */
+ void ParsePinCodeReqParamsL( TBool& aLocallyInitiated, TUint& aNumVal );
+
+ /**
+ * Parse the parameters of a request for pairing using numeric comparison.
+ *
+ * @since Symbian^4
+ * @param aLocallyInitiated On return, will be set to ETrue if the pairing
+ * was initiated by us.
+ * @param aNumVal On return, this descriptor will contain the passkey to
+ * show to the user.
+ */
+ void ParseNumericCompReqParamsL( TBool& aLocallyInitiated, TDes& aNumVal );
+
+ /**
+ * Parse the parameters of a request for pairing using passkey display.
+ *
+ * @since Symbian^4
+ * @param aLocallyInitiated On return, will be set to ETrue if the pairing
+ * was initiated by us.
+ * @param aNumVal On return, this descriptor will contain the passkey to
+ * show to the user.
+ */
+ void ParsePasskeyDisplayReqParamsL( TBool& aLocallyInitiated, TDes& aNumVal );
+
+ /**
+ * Check if we can guess the PIN and complete the notifier without
+ * user interaction.
+ *
+ * @since Symbian^4
+ * @param aLocallyInitiated ETrue if we initiated the pairing, otherwise EFalse.
+ * @param aNumVal The minimum lenght of the passcode.
+ */
+ void CheckAutoPairingL( TBool aLocallyInitiated, const TDesC& aNumVal );
+
+ /**
+ * Get a notification and configure it according to the current operation.
+ *
+ * @since Symbian^4
+ * @param aType The notification type.
+ * @param aResourceId Identifier for the resource to display.
+ */
+ void PrepareNotificationL( TBluetoothDialogParams::TBTDialogType aType,
+ TBTDialogResourceId aResourceId );
+
+ /**
+ * Handle the result from a notification that is finished.
+ *
+ * @since Symbian^4
+ * @param aErr KErrNone or one of the system-wide error codes.
+ * @param aData The returned data. The actual format
+ * is dependent on the actual notifier.
+ */
+ void NotificationClosedL( TInt aError, const TDesC8& aData );
+
+private: // data
+
+ /**
+ * Identifier for the current operation.
+ */
+ TPairingOp iOperation;
+
+ /**
+ * UID of the notifier pairing dialog request.
+ */
+ TInt iNotifierUid;
+
+ /**
+ * Handle to the client message for dedicated bonding. Also serves as flag
+ * indicating that we are performing dedicated bonding.
+ */
+ TInt iDedicatedBonding;
+
+ /**
+ * Subsession with pairing server for dedicated bonding.
+ */
+ RBluetoothDedicatedBondingInitiator iBondingSession;
+
+ /**
+ * Handle for general bonding.
+ */
+ RBTPhysicalLinkAdapter iBondingSocket;
+
+ /**
+ * Buffer containing the parameters of the client message.
+ * Own.
+ */
+ HBufC8* iParams;
+
+ /**
+ * Active object helper for outgoing bonding.
+ * Own.
+ */
+ CBtSimpleActive* iBondingActive;
+
+ /**
+ * Pointer to the data record of the remote device.
+ * Not own.
+ */
+ CBTDevice* iDevice;
+
+ /**
+ * Pointer to an outstanding user interaction.
+ * Not own.
+ */
+ CBluetoothNotification* iNotification;
+
+ /**
+ * Pointer to the class that we are helping.
+ * Not own.
+ */
+ CBTNotifConnection* iConnection;
+
+ /**
+ * Pointer to our grandparent.
+ * Not own.
+ */
+ CBTNotifConnectionTracker* iTracker;
+
+ BTUNITTESTHOOK
+
+ };
+
+#endif // BTNOTIFPAIRINGHELPER_H