--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/UISrc/ccnouiusernameandpwdquery.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,622 @@
+/*
+* Copyright (c) 2008 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: Username and password multiline data query
+*
+*/
+
+// INCLUDE FILES
+#include <IMPSConnectionUiNG.rsg>
+
+#include "ccnouiusernameandpwdquery.h"
+#include "CnUiIMPSIdValidator.h"
+#include "MCnUiUiFacade.h"
+
+#include <barsread.h>
+#include <eikcapc.h>
+#include <LayoutMetaData.cdl.h>
+#include <stringloader.h>
+
+#include <browserlauncher.h>
+#include <aknmessagequerydialog.h>
+
+#include "VariantKeys.h"
+#include <CentralRepository.h>
+#include "CnUiResourceFileName.h"
+
+#include "orangeim.hrh"
+#include "impswapreguiddefs.h"
+#include "CIMPSSharedDataFactory.h"
+#include "MIMPSSharedData.h"
+#include "IMPSPresenceConnectionUiConstsNG.h"
+
+//Max length of WAP registration URL
+#define KMaxRegUrlLength 20
+
+// ================= MEMBER FUNCTIONS =======================
+CCnOUiUsernameAndPwdQuery* CCnOUiUsernameAndPwdQuery::NewL( TDes& aUserName,
+ TDes& aPwd,
+ TCnUiLoginDataQueryMode aMode,
+ TBool aDomainSelectionQueryVariation,
+ MCnUiUiFacade& aUiFacade )
+ {
+ TInitialFocus focus;
+ TBool cursorToBeginning = EFalse;
+
+ switch ( aMode )
+ {
+ case ECnUiReEdit:
+ {
+ //in re-edit focus always the user name field
+ focus = EFirstLine;
+ break;
+ }
+ case ECnUiNormal:
+ {
+ // detect which line to focus
+ focus = DetectLineToFocus( aUserName, aPwd );
+ break;
+ }
+ case ECnUiEditPrefilledUser:
+ {
+ // detect which line to focus
+ focus = EFirstLine;
+ cursorToBeginning = ETrue;
+ break;
+ }
+ default:
+ {
+ focus = EFirstLine;
+ break;
+ }
+ }
+
+
+ CCnOUiUsernameAndPwdQuery* self =
+ new ( ELeave ) CCnOUiUsernameAndPwdQuery( focus,
+ aUiFacade,
+ aDomainSelectionQueryVariation,
+ cursorToBeginning );
+ CleanupStack::PushL( self );
+ self->SetDataL( aUserName, aPwd );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCnOUiUsernameAndPwdQuery::CCnOUiUsernameAndPwdQuery( TInitialFocus aInitialFocus,
+ MCnUiUiFacade& aUiFacade,
+ TBool aDomainSelectionQueryVariation,
+ TBool aCursorToBeginning /* = EFalse */ )
+ : CAknMultiLineDataQueryDialog( ENoTone ),
+ iInitialFocus( aInitialFocus ),
+ iCursorToBeginning( aCursorToBeginning ),
+ iUiFacade( aUiFacade ),
+ iDomainSelectionQueryVariation( aDomainSelectionQueryVariation ),
+ iForcedExit( EFalse )
+ {
+ }
+
+//ConstructL
+void CCnOUiUsernameAndPwdQuery::ConstructL()
+ {
+ iSharedData = CIMPSSharedDataFactory::CreateTemporaryKeyHandlerL( NULL, KBrandingUid );
+ }
+
+
+// Destructor
+CCnOUiUsernameAndPwdQuery::~CCnOUiUsernameAndPwdQuery()
+ {
+ iRFs.Close();
+ delete iBrLauncher;
+ delete iSharedData;
+ }
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::SetInitialCurrentLine()
+//
+// From CEikDialog
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::SetInitialCurrentLine()
+ {
+ //if initial line can't be set,
+ //the error can be only ignored
+ TInt ignore;
+ TRAP( ignore, DoSetInitialCurrentLineL() );
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::UpdateLeftSoftKeyL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::UpdateLeftSoftKeyL()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::ProcessCommandL()
+// From CAknDialog
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::ProcessCommandL( TInt aCommandId )
+ {
+ switch ( aCommandId )
+ {
+ case ERegister:
+ {
+ HideMenu();
+ if ( ShowTAndCDlgL() == EAknSoftkeyOk )
+ {
+ // Get pointer to WAP registration settings
+ CRepository* cenRep = CRepository::NewLC( KCRUidIMPSConnUI );
+
+ HBufC16 *url = HBufC::NewLC( KMaxRegUrlLength );
+ TPtr ptr( url->Des() );
+ TInt urlLength;
+
+ if ( cenRep->Get( KWAPRegistrationURL, ptr, urlLength ) == KErrOverflow )
+ {
+ //because there could be an overflow
+ CleanupStack::PopAndDestroy( url );
+
+ url = HBufC::NewLC( urlLength );
+ ptr.Set( url->Des() );
+ User::LeaveIfError( cenRep->Get( KWAPRegistrationURL, ptr, urlLength ) );
+ }
+
+ OpenWebBrowserL( *url );
+
+ CleanupStack::PopAndDestroy( url );
+ CleanupStack::PopAndDestroy( cenRep );
+ }
+ break;
+ }
+ case EAknSoftkeyOk:
+ {
+ TryExitL( aCommandId );
+ break;
+ }
+ default:
+ {
+ CAknMultiLineDataQueryDialog::ProcessCommandL( aCommandId );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::ShowTAndCDlgL()
+// Shows Terms and conditions
+// -----------------------------------------------------------------------------
+//
+TInt CCnOUiUsernameAndPwdQuery::ShowTAndCDlgL()
+ {
+ CAknMessageQueryDialog* msgQueryDlg = new( ELeave )CAknMessageQueryDialog( CAknMessageQueryDialog::ENoTone );
+ CleanupStack::PushL( msgQueryDlg );
+ msgQueryDlg->PrepareLC( R_MESSAGE_QUERY );
+
+ HBufC* resourceText = NULL;
+ resourceText = StringLoader::LoadLC( R_QTN_IM_AGREE_LSK_REGISTER );
+ msgQueryDlg->ButtonGroupContainer().SetCommandL( 0, EAknSoftkeyOk, *resourceText );
+ CleanupStack::PopAndDestroy( resourceText );
+
+ resourceText = StringLoader::LoadLC( R_QTN_IM_REFUSE_RSK_REGISTER );
+ msgQueryDlg->ButtonGroupContainer().SetCommandL( 2, EAknSoftkeyCancel, *resourceText );
+ CleanupStack::PopAndDestroy( resourceText );
+
+ resourceText = StringLoader::LoadL( R_QTN_NOTE_TERMS_WAP_ORANGE );
+ msgQueryDlg->SetMessageText( *resourceText );
+
+ resourceText = StringLoader::LoadL( R_QTN_NOTE_TITLE_TERMS_WAP_ORANGE );
+ msgQueryDlg->SetHeaderText( *resourceText );
+
+ CleanupStack::Pop( msgQueryDlg );
+
+ TInt command = msgQueryDlg->RunLD();
+ return command;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::OpenWebBrowserL()
+// Opens native browser for specified URL
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::OpenWebBrowserL( const TDesC& aUrl )
+ {
+ if ( !iBrLauncher )
+ {
+ iBrLauncher = CBrowserLauncher::NewL();
+ }
+
+ //Asynchronous operation to launch the browser with aUrl
+ iBrLauncher->LaunchBrowserEmbeddedL( aUrl );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::DynInitMenuPaneL()
+// From CAknDialog
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
+ {
+ CAknMultiLineDataQueryDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
+ switch ( aResourceId )
+ {
+ case R_AVKON_MENUPANE_LANGUAGE_DEFAULT:
+ {
+ if ( CanSignOnL() )
+ {
+ CEikMenuPaneItem::SData signOn;
+ signOn.iCommandId = EAknSoftkeyOk;
+ signOn.iCascadeId = 0;
+
+ HBufC* lsk = NULL;
+ lsk = StringLoader::LoadLC( R_QTN_IM_REGISTER_SIGN_OPTION );
+ signOn.iText.Copy( *lsk );
+ aMenuPane->AddMenuItemL( signOn );
+ CleanupStack::PopAndDestroy( lsk );
+ lsk = NULL;
+ }
+
+ CEikMenuPaneItem::SData registeration;
+ registeration.iCommandId = ERegister;
+ registeration.iCascadeId = 0;
+
+ HBufC* rsk = NULL;
+ rsk = StringLoader::LoadLC( R_QTN_IM_REGISTER_LOGIN_OPTION );
+ registeration.iText.Copy( *rsk );
+ CleanupStack::PopAndDestroy( rsk );
+ rsk = NULL;
+
+ aMenuPane->AddMenuItemL( registeration );
+ break;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::CanSignOnL()
+// From CAknDialog
+// -----------------------------------------------------------------------------
+//
+TBool CCnOUiUsernameAndPwdQuery::CanSignOnL()
+ {
+ CAknMultilineQueryControl* first =
+ CAknMultiLineDataQueryDialog::FirstControl();
+ CAknMultilineQueryControl* second =
+ CAknMultiLineDataQueryDialog::SecondControl();
+
+ HBufC* firstText = HBufC::NewLC( first->GetTextLength() );
+ HBufC* secondText = HBufC::NewL( second->GetTextEntryLength() );
+
+ TPtr firstPtr( firstText->Des() );
+ TPtr secondPtr( secondText->Des() );
+
+ first->GetText( firstPtr );
+ firstPtr.TrimAll();
+
+ second->GetText( secondPtr );
+ secondPtr.TrimAll();
+
+ TBool returnVal( EFalse );
+ if ( ( firstPtr.Length() > 0 ) && ( secondPtr.Length() > 0 ) )
+ {
+ returnVal = ETrue;
+ }
+
+ delete secondText;
+ CleanupStack::PopAndDestroy( firstText );
+
+ return returnVal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::OkToExitL()
+//
+// From CEikDialog
+// -----------------------------------------------------------------------------
+//
+TBool CCnOUiUsernameAndPwdQuery::OkToExitL( TInt aButtonId )
+ {
+ if ( iForcedExit )
+ {
+ // If dialog needs to be exited because user
+ // emptied user id field, allow exit and don't do any checks
+ return ETrue;
+ }
+
+ if ( aButtonId == EAknSoftkeyOptions || aButtonId == EAknSoftkeyOk )
+ {
+ if ( !MenuShowing() )
+ {
+ DisplayMenuL();
+ return EFalse;
+ }
+ }
+
+ HBufC* userId = HBufC::NewLC( FirstControl()->GetTextLength() );
+ TPtr IdPtr( userId->Des() );
+ FirstControl()->GetText( IdPtr );
+
+ // Check userID before changing to next page
+ if ( CnUiIMPSIdValidator::ValidLoginIdL( IdPtr ) )
+ {
+ CleanupStack::PopAndDestroy( userId );
+ TBool okValue = CAknMultiLineDataQueryDialog::OkToExitL( aButtonId );
+ UpdateLeftSoftKeyL();
+ return okValue;
+ }
+ else
+ {
+ //WV id faulty, show note
+ iUiFacade.ShowNoteL( ECnUiImproperPresenceId, IdPtr );
+ CleanupStack::PopAndDestroy( userId );
+
+ //try to focus whole editor line
+ CEikEdwin* presIdEdwin = ( CEikEdwin* )
+ FirstControl()->ControlByLayoutOrNull( EMultiDataFirstEdwin );
+ if ( presIdEdwin )
+ {
+ TryChangeFocusToL( EMultilineFirstLine );
+ presIdEdwin->SelectAllL();
+ }
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::TryChangeFocusToL()
+// From CEikDialog
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::TryChangeFocusToL( TInt aControlId )
+ {
+ // This special focusing is only used to revert the focus
+ // back from second line to first line ( landscape mode ).
+ if ( Layout_Meta_Data::IsLandscapeOrientation() &&
+ aControlId == EMultilineFirstLine )
+ {
+ // CAknMultiLineDataQueryDialog does not support changing the query
+ // backwards, so we have to do it "manually".
+ // This is copied from CAknMultiLineDataQueryDialog
+ TBool firstLineEnabled = ETrue;
+ TBool secondLineEnabled = EFalse;
+ CAknMultilineQueryControl* firstControl = FirstControl();
+ CAknMultilineQueryControl* secondControl = SecondControl();
+ TInt line1 = FindLineIndex( *firstControl );
+ TInt line2 = FindLineIndex( *secondControl );
+ CEikCaptionedControl *ctrl1 = GetLineByLineAndPageIndex( line1, 0 );
+ CEikCaptionedControl *ctrl2 = GetLineByLineAndPageIndex( line2, 0 );
+ ctrl1->SetLatent( !firstLineEnabled );
+ ctrl2->SetLatent( !secondLineEnabled );
+ ctrl1->SetLatentGroupLineFollows( !firstLineEnabled );
+ ctrl2->SetLatentGroupLineFollows( !secondLineEnabled );
+ ctrl1->SetFocusing( firstLineEnabled );
+ ctrl2->SetFocusing( secondLineEnabled );
+ }
+
+ CAknMultiLineDataQueryDialog::TryChangeFocusToL( aControlId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::HandleResourceChange()
+// From CEikDialog
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::HandleResourceChange( TInt aType )
+ {
+ CAknMultiLineDataQueryDialog::HandleResourceChange( aType );
+ if ( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ TRAP_IGNORE( UpdateLeftSoftKeyL( ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::NeedToDismissQueryL
+// From CAknMultiLineDataQueryDialog
+// -----------------------------------------------------------------------------
+//
+TBool CCnOUiUsernameAndPwdQuery::NeedToDismissQueryL( const TKeyEvent& aKeyEvent )
+ {
+ // Check if user has emptied user id field
+ // and exit if domain selection query is variated on
+ if ( iDomainSelectionQueryVariation &&
+ ( aKeyEvent.iCode == EKeyBackspace || aKeyEvent.iCode == EKeyDelete ) )
+ {
+ CAknMultilineQueryControl* ctrl = FirstControl(); // user id field
+ CCoeControl* coeCtrl = ctrl->ControlByLayoutOrNull( EMultiDataFirstEdwin );
+ if ( coeCtrl )
+ {
+ CEikEdwin* firstEdwin = static_cast<CEikEdwin*>( coeCtrl );
+ TInt textLen = firstEdwin->TextLength();
+ TInt cursorPos = firstEdwin->CursorPos();
+ if ( ( firstEdwin->Selection().Length() == textLen )
+ || ( textLen == 1 && cursorPos == 1 && aKeyEvent.iCode == EKeyBackspace )
+ || ( textLen == 1 && cursorPos == 0 && aKeyEvent.iCode == EKeyDelete ) )
+ {
+ // NeedToDismissQueryL is called first thing in OfferKeyEventL
+ // so if editor length is 1 or whole text is selected at this point
+ // it would be 0 after OfferKeyEventL, clear editor and dismiss dialog
+ firstEdwin->SelectAllL();
+ firstEdwin->ClearSelectionL();
+ iForcedExit = ETrue;
+ TryExitL( EAknSoftkeyExit );
+ return ETrue;
+ }
+ else
+ {
+ // Text in editor, don't dismiss
+ return EFalse;
+ }
+ }
+ }
+
+ // Else just return EFalse and don't dismiss dialog
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::DetectLineToFocus()
+// Private helper.
+// -----------------------------------------------------------------------------
+//
+CCnOUiUsernameAndPwdQuery::TInitialFocus
+CCnOUiUsernameAndPwdQuery::DetectLineToFocus(
+ const TDesC& aFirstLine,
+ const TDesC& aSecondLine )
+ {
+ //focus the second line just if the first one has something in it
+ //and the second one is empty
+ if ( ( aFirstLine.Length() > 0 ) && ( aSecondLine.Length() == 0 ) )
+ {
+ return ESecondLine;
+ }
+
+ //else
+ return EFirstLine;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnOUiUsernameAndPwdQuery::DoSetInitialCurrentLineL()
+// Private helper.
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::DoSetInitialCurrentLineL()
+ {
+ ActivateFirstPageL();
+
+ // change input mode according to resource variation
+ TBool textualInput = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_USERID_TEXTUAL_INPUTMODE );
+
+ if ( ! textualInput )
+ {
+ // default is textual mode, but now we must switch to numeric mode
+ CAknMultilineQueryControl* ctrl = FirstControl(); // user id field
+ CCoeControl* coeCtrl = ctrl->ControlByLayoutOrNull( EMultiDataFirstEdwin );
+ if ( coeCtrl )
+ {
+ CEikEdwin* edwin = static_cast<CEikEdwin*>( coeCtrl );
+ edwin->SetAknEditorInputMode( EAknEditorNumericInputMode );
+ }
+ }
+
+ if ( iCursorToBeginning )
+ {
+ CAknMultilineQueryControl* ctrl = FirstControl(); // user id field
+ CCoeControl* coeCtrl = ctrl->ControlByLayoutOrNull( EMultiDataFirstEdwin );
+ if ( coeCtrl )
+ {
+ CEikEdwin* firstEdwin = static_cast<CEikEdwin*>( coeCtrl );
+ firstEdwin->AddFlagToUserFlags( CEikEdwin::ENoAutoSelection );
+ }
+ }
+
+ if ( Layout_Meta_Data::IsLandscapeOrientation() )
+ {
+ // Show the OK-softkey also when password field is empty.
+ UpdateLeftSoftKeyL();
+ }
+ else if ( iInitialFocus == ESecondLine )
+ {
+ TryChangeFocusToL( EMultilineSecondLine );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCnUiUsernameAndPwdQuery::IntResourceValueL()
+// -----------------------------------------------------------------------------
+//
+TInt CCnOUiUsernameAndPwdQuery::IntResourceValueL( TInt aResourceId )
+ {
+
+ TInt val( 0 );
+ TInt err ( KErrNone );
+
+ CRepository* rep = 0;
+
+ TRAP( err, rep = CRepository::NewL( KCRUidIMNG ) );
+
+ if ( err == KErrNone )
+ {
+ TInt key = aResourceId + KIMCUStartVariationID;
+
+ err = rep->Get( key, val );
+
+ delete rep;
+ }
+
+ if ( err != KErrNone )
+ {
+
+ RResourceFile resFile;
+ OpenResourceFileLC( resFile ); // Two items in cleanup stack.
+
+ aResourceId = aResourceId + RSC_CRRSS_CHAT_VARIATION_IMPSCU_START_ID;
+
+ // read the data to a buffer
+ TInt plainResourceId = 0x00000fff & aResourceId; // Remove offset from id
+ HBufC8* rawDataBuf = resFile.AllocReadLC( plainResourceId );
+
+ // it's now as ascii code: \x00 for 0, \x01 for 1, etc.
+ TUint value = ( *rawDataBuf )[ 0 ];
+
+ CleanupStack::PopAndDestroy( 2 ); // rawDataBuf, resFile
+
+ val = value;
+ }
+
+ return val;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CCnUiUsernameAndPwdQuery::OpenResourceFileLC()
+// !!!Notice!!!. Two variables in cleanupstack after call of this method.
+// -----------------------------------------------------------------------------
+//
+void CCnOUiUsernameAndPwdQuery::OpenResourceFileLC( RResourceFile& aResourceFile )
+ {
+ TFileName resourceFileName;
+ iRFs.Close();
+ User::LeaveIfError( iRFs.Connect() );
+
+ TInt err = iSharedData->GetStringKey( ( TIMPSSharedKeys )KBrandingResourceKey, resourceFileName );
+ if ( err || !resourceFileName.Length() )
+ {
+ CnUiResourceFileName::NearestVariationForCurrentLanguage( iRFs, resourceFileName );
+ }
+ aResourceFile.OpenL( iRFs, resourceFileName );
+ CleanupClosePushL( aResourceFile );
+ aResourceFile.ConfirmSignatureL();
+
+ }
+
+// End of File