diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp Tue Aug 31 15:25:10 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,301 +0,0 @@ -/* -* 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); - } -