--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/terminalsecurity/SCP/SCPClient/src/SCPQueryDialog.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,774 @@
+/*
+* Copyright (c) 2000 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: Implementation of terminalsecurity components
+*
+*/
+
+#include <AknQueryDialog.h>
+#include "SCPQueryDialog.h"
+#include <eikseced.h>
+#include <aknsoundsystem.h>
+#include <StringLoader.h>
+#include <aknappui.h>
+#include <avkon.rsg>
+#include <SecUi.rsg>
+// Include the SecUi definitions
+#include <SecUi.hrh>
+#include "SCPDebug.h"
+#include <SCPNotifier.rsg>
+// For Central Repository
+#include <centralrepository.h>
+#include <AknIncallBubbleNotify.h>
+#include <e32property.h>
+#include <ctsydomainpskeys.h>
+#include "SCPCodePrivateCRKeys.h"
+/*#ifdef _DEBUG
+#define __SCP_DEBUG
+#endif // _DEBUG
+
+// Define this so the precompiler in CW 3.1 won't complain about token pasting,
+// the warnings are not valid
+#pragma warn_illtokenpasting off
+
+#ifdef __SCP_DEBUG
+#define Dprint(a) RDebug::Print##a
+#else
+#define Dprint(a)
+#endif // _DEBUG*/
+
+const TInt KSCPSpecialDeleteEvent( 63529 );
+
+// ================= MEMBER FUNCTIONS =======================
+//
+// ----------------------------------------------------------
+// CSCPQueryDialog::CSCPQueryDialog()
+// C++ constructor
+// ----------------------------------------------------------
+//
+CSCPQueryDialog::CSCPQueryDialog( TDes& aDataText,
+ RSCPClient::TSCPButtonConfig aButtonsShown,
+ TInt aMinLength,
+ TInt aMaxLength,
+ TBool aECSSupport
+ )
+ : CAknTextQueryDialog(aDataText, ENoTone),
+ iMinLength(aMinLength),
+ iMaxLength(aMaxLength),
+ iValidTextLen( 0 ),
+ iButtons( aButtonsShown ),
+ iECSSupport( aECSSupport ),
+ iEcsDetector( NULL ),
+ iEMCallActivated( EFalse ),
+ iShowingEMNumber( EFalse ),
+ iPreviousCharacterWasInvalid( EFalse ),
+ iPrioritySet( EFalse ),
+ iPriorityDropped( EFalse ),
+ iKeyUsed ( NULL )
+ {
+ }
+
+//
+// ----------------------------------------------------------
+// CSCPQueryDialog::~CSCPQueryDialog()
+// Destructor
+// ----------------------------------------------------------
+//
+CSCPQueryDialog::~CSCPQueryDialog()
+ {
+ Dprint( (_L("CSCPQueryDialog::~CSCPQueryDialog()")) );
+
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ TRAP_IGNORE ( SetIncallBubbleAllowedInUsualL( ETrue ) );
+ }
+
+
+ if (iFront)
+ {
+ // Uncapture keys, if they were captured
+ if ( iMode == KSCPModeRestricted )
+ {
+ RWindowGroup& groupWin=iCoeEnv->RootWin();
+ groupWin.CancelCaptureKeyUpAndDowns(iAppKey);
+ groupWin.CancelCaptureKeyUpAndDowns(iVoiceKey2);
+ groupWin.CancelCaptureKey(iVoiceKey1);
+ }
+
+ if ( iPrioritySet )
+ {
+ // Return normal high-priority in case there are other notifiers active
+ // and were are not going to lose foregroung right after following call
+ iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
+ }
+
+ iEikonEnv->BringForwards(EFalse);
+ iEikonEnv->EikAppUi()->RemoveFromStack(this);
+
+
+ static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->ReleaseContext();
+ static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->PopContext();
+
+
+ if ( iECSSupport )
+ {
+ delete iEcsDetector;
+ }
+
+ iFront = EFalse;
+ }
+
+ if (iDeviceLockStatusObserver)
+ delete iDeviceLockStatusObserver;
+ if (iCallStatusObserver)
+ delete iCallStatusObserver;
+ }
+//
+// ----------------------------------------------------------
+// CSCPQueryDialog::PreLayoutDynInitL()
+// Called by framework before dialog is shown
+// ----------------------------------------------------------
+//
+void CSCPQueryDialog::PreLayoutDynInitL()
+ {
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL()") ));
+
+ /* CEikSecretEditor* queryControl =
+ static_cast<CEikSecretEditor*>(
+ QueryControl()->ControlByLayoutOrNull( QueryControl()->QueryType() )
+ );
+ queryControl->EnableSCT(EFalse); */
+
+ CAknTextQueryDialog::PreLayoutDynInitL();
+
+ //disable in call bubble.
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ SetIncallBubbleAllowedInUsualL( EFalse );
+ }
+
+
+ // Create the ECS detector object if required
+ if ( iECSSupport )
+ {
+ Dprint( (_L(" Creating ECS detector") ));
+ iEcsDetector = CAknEcsDetector::NewL();
+ iEcsDetector->SetObserver( this );
+ }
+
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): Set input mode") ));
+
+ /* The default input mode of the lock code query must be set on the basis of the
+ very first character of the current lock code. If the first character of the current
+ lock code is numeric, the default input mode will also be numeric. Otherwise, the
+ default input mode will be alphabetic */
+
+ CRepository* repository;
+ repository = CRepository::NewL( KCRUidSCPParameters );
+ CleanupStack::PushL( repository );
+
+ User::LeaveIfError(repository->Get( KSCPLockCodeDefaultInputMode , def_mode) );
+
+ CleanupStack::PopAndDestroy( repository );
+ repository = NULL;
+
+ if (def_mode == 0)
+ SetDefaultInputMode( EAknEditorNumericInputMode );
+ else
+ SetDefaultInputMode( EAknEditorSecretAlphaInputMode );
+
+ // Set the mode, we use this to determine the functionality for special keys
+ if ( ( iButtons == RSCPClient::SCP_OK ) || ( iButtons == RSCPClient::SCP_OK_CANCEL ) )
+ {
+ // Normal mode
+ iMode = KSCPModeNormal;
+ }
+ else
+ {
+ // Restricted mode, used for example for Etel-originated queries
+ iMode = KSCPModeRestricted;
+ }
+
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): Set button config") ));
+ // Set the softkey-configuration
+ switch ( iButtons )
+ {
+ case ( RSCPClient::SCP_OK ):
+ // Flow through
+ case ( RSCPClient::SCP_OK_ETEL ):
+ {
+ // Hide the Cancel-softkey
+ ButtonGroupContainer().MakeCommandVisible( EAknSoftkeyCancel, EFalse );
+ break;
+ }
+
+ default:
+ // Show both softkeys
+ break;
+ }
+
+ QueryControl()->SetTextEntryLength( iMaxLength );
+
+ // Add this higher than the environment filter, otherwise
+ // we cannot capture keys from the EikSrvUi KeyFilter.
+ // Used because this query might be called from notifier
+
+ if ( iMode == KSCPModeNormal )
+ {
+ iEikonEnv->EikAppUi()->AddToStackL(this,
+ ECoeStackPriorityEnvironmentFilter+100,
+ ECoeStackFlagRefusesAllKeys);
+ }
+ else
+ {
+ iEikonEnv->EikAppUi()->AddToStackL(this,
+ ECoeStackPriorityEnvironmentFilter+100,
+ ECoeStackFlagRefusesFocus);
+ }
+
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): Capture keys") ));
+ // Capture app, voice and end keys if necessary
+ if ( iMode == KSCPModeRestricted )
+ {
+ RWindowGroup& groupWin=iCoeEnv->RootWin();
+ // Capture app key
+ iAppKey = groupWin.CaptureKeyUpAndDowns(EStdKeyApplication0, 0, 0);
+ // capture voice key
+ iVoiceKey1 = groupWin.CaptureKey(EKeySide,0,0);
+ iVoiceKey2 = groupWin.CaptureKeyUpAndDowns(EStdKeyDevice6, 0, 0);
+ }
+
+ RWsSession& wsSession = iEikonEnv->WsSession();
+ TInt myWgId = iEikonEnv->RootWin().Identifier();
+
+ TInt wgPrio = wsSession.GetWindowGroupOrdinalPriority(myWgId);
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): wgPrio %d"),wgPrio ));
+ TInt var;
+ RProperty::Get(KPSUidCtsyCallInformation, KCTsyCallState,var);
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): EPSCTsyCallStateNone %d"),var ));
+ // we are already on forgeround, need to update priority differently
+ if (var != EPSCTsyCallStateNone)
+ {
+
+ iEikonEnv->RootWin().SetOrdinalPosition(1,ECoeWinPriorityNormal);
+ }
+ else if ((wgPrio == ECoeWinPriorityAlwaysAtFront)&&(iECSSupport))
+ {
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): ECoeWinPriorityAlwaysAtFront+1") ));
+ iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1);
+ iPrioritySet = ETrue;
+ }
+
+ // this must be done always to keep the reference count in synch
+ // this does not have any effect if autoforwarding has not been set true (normal application.)
+ iEikonEnv->BringForwards(ETrue, ECoeWinPriorityAlwaysAtFront+1);
+
+ /// -- Change Window Priority for dialog and CBA
+ if (iECSSupport)
+ {
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): Changing Window Priority") ));
+ DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
+ ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
+ }
+ else
+ {
+ DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityNormal); //
+ ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityNormal);
+ }
+
+ Dprint( (_L("CSCPQueryDialog::PreLayoutDynInitL(): Key sounds") ));
+ // Key sounds
+
+ static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->
+ PushContextL(R_AVKON_DEFAULT_SKEY_LIST);
+
+ static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->BringToForeground();
+ static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->LockContext();
+
+ iFront = ETrue;
+
+ Dprint( (_L("CSCPQueryDialog::CSCPLockObserver") ));
+ iDeviceLockStatusObserver = CSCPLockObserver::NewL(this);
+ iCallStatusObserver = CSCPLockObserver::NewL(this,ESecUiCallStateObserver);
+
+ }
+//
+// ---------------------------------------------------------
+// CSCPQueryDialog::OfferKeyEventL
+// called by framework when any key is pressed
+// ---------------------------------------------------------
+//
+TKeyResponse CSCPQueryDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
+ {
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(%d, %d, %d)"), aKeyEvent.iScanCode,
+ aKeyEvent.iCode, aType ));
+
+ //Handling for Key up events for special characters
+ if (aType == EEventKeyUp && iPriorityDropped && iKeyUsed
+ == aKeyEvent.iScanCode)
+ {
+ DrawableWindow()->SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
+ ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(
+ 0, ECoeWinPriorityAlwaysAtFront);
+ iPriorityDropped = EFalse;
+ iKeyUsed = NULL;
+ Dprint((_L("CSCPQueryDialog::OfferKeyEventL(): Priority dropped")));
+ return EKeyWasConsumed;
+ }
+ else
+ {
+ if (iPriorityDropped && iKeyUsed != aKeyEvent.iScanCode
+ && (aKeyEvent.iScanCode == EStdKeyDevice0
+ || aKeyEvent.iScanCode == EStdKeyDevice1
+ || aKeyEvent.iScanCode == EStdKeyDevice2
+ || aKeyEvent.iScanCode == EStdKeyDevice3))
+ {
+ iPriorityDropped = EFalse;
+ iKeyUsed = NULL;
+ }
+
+ }
+
+ //Consume the characters which are typed before Key up events of special characters
+ if (iPriorityDropped && iKeyUsed != NULL)
+ {
+ return EKeyWasConsumed;
+ }
+
+
+ // Check if the priority should be dropped, so that special dialogs can be shown
+ if ( ( aType == EEventKeyDown ) &&
+ ( ( aKeyEvent.iScanCode == EStdKeyLeftShift ) || // Pen-key
+ ( aKeyEvent.iScanCode == EStdKeyRightShift ) || // Pen-key
+ ( aKeyEvent.iScanCode == EStdKeyLeftFunc ) || //Chr-key
+ ( aKeyEvent.iScanCode == EStdKeyNkpAsterisk ) || // * - key
+ ( aKeyEvent.iScanCode == '*' ) // * - key
+ )
+ )
+ {
+ iKeyUsed = aKeyEvent.iScanCode;
+ DrawableWindow()->SetOrdinalPosition(0,0);
+ ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,0);
+ iPriorityDropped = ETrue;
+
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(): Priority dropped") ));
+ }
+ else
+ {
+ // Return priority, either no dialogs shown, or already exited.
+ if ( iPriorityDropped )
+ {
+ DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
+ ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
+ iPriorityDropped = EFalse;
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(): Priority re-raised") ));
+ }
+ }
+
+ if ( aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter)
+ {
+ // Try to exit with OK as well
+ TryExitL(EAknSoftkeyOk);
+ return EKeyWasConsumed;
+ }
+
+ // app key
+ if (aKeyEvent.iScanCode == EStdKeyApplication0)
+ {
+ if ( iButtons == RSCPClient::SCP_OK_CANCEL )
+ {
+ TryExitL(EAknSoftkeyCancel);
+ return EKeyWasNotConsumed;
+ }
+ return EKeyWasConsumed;
+ }
+
+ // end key
+ if ( (aKeyEvent.iCode == EKeyPhoneEnd) || (aKeyEvent.iCode == EKeyEscape) )
+ {
+ if ( ( iButtons == RSCPClient::SCP_OK_CANCEL ) ||
+ ( iButtons == RSCPClient::SCP_OK_CANCEL_ETEL ) )
+ {
+ TryExitL(EAknSoftkeyCancel);
+ }
+ return EKeyWasConsumed;
+ }
+
+ if (aKeyEvent.iCode == EKeyPhoneSend)
+ {
+ //if (AknLayoutUtils::PenEnabled())
+ {
+ if (iECSSupport)
+ {
+ if (iEcsDetector->State()== CAknEcsDetector::ECompleteMatch)
+ {
+ iEcsDetector->AddChar( (TText)(EKeyPhoneSend) );
+
+ }
+ else
+ {
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(): ShowWarningNoteL") ));
+ ShowWarningNoteL();
+ return EKeyWasConsumed;
+ }
+ }
+ else //consume the key to prevent dialler from opening
+ {
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(): EKeyPhoneSend :EKeyWasConsumed") ));
+ return EKeyWasConsumed;
+ }
+ }
+ }
+
+ if ( ( aType == EEventKey ) && ( aKeyEvent.iCode == KSCPSpecialDeleteEvent ) )
+ {
+ // This special event is sent to remove the previous character while "cycling" with
+ // the numeric keys. Discard, if the previous character was already removed.
+ if ( iPreviousCharacterWasInvalid )
+ {
+ return EKeyWasConsumed;
+ }
+ }
+
+ if ( ( aType == EEventKey ) && ( iECSSupport ) )
+ {
+ // Reset the field text
+ QueryControl()->SetTextL( iTextBuffer );
+ }
+
+ TKeyResponse ret = QueryControl()->OfferKeyEventL( aKeyEvent, aType );
+
+ // Check that only alphanumeric letters are entered
+ if ( ( QueryControl() != NULL ) && ( QueryControl()->GetTextLength() > iValidTextLen ) )
+ {
+ // A new character was added to the editor
+ iTmpBuffer.Zero();
+ QueryControl()->GetText( iTmpBuffer );
+
+ TChar newChar = iTmpBuffer[ iTmpBuffer.Length() - 1 ];
+ TChar::TCategory newCat = newChar.GetCategory();
+ if ( newChar.IsSpace() || newChar < 1 || newChar > 126 )
+ /* if ( !newChar.IsAlphaDigit() && newCat != TChar::ENdCategory ) */
+ {
+ // Remove the last character, not allowed
+ iTmpBuffer.SetLength( iTmpBuffer.Length() - 1 );
+ QueryControl()->SetTextL( iTmpBuffer );
+
+ iPreviousCharacterWasInvalid = ETrue;
+
+ // Hide the OK key if the first character was invalid
+ if ( iValidTextLen == 0 )
+ {
+ if (AknLayoutUtils::PenEnabled())
+ {
+ ButtonGroupContainer().DimCommand(EAknSoftkeyOk, ETrue);
+ }
+ else
+ {
+ ButtonGroupContainer().MakeCommandVisible(EAknSoftkeyOk, EFalse);
+ }
+
+ }
+ }
+ else
+ {
+ iValidTextLen++;
+ iPreviousCharacterWasInvalid = EFalse;
+ }
+ }
+ else if ( ( QueryControl() != NULL ) && ( QueryControl()->GetTextLength() < iValidTextLen ) )
+ {
+ // Character removed, make sure we're back on track,
+ // though likely only backspace was pressed
+ iValidTextLen = QueryControl()->GetTextLength();
+ }
+
+//Additional modifier set by query dialog, while simulating event
+// As raw key events are used to simulate, modifiers and scan codes cannot be set at a time
+// In the 1st event, modifiers are set and in subsequent event, scan codes will be set.
+if(aKeyEvent.iModifiers & EModifierNumLock &&
+ aKeyEvent.iModifiers & EModifierKeypad && aKeyEvent.iModifiers & EModifierSpecial
+)
+ {
+
+ return EKeyWasConsumed;
+ }
+ if ( iECSSupport )
+ {
+ // Save the text
+ if ( aType == EEventKey )
+ {
+ QueryControl()->GetText( iTextBuffer );
+ }
+ if ( aType == EEventKey )
+ {
+ iEcsDetector->SetBuffer(iTextBuffer.Left(KAknEcsMaxMatchingLength));
+ }
+ if ( aType == EEventKey )
+ {
+ if ( iEMCallActivated )
+ {
+ TryExitL( ESecUiEmergencyCall );
+ return EKeyWasConsumed;
+ }
+ }
+ // Retrieve the editor control ptr, we know it is a secret editor..
+ CEikSecretEditor* queryControl = static_cast<CEikSecretEditor*>(
+ QueryControl()->ControlByLayoutOrNull( QueryControl()->QueryType() ) );
+
+ // Further check to ensure that the matched number is the entire buffer
+ // Get the matched text and see if is the same length as the current query length
+ if ( iShowingEMNumber && (QueryControl()->GetTextLength()== iEcsDetector->CurrentMatch().Length()))
+ {
+ // The previous keyDown-event resulted in a complete Em-number match.
+
+ // An emergency number is entered, show the text in the field
+ QueryControl()->SetTextL( iEcsDetector->CurrentMatch() );
+ if ( queryControl != NULL )
+ {
+ queryControl->RevealSecretText( ETrue );
+ HBufC* cbaLabel = NULL;
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(): R_AVKON_SOFTKEY_CALL_TEXT") ));
+ TRAPD ( err, cbaLabel =
+ StringLoader::LoadL( R_AVKON_SOFTKEY_CALL_TEXT) );
+ if ( err == KErrNone )
+ {
+ TRAP ( err, ButtonGroupContainer().AddCommandToStackL( 0, EAknSoftkeyEmergencyCall,
+ *cbaLabel) );
+ delete cbaLabel;
+ }
+ }
+ }
+ else
+ {
+ // The input doesn't match a Em-number
+ if ( queryControl != NULL )
+ {
+ queryControl->RevealSecretText( EFalse );
+ HBufC* cbaLabel = NULL;
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL(): R_SCPDIALOG_OK_TEXT") ));
+ TRAPD ( err , cbaLabel= StringLoader::LoadL(R_SCPDIALOG_OK_TEXT) );
+ if ( err == KErrNone )
+ {
+ TRAP ( err , ButtonGroupContainer().AddCommandToStackL(0,EAknSoftkeyOk,*cbaLabel) );
+ ButtonGroupContainer().DrawDeferred();
+ delete cbaLabel;
+ }
+ }
+ }
+ }
+
+ Dprint( (_L("CSCPQueryDialog::OfferKeyEventL() exiting") ));
+
+ if ( ret == EKeyWasConsumed ) // The editor control used up this keyevent
+ {
+ return ret;
+ }
+ else
+ {
+ return CAknTextQueryDialog::OfferKeyEventL(aKeyEvent,aType);
+ }
+ }
+//
+// ---------------------------------------------------------
+// CSCPQueryDialog::NeedToDismissQueryL()
+// Handles '#' key called by CAknTextQueryDialog::OfferKeyEventL()
+// ---------------------------------------------------------
+//
+TBool CSCPQueryDialog::NeedToDismissQueryL(const TKeyEvent& /*aKeyEvent*/)
+ {
+ return EFalse;
+ }
+//
+// ---------------------------------------------------------
+// CSCPQueryDialog::OkToExitL()
+// called by framework when the Softkey is pressed
+// ---------------------------------------------------------
+//
+TBool CSCPQueryDialog::OkToExitL(TInt aButtonId)
+ {
+
+ Dprint( (_L("CSCPQueryDialog::OkToExitL ( aButtonId :%d, "), aButtonId ));
+ TInt ret = EFalse;
+
+ if ( aButtonId == EAknSoftkeyOk )
+ {
+ Dprint( (_L("CSCPQueryDialog::OkToExitL - EAknSoftkeyOk") ));
+ TInt textLength = QueryControl()->GetTextLength();
+ if ( textLength < iMinLength )
+ {
+ // The code was too short -> play error tone & clear editor
+ if ( textLength != 0 )
+ {
+ CAknKeySoundSystem* soundSystem;
+ if ( iEikonEnv->AppUi() )
+ {
+ soundSystem = static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds();
+ soundSystem->PlaySound( EAvkonSIDErrorTone );
+ }
+ QueryControl()->SetTextL( KNullDesC );
+ iTextBuffer.Zero();
+ iValidTextLen = 0;
+
+ // Hide the OK key
+ //ButtonGroupContainer().MakeCommandVisible( EAknSoftkeyOk, EFalse );
+ // ButtonGroupContainer().DimCommand(EAknSoftkeyOk, ETrue);
+
+ if (AknLayoutUtils::PenEnabled())
+ {
+ ButtonGroupContainer().DimCommand(EAknSoftkeyOk, ETrue);
+ }
+ else
+ {
+ ButtonGroupContainer().MakeCommandVisible(EAknSoftkeyOk, EFalse);
+ }
+ }
+ ret = EFalse;
+ }
+ else
+ {
+ ret = CAknTextQueryDialog::OkToExitL(aButtonId);
+ }
+ }
+
+ // Cancel is allowed, if the key is active
+ if ( aButtonId == EAknSoftkeyCancel )
+ {
+ Dprint( (_L("CSCPQueryDialog::OkToExitL EAknSoftkeyCancel ")) );
+ ret = CAknTextQueryDialog::OkToExitL(aButtonId);
+ }
+
+ // Emergency call, exit
+ if ( aButtonId == ESecUiEmergencyCall )
+ {
+ Dprint( (_L("CSCPQueryDialog::OkToExitL(): ESecUiEmergencyCall") ));
+ ret = ETrue;
+ }
+ if (aButtonId == EAknSoftkeyEmergencyCall)
+ {
+ //add EKeyPhonesend to ecs detector.
+ ret = ETrue;
+ Dprint( (_L("CSCPQueryDialog::OkToExitL(): adding EKeyPhoneSend to detector") ));
+ iEcsDetector->AddChar( (TText)(EKeyPhoneSend ) );
+ CAknTextQueryDialog::OkToExitL(aButtonId);
+ }
+
+ Dprint( (_L("CSCPQueryDialog::OkToExitL() done") ));
+ return ret;
+ }
+
+
+// ---------------------------------------------------------
+// CSCPQueryDialog::HandleEcsEvent()
+//
+// ---------------------------------------------------------
+//
+void CSCPQueryDialog::HandleEcsEvent(CAknEcsDetector* aDetector,
+ CAknEcsDetector::TState aUpdatedState)
+ {
+ (void)aDetector; // Not used
+
+ TInt err;
+ if ( ( aUpdatedState == CAknEcsDetector::ECompleteMatchThenSendKey ) ||
+ ( aUpdatedState == CAknEcsDetector::ECallAttempted ) )
+ {
+ // Call attempted, cancel the query
+ iEMCallActivated = ETrue; // OfferKeyEventL will close the dialog
+ }
+ else if ( aUpdatedState == CAknEcsDetector::ECompleteMatch )
+ {
+ iShowingEMNumber = ETrue;
+ }
+ else if ( iShowingEMNumber )
+ {
+ // Cancel Em-number display
+ iShowingEMNumber = EFalse;
+
+ if ( aUpdatedState == CAknEcsDetector::EEmpty )
+ {
+ // Key timeout: OfferKeyEventL won't be called, so reset the display here
+ TRAP( err, QueryControl()->SetTextL( iTextBuffer ) );
+ (void)err;
+
+ // Retrieve the editor control ptr, we know it is a secret editor..
+ CEikSecretEditor* queryControl =
+ static_cast<CEikSecretEditor*>(
+ QueryControl()->ControlByLayoutOrNull( QueryControl()->QueryType() )
+ );
+ if ( queryControl != NULL )
+ {
+ queryControl->RevealSecretText( EFalse );
+ }
+ // }
+ HBufC* cbaLabel = NULL;
+ Dprint( (_L("CSCPQueryDialog::HandleEcsEvent(): R_SCPDIALOG_OK_TEXT") ));
+ TRAP ( err, cbaLabel= StringLoader::LoadL(R_SCPDIALOG_OK_TEXT) );
+ if ( err == KErrNone )
+ {
+ TRAP ( err , ButtonGroupContainer().AddCommandToStackL(0, EAknSoftkeyOk, *cbaLabel) );
+ ButtonGroupContainer().DrawDeferred();
+ delete cbaLabel;
+ }
+ }
+ }
+ }
+
+void CSCPQueryDialog::ShowWarningNoteL()
+ {
+
+ CAknNoteDialog* noteDlg = new (ELeave) CAknNoteDialog();
+ noteDlg->PrepareLC(R_SCPDIALOG_EMERGENCYCALLS_ONLY);
+ noteDlg->SetTimeout(CAknNoteDialog::ELongTimeout);
+ noteDlg->SetTone(CAknNoteDialog::EErrorTone);
+
+ noteDlg->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1); //
+ noteDlg->ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1);
+
+ noteDlg->RunLD();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSCPQueryDialog::SetIncallBubbleAllowedInUsualL()
+// -----------------------------------------------------------------------------
+//
+void CSCPQueryDialog::SetIncallBubbleAllowedInUsualL(TBool aAllowed)
+ {
+ CAknIncallBubble *incallBubble = CAknIncallBubble::NewL();
+ CleanupStack::PushL(incallBubble);
+ incallBubble->SetIncallBubbleAllowedInUsualL( aAllowed );
+ CleanupStack::PopAndDestroy();
+ }
+
+// Call from the SCPObserver
+
+void CSCPQueryDialog::TryCancelQueryL(TInt aReason)
+ {
+ Dprint( (_L("CSCPQueryDialog::TryCancelQueryL()")) );
+
+ if (EPSCTsyCallStateDisconnecting == aReason)
+ {
+ Dprint( (_L("CSCPQueryDialog::TryCancelQueryL() -SetOrdinalPosition ->0")) );
+ iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1);
+ iPrioritySet = ETrue;
+ }
+ else
+ {
+ Dprint( (_L("CSCPQueryDialog::TryExitL(EAknSoftkeyCancel)")) );
+ TryExitL(EAknSoftkeyCancel);
+ }
+ }
+
+
+// End of file
+