diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btnotif/src/BTNGenericQueryNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/src/BTNGenericQueryNotifier.cpp Wed Sep 01 12:20:04 2010 +0100 @@ -0,0 +1,439 @@ +/* +* Copyright (c) 2002, 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: Bluetooth visibility timeout notifier class. +* +*/ + + +// INCLUDE FILES + +#include // Localisation stringloader +#include +#include +#include // Own resources +#include +#include +#include "BTNGenericQueryNotifier.h" // Own class definition +#include "btNotifDebug.h" // Debugging macros +#include + +#ifdef __SERIES60_HELP +#include +#include // The bt hrh info is needed, for help launching +#endif + +const TInt KBTNotifPhonePowerKeyWatcher = 30; + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::NewL +// Two-phased constructor. +// ---------------------------------------------------------- +// +CBTGenericQueryNotifier* CBTGenericQueryNotifier::NewL() + { + CBTGenericQueryNotifier* self=new (ELeave) CBTGenericQueryNotifier(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::CBTGenericQueryNotifier +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------- +// +CBTGenericQueryNotifier::CBTGenericQueryNotifier() + { + } + +// ---------------------------------------------------------- +// Destructor +// ---------------------------------------------------------- +// +CBTGenericQueryNotifier::~CBTGenericQueryNotifier() + { + Cancel(); // Free own resources + delete iName; + iQueryMessage.Close(); + delete iQueryHeader; + if (iPhonePowerKey.Handle()) + { + iPhonePowerKey.Cancel(); + } + delete iPhonePowerKeyWatcher; + iPhonePowerKey.Close(); + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::ConstructL +// Symbian 2nd phase constructor can leave. +// Attach to the P&S property and create +// ---------------------------------------------------------- +// +void CBTGenericQueryNotifier::ConstructL() + { + CBTNotifierBase::ConstructL(); + + /** + * SysAp notifies Alarm UI to hide alarm when powerkey is pressed. + * This is called from CSysApAppUi::HandleShortPowerKeyPressedL(), + * so it seems to be a better choice than the following keys: + * KPSUidAvkonDomain/KAknPowerMenuStatus + * KPSUidCoreApplicationUIs/KCoreAppUIsAutolockStatus + * KCoreAppUIsAutolockStatus would be ideal, but it comes too late. + */ + User::LeaveIfError(iPhonePowerKey.Attach(KPSUidCoreApplicationUIs, + KCoreAppUIsHideAlarm)); + iPhonePowerKeyWatcher = CBTNotifActive::NewL(this, + KBTNotifPhonePowerKeyWatcher, CActive::EPriorityStandard); + iPhonePowerKey.Subscribe(iPhonePowerKeyWatcher->RequestStatus()); + iPhonePowerKeyWatcher->GoActive(); + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::RegisterL +// Register notifier. +// ---------------------------------------------------------- +// +CBTGenericQueryNotifier::TNotifierInfo CBTGenericQueryNotifier::RegisterL() + { + iInfo.iUid=KBTGenericQueryNotifierUid; + iInfo.iChannel=KBTGenericQueryNotifierUid; + iInfo.iPriority=ENotifierPriorityHigh; + return iInfo; + } + + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::StartL +// Synchronic notifier launch. Contructs and shows a global +// note, no parameters need here. +// ---------------------------------------------------------- +// +TPtrC8 CBTGenericQueryNotifier::StartL( const TDesC8& /*aBuffer*/ ) + { + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::StartL()")); + + TPtrC8 ret(KNullDesC8); + return (ret); + + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::GetParamsL +// Mandatory for BT Notifiers when using asynchronous launch. +// This notifier is synchronous so no implementation is needed. +// ---------------------------------------------------------- +// +void CBTGenericQueryNotifier::GetParamsL(const TDesC8& aBuffer, + TInt aReplySlot, + const RMessagePtr2& aMessage) + { + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::GetParamsL")); + + if (iMessage.Handle()) + { + aMessage.Complete(KErrInUse); + return; + } + + ProcessParamBufferL(aBuffer); + + iMessage = aMessage; + iReplySlot = aReplySlot; + + ShowQueryAndCompleteL(); + + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::GetParamsL Complete")); + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::ProcessParamBufferL +// Parse the data out of the message that is sent by the +// client of the notifier. +// ---------------------------------------------------------- +void CBTGenericQueryNotifier::ProcessParamBufferL(const TDesC8& aBuffer) + { + + TBTGenericQueryNotifierParams bParams; + TPckgC bPckg(bParams); + bPckg.Set( aBuffer ); + + if( bPckg().iMessageType == EBTNameQuery ) + { + iIsNameQuery = ETrue; + return; + } + iSecondaryDisplayCommand = ECmdBTnotifUnavailable; + switch (bPckg().iMessageType) + { + case EBTReceiveMessageQuery: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_RECEIVE_MESSAGE ; + iSecondaryDisplayCommand=ECmdShowReceiveMessageFromDeviceDlg; + break; + case EBTReceiveMessagePairedQuery: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_RECEIVE_MESSAGE_PAIRED; + iSecondaryDisplayCommand= ECmdShowReceiveMessageFromPairedDeviceDlg; + break; + case EBTIsOffQuery: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_POWER_IS_OFF ; + iSecondaryDisplayCommand=ECmdShowBtIsOffDlg; + break; + case EBTActivateOffLineQuery: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_ACTIVATE_IN_OFFLINE; + iSecondaryDisplayCommand=ECmdShowBtActivateInOfflineDlg; + break; + case EBTNoDevicesFoundQuery: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_NO_DEVICES_FOUND; + break; + case EBTAcceptRequestQuery: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_AUTHORISATION_NAME ; + iSecondaryDisplayCommand=ECmdShowAcceptConnRequestDlg; + break; + + case EBTIsOffJavaQuery: + iIsMessageQuery=ETrue; + if( bPckg().iNameExists ) + { + iMessageResourceId=R_BT_IS_OFF_JAVA_APPNAME; // when caller provide Java application name. + } + else + { + iMessageResourceId=R_BT_IS_OFF_JAVA; //r_bt_is_hidden_java + } + iSecondaryDisplayCommand=ECmdShowBtBtIsOffJavaDlg; + iQueryHeader=StringLoader::LoadL( R_BT_IS_OFF_JAVA_HEADER); + break; + + case EBTIsNotShownQuery: + iIsMessageQuery=ETrue; + if( bPckg().iNameExists ) + { + iMessageResourceId=R_BT_IS_HIDDEN_JAVA_APPNAME; // when caller provide Java application name. + } + else + { + iMessageResourceId=R_BT_IS_HIDDEN_JAVA; //r_bt_is_hidden_java + } + iSecondaryDisplayCommand=ECmdShowBtIsNotVisibleDlg; + iQueryHeader=StringLoader::LoadL( R_BT_IS_HIDDEN_JAVA_HEADER); + break; + + case EBTBlockConnectionQuery: + case EBTBlockPairedConnectionQuery: + iIsMessageQuery=ETrue; + if( bPckg().iMessageType == EBTBlockConnectionQuery ) + iMessageResourceId = R_BT_BLOCK_DEVICE_NOHELP; + else + iMessageResourceId = R_BT_BLOCK_PAIRED_DEVICE_NOHELP ; + + iQueryHeader= StringLoader::LoadL( R_BT_BLOCK_DEVICE_HEADER ); + break; + + case EBTSwitchOffAnyway: + iIsMessageQuery=EFalse; + iMessageResourceId=R_BT_SWITCH_OFF_ANYWAY; + break; + + default: + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier:: Unkown messageType! ")); + User::Leave(KErrNotFound); + } + + // if the logic string contains substitute indicator "%U", replace it with device name: + // + HBufC* buf = StringLoader::LoadL( iMessageResourceId); + iQueryMessage.Assign( buf ); + + TInt keyLen; + TInt pos = BluetoothUiUtil::GetStringSubstringKeyPos( + iQueryMessage, 0, keyLen ); + if( pos > KErrNotFound) + { + //if no device name provided, default name will be used: + if( !bPckg().iNameExists ) + iName=StringLoader::LoadL(R_BT_DIALOG_DEF_NAME); + else + { + iName=HBufC::NewL(bPckg().iName.Length() ); + iName->Des().Copy(bPckg().iName); + } + BluetoothUiUtil::LoadResourceAndSubstringL( + iQueryMessage, iMessageResourceId, *iName, 0); + } + else + { + iName=NULL; + } + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::UpdateL +// Update notifier according to new data +// ---------------------------------------------------------- +// +TPtrC8 CBTGenericQueryNotifier::UpdateL(const TDesC8& aBuffer) + { + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::UpdateL")); + ProcessParamBufferL(aBuffer); + if( !iNotifUiUtil->IsQueryReleased() ) + { + if(iIsMessageQuery ) + { + iNotifUiUtil->UpdateMessageQueryDlgL(iQueryMessage); + } + else + { + iNotifUiUtil->UpdateQueryDlgL(iQueryMessage); + } + } + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::UpdateL complete")); + + TPtrC8 ret(KNullDesC8); + return (ret); + } + +// ---------------------------------------------------------- +// CBTGenericQueryNotifier::ShowQueryAndCompleteL +// Shows the notifier in backround and complete message +// ---------------------------------------------------------- +// +void CBTGenericQueryNotifier::ShowQueryAndCompleteL() + { + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ShowQueryAndCompleteL")); + + // Turn lights on and deactivate apps -key + // + iNotifUiUtil->TurnLightsOn(); + if( iIsNameQuery ) + { + TBool nameStatus = IsLocalNameModifiedL(); + if( !nameStatus ) + { + (void) AskLocalBTNameQueryL(); + } + // Check if Local name is set again before turn BT on. + // Turn BT on only when there is local name, since user still has chance + // to ignore the asking name query - like pressing End-key + // + TBTDeviceName localName; + localName.Zero(); + TInt err = iBTEngSettings->GetLocalName(localName); + + if (localName.Length() <= 0) + { + err = KErrCancel; + } + + CompleteMessage( (!err) ? ETrue : EFalse, KErrNone ); + + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ShowQueryAndCompleteL iIsNameQuery complete")); + return; + } + + TInt keypress; + TBTDeviceName name(KNullDesC); + if( iName ) + { + name.Copy( *iName ); + } + if( iIsMessageQuery ) + { + + keypress = iNotifUiUtil->ShowMessageQueryL(iQueryMessage, *iQueryHeader, + R_BT_GENERIC_MESSAGE_QUERY, CAknQueryDialog::EConfirmationTone ); + } + else + { + keypress = iNotifUiUtil->ShowQueryL( iQueryMessage, R_BT_GENERIC_QUERY, + iSecondaryDisplayCommand, name, CAknQueryDialog::EConfirmationTone ); + } + + CompleteMessage( (keypress) ? ETrue: EFalse, KErrNone ); + + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::ShowQueryAndCompleteL complete")); + } + +// ---------------------------------------------------------- +// CBTAuthNotifier::RequestCompletedL +// Gets called when P&S key notifies the change +// ---------------------------------------------------------- +void CBTGenericQueryNotifier::RequestCompletedL(CBTNotifActive* aActive, + TInt aId, TInt aStatus) + { + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::RequestCompletedL()")); + switch (aId) + { + case KBTNotifPhonePowerKeyWatcher: + { + iPhonePowerKey.Subscribe(aActive->RequestStatus()); + aActive->GoActive(); + TInt val = 0; + // If the Power key is pressed it is likely that he user does not + // want to continue with existing query, so we dismiss it to avoid + // any clashes with subsequent popups (ie for setting Lock code). + // This is probably just a temporary solution to resolve immediate problem, + // and the issue is raised with UI Framework team. + if (!aStatus && !iPhonePowerKey.Get(val) && val == ECoreAppUIsHideAlarm) + { + // DismissDialog() internally checks that actual query dialog is NOT NULL, + // so it is safe to call it here. + iNotifUiUtil->DismissDialog(); + } + } + break; + } + + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::RequestCompletedL() completed")); + } + +// ---------------------------------------------------------- +// CBTAuthNotifier::HandleError +// ---------------------------------------------------------- +void CBTGenericQueryNotifier::HandleError(CBTNotifActive* aActive, TInt aId, + TInt aError) + { + FTRACE(FPrint(_L("[BTNOTIF]\t CBTGenericQueryNotifier::HandleError() error = %d"), aError )); + (void) aActive; + (void) aId; + (void) aError; + } + +// ---------------------------------------------------------- +// CBTAuthNotifier::DoCancelRequest +// Root caller is CBTNotifActive::CancelRequest(), which calls +// CActive::Cancel that calls DoCancel() if request is active. +// ---------------------------------------------------------- +void CBTGenericQueryNotifier::DoCancelRequest(CBTNotifActive* aActive, TInt aId) + { + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::DoCancel() >>")); + (void) aActive; + (void) aId; + + iPhonePowerKey.Cancel(); + + FLOG(_L("[BTNOTIF]\t CBTGenericQueryNotifier::DoCancel() <<")); + } + +// End of File