diff -r 0ba996a9b75d -r 613943a21004 bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp Tue Aug 31 15:25:10 2010 +0300 @@ -0,0 +1,301 @@ +/* +* 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". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: class for prompting user to authorize a service +* connection request. +* +*/ + +#include +#include +#include "btnotifserviceauthorizer.h" +#include "btnotifsecuritymanager.h" +#include "bluetoothtrace.h" +#include "btnotifclientserver.h" +#include "bluetoothnotification.h" +#include "btnotifconnectiontracker.h" +#include "btnotificationmanager.h" +#include "btnotifserver.h" +#include "btnotifutil.h" + +// +// SDP UUID Constants - Short form +// Taken from Bluetooth Profile specification v1.1 +// These are used when registering the service to +// local SDP database and when searching the service +// information from remote device. +const TUint KBTSdpDun = 0x1103; +const TUint KBTSdpGenericTelephony = 0x1204; +const TUint KBTSdpFax = 0x1111; +const TUint KBTSdpObjectPush = 0x1105; +const TUint KBTSdpFileTransfer = 0x1106; +const TUint KBTSdpHeadSet = 0x1108; +const TUint KBTSdpGenericNetworking = 0x1201; +const TUint KBTSdpBasicImaging = 0x111b; + + +CBTNotifServiceAuthorizer* CBTNotifServiceAuthorizer::NewL( + CBTNotifSecurityManager& aParent) + { + CBTNotifServiceAuthorizer* me = new (ELeave) CBTNotifServiceAuthorizer(aParent); + CleanupStack::PushL(me); + me->ConstructL(); + CleanupStack::Pop(me); + return me; + } + +CBTNotifServiceAuthorizer::~CBTNotifServiceAuthorizer() + { + iParams.Close(); + if( iNotification ) + { + // Clear the notification callback, we cannot receive them anymore. + iNotification->RemoveObserver(); + iNotification->Close(); // Also dequeues the notification from the queue. + iNotification = NULL; + } + if ( !iNotifierMessage.IsNull() ) + { + iNotifierMessage.Complete( KErrServerTerminated ); + } + } + +CBTNotifServiceAuthorizer::CBTNotifServiceAuthorizer( + CBTNotifSecurityManager& aParent) +:iParent(aParent) + { + } + +void CBTNotifServiceAuthorizer::ConstructL() + { + } + +void CBTNotifServiceAuthorizer::StartNotifierL(const RMessage2& aMessage) + { + if (!iNotifierMessage.IsNull()) + { + if(aMessage.Function() == EBTNotifCancelNotifier) + { + TInt err = iNotification->Close(); + iNotifierMessage.Complete(KErrCancel); + aMessage.Complete(err); + return; + } + BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]:We are busy"); + User::Leave(KErrServerBusy ); + } + + iParams.ReAllocL( aMessage.GetDesLengthL( EBTNotifSrvParamSlot ) ); + aMessage.ReadL( EBTNotifSrvParamSlot, iParams ); + + TBTAuthorisationParams params; + TPckgC paramsPckg( params ); + paramsPckg.Set( iParams ); + + iServiceId = paramsPckg().iUid.iUid; + + const CBtDevExtension* dev = NULL; + dev = iParent.BTDevRepository().Device(paramsPckg().iBDAddr); + + if(dev && dev->Device().GlobalSecurity().Banned() ) + { + // If the device is banned, service connection from + // this device is not allowed: + BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]:Device is banned"); + aMessage.Complete( KErrCancel); + return; + } + + if(dev && dev->Device().GlobalSecurity().NoAuthorise()) + { + // If the device is a trusted one, no need to pop up query messages. + TPckgBuf answer; + answer() = ETrue; + aMessage.Write(EBTNotifSrvReplySlot, answer); + aMessage.Complete(KErrNone); + return; + } + + // User must namually authorize this request. + // Get needed info for the dialog: + iPairedDevice = (dev == NULL ) ? EFalse : dev->IsUserAwareBonded(); + iDeviceClass = (dev == NULL ) ? 0 : dev->Device().DeviceClass().DeviceClass(); + TBTNotifUtil::GetDeviceUiNameL(iCurrentDeviceName, + dev, paramsPckg().iName, paramsPckg().iBDAddr ); + + TBool autoAuthorize; + PrepareNotificationL(autoAuthorize, + TBluetoothDialogParams::EUserAuthorization, + EAuthorization, iPairedDevice); + if ( autoAuthorize ) + { + TPckgBuf answer; + answer() = ETrue; + aMessage.Write(EBTNotifSrvReplySlot, answer); + aMessage.Complete(KErrNone); + } + else + { + iNotification->ShowL(); + // we do not save the message until all leavable functions have executed successfully. + // This makes sure the iNotifierMessage has a valid handle. + iNotifierMessage = aMessage; + } + } + +void CBTNotifServiceAuthorizer::MBRDataReceived( CHbSymbianVariantMap& aData ) + { + // "actionResult" will be true if the user clicks 'Yes' on the dialog and false, if he/she clicks 'No' + // "iCheckBoxState" will be set to true of the checkbox is checked, else false. + if(aData.Keys().MdcaPoint(0).Compare(_L("actionResult")) == 0) + { + TBTAuthorisationParams params; + TPckgC paramsPckg(params); + paramsPckg.Set(iParams); + + TPckgBuf answer; + TInt val = *(static_cast(aData.Get(_L("actionResult"))->Data())); + if(val) + { + answer() = ETrue; + if(iCheckBoxState) + { + // Set the device "Trusted" property + iParent.TrustDevice(paramsPckg().iBDAddr); + } + } + else + { + answer() = EFalse; + if(iCheckBoxState) + { + // If the device is paried, unpair it as well. + if(iPairedDevice) + { + iParent.UnpairDevice(paramsPckg().iBDAddr); + } + + //Set the device "Blocked" property + iParent.BlockDevice(paramsPckg().iBDAddr,ETrue); + } + } + if ( !iNotifierMessage.IsNull() ) + { + iNotifierMessage.Write(EBTNotifSrvReplySlot, answer); + iNotifierMessage.Complete(KErrNone); + } + } + else if(aData.Keys().MdcaPoint(0).Compare(_L("checkBoxState")) == 0) + { + iCheckBoxState = *(static_cast(aData.Get(_L("checkBoxState"))->Data())); + } + } + +void CBTNotifServiceAuthorizer::MBRNotificationClosed( TInt aError, const TDesC8& aData ) + { + (void) aError; + (void) aData; + iNotification->RemoveObserver(); + iNotification = NULL; + } + +void CBTNotifServiceAuthorizer::PrepareNotificationL(TBool& aAutoAuthorize, + TBluetoothDialogParams::TBTDialogType aType, + TBTDialogResourceId aResourceId, TBool aPaired) + { + iNotification = iParent.ConnectionTracker().NotificationManager()->GetNotification(); + User::LeaveIfNull( iNotification ); // For OOM exception, leaves with KErrNoMemory + iNotification->SetObserver( this ); + iNotification->SetNotificationType( aType, aResourceId ); + TInt err = KErrNone; + aAutoAuthorize = EFalse; + + //Set the dialog title based on the service IDs + switch(iServiceId) + { + case KBTSdpObjectPush: + case KBTSdpBasicImaging: + { + if(aPaired) + { + err = iNotification->SetData( TBluetoothDialogParams::EDialogTitle, TBluetoothDialogParams::EReceiveFromPairedDevice); + // In case of receiving a msg from a paired deivce, the checkbox is checked by default. + iCheckBoxState = ETrue; + User::LeaveIfError(err); + } + else + { + err = iNotification->SetData( TBluetoothDialogParams::EDialogTitle, TBluetoothDialogParams::EReceive); + iCheckBoxState = EFalse; + User::LeaveIfError(err); + } + } + break; + + case KBTSdpFax: + case KBTSdpDun: + case KBTSdpFileTransfer: + case KBTSdpHeadSet: + case KBTSdpGenericTelephony: + case KBTSdpGenericNetworking: + { + err = iNotification->SetData( TBluetoothDialogParams::EDialogTitle, TBluetoothDialogParams::EConnect); + // In case of an incoming connection, the checkbox is checked by default. + iCheckBoxState = ETrue; + User::LeaveIfError(err); + } + break; + + default: + { + TBTAuthorisationParams params; + TPckgC paramsPckg(params); + paramsPckg.Set(iParams); + + // In this case, if there already exists a connection to an audio device, then we simply accept + // the incoming connection without querying the user. + // If there is no existing connection, then we pop up a query message. + if(IsExistingConnectionToAudioL(paramsPckg().iBDAddr)) + { + aAutoAuthorize = ETrue; + return; + } + else + { + err = iNotification->SetData( TBluetoothDialogParams::EDialogTitle, TBluetoothDialogParams::EConnect); + // In case of an incoming connection, the checkbox is checked by default. + iCheckBoxState = ETrue; + User::LeaveIfError(err); + } + } + break; + } + + //Add the device name + err = iNotification->SetData( TBluetoothDeviceDialog::EDeviceName, iCurrentDeviceName ); + User::LeaveIfError(err); + //Add the device class + err = iNotification->SetData( TBluetoothDeviceDialog::EDeviceClass, iDeviceClass ); + User::LeaveIfError(err); + + } + +TBool CBTNotifServiceAuthorizer::IsExistingConnectionToAudioL(const TBTDevAddr& aDevAddr) + { + CBTEngConnMan* connMan = CBTEngConnMan::NewL(); + TBTEngConnectionStatus conntatus(EBTEngNotConnected); + (void) connMan->IsConnected(aDevAddr,conntatus); + delete connMan; + return (conntatus==EBTEngConnected || conntatus==EBTEngConnecting); + } +